On Mon, Dec 7, 2015 at 6:44 AM, Dominik Vogt <v...@linux.vnet.ibm.com> wrote:
> 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?


Hmm,
  I want to say the predicates on movdf_64 are too lose allowing the
above when it should not.   That is movdf_64 should have pushed the
load of the fp constant into its psedu-register and used that to do
the storing.

Thanks,
Andrew

>
> Ciao
>
> Dominik ^_^  ^_^
>
> --
>
> Dominik Vogt
> IBM Germany
>

Reply via email to