re PR ipa/66424 (wrong code at -O2 and -O3 on x86_64-linux-gnu in 32-bit mode)
authorVladimir Makarov <vmakarov@redhat.com>
Tue, 21 Jul 2015 19:54:23 +0000 (19:54 +0000)
committerVladimir Makarov <vmakarov@gcc.gnu.org>
Tue, 21 Jul 2015 19:54:23 +0000 (19:54 +0000)
2015-07-21  Vladimir Makarov  <vmakarov@redhat.com>

PR ipa/66424.
* lra-remat.c (operand_to_remat): Prevent using insns with input
subregs processed separately by IRA.

2015-07-21  Vladimir Makarov  <vmakarov@redhat.com>

PR ipa/66424.
* gcc.target/i386/pr66424.c: New.

From-SVN: r226053

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

index 240cbefe5007f3e6d43e557ebe2ab348d885165a..63726155ccb5ec8936477b21ab440502fb877a44 100644 (file)
@@ -1,3 +1,9 @@
+2015-07-21  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR ipa/66424.
+       * lra-remat.c (operand_to_remat): Prevent using insns with input
+       subregs processed separately by IRA.
+
 2015-07-21  Andrew MacLeod  <amacleod@redhat.com>
 
        * ssa-iterators.h (has_zero_uses, has_single_use): Implement as
index 1c259a3b76686d54c3c17ce080f0a1ab0ffd23ba..66532b8f464f033a8911ffc949b1200c98f5fe2a 100644 (file)
@@ -417,6 +417,16 @@ operand_to_remat (rtx_insn *insn)
          return -1;
        found_reg = reg;
       }
+    /* IRA calculates conflicts separately for subregs of two words
+       pseudo.  Even if the pseudo lives, e.g. one its subreg can be
+       used lately, another subreg hard register can be already used
+       for something else.  In such case, it is not safe to
+       rematerialize the insn.  */
+    else if (reg->type == OP_IN && reg->subreg_p
+            && reg->regno >= FIRST_PSEUDO_REGISTER
+            && (GET_MODE_SIZE (PSEUDO_REGNO_MODE (reg->regno))
+                == 2 * UNITS_PER_WORD))
+      return -1;
   if (found_reg == NULL)
     return -1;
   if (found_reg->regno < FIRST_PSEUDO_REGISTER)
index 35c7758960b4c5b05a5362fe3b83e1badf88266d..16d1caf0638469a879172097ed9ad0a1381f6d75 100644 (file)
@@ -1,3 +1,8 @@
+2015-07-21  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR ipa/66424.
+       * gcc.target/i386/pr66424.c: New.
+
 2015-07-21  Alex Velenko  <Alex.Velenko@arm.com>
 
        * gcc.target/arm/thumb-bitfld1.c (foo): Add explicit return type.
diff --git a/gcc/testsuite/gcc.target/i386/pr66424.c b/gcc/testsuite/gcc.target/i386/pr66424.c
new file mode 100644 (file)
index 0000000..f5f5e1e
--- /dev/null
@@ -0,0 +1,51 @@
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+/* { dg-require-effective-target ia32 } */
+int a, b, c, d, e[2], f, l, m, n, o;
+long long g = 1, j;
+static unsigned int h;
+static int i, k;
+
+void
+fn1 (long long p)
+{
+  int q = p;
+  f = 1 ^ e[f ^ (q & 1)];
+}
+
+static void
+fn2 (long long p)
+{
+  f = 1 ^ e[(f ^ 1) & 1];
+  fn1 (p >> 1 & 1);
+  fn1 (p >> 32 & 1);
+}
+
+void
+fn3 (int p)
+{
+  g |= j = p;
+}
+
+int
+main ()
+{
+  e[0] = 1;
+  char p = l;
+  h = --g;
+  i = o = c;
+  m = d ? 1 / d : 0;
+  fn3 (l || 0);
+  b = a;
+  n = j++;
+  k--;
+  fn2 (g);
+  fn2 (h);
+  fn2 (i);
+
+  if (k + f)
+    __builtin_abort ();
+
+  return 0;
+}
+