On Tue, 18 Oct 2016, Richard Biener wrote: > On Tue, 18 Oct 2016, Trevor Saunders wrote: > > > On Tue, Oct 18, 2016 at 02:34:58PM +0200, Richard Biener wrote: > > > > > > The following patch makes EVRP remove stmts that will become dead > > > after propagation. For this to work we have to propagate into PHIs > > > (sth we missed as well). > > > > > > Bootstrap and regtest running on x86_64-unknown-linux-gnu. > > > > > > Richard. > > > > > > 2016-10-18 Richard Biener <rguent...@suse.de> > > > > > > * tree-vrp.c (evrp_dom_walker::evrp_dom_walker): Initialize > > > stmts_to_remove. > > > (evrp_dom_walker::~evrp_dom_walker): Free it. > > > (evrp_dom_walker::stmts_to_remove): Add. > > > (evrp_dom_walker::before_dom_children): Mark PHIs and stmts > > > whose output we fully propagate for removal. Propagate > > > into BB destination PHI arguments. > > > (execute_early_vrp): Remove queued stmts. Dump value ranges > > > before stmt removal. > > > > > > Index: gcc/tree-vrp.c > > > =================================================================== > > > --- gcc/tree-vrp.c (revision 241302) > > > +++ gcc/tree-vrp.c (working copy) > > > @@ -10643,11 +10643,13 @@ public: > > > : dom_walker (CDI_DOMINATORS), stack (10) > > > { > > > stmts_to_fixup.create (0); > > > + stmts_to_remove.create (0); > > > need_eh_cleanup = BITMAP_ALLOC (NULL); > > > } > > > ~evrp_dom_walker () > > > { > > > stmts_to_fixup.release (); > > > + stmts_to_remove.release (); > > > BITMAP_FREE (need_eh_cleanup); > > > } > > > virtual edge before_dom_children (basic_block); > > > @@ -10660,6 +10662,7 @@ public: > > > auto_vec<std::pair <const_tree, value_range*> > stack; > > > bitmap need_eh_cleanup; > > > vec<gimple *> stmts_to_fixup; > > > + vec<gimple *> stmts_to_remove; > > > > That might as well be an auto_vec right? > > > > > }; > > > > > > > > > @@ -10769,6 +10772,15 @@ evrp_dom_walker::before_dom_children (ba > > > else > > > set_value_range_to_varying (&vr_result); > > > update_value_range (lhs, &vr_result); > > > + > > > + /* Mark PHIs whose lhs we fully propagate for removal. */ > > > + tree val; > > > + if ((val = op_with_constant_singleton_value_range (lhs)) > > > + && may_propagate_copy (lhs, val)) > > > > wouldn't it be clearer to write that as > > > > tree val = op_with_constant_singleton_value_range (lhs); > > if (val && may_propagate_copy (lhs, val)) > > > > > + { > > > + stmts_to_remove.safe_push (phi); > > > + continue; > > > + } > > > } > > > > > > edge taken_edge = NULL; > > > @@ -10806,7 +10818,6 @@ evrp_dom_walker::before_dom_children (ba > > > update_value_range (output, &vr); > > > vr = *get_value_range (output); > > > > > > - > > > /* Set the SSA with the value range. */ > > > if (INTEGRAL_TYPE_P (TREE_TYPE (output))) > > > { > > > @@ -10824,6 +10835,17 @@ evrp_dom_walker::before_dom_children (ba > > > && range_includes_zero_p (vr.min, > > > vr.max) == 1))) > > > set_ptr_nonnull (output); > > > + > > > + /* Mark stmts whose output we fully propagate for removal. */ > > > + tree val; > > > + if ((val = op_with_constant_singleton_value_range (output)) > > > + && may_propagate_copy (output, val) > > > + && !stmt_could_throw_p (stmt) > > > + && !gimple_has_side_effects (stmt)) > > > > similar. > > Fixed. Testing the following.
Turns out I need to fix gcc.dg/tree-ssa/pr61839_2.c which didn't test what it was supposed to anyway. Committed to trunk. Richard.