summaryrefslogtreecommitdiff
path: root/gcc/tree-cfgcleanup.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/tree-cfgcleanup.c')
-rw-r--r--gcc/tree-cfgcleanup.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/gcc/tree-cfgcleanup.c b/gcc/tree-cfgcleanup.c
index fc2141f48c1..8dec8c76431 100644
--- a/gcc/tree-cfgcleanup.c
+++ b/gcc/tree-cfgcleanup.c
@@ -568,9 +568,23 @@ fixup_noreturn_call (gimple stmt)
imm_use_iterator iter;
gimple use_stmt;
+ /* All statements using the OP are unreachable or PHI
+ statements where the edge correspoing to OP use is unreachable.
+ We need to remove all normal statements so fixup_cfg will not
+ try to update them and keep all PHIs but remove use of the SSA
+ name or verifier will complain. */
FOR_EACH_IMM_USE_STMT (use_stmt, iter, op)
- FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
- SET_USE (use_p, error_mark_node);
+ {
+ if (gimple_code (use_stmt) == GIMPLE_PHI)
+ FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
+ SET_USE (use_p, error_mark_node);
+ else
+ {
+ gimple_stmt_iterator gsi = gsi_for_stmt (use_stmt);
+ gsi_remove (&gsi, true);
+ }
+ }
+ release_ssa_name (op);
}
update_stmt (stmt);
changed = true;