diff options
author | dougkwan <dougkwan@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-06-10 20:21:24 +0000 |
---|---|---|
committer | dougkwan <dougkwan@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-06-10 20:21:24 +0000 |
commit | 5b17b7ae7a1654f4555cce7f1339d4dad60e7f56 (patch) | |
tree | 88d8b55c16f6064fef54091f016757be543e80c3 | |
parent | 839b1bd15208d73466bf9cfc4c15f043651d2f58 (diff) | |
download | gcc-5b17b7ae7a1654f4555cce7f1339d4dad60e7f56.tar.gz |
2008-06-10 Vinodha Ramasamy <vinodha@google.com>
* value_prob.c (tree_divmod_fixed_value_transform): Use gcov_type.
Avoid division by 0.
(tree_mod_pow2_value_transform): Likewise.
(tree_ic_transform): Likewise.
(tree_stringops_transform): Likewise.
(tree_mod_subtract_transform): Likewise.
* tree-inline-c (copy_bb): Corrected int type to gcov_type.
(copy_edges_for_bb): Likewise.
(initialize_cfun): Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@136639 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/tree-inline.c | 9 | ||||
-rw-r--r-- | gcc/value-prof.c | 42 |
3 files changed, 46 insertions, 16 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4fcc73f30c7..cf40b3751f9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2008-06-10 Vinodha Ramasamy <vinodha@google.com> + * value_prob.c (tree_divmod_fixed_value_transform): Use gcov_type. + Avoid division by 0. + (tree_mod_pow2_value_transform): Likewise. + (tree_ic_transform): Likewise. + (tree_stringops_transform): Likewise. + (tree_mod_subtract_transform): Likewise. + * tree-inline-c (copy_bb): Corrected int type to gcov_type. + (copy_edges_for_bb): Likewise. + (initialize_cfun): Likewise. + 2008-06-10 Uros Bizjak <ubizjak@gmail.com> * config/i386/i386.md (*btdi_rex64): Change operand 1 predicate to diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index a9ca33b14d4..cb97db1326b 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -795,7 +795,8 @@ copy_body_r (tree *tp, int *walk_subtrees, void *data) later */ static basic_block -copy_bb (copy_body_data *id, basic_block bb, int frequency_scale, int count_scale) +copy_bb (copy_body_data *id, basic_block bb, int frequency_scale, + gcov_type count_scale) { block_stmt_iterator bsi, copy_bsi; basic_block copy_basic_block; @@ -1108,7 +1109,7 @@ update_ssa_across_abnormal_edges (basic_block bb, basic_block ret_bb, accordingly. Edges will be taken care of later. Assume aux pointers to point to the copies of each BB. */ static void -copy_edges_for_bb (basic_block bb, int count_scale, basic_block ret_bb) +copy_edges_for_bb (basic_block bb, gcov_type count_scale, basic_block ret_bb) { basic_block new_bb = (basic_block) bb->aux; edge_iterator ei; @@ -1257,7 +1258,7 @@ initialize_cfun (tree new_fndecl, tree callee_fndecl, gcov_type count, struct function *new_cfun = (struct function *) ggc_alloc_cleared (sizeof (struct function)); struct function *src_cfun = DECL_STRUCT_FUNCTION (callee_fndecl); - int count_scale, frequency_scale; + gcov_type count_scale, frequency_scale; if (ENTRY_BLOCK_PTR_FOR_FUNCTION (src_cfun)->count) count_scale = (REG_BR_PROB_BASE * count @@ -1321,7 +1322,7 @@ copy_cfg_body (copy_body_data * id, gcov_type count, int frequency, struct function *cfun_to_copy; basic_block bb; tree new_fndecl = NULL; - int count_scale, frequency_scale; + gcov_type count_scale, frequency_scale; int last; if (ENTRY_BLOCK_PTR_FOR_FUNCTION (src_cfun)->count) diff --git a/gcc/value-prof.c b/gcc/value-prof.c index f1330def688..38ed8b25fdf 100644 --- a/gcc/value-prof.c +++ b/gcc/value-prof.c @@ -610,7 +610,7 @@ tree_divmod_fixed_value_transform (tree stmt) enum tree_code code; gcov_type val, count, all; tree modify, op, op1, op2, result, value, tree_val; - int prob; + gcov_type prob; modify = stmt; if (TREE_CODE (stmt) == RETURN_EXPR @@ -651,7 +651,10 @@ tree_divmod_fixed_value_transform (tree stmt) return false; /* Compute probability of taking the optimal path. */ - prob = (count * REG_BR_PROB_BASE + all / 2) / all; + if (all > 0) + prob = (count * REG_BR_PROB_BASE + all / 2) / all; + else + prob = 0; tree_val = build_int_cst_wide (get_gcov_type (), (unsigned HOST_WIDE_INT) val, @@ -770,7 +773,7 @@ tree_mod_pow2_value_transform (tree stmt) enum tree_code code; gcov_type count, wrong_values, all; tree modify, op, op1, op2, result, value; - int prob; + gcov_type prob; modify = stmt; if (TREE_CODE (stmt) == RETURN_EXPR @@ -817,7 +820,10 @@ tree_mod_pow2_value_transform (tree stmt) if (check_counter (stmt, "pow2", all, bb_for_stmt (stmt)->count)) return false; - prob = (count * REG_BR_PROB_BASE + all / 2) / all; + if (all > 0) + prob = (count * REG_BR_PROB_BASE + all / 2) / all; + else + prob = 0; result = tree_mod_pow2 (stmt, op, op1, op2, prob, count, all); @@ -949,7 +955,7 @@ tree_mod_subtract_transform (tree stmt) enum tree_code code; gcov_type count, wrong_values, all; tree modify, op, op1, op2, result, value; - int prob1, prob2; + gcov_type prob1, prob2; unsigned int i, steps; gcov_type count1, count2; @@ -1016,8 +1022,15 @@ tree_mod_subtract_transform (tree stmt) } /* Compute probability of taking the optimal path(s). */ - prob1 = (count1 * REG_BR_PROB_BASE + all / 2) / all; - prob2 = (count2 * REG_BR_PROB_BASE + all / 2) / all; + if (all > 0) + { + prob1 = (count1 * REG_BR_PROB_BASE + all / 2) / all; + prob2 = (count2 * REG_BR_PROB_BASE + all / 2) / all; + } + else + { + prob1 = prob2 = 0; + } /* In practice, "steps" is always 2. This interface reflects this, and will need to be changed if "steps" can change. */ @@ -1174,7 +1187,7 @@ tree_ic_transform (tree stmt) { histogram_value histogram; gcov_type val, count, all; - int prob; + gcov_type prob; tree call, callee, modify; struct cgraph_node *direct_call; @@ -1200,7 +1213,10 @@ tree_ic_transform (tree stmt) if (4 * count <= 3 * all) return false; - prob = (count * REG_BR_PROB_BASE + all / 2) / all; + if (all > 0) + prob = (count * REG_BR_PROB_BASE + all / 2) / all; + else + prob = 0; direct_call = find_func_by_pid ((int)val); if (direct_call == NULL) @@ -1365,7 +1381,7 @@ tree_stringops_transform (block_stmt_iterator *bsi) tree value; tree dest, src; unsigned int dest_align, src_align; - int prob; + gcov_type prob; tree tree_val; if (!call) @@ -1399,7 +1415,10 @@ tree_stringops_transform (block_stmt_iterator *bsi) return false; if (check_counter (stmt, "value", all, bb_for_stmt (stmt)->count)) return false; - prob = (count * REG_BR_PROB_BASE + all / 2) / all; + if (all > 0) + prob = (count * REG_BR_PROB_BASE + all / 2) / all; + else + prob = 0; dest = CALL_EXPR_ARG (call, 0); dest_align = get_pointer_alignment (dest, BIGGEST_ALIGNMENT); switch (fcode) @@ -1727,4 +1746,3 @@ value_profile_transformations (void) return (value_prof_hooks->value_profile_transformations) (); } - |