diff mbox

Fix propagate_tree_value_into_stmt

Message ID Pine.LNX.4.64.1204201354100.23071@jbgna.fhfr.qr
State New
Headers show

Commit Message

Richard Biener April 20, 2012, 11:55 a.m. UTC
Which should properly care for updating VOPs.

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

Richard.

2012-04-20  Richard Guenther  <rguenther@suse.de>

	* tree-ssa-copy.c (propagate_tree_value_into_stmt): Use
	update_call_from_tree when propagating into a call.

	* g++.dg/torture/20120420-1.C: New testcase.
diff mbox

Patch

Index: gcc/tree-ssa-copy.c
===================================================================
--- gcc/tree-ssa-copy.c	(revision 186619)
+++ gcc/tree-ssa-copy.c	(working copy)
@@ -257,13 +257,11 @@  propagate_tree_value_into_stmt (gimple_s
   else if (is_gimple_call (stmt)
            && gimple_call_lhs (stmt) != NULL_TREE)
     {
-      gimple new_stmt;
-
       tree expr = NULL_TREE;
+      bool res;
       propagate_tree_value (&expr, val);
-      new_stmt = gimple_build_assign (gimple_call_lhs (stmt), expr);
-      move_ssa_defining_stmt_for_defs (new_stmt, stmt);
-      gsi_replace (gsi, new_stmt, false);
+      res = update_call_from_tree (gsi, expr);
+      gcc_assert (res);
     }
   else if (gimple_code (stmt) == GIMPLE_SWITCH)
     propagate_tree_value (gimple_switch_index_ptr (stmt), val);
Index: gcc/testsuite/g++.dg/torture/20120420-1.C
===================================================================
--- gcc/testsuite/g++.dg/torture/20120420-1.C	(revision 0)
+++ gcc/testsuite/g++.dg/torture/20120420-1.C	(revision 0)
@@ -0,0 +1,29 @@ 
+// { dg-do compile }
+
+int g, *gp[100];
+struct V {
+    int* x;
+    int y;
+};
+
+void foo (V **p, V* end, int i)
+{
+  *p = 0;
+  V* pp = *p;
+  int s = 100;
+  for (; pp < end; )
+    {
+      pp++;
+      (pp-1)->x = &g;
+      if (g)
+	{
+	  if (g>10)
+	    g++;
+	  int *t = (int*) operator new (100);
+	  (pp-1)->x = t;
+	}
+      else
+	s--;
+      gp[end-pp] = (pp-1)->x + s;
+    }
+}