diff mbox series

testsuite: Reduce cut-&-paste in scanltranstree.exp

Message ID mptjzgi6j3r.fsf@arm.com
State New
Headers show
Series testsuite: Reduce cut-&-paste in scanltranstree.exp | expand

Commit Message

Richard Sandiford Aug. 15, 2024, 12:55 p.m. UTC
scanltranstree.exp defines some LTO wrappers around standard
non-LTO scanners.  Four of them are cut-&-paste variants of
one another, so this patch generates them from a single template.
It also does the same for scan-ltrans-tree-dump-times, so that
other *-times scanners can be added easily in future.

The scanners seem to be lightly used.  gcc.dg/ipa/ipa-icf-38.c uses
scan-ltrans-tree-dump{,-not} and libgomp.c/declare-variant-1.c
uses scan-ltrans-tree-dump-{not,times}.  Nothing currently seems
to use scan-ltrans-tree-dump-dem*.

Tested on the files above so far.  Surprisingly, it worked first time,
but I tested that deliberately introduced mistakes were flagged.
(That's my story anyway.)  OK if it passes full testing on
aarch64-linux-gnu & x86_64-linux-gnu?

Richard


gcc/testsuite/
	* lib/scanltranstree.exp: Redefine the routines using two
	templates.
---
 gcc/testsuite/lib/scanltranstree.exp | 186 +++++++++------------------
 1 file changed, 62 insertions(+), 124 deletions(-)

Comments

Jeff Law Aug. 16, 2024, 2:12 p.m. UTC | #1
On 8/15/24 6:55 AM, Richard Sandiford wrote:
> scanltranstree.exp defines some LTO wrappers around standard
> non-LTO scanners.  Four of them are cut-&-paste variants of
> one another, so this patch generates them from a single template.
> It also does the same for scan-ltrans-tree-dump-times, so that
> other *-times scanners can be added easily in future.
> 
> The scanners seem to be lightly used.  gcc.dg/ipa/ipa-icf-38.c uses
> scan-ltrans-tree-dump{,-not} and libgomp.c/declare-variant-1.c
> uses scan-ltrans-tree-dump-{not,times}.  Nothing currently seems
> to use scan-ltrans-tree-dump-dem*.
> 
> Tested on the files above so far.  Surprisingly, it worked first time,
> but I tested that deliberately introduced mistakes were flagged.
> (That's my story anyway.)  OK if it passes full testing on
> aarch64-linux-gnu & x86_64-linux-gnu?
> 
> Richard
> 
> 
> gcc/testsuite/
> 	* lib/scanltranstree.exp: Redefine the routines using two
> 	templates.
OK
jeff
Alex Coplan Aug. 27, 2024, 3:22 p.m. UTC | #2
On 15/08/2024 13:55, Richard Sandiford wrote:
> scanltranstree.exp defines some LTO wrappers around standard
> non-LTO scanners.  Four of them are cut-&-paste variants of
> one another, so this patch generates them from a single template.
> It also does the same for scan-ltrans-tree-dump-times, so that
> other *-times scanners can be added easily in future.
> 
> The scanners seem to be lightly used.  gcc.dg/ipa/ipa-icf-38.c uses
> scan-ltrans-tree-dump{,-not} and libgomp.c/declare-variant-1.c
> uses scan-ltrans-tree-dump-{not,times}.  Nothing currently seems
> to use scan-ltrans-tree-dump-dem*.
> 
> Tested on the files above so far.  Surprisingly, it worked first time,
> but I tested that deliberately introduced mistakes were flagged.
> (That's my story anyway.)  OK if it passes full testing on
> aarch64-linux-gnu & x86_64-linux-gnu?

Thanks for doing this.  I had the feeling when trying to add the RTL
variants of the scanners that the code needed refactoring, but my Tcl
skills really weren't up to the job.  I learned a lot about Tcl by
trying to make sense of this patch.

I'll try adding the RTL variants on top of this.

Thanks,
Alex

> 
> Richard
> 
> 
> gcc/testsuite/
> 	* lib/scanltranstree.exp: Redefine the routines using two
> 	templates.
> ---
>  gcc/testsuite/lib/scanltranstree.exp | 186 +++++++++------------------
>  1 file changed, 62 insertions(+), 124 deletions(-)
> 
> diff --git a/gcc/testsuite/lib/scanltranstree.exp b/gcc/testsuite/lib/scanltranstree.exp
> index 79f05f0ffed..bc6e02dc369 100644
> --- a/gcc/testsuite/lib/scanltranstree.exp
> +++ b/gcc/testsuite/lib/scanltranstree.exp
> @@ -19,130 +19,68 @@
>  
>  load_lib scandump.exp
>  
> -# Utility for scanning compiler result, invoked via dg-final.
> -# Call pass if pattern is present, otherwise fail.
> -#
> -# Argument 0 is the regexp to match
> -# Argument 1 is the name of the dumped tree pass
> -# Argument 2 handles expected failures and the like
> -proc scan-ltrans-tree-dump { args } {
> -
> -    if { [llength $args] < 2 } {
> -	error "scan-ltrans-tree-dump: too few arguments"
> -	return
> -    }
> -    if { [llength $args] > 3 } {
> -	error "scan-ltrans-tree-dump: too many arguments"
> -	return
> -    }
> -    if { [llength $args] >= 3 } {
> -	scan-dump "ltrans-tree" [lindex $args 0] \
> -		  "\[0-9\]\[0-9\]\[0-9\]t.[lindex $args 1]" ".ltrans0.ltrans" \
> -		  [lindex $args 2]
> -    } else {
> -	scan-dump "ltrans-tree" [lindex $args 0] \
> -		  "\[0-9\]\[0-9\]\[0-9\]t.[lindex $args 1]" ".ltrans0.ltrans"
> -    }
> -}
> -
> -# Call pass if pattern is present given number of times, otherwise fail.
> -# Argument 0 is the regexp to match
> -# Argument 1 is number of times the regexp must be found
> -# Argument 2 is the name of the dumped tree pass
> -# Argument 3 handles expected failures and the like
> -proc scan-ltrans-tree-dump-times { args } {
> -
> -    if { [llength $args] < 3 } {
> -	error "scan-ltrans-tree-dump-times: too few arguments"
> -	return
> -    }
> -    if { [llength $args] > 4 } {
> -	error "scan-ltrans-tree-dump-times: too many arguments"
> -	return
> -    }
> -    if { [llength $args] >= 4 } {
> -	scan-dump-times "ltrans-tree" [lindex $args 0] [lindex $args 1] \
> -			"\[0-9\]\[0-9\]\[0-9\]t.[lindex $args 2]" \
> -			".ltrans0.ltrans" [lindex $args 3]
> -    } else {
> -	scan-dump-times "ltrans-tree" [lindex $args 0] [lindex $args 1] \
> -			"\[0-9\]\[0-9\]\[0-9\]t.[lindex $args 2]" ".ltrans0.ltrans"
> -    }
> +# The first item in the list is an LTO equivalent of the second item
> +# in the list; see the documentation of the second item for details.
> +foreach { name scan type suffix } {
> +    scan-ltrans-tree-dump scan-dump ltrans-tree t
> +    scan-ltrans-tree-dump-not scan-dump-not ltrans-tree t
> +    scan-ltrans-tree-dump-dem scan-dump-dem ltrans-tree t
> +    scan-ltrans-tree-dump-dem-not scan-dump-dem-not ltrans-tree t
> +} {
> +    eval [string map [list @NAME@ $name \
> +			   @SCAN@ $scan \
> +			   @TYPE@ $type \
> +			   @SUFFIX@ $suffix] {
> +        proc @NAME@ { args } {
> +	    if { [llength $args] < 2 } {
> +		error "@NAME@: too few arguments"
> +		return
> +	    }
> +	    if { [llength $args] > 3 } {
> +		error "@NAME@: too many arguments"
> +		return
> +	    }
> +	    if { [llength $args] >= 3 } {
> +		@SCAN@ @TYPE@ [lindex $args 0] \
> +		    "\[0-9\]\[0-9\]\[0-9\]@SUFFIX@.[lindex $args 1]" \
> +		    ".ltrans0.ltrans" \
> +		    [lindex $args 2]
> +	    } else {
> +		@SCAN@ @TYPE@ [lindex $args 0] \
> +		    "\[0-9\]\[0-9\]\[0-9\]@SUFFIX@.[lindex $args 1]" \
> +		    ".ltrans0.ltrans"
> +	    }
> +        }
> +    }]
>  }
>  
> -# Call pass if pattern is not present, otherwise fail.
> -#
> -# Argument 0 is the regexp to match
> -# Argument 1 is the name of the dumped tree pass
> -# Argument 2 handles expected failures and the like
> -proc scan-ltrans-tree-dump-not { args } {
> -
> -    if { [llength $args] < 2 } {
> -	error "scan-ltrans-tree-dump-not: too few arguments"
> -	return
> -    }
> -    if { [llength $args] > 3 } {
> -	error "scan-ltrans-tree-dump-not: too many arguments"
> -	return
> -    }
> -    if { [llength $args] >= 3 } {
> -	scan-dump-not "ltrans-tree" [lindex $args 0] \
> -		      "\[0-9\]\[0-9\]\[0-9\]t.[lindex $args 1]" ".ltrans0.ltrans" \
> -		      [lindex $args 2]
> -    } else {
> -	scan-dump-not "ltrans-tree" [lindex $args 0] \
> -		      "\[0-9\]\[0-9\]\[0-9\]t.[lindex $args 1]" ".ltrans0.ltrans"
> -    }
> -}
> -
> -# Utility for scanning demangled compiler result, invoked via dg-final.
> -# Call pass if pattern is present, otherwise fail.
> -#
> -# Argument 0 is the regexp to match
> -# Argument 1 is the name of the dumped tree pass
> -# Argument 2 handles expected failures and the like
> -proc scan-ltrans-tree-dump-dem { args } {
> -
> -    if { [llength $args] < 2 } {
> -	error "scan-ltrans-tree-dump-dem: too few arguments"
> -	return
> -    }
> -    if { [llength $args] > 3 } {
> -	error "scan-ltrans-tree-dump-dem: too many arguments"
> -	return
> -    }
> -    if { [llength $args] >= 3 } {
> -	scan-dump-dem "ltrans-tree" [lindex $args 0] \
> -		      "\[0-9\]\[0-9\]\[0-9\]t.[lindex $args 1]" ".ltrans0.ltrans" \
> -		      [lindex $args 2]
> -    } else {
> -	scan-dump-dem "ltrans-tree" [lindex $args 0] \
> -		      "\[0-9\]\[0-9\]\[0-9\]t.[lindex $args 1]" ".ltrans0.ltrans"
> -    }
> -}
> -
> -# Call pass if demangled pattern is not present, otherwise fail.
> -#
> -# Argument 0 is the regexp to match
> -# Argument 1 is the name of the dumped tree pass
> -# Argument 2 handles expected failures and the like
> -proc scan-ltrans-tree-dump-dem-not { args } {
> -
> -    if { [llength $args] < 2 } {
> -	error "scan-ltrans-tree-dump-dem-not: too few arguments"
> -	return
> -    }
> -    if { [llength $args] > 3 } {
> -	error "scan-ltrans-tree-dump-dem-not: too many arguments"
> -	return
> -    }
> -    if { [llength $args] >= 3 } {
> -	scan-dump-dem-not "ltrans-tree" [lindex $args 0] \
> -			  "\[0-9\]\[0-9\]\[0-9\]t.[lindex $args 1]" \
> -			  ".ltrans0.ltrans" [lindex $args 2]
> -    } else {
> -	scan-dump-dem-not "ltrans-tree" [lindex $args 0] \
> -			  "\[0-9\]\[0-9\]\[0-9\]t.[lindex $args 1]" \
> -			  ".ltrans0.ltrans"
> -    }
> +# The first item in the list is an LTO equivalent of the second item
> +# in the list; see the documentation of the second item for details.
> +foreach { name scan type suffix } {
> +    scan-ltrans-tree-dump-times scan-dump-times ltrans-tree t
> +} {
> +    eval [string map [list @NAME@ $name \
> +			   @SCAN@ $scan \
> +			   @TYPE@ $type \
> +			   @SUFFIX@ $suffix] {
> +	proc @NAME@ { args } {
> +	    if { [llength $args] < 3 } {
> +		error "@NAME@: too few arguments"
> +		return
> +	    }
> +	    if { [llength $args] > 4 } {
> +		error "@NAME@: too many arguments"
> +		return
> +	    }
> +	    if { [llength $args] >= 4 } {
> +		@SCAN@ "@TYPE@" [lindex $args 0] [lindex $args 1] \
> +		    "\[0-9\]\[0-9\]\[0-9\]@SUFFIX@.[lindex $args 2]" \
> +		    ".ltrans0.ltrans" [lindex $args 3]
> +	    } else {
> +		@SCAN@ "@TYPE@" [lindex $args 0] [lindex $args 1] \
> +		    "\[0-9\]\[0-9\]\[0-9\]@SUFFIX@.[lindex $args 2]" \
> +		    ".ltrans0.ltrans"
> +	    }
> +	}
> +    }]
>  }
> -- 
> 2.25.1
>
diff mbox series

Patch

diff --git a/gcc/testsuite/lib/scanltranstree.exp b/gcc/testsuite/lib/scanltranstree.exp
index 79f05f0ffed..bc6e02dc369 100644
--- a/gcc/testsuite/lib/scanltranstree.exp
+++ b/gcc/testsuite/lib/scanltranstree.exp
@@ -19,130 +19,68 @@ 
 
 load_lib scandump.exp
 
-# Utility for scanning compiler result, invoked via dg-final.
-# Call pass if pattern is present, otherwise fail.
-#
-# Argument 0 is the regexp to match
-# Argument 1 is the name of the dumped tree pass
-# Argument 2 handles expected failures and the like
-proc scan-ltrans-tree-dump { args } {
-
-    if { [llength $args] < 2 } {
-	error "scan-ltrans-tree-dump: too few arguments"
-	return
-    }
-    if { [llength $args] > 3 } {
-	error "scan-ltrans-tree-dump: too many arguments"
-	return
-    }
-    if { [llength $args] >= 3 } {
-	scan-dump "ltrans-tree" [lindex $args 0] \
-		  "\[0-9\]\[0-9\]\[0-9\]t.[lindex $args 1]" ".ltrans0.ltrans" \
-		  [lindex $args 2]
-    } else {
-	scan-dump "ltrans-tree" [lindex $args 0] \
-		  "\[0-9\]\[0-9\]\[0-9\]t.[lindex $args 1]" ".ltrans0.ltrans"
-    }
-}
-
-# Call pass if pattern is present given number of times, otherwise fail.
-# Argument 0 is the regexp to match
-# Argument 1 is number of times the regexp must be found
-# Argument 2 is the name of the dumped tree pass
-# Argument 3 handles expected failures and the like
-proc scan-ltrans-tree-dump-times { args } {
-
-    if { [llength $args] < 3 } {
-	error "scan-ltrans-tree-dump-times: too few arguments"
-	return
-    }
-    if { [llength $args] > 4 } {
-	error "scan-ltrans-tree-dump-times: too many arguments"
-	return
-    }
-    if { [llength $args] >= 4 } {
-	scan-dump-times "ltrans-tree" [lindex $args 0] [lindex $args 1] \
-			"\[0-9\]\[0-9\]\[0-9\]t.[lindex $args 2]" \
-			".ltrans0.ltrans" [lindex $args 3]
-    } else {
-	scan-dump-times "ltrans-tree" [lindex $args 0] [lindex $args 1] \
-			"\[0-9\]\[0-9\]\[0-9\]t.[lindex $args 2]" ".ltrans0.ltrans"
-    }
+# The first item in the list is an LTO equivalent of the second item
+# in the list; see the documentation of the second item for details.
+foreach { name scan type suffix } {
+    scan-ltrans-tree-dump scan-dump ltrans-tree t
+    scan-ltrans-tree-dump-not scan-dump-not ltrans-tree t
+    scan-ltrans-tree-dump-dem scan-dump-dem ltrans-tree t
+    scan-ltrans-tree-dump-dem-not scan-dump-dem-not ltrans-tree t
+} {
+    eval [string map [list @NAME@ $name \
+			   @SCAN@ $scan \
+			   @TYPE@ $type \
+			   @SUFFIX@ $suffix] {
+        proc @NAME@ { args } {
+	    if { [llength $args] < 2 } {
+		error "@NAME@: too few arguments"
+		return
+	    }
+	    if { [llength $args] > 3 } {
+		error "@NAME@: too many arguments"
+		return
+	    }
+	    if { [llength $args] >= 3 } {
+		@SCAN@ @TYPE@ [lindex $args 0] \
+		    "\[0-9\]\[0-9\]\[0-9\]@SUFFIX@.[lindex $args 1]" \
+		    ".ltrans0.ltrans" \
+		    [lindex $args 2]
+	    } else {
+		@SCAN@ @TYPE@ [lindex $args 0] \
+		    "\[0-9\]\[0-9\]\[0-9\]@SUFFIX@.[lindex $args 1]" \
+		    ".ltrans0.ltrans"
+	    }
+        }
+    }]
 }
 
-# Call pass if pattern is not present, otherwise fail.
-#
-# Argument 0 is the regexp to match
-# Argument 1 is the name of the dumped tree pass
-# Argument 2 handles expected failures and the like
-proc scan-ltrans-tree-dump-not { args } {
-
-    if { [llength $args] < 2 } {
-	error "scan-ltrans-tree-dump-not: too few arguments"
-	return
-    }
-    if { [llength $args] > 3 } {
-	error "scan-ltrans-tree-dump-not: too many arguments"
-	return
-    }
-    if { [llength $args] >= 3 } {
-	scan-dump-not "ltrans-tree" [lindex $args 0] \
-		      "\[0-9\]\[0-9\]\[0-9\]t.[lindex $args 1]" ".ltrans0.ltrans" \
-		      [lindex $args 2]
-    } else {
-	scan-dump-not "ltrans-tree" [lindex $args 0] \
-		      "\[0-9\]\[0-9\]\[0-9\]t.[lindex $args 1]" ".ltrans0.ltrans"
-    }
-}
-
-# Utility for scanning demangled compiler result, invoked via dg-final.
-# Call pass if pattern is present, otherwise fail.
-#
-# Argument 0 is the regexp to match
-# Argument 1 is the name of the dumped tree pass
-# Argument 2 handles expected failures and the like
-proc scan-ltrans-tree-dump-dem { args } {
-
-    if { [llength $args] < 2 } {
-	error "scan-ltrans-tree-dump-dem: too few arguments"
-	return
-    }
-    if { [llength $args] > 3 } {
-	error "scan-ltrans-tree-dump-dem: too many arguments"
-	return
-    }
-    if { [llength $args] >= 3 } {
-	scan-dump-dem "ltrans-tree" [lindex $args 0] \
-		      "\[0-9\]\[0-9\]\[0-9\]t.[lindex $args 1]" ".ltrans0.ltrans" \
-		      [lindex $args 2]
-    } else {
-	scan-dump-dem "ltrans-tree" [lindex $args 0] \
-		      "\[0-9\]\[0-9\]\[0-9\]t.[lindex $args 1]" ".ltrans0.ltrans"
-    }
-}
-
-# Call pass if demangled pattern is not present, otherwise fail.
-#
-# Argument 0 is the regexp to match
-# Argument 1 is the name of the dumped tree pass
-# Argument 2 handles expected failures and the like
-proc scan-ltrans-tree-dump-dem-not { args } {
-
-    if { [llength $args] < 2 } {
-	error "scan-ltrans-tree-dump-dem-not: too few arguments"
-	return
-    }
-    if { [llength $args] > 3 } {
-	error "scan-ltrans-tree-dump-dem-not: too many arguments"
-	return
-    }
-    if { [llength $args] >= 3 } {
-	scan-dump-dem-not "ltrans-tree" [lindex $args 0] \
-			  "\[0-9\]\[0-9\]\[0-9\]t.[lindex $args 1]" \
-			  ".ltrans0.ltrans" [lindex $args 2]
-    } else {
-	scan-dump-dem-not "ltrans-tree" [lindex $args 0] \
-			  "\[0-9\]\[0-9\]\[0-9\]t.[lindex $args 1]" \
-			  ".ltrans0.ltrans"
-    }
+# The first item in the list is an LTO equivalent of the second item
+# in the list; see the documentation of the second item for details.
+foreach { name scan type suffix } {
+    scan-ltrans-tree-dump-times scan-dump-times ltrans-tree t
+} {
+    eval [string map [list @NAME@ $name \
+			   @SCAN@ $scan \
+			   @TYPE@ $type \
+			   @SUFFIX@ $suffix] {
+	proc @NAME@ { args } {
+	    if { [llength $args] < 3 } {
+		error "@NAME@: too few arguments"
+		return
+	    }
+	    if { [llength $args] > 4 } {
+		error "@NAME@: too many arguments"
+		return
+	    }
+	    if { [llength $args] >= 4 } {
+		@SCAN@ "@TYPE@" [lindex $args 0] [lindex $args 1] \
+		    "\[0-9\]\[0-9\]\[0-9\]@SUFFIX@.[lindex $args 2]" \
+		    ".ltrans0.ltrans" [lindex $args 3]
+	    } else {
+		@SCAN@ "@TYPE@" [lindex $args 0] [lindex $args 1] \
+		    "\[0-9\]\[0-9\]\[0-9\]@SUFFIX@.[lindex $args 2]" \
+		    ".ltrans0.ltrans"
+	    }
+	}
+    }]
 }