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