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

--- Comment #3 from Richard Sandiford <rsandifo at gcc dot gnu.org> ---
Yeah, I agree that sounds like the right fix.  Specifically, I assume
s390_decompose_addrstyle_without_index, when doing:

  if (op && GET_CODE (op) != REG)
    return false;

should check whether the register is a pseudo register or is a member of
ADDR_REGS.  The check should probably be limited to reload_completed, so that
the RAs have a chance to reload other registers.

The reason this works during register allocation is that the RAs check
REGNO_OK_FOR_BASE_P and REGNO_OK_FOR_INDEX_P as part of the constraints
process.  But those macros are not checked automatically by address constraints
themselves (perhaps somewhat surprisingly).  It has to be done explicitly in
target code.

I disagree that the predicates & constraints are icky though.  Given the way
that the architecture treats shift amounts as addresses, it seems like a neat
approach.

Reply via email to