From 6a66a8a7a2bf2db8fa48d5e3abd758c66e10b6cd Mon Sep 17 00:00:00 2001 From: Kazu Hirata Date: Fri, 26 Nov 2004 06:54:13 +0000 Subject: [PATCH] cfgrtl.c (try_redirect_by_replacing_jump): Speed up the check that tests if all edges go to the same destination. * cfgrtl.c (try_redirect_by_replacing_jump): Speed up the check that tests if all edges go to the same destination. From-SVN: r91334 --- gcc/ChangeLog | 5 +++++ gcc/cfgrtl.c | 17 ++++++++++------- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4919f1a6833..6ed23714c4b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2004-11-26 Kazu Hirata + + * cfgrtl.c (try_redirect_by_replacing_jump): Speed up the + check that tests if all edges go to the same destination. + 2004-11-25 Jeff Law * timevar.def (TV_TREE_LOOP_INIT, TV_TREE_LOOP_FINI): New timevars. diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c index 4e0fc4cb8fc..3ba3265e683 100644 --- a/gcc/cfgrtl.c +++ b/gcc/cfgrtl.c @@ -662,10 +662,8 @@ try_redirect_by_replacing_jump (edge e, basic_block target, bool in_cfglayout) { basic_block src = e->src; rtx insn = BB_END (src), kill_from; - edge tmp; rtx set; int fallthru = 0; - edge_iterator ei; /* If we are partitioning hot/cold basic blocks, we don't want to mess up unconditional or indirect jumps that cross between hot @@ -682,12 +680,17 @@ try_redirect_by_replacing_jump (edge e, basic_block target, bool in_cfglayout) || BB_PARTITION (src) != BB_PARTITION (target))) return NULL; - /* Verify that all targets will be TARGET. */ - FOR_EACH_EDGE (tmp, ei, src->succs) - if (tmp->dest != target && tmp != e) - break; + /* We can replace or remove a complex jump only when we have exactly + two edges. Also, if we have exactly one outgoing edge, we can + redirect that. */ + if (EDGE_COUNT (src->succs) >= 3 + /* Verify that all targets will be TARGET. Specifically, the + edge that is not E must also go to TARGET. */ + || (EDGE_COUNT (src->succs) == 2 + && EDGE_SUCC (src, EDGE_SUCC (src, 0) == e)->dest != target)) + return NULL; - if (tmp || !onlyjump_p (insn)) + if (!onlyjump_p (insn)) return NULL; if ((!optimize || reload_completed) && tablejump_p (insn, NULL, NULL)) return NULL; -- 2.30.2