From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 7939) id DB4E6385803B; Fri, 16 Feb 2024 18:18:26 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org DB4E6385803B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1708107506; bh=1qwDzM2qOBPEDUv5Cjl2gap9O4UTkvbg2m3jt7O6NY4=; h=From:To:Subject:Date:From; b=nGpNcjidcq6Mv8wq5O10iYzubuzn8Yslpfeq7hVZoJCMfAwZ+yjRbEMpC3cMKh/oO 2rz7WdBuLRQ+phcIjR/JoqhXtzbU1zUeE+MiImkOQvbH0Aas1D8KoG+TnATkjsc+XP bbAS45uSCqjlWkO04+7jRYRkb4F0wziuY3Kv3Vus= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Edwin Lu To: gcc-cvs@gcc.gnu.org Subject: [gcc r14-9036] testsuite: Add support for scanning assembly with comparitor X-Act-Checkin: gcc X-Git-Author: Edwin Lu X-Git-Refname: refs/heads/master X-Git-Oldrev: c95dc611a6203f0564722975acff4ad866b9c45e X-Git-Newrev: bf6f00cbb132f1dcb80684d9cf082156bf7b315d Message-Id: <20240216181826.DB4E6385803B@sourceware.org> Date: Fri, 16 Feb 2024 18:18:26 +0000 (GMT) List-Id: https://gcc.gnu.org/g:bf6f00cbb132f1dcb80684d9cf082156bf7b315d commit r14-9036-gbf6f00cbb132f1dcb80684d9cf082156bf7b315d Author: Edwin Lu Date: Mon Feb 12 11:38:15 2024 -0800 testsuite: Add support for scanning assembly with comparitor There is currently no support for matching at least x lines of assembly (only scan-assembler-times). This patch would allow setting upper or lower bounds. Use case: using different scheduler descriptions and/or cost models will change assembler output. Testing common functionality across tunes would require a separate testcase per tune since each assembly output would be different. If we know a base number of lines should appear across all tunes (i.e. testing return values: we expect at minimum n stores into register x), we can lower-bound the test to search for scan-assembler-bound {RE for storing into register x} >= n. This avoids artificially inflating the scan-assembler-times expected count due to the assembler choosing to perform extra stores into register x (using it as a temporary register). The testcase would be more robust to cpu/tune changes at the cost of not being as granular towards specific cpu tuning. gcc/ChangeLog: * doc/sourcebuild.texi: add scan-assembler-bound gcc/testsuite/ChangeLog: * lib/scanasm.exp: add scan-assembler-bound Signed-off-by: Edwin Lu Diff: --- gcc/doc/sourcebuild.texi | 4 +++ gcc/testsuite/lib/scanasm.exp | 64 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/gcc/doc/sourcebuild.texi b/gcc/doc/sourcebuild.texi index c431956a5933..7b747bfa6cb0 100644 --- a/gcc/doc/sourcebuild.texi +++ b/gcc/doc/sourcebuild.texi @@ -3403,6 +3403,10 @@ excluding LTO sections. Passes if @var{regex} is matched exactly @var{num} times in the test's assembler output, excluding LTO sections. +@item scan-assembler-bound @var{regex} @var{cmp} @var{num} [@{ target/xfail @var{selector} @}] +Passes if @var{regex} is matched @var{cmp} @var{num} times in the test's +assembler output, excluding LTO sections. @var{cmp} is a comparitor. + @item scan-assembler-dem @var{regex} [@{ target/xfail @var{selector} @}] Passes if @var{regex} matches text in the test's demangled assembler output, excluding LTO sections. diff --git a/gcc/testsuite/lib/scanasm.exp b/gcc/testsuite/lib/scanasm.exp index 165890eb976c..741a5a048b81 100644 --- a/gcc/testsuite/lib/scanasm.exp +++ b/gcc/testsuite/lib/scanasm.exp @@ -516,6 +516,70 @@ proc scan-assembler-times { args } { set_required_options_for scan-assembler-times +# Call pass if pattern is present within a lower or upper bound, +# otherwise fail. +# ex /* { dg-final { scan-assembler-bound {RE} > 3 } } +proc scan-assembler-bound { args } { + if { [llength $args] < 3 } { + error "scan-assembler-bound: too few arguments" + return + } + if { [llength $args] > 4 } { + error "scan-assembler-bound: too many arguments" + return + } + if { [llength $args] >= 4 } { + switch [dg-process-target [lindex $args 3]] { + "S" { } + "N" { return } + "F" { setup_xfail "*-*-*" } + "P" { } + } + } + + set testcase [testname-for-summary] + # The name might include a list of options; extract the file name. + set filename [lindex $testcase 0] + set pattern [lindex $args 0] + set cmp [lindex $args 1] + set bound [lindex $args 2] + set pp_pattern [make_pattern_printable $pattern] + + # This must match the rule in gcc-dg.exp. + set output_file "[file rootname [file tail $filename]].s" + + set files [glob -nocomplain $output_file] + if { $files == "" } { + verbose -log "$testcase: output file does not exist" + unresolved "$testcase scan-assembler-bound $pp_pattern $min $max" + return + } + + if { [lsearch { < > <= >= } $cmp] == -1 } { + error "scan-assembler-bound: illegal argument: $cmp" + return + } + if ![string is integer $bound ] { + error "scan-assembler-bound: illegal argument: $bound" + return + } + + set fd [open $output_file r] + set text [read $fd] + close $fd + regsub -all {(^|\n)[[:space:]]*\.section[[:space:]]*"?\.gnu\.lto_(?:[^\n]*\n(?![[:space:]]*\.(section|text|data|bss)))*[^\n]*\n} $text {\1} text + + set result_count [regexp -all -- $pattern $text] + if [expr $result_count $cmp $bound] { + pass "$testcase scan-assembler-bound $pp_pattern $cmp $bound" + } else { + verbose -log "$testcase: $pp_pattern found $result_count times" + fail "$testcase scan-assembler-bound $pp_pattern $cmp $bound" + } +} + +set_required_options_for scan-assembler-bound + # Utility for scanning demangled compiler result, invoked via dg-final. # Call pass if pattern is present, otherwise fail. proc scan-assembler-dem { args } {