diff mbox

[2/3] Run profile feedback tests with autofdo

Message ID 20160622123706.16343-2-andi@firstfloor.org
State New
Headers show

Commit Message

Andi Kleen June 22, 2016, 12:37 p.m. UTC
From: Andi Kleen <ak@linux.intel.com>

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-22  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.
---
 gcc/testsuite/g++.dg/bprob/bprob.exp         | 10 ++++
 gcc/testsuite/g++.dg/tree-prof/tree-prof.exp | 10 ++++
 gcc/testsuite/gcc.dg/tree-prof/tree-prof.exp | 10 ++++
 gcc/testsuite/gcc.misc-tests/bprob.exp       | 14 ++++++
 gcc/testsuite/gfortran.dg/prof/prof.exp      |  9 ++++
 gcc/testsuite/lib/profopt.exp                | 68 ++++++++++++++++++++++++++--
 gcc/testsuite/lib/target-supports.exp        | 31 +++++++++++++
 7 files changed, 149 insertions(+), 3 deletions(-)

Comments

Jeff Law June 22, 2016, 5:28 p.m. UTC | #1
On 06/22/2016 06:37 AM, Andi Kleen wrote:
> From: Andi Kleen <ak@linux.intel.com>
>
> 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-22  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.
I'm generally OK with this as well.  My only concern is that we get 
something sensible on targets which don't support autofdo and on systems 
without perf installed.

ISTM the right result is for the autofdo versions of those tests to be 
UNSUPPORTED on both those situations.  Can you confirm that's what 
happens in those two cases?  If we do indeed get UNSUPPORTED for the 
autofdo versions of those tests in those cases, then this patch is OK as 
well.

jeff
diff mbox

Patch

diff --git a/gcc/testsuite/g++.dg/bprob/bprob.exp b/gcc/testsuite/g++.dg/bprob/bprob.exp
index d555507..e45d965 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,13 @@  foreach profile_option $profile_options feedback_option $feedback_options {
     }
 }
 
+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/g++.dg/tree-prof/tree-prof.exp b/gcc/testsuite/g++.dg/tree-prof/tree-prof.exp
index 7a4b5cb..ea08602 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,13 @@  foreach src [lsort [glob -nocomplain $srcdir/$subdir/*.C]] {
     profopt-execute $src
 }
 
+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 $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 650ad8d..abf7231 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,13 @@  foreach src [lsort [glob -nocomplain $srcdir/$subdir/*.c]] {
     profopt-execute $src
 }
 
+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 $treeprof_save_profopt_options
diff --git a/gcc/testsuite/gcc.misc-tests/bprob.exp b/gcc/testsuite/gcc.misc-tests/bprob.exp
index 52dcb1f..f43f011 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,17 @@  foreach profile_option $profile_options feedback_option $feedback_options {
     }
 }
 
+if { ! [check_profiling_available "-fauto-profile"] } {
+    set PROFOPT_OPTIONS $bprob_save_profopt_options
+    return
+}
+
+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 0bad01d..24989dd 100644
--- a/gcc/testsuite/gfortran.dg/prof/prof.exp
+++ b/gcc/testsuite/gfortran.dg/prof/prof.exp
@@ -53,4 +53,13 @@  foreach src [lsort [glob -nocomplain $srcdir/$subdir/*.f*]] {
     profopt-execute $src
 }
 
+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 $treeprof_save_profopt_options
diff --git a/gcc/testsuite/lib/profopt.exp b/gcc/testsuite/lib/profopt.exp
index 0aea6c4..2a7ea2c 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,18 @@  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 } {
+    set profile_wrapper [profopt-perf-wrapper]
+    set profile_options "-g"
+    set feedback_options "-fauto-profile"
+    set run_autofdo 1
+    profopt-execute $src
+    set run_autofdo ""
+    set profile_wrapper ""
+}
+
 #
 # c-prof-execute -- compile for profiling and then feedback, then normal
 #
@@ -238,6 +250,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 +261,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 +332,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 +355,49 @@  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 } {
+		    set status "fail"
+		    fail "$testcase: Cannot run $cmd"
+		}
+		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 +432,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 +460,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 1b1d03a..f0dfefc 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,30 @@  proc check_profiling_available { test_what } {
 	}
     }
 
+    if { $test_what == "-fauto-profile" &&
+	 ! ([istarget x86_64-*-linux*] || [istarget i?86-*-linux*]) } {
+	# not cross compiling?
+	if { ![isnative] } {
+	    warning "autofdo not supported for non native builds"
+	    return 0
+	}
+	set event [profopt-perf-wrapper]
+	if {$event == "" } {
+	    warning "autofdo not supported"
+	    return 0
+	}
+	set status [remote_exec host "$srcdir/../config/i386/gcc-auto-profile" "true -v >/dev/null"]
+	if { [lindex $status 0] != 0 } {
+	    warning "autofdo not supported"
+	    return 0
+	}
+	set status [remote_exec host "create_gcov" "-help"]
+	if { [lindex $status 0] != 0 } {
+            warning "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