On Wed, Apr 11, 2012 at 11:01:40PM +0200, Eric Botcazou wrote: > 2012-04-11 Eric Botcazou <ebotca...@adacore.com> > > PR target/48496 > * config/ia64/constraints.md (Q): Only accept non-volatile MEMs and > also pseudo-registers during reload. > > > 2012-04-11 Eric Botcazou <ebotca...@adacore.com> > > * gcc.target/ia64/pr48496.c: New test. > * gcc.target/ia64/pr52657.c: Likewise.
Is the standard condition for define_memory_constraint here /* Likewise if the address will be reloaded because reg_equiv_address is nonzero. For reg_equiv_mem we have to check. */ else if (REG_P (operand) && REGNO (operand) >= FIRST_PSEUDO_REGISTER && reg_renumber[REGNO (operand)] < 0 && ((reg_equiv_mem (REGNO (operand)) != 0 && EXTRA_CONSTRAINT_STR (reg_equiv_mem (REGNO (operand)), c, p)) || (reg_equiv_address (REGNO (operand)) != 0))) win = 1; If so, shouldn't you check those conditions as well, or at least something similar? Not sure if reg_equiv_address needs to be allowed there, and guess reg_equiv_mem should satisfy the Q constraint, i.e. !MEM_VOLATILE_P memory_operand. Accepting any pseudo there sounds too risky to me... > Index: config/ia64/constraints.md > =================================================================== > --- config/ia64/constraints.md (revision 186272) > +++ config/ia64/constraints.md (working copy) > @@ -111,11 +111,16 @@ (define_constraint "H" > > ;; Note that while this accepts mem, it only accepts non-volatile mem, > ;; and so cannot be "fixed" by adjusting the address. Thus it cannot > -;; and does not use define_memory_constraint. > +;; and does not use define_memory_constraint. But it needs to accept > +;; pseudo-registers during reload like a define_memory_constraint. > (define_constraint "Q" > "Non-volatile memory for FP_REG loads/stores" > - (and (match_operand 0 "memory_operand") > - (match_test "!MEM_VOLATILE_P (op)"))) > + (ior (and (match_code "mem") > + (match_test "!MEM_VOLATILE_P (op)") > + (match_operand 0 "memory_operand")) > + (and (match_code "reg") > + (match_test "!HARD_REGISTER_P (op)") > + (match_test "reload_in_progress")))) > > (define_constraint "R" > "1..4 for shladd arguments" Jakub