[PATCH] Fix PR 90273

Richard Biener rguenther@suse.de
Mon Apr 29 18:29:00 GMT 2019


On Mon, 29 Apr 2019, Richard Biener wrote:

> 
> The following fixes PR90273 where the testcase exhibits an excessive
> number of debug stmts after the recent fixes to CFG cleanup to not
> throw away debug stmts it cannot move but instead move and reset them.
> This excessiveness causes compile-time and memory-usage to go through the
> roof.
> 
> The fix is to deploy a simple debug-stmt DCE eliminating all but the
> last debug-bind (of non-DEBUG_EXPR_DECL vars) in a series of
> debug-bind-only stmts.  This simple DCE is hooked into the DCE
> pass and implemented BB-local.
> 
> Bootstrapped / tested a slightly older version, re-bootstrap/regtest
> in progress on x86_64-unknown-linux-gnu.

Testing went OK.

> OK for trunk and branch?
> 
> Thanks,
> Richard.
> 
> 2019-04-29  Richard Biener  <rguenther@suse.de>
> 
> 	PR tree-optimization/90273
> 	* tree-ssa-dce.c (eliminate_unnecessary_stmts): Eliminate
> 	useless debug stmts.
> 
> Index: gcc/tree-ssa-dce.c
> ===================================================================
> --- gcc/tree-ssa-dce.c	(revision 270640)
> +++ gcc/tree-ssa-dce.c	(working copy)
> @@ -1237,6 +1237,7 @@ eliminate_unnecessary_stmts (void)
>        bb = h.pop ();
>  
>        /* Remove dead statements.  */
> +      auto_bitmap debug_seen;
>        for (gsi = gsi_last_bb (bb); !gsi_end_p (gsi); gsi = psi)
>  	{
>  	  stmt = gsi_stmt (gsi);
> @@ -1282,11 +1283,15 @@ eliminate_unnecessary_stmts (void)
>  			}
>  		    }
>  		  if (!dead)
> -		    continue;
> +		    {
> +		      bitmap_clear (debug_seen);
> +		      continue;
> +		    }
>  		}
>  	      if (!is_gimple_debug (stmt))
>  		something_changed = true;
>  	      remove_dead_stmt (&gsi, bb, to_remove_edges);
> +	      continue;
>  	    }
>  	  else if (is_gimple_call (stmt))
>  	    {
> @@ -1352,6 +1357,18 @@ eliminate_unnecessary_stmts (void)
>  		    break;
>  		  }
>  	    }
> +	  else if (gimple_debug_bind_p (stmt))
> +	    {
> +	      /* We are only keeping the last debug-bind of a
> +	         non-DEBUG_EXPR_DECL variable in a series of
> +		 debug-bind stmts.  */
> +	      tree var = gimple_debug_bind_get_var (stmt);
> +	      if (TREE_CODE (var) != DEBUG_EXPR_DECL
> +		  && !bitmap_set_bit (debug_seen, DECL_UID (var)))
> +		remove_dead_stmt (&gsi, bb, to_remove_edges);
> +	      continue;
> +	    }
> +	  bitmap_clear (debug_seen);
>  	}
>  
>        /* Remove dead PHI nodes.  */
> 

-- 
Richard Biener <rguenther@suse.de>
SUSE Linux GmbH, Maxfeldstrasse 5, 90409 Nuernberg, Germany;
GF: Felix Imendörffer, Mary Higgins, Sri Rasiah; HRB 21284 (AG NÌrnberg)


More information about the Gcc-patches mailing list