aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2001-07-31 15:36:12 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2001-07-31 13:36:12 +0000
commit940b29aa635f6844c5de0cff75526c5994b79a18 (patch)
tree04d23a0a7c5e6d0c065f15b3a5ac8b34efc0196f /gcc
parent20dde49d1f94e2a4e2b85ef3c769e5a0fd549b7a (diff)
downloadgcc-940b29aa635f6844c5de0cff75526c5994b79a18.zip
gcc-940b29aa635f6844c5de0cff75526c5994b79a18.tar.gz
gcc-940b29aa635f6844c5de0cff75526c5994b79a18.tar.bz2
jump.c (duplicate_loop_exit_test): Better test for jumps entering the loop; create loop pre_header.
* jump.c (duplicate_loop_exit_test): Better test for jumps entering the loop; create loop pre_header. From-SVN: r44512
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/jump.c15
2 files changed, 17 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 85b915b..461b902 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+Tue Jul 31 15:33:27 CEST 2001 Jan Hubicka <jh@suse.cz>
+
+ * jump.c (duplicate_loop_exit_test): Better test for jumps
+ entering the loop; create loop pre_header.
+
2001-07-31 Hartmut Penner <hpenner@de.ibm.com>
* doc/install.texi: Add s390 and s390x as new targets.
diff --git a/gcc/jump.c b/gcc/jump.c
index ddef4a1..dd099f2 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. */