2015-07-20  Chen Gang  <gang.chen.5...@gmail.com>

        * config/bfin/bfin.c (hwloop_optimize): Recognize direct jump
        case and emit lsetup at loop head.
---
 gcc/config/bfin/bfin.c | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/gcc/config/bfin/bfin.c b/gcc/config/bfin/bfin.c
index a131053..1c70040 100644
--- a/gcc/config/bfin/bfin.c
+++ b/gcc/config/bfin/bfin.c
@@ -3456,7 +3456,7 @@ hwloop_optimize (hwloop_info loop)
   rtx seq_end;
   rtx_insn *seq;
   int length;
-  bool clobber0, clobber1;
+  bool clobber0, clobber1, direct_jmp = false;
 
   if (loop->depth > MAX_LOOP_DEPTH)
     {
@@ -3519,7 +3519,13 @@ hwloop_optimize (hwloop_info loop)
          || !(loop->incoming->last ()->flags & EDGE_FALLTHRU))
        {
          gcc_assert (JUMP_P (insn));
-         insn = PREV_INSN (insn);
+         if (JUMP_LABEL (insn) != loop->start_label)
+           insn = PREV_INSN (insn);
+         else
+           {
+             direct_jmp = true;
+             insn = loop->start_label;
+           }
        }
 
       for (; insn && insn != loop->start_label; insn = NEXT_INSN (insn))
@@ -3783,7 +3789,7 @@ hwloop_optimize (hwloop_info loop)
   seq = get_insns ();
   end_sequence ();
 
-  if (loop->incoming_src)
+  if (loop->incoming_src && !direct_jmp)
     {
       rtx_insn *prev = BB_END (loop->incoming_src);
       if (vec_safe_length (loop->incoming) > 1
-- 
1.9.3

Reply via email to