diff options
author | Jan Hubicka <jh@suse.cz> | 2004-09-23 02:50:37 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2004-09-23 00:50:37 +0000 |
commit | e53de54da399b14c108c994a81c047502cf4a513 (patch) | |
tree | b424c4477beb895f8bc28d96a8c822154f4b71bc /gcc/cfgexpand.c | |
parent | d0259e11e7c68f2dbc212e5a31efc2a02dd79add (diff) | |
download | gcc-e53de54da399b14c108c994a81c047502cf4a513.zip gcc-e53de54da399b14c108c994a81c047502cf4a513.tar.gz gcc-e53de54da399b14c108c994a81c047502cf4a513.tar.bz2 |
cfgexpand.c (add_reg_br_prob_note): New function.
* cfgexpand.c (add_reg_br_prob_note): New function.
(expand_gimple_cond_expr): Use it.
(tree_expand_cfg): No longer kill the profile.
* cfgrt.c (rtl_verify_flow_info_1): Check profile consistency
only if it is present.
* passes.c (rest_of_handle_loop_optimize): Kill the profile.
* predict.c (combine_predictions_for_insn): Set the probabilities
based on REG_BR_PROB note if present.
* predict.c (branch_prob): Profile is read only with
flag_branch_probabilities.
From-SVN: r87910
Diffstat (limited to 'gcc/cfgexpand.c')
-rw-r--r-- | gcc/cfgexpand.c | 50 |
1 files changed, 47 insertions, 3 deletions
diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index bf179fe..5f8ec90 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -38,6 +38,49 @@ Boston, MA 02111-1307, USA. */ #include "diagnostic.h" #include "toplev.h" +/* Verify that there is exactly single jump instruction since last and attach + REG_BR_PROB note specifying probability. + ??? We really ought to pass the probability down to RTL expanders and let it + re-distribute it when the conditional expands into multiple coniditionals. + This is however dificult to do. */ +static void +add_reg_br_prob_note (FILE *dump_file, rtx last, int probability) +{ + if (profile_status == PROFILE_ABSENT) + return; + for (last = NEXT_INSN (last); last && NEXT_INSN (last); last = NEXT_INSN (last)) + if (GET_CODE (last) == JUMP_INSN) + { + /* It is common to emit condjump-around-jump sequence when we don't know + how to reverse the conditional. Special case this. */ + if (!any_condjump_p (last) + || GET_CODE (NEXT_INSN (last)) != JUMP_INSN + || !simplejump_p (NEXT_INSN (last)) + || GET_CODE (NEXT_INSN (NEXT_INSN (last))) != BARRIER + || GET_CODE (NEXT_INSN (NEXT_INSN (NEXT_INSN (last)))) != CODE_LABEL + || NEXT_INSN (NEXT_INSN (NEXT_INSN (NEXT_INSN (last))))) + goto failed; + if (find_reg_note (last, REG_BR_PROB, 0)) + abort (); + REG_NOTES (last) + = gen_rtx_EXPR_LIST (REG_BR_PROB, + GEN_INT (REG_BR_PROB_BASE - probability), + REG_NOTES (last)); + return; + } + if (!last || GET_CODE (last) != JUMP_INSN || !any_condjump_p (last)) + goto failed; + if (find_reg_note (last, REG_BR_PROB, 0)) + abort (); + REG_NOTES (last) + = gen_rtx_EXPR_LIST (REG_BR_PROB, + GEN_INT (probability), REG_NOTES (last)); + return; +failed: + if (dump_file) + fprintf (dump_file, "Failed to add probability note\n"); +} + #ifndef LOCAL_ALIGNMENT #define LOCAL_ALIGNMENT(TYPE, ALIGNMENT) ALIGNMENT @@ -804,7 +847,7 @@ expand_gimple_cond_expr (basic_block bb, tree stmt) tree pred = COND_EXPR_COND (stmt); tree then_exp = COND_EXPR_THEN (stmt); tree else_exp = COND_EXPR_ELSE (stmt); - rtx last; + rtx last = get_last_insn (); extract_true_false_edges_from_block (bb, &true_edge, &false_edge); if (EXPR_LOCUS (stmt)) @@ -822,17 +865,20 @@ expand_gimple_cond_expr (basic_block bb, tree stmt) if (TREE_CODE (then_exp) == GOTO_EXPR && IS_EMPTY_STMT (else_exp)) { jumpif (pred, label_rtx (GOTO_DESTINATION (then_exp))); + add_reg_br_prob_note (dump_file, last, true_edge->probability); return NULL; } if (TREE_CODE (else_exp) == GOTO_EXPR && IS_EMPTY_STMT (then_exp)) { jumpifnot (pred, label_rtx (GOTO_DESTINATION (else_exp))); + add_reg_br_prob_note (dump_file, last, false_edge->probability); return NULL; } gcc_assert (TREE_CODE (then_exp) == GOTO_EXPR && TREE_CODE (else_exp) == GOTO_EXPR); jumpif (pred, label_rtx (GOTO_DESTINATION (then_exp))); + add_reg_br_prob_note (dump_file, last, true_edge->probability); last = get_last_insn (); expand_expr (else_exp, const0_rtx, VOIDmode, 0); @@ -1193,8 +1239,6 @@ tree_expand_cfg (void) basic_block bb, init_block; sbitmap blocks; - profile_status = PROFILE_ABSENT; - /* Some backends want to know that we are expanding to RTL. */ currently_expanding_to_rtl = 1; |