https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57032
Uroš Bizjak <ubizjak at gmail dot com> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords|ra |
CC| |rth at gcc dot gnu.org
--- Comment #8 from Uroš Bizjak <ubizjak at gmail dot com> ---
This is not a LRA problem.
The problem is in definition of "Q" constraint, AKA "normal_memory_operand":
(define_constraint "Q"
"@internal A normal_memory_operand"
(match_operand 0 "normal_memory_operand"))
;; Return 1 is OP is a memory location that is not a reference
;; (using an AND) to an unaligned location. Take into account
;; what reload will do.
(define_special_predicate "normal_memory_operand"
(ior (match_test "op = resolve_reload_operand (op), 0")
(and (match_code "mem")
(match_test "GET_CODE (XEXP (op, 0)) != AND"))))
This constraint calls "resolve_reload_operand":
/* Used by aligned_memory_operand and unaligned_memory_operand to
resolve what reload is going to do with OP if it's a register. */
rtx
resolve_reload_operand (rtx op)
{
if (reload_in_progress)
{
rtx tmp = op;
if (GET_CODE (tmp) == SUBREG)
tmp = SUBREG_REG (tmp);
if (REG_P (tmp)
&& REGNO (tmp) >= FIRST_PSEUDO_REGISTER)
{
op = reg_equiv_memory_loc (REGNO (tmp));
if (op == 0)
return 0;
}
}
return op;
}
LRA does not set reload_in_progress, and also doesn't allow to use
reg_equiv_memory_loc. So, the "Q" constraint is effectively dead when LRA is
used.
Using the "m" constraint instead of "Q" in:
(define_insn "*movdi"
[(set (match_operand:DI 0 "nonimmediate_operand"
"=r,r,r,r,r,r,r,r, m, *f,*f, Q, r,*f")
(match_operand:DI 1 "input_operand"
"rJ,K,L,T,s,n,s,m,rJ,*fJ, Q,*f,*f, r"))]
"register_operand (operands[0], DImode)
|| reg_or_0_operand (operands[1], DImode)"
solves this particular failure.
Probably we need to redefine "Q" as a memory constraint. Also
{aligned,unaligned,normal}_memory_operand shouldn't use resolve_reload_operand
anymore. Richard, do you have any insight into this issue?