summaryrefslogtreecommitdiff
path: root/gcc/cfgcleanup.c
diff options
context:
space:
mode:
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2002-01-05 10:52:54 +0000
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2002-01-05 10:52:54 +0000
commit309306ce92d061fc3b648b85f4de8d486a382de5 (patch)
tree6a84e86141d2845d366c1de5768f3abe563fff5b /gcc/cfgcleanup.c
parent58f79589285ad20be55c3e383ed115a5b5e8d3cc (diff)
downloadgcc-309306ce92d061fc3b648b85f4de8d486a382de5.tar.gz
* cfgcleanup.c (try_forward_edges): Allow multiple jump threading.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@48563 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cfgcleanup.c')
-rw-r--r--gcc/cfgcleanup.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c
index f4aec511b9f..96dee62519e 100644
--- a/gcc/cfgcleanup.c
+++ b/gcc/cfgcleanup.c
@@ -369,7 +369,8 @@ try_forward_edges (mode, b)
int mode;
{
bool changed = false;
- edge e, next, threaded_edge;
+ edge e, next, *threaded_edges = NULL;
+ int nthreaded_edges = 0;
for (e = b->succ; e; e = next)
{
@@ -406,13 +407,17 @@ try_forward_edges (mode, b)
/* Allow to thread only over one edge at time to simplify updating
of probabilities. */
- else if ((mode & CLEANUP_THREADING) && !threaded)
+ else if (mode & CLEANUP_THREADING)
{
- threaded_edge = thread_jump (mode, e, target);
- if (threaded_edge)
+ edge t = thread_jump (mode, e, target);
+ if (t)
{
- new_target = threaded_edge->dest;
+ new_target = t->dest;
new_target_threaded = true;
+ if (!nthreaded_edges)
+ threaded_edges = xmalloc (sizeof (*threaded_edges)
+ * n_basic_blocks);
+ threaded_edges[nthreaded_edges++] = t;
}
}
@@ -462,6 +467,7 @@ try_forward_edges (mode, b)
gcov_type edge_count = e->count;
int edge_probability = e->probability;
int edge_frequency;
+ int n = 0;
/* Don't force if target is exit block. */
if (threaded && target != EXIT_BLOCK_PTR)
@@ -498,7 +504,7 @@ try_forward_edges (mode, b)
first->succ->count -= edge_count;
first->frequency -= edge_frequency;
if (first->succ->succ_next)
- t = threaded_edge;
+ t = threaded_edges [n++];
else
t = first->succ;
@@ -510,6 +516,8 @@ try_forward_edges (mode, b)
}
}
+ if (threaded_edges)
+ free (threaded_edges);
return changed;
}