summaryrefslogtreecommitdiff
path: root/gcc/loop.c
diff options
context:
space:
mode:
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>1998-01-17 21:50:05 +0000
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>1998-01-17 21:50:05 +0000
commitbc770d213f3b695315029360016181e1c279e162 (patch)
tree1f2c3ee528dc36eff6e8def1f98e791d86d5fa08 /gcc/loop.c
parentfae222fae263242b1b6573a6b27d19ce7921dcf8 (diff)
downloadgcc-bc770d213f3b695315029360016181e1c279e162.tar.gz
* 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@17399 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/loop.c')
-rw-r--r--gcc/loop.c21
1 files changed, 21 insertions, 0 deletions
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));