diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7a660ffad31..299297dba09 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -23,6 +23,10 @@ Sat Jan 17 21:24:16 1998 David T. McWherter Sat Jan 17 21:16:19 1998 Jeffrey A Law (law@cygnus.com) + * loop.c (find_and_verify_loops): When attempting to move insns from + inside the loop outside the loop, create a BARRIER if no suitable + one was found. + * jump.c (jump_optimize): Remove Dec 17, 1997 chance in favor of an equivalent change from gcc-2.8. diff --git a/gcc/loop.c b/gcc/loop.c index 222620171fb..0fa3b4f0d2b 100644 --- a/gcc/loop.c +++ b/gcc/loop.c @@ -2531,6 +2531,27 @@ find_and_verify_loops (f) { rtx q, r; + /* If no suitable BARRIER was found, create a suitable + one before TARGET. Since TARGET is a fall through + path, we'll need to insert an jump around our block + and a add a BARRIER before TARGET. + + This creates an extra unconditional jump outside + the loop. However, the benefits of removing rarely + executed instructions from inside the loop usually + outweighs the cost of the extra unconditional jump + outside the loop. */ + if (loc == 0) + { + rtx temp; + + temp = gen_jump (JUMP_LABEL (insn)); + temp = emit_jump_insn_before (temp, target); + JUMP_LABEL (temp) = JUMP_LABEL (insn); + LABEL_NUSES (JUMP_LABEL (insn))++; + loc = emit_barrier_before (target); + } + /* Include the BARRIER after INSN and copy the block after LOC. */ new_label = squeeze_notes (new_label, NEXT_INSN (insn));