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

--- Comment #13 from rsandifo at gcc dot gnu.org <rsandifo at gcc dot gnu.org> 
---

(In reply to Bill Schmidt from comment #10)
> Looking at scan_rtx_address () in regrename.c, it indeed looks like a PLUS
> nested inside a PLUS isn't handled.  I'm not sure if this is a deficiency in
> regrename.c, or whether the definition of fusion_gpr_load_di is just playing
> with fire here.  Richard S., do you have an opinion?

Like you say, I don't think nested (plus ... (const_int))s are valid.
It still sounds like a deficiency if they trigger wrong code though --
an ICE would be OK.

I'm probably misreading the code, but I don't see how scan_rtx_address
would get this wrong.  The first (plus ... (const_int)) ought to go
through:

        else if (code1 == CONST_INT || code1 == CONST
                 || code1 == SYMBOL_REF || code1 == LABEL_REF)
          {
            locB = &XEXP (x, 0);
            index_code = GET_CODE (XEXP (x, 1));
          }

and then we'd recurse with locB treated as a base address.  *locB
is the inner plus and ought to come through the same code again,
meaning that we recurse a second time with locB pointing to r9.

So there might still be a regrename.c bug here.

Reply via email to