aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernd Schmidt <bernd.schmidt@analog.com>2009-03-25 23:53:39 +0000
committerBernd Schmidt <bernds@gcc.gnu.org>2009-03-25 23:53:39 +0000
commit03f8829b50afa18835aa63de08232247f09289a8 (patch)
treeeb9a7388e0ffde6448465cdc51561a41e66015ff
parentc0b753c770f46f8bdfc868b532080e5425f1c46e (diff)
downloadgcc-03f8829b50afa18835aa63de08232247f09289a8.zip
gcc-03f8829b50afa18835aa63de08232247f09289a8.tar.gz
gcc-03f8829b50afa18835aa63de08232247f09289a8.tar.bz2
bfin.c (bfin_optimize_loop): If the LSETUP goes before a jump insn...
* config/bfin/bfin.c (bfin_optimize_loop): If the LSETUP goes before a jump insn, count that jump in the distance to the loop start. From-SVN: r145080
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/bfin/bfin.c14
2 files changed, 16 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7d9fe81..1f525bf 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2009-03-26 Bernd Schmidt <bernd.schmidt@analog.com>
+
+ * config/bfin/bfin.c (bfin_optimize_loop): If the LSETUP goes before
+ a jump insn, count that jump in the distance to the loop start.
+
2009-03-25 Kaz Kojima <kkojima@gcc.gnu.org>
PR target/39523
diff --git a/gcc/config/bfin/bfin.c b/gcc/config/bfin/bfin.c
index f4f9d45..d1c964d 100644
--- a/gcc/config/bfin/bfin.c
+++ b/gcc/config/bfin/bfin.c
@@ -3854,9 +3854,17 @@ bfin_optimize_loop (loop_info loop)
/* Make sure the predecessor is before the loop start label, as required by
the LSETUP instruction. */
length = 0;
- for (insn = BB_END (loop->incoming_src);
- insn && insn != loop->start_label;
- insn = NEXT_INSN (insn))
+ insn = BB_END (loop->incoming_src);
+ /* If we have to insert the LSETUP before a jump, count that jump in the
+ length. */
+ if (VEC_length (edge, loop->incoming) > 1
+ || !(VEC_last (edge, loop->incoming)->flags & EDGE_FALLTHRU))
+ {
+ gcc_assert (JUMP_P (insn));
+ insn = PREV_INSN (insn);
+ }
+
+ for (; insn && insn != loop->start_label; insn = NEXT_INSN (insn))
length += length_for_loop (insn);
if (!insn)