re PR target/55277 (ICE in assign_by_spills, at lra-assigns.c:1217)
authorVladimir Makarov <vmakarov@redhat.com>
Mon, 26 Nov 2012 18:08:44 +0000 (18:08 +0000)
committerVladimir Makarov <vmakarov@gcc.gnu.org>
Mon, 26 Nov 2012 18:08:44 +0000 (18:08 +0000)
2012-11-26  Vladimir Makarov  <vmakarov@redhat.com>

PR target/55277
* gcc.target/i386/pr55227.c: New test.

2012-11-26  Vladimir Makarov  <vmakarov@redhat.com>

PR target/55277
* lra-constraints.c (in_class_p): Check reg class contents too.

From-SVN: r193824

gcc/ChangeLog
gcc/lra-constraints.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr55277.c [new file with mode: 0644]

index 51240799139b987d36bcf2e5a2eb6d34d1ef9a24..1c0aa9a0b2c7abea6ad06631ba44c24b4edf87cd 100644 (file)
@@ -1,3 +1,8 @@
+2012-11-26  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR target/55277
+       * lra-constraints.c (in_class_p): Check reg class contents too.
+
 2012-11-26  James Greenhalgh  <james.greenhalgh@arm.com>
 
        * config/aarch64/aarch64-builtins.c (aarch64_builtin_decls): New.
index e381c7042277ed715ec7b109617f9fd30bb66fde..d90ac0214d0b0ba85f025f05bd933982ba81c1c9 100644 (file)
@@ -293,7 +293,9 @@ in_class_p (rtx reg, enum reg_class cl, enum reg_class *new_class)
          if (nregs == 1)
            return true;
          for (j = 0; j < nregs; j++)
-           if (TEST_HARD_REG_BIT (lra_no_alloc_regs, hard_regno + j))
+           if (TEST_HARD_REG_BIT (lra_no_alloc_regs, hard_regno + j)
+               || ! TEST_HARD_REG_BIT (reg_class_contents[common_class],
+                                       hard_regno + j))
              break;
          if (j >= nregs)
            return true;
index ed2bea89c63b63a53b8d8a5d71c6a2a1287ce5b6..9ce1761c14bea3d0e2b7a8d2a27f4a78f2de8ffd 100644 (file)
@@ -1,3 +1,8 @@
+2012-11-26  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR target/55277
+       * gcc.target/i386/pr55227.c: New test.
+
 2012-11-26  Steven Bosscher  <steven@gcc.gnu.org>
 
        * testsuite/gcc.dg/20050811-1.c: Change -dv option to -graph option
diff --git a/gcc/testsuite/gcc.target/i386/pr55277.c b/gcc/testsuite/gcc.target/i386/pr55277.c
new file mode 100644 (file)
index 0000000..0bdcdc4
--- /dev/null
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target ilp32 } */
+/* { dg-options "-O1" } */
+
+int a, c;
+
+void f(long long p)
+{
+  long long b;
+
+  if(b)
+    b = p ? : 0;
+
+  for (; p; p++)
+    p *= a & (c = p *= !a < 2);
+
+  a = b += !(b & 3740917449u);
+}