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 <ak@linux.intel.com> * 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
This commit is contained in:
parent
7b72d14a9f
commit
7f586d904d
8 changed files with 164 additions and 3 deletions
|
@ -1,3 +1,13 @@
|
|||
2016-06-23 Andi Kleen <ak@linux.intel.com>
|
||||
|
||||
* 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 <mliska@suse.cz>
|
||||
|
||||
* gcc.dg/pr71619.c: New test.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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" } {
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue