diff options
author | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-07-31 13:36:12 +0000 |
---|---|---|
committer | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-07-31 13:36:12 +0000 |
commit | ea9184190b1fda04463153e6d0337817bf1499f2 (patch) | |
tree | 04d23a0a7c5e6d0c065f15b3a5ac8b34efc0196f /gcc/jump.c | |
parent | b4e2a4a6f39bcb264d1bad7646f1bb770b868182 (diff) | |
download | ppe42-gcc-ea9184190b1fda04463153e6d0337817bf1499f2.tar.gz ppe42-gcc-ea9184190b1fda04463153e6d0337817bf1499f2.zip |
* jump.c (duplicate_loop_exit_test): Better test for jumps
entering the loop; create loop pre_header.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@44512 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/jump.c')
-rw-r--r-- | gcc/jump.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/gcc/jump.c b/gcc/jump.c index ddef4a1453c..dd099f2a840 100644 --- a/gcc/jump.c +++ b/gcc/jump.c @@ -305,6 +305,7 @@ duplicate_loop_exit_test (loop_start) rtx lastexit; int max_reg = max_reg_num (); rtx *reg_map = 0; + rtx loop_pre_header_label; /* Scan the exit code. We do not perform this optimization if any insn: @@ -405,6 +406,7 @@ duplicate_loop_exit_test (loop_start) reg_map[REGNO (reg)] = gen_reg_rtx (GET_MODE (reg)); } } + loop_pre_header_label = gen_label_rtx (); /* Now copy each insn. */ for (insn = exitcode; insn != lastexit; insn = NEXT_INSN (insn)) @@ -475,9 +477,14 @@ duplicate_loop_exit_test (loop_start) /* The jump_insn after loop_start should be followed by barrier and loopback label. */ if (prev_nonnote_insn (label) - && (PREV_INSN (prev_nonnote_insn (label)) - == NEXT_INSN (loop_start))) - predict_insn_def (copy, PRED_LOOP_HEADER, TAKEN); + && (prev_nonnote_insn (prev_nonnote_insn (label)) + == next_nonnote_insn (loop_start))) + { + predict_insn_def (copy, PRED_LOOP_HEADER, TAKEN); + /* To keep pre-header, we need to redirect all loop + entrances before the LOOP_BEG note. */ + redirect_jump (copy, loop_pre_header_label, 0); + } else predict_insn_def (copy, PRED_LOOP_HEADER, NOT_TAKEN); } @@ -512,6 +519,8 @@ duplicate_loop_exit_test (loop_start) emit_barrier_before (loop_start); } + emit_label_before (loop_pre_header_label, loop_start); + /* Now scan from the first insn we copied to the last insn we copied (copy) for new pseudo registers. Do this after the code to jump to the end label since that might create a new pseudo too. */ |