diff options
author | Easwaran Raman <eraman@google.com> | 2012-10-16 05:28:08 +0000 |
---|---|---|
committer | Easwaran Raman <eraman@gcc.gnu.org> | 2012-10-16 05:28:08 +0000 |
commit | a4da41e1279cf8bf84fc0a0d4e3af5c5e297c011 (patch) | |
tree | 73e706f18d0cfa88bafa5eb814ff70dbc3d9885c /gcc/expr.c | |
parent | 07a1164095855c3556b24245e6d89a2f59b626b0 (diff) | |
download | gcc-a4da41e1279cf8bf84fc0a0d4e3af5c5e297c011.zip gcc-a4da41e1279cf8bf84fc0a0d4e3af5c5e297c011.tar.gz gcc-a4da41e1279cf8bf84fc0a0d4e3af5c5e297c011.tar.bz2 |
[multiple changes]
2012-10-15 Easwaran Raman <eraman@google.com>
* optabs.c (emit_cmp_and_jump_insn_1): Add a new parameter to
specificy the probability of taking the jump.
(emit_cmp_and_jump_insns): Likewise.
(expand_compare_and_swap_loop): Make the jump predicted not taken.
* dojump.c (do_compare_rtx_and_jump): Remove the code attaching
REG_BR_PROB note and pass probability to emit_cmp_and_jump_insns.
* cfgbuild.c (compute_outgoing_frequencies): Do not guess outgoing
probabilities for branches with more than two successors.
* expr.c (emit_block_move_via_loop): Predict the loop backedge loop
to be highly taken.
(try_casesi): Pass the probability of jumping to the default label.
(try_tablejump): Likewise.
(do_tablejump): Likewise.
* expr.h (try_tablejump): Add a new parameter.
(try_casesi): Likewise.
(emit_cmp_and_jump_insns): Add probability as default parameter with a
default value of -1.
* except.c (sjlj_emit_function_enter): Pass probability to
emit_cmp_and_jump_insns.
* stmt.c (case_node): Add new fields PROB and SUBTREE_PROB.
(do_jump_if_equal): Pass probability for REG_BR_PROB note.
(add_case_node): Pass estimated probability of jumping to the case
label.
(emit_case_decision_tree): Pass default_prob to emit_case_nodes.
(get_outgoing_edge_probs): New function.
(conditional_probability): Likewise.
(reset_out_edges_aux): Likewise.
(compute_cases_per_edge): Likewise.
(emit_case_dispatch_table): Update probabilities of edges coming out
of the switch statement.
(expand_case): Compute and propagate default edge probability to
emit_case_dispatch_table.
(expand_sjlj_dispatch_table): Update calls to add_case_node and
emit_case_dispatch_table.
(balance_case_nodes): Update subtree_prob values.
(emit_case_nodes): Compute edge probabilities and add pass them to
emit_cmp_and_jump_insns.
testsuite/ChangeLog:
2012-10-15 Easwaran Raman <eraman@google.com>
* gcc.dg/tree-prof/switch-case-1.c: New test case.
* gcc.dg/tree-prof/switch-case-2.c: New test case.
From-SVN: r192488
Diffstat (limited to 'gcc/expr.c')
-rw-r--r-- | gcc/expr.c | 28 |
1 files changed, 18 insertions, 10 deletions
@@ -154,7 +154,7 @@ static rtx do_store_flag (sepops, rtx, enum machine_mode); #ifdef PUSH_ROUNDING static void emit_single_push_insn (enum machine_mode, rtx, tree); #endif -static void do_tablejump (rtx, enum machine_mode, rtx, rtx, rtx); +static void do_tablejump (rtx, enum machine_mode, rtx, rtx, rtx, int); static rtx const_vector_from_tree (tree); static void write_complex_part (rtx, rtx, bool); @@ -1483,7 +1483,7 @@ emit_block_move_via_loop (rtx x, rtx y, rtx size, emit_label (cmp_label); emit_cmp_and_jump_insns (iter, size, LT, NULL_RTX, iter_mode, - true, top_label); + true, top_label, REG_BR_PROB_BASE * 90 / 100); } /* Copy all or part of a value X into registers starting at REGNO. @@ -10824,10 +10824,14 @@ do_store_flag (sepops ops, rtx target, enum machine_mode mode) #endif /* Attempt to generate a casesi instruction. Returns 1 if successful, - 0 otherwise (i.e. if there is no casesi instruction). */ + 0 otherwise (i.e. if there is no casesi instruction). + + DEFAULT_PROBABILITY is the probability of jumping to the default + label. */ int try_casesi (tree index_type, tree index_expr, tree minval, tree range, - rtx table_label, rtx default_label, rtx fallback_label) + rtx table_label, rtx default_label, rtx fallback_label, + int default_probability) { struct expand_operand ops[5]; enum machine_mode index_mode = SImode; @@ -10849,7 +10853,8 @@ try_casesi (tree index_type, tree index_expr, tree minval, tree range, index = expand_normal (index_expr); if (default_label) emit_cmp_and_jump_insns (rangertx, index, LTU, NULL_RTX, - omode, 1, default_label); + omode, 1, default_label, + default_probability); /* Now we can safely truncate. */ index = convert_to_mode (index_mode, index, 0); } @@ -10895,11 +10900,13 @@ try_casesi (tree index_type, tree index_expr, tree minval, tree range, TABLE_LABEL is a CODE_LABEL rtx for the table itself. DEFAULT_LABEL is a CODE_LABEL rtx to jump to if the - index value is out of range. */ + index value is out of range. + DEFAULT_PROBABILITY is the probability of jumping to + the default label. */ static void do_tablejump (rtx index, enum machine_mode mode, rtx range, rtx table_label, - rtx default_label) + rtx default_label, int default_probability) { rtx temp, vector; @@ -10916,7 +10923,8 @@ do_tablejump (rtx index, enum machine_mode mode, rtx range, rtx table_label, if (default_label) emit_cmp_and_jump_insns (index, range, GTU, NULL_RTX, mode, 1, - default_label); + default_label, default_probability); + /* If index is in range, it must fit in Pmode. Convert to Pmode so we can index with it. */ @@ -10959,7 +10967,7 @@ do_tablejump (rtx index, enum machine_mode mode, rtx range, rtx table_label, int try_tablejump (tree index_type, tree index_expr, tree minval, tree range, - rtx table_label, rtx default_label) + rtx table_label, rtx default_label, int default_probability) { rtx index; @@ -10977,7 +10985,7 @@ try_tablejump (tree index_type, tree index_expr, tree minval, tree range, TYPE_MODE (TREE_TYPE (range)), expand_normal (range), TYPE_UNSIGNED (TREE_TYPE (range))), - table_label, default_label); + table_label, default_label, default_probability); return 1; } |