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; + } +}