This is an alternate fix for PR55331, bootstrapped and tested on x86_64-unknown-linux-gnu, applied.
Richard. 2012-11-16 Richard Biener <rguent...@suse.de> PR middle-end/55331 * gimple-fold.c (gimplify_and_update_call_from_tree): Replace stmt with a NOP instead of removing it. * g++.dg/opt/pr55331.C: New testcase. Index: gcc/gimple-fold.c =================================================================== --- gcc/gimple-fold.c (revision 193816) +++ gcc/gimple-fold.c (working copy) @@ -607,7 +607,7 @@ gimplify_and_update_call_from_tree (gimp unlink_stmt_vdef (stmt); release_defs (stmt); } - gsi_remove (si_p, true); + gsi_replace (si_p, gimple_build_nop (), true); return; } } Index: gcc/testsuite/g++.dg/opt/pr55331.C =================================================================== --- gcc/testsuite/g++.dg/opt/pr55331.C (revision 0) +++ gcc/testsuite/g++.dg/opt/pr55331.C (working copy) @@ -0,0 +1,14 @@ +// PR tree-optimization/55331 +// { dg-do compile } +// { dg-options "-O2 -fno-tree-fre" } + +struct A {}; + +void +foo (A *p, bool x) +{ + A a; + char *e = (char *) (&a + 1); + if (x) + __builtin_memmove (p, &a, e - (char *) &a); +}