Re: [PATCH 3/5] Run profile feedback tests with autofdo

2016-05-21 Thread Andi Kleen
On Sat, May 21, 2016 at 10:55:21PM +0200, Bernhard Reutner-Fischer wrote:
> >@@ -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
> > }
> 
> I think I've asked this before.. Why do you need to run cleanup of perf data 
> in this loop (and not outside)?
> Also why the asymmetry ...

perf generates a backup file if a file already exists. 

> >@@ -399,7 +460,9 @@ 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
> > }
> >+file delete "perf.data" 

The extra one is not needed. I'll remove it.

Thanks
-Andi

-- 
a...@linux.intel.com -- Speaking for myself only.


Re: [PATCH 3/5] Run profile feedback tests with autofdo

2016-05-21 Thread Bernhard Reutner-Fischer
On May 21, 2016 6:36:24 PM GMT+02:00, Andi Kleen  wrote:
>From: Andi Kleen 

>diff --git a/gcc/testsuite/lib/profopt.exp
>b/gcc/testsuite/lib/profopt.exp
>index 0aea6c4..4ddb10a 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 auot profiling and then
>feedback, then normal.

s/auot/auto/

>+# 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
>   }

I think I've asked this before.. Why do you need to run cleanup of perf data in 
this loop (and not outside)?
Also why the asymmetry ...
 
>   # 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]
> 

[PATCH 3/5] Run profile feedback tests with autofdo

2016-05-21 Thread Andi Kleen
From: Andi Kleen 

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-05-21  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.
---
 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| 69 ++--
 gcc/testsuite/lib/target-supports.exp| 31 +
 7 files changed, 150 insertions(+), 3 deletions(-)

diff --git a/gcc/testsuite/g++.dg/bprob/bprob.exp 
b/gcc/testsuite/g++.dg/bprob/bprob.exp
index d07..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