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 ...

Reply via email to