Hi All,

I am looking at a regression (in aarch64_be-none-elf-gcc -Og and
test-case attached) where a TImode register is assigned two DImode
values and then passed to the  __multf3 as argument. When, the
intermediate pseudo(TImode) is assigned a FP_REG to hold this value, the
regression shows up. Difference in asm to the one working and not
working is below.

        fmov    d1, x20
        fmov    v1.d[1], x19
+       str     q0, [x29, 64]
+       str     x22, [x29, 64]
        fmov    d0, x21
-       fmov    v0.d[1], x22
        bl      __multf3


When LRA assigns one of the DImode value to TImode register, it spills
the TImode register into memory. Appends the DImode and then reloads (as
shown below in the dump). However, It is not setting up it in the right
place of TImode and due to that one of the moves becomes dead and
removed by dce. If I compile the test-case with
fno-dce, I get the following asm.


If I compile with -fno-dce.
        fmov    d1, x3
        fmov    v1.d[1], x19
        str     q0, [x29, 64]
        str     x19, [x29, 64]
        ldr     q0, [x29, 64]
        fmov    d0, x3
        bl      __addtf3

What is causing the LRA to generate moves like this?

Thanks,
Kugan



t.c.214r.reload
---------------
(insn 88 87 133 3 (clobber (reg:TI 32 v0 [orig:108 d+-8 ] [108])) t.c:11 -1
     (nil))

---89, 134 and 91 stores
(insn 133 88 89 3 (set (mem/c:TI (plus:DI (reg/f:DI 29 x29)
                (const_int 64 [0x40])) [0 %sfp+-16 S16 A128])
        (reg:TI 32 v0 [orig:108 d+-8 ] [108])) t.c:11 37 {*movti_aarch64}
     (nil))
(insn 89 133 134 3 (set (mem/c:DI (plus:DI (reg/f:DI 29 x29)
                (const_int 64 [0x40])) [0 %sfp+-16 S8 A128])
        (reg:DI 19 x19 [orig:102 d ] [102])) t.c:11 34 {*movdi_aarch64}
     (nil))
(insn 134 89 90 3 (set (reg:TI 32 v0 [orig:108 d+-8 ] [108])
        (mem/c:TI (plus:DI (reg/f:DI 29 x29)
                (const_int 64 [0x40])) [0 %sfp+-16 S16 A128])) t.c:11 37
{*movti_aarch64}
     (nil))
(insn 90 134 91 3 (set (reg:DI 32 v0 [orig:108 d ] [108])
        (reg:DI 20 x20 [orig:105 d+8 ] [105])) t.c:11 34 {*movdi_aarch64}
     (nil))
(insn 91 90 15 3 (set (reg:TF 32 v0)
        (reg:TF 32 v0 [orig:108 d+-8 ] [108])) t.c:11 40 {*movtf_aarch64}
     (nil))
(call_insn/u 15 91 129 3 (parallel [
            (set (reg:TF 32 v0)
                (call (mem:DI (symbol_ref:DI ("__addtf3") [flags 0x41])
[0  S8 A8])
                    (const_int 0 [0])))
            (use (const_int 0 [0]))
            (clobber (reg:DI 30 x30))
        ]) t.c:11 28 {*call_value_symbol}
     (expr_list:REG_EH_REGION (const_int -2147483648 [0xffffffff80000000])
        (nil))
    (expr_list (use (reg:TF 33 v1))
        (expr_list (use (reg:TF 32 v0))
            (nil))))



t.c.228r.cprop_hardreg
----------------------
(insn 88 174 133 3 (clobber (reg:TI 32 v0 [orig:108 d+-8 ] [108])) t.c:11 -1
     (nil))
(insn 133 88 89 3 (set (mem/c:TI (plus:DI (reg/f:DI 29 x29)
                (const_int 64 [0x40])) [0 %sfp+-16 S16 A128])
        (reg:TI 32 v0 [orig:108 d+-8 ] [108])) t.c:11 37 {*movti_aarch64}
     (expr_list:REG_DEAD (reg:TI 32 v0 [orig:108 d+-8 ] [108])
        (nil)))
(insn 89 133 134 3 (set (mem/c:DI (plus:DI (reg/f:DI 29 x29)
                (const_int 64 [0x40])) [0 %sfp+-16 S8 A128])
        (reg:DI 19 x19 [orig:102 d ] [102])) t.c:11 34 {*movdi_aarch64}
     (nil))
(insn 134 89 90 3 (set (reg:TI 32 v0 [orig:108 d+-8 ] [108])
        (mem/c:TI (plus:DI (reg/f:DI 29 x29)
                (const_int 64 [0x40])) [0 %sfp+-16 S16 A128])) t.c:11 37
{*movti_aarch64}
     (expr_list:REG_UNUSED (reg:TI 32 v0 [orig:108 d+-8 ] [108])
        (nil)))
(insn 90 134 15 3 (set (reg:DI 32 v0 [orig:108 d ] [108])
        (reg:DI 3 x3 [orig:105 d+8 ] [105])) t.c:11 34 {*movdi_aarch64}
     (nil))
(call_insn/u 15 90 175 3 (parallel [
            (set (reg:TF 32 v0)
                (call (mem:DI (symbol_ref:DI ("__addtf3") [flags 0x41])
[0  S8 A8])
                    (const_int 0 [0])))
            (use (const_int 0 [0]))
            (clobber (reg:DI 30 x30))
        ]) t.c:11 28 {*call_value_symbol}
     (expr_list:REG_DEAD (reg:TF 33 v1)
        (expr_list:REG_EH_REGION (const_int -2147483648
[0xffffffff80000000])
            (nil)))
    (expr_list (use (reg:TF 33 v1))
        (expr_list (use (reg:TF 32 v0))
            (nil))))



t.c.229r.rtl_dce
---------------
(insn 88 174 133 3 (clobber (reg:TI 32 v0 [orig:108 d+-8 ] [108])) t.c:11 -1
     (nil))
(insn 133 88 89 3 (set (mem/c:TI (plus:DI (reg/f:DI 29 x29)
                (const_int 64 [0x40])) [0 %sfp+-16 S16 A128])
        (reg:TI 32 v0 [orig:108 d+-8 ] [108])) t.c:11 37 {*movti_aarch64}
     (expr_list:REG_DEAD (reg:TI 32 v0 [orig:108 d+-8 ] [108])
        (nil)))
(insn 89 133 90 3 (set (mem/c:DI (plus:DI (reg/f:DI 29 x29)
                (const_int 64 [0x40])) [0 %sfp+-16 S8 A128])
        (reg:DI 19 x19 [orig:102 d ] [102])) t.c:11 34 {*movdi_aarch64}
     (nil))
(insn 90 89 15 3 (set (reg:DI 32 v0 [orig:108 d ] [108])
        (reg:DI 3 x3 [orig:105 d+8 ] [105])) t.c:11 34 {*movdi_aarch64}
     (nil))
(call_insn/u 15 90 175 3 (parallel [
            (set (reg:TF 32 v0)
                (call (mem:DI (symbol_ref:DI ("__addtf3") [flags 0x41])
[0  S8 A8])
                    (const_int 0 [0])))
            (use (const_int 0 [0]))
            (clobber (reg:DI 30 x30))
        ]) t.c:11 28 {*call_value_symbol}
     (expr_list:REG_DEAD (reg:TF 33 v1)
        (expr_list:REG_EH_REGION (const_int -2147483648
[0xffffffff80000000])
            (nil)))
    (expr_list (use (reg:TF 33 v1))
        (expr_list (use (reg:TF 32 v0))
            (nil))))


long double
f (d, i)
     long double d;
     int i;
{
  long double e;

  d = -d;
  e = d;
  if (i == 1)
    d *= 2;
  d -= e * d;
  d -= e * d;
  d -= e * d;
  d -= e * d;
  d -= e * d;
  return d;
}

Reply via email to