Fix pr78725
authorMichael Matz <matz@suse.de>
Tue, 13 Dec 2016 14:14:41 +0000 (14:14 +0000)
committerMichael Matz <matz@gcc.gnu.org>
Tue, 13 Dec 2016 14:14:41 +0000 (14:14 +0000)
PR tree-optimization/78725
* tree-ssa-loop-split.c (split_at_bb_p): Check for overflow and
at correct use point.

testsuite/
PR tree-optimization/78725
* gcc.dg/pr78725.c: New test.
* gcc.dg/pr78725-2.c: New test.

From-SVN: r243606

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr78725-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr78725.c [new file with mode: 0644]
gcc/tree-ssa-loop-split.c

index 05ddb30..b53704c 100644 (file)
@@ -1,3 +1,9 @@
+2016-12-13  Michael Matz  <matz@suse.de>
+
+       PR tree-optimization/78725
+       * tree-ssa-loop-split.c (split_at_bb_p): Check for overflow and
+       at correct use point.
+
 2016-12-13  Martin Liska  <mliska@suse.cz>
 
        * asan.c (asan_expand_mark_ifn): Use renamed
index 6ad28bf..118d01e 100644 (file)
@@ -1,3 +1,9 @@
+2016-12-13  Michael Matz  <matz@suse.de>
+
+       PR tree-optimization/78725
+       * gcc.dg/pr78725.c: New test.
+       * gcc.dg/pr78725-2.c: New test.
+
 2016-12-13  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/78742
diff --git a/gcc/testsuite/gcc.dg/pr78725-2.c b/gcc/testsuite/gcc.dg/pr78725-2.c
new file mode 100644 (file)
index 0000000..9de489e
--- /dev/null
@@ -0,0 +1,19 @@
+/* { dg-do run } */
+/* { dg-options "-O3 -fsplit-loops" } */
+
+int a, b, c;
+
+int main ()
+{
+  int d;
+  for (; c < 1; c++)
+    for (d = 0; d < 3; d++)
+      for (b = 0; b < 1; b++)
+       if (c >= d)
+         a = 1;
+
+  if (a != 1)
+    __builtin_abort ();
+
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/pr78725.c b/gcc/testsuite/gcc.dg/pr78725.c
new file mode 100644 (file)
index 0000000..ed95790
--- /dev/null
@@ -0,0 +1,19 @@
+/* { dg-do run } */
+/* { dg-options "-O3 -fsplit-loops" } */
+
+int fn1 (int b, int c)
+{
+    return c < 0 || c > 31 ? 0 : b >> c;
+}
+
+unsigned char d = 255; 
+int e, f;
+
+int main ()
+{
+  for (; f < 2; f++)
+    e = fn1 (1, d++);
+  if (e != 1)
+    __builtin_abort ();
+  return 0; 
+}
index dac68e6..84c0627 100644 (file)
@@ -102,10 +102,11 @@ split_at_bb_p (struct loop *loop, basic_block bb, tree *border, affine_iv *iv)
 
   tree op0 = gimple_cond_lhs (stmt);
   tree op1 = gimple_cond_rhs (stmt);
+  struct loop *useloop = loop_containing_stmt (stmt);
 
-  if (!simple_iv (loop, loop, op0, iv, false))
+  if (!simple_iv (loop, useloop, op0, iv, false))
     return NULL_TREE;
-  if (!simple_iv (loop, loop, op1, &iv2, false))
+  if (!simple_iv (loop, useloop, op1, &iv2, false))
     return NULL_TREE;
 
   /* Make it so that the first argument of the condition is
@@ -122,6 +123,8 @@ split_at_bb_p (struct loop *loop, basic_block bb, tree *border, affine_iv *iv)
     return NULL_TREE;
   if (!integer_zerop (iv2.step))
     return NULL_TREE;
+  if (!iv->no_overflow)
+    return NULL_TREE;
 
   if (dump_file && (dump_flags & TDF_DETAILS))
     {