------- Additional Comments From steven at gcc dot gnu dot org 2005-05-16 00:26 ------- We have this code in tree-ssa-propagate.c:1052-1065: if (did_replace) { fold_stmt (bsi_stmt_ptr (i)); stmt = bsi_stmt(i); /* If we folded a builtin function, we'll likely need to rename VDEFs. */ mark_new_vars_to_rename (stmt); /* If we cleaned up EH information from the statement, remove EH edges. */ if (maybe_clean_eh_stmt (stmt)) tree_purge_dead_eh_edges (bb); } But maybe_clean_eh_stmt returns false. Why?? Because we replace the entire statement apparently. So we get to tree-eh.c: Breakpoint 4, substitute_and_fold (prop_value=0xf3e3a0) at tree-ssa-propagate.c:1054 1054 fold_stmt (bsi_stmt_ptr (i)); (gdb) p *bsi_stmt_ptr(i) $12 = 0x2a95896550 (gdb) p debug_generic_stmt (*bsi_stmt_ptr(i)) # TMT.1D.2025_4 = V_MAY_DEF <TMT.1D.2025_3>; fputs (&"a"[0], fileD.2015_2); $13 = void (gdb) cont Continuing. Breakpoint 3, substitute_and_fold (prop_value=0xf3e3a0) at tree-ssa-propagate.c:1063 1063 if (maybe_clean_eh_stmt (stmt)) (gdb) p stmt $14 = 0x2a95896d70 1063 if (maybe_clean_eh_stmt (stmt)) (gdb) p debug_generic_stmt(stmt) # TMT.1D.2025_4 = V_MAY_DEF <TMT.1D.2025_3>; __builtin_fputc (97, fileD.2015_2); $8 = void (gdb) step maybe_clean_eh_stmt (stmt=0x2a95896d70) at tree-eh.c:2040 2040 if (!tree_could_throw_p (stmt)) (gdb) next 2041 if (remove_stmt_from_eh_region (stmt)) (gdb) 2043 return false; (gdb) So we try to remove the _new_ statement from the EH region, and leave the old one right there.
-- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21399