diff options
author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-01-06 07:38:28 +0000 |
---|---|---|
committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-01-06 07:38:28 +0000 |
commit | acf4e6a8ee3856257ac862247e351bc5f1f1886e (patch) | |
tree | cce7d23e8bc39afc78ec3d86b5852080fa7113bf /gcc/cfgcleanup.c | |
parent | f58424d83f15aac19273c1c2c24ec0d3a197a6df (diff) | |
download | gcc-acf4e6a8ee3856257ac862247e351bc5f1f1886e.tar.gz |
* cfgcleanup.c (try_forward_edges): Detect infinite loops while
jump threading.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@48574 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cfgcleanup.c')
-rw-r--r-- | gcc/cfgcleanup.c | 30 |
1 files changed, 27 insertions, 3 deletions
diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c index 96dee62519e..69045a08f3b 100644 --- a/gcc/cfgcleanup.c +++ b/gcc/cfgcleanup.c @@ -412,12 +412,32 @@ try_forward_edges (mode, b) edge t = thread_jump (mode, e, target); if (t) { - new_target = t->dest; - new_target_threaded = true; if (!nthreaded_edges) threaded_edges = xmalloc (sizeof (*threaded_edges) * n_basic_blocks); + else + { + int i; + + /* Detect an infinite loop across blocks not + including the start block. */ + for (i = 0; i < nthreaded_edges; ++i) + if (threaded_edges[i] == t) + break; + if (i < nthreaded_edges) + break; + } + + /* Detect an infinite loop across the start block. */ + if (t->dest == b) + break; + + if (nthreaded_edges >= n_basic_blocks) + abort (); threaded_edges[nthreaded_edges++] = t; + + new_target = t->dest; + new_target_threaded = true; } } @@ -504,7 +524,11 @@ try_forward_edges (mode, b) first->succ->count -= edge_count; first->frequency -= edge_frequency; if (first->succ->succ_next) - t = threaded_edges [n++]; + { + if (n >= nthreaded_edges) + abort (); + t = threaded_edges [n++]; + } else t = first->succ; |