Loop invariant code corrupting xstormy16 insn
Geoff Keating
geoffk@geoffk.org
Tue Jun 5 09:13:00 GMT 2007
On 05/06/2007, at 1:43 AM, Nick Clifton wrote:
> Hi Zdenek, Hi Daniel, Hi Geoff,
>
> 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?
> I think that the real problem might be the clobbers in the
> ineqbranchsi pattern, but I do not know how it could be changed to
> fix this.
I don't see anything obviously wrong with this instruction.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 2460 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-bugs/attachments/20070605/f90b5ebd/attachment.p7s>
More information about the Gcc-bugs
mailing list