[PATCH] Fix PR89497

Richard Biener rguenther@suse.de
Wed Feb 27 14:43:00 GMT 2019


CFG cleanup is now set up to perform trivial unreachable code
elimination before doing anything that would require up-to-date
SSA form.  Unfortunately a pending SSA update still will cause
breakage to stmt folding triggered for example by basic-block
merging.

Fortunately it's now easy to properly "interleave" CFG cleanup
and SSA update.

Done as follows, bootstrap & regtest running on x86_64-unknown-linux-gnu.

Richard.

2019-02-27  Richard Biener  <rguenther@suse.de>

	PR middle-end/89497
	* tree-cfgcleanup.h (cleanup_tree_cfg): Add SSA update flags
	argument, defaulted to zero.
	* passes.c (execute_function_todo): Pass down SSA update flags
	to cleanup_tree_cfg.
	* tree-cfgcleanup.c: Include tree-into-ssa.h and tree-cfgcleanup.h.
	(cleanup_tree_cfg_noloop): After cleanup_control_flow_pre update SSA
	form if requested.
	(cleanup_tree_cfg): Get and pass down SSA update flags.


Index: gcc/tree-cfgcleanup.h
===================================================================
--- gcc/tree-cfgcleanup.h	(revision 269251)
+++ gcc/tree-cfgcleanup.h	(working copy)
@@ -22,7 +22,7 @@ along with GCC; see the file COPYING3.
 
 /* In tree-cfgcleanup.c  */
 extern bitmap cfgcleanup_altered_bbs;
-extern bool cleanup_tree_cfg (void);
+extern bool cleanup_tree_cfg (unsigned = 0);
 extern bool fixup_noreturn_call (gimple *stmt);
 extern bool delete_unreachable_blocks_update_callgraph (cgraph_node *dst_node,
 							bool update_clones);
Index: gcc/passes.c
===================================================================
--- gcc/passes.c	(revision 269251)
+++ gcc/passes.c	(working copy)
@@ -1927,7 +1927,7 @@ execute_function_todo (function *fn, voi
   /* Always cleanup the CFG before trying to update SSA.  */
   if (flags & TODO_cleanup_cfg)
     {
-      cleanup_tree_cfg ();
+      cleanup_tree_cfg (flags & TODO_update_ssa_any);
 
       /* When cleanup_tree_cfg merges consecutive blocks, it may
 	 perform some simplistic propagation when removing single
Index: gcc/tree-cfgcleanup.c
===================================================================
--- gcc/tree-cfgcleanup.c	(revision 269251)
+++ gcc/tree-cfgcleanup.c	(working copy)
@@ -44,6 +44,9 @@ along with GCC; see the file COPYING3.
 #include "gimple-fold.h"
 #include "tree-ssa-loop-niter.h"
 #include "cgraph.h"
+#include "tree-into-ssa.h"
+#include "tree-cfgcleanup.h"
+
 
 /* The set of blocks in that at least one of the following changes happened:
    -- the statement at the end of the block was changed
@@ -943,7 +946,7 @@ mfb_keep_latches (edge e)
    Return true if the flowgraph was modified, false otherwise.  */
 
 static bool
-cleanup_tree_cfg_noloop (void)
+cleanup_tree_cfg_noloop (unsigned ssa_update_flags)
 {
   timevar_push (TV_TREE_CLEANUP_CFG);
 
@@ -1023,6 +1026,8 @@ cleanup_tree_cfg_noloop (void)
 
   /* After doing the above SSA form should be valid (or an update SSA
      should be required).  */
+  if (ssa_update_flags)
+    update_ssa (ssa_update_flags);
 
   /* Compute dominator info which we need for the iterative process below.  */
   if (!dom_info_available_p (CDI_DOMINATORS))
@@ -1125,9 +1130,9 @@ repair_loop_structures (void)
 /* Cleanup cfg and repair loop structures.  */
 
 bool
-cleanup_tree_cfg (void)
+cleanup_tree_cfg (unsigned ssa_update_flags)
 {
-  bool changed = cleanup_tree_cfg_noloop ();
+  bool changed = cleanup_tree_cfg_noloop (ssa_update_flags);
 
   if (current_loops != NULL
       && loops_state_satisfies_p (LOOPS_NEED_FIXUP))



More information about the Gcc-patches mailing list