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

--- Comment #8 from Hongtao.liu <crazylht at gmail dot com> ---
(In reply to Jakub Jelinek from comment #7)
> memory_operand calls general_operand which for MEM does:
>       /* Use the mem's mode, since it will be reloaded thus.  LRA can
>          generate move insn with invalid addresses which is made valid
>          and efficiently calculated by LRA through further numerous
>          transformations.  */
>       if (lra_in_progress
>           || memory_address_addr_space_p (GET_MODE (op), y, MEM_ADDR_SPACE
> (op)))
>         return 1;
> So, during LRA it accepts anything, and at the end of LRA it ICEs because it
> isn't recognized.
> So, I think LRA needs to know somewhere what is the address operand of the
> MEM even inside of the bcst_mem_operand and know that it should fix it up.

Yes, and i saw at least two places needed to be adjusted.

First in process_address_1 (int nop, bool check_only_p,
---
3430   /* Do not attempt to decompose arbitrary addresses generated by combine
3431      for asm operands with loose constraints, e.g 'X'.  */
3432   else if (MEM_P (op)  ---------------------------------------> Here!!!
3433            && !(INSN_CODE (curr_insn) < 0
3434                 && get_constraint_type (cn) == CT_FIXED_FORM
3435                 && constraint_satisfied_p (op, cn)))
3436     decompose_mem_address (&ad, op);
3437   else if (GET_CODE (op) == SUBREG
3438            && MEM_P (SUBREG_REG (op)))
3439     decompose_mem_address (&ad, SUBREG_REG (op));
3440   else
3441     return false;
---

Then in valid_address_p which would be called in process_address_1
---
 398 /* Return true if the eliminated form of AD is a legitimate target
address.
 399    If OP is a MEM, AD is the address within OP, otherwise OP should be
 400    ignored.  CONSTRAINT is one constraint that the operand may need
 401    to meet.  */
 402 static bool
 403 valid_address_p (rtx op, struct address_info *ad,
 404                  enum constraint_num constraint)
 405 {
 406   address_eliminator eliminator (ad);
 407 
 408   /* Allow a memory OP if it matches CONSTRAINT, even if CONSTRAINT is
more
 409      forgiving than "m".  */
 410   if (MEM_P (op) -----------------------------------------------> Here.
 411       && (insn_extra_memory_constraint (constraint)
 412           || insn_extra_special_memory_constraint (constraint))
 413       && constraint_satisfied_p (op, constraint))
 414     return true;
 415 
 416   return valid_address_p (ad->mode, *ad->outer, ad->as);
 417 }
---

Reply via email to