https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55212
--- Comment #296 from Oleg Endo <olegendo at gcc dot gnu.org> --- (In reply to Kazumoto Kojima from comment #295) > (In reply to Kazumoto Kojima from comment #285) > > (In reply to Oleg Endo from comment #284) > > > (In reply to Kazumoto Kojima from comment #283) > > ... > > > > It turned out that the c#276 version of block_lump_real_i4 works > > > > correctly > > > > in only the limited cases. > > > > > > Have you tried writing the pattern as > > > > > > (define_insn "block_lump_real_i4" > > > [(set (mem:BLK (match_operand:SI 2 "" "r,r")) > > > (mem:BLK (match_operand:SI 3 "" "r,r"))) > > > (use (match_operand:SI 0 "arith_reg_operand" "r,r")) > > > (use (match_operand 1 "" "Z,Ccl")) > > > ... > > > > > > i.e. without the parallel in there? Sorry, maybe it's a stupid idea but > > > ... > > > > The last time I tried it against slightly different patterns, there was no > > difference. I'll try it again. > > It seems that there is no difference w/wo the explicit parallel pattern. > > BTW, a bit monstrous version of that pattern seems to work at least for gcc > testsuite and our handy test case: > > (define_insn "block_lump_real_i4" > [(set (mem:BLK (match_operand:SI 2 "" "=r,r")) > (mem:BLK (match_operand:SI 3 "" "=r,r"))) > (use (match_operand:SI 0 "arith_reg_operand" "r,r")) > (use (match_operand 1 "" "Z,Ccl")) > (use (match_operand:SI 4 "" "=r,r")) > (use (reg:SI R4_REG)) > (use (reg:SI R5_REG)) > (use (reg:SI R6_REG)) > (clobber (match_dup 2)) > (clobber (match_dup 3)) > (clobber (match_dup 4)) > (clobber (reg:SI PR_REG)) > (clobber (reg:SI T_REG)) > (clobber (reg:SI R0_REG)) > (clobber (reg:SI R1_REG)) > (clobber (reg:SI R2_REG)) > (clobber (reg:SI R3_REG))] > "TARGET_HARD_SH4 > && REG_P (operands[2]) && REGNO (operands[2]) == R4_REG > && REG_P (operands[3]) && REGNO (operands[3]) == R5_REG > && REG_P (operands[4]) && REGNO (operands[4]) == R6_REG" > "@ > jsr @%0%# > bsrf %0\n%O1:%#" > [(set_attr "type" "sfunc") > (set_attr "needs_delay_slot" "yes")]) > > The extra use patterns avoid allocating R4-R6 to operands[0]. This sounds almost logical and easy to understand. > Adding explicit emit_clobber R4-R6 looks better than this to me, though. Having to use the "emit_clobber" when instantiating that pattern might be easy to forget. It's easier to deal with it when it's all contained in one place. Ideally a single 'emit_insn' should suffice, IMHO. > && REG_P (operands[2]) && REGNO (operands[2]) == R4_REG > && REG_P (operands[3]) && REGNO (operands[3]) == R5_REG > && REG_P (operands[4]) && REGNO (operands[4]) == R6_REG" Out of curiousity, why are these checks needed?