diff mbox

[RS6000] PR61231 lwa_operand related fix

Message ID 20140522001331.GZ5162@bubble.grove.modra.org
State New
Headers show

Commit Message

Alan Modra May 22, 2014, 12:13 a.m. UTC
This fixes another case where we use the wrong memory constraint.  See
the analysis in the PR.  The rule for operand predicate and
constraints is simply that the union of all constraints must exactly
match the operand predicate.

Bootstrapped and regression tested powerpc64-linux and
powerpc64le-linux.  OK for mainline and active branches?

Note that I didn't see the bootstrap miscompares reported in the PR,
so perhaps there is some other issue to fix besides this one..

	PR target/61231
	* config/rs6000/rs6000.c (mem_operand_gpr): Handle SImode.
	* config/rs6000/rs6000.md (extendsidi2_lfiwax, extendsidi2_nocell):
	Use "Y" constraint rather than "m".

Comments

David Edelsohn May 22, 2014, 12:59 a.m. UTC | #1
On Wed, May 21, 2014 at 8:13 PM, Alan Modra <amodra@gmail.com> wrote:
> This fixes another case where we use the wrong memory constraint.  See
> the analysis in the PR.  The rule for operand predicate and
> constraints is simply that the union of all constraints must exactly
> match the operand predicate.
>
> Bootstrapped and regression tested powerpc64-linux and
> powerpc64le-linux.  OK for mainline and active branches?
>
> Note that I didn't see the bootstrap miscompares reported in the PR,
> so perhaps there is some other issue to fix besides this one..
>
>         PR target/61231
>         * config/rs6000/rs6000.c (mem_operand_gpr): Handle SImode.
>         * config/rs6000/rs6000.md (extendsidi2_lfiwax, extendsidi2_nocell):
>         Use "Y" constraint rather than "m".

Okay.

Thanks, David
diff mbox

Patch

Index: gcc/config/rs6000/rs6000.c
===================================================================
--- gcc/config/rs6000/rs6000.c	(revision 210661)
+++ gcc/config/rs6000/rs6000.c	(working copy)
@@ -6124,7 +6127,8 @@  mem_operand_gpr (rtx op, enum machine_mode mode)
     return false;
 
   extra = GET_MODE_SIZE (mode) - UNITS_PER_WORD;
-  gcc_assert (extra >= 0);
+  if (extra < 0)
+    extra = 0;
 
   if (GET_CODE (addr) == LO_SUM)
     /* For lo_sum addresses, we must allow any offset except one that
Index: gcc/config/rs6000/rs6000.md
===================================================================
--- gcc/config/rs6000/rs6000.md	(revision 210661)
+++ gcc/config/rs6000/rs6000.md	(working copy)
@@ -745,7 +745,7 @@ 
 
 (define_insn "*extendsidi2_lfiwax"
   [(set (match_operand:DI 0 "gpc_reg_operand" "=r,r,??wm,!wl,!wu")
-	(sign_extend:DI (match_operand:SI 1 "lwa_operand" "m,r,r,Z,Z")))]
+	(sign_extend:DI (match_operand:SI 1 "lwa_operand" "Y,r,r,Z,Z")))]
   "TARGET_POWERPC64 && TARGET_LFIWAX"
   "@
    lwa%U1%X1 %0,%1
@@ -758,7 +758,7 @@ 
 
 (define_insn "*extendsidi2_nocell"
   [(set (match_operand:DI 0 "gpc_reg_operand" "=r,r")
-	(sign_extend:DI (match_operand:SI 1 "lwa_operand" "m,r")))]
+	(sign_extend:DI (match_operand:SI 1 "lwa_operand" "Y,r")))]
   "TARGET_POWERPC64 && rs6000_gen_cell_microcode && !TARGET_LFIWAX"
   "@
    lwa%U1%X1 %0,%1