On 11/29/08 10:37:33, Eric Botcazou wrote:
> > The conditional jump instruction formed by instructions
> > 56 and 57 above is deleted because GCSE thinks that
> > (reg:SI 61 [ p$thread ]) is non-zero. It comes to this
> > conclusion when it propagates the
> > REG_EQUAL (const_int 4294967296 [0x100000000])
> > value listed in instruction 25:
> >
> > (insn 25 24 26 2 (set (reg:SI 61 [ p$thread ])
> > (subreg:SI (reg:TI 70 [ D.2967 ]) 8)) 40 {*movsi_1} (nil)
> > (expr_list:REG_EQUAL (const_int 4294967296 [0x100000000])
> > (nil)))
> >
> > Note that it takes 33 bits to express 0x100000000, and it won't
> > fit into an SImode container.
>
> Then this note is invalid, REG_EQUAL pertains to the destination register:
[...]
Eric, thanks for the clarification on the role of REG_EQUAL notes.
> IOW the culprit is not GCSE but whoever has created this note.
Agreed. The routine that creates the errant REG_EQUAL note is
lookup_as_function(). I posted a possible patch:
http://gcc.gnu.org/ml/gcc-patches/2008-11/msg01466.html
(My FSF assignment is on file.)
- Gary