This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Register constraints + and =


> Jan Hubicka <hubicka@ucw.cz> writes:
> 
> >> 
> >> I can accept the issue as a matter of documentation, but I don't
> >> understand the rest.  Remember that all the patterns are executed in
> >> parallel.  I don't see how adding a USE in parallel could affect
> >> anything about how the operand is used.
> >
> >> >> >> (define_insn "*rep_movqi"
> >> >> >>    [(set (match_operand:P 2 "register_operand" "=c") (const_int 0))
> >> >> >>     (set (match_operand:P 0 "register_operand" "=D")
> >> >> >>          (plus:P (match_operand:P 3 "register_operand" "0")
> >> >> >> 		(match_operand:P 5 "register_operand" "2")))
> >> >> >>     (set (match_operand:P 1 "register_operand" "=S")
> >> >> >>          (plus:P (match_operand:P 4 "register_operand" "1") (match_dup 5)))
> >> >> >>     (set (mem:BLK (match_dup 3))
> >> >> >> 	(mem:BLK (match_dup 4)))
> >> >> >>     (use (match_dup 5))]
> >
> > Without the extra use the patterns says that the only use of operand 5 (CX) is
> > to add it to DX and SX.
> >
> > So seeing something like
> >
> > memcpy(DX,SX,10)
> > DX+=10
> > SX+=10
> >
> > is IMO foldable to
> >
> > memcpy(DX,SX,20)
> >
> > Not that current forwprop/combine would do that. But in theory I think it is valid
> > transform.
> 
> No, it's not.  All the SETs are done in parallel--the define_insn has an
> implicit PARALLEL wrapped around the insns.  You're trying to pull some
> of the outputs into the inputs, but that is not permitted by the rules
> of RTL.

In expanded form it is

 (set (reg5) (const 10))

 (parallel [(set (reg2) (const 0))
           (set (reg0) (plus (reg3) (reg5)))
           (set (reg1) (plus (reg4) (reg5)))
           (set (mem (reg3)) (mem (reg4)))])

 (set (reg0) (plus (reg0) (const 10)))

 (set (reg1) (plus (reg1) (const 10)))

instructions separated by empty lines.

transformed into:
 (set (reg5) (const 20))

 (parallel [(set (reg2) (const 0))
           (set (reg0) (plus (reg3) (reg5)))
           (set (reg1) (plus (reg4) (reg5)))
           (set (mem (reg3)) (mem (reg4)))])

I do not see puling inputs to outputs here.
> 
> Ian


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]