2015-07-20 Chen Gang <[email protected]>
* 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