From 7f586d904de25044a08f99669df5bc1ed2fa9f26 Mon Sep 17 00:00:00 2001 From: Andi Kleen Date: Thu, 23 Jun 2016 14:34:04 +0000 Subject: [PATCH] Run profile feedback tests with autofdo Extend the existing bprob and tree-prof tests to also run with autofdo. The test runtimes are really a bit too short for autofdo, but it's a reasonable sanity check. This only works natively for now. dejagnu doesn't seem to support a wrapper for unix tests, so I had to open code running these tests. That should be ok due to the native run restrictions. gcc/testsuite/: 2016-06-23 Andi Kleen * g++.dg/bprob/bprob.exp: Support autofdo. * g++.dg/tree-prof/tree-prof.exp: dito. * gcc.dg/tree-prof/tree-prof.exp: dito. * gcc.misc-tests/bprob.exp: dito. * gfortran.dg/prof/prof.exp: dito. * lib/profopt.exp: dito. * lib/target-supports.exp: Check for autofdo. From-SVN: r237732 --- gcc/testsuite/ChangeLog | 10 +++ gcc/testsuite/g++.dg/bprob/bprob.exp | 8 ++ gcc/testsuite/g++.dg/tree-prof/tree-prof.exp | 8 ++ gcc/testsuite/gcc.dg/tree-prof/tree-prof.exp | 8 ++ gcc/testsuite/gcc.misc-tests/bprob.exp | 7 ++ gcc/testsuite/gfortran.dg/prof/prof.exp | 7 ++ gcc/testsuite/lib/profopt.exp | 82 +++++++++++++++++++- gcc/testsuite/lib/target-supports.exp | 37 +++++++++ 8 files changed, 164 insertions(+), 3 deletions(-) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 287baf6dcd8..55f8dbfcc10 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,13 @@ +2016-06-23 Andi Kleen + + * g++.dg/bprob/bprob.exp: Support autofdo. + * g++.dg/tree-prof/tree-prof.exp: dito. + * gcc.dg/tree-prof/tree-prof.exp: dito. + * gcc.misc-tests/bprob.exp: dito. + * gfortran.dg/prof/prof.exp: dito. + * lib/profopt.exp: dito. + * lib/target-supports.exp: Check for autofdo. + 2016-06-23 Martin Liska * gcc.dg/pr71619.c: New test. diff --git a/gcc/testsuite/g++.dg/bprob/bprob.exp b/gcc/testsuite/g++.dg/bprob/bprob.exp index d555507b682..4818298c640 100644 --- a/gcc/testsuite/g++.dg/bprob/bprob.exp +++ b/gcc/testsuite/g++.dg/bprob/bprob.exp @@ -53,6 +53,7 @@ if $tracelevel then { set profile_options "-fprofile-arcs" set feedback_options "-fbranch-probabilities" +set profile_wrapper "" # Main loop. foreach profile_option $profile_options feedback_option $feedback_options { @@ -65,4 +66,11 @@ foreach profile_option $profile_options feedback_option $feedback_options { } } +foreach src [lsort [glob -nocomplain $srcdir/$subdir/*.C]] { + if ![runtest_file_p $runtests $src] then { + continue + } + auto-profopt-execute $src +} + set PROFOPT_OPTIONS $bprob_save_profopt_options diff --git a/gcc/testsuite/g++.dg/tree-prof/tree-prof.exp b/gcc/testsuite/g++.dg/tree-prof/tree-prof.exp index 7a4b5cb02b7..26ee0b38cdb 100644 --- a/gcc/testsuite/g++.dg/tree-prof/tree-prof.exp +++ b/gcc/testsuite/g++.dg/tree-prof/tree-prof.exp @@ -44,6 +44,7 @@ set PROFOPT_OPTIONS [list {}] # profile data. set profile_option "-fprofile-generate -D_PROFILE_GENERATE" set feedback_option "-fprofile-use -D_PROFILE_USE" +set profile_wrapper "" foreach src [lsort [glob -nocomplain $srcdir/$subdir/*.C]] { # If we're only testing specific files and this isn't one of them, skip it. @@ -53,4 +54,11 @@ foreach src [lsort [glob -nocomplain $srcdir/$subdir/*.C]] { profopt-execute $src } +foreach src [lsort [glob -nocomplain $srcdir/$subdir/*.C]] { + if ![runtest_file_p $runtests $src] then { + continue + } + auto-profopt-execute $src +} + set PROFOPT_OPTIONS $treeprof_save_profopt_options diff --git a/gcc/testsuite/gcc.dg/tree-prof/tree-prof.exp b/gcc/testsuite/gcc.dg/tree-prof/tree-prof.exp index 650ad8d0806..aaccf191be9 100644 --- a/gcc/testsuite/gcc.dg/tree-prof/tree-prof.exp +++ b/gcc/testsuite/gcc.dg/tree-prof/tree-prof.exp @@ -44,6 +44,7 @@ set PROFOPT_OPTIONS [list {}] # profile data. set profile_option "-fprofile-generate -D_PROFILE_GENERATE" set feedback_option "-fprofile-use -D_PROFILE_USE" +set profile_wrapper "" foreach src [lsort [glob -nocomplain $srcdir/$subdir/*.c]] { # If we're only testing specific files and this isn't one of them, skip it. @@ -53,4 +54,11 @@ foreach src [lsort [glob -nocomplain $srcdir/$subdir/*.c]] { profopt-execute $src } +foreach src [lsort [glob -nocomplain $srcdir/$subdir/*.c]] { + if ![runtest_file_p $runtests $src] then { + continue + } + auto-profopt-execute $src +} + set PROFOPT_OPTIONS $treeprof_save_profopt_options diff --git a/gcc/testsuite/gcc.misc-tests/bprob.exp b/gcc/testsuite/gcc.misc-tests/bprob.exp index 52dcb1fd2e9..132bfe3f382 100644 --- a/gcc/testsuite/gcc.misc-tests/bprob.exp +++ b/gcc/testsuite/gcc.misc-tests/bprob.exp @@ -41,6 +41,7 @@ load_lib profopt.exp set bprob_save_profopt_options $PROFOPT_OPTIONS set PROFOPT_OPTIONS [list { -O2 } { -O3 }] +set profile_wrapper "" set profile_options "-fprofile-arcs" set feedback_options "-fbranch-probabilities" @@ -54,4 +55,10 @@ foreach profile_option $profile_options feedback_option $feedback_options { } } +foreach src [lsort [glob -nocomplain $srcdir/$subdir/bprob-*.c]] { + if ![runtest_file_p $runtests $src] then { + continue + } + auto-profopt-execute $src +} set PROFOPT_OPTIONS $bprob_save_profopt_options diff --git a/gcc/testsuite/gfortran.dg/prof/prof.exp b/gcc/testsuite/gfortran.dg/prof/prof.exp index 0bad01d2dbb..acc8ed05b49 100644 --- a/gcc/testsuite/gfortran.dg/prof/prof.exp +++ b/gcc/testsuite/gfortran.dg/prof/prof.exp @@ -53,4 +53,11 @@ foreach src [lsort [glob -nocomplain $srcdir/$subdir/*.f*]] { profopt-execute $src } +foreach src [lsort [glob -nocomplain $srcdir/$subdir/*.f*]] { + if ![runtest_file_p $runtests $src] then { + continue + } + auto-profopt-execute $src +} + set PROFOPT_OPTIONS $treeprof_save_profopt_options diff --git a/gcc/testsuite/lib/profopt.exp b/gcc/testsuite/lib/profopt.exp index 0aea6c41cfb..b3e2b2e2e93 100644 --- a/gcc/testsuite/lib/profopt.exp +++ b/gcc/testsuite/lib/profopt.exp @@ -36,7 +36,7 @@ load_lib gcc-dg.exp global PROFOPT_OPTIONS perf_delta # The including .exp file must define these. -global tool profile_option feedback_option prof_ext +global tool profile_option feedback_option prof_ext profile_wrapper if ![info exists tool] { error "Tools is not specified." } @@ -229,6 +229,31 @@ proc profopt-get-options { src } { return ${dg-extra-tool-flags} } +# auto-profopt-execute -- Compile for auto profiling and then feedback, +# then normal. SRC is the full path name of the testcase. +proc auto-profopt-execute { src } { + global profile_wrapper + global profile_option + global feedback_option + global run_autofdo + global srcdir + + if { ! [check_profiling_available "-fauto-profile"] } { + regsub "(?q)$srcdir/" $src "" testcase + unsupported "$testcase" + return + } + set profile_wrapper [profopt-perf-wrapper] + set profile_option "-g" + set feedback_option "-fauto-profile" + set run_autofdo 1 + profopt-execute $src + unset profile_wrapper + unset profile_option + unset feedback_option + unset run_autofdo +} + # # c-prof-execute -- compile for profiling and then feedback, then normal # @@ -238,6 +263,7 @@ proc profopt-execute { src } { global srcdir tmpdir global PROFOPT_OPTIONS global tool profile_option feedback_option prof_ext perf_ext perf_delta + global profile_wrapper run_autofdo ld_library_path global generate_final_code use_final_code global verbose global testname_with_flags @@ -248,6 +274,12 @@ proc profopt-execute { src } { if ![info exists feedback_option] { error "No feedback option specified for second compile." } + if ![info exists profile_wrapper] { + set profile_wrapper "" + } + if ![info exists run_autofdo] { + set run_autofdo "" + } # Use the default option list or one defined for a set of tests. if ![info exists PROFOPT_OPTIONS] { @@ -313,6 +345,7 @@ proc profopt-execute { src } { # valid, by running it after dg-additional-files-options. foreach ext $prof_ext { profopt-target-cleanup $tmpdir $base $ext + profopt-target-cleanup $tmpdir perf data } # Tree profiling requires TLS runtime support, which may need @@ -335,12 +368,50 @@ proc profopt-execute { src } { } # Run the profiled test. + if { $run_autofdo == 1 } { + if { ![info exists ld_library_path]} { + set ld_library_path "" + } + set orig_ld_library_path "[getenv LD_LIBRARY_PATH]" + setenv LD_LIBRARY_PATH "$ld_library_path:$orig_ld_library_path" + verbose "Running $profile_wrapper $execname1" + set id [remote_spawn "" "$profile_wrapper $execname1" "readonly"] + setenv LD_LIBRARY_PATH $orig_ld_library_path + if { $id < 0 } { + warning "Failed to run profiler" + set status "fail" + } else { + set result [remote_wait "" 300] + set status [lindex $result 0] + verbose "perf result $result" + if { $status == 0 } { + set status "pass" + } else { + set status "fail" + } + } + } else { + set result [${tool}_load $execname1 "" ""] + set status [lindex $result 0] + } - set result [${tool}_load $execname1 "" ""] - set status [lindex $result 0] set missing_file 0 # Make sure the profile data was generated, and fail if not. if { $status == "pass" } { + # convert profile + if { $run_autofdo == 1 } { + set cmd "create_gcov --binary $execname1 --profile=perf.data -gcov_version=1 --gcov=$tmpdir/$base.$ext" + verbose "Running $cmd" + set id [remote_spawn "" $cmd] + if { $id < 0 } { + unsupported "$testcase: Cannot run $cmd" + set status "fail" + return + } + set status [remote_wait "" 300] + set status "pass" + } + foreach ext $prof_ext { remote_upload target $tmpdir/$base.$ext set files [glob -nocomplain $base.$ext] @@ -375,6 +446,10 @@ proc profopt-execute { src } { set options "$extra_options" lappend options "additional_flags=$option $extra_flags $feedback_option" set optstr "$option $feedback_option" + if { [string first "-fauto-profile" $options] >= 0} { + set options [regsub -- "-fauto-profile" $options "-fauto-profile=$tmpdir/$base.$ext"] + } + set comp_output [${tool}_target_compile "$src" "$execname2" "executable" $options] # Prune warnings we know are unwanted. @@ -399,6 +474,7 @@ proc profopt-execute { src } { # Remove the profiling data files. foreach ext $prof_ext { profopt-target-cleanup $tmpdir $base $ext + profopt-target-cleanup $tmpdir perf data } if { $status != "pass" } { diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp index 1b1d03aecdf..62267cf21aa 100644 --- a/gcc/testsuite/lib/target-supports.exp +++ b/gcc/testsuite/lib/target-supports.exp @@ -508,6 +508,13 @@ proc check_effective_target_keeps_null_pointer_checks { } { return 0 } +# Return the autofdo profile wrapper + +proc profopt-perf-wrapper { } { + global srcdir + return "$srcdir/../config/i386/gcc-auto-profile -o perf.data " +} + # Return true if profiling is supported on the target. proc check_profiling_available { test_what } { @@ -525,6 +532,36 @@ proc check_profiling_available { test_what } { } } + if { $test_what == "-fauto-profile" } { + if { ! ([istarget x86_64-*-linux*] || [istarget i?86-*-linux*]) } { + verbose "autofdo only supported on linux" + return 0 + } + # not cross compiling? + if { ![isnative] } { + verbose "autofdo not supported for non native builds" + return 0 + } + set event [profopt-perf-wrapper] + if {$event == "" } { + verbose "autofdo not supported" + return 0 + } + global srcdir + set status [remote_exec host "$srcdir/../config/i386/gcc-auto-profile" "true -v >/dev/null"] + if { [lindex $status 0] != 0 } { + verbose "autofdo not supported because perf does not work" + return 0 + } + + # no good way to check this in advance -- check later instead. + #set status [remote_exec host "create_gcov" "2>/dev/null"] + #if { [lindex $status 0] != 255 } { + # verbose "autofdo not supported due to missing create_gcov" + # return 0 + #} + } + # Support for -p on solaris2 relies on mcrt1.o which comes with the # vendor compiler. We cannot reliably predict the directory where the # vendor compiler (and thus mcrt1.o) is installed so we can't -- 2.30.2