aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2014-06-17 12:34:49 +0000
committerRichard Biener <rguenther@suse.de>2014-06-17 12:34:49 +0000
commit0f5e7dd6a1a1c2ac37d883ef41ca2ba5c5b07878 (patch)
tree7072bbde82d7eced1858a887f39501322d76483b
parent11dfb01ce1847fbb0439ea4c3dd2ce083af7c5cb (diff)
2014-06-17 Richard Biener <rguenther@suse.de>
* 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
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/tree-switch-conversion.c19
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 <rguenther@suse.de>
+
+ * tree-switch-conversion.c (collect_switch_conv_info): Simplify
+ and allow all blocks to be forwarders.
+
2014-06-17 Yufeng Zhang <yufeng.zhang@arm.com>
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)
{