aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2002-01-05 23:38:28 -0800
committerRichard Henderson <rth@gcc.gnu.org>2002-01-05 23:38:28 -0800
commit3b3b1e3202eb1c375c842a8cb629668047882fb8 (patch)
treecce7d23e8bc39afc78ec3d86b5852080fa7113bf /gcc
parent98e40e83636aaed6b6b66ad680e6419461d48dc0 (diff)
downloadgcc-3b3b1e3202eb1c375c842a8cb629668047882fb8.zip
gcc-3b3b1e3202eb1c375c842a8cb629668047882fb8.tar.gz
gcc-3b3b1e3202eb1c375c842a8cb629668047882fb8.tar.bz2
cfgcleanup.c (try_forward_edges): Detect infinite loops while jump threading.
* cfgcleanup.c (try_forward_edges): Detect infinite loops while jump threading. From-SVN: r48574
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/cfgcleanup.c30
2 files changed, 32 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7a4adfc..292a195 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,10 @@
2002-01-05 Richard Henderson <rth@redhat.com>
+ * cfgcleanup.c (try_forward_edges): Detect infinite loops while
+ jump threading.
+
+2002-01-05 Richard Henderson <rth@redhat.com>
+
* c-decl.c (c_expand_body): Don't call outlining_inline_function.
* integrate.c (output_inline_function): Likewise.
* toplev.c (rest_of_compilation): Do it here instead. Move call
diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c
index 96dee62..69045a0 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;