From 0107dca2adf82db79c54d6da9707035533d474d6 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Mon, 6 May 2013 11:27:29 +0000 Subject: re PR middle-end/57147 (setjmp call and if body wrongly elided (function runs off early end)) 2013-05-06 Richard Biener PR middle-end/57147 * tree-cfg.c (gimple_purge_dead_abnormal_call_edges): If the edge is also fallthru, preserve it and just clear the abnormal flag. * tree-cfgcleanup.c (remove_fallthru_edge): If the edge is also complex, preserve that and just clear the fallthru flag. * tree-inline.c (update_ssa_across_abnormal_edges): Also update virtual operands. * gcc.dg/torture/pr57147-1.c: New testcase. * gcc.dg/torture/pr57147-2.c: Likewise. * gcc.dg/torture/pr57147-3.c: Likewise. From-SVN: r198625 --- gcc/tree-cfgcleanup.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'gcc/tree-cfgcleanup.c') diff --git a/gcc/tree-cfgcleanup.c b/gcc/tree-cfgcleanup.c index 3c69a7d..9b314f7 100644 --- a/gcc/tree-cfgcleanup.c +++ b/gcc/tree-cfgcleanup.c @@ -57,7 +57,10 @@ remove_fallthru_edge (vec *ev) FOR_EACH_EDGE (e, ei, ev) if ((e->flags & EDGE_FALLTHRU) != 0) { - remove_edge_and_dominated_blocks (e); + if (e->flags & EDGE_COMPLEX) + e->flags &= ~EDGE_FALLTHRU; + else + remove_edge_and_dominated_blocks (e); return true; } return false; -- cgit v1.1