re PR target/80160 (operand has impossible constraints)
authorBernd Schmidt <bernds@redhat.com>
Sat, 25 Mar 2017 01:12:04 +0000 (01:12 +0000)
committerBernd Schmidt <bernds@gcc.gnu.org>
Sat, 25 Mar 2017 01:12:04 +0000 (01:12 +0000)
PR rtl-optimization/80160
PR rtl-optimization/80159
* lra-assigns.c (must_not_spill_p): Tighten new test to also take
reg_alternate_class into account.

* gcc.target/i386/pr80160.c: New test.

From-SVN: r246473

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

index adf3791dfd96e0f00a21e0c0720bd6a525f3e74b..ef8e27fa8d3cc6674a70c7574ce57756ae8131cf 100644 (file)
@@ -1,3 +1,10 @@
+2017-03-25  Bernd Schmidt  <bschmidt@redhat.com>
+
+       PR rtl-optimization/80160
+       PR rtl-optimization/80159
+       * lra-assigns.c (must_not_spill_p): Tighten new test to also take
+       reg_alternate_class into account.
+
 2017-03-24  Vladimir Makarov  <vmakarov@redhat.com>
 
        PR target/80148
index 75bb630dca7f7169cbcd8bfa714c67bf6a62c180..e4cc43ac82060e6ee92a4218029fb50e372eddbe 100644 (file)
@@ -908,7 +908,8 @@ must_not_spill_p (unsigned spill_regno)
      does not solve the general case where existing reloads fully
      cover a limited register class.  */
   if (!bitmap_bit_p (&non_reload_pseudos, spill_regno)
-      && reg_class_size [reg_preferred_class (spill_regno)] == 1)
+      && reg_class_size [reg_preferred_class (spill_regno)] == 1
+      && reg_alternate_class (spill_regno) == NO_REGS)
     return true;
   return false;
 }
index d98eb375beb2d418aee9ac637de81a7f7c227502..36a082a305cb1879c91fdddb40738d3f66f6da64 100644 (file)
@@ -1,3 +1,10 @@
+2017-03-25  Bernd Schmidt  <bschmidt@redhat.com>
+
+       PR rtl-optimization/80160
+       PR rtl-optimization/80159
+
+       * gcc.target/i386/pr80160.c: New test.
+
 2017-03-24  Jakub Jelinek  <jakub@redhat.com>
 
        PR sanitizer/79904
diff --git a/gcc/testsuite/gcc.target/i386/pr80160.c b/gcc/testsuite/gcc.target/i386/pr80160.c
new file mode 100644 (file)
index 0000000..3bb110e
--- /dev/null
@@ -0,0 +1,45 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fno-omit-frame-pointer -w" } */
+/* { dg-additional-options "-march=pentium-mmx" { target ia32 } } */
+
+typedef struct { long long a; } a_t;
+int *a, b;
+a_t *e, c;
+long long f;
+void fn (int);
+void fn2 (void);
+int fn3 (a_t);
+void fn4 (a_t);
+a_t foo (long long val) { return (a_t){val}; }
+static void
+bar (int ka)
+{
+  unsigned i;
+  for (i = 0; i < 512; i++) {
+    long d;
+    c = (a_t){d};
+    fn2 ();
+  }
+  fn (ka);
+}
+void
+test (void)
+{
+  a_t g;
+  a_t *h, j;
+  h = e;
+  j = *h;
+  if (e == (a_t *) 1) {
+    a_t k = {fn3 (j)};
+    fn4 (j);
+    long l;
+    g = foo((long long)b << 2 | l);
+    k = g;
+    if (j.a != k.a) {
+      a_t m = g;
+      int n = m.a, o = m.a >> 32;
+      asm ("# %0 %1 %2 %3" : "=m"(*a), "+A"(f) : "b"(n), "c"(o));
+    }
+  }
+  bar ((int) h);
+}