From 0f5e7dd6a1a1c2ac37d883ef41ca2ba5c5b07878 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Tue, 17 Jun 2014 12:34:49 +0000 Subject: 2014-06-17 Richard Biener * tree-switch-conversion.c (collect_switch_conv_info): Simplify and allow all blocks to be forwarders. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@211735 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 5 +++++ gcc/tree-switch-conversion.c | 19 ++++++++++--------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 08353945c20..e42464f9731 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2014-06-17 Richard Biener + + * tree-switch-conversion.c (collect_switch_conv_info): Simplify + and allow all blocks to be forwarders. + 2014-06-17 Yufeng Zhang PR target/61483 diff --git a/gcc/tree-switch-conversion.c b/gcc/tree-switch-conversion.c index 9789b619ee2..f6e3eb3ebd2 100644 --- a/gcc/tree-switch-conversion.c +++ b/gcc/tree-switch-conversion.c @@ -640,15 +640,16 @@ collect_switch_conv_info (gimple swtch, struct switch_conv_info *info) info->other_count += e->count; /* See if there is one common successor block for all branch - targets. If it exists, record it in FINAL_BB. */ - FOR_EACH_EDGE (e, ei, info->switch_bb->succs) - { - if (! single_pred_p (e->dest)) - { - info->final_bb = e->dest; - break; - } - } + targets. If it exists, record it in FINAL_BB. + Start with the destination of the default case as guess + or its destination in case it is a forwarder block. */ + if (! single_pred_p (e_default->dest)) + info->final_bb = e_default->dest; + else if (single_succ_p (e_default->dest) + && ! single_pred_p (single_succ (e_default->dest))) + info->final_bb = single_succ (e_default->dest); + /* Require that all switch destinations are either that common + FINAL_BB or a forwarder to it. */ if (info->final_bb) FOR_EACH_EDGE (e, ei, info->switch_bb->succs) { -- cgit v1.2.3