This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [IA-64] Fix PR target/48496
- From: Jakub Jelinek <jakub at redhat dot com>
- To: Eric Botcazou <ebotcazou at adacore dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Thu, 12 Apr 2012 10:56:00 +0200
- Subject: Re: [IA-64] Fix PR target/48496
- References: <201204112301.40164.ebotcazou@adacore.com>
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
On Wed, Apr 11, 2012 at 11:01:40PM +0200, Eric Botcazou wrote:
> 2012-04-11 Eric Botcazou <ebotcazou@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 <ebotcazou@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