From: Seongbae Park Date: Wed, 28 May 2008 18:14:32 +0000 (+0000) Subject: value-prof.c (tree_ic_transform): Print counts. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3dfb6f59635939b980bbad8a012057d1ec258a50;p=gcc.git value-prof.c (tree_ic_transform): Print counts. gcc/ChangeLog: 2008-05-28 Seongbae Park * value-prof.c (tree_ic_transform): Print counts. * tree-profile.c (tree_gen_ic_func_profiler): Clear __gcov_indreict_call_callee variable to avoid misattribution of the profile. gcc/testsuite/ChangeLog: 2008-05-28 Seongbae Park * gcc.dg/tree-prof/ic-misattribution-1.c: New test. * gcc.dg/tree-prof/ic-misattribution-1a.c: New test. * lib/profopt.exp (profopt-get-options): Support dg-additional-sources. (profopt-execute): Handle additional sources. From-SVN: r136118 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fe82a48d1bd..7bffba37076 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2008-05-28 Seongbae Park + + * value-prof.c (tree_ic_transform): Print counts. + * tree-profile.c (tree_gen_ic_func_profiler): + Clear __gcov_indreict_call_callee variable + to avoid misattribution of the profile. + 2008-05-28 Rafael Espindola * see.c (see_def_extension_not_merged): Use copy_rtx_if_shared to avoid diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c548a7d1828..b715c2d00ca 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2008-05-28 Seongbae Park + + * gcc.dg/tree-prof/ic-misattribution-1.c: New test. + * gcc.dg/tree-prof/ic-misattribution-1a.c: New test. + * lib/profopt.exp (profopt-get-options): Support + dg-additional-sources. + (profopt-execute): Handle additional sources. + 2008-05-28 Rafael Espindola * gcc.dg/20080528-1.c: New test. diff --git a/gcc/testsuite/gcc.dg/tree-prof/ic-misattribution-1.c b/gcc/testsuite/gcc.dg/tree-prof/ic-misattribution-1.c new file mode 100644 index 00000000000..c36dd8dd052 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-prof/ic-misattribution-1.c @@ -0,0 +1,19 @@ +/* { dg-options "-O2 -fdump-tree-tree_profile" } */ +/* { dg-additional-sources "ic-misattribution-1a.c" } */ + +extern void other_caller (void); + +void +callee (void) +{ + return; +} + +void +caller(void (*func) (void)) +{ + func (); +} + +/* { dg-final-use { scan-tree-dump "hist->count 1 hist->all 1" "tree_profile" } } */ +/* { dg-final-use { cleanup-tree-dump "tree_profile" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-prof/ic-misattribution-1a.c b/gcc/testsuite/gcc.dg/tree-prof/ic-misattribution-1a.c new file mode 100644 index 00000000000..ac54ab13851 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-prof/ic-misattribution-1a.c @@ -0,0 +1,20 @@ +/* { dg-options "-DEMPTY" } */ +/* This file is only needed in combination with ic-misattribution-1.c + but there's no easy way to make this file ignored. */ +extern void callee (void); +extern void caller (void (*func) (void)); + +typedef void (*func_t) (void); +func_t func; + +int +main () +{ +#ifdef EMPTY +#else + func = callee; + caller (callee); + func (); +#endif + return 0; +} diff --git a/gcc/testsuite/lib/profopt.exp b/gcc/testsuite/lib/profopt.exp index 92e6660b756..967b7906f0e 100644 --- a/gcc/testsuite/lib/profopt.exp +++ b/gcc/testsuite/lib/profopt.exp @@ -184,6 +184,7 @@ proc profopt-get-options { src } { || ![string compare "dg-skip-if" $cmd] \ || ![string compare "dg-final-generate" $cmd] \ || ![string compare "dg-final-use" $cmd] \ + || ![string compare "dg-additional-sources" $cmd] \ || [string match "dg-require-*" $cmd] } { set status [catch "$op" errmsg] if { $status != 0 } { @@ -266,9 +267,11 @@ proc profopt-execute { src } { return } + set extra_options [dg-additional-files-options "" "$src"] + # Compile for profiling. - set options "" + set options "$extra_options" lappend options "additional_flags=$option $extra_flags $profile_option" set optstr "$option $profile_option" set comp_output [${tool}_target_compile "$src" "$execname1" executable $options] @@ -317,7 +320,7 @@ proc profopt-execute { src } { # Compile with feedback-directed optimizations. - set options "" + set options "$extra_options" lappend options "additional_flags=$option $extra_flags $feedback_option" set optstr "$option $feedback_option" set comp_output [${tool}_target_compile "$src" "$execname2" "executable" $options] @@ -364,7 +367,7 @@ proc profopt-execute { src } { # Compile with normal optimizations. - set options "" + set options "$extra_options" lappend options "additional_flags=$option" set optstr "$option" set comp_output [${tool}_target_compile "$src" "$execname3" "executable" $options] diff --git a/gcc/tree-profile.c b/gcc/tree-profile.c index 7a70cefad19..6121837e496 100644 --- a/gcc/tree-profile.c +++ b/gcc/tree-profile.c @@ -308,7 +308,7 @@ tree_gen_ic_func_profiler (void) edge e; basic_block bb; edge_iterator ei; - tree stmt1; + tree stmt1, stmt2; tree tree_uid, cur_func; if (flag_unit_at_a_time) @@ -321,8 +321,11 @@ tree_gen_ic_func_profiler (void) FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs) { + tree void0; + bb = split_edge (e); bsi = bsi_start (bb); + cur_func = force_gimple_operand_bsi (&bsi, build_addr (current_function_decl, current_function_decl), @@ -335,6 +338,16 @@ tree_gen_ic_func_profiler (void) cur_func, ic_void_ptr_var); bsi_insert_after (&bsi, stmt1, BSI_NEW_STMT); + + gcc_assert (EDGE_COUNT (bb->succs) == 1); + bb = split_edge (EDGE_I (bb->succs, 0)); + bsi = bsi_start (bb); + /* Set __gcov_indirect_call_callee to 0, + so that calls from other modules won't get misattributed + to the last caller of the current callee. */ + void0 = build_int_cst (build_pointer_type (void_type_node), 0); + stmt2 = build_gimple_modify_stmt (ic_void_ptr_var, void0); + bsi_insert_after (&bsi, stmt2, BSI_NEW_STMT); } } diff --git a/gcc/value-prof.c b/gcc/value-prof.c index 33ecded88c3..8b0087a850f 100644 --- a/gcc/value-prof.c +++ b/gcc/value-prof.c @@ -1198,6 +1198,7 @@ tree_ic_transform (tree stmt) print_generic_stmt (dump_file, stmt, TDF_SLIM); fprintf (dump_file, " to "); print_generic_stmt (dump_file, modify, TDF_SLIM); + fprintf (dump_file, "hist->count %llu hist->all %llu\n", count, all); } return true;