On S/390 the test case gcc.dg/loop-9.c currently fails:
void f (double *a)
{
int i;
for (i = 0; i < 100; i++)
a[i] = 18.4242;
}
It seems to expect that moving 18.4242 to a register is moved out
of the loop, but on S/390 it isn't. It turns out that
move_invariant_reg() is never called from move_invariants()
because the invariants vector is empty. Now,
find_invariant_insn() checks the insn for invariants using
check_dependencies().
(insn 29 28 30 3 (set (mem:DF (reg:DI 81 [ ivtmp.8 ]) [0 MEM[base: _15,
offset: 0B]+0 S8 A64])
(const_double:DF 1.84241999999999990222931955941021442413330078125e+1
[0x0.9364c2f837b4ap+5])) .../loop-9.c:9 918 {*movdf_64}
(nil))
check_dependencies() comes across reg 81 first, decides that is
not an invariant and returns false so that find_invariant_insn()
never even looks at the constant.
Actually, the constant should be moved (from the literal pool) to
a floating point register (and actually is in the assembly
output), and that move could be moved out of the loop (it's not).
Where should I look for the root cause?
Ciao
Dominik ^_^ ^_^
--
Dominik Vogt
IBM Germany