[PATCH] PR middle-end/103059: reload: Also accept ASHIFT with indexed addressing
Maciej W. Rozycki
Fri Nov 5 00:18:41 GMT 2021
On Thu, 4 Nov 2021, Jeff Law wrote:
> Sometimes the language we're using in email is not as crisp as it should be. So
> just to be clear, the canonicalization I'm referring to is only in effect within
> a MEM. It does not apply to address calculations that happen outside a MEM. I
> think that is consistent with Richard's comments.
Ah, OK then.
> > and then reload substitutes (reg/v:SI 154 [ n_ctrs ]) with the inner MEM
> > as it fails to reload the pseudo and just uses its memory location.
> OK. So what I still don't see is why we would need to re-recognize. You're
> changing code that I thought was only applicable when we were reloading an
> address inside a MEM and if we're inside a MEM, then we shouldn't be seeing an
> ASHIFT. We're replacing the argument of the ASHIFT.
Well, the context of this code (around and including hunk #1) is:
else if (insn_extra_address_constraint
= find_reloads_address (recog_data.operand_mode[i], (rtx*) 0,
i, operand_type[i], ind_levels, insn);
/* If we now have a simple operand where we used to have a
PLUS or MULT, re-recognize and try again. */
if ((OBJECT_P (*recog_data.operand_loc[i])
|| GET_CODE (*recog_data.operand_loc[i]) == SUBREG)
&& (GET_CODE (recog_data.operand[i]) == MULT
|| GET_CODE (recog_data.operand[i]) == PLUS))
INSN_CODE (insn) = -1;
retval = find_reloads (insn, replace, ind_levels, live_known,
so the body of the conditional is specifically executed for an address and
not a MEM; in this particular case matched with the plain "p" constraint.
MEMs are handled with the next conditional right below.
> So, overall, I'm still confused as to why the patch has any effect at all.
Does the explanation above clear your confusion?
More information about the Gcc-patches