https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120459

Jeffrey A. Law <law at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
         Resolution|---                         |DUPLICATE
             Status|UNCONFIRMED                 |RESOLVED

--- Comment #5 from Jeffrey A. Law <law at gcc dot gnu.org> ---
Same core issue.  We have this in IRA:

(insn 527 536 655 6 (set (reg:DF 276 [ _215 ])
        (float:DF (reg:DI 1174 [ MEM[(long int *)&bi + 16B] ]))) "j.c":101:55
167 {floatdidf2}
     (expr_list:REG_DEAD (reg:DI 1174 [ MEM[(long int *)&bi + 16B] ])
        (nil)))

(reg 1174) does not get a hard register in the context where this use appears. 
So we turn (reg 1174) into a (mem (fp) (offset))

In the .reload dump:

Changing pseudo 1174 in operand 1 of insn 527 on equiv [frame:DI+0x18]

[ ... ]

    Inserting insn reload before:
 1693: r2060:DI=[frame:DI+0x18]

LRA iterates to do final resolutions.  Initially the offset fits, but as
further spills occur the offset no longer fits:

 1693: r2060:DI=[r2652:DI] 
    Inserting insn reload before:
 2294: r2652:DI=frame:DI+0x808

Giving us:

(insn 2294 536 1693 6 (set (reg:DI 10 a0 [2652])
        (plus:DI (reg/f:DI 2 sp)
            (const_int 2056 [0x808]))) "j.c":101:55 7
{*adddi3_const_sum_of_two_s12}
     (nil))
(insn 1693 2294 527 6 (set (reg:DI 9 s1 [2060]) 
        (mem:DI (reg:DI 10 a0 [2652]) [3 MEM[(long int *)&bi + 16B]+0 S8 A64]))
"j.c":101:55 277 {*movdi_64bit}
     (nil))
(insn 527 1693 1694 6 (set (reg:DF 38 ft6 [orig:276 _215 ] [276])
        (float:DF (reg:DI 9 s1 [2060]))) "j.c":101:55 167 {floatdidf2}
     (nil))

Where insn 2294 will get split creating the scenario reported by Paul-Antoine.

The testcase in the more recently filed bug is easier to follow.  So we'll use
that bug going forward.

*** This bug has been marked as a duplicate of bug 120811 ***

Reply via email to