Run profile feedback tests with autofdo
authorAndi Kleen <ak@linux.intel.com>
Thu, 23 Jun 2016 14:34:04 +0000 (14:34 +0000)
committerAndi Kleen <ak@gcc.gnu.org>
Thu, 23 Jun 2016 14:34:04 +0000 (14:34 +0000)
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

gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/bprob/bprob.exp
gcc/testsuite/g++.dg/tree-prof/tree-prof.exp
gcc/testsuite/gcc.dg/tree-prof/tree-prof.exp
gcc/testsuite/gcc.misc-tests/bprob.exp
gcc/testsuite/gfortran.dg/prof/prof.exp
gcc/testsuite/lib/profopt.exp
gcc/testsuite/lib/target-supports.exp

index 287baf6dcd8ba3998a0f7cb5a9d50f9d7a519d4e..55f8dbfcc108b20348dbc8025e56554dc721777b 100644 (file)
@@ -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.
index d555507b6821ec392078a0db3433d16a75e10292..4818298c640671652b6cfc6a3a8ea22d0586c637 100644 (file)
@@ -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
index 7a4b5cb02b7e08cc1832e2329aeed5b868dfdb42..26ee0b38cdb9c0f0cdad5ec195064c8d05d5224b 100644 (file)
@@ -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
index 650ad8d0806359069b1751a5cdf6e28ab6cef057..aaccf191be9cee15227acfdc9ad3d26a44ee2942 100644 (file)
@@ -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
index 52dcb1fd2e9a374dbcf8a377f4285b37a449f139..132bfe3f38241ea28d506da5137fb2a4cab1f281 100644 (file)
@@ -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
index 0bad01d2dbb8cbd8b55b7fc810be4530fad877c5..acc8ed05b490dccfcbc0f8efef8d2497a6241a65 100644 (file)
@@ -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
index 0aea6c41cfbaed013cc99c66f1309e26a80cc709..b3e2b2e2e930806026539c1af34d12a560cf53d1 100644 (file)
@@ -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" } {
index 1b1d03aecdf5aa969a6366e5b5a391513dafd87b..62267cf21aaae1870949f56e3403c6047705d9e8 100644 (file)
@@ -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