The following fixes if-conversion to free SCEV/niter estimates because
it DCEs stmts.

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.

Richard.

2017-11-22  Richard Biener  <rguent...@suse.de>

        PR tree-optimization/83089
        * tree-if-conv.c (pass_if_conversion::execute): If anything
        changed reset SCEV and free the number of iteration estimates.

        * gcc.dg/pr83089.c: New testcase.

Index: gcc/tree-if-conv.c
===================================================================
--- gcc/tree-if-conv.c  (revision 254990)
+++ gcc/tree-if-conv.c  (working copy)
@@ -2959,6 +2959,12 @@ pass_if_conversion::execute (function *f
            && !loop->dont_vectorize))
       todo |= tree_if_conversion (loop);
 
+  if (todo)
+    {
+      free_numbers_of_iterations_estimates (fun);
+      scev_reset ();
+    }
+
   if (flag_checking)
     {
       basic_block bb;
Index: gcc/testsuite/gcc.dg/pr83089.c
===================================================================
--- gcc/testsuite/gcc.dg/pr83089.c      (nonexistent)
+++ gcc/testsuite/gcc.dg/pr83089.c      (working copy)
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -ftree-loop-if-convert -ftree-parallelize-loops=2" } */
+
+int rl, s8;
+
+void
+it (int zy, short int el)
+{
+  int hb;
+
+  while (el != 0)
+    {
+      hb = el;
+      for (rl = 0; rl < 200; ++rl)
+       {
+         for (s8 = 0; s8 < 2; ++s8)
+           {
+           }
+         if (s8 < 3)
+           zy = hb;
+         if (hb == 0)
+           ++s8;
+         zy += (s8 != -1);
+       }
+      el = zy;
+    }
+}

Reply via email to