PR 12828
Dale Johannesen
dalej@apple.com
Thu Dec 4 00:15:00 GMT 2003
ppc has some patterns that look like this:
(insn 67 66 68 0x0 (parallel [
(set (reg:DF 129) (float:DF (reg:SI 128)))
......
(clobber (mem:DF (plus:SI (reg/f:SI 114 virtual-stack-vars)
(const_int 262144 [0x40000])) [0 S8 A8]))
......
where the stack temp it needs is recorded only inside the clobber
(the splitter creates insns from it later).
This particular one has a large offset due to large stack arrays
elsewhere.
That offset is too big to fit in the immediate field, so
instantiate_virtual_regs() changes this to
(insn 228 66 67 6 0x0 (set (reg:SI 194)
(const_int 262176 [0x40020])) -1 (nil)
(nil))
(insn 67 228 68 6 0x40586630 (parallel [
(set (reg:DF 129) (float:DF (reg:SI 128)))
......
(clobber (mem:DF (plus:SI (reg/f:SI 30 r30)
(reg:SI 194)) [0 S8 A8]))
........
This confuses the loop optimizer: when pulling the set of R129 out of a
loop,
it does not know there's a dependency on R194. It looks like there
ought to
be a USE of R194 inside the parallel, but I see no reason that
instantiate_virtual_regs
can assume such a pattern exists (it doesn't now). I could change the
loop
optimizer to look inside CLOBBER(MEM, but I'm concerned that similar
problems
could exist elsewhere. What's the right approach here?
More information about the Gcc
mailing list