From c4f81e4a6b4a1ff4774c8836de4a7241c57b278f Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Thu, 26 Jul 2001 00:23:09 +0200 Subject: [PATCH] predict.c (estimate_probability): Avoid duplicated predictions. * predict.c (estimate_probability): Avoid duplicated predictions. * loop.c (find_and_verify_loops): Grok multiple barriers. From-SVN: r44369 --- gcc/ChangeLog | 6 ++++++ gcc/loop.c | 8 ++++++++ gcc/predict.c | 9 ++++++++- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cd1ba35f768a..52a3abdfeacb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +Thu Jul 26 00:19:30 CEST 2001 Jan Hubicka + + * 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 * config/alpha/alpha.c (print_operand, case '/'): Don't write '/'. diff --git a/gcc/loop.c b/gcc/loop.c index db1ec9df7a35..3584fe4c91b7 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 9fed0c9820c9..de1a1417503b 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)) { -- 2.43.5