diff mbox series

Fix PR84775

Message ID alpine.LSU.2.20.1803091428310.18265@zhemvz.fhfr.qr
State New
Headers show
Series Fix PR84775 | expand

Commit Message

Richard Biener March 9, 2018, 1:28 p.m. UTC
The following reverts the fix for PR84178 again and instead prunes those
bogus immediate uses from stmts we didn't yet insert.  Micha has sth
in the works to clean up the mess somewhat in GCC 9.

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.

Richard.

2018-03-09  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/84775
	* tree-if-conv.c (add_bb_predicate_gimplified_stmts): Delink
	immediate uses of predicate stmts and mark them modified.

	Revert
	PR tree-optimization/84178
	* tree-if-conv.c (combine_blocks): Move insert_gimplified_predicates
	to caller.
	(version_loop_for_if_conversion): Delay update_ssa call.
	(tree_if_conversion): Delay update_ssa until after predicate
	insertion.

	* gcc.dg/torture/pr84775.c: New testcase.
diff mbox series

Patch

Index: gcc/testsuite/gcc.dg/torture/pr84775.c
===================================================================
--- gcc/testsuite/gcc.dg/torture/pr84775.c	(nonexistent)
+++ gcc/testsuite/gcc.dg/torture/pr84775.c	(working copy)
@@ -0,0 +1,18 @@ 
+/* { dg-do compile } */
+
+int a, b, c, d, e, f;
+
+void fn1 ()
+{
+  while (e)
+    for (f = 0; f < 4; f++)
+      {
+	int h[1];
+	for (; c; c++)
+	  if (a)
+	    break;
+	d = a - 4;
+	if (d)
+	  b = h[0];
+      }
+}
Index: gcc/tree-if-conv.c
===================================================================
--- gcc/tree-if-conv.c	(revision 258380)
+++ gcc/tree-if-conv.c	(working copy)
@@ -257,6 +257,19 @@  set_bb_predicate_gimplified_stmts (basic
 static inline void
 add_bb_predicate_gimplified_stmts (basic_block bb, gimple_seq stmts)
 {
+  /* We might have updated some stmts in STMTS via force_gimple_operand
+     calling fold_stmt and that producing multiple stmts.  Delink immediate
+     uses so update_ssa after loop versioning doesn't get confused for
+     the not yet inserted predicates.
+     ???  This should go away once we reliably avoid updating stmts
+     not in any BB.  */
+  for (gimple_stmt_iterator gsi = gsi_start (stmts);
+       !gsi_end_p (gsi); gsi_next (&gsi))
+    {
+      gimple *stmt = gsi_stmt (gsi);
+      delink_stmt_imm_use (stmt);
+      gimple_set_modified (stmt, true);
+    }
   gimple_seq_add_seq_without_update
     (&(((struct bb_predicate *) bb->aux)->predicate_gimplified_stmts), stmts);
 }
@@ -2371,6 +2384,7 @@  combine_blocks (struct loop *loop)
   edge_iterator ei;
 
   remove_conditions_and_labels (loop);
+  insert_gimplified_predicates (loop);
   predicate_all_scalar_phis (loop);
 
   if (any_pred_load_store)
@@ -2592,6 +2606,7 @@  version_loop_for_if_conversion (struct l
   gsi = gsi_last_bb (cond_bb);
   gimple_call_set_arg (g, 1, build_int_cst (integer_type_node, new_loop->num));
   gsi_insert_before (&gsi, g, GSI_SAME_STMT);
+  update_ssa (TODO_update_ssa);
   return new_loop;
 }
 
@@ -2809,7 +2824,6 @@  tree_if_conversion (struct loop *loop)
   unsigned int todo = 0;
   bool aggressive_if_conv;
   struct loop *rloop;
-  bool need_update_ssa = false;
 
  again:
   rloop = NULL;
@@ -2855,7 +2869,6 @@  tree_if_conversion (struct loop *loop)
       struct loop *nloop = version_loop_for_if_conversion (vloop);
       if (nloop == NULL)
 	goto cleanup;
-      need_update_ssa = true;
       if (vloop != loop)
 	{
 	  /* If versionable_outer_loop_p decided to version the
@@ -2880,13 +2893,6 @@  tree_if_conversion (struct loop *loop)
 	}
     }
 
-  /* Due to hard to fix issues we end up with immediate uses recorded
-     for not yet inserted predicates which will confuse SSA update so
-     we delayed this from after versioning to after predicate insertion.  */
-  insert_gimplified_predicates (loop);
-  if (need_update_ssa)
-    update_ssa (TODO_update_ssa);
-
   /* Now all statements are if-convertible.  Combine all the basic
      blocks into one huge basic block doing the if-conversion
      on-the-fly.  */