Commit 307e7eab by Bernd Schmidt Committed by Bernd Schmidt

bfin.c (bfin_optimize_loop): Unify handling of problematic last insns.

	* config/bfin/bfin.c (bfin_optimize_loop): Unify handling of
	problematic last insns.  Test for TYPE_CALL rather than CALL_P.
	Remove special case testing for last insn of inner loops. Don't fail if
	the loop ends with a jump, emit an extra nop instead.

From-SVN: r146952
parent 9af094a1
2009-04-29 Bernd Schmidt <bernd.schmidt@analog.com>
* config/bfin/bfin.c (bfin_optimize_loop): Unify handling of
problematic last insns. Test for TYPE_CALL rather than CALL_P.
Remove special case testing for last insn of inner loops. Don't fail if
the loop ends with a jump, emit an extra nop instead.
2009-04-29 Richard Guenther <rguenther@suse.de> 2009-04-29 Richard Guenther <rguenther@suse.de>
PR tree-optimization/39941 PR tree-optimization/39941
......
...@@ -3792,7 +3792,7 @@ bfin_optimize_loop (loop_info loop) ...@@ -3792,7 +3792,7 @@ bfin_optimize_loop (loop_info loop)
{ {
basic_block bb; basic_block bb;
loop_info inner; loop_info inner;
rtx insn, init_insn, last_insn, nop_insn; rtx insn, init_insn, last_insn;
rtx loop_init, start_label, end_label; rtx loop_init, start_label, end_label;
rtx reg_lc0, reg_lc1, reg_lt0, reg_lt1, reg_lb0, reg_lb1; rtx reg_lc0, reg_lc1, reg_lt0, reg_lt1, reg_lb0, reg_lb1;
rtx iter_reg; rtx iter_reg;
...@@ -4003,42 +4003,34 @@ bfin_optimize_loop (loop_info loop) ...@@ -4003,42 +4003,34 @@ bfin_optimize_loop (loop_info loop)
goto bad_loop; goto bad_loop;
} }
if (JUMP_P (last_insn)) if (JUMP_P (last_insn) && !any_condjump_p (last_insn))
{ {
loop_info inner = (loop_info) bb->aux; if (dump_file)
if (inner fprintf (dump_file, ";; loop %d has bad last instruction\n",
&& inner->outer == loop loop->loop_no);
&& inner->loop_end == last_insn goto bad_loop;
&& inner->depth == 1) }
/* This jump_insn is the exact loop_end of an inner loop /* In all other cases, try to replace a bad last insn with a nop. */
and to be optimized away. So use the inner's last_insn. */ else if (JUMP_P (last_insn)
last_insn = inner->last_insn; || CALL_P (last_insn)
else || get_attr_type (last_insn) == TYPE_SYNC
|| get_attr_type (last_insn) == TYPE_CALL
|| get_attr_seq_insns (last_insn) == SEQ_INSNS_MULTI
|| recog_memoized (last_insn) == CODE_FOR_return_internal
|| GET_CODE (PATTERN (last_insn)) == ASM_INPUT
|| asm_noperands (PATTERN (last_insn)) >= 0)
{
if (loop->length + 2 > MAX_LOOP_LENGTH)
{ {
if (dump_file) if (dump_file)
fprintf (dump_file, ";; loop %d has bad last instruction\n", fprintf (dump_file, ";; loop %d too long\n", loop->loop_no);
loop->loop_no);
goto bad_loop; goto bad_loop;
} }
}
else if (CALL_P (last_insn)
|| (GET_CODE (PATTERN (last_insn)) != SEQUENCE
&& get_attr_type (last_insn) == TYPE_SYNC)
|| recog_memoized (last_insn) == CODE_FOR_return_internal)
{
if (dump_file) if (dump_file)
fprintf (dump_file, ";; loop %d has bad last instruction\n", fprintf (dump_file, ";; loop %d has bad last insn; replace with nop\n",
loop->loop_no); loop->loop_no);
goto bad_loop;
}
if (GET_CODE (PATTERN (last_insn)) == ASM_INPUT last_insn = emit_insn_after (gen_forced_nop (), last_insn);
|| asm_noperands (PATTERN (last_insn)) >= 0
|| (GET_CODE (PATTERN (last_insn)) != SEQUENCE
&& get_attr_seq_insns (last_insn) == SEQ_INSNS_MULTI))
{
nop_insn = emit_insn_after (gen_nop (), last_insn);
last_insn = nop_insn;
} }
loop->last_insn = last_insn; loop->last_insn = last_insn;
...@@ -4169,7 +4161,7 @@ bfin_optimize_loop (loop_info loop) ...@@ -4169,7 +4161,7 @@ bfin_optimize_loop (loop_info loop)
redirect_edge_succ (e, new_bb); redirect_edge_succ (e, new_bb);
} }
} }
delete_insn (loop->loop_end); delete_insn (loop->loop_end);
/* Insert the loop end label before the last instruction of the loop. */ /* Insert the loop end label before the last instruction of the loop. */
emit_label_before (loop->end_label, loop->last_insn); emit_label_before (loop->end_label, loop->last_insn);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment