aboutsummaryrefslogtreecommitdiff
path: root/gcc/loop.c
diff options
context:
space:
mode:
authorDale Johannesen <dalej@apple.com>2004-06-16 17:13:34 +0000
committerDale Johannesen <dalej@gcc.gnu.org>2004-06-16 17:13:34 +0000
commitd85428e234930c9d1352d1e5494b5b245dcd1a22 (patch)
treeeac12c2a50a19fa9cba5bc97d3201615d9aeb226 /gcc/loop.c
parente370de6e30762a5fb49cd39832c6ed98a60bd82b (diff)
downloadgcc-d85428e234930c9d1352d1e5494b5b245dcd1a22.zip
gcc-d85428e234930c9d1352d1e5494b5b245dcd1a22.tar.gz
gcc-d85428e234930c9d1352d1e5494b5b245dcd1a22.tar.bz2
loop.c (loop_givs_reduce): Avoid miscompilation of loops entered at bottom.
2004-06-16 Dale Johannesen <dalej@apple.com> * loop.c (loop_givs_reduce): Avoid miscompilation of loops entered at bottom. From-SVN: r83248
Diffstat (limited to 'gcc/loop.c')
-rw-r--r--gcc/loop.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/gcc/loop.c b/gcc/loop.c
index fd0c0d6..aafb18c 100644
--- a/gcc/loop.c
+++ b/gcc/loop.c
@@ -4699,13 +4699,24 @@ loop_givs_reduce (struct loop *loop, struct iv_class *bl)
this is an address giv, then try to put the increment
immediately after its use, so that flow can create an
auto-increment addressing mode. */
+ /* Don't do this for loops entered at the bottom, to avoid
+ this invalid transformation:
+ jmp L; -> jmp L;
+ TOP: TOP:
+ use giv use giv
+ L: inc giv
+ inc biv L:
+ test biv test giv
+ cbr TOP cbr TOP
+ */
if (v->giv_type == DEST_ADDR && bl->biv_count == 1
&& bl->biv->always_executed && ! bl->biv->maybe_multiple
/* We don't handle reversed biv's because bl->biv->insn
does not have a valid INSN_LUID. */
&& ! bl->reversed
&& v->always_executed && ! v->maybe_multiple
- && INSN_UID (v->insn) < max_uid_for_loop)
+ && INSN_UID (v->insn) < max_uid_for_loop
+ && !loop->top)
{
/* If other giv's have been combined with this one, then
this will work only if all uses of the other giv's occur