Which should properly care for updating VOPs. Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.
Richard. 2012-04-20 Richard Guenther <rguent...@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. 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; + } +}