niter estimates are not kept up-to-date (they reference gimple stmts and trees) in the keep-loop-stuff infrastructure so similar to the SCEV cache we rely on people freeing it after passes.
The following brings us a step closer to that by freeing them whenever SCEV is invalidated (we only compute them when SCEV is active) plus removing the odd record-bounds pass that just computes them, leaving scavenging to following passes. Bootstrap and regtest running on x86_64-unknown-linux-gnu. Richard. 2017-06-14 Richard Biener <rguent...@suse.de> PR tree-optimization/81090 * passes.def (pass_record_bounds): Remove. * tree-pass.h (make_pass_record_bounds): Likewise. * tree-ssa-loop.c (pass_data_record_bounds, pass_record_bounds, make_pass_record_bounds): Likewise. * tree-ssa-loop-ivcanon.c (canonicalize_induction_variables): Do not free niter estimates. * tree-scalar-evolution.c (scev_finalize): Free niter estimates. (scev_reset): Likewise. * gcc.dg/graphite/pr81090.c: New testcase. Index: gcc/passes.def =================================================================== --- gcc/passes.def (revision 249193) +++ gcc/passes.def (working copy) @@ -276,7 +276,6 @@ along with GCC; see the file COPYING3. /* All unswitching, final value replacement and splitting can expose empty loops. Remove them now. */ NEXT_PASS (pass_cd_dce); - NEXT_PASS (pass_record_bounds); NEXT_PASS (pass_iv_canon); NEXT_PASS (pass_loop_distribution); NEXT_PASS (pass_copy_prop); Index: gcc/testsuite/gcc.dg/graphite/pr81090.c =================================================================== --- gcc/testsuite/gcc.dg/graphite/pr81090.c (nonexistent) +++ gcc/testsuite/gcc.dg/graphite/pr81090.c (working copy) @@ -0,0 +1,27 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -floop-nest-optimize" } */ + +int x3, za; +int hg[1]; + +void +yw (int dq) +{ + const int r7 = 2; + + while (dq < 1) + { + for (x3 = 0; x3 < r7; ++x3) + for (za = 0; za < r7; ++za) + hg[1] = 0; + ++dq; + } + + x3 = 0; + while (x3 < r7) + { + ++x3; + if (x3 == 0) + break; + } +} Index: gcc/tree-pass.h =================================================================== --- gcc/tree-pass.h (revision 249193) +++ gcc/tree-pass.h (working copy) @@ -373,7 +373,6 @@ extern gimple_opt_pass *make_pass_predco extern gimple_opt_pass *make_pass_iv_canon (gcc::context *ctxt); extern gimple_opt_pass *make_pass_scev_cprop (gcc::context *ctxt); extern gimple_opt_pass *make_pass_empty_loop (gcc::context *ctxt); -extern gimple_opt_pass *make_pass_record_bounds (gcc::context *ctxt); extern gimple_opt_pass *make_pass_graphite (gcc::context *ctxt); extern gimple_opt_pass *make_pass_graphite_transforms (gcc::context *ctxt); extern gimple_opt_pass *make_pass_if_conversion (gcc::context *ctxt); Index: gcc/tree-scalar-evolution.c =================================================================== --- gcc/tree-scalar-evolution.c (revision 249193) +++ gcc/tree-scalar-evolution.c (working copy) @@ -3300,14 +3300,8 @@ scev_reset_htab (void) void scev_reset (void) { - struct loop *loop; - scev_reset_htab (); - - FOR_EACH_LOOP (loop, 0) - { - loop->nb_iterations = NULL_TREE; - } + free_numbers_of_iterations_estimates (cfun); } /* Return true if the IV calculation in TYPE can overflow based on the knowledge @@ -3636,6 +3630,7 @@ scev_finalize (void) return; scalar_evolution_info->empty (); scalar_evolution_info = NULL; + free_numbers_of_iterations_estimates (cfun); } /* Returns true if the expression EXPR is considered to be too expensive Index: gcc/tree-ssa-loop-ivcanon.c =================================================================== --- gcc/tree-ssa-loop-ivcanon.c (revision 249193) +++ gcc/tree-ssa-loop-ivcanon.c (working copy) @@ -1212,7 +1212,6 @@ canonicalize_induction_variables (void) bool irred_invalidated = false; bitmap loop_closed_ssa_invalidated = BITMAP_ALLOC (NULL); - free_numbers_of_iterations_estimates (cfun); estimate_numbers_of_iterations (); FOR_EACH_LOOP (loop, LI_FROM_INNERMOST) Index: gcc/tree-ssa-loop.c =================================================================== --- gcc/tree-ssa-loop.c (revision 249193) +++ gcc/tree-ssa-loop.c (working copy) @@ -459,54 +459,6 @@ make_pass_scev_cprop (gcc::context *ctxt return new pass_scev_cprop (ctxt); } -/* Record bounds on numbers of iterations of loops. */ - -namespace { - -const pass_data pass_data_record_bounds = -{ - GIMPLE_PASS, /* type */ - "*record_bounds", /* name */ - OPTGROUP_NONE, /* optinfo_flags */ - TV_TREE_LOOP_BOUNDS, /* tv_id */ - ( PROP_cfg | PROP_ssa ), /* properties_required */ - 0, /* properties_provided */ - 0, /* properties_destroyed */ - 0, /* todo_flags_start */ - 0, /* todo_flags_finish */ -}; - -class pass_record_bounds : public gimple_opt_pass -{ -public: - pass_record_bounds (gcc::context *ctxt) - : gimple_opt_pass (pass_data_record_bounds, ctxt) - {} - - /* opt_pass methods: */ - virtual unsigned int execute (function *); - -}; // class pass_record_bounds - -unsigned int -pass_record_bounds::execute (function *fun) -{ - if (number_of_loops (fun) <= 1) - return 0; - - estimate_numbers_of_iterations (); - scev_reset (); - return 0; -} - -} // anon namespace - -gimple_opt_pass * -make_pass_record_bounds (gcc::context *ctxt) -{ - return new pass_record_bounds (ctxt); -} - /* Induction variable optimizations. */ namespace {