From: Richard Biener Date: Tue, 27 Nov 2012 09:20:02 +0000 (+0000) Subject: re PR middle-end/55331 (ICE: SIGSEGV in substitute_and_fold with -O2 -fno-tree-fre) X-Git-Tag: releases/gcc-4.8.0~1766 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=77d19c725f827218975859ab7d3a680904075216;p=thirdparty%2Fgcc.git re PR middle-end/55331 (ICE: SIGSEGV in substitute_and_fold with -O2 -fno-tree-fre) 2012-11-27 Richard Biener 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. From-SVN: r193839 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1274fb18a9ea..4aab7fceda2b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2012-11-27 Richard Biener + + PR middle-end/55331 + * gimple-fold.c (gimplify_and_update_call_from_tree): Replace + stmt with a NOP instead of removing it. + 2012-11-27 Steven Bosscher * loop-invariant.c (check_invariant_table_size): Take sizeof of diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c index 969cfeb58292..251be2485d4d 100644 --- a/gcc/gimple-fold.c +++ b/gcc/gimple-fold.c @@ -607,7 +607,7 @@ gimplify_and_update_call_from_tree (gimple_stmt_iterator *si_p, tree expr) unlink_stmt_vdef (stmt); release_defs (stmt); } - gsi_remove (si_p, true); + gsi_replace (si_p, gimple_build_nop (), true); return; } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0164d2757362..ff025c11e53a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-11-27 Richard Biener + + PR middle-end/55331 + * g++.dg/opt/pr55331.C: New testcase. + 2012-11-26 Steven Bosscher * gcc.dg/20050811-2.c: Change -dv option to -graph option. diff --git a/gcc/testsuite/g++.dg/opt/pr55331.C b/gcc/testsuite/g++.dg/opt/pr55331.C new file mode 100644 index 000000000000..4717db8091f3 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr55331.C @@ -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); +}