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

Reply via email to