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

Alan Modra <amodra at gmail dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|ASSIGNED                    |NEW
           Assignee|amodra at gmail dot com            |unassigned at gcc dot 
gnu.org

--- Comment #3 from Alan Modra <amodra at gmail dot com> ---
OK, so I'd forgotten what those equivalences are really saying.  There isn't
anything really wrong with them.  What we have in the testcase is
 (set (reg1) (mem1))
 (set (mem2) (reg1))
 (set (reg2) (reg1))
The equivalence set up by add_store_equivs says this can be transformed to
 (set (mem2) (mem1))
 (nop)
 (set (reg2) (mem2))
ie. all occurrences of reg1 be replaced with mem2.

The real problem occurs when we get to the last of the three insns.

(insn 11 17 10 2 (set (reg:SD 33 1)
        (mem/j/c:SD (lo_sum:SI (reg/f:SI 160)
                (symbol_ref:SI ("u") [flags 0x84] <var_decl 0x7ffff7ff5510 u>))
[2 u.b+0 S4 A32]))
"/home/alan/src/gcc.git/gcc/testsuite/c-c++-common/dfp/pr35620.c":20 489
{movsd_hardfloat}
     (nil))

This address form isn't valid for SDmode, and lra apparently doesn't know how
to deal with it.  So while this may have been triggered by my ira change, that
change itself isn't at fault.

Reply via email to