[PATCH] Make EVRP propagate into PHIs and remove dead stmts

Trevor Saunders tbsaunde@tbsaunde.org
Tue Oct 18 13:26:00 GMT 2016


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  <rguenther@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.

Thanks!

Trev



More information about the Gcc-patches mailing list