summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog3
-rw-r--r--gcc/cfgrtl.c21
2 files changed, 5 insertions, 19 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5b5606469a9..4f6a58d0f04 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -6,6 +6,9 @@
* tree-ssa-loop-manip.c: Likewise.
* tree-ssa.c: Likewise.
+ * cfgrtl.c (cfg_layout_redirect_edge_and_branch): Speed up by
+ simplifying edge manipulation.
+
2004-11-29 Alan Modra <amodra@bigpond.net.au>
* varasm.c (default_elf_select_section_1): Only pass DECL_P decl
diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c
index 3ba3265e683..818c5b826e8 100644
--- a/gcc/cfgrtl.c
+++ b/gcc/cfgrtl.c
@@ -2587,25 +2587,8 @@ cfg_layout_redirect_edge_and_branch (edge e, basic_block dest)
of conditional jump, remove it. */
if (EDGE_COUNT (src->succs) == 2)
{
- bool found = false;
- unsigned ix = 0;
- edge tmp, s;
- edge_iterator ei;
-
- FOR_EACH_EDGE (tmp, ei, src->succs)
- if (e == tmp)
- {
- found = true;
- ix = ei.index;
- break;
- }
-
- gcc_assert (found);
-
- if (EDGE_COUNT (src->succs) > (ix + 1))
- s = EDGE_SUCC (src, ix + 1);
- else
- s = EDGE_SUCC (src, 0);
+ /* Find the edge that is different from E. */
+ edge s = EDGE_SUCC (src, EDGE_SUCC (src, 0) == e);
if (s->dest == dest
&& any_condjump_p (BB_END (src))