> >  I think that I have found a small bug in the loop invariant code.
> >  The problem is exhibited when building newlib for the xstormy16-elf
> >  toolchain although it may happen with other targets as well.  The
> >  problem occurs when an insn contains an r-value use of a register
> >  that is going to hoisted as well as a clobber of that register, like
> >  this:
> >
> >    (parallel [
> >              (set (pc)
> >                   (if_then_else (lt:SI (reg:SI 45)    <---
> >                                        (reg:SI 26))
> >                                 (label_ref:HI 129)
> >                                 (pc)))
> >              (clobber (reg:SI 45))                    <-- must be  
> >the same
> >              (clobber (scratch:BI))
> >              ])
> >
> >  The important point here is that the register referenced in the
> >  first clobber must match the register used as the first argument of
> >  the condition operation.  (This comes from the "ineqbranchsi"
> >  pattern in the xstormy16 machine description).
> >
> >  The problem is that the loop-invariant optimization was deciding
> >  that (reg:SI 45) could be hoisted out of the loop, whereas really it
> >  should be left alone.  I have been looking at the loop invariant
> >  code trying to figure out what needs to be changed, but so far I
> >  have not been able to puzzle it out.
> 
> Well, it's certainly not the case that register 45 is loop-invariant,  
> because it's changed in the loop by the clobber.  Maybe the loop- 
> invariant code isn't noticing the clobber?

it is loop invariant, if the code looks like

(set reg:45 some_invariant)
(the_insn_we_consider)

Zdenek

Reply via email to