This makes fold_stmt consistently not transfer EH info from old to new stmt as callers are responsible for that (and for removing dead EH edges).
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk. Richard. 2015-09-15 Richard Biener <rguent...@suse.de> * gimple-fold.c (gimplify_and_update_call_from_tree): Do not transfer EH info from old to new stmt. (replace_call_with_value): Likewise. (replace_call_with_call_and_fold): Likewise. (gimple_fold_builtin_memory_op): Likewise. (gimple_fold_builtin_memset): Likewise. (gimple_fold_builtin_stpcpy): Likewise. (gimple_fold_call): Likewise. * gcc.dg/pr67563.c: New testcase. Index: gcc/gimple-fold.c =================================================================== *** gcc/gimple-fold.c (revision 227779) --- gcc/gimple-fold.c (working copy) *************** gimplify_and_update_call_from_tree (gimp *** 548,554 **** unlink_stmt_vdef (stmt); release_defs (stmt); } ! gsi_replace (si_p, gimple_build_nop (), true); return; } } --- 549,555 ---- unlink_stmt_vdef (stmt); release_defs (stmt); } ! gsi_replace (si_p, gimple_build_nop (), false); return; } } *************** replace_call_with_value (gimple_stmt_ite *** 589,595 **** unlink_stmt_vdef (stmt); release_ssa_name (vdef); } ! gsi_replace (gsi, repl, true); } /* Replace the call at *GSI with the new call REPL and fold that --- 590,596 ---- unlink_stmt_vdef (stmt); release_ssa_name (vdef); } ! gsi_replace (gsi, repl, false); } /* Replace the call at *GSI with the new call REPL and fold that *************** replace_call_with_call_and_fold (gimple_ *** 608,614 **** gimple_set_vuse (repl, gimple_vuse (stmt)); SSA_NAME_DEF_STMT (gimple_vdef (repl)) = repl; } ! gsi_replace (gsi, repl, true); fold_stmt (gsi); } --- 609,615 ---- gimple_set_vuse (repl, gimple_vuse (stmt)); SSA_NAME_DEF_STMT (gimple_vdef (repl)) = repl; } ! gsi_replace (gsi, repl, false); fold_stmt (gsi); } *************** gimple_fold_builtin_memory_op (gimple_st *** 655,661 **** unlink_stmt_vdef (stmt); release_ssa_name (vdef); } ! gsi_replace (gsi, repl, true); return true; } --- 656,662 ---- unlink_stmt_vdef (stmt); release_ssa_name (vdef); } ! gsi_replace (gsi, repl, false); return true; } *************** gimple_fold_builtin_memory_op (gimple_st *** 668,674 **** release_ssa_name (gimple_vdef (stmt)); if (!lhs) { ! gsi_replace (gsi, gimple_build_nop (), true); return true; } goto done; --- 669,675 ---- release_ssa_name (gimple_vdef (stmt)); if (!lhs) { ! gsi_replace (gsi, gimple_build_nop (), false); return true; } goto done; *************** gimple_fold_builtin_memory_op (gimple_st *** 750,756 **** SSA_NAME_DEF_STMT (gimple_vdef (new_stmt)) = new_stmt; if (!lhs) { ! gsi_replace (gsi, new_stmt, true); return true; } gsi_insert_before (gsi, new_stmt, GSI_SAME_STMT); --- 756,762 ---- SSA_NAME_DEF_STMT (gimple_vdef (new_stmt)) = new_stmt; if (!lhs) { ! gsi_replace (gsi, new_stmt, false); return true; } gsi_insert_before (gsi, new_stmt, GSI_SAME_STMT); *************** gimple_fold_builtin_memory_op (gimple_st *** 1030,1036 **** SSA_NAME_DEF_STMT (gimple_vdef (new_stmt)) = new_stmt; if (!lhs) { ! gsi_replace (gsi, new_stmt, true); return true; } gsi_insert_before (gsi, new_stmt, GSI_SAME_STMT); --- 1036,1042 ---- SSA_NAME_DEF_STMT (gimple_vdef (new_stmt)) = new_stmt; if (!lhs) { ! gsi_replace (gsi, new_stmt, false); return true; } gsi_insert_before (gsi, new_stmt, GSI_SAME_STMT); *************** done: *** 1048,1054 **** dest = force_gimple_operand_gsi (gsi, dest, false, NULL_TREE, true, GSI_SAME_STMT); gimple repl = gimple_build_assign (lhs, dest); ! gsi_replace (gsi, repl, true); return true; } --- 1054,1060 ---- dest = force_gimple_operand_gsi (gsi, dest, false, NULL_TREE, true, GSI_SAME_STMT); gimple repl = gimple_build_assign (lhs, dest); ! gsi_replace (gsi, repl, false); return true; } *************** gimple_fold_builtin_memset (gimple_stmt_ *** 1130,1136 **** if (gimple_call_lhs (stmt)) { gimple asgn = gimple_build_assign (gimple_call_lhs (stmt), dest); ! gsi_replace (gsi, asgn, true); } else { --- 1136,1142 ---- if (gimple_call_lhs (stmt)) { gimple asgn = gimple_build_assign (gimple_call_lhs (stmt), dest); ! gsi_replace (gsi, asgn, false); } else { *************** gimple_fold_builtin_stpcpy (gimple_stmt_ *** 1980,1986 **** gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT); gassign *ret = gimple_build_assign (gimple_call_lhs (stmt), POINTER_PLUS_EXPR, dest, tem); ! gsi_replace (gsi, ret, true); /* Finally fold the memcpy call. */ gimple_stmt_iterator gsi2 = *gsi; gsi_prev (&gsi2); --- 1986,1992 ---- gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT); gassign *ret = gimple_build_assign (gimple_call_lhs (stmt), POINTER_PLUS_EXPR, dest, tem); ! gsi_replace (gsi, ret, false); /* Finally fold the memcpy call. */ gimple_stmt_iterator gsi2 = *gsi; gsi_prev (&gsi2); *************** gimple_fold_call (gimple_stmt_iterator * *** 3062,3068 **** && tree_int_cst_le (gimple_call_arg (stmt, 1), gimple_call_arg (stmt, 2)))) { ! gsi_replace (gsi, gimple_build_nop (), true); unlink_stmt_vdef (stmt); release_defs (stmt); return true; --- 3068,3074 ---- && tree_int_cst_le (gimple_call_arg (stmt, 1), gimple_call_arg (stmt, 2)))) { ! gsi_replace (gsi, gimple_build_nop (), false); unlink_stmt_vdef (stmt); release_defs (stmt); return true; Index: gcc/testsuite/gcc.dg/pr67563.c =================================================================== *** gcc/testsuite/gcc.dg/pr67563.c (revision 0) --- gcc/testsuite/gcc.dg/pr67563.c (working copy) *************** *** 0 **** --- 1,11 ---- + /* { dg-do compile } */ + /* { dg-options "-O2 -fexceptions" } */ + + static void + emit_package (int p1) + { + int a; + int b[0]; + a = __fprintf_chk (0, 0, ""); + } + void emit_lua () { emit_package (0); }