re PR rtl-optimization/89634 (gmp-ecm miscompilation on s390x with -march=zEC12 ...
authorJakub Jelinek <jakub@redhat.com>
Sat, 9 Mar 2019 08:25:48 +0000 (09:25 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Sat, 9 Mar 2019 08:25:48 +0000 (09:25 +0100)
PR rtl-optimization/89634
* cfgcleanup.c (thread_jump): Punt if registers mentioned in cond1
are modified in BB_END (e->src) instruction.

* gcc.c-torture/execute/pr89634.c: New test.

From-SVN: r269522

gcc/ChangeLog
gcc/cfgcleanup.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr89634.c [new file with mode: 0644]

index 564ad3e1bfd41309f18b6269afca97a8f1066184..5cac152498a4a8900d188c1e081d72bd90c8d589 100644 (file)
@@ -1,3 +1,9 @@
+2019-03-09  Jakub Jelinek  <jakub@redhat.com>
+
+       PR rtl-optimization/89634
+       * cfgcleanup.c (thread_jump): Punt if registers mentioned in cond1
+       are modified in BB_END (e->src) instruction.
+
 2019-03-08  David Malcolm  <dmalcolm@redhat.com>
 
        PR target/79926
index fd27fd6d21255ce2c710ba34ebb092a1e705e9e7..86b262750330a29c56a4bbabf07e28fe07c9ded3 100644 (file)
@@ -308,6 +308,11 @@ thread_jump (edge e, basic_block b)
       || !rtx_equal_p (XEXP (cond1, 1), XEXP (cond2, 1)))
     return NULL;
 
+  /* Punt if BB_END (e->src) is doloop-like conditional jump that modifies
+     the registers used in cond1.  */
+  if (modified_in_p (cond1, BB_END (e->src)))
+    return NULL;
+
   /* Short circuit cases where block B contains some side effects, as we can't
      safely bypass it.  */
   for (insn = NEXT_INSN (BB_HEAD (b)); insn != NEXT_INSN (BB_END (b));
index 02f24821998f4f04028ff954a5b48fda829114b9..f32b5afeed95236bffb6b8c3db34bac86b9b8ed0 100644 (file)
@@ -1,3 +1,8 @@
+2019-03-09  Jakub Jelinek  <jakub@redhat.com>
+
+       PR rtl-optimization/89634
+       * gcc.c-torture/execute/pr89634.c: New test.
+
 2019-03-08  Jakub Jelinek  <jakub@redhat.com>
 
        PR c/85870
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr89634.c b/gcc/testsuite/gcc.c-torture/execute/pr89634.c
new file mode 100644 (file)
index 0000000..b633e61
--- /dev/null
@@ -0,0 +1,40 @@
+/* PR rtl-optimization/89634 */
+
+static unsigned long *
+foo (unsigned long *x)
+{
+  return x + (1 + *x);
+}
+
+__attribute__((noipa)) unsigned long
+bar (unsigned long *x)
+{
+  unsigned long c, d = 1, e, *f, g, h = 0, i;
+  for (e = *x - 1; e > 0; e--)
+    {
+      f = foo (x + 1);
+      for (i = 1; i < e; i++)
+       f = foo (f);
+      c = *f;
+      if (c == 2)
+       d *= 2;
+      else
+       {
+         i = (c - 1) / 2 - 1;
+         g = (2 * i + 1) * (d + 1) + (2 * d + 1);
+         if (g > h)
+           h = g;
+         d *= c;
+       }
+    }
+  return h;
+}
+
+int
+main ()
+{
+  unsigned long a[18] = { 4, 2, -200, 200, 2, -400, 400, 3, -600, 0, 600, 5, -100, -66, 0, 66, 100, __LONG_MAX__ / 8 + 1 };
+  if (bar (a) != 17)
+    __builtin_abort ();
+  return 0;
+}