This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Fix PR78725
- From: Michael Matz <matz at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Fri, 9 Dec 2016 16:29:04 +0100 (CET)
- Subject: Fix PR78725
- Authentication-results: sourceware.org; auth=none
Hi,
if the induction variable on which we want to partition the loop
iterations for loop splitting might overflow we would either need runtime
tests checking if an overflow in fact does happen, or we can simply not
split loops on such ones. I chose the latter.
Fixes the testcase, and regstrapped without regressions on x86-64-linux
(all languages+Ada). Okay for trunk?
Ciao,
Michael.
PR tree-optimization/78725
* tree-ssa-loop-split.c (split_at_bb_p): Check for overflow.
testsuite/
PR tree-optimization/78725
* gcc.dg/pr78725.c: New test.
diff --git a/gcc/testsuite/gcc.dg/pr78725.c b/gcc/testsuite/gcc.dg/pr78725.c
new file mode 100644
index 0000000..9d76047
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr78725.c
@@ -0,0 +1,19 @@
+/* { dg-do run } */
+/* { dg-options "-O3" } */
+
+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;
+}
diff --git a/gcc/tree-ssa-loop-split.c b/gcc/tree-ssa-loop-split.c
index dac68e6..a78d23f 100644
--- a/gcc/tree-ssa-loop-split.c
+++ b/gcc/tree-ssa-loop-split.c
@@ -122,6 +122,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))
{