summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/loop.c8
-rw-r--r--gcc/predict.c9
3 files changed, 22 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index cd1ba35f768..52a3abdfeac 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+Thu Jul 26 00:19:30 CEST 2001 Jan Hubicka <jh@suse.cz>
+
+ * predict.c (estimate_probability): Avoid duplicated predictions.
+
+ * loop.c (find_and_verify_loops): Grok multiple barriers.
+
Wed Jul 25 18:00:05 2001 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* config/alpha/alpha.c (print_operand, case '/'): Don't write '/'.
diff --git a/gcc/loop.c b/gcc/loop.c
index db1ec9df7a3..3584fe4c91b 100644
--- a/gcc/loop.c
+++ b/gcc/loop.c
@@ -2676,6 +2676,14 @@ find_and_verify_loops (f, loops)
= JUMP_LABEL (insn) ? JUMP_LABEL (insn) : get_last_insn ();
struct loop *target_loop = uid_loop[INSN_UID (target)];
rtx loc, loc2;
+ rtx tmp;
+
+ /* Search for possible garbage past the conditional jumps
+ and look for latest barrier. */
+ for (tmp = last_insn_to_move;
+ tmp && GET_CODE (tmp) != CODE_LABEL; tmp = NEXT_INSN (tmp))
+ if (GET_CODE (tmp) == BARRIER)
+ last_insn_to_move = tmp;
for (loc = target; loc; loc = PREV_INSN (loc))
if (GET_CODE (loc) == BARRIER
diff --git a/gcc/predict.c b/gcc/predict.c
index 9fed0c9820c..de1a1417503 100644
--- a/gcc/predict.c
+++ b/gcc/predict.c
@@ -255,6 +255,7 @@ estimate_probability (loops_info)
{
sbitmap *dominators, *post_dominators;
int i;
+ int found_noreturn = 0;
dominators = sbitmap_vector_alloc (n_basic_blocks, n_basic_blocks);
post_dominators = sbitmap_vector_alloc (n_basic_blocks, n_basic_blocks);
@@ -309,9 +310,15 @@ estimate_probability (loops_info)
/* If block has no sucessor, predict all possible paths to
it as improbable, as the block contains a call to a noreturn
function and thus can be executed only once. */
- if (bb->succ == NULL)
+ if (bb->succ == NULL && !found_noreturn)
{
int y;
+
+ /* ??? Postdominator claims each noreturn block to be postdominated
+ by each, so we need to run only once. This needs to be changed
+ once postdominace algorithm is updated to say something more sane.
+ */
+ found_noreturn = 1;
for (y = 0; y < n_basic_blocks; y++)
if (!TEST_BIT (post_dominators[y], i))
{