diff mbox

Fix PR78725

Message ID alpine.LSU.2.20.1612091626370.31313@wotan.suse.de
State New
Headers show

Commit Message

Michael Matz Dec. 9, 2016, 3:29 p.m. UTC
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.

Comments

Richard Biener Dec. 9, 2016, 6:53 p.m. UTC | #1
On December 9, 2016 4:29:04 PM GMT+01:00, Michael Matz <matz@suse.de> wrote:
>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?

OK

Thanks,
Richard.

>
>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))
>     {
diff mbox

Patch

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))
     {