https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55212
--- Comment #284 from Oleg Endo <olegendo at gcc dot gnu.org> --- (In reply to Kazumoto Kojima from comment #283) > (In reply to Kazumoto Kojima from comment #276) > > Current my assumption on the sfunc issue: LRA doesn't handle the clobber > > hard reg pattern if that hard reg is recognized as the input reg. I don't > > know the direct way to give the output modifier to the raw hard reg pattern. > > I'm trying match_operand instead of raw reg so to modify it to the output. > > For example, rewriting block_lump_real_i4 to > > > > (define_insn "block_lump_real_i4" > > [(parallel [(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")) > > (clobber (match_scratch:SI 5 "=2,2")) > > (clobber (match_scratch:SI 6 "=3,3")) > > 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 ...