diff mbox

[ARM] Fix PR46934, Thumb-1 ICE

Message ID 4D8A0932.8060107@codesourcery.com
State New
Headers show

Commit Message

Chung-Lin Tang March 23, 2011, 2:52 p.m. UTC
Hi, in the ARM "casesi" expand pattern, when the table base index
constant is 0x8000000, it is stored sign extended as an rtx (const_int
0xffffffff8000000) (assuming 64-bit HOST_WIDE_INT).

Subtraction by adding GEN_INT(-INTVAL(operands[1])) then creates
(const_int 0x80000000), which is not sign-extended, and fails to match
the nonmemory_operand predicate later, causing a extract_insn failure
ICE.  So the fix is to use gen_int_mode() instead of GEN_INT, which does
the needed sign-extension.

Cross-tested on QEMU without regressions, okay for trunk?

Thanks,
Chung-Lin

Comments

Richard Earnshaw March 23, 2011, 3:14 p.m. UTC | #1
On 23 Mar 2011, at 14:52, "Chung-Lin Tang" <cltang@codesourcery.com> wrote:

> Hi, in the ARM "casesi" expand pattern, when the table base index
> constant is 0x8000000, it is stored sign extended as an rtx (const_int
> 0xffffffff8000000) (assuming 64-bit HOST_WIDE_INT).
> 
> Subtraction by adding GEN_INT(-INTVAL(operands[1])) then creates
> (const_int 0x80000000), which is not sign-extended, and fails to match
> the nonmemory_operand predicate later, causing a extract_insn failure
> ICE.  So the fix is to use gen_int_mode() instead of GEN_INT, which does
> the needed sign-extension.
> 
> Cross-tested on QEMU without regressions, okay for trunk?
> 
> Thanks,
> Chung-Lin
> <pr46934.diff>

Ok.  R.
diff mbox

Patch

Index: config/arm/arm.md
===================================================================
--- config/arm/arm.md	(revision 171339)
+++ config/arm/arm.md	(working copy)
@@ -8354,7 +8354,8 @@ 
 	rtx reg = gen_reg_rtx (SImode);
 
 	emit_insn (gen_addsi3 (reg, operands[0],
-			       GEN_INT (-INTVAL (operands[1]))));
+			       gen_int_mode (-INTVAL (operands[1]),
+                                             SImode)));
 	operands[0] = reg;
       }
 
Index: testsuite/gcc.target/arm/pr46934.c
===================================================================
--- testsuite/gcc.target/arm/pr46934.c	(revision 0)
+++ testsuite/gcc.target/arm/pr46934.c	(revision 0)
@@ -0,0 +1,21 @@ 
+/* { dg-do compile } */
+/* { dg-options "-march=armv5te -mthumb -Os" }  */
+/* { dg-require-effective-target arm_thumb1_ok } */
+
+int caller (unsigned int reg_type)
+{
+  switch (reg_type)
+    {
+    case 0x80000000:
+      return (int)foo();
+
+    case 0x80000003:
+      return (int) bar();
+
+    case 0x80000001:
+      return (int) baz();
+
+    case 0x80000004:
+      return (int) fooz();
+    }
+}