diff options
author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-10-05 10:42:24 +0000 |
---|---|---|
committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-10-05 10:42:24 +0000 |
commit | 85344eeb1a722e91178c011ce3c56904c9bfdd31 (patch) | |
tree | ff7a8ef56d2fdbc4a060af939444fce16b626c97 /gcc/value-prof.c | |
parent | 33d033da15b856fdbdfe2c2b7b07c29580a1df11 (diff) | |
download | gcc-85344eeb1a722e91178c011ce3c56904c9bfdd31.tar.gz |
2010-10-05 Richard Guenther <rguenther@suse.de>
* value-prof.c (gimple_divmod_fixed_value): Work on SSA form.
(gimple_mod_pow2): Likewise.
(gimple_mod_subtract): Likewise.
(gimple_ic): Likewise.
(gimple_stringop_fixed_value): Likewise.
* tree-profile.c (tree_init_edge_profiler): Mark profile
functions nothrow and leaf.
(add_abnormal_goto_call_edges): Remove.
(tree_gen_edge_profiler): Work on SSA form.
(tree_gen_ic_profiler): Likewise. Simplify.
(do_tree_profiling): Update SSA form.
(pass_tree_profile): Remove.
(do_tree_profiling): Likewise.
(gate_tree_profile_ipa): New function.
(pass_ipa_tree_profile): New.
(tree_profiling): Re-write as IPA pass. Properly drop const/pure
state of instrumented functions.
* passes.c (init_optimization_passes): Remove early non-SSA
inlining. Move profiling after early optimizations.
* ipa-inline.c (cgraph_gate_ipa_early_inlining): Remove.
(pass_ipa_early_inline): Likewise.
* tree-pass.h (pass_ipa_early_inline): Remove.
(pass_tree_profile): Likewise.
(pass_ipa_tree_profile): Declare.
* gcc.dg/tree-prof/val-prof-1.c: Adjust.
* gcc.dg/tree-prof/val-prof-2.c: Likewise.
* gcc.dg/tree-prof/val-prof-3.c: Likewise.
* gcc.dg/tree-prof/val-prof-4.c: Likewise.
* gcc.dg/tree-prof/val-prof-5.c: Likewise.
* gcc.dg/tree-prof/val-prof-7.c: Likewise.
* gcc.dg/tree-prof/stringop-1.c: Likewise.
* gcc.dg/tree-prof/stringop-2.c: Likewise.
* gcc.dg/tree-prof/ic-misattribution-1.c: Likewise.
* gcc.dg/tree-prof/indir-call-prof.c: Likewise.
* gcc.dg/tree-prof/update-loopch.c: Likewise.
* g++.dg/tree-prof/indir-call-prof.C: Likewise.
* g++.dg/tree-prof/inline_mismatch_args.C: Likewise.
* gcc.dg/tree-prof/tracer-1.c: Likewise.
* gcc.dg/tree-ssa/inline-4.c: Likewise.
* gcc.dg/tree-ssa/inline-3.c: Likewise.
* gcc.dg/tree-ssa/20080530.c: Likewise.
* g++.dg/tree-ssa/inline-3.C: Likewise.
* g++.dg/tree-ssa/inline-1.C: Likewise.
* g++.dg/tree-ssa/inline-2.C: Likewise.
* gcc.dg/profile-dir-1.c: Likewise.
* gcc.dg/profile-dir-2.c: Likewise.
* gcc.dg/profile-dir-3.c: Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@164986 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/value-prof.c')
-rw-r--r-- | gcc/value-prof.c | 78 |
1 files changed, 56 insertions, 22 deletions
diff --git a/gcc/value-prof.c b/gcc/value-prof.c index 84956cdbac5..b0cc13bb9aa 100644 --- a/gcc/value-prof.c +++ b/gcc/value-prof.c @@ -558,7 +558,7 @@ gimple_divmod_fixed_value (gimple stmt, tree value, int prob, gcov_type count, gcov_type all) { gimple stmt1, stmt2, stmt3; - tree tmp1, tmp2, tmpv; + tree tmp0, tmp1, tmp2, tmpv; gimple bb1end, bb2end, bb3end; basic_block bb, bb2, bb3, bb4; tree optype, op1, op2; @@ -576,19 +576,22 @@ gimple_divmod_fixed_value (gimple stmt, tree value, int prob, gcov_type count, bb = gimple_bb (stmt); gsi = gsi_for_stmt (stmt); - tmpv = create_tmp_var (optype, "PROF"); - tmp1 = create_tmp_var (optype, "PROF"); - stmt1 = gimple_build_assign (tmpv, fold_convert (optype, value)); + tmpv = create_tmp_reg (optype, "PROF"); + tmp0 = make_ssa_name (tmpv, NULL); + tmp1 = make_ssa_name (tmpv, NULL); + stmt1 = gimple_build_assign (tmp0, fold_convert (optype, value)); + SSA_NAME_DEF_STMT (tmp0) = stmt1; stmt2 = gimple_build_assign (tmp1, op2); - stmt3 = gimple_build_cond (NE_EXPR, tmp1, tmpv, NULL_TREE, NULL_TREE); + SSA_NAME_DEF_STMT (tmp1) = stmt2; + stmt3 = gimple_build_cond (NE_EXPR, tmp1, tmp0, NULL_TREE, NULL_TREE); gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT); gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT); gsi_insert_before (&gsi, stmt3, GSI_SAME_STMT); bb1end = stmt3; - tmp2 = create_tmp_var (optype, "PROF"); + tmp2 = make_rename_temp (optype, "PROF"); stmt1 = gimple_build_assign_with_ops (gimple_assign_rhs_code (stmt), tmp2, - op1, tmpv); + op1, tmp0); gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT); bb2end = stmt1; @@ -711,7 +714,7 @@ static tree gimple_mod_pow2 (gimple stmt, int prob, gcov_type count, gcov_type all) { gimple stmt1, stmt2, stmt3, stmt4; - tree tmp2, tmp3; + tree tmp2, tmp3, tmpv; gimple bb1end, bb2end, bb3end; basic_block bb, bb2, bb3, bb4; tree optype, op1, op2; @@ -729,12 +732,15 @@ gimple_mod_pow2 (gimple stmt, int prob, gcov_type count, gcov_type all) bb = gimple_bb (stmt); gsi = gsi_for_stmt (stmt); - result = create_tmp_var (optype, "PROF"); - tmp2 = create_tmp_var (optype, "PROF"); - tmp3 = create_tmp_var (optype, "PROF"); + result = make_rename_temp (optype, "PROF"); + tmpv = create_tmp_var (optype, "PROF"); + tmp2 = make_ssa_name (tmpv, NULL); + tmp3 = make_ssa_name (tmpv, NULL); stmt2 = gimple_build_assign_with_ops (PLUS_EXPR, tmp2, op2, build_int_cst (optype, -1)); + SSA_NAME_DEF_STMT (tmp2) = stmt2; stmt3 = gimple_build_assign_with_ops (BIT_AND_EXPR, tmp3, tmp2, op2); + SSA_NAME_DEF_STMT (tmp3) = stmt3; stmt4 = gimple_build_cond (NE_EXPR, tmp3, build_int_cst (optype, 0), NULL_TREE, NULL_TREE); gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT); @@ -881,10 +887,11 @@ gimple_mod_subtract (gimple stmt, int prob1, int prob2, int ncounts, bb = gimple_bb (stmt); gsi = gsi_for_stmt (stmt); - result = create_tmp_var (optype, "PROF"); - tmp1 = create_tmp_var (optype, "PROF"); + result = make_rename_temp (optype, "PROF"); + tmp1 = make_ssa_name (create_tmp_var (optype, "PROF"), NULL); stmt1 = gimple_build_assign (result, op1); stmt2 = gimple_build_assign (tmp1, op2); + SSA_NAME_DEF_STMT (tmp1) = stmt2; stmt3 = gimple_build_cond (LT_EXPR, result, tmp1, NULL_TREE, NULL_TREE); gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT); gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT); @@ -1092,7 +1099,7 @@ gimple_ic (gimple icall_stmt, struct cgraph_node *direct_call, int prob, gcov_type count, gcov_type all) { gimple dcall_stmt, load_stmt, cond_stmt; - tree tmp1, tmpv, tmp; + tree tmp0, tmp1, tmpv, tmp; basic_block cond_bb, dcall_bb, icall_bb, join_bb; tree optype = build_pointer_type (void_type_node); edge e_cd, e_ci, e_di, e_dj, e_ij; @@ -1102,20 +1109,26 @@ gimple_ic (gimple icall_stmt, struct cgraph_node *direct_call, cond_bb = gimple_bb (icall_stmt); gsi = gsi_for_stmt (icall_stmt); - tmpv = create_tmp_var (optype, "PROF"); - tmp1 = create_tmp_var (optype, "PROF"); + tmpv = create_tmp_reg (optype, "PROF"); + tmp0 = make_ssa_name (tmpv, NULL); + tmp1 = make_ssa_name (tmpv, NULL); tmp = unshare_expr (gimple_call_fn (icall_stmt)); - load_stmt = gimple_build_assign (tmpv, tmp); + load_stmt = gimple_build_assign (tmp0, tmp); + SSA_NAME_DEF_STMT (tmp0) = load_stmt; gsi_insert_before (&gsi, load_stmt, GSI_SAME_STMT); tmp = fold_convert (optype, build_addr (direct_call->decl, current_function_decl)); load_stmt = gimple_build_assign (tmp1, tmp); + SSA_NAME_DEF_STMT (tmp1) = load_stmt; gsi_insert_before (&gsi, load_stmt, GSI_SAME_STMT); - cond_stmt = gimple_build_cond (EQ_EXPR, tmp1, tmpv, NULL_TREE, NULL_TREE); + cond_stmt = gimple_build_cond (EQ_EXPR, tmp1, tmp0, NULL_TREE, NULL_TREE); gsi_insert_before (&gsi, cond_stmt, GSI_SAME_STMT); + gimple_set_vdef (icall_stmt, NULL_TREE); + gimple_set_vuse (icall_stmt, NULL_TREE); + update_stmt (icall_stmt); dcall_stmt = gimple_copy (icall_stmt); gimple_call_set_fndecl (dcall_stmt, direct_call->decl); gsi_insert_before (&gsi, dcall_stmt, GSI_SAME_STMT); @@ -1151,6 +1164,21 @@ gimple_ic (gimple icall_stmt, struct cgraph_node *direct_call, e_ij->probability = REG_BR_PROB_BASE; e_ij->count = all - count; + /* Insert PHI node for the call result if necessary. */ + if (gimple_call_lhs (icall_stmt) + && TREE_CODE (gimple_call_lhs (icall_stmt)) == SSA_NAME) + { + tree result = gimple_call_lhs (icall_stmt); + gimple phi = create_phi_node (result, join_bb); + SSA_NAME_DEF_STMT (result) = phi; + gimple_call_set_lhs (icall_stmt, + make_ssa_name (SSA_NAME_VAR (result), icall_stmt)); + add_phi_arg (phi, gimple_call_lhs (icall_stmt), e_ij, UNKNOWN_LOCATION); + gimple_call_set_lhs (dcall_stmt, + make_ssa_name (SSA_NAME_VAR (result), dcall_stmt)); + add_phi_arg (phi, gimple_call_lhs (dcall_stmt), e_dj, UNKNOWN_LOCATION); + } + /* Fix eh edges */ lp_nr = lookup_stmt_eh_lp (icall_stmt); if (lp_nr != 0) @@ -1289,7 +1317,7 @@ gimple_stringop_fixed_value (gimple vcall_stmt, tree icall_size, int prob, gcov_type count, gcov_type all) { gimple tmp_stmt, cond_stmt, icall_stmt; - tree tmp1, tmpv, vcall_size, optype; + tree tmp0, tmp1, tmpv, vcall_size, optype; basic_block cond_bb, icall_bb, vcall_bb, join_bb; edge e_ci, e_cv, e_iv, e_ij, e_vj; gimple_stmt_iterator gsi; @@ -1307,16 +1335,22 @@ gimple_stringop_fixed_value (gimple vcall_stmt, tree icall_size, int prob, optype = TREE_TYPE (vcall_size); tmpv = create_tmp_var (optype, "PROF"); - tmp1 = create_tmp_var (optype, "PROF"); - tmp_stmt = gimple_build_assign (tmpv, fold_convert (optype, icall_size)); + tmp0 = make_ssa_name (tmpv, NULL); + tmp1 = make_ssa_name (tmpv, NULL); + tmp_stmt = gimple_build_assign (tmp0, fold_convert (optype, icall_size)); + SSA_NAME_DEF_STMT (tmp0) = tmp_stmt; gsi_insert_before (&gsi, tmp_stmt, GSI_SAME_STMT); tmp_stmt = gimple_build_assign (tmp1, vcall_size); + SSA_NAME_DEF_STMT (tmp1) = tmp_stmt; gsi_insert_before (&gsi, tmp_stmt, GSI_SAME_STMT); - cond_stmt = gimple_build_cond (EQ_EXPR, tmp1, tmpv, NULL_TREE, NULL_TREE); + cond_stmt = gimple_build_cond (EQ_EXPR, tmp1, tmp0, NULL_TREE, NULL_TREE); gsi_insert_before (&gsi, cond_stmt, GSI_SAME_STMT); + gimple_set_vdef (vcall_stmt, NULL); + gimple_set_vuse (vcall_stmt, NULL); + update_stmt (vcall_stmt); icall_stmt = gimple_copy (vcall_stmt); gimple_call_set_arg (icall_stmt, size_arg, icall_size); gsi_insert_before (&gsi, icall_stmt, GSI_SAME_STMT); |