aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/bfin
diff options
context:
space:
mode:
authorBernd Schmidt <bernd.schmidt@analog.com>2008-05-16 11:03:23 +0000
committerBernd Schmidt <bernds@gcc.gnu.org>2008-05-16 11:03:23 +0000
commit4fc4d8507ed500b25bf558875b1c011ce36e4647 (patch)
treeaa35d729ddb84983b0e5f26d6811ef6dd5033f5a /gcc/config/bfin
parent1686960610014d17b0e76fb5f4689b78edbb77f4 (diff)
downloadgcc-4fc4d8507ed500b25bf558875b1c011ce36e4647.zip
gcc-4fc4d8507ed500b25bf558875b1c011ce36e4647.tar.gz
gcc-4fc4d8507ed500b25bf558875b1c011ce36e4647.tar.bz2
bfin.c (bfin_discover_loops): Delete empty loops.
* config/bfin/bfin.c (bfin_discover_loops): Delete empty loops. From-SVN: r135414
Diffstat (limited to 'gcc/config/bfin')
-rw-r--r--gcc/config/bfin/bfin.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/gcc/config/bfin/bfin.c b/gcc/config/bfin/bfin.c
index d24570f..d6506b6 100644
--- a/gcc/config/bfin/bfin.c
+++ b/gcc/config/bfin/bfin.c
@@ -4218,8 +4218,23 @@ bfin_discover_loops (bitmap_obstack *stack, FILE *dump_file)
if (INSN_P (tail) && recog_memoized (tail) == CODE_FOR_loop_end)
{
+ rtx insn;
/* A possible loop end */
+ /* There's a degenerate case we can handle - an empty loop consisting
+ of only a back branch. Handle that by deleting the branch. */
+ insn = BB_HEAD (BRANCH_EDGE (bb)->dest);
+ if (next_real_insn (insn) == tail)
+ {
+ if (dump_file)
+ {
+ fprintf (dump_file, ";; degenerate loop ending at\n");
+ print_rtl_single (dump_file, tail);
+ }
+ delete_insn_and_edges (tail);
+ continue;
+ }
+
loop = XNEW (struct loop_info);
loop->next = loops;
loops = loop;