diff mbox

Fix PR62238

Message ID alpine.LSU.2.11.1411251504480.374@zhemvz.fhfr.qr
State New
Headers show

Commit Message

Richard Biener Nov. 25, 2014, 2:07 p.m. UTC
I will test the following patch fixing a tree sharing issue in
PR62238 and plugging a SSA name leak.  The issue here is that
force_gimple_operand and friends modify trees in-place, injecting
SSA name uses to them.  If you end up not emitting their definitions
or and up re-using those trees in not appropriate places you'll
break things.

Fixed by unsharing the tree.

The following also plugs the SSA name leak which makes the SSA
verifier ICE become a segfault (a released SSA name leaked into
a tree used otherwise).

Richard.

2014-11-25  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/62238
	* tree-predcom.c (ref_at_iteration): Unshare the expression
	before gimplifying it.
	(prepare_initializers_chain): Discard unused seq.

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

Patch

Index: gcc/tree-predcom.c
===================================================================
--- gcc/tree-predcom.c	(revision 218019)
+++ gcc/tree-predcom.c	(working copy)
@@ -1402,8 +1402,8 @@  ref_at_iteration (data_reference_p dr, i
     off = size_binop (PLUS_EXPR, off,
 		      size_binop (MULT_EXPR, DR_STEP (dr), ssize_int (iter)));
   tree addr = fold_build_pointer_plus (DR_BASE_ADDRESS (dr), off);
-  addr = force_gimple_operand_1 (addr, stmts, is_gimple_mem_ref_addr,
-				 NULL_TREE);
+  addr = force_gimple_operand_1 (unshare_expr (addr), stmts,
+				 is_gimple_mem_ref_addr, NULL_TREE);
   tree alias_ptr = fold_convert (reference_alias_ptr_type (DR_REF (dr)), coff);
   /* While data-ref analysis punts on bit offsets it still handles
      bitfield accesses at byte boundaries.  Cope with that.  Note that
@@ -2354,7 +2354,6 @@  prepare_initializers_chain (struct loop
   unsigned i, n = (chain->type == CT_INVARIANT) ? 1 : chain->length;
   struct data_reference *dr = get_chain_root (chain)->ref;
   tree init;
-  gimple_seq stmts;
   dref laref;
   edge entry = loop_preheader_edge (loop);
 
@@ -2378,12 +2377,17 @@  prepare_initializers_chain (struct loop
 
   for (i = 0; i < n; i++)
     {
+      gimple_seq stmts = NULL;
+
       if (chain->inits[i] != NULL_TREE)
 	continue;
 
       init = ref_at_iteration (dr, (int) i - n, &stmts);
       if (!chain->all_always_accessed && tree_could_trap_p (init))
-	return false;
+	{
+	  gimple_seq_discard (stmts);
+	  return false;
+	}
 
       if (stmts)
 	gsi_insert_seq_on_edge_immediate (entry, stmts);
Index: gcc/testsuite/gcc.dg/torture/pr62238.c
===================================================================
--- gcc/testsuite/gcc.dg/torture/pr62238.c	(revision 0)
+++ gcc/testsuite/gcc.dg/torture/pr62238.c	(working copy)
@@ -0,0 +1,30 @@ 
+/* { dg-do run } */
+
+int a[4], b, c, d; 
+
+int
+fn1 (int p)
+{
+  for (; d; d++)
+    {
+      unsigned int h;
+      for (h = 0; h < 3; h++)
+	{
+	  if (a[c+c+h])
+	    {
+	      if (p)
+		break;
+	      return 0;
+	    }
+	  b = 0;
+	}
+    }
+  return 0;
+}
+
+int
+main ()
+{
+  fn1 (0);
+  return 0;
+}