aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2002-01-10 17:34:17 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2002-01-10 16:34:17 +0000
commitbcb3bc6d901f28c1ea237584198c89e5aff2a074 (patch)
treee6bfbcfd4a9ad86d0d36c4357e1d76fbda1b9fc2 /gcc
parent0a553c7e1853074ee0616f92ce6b749f389e547a (diff)
downloadgcc-bcb3bc6d901f28c1ea237584198c89e5aff2a074.zip
gcc-bcb3bc6d901f28c1ea237584198c89e5aff2a074.tar.gz
gcc-bcb3bc6d901f28c1ea237584198c89e5aff2a074.tar.bz2
cfgcleanup.c (try_forward_edges): Properly initialize nthreaded_edges; update edge probabilities to match.
* cfgcleanup.c (try_forward_edges): Properly initialize nthreaded_edges; update edge probabilities to match. From-SVN: r48734
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/cfgcleanup.c36
2 files changed, 37 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 88d5309..d53102f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+Thu Jan 10 17:19:12 CET 2002 Jan Hubicka <jh@suse.cz>
+
+ * cfgcleanup.c (try_forward_edges): Properly initialize nthreaded_edges;
+ update edge probabilities to match.
+
2002-01-10 Joseph S. Myers <jsm28@cam.ac.uk>
* Makefile.in ($(docdir)/gccint.info, gccint.dvi): Add additional
diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c
index 8cf7e68..0af87b4 100644
--- a/gcc/cfgcleanup.c
+++ b/gcc/cfgcleanup.c
@@ -370,13 +370,13 @@ try_forward_edges (mode, b)
{
bool changed = false;
edge e, next, *threaded_edges = NULL;
- int nthreaded_edges = 0;
for (e = b->succ; e; e = next)
{
basic_block target, first;
int counter;
bool threaded = false;
+ int nthreaded_edges = 0;
next = e->succ_next;
@@ -412,7 +412,7 @@ try_forward_edges (mode, b)
edge t = thread_jump (mode, e, target);
if (t)
{
- if (!nthreaded_edges)
+ if (!threaded_edges)
threaded_edges = xmalloc (sizeof (*threaded_edges)
* n_basic_blocks);
else
@@ -521,16 +521,44 @@ try_forward_edges (mode, b)
edge t;
first->count -= edge_count;
- first->succ->count -= edge_count;
first->frequency -= edge_frequency;
if (first->succ->succ_next)
{
+ edge e;
+ int prob;
if (n >= nthreaded_edges)
abort ();
t = threaded_edges [n++];
+ if (t->src != first)
+ abort ();
+ if (first->frequency)
+ prob = edge_frequency * REG_BR_PROB_BASE / first->frequency;
+ else
+ prob = 0;
+ t->probability -= prob;
+ prob = REG_BR_PROB_BASE - prob;
+ if (prob == 0)
+ {
+ first->succ->probability = REG_BR_PROB_BASE;
+ first->succ->succ_next->probability = 0;
+ }
+ else
+ for (e = first->succ; e; e = e->succ_next)
+ e->probability = ((e->probability * REG_BR_PROB_BASE)
+ / (double) prob);
}
else
- t = first->succ;
+ {
+ /* It is possible that as the result of
+ threading we've removed edge as it is
+ threaded to the fallthru edge. Avoid
+ getting out of sync. */
+ if (n < nthreaded_edges
+ && first == threaded_edges [n]->src)
+ n++;
+ t = first->succ;
+ }
+ t->count -= edge_count;
first = t->dest;
}