Index: Jenkins/FullBuild
===================================================================
--- Jenkins/FullBuild	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ Jenkins/FullBuild	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -20,9 +20,10 @@
 					gcc_08_x86_new: { trigger_build( 'gcc-10',  'x86', false ) },
 					gcc_07_x86_new: { trigger_build( 'gcc-9',   'x86', false ) },
+					gcc_11_x64_new: { trigger_build( 'gcc-11',  'x64', false ) },
 					gcc_10_x64_new: { trigger_build( 'gcc-10',  'x64', false ) },
 					gcc_09_x64_new: { trigger_build( 'gcc-9',   'x64', false ) },
 					gcc_08_x64_new: { trigger_build( 'gcc-8',   'x64', false ) },
 					gcc_07_x64_new: { trigger_build( 'gcc-7',   'x64', false ) },
-					gcc_06_x64_new: { trigger_build( 'gcc-6',   'x64', false ) },
+					// gcc_06_x64_new: { trigger_build( 'gcc-6',   'x64', false ) },
 					clang_x64_new:  { trigger_build( 'clang',   'x64', true  ) },
 				)
@@ -41,6 +42,6 @@
 	}
 
-	//If an exception is caught we need to change the status and remember to
-	//attach the build log to the email
+	// If an exception is caught we need to change the status and remember to
+	// attach the build log to the email
 	catch (Exception caughtError) {
 		echo('error caught')
@@ -73,5 +74,5 @@
 	// Run the build
 	// Don't propagate, it doesn't play nice with our email setup
-	def result = build job: 'Cforall/master', 		\
+	def result = build job: 'Cforall/master', 			\
 		parameters: [						\
 			[$class: 'StringParameterValue', 		\
@@ -83,21 +84,21 @@
 			[$class: 'BooleanParameterValue', 		\
 			  name: 'NewAST', 				\
-			  value: true], 					\
+			  value: true], 				\
 			[$class: 'BooleanParameterValue', 		\
 			  name: 'RunAllTests', 				\
-			  value: true], 					\
+			  value: true], 				\
 			[$class: 'BooleanParameterValue', 		\
 			  name: 'RunBenchmark', 			\
-			  value: true], 					\
+			  value: true], 				\
 			[$class: 'BooleanParameterValue', 		\
-			  name: 'BuildDocumentation', 		\
+			  name: 'BuildDocumentation', 			\
 			  value: doc], 					\
 			[$class: 'BooleanParameterValue', 		\
 			  name: 'Publish', 				\
-			  value: true], 					\
+			  value: true], 				\
 			[$class: 'BooleanParameterValue', 		\
 			  name: 'Silent', 				\
-			  value: true], 					\
-		],								\
+			  value: true], 				\
+		],							\
 		propagate: false
 
@@ -111,9 +112,9 @@
 
 def trigger_dist(String commitId, String buildNum) {
-	def result = build job: 'Cforall_Distribute_Ref',	\
+	def result = build job: 'Cforall_Distribute_Ref',		\
 		parameters: [						\
 			string(name: 'GitRef', value: commitId),	\
-			string(name: 'Build' , value: buildNum)	\
-		],								\
+			string(name: 'Build' , value: buildNum)		\
+		],							\
 		propagate: false
 
Index: Jenkinsfile
===================================================================
--- Jenkinsfile	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ Jenkinsfile	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -305,13 +305,13 @@
 				this.Compiler = new CC_Desc('gcc-7', 'g++-7', 'gcc-7', '-flto=auto')
 			break
-			case 'gcc-6':
-				this.Compiler = new CC_Desc('gcc-6', 'g++-6', 'gcc-6', '-flto=auto')
-			break
-			case 'gcc-5':
-				this.Compiler = new CC_Desc('gcc-5', 'g++-5', 'gcc-5', '-flto=auto')
-			break
-			case 'gcc-4.9':
-				this.Compiler = new CC_Desc('gcc-4.9', 'g++-4.9', 'gcc-4.9', '-flto=auto')
-			break
+			// case 'gcc-6':
+			//	this.Compiler = new CC_Desc('gcc-6', 'g++-6', 'gcc-6', '-flto=auto')
+			// break
+			// case 'gcc-5':
+			//	this.Compiler = new CC_Desc('gcc-5', 'g++-5', 'gcc-5', '-flto=auto')
+			// break
+			// case 'gcc-4.9':
+			//	this.Compiler = new CC_Desc('gcc-4.9', 'g++-4.9', 'gcc-4.9', '-flto=auto')
+			// break
 			case 'clang':
 				this.Compiler = new CC_Desc('clang', 'clang++-10', 'gcc-10', '-flto=thin -flto-jobs=0')
@@ -359,52 +359,54 @@
 def prepare_build() {
 	// prepare the properties
-	properties ([ 													\
-		buildDiscarder(logRotator(										\
-			artifactDaysToKeepStr: '',									\
-			artifactNumToKeepStr: '',									\
-			daysToKeepStr: '730',										\
-			numToKeepStr: '1000'										\
-		)),														\
-		[$class: 'ParametersDefinitionProperty', 								\
-			parameterDefinitions: [ 									\
-				[$class: 'ChoiceParameterDefinition',						\
-					description: 'Which compiler to use',					\
-					name: 'Compiler',									\
-					choices: 'gcc-11\ngcc-10\ngcc-9\ngcc-8\ngcc-7\ngcc-6\ngcc-5\ngcc-4.9\nclang',	\
-					defaultValue: 'gcc-8',								\
-				],												\
-				[$class: 'ChoiceParameterDefinition',						\
-					description: 'The target architecture',					\
-					name: 'Architecture',								\
-					choices: 'x64\nx86',								\
-					defaultValue: 'x64',								\
-				],												\
-				[$class: 'BooleanParameterDefinition',  						\
+	properties ([ 										\
+		buildDiscarder(logRotator(							\
+			artifactDaysToKeepStr: '',						\
+			artifactNumToKeepStr: '',						\
+			daysToKeepStr: '730',							\
+			numToKeepStr: '1000'							\
+		)),										\
+		[$class: 'ParametersDefinitionProperty', 					\
+			parameterDefinitions: [ 						\
+				[$class: 'ChoiceParameterDefinition',				\
+					description: 'Which compiler to use',			\
+					name: 'Compiler',					\
+					choices: 'gcc-11\ngcc-10\ngcc-9\ngcc-8\ngcc-7\nclang',	\
+					defaultValue: 'gcc-9',					\
+				],								\
+				[$class: 'ChoiceParameterDefinition',				\
+					description: 'The target architecture',			\
+					name: 'Architecture',					\
+					choices: 'x64\nx86',					\
+					defaultValue: 'x64',					\
+				],								\
+				[$class: 'BooleanParameterDefinition',  			\
 					description: 'If false, the test suite is only ran in debug', 	\
-					name: 'RunAllTests', 								\
-					defaultValue: false,  								\
-				], 												\
-				[$class: 'BooleanParameterDefinition',  						\
-					description: 'If true, jenkins also runs benchmarks', 		\
-					name: 'RunBenchmark', 								\
-					defaultValue: false,  								\
-				], 												\
-				[$class: 'BooleanParameterDefinition',  						\
-					description: 'If true, jenkins also builds documentation', 		\
-					name: 'BuildDocumentation', 							\
-					defaultValue: true,  								\
-				],												\
-				[$class: 'BooleanParameterDefinition',  						\
-					description: 'If true, jenkins also publishes results', 		\
-					name: 'Publish', 									\
-					defaultValue: false,  								\
-				],												\
-				[$class: 'BooleanParameterDefinition',  						\
-					description: 'If true, jenkins will not send emails', 		\
-					name: 'Silent', 									\
-					defaultValue: false,  								\
-				],												\
+					name: 'RunAllTests', 					\
+					defaultValue: false,  					\
+				], 								\
+				[$class: 'BooleanParameterDefinition',  			\
+					description: 'If true, jenkins also runs benchmarks', 	\
+					name: 'RunBenchmark', 					\
+					defaultValue: false,  					\
+				], 								\
+				[$class: 'BooleanParameterDefinition',  			\
+					description: 'If true, jenkins also builds documentation', \
+					name: 'BuildDocumentation', 				\
+					defaultValue: true,  					\
+				],								\
+				[$class: 'BooleanParameterDefinition',  			\
+					description: 'If true, jenkins also publishes results', \
+					name: 'Publish', 					\
+					defaultValue: false,  					\
+				],								\
+				[$class: 'BooleanParameterDefinition',  			\
+					description: 'If true, jenkins will not send emails', 	\
+					name: 'Silent', 					\
+					defaultValue: false,  					\
+				],								\
 			],
 		]])
+					// choices: 'gcc-11\ngcc-10\ngcc-9\ngcc-8\ngcc-7\ngcc-6\ngcc-5\ngcc-4.9\nclang',
+					// defaultValue: 'gcc-8',
 
 	// It's unfortunate but it looks like we need to checkout the entire repo just to get
Index: doc/bibliography/pl.bib
===================================================================
--- doc/bibliography/pl.bib	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ doc/bibliography/pl.bib	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -7453,4 +7453,13 @@
 }
 
+@inproceedings{Kahn74,
+    keywords	= {programming language, obect-oriented, polymorphism},
+    contributer	= {pabuhr@plg},
+    title	= {The Semantics of a Simple Language for Parallel Programming},
+    author	= {Gilles Kahn},
+    booktitle	= {IFIP Congress},
+    year	= 1974,
+}
+
 @article{Baker78,
     keywords	= {Algol display, FUNARG's, Lisp 1.5, deep binding, environment trees, multiprogramming, shallow binding},
Index: doc/papers/AMA/AMA-stix/Documents/.log
===================================================================
--- doc/papers/AMA/AMA-stix/Documents/.log	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ doc/papers/AMA/AMA-stix/Documents/.log	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
Index: doc/papers/AMA/AMA-stix/Documents/README.txt
===================================================================
--- doc/papers/AMA/AMA-stix/Documents/README.txt	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ doc/papers/AMA/AMA-stix/Documents/README.txt	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
Index: doc/papers/AMA/AMA-stix/Documents/wileyNJD-Doc.tex
===================================================================
--- doc/papers/AMA/AMA-stix/Documents/wileyNJD-Doc.tex	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ doc/papers/AMA/AMA-stix/Documents/wileyNJD-Doc.tex	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
Index: doc/papers/AMA/AMA-stix/Stix-fonts/ly1sti.fd
===================================================================
--- doc/papers/AMA/AMA-stix/Stix-fonts/ly1sti.fd	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ doc/papers/AMA/AMA-stix/Stix-fonts/ly1sti.fd	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
Index: doc/papers/AMA/AMA-stix/ama/NJDnatbib.sty
===================================================================
--- doc/papers/AMA/AMA-stix/ama/NJDnatbib.sty	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ doc/papers/AMA/AMA-stix/ama/NJDnatbib.sty	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
Index: doc/papers/AMA/AMA-stix/ama/wileyNJD-AMA.bbl
===================================================================
--- doc/papers/AMA/AMA-stix/ama/wileyNJD-AMA.bbl	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ doc/papers/AMA/AMA-stix/ama/wileyNJD-AMA.bbl	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
Index: doc/papers/AMA/AMA-stix/ama/wileyNJD-AMA.bib
===================================================================
--- doc/papers/AMA/AMA-stix/ama/wileyNJD-AMA.bib	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ doc/papers/AMA/AMA-stix/ama/wileyNJD-AMA.bib	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
Index: doc/theses/colby_parsons_MMAth/.gitignore
===================================================================
--- doc/theses/colby_parsons_MMAth/.gitignore	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ doc/theses/colby_parsons_MMAth/.gitignore	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -1,30 +1,9 @@
-build/*.aux
-build/*.acn
-build/*.acr
-build/*.alg
-build/*.bbl
-build/*.blg
-build/*.brf
-build/*.dvi
-build/*.glg
-build/*.glo
-build/*.gls
-build/*.idx
-build/*.ind
-build/*.ist
-build/*.lof
-build/*.log
-build/*.lol
-build/*.lot
-build/*.out
-build/*.ps
-build/*.pstex
-build/*.pstex_t
-build/*.tex
-build/*.toc
+# Intermediate Results:
+build/
+
+# Final Files:
 *.pdf
-*.png
 *.ps
-figures/*.tex
 
-examples
+# The Makefile here is not generated.
+!Makefile
Index: doc/theses/colby_parsons_MMAth/benchmarks/actors/data/nasus_CFA.txt
===================================================================
--- doc/theses/colby_parsons_MMAth/benchmarks/actors/data/nasus_CFA.txt	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ doc/theses/colby_parsons_MMAth/benchmarks/actors/data/nasus_CFA.txt	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -1,7 +1,7 @@
 5
 1 2 4 8 16 24 32 48
-CFA-LV CFA-NS CFA-R 
+Longest-Victim No-Stealing Random 
 executor
-CFA-LV:
+Longest-Victim:
 proc	time (s)
 1	29.22
@@ -45,5 +45,5 @@
 48	1.20
 48	1.20
-CFA-NS:
+No-Stealing:
 proc	time (s)
 1	28.25
@@ -87,5 +87,5 @@
 48	1.18
 48	1.16
-CFA-R:
+Random:
 proc	time (s)
 1	28.58
@@ -131,5 +131,5 @@
 
 matrix
-CFA-LV:
+Longest-Victim:
 proc	time (s)
 1	105.48
@@ -173,5 +173,5 @@
 48	2.75
 48	2.96
-CFA-NS:
+No-Stealing:
 proc	time (s)
 1	106.01
@@ -215,5 +215,5 @@
 48	2.78
 48	2.92
-CFA-R:
+Random:
 proc	time (s)
 1	105.91
@@ -259,5 +259,5 @@
 
 repeat
-CFA-LV:
+Longest-Victim:
 proc	time (s)
 1	1.17
@@ -301,5 +301,5 @@
 48	13.73
 48	14.55
-CFA-NS:
+No-Stealing:
 proc	time (s)
 1	1.15
@@ -343,5 +343,5 @@
 48	13.03
 48	12.83
-CFA-R:
+Random:
 proc	time (s)
 1	1.15
@@ -387,5 +387,5 @@
 
 balance_one
-CFA-LV:
+Longest-Victim:
 proc	time (s)
 1	20.06
@@ -429,5 +429,5 @@
 48	1.11
 48	1.12
-CFA-NS:
+No-Stealing:
 proc	time (s)
 1	20.13
@@ -471,5 +471,5 @@
 48	19.95
 48	20.00
-CFA-R:
+Random:
 proc	time (s)
 1	19.92
@@ -515,5 +515,5 @@
 
 balance_multi
-CFA-LV:
+Longest-Victim:
 proc	time (s)
 1	8.17
@@ -557,5 +557,5 @@
 48	5.75
 48	5.68
-CFA-NS:
+No-Stealing:
 proc	time (s)
 1	8.10
@@ -599,5 +599,5 @@
 48	9.28
 48	9.26
-CFA-R:
+Random:
 proc	time (s)
 1	8.08
Index: doc/theses/colby_parsons_MMAth/benchmarks/actors/data/pyke_CFA.txt
===================================================================
--- doc/theses/colby_parsons_MMAth/benchmarks/actors/data/pyke_CFA.txt	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ doc/theses/colby_parsons_MMAth/benchmarks/actors/data/pyke_CFA.txt	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -1,7 +1,7 @@
 5
 1 2 4 8 16 24 32 48
-CFA-LV CFA-NS CFA-R 
+Longest-Victim No-Stealing Random 
 executor
-CFA-LV:
+Longest-Victim:
 proc	time (s)
 1	29.04
@@ -45,5 +45,5 @@
 48	2.58
 48	2.55
-CFA-NS:
+No-Stealing:
 proc	time (s)
 1	28.15
@@ -87,5 +87,5 @@
 48	2.59
 48	2.60
-CFA-R:
+Random:
 proc	time (s)
 1	29.06
@@ -131,5 +131,5 @@
 
 matrix
-CFA-LV:
+Longest-Victim:
 proc	time (s)
 1	127.44
@@ -173,5 +173,5 @@
 48	6.83
 48	6.81
-CFA-NS:
+No-Stealing:
 proc	time (s)
 1	127.64
@@ -215,5 +215,5 @@
 48	6.77
 48	6.74
-CFA-R:
+Random:
 proc	time (s)
 1	127.26
@@ -259,5 +259,5 @@
 
 repeat
-CFA-LV:
+Longest-Victim:
 proc	time (s)
 1	1.16
@@ -301,5 +301,5 @@
 48	19.75
 48	19.71
-CFA-NS:
+No-Stealing:
 proc	time (s)
 1	1.18
@@ -343,5 +343,5 @@
 48	13.88
 48	13.71
-CFA-R:
+Random:
 proc	time (s)
 1	1.18
@@ -387,5 +387,5 @@
 
 balance_one
-CFA-LV:
+Longest-Victim:
 proc	time (s)
 1	19.46
@@ -429,5 +429,5 @@
 48	2.12
 48	2.17
-CFA-NS:
+No-Stealing:
 proc	time (s)
 1	21.00
@@ -471,5 +471,5 @@
 48	47.50
 48	47.72
-CFA-R:
+Random:
 proc	time (s)
 1	20.81
@@ -515,5 +515,5 @@
 
 balance_multi
-CFA-LV:
+Longest-Victim:
 proc	time (s)
 1	7.94
@@ -557,5 +557,5 @@
 48	14.38
 48	14.50
-CFA-NS:
+No-Stealing:
 proc	time (s)
 1	8.48
@@ -599,5 +599,5 @@
 48	21.50
 48	21.15
-CFA-R:
+Random:
 proc	time (s)
 1	8.49
Index: doc/theses/colby_parsons_MMAth/benchmarks/channels/plotData.py
===================================================================
--- doc/theses/colby_parsons_MMAth/benchmarks/channels/plotData.py	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ doc/theses/colby_parsons_MMAth/benchmarks/channels/plotData.py	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -70,5 +70,5 @@
     if currBench == Bench.Unset:
         if line == "contend:":
-            name = "Contend"
+            name = "Channel Contention"
             currBench = Bench.Contend
         elif line == "zero:":
Index: doc/theses/colby_parsons_MMAth/code/swap_queues.cfa
===================================================================
--- doc/theses/colby_parsons_MMAth/code/swap_queues.cfa	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ doc/theses/colby_parsons_MMAth/code/swap_queues.cfa	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -1,27 +1,13 @@
-// this is a code stub and will not compile
-
-// tries to atomically swap two queues and returns 0p if the swap failed
-// returns ptr to newly owned queue if swap succeeds
-static inline work_queue * try_swap_queues( worker & this, unsigned int victim_idx, unsigned int my_idx ) with(this) {
+// sequential equivalent swap
+void swap( uint victim_idx, uint my_idx  ) {
+    // Step 0:
     work_queue * my_queue = request_queues[my_idx];
-    work_queue * other_queue = request_queues[victim_idx];
-
-    // if either queue is 0p then they are in the process of being stolen
-    if ( other_queue == 0p || my_queue == 0p ) return 0p;
-
-    // try to set our queue ptr to be 0p. If it fails someone moved our queue so return false
-    if ( !__atomic_compare_exchange_n( &request_queues[my_idx], &my_queue, 0p, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST ) )
-        return 0p;
-
-    // try to set other queue ptr to be our queue ptr. If it fails someone moved the other queue so fix up then return false
-    if ( !__atomic_compare_exchange_n( &request_queues[victim_idx], &other_queue, my_queue, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST ) ) {
-        /* paranoid */ verify( request_queues[my_idx] == 0p );
-        request_queues[my_idx] = my_queue; // reset my queue ptr back to appropriate val
-        return 0p;
-    }
-
-    // we have successfully swapped and since our queue is 0p no one will touch it so write back new queue ptr non atomically
-    request_queues[my_idx] = other_queue; // last write does not need to be atomic
-    return other_queue;
+    work_queue * vic_queue = request_queues[victim_idx];
+    // Step 2:
+    request_queues[my_idx] = 0p;
+    // Step 3:
+    request_queues[victim_idx] = my_queue;
+    // Step 4:
+    request_queues[my_idx] = vic_queue;
 }
 
@@ -35,18 +21,23 @@
 
 bool try_swap_queues( worker & this, uint victim_idx, uint my_idx ) with(this) {
+    // Step 0:
+    // request_queues is the shared array of all sharded queues
     work_queue * my_queue = request_queues[my_idx];
     work_queue * vic_queue = request_queues[victim_idx];
 
+    // Step 1:
     // If either queue is 0p then they are in the process of being stolen
     // 0p is CForAll's equivalent of C++'s nullptr
-    if ( vic_queue == 0p || my_queue == 0p ) return false;
+    if ( vic_queue == 0p ) return false;
 
-    // Try to set our queue ptr to be 0p.
-    // If this CAS fails someone moved our queue so return false
+    // Step 2:
+    // Try to set thief's queue ptr to be 0p.
+    // If this CAS fails someone stole thief's queue so return false
     if ( !CAS( &request_queues[my_idx], &my_queue, 0p ) )
         return false;
-
-    // Try to set other queue ptr to be our queue ptr.
-    // If it fails someone moved the other queue, so fix up then return false
+    
+    // Step 3:
+    // Try to set victim queue ptr to be thief's queue ptr.
+    // If it fails someone stole the other queue, so fix up then return false
     if ( !CAS( &request_queues[victim_idx], &vic_queue, my_queue ) ) {
         request_queues[my_idx] = my_queue; // reset queue ptr back to prev val
@@ -54,6 +45,8 @@
     }
 
+    // Step 4:
     // Successfully swapped.
-    // Our queue is 0p so no one will touch it so write back without CAS is safe
+    // Thief's ptr is 0p so no one will touch it
+    // Write back without CAS is safe
     request_queues[my_idx] = vic_queue;
     return true;
Index: doc/theses/colby_parsons_MMAth/style/style.tex
===================================================================
--- doc/theses/colby_parsons_MMAth/style/style.tex	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ doc/theses/colby_parsons_MMAth/style/style.tex	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -3,5 +3,15 @@
 \lstset{language=CFA}					% default language
 
+\newcommand{\newtermFont}{\emph}
+\newcommand{\Newterm}[1]{\newtermFont{#1}}
+
 \newcommand{\code}[1]{\lstinline[language=CFA]{#1}}
 \newcommand{\uC}{$\mu$\CC}
+\newcommand{\PAB}[1]{{\color{red}PAB: #1}}
 
+\newsavebox{\myboxA}					% used with subfigure
+\newsavebox{\myboxB}
+
+\lstnewenvironment{java}[1][]
+{\lstset{language=java,moredelim=**[is][\protect\color{red}]{@}{@}}\lstset{#1}}
+{}
Index: doc/theses/colby_parsons_MMAth/text/actors.tex
===================================================================
--- doc/theses/colby_parsons_MMAth/text/actors.tex	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ doc/theses/colby_parsons_MMAth/text/actors.tex	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -90,31 +90,31 @@
 \begin{cfa}
 struct derived_actor {
-    inline actor;       // Plan-9 C inheritance
+	inline actor;	   // Plan-9 C inheritance
 };
 void ?{}( derived_actor & this ) { // Default ctor
-    ((actor &)this){};  // Call to actor ctor
+	((actor &)this){};  // Call to actor ctor
 }
 
 struct derived_msg {
-    inline message;     // Plan-9 C nominal inheritance
-    char word[12];
+	inline message;	 // Plan-9 C nominal inheritance
+	char word[12];
 };
 void ?{}( derived_msg & this, char * new_word ) { // Overloaded ctor
-    ((message &) this){ Nodelete }; // Passing allocation to ctor
-    strcpy(this.word, new_word);
+	((message &) this){ Nodelete }; // Passing allocation to ctor
+	strcpy(this.word, new_word);
 }
 
 Allocation receive( derived_actor & receiver, derived_msg & msg ) {
-    printf("The message contained the string: %s\n", msg.word);
-    return Finished; // Return finished since actor is done
+	printf("The message contained the string: %s\n", msg.word);
+	return Finished; // Return finished since actor is done
 }
 
 int main() {
-    start_actor_system(); // Sets up executor
-    derived_actor my_actor;         
-    derived_msg my_msg{ "Hello World" }; // Constructor call
-    my_actor << my_msg;   // Send message via left shift operator
-    stop_actor_system(); // Waits until actors are finished
-    return 0;
+	start_actor_system(); // Sets up executor
+	derived_actor my_actor;		 
+	derived_msg my_msg{ "Hello World" }; // Constructor call
+	my_actor << my_msg;   // Send message via left shift operator
+	stop_actor_system(); // Waits until actors are finished
+	return 0;
 }
 \end{cfa}
@@ -229,5 +229,5 @@
 \section{Envelopes}\label{s:envelope}
 In actor systems messages are sent and received by actors. 
-When a actor receives a message it  executes its behaviour that is associated with that message type. 
+When a actor receives a message it executes its behaviour that is associated with that message type. 
 However the unit of work that stores the message, the receiving actor's address, and other pertinent information needs to persist between send and the receive. 
 Furthermore the unit of work needs to be able to be stored in some fashion, usually in a queue, until it is executed by an actor. 
@@ -301,5 +301,5 @@
 While other systems are concerned with stealing actors, the \CFA actor system steals queues. 
 This is a result of \CFA's use of the inverted actor system. 
- The goal of the \CFA actor work stealing mechanism is to have a zero-victim-cost stealing mechanism. 
+The goal of the \CFA actor work stealing mechanism is to have a zero-victim-cost stealing mechanism. 
 This does not means that stealing has no cost. 
 This goal is to ensure that stealing work does not impact the performance of victim workers. 
@@ -369,14 +369,14 @@
 
 \begin{cfa}
-void swap( uint victim_idx, uint my_idx  ) {
-    // Step 0:
-    work_queue * my_queue = request_queues[my_idx];
-    work_queue * vic_queue = request_queues[victim_idx];
-    // Step 2:
-    request_queues[my_idx] = 0p;
-    // Step 3:
-    request_queues[victim_idx] = my_queue;
-    // Step 4:
-    request_queues[my_idx] = vic_queue;
+void swap( uint victim_idx, uint my_idx ) {
+	// Step 0:
+	work_queue * my_queue = request_queues[my_idx];
+	work_queue * vic_queue = request_queues[victim_idx];
+	// Step 2:
+	request_queues[my_idx] = 0p;
+	// Step 3:
+	request_queues[victim_idx] = my_queue;
+	// Step 4:
+	request_queues[my_idx] = vic_queue;
 }
 \end{cfa}
@@ -389,41 +389,41 @@
 // This routine is atomic
 bool CAS( work_queue ** ptr, work_queue ** old, work_queue * new ) {
-    if ( *ptr != *old )
-        return false;
-    *ptr = new;
-    return true;
+	if ( *ptr != *old )
+		return false;
+	*ptr = new;
+	return true;
 }
 
 bool try_swap_queues( worker & this, uint victim_idx, uint my_idx ) with(this) {
-    // Step 0:
-    // request_queues is the shared array of all sharded queues
-    work_queue * my_queue = request_queues[my_idx];
-    work_queue * vic_queue = request_queues[victim_idx];
-
-    // Step 1:
-    // If either queue is 0p then they are in the process of being stolen
-    // 0p is CForAll's equivalent of C++'s nullptr
-    if ( vic_queue == 0p ) return false;
-
-    // Step 2:
-    // Try to set thief's queue ptr to be 0p.
-    // If this CAS fails someone stole thief's queue so return false
-    if ( !CAS( &request_queues[my_idx], &my_queue, 0p ) )
-        return false;
-    
-    // Step 3:
-    // Try to set victim queue ptr to be thief's queue ptr.
-    // If it fails someone stole the other queue, so fix up then return false
-    if ( !CAS( &request_queues[victim_idx], &vic_queue, my_queue ) ) {
-        request_queues[my_idx] = my_queue; // reset queue ptr back to prev val
-        return false;
-    }
-
-    // Step 4:
-    // Successfully swapped.
-    // Thief's ptr is 0p so no one will touch it
-    // Write back without CAS is safe
-    request_queues[my_idx] = vic_queue;
-    return true;
+	// Step 0:
+	// request_queues is the shared array of all sharded queues
+	work_queue * my_queue = request_queues[my_idx];
+	work_queue * vic_queue = request_queues[victim_idx];
+
+	// Step 1:
+	// If either queue is 0p then they are in the process of being stolen
+	// 0p is CForAll's equivalent of C++'s nullptr
+	if ( vic_queue == 0p ) return false;
+
+	// Step 2:
+	// Try to set thief's queue ptr to be 0p.
+	// If this CAS fails someone stole thief's queue so return false
+	if ( !CAS( &request_queues[my_idx], &my_queue, 0p ) )
+		return false;
+	
+	// Step 3:
+	// Try to set victim queue ptr to be thief's queue ptr.
+	// If it fails someone stole the other queue, so fix up then return false
+	if ( !CAS( &request_queues[victim_idx], &vic_queue, my_queue ) ) {
+		request_queues[my_idx] = my_queue; // reset queue ptr back to prev val
+		return false;
+	}
+
+	// Step 4:
+	// Successfully swapped.
+	// Thief's ptr is 0p so no one will touch it
+	// Write back without CAS is safe
+	request_queues[my_idx] = vic_queue;
+	return true;
 }
 \end{cfa}\label{c:swap}
@@ -706,9 +706,9 @@
 \label{t:StaticActorMessagePerformance}
 \begin{tabular}{*{5}{r|}r}
-    & \multicolumn{1}{c|}{\CFA (100M)} & \multicolumn{1}{c|}{CAF (10M)} & \multicolumn{1}{c|}{Akka (100M)} & \multicolumn{1}{c|}{\uC (100M)} & \multicolumn{1}{c@{}}{ProtoActor (100M)} \\
-    \hline																            
-    AMD		& \input{data/pykeSendStatic} \\
-    \hline																            
-    Intel	& \input{data/nasusSendStatic}
+	& \multicolumn{1}{c|}{\CFA (100M)} & \multicolumn{1}{c|}{CAF (10M)} & \multicolumn{1}{c|}{Akka (100M)} & \multicolumn{1}{c|}{\uC (100M)} & \multicolumn{1}{c@{}}{ProtoActor (100M)} \\
+	\hline																			
+	AMD		& \input{data/pykeSendStatic} \\
+	\hline																			
+	Intel	& \input{data/nasusSendStatic}
 \end{tabular}
 
@@ -719,9 +719,9 @@
 
 \begin{tabular}{*{5}{r|}r}
-    & \multicolumn{1}{c|}{\CFA (20M)} & \multicolumn{1}{c|}{CAF (2M)} & \multicolumn{1}{c|}{Akka (2M)} & \multicolumn{1}{c|}{\uC (20M)} & \multicolumn{1}{c@{}}{ProtoActor (2M)} \\
-    \hline																            
-    AMD		& \input{data/pykeSendDynamic} \\
-    \hline																            
-    Intel	& \input{data/nasusSendDynamic}
+	& \multicolumn{1}{c|}{\CFA (20M)} & \multicolumn{1}{c|}{CAF (2M)} & \multicolumn{1}{c|}{Akka (2M)} & \multicolumn{1}{c|}{\uC (20M)} & \multicolumn{1}{c@{}}{ProtoActor (2M)} \\
+	\hline																			
+	AMD		& \input{data/pykeSendDynamic} \\
+	\hline																			
+	Intel	& \input{data/nasusSendDynamic}
 \end{tabular}
 \end{table}
@@ -745,5 +745,5 @@
 In the static send benchmark all systems except CAF have static send costs that are in the same ballpark, only varying by ~70ns. 
 In the dynamic send benchmark all systems experience slower message sends, as expected due to the extra allocations. 
-However,  Akka and ProtoActor, slow down by a more significant margin than the \uC and \CFA. 
+However, Akka and ProtoActor, slow down by a more significant margin than the \uC and \CFA. 
 This is likely a result of Akka and ProtoActor's garbage collection, which can suffer from hits in performance for allocation heavy workloads, whereas \uC and \CFA have explicit allocation/deallocation.
 
@@ -753,35 +753,27 @@
 
 \begin{figure}
-    \centering
-    \begin{subfigure}{0.5\textwidth}
-        \centering
-        \scalebox{0.5}{\input{figures/nasusCFABalance-One.pgf}}
-        \subcaption{AMD \CFA Balance-One Benchmark}
-        \label{f:BalanceOneAMD}
-    \end{subfigure}\hfill
-    \begin{subfigure}{0.5\textwidth}
-        \centering
-        \scalebox{0.5}{\input{figures/pykeCFABalance-One.pgf}}
-        \subcaption{Intel \CFA Balance-One Benchmark}
-        \label{f:BalanceOneIntel}
-    \end{subfigure}
-    \caption{The balance-one benchmark comparing stealing heuristics (lower is better).}
-\end{figure}
-
-\begin{figure}
-    \centering
-    \begin{subfigure}{0.5\textwidth}
-        \centering
-        \scalebox{0.5}{\input{figures/nasusCFABalance-Multi.pgf}}
-        \subcaption{AMD \CFA Balance-Multi Benchmark}
-        \label{f:BalanceMultiAMD}
-    \end{subfigure}\hfill
-    \begin{subfigure}{0.5\textwidth}
-        \centering
-        \scalebox{0.5}{\input{figures/pykeCFABalance-Multi.pgf}}
-        \subcaption{Intel \CFA Balance-Multi Benchmark}
-        \label{f:BalanceMultiIntel}
-    \end{subfigure}
-    \caption{The balance-multi benchmark comparing stealing heuristics (lower is better).}
+	\centering
+	\subfloat[AMD \CFA Balance-One Benchmark]{
+		\resizebox{0.5\textwidth}{!}{\input{figures/nasusCFABalance-One.pgf}}
+		\label{f:BalanceOneAMD}
+	}
+	\subfloat[Intel \CFA Balance-One Benchmark]{
+		\resizebox{0.5\textwidth}{!}{\input{figures/pykeCFABalance-One.pgf}}
+		\label{f:BalanceOneIntel}
+	}
+	\caption{The balance-one benchmark comparing stealing heuristics (lower is better).}
+\end{figure}
+
+\begin{figure}
+	\centering
+	\subfloat[AMD \CFA Balance-Multi Benchmark]{
+		\resizebox{0.5\textwidth}{!}{\input{figures/nasusCFABalance-Multi.pgf}}
+		\label{f:BalanceMultiAMD}
+	}
+	\subfloat[Intel \CFA Balance-Multi Benchmark]{
+		\resizebox{0.5\textwidth}{!}{\input{figures/pykeCFABalance-Multi.pgf}}
+		\label{f:BalanceMultiIntel}
+	}
+	\caption{The balance-multi benchmark comparing stealing heuristics (lower is better).}
 \end{figure}
 
@@ -817,18 +809,14 @@
 
 \begin{figure}
-    \centering
-    \begin{subfigure}{0.5\textwidth}
-        \centering
-        \scalebox{0.5}{\input{figures/nasusExecutor.pgf}}
-        \subcaption{AMD Executor Benchmark}
-        \label{f:ExecutorAMD}
-    \end{subfigure}\hfill
-    \begin{subfigure}{0.5\textwidth}
-        \centering
-        \scalebox{0.5}{\input{figures/pykeExecutor.pgf}}
-        \subcaption{Intel Executor Benchmark}
-        \label{f:ExecutorIntel}
-    \end{subfigure}
-    \caption{The executor benchmark comparing actor systems (lower is better).}
+	\centering
+	\subfloat[AMD Executor Benchmark]{
+		\resizebox{0.5\textwidth}{!}{\input{figures/nasusExecutor.pgf}}
+		\label{f:ExecutorAMD}
+	}
+	\subfloat[Intel Executor Benchmark]{
+		\resizebox{0.5\textwidth}{!}{\input{figures/pykeExecutor.pgf}}
+		\label{f:ExecutorIntel}
+	}
+	\caption{The executor benchmark comparing actor systems (lower is better).}
 \end{figure}
 
@@ -840,16 +828,14 @@
 
 \begin{figure}
-    \centering
-    \begin{subfigure}{0.5\textwidth}
-        \centering
-        \scalebox{0.5}{\input{figures/nasusCFAExecutor.pgf}}
-        \subcaption{AMD \CFA Executor Benchmark}\label{f:cfaExecutorAMD}
-    \end{subfigure}\hfill
-    \begin{subfigure}{0.5\textwidth}
-        \centering
-        \scalebox{0.5}{\input{figures/pykeCFAExecutor.pgf}}
-        \subcaption{Intel \CFA Executor Benchmark}\label{f:cfaExecutorIntel}
-    \end{subfigure}
-    \caption{Executor benchmark comparing \CFA stealing heuristics (lower is better).}
+	\centering
+	\subfloat[AMD \CFA Executor Benchmark]{
+		\resizebox{0.5\textwidth}{!}{\input{figures/nasusCFAExecutor.pgf}}
+		\label{f:cfaExecutorAMD}
+	}
+	\subfloat[Intel \CFA Executor Benchmark]{
+		\resizebox{0.5\textwidth}{!}{\input{figures/pykeCFAExecutor.pgf}}
+		\label{f:cfaExecutorIntel}
+	}
+	\caption{Executor benchmark comparing \CFA stealing heuristics (lower is better).}
 \end{figure}
 
@@ -857,16 +843,14 @@
 
 \begin{figure}
-    \centering
-    \begin{subfigure}{0.5\textwidth}
-        \centering
-        \scalebox{0.5}{\input{figures/nasusRepeat.pgf}}
-        \subcaption{AMD Repeat Benchmark}\label{f:RepeatAMD}
-    \end{subfigure}\hfill
-    \begin{subfigure}{0.5\textwidth}
-        \centering
-        \scalebox{0.5}{\input{figures/pykeRepeat.pgf}}
-        \subcaption{Intel Repeat Benchmark}\label{f:RepeatIntel}
-    \end{subfigure}
-    \caption{The repeat benchmark comparing actor systems (lower is better).}
+	\centering
+	\subfloat[AMD Repeat Benchmark]{
+		\resizebox{0.5\textwidth}{!}{\input{figures/nasusRepeat.pgf}}
+		\label{f:RepeatAMD}
+	}
+	\subfloat[Intel Repeat Benchmark]{
+		\resizebox{0.5\textwidth}{!}{\input{figures/pykeRepeat.pgf}}
+		\label{f:RepeatIntel}
+	}
+	\caption{The repeat benchmark comparing actor systems (lower is better).}
 \end{figure}
 
@@ -881,16 +865,14 @@
 
 \begin{figure}
-    \centering
-    \begin{subfigure}{0.5\textwidth}
-        \centering
-        \scalebox{0.5}{\input{figures/nasusCFARepeat.pgf}}
-        \subcaption{AMD \CFA Repeat Benchmark}\label{f:cfaRepeatAMD}
-    \end{subfigure}\hfill
-    \begin{subfigure}{0.5\textwidth}
-        \centering
-        \scalebox{0.5}{\input{figures/pykeCFARepeat.pgf}}
-        \subcaption{Intel \CFA Repeat Benchmark}\label{f:cfaRepeatIntel}
-    \end{subfigure}
-    \caption{The repeat benchmark comparing \CFA stealing heuristics (lower is better).}
+	\centering
+	\subfloat[AMD \CFA Repeat Benchmark]{
+		\resizebox{0.5\textwidth}{!}{\input{figures/nasusCFARepeat.pgf}}
+		\label{f:cfaRepeatAMD}
+	}
+	\subfloat[Intel \CFA Repeat Benchmark]{
+		\resizebox{0.5\textwidth}{!}{\input{figures/pykeCFARepeat.pgf}}
+		\label{f:cfaRepeatIntel}
+	}
+	\caption{The repeat benchmark comparing \CFA stealing heuristics (lower is better).}
 \end{figure}
 
@@ -913,17 +895,17 @@
 
 \begin{table}[t]
-    \centering
-    \setlength{\extrarowheight}{2pt}
-    \setlength{\tabcolsep}{5pt}
-    
-    \caption{Executor Program Memory High Watermark}
-    \label{t:ExecutorMemory}
-    \begin{tabular}{*{5}{r|}r}
-        & \multicolumn{1}{c|}{\CFA} & \multicolumn{1}{c|}{CAF} & \multicolumn{1}{c|}{Akka} & \multicolumn{1}{c|}{\uC} & \multicolumn{1}{c@{}}{ProtoActor} \\
-        \hline																            
-        AMD		& \input{data/pykeExecutorMem} \\
-        \hline																            
-        Intel	& \input{data/nasusExecutorMem}
-    \end{tabular}
+	\centering
+	\setlength{\extrarowheight}{2pt}
+	\setlength{\tabcolsep}{5pt}
+	
+	\caption{Executor Program Memory High Watermark}
+	\label{t:ExecutorMemory}
+	\begin{tabular}{*{5}{r|}r}
+		& \multicolumn{1}{c|}{\CFA} & \multicolumn{1}{c|}{CAF} & \multicolumn{1}{c|}{Akka} & \multicolumn{1}{c|}{\uC} & \multicolumn{1}{c@{}}{ProtoActor} \\
+		\hline																			
+		AMD		& \input{data/pykeExecutorMem} \\
+		\hline																			
+		Intel	& \input{data/nasusExecutorMem}
+	\end{tabular}
 \end{table}
 
@@ -951,30 +933,30 @@
 
 \begin{figure}
-    \centering
-    \begin{subfigure}{0.5\textwidth}
-        \centering
-        \scalebox{0.5}{\input{figures/nasusMatrix.pgf}}
-        \subcaption{AMD Matrix Benchmark}\label{f:MatrixAMD}
-    \end{subfigure}\hfill
-    \begin{subfigure}{0.5\textwidth}
-        \centering
-        \scalebox{0.5}{\input{figures/pykeMatrix.pgf}}
-        \subcaption{Intel Matrix Benchmark}\label{f:MatrixIntel}
-    \end{subfigure}
-    \caption{The matrix benchmark comparing actor systems (lower is better).}
-\end{figure}
-
-\begin{figure}
-    \centering
-    \begin{subfigure}{0.5\textwidth}
-        \centering
-        \scalebox{0.5}{\input{figures/nasusCFAMatrix.pgf}}
-        \subcaption{AMD \CFA Matrix Benchmark}\label{f:cfaMatrixAMD}
-    \end{subfigure}\hfill
-    \begin{subfigure}{0.5\textwidth}
-        \centering
-        \scalebox{0.5}{\input{figures/pykeCFAMatrix.pgf}}
-        \subcaption{Intel \CFA Matrix Benchmark}\label{f:cfaMatrixIntel}
-    \end{subfigure}
-    \caption{The matrix benchmark comparing \CFA stealing heuristics (lower is better).}
-\end{figure}
+	\centering
+	\subfloat[AMD Matrix Benchmark]{
+		\resizebox{0.5\textwidth}{!}{\input{figures/nasusMatrix.pgf}}
+		\label{f:MatrixAMD}
+	}
+	\subfloat[Intel Matrix Benchmark]{
+		\resizebox{0.5\textwidth}{!}{\input{figures/pykeMatrix.pgf}}
+		\label{f:MatrixIntel}
+	}
+	\caption{The matrix benchmark comparing actor systems (lower is better).}
+\end{figure}
+
+\begin{figure}
+	\centering
+	\subfloat[AMD \CFA Matrix Benchmark]{
+		\resizebox{0.5\textwidth}{!}{\input{figures/nasusCFAMatrix.pgf}}
+		\label{f:cfaMatrixAMD}
+	}
+	\subfloat[Intel \CFA Matrix Benchmark]{
+		\resizebox{0.5\textwidth}{!}{\input{figures/pykeCFAMatrix.pgf}}
+		\label{f:cfaMatrixIntel}
+	}
+	\caption{The matrix benchmark comparing \CFA stealing heuristics (lower is better).}
+\end{figure}
+
+% Local Variables: %
+% tab-width: 4 %
+% End: %
Index: doc/theses/colby_parsons_MMAth/text/channels.tex
===================================================================
--- doc/theses/colby_parsons_MMAth/text/channels.tex	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ doc/theses/colby_parsons_MMAth/text/channels.tex	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -5,76 +5,83 @@
 % ======================================================================
 
-Channels were first introduced by Hoare in his paper Communicating Sequentual Processes~\cite{Hoare78}, where he proposes a concurrent language that communicates across processes using input/output channels to send data. 
-Channels are a concurrent language feature used to perform message passing concurrency, a model of concurrency where threads communicate by sending data as messages, and synchronizing via the message passing mechanism. 
-This is an alternative to shared memory concurrency, where threads can communicate directly by changing shared memory state. 
-Most modern concurrent programming languages do not subscribe to just one style of communication between threads, and provide features that support both. 
+Channels are a concurrent-language feature used to perform \Newterm{message-passing concurrency}: a model of concurrency where threads communicate by sending (mostly nonblocking) data as messages and synchronizing by receiving (blocking) sent data.
+This model is an alternative to shared-memory concurrency, where threads can communicate directly by changing shared state.
+Most modern concurrent programming languages do not subscribe to just one style of communication among threads and provide features that support multiple approaches.
+
+Channels were first introduced by Kahn~\cite{Kahn74} and extended by Hoare~\cite{Hoare78} (CSP).
+Both papers present a pseudo (unimplemented) concurrent language where processes communicate using input/output channels to send data.
+Both languages are highly restrictive.
+Kahn's language restricts a reading process to only wait for data on a single channel at a time and different writing processes cannot send data on the same channel.
+Hoare's language restricts ...
 Channels as a programming language feature has been popularized in recent years due to the language Go, which encourages the use of channels as its fundamental concurrent feature.
+Go's restrictions are ...
+\CFA channels do not have these restrictions.
 
 \section{Producer-Consumer Problem}
-Most channels in modern programming languages are built on top of a shared memory buffer. 
-While it is possible to create a channel that contains an unbounded buffer, most implementations opt to only support a fixed size channel, where the size is given at the time of channel creation. 
-This turns the implementation of a channel into the producer-consumer problem. 
-The producer-consumer problem, also known as the bounded buffer problem, was introduced by Dijkstra in his book Cooperating Sequential Processes\cite{Dijkstra65}. 
-In the problem threads interact with the buffer in two ways, either consuming values by removing them from the buffer, or producing values and inserting them in the buffer. 
-The buffer needs to be protected from concurrent access since each item in the buffer should only be produced and consumed once. 
+Most channels in modern programming languages are built on top of a shared memory buffer.
+While it is possible to create a channel that contains an unbounded buffer, most implementations opt to only support a fixed size channel, where the size is given at the time of channel creation.
+This turns the implementation of a channel into the producer-consumer problem.
+The producer-consumer problem, also known as the bounded buffer problem, was introduced by Dijkstra in his book Cooperating Sequential Processes\cite{Dijkstra65}.
+In the problem threads interact with the buffer in two ways, either consuming values by removing them from the buffer, or producing values and inserting them in the buffer.
+The buffer needs to be protected from concurrent access since each item in the buffer should only be produced and consumed once.
 Additionally, a consumer can only remove from a non-empty buffer and a producer can only insert into a non-full buffer.
 
 \section{First-Come First-Served}
-The channel implementations that will be discussed are \gls{fcfs}. 
-This term was defined by Lamport~\cite{Lamport74}. 
-\gls{fcfs} is defined in relation to a doorway~\cite[p.~330]{Lamport86II}, which is the point at which an ordering among threads can be established. 
-Given this doorway, a critical section is said to be \gls{fcfs}, if threads access the shared resource in the order they proceed through the doorway. 
-\gls{fcfs} is a fairness property which prevents unequal access to the shared resource and prevents starvation, however it can come at a cost. 
-Implementing an algorithm with \gls{fcfs} can lead to double blocking, where entering threads may need to block to allow other threads to proceed first, resulting in blocking both inside and outside the doorway. 
+The channel implementations that will be discussed are \gls{fcfs}.
+This term was defined by Lamport~\cite{Lamport74}.
+\gls{fcfs} is defined in relation to a doorway~\cite[p.~330]{Lamport86II}, which is the point at which an ordering among threads can be established.
+Given this doorway, a critical section is said to be \gls{fcfs}, if threads access the shared resource in the order they proceed through the doorway.
+\gls{fcfs} is a fairness property which prevents unequal access to the shared resource and prevents starvation, however it can come at a cost.
+Implementing an algorithm with \gls{fcfs} can lead to double blocking, where entering threads may need to block to allow other threads to proceed first, resulting in blocking both inside and outside the doorway.
 As such algorithms that are not \gls{fcfs} may be more performant but that performance comes with the downside of likely introducing starvation and unfairness.
 
 \section{Channel Implementation}
-The channel implementation in \CFA is a near carbon copy of the Go implementation. 
-Experimentation was conducted that varied the producer-consumer problem algorithm and lock type used inside the channel. 
-With the exception of non-\gls{fcfs} algorithms, no algorithm or lock usage in the channel implementation was found to be consistently more performant that Go's choice of algorithm and lock implementation. 
+The channel implementation in \CFA is a near carbon copy of the Go implementation.
+Experimentation was conducted that varied the producer-consumer problem algorithm and lock type used inside the channel.
+With the exception of non-\gls{fcfs} algorithms, no algorithm or lock usage in the channel implementation was found to be consistently more performant that Go's choice of algorithm and lock implementation.
 As such the research contributions added by \CFA's channel implementation lie in the realm of safety and productivity features.
 
 \section{Safety and Productivity}
-Channels in \CFA come with safety and productivity features to aid users. 
+Channels in \CFA come with safety and productivity features to aid users.
 The features include the following.
 
 \begin{itemize}
-\item Toggle-able statistic collection on channel behvaiour that counts channel operations, and the number of the operations that block. 
+\item Toggle-able statistic collection on channel behaviour that counts channel operations, and the number of the operations that block.
 Tracking blocking operations helps users tune their channel size or channel usage when the channel is used for buffering, where the aim is to have as few blocking operations as possible.
-\item Deadlock detection on deallocation of the channel. 
+\item Deadlock detection on deallocation of the channel.
 If any threads are blocked inside the channel when it terminates it is detected and informs the user, as this would cause a deadlock.
-\item A \code{flush} routine that delivers copies of an element to all waiting consumers, flushing the buffer. 
-Programmers can use this to easily to broadcast data to multiple consumers. 
-Additionally, the \code{flush} routine is more performant then looping around the \code{insert} operation since it can deliver the elements without having to reaquire mutual exclusion for each element sent.
+\item A \code{flush} routine that delivers copies of an element to all waiting consumers, flushing the buffer.
+Programmers can use this to easily to broadcast data to multiple consumers.
+Additionally, the \code{flush} routine is more performant then looping around the \code{insert} operation since it can deliver the elements without having to reacquire mutual exclusion for each element sent.
 \end{itemize}
 
-The other safety and productivity feature of \CFA channels deals with concurrent termination. 
-Terminating concurrent programs is often one of the most difficult parts of writing concurrent code, particularly if graceful termination is needed. 
-The difficulty of graceful termination often arises from the usage of synchronization primitives which need to be handled carefully during shutdown. 
-It is easy to deadlock during termination if threads are left behind on synchronization primitives. 
-Additionally, most synchronization primitives are prone to \gls{toctou} issues where there is race between one thread checking the state of a concurrent object and another thread changing the state. 
-\gls{toctou} issues with synchronization primitives often involve a race between one thread checking the primitive for blocked threads and another thread blocking on it. 
-Channels are a particularly hard synchronization primitive to terminate since both sending and receiving off a channel can block. 
+The other safety and productivity feature of \CFA channels deals with concurrent termination.
+Terminating concurrent programs is often one of the most difficult parts of writing concurrent code, particularly if graceful termination is needed.
+The difficulty of graceful termination often arises from the usage of synchronization primitives which need to be handled carefully during shutdown.
+It is easy to deadlock during termination if threads are left behind on synchronization primitives.
+Additionally, most synchronization primitives are prone to \gls{toctou} issues where there is race between one thread checking the state of a concurrent object and another thread changing the state.
+\gls{toctou} issues with synchronization primitives often involve a race between one thread checking the primitive for blocked threads and another thread blocking on it.
+Channels are a particularly hard synchronization primitive to terminate since both sending and receiving off a channel can block.
 Thus, improperly handled \gls{toctou} issues with channels often result in deadlocks as threads trying to perform the termination may end up unexpectedly blocking in their attempt to help other threads exit the system.
 
 % C_TODO: add reference to select chapter, add citation to go channels info
-Go channels provide a set of tools to help with concurrent shutdown. 
-Channels in Go have a \code{close} operation and a \code{select} statement that both can be used to help threads terminate. 
-The \code{select} statement will be discussed in \ref{}, where \CFA's \code{waituntil} statement will be compared with the Go \code{select} statement. 
-The \code{close} operation on a channel in Go changes the state of the channel. 
-When a channel is closed, sends to the channel will panic and additional calls to \code{close} will panic. 
-Receives are handled differently where receivers will never block on a closed channel and will continue to remove elements from the channel. 
-Once a channel is empty, receivers can continue to remove elements, but will receive the zero-value version of the element type. 
-To aid in avoiding unwanted zero-value elements, Go provides the ability to iterate over a closed channel to remove the remaining elements. 
-These design choices for Go channels enforce a specific interaction style with channels during termination, where careful thought is needed to ensure that additional \code{close} calls don't occur and that no sends occur after channels are closed. 
-These design choices fit Go's paradigm of error management, where users are expected to explicitly check for errors, rather than letting errors occur and catching them. 
-If errors need to occur in Go, return codes are used to pass error information where they are needed. 
+Go channels provide a set of tools to help with concurrent shutdown.
+Channels in Go have a \code{close} operation and a \code{select} statement that both can be used to help threads terminate.
+The \code{select} statement will be discussed in \ref{}, where \CFA's \code{waituntil} statement will be compared with the Go \code{select} statement.
+The \code{close} operation on a channel in Go changes the state of the channel.
+When a channel is closed, sends to the channel will panic and additional calls to \code{close} will panic.
+Receives are handled differently where receivers will never block on a closed channel and will continue to remove elements from the channel.
+Once a channel is empty, receivers can continue to remove elements, but will receive the zero-value version of the element type.
+To aid in avoiding unwanted zero-value elements, Go provides the ability to iterate over a closed channel to remove the remaining elements.
+These design choices for Go channels enforce a specific interaction style with channels during termination, where careful thought is needed to ensure that additional \code{close} calls don't occur and that no sends occur after channels are closed.
+These design choices fit Go's paradigm of error management, where users are expected to explicitly check for errors, rather than letting errors occur and catching them.
+If errors need to occur in Go, return codes are used to pass error information where they are needed.
 Note that panics in Go can be caught, but it is not considered an idiomatic way to write Go programs.
 
-While Go's channel closing semantics are powerful enough to perform any concurrent termination needed by a program, their lack of ease of use leaves much to be desired. 
-Since both closing and sending panic, once a channel is closed, a user often has to synchronize the senders to a channel before the channel can be closed to avoid panics. 
-However, in doing so it renders the \code{close} operation nearly useless, as the only utilities it provides are the ability to ensure that receivers no longer block on the channel, and will receive zero-valued elements. 
-This can be useful if the zero-typed element is recognized as a sentinel value, but if another sentinel value is preferred, then \code{close} only provides its non-blocking feature. 
-To avoid \gls{toctou} issues during shutdown, a busy wait with a \code{select} statement is often used to add or remove elements from a channel. 
+While Go's channel closing semantics are powerful enough to perform any concurrent termination needed by a program, their lack of ease of use leaves much to be desired.
+Since both closing and sending panic, once a channel is closed, a user often has to synchronize the senders to a channel before the channel can be closed to avoid panics.
+However, in doing so it renders the \code{close} operation nearly useless, as the only utilities it provides are the ability to ensure that receivers no longer block on the channel, and will receive zero-valued elements.
+This can be useful if the zero-typed element is recognized as a sentinel value, but if another sentinel value is preferred, then \code{close} only provides its non-blocking feature.
+To avoid \gls{toctou} issues during shutdown, a busy wait with a \code{select} statement is often used to add or remove elements from a channel.
 Due to Go's asymmetric approach to channel shutdown, separate synchronization between producers and consumers of a channel has to occur during shutdown.
 
@@ -82,72 +89,72 @@
 As such \CFA uses an exception based approach to channel shutdown that is symmetric for both producers and consumers, and supports graceful shutdown.Exceptions in \CFA support both termination and resumption.Termination exceptions operate in the same way as exceptions seen in many popular programming languages such as \CC, Python and Java.
 Resumption exceptions are a style of exception that when caught run the corresponding catch block in the same way that termination exceptions do.
-The difference between the exception handling mechanisms arises after the exception is handled. 
-In termination handling, the control flow continues into the code following the catch after the exception is handled. 
-In resumption handling, the control flow returns to the site of the \code{throw}, allowing the control to continue where it left off. 
-Note that in resumption, since control can return to the point of error propagation, the stack is not unwound during resumption propagation. 
-In \CFA if a resumption is not handled, it is reraised as a termination. 
+The difference between the exception handling mechanisms arises after the exception is handled.
+In termination handling, the control flow continues into the code following the catch after the exception is handled.
+In resumption handling, the control flow returns to the site of the \code{throw}, allowing the control to continue where it left off.
+Note that in resumption, since control can return to the point of error propagation, the stack is not unwound during resumption propagation.
+In \CFA if a resumption is not handled, it is reraised as a termination.
 This mechanism can be used to create a flexible and robust termination system for channels.
 
-When a channel in \CFA is closed, all subsequent calls to the channel will throw a resumption exception at the caller. 
-If the resumption is handled, then the caller will proceed to attempt to complete their operation. 
-If the resumption is not handled it is then rethrown as a termination exception. 
-Or, if the resumption is handled, but the subsequent attempt at an operation would block, a termination exception is thrown. 
-These termination exceptions allow for non-local transfer that can be used to great effect to eagerly and gracefully shut down a thread. 
-When a channel is closed, if there are any blocked producers or consumers inside the channel, they are woken up and also have a resumption thrown at them. 
-The resumption exception, \code{channel_closed}, has a couple fields to aid in handling the exception. 
-The exception contains a pointer to the channel it was thrown from, and a pointer to an element. 
-In exceptions thrown from remove the element pointer will be null. 
-In the case of insert the element pointer points to the element that the thread attempted to insert. 
-This element pointer allows the handler to know which operation failed and also allows the element to not be lost on a failed insert since it can be moved elsewhere in the handler. 
-Furthermore, due to \CFA's powerful exception system, this data can be used to choose handlers based which channel and operation failed. 
-Exception handlers in \CFA have an optional predicate after the exception type which can be used to optionally trigger or skip handlers based on the content of an exception. 
-It is worth mentioning that the approach of exceptions for termination may incur a larger performance cost during termination that the approach used in Go. 
+When a channel in \CFA is closed, all subsequent calls to the channel will throw a resumption exception at the caller.
+If the resumption is handled, then the caller will proceed to attempt to complete their operation.
+If the resumption is not handled it is then rethrown as a termination exception.
+Or, if the resumption is handled, but the subsequent attempt at an operation would block, a termination exception is thrown.
+These termination exceptions allow for non-local transfer that can be used to great effect to eagerly and gracefully shut down a thread.
+When a channel is closed, if there are any blocked producers or consumers inside the channel, they are woken up and also have a resumption thrown at them.
+The resumption exception, \code{channel_closed}, has a couple fields to aid in handling the exception.
+The exception contains a pointer to the channel it was thrown from, and a pointer to an element.
+In exceptions thrown from remove the element pointer will be null.
+In the case of insert the element pointer points to the element that the thread attempted to insert.
+This element pointer allows the handler to know which operation failed and also allows the element to not be lost on a failed insert since it can be moved elsewhere in the handler.
+Furthermore, due to \CFA's powerful exception system, this data can be used to choose handlers based which channel and operation failed.
+Exception handlers in \CFA have an optional predicate after the exception type which can be used to optionally trigger or skip handlers based on the content of an exception.
+It is worth mentioning that the approach of exceptions for termination may incur a larger performance cost during termination that the approach used in Go.
 This should not be an issue, since termination is rarely an fast-path of an application and ensuring that termination can be implemented correctly with ease is the aim of the exception approach.
 
-To highlight the differences between \CFA's and Go's close semantics, an example program is presented. 
-The program is a barrier implemented using two channels shown in Listings~\ref{l:cfa_chan_bar} and \ref{l:go_chan_bar}. 
-Both of these exaples are implmented using \CFA syntax so that they can be easily compared. 
-Listing~\ref{l:go_chan_bar} uses go-style channel close semantics and Listing~\ref{l:cfa_chan_bar} uses \CFA close semantics. 
-In this problem it is infeasible to use the Go \code{close} call since all tasks are both potentially producers and consumers, causing panics on close to be unavoidable. 
-As such in Listing~\ref{l:go_chan_bar} to implement a flush routine for the buffer, a sentinel value of $-1$ has to be used to indicate to threads that they need to leave the barrier. 
-This sentinel value has to be checked at two points. 
-Furthermore, an additional flag \code{done} is needed to communicate to threads once they have left the barrier that they are done. 
-This use of an additional flag or communication method is common in Go channel shutdown code, since to avoid panics on a channel, the shutdown of a channel often has to be communicated with threads before it occurs. 
-In the \CFA version~\ref{l:cfa_chan_bar}, the barrier shutdown results in an exception being thrown at threads operating on it, which informs the threads that they must terminate. 
-This avoids the need to use a separate communication method other than the barrier, and avoids extra conditional checks on the fast path of the barrier implementation. 
+To highlight the differences between \CFA's and Go's close semantics, an example program is presented.
+The program is a barrier implemented using two channels shown in Listings~\ref{l:cfa_chan_bar} and \ref{l:go_chan_bar}.
+Both of these examples are implemented using \CFA syntax so that they can be easily compared.
+Listing~\ref{l:go_chan_bar} uses go-style channel close semantics and Listing~\ref{l:cfa_chan_bar} uses \CFA close semantics.
+In this problem it is infeasible to use the Go \code{close} call since all tasks are both potentially producers and consumers, causing panics on close to be unavoidable.
+As such in Listing~\ref{l:go_chan_bar} to implement a flush routine for the buffer, a sentinel value of $-1$ has to be used to indicate to threads that they need to leave the barrier.
+This sentinel value has to be checked at two points.
+Furthermore, an additional flag \code{done} is needed to communicate to threads once they have left the barrier that they are done.
+This use of an additional flag or communication method is common in Go channel shutdown code, since to avoid panics on a channel, the shutdown of a channel often has to be communicated with threads before it occurs.
+In the \CFA version~\ref{l:cfa_chan_bar}, the barrier shutdown results in an exception being thrown at threads operating on it, which informs the threads that they must terminate.
+This avoids the need to use a separate communication method other than the barrier, and avoids extra conditional checks on the fast path of the barrier implementation.
 Also note that in the Go version~\ref{l:go_chan_bar}, the size of the barrier channels has to be larger than in the \CFA version to ensure that the main thread does not block when attempting to clear the barrier.
 
-\begin{cfa}[tabsize=3,caption={\CFA channel barrier termination},label={l:cfa_chan_bar}]
+\begin{cfa}[caption={\CFA channel barrier termination},label={l:cfa_chan_bar}]
 struct barrier {
-    channel( int ) barWait;
-    channel( int ) entryWait;
-    int size;
+	channel( int ) barWait;
+	channel( int ) entryWait;
+	int size;
 }
 void ?{}(barrier & this, int size) with(this) {
-    barWait{size};
-    entryWait{size};
-    this.size = size;
-    for ( j; size )
-        insert( *entryWait, j );
+	barWait{size};
+	entryWait{size};
+	this.size = size;
+	for ( j; size )
+		insert( *entryWait, j );
 }
 
 void flush(barrier & this) with(this) {
-    close(barWait);
-    close(entryWait);
+	close(barWait);
+	close(entryWait);
 }
 void wait(barrier & this) with(this) {
-    int ticket = remove( *entryWait );
-    if ( ticket == size - 1 ) {
-        for ( j; size - 1 )
-            insert( *barWait, j );
-        return;
-    }
-    ticket = remove( *barWait );
-
-    // last one out
-    if ( size == 1 || ticket == size - 2 ) {
-        for ( j; size )
-            insert( *entryWait, j );
-    }
+	int ticket = remove( *entryWait );
+	if ( ticket == size - 1 ) {
+		for ( j; size - 1 )
+			insert( *barWait, j );
+		return;
+	}
+	ticket = remove( *barWait );
+
+	// last one out
+	if ( size == 1 || ticket == size - 2 ) {
+		for ( j; size )
+			insert( *entryWait, j );
+	}
 }
 barrier b{Tasks};
@@ -155,63 +162,63 @@
 // thread main
 void main(Task & this) {
-    try {
-        for ( ;; ) {
-            wait( b );
-        }
-    } catch ( channel_closed * e ) {}
+	try {
+		for ( ;; ) {
+			wait( b );
+		}
+	} catch ( channel_closed * e ) {}
 }
 
 int main() {
-    {
-        Task t[Tasks];
-
-        sleep(10`s);
-        flush( b );
-    } // wait for tasks to terminate
-    return 0;
+	{
+		Task t[Tasks];
+
+		sleep(10`s);
+		flush( b );
+	} // wait for tasks to terminate
+	return 0;
 }
 \end{cfa}
 
-\begin{cfa}[tabsize=3,caption={Go channel barrier termination},label={l:go_chan_bar}]
+\begin{cfa}[caption={Go channel barrier termination},label={l:go_chan_bar}]
 
 struct barrier {
-    channel( int ) barWait;
-    channel( int ) entryWait;
-    int size;
+	channel( int ) barWait;
+	channel( int ) entryWait;
+	int size;
 }
 void ?{}(barrier & this, int size) with(this) {
-    barWait{size + 1};
-    entryWait{size + 1};
-    this.size = size;
-    for ( j; size )
-        insert( *entryWait, j );
+	barWait{size + 1};
+	entryWait{size + 1};
+	this.size = size;
+	for ( j; size )
+		insert( *entryWait, j );
 }
 
 void flush(barrier & this) with(this) {
-    insert( *entryWait, -1 );
-    insert( *barWait, -1 );
+	insert( *entryWait, -1 );
+	insert( *barWait, -1 );
 }
 void wait(barrier & this) with(this) {
-    int ticket = remove( *entryWait );
-    if ( ticket == -1 ) {
-        insert( *entryWait, -1 );
-        return;
-    }
-    if ( ticket == size - 1 ) {
-        for ( j; size - 1 )
-            insert( *barWait, j );
-        return;
-    }
-    ticket = remove( *barWait );
-    if ( ticket == -1 ) {
-        insert( *barWait, -1 );
-        return;
-    }
-
-    // last one out
-    if ( size == 1 || ticket == size - 2 ) {
-        for ( j; size )
-            insert( *entryWait, j );
-    }
+	int ticket = remove( *entryWait );
+	if ( ticket == -1 ) {
+		insert( *entryWait, -1 );
+		return;
+	}
+	if ( ticket == size - 1 ) {
+		for ( j; size - 1 )
+			insert( *barWait, j );
+		return;
+	}
+	ticket = remove( *barWait );
+	if ( ticket == -1 ) {
+		insert( *barWait, -1 );
+		return;
+	}
+
+	// last one out
+	if ( size == 1 || ticket == size - 2 ) {
+		for ( j; size )
+			insert( *entryWait, j );
+	}
 }
 barrier b;
@@ -220,63 +227,63 @@
 // thread main
 void main(Task & this) {
-    for ( ;; ) {
-        if ( done ) break;
-        wait( b );
-    }
+	for ( ;; ) {
+		if ( done ) break;
+		wait( b );
+	}
 }
 
 int main() {
-    {
-        Task t[Tasks];
-
-        sleep(10`s);
-        done = true;
-
-        flush( b );
-    } // wait for tasks to terminate
-    return 0;
+	{
+		Task t[Tasks];
+
+		sleep(10`s);
+		done = true;
+
+		flush( b );
+	} // wait for tasks to terminate
+	return 0;
 }
 \end{cfa}
 
-In Listing~\ref{l:cfa_resume} an example of channel closing with resumption is used. 
-This program uses resumption in the \code{Consumer} thread main to ensure that all elements in the channel are removed before the consumer thread terminates. 
-The producer only has a \code{catch} so the moment it receives an exception it terminates, whereas the consumer will continue to remove from the closed channel via handling resumptions until the buffer is empty, which then throws a termination exception. 
+In Listing~\ref{l:cfa_resume} an example of channel closing with resumption is used.
+This program uses resumption in the \code{Consumer} thread main to ensure that all elements in the channel are removed before the consumer thread terminates.
+The producer only has a \code{catch} so the moment it receives an exception it terminates, whereas the consumer will continue to remove from the closed channel via handling resumptions until the buffer is empty, which then throws a termination exception.
 If the same program was implemented in Go it would require explicit synchronization with both producers and consumers by some mechanism outside the channel to ensure that all elements were removed before task termination.
 
-\begin{cfa}[tabsize=3,caption={\CFA channel resumption usage},label={l:cfa_resume}]
+\begin{cfa}[caption={\CFA channel resumption usage},label={l:cfa_resume}]
 channel( int ) chan{ 128 };
 
 // Consumer thread main
 void main(Consumer & this) {
-    size_t runs = 0;
-    try {
-        for ( ;; ) {
-            remove( chan );
-        }
-    } catchResume ( channel_closed * e ) {}
-    catch ( channel_closed * e ) {} 
+	size_t runs = 0;
+	try {
+		for ( ;; ) {
+			remove( chan );
+		}
+	} catchResume ( channel_closed * e ) {}
+	catch ( channel_closed * e ) {}
 }
 
 // Producer thread main
 void main(Producer & this) {
-    int j = 0;
-    try {
-        for ( ;;j++ ) {
-            insert( chan, j );
-        }
-    } catch ( channel_closed * e ) {} 
+	int j = 0;
+	try {
+		for ( ;;j++ ) {
+			insert( chan, j );
+		}
+	} catch ( channel_closed * e ) {}
 }
 
 int main( int argc, char * argv[] ) {
-    {
-        Consumers c[4];
-        Producer p[4];
-
-        sleep(10`s);
-
-        for ( i; Channels )
-            close( channels[i] );
-    }
-    return 0;
+	{
+		Consumers c[4];
+		Producer p[4];
+
+		sleep(10`s);
+
+		for ( i; Channels )
+			close( channels[i] );
+	}
+	return 0;
 }
 \end{cfa}
@@ -284,27 +291,29 @@
 \section{Performance}
 
-Given that the base implementation of the \CFA channels is very similar to the Go implementation, this section aims to show that the performance of the two implementations are comparable. 
-One microbenchmark is conducted to compare Go and \CFA. 
-The benchmark is a ten second experiment where producers and consumers operate on a channel in parallel and throughput is measured. 
-The number of cores is varied to measure how throughtput scales. 
-The cores are divided equally between producers and consumers, with one producer or consumer owning each core. 
-The results of the benchmark are shown in Figure~\ref{f:chanPerf}. 
-The performance of Go and \CFA channels on this microbenchmark is comparable. 
+Given that the base implementation of the \CFA channels is very similar to the Go implementation, this section aims to show that the performance of the two implementations are comparable.
+One microbenchmark is conducted to compare Go and \CFA.
+The benchmark is a ten second experiment where producers and consumers operate on a channel in parallel and throughput is measured.
+The number of cores is varied to measure how throughput scales.
+The cores are divided equally between producers and consumers, with one producer or consumer owning each core.
+The results of the benchmark are shown in Figure~\ref{f:chanPerf}.
+The performance of Go and \CFA channels on this microbenchmark is comparable.
 Note, it is expected for the performance to decline as the number of cores increases as the channel operations all occur in a critical section so an increase in cores results in higher contention with no increase in parallelism.
 
 
 \begin{figure}
-    \centering
-    \begin{subfigure}{0.5\textwidth}
-        \centering
-        \scalebox{0.5}{\input{figures/nasus_Channel_Contention.pgf}}
-        \subcaption{AMD \CFA Channel Benchmark}\label{f:chanAMD}
-    \end{subfigure}\hfill
-    \begin{subfigure}{0.5\textwidth}
-        \centering
-        \scalebox{0.5}{\input{figures/pyke_Channel_Contention.pgf}}
-        \subcaption{Intel \CFA Channel Benchmark}\label{f:chanIntel}
-    \end{subfigure}
-    \caption{The channel contention benchmark comparing \CFA and Go channel throughput (higher is better).}
-    \label{f:chanPerf}
+	\centering
+	\subfloat[AMD \CFA Channel Benchmark]{
+		\resizebox{0.5\textwidth}{!}{\input{figures/nasus_Channel_Contention.pgf}}
+		\label{f:chanAMD}
+	}
+	\subfloat[Intel \CFA Channel Benchmark]{
+		\resizebox{0.5\textwidth}{!}{\input{figures/pyke_Channel_Contention.pgf}}
+		\label{f:chanIntel}
+	}
+	\caption{The channel contention benchmark comparing \CFA and Go channel throughput (higher is better).}
+	\label{f:chanPerf}
 \end{figure}
+
+% Local Variables: %
+% tab-width: 4 %
+% End: %
Index: doc/theses/colby_parsons_MMAth/text/mutex_stmt.tex
===================================================================
--- doc/theses/colby_parsons_MMAth/text/mutex_stmt.tex	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ doc/theses/colby_parsons_MMAth/text/mutex_stmt.tex	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -5,163 +5,415 @@
 % ======================================================================
 
-The mutex statement is a concurrent language feature that aims to support easy lock usage. 
-The mutex statement is in the form of a clause and following statement, similar to a loop or conditional statement. 
-In the clause the mutex statement accepts a number of lockable objects, and then locks them for the duration of the following statement. 
-The locks are acquired in a deadlock free manner and released using \gls{raii}. 
-The mutex statement provides an avenue for easy lock usage in the common case where locks are used to wrap a critical section. 
-Additionally, it provides the safety guarantee of deadlock-freedom, both by acquiring the locks in a deadlock-free manner, and by ensuring that the locks release on error, or normal program execution via \gls{raii}.
-
-\begin{cfa}[tabsize=3,caption={\CFA mutex statement usage},label={l:cfa_mutex_ex}]
+The mutual exclusion problem was introduced by Dijkstra in 1965~\cite{Dijkstra65,Dijkstra65a}.
+There are several concurrent processes or threads that communicate by shared variables and from time to time need exclusive access to shared resources.
+A shared resource and code manipulating it form a pairing called a \Newterm{critical section (CS)}, which is a many-to-one relationship;
+\eg if multiple files are being written to by multiple threads, only the pairings of simultaneous writes to the same files are CSs.
+Regions of code where the thread is not interested in the resource are combined into the \Newterm{non-critical section (NCS)}.
+
+Exclusive access to a resource is provided by \Newterm{mutual exclusion (MX)}.
+MX is implemented by some form of \emph{lock}, where the CS is bracketed by lock procedures @acquire@ and @release@.
+Threads execute a loop of the form:
+\begin{cfa}
+loop of $thread$ p:
+	NCS;
+	acquire( lock );  CS;  release( lock ); // protected critical section with MX
+end loop.
+\end{cfa}
+MX guarantees there is never more than one thread in the CS.
+MX must also guarantee eventual progress: when there are competing threads attempting access, eventually some competing thread succeeds, \ie acquires the CS, releases it, and returns to the NCS.
+% Lamport \cite[p.~329]{Lam86mx} extends this requirement to the exit protocol.
+A stronger constraint is that every thread that calls @acquire@ eventually succeeds after some reasonable bounded time.
+
+\section{Monitor}
+\CFA provides a high-level locking object, called a \Newterm{monitor}, an elegant, efficient, high-level mechanisms for mutual exclusion and synchronization for shared-memory systems.
+First proposed by Brinch Hansen~\cite{Hansen73} and later described and extended by C.A.R.~Hoare~\cite{Hoare74}, several concurrent programming languages provide monitors as an explicit language construct: \eg Concurrent Pascal~\cite{ConcurrentPascal}, Mesa~\cite{Mesa}, Turing~\cite{Turing:old}, Modula-3~\cite{Modula-3}, \uC~\cite{Buhr92a} and Java~\cite{Java}.
+In addition, operating-system kernels and device drivers have a monitor-like structure, although they often use lower-level primitives such as mutex locks or semaphores to manually implement a monitor.
+
+Figure~\ref{f:AtomicCounter} shows a \CFA and Java monitor implementing an atomic counter.
+A \Newterm{monitor} is a programming technique that implicitly binds mutual exclusion to static function scope by call and return.
+Lock mutual exclusion, defined by acquire/release calls, is independent of lexical context (analogous to block versus heap storage allocation).
+Restricting acquire and release points in a monitor eases programming, comprehension, and maintenance, at a slight cost in flexibility and efficiency.
+Ultimately, a monitor is implemented using a combination of basic locks and atomic instructions.
+
+\begin{figure}
+\centering
+
+\begin{lrbox}{\myboxA}
+\begin{cfa}[aboveskip=0pt,belowskip=0pt]
+@monitor@ Aint {
+	int cnt;
+};
+int ++?( Aint & @mutex@ m ) { return ++m.cnt; }
+int ?=?( Aint & @mutex@ l, int r ) { l.cnt = r; }
+int ?=?(int & l, Aint & r) { l = r.cnt; }
+
+int i = 0, j = 0;
+Aint x = { 0 }, y = { 0 };	$\C[1.5in]{// no mutex}$
+++x;  ++y;			$\C{// mutex}$
+x = 2;  y = i;		$\C{// mutex}$
+i = x;  j = y;		$\C{// no mutex}\CRT$
+\end{cfa}
+\end{lrbox}
+
+\begin{lrbox}{\myboxB}
+\begin{java}[aboveskip=0pt,belowskip=0pt]
+class Aint {
+	private int cnt;
+	public Aint( int init ) { cnt = init; }
+	@synchronized@ public int inc() { return ++cnt; }
+	@synchronized@ public void set( int r ) {cnt = r;}
+	public int get() { return cnt; }
+}
+int i = 0, j = 0;
+Aint x = new Aint( 0 ), y = new Aint( 0 );
+x.inc();  y.inc();
+x.set( 2 );  y.set( i );
+i = x.get();  j = y.get();
+\end{java}
+\end{lrbox}
+
+\subfloat[\CFA]{\label{f:AtomicCounterCFA}\usebox\myboxA}
+\hspace*{3pt}
+\vrule
+\hspace*{3pt}
+\subfloat[Java]{\label{f:AtomicCounterJava}\usebox\myboxB}
+\caption{Atomic integer counter}
+\label{f:AtomicCounter}
+\end{figure}
+
+Like Java, \CFA monitors have \Newterm{multi-acquire} semantics so the thread in the monitor may acquire it multiple times without deadlock, allowing recursion and calling other MX functions.
+For robustness, \CFA monitors ensure the monitor lock is released regardless of how an acquiring function ends, normal or exceptional, and returning a shared variable is safe via copying before the lock is released.
+Monitor objects can be passed through multiple helper functions without acquiring mutual exclusion, until a designated function associated with the object is called.
+\CFA functions are designated MX by one or more pointer/reference parameters having qualifier @mutex@.
+Java members are designated MX with \lstinline[language=java]{synchronized}, which applies only to the implicit receiver parameter.
+In the example, the increment and setter operations need mutual exclusion, while the read-only getter operation is not MX because reading an integer is atomic.
+
+As stated, the non-object-oriented nature of \CFA monitors allows a function to acquire multiple mutex objects.
+For example, the bank-transfer problem requires locking two bank accounts to safely debit and credit money between accounts.
+\begin{cfa}
+monitor BankAccount {
+	int balance;
+};
+void deposit( BankAccount & mutex b, int deposit ) with( b ) {
+	balance += deposit;
+}
+void transfer( BankAccount & mutex my, BankAccount & mutex your, int me2you ) {
+	deposit( my, -me2you );		$\C{// debit}$
+	deposit( your, me2you );	$\C{// credit}$
+}
+\end{cfa}
+The \CFA monitor implementation ensures multi-lock acquisition is done in a deadlock-free manner regardless of the number of MX parameters and monitor arguments.
+
+
+\section{\lstinline{mutex} statement}
+Restricting implicit lock acquisition to function entry and exit can be awkward for certain problems.
+To increase locking flexibility, some languages introduce a mutex statement.
+\VRef[Figure]{f:ReadersWriter} shows the outline of a reader/writer lock written as a \CFA monitor and mutex statements.
+(The exact lock implement is irrelevant.)
+The @read@ and @write@ functions are called with a reader/write lock and any arguments to perform reading or writing.
+The @read@ function is not MX because multiple readers can read simultaneously.
+MX is acquired within @read@ by calling the (nested) helper functions @StartRead@ and @EndRead@ or executing the mutex statements.
+Between the calls or statements, reads can execute simultaneous within the body of @read@.
+The @write@ function does not require refactoring because writing is a CS.
+The mutex-statement version is better because it has fewer names, less argument/parameter passing, and can possibly hold MX for a shorter duration.
+
+\begin{figure}
+\centering
+
+\begin{lrbox}{\myboxA}
+\begin{cfa}[aboveskip=0pt,belowskip=0pt]
+monitor RWlock { ... };
+void read( RWlock & rw, ... ) {
+	void StartRead( RWlock & @mutex@ rw ) { ... }
+	void EndRead( RWlock & @mutex@ rw ) { ... }
+	StartRead( rw );
+	... // read without MX
+	EndRead( rw );
+}
+void write( RWlock & @mutex@ rw, ... ) {
+	... // write with MX
+}
+\end{cfa}
+\end{lrbox}
+
+\begin{lrbox}{\myboxB}
+\begin{cfa}[aboveskip=0pt,belowskip=0pt]
+
+void read( RWlock & rw, ... ) {
+
+
+	@mutex@( rw ) { ... }
+	... // read without MX
+	@mutex@{ rw ) { ... }
+}
+void write( RWlock & @mutex@ rw, ... ) {
+	... // write with MX
+}
+\end{cfa}
+\end{lrbox}
+
+\subfloat[monitor]{\label{f:RWmonitor}\usebox\myboxA}
+\hspace*{3pt}
+\vrule
+\hspace*{3pt}
+\subfloat[mutex statement]{\label{f:RWmutexstmt}\usebox\myboxB}
+\caption{Readers writer problem}
+\label{f:ReadersWriter}
+\end{figure}
+
+This work adds a mutex statement to \CFA, but generalizes it beyond implicit monitor locks.
+In detail, the mutex statement has a clause and statement block, similar to a conditional or loop statement.
+The clause accepts any number of lockable objects (like a \CFA MX function prototype), and locks them for the duration of the statement.
+The locks are acquired in a deadlock free manner and released regardless of how control-flow exits the statement.
+The mutex statement provides easy lock usage in the common case of lexically wrapping a CS.
+Examples of \CFA mutex statement are shown in \VRef[Listing]{l:cfa_mutex_ex}.
+
+\begin{cfa}[caption={\CFA mutex statement usage},label={l:cfa_mutex_ex}]
 owner_lock lock1, lock2, lock3;
-int count = 0; 
-mutex( lock1, lock2, lock3 ) {
-    // can use block statement
-    // ...
-}
-mutex( lock2, lock3 ) count++; // or inline statement
+@mutex@( lock2, lock3 ) ...;    $\C{// inline statement}$
+@mutex@( lock1, lock2, lock3 ) { ... }  $\C{// statement block}$
+void transfer( BankAccount & my, BankAccount & your, int me2you ) {
+	... // check values, no MX
+	@mutex@( my, your ) { // MX is shorter duration that function body
+		deposit( my, -me2you );  $\C{// debit}$
+		deposit( your, me2you ); $\C{// credit}$
+	}
+}
 \end{cfa}
 
 \section{Other Languages}
-There are similar concepts to the mutex statement that exist in other languages. 
-Java has a feature called a synchronized statement, which looks identical to \CFA's mutex statement, but it has some differences. 
-The synchronized statement only accepts a single object in its clause. 
-Any object can be passed to the synchronized statement in Java since all objects in Java are monitors, and the synchronized statement acquires that object's monitor. 
-In \CC there is a feature in the standard library \code{<mutex>} header called scoped\_lock, which is also similar to the mutex statement. 
-The scoped\_lock is a class that takes in any number of locks in its constructor, and acquires them in a deadlock-free manner. 
-It then releases them when the scoped\_lock object is deallocated, thus using \gls{raii}. 
-An example of \CC scoped\_lock usage is shown in Listing~\ref{l:cc_scoped_lock}.
-
-\begin{cfa}[tabsize=3,caption={\CC scoped\_lock usage},label={l:cc_scoped_lock}]
-std::mutex lock1, lock2, lock3;
-{
-    scoped_lock s( lock1, lock2, lock3 )
-    // locks are released via raii at end of scope
-}
+There are similar constructs to the mutex statement in other programming languages.
+Java has a feature called a synchronized statement, which looks like the \CFA's mutex statement, but only accepts a single object in the clause and only handles monitor locks.
+The \CC standard library has a @scoped_lock@, which is also similar to the mutex statement.
+The @scoped_lock@ takes any number of locks in its constructor, and acquires them in a deadlock-free manner.
+It then releases them when the @scoped_lock@ object is deallocated using \gls{raii}.
+An example of \CC @scoped_lock@ is shown in \VRef[Listing]{l:cc_scoped_lock}.
+
+\begin{cfa}[caption={\CC \lstinline{scoped_lock} usage},label={l:cc_scoped_lock}]
+struct BankAccount {
+	@recursive_mutex m;@		$\C{// must be recursive}$
+	int balance = 0;
+};
+void deposit( BankAccount & b, int deposit ) {
+	@scoped_lock lock( b.m );@	$\C{// RAII acquire}$
+	b.balance += deposit;
+}								$\C{// RAII release}$
+void transfer( BankAccount & my, BankAccount & your, int me2you ) {
+	@scoped_lock lock( my.m, your.m );@	$\C{// RAII acquire}$
+	deposit( my, -me2you );		$\C{// debit}$
+	deposit( your, me2you );	$\C{// credit}$
+}								$\C{// RAII release}$
 \end{cfa}
 
 \section{\CFA implementation}
-The \CFA mutex statement takes some ideas from both the Java and \CC features. 
-The mutex statement can acquire more that one lock in a deadlock-free manner, and releases them via \gls{raii} like \CC, however the syntax is identical to the Java synchronized statement. 
-This syntactic choice was made so that the body of the mutex statement is its own scope. 
-Compared to the scoped\_lock, which relies on its enclosing scope, the mutex statement's introduced scope can provide visual clarity as to what code is being protected by the mutex statement, and where the mutual exclusion ends. 
-\CFA's mutex statement and \CC's scoped\_lock both use parametric polymorphism to allow user defined types to work with the feature. 
-\CFA's implementation requires types to support the routines \code{lock()} and \code{unlock()}, whereas \CC requires those routines, plus \code{try_lock()}. 
-The scoped\_lock requires an additional routine since it differs from the mutex statement in how it implements deadlock avoidance.
-
-The parametric polymorphism allows for locking to be defined for types that may want convenient mutual exclusion. 
-An example of one such use case in \CFA is \code{sout}. 
-The output stream in \CFA is called \code{sout}, and functions similarly to \CC's \code{cout}. 
-\code{sout} has routines that satisfy the mutex statement trait, so the mutex statement can be used to lock the output stream while producing output. 
-In this case, the mutex statement allows the programmer to acquire mutual exclusion over an object without having to know the internals of the object or what locks need to be acquired. 
-The ability to do so provides both improves safety and programmer productivity since it abstracts away the concurrent details and provides an interface for optional thread-safety. 
-This is a commonly used feature when producing output from a concurrent context, since producing output is not thread safe by default. 
-This use case is shown in Listing~\ref{l:sout}.
-
-\begin{cfa}[tabsize=3,caption={\CFA sout with mutex statement},label={l:sout}]
-mutex( sout )
-    sout | "This output is protected by mutual exclusion!"; 
-\end{cfa}
-
-\section{Deadlock Avoidance}
-The mutex statement uses the deadlock prevention technique of lock ordering, where the circular-wait condition of a deadlock cannot occur if all locks are acquired in the same order. 
-The scoped\_lock uses a deadlock avoidance algorithm where all locks after the first are acquired using \code{try_lock} and if any of the attempts to lock fails, all locks so far are released. 
-This repeats until all locks are acquired successfully. 
-The deadlock avoidance algorithm used by scoped\_lock is shown in Listing~\ref{l:cc_deadlock_avoid}. 
-The algorithm presented is taken directly from the source code of the \code{<mutex>} header, with some renaming and comments for clarity.
-
-\begin{cfa}[caption={\CC scoped\_lock deadlock avoidance algorithm},label={l:cc_deadlock_avoid}]
+The \CFA mutex statement takes some ideas from both the Java and \CC features.
+Like Java, \CFA introduces a new statement rather than building from existing language features.
+(\CFA has sufficient language features to mimic \CC RAII locking.)
+This syntactic choice makes MX explicit rather than implicit via object declarations.
+Hence, it is easier for programmers and language tools to identify MX points in a program, \eg scan for all @mutex@ parameters and statements in a body of code.
+Furthermore, concurrent safety is provided across an entire program for the complex operation of acquiring multiple locks in a deadlock-free manner.
+Unlike Java, \CFA's mutex statement and \CC's @scoped_lock@ both use parametric polymorphism to allow user defined types to work with this feature.
+In this case, the polymorphism allows a locking mechanism to acquire MX over an object without having to know the object internals or what kind of lock it is using.
+\CFA's provides and uses this locking trait:
+\begin{cfa}
+forall( L & | sized(L) )
+trait is_lock {
+	void lock( L & );
+	void unlock( L & );
+};
+\end{cfa}
+\CC @scoped_lock@ has this trait implicitly based on functions accessed in a template.
+@scoped_lock@ also requires @try_lock@ because of its technique for deadlock avoidance \see{\VRef{s:DeadlockAvoidance}}.
+
+The following shows how the @mutex@ statement is used with \CFA streams to eliminate unpredictable results when printing in a concurrent program.
+For example, if two threads execute:
+\begin{cfa}
+thread$\(_1\)$ : sout | "abc" | "def";
+thread$\(_2\)$ : sout | "uvw" | "xyz";
+\end{cfa}
+any of the outputs can appear, included a segment fault due to I/O buffer corruption:
+\begin{cquote}
+\small\tt
+\begin{tabular}{@{}l|l|l|l|l@{}}
+abc def & abc uvw xyz & uvw abc xyz def & abuvwc dexf &  uvw abc def \\
+uvw xyz & def & & yz & xyz
+\end{tabular}
+\end{cquote}
+The stream type for @sout@ is defined to satisfy the @is_lock@ trait, so the @mutex@ statement can be used to lock an output stream while producing output.
+From the programmer's perspective, it is sufficient to know an object can be locked and then any necessary MX is easily available via the @mutex@ statement.
+This ability improves safety and programmer productivity since it abstracts away the concurrent details.
+Hence, a  programmer can easily protect cascaded I/O expressions:
+\begin{cfa}
+thread$\(_1\)$ : mutex( sout )  sout | "abc" | "def";
+thread$\(_2\)$ : mutex( sout )  sout | "uvw" | "xyz";
+\end{cfa}
+constraining the output to two different lines in either order:
+\begin{cquote}
+\small\tt
+\begin{tabular}{@{}l|l@{}}
+abc def & uvw xyz \\
+uvw xyz & abc def
+\end{tabular}
+\end{cquote}
+where this level of safe nondeterministic output is acceptable.
+Alternatively, multiple I/O statements can be protected using the mutex statement block:
+\begin{cfa}
+mutex( sout ) {	// acquire stream lock for sout for block duration
+	sout | "abc";
+	mutex( sout ) sout | "uvw" | "xyz"; // OK because sout lock is recursive
+	sout | "def";
+} // implicitly release sout lock
+\end{cfa}
+The inner lock acquire is likely to occur through a function call that does a thread-safe print.
+
+\section{Deadlock Avoidance}\label{s:DeadlockAvoidance}
+The mutex statement uses the deadlock avoidance technique of lock ordering, where the circular-wait condition of a deadlock cannot occur if all locks are acquired in the same order.
+The @scoped_lock@ uses a deadlock avoidance algorithm where all locks after the first are acquired using @try_lock@ and if any of the lock attempts fail, all acquired locks are released.
+This repeats after selecting a new starting point in a cyclic manner until all locks are acquired successfully.
+This deadlock avoidance algorithm is shown in Listing~\ref{l:cc_deadlock_avoid}.
+The algorithm is taken directly from the source code of the @<mutex>@ header, with some renaming and comments for clarity.
+
+\begin{cfa}[caption={\CC \lstinline{scoped_lock} deadlock avoidance algorithm},label={l:cc_deadlock_avoid}]
 int first = 0;  // first lock to attempt to lock
 do {
-    // locks is the array of locks to acquire
-    locks[first].lock();    // lock first lock
-    for (int i = 1; i < Num_Locks; ++i) {   // iterate over rest of locks
-        const int idx = (first + i) % Num_Locks;
-        if (!locks[idx].try_lock()) {       // try lock each one
-            for (int j = i; j != 0; --j)    // release all locks
-                locks[(first + j - 1) % Num_Locks].unlock();
-            first = idx;    // rotate which lock to acquire first
-            break;
-        }
-    }
+	// locks is the array of locks to acquire
+	locks[first].lock();				$\C{// lock first lock}$
+	for ( int i = 1; i < Num_Locks; i += 1 ) { $\C{// iterate over rest of locks}$
+		const int idx = (first + i) % Num_Locks;
+		if ( ! locks[idx].try_lock() ) {   $\C{// try lock each one}$
+			for ( int j = i; j != 0; j -= 1 )	$\C{// release all locks}$
+				locks[(first + j - 1) % Num_Locks].unlock();
+			first = idx;				$\C{// rotate which lock to acquire first}$
+			break;
+		}
+	}
 // if first lock is still held then all have been acquired
-} while (!locks[first].owns_lock());  // is first lock held?
-\end{cfa}
-
-The algorithm in \ref{l:cc_deadlock_avoid} successfully avoids deadlock, however there is a potential livelock scenario. 
-Given two threads $A$ and $B$, who create a scoped\_lock with two locks $L1$ and $L2$, a livelock can form as follows. 
-Thread $A$ creates a scoped\_lock with $L1$, $L2$, and $B$ creates a scoped lock with the order $L2$, $L1$. 
-Both threads acquire the first lock in their order and then fail the try\_lock since the other lock is held. 
-They then reset their start lock to be their 2nd lock and try again. 
-This time $A$ has order $L2$, $L1$, and $B$ has order $L1$, $L2$. 
-This is identical to the starting setup, but with the ordering swapped among threads. 
-As such, if they each acquire their first lock before the other acquires their second, they can livelock indefinitely.
-
-The lock ordering algorithm used in the mutex statement in \CFA is both deadlock and livelock free. 
-It sorts the locks based on memory address and then acquires them. 
-For locks fewer than 7, it sorts using hard coded sorting methods that perform the minimum number of swaps for a given number of locks. 
-For 7 or more locks insertion sort is used. 
-These sorting algorithms were chosen since it is rare to have to hold more than  a handful of locks at a time. 
-It is worth mentioning that the downside to the sorting approach is that it is not fully compatible with usages of the same locks outside the mutex statement. 
-If more than one lock is held by a mutex statement, if more than one lock is to be held elsewhere, it must be acquired via the mutex statement, or else the required ordering will not occur. 
-Comparitively, if the scoped\_lock is used and the same locks are acquired elsewhere, there is no concern of the scoped\_lock deadlocking, due to its avoidance scheme, but it may livelock.
+} while ( ! locks[first].owns_lock() );  $\C{// is first lock held?}$
+\end{cfa}
+
+While the algorithm in \ref{l:cc_deadlock_avoid} successfully avoids deadlock, there is a livelock scenario.
+Assume two threads, $A$ and $B$, create a @scoped_lock@ accessing two locks, $L1$ and $L2$.
+A livelock can form as follows.
+Thread $A$ creates a @scoped_lock@ with arguments $L1$, $L2$, and $B$ creates a scoped lock with the lock arguments in the opposite order $L2$, $L1$.
+Both threads acquire the first lock in their order and then fail the @try_lock@ since the other lock is held.
+Both threads then reset their starting lock to be their second lock and try again.
+This time $A$ has order $L2$, $L1$, and $B$ has order $L1$, $L2$, which is identical to the starting setup but with the ordering swapped between threads.
+If the threads perform this action in lock-step, they cycle indefinitely without entering the CS, \ie livelock.
+Hence, to use @scoped_lock@ safely, a programmer must manually construct and maintain a global ordering of lock arguments passed to @scoped_lock@.
+
+The lock ordering algorithm used in \CFA mutex functions and statements is deadlock and livelock free.
+The algorithm uses the lock memory addresses as keys, sorts the keys, and then acquires the locks in sorted order.
+For fewer than 7 locks ($2^3-1$), the sort is unrolled performing the minimum number of compare and swaps for the given number of locks;
+for 7 or more locks, insertion sort is used.
+Since it is extremely rare to hold more than 6 locks at a time, the algorithm is fast and executes in $O(1)$ time.
+Furthermore, lock addresses are unique across program execution, even for dynamically allocated locks, so the algorithm is safe across the entire program execution.
+
+The downside to the sorting approach is that it is not fully compatible with manual usages of the same locks outside the @mutex@ statement, \ie the lock are acquired without using the @mutex@ statement.
+The following scenario is a classic deadlock.
+\begin{cquote}
+\begin{tabular}{@{}l@{\hspace{30pt}}l@{}}
+\begin{cfa}
+lock L1, L2; // assume &L1 < &L2
+        $\textbf{thread\(_1\)}$
+acquire( L2 );
+	acquire( L1 );
+		CS
+	release( L1 );
+release( L2 );
+\end{cfa}
+&
+\begin{cfa}
+
+        $\textbf{thread\(_2\)}$
+mutex( L1, L2 ) {
+
+	CS
+
+}
+\end{cfa}
+\end{tabular}
+\end{cquote}
+Comparatively, if the @scoped_lock@ is used and the same locks are acquired elsewhere, there is no concern of the @scoped_lock@ deadlocking, due to its avoidance scheme, but it may livelock.
+The convenience and safety of the @mutex@ statement, \eg guaranteed lock release with exceptions, should encourage programmers to always use it for locking, mitigating any deadlock scenario.
+
+\section{Performance}
+Given the two multi-acquisition algorithms in \CC and \CFA, each with differing advantages and disadvantages, it interesting to compare their performance.
+Comparison with Java is not possible, since it only takes a single lock.
+
+The comparison starts with a baseline that acquires the locks directly without a mutex statement or @scoped_lock@ in a fixed ordering and then releases them.
+The baseline helps highlight the cost of the deadlock avoidance/prevention algorithms for each implementation.
+
+The benchmark used to evaluate the avoidance algorithms repeatedly acquires a fixed number of locks in a random order and then releases them.
+The pseudo code for the deadlock avoidance benchmark is shown in \VRef[Listing]{l:deadlock_avoid_pseudo}.
+To ensure the comparison exercises the implementation of each lock avoidance algorithm, an identical spinlock is implemented in each language using a set of builtin atomics available in both \CC and \CFA.
+The benchmarks are run for a fixed duration of 10 seconds and then terminate.
+The total number of times the group of locks is acquired is returned for each thread.
+Each variation is run 11 times on 2, 4, 8, 16, 24, 32 cores and with 2, 4, and 8 locks being acquired.
+The median is calculated and is plotted alongside the 95\% confidence intervals for each point.
+
+\begin{cfa}[caption={Deadlock avoidance bendchmark pseudo code},label={l:deadlock_avoid_pseudo}]
+
+
+
+$\PAB{// add pseudo code}$
+
+
+
+\end{cfa}
+
+The performance experiments were run on the following multi-core hardware systems to determine differences across platforms:
+\begin{list}{\arabic{enumi}.}{\usecounter{enumi}\topsep=5pt\parsep=5pt\itemsep=0pt}
+% sudo dmidecode -t system
+\item
+Supermicro AS--1123US--TR4 AMD EPYC 7662 64--core socket, hyper-threading $\times$ 2 sockets (256 processing units) 2.0 GHz, TSO memory model, running Linux v5.8.0--55--generic, gcc--10 compiler
+\item
+Supermicro SYS--6029U--TR4 Intel Xeon Gold 5220R 24--core socket, hyper-threading $\times$ 2 sockets (48 processing units) 2.2GHz, TSO memory model, running Linux v5.8.0--59--generic, gcc--10 compiler
+\end{list}
+%The hardware architectures are different in threading (multithreading vs hyper), cache structure (MESI or MESIF), NUMA layout (QPI vs HyperTransport), memory model (TSO vs WO), and energy/thermal mechanisms (turbo-boost).
+%Software that runs well on one architecture may run poorly or not at all on another.
+
+Figure~\ref{f:mutex_bench} shows the results of the benchmark experiments.
+\PAB{Make the points in the graphs for each line different.
+Also, make the text in the graphs larger.}
+The baseline results for both languages are mostly comparable, except for the 8 locks results in \ref{f:mutex_bench8_AMD} and \ref{f:mutex_bench8_Intel}, where the \CFA baseline is slightly slower.
+The avoidance result for both languages is significantly different, where \CFA's mutex statement achieves throughput that is magnitudes higher than \CC's @scoped_lock@.
+The slowdown for @scoped_lock@ is likely due to its deadlock-avoidance implementation.
+Since it uses a retry based mechanism, it can take a long time for threads to progress.
+Additionally the potential for livelock in the algorithm can result in very little throughput under high contention.
+For example, on the AMD machine with 32 threads and 8 locks, the benchmarks would occasionally livelock indefinitely, with no threads making any progress for 3 hours before the experiment was terminated manually.
+It is likely that shorter bouts of livelock occurred in many of the experiments, which would explain large confidence intervals for some of the data points in the \CC data.
+In Figures~\ref{f:mutex_bench8_AMD} and \ref{f:mutex_bench8_Intel} the mutex statement performs better than the baseline.
+At 7 locks and above the mutex statement switches from a hard coded sort to insertion sort.
+It is likely that the improvement in throughput compared to baseline is due to the time spent in the insertion sort, which decreases contention on the locks.
 
 \begin{figure}
-    \centering
-    \begin{subfigure}{0.5\textwidth}
-        \centering
-        \scalebox{0.5}{\input{figures/nasus_Aggregate_Lock_2.pgf}}
-        \subcaption{AMD}
-    \end{subfigure}\hfill
-    \begin{subfigure}{0.5\textwidth}
-        \centering
-        \scalebox{0.5}{\input{figures/pyke_Aggregate_Lock_2.pgf}}
-        \subcaption{Intel}
-    \end{subfigure}
-
-    \begin{subfigure}{0.5\textwidth}
-        \centering
-        \scalebox{0.5}{\input{figures/nasus_Aggregate_Lock_4.pgf}}
-        \subcaption{AMD}
-    \end{subfigure}\hfill
-    \begin{subfigure}{0.5\textwidth}
-        \centering
-        \scalebox{0.5}{\input{figures/pyke_Aggregate_Lock_4.pgf}}
-        \subcaption{Intel}
-    \end{subfigure}
-
-    \begin{subfigure}{0.5\textwidth}
-        \centering
-        \scalebox{0.5}{\input{figures/nasus_Aggregate_Lock_8.pgf}}
-        \subcaption{AMD}\label{f:mutex_bench8_AMD}
-    \end{subfigure}\hfill
-    \begin{subfigure}{0.5\textwidth}
-        \centering
-        \scalebox{0.5}{\input{figures/pyke_Aggregate_Lock_8.pgf}}
-        \subcaption{Intel}\label{f:mutex_bench8_Intel}
-    \end{subfigure}
-    \caption{The aggregate lock benchmark comparing \CC scoped\_lock and \CFA mutex statement throughput (higher is better).}
-    \label{f:mutex_bench}
+	\centering
+	\subfloat[AMD]{
+		\resizebox{0.5\textwidth}{!}{\input{figures/nasus_Aggregate_Lock_2.pgf}}
+	}
+	\subfloat[Intel]{
+		\resizebox{0.5\textwidth}{!}{\input{figures/pyke_Aggregate_Lock_2.pgf}}
+	}
+
+	\subfloat[AMD]{
+		\resizebox{0.5\textwidth}{!}{\input{figures/nasus_Aggregate_Lock_4.pgf}}
+	}
+	\subfloat[Intel]{
+		\resizebox{0.5\textwidth}{!}{\input{figures/pyke_Aggregate_Lock_4.pgf}}
+	}
+
+	\subfloat[AMD]{
+		\resizebox{0.5\textwidth}{!}{\input{figures/nasus_Aggregate_Lock_8.pgf}}
+		\label{f:mutex_bench8_AMD}
+	}
+	\subfloat[Intel]{
+		\resizebox{0.5\textwidth}{!}{\input{figures/pyke_Aggregate_Lock_8.pgf}}
+		\label{f:mutex_bench8_Intel}
+	}
+	\caption{The aggregate lock benchmark comparing \CC \lstinline{scoped_lock} and \CFA mutex statement throughput (higher is better).}
+	\label{f:mutex_bench}
 \end{figure}
 
-\section{Performance}
-Performance is compared between \CC's scoped\_lock and \CFA's mutex statement. 
-Comparison with Java is omitted, since it only takes a single lock. 
-To ensure that the comparison between \CC and \CFA exercises the implementation of each feature, an identical spinlock is implemented in each language using a set of builtin atomics available in both \CFA and \CC. 
-Each feature is evaluated on a benchmark which acquires a fixed number of locks in a random order and then releases them. 
-A baseline is included that acquires the locks directly without a mutex statement or scoped\_lock in a fixed ordering and then releases them. 
-The baseline helps highlight the cost of the deadlock avoidance/prevention algorithms for each implementation. 
-The benchmarks are run for a fixed duration of 10 seconds and then terminate and return the total number of times the group of locks were acquired. 
-Each variation is run 11 times on a variety up to 32 cores and with 2, 4, and 8 locks being acquired. 
-The median is calculated and is plotted alongside the 95\% confidence intervals for each point.
-
-Figure~\ref{f:mutex_bench} shows the results of the benchmark. 
-The baseline runs for both languages are mostly comparable, except for the 8 locks results in \ref{f:mutex_bench8_AMD} and \ref{f:mutex_bench8_Intel}, where the \CFA baseline is slower. 
-\CFA's mutex statement achieves throughput that is magnitudes higher than \CC's scoped\_lock. 
-This is likely due to the scoped\_lock deadlock avoidance implementation. 
-Since it uses a retry based mechanism, it can take a long time for threads to progress. 
-Additionally the potential for livelock in the algorithm can result in very little throughput under high contention. 
-It was observed on the AMD machine that with 32 threads and 8 locks the benchmarks would occasionally livelock indefinitely, with no threads making any progress for 3 hours before the experiment was terminated manually. 
-It is likely that shorter bouts of livelock occured in many of the experiments, which would explain large confidence intervals for some of the data points in the \CC data. 
-In Figures~\ref{f:mutex_bench8_AMD} and \ref{f:mutex_bench8_Intel} the mutex statement performs better than the baseline. 
-At 7 locks and above the mutex statement switches from a hard coded sort to insertion sort. 
-It is likely that the improvement in throughput compared to baseline is due to the time spent in the insertion sort, which decreases contention on the locks.
+% Local Variables: %
+% tab-width: 4 %
+% End: %
Index: doc/theses/colby_parsons_MMAth/thesis.tex
===================================================================
--- doc/theses/colby_parsons_MMAth/thesis.tex	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ doc/theses/colby_parsons_MMAth/thesis.tex	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -84,9 +84,10 @@
 \usepackage{tikz} % for diagrams and figures
 \def\checkmark{\tikz\fill[scale=0.4](0,.35) -- (.25,0) -- (1,.7) -- (.25,.15) -- cycle;}
-\usepackage{subcaption}
 \usepackage{fullpage,times,comment}
 \usepackage{textcomp}
 \usepackage{graphicx}
 \usepackage{tabularx}
+\usepackage[labelformat=simple,aboveskip=0pt,farskip=0pt,font=normalsize]{subfig}
+\renewcommand\thesubfigure{(\alph{subfigure})}
 \input{style}
 
Index: doc/theses/mike_brooks_MMath/benchmarks/list/Makefile
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/Makefile	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/Makefile	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -1,10 +1,12 @@
 # For correctness, see test-correctness.sh.
 # For performance:
-#	pushd ~/cfax
-#	~/setcfa build-fast
-# 	popd
-#	make perfprogs CFA=$cfa -j8 MODE=performance
-# 	make results-latest.csv RUNARGS=5 RUN_NUM_REPS=5
-
+# pushd ~/cfax
+# . ~/setcfa build-fast
+# popd
+# make perfprogs CFA=$cfa -j8 MODE=performance
+# make results-latest.csv RUN_DURATION_SEC=5 RUN_NUM_REPS=5 RUN_DATA_SIZE_MODE=common5
+# cp results-latest.csv results-baseline.csv
+# make results-latest.csv OP_MOVEMENTS=stack OP_POLARITIES=insfirst OP_ACCESSORS=allhead RUN_DURATION_SEC=5 RUN_NUM_REPS=5 RUN_DATA_SIZE_MODE=thorough
+# cp results-latest.csv results-sizing.csv
 
 CFA = cfa
@@ -12,13 +14,17 @@
 UXX =  ~/u++/u++-7.0.0/bin/u++
 
-MODE = performance
-RUNARGS=
+MODE=performance
+EXTRA_COMP_FLAGS=
+RUN_NUM_REPS=3
+RUN_DATA_SIZE_MODE=none
+RUN_DURATION_SEC=5
+RUN_TASKSET_CPULIST=6
 
 ifeq "$(MODE)" "performance"
-PERFFLAGS_CFA = -nodebug -O3
+PERFFLAGS_CFA = -DNDEBUG -O3 -nodebug
 PERFFLAGS_CC  = -DNDEBUG -O3
 else ifeq "$(MODE)" "correctness"
-PERFFLAGS_CFA = -debug -O0 -g
-PERFFLAGS_CC = -O0 -g
+PERFFLAGS_CFA = -O0 -g -debug
+PERFFLAGS_CC  = -O0 -g
 else
 $(error Bad MODE ($(MODE)); should be performance or correctness)
@@ -26,5 +32,7 @@
 
 PERFFLAGS_CXX = $(PERFFLAGS_CC)
-PERFFLAGS_UXX = $(PERFFLAGS_CC)
+PERFFLAGS_UXX = $(PERFFLAGS_CFA)
+
+CFLAGS=$(PERFFLAGS_CC) $(EXTRA_COMP_FLAGS)
 
 SHELL = /usr/bin/bash
@@ -101,26 +109,108 @@
 perfexp--%     driver--%.o     : COMPILER=NO-COMPILER-FOR-$(FX_COARSE)
 
+# Without this %.d rule, ordinary make runs have noise about the recipe for driver--%.o being ill-formed when called on a *.d.
+# https://stackoverflow.com/questions/3714041/why-does-this-makefile-execute-a-target-on-make-clean
+# Whatever you -include gets called as a target first.
+# One such example is driver--upp-upp--stack-insfirst-allhead.d
+# Without this %.d rule, `make make driver--upp-upp--stack-insfirst-allhead.d` leads to the rule for driver--%.o firing.
+# Though my dumb human eyes don't see the pattern as matching.
+%.d:
+	@touch $@
+
 perfexp--% : driver--%.o observation.o
-	$(COMPILER) $^ -o $@
+	$(COMPILER) $(EXTRA_COMP_FLAGS) $^ -o $@
 
 driver--%.o : driver.c
-	$(COMPILER) -c $< $(OP_DEFINES) -include op-$(OP).h -include fx-$(FX).h -o $@ -MMD 
-
-
-
-
-RUN_NUM_REPS=3
+	$(COMPILER) $(EXTRA_COMP_FLAGS) -c $< $(OP_DEFINES) -include op-$(OP).h -include fx-$(FX).h -o $@ -MMD 
+
+sayhi:
+	echo $(PERFPROGS)
+
+
+ifeq "$(RUN_DATA_SIZE_MODE)" "common5"
+RUN_DATA_SIZES=\
+  7-1000000 \
+  71-100000 \
+  809-10000 \
+  9051-1000 \
+  72421-100
+else ifeq "$(RUN_DATA_SIZE_MODE)" "thorough"
+RUN_DATA_SIZES=\
+  7-1000000 \
+  11-100000 \
+  13-100000 \
+  19-100000 \
+  29-100000 \
+  37-100000 \
+  53-100000 \
+  71-100000 \
+  101-10000 \
+  149-10000 \
+  211-10000 \
+  283-10000 \
+  401-10000 \
+  569-10000 \
+  809-10000 \
+  1151-1000 \
+  1601-1000 \
+  2267-1000 \
+  3203-1000 \
+  4547-1000 \
+  6473-1000 \
+  9051-1000 \
+  12809-100 \
+  18119-100 \
+  25601-100 \
+  36209-100 \
+  51203-100 \
+  72421-100 \
+  102407-10 \
+  144817-10 \
+  204803-10 \
+  289637-10 \
+  409609-10 \
+  579263-10 \
+  819229-10 \
+  1158613-1 \
+  1638431-1 \
+  2317057-1 \
+  3276803-1 \
+  4634111-1 \
+  6553621-1 \
+  9268211-1
+else ifeq "$(RUN_DATA_SIZE_MODE)" "manual"
+ifeq "$(RUN_DATA_SIZES)" ""
+$(error RUN_DATA_SIZE_MODE is manual but RUN_DATA_SIZES not given)
+endif
+else ifeq "$(RUN_DATA_SIZE_MODE)" "none"
+# Assume user manages RUN_ARGS; empty RUN_ARGS just means run with compiled-in defaults
+RUN_DATA_SIZES=none
+else
+$(error Bad RUN_DATA_SIZE_MODE ($(RUN_DATA_SIZE_MODE)); should be common5, thorough or manual)
+endif
+
 RUN_REP_IDS=$(shell echo {1..$(RUN_NUM_REPS)})              # 1 2 3
 RUN_REP_EXTS=$(call cross3,,run,$(RUN_REP_IDS),.1csv)       # run1.1csv run2.1cav run3.1csv
 
-RESULT1S=$(call cross,.,$(CORES),$(RUN_REP_EXTS))   # lq-tailq--stack-inslast-allhead.run2.1csv
+RUN_LAUNCHES=$(call cross,--,$(RUN_DATA_SIZES),$(RUN_REP_EXTS))
+
+
+
+RESULT1S=$(call cross,.,$(CORES),$(RUN_LAUNCHES))   # lq-tailq--stack-inslast-allhead.run2.1csv
+
 
 RESULT1S_SHUFD=$(shell shuf -e $(RESULT1S))
 
 %.1csv : CORE=$(basename $(basename $@))
-%.1csv : REP_ID=$(subst .run,,$(suffix $(basename $@)))
+%.1csv : LAUNCH=$(subst .,,$(suffix $(basename $@)))
+%.1csv : SIZING=$(call proj,--,$(LAUNCH),1)
+%.1csv : NUMNODES=$(call proj,-,$(SIZING),1)
+%.1csv : CHECKDONE=$(call proj,-,$(SIZING),2)
+%.1csv : REP_ID=$(subst run,,$(call proj,--,$(LAUNCH),2))
+%.1csv : RUN_ARGS=$(if $(filter none,$(SIZING)),,$(RUN_DURATION_SEC) $(CHECKDONE) $(NUMNODES) -1 $(REP_ID))  # use REP_ID as seed
 %.1csv : REP_TIME=$(shell date '+%F %H:%M:%S')
 %.1csv : perfprogs FORCE
-	./perfexp--$(CORE) $(RUNARGS) | xargs -n 1 printf '%s,%s,%s\n' "$(REP_TIME)" "$(REP_ID)" | tee $@
+	taskset --cpu-list $(RUN_TASKSET_CPULIST) ./perfexp--$(CORE) $(RUN_ARGS) | xargs -n 1 printf '%s,%s,%s,%s\n' "$(REP_TIME)" "$(REP_ID)" "$(RUN_ARGS)" | tee $@
+
 
 BATCHTIME=$(shell date '+%F--%H-%M-%S')
@@ -146,4 +236,3 @@
 .PRECIOUS: result--%.1csv driver--%.o perfexp--% %.o
 
-
 -include *.d
Index: doc/theses/mike_brooks_MMath/benchmarks/list/_classic.c
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/_classic.c	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/_classic.c	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -171,6 +171,8 @@
 #endif
 
-
-#define Repeat( op ) for ( volatile unsigned int i = 0; i < NoOfNodes; i += 1 ) { op; }
+volatile unsigned int t = 0;
+volatile unsigned int i_official = 0;
+
+#define Repeat( op ) for ( unsigned int i = 0; (i_official = i, i < NoOfNodes); i += 1 ) { op; }
 
 int main() {
@@ -192,5 +194,5 @@
         TAILQ_INIT(&lst);
         start = clock();
-        for ( volatile unsigned int t = 0; t < Times; t += 1 ) {
+        for ( t = 0; t < Times; t += 1 ) {
                 Repeat( TAILQ_INSERT_TAIL( &lst, &s[i], x ) );
                 Repeat( TAILQ_REMOVE( &lst, TAILQ_FIRST( &lst ), x ) );
@@ -204,5 +206,5 @@
         std::list<S *> lst;
         start = clock();
-        for ( volatile unsigned int t = 0; t < Times; t += 1 ) {
+        for ( t = 0; t < Times; t += 1 ) {
                 Repeat( lst.push_back( &s[i] ) );
                 Repeat( lst.pop_front() );
@@ -216,5 +218,5 @@
         uSequence<S> lst;
         start = clock();
-        for ( volatile unsigned int t = 0; t < Times; t += 1 ) {
+        for ( t = 0; t < Times; t += 1 ) {
                 Repeat( lst.addTail( &s[i] ) );
                 Repeat( lst.dropHead() );
@@ -228,5 +230,5 @@
         dlist(S) lst;
         start = clock();
-        for ( volatile unsigned int t = 0; t < Times; t += 1 ) {
+        for ( t = 0; t < Times; t += 1 ) {
                 Repeat( insert_last( lst, s[i] ) );
                 Repeat( remove( lst`first ) );
@@ -240,5 +242,5 @@
     	Sequence(S) lst;
         start = clock();
-        for ( volatile unsigned int t = 0; t < Times; t += 1 ) {
+        for ( t = 0; t < Times; t += 1 ) {
                 Repeat( addHead( lst, s[i] ) );
                 Repeat( dropTail( lst ) );
Index: doc/theses/mike_brooks_MMath/benchmarks/list/driver.c
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/driver.c	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/driver.c	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -17,8 +17,8 @@
 
 #if defined(NDEBUG) || (defined(__cforall) && !defined(__CFA_DEBUG__))
-    enum { DefaultNumNodes = 1000, DefaultExperimentDurSec = 1, DefaultCheckClockFreq = 1000, DefaultExperimentDurOpCount = -1 };
+    enum { DefaultNumNodes = 1000, DefaultExperimentDurSec = 1, DefaultCheckDonePeriod = 1000, DefaultExperimentDurOpCount = -1, DefaultSeed = 5 };
     #define TRACE(tp)
 #else 
-    enum { DefaultNumNodes = 10, DefaultExperimentDurSec = 1, DefaultCheckClockFreq = 2, DefaultExperimentDurOpCount = 20 };
+    enum { DefaultNumNodes = 10, DefaultExperimentDurSec = 1, DefaultCheckDonePeriod = 2, DefaultExperimentDurOpCount = 20, DefaultSeed = 5 };
     static const char * tp_filter
     // = "";
@@ -63,5 +63,8 @@
     }
 
-    int bobs_getCurrent() {
+    void * bobs_getCurrentLoc() {
+        return BFX_DEREF_POS(B_UserItem, lst, observedItem);
+    }
+    int bobs_getCurrentVal() {
         B_UserItem * curUI = BFX_DEREF_POS(B_UserItem, lst, observedItem);
         return curUI->userdata[17];
@@ -72,35 +75,84 @@
 )
 
+unsigned int uDefaultPreemption() {
+        return 0;
+}
+
 int main(int argc, const char *argv[]) {
 
-
-    const char * usage_args = "[ExperimentDurSec [CheckClockFreq [NumNodes [ExperimentDurOpCount]]]]";
-    const int static_arg_posns = 4;
+    const char * usage_args = "[ExperimentDurSec [CheckDonePeriod [NumNodes [ExperimentDurOpCount [Seed]]]]]";
+    const int static_arg_posns = 5;
 
     unsigned int ExperimentDurSec     = DefaultExperimentDurSec;
-    unsigned int CheckClockFreq       = DefaultCheckClockFreq;
+    unsigned int CheckDonePeriod      = DefaultCheckDonePeriod;
     unsigned int NumNodes             = DefaultNumNodes;
     size_t       ExperimentDurOpCount = DefaultExperimentDurOpCount;
-
-    switch ((argc < static_arg_posns) ? argc : static_arg_posns) {
-      case 5: ExperimentDurOpCount = atoi(argv[4]);
-      case 4: NumNodes = atoi(argv[3]);
-      case 3: CheckClockFreq = atoi(argv[2]);
-      case 2: ExperimentDurSec = atoi(argv[1]);
-    }
-
-    if (ExperimentDurSec == 0 || CheckClockFreq == 0 || NumNodes == 0 || ExperimentDurOpCount == 0 ) {
+    unsigned int Seed                 = DefaultSeed;
+
+    switch (((argc - 1) < static_arg_posns) ? (argc - 1) : static_arg_posns) {
+      case 5: Seed = atoi(argv[5]);
+      case 4: ExperimentDurOpCount = atol(argv[4]);
+      case 3: NumNodes = atoi(argv[3]);
+      case 2: CheckDonePeriod = atoi(argv[2]);
+      case 1: ExperimentDurSec = atoi(argv[1]);
+    }
+
+    if (ExperimentDurSec == 0 || CheckDonePeriod == 0 || NumNodes == 0 || ExperimentDurOpCount == 0 || Seed == 0 ) {
         printf("usage: %s %s\n", argv[0], usage_args);
         return -1;
     }
 
-    ui = (B_UserItem*) malloc( NumNodes * sizeof(B_UserItem) );
-    memset(ui, 0, NumNodes * sizeof(B_UserItem));
-
-    listedItems = (BFX_LISTED_ELEM_T(B_UserItem)*)malloc( NumNodes * sizeof(BFX_LISTED_ELEM_T(B_UserItem)) );
-    memset(listedItems, 0, NumNodes * sizeof(BFX_LISTED_ELEM_T(B_UserItem)));
-
+  #ifdef DISABLE_CLOCK_RECHECK
+    if (ExperimentDurSec != -1) {
+        printf("Error: experiment compiled as fixed-work only.  ExperimentDurSec (currently %d) must be set to -1.\nUsage: %s %s\n", ExperimentDurSec, argv[0], usage_args);
+        return -1;
+    }
+  #endif
+
+  #ifdef DISABLE_SHUFFLING_INDIRECTION
+    #define INSERTPOS(insertNum) insertNum
+  #else
+    // To ensure random memory order of nodes being inserted, do so according to a shuffled ordering of them.
+    unsigned int * insertOrdShuf = (unsigned int *) malloc( (size_t)NumNodes * sizeof(unsigned int) );
+    if (!insertOrdShuf) {
+        printf("malloc request for %zd bytes for insertOrdShuf refused\n", (size_t)NumNodes * (size_t)sizeof(unsigned int));
+        return 1;
+    }
+    // Fill with the ordinals (iota)
     for (int i = 0; i < NumNodes; i++) {
-        B_UserItem * curUI = & ui[i];
+        insertOrdShuf[i] = i;
+    }
+    // Dummy "Seed" of -1 means skip the shuffle: measure overhead of insertOrdShuf indirection
+    if (Seed != -1) {
+        // Shuffle
+        srand(Seed);
+        for (unsigned int i = 0; i < NumNodes; i++) {
+            unsigned int nodesRemaining = NumNodes - i;
+            unsigned int swapWith = i + rand() % nodesRemaining;
+            unsigned int tempValue = insertOrdShuf[swapWith];
+            insertOrdShuf[swapWith] = insertOrdShuf[i];
+            insertOrdShuf[i] = tempValue;
+        }
+    }
+    #define INSERTPOS(insertNum) insertOrdShuf[insertNum]
+  #endif
+
+    ui = (B_UserItem*) malloc( (size_t)NumNodes * (size_t)sizeof(B_UserItem) );
+    if (!ui) {
+        printf("malloc request for %zd bytes for ui refused\n", (size_t)NumNodes * (size_t)sizeof(B_UserItem));
+        return 1;
+    }
+    memset(ui, 0, (size_t)NumNodes * (size_t)sizeof(B_UserItem));
+
+    listedItems = (BFX_LISTED_ELEM_T(B_UserItem)*)malloc( (size_t)NumNodes * (size_t)sizeof(BFX_LISTED_ELEM_T(B_UserItem)) );
+    if (!listedItems) {
+        printf("malloc request for %zd bytes for listedItems refused\n", (size_t)NumNodes * (size_t)sizeof(BFX_LISTED_ELEM_T(B_UserItem)));
+        return 1;
+    }
+    memset(listedItems, 0, (size_t)NumNodes * (size_t)sizeof(BFX_LISTED_ELEM_T(B_UserItem)));
+
+    // Fill with demo data
+    for (unsigned int i = 0; i < NumNodes; i++) {
+        B_UserItem * curUI = & ui[INSERTPOS(i)];
         curUI->userdata[17] = i;
     }
@@ -110,18 +162,24 @@
     bobs_init(NumNodes);
 
-    // BOP Convention:
-    // Action-number arguments are for the BOP cartridge to interpret.
-    // I.e. the driver assumes no relationship between BOP_INSERT(_,_,xx) and ui[xx].
+    // BOP_ADDFOO(lst, iters, insNo, item)
+    // BOP_REMFOO(lst, iters, remNo)
+    //   lst    lvalue of the list head being added to / removed from
+    //   iters  array of ADD return values, in logical-insert order; on ADD, is valid at [0..insNo)
+    //   insNo  counter of the ADD calls (logical insert number)
+    //   remNo  counter of the REM calls (logical remove number)
+    //   item   lvalue of the item being added
     // Logical insert number 0 and remove number n-1 are given with a distinguished hook.
     // Logical insert numbers [1,n) and remove numbers [0,n-1) are pumped by the basic SUT hooks.
     // This pattern lets BOP cartridges that measure element-level operations know statically when there is a reference element in the list.
+    // The driver owns the relationship between a logical insert number and the location of the `item` argument within `ui`.  (Scattered for randomness.)
+    // The BOP cartridge owns the relationship between logical remove number and any choice of an item in iters.  (Defines stack vs queue.)
 
     // Default init/teardown is insert/remove
     // Cartridges whose SUT insert/remove actions work on empty lists need not provide special-case ones.
     #ifndef BOP_INIT
-    #define BOP_INIT(lst, ui, iters, i) BOP_INSERT(lst, ui, iters, i)
+    #define BOP_INIT(lst, iters, insNo, item) BOP_INSERT(lst, iters, insNo, item)
     #endif
     #ifndef BOP_TEARDOWN
-    #define BOP_TEARDOWN(lst, ui, iters, i) BOP_REMOVE(lst, ui, iters, i)
+    #define BOP_TEARDOWN(lst, iters, remNo) BOP_REMOVE(lst, iters, remNo)
     #endif
 
@@ -129,9 +187,11 @@
     clock_t start = clock();
 
-    while (elapsed_sec <= (double) ExperimentDurSec && bobs_ops_completed < ExperimentDurOpCount) {
-        for ( int t = 0; t < CheckClockFreq; t += 1 ) {
+    size_t privateOpsCompleted = 0;
+
+    while (elapsed_sec <= (double) ExperimentDurSec && privateOpsCompleted < ExperimentDurOpCount) {
+        for ( int t = 0; t < CheckDonePeriod; t += 1 ) {
             TRACE('a')
             listedItems[0] =
-                BOP_INIT(lst, ui, listedItems, 0);
+                BOP_INIT(lst, listedItems, 0, ui[INSERTPOS(0)]);
             TRACE('b')
             for ( int privateCurInsert = 1;
@@ -141,5 +201,5 @@
                 TRACE('-')
                 listedItems[privateCurInsert] =
-                    BOP_INSERT( lst, ui, listedItems, privateCurInsert );
+                    BOP_INSERT( lst, listedItems, privateCurInsert, ui[INSERTPOS(privateCurInsert)] );
                 TRACE('+')
             }
@@ -150,10 +210,12 @@
                 ) {
                 TRACE('-')
-                BOP_REMOVE( lst, ui, listedItems, privateCurRemove-1 );
+                BOP_REMOVE( lst, listedItems, privateCurRemove-1 );
                 TRACE('+')
             }
             TRACE('D')
-            BOP_TEARDOWN(lst, ui, listedItems, NumNodes-1);
+            BOP_TEARDOWN(lst, listedItems, NumNodes-1);
             TRACE('d')
+
+            privateOpsCompleted += NumNodes;
 
             bobs_prog_rollover_flag = 1;
@@ -161,12 +223,20 @@
             bobs_prog_inserting = 0;
             bobs_prog_removing = 0;            
-            bobs_ops_completed += NumNodes;
+            bobs_ops_completed = privateOpsCompleted;
             TRACE('f')
             bobs_prog_rollover_flag = 0;
             TRACE('g')
         }
+      #ifndef DISABLE_CLOCK_RECHECK
         clock_t end = clock();
         elapsed_sec = ((double)(end - start)) / ((double)CLOCKS_PER_SEC);
-    }
+      #endif
+    }
+    #ifdef DISABLE_CLOCK_RECHECK
+    {
+        clock_t end = clock();
+        elapsed_sec = ((double)(end - start)) / ((double)CLOCKS_PER_SEC);
+    }
+    #endif
 
     double mean_op_dur_ns = elapsed_sec / ((double)bobs_ops_completed) * 1000 * 1000 * 1000;
@@ -175,3 +245,4 @@
     free(ui);
     free(listedItems);
+    free(insertOrdShuf);
 }
Index: doc/theses/mike_brooks_MMath/benchmarks/list/observation.c
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/observation.c	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/observation.c	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -24,4 +24,16 @@
 }
 
+#ifdef BOBS_SHOW_ADDRESSES
+#define SNAP \
+    void * userAddr = bobs_getCurrentLoc(); \
+    int userValue = bobs_getCurrentVal();
+#define SHOW(pfx, sfx) \
+    printf(" " pfx "%d@%p" sfx, userValue, userAddr);
+#else
+#define SNAP \
+    int userValue = bobs_getCurrentVal();
+#define SHOW(pfx, sfx) \
+    printf(" " pfx "%d" sfx, userValue);
+#endif
 
 static void printPreds(unsigned int leash) {
@@ -32,8 +44,8 @@
         return;
     }
-    int userValue = bobs_getCurrent();
+    SNAP
     bobs_movePrev();
     printPreds(leash - 1);
-    printf(" %d", userValue);
+    SHOW("", "")
 }
 static void printSuccs(unsigned int leash) {
@@ -44,6 +56,6 @@
         return;
     }
-    int userValue = bobs_getCurrent();
-    printf(" %d", userValue);
+    SNAP
+    SHOW("", "")
     bobs_moveNext();
     printSuccs(leash - 1);
@@ -59,6 +71,6 @@
 
     bobs_seek(here);
-    int userValue = bobs_getCurrent();
-    printf(" <%d>", userValue);
+    SNAP
+    SHOW("<", ">")
 
     bobs_moveNext();
Index: doc/theses/mike_brooks_MMath/benchmarks/list/observation.h
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/observation.h	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/observation.h	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -8,9 +8,10 @@
     extern enum bobs_op_polarity_t { insfirst, inslast } bobs_op_polarity;
 
-    void bobs_seek(unsigned int);
-    void bobs_moveNext();
-    void bobs_movePrev();
-    int  bobs_hasCurrent();
-    int  bobs_getCurrent();
+    void   bobs_seek(unsigned int);
+    void   bobs_moveNext();
+    void   bobs_movePrev();
+    int    bobs_hasCurrent();
+    void * bobs_getCurrentLoc();
+    int    bobs_getCurrentVal();
 
     extern volatile size_t       bobs_ops_completed;
Index: doc/theses/mike_brooks_MMath/benchmarks/list/op-queue-insfirst-allhead.h
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/op-queue-insfirst-allhead.h	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/op-queue-insfirst-allhead.h	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -3,4 +3,4 @@
 // allhead:  inserts and removes happen via the api-provided "last"/"tail"/"back"/"first"/"tail"/"front"
 
-#define BOP_INSERT(lst, ui, iters, i) BFX_INSERT_FIRST(B_UserItem, lst, ui[i])
-#define BOP_REMOVE(lst, ui, iters, i) BFX_REMOVE_LAST(B_UserItem, lst)
+#define BOP_INSERT(lst, iters, insNo, item)  BFX_INSERT_FIRST(B_UserItem, lst, (item))
+#define BOP_REMOVE(lst, iters, remNo)        BFX_REMOVE_LAST(B_UserItem, lst)
Index: doc/theses/mike_brooks_MMath/benchmarks/list/op-queue-insfirst-inselem.h
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/op-queue-insfirst-inselem.h	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/op-queue-insfirst-inselem.h	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -3,6 +3,6 @@
 // inselem:  inserts happen via an element-level operation and removes happen via the api-provided "last"/"tail"/"back"
 
-#define BOP_INIT(lst, ui, iters, i) BFX_INSERT_FIRST(B_UserItem, lst, ui[i])
+#define BOP_INIT(lst, iters, insNo, item)    BFX_INSERT_FIRST(B_UserItem, lst, (item))
 
-#define BOP_INSERT(lst, ui, iters, i) BFX_INSERT_BEFORE(B_UserItem, lst, ui[i], iters[i-1])
-#define BOP_REMOVE(lst, ui, iters, i) BFX_REMOVE_LAST(B_UserItem, lst)
+#define BOP_INSERT(lst, iters, insNo, item)  BFX_INSERT_BEFORE(B_UserItem, lst, (item), iters[(insNo)-1])
+#define BOP_REMOVE(lst, iters, remNo)        BFX_REMOVE_LAST(B_UserItem, lst)
Index: doc/theses/mike_brooks_MMath/benchmarks/list/op-queue-insfirst-remelem.h
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/op-queue-insfirst-remelem.h	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/op-queue-insfirst-remelem.h	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -3,6 +3,6 @@
 // remelem:  removes happen via an element-level operation and inserts happen via the api-provided "first"/"head"/"front"
 
-#define BOP_TEARDOWN(lst, ui, iters, i) BFX_REMOVE_LAST(B_UserItem, lst)
+#define BOP_TEARDOWN(lst, iters, remNo)      BFX_REMOVE_LAST(B_UserItem, lst)
 
-#define BOP_INSERT(lst, ui, iters, i) BFX_INSERT_FIRST(B_UserItem, lst, ui[i])
-#define BOP_REMOVE(lst, ui, iters, i) BFX_REMOVE_HERE(B_UserItem, lst, iters[i])
+#define BOP_INSERT(lst, iters, insNo, item)  BFX_INSERT_FIRST(B_UserItem, lst, (item))
+#define BOP_REMOVE(lst, iters, remNo)        BFX_REMOVE_HERE(B_UserItem, lst, iters[(remNo)])
Index: doc/theses/mike_brooks_MMath/benchmarks/list/op-queue-inslast-allhead.h
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/op-queue-inslast-allhead.h	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/op-queue-inslast-allhead.h	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -3,4 +3,4 @@
 // allhead:  inserts and removes happen via the api-provided "last"/"tail"/"back"/"first"/"tail"/"front"
 
-#define BOP_INSERT(lst, ui, iters, i) BFX_INSERT_LAST(B_UserItem, lst, ui[i])
-#define BOP_REMOVE(lst, ui, iters, i) BFX_REMOVE_FIRST(B_UserItem, lst)
+#define BOP_INSERT(lst, iters, insNo, item)  BFX_INSERT_LAST(B_UserItem, lst, (item))
+#define BOP_REMOVE(lst, iters, remNo)        BFX_REMOVE_FIRST(B_UserItem, lst)
Index: doc/theses/mike_brooks_MMath/benchmarks/list/op-queue-inslast-inselem.h
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/op-queue-inslast-inselem.h	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/op-queue-inslast-inselem.h	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -3,6 +3,6 @@
 // inselem:  inserts happen via an element-level operation and removes happen via the api-provided "first"/"tail"/"front"
 
-#define BOP_INIT(lst, ui, iters, i) BFX_INSERT_LAST(B_UserItem, lst, ui[i])
+#define BOP_INIT(lst, iters, insNo, item)    BFX_INSERT_LAST(B_UserItem, lst, (item))
 
-#define BOP_INSERT(lst, ui, iters, i) BFX_INSERT_AFTER(B_UserItem, lst, ui[i], iters[i-1])
-#define BOP_REMOVE(lst, ui, iters, i) BFX_REMOVE_FIRST(B_UserItem, lst)
+#define BOP_INSERT(lst, iters, insNo, item)  BFX_INSERT_AFTER(B_UserItem, lst, (item), iters[(insNo)-1])
+#define BOP_REMOVE(lst, iters, remNo)        BFX_REMOVE_FIRST(B_UserItem, lst)
Index: doc/theses/mike_brooks_MMath/benchmarks/list/op-queue-inslast-remelem.h
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/op-queue-inslast-remelem.h	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/op-queue-inslast-remelem.h	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -3,6 +3,6 @@
 // remelem:  removes happen via an element-level operation and inserts happen via the api-provided "last"/"tail"/"back"
 
-#define BOP_TEARDOWN(lst, ui, iters, i) BFX_REMOVE_FIRST(B_UserItem, lst)
+#define BOP_TEARDOWN(lst, iters, remNo)     BFX_REMOVE_FIRST(B_UserItem, lst)
 
-#define BOP_INSERT(lst, ui, iters, i) BFX_INSERT_LAST(B_UserItem, lst, ui[i])
-#define BOP_REMOVE(lst, ui, iters, i) BFX_REMOVE_HERE(B_UserItem, lst, iters[i])
+#define BOP_INSERT(lst, iters, insNo, item) BFX_INSERT_LAST(B_UserItem, lst, (item))
+#define BOP_REMOVE(lst, iters, remNo)       BFX_REMOVE_HERE(B_UserItem, lst, iters[(remNo)])
Index: doc/theses/mike_brooks_MMath/benchmarks/list/op-stack-insfirst-allhead.h
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/op-stack-insfirst-allhead.h	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/op-stack-insfirst-allhead.h	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -3,4 +3,4 @@
 // allhead:  inserts and removes happen via the api-provided "first"/"head"/"front"
 
-#define BOP_INSERT(lst, ui, iters, i) BFX_INSERT_FIRST(B_UserItem, lst, ui[i])
-#define BOP_REMOVE(lst, ui, iters, i) BFX_REMOVE_FIRST(B_UserItem, lst)
+#define BOP_INSERT(lst, iters, insNo, item)  BFX_INSERT_FIRST(B_UserItem, lst, (item))
+#define BOP_REMOVE(lst, iters, remNo)        BFX_REMOVE_FIRST(B_UserItem, lst)
Index: doc/theses/mike_brooks_MMath/benchmarks/list/op-stack-insfirst-inselem.h
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/op-stack-insfirst-inselem.h	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/op-stack-insfirst-inselem.h	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -3,6 +3,6 @@
 // inselem:  inserts happen via an element-level operation and removes happen via the api-provided "first"/"head"/"front"
 
-#define BOP_INIT(lst, ui, iters, i) BFX_INSERT_FIRST(B_UserItem, lst, ui[i])
+#define BOP_INIT(lst, iters, insNo, item)  BFX_INSERT_FIRST(B_UserItem, lst, (item))
 
-#define BOP_INSERT(lst, ui, iters, i) BFX_INSERT_BEFORE(B_UserItem, lst, ui[i], iters[i-1])
-#define BOP_REMOVE(lst, ui, iters, i) BFX_REMOVE_FIRST(B_UserItem, lst)
+#define BOP_INSERT(lst, iters, insNo, item)  BFX_INSERT_BEFORE(B_UserItem, lst, (item), iters[insNo-1])
+#define BOP_REMOVE(lst, iters, remNo)        BFX_REMOVE_FIRST(B_UserItem, lst)
Index: doc/theses/mike_brooks_MMath/benchmarks/list/op-stack-insfirst-remelem.h
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/op-stack-insfirst-remelem.h	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/op-stack-insfirst-remelem.h	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -3,6 +3,6 @@
 // remelem:  removes happen via an element-level operation and inserts happen via the api-provided "first"/"head"/"front"
 
-#define BOP_TEARDOWN(lst, ui, iters, i) BFX_REMOVE_FIRST(B_UserItem, lst)
+#define BOP_TEARDOWN(lst, iters, remNo)      BFX_REMOVE_FIRST(B_UserItem, lst)
 
-#define BOP_INSERT(lst, ui, iters, i) BFX_INSERT_FIRST(B_UserItem, lst, ui[i])
-#define BOP_REMOVE(lst, ui, iters, i) BFX_REMOVE_HERE(B_UserItem, lst, iters[NumNodes-(i)-1])
+#define BOP_INSERT(lst, iters, insNo, item)  BFX_INSERT_FIRST(B_UserItem, lst, (item))
+#define BOP_REMOVE(lst, iters, remNo)        BFX_REMOVE_HERE(B_UserItem, lst, iters[NumNodes-(remNo)-1])
Index: doc/theses/mike_brooks_MMath/benchmarks/list/op-stack-inslast-allhead.h
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/op-stack-inslast-allhead.h	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/op-stack-inslast-allhead.h	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -3,4 +3,4 @@
 // allhead:  inserts and removes happen via the api-provided "last"/"tail"/"back"
 
-#define BOP_INSERT(lst, ui, iters, i) BFX_INSERT_LAST(B_UserItem, lst, ui[i])
-#define BOP_REMOVE(lst, ui, iters, i) BFX_REMOVE_LAST(B_UserItem, lst)
+#define BOP_INSERT(lst, iters, insNo, item)  BFX_INSERT_LAST(B_UserItem, lst, (item))
+#define BOP_REMOVE(lst, iters, remNo)        BFX_REMOVE_LAST(B_UserItem, lst)
Index: doc/theses/mike_brooks_MMath/benchmarks/list/op-stack-inslast-inselem.h
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/op-stack-inslast-inselem.h	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/op-stack-inslast-inselem.h	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -3,6 +3,6 @@
 // inselem:  inserts happen via an element-level operation and removes happen via the api-provided "last"/"tail"/"back"
 
-#define BOP_INIT(lst, ui, iters, i) BFX_INSERT_LAST(B_UserItem, lst, ui[i])
+#define BOP_INIT(lst, iters, insNo, item)   BFX_INSERT_LAST(B_UserItem, lst, (item))
 
-#define BOP_INSERT(lst, ui, iters, i) BFX_INSERT_AFTER(B_UserItem, lst, ui[i], iters[i-1])
-#define BOP_REMOVE(lst, ui, iters, i) BFX_REMOVE_LAST(B_UserItem, lst)
+#define BOP_INSERT(lst, iters, insNo, item) BFX_INSERT_AFTER(B_UserItem, lst, (item), iters[(insNo)-1])
+#define BOP_REMOVE(lst, iters, remNo)       BFX_REMOVE_LAST(B_UserItem, lst)
Index: doc/theses/mike_brooks_MMath/benchmarks/list/op-stack-inslast-remelem.h
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/op-stack-inslast-remelem.h	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/op-stack-inslast-remelem.h	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -3,6 +3,6 @@
 // remelem:  removes happen via an element-level operation and inserts happen via the api-provided "last"/"tail"/"back"
 
-#define BOP_TEARDOWN(lst, ui, iters, i) BFX_REMOVE_LAST(B_UserItem, lst)
+#define BOP_TEARDOWN(lst, iters, remNo)      BFX_REMOVE_LAST(B_UserItem, lst)
 
-#define BOP_INSERT(lst, ui, iters, i) BFX_INSERT_LAST(B_UserItem, lst, ui[i])
-#define BOP_REMOVE(lst, ui, iters, i) BFX_REMOVE_HERE(B_UserItem, lst, iters[NumNodes-(i)-1])
+#define BOP_INSERT(lst, iters, insNo, item)  BFX_INSERT_LAST(B_UserItem, lst, (item))
+#define BOP_REMOVE(lst, iters, remNo)        BFX_REMOVE_HERE(B_UserItem, lst, iters[NumNodes-(remNo)-1])
Index: doc/theses/mike_brooks_MMath/benchmarks/list/results-baseline.csv
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/results-baseline.csv	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/results-baseline.csv	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -1,255 +1,1275 @@
-2023-04-03 15:39:25,5,./perfexp--lq-tailq--stack-insfirst-inselem,443000000,5.005379,11.298824
-2023-04-03 15:39:30,3,./perfexp--lq-tailq--queue-inslast-allhead,570000000,5.007309,8.784753
-2023-04-03 15:39:35,3,./perfexp--lq-tailq--stack-inslast-inselem,606000000,5.000877,8.252272
-2023-04-03 15:39:40,2,./perfexp--upp-upp--stack-insfirst-remelem,657000000,5.006698,7.620545
-2023-04-03 15:39:45,1,./perfexp--lq-tailq--stack-inslast-allhead,617000000,5.002409,8.107632
-2023-04-03 15:39:50,2,./perfexp--lq-tailq--stack-inslast-inselem,607000000,5.007467,8.249534
-2023-04-03 15:39:55,3,./perfexp--upp-upp--stack-inslast-allhead,572000000,5.002847,8.746236
-2023-04-03 15:40:01,5,./perfexp--lq-tailq--queue-insfirst-allhead,536000000,5.000997,9.330218
-2023-04-03 15:40:06,5,./perfexp--upp-upp--queue-insfirst-allhead,458000000,5.009543,10.937867
-2023-04-03 15:40:11,5,./perfexp--cfa-cfa--queue-inslast-remelem,710000000,5.003976,7.047854
-2023-04-03 15:40:16,1,./perfexp--cpp-stlref--stack-inslast-allhead,166000000,5.002189,30.133669
-2023-04-03 15:40:21,2,./perfexp--cfa-cfa--stack-inslast-allhead,547000000,5.004804,9.149550
-2023-04-03 15:40:26,1,./perfexp--lq-tailq--stack-insfirst-remelem,713000000,5.006425,7.021634
-2023-04-03 15:40:31,4,./perfexp--upp-upp--stack-inslast-allhead,567000000,5.003325,8.824206
-2023-04-03 15:40:36,2,./perfexp--upp-upp--stack-inslast-inselem,489000000,5.000271,10.225503
-2023-04-03 15:40:41,2,./perfexp--cpp-stlref--stack-inslast-remelem,158000000,5.017243,31.754703
-2023-04-03 15:40:46,5,./perfexp--upp-upp--stack-inslast-allhead,549000000,5.005594,9.117658
-2023-04-03 15:40:51,3,./perfexp--upp-upp--queue-inslast-inselem,487000000,5.003425,10.273973
-2023-04-03 15:40:56,4,./perfexp--cfa-cfa--stack-inslast-inselem,538000000,5.004632,9.302290
-2023-04-03 15:41:01,3,./perfexp--cfa-cfa--queue-insfirst-remelem,718000000,5.006064,6.972234
-2023-04-03 15:41:06,3,./perfexp--cpp-stlref--queue-inslast-inselem,167000000,5.027628,30.105557
-2023-04-03 15:41:11,5,./perfexp--cfa-cfa--queue-insfirst-allhead,510000000,5.007280,9.818196
-2023-04-03 15:41:16,5,./perfexp--lq-list--stack-insfirst-inselem,462000000,5.010782,10.845848
-2023-04-03 15:41:21,5,./perfexp--lq-tailq--queue-inslast-allhead,565000000,5.008089,8.863874
-2023-04-03 15:41:26,2,./perfexp--cpp-stlref--queue-insfirst-inselem,167000000,5.002444,29.954754
-2023-04-03 15:41:31,3,./perfexp--cpp-stlref--queue-insfirst-allhead,172000000,5.012068,29.139930
-2023-04-03 15:41:36,2,./perfexp--upp-upp--queue-insfirst-inselem,465000000,5.003175,10.759516
-2023-04-03 15:41:41,4,./perfexp--lq-tailq--queue-inslast-remelem,535000000,5.003059,9.351512
-2023-04-03 15:41:46,4,./perfexp--cpp-stlref--queue-inslast-remelem,166000000,5.000510,30.123554
-2023-04-03 15:41:51,3,./perfexp--lq-tailq--stack-insfirst-remelem,710000000,5.003302,7.046904
-2023-04-03 15:41:56,1,./perfexp--lq-tailq--queue-insfirst-allhead,539000000,5.005817,9.287230
-2023-04-03 15:42:01,5,./perfexp--upp-upp--queue-insfirst-remelem,608000000,5.006322,8.234082
-2023-04-03 15:42:06,2,./perfexp--cpp-stlref--stack-insfirst-inselem,165000000,5.002635,30.319000
-2023-04-03 15:42:11,5,./perfexp--cfa-cfa--queue-insfirst-inselem,510000000,5.009883,9.823300
-2023-04-03 15:42:16,1,./perfexp--cfa-cfa--stack-insfirst-allhead,552000000,5.000119,9.058187
-2023-04-03 15:42:21,1,./perfexp--lq-list--stack-insfirst-remelem,712000000,5.005641,7.030395
-2023-04-03 15:42:26,3,./perfexp--upp-upp--stack-inslast-remelem,685000000,5.000472,7.299959
-2023-04-03 15:42:31,1,./perfexp--lq-tailq--stack-insfirst-inselem,444000000,5.008487,11.280376
-2023-04-03 15:42:37,2,./perfexp--cpp-stlref--stack-inslast-allhead,161000000,5.025004,31.211205
-2023-04-03 15:42:42,3,./perfexp--cfa-cfa--stack-inslast-allhead,545000000,5.002831,9.179506
-2023-04-03 15:42:47,1,./perfexp--upp-upp--stack-inslast-allhead,567000000,5.007839,8.832168
-2023-04-03 15:42:52,5,./perfexp--cpp-stlref--stack-insfirst-inselem,165000000,5.025721,30.458915
-2023-04-03 15:42:57,3,./perfexp--lq-tailq--queue-insfirst-allhead,537000000,5.005007,9.320311
-2023-04-03 15:43:02,5,./perfexp--cfa-cfa--stack-insfirst-remelem,759000000,5.000831,6.588710
-2023-04-03 15:43:07,4,./perfexp--cpp-stlref--queue-insfirst-remelem,170000000,5.016844,29.510847
-2023-04-03 15:43:12,2,./perfexp--upp-upp--queue-insfirst-remelem,664000000,5.002228,7.533476
-2023-04-03 15:43:17,4,./perfexp--lq-tailq--queue-insfirst-allhead,537000000,5.005068,9.320425
-2023-04-03 15:43:22,3,./perfexp--lq-tailq--stack-insfirst-inselem,444000000,5.009009,11.281552
-2023-04-03 15:43:27,5,./perfexp--cfa-cfa--stack-inslast-inselem,538000000,5.000494,9.294599
-2023-04-03 15:43:32,3,./perfexp--cpp-stlref--stack-insfirst-inselem,166000000,5.023027,30.259199
-2023-04-03 15:43:37,2,./perfexp--cpp-stlref--queue-insfirst-allhead,168000000,5.019833,29.879958
-2023-04-03 15:43:42,1,./perfexp--upp-upp--stack-inslast-inselem,491000000,5.000784,10.184896
-2023-04-03 15:43:47,3,./perfexp--cpp-stlref--stack-inslast-remelem,159000000,5.025671,31.607994
-2023-04-03 15:43:52,1,./perfexp--cfa-cfa--stack-inslast-remelem,768000000,5.003314,6.514732
-2023-04-03 15:43:57,5,./perfexp--cfa-cfa--queue-insfirst-remelem,718000000,5.000123,6.963960
-2023-04-03 15:44:02,4,./perfexp--cfa-cfa--queue-inslast-remelem,706000000,5.005028,7.089275
-2023-04-03 15:44:07,1,./perfexp--lq-tailq--stack-insfirst-allhead,594000000,5.002014,8.420899
-2023-04-03 15:44:12,3,./perfexp--lq-tailq--queue-insfirst-inselem,437000000,5.006085,11.455572
-2023-04-03 15:44:17,2,./perfexp--lq-tailq--stack-inslast-remelem,826000000,5.000880,6.054334
-2023-04-03 15:44:22,3,./perfexp--upp-upp--stack-inslast-inselem,492000000,5.009566,10.182045
-2023-04-03 15:44:27,2,./perfexp--upp-upp--stack-inslast-remelem,697000000,5.000839,7.174805
-2023-04-03 15:44:32,2,./perfexp--cfa-cfa--stack-insfirst-remelem,756000000,5.000070,6.613849
-2023-04-03 15:44:37,5,./perfexp--lq-tailq--stack-insfirst-remelem,717000000,5.007000,6.983264
-2023-04-03 15:44:43,4,./perfexp--cfa-cfa--queue-insfirst-inselem,507000000,5.000763,9.863438
-2023-04-03 15:44:48,1,./perfexp--cpp-stlref--queue-inslast-inselem,161000000,5.027524,31.226857
-2023-04-03 15:44:53,4,./perfexp--cfa-cfa--queue-insfirst-allhead,508000000,5.009748,9.861709
-2023-04-03 15:44:58,2,./perfexp--lq-tailq--stack-insfirst-allhead,595000000,5.001977,8.406684
-2023-04-03 15:45:03,4,./perfexp--lq-tailq--queue-insfirst-inselem,431000000,5.000710,11.602575
-2023-04-03 15:45:08,3,./perfexp--upp-upp--stack-insfirst-allhead,601000000,5.002087,8.322940
-2023-04-03 15:45:13,5,./perfexp--lq-tailq--stack-inslast-remelem,828000000,5.002858,6.042099
-2023-04-03 15:45:18,4,./perfexp--upp-upp--stack-insfirst-allhead,520000000,5.008182,9.631119
-2023-04-03 15:45:23,5,./perfexp--lq-tailq--queue-inslast-remelem,529000000,5.000836,9.453376
-2023-04-03 15:45:28,4,./perfexp--cfa-cfa--queue-insfirst-remelem,718000000,5.002385,6.967110
-2023-04-03 15:45:33,4,./perfexp--cpp-stlref--stack-inslast-allhead,162000000,5.021934,30.999593
-2023-04-03 15:45:38,5,./perfexp--cpp-stlref--stack-inslast-inselem,160000000,5.015857,31.349106
-2023-04-03 15:45:43,3,./perfexp--cfa-cfa--stack-inslast-inselem,539000000,5.008154,9.291566
-2023-04-03 15:45:48,3,./perfexp--cpp-stlref--stack-inslast-inselem,163000000,5.010634,30.740086
-2023-04-03 15:45:53,5,./perfexp--cpp-stlref--stack-insfirst-allhead,166000000,5.018746,30.233410
-2023-04-03 15:45:58,1,./perfexp--cfa-cfa--queue-inslast-remelem,710000000,5.006924,7.052006
-2023-04-03 15:46:03,1,./perfexp--cpp-stlref--stack-inslast-remelem,156000000,5.000411,32.053917
-2023-04-03 15:46:08,2,./perfexp--lq-tailq--stack-inslast-allhead,617000000,5.005184,8.112130
-2023-04-03 15:46:13,1,./perfexp--cfa-cfa--queue-insfirst-remelem,719000000,5.003622,6.959140
-2023-04-03 15:46:18,4,./perfexp--lq-tailq--queue-inslast-allhead,564000000,5.000835,8.866729
-2023-04-03 15:46:23,1,./perfexp--lq-tailq--queue-insfirst-remelem,759000000,5.001690,6.589842
-2023-04-03 15:46:28,3,./perfexp--cpp-stlref--queue-insfirst-remelem,169000000,5.025107,29.734361
-2023-04-03 15:46:33,1,./perfexp--cpp-stlref--stack-insfirst-allhead,166000000,5.027112,30.283807
-2023-04-03 15:46:38,1,./perfexp--cpp-stlref--queue-insfirst-remelem,169000000,5.006199,29.622479
-2023-04-03 15:46:44,2,./perfexp--upp-upp--stack-inslast-allhead,566000000,5.000864,8.835449
-2023-04-03 15:46:49,2,./perfexp--cfa-cfa--queue-inslast-allhead,517000000,5.009262,9.689095
-2023-04-03 15:46:54,2,./perfexp--lq-tailq--stack-insfirst-inselem,445000000,5.000014,11.235987
-2023-04-03 15:46:59,3,./perfexp--lq-list--stack-insfirst-remelem,713000000,5.003234,7.017158
-2023-04-03 15:47:04,3,./perfexp--lq-tailq--queue-insfirst-remelem,759000000,5.001448,6.589523
-2023-04-03 15:47:09,4,./perfexp--cpp-stlref--stack-inslast-inselem,164000000,5.002294,30.501793
-2023-04-03 15:47:14,3,./perfexp--cpp-stlref--stack-insfirst-allhead,166000000,5.015560,30.214217
-2023-04-03 15:47:19,2,./perfexp--lq-tailq--queue-inslast-remelem,533000000,5.003926,9.388229
-2023-04-03 15:47:24,2,./perfexp--cpp-stlref--stack-inslast-inselem,164000000,5.013968,30.572976
-2023-04-03 15:47:29,3,./perfexp--lq-tailq--stack-inslast-remelem,833000000,5.003961,6.007156
-2023-04-03 15:47:34,2,./perfexp--cfa-cfa--stack-insfirst-allhead,552000000,5.005105,9.067219
-2023-04-03 15:47:39,5,./perfexp--upp-upp--queue-inslast-allhead,539000000,5.003768,9.283429
-2023-04-03 15:47:44,2,./perfexp--cpp-stlref--queue-inslast-remelem,163000000,5.022589,30.813429
-2023-04-03 15:47:49,5,./perfexp--cpp-stlref--queue-inslast-inselem,165000000,5.027219,30.467994
-2023-04-03 15:47:54,5,./perfexp--cpp-stlref--queue-inslast-allhead,170000000,5.024832,29.557835
-2023-04-03 15:47:59,3,./perfexp--cpp-stlref--queue-inslast-remelem,165000000,5.027366,30.468885
-2023-04-03 15:48:04,1,./perfexp--cfa-cfa--stack-inslast-inselem,536000000,5.005369,9.338375
-2023-04-03 15:48:09,1,./perfexp--cpp-stlref--queue-inslast-remelem,162000000,5.023907,31.011772
-2023-04-03 15:48:14,4,./perfexp--cpp-stlref--stack-insfirst-inselem,165000000,5.002599,30.318782
-2023-04-03 15:48:19,4,./perfexp--cfa-cfa--queue-inslast-inselem,519000000,5.007842,9.649021
-2023-04-03 15:48:24,4,./perfexp--cpp-stlref--queue-insfirst-inselem,170000000,5.028952,29.582071
-2023-04-03 15:48:29,1,./perfexp--lq-tailq--queue-insfirst-inselem,433000000,5.010306,11.571145
-2023-04-03 15:48:34,2,./perfexp--cfa-cfa--queue-inslast-remelem,709000000,5.006604,7.061501
-2023-04-03 15:48:39,4,./perfexp--upp-upp--stack-inslast-inselem,491000000,5.004649,10.192768
-2023-04-03 15:48:44,4,./perfexp--lq-tailq--stack-inslast-inselem,606000000,5.003287,8.256249
-2023-04-03 15:48:49,5,./perfexp--lq-tailq--queue-inslast-inselem,557000000,5.007731,8.990540
-2023-04-03 15:48:54,4,./perfexp--upp-upp--queue-insfirst-inselem,460000000,5.002636,10.875296
-2023-04-03 15:48:59,4,./perfexp--upp-upp--queue-inslast-allhead,537000000,5.005155,9.320587
-2023-04-03 15:49:04,2,./perfexp--upp-upp--queue-inslast-allhead,538000000,5.007986,9.308524
-2023-04-03 15:49:10,5,./perfexp--upp-upp--stack-insfirst-inselem,526000000,5.007934,9.520787
-2023-04-03 15:49:15,5,./perfexp--cpp-stlref--stack-inslast-allhead,165000000,5.014335,30.389909
-2023-04-03 15:49:20,5,./perfexp--cpp-stlref--stack-insfirst-remelem,156000000,5.013451,32.137506
-2023-04-03 15:49:25,3,./perfexp--cfa-cfa--stack-insfirst-inselem,548000000,5.000615,9.125210
-2023-04-03 15:49:30,4,./perfexp--cfa-cfa--stack-inslast-remelem,769000000,5.001464,6.503854
-2023-04-03 15:49:35,1,./perfexp--upp-upp--queue-inslast-remelem,603000000,5.003718,8.298040
-2023-04-03 15:49:40,2,./perfexp--cpp-stlref--queue-inslast-inselem,164000000,5.012683,30.565140
-2023-04-03 15:49:45,5,./perfexp--upp-upp--stack-insfirst-remelem,642000000,5.004144,7.794617
-2023-04-03 15:49:50,4,./perfexp--upp-upp--queue-inslast-remelem,606000000,5.001222,8.252842
-2023-04-03 15:49:55,2,./perfexp--cpp-stlref--stack-insfirst-remelem,158000000,5.016260,31.748481
-2023-04-03 15:50:00,5,./perfexp--cfa-cfa--queue-inslast-allhead,518000000,5.003133,9.658558
-2023-04-03 15:50:05,2,./perfexp--upp-upp--queue-inslast-remelem,610000000,5.003194,8.201957
-2023-04-03 15:50:10,4,./perfexp--lq-tailq--stack-inslast-remelem,829000000,5.004086,6.036292
-2023-04-03 15:50:15,5,./perfexp--lq-tailq--stack-insfirst-allhead,596000000,5.008331,8.403240
-2023-04-03 15:50:20,3,./perfexp--cpp-stlref--stack-insfirst-remelem,157000000,5.028128,32.026293
-2023-04-03 15:50:25,1,./perfexp--cfa-cfa--stack-inslast-allhead,545000000,5.003736,9.181167
-2023-04-03 15:50:30,2,./perfexp--cpp-stlref--stack-insfirst-allhead,166000000,5.011507,30.189801
-2023-04-03 15:50:35,2,./perfexp--lq-list--stack-insfirst-inselem,441000000,5.004092,11.347147
-2023-04-03 15:50:40,1,./perfexp--lq-tailq--stack-inslast-remelem,831000000,5.002214,6.019511
-2023-04-03 15:50:45,2,./perfexp--cfa-cfa--stack-insfirst-inselem,549000000,5.006757,9.119776
-2023-04-03 15:50:51,4,./perfexp--upp-upp--stack-inslast-remelem,707000000,5.000598,7.072982
-2023-04-03 15:50:56,2,./perfexp--cfa-cfa--queue-inslast-inselem,519000000,5.000666,9.635195
-2023-04-03 15:51:01,4,./perfexp--lq-tailq--stack-insfirst-remelem,715000000,5.002704,6.996789
-2023-04-03 15:51:06,3,./perfexp--cfa-cfa--stack-inslast-remelem,772000000,5.003203,6.480833
-2023-04-03 15:51:11,1,./perfexp--upp-upp--stack-insfirst-inselem,524000000,5.006068,9.553565
-2023-04-03 15:51:16,2,./perfexp--upp-upp--queue-insfirst-allhead,510000000,5.009613,9.822771
-2023-04-03 15:51:21,3,./perfexp--lq-tailq--queue-inslast-remelem,530000000,5.006810,9.446811
-2023-04-03 15:51:26,4,./perfexp--cpp-stlref--stack-insfirst-remelem,159000000,5.007889,31.496157
-2023-04-03 15:51:31,4,./perfexp--upp-upp--queue-insfirst-remelem,661000000,5.002903,7.568688
-2023-04-03 15:51:36,2,./perfexp--lq-tailq--queue-insfirst-inselem,432000000,5.003819,11.582914
-2023-04-03 15:51:41,1,./perfexp--upp-upp--stack-insfirst-remelem,655000000,5.007278,7.644699
-2023-04-03 15:51:46,3,./perfexp--lq-tailq--stack-insfirst-allhead,596000000,5.002249,8.393035
-2023-04-03 15:51:51,5,./perfexp--upp-upp--stack-inslast-inselem,493000000,5.008268,10.158759
-2023-04-03 15:51:56,5,./perfexp--cfa-cfa--queue-inslast-inselem,520000000,5.008160,9.631077
-2023-04-03 15:52:01,2,./perfexp--cfa-cfa--queue-insfirst-allhead,509000000,5.001747,9.826615
-2023-04-03 15:52:06,2,./perfexp--cfa-cfa--queue-insfirst-remelem,717000000,5.003431,6.978286
-2023-04-03 15:52:11,5,./perfexp--cfa-cfa--stack-insfirst-inselem,548000000,5.005236,9.133642
-2023-04-03 15:52:16,5,./perfexp--upp-upp--stack-insfirst-allhead,589000000,5.008330,8.503107
-2023-04-03 15:52:21,3,./perfexp--upp-upp--queue-inslast-remelem,606000000,5.000791,8.252130
-2023-04-03 15:52:26,2,./perfexp--cfa-cfa--queue-insfirst-inselem,509000000,5.005662,9.834306
-2023-04-03 15:52:31,2,./perfexp--cpp-stlref--queue-insfirst-remelem,170000000,5.014890,29.499353
-2023-04-03 15:52:36,4,./perfexp--upp-upp--stack-insfirst-inselem,526000000,5.008703,9.522249
-2023-04-03 15:52:42,3,./perfexp--lq-list--stack-insfirst-inselem,442000000,5.009383,11.333446
-2023-04-03 15:52:47,3,./perfexp--cfa-cfa--queue-inslast-inselem,520000000,5.007789,9.630363
-2023-04-03 15:52:52,5,./perfexp--cpp-stlref--queue-insfirst-inselem,167000000,5.011863,30.011156
-2023-04-03 15:52:57,3,./perfexp--cfa-cfa--stack-insfirst-remelem,761000000,5.004427,6.576120
-2023-04-03 15:53:02,1,./perfexp--lq-tailq--queue-inslast-allhead,569000000,5.000007,8.787359
-2023-04-03 15:53:07,4,./perfexp--cfa-cfa--stack-insfirst-remelem,755000000,5.006075,6.630563
-2023-04-03 15:53:12,1,./perfexp--cfa-cfa--queue-insfirst-allhead,508000000,5.007775,9.857825
-2023-04-03 15:53:17,3,./perfexp--upp-upp--queue-insfirst-remelem,662000000,5.003549,7.558231
-2023-04-03 15:53:22,1,./perfexp--upp-upp--stack-insfirst-allhead,602000000,5.003572,8.311581
-2023-04-03 15:53:27,5,./perfexp--lq-tailq--stack-inslast-allhead,617000000,5.001483,8.106131
-2023-04-03 15:53:32,4,./perfexp--lq-list--stack-insfirst-inselem,442000000,5.010176,11.335240
-2023-04-03 15:53:37,4,./perfexp--cpp-stlref--stack-insfirst-allhead,166000000,5.013545,30.202078
-2023-04-03 15:53:42,5,./perfexp--cfa-cfa--stack-insfirst-allhead,552000000,5.000744,9.059319
-2023-04-03 15:53:47,4,./perfexp--lq-tailq--queue-insfirst-remelem,765000000,5.002711,6.539492
-2023-04-03 15:53:52,3,./perfexp--cfa-cfa--stack-insfirst-allhead,552000000,5.007654,9.071837
-2023-04-03 15:53:57,1,./perfexp--upp-upp--queue-insfirst-remelem,660000000,5.001139,7.577483
-2023-04-03 15:54:02,3,./perfexp--cpp-stlref--queue-insfirst-inselem,169000000,5.013091,29.663260
-2023-04-03 15:54:07,2,./perfexp--lq-list--stack-insfirst-remelem,713000000,5.006786,7.022140
-2023-04-03 15:54:12,1,./perfexp--lq-tailq--stack-inslast-inselem,606000000,5.002385,8.254761
-2023-04-03 15:54:17,4,./perfexp--upp-upp--queue-inslast-inselem,487000000,5.003862,10.274871
-2023-04-03 15:54:22,1,./perfexp--lq-list--stack-insfirst-allhead,593000000,5.002939,8.436659
-2023-04-03 15:54:27,2,./perfexp--lq-tailq--queue-inslast-allhead,565000000,5.004251,8.857081
-2023-04-03 15:54:32,5,./perfexp--lq-list--stack-insfirst-allhead,592000000,5.001007,8.447647
-2023-04-03 15:54:37,3,./perfexp--upp-upp--queue-inslast-allhead,538000000,5.007986,9.308524
-2023-04-03 15:54:42,4,./perfexp--lq-tailq--stack-inslast-allhead,617000000,5.004785,8.111483
-2023-04-03 15:54:47,2,./perfexp--lq-tailq--queue-insfirst-allhead,537000000,5.000866,9.312600
-2023-04-03 15:54:52,3,./perfexp--lq-tailq--stack-inslast-allhead,593000000,5.001259,8.433826
-2023-04-03 15:54:57,5,./perfexp--lq-tailq--stack-inslast-inselem,607000000,5.008090,8.250560
-2023-04-03 15:55:02,1,./perfexp--cfa-cfa--queue-inslast-inselem,520000000,5.007405,9.629625
-2023-04-03 15:55:07,2,./perfexp--lq-list--stack-insfirst-allhead,590000000,5.000838,8.475997
-2023-04-03 15:55:12,3,./perfexp--upp-upp--stack-insfirst-inselem,525000000,5.004319,9.532036
-2023-04-03 15:55:17,5,./perfexp--cpp-stlref--queue-insfirst-remelem,170000000,5.018299,29.519406
-2023-04-03 15:55:22,3,./perfexp--lq-tailq--queue-inslast-inselem,557000000,5.000287,8.977176
-2023-04-03 15:55:28,1,./perfexp--lq-tailq--queue-inslast-inselem,550000000,5.002507,9.095467
-2023-04-03 15:55:33,4,./perfexp--lq-tailq--queue-inslast-inselem,557000000,5.002020,8.980287
-2023-04-03 15:55:38,1,./perfexp--cfa-cfa--queue-insfirst-inselem,507000000,5.001630,9.865148
-2023-04-03 15:55:43,1,./perfexp--cpp-stlref--stack-inslast-inselem,166000000,5.029390,30.297530
-2023-04-03 15:55:48,2,./perfexp--upp-upp--queue-inslast-inselem,486000000,5.003020,10.294280
-2023-04-03 15:55:53,3,./perfexp--upp-upp--queue-insfirst-inselem,461000000,5.000073,10.846145
-2023-04-03 15:55:58,5,./perfexp--cfa-cfa--stack-inslast-allhead,547000000,5.004262,9.148559
-2023-04-03 15:56:03,1,./perfexp--lq-tailq--queue-inslast-remelem,546000000,5.005073,9.166800
-2023-04-03 15:56:08,3,./perfexp--lq-list--stack-insfirst-allhead,591000000,5.003465,8.466100
-2023-04-03 15:56:13,2,./perfexp--lq-tailq--stack-insfirst-remelem,716000000,5.001052,6.984709
-2023-04-03 15:56:18,4,./perfexp--cfa-cfa--queue-inslast-allhead,516000000,5.003638,9.696973
-2023-04-03 15:56:23,1,./perfexp--cpp-stlref--stack-insfirst-remelem,159000000,5.008347,31.499038
-2023-04-03 15:56:28,4,./perfexp--lq-tailq--stack-insfirst-inselem,445000000,5.007219,11.252178
-2023-04-03 15:56:33,2,./perfexp--lq-tailq--queue-insfirst-remelem,763000000,5.000451,6.553671
-2023-04-03 15:56:38,1,./perfexp--upp-upp--queue-insfirst-inselem,461000000,5.002222,10.850807
-2023-04-03 15:56:43,1,./perfexp--cpp-stlref--queue-insfirst-inselem,167000000,5.019099,30.054485
-2023-04-03 15:56:48,4,./perfexp--cfa-cfa--stack-insfirst-allhead,553000000,5.005063,9.050747
-2023-04-03 15:56:53,2,./perfexp--lq-tailq--queue-inslast-inselem,557000000,5.001068,8.978578
-2023-04-03 15:56:58,3,./perfexp--upp-upp--stack-insfirst-remelem,644000000,5.005232,7.772099
-2023-04-03 15:57:03,2,./perfexp--cfa-cfa--stack-inslast-inselem,538000000,5.004795,9.302593
-2023-04-03 15:57:08,4,./perfexp--cpp-stlref--stack-inslast-remelem,158000000,5.004902,31.676595
-2023-04-03 15:57:13,1,./perfexp--upp-upp--queue-inslast-allhead,539000000,5.002228,9.280571
-2023-04-03 15:57:18,5,./perfexp--cpp-stlref--stack-inslast-remelem,159000000,5.019823,31.571214
-2023-04-03 15:57:23,1,./perfexp--upp-upp--queue-insfirst-allhead,505000000,5.008103,9.917036
-2023-04-03 15:57:29,5,./perfexp--lq-tailq--queue-insfirst-inselem,415000000,5.000368,12.049080
-2023-04-03 15:57:34,3,./perfexp--cfa-cfa--queue-insfirst-inselem,509000000,5.003350,9.829764
-2023-04-03 15:57:39,1,./perfexp--upp-upp--stack-inslast-remelem,687000000,5.005699,7.286316
-2023-04-03 15:57:44,2,./perfexp--upp-upp--stack-insfirst-inselem,526000000,5.004338,9.513951
-2023-04-03 15:57:49,1,./perfexp--upp-upp--queue-inslast-inselem,489000000,5.001246,10.227497
-2023-04-03 15:57:54,3,./perfexp--cfa-cfa--queue-inslast-allhead,516000000,5.004492,9.698628
-2023-04-03 15:57:59,5,./perfexp--cfa-cfa--stack-inslast-remelem,772000000,5.002201,6.479535
-2023-04-03 15:58:04,5,./perfexp--lq-tailq--queue-insfirst-remelem,762000000,5.002834,6.565399
-2023-04-03 15:58:09,1,./perfexp--lq-list--stack-insfirst-inselem,441000000,5.003211,11.345150
-2023-04-03 15:58:14,1,./perfexp--cfa-cfa--queue-inslast-allhead,516000000,5.006598,9.702709
-2023-04-03 15:58:19,2,./perfexp--upp-upp--stack-insfirst-allhead,602000000,5.000444,8.306385
-2023-04-03 15:58:24,3,./perfexp--cfa-cfa--queue-inslast-remelem,702000000,5.005657,7.130566
-2023-04-03 15:58:29,4,./perfexp--cpp-stlref--queue-inslast-inselem,166000000,5.026702,30.281337
-2023-04-03 15:58:34,4,./perfexp--upp-upp--stack-insfirst-remelem,630000000,5.005706,7.945565
-2023-04-03 15:58:39,1,./perfexp--cfa-cfa--stack-insfirst-remelem,759000000,5.004132,6.593059
-2023-04-03 15:58:44,5,./perfexp--cpp-stlref--queue-inslast-remelem,167000000,5.024779,30.088497
-2023-04-03 15:58:49,5,./perfexp--upp-upp--queue-inslast-inselem,485000000,5.001876,10.313146
-2023-04-03 15:58:54,4,./perfexp--lq-tailq--stack-insfirst-allhead,595000000,5.003147,8.408650
-2023-04-03 15:58:59,5,./perfexp--upp-upp--stack-inslast-remelem,680000000,5.001317,7.354878
-2023-04-03 15:59:04,5,./perfexp--upp-upp--queue-insfirst-inselem,462000000,5.006965,10.837587
-2023-04-03 15:59:09,3,./perfexp--cpp-stlref--queue-inslast-allhead,172000000,5.023178,29.204523
-2023-04-03 15:59:14,4,./perfexp--cpp-stlref--queue-insfirst-allhead,173000000,5.020339,29.019301
-2023-04-03 15:59:19,5,./perfexp--lq-list--stack-insfirst-remelem,712000000,5.002571,7.026083
-2023-04-03 15:59:24,4,./perfexp--upp-upp--queue-insfirst-allhead,506000000,5.000700,9.882806
-2023-04-03 15:59:29,4,./perfexp--cpp-stlref--queue-inslast-allhead,167000000,5.011863,30.011156
-2023-04-03 15:59:34,2,./perfexp--cfa-cfa--stack-inslast-remelem,771000000,5.001426,6.486934
-2023-04-03 15:59:39,4,./perfexp--cfa-cfa--stack-insfirst-inselem,550000000,5.005721,9.101311
-2023-04-03 15:59:44,1,./perfexp--cfa-cfa--stack-insfirst-inselem,551000000,5.002555,9.079047
-2023-04-03 15:59:49,4,./perfexp--cfa-cfa--stack-inslast-allhead,546000000,5.001532,9.160315
-2023-04-03 15:59:54,2,./perfexp--cpp-stlref--queue-inslast-allhead,161000000,5.006152,31.094112
-2023-04-03 15:59:59,3,./perfexp--cpp-stlref--stack-inslast-allhead,166000000,5.020481,30.243861
-2023-04-03 16:00:04,1,./perfexp--cpp-stlref--stack-insfirst-inselem,165000000,5.020233,30.425655
-2023-04-03 16:00:09,3,./perfexp--cfa-cfa--queue-insfirst-allhead,509000000,5.003864,9.830774
-2023-04-03 16:00:14,4,./perfexp--lq-list--stack-insfirst-allhead,593000000,5.002670,8.436206
-2023-04-03 16:00:19,1,./perfexp--cpp-stlref--queue-insfirst-allhead,170000000,5.005779,29.445759
-2023-04-03 16:00:25,1,./perfexp--cpp-stlref--queue-inslast-allhead,168000000,5.021567,29.890280
-2023-04-03 16:00:30,5,./perfexp--cpp-stlref--queue-insfirst-allhead,170000000,5.030049,29.588524
-2023-04-03 16:00:35,5,./perfexp--upp-upp--queue-inslast-remelem,616000000,5.007578,8.129185
-2023-04-03 16:00:40,4,./perfexp--lq-list--stack-insfirst-remelem,713000000,5.002819,7.016576
-2023-04-03 16:00:45,3,./perfexp--upp-upp--queue-insfirst-allhead,501000000,5.007947,9.995902
+2023-04-06 22:38:43,2,5 100 72421 -1 2  ,./perfexp--cfa-cfa--stack-inslast-inselem,159326200,5.104060,32.035284
+2023-04-06 22:38:48,2,5 1000000 7 -1 2  ,./perfexp--cpp-stlref--queue-insfirst-remelem,224000000,5.117349,22.845308
+2023-04-06 22:38:54,4,5 1000000 7 -1 4  ,./perfexp--cpp-stlref--queue-inslast-allhead,224000000,5.062724,22.601446
+2023-04-06 22:38:59,5,5 100 72421 -1 5  ,./perfexp--cpp-stlref--queue-insfirst-allhead,166568300,5.161427,30.986850
+2023-04-06 22:39:04,3,5 10000 809 -1 3  ,./perfexp--cpp-stlref--queue-insfirst-remelem,169890000,5.005365,29.462387
+2023-04-06 22:39:09,3,5 10000 809 -1 3  ,./perfexp--cfa-cfa--queue-inslast-inselem,444950000,5.003260,11.244544
+2023-04-06 22:39:14,5,5 1000 9051 -1 5  ,./perfexp--lq-tailq--queue-insfirst-inselem,289632000,5.002701,17.272611
+2023-04-06 22:39:19,4,5 1000 9051 -1 4  ,./perfexp--cfa-cfa--queue-inslast-allhead,343938000,5.050625,14.684696
+2023-04-06 22:39:24,3,5 100000 71 -1 3  ,./perfexp--cfa-cfa--queue-insfirst-inselem,546700000,5.031248,9.202941
+2023-04-06 22:39:29,1,5 10000 809 -1 1  ,./perfexp--cpp-stlref--stack-inslast-allhead,177980000,5.214033,29.295612
+2023-04-06 22:39:34,2,5 1000 9051 -1 2  ,./perfexp--lq-tailq--stack-inslast-remelem,678825000,5.007971,7.377411
+2023-04-06 22:39:39,5,5 100000 71 -1 5  ,./perfexp--cpp-stlref--queue-inslast-remelem,177500000,5.051343,28.458270
+2023-04-06 22:39:44,4,5 100000 71 -1 4  ,./perfexp--cfa-cfa--stack-inslast-inselem,617700000,5.012318,8.114486
+2023-04-06 22:39:49,2,5 1000000 7 -1 2  ,./perfexp--lq-list--stack-insfirst-inselem,581000000,5.034526,8.665277
+2023-04-06 22:39:54,1,5 1000000 7 -1 1  ,./perfexp--lq-tailq--queue-insfirst-remelem,1309000000,5.007982,3.825807
+2023-04-06 22:39:59,3,5 100000 71 -1 3  ,./perfexp--upp-upp--stack-inslast-remelem,809400000,5.034582,6.220141
+2023-04-06 22:40:04,3,5 1000 9051 -1 3  ,./perfexp--lq-tailq--queue-inslast-allhead,352989000,5.080867,14.393839
+2023-04-06 22:40:10,1,5 100 72421 -1 1  ,./perfexp--lq-tailq--stack-inslast-inselem,159326200,5.152641,32.340199
+2023-04-06 22:40:15,4,5 100 72421 -1 4  ,./perfexp--lq-list--stack-insfirst-remelem,333136600,5.081694,15.254085
+2023-04-06 22:40:20,3,5 1000000 7 -1 3  ,./perfexp--cfa-cfa--queue-inslast-allhead,672000000,5.041239,7.501844
+2023-04-06 22:40:25,5,5 100 72421 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-remelem,159326200,5.216693,32.742217
+2023-04-06 22:40:30,3,5 100000 71 -1 3  ,./perfexp--lq-tailq--stack-inslast-inselem,908800000,5.036669,5.542109
+2023-04-06 22:40:35,1,5 100 72421 -1 1  ,./perfexp--lq-list--stack-insfirst-inselem,166568300,5.225242,31.369967
+2023-04-06 22:40:41,4,5 100 72421 -1 4  ,./perfexp--cfa-cfa--queue-inslast-allhead,137599900,5.143664,37.381306
+2023-04-06 22:40:46,5,5 100 72421 -1 5  ,./perfexp--cfa-cfa--stack-inslast-inselem,159326200,5.104856,32.040280
+2023-04-06 22:40:51,5,5 1000000 7 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,917000000,5.030506,5.485830
+2023-04-06 22:40:56,5,5 100 72421 -1 5  ,./perfexp--lq-tailq--queue-insfirst-remelem,296926100,5.105027,17.192921
+2023-04-06 22:41:01,4,5 100 72421 -1 4  ,./perfexp--cfa-cfa--queue-insfirst-allhead,137599900,5.150764,37.432905
+2023-04-06 22:41:06,1,5 100 72421 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,166568300,5.054932,30.347503
+2023-04-06 22:41:11,1,5 100 72421 -1 1  ,./perfexp--upp-upp--queue-insfirst-inselem,130357800,5.100502,39.126941
+2023-04-06 22:41:16,3,5 1000 9051 -1 3  ,./perfexp--lq-list--stack-insfirst-inselem,325836000,5.113777,15.694328
+2023-04-06 22:41:22,4,5 10000 809 -1 4  ,./perfexp--cpp-stlref--queue-insfirst-remelem,169890000,5.046006,29.701607
+2023-04-06 22:41:27,3,5 10000 809 -1 3  ,./perfexp--upp-upp--stack-insfirst-inselem,477310000,5.055761,10.592196
+2023-04-06 22:41:32,4,5 1000 9051 -1 4  ,./perfexp--cfa-cfa--queue-insfirst-remelem,588315000,5.001890,8.502061
+2023-04-06 22:41:37,1,5 1000000 7 -1 1  ,./perfexp--cfa-cfa--queue-insfirst-inselem,651000000,5.008924,7.694200
+2023-04-06 22:41:42,3,5 10000 809 -1 3  ,./perfexp--lq-tailq--stack-insfirst-remelem,590570000,5.038027,8.530787
+2023-04-06 22:41:47,4,5 1000 9051 -1 4  ,./perfexp--cpp-stlref--stack-inslast-remelem,153867000,5.210496,33.863635
+2023-04-06 22:41:52,2,5 100000 71 -1 2  ,./perfexp--lq-tailq--queue-insfirst-remelem,859100000,5.034777,5.860525
+2023-04-06 22:41:57,3,5 10000 809 -1 3  ,./perfexp--lq-list--stack-insfirst-remelem,590570000,5.065984,8.578126
+2023-04-06 22:42:02,5,5 10000 809 -1 5  ,./perfexp--lq-tailq--stack-inslast-inselem,493490000,5.014299,10.160893
+2023-04-06 22:42:07,2,5 100000 71 -1 2  ,./perfexp--cpp-stlref--queue-insfirst-allhead,184600000,5.079109,27.514133
+2023-04-06 22:42:12,2,5 1000000 7 -1 2  ,./perfexp--cpp-stlref--queue-insfirst-inselem,231000000,5.041959,21.826662
+2023-04-06 22:42:17,5,5 1000 9051 -1 5  ,./perfexp--cpp-stlref--stack-inslast-allhead,162918000,5.108416,31.355750
+2023-04-06 22:42:22,4,5 100 72421 -1 4  ,./perfexp--upp-upp--queue-insfirst-remelem,260715600,5.113112,19.611838
+2023-04-06 22:42:27,4,5 1000000 7 -1 4  ,./perfexp--lq-tailq--queue-inslast-inselem,833000000,5.028245,6.036309
+2023-04-06 22:42:33,2,5 1000 9051 -1 2  ,./perfexp--lq-tailq--queue-inslast-inselem,352989000,5.105392,14.463318
+2023-04-06 22:42:38,2,5 1000 9051 -1 2  ,./perfexp--upp-upp--stack-inslast-allhead,334887000,5.039581,15.048601
+2023-04-06 22:42:43,3,5 1000000 7 -1 3  ,./perfexp--upp-upp--stack-insfirst-remelem,763000000,5.016755,6.575039
+2023-04-06 22:42:48,1,5 100 72421 -1 1  ,./perfexp--lq-tailq--stack-inslast-allhead,159326200,5.111182,32.079984
+2023-04-06 22:42:53,1,5 100000 71 -1 1  ,./perfexp--cfa-cfa--stack-inslast-remelem,979800000,5.002241,5.105369
+2023-04-06 22:42:58,1,5 1000 9051 -1 1  ,./perfexp--upp-upp--stack-inslast-inselem,316785000,5.008967,15.811882
+2023-04-06 22:43:03,5,5 1000000 7 -1 5  ,./perfexp--lq-tailq--queue-insfirst-remelem,1316000000,5.025586,3.818834
+2023-04-06 22:43:08,3,5 1000000 7 -1 3  ,./perfexp--lq-tailq--queue-inslast-allhead,959000000,5.008021,5.222128
+2023-04-06 22:43:13,3,5 1000 9051 -1 3  ,./perfexp--upp-upp--stack-insfirst-remelem,461601000,5.006449,10.845837
+2023-04-06 22:43:18,2,5 1000000 7 -1 2  ,./perfexp--cfa-cfa--queue-inslast-inselem,658000000,5.029688,7.643903
+2023-04-06 22:43:23,5,5 1000000 7 -1 5  ,./perfexp--cfa-cfa--queue-inslast-inselem,658000000,5.022354,7.632757
+2023-04-06 22:43:28,4,5 100 72421 -1 4  ,./perfexp--lq-tailq--stack-inslast-remelem,347620800,5.032410,14.476723
+2023-04-06 22:43:33,1,5 100 72421 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,159326200,5.154973,32.354836
+2023-04-06 22:43:38,2,5 10000 809 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-remelem,169890000,5.130552,30.199258
+2023-04-06 22:43:43,4,5 1000 9051 -1 4  ,./perfexp--lq-list--stack-insfirst-remelem,543060000,5.083894,9.361570
+2023-04-06 22:43:49,5,5 10000 809 -1 5  ,./perfexp--cpp-stlref--queue-inslast-remelem,169890000,5.059665,29.782006
+2023-04-06 22:43:54,2,5 1000000 7 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,910000000,5.002806,5.497589
+2023-04-06 22:43:59,4,5 100000 71 -1 4  ,./perfexp--lq-tailq--queue-inslast-remelem,575100000,5.010242,8.711949
+2023-04-06 22:44:04,5,5 1000000 7 -1 5  ,./perfexp--upp-upp--queue-insfirst-allhead,728000000,5.022596,6.899170
+2023-04-06 22:44:09,1,5 10000 809 -1 1  ,./perfexp--cpp-stlref--stack-inslast-remelem,169890000,5.191497,30.557990
+2023-04-06 22:44:14,4,5 100000 71 -1 4  ,./perfexp--cfa-cfa--stack-inslast-allhead,639000000,5.034492,7.878704
+2023-04-06 22:44:19,5,5 100 72421 -1 5  ,./perfexp--lq-tailq--queue-inslast-remelem,311410300,5.098903,16.373585
+2023-04-06 22:44:24,5,5 1000 9051 -1 5  ,./perfexp--upp-upp--queue-insfirst-allhead,325836000,5.135714,15.761653
+2023-04-06 22:44:29,4,5 1000000 7 -1 4  ,./perfexp--lq-list--stack-insfirst-inselem,581000000,5.051661,8.694769
+2023-04-06 22:44:34,3,5 1000000 7 -1 3  ,./perfexp--upp-upp--stack-insfirst-inselem,679000000,5.043664,7.428077
+2023-04-06 22:44:39,5,5 100 72421 -1 5  ,./perfexp--upp-upp--queue-insfirst-inselem,130357800,5.100746,39.128813
+2023-04-06 22:44:45,4,5 100 72421 -1 4  ,./perfexp--cfa-cfa--queue-insfirst-inselem,137599900,5.151609,37.439046
+2023-04-06 22:44:50,4,5 1000000 7 -1 4  ,./perfexp--cfa-cfa--stack-inslast-allhead,672000000,5.022206,7.473521
+2023-04-06 22:44:55,2,5 1000 9051 -1 2  ,./perfexp--cfa-cfa--queue-insfirst-inselem,343938000,5.113961,14.868846
+2023-04-06 22:45:00,5,5 1000 9051 -1 5  ,./perfexp--cfa-cfa--queue-inslast-inselem,343938000,5.132823,14.923687
+2023-04-06 22:45:05,5,5 1000 9051 -1 5  ,./perfexp--lq-tailq--queue-inslast-allhead,352989000,5.051277,14.310012
+2023-04-06 22:45:10,1,5 1000 9051 -1 1  ,./perfexp--cfa-cfa--stack-inslast-inselem,343938000,5.079431,14.768450
+2023-04-06 22:45:15,2,5 100000 71 -1 2  ,./perfexp--upp-upp--stack-inslast-remelem,795200000,5.027511,6.322323
+2023-04-06 22:45:20,2,5 1000 9051 -1 2  ,./perfexp--lq-list--stack-insfirst-inselem,325836000,5.097880,15.645539
+2023-04-06 22:45:25,2,5 1000 9051 -1 2  ,./perfexp--lq-tailq--stack-inslast-allhead,325836000,5.039459,15.466244
+2023-04-06 22:45:30,3,5 10000 809 -1 3  ,./perfexp--upp-upp--stack-inslast-inselem,444950000,5.059145,11.370143
+2023-04-06 22:45:36,5,5 10000 809 -1 5  ,./perfexp--upp-upp--stack-inslast-inselem,444950000,5.072116,11.399294
+2023-04-06 22:45:41,5,5 100 72421 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,159326200,5.099274,32.005245
+2023-04-06 22:45:46,3,5 100000 71 -1 3  ,./perfexp--lq-tailq--queue-insfirst-allhead,788100000,5.037081,6.391424
+2023-04-06 22:45:51,4,5 100000 71 -1 4  ,./perfexp--lq-tailq--stack-inslast-allhead,1036600000,5.028854,4.851297
+2023-04-06 22:45:56,2,5 10000 809 -1 2  ,./perfexp--upp-upp--stack-inslast-allhead,493490000,5.043056,10.219166
+2023-04-06 22:46:01,3,5 10000 809 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-remelem,169890000,5.165830,30.406910
+2023-04-06 22:46:06,5,5 1000000 7 -1 5  ,./perfexp--lq-tailq--queue-inslast-remelem,777000000,5.026590,6.469228
+2023-04-06 22:46:11,1,5 10000 809 -1 1  ,./perfexp--lq-list--stack-insfirst-inselem,453040000,5.042693,11.130790
+2023-04-06 22:46:16,3,5 100 72421 -1 3  ,./perfexp--cpp-stlref--stack-inslast-inselem,159326200,5.021468,31.516901
+2023-04-06 22:46:21,1,5 10000 809 -1 1  ,./perfexp--upp-upp--queue-insfirst-allhead,444950000,5.058905,11.369603
+2023-04-06 22:46:26,2,5 100 72421 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-inselem,159326200,5.124781,32.165338
+2023-04-06 22:46:31,3,5 100000 71 -1 3  ,./perfexp--cpp-stlref--stack-inslast-allhead,184600000,5.086561,27.554502
+2023-04-06 22:46:37,1,5 100 72421 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-inselem,159326200,5.101698,32.020459
+2023-04-06 22:46:42,2,5 1000000 7 -1 2  ,./perfexp--lq-tailq--queue-inslast-remelem,777000000,5.024963,6.467134
+2023-04-06 22:46:47,1,5 100000 71 -1 1  ,./perfexp--lq-tailq--stack-inslast-inselem,901700000,5.038805,5.588117
+2023-04-06 22:46:52,4,5 1000 9051 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,325836000,5.086643,15.611053
+2023-04-06 22:46:57,1,5 1000000 7 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-remelem,917000000,5.029273,5.484485
+2023-04-06 22:47:02,2,5 100 72421 -1 2  ,./perfexp--upp-upp--stack-inslast-inselem,159326200,5.146099,32.299138
+2023-04-06 22:47:07,5,5 100000 71 -1 5  ,./perfexp--upp-upp--stack-inslast-allhead,646100000,5.036416,7.795103
+2023-04-06 22:47:12,1,5 100 72421 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-remelem,318652400,5.011899,15.728421
+2023-04-06 22:47:17,1,5 1000 9051 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-remelem,579264000,5.006702,8.643213
+2023-04-06 22:47:22,1,5 10000 809 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-inselem,477310000,5.036310,10.551445
+2023-04-06 22:47:27,5,5 100 72421 -1 5  ,./perfexp--cpp-stlref--stack-inslast-allhead,159326200,5.051290,31.704076
+2023-04-06 22:47:32,2,5 10000 809 -1 2  ,./perfexp--lq-tailq--stack-inslast-allhead,509670000,5.059480,9.926972
+2023-04-06 22:47:37,2,5 1000 9051 -1 2  ,./perfexp--lq-tailq--queue-inslast-remelem,534009000,5.021579,9.403548
+2023-04-06 22:47:42,4,5 1000000 7 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-inselem,665000000,5.028019,7.560931
+2023-04-06 22:47:47,2,5 100000 71 -1 2  ,./perfexp--cpp-stlref--stack-inslast-remelem,177500000,5.011349,28.232952
+2023-04-06 22:47:52,2,5 100000 71 -1 2  ,./perfexp--lq-tailq--stack-inslast-remelem,1242500000,5.025123,4.044365
+2023-04-06 22:47:57,5,5 1000 9051 -1 5  ,./perfexp--lq-tailq--stack-inslast-allhead,325836000,5.033694,15.448551
+2023-04-06 22:48:02,5,5 10000 809 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,525850000,5.074913,9.650876
+2023-04-06 22:48:08,3,5 100 72421 -1 3  ,./perfexp--lq-tailq--queue-inslast-remelem,311410300,5.100754,16.379529
+2023-04-06 22:48:13,3,5 100 72421 -1 3  ,./perfexp--lq-tailq--queue-insfirst-remelem,296926100,5.107471,17.201152
+2023-04-06 22:48:18,5,5 1000 9051 -1 5  ,./perfexp--cfa-cfa--queue-insfirst-allhead,334887000,5.049385,15.077877
+2023-04-06 22:48:23,3,5 1000000 7 -1 3  ,./perfexp--upp-upp--stack-inslast-remelem,665000000,5.048229,7.591322
+2023-04-06 22:48:28,5,5 100 72421 -1 5  ,./perfexp--cpp-stlref--queue-inslast-inselem,159326200,5.039389,31.629380
+2023-04-06 22:48:33,4,5 100 72421 -1 4  ,./perfexp--upp-upp--stack-insfirst-remelem,267957700,5.032279,18.780125
+2023-04-06 22:48:38,5,5 1000000 7 -1 5  ,./perfexp--cfa-cfa--queue-insfirst-inselem,658000000,5.048589,7.672628
+2023-04-06 22:48:43,2,5 1000000 7 -1 2  ,./perfexp--cpp-stlref--stack-inslast-remelem,224000000,5.116992,22.843714
+2023-04-06 22:48:48,5,5 1000 9051 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,352989000,5.129190,14.530736
+2023-04-06 22:48:53,5,5 1000000 7 -1 5  ,./perfexp--cpp-stlref--stack-inslast-remelem,224000000,5.044124,22.518411
+2023-04-06 22:48:58,1,5 100 72421 -1 1  ,./perfexp--upp-upp--stack-inslast-allhead,159326200,5.085806,31.920714
+2023-04-06 22:49:04,3,5 10000 809 -1 3  ,./perfexp--lq-tailq--queue-inslast-remelem,574390000,5.067621,8.822614
+2023-04-06 22:49:09,2,5 100 72421 -1 2  ,./perfexp--lq-list--stack-insfirst-inselem,159326200,5.003104,31.401640
+2023-04-06 22:49:14,3,5 1000 9051 -1 3  ,./perfexp--upp-upp--queue-insfirst-inselem,307734000,5.021786,16.318593
+2023-04-06 22:49:19,3,5 1000000 7 -1 3  ,./perfexp--lq-tailq--queue-insfirst-inselem,973000000,5.029223,5.168780
+2023-04-06 22:49:24,3,5 100000 71 -1 3  ,./perfexp--lq-tailq--stack-insfirst-inselem,646100000,5.013377,7.759444
+2023-04-06 22:49:29,1,5 1000000 7 -1 1  ,./perfexp--cpp-stlref--stack-inslast-inselem,224000000,5.026205,22.438415
+2023-04-06 22:49:34,5,5 1000 9051 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,162918000,5.122192,31.440307
+2023-04-06 22:49:39,4,5 1000000 7 -1 4  ,./perfexp--cpp-stlref--queue-insfirst-inselem,217000000,5.012642,23.099733
+2023-04-06 22:49:44,1,5 1000 9051 -1 1  ,./perfexp--lq-list--stack-insfirst-remelem,534009000,5.010162,9.382168
+2023-04-06 22:49:49,5,5 1000000 7 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-inselem,665000000,5.025341,7.556904
+2023-04-06 22:49:54,2,5 1000 9051 -1 2  ,./perfexp--cpp-stlref--stack-inslast-inselem,162918000,5.112699,31.382039
+2023-04-06 22:49:59,5,5 100 72421 -1 5  ,./perfexp--cfa-cfa--queue-inslast-remelem,289684000,5.092223,17.578544
+2023-04-06 22:50:04,1,5 10000 809 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,509670000,5.018786,9.847129
+2023-04-06 22:50:09,1,5 1000000 7 -1 1  ,./perfexp--upp-upp--stack-insfirst-inselem,679000000,5.046907,7.432853
+2023-04-06 22:50:14,4,5 1000000 7 -1 4  ,./perfexp--upp-upp--stack-inslast-allhead,763000000,5.000173,6.553307
+2023-04-06 22:50:19,2,5 10000 809 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,509670000,5.001591,9.813391
+2023-04-06 22:50:24,1,5 100 72421 -1 1  ,./perfexp--upp-upp--queue-insfirst-remelem,260715600,5.115727,19.621868
+2023-04-06 22:50:30,4,5 1000 9051 -1 4  ,./perfexp--lq-tailq--stack-insfirst-inselem,325836000,5.102080,15.658429
+2023-04-06 22:50:35,5,5 1000 9051 -1 5  ,./perfexp--cpp-stlref--queue-inslast-remelem,171969000,5.259251,30.582553
+2023-04-06 22:50:40,1,5 100 72421 -1 1  ,./perfexp--cpp-stlref--queue-inslast-allhead,159326200,5.062565,31.774843
+2023-04-06 22:50:45,4,5 1000 9051 -1 4  ,./perfexp--lq-tailq--stack-inslast-remelem,687876000,5.057051,7.351690
+2023-04-06 22:50:50,3,5 100 72421 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-inselem,159326200,5.115809,32.109025
+2023-04-06 22:50:55,3,5 1000000 7 -1 3  ,./perfexp--cfa-cfa--queue-inslast-remelem,973000000,5.015677,5.154858
+2023-04-06 22:51:00,3,5 100 72421 -1 3  ,./perfexp--upp-upp--queue-inslast-remelem,260715600,5.002998,19.189485
+2023-04-06 22:51:05,1,5 1000 9051 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,343938000,5.009464,14.565020
+2023-04-06 22:51:10,1,5 100 72421 -1 1  ,./perfexp--cpp-stlref--stack-inslast-allhead,159326200,5.001947,31.394378
+2023-04-06 22:51:15,2,5 1000000 7 -1 2  ,./perfexp--cfa-cfa--stack-inslast-remelem,966000000,5.019736,5.196414
+2023-04-06 22:51:20,2,5 10000 809 -1 2  ,./perfexp--lq-tailq--queue-insfirst-allhead,461130000,5.067126,10.988498
+2023-04-06 22:51:25,2,5 10000 809 -1 2  ,./perfexp--cpp-stlref--stack-inslast-inselem,169890000,5.037162,29.649550
+2023-04-06 22:51:31,2,5 10000 809 -1 2  ,./perfexp--upp-upp--stack-inslast-remelem,679560000,5.044672,7.423439
+2023-04-06 22:51:36,4,5 1000 9051 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-remelem,153867000,5.093303,33.101984
+2023-04-06 22:51:41,2,5 1000 9051 -1 2  ,./perfexp--upp-upp--stack-inslast-remelem,570213000,5.076763,8.903275
+2023-04-06 22:51:46,1,5 100000 71 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,781000000,5.034261,6.445917
+2023-04-06 22:51:51,4,5 1000 9051 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,352989000,5.119857,14.504296
+2023-04-06 22:51:56,4,5 100000 71 -1 4  ,./perfexp--cfa-cfa--queue-inslast-inselem,568000000,5.020960,8.839718
+2023-04-06 22:52:01,2,5 1000000 7 -1 2  ,./perfexp--upp-upp--stack-insfirst-inselem,679000000,5.020031,7.393271
+2023-04-06 22:52:06,5,5 10000 809 -1 5  ,./perfexp--cfa-cfa--stack-inslast-inselem,477310000,5.065549,10.612702
+2023-04-06 22:52:11,1,5 1000 9051 -1 1  ,./perfexp--upp-upp--queue-inslast-allhead,334887000,5.061093,15.112838
+2023-04-06 22:52:16,1,5 1000 9051 -1 1  ,./perfexp--cpp-stlref--queue-insfirst-remelem,171969000,5.199554,30.235415
+2023-04-06 22:52:21,4,5 1000000 7 -1 4  ,./perfexp--lq-tailq--stack-insfirst-remelem,791000000,5.030514,6.359689
+2023-04-06 22:52:26,4,5 100000 71 -1 4  ,./perfexp--lq-tailq--stack-insfirst-inselem,660300000,5.021934,7.605534
+2023-04-06 22:52:31,4,5 1000000 7 -1 4  ,./perfexp--cpp-stlref--stack-inslast-inselem,224000000,5.069797,22.633022
+2023-04-06 22:52:37,1,5 100000 71 -1 1  ,./perfexp--lq-tailq--queue-insfirst-inselem,766800000,5.034758,6.565934
+2023-04-06 22:52:42,2,5 100000 71 -1 2  ,./perfexp--lq-tailq--stack-insfirst-inselem,738400000,5.004336,6.777270
+2023-04-06 22:52:47,3,5 1000000 7 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-inselem,665000000,5.024545,7.555707
+2023-04-06 22:52:52,1,5 1000 9051 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,343938000,5.070304,14.741913
+2023-04-06 22:52:57,5,5 100000 71 -1 5  ,./perfexp--lq-tailq--stack-insfirst-remelem,688700000,5.007406,7.270809
+2023-04-06 22:53:02,1,5 100000 71 -1 1  ,./perfexp--cpp-stlref--queue-insfirst-allhead,184600000,5.064279,27.433797
+2023-04-06 22:53:07,1,5 1000000 7 -1 1  ,./perfexp--lq-tailq--stack-inslast-allhead,1078000000,5.011355,4.648752
+2023-04-06 22:53:12,4,5 100000 71 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,809400000,5.030850,6.215530
+2023-04-06 22:53:17,1,5 100000 71 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,184600000,5.121858,27.745710
+2023-04-06 22:53:22,2,5 10000 809 -1 2  ,./perfexp--cpp-stlref--queue-inslast-allhead,177980000,5.177338,29.089437
+2023-04-06 22:53:27,2,5 1000 9051 -1 2  ,./perfexp--lq-tailq--queue-insfirst-inselem,298683000,5.103575,17.086928
+2023-04-06 22:53:32,4,5 1000000 7 -1 4  ,./perfexp--cfa-cfa--stack-inslast-remelem,959000000,5.004941,5.218917
+2023-04-06 22:53:37,4,5 10000 809 -1 4  ,./perfexp--cfa-cfa--queue-inslast-inselem,453040000,5.084873,11.223894
+2023-04-06 22:53:43,4,5 1000000 7 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,917000000,5.007210,5.460425
+2023-04-06 22:53:48,2,5 10000 809 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,485400000,5.073608,10.452427
+2023-04-06 22:53:53,3,5 1000 9051 -1 3  ,./perfexp--cfa-cfa--stack-inslast-allhead,334887000,5.007885,14.953955
+2023-04-06 22:53:58,3,5 100 72421 -1 3  ,./perfexp--cfa-cfa--queue-insfirst-allhead,137599900,5.149462,37.423443
+2023-04-06 22:54:03,3,5 100 72421 -1 3  ,./perfexp--upp-upp--queue-inslast-inselem,137599900,5.086708,36.967382
+2023-04-06 22:54:08,4,5 1000 9051 -1 4  ,./perfexp--cfa-cfa--queue-insfirst-inselem,343938000,5.092902,14.807616
+2023-04-06 22:54:13,5,5 100000 71 -1 5  ,./perfexp--lq-list--stack-insfirst-remelem,688700000,5.002389,7.263524
+2023-04-06 22:54:18,5,5 100 72421 -1 5  ,./perfexp--cfa-cfa--queue-inslast-allhead,137599900,5.146658,37.403065
+2023-04-06 22:54:23,1,5 1000 9051 -1 1  ,./perfexp--cfa-cfa--stack-inslast-remelem,597366000,5.073255,8.492708
+2023-04-06 22:54:28,4,5 100000 71 -1 4  ,./perfexp--upp-upp--stack-insfirst-remelem,759700000,5.005199,6.588389
+2023-04-06 22:54:33,5,5 100 72421 -1 5  ,./perfexp--lq-tailq--stack-inslast-remelem,347620800,5.035473,14.485534
+2023-04-06 22:54:38,2,5 100000 71 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-remelem,908800000,5.019250,5.522942
+2023-04-06 22:54:43,3,5 100 72421 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,159326200,5.030282,31.572221
+2023-04-06 22:54:48,5,5 10000 809 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,177980000,5.213425,29.292196
+2023-04-06 22:54:54,3,5 10000 809 -1 3  ,./perfexp--lq-tailq--queue-inslast-allhead,469220000,5.071355,10.808054
+2023-04-06 22:54:59,4,5 100000 71 -1 4  ,./perfexp--lq-tailq--stack-insfirst-remelem,688700000,5.012374,7.278022
+2023-04-06 22:55:04,4,5 10000 809 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-remelem,720010000,5.044350,7.005944
+2023-04-06 22:55:09,5,5 100000 71 -1 5  ,./perfexp--cfa-cfa--stack-inslast-allhead,624800000,5.034208,8.057311
+2023-04-06 22:55:14,5,5 100 72421 -1 5  ,./perfexp--upp-upp--queue-insfirst-remelem,260715600,5.109722,19.598835
+2023-04-06 22:55:19,1,5 1000000 7 -1 1  ,./perfexp--cfa-cfa--queue-inslast-inselem,658000000,5.025521,7.637570
+2023-04-06 22:55:24,1,5 1000 9051 -1 1  ,./perfexp--cfa-cfa--queue-inslast-remelem,588315000,5.043017,8.571967
+2023-04-06 22:55:29,1,5 100 72421 -1 1  ,./perfexp--lq-tailq--stack-insfirst-inselem,159326200,5.003525,31.404283
+2023-04-06 22:55:34,2,5 100 72421 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-remelem,318652400,5.010231,15.723186
+2023-04-06 22:55:39,3,5 100 72421 -1 3  ,./perfexp--cfa-cfa--queue-insfirst-inselem,137599900,5.150708,37.432498
+2023-04-06 22:55:44,4,5 1000000 7 -1 4  ,./perfexp--upp-upp--queue-insfirst-inselem,595000000,5.044665,8.478429
+2023-04-06 22:55:49,4,5 100 72421 -1 4  ,./perfexp--cpp-stlref--stack-inslast-remelem,159326200,5.209063,32.694328
+2023-04-06 22:55:55,1,5 10000 809 -1 1  ,./perfexp--lq-tailq--stack-inslast-allhead,509670000,5.053284,9.914815
+2023-04-06 22:56:00,4,5 100000 71 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,795200000,5.012552,6.303511
+2023-04-06 22:56:05,4,5 100000 71 -1 4  ,./perfexp--lq-tailq--queue-insfirst-allhead,766800000,5.033161,6.563851
+2023-04-06 22:56:10,2,5 100 72421 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,159326200,5.121738,32.146238
+2023-04-06 22:56:15,5,5 1000 9051 -1 5  ,./perfexp--upp-upp--stack-inslast-allhead,334887000,5.028414,15.015256
+2023-04-06 22:56:20,5,5 1000 9051 -1 5  ,./perfexp--lq-list--stack-insfirst-inselem,325836000,5.124252,15.726476
+2023-04-06 22:56:25,4,5 10000 809 -1 4  ,./perfexp--cpp-stlref--queue-inslast-inselem,177980000,5.172291,29.061080
+2023-04-06 22:56:30,3,5 100000 71 -1 3  ,./perfexp--cfa-cfa--queue-insfirst-remelem,830700000,5.042470,6.070146
+2023-04-06 22:56:35,5,5 1000000 7 -1 5  ,./perfexp--upp-upp--queue-insfirst-remelem,847000000,5.032186,5.941188
+2023-04-06 22:56:40,1,5 100000 71 -1 1  ,./perfexp--lq-tailq--queue-inslast-remelem,639000000,5.002609,7.828809
+2023-04-06 22:56:45,1,5 1000000 7 -1 1  ,./perfexp--lq-tailq--queue-inslast-remelem,770000000,5.038757,6.543840
+2023-04-06 22:56:50,3,5 1000000 7 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,231000000,5.137935,22.242143
+2023-04-06 22:56:56,1,5 1000000 7 -1 1  ,./perfexp--cpp-stlref--stack-inslast-allhead,224000000,5.091507,22.729942
+2023-04-06 22:57:01,4,5 10000 809 -1 4  ,./perfexp--upp-upp--queue-insfirst-inselem,412590000,5.037820,12.210233
+2023-04-06 22:57:06,1,5 1000000 7 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-remelem,231000000,5.102198,22.087437
+2023-04-06 22:57:11,3,5 1000 9051 -1 3  ,./perfexp--cpp-stlref--queue-inslast-allhead,171969000,5.164593,30.032116
+2023-04-06 22:57:16,3,5 10000 809 -1 3  ,./perfexp--cpp-stlref--stack-inslast-remelem,169890000,5.225116,30.755877
+2023-04-06 22:57:21,4,5 1000 9051 -1 4  ,./perfexp--lq-tailq--queue-insfirst-allhead,316785000,5.093369,16.078315
+2023-04-06 22:57:26,1,5 100000 71 -1 1  ,./perfexp--cfa-cfa--stack-inslast-inselem,603500000,5.049990,8.367838
+2023-04-06 22:57:31,2,5 100 72421 -1 2  ,./perfexp--cpp-stlref--queue-inslast-allhead,166568300,5.220664,31.342482
+2023-04-06 22:57:37,2,5 100000 71 -1 2  ,./perfexp--cfa-cfa--queue-inslast-inselem,568000000,5.010944,8.822085
+2023-04-06 22:57:42,3,5 100 72421 -1 3  ,./perfexp--lq-tailq--queue-inslast-allhead,144842000,5.227036,36.087847
+2023-04-06 22:57:47,4,5 100 72421 -1 4  ,./perfexp--cpp-stlref--queue-insfirst-remelem,159326200,5.217508,32.747332
+2023-04-06 22:57:52,2,5 100 72421 -1 2  ,./perfexp--cfa-cfa--queue-insfirst-allhead,137599900,5.146662,37.403094
+2023-04-06 22:57:57,1,5 100000 71 -1 1  ,./perfexp--lq-tailq--stack-insfirst-remelem,667400000,5.038476,7.549410
+2023-04-06 22:58:02,2,5 100 72421 -1 2  ,./perfexp--cpp-stlref--stack-inslast-allhead,159326200,5.013988,31.469953
+2023-04-06 22:58:07,1,5 1000000 7 -1 1  ,./perfexp--cfa-cfa--queue-insfirst-remelem,1008000000,5.010780,4.971012
+2023-04-06 22:58:12,5,5 1000000 7 -1 5  ,./perfexp--lq-tailq--stack-inslast-remelem,1421000000,5.023422,3.535132
+2023-04-06 22:58:17,1,5 100000 71 -1 1  ,./perfexp--upp-upp--queue-insfirst-inselem,553800000,5.060584,9.137927
+2023-04-06 22:58:23,2,5 1000000 7 -1 2  ,./perfexp--upp-upp--queue-insfirst-inselem,595000000,5.047132,8.482575
+2023-04-06 22:58:28,5,5 1000 9051 -1 5  ,./perfexp--cfa-cfa--queue-inslast-remelem,588315000,5.032246,8.553659
+2023-04-06 22:58:33,5,5 100000 71 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,724200000,5.020706,6.932762
+2023-04-06 22:58:38,1,5 1000 9051 -1 1  ,./perfexp--cfa-cfa--queue-inslast-inselem,334887000,5.003484,14.940813
+2023-04-06 22:58:43,1,5 1000000 7 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,840000000,5.042287,6.002723
+2023-04-06 22:58:48,3,5 1000000 7 -1 3  ,./perfexp--cpp-stlref--queue-inslast-remelem,224000000,5.088342,22.715813
+2023-04-06 22:58:53,2,5 10000 809 -1 2  ,./perfexp--cpp-stlref--queue-inslast-inselem,169890000,5.058348,29.774254
+2023-04-06 22:58:58,2,5 100000 71 -1 2  ,./perfexp--upp-upp--queue-inslast-allhead,695800000,5.026595,7.224195
+2023-04-06 22:59:03,2,5 100000 71 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-inselem,184600000,5.066927,27.448142
+2023-04-06 22:59:08,3,5 100000 71 -1 3  ,./perfexp--cpp-stlref--queue-insfirst-inselem,184600000,5.055439,27.385910
+2023-04-06 22:59:13,4,5 1000000 7 -1 4  ,./perfexp--lq-tailq--queue-insfirst-remelem,1309000000,5.009552,3.827007
+2023-04-06 22:59:18,2,5 1000000 7 -1 2  ,./perfexp--cfa-cfa--queue-insfirst-inselem,658000000,5.048553,7.672573
+2023-04-06 22:59:23,3,5 100 72421 -1 3  ,./perfexp--cfa-cfa--queue-inslast-allhead,137599900,5.143656,37.381248
+2023-04-06 22:59:29,4,5 1000000 7 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,224000000,5.132010,22.910759
+2023-04-06 22:59:34,3,5 100000 71 -1 3  ,./perfexp--lq-tailq--stack-insfirst-remelem,695800000,5.046242,7.252432
+2023-04-06 22:59:39,5,5 100000 71 -1 5  ,./perfexp--upp-upp--stack-insfirst-inselem,603500000,5.003978,8.291596
+2023-04-06 22:59:44,5,5 1000000 7 -1 5  ,./perfexp--cfa-cfa--queue-insfirst-allhead,665000000,5.025093,7.556531
+2023-04-06 22:59:49,3,5 100000 71 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-remelem,965600000,5.028275,5.207410
+2023-04-06 22:59:54,4,5 10000 809 -1 4  ,./perfexp--cfa-cfa--queue-insfirst-remelem,687650000,5.005714,7.279450
+2023-04-06 22:59:59,1,5 10000 809 -1 1  ,./perfexp--lq-tailq--stack-insfirst-remelem,590570000,5.031737,8.520136
+2023-04-06 23:00:04,3,5 100000 71 -1 3  ,./perfexp--cpp-stlref--queue-inslast-remelem,184600000,5.160974,27.957606
+2023-04-06 23:00:09,5,5 100 72421 -1 5  ,./perfexp--lq-list--stack-insfirst-remelem,333136600,5.090510,15.280549
+2023-04-06 23:00:14,5,5 100 72421 -1 5  ,./perfexp--lq-list--stack-insfirst-inselem,159326200,5.004048,31.407565
+2023-04-06 23:00:19,2,5 10000 809 -1 2  ,./perfexp--upp-upp--queue-insfirst-allhead,444950000,5.073828,11.403142
+2023-04-06 23:00:24,3,5 1000000 7 -1 3  ,./perfexp--cpp-stlref--queue-inslast-allhead,224000000,5.001734,22.329170
+2023-04-06 23:00:29,2,5 10000 809 -1 2  ,./perfexp--cfa-cfa--stack-inslast-allhead,477310000,5.050386,10.580935
+2023-04-06 23:00:34,4,5 1000 9051 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,343938000,5.050309,14.683777
+2023-04-06 23:00:40,3,5 10000 809 -1 3  ,./perfexp--upp-upp--queue-insfirst-allhead,444950000,5.017058,11.275555
+2023-04-06 23:00:45,3,5 1000000 7 -1 3  ,./perfexp--cfa-cfa--queue-insfirst-remelem,994000000,5.019649,5.049949
+2023-04-06 23:00:50,5,5 1000 9051 -1 5  ,./perfexp--cpp-stlref--stack-inslast-remelem,153867000,5.201021,33.802056
+2023-04-06 23:00:55,4,5 1000000 7 -1 4  ,./perfexp--cfa-cfa--queue-insfirst-remelem,1001000000,5.015588,5.010577
+2023-04-06 23:01:00,1,5 10000 809 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-remelem,161800000,5.005496,30.936316
+2023-04-06 23:01:05,1,5 1000000 7 -1 1  ,./perfexp--cfa-cfa--queue-inslast-allhead,665000000,5.035214,7.571750
+2023-04-06 23:01:10,2,5 100 72421 -1 2  ,./perfexp--lq-tailq--stack-inslast-allhead,159326200,5.109530,32.069616
+2023-04-06 23:01:15,2,5 10000 809 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,169890000,5.100783,30.024033
+2023-04-06 23:01:20,1,5 100000 71 -1 1  ,./perfexp--upp-upp--stack-insfirst-remelem,639000000,5.014872,7.848000
+2023-04-06 23:01:25,3,5 10000 809 -1 3  ,./perfexp--cpp-stlref--queue-inslast-inselem,169890000,5.046345,29.703602
+2023-04-06 23:01:30,1,5 1000000 7 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,896000000,5.013958,5.595935
+2023-04-06 23:01:35,1,5 1000000 7 -1 1  ,./perfexp--lq-list--stack-insfirst-inselem,581000000,5.047488,8.687587
+2023-04-06 23:01:40,2,5 10000 809 -1 2  ,./perfexp--lq-tailq--stack-insfirst-inselem,501580000,5.002330,9.973145
+2023-04-06 23:01:45,4,5 100000 71 -1 4  ,./perfexp--cfa-cfa--stack-inslast-remelem,986900000,5.036032,5.102880
+2023-04-06 23:01:50,4,5 100 72421 -1 4  ,./perfexp--cpp-stlref--queue-insfirst-inselem,166568300,5.162360,30.992452
+2023-04-06 23:01:55,4,5 1000 9051 -1 4  ,./perfexp--upp-upp--stack-inslast-inselem,325836000,5.137919,15.768420
+2023-04-06 23:02:01,4,5 100000 71 -1 4  ,./perfexp--upp-upp--queue-insfirst-remelem,710000000,5.019927,7.070320
+2023-04-06 23:02:06,3,5 1000 9051 -1 3  ,./perfexp--upp-upp--stack-inslast-allhead,334887000,5.098791,15.225407
+2023-04-06 23:02:11,1,5 1000000 7 -1 1  ,./perfexp--upp-upp--queue-insfirst-allhead,651000000,5.049504,7.756535
+2023-04-06 23:02:16,4,5 1000 9051 -1 4  ,./perfexp--lq-tailq--stack-insfirst-remelem,515907000,5.019478,9.729424
+2023-04-06 23:02:21,1,5 1000 9051 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,325836000,5.095609,15.638570
+2023-04-06 23:02:26,5,5 1000000 7 -1 5  ,./perfexp--lq-list--stack-insfirst-inselem,581000000,5.050648,8.693026
+2023-04-06 23:02:31,1,5 1000 9051 -1 1  ,./perfexp--lq-tailq--stack-insfirst-remelem,534009000,5.012189,9.385964
+2023-04-06 23:02:36,1,5 1000 9051 -1 1  ,./perfexp--cfa-cfa--queue-insfirst-inselem,343938000,5.100634,14.830097
+2023-04-06 23:02:41,3,5 10000 809 -1 3  ,./perfexp--cpp-stlref--queue-insfirst-allhead,177980000,5.039308,28.313900
+2023-04-06 23:02:46,3,5 10000 809 -1 3  ,./perfexp--upp-upp--queue-insfirst-inselem,412590000,5.053218,12.247553
+2023-04-06 23:02:51,1,5 1000 9051 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-inselem,162918000,5.104631,31.332517
+2023-04-06 23:02:56,4,5 100 72421 -1 4  ,./perfexp--cpp-stlref--queue-insfirst-allhead,166568300,5.127294,30.781931
+2023-04-06 23:03:02,5,5 100 72421 -1 5  ,./perfexp--upp-upp--queue-inslast-inselem,137599900,5.086178,36.963530
+2023-04-06 23:03:07,2,5 100000 71 -1 2  ,./perfexp--cpp-stlref--queue-inslast-inselem,177500000,5.030765,28.342338
+2023-04-06 23:03:12,4,5 1000000 7 -1 4  ,./perfexp--lq-list--stack-insfirst-remelem,798000000,5.017055,6.287036
+2023-04-06 23:03:17,5,5 100000 71 -1 5  ,./perfexp--lq-tailq--stack-insfirst-inselem,660300000,5.001824,7.575078
+2023-04-06 23:03:22,4,5 10000 809 -1 4  ,./perfexp--lq-list--stack-insfirst-inselem,436860000,5.056530,11.574715
+2023-04-06 23:03:27,1,5 1000000 7 -1 1  ,./perfexp--cfa-cfa--queue-insfirst-allhead,665000000,5.023530,7.554180
+2023-04-06 23:03:32,1,5 100000 71 -1 1  ,./perfexp--lq-list--stack-insfirst-inselem,553800000,5.027487,9.078164
+2023-04-06 23:03:37,5,5 1000000 7 -1 5  ,./perfexp--cfa-cfa--stack-inslast-allhead,672000000,5.030612,7.486030
+2023-04-06 23:03:42,3,5 1000000 7 -1 3  ,./perfexp--upp-upp--queue-insfirst-allhead,672000000,5.043560,7.505298
+2023-04-06 23:03:47,2,5 100 72421 -1 2  ,./perfexp--lq-list--stack-insfirst-remelem,333136600,5.084613,15.262847
+2023-04-06 23:03:52,3,5 100000 71 -1 3  ,./perfexp--upp-upp--stack-inslast-allhead,738400000,5.043688,6.830563
+2023-04-06 23:03:57,1,5 1000 9051 -1 1  ,./perfexp--cpp-stlref--queue-inslast-remelem,171969000,5.223951,30.377283
+2023-04-06 23:04:02,4,5 1000 9051 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-inselem,162918000,5.126779,31.468463
+2023-04-06 23:04:08,1,5 1000000 7 -1 1  ,./perfexp--lq-tailq--stack-inslast-remelem,1421000000,5.023912,3.535476
+2023-04-06 23:04:13,1,5 1000000 7 -1 1  ,./perfexp--upp-upp--stack-inslast-allhead,658000000,5.020341,7.629698
+2023-04-06 23:04:18,4,5 1000 9051 -1 4  ,./perfexp--upp-upp--stack-insfirst-remelem,461601000,5.016184,10.866926
+2023-04-06 23:04:23,3,5 10000 809 -1 3  ,./perfexp--cpp-stlref--stack-inslast-allhead,177980000,5.210149,29.273789
+2023-04-06 23:04:28,4,5 100 72421 -1 4  ,./perfexp--upp-upp--stack-insfirst-inselem,159326200,5.202610,32.653826
+2023-04-06 23:04:33,5,5 1000000 7 -1 5  ,./perfexp--cfa-cfa--stack-inslast-remelem,966000000,5.014821,5.191326
+2023-04-06 23:04:38,2,5 10000 809 -1 2  ,./perfexp--cfa-cfa--stack-inslast-remelem,728100000,5.003623,6.872165
+2023-04-06 23:04:43,4,5 100000 71 -1 4  ,./perfexp--cpp-stlref--stack-inslast-allhead,184600000,5.136308,27.823987
+2023-04-06 23:04:48,1,5 10000 809 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,477310000,5.001601,10.478727
+2023-04-06 23:04:53,4,5 100000 71 -1 4  ,./perfexp--cfa-cfa--queue-inslast-allhead,568000000,5.029274,8.854356
+2023-04-06 23:04:58,2,5 10000 809 -1 2  ,./perfexp--upp-upp--stack-insfirst-remelem,590570000,5.018292,8.497370
+2023-04-06 23:05:03,3,5 100000 71 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,653200000,5.021467,7.687488
+2023-04-06 23:05:08,4,5 100 72421 -1 4  ,./perfexp--cfa-cfa--queue-inslast-inselem,137599900,5.250703,38.159207
+2023-04-06 23:05:14,4,5 100000 71 -1 4  ,./perfexp--upp-upp--queue-inslast-allhead,745500000,5.019787,6.733450
+2023-04-06 23:05:19,1,5 10000 809 -1 1  ,./perfexp--upp-upp--queue-insfirst-inselem,412590000,5.039837,12.215122
+2023-04-06 23:05:24,3,5 100000 71 -1 3  ,./perfexp--lq-tailq--queue-inslast-inselem,724200000,5.013341,6.922592
+2023-04-06 23:05:29,1,5 100000 71 -1 1  ,./perfexp--cfa-cfa--stack-inslast-allhead,603500000,5.026221,8.328452
+2023-04-06 23:05:34,5,5 10000 809 -1 5  ,./perfexp--cpp-stlref--queue-insfirst-remelem,169890000,5.049109,29.719872
+2023-04-06 23:05:39,4,5 10000 809 -1 4  ,./perfexp--upp-upp--stack-inslast-remelem,679560000,5.015714,7.380826
+2023-04-06 23:05:44,2,5 100000 71 -1 2  ,./perfexp--upp-upp--stack-insfirst-remelem,731300000,5.037151,6.887941
+2023-04-06 23:05:49,4,5 10000 809 -1 4  ,./perfexp--upp-upp--queue-inslast-remelem,614840000,5.059492,8.228957
+2023-04-06 23:05:54,1,5 100000 71 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-remelem,958500000,5.014201,5.231300
+2023-04-06 23:05:59,2,5 1000 9051 -1 2  ,./perfexp--lq-tailq--stack-inslast-inselem,316785000,5.024996,15.862481
+2023-04-06 23:06:04,3,5 1000 9051 -1 3  ,./perfexp--cfa-cfa--queue-inslast-remelem,588315000,5.067089,8.612884
+2023-04-06 23:06:09,2,5 100000 71 -1 2  ,./perfexp--upp-upp--stack-inslast-allhead,639000000,5.028277,7.868978
+2023-04-06 23:06:14,5,5 1000 9051 -1 5  ,./perfexp--upp-upp--queue-inslast-allhead,334887000,5.060557,15.111238
+2023-04-06 23:06:19,4,5 1000 9051 -1 4  ,./perfexp--lq-tailq--queue-inslast-inselem,352989000,5.102670,14.455606
+2023-04-06 23:06:25,4,5 100 72421 -1 4  ,./perfexp--upp-upp--queue-insfirst-allhead,130357800,5.098607,39.112404
+2023-04-06 23:06:30,1,5 100 72421 -1 1  ,./perfexp--lq-tailq--queue-inslast-inselem,144842000,5.151602,35.567045
+2023-04-06 23:06:35,3,5 100000 71 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,795200000,5.020810,6.313896
+2023-04-06 23:06:40,3,5 1000000 7 -1 3  ,./perfexp--cfa-cfa--stack-inslast-inselem,658000000,5.025127,7.636971
+2023-04-06 23:06:45,5,5 1000 9051 -1 5  ,./perfexp--cpp-stlref--stack-inslast-inselem,162918000,5.129739,31.486631
+2023-04-06 23:06:50,1,5 100 72421 -1 1  ,./perfexp--cfa-cfa--stack-inslast-allhead,159326200,5.168959,32.442618
+2023-04-06 23:06:55,4,5 100000 71 -1 4  ,./perfexp--lq-tailq--queue-inslast-inselem,745500000,5.024930,6.740349
+2023-04-06 23:07:00,1,5 100 72421 -1 1  ,./perfexp--cfa-cfa--stack-inslast-inselem,159326200,5.104196,32.036137
+2023-04-06 23:07:06,1,5 100000 71 -1 1  ,./perfexp--cfa-cfa--queue-insfirst-allhead,575100000,5.018488,8.726288
+2023-04-06 23:07:11,1,5 100000 71 -1 1  ,./perfexp--cpp-stlref--queue-insfirst-inselem,184600000,5.040923,27.307275
+2023-04-06 23:07:16,4,5 1000 9051 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,162918000,5.129628,31.485950
+2023-04-06 23:07:21,3,5 100000 71 -1 3  ,./perfexp--upp-upp--queue-insfirst-allhead,653200000,5.014120,7.676240
+2023-04-06 23:07:26,4,5 1000000 7 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,903000000,5.007293,5.545175
+2023-04-06 23:07:31,5,5 1000000 7 -1 5  ,./perfexp--cpp-stlref--queue-insfirst-inselem,231000000,5.039397,21.815571
+2023-04-06 23:07:36,4,5 100 72421 -1 4  ,./perfexp--cfa-cfa--stack-inslast-inselem,159326200,5.103728,32.033200
+2023-04-06 23:07:41,4,5 100 72421 -1 4  ,./perfexp--cpp-stlref--queue-inslast-remelem,159326200,5.110623,32.076476
+2023-04-06 23:07:46,4,5 1000 9051 -1 4  ,./perfexp--upp-upp--queue-inslast-inselem,325836000,5.094063,15.633825
+2023-04-06 23:07:51,5,5 1000000 7 -1 5  ,./perfexp--upp-upp--queue-inslast-allhead,896000000,5.013412,5.595326
+2023-04-06 23:07:56,3,5 100 72421 -1 3  ,./perfexp--cfa-cfa--queue-inslast-remelem,289684000,5.090448,17.572417
+2023-04-06 23:08:01,3,5 1000 9051 -1 3  ,./perfexp--upp-upp--queue-inslast-remelem,515907000,5.013509,9.717854
+2023-04-06 23:08:06,1,5 10000 809 -1 1  ,./perfexp--upp-upp--stack-insfirst-remelem,582480000,5.028441,8.632813
+2023-04-06 23:08:11,5,5 100 72421 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,166568300,5.049215,30.313181
+2023-04-06 23:08:16,3,5 100 72421 -1 3  ,./perfexp--cfa-cfa--queue-insfirst-remelem,289684000,5.110068,17.640146
+2023-04-06 23:08:22,2,5 1000 9051 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-inselem,343938000,5.103078,14.837203
+2023-04-06 23:08:27,5,5 1000 9051 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-inselem,162918000,5.149009,31.604912
+2023-04-06 23:08:32,1,5 1000000 7 -1 1  ,./perfexp--upp-upp--stack-inslast-remelem,917000000,5.004999,5.458014
+2023-04-06 23:08:37,5,5 10000 809 -1 5  ,./perfexp--cfa-cfa--queue-insfirst-remelem,695740000,5.052429,7.261950
+2023-04-06 23:08:42,5,5 100 72421 -1 5  ,./perfexp--cfa-cfa--queue-insfirst-allhead,137599900,5.145265,37.392941
+2023-04-06 23:08:47,1,5 100 72421 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-inselem,159326200,5.189556,32.571893
+2023-04-06 23:08:52,4,5 100000 71 -1 4  ,./perfexp--cpp-stlref--stack-inslast-remelem,177500000,5.052410,28.464282
+2023-04-06 23:08:57,3,5 10000 809 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,533940000,5.071980,9.499157
+2023-04-06 23:09:03,2,5 1000000 7 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,665000000,5.021102,7.550529
+2023-04-06 23:09:08,4,5 1000 9051 -1 4  ,./perfexp--lq-tailq--queue-insfirst-inselem,298683000,5.125385,17.159949
+2023-04-06 23:09:13,4,5 1000 9051 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-remelem,579264000,5.001932,8.634978
+2023-04-06 23:09:18,4,5 100000 71 -1 4  ,./perfexp--cpp-stlref--queue-insfirst-remelem,184600000,5.103404,27.645742
+2023-04-06 23:09:23,3,5 100 72421 -1 3  ,./perfexp--upp-upp--stack-inslast-remelem,318652400,5.032572,15.793297
+2023-04-06 23:09:28,4,5 1000 9051 -1 4  ,./perfexp--cpp-stlref--queue-inslast-remelem,171969000,5.132165,29.843547
+2023-04-06 23:09:33,5,5 10000 809 -1 5  ,./perfexp--cpp-stlref--stack-inslast-allhead,169890000,5.106152,30.055636
+2023-04-06 23:09:38,3,5 10000 809 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-remelem,720010000,5.056537,7.022871
+2023-04-06 23:09:43,1,5 10000 809 -1 1  ,./perfexp--cpp-stlref--queue-inslast-remelem,169890000,5.068533,29.834204
+2023-04-06 23:09:48,2,5 10000 809 -1 2  ,./perfexp--upp-upp--queue-inslast-allhead,493490000,5.018832,10.170078
+2023-04-06 23:09:53,3,5 1000000 7 -1 3  ,./perfexp--lq-tailq--queue-inslast-inselem,833000000,5.016267,6.021929
+2023-04-06 23:09:58,1,5 10000 809 -1 1  ,./perfexp--cfa-cfa--queue-inslast-allhead,461130000,5.084745,11.026706
+2023-04-06 23:10:03,4,5 100000 71 -1 4  ,./perfexp--lq-tailq--stack-inslast-inselem,908800000,5.035999,5.541372
+2023-04-06 23:10:09,3,5 1000000 7 -1 3  ,./perfexp--upp-upp--queue-inslast-allhead,889000000,5.028819,5.656714
+2023-04-06 23:10:14,3,5 100 72421 -1 3  ,./perfexp--cpp-stlref--queue-inslast-allhead,166568300,5.191809,31.169250
+2023-04-06 23:10:19,5,5 100 72421 -1 5  ,./perfexp--lq-tailq--stack-inslast-inselem,159326200,5.152530,32.339502
+2023-04-06 23:10:24,4,5 100 72421 -1 4  ,./perfexp--cfa-cfa--queue-inslast-remelem,289684000,5.093276,17.582179
+2023-04-06 23:10:29,3,5 1000000 7 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-inselem,231000000,5.100410,22.079697
+2023-04-06 23:10:34,5,5 10000 809 -1 5  ,./perfexp--lq-tailq--queue-inslast-allhead,485400000,5.011748,10.324986
+2023-04-06 23:10:39,5,5 100000 71 -1 5  ,./perfexp--upp-upp--queue-inslast-remelem,688700000,5.032312,7.306973
+2023-04-06 23:10:44,5,5 1000000 7 -1 5  ,./perfexp--lq-tailq--queue-insfirst-inselem,973000000,5.027293,5.166797
+2023-04-06 23:10:49,2,5 10000 809 -1 2  ,./perfexp--cpp-stlref--queue-insfirst-inselem,177980000,5.048409,28.365035
+2023-04-06 23:10:54,3,5 100 72421 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,159326200,5.095523,31.981702
+2023-04-06 23:11:00,4,5 10000 809 -1 4  ,./perfexp--cfa-cfa--queue-insfirst-inselem,444950000,5.015660,11.272413
+2023-04-06 23:11:05,3,5 1000000 7 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,924000000,5.029412,5.443087
+2023-04-06 23:11:10,2,5 1000 9051 -1 2  ,./perfexp--cfa-cfa--stack-inslast-allhead,343938000,5.134039,14.927222
+2023-04-06 23:11:15,5,5 100 72421 -1 5  ,./perfexp--lq-tailq--stack-insfirst-remelem,333136600,5.076445,15.238329
+2023-04-06 23:11:20,5,5 10000 809 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-inselem,169890000,5.039287,29.662058
+2023-04-06 23:11:25,1,5 100 72421 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,166568300,5.122763,30.754729
+2023-04-06 23:11:30,4,5 100 72421 -1 4  ,./perfexp--upp-upp--stack-inslast-remelem,318652400,5.029359,15.783214
+2023-04-06 23:11:35,5,5 1000000 7 -1 5  ,./perfexp--lq-tailq--queue-insfirst-allhead,1022000000,5.025006,4.916836
+2023-04-06 23:11:40,3,5 10000 809 -1 3  ,./perfexp--lq-tailq--queue-inslast-inselem,461130000,5.059408,10.971761
+2023-04-06 23:11:45,1,5 100 72421 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,159326200,5.102132,32.023183
+2023-04-06 23:11:50,2,5 10000 809 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-remelem,728100000,5.037604,6.918835
+2023-04-06 23:11:56,2,5 1000 9051 -1 2  ,./perfexp--upp-upp--queue-inslast-allhead,334887000,5.067591,15.132242
+2023-04-06 23:12:01,5,5 100 72421 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-inselem,159326200,5.104270,32.036602
+2023-04-06 23:12:06,3,5 100000 71 -1 3  ,./perfexp--cpp-stlref--stack-inslast-inselem,184600000,5.124046,27.757562
+2023-04-06 23:12:11,2,5 1000000 7 -1 2  ,./perfexp--lq-tailq--stack-inslast-allhead,1078000000,5.014921,4.652060
+2023-04-06 23:12:16,3,5 100000 71 -1 3  ,./perfexp--cfa-cfa--stack-inslast-inselem,624800000,5.051553,8.085072
+2023-04-06 23:12:21,2,5 1000000 7 -1 2  ,./perfexp--lq-tailq--queue-inslast-inselem,833000000,5.018805,6.024976
+2023-04-06 23:12:26,3,5 1000 9051 -1 3  ,./perfexp--cfa-cfa--queue-inslast-allhead,343938000,5.055123,14.697774
+2023-04-06 23:12:31,3,5 1000 9051 -1 3  ,./perfexp--lq-tailq--queue-insfirst-allhead,316785000,5.093298,16.078091
+2023-04-06 23:12:36,2,5 100 72421 -1 2  ,./perfexp--lq-tailq--queue-inslast-allhead,144842000,5.158022,35.611370
+2023-04-06 23:12:41,5,5 100 72421 -1 5  ,./perfexp--cfa-cfa--stack-inslast-allhead,159326200,5.152787,32.341115
+2023-04-06 23:12:47,1,5 1000 9051 -1 1  ,./perfexp--cpp-stlref--queue-insfirst-allhead,181020000,5.246972,28.985593
+2023-04-06 23:12:52,4,5 1000 9051 -1 4  ,./perfexp--cpp-stlref--queue-insfirst-remelem,171969000,5.244708,30.497985
+2023-04-06 23:12:57,1,5 100 72421 -1 1  ,./perfexp--cfa-cfa--queue-inslast-remelem,289684000,5.088471,17.565592
+2023-04-06 23:13:02,5,5 10000 809 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-remelem,720010000,5.055206,7.021022
+2023-04-06 23:13:07,2,5 100000 71 -1 2  ,./perfexp--cfa-cfa--queue-inslast-allhead,560900000,5.032860,8.972829
+2023-04-06 23:13:12,5,5 1000000 7 -1 5  ,./perfexp--lq-tailq--queue-inslast-allhead,959000000,5.008545,5.222675
+2023-04-06 23:13:17,1,5 1000000 7 -1 1  ,./perfexp--upp-upp--stack-insfirst-remelem,784000000,5.022341,6.406047
+2023-04-06 23:13:22,1,5 1000 9051 -1 1  ,./perfexp--lq-tailq--queue-inslast-inselem,352989000,5.117729,14.498268
+2023-04-06 23:13:27,4,5 1000000 7 -1 4  ,./perfexp--cpp-stlref--queue-inslast-inselem,224000000,5.066051,22.616299
+2023-04-06 23:13:33,1,5 100 72421 -1 1  ,./perfexp--cpp-stlref--queue-insfirst-remelem,159326200,5.077187,31.866617
+2023-04-06 23:13:38,4,5 100 72421 -1 4  ,./perfexp--cpp-stlref--stack-inslast-inselem,166568300,5.220717,31.342801
+2023-04-06 23:13:43,5,5 10000 809 -1 5  ,./perfexp--lq-tailq--queue-inslast-inselem,477310000,5.070365,10.622792
+2023-04-06 23:13:48,3,5 1000000 7 -1 3  ,./perfexp--lq-tailq--queue-insfirst-remelem,1309000000,5.007603,3.825518
+2023-04-06 23:13:53,2,5 100000 71 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,184600000,5.111904,27.691788
+2023-04-06 23:13:58,5,5 100000 71 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-remelem,972700000,5.036058,5.177401
+2023-04-06 23:14:03,1,5 1000000 7 -1 1  ,./perfexp--cfa-cfa--stack-inslast-remelem,938000000,5.030859,5.363389
+2023-04-06 23:14:08,5,5 1000000 7 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-inselem,231000000,5.144215,22.269329
+2023-04-06 23:14:13,4,5 100 72421 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,159326200,5.195831,32.611278
+2023-04-06 23:14:19,5,5 100000 71 -1 5  ,./perfexp--upp-upp--queue-insfirst-remelem,710000000,5.050419,7.113266
+2023-04-06 23:14:24,1,5 10000 809 -1 1  ,./perfexp--cfa-cfa--stack-inslast-inselem,477310000,5.056472,10.593685
+2023-04-06 23:14:29,1,5 100000 71 -1 1  ,./perfexp--upp-upp--stack-inslast-allhead,646100000,5.033754,7.790983
+2023-04-06 23:14:34,5,5 10000 809 -1 5  ,./perfexp--cpp-stlref--queue-inslast-inselem,169890000,5.007809,29.476773
+2023-04-06 23:14:39,5,5 100000 71 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-remelem,184600000,5.140697,27.847763
+2023-04-06 23:14:44,2,5 1000000 7 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-remelem,917000000,5.012871,5.466599
+2023-04-06 23:14:49,5,5 10000 809 -1 5  ,./perfexp--lq-tailq--stack-inslast-remelem,792820000,5.025219,6.338411
+2023-04-06 23:14:54,3,5 100000 71 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,184600000,5.077734,27.506685
+2023-04-06 23:14:59,2,5 1000000 7 -1 2  ,./perfexp--cpp-stlref--stack-inslast-allhead,231000000,5.142791,22.263165
+2023-04-06 23:15:04,3,5 1000 9051 -1 3  ,./perfexp--cfa-cfa--queue-inslast-inselem,334887000,5.004776,14.944671
+2023-04-06 23:15:09,4,5 100 72421 -1 4  ,./perfexp--lq-tailq--queue-inslast-allhead,144842000,5.161848,35.637785
+2023-04-06 23:15:15,2,5 1000 9051 -1 2  ,./perfexp--lq-tailq--stack-insfirst-inselem,325836000,5.085281,15.606873
+2023-04-06 23:15:20,2,5 1000000 7 -1 2  ,./perfexp--lq-tailq--stack-insfirst-inselem,581000000,5.020173,8.640573
+2023-04-06 23:15:25,5,5 100000 71 -1 5  ,./perfexp--lq-tailq--queue-inslast-inselem,710000000,5.014337,7.062446
+2023-04-06 23:15:30,2,5 10000 809 -1 2  ,./perfexp--cpp-stlref--queue-insfirst-allhead,177980000,5.062496,28.444185
+2023-04-06 23:15:35,1,5 1000000 7 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,917000000,5.004475,5.457443
+2023-04-06 23:15:40,4,5 100 72421 -1 4  ,./perfexp--upp-upp--queue-inslast-remelem,267957700,5.136059,19.167425
+2023-04-06 23:15:45,5,5 1000 9051 -1 5  ,./perfexp--lq-tailq--stack-inslast-remelem,687876000,5.053524,7.346562
+2023-04-06 23:15:50,3,5 10000 809 -1 3  ,./perfexp--cfa-cfa--queue-insfirst-allhead,444950000,5.008229,11.255712
+2023-04-06 23:15:55,1,5 100 72421 -1 1  ,./perfexp--cpp-stlref--queue-inslast-remelem,159326200,5.159661,32.384259
+2023-04-06 23:16:00,4,5 10000 809 -1 4  ,./perfexp--lq-tailq--queue-insfirst-allhead,453040000,5.007535,11.053185
+2023-04-06 23:16:05,2,5 1000000 7 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-inselem,224000000,5.009136,22.362214
+2023-04-06 23:16:10,4,5 10000 809 -1 4  ,./perfexp--cfa-cfa--queue-inslast-allhead,453040000,5.019570,11.079750
+2023-04-06 23:16:15,4,5 100 72421 -1 4  ,./perfexp--lq-tailq--stack-inslast-allhead,159326200,5.106386,32.049883
+2023-04-06 23:16:20,2,5 1000 9051 -1 2  ,./perfexp--cpp-stlref--stack-inslast-allhead,162918000,5.082855,31.198855
+2023-04-06 23:16:26,4,5 100000 71 -1 4  ,./perfexp--lq-tailq--queue-insfirst-remelem,944300000,5.025435,5.321863
+2023-04-06 23:16:31,2,5 100 72421 -1 2  ,./perfexp--lq-tailq--queue-insfirst-allhead,130357800,5.062806,38.837768
+2023-04-06 23:16:36,3,5 1000 9051 -1 3  ,./perfexp--cpp-stlref--queue-insfirst-remelem,171969000,5.121176,29.779646
+2023-04-06 23:16:41,2,5 1000000 7 -1 2  ,./perfexp--upp-upp--queue-insfirst-remelem,861000000,5.036872,5.850026
+2023-04-06 23:16:46,1,5 10000 809 -1 1  ,./perfexp--cfa-cfa--stack-inslast-remelem,720010000,5.033713,6.991171
+2023-04-06 23:16:51,5,5 100000 71 -1 5  ,./perfexp--lq-tailq--queue-insfirst-inselem,766800000,5.001069,6.521999
+2023-04-06 23:16:56,5,5 100 72421 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,159326200,5.154320,32.350737
+2023-04-06 23:17:01,1,5 100000 71 -1 1  ,./perfexp--upp-upp--queue-inslast-inselem,610600000,5.008342,8.202329
+2023-04-06 23:17:06,3,5 100000 71 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,802300000,5.014286,6.249889
+2023-04-06 23:17:11,3,5 1000000 7 -1 3  ,./perfexp--cpp-stlref--stack-inslast-allhead,231000000,5.088531,22.028273
+2023-04-06 23:17:16,4,5 1000 9051 -1 4  ,./perfexp--cfa-cfa--stack-inslast-inselem,343938000,5.070875,14.743573
+2023-04-06 23:17:21,4,5 10000 809 -1 4  ,./perfexp--upp-upp--queue-insfirst-allhead,444950000,5.042555,11.332858
+2023-04-06 23:17:26,2,5 1000000 7 -1 2  ,./perfexp--upp-upp--stack-inslast-remelem,658000000,5.001245,7.600676
+2023-04-06 23:17:31,5,5 1000 9051 -1 5  ,./perfexp--upp-upp--queue-inslast-remelem,515907000,5.021599,9.733535
+2023-04-06 23:17:36,4,5 100 72421 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-inselem,159326200,5.186501,32.552719
+2023-04-06 23:17:42,1,5 10000 809 -1 1  ,./perfexp--cpp-stlref--queue-insfirst-inselem,177980000,5.026446,28.241634
+2023-04-06 23:17:47,5,5 1000000 7 -1 5  ,./perfexp--cfa-cfa--stack-inslast-inselem,658000000,5.016281,7.623527
+2023-04-06 23:17:52,2,5 1000000 7 -1 2  ,./perfexp--upp-upp--queue-inslast-remelem,784000000,5.003437,6.381935
+2023-04-06 23:17:57,3,5 100 72421 -1 3  ,./perfexp--lq-tailq--stack-inslast-remelem,347620800,5.029484,14.468306
+2023-04-06 23:18:02,1,5 100000 71 -1 1  ,./perfexp--upp-upp--queue-inslast-remelem,710000000,5.007576,7.052924
+2023-04-06 23:18:07,2,5 100000 71 -1 2  ,./perfexp--cfa-cfa--queue-inslast-remelem,809400000,5.015371,6.196406
+2023-04-06 23:18:12,1,5 100000 71 -1 1  ,./perfexp--lq-tailq--queue-insfirst-allhead,788100000,5.040980,6.396371
+2023-04-06 23:18:17,4,5 10000 809 -1 4  ,./perfexp--lq-tailq--queue-inslast-inselem,461130000,5.057431,10.967473
+2023-04-06 23:18:22,2,5 100 72421 -1 2  ,./perfexp--cpp-stlref--queue-insfirst-remelem,159326200,5.044365,31.660612
+2023-04-06 23:18:27,4,5 10000 809 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,485400000,5.070348,10.445711
+2023-04-06 23:18:32,3,5 1000 9051 -1 3  ,./perfexp--lq-tailq--stack-inslast-inselem,316785000,5.018884,15.843187
+2023-04-06 23:18:37,2,5 100000 71 -1 2  ,./perfexp--cfa-cfa--queue-insfirst-inselem,560900000,5.062667,9.025971
+2023-04-06 23:18:42,5,5 10000 809 -1 5  ,./perfexp--upp-upp--queue-insfirst-inselem,412590000,5.015951,12.157229
+2023-04-06 23:18:47,4,5 100000 71 -1 4  ,./perfexp--lq-tailq--queue-insfirst-inselem,816500000,5.000448,6.124247
+2023-04-06 23:18:52,1,5 1000 9051 -1 1  ,./perfexp--cpp-stlref--stack-inslast-inselem,162918000,5.018924,30.806443
+2023-04-06 23:18:57,5,5 10000 809 -1 5  ,./perfexp--cfa-cfa--queue-inslast-remelem,695740000,5.044067,7.249931
+2023-04-06 23:19:03,4,5 10000 809 -1 4  ,./perfexp--cpp-stlref--queue-inslast-remelem,169890000,5.075488,29.875143
+2023-04-06 23:19:08,2,5 1000000 7 -1 2  ,./perfexp--cpp-stlref--queue-inslast-inselem,224000000,5.038191,22.491924
+2023-04-06 23:19:13,1,5 1000 9051 -1 1  ,./perfexp--lq-tailq--stack-insfirst-inselem,325836000,5.103653,15.663257
+2023-04-06 23:19:18,1,5 10000 809 -1 1  ,./perfexp--cfa-cfa--queue-insfirst-allhead,444950000,5.010533,11.260890
+2023-04-06 23:19:23,2,5 1000000 7 -1 2  ,./perfexp--cpp-stlref--queue-inslast-allhead,224000000,5.004062,22.339563
+2023-04-06 23:19:28,1,5 1000000 7 -1 1  ,./perfexp--upp-upp--queue-inslast-remelem,784000000,5.030273,6.416165
+2023-04-06 23:19:33,1,5 10000 809 -1 1  ,./perfexp--upp-upp--stack-insfirst-inselem,485400000,5.050046,10.403885
+2023-04-06 23:19:38,1,5 100000 71 -1 1  ,./perfexp--upp-upp--stack-insfirst-inselem,617700000,5.005519,8.103479
+2023-04-06 23:19:43,2,5 1000 9051 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,325836000,5.106682,15.672553
+2023-04-06 23:19:48,3,5 100000 71 -1 3  ,./perfexp--upp-upp--queue-insfirst-remelem,681600000,5.046878,7.404457
+2023-04-06 23:19:53,5,5 100 72421 -1 5  ,./perfexp--cfa-cfa--queue-insfirst-inselem,137599900,5.148273,37.414802
+2023-04-06 23:19:58,2,5 100000 71 -1 2  ,./perfexp--cfa-cfa--stack-inslast-inselem,603500000,5.030745,8.335949
+2023-04-06 23:20:03,5,5 1000000 7 -1 5  ,./perfexp--lq-tailq--stack-inslast-inselem,987000000,5.001494,5.067370
+2023-04-06 23:20:08,5,5 100 72421 -1 5  ,./perfexp--lq-tailq--queue-inslast-allhead,144842000,5.159197,35.619482
+2023-04-06 23:20:14,2,5 10000 809 -1 2  ,./perfexp--cfa-cfa--queue-insfirst-inselem,453040000,5.069119,11.189120
+2023-04-06 23:20:19,5,5 100000 71 -1 5  ,./perfexp--lq-tailq--stack-inslast-inselem,880400000,5.006800,5.686960
+2023-04-06 23:20:24,5,5 1000000 7 -1 5  ,./perfexp--cpp-stlref--queue-insfirst-allhead,224000000,5.105644,22.793054
+2023-04-06 23:20:29,5,5 1000000 7 -1 5  ,./perfexp--cpp-stlref--queue-insfirst-remelem,224000000,5.045045,22.522522
+2023-04-06 23:20:34,2,5 1000000 7 -1 2  ,./perfexp--lq-tailq--queue-inslast-allhead,959000000,5.008714,5.222851
+2023-04-06 23:20:39,5,5 100000 71 -1 5  ,./perfexp--cpp-stlref--queue-inslast-inselem,184600000,5.185437,28.090125
+2023-04-06 23:20:44,4,5 10000 809 -1 4  ,./perfexp--lq-tailq--stack-insfirst-inselem,420680000,5.058743,12.025157
+2023-04-06 23:20:49,3,5 100 72421 -1 3  ,./perfexp--upp-upp--queue-insfirst-remelem,260715600,5.111093,19.604094
+2023-04-06 23:20:54,2,5 100000 71 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,773900000,5.004333,6.466382
+2023-04-06 23:20:59,4,5 1000000 7 -1 4  ,./perfexp--upp-upp--queue-insfirst-remelem,812000000,5.021316,6.183887
+2023-04-06 23:21:04,4,5 100000 71 -1 4  ,./perfexp--cpp-stlref--queue-insfirst-allhead,184600000,5.041771,27.311869
+2023-04-06 23:21:09,4,5 1000000 7 -1 4  ,./perfexp--lq-tailq--stack-inslast-remelem,1414000000,5.000733,3.536586
+2023-04-06 23:21:14,4,5 100 72421 -1 4  ,./perfexp--cfa-cfa--queue-insfirst-remelem,289684000,5.112781,17.649511
+2023-04-06 23:21:20,1,5 100000 71 -1 1  ,./perfexp--lq-tailq--stack-insfirst-inselem,539600000,5.009402,9.283547
+2023-04-06 23:21:25,3,5 1000 9051 -1 3  ,./perfexp--upp-upp--stack-inslast-inselem,325836000,5.128478,15.739446
+2023-04-06 23:21:30,5,5 10000 809 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,509670000,5.040138,9.889022
+2023-04-06 23:21:35,1,5 1000 9051 -1 1  ,./perfexp--upp-upp--queue-insfirst-inselem,307734000,5.031918,16.351518
+2023-04-06 23:21:40,2,5 1000 9051 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-remelem,588315000,5.069535,8.617042
+2023-04-06 23:21:45,2,5 1000 9051 -1 2  ,./perfexp--cpp-stlref--queue-insfirst-allhead,181020000,5.196558,28.707093
+2023-04-06 23:21:50,1,5 10000 809 -1 1  ,./perfexp--lq-tailq--queue-insfirst-remelem,720010000,5.049517,7.013121
+2023-04-06 23:21:55,2,5 100000 71 -1 2  ,./perfexp--upp-upp--stack-insfirst-inselem,631900000,5.011261,7.930465
+2023-04-06 23:22:00,4,5 100 72421 -1 4  ,./perfexp--upp-upp--queue-inslast-inselem,137599900,5.090919,36.997985
+2023-04-06 23:22:05,3,5 100000 71 -1 3  ,./perfexp--lq-list--stack-insfirst-remelem,688700000,5.028916,7.302042
+2023-04-06 23:22:10,2,5 100 72421 -1 2  ,./perfexp--cpp-stlref--queue-inslast-inselem,159326200,5.021214,31.515306
+2023-04-06 23:22:15,5,5 1000 9051 -1 5  ,./perfexp--cfa-cfa--stack-inslast-allhead,343938000,5.134953,14.929880
+2023-04-06 23:22:21,2,5 100000 71 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,766800000,5.010735,6.534605
+2023-04-06 23:22:26,2,5 1000 9051 -1 2  ,./perfexp--cfa-cfa--queue-insfirst-remelem,588315000,5.005341,8.507927
+2023-04-06 23:22:31,5,5 100000 71 -1 5  ,./perfexp--upp-upp--stack-inslast-inselem,553800000,5.022399,9.068976
+2023-04-06 23:22:36,4,5 1000000 7 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-inselem,217000000,5.090764,23.459742
+2023-04-06 23:22:41,1,5 1000 9051 -1 1  ,./perfexp--lq-tailq--queue-insfirst-allhead,316785000,5.107048,16.121496
+2023-04-06 23:22:46,2,5 100000 71 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-inselem,603500000,5.007173,8.296890
+2023-04-06 23:22:51,3,5 1000 9051 -1 3  ,./perfexp--lq-tailq--stack-insfirst-remelem,534009000,5.013222,9.387898
+2023-04-06 23:22:56,4,5 100000 71 -1 4  ,./perfexp--upp-upp--queue-inslast-inselem,617700000,5.049209,8.174209
+2023-04-06 23:23:01,3,5 100 72421 -1 3  ,./perfexp--cfa-cfa--stack-inslast-inselem,159326200,5.098883,32.002791
+2023-04-06 23:23:06,1,5 1000000 7 -1 1  ,./perfexp--cpp-stlref--queue-inslast-allhead,224000000,5.012905,22.379040
+2023-04-06 23:23:11,2,5 1000000 7 -1 2  ,./perfexp--upp-upp--queue-inslast-inselem,693000000,5.010052,7.229512
+2023-04-06 23:23:16,3,5 1000 9051 -1 3  ,./perfexp--cfa-cfa--stack-inslast-inselem,343938000,5.081110,14.773331
+2023-04-06 23:23:21,5,5 1000000 7 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,805000000,5.000210,6.211441
+2023-04-06 23:23:26,2,5 10000 809 -1 2  ,./perfexp--lq-list--stack-insfirst-inselem,420680000,5.069851,12.051562
+2023-04-06 23:23:31,4,5 10000 809 -1 4  ,./perfexp--cpp-stlref--queue-insfirst-inselem,177980000,5.051407,28.381880
+2023-04-06 23:23:36,3,5 1000000 7 -1 3  ,./perfexp--lq-tailq--stack-inslast-inselem,987000000,5.007191,5.073142
+2023-04-06 23:23:41,2,5 1000000 7 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-remelem,231000000,5.081453,21.997632
+2023-04-06 23:23:46,3,5 100000 71 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-remelem,177500000,5.017600,28.268169
+2023-04-06 23:23:52,3,5 1000 9051 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-inselem,343938000,5.100129,14.828629
+2023-04-06 23:23:57,4,5 100000 71 -1 4  ,./perfexp--cpp-stlref--queue-insfirst-inselem,184600000,5.151028,27.903727
+2023-04-06 23:24:02,1,5 100000 71 -1 1  ,./perfexp--cpp-stlref--queue-insfirst-remelem,184600000,5.128629,27.782389
+2023-04-06 23:24:07,5,5 1000000 7 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-remelem,910000000,5.002322,5.497057
+2023-04-06 23:24:12,4,5 10000 809 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,177980000,5.196302,29.195988
+2023-04-06 23:24:17,1,5 10000 809 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,509670000,5.014897,9.839498
+2023-04-06 23:24:22,2,5 100 72421 -1 2  ,./perfexp--upp-upp--queue-insfirst-remelem,260715600,5.109786,19.599080
+2023-04-06 23:24:27,5,5 100 72421 -1 5  ,./perfexp--cpp-stlref--stack-inslast-inselem,159326200,5.008081,31.432878
+2023-04-06 23:24:32,1,5 1000 9051 -1 1  ,./perfexp--upp-upp--queue-inslast-inselem,325836000,5.116265,15.701964
+2023-04-06 23:24:37,3,5 1000 9051 -1 3  ,./perfexp--upp-upp--stack-inslast-remelem,570213000,5.046808,8.850742
+2023-04-06 23:24:43,2,5 100 72421 -1 2  ,./perfexp--upp-upp--queue-inslast-allhead,137599900,5.042300,36.644649
+2023-04-06 23:24:48,4,5 1000000 7 -1 4  ,./perfexp--cfa-cfa--queue-insfirst-allhead,665000000,5.022941,7.553295
+2023-04-06 23:24:53,2,5 1000 9051 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-remelem,153867000,5.092858,33.099092
+2023-04-06 23:24:58,2,5 1000000 7 -1 2  ,./perfexp--lq-tailq--queue-insfirst-inselem,966000000,5.015365,5.191889
+2023-04-06 23:25:03,1,5 10000 809 -1 1  ,./perfexp--cpp-stlref--stack-inslast-inselem,177980000,5.188118,29.150006
+2023-04-06 23:25:08,4,5 100 72421 -1 4  ,./perfexp--lq-tailq--queue-insfirst-remelem,296926100,5.109709,17.208689
+2023-04-06 23:25:13,1,5 100000 71 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-remelem,184600000,5.118232,27.726067
+2023-04-06 23:25:18,4,5 10000 809 -1 4  ,./perfexp--cpp-stlref--queue-inslast-allhead,177980000,5.168805,29.041493
+2023-04-06 23:25:23,2,5 100 72421 -1 2  ,./perfexp--upp-upp--stack-inslast-allhead,159326200,5.074931,31.852457
+2023-04-06 23:25:28,4,5 1000 9051 -1 4  ,./perfexp--upp-upp--queue-insfirst-remelem,534009000,5.064100,9.483174
+2023-04-06 23:25:34,1,5 100 72421 -1 1  ,./perfexp--lq-tailq--queue-insfirst-allhead,130357800,5.062901,38.838497
+2023-04-06 23:25:39,1,5 100000 71 -1 1  ,./perfexp--cpp-stlref--queue-inslast-inselem,184600000,5.176605,28.042281
+2023-04-06 23:25:44,2,5 100 72421 -1 2  ,./perfexp--cfa-cfa--queue-inslast-inselem,137599900,5.248929,38.146314
+2023-04-06 23:25:49,1,5 100000 71 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-inselem,184600000,5.090988,27.578483
+2023-04-06 23:25:54,2,5 10000 809 -1 2  ,./perfexp--lq-list--stack-insfirst-remelem,590570000,5.053093,8.556298
+2023-04-06 23:25:59,1,5 10000 809 -1 1  ,./perfexp--upp-upp--queue-inslast-remelem,614840000,5.005980,8.141923
+2023-04-06 23:26:04,2,5 1000 9051 -1 2  ,./perfexp--cpp-stlref--queue-inslast-allhead,171969000,5.032441,29.263652
+2023-04-06 23:26:09,4,5 10000 809 -1 4  ,./perfexp--lq-tailq--queue-inslast-allhead,485400000,5.027026,10.356461
+2023-04-06 23:26:14,5,5 100000 71 -1 5  ,./perfexp--upp-upp--queue-inslast-allhead,695800000,5.023256,7.219396
+2023-04-06 23:26:19,2,5 100000 71 -1 2  ,./perfexp--lq-list--stack-insfirst-inselem,738400000,5.023025,6.802580
+2023-04-06 23:26:24,4,5 100000 71 -1 4  ,./perfexp--cfa-cfa--queue-insfirst-allhead,546700000,5.016473,9.175915
+2023-04-06 23:26:29,5,5 1000 9051 -1 5  ,./perfexp--cpp-stlref--queue-insfirst-inselem,181020000,5.192822,28.686455
+2023-04-06 23:26:35,5,5 1000 9051 -1 5  ,./perfexp--cfa-cfa--queue-insfirst-inselem,343938000,5.093426,14.809140
+2023-04-06 23:26:40,3,5 1000 9051 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-remelem,153867000,5.079586,33.012836
+2023-04-06 23:26:45,5,5 10000 809 -1 5  ,./perfexp--lq-list--stack-insfirst-inselem,509670000,5.077423,9.962177
+2023-04-06 23:26:50,2,5 10000 809 -1 2  ,./perfexp--cpp-stlref--queue-insfirst-remelem,169890000,5.078467,29.892678
+2023-04-06 23:26:55,3,5 100 72421 -1 3  ,./perfexp--upp-upp--stack-inslast-inselem,159326200,5.146163,32.299540
+2023-04-06 23:27:00,3,5 100 72421 -1 3  ,./perfexp--cfa-cfa--stack-inslast-allhead,159326200,5.163047,32.405511
+2023-04-06 23:27:05,4,5 100000 71 -1 4  ,./perfexp--upp-upp--queue-insfirst-inselem,568000000,5.058001,8.904931
+2023-04-06 23:27:11,3,5 10000 809 -1 3  ,./perfexp--lq-list--stack-insfirst-inselem,485400000,5.006967,10.315136
+2023-04-06 23:27:16,5,5 100000 71 -1 5  ,./perfexp--cfa-cfa--stack-inslast-inselem,617700000,5.005977,8.104220
+2023-04-06 23:27:21,5,5 1000000 7 -1 5  ,./perfexp--upp-upp--queue-insfirst-inselem,588000000,5.020572,8.538388
+2023-04-06 23:27:26,4,5 1000000 7 -1 4  ,./perfexp--lq-tailq--queue-inslast-remelem,777000000,5.025727,6.468117
+2023-04-06 23:27:31,4,5 100000 71 -1 4  ,./perfexp--upp-upp--stack-inslast-inselem,553800000,5.014991,9.055599
+2023-04-06 23:27:36,5,5 1000 9051 -1 5  ,./perfexp--upp-upp--stack-insfirst-remelem,461601000,5.001793,10.835750
+2023-04-06 23:27:41,2,5 1000000 7 -1 2  ,./perfexp--cpp-stlref--queue-inslast-remelem,224000000,5.052311,22.554960
+2023-04-06 23:27:46,2,5 10000 809 -1 2  ,./perfexp--upp-upp--queue-insfirst-inselem,412590000,5.009318,12.141152
+2023-04-06 23:27:51,1,5 100000 71 -1 1  ,./perfexp--lq-tailq--queue-inslast-allhead,781000000,5.043798,6.458128
+2023-04-06 23:27:56,2,5 10000 809 -1 2  ,./perfexp--cfa-cfa--queue-insfirst-remelem,703830000,5.055801,7.183270
+2023-04-06 23:28:01,2,5 100000 71 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-remelem,184600000,5.103939,27.648640
+2023-04-06 23:28:06,2,5 100 72421 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,159326200,5.157636,32.371550
+2023-04-06 23:28:11,5,5 100 72421 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-remelem,318652400,5.003554,15.702232
+2023-04-06 23:28:16,2,5 100000 71 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,617700000,5.007486,8.106663
+2023-04-06 23:28:21,5,5 1000000 7 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-remelem,231000000,5.082904,22.003913
+2023-04-06 23:28:26,5,5 100000 71 -1 5  ,./perfexp--upp-upp--stack-inslast-remelem,823600000,5.035229,6.113683
+2023-04-06 23:28:31,5,5 100000 71 -1 5  ,./perfexp--cfa-cfa--queue-inslast-allhead,539600000,5.014691,9.293349
+2023-04-06 23:28:36,1,5 100 72421 -1 1  ,./perfexp--cfa-cfa--queue-inslast-allhead,137599900,5.146557,37.402331
+2023-04-06 23:28:42,5,5 100 72421 -1 5  ,./perfexp--cpp-stlref--queue-inslast-allhead,166568300,5.151938,30.929883
+2023-04-06 23:28:47,3,5 1000000 7 -1 3  ,./perfexp--upp-upp--queue-insfirst-inselem,595000000,5.045803,8.480341
+2023-04-06 23:28:52,5,5 10000 809 -1 5  ,./perfexp--cfa-cfa--queue-inslast-inselem,453040000,5.084859,11.223863
+2023-04-06 23:28:57,2,5 100 72421 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-inselem,159326200,5.191003,32.580975
+2023-04-06 23:29:02,5,5 10000 809 -1 5  ,./perfexp--upp-upp--stack-inslast-remelem,687650000,5.026542,7.309739
+2023-04-06 23:29:07,5,5 100 72421 -1 5  ,./perfexp--cpp-stlref--queue-insfirst-remelem,159326200,5.092534,31.962941
+2023-04-06 23:29:12,5,5 10000 809 -1 5  ,./perfexp--lq-tailq--queue-insfirst-remelem,720010000,5.046402,7.008794
+2023-04-06 23:29:17,5,5 100000 71 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,184600000,5.093610,27.592687
+2023-04-06 23:29:22,4,5 1000 9051 -1 4  ,./perfexp--cfa-cfa--stack-inslast-allhead,343938000,5.130926,14.918171
+2023-04-06 23:29:28,4,5 100 72421 -1 4  ,./perfexp--lq-tailq--queue-inslast-inselem,144842000,5.154669,35.588220
+2023-04-06 23:29:33,5,5 100000 71 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,781000000,5.027590,6.437375
+2023-04-06 23:29:38,1,5 10000 809 -1 1  ,./perfexp--cfa-cfa--stack-inslast-allhead,469220000,5.020177,10.698983
+2023-04-06 23:29:43,2,5 1000000 7 -1 2  ,./perfexp--cfa-cfa--stack-inslast-allhead,672000000,5.049259,7.513778
+2023-04-06 23:29:48,4,5 10000 809 -1 4  ,./perfexp--lq-tailq--queue-inslast-remelem,590570000,5.015500,8.492643
+2023-04-06 23:29:53,2,5 1000 9051 -1 2  ,./perfexp--upp-upp--queue-inslast-remelem,515907000,5.032712,9.755076
+2023-04-06 23:29:58,5,5 1000 9051 -1 5  ,./perfexp--upp-upp--queue-inslast-inselem,325836000,5.107450,15.674910
+2023-04-06 23:30:03,1,5 10000 809 -1 1  ,./perfexp--lq-tailq--stack-inslast-remelem,800910000,5.026620,6.276136
+2023-04-06 23:30:08,2,5 100 72421 -1 2  ,./perfexp--lq-tailq--stack-inslast-remelem,347620800,5.041880,14.503965
+2023-04-06 23:30:13,2,5 1000000 7 -1 2  ,./perfexp--cpp-stlref--queue-insfirst-allhead,231000000,5.013901,21.705199
+2023-04-06 23:30:18,3,5 1000 9051 -1 3  ,./perfexp--cpp-stlref--queue-inslast-remelem,171969000,5.137606,29.875187
+2023-04-06 23:30:23,2,5 1000000 7 -1 2  ,./perfexp--upp-upp--stack-inslast-allhead,770000000,5.003343,6.497848
+2023-04-06 23:30:28,1,5 100 72421 -1 1  ,./perfexp--cpp-stlref--queue-insfirst-allhead,166568300,5.108504,30.669125
+2023-04-06 23:30:34,2,5 100000 71 -1 2  ,./perfexp--cpp-stlref--queue-inslast-allhead,184600000,5.156994,27.936046
+2023-04-06 23:30:39,3,5 1000000 7 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,819000000,5.014858,6.123148
+2023-04-06 23:30:44,3,5 1000000 7 -1 3  ,./perfexp--lq-tailq--stack-inslast-remelem,1414000000,5.003794,3.538751
+2023-04-06 23:30:49,1,5 1000000 7 -1 1  ,./perfexp--cpp-stlref--queue-insfirst-inselem,231000000,5.035501,21.798706
+2023-04-06 23:30:54,1,5 100 72421 -1 1  ,./perfexp--upp-upp--stack-insfirst-inselem,159326200,5.209153,32.694893
+2023-04-06 23:30:59,4,5 10000 809 -1 4  ,./perfexp--upp-upp--stack-insfirst-inselem,477310000,5.023267,10.524118
+2023-04-06 23:31:04,3,5 1000 9051 -1 3  ,./perfexp--lq-tailq--stack-insfirst-inselem,325836000,5.101399,15.656339
+2023-04-06 23:31:09,2,5 100000 71 -1 2  ,./perfexp--lq-tailq--queue-inslast-remelem,667400000,5.022926,7.526110
+2023-04-06 23:31:14,2,5 100 72421 -1 2  ,./perfexp--cfa-cfa--stack-inslast-remelem,325894500,5.091748,15.623915
+2023-04-06 23:31:19,2,5 1000 9051 -1 2  ,./perfexp--cfa-cfa--queue-insfirst-allhead,334887000,5.054765,15.093942
+2023-04-06 23:31:24,2,5 1000000 7 -1 2  ,./perfexp--cfa-cfa--queue-insfirst-remelem,1008000000,5.001067,4.961376
+2023-04-06 23:31:29,4,5 1000000 7 -1 4  ,./perfexp--upp-upp--stack-insfirst-inselem,679000000,5.016446,7.387991
+2023-04-06 23:31:35,5,5 1000000 7 -1 5  ,./perfexp--lq-list--stack-insfirst-remelem,798000000,5.020158,6.290925
+2023-04-06 23:31:40,2,5 1000000 7 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-inselem,658000000,5.046821,7.669941
+2023-04-06 23:31:45,2,5 10000 809 -1 2  ,./perfexp--upp-upp--stack-insfirst-inselem,469220000,5.064185,10.792773
+2023-04-06 23:31:50,4,5 100000 71 -1 4  ,./perfexp--upp-upp--stack-insfirst-inselem,674500000,5.015829,7.436366
+2023-04-06 23:31:55,2,5 10000 809 -1 2  ,./perfexp--upp-upp--queue-insfirst-remelem,639110000,5.034318,7.877076
+2023-04-06 23:32:00,1,5 1000 9051 -1 1  ,./perfexp--upp-upp--stack-inslast-remelem,570213000,5.053420,8.862337
+2023-04-06 23:32:05,1,5 1000 9051 -1 1  ,./perfexp--cpp-stlref--queue-inslast-allhead,171969000,5.028685,29.241811
+2023-04-06 23:32:10,5,5 1000000 7 -1 5  ,./perfexp--cpp-stlref--queue-inslast-remelem,224000000,5.019890,22.410223
+2023-04-06 23:32:15,4,5 10000 809 -1 4  ,./perfexp--upp-upp--queue-insfirst-remelem,582480000,5.025035,8.626966
+2023-04-06 23:32:20,4,5 10000 809 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-remelem,161800000,5.127857,31.692565
+2023-04-06 23:32:25,1,5 100 72421 -1 1  ,./perfexp--upp-upp--queue-inslast-remelem,260715600,5.019198,19.251621
+2023-04-06 23:32:30,3,5 1000 9051 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,162918000,5.129510,31.485226
+2023-04-06 23:32:35,1,5 100 72421 -1 1  ,./perfexp--lq-tailq--queue-insfirst-inselem,130357800,5.149737,39.504633
+2023-04-06 23:32:40,2,5 1000 9051 -1 2  ,./perfexp--cpp-stlref--queue-insfirst-remelem,162918000,5.005389,30.723364
+2023-04-06 23:32:45,3,5 100000 71 -1 3  ,./perfexp--upp-upp--queue-inslast-allhead,695800000,5.049924,7.257723
+2023-04-06 23:32:50,1,5 1000000 7 -1 1  ,./perfexp--lq-tailq--queue-insfirst-inselem,973000000,5.026228,5.165702
+2023-04-06 23:32:56,5,5 100000 71 -1 5  ,./perfexp--cpp-stlref--stack-inslast-inselem,184600000,5.070150,27.465601
+2023-04-06 23:33:01,5,5 1000 9051 -1 5  ,./perfexp--cpp-stlref--queue-inslast-allhead,171969000,5.038940,29.301444
+2023-04-06 23:33:06,3,5 1000 9051 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,352989000,5.128804,14.529643
+2023-04-06 23:33:11,4,5 100000 71 -1 4  ,./perfexp--lq-tailq--stack-inslast-remelem,1313500000,5.022908,3.824064
+2023-04-06 23:33:16,2,5 1000000 7 -1 2  ,./perfexp--cpp-stlref--stack-inslast-inselem,224000000,5.068988,22.629411
+2023-04-06 23:33:21,1,5 10000 809 -1 1  ,./perfexp--lq-tailq--stack-insfirst-inselem,420680000,5.058039,12.023483
+2023-04-06 23:33:26,4,5 1000 9051 -1 4  ,./perfexp--cfa-cfa--stack-inslast-remelem,597366000,5.067353,8.482828
+2023-04-06 23:33:31,1,5 1000 9051 -1 1  ,./perfexp--cpp-stlref--queue-insfirst-inselem,171969000,5.047845,29.353226
+2023-04-06 23:33:36,2,5 10000 809 -1 2  ,./perfexp--lq-tailq--stack-inslast-remelem,809000000,5.044723,6.235752
+2023-04-06 23:33:41,3,5 100000 71 -1 3  ,./perfexp--lq-tailq--queue-inslast-remelem,589300000,5.035557,8.544980
+2023-04-06 23:33:46,4,5 100000 71 -1 4  ,./perfexp--upp-upp--queue-inslast-remelem,717100000,5.046045,7.036738
+2023-04-06 23:33:51,5,5 1000 9051 -1 5  ,./perfexp--cfa-cfa--queue-insfirst-remelem,597366000,5.069419,8.486286
+2023-04-06 23:33:56,1,5 1000000 7 -1 1  ,./perfexp--upp-upp--queue-insfirst-remelem,868000000,5.025089,5.789273
+2023-04-06 23:34:01,2,5 1000000 7 -1 2  ,./perfexp--cfa-cfa--stack-inslast-inselem,658000000,5.025487,7.637518
+2023-04-06 23:34:06,2,5 1000000 7 -1 2  ,./perfexp--cfa-cfa--queue-inslast-remelem,980000000,5.009915,5.112158
+2023-04-06 23:34:11,3,5 100000 71 -1 3  ,./perfexp--cfa-cfa--queue-inslast-remelem,823600000,5.002809,6.074319
+2023-04-06 23:34:16,3,5 1000000 7 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-remelem,231000000,5.141988,22.259688
+2023-04-06 23:34:22,1,5 1000 9051 -1 1  ,./perfexp--lq-tailq--queue-insfirst-remelem,642621000,5.057599,7.870267
+2023-04-06 23:34:27,4,5 100000 71 -1 4  ,./perfexp--cpp-stlref--stack-inslast-inselem,184600000,5.153607,27.917698
+2023-04-06 23:34:32,4,5 1000000 7 -1 4  ,./perfexp--cfa-cfa--stack-inslast-inselem,658000000,5.017245,7.624992
+2023-04-06 23:34:37,5,5 10000 809 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,485400000,5.077844,10.461154
+2023-04-06 23:34:42,4,5 1000000 7 -1 4  ,./perfexp--cpp-stlref--queue-inslast-remelem,217000000,5.099401,23.499544
+2023-04-06 23:34:47,3,5 1000000 7 -1 3  ,./perfexp--cfa-cfa--queue-inslast-inselem,658000000,5.013213,7.618865
+2023-04-06 23:34:52,4,5 10000 809 -1 4  ,./perfexp--lq-tailq--stack-insfirst-remelem,590570000,5.033234,8.522671
+2023-04-06 23:34:57,1,5 1000 9051 -1 1  ,./perfexp--lq-tailq--stack-inslast-inselem,316785000,5.046378,15.929978
+2023-04-06 23:35:02,5,5 100 72421 -1 5  ,./perfexp--cpp-stlref--queue-inslast-remelem,159326200,5.120925,32.141136
+2023-04-06 23:35:07,1,5 1000 9051 -1 1  ,./perfexp--upp-upp--stack-inslast-allhead,334887000,5.038462,15.045260
+2023-04-06 23:35:12,5,5 1000000 7 -1 5  ,./perfexp--cpp-stlref--stack-inslast-inselem,231000000,5.148560,22.288139
+2023-04-06 23:35:18,2,5 10000 809 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-inselem,169890000,5.124945,30.166255
+2023-04-06 23:35:23,5,5 100000 71 -1 5  ,./perfexp--cfa-cfa--queue-inslast-inselem,553800000,5.003500,9.034850
+2023-04-06 23:35:28,3,5 1000 9051 -1 3  ,./perfexp--lq-list--stack-insfirst-remelem,534009000,5.006456,9.375228
+2023-04-06 23:35:33,5,5 100000 71 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,624800000,5.050627,8.083590
+2023-04-06 23:35:38,3,5 1000 9051 -1 3  ,./perfexp--lq-tailq--queue-insfirst-remelem,642621000,5.039619,7.842288
+2023-04-06 23:35:43,3,5 1000000 7 -1 3  ,./perfexp--lq-list--stack-insfirst-inselem,574000000,5.031817,8.766232
+2023-04-06 23:35:48,1,5 100 72421 -1 1  ,./perfexp--cfa-cfa--queue-inslast-inselem,137599900,5.246307,38.127259
+2023-04-06 23:35:53,3,5 10000 809 -1 3  ,./perfexp--lq-tailq--stack-inslast-allhead,501580000,5.012750,9.993919
+2023-04-06 23:35:58,5,5 1000 9051 -1 5  ,./perfexp--upp-upp--stack-inslast-inselem,325836000,5.131221,15.747864
+2023-04-06 23:36:03,5,5 100 72421 -1 5  ,./perfexp--lq-tailq--stack-inslast-allhead,159326200,5.111924,32.084641
+2023-04-06 23:36:09,2,5 10000 809 -1 2  ,./perfexp--upp-upp--queue-inslast-remelem,606750000,5.003928,8.247100
+2023-04-06 23:36:14,3,5 100000 71 -1 3  ,./perfexp--cfa-cfa--queue-inslast-allhead,582200000,5.022484,8.626733
+2023-04-06 23:36:19,2,5 100 72421 -1 2  ,./perfexp--cpp-stlref--stack-inslast-inselem,166568300,5.222978,31.356375
+2023-04-06 23:36:24,1,5 1000 9051 -1 1  ,./perfexp--cpp-stlref--stack-inslast-allhead,162918000,5.101216,31.311556
+2023-04-06 23:36:29,1,5 1000000 7 -1 1  ,./perfexp--lq-tailq--queue-inslast-allhead,959000000,5.005860,5.219875
+2023-04-06 23:36:34,4,5 1000 9051 -1 4  ,./perfexp--upp-upp--queue-insfirst-inselem,307734000,5.025667,16.331205
+2023-04-06 23:36:39,3,5 1000 9051 -1 3  ,./perfexp--cfa-cfa--stack-inslast-remelem,588315000,5.002182,8.502557
+2023-04-06 23:36:44,2,5 1000 9051 -1 2  ,./perfexp--cpp-stlref--stack-inslast-remelem,153867000,5.230752,33.995282
+2023-04-06 23:36:49,4,5 100 72421 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-remelem,152084100,5.127175,33.712762
+2023-04-06 23:36:54,3,5 10000 809 -1 3  ,./perfexp--lq-tailq--stack-inslast-remelem,784730000,5.021496,6.399011
+2023-04-06 23:37:00,4,5 1000000 7 -1 4  ,./perfexp--lq-tailq--queue-insfirst-allhead,1022000000,5.025863,4.917674
+2023-04-06 23:37:05,5,5 10000 809 -1 5  ,./perfexp--cfa-cfa--queue-insfirst-inselem,444950000,5.083193,11.424189
+2023-04-06 23:37:10,4,5 1000 9051 -1 4  ,./perfexp--lq-list--stack-insfirst-inselem,325836000,5.104508,15.665881
+2023-04-06 23:37:15,4,5 1000000 7 -1 4  ,./perfexp--cpp-stlref--queue-insfirst-allhead,224000000,5.044330,22.519330
+2023-04-06 23:37:20,1,5 1000000 7 -1 1  ,./perfexp--cfa-cfa--stack-inslast-inselem,658000000,5.008834,7.612210
+2023-04-06 23:37:25,5,5 10000 809 -1 5  ,./perfexp--lq-tailq--queue-insfirst-allhead,461130000,5.088815,11.035532
+2023-04-06 23:37:30,2,5 1000 9051 -1 2  ,./perfexp--upp-upp--queue-insfirst-remelem,534009000,5.067296,9.489158
+2023-04-06 23:37:35,4,5 1000 9051 -1 4  ,./perfexp--cpp-stlref--stack-inslast-inselem,162918000,5.085345,31.214138
+2023-04-06 23:37:40,3,5 1000 9051 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,343938000,5.058624,14.707953
+2023-04-06 23:37:45,4,5 1000000 7 -1 4  ,./perfexp--cfa-cfa--queue-insfirst-inselem,658000000,5.050619,7.675713
+2023-04-06 23:37:50,4,5 100 72421 -1 4  ,./perfexp--lq-tailq--queue-insfirst-inselem,130357800,5.147518,39.487610
+2023-04-06 23:37:55,2,5 10000 809 -1 2  ,./perfexp--lq-tailq--queue-inslast-remelem,606750000,5.060103,8.339684
+2023-04-06 23:38:00,4,5 10000 809 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,509670000,5.013006,9.835788
+2023-04-06 23:38:06,2,5 1000000 7 -1 2  ,./perfexp--cfa-cfa--queue-insfirst-allhead,665000000,5.030220,7.564241
+2023-04-06 23:38:11,4,5 10000 809 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,509670000,5.045241,9.899035
+2023-04-06 23:38:16,4,5 1000000 7 -1 4  ,./perfexp--upp-upp--stack-inslast-remelem,707000000,5.030443,7.115195
+2023-04-06 23:38:21,3,5 100000 71 -1 3  ,./perfexp--lq-tailq--stack-inslast-allhead,1036600000,5.005349,4.828621
+2023-04-06 23:38:26,4,5 100 72421 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,166568300,5.122366,30.752346
+2023-04-06 23:38:31,4,5 10000 809 -1 4  ,./perfexp--cfa-cfa--stack-inslast-remelem,720010000,5.032318,6.989233
+2023-04-06 23:38:36,5,5 1000000 7 -1 5  ,./perfexp--lq-tailq--stack-inslast-allhead,1078000000,5.011085,4.648502
+2023-04-06 23:38:41,5,5 1000000 7 -1 5  ,./perfexp--upp-upp--stack-insfirst-remelem,693000000,5.044421,7.279107
+2023-04-06 23:38:46,1,5 1000000 7 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-inselem,217000000,5.008831,23.082171
+2023-04-06 23:38:51,1,5 1000000 7 -1 1  ,./perfexp--lq-tailq--stack-inslast-inselem,980000000,5.001764,5.103841
+2023-04-06 23:38:56,2,5 100 72421 -1 2  ,./perfexp--cfa-cfa--stack-inslast-allhead,159326200,5.160432,32.389099
+2023-04-06 23:39:01,5,5 1000000 7 -1 5  ,./perfexp--cfa-cfa--queue-insfirst-remelem,994000000,5.009426,5.039664
+2023-04-06 23:39:06,5,5 100000 71 -1 5  ,./perfexp--lq-tailq--stack-inslast-allhead,1008200000,5.006411,4.965692
+2023-04-06 23:39:11,2,5 1000000 7 -1 2  ,./perfexp--upp-upp--queue-insfirst-allhead,679000000,5.010746,7.379596
+2023-04-06 23:39:16,3,5 1000 9051 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-remelem,588315000,5.073975,8.624589
+2023-04-06 23:39:21,1,5 100 72421 -1 1  ,./perfexp--upp-upp--stack-insfirst-remelem,267957700,5.034365,18.787909
+2023-04-06 23:39:26,5,5 1000 9051 -1 5  ,./perfexp--upp-upp--queue-insfirst-remelem,534009000,5.054075,9.464400
+2023-04-06 23:39:31,5,5 1000000 7 -1 5  ,./perfexp--cfa-cfa--queue-inslast-allhead,665000000,5.000117,7.518973
+2023-04-06 23:39:36,5,5 100 72421 -1 5  ,./perfexp--upp-upp--queue-inslast-allhead,137599900,5.044078,36.657570
+2023-04-06 23:39:42,3,5 1000000 7 -1 3  ,./perfexp--cpp-stlref--stack-inslast-remelem,224000000,5.024699,22.431692
+2023-04-06 23:39:47,3,5 1000000 7 -1 3  ,./perfexp--cfa-cfa--queue-insfirst-allhead,665000000,5.038271,7.576347
+2023-04-06 23:39:52,2,5 100 72421 -1 2  ,./perfexp--cfa-cfa--queue-insfirst-inselem,137599900,5.151879,37.441008
+2023-04-06 23:39:57,3,5 100 72421 -1 3  ,./perfexp--cfa-cfa--queue-inslast-inselem,137599900,5.247585,38.136547
+2023-04-06 23:40:02,1,5 100 72421 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,159326200,5.203331,32.658351
+2023-04-06 23:40:07,1,5 100 72421 -1 1  ,./perfexp--lq-tailq--stack-inslast-remelem,347620800,5.038125,14.493163
+2023-04-06 23:40:12,5,5 100000 71 -1 5  ,./perfexp--cfa-cfa--queue-insfirst-allhead,532500000,5.009917,9.408295
+2023-04-06 23:40:17,2,5 100000 71 -1 2  ,./perfexp--lq-list--stack-insfirst-remelem,681600000,5.024278,7.371300
+2023-04-06 23:40:22,5,5 1000 9051 -1 5  ,./perfexp--lq-list--stack-insfirst-remelem,534009000,5.005566,9.373561
+2023-04-06 23:40:27,5,5 1000 9051 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-remelem,588315000,5.056992,8.595722
+2023-04-06 23:40:32,2,5 100 72421 -1 2  ,./perfexp--lq-tailq--queue-inslast-inselem,144842000,5.153273,35.578582
+2023-04-06 23:40:38,4,5 1000000 7 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,945000000,5.002845,5.294016
+2023-04-06 23:40:43,1,5 1000 9051 -1 1  ,./perfexp--cfa-cfa--queue-inslast-allhead,343938000,5.058633,14.707979
+2023-04-06 23:40:48,5,5 10000 809 -1 5  ,./perfexp--lq-tailq--stack-insfirst-inselem,420680000,5.068194,12.047623
+2023-04-06 23:40:53,3,5 1000000 7 -1 3  ,./perfexp--lq-tailq--stack-inslast-allhead,1078000000,5.010055,4.647546
+2023-04-06 23:40:58,3,5 100000 71 -1 3  ,./perfexp--cpp-stlref--queue-insfirst-remelem,184600000,5.101831,27.637221
+2023-04-06 23:41:03,3,5 1000000 7 -1 3  ,./perfexp--upp-upp--queue-insfirst-remelem,854000000,5.009771,5.866242
+2023-04-06 23:41:08,5,5 1000 9051 -1 5  ,./perfexp--lq-tailq--stack-inslast-inselem,316785000,5.026464,15.867115
+2023-04-06 23:41:13,1,5 10000 809 -1 1  ,./perfexp--cfa-cfa--queue-insfirst-inselem,444950000,5.000762,11.238930
+2023-04-06 23:41:18,2,5 100000 71 -1 2  ,./perfexp--upp-upp--queue-inslast-remelem,702900000,5.023292,7.146524
+2023-04-06 23:41:23,4,5 10000 809 -1 4  ,./perfexp--upp-upp--stack-insfirst-remelem,582480000,5.024755,8.626485
+2023-04-06 23:41:28,1,5 1000000 7 -1 1  ,./perfexp--cpp-stlref--queue-insfirst-allhead,224000000,5.026874,22.441402
+2023-04-06 23:41:33,2,5 1000 9051 -1 2  ,./perfexp--lq-tailq--stack-insfirst-remelem,534009000,5.029006,9.417456
+2023-04-06 23:41:38,2,5 100 72421 -1 2  ,./perfexp--cpp-stlref--queue-inslast-remelem,159326200,5.174692,32.478601
+2023-04-06 23:41:43,1,5 1000000 7 -1 1  ,./perfexp--lq-tailq--stack-insfirst-remelem,784000000,5.004447,6.383223
+2023-04-06 23:41:48,4,5 1000000 7 -1 4  ,./perfexp--cpp-stlref--queue-insfirst-remelem,224000000,5.007044,22.352875
+2023-04-06 23:41:53,3,5 100 72421 -1 3  ,./perfexp--cpp-stlref--queue-insfirst-allhead,166568300,5.093894,30.581413
+2023-04-06 23:41:58,1,5 10000 809 -1 1  ,./perfexp--lq-tailq--stack-inslast-inselem,501580000,5.063699,10.095496
+2023-04-06 23:42:03,5,5 1000000 7 -1 5  ,./perfexp--upp-upp--stack-insfirst-inselem,672000000,5.002208,7.443762
+2023-04-06 23:42:09,3,5 1000000 7 -1 3  ,./perfexp--upp-upp--stack-inslast-allhead,700000000,5.035791,7.193987
+2023-04-06 23:42:14,5,5 100000 71 -1 5  ,./perfexp--lq-tailq--stack-inslast-remelem,1263800000,5.028343,3.978749
+2023-04-06 23:42:19,3,5 100 72421 -1 3  ,./perfexp--cpp-stlref--queue-inslast-remelem,159326200,5.113131,32.092217
+2023-04-06 23:42:24,5,5 1000 9051 -1 5  ,./perfexp--cfa-cfa--stack-inslast-remelem,597366000,5.046347,8.447664
+2023-04-06 23:42:29,2,5 1000 9051 -1 2  ,./perfexp--lq-tailq--queue-insfirst-remelem,642621000,5.053251,7.863501
+2023-04-06 23:42:34,4,5 10000 809 -1 4  ,./perfexp--upp-upp--stack-inslast-inselem,444950000,5.077268,11.410873
+2023-04-06 23:42:39,2,5 1000 9051 -1 2  ,./perfexp--cpp-stlref--queue-inslast-inselem,171969000,5.099023,29.650827
+2023-04-06 23:42:44,1,5 1000 9051 -1 1  ,./perfexp--lq-tailq--stack-inslast-allhead,325836000,5.047047,15.489532
+2023-04-06 23:42:49,5,5 1000 9051 -1 5  ,./perfexp--cpp-stlref--queue-insfirst-allhead,181020000,5.216122,28.815170
+2023-04-06 23:42:54,3,5 1000 9051 -1 3  ,./perfexp--cpp-stlref--queue-insfirst-allhead,181020000,5.222584,28.850867
+2023-04-06 23:43:00,5,5 1000 9051 -1 5  ,./perfexp--lq-tailq--queue-inslast-remelem,534009000,5.024676,9.409347
+2023-04-06 23:43:05,1,5 1000 9051 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,162918000,5.066455,31.098191
+2023-04-06 23:43:10,4,5 100000 71 -1 4  ,./perfexp--upp-upp--stack-inslast-allhead,646100000,5.006395,7.748638
+2023-04-06 23:43:15,1,5 100000 71 -1 1  ,./perfexp--lq-tailq--stack-inslast-allhead,1022400000,5.033839,4.923551
+2023-04-06 23:43:20,5,5 10000 809 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-remelem,169890000,5.194201,30.573907
+2023-04-06 23:43:25,3,5 100000 71 -1 3  ,./perfexp--upp-upp--stack-insfirst-inselem,617700000,5.004354,8.101593
+2023-04-06 23:43:30,1,5 100000 71 -1 1  ,./perfexp--cfa-cfa--queue-insfirst-inselem,568000000,5.053840,8.897606
+2023-04-06 23:43:35,4,5 100000 71 -1 4  ,./perfexp--lq-tailq--queue-inslast-allhead,773900000,5.009564,6.473141
+2023-04-06 23:43:40,3,5 10000 809 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-inselem,477310000,5.060300,10.601705
+2023-04-06 23:43:45,4,5 100000 71 -1 4  ,./perfexp--cfa-cfa--queue-insfirst-remelem,766800000,5.029327,6.558851
+2023-04-06 23:43:50,5,5 1000 9051 -1 5  ,./perfexp--upp-upp--stack-insfirst-inselem,307734000,5.015156,16.297049
+2023-04-06 23:43:55,2,5 1000 9051 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,343938000,5.030864,14.627241
+2023-04-06 23:44:00,1,5 100000 71 -1 1  ,./perfexp--upp-upp--stack-inslast-inselem,546700000,5.028823,9.198506
+2023-04-06 23:44:06,4,5 100 72421 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,159326200,5.159831,32.385326
+2023-04-06 23:44:11,2,5 100000 71 -1 2  ,./perfexp--cpp-stlref--queue-insfirst-inselem,184600000,5.013750,27.160076
+2023-04-06 23:44:16,1,5 100000 71 -1 1  ,./perfexp--cpp-stlref--stack-inslast-remelem,184600000,5.191165,28.121154
+2023-04-06 23:44:21,3,5 100 72421 -1 3  ,./perfexp--lq-list--stack-insfirst-inselem,166568300,5.221509,31.347555
+2023-04-06 23:44:26,1,5 100000 71 -1 1  ,./perfexp--lq-list--stack-insfirst-remelem,681600000,5.027947,7.376683
+2023-04-06 23:44:31,1,5 10000 809 -1 1  ,./perfexp--lq-tailq--queue-inslast-allhead,493490000,5.065787,10.265227
+2023-04-06 23:44:36,1,5 1000000 7 -1 1  ,./perfexp--upp-upp--stack-inslast-inselem,448000000,5.071891,11.321185
+2023-04-06 23:44:41,5,5 1000 9051 -1 5  ,./perfexp--upp-upp--stack-inslast-remelem,570213000,5.041445,8.841336
+2023-04-06 23:44:46,3,5 1000000 7 -1 3  ,./perfexp--cpp-stlref--queue-insfirst-inselem,224000000,5.075413,22.658094
+2023-04-06 23:44:51,1,5 10000 809 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,517760000,5.074958,9.801758
+2023-04-06 23:44:57,1,5 1000 9051 -1 1  ,./perfexp--lq-list--stack-insfirst-inselem,325836000,5.079069,15.587808
+2023-04-06 23:45:02,5,5 100000 71 -1 5  ,./perfexp--cpp-stlref--stack-inslast-remelem,184600000,5.156223,27.931869
+2023-04-06 23:45:07,5,5 100000 71 -1 5  ,./perfexp--lq-tailq--queue-inslast-remelem,646100000,5.048818,7.814298
+2023-04-06 23:45:12,5,5 1000 9051 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-remelem,153867000,5.084243,33.043102
+2023-04-06 23:45:17,1,5 100 72421 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-remelem,152084100,5.088762,33.460184
+2023-04-06 23:45:22,4,5 10000 809 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-inselem,477310000,5.040919,10.561101
+2023-04-06 23:45:27,2,5 100 72421 -1 2  ,./perfexp--cpp-stlref--queue-insfirst-allhead,166568300,5.107945,30.665769
+2023-04-06 23:45:32,5,5 100000 71 -1 5  ,./perfexp--cfa-cfa--queue-insfirst-remelem,759700000,5.013032,6.598699
+2023-04-06 23:45:37,5,5 100 72421 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-inselem,159326200,5.183840,32.536017
+2023-04-06 23:45:43,2,5 100000 71 -1 2  ,./perfexp--upp-upp--stack-inslast-inselem,546700000,5.060570,9.256576
+2023-04-06 23:45:48,1,5 100000 71 -1 1  ,./perfexp--cfa-cfa--queue-insfirst-remelem,773900000,5.016882,6.482597
+2023-04-06 23:45:53,2,5 100 72421 -1 2  ,./perfexp--cfa-cfa--queue-inslast-allhead,137599900,5.146936,37.405085
+2023-04-06 23:45:58,1,5 1000000 7 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-inselem,665000000,5.030136,7.564114
+2023-04-06 23:46:03,5,5 1000000 7 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,231000000,5.069341,21.945199
+2023-04-06 23:46:08,4,5 1000 9051 -1 4  ,./perfexp--cfa-cfa--queue-inslast-remelem,588315000,5.038815,8.564825
+2023-04-06 23:46:13,2,5 1000 9051 -1 2  ,./perfexp--cfa-cfa--stack-inslast-remelem,597366000,5.062109,8.474049
+2023-04-06 23:46:18,5,5 100 72421 -1 5  ,./perfexp--upp-upp--queue-insfirst-allhead,130357800,5.097324,39.102562
+2023-04-06 23:46:23,2,5 1000 9051 -1 2  ,./perfexp--cpp-stlref--queue-insfirst-inselem,181020000,5.245083,28.975157
+2023-04-06 23:46:28,5,5 10000 809 -1 5  ,./perfexp--cfa-cfa--stack-inslast-remelem,728100000,5.048765,6.934164
+2023-04-06 23:46:34,2,5 100 72421 -1 2  ,./perfexp--upp-upp--queue-inslast-remelem,260715600,5.006853,19.204271
+2023-04-06 23:46:39,2,5 1000 9051 -1 2  ,./perfexp--cpp-stlref--queue-inslast-remelem,171969000,5.222348,30.367962
+2023-04-06 23:46:44,4,5 1000000 7 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-remelem,917000000,5.014479,5.468352
+2023-04-06 23:46:49,4,5 100 72421 -1 4  ,./perfexp--lq-list--stack-insfirst-inselem,166568300,5.223544,31.359773
+2023-04-06 23:46:54,2,5 100000 71 -1 2  ,./perfexp--lq-tailq--stack-inslast-allhead,994000000,5.008805,5.039039
+2023-04-06 23:46:59,5,5 10000 809 -1 5  ,./perfexp--lq-tailq--stack-inslast-allhead,509670000,5.037473,9.883793
+2023-04-06 23:47:04,5,5 10000 809 -1 5  ,./perfexp--cfa-cfa--queue-insfirst-allhead,444950000,5.008930,11.257287
+2023-04-06 23:47:09,5,5 100000 71 -1 5  ,./perfexp--cfa-cfa--stack-inslast-remelem,1022400000,5.031635,4.921396
+2023-04-06 23:47:14,1,5 1000000 7 -1 1  ,./perfexp--lq-list--stack-insfirst-remelem,798000000,5.019472,6.290065
+2023-04-06 23:47:19,1,5 100 72421 -1 1  ,./perfexp--lq-list--stack-insfirst-remelem,333136600,5.086682,15.269058
+2023-04-06 23:47:24,3,5 10000 809 -1 3  ,./perfexp--cfa-cfa--queue-insfirst-inselem,444950000,5.009886,11.259436
+2023-04-06 23:47:29,1,5 1000000 7 -1 1  ,./perfexp--lq-tailq--queue-insfirst-allhead,1022000000,5.028409,4.920165
+2023-04-06 23:47:34,3,5 1000000 7 -1 3  ,./perfexp--cpp-stlref--stack-inslast-inselem,224000000,5.134726,22.922884
+2023-04-06 23:47:40,3,5 100 72421 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,166568300,5.129354,30.794299
+2023-04-06 23:47:45,3,5 100 72421 -1 3  ,./perfexp--upp-upp--stack-insfirst-remelem,267957700,5.029663,18.770362
+2023-04-06 23:47:50,1,5 100 72421 -1 1  ,./perfexp--lq-tailq--queue-inslast-allhead,144842000,5.159035,35.618363
+2023-04-06 23:47:55,1,5 1000 9051 -1 1  ,./perfexp--cpp-stlref--stack-inslast-remelem,153867000,5.205434,33.830737
+2023-04-06 23:48:00,5,5 100000 71 -1 5  ,./perfexp--lq-tailq--queue-insfirst-remelem,859100000,5.024798,5.848909
+2023-04-06 23:48:05,5,5 1000 9051 -1 5  ,./perfexp--lq-tailq--queue-inslast-inselem,352989000,5.106726,14.467097
+2023-04-06 23:48:10,3,5 1000 9051 -1 3  ,./perfexp--upp-upp--queue-inslast-inselem,325836000,5.095977,15.639699
+2023-04-06 23:48:15,2,5 1000 9051 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-inselem,162918000,5.237821,32.150045
+2023-04-06 23:48:21,5,5 1000000 7 -1 5  ,./perfexp--cpp-stlref--stack-inslast-allhead,231000000,5.106340,22.105368
+2023-04-06 23:48:26,1,5 100 72421 -1 1  ,./perfexp--cpp-stlref--queue-inslast-inselem,159326200,5.099221,32.004912
+2023-04-06 23:48:31,2,5 100 72421 -1 2  ,./perfexp--lq-tailq--stack-insfirst-inselem,159326200,5.004885,31.412818
+2023-04-06 23:48:36,2,5 100 72421 -1 2  ,./perfexp--upp-upp--queue-insfirst-inselem,130357800,5.103887,39.152908
+2023-04-06 23:48:41,5,5 1000 9051 -1 5  ,./perfexp--lq-tailq--queue-insfirst-allhead,316785000,5.095627,16.085443
+2023-04-06 23:48:46,2,5 10000 809 -1 2  ,./perfexp--cpp-stlref--stack-inslast-allhead,169890000,5.023940,29.571723
+2023-04-06 23:48:51,3,5 100000 71 -1 3  ,./perfexp--lq-list--stack-insfirst-inselem,724200000,5.040016,6.959426
+2023-04-06 23:48:56,4,5 1000000 7 -1 4  ,./perfexp--upp-upp--queue-insfirst-allhead,679000000,5.039133,7.421404
+2023-04-06 23:49:01,2,5 100 72421 -1 2  ,./perfexp--cpp-stlref--stack-inslast-remelem,159326200,5.202599,32.653757
+2023-04-06 23:49:07,2,5 1000 9051 -1 2  ,./perfexp--upp-upp--queue-insfirst-allhead,316785000,5.001730,15.789037
+2023-04-06 23:49:12,4,5 1000000 7 -1 4  ,./perfexp--cpp-stlref--stack-inslast-remelem,224000000,5.005996,22.348196
+2023-04-06 23:49:17,4,5 1000000 7 -1 4  ,./perfexp--cfa-cfa--queue-inslast-allhead,672000000,5.047250,7.510789
+2023-04-06 23:49:22,1,5 100000 71 -1 1  ,./perfexp--lq-tailq--queue-inslast-inselem,710000000,5.015764,7.064456
+2023-04-06 23:49:27,4,5 1000 9051 -1 4  ,./perfexp--lq-tailq--queue-insfirst-remelem,642621000,5.038532,7.840597
+2023-04-06 23:49:32,3,5 100 72421 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-remelem,152084100,5.074580,33.366933
+2023-04-06 23:49:37,3,5 10000 809 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,169890000,5.038720,29.658720
+2023-04-06 23:49:42,3,5 100 72421 -1 3  ,./perfexp--upp-upp--queue-insfirst-allhead,130357800,5.097956,39.107411
+2023-04-06 23:49:47,2,5 1000000 7 -1 2  ,./perfexp--cfa-cfa--queue-inslast-allhead,665000000,5.003770,7.524466
+2023-04-06 23:49:52,5,5 100000 71 -1 5  ,./perfexp--upp-upp--queue-inslast-inselem,646100000,5.033712,7.790918
+2023-04-06 23:49:57,5,5 100 72421 -1 5  ,./perfexp--cpp-stlref--stack-inslast-remelem,159326200,5.197406,32.621163
+2023-04-06 23:50:02,3,5 1000000 7 -1 3  ,./perfexp--lq-list--stack-insfirst-remelem,798000000,5.021226,6.292263
+2023-04-06 23:50:07,2,5 100 72421 -1 2  ,./perfexp--upp-upp--stack-insfirst-remelem,267957700,5.036691,18.796590
+2023-04-06 23:50:12,5,5 10000 809 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,517760000,5.076458,9.804655
+2023-04-06 23:50:18,1,5 1000 9051 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-inselem,343938000,5.111457,14.861565
+2023-04-06 23:50:23,4,5 100000 71 -1 4  ,./perfexp--cfa-cfa--queue-inslast-remelem,766800000,5.036608,6.568346
+2023-04-06 23:50:28,3,5 100000 71 -1 3  ,./perfexp--cfa-cfa--stack-inslast-allhead,639000000,5.008767,7.838446
+2023-04-06 23:50:33,3,5 1000 9051 -1 3  ,./perfexp--cfa-cfa--queue-insfirst-inselem,343938000,5.096478,14.818014
+2023-04-06 23:50:38,5,5 1000000 7 -1 5  ,./perfexp--cpp-stlref--queue-inslast-inselem,224000000,5.053022,22.558134
+2023-04-06 23:50:43,3,5 1000000 7 -1 3  ,./perfexp--upp-upp--stack-inslast-inselem,588000000,5.043254,8.576963
+2023-04-06 23:50:48,1,5 1000 9051 -1 1  ,./perfexp--upp-upp--queue-insfirst-allhead,325836000,5.142199,15.781556
+2023-04-06 23:50:53,3,5 100000 71 -1 3  ,./perfexp--upp-upp--queue-inslast-inselem,575100000,5.013201,8.717094
+2023-04-06 23:50:58,1,5 100000 71 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,788100000,5.011622,6.359119
+2023-04-06 23:51:03,1,5 100000 71 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-inselem,603500000,5.049321,8.366729
+2023-04-06 23:51:08,2,5 100 72421 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,166568300,5.050434,30.320499
+2023-04-06 23:51:13,3,5 1000 9051 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-inselem,162918000,5.096707,31.283879
+2023-04-06 23:51:18,2,5 1000000 7 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,805000000,5.003890,6.216012
+2023-04-06 23:51:23,1,5 100 72421 -1 1  ,./perfexp--upp-upp--queue-inslast-inselem,137599900,5.089424,36.987120
+2023-04-06 23:51:29,5,5 10000 809 -1 5  ,./perfexp--lq-list--stack-insfirst-remelem,582480000,5.006380,8.594939
+2023-04-06 23:51:34,3,5 10000 809 -1 3  ,./perfexp--cfa-cfa--queue-inslast-allhead,453040000,5.016531,11.073042
+2023-04-06 23:51:39,2,5 10000 809 -1 2  ,./perfexp--cfa-cfa--queue-inslast-inselem,453040000,5.063734,11.177234
+2023-04-06 23:51:44,1,5 10000 809 -1 1  ,./perfexp--cpp-stlref--queue-insfirst-allhead,177980000,5.226280,29.364423
+2023-04-06 23:51:49,2,5 1000 9051 -1 2  ,./perfexp--cfa-cfa--queue-inslast-allhead,343938000,5.057972,14.706057
+2023-04-06 23:51:54,3,5 10000 809 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,509670000,5.025430,9.860164
+2023-04-06 23:51:59,4,5 10000 809 -1 4  ,./perfexp--cpp-stlref--stack-inslast-remelem,161800000,5.000954,30.908245
+2023-04-06 23:52:04,4,5 1000 9051 -1 4  ,./perfexp--cpp-stlref--queue-insfirst-allhead,181020000,5.211717,28.790835
+2023-04-06 23:52:09,3,5 10000 809 -1 3  ,./perfexp--cfa-cfa--stack-inslast-allhead,477310000,5.049791,10.579688
+2023-04-06 23:52:14,1,5 10000 809 -1 1  ,./perfexp--lq-list--stack-insfirst-remelem,590570000,5.016456,8.494261
+2023-04-06 23:52:19,1,5 1000 9051 -1 1  ,./perfexp--upp-upp--queue-insfirst-remelem,534009000,5.061113,9.477580
+2023-04-06 23:52:24,1,5 10000 809 -1 1  ,./perfexp--cpp-stlref--queue-insfirst-remelem,169890000,5.017420,29.533345
+2023-04-06 23:52:29,1,5 10000 809 -1 1  ,./perfexp--lq-tailq--queue-inslast-inselem,485400000,5.081081,10.467822
+2023-04-06 23:52:34,1,5 1000 9051 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,343938000,5.033256,14.634196
+2023-04-06 23:52:40,3,5 1000000 7 -1 3  ,./perfexp--upp-upp--queue-inslast-remelem,784000000,5.033145,6.419828
+2023-04-06 23:52:45,2,5 1000000 7 -1 2  ,./perfexp--lq-tailq--stack-inslast-inselem,980000000,5.012630,5.114929
+2023-04-06 23:52:50,5,5 1000000 7 -1 5  ,./perfexp--lq-tailq--stack-insfirst-remelem,791000000,5.040982,6.372923
+2023-04-06 23:52:55,2,5 10000 809 -1 2  ,./perfexp--upp-upp--stack-inslast-inselem,444950000,5.091346,11.442513
+2023-04-06 23:53:00,5,5 100000 71 -1 5  ,./perfexp--cfa-cfa--queue-inslast-remelem,752600000,5.007532,6.653643
+2023-04-06 23:53:05,5,5 1000 9051 -1 5  ,./perfexp--cpp-stlref--queue-insfirst-remelem,171969000,5.137818,29.876420
+2023-04-06 23:53:10,5,5 10000 809 -1 5  ,./perfexp--cfa-cfa--stack-inslast-allhead,477310000,5.056730,10.594226
+2023-04-06 23:53:15,3,5 100000 71 -1 3  ,./perfexp--upp-upp--queue-insfirst-inselem,539600000,5.044061,9.347778
+2023-04-06 23:53:20,2,5 1000000 7 -1 2  ,./perfexp--upp-upp--queue-inslast-allhead,889000000,5.018817,5.645463
+2023-04-06 23:53:25,2,5 10000 809 -1 2  ,./perfexp--lq-tailq--queue-inslast-allhead,485400000,5.004149,10.309330
+2023-04-06 23:53:30,3,5 1000 9051 -1 3  ,./perfexp--lq-tailq--stack-inslast-remelem,687876000,5.062201,7.359177
+2023-04-06 23:53:35,1,5 100 72421 -1 1  ,./perfexp--cfa-cfa--queue-insfirst-allhead,137599900,5.148068,37.413312
+2023-04-06 23:53:40,1,5 1000 9051 -1 1  ,./perfexp--lq-tailq--queue-insfirst-inselem,289632000,5.012993,17.308146
+2023-04-06 23:53:45,1,5 100000 71 -1 1  ,./perfexp--cfa-cfa--queue-inslast-inselem,575100000,5.045375,8.773039
+2023-04-06 23:53:50,1,5 100 72421 -1 1  ,./perfexp--upp-upp--queue-insfirst-allhead,130357800,5.099296,39.117690
+2023-04-06 23:53:56,2,5 1000000 7 -1 2  ,./perfexp--upp-upp--stack-inslast-inselem,588000000,5.037787,8.567665
+2023-04-06 23:54:01,4,5 100000 71 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,184600000,5.105671,27.658023
+2023-04-06 23:54:06,3,5 100 72421 -1 3  ,./perfexp--lq-tailq--stack-insfirst-remelem,333136600,5.074849,15.233538
+2023-04-06 23:54:11,5,5 100 72421 -1 5  ,./perfexp--cfa-cfa--stack-inslast-remelem,325894500,5.093924,15.630592
+2023-04-06 23:54:16,3,5 1000 9051 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,343938000,5.031887,14.630215
+2023-04-06 23:54:21,2,5 100000 71 -1 2  ,./perfexp--cfa-cfa--stack-inslast-remelem,965600000,5.024737,5.203746
+2023-04-06 23:54:26,2,5 1000 9051 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,343938000,5.000385,14.538623
+2023-04-06 23:54:31,3,5 1000 9051 -1 3  ,./perfexp--cpp-stlref--stack-inslast-allhead,162918000,5.114478,31.392958
+2023-04-06 23:54:36,4,5 1000000 7 -1 4  ,./perfexp--upp-upp--queue-inslast-remelem,784000000,5.034203,6.421177
+2023-04-06 23:54:41,2,5 100000 71 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,773900000,5.039677,6.512052
+2023-04-06 23:54:46,4,5 100 72421 -1 4  ,./perfexp--cfa-cfa--stack-inslast-remelem,325894500,5.097422,15.641326
+2023-04-06 23:54:51,2,5 1000000 7 -1 2  ,./perfexp--upp-upp--stack-insfirst-remelem,756000000,5.023632,6.645016
+2023-04-06 23:54:56,3,5 10000 809 -1 3  ,./perfexp--cfa-cfa--queue-inslast-remelem,695740000,5.045478,7.251959
+2023-04-06 23:55:01,4,5 100000 71 -1 4  ,./perfexp--cpp-stlref--queue-inslast-remelem,177500000,5.031516,28.346569
+2023-04-06 23:55:07,5,5 100 72421 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,159326200,5.042017,31.645875
+2023-04-06 23:55:12,5,5 1000 9051 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,343938000,5.028640,14.620775
+2023-04-06 23:55:17,5,5 10000 809 -1 5  ,./perfexp--upp-upp--queue-inslast-inselem,444950000,5.013986,11.268650
+2023-04-06 23:55:22,5,5 100 72421 -1 5  ,./perfexp--upp-upp--stack-insfirst-remelem,267957700,5.032008,18.779113
+2023-04-06 23:55:27,2,5 1000 9051 -1 2  ,./perfexp--lq-tailq--queue-inslast-allhead,352989000,5.053183,14.315412
+2023-04-06 23:55:32,3,5 100 72421 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-inselem,159326200,5.186497,32.552694
+2023-04-06 23:55:37,2,5 1000 9051 -1 2  ,./perfexp--lq-list--stack-insfirst-remelem,534009000,5.014736,9.390733
+2023-04-06 23:55:42,3,5 1000 9051 -1 3  ,./perfexp--lq-tailq--queue-inslast-remelem,534009000,5.029801,9.418944
+2023-04-06 23:55:47,5,5 1000 9051 -1 5  ,./perfexp--cfa-cfa--stack-inslast-inselem,343938000,5.069517,14.739625
+2023-04-06 23:55:52,1,5 100000 71 -1 1  ,./perfexp--cfa-cfa--queue-inslast-allhead,582200000,5.043558,8.662930
+2023-04-06 23:55:57,4,5 100000 71 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-remelem,184600000,5.143890,27.865060
+2023-04-06 23:56:02,5,5 10000 809 -1 5  ,./perfexp--cfa-cfa--queue-inslast-allhead,461130000,5.080796,11.018142
+2023-04-06 23:56:07,3,5 1000 9051 -1 3  ,./perfexp--cpp-stlref--queue-inslast-inselem,171969000,5.118993,29.766952
+2023-04-06 23:56:13,4,5 10000 809 -1 4  ,./perfexp--lq-tailq--queue-insfirst-remelem,720010000,5.035548,6.993720
+2023-04-06 23:56:18,1,5 100 72421 -1 1  ,./perfexp--cfa-cfa--queue-insfirst-inselem,137599900,5.147075,37.406095
+2023-04-06 23:56:23,3,5 10000 809 -1 3  ,./perfexp--upp-upp--stack-insfirst-remelem,582480000,5.029466,8.634573
+2023-04-06 23:56:28,4,5 100 72421 -1 4  ,./perfexp--cpp-stlref--stack-inslast-allhead,166568300,5.213374,31.298717
+2023-04-06 23:56:33,4,5 100 72421 -1 4  ,./perfexp--upp-upp--queue-insfirst-inselem,130357800,5.104179,39.155148
+2023-04-06 23:56:38,5,5 10000 809 -1 5  ,./perfexp--upp-upp--queue-insfirst-remelem,647200000,5.055149,7.810799
+2023-04-06 23:56:43,4,5 1000 9051 -1 4  ,./perfexp--cfa-cfa--queue-insfirst-allhead,334887000,5.047137,15.071164
+2023-04-06 23:56:48,4,5 1000000 7 -1 4  ,./perfexp--lq-tailq--queue-insfirst-inselem,973000000,5.030706,5.170304
+2023-04-06 23:56:53,5,5 100 72421 -1 5  ,./perfexp--upp-upp--stack-insfirst-inselem,159326200,5.197585,32.622287
+2023-04-06 23:56:59,5,5 10000 809 -1 5  ,./perfexp--upp-upp--queue-insfirst-allhead,444950000,5.057074,11.365488
+2023-04-06 23:57:04,2,5 100000 71 -1 2  ,./perfexp--cpp-stlref--queue-inslast-remelem,177500000,5.028745,28.330958
+2023-04-06 23:57:09,4,5 1000 9051 -1 4  ,./perfexp--upp-upp--queue-insfirst-allhead,325836000,5.133705,15.755487
+2023-04-06 23:57:14,4,5 1000 9051 -1 4  ,./perfexp--cpp-stlref--queue-insfirst-inselem,181020000,5.216624,28.817943
+2023-04-06 23:57:19,5,5 100000 71 -1 5  ,./perfexp--upp-upp--queue-insfirst-inselem,546700000,5.040683,9.220199
+2023-04-06 23:57:24,2,5 100 72421 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,166568300,5.126525,30.777315
+2023-04-06 23:57:29,3,5 100000 71 -1 3  ,./perfexp--lq-tailq--queue-inslast-allhead,752600000,5.030341,6.683950
+2023-04-06 23:57:34,2,5 100000 71 -1 2  ,./perfexp--lq-tailq--queue-insfirst-inselem,781000000,5.002303,6.404997
+2023-04-06 23:57:39,1,5 100 72421 -1 1  ,./perfexp--lq-tailq--queue-inslast-remelem,311410300,5.110663,16.411349
+2023-04-06 23:57:44,5,5 100 72421 -1 5  ,./perfexp--upp-upp--queue-inslast-remelem,260715600,5.004443,19.195027
+2023-04-06 23:57:49,5,5 10000 809 -1 5  ,./perfexp--cpp-stlref--queue-insfirst-inselem,177980000,5.040817,28.322379
+2023-04-06 23:57:55,5,5 1000000 7 -1 5  ,./perfexp--upp-upp--queue-inslast-remelem,777000000,5.012582,6.451199
+2023-04-06 23:58:00,2,5 100 72421 -1 2  ,./perfexp--lq-tailq--queue-insfirst-inselem,130357800,5.143872,39.459641
+2023-04-06 23:58:05,3,5 1000 9051 -1 3  ,./perfexp--cfa-cfa--queue-insfirst-remelem,588315000,5.034068,8.556756
+2023-04-06 23:58:10,1,5 10000 809 -1 1  ,./perfexp--upp-upp--queue-inslast-inselem,436860000,5.006743,11.460749
+2023-04-06 23:58:15,4,5 100 72421 -1 4  ,./perfexp--lq-tailq--stack-insfirst-inselem,159326200,5.004273,31.408977
+2023-04-06 23:58:20,3,5 1000000 7 -1 3  ,./perfexp--lq-tailq--stack-insfirst-remelem,784000000,5.042812,6.432158
+2023-04-06 23:58:25,5,5 100000 71 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,788100000,5.002504,6.347550
+2023-04-06 23:58:30,3,5 100000 71 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-inselem,177500000,5.009520,28.222648
+2023-04-06 23:58:35,4,5 1000 9051 -1 4  ,./perfexp--cpp-stlref--stack-inslast-allhead,162918000,5.140808,31.554573
+2023-04-06 23:58:40,3,5 100 72421 -1 3  ,./perfexp--lq-tailq--queue-inslast-inselem,144842000,5.151509,35.566403
+2023-04-06 23:58:45,3,5 100 72421 -1 3  ,./perfexp--cpp-stlref--stack-inslast-remelem,152084100,5.034474,33.103224
+2023-04-06 23:58:50,5,5 100000 71 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-inselem,184600000,5.137038,27.827941
+2023-04-06 23:58:56,5,5 10000 809 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-inselem,477310000,5.038631,10.556307
+2023-04-06 23:59:01,4,5 1000 9051 -1 4  ,./perfexp--cpp-stlref--queue-inslast-inselem,171969000,5.114824,29.742709
+2023-04-06 23:59:06,1,5 1000 9051 -1 1  ,./perfexp--upp-upp--queue-inslast-remelem,515907000,5.030354,9.750505
+2023-04-06 23:59:11,3,5 1000000 7 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,665000000,5.014697,7.540898
+2023-04-06 23:59:16,5,5 1000000 7 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,665000000,5.003080,7.523429
+2023-04-06 23:59:21,5,5 10000 809 -1 5  ,./perfexp--cpp-stlref--queue-insfirst-allhead,169890000,5.029569,29.604856
+2023-04-06 23:59:26,3,5 100000 71 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,724200000,5.029829,6.945359
+2023-04-06 23:59:31,1,5 10000 809 -1 1  ,./perfexp--upp-upp--queue-inslast-allhead,493490000,5.010267,10.152722
+2023-04-06 23:59:36,3,5 1000 9051 -1 3  ,./perfexp--cpp-stlref--stack-inslast-remelem,153867000,5.204054,33.821768
+2023-04-06 23:59:41,5,5 100 72421 -1 5  ,./perfexp--lq-tailq--stack-insfirst-inselem,159326200,5.006861,31.425221
+2023-04-06 23:59:46,5,5 100 72421 -1 5  ,./perfexp--cpp-stlref--queue-insfirst-inselem,166568300,5.134474,30.825037
+2023-04-06 23:59:51,3,5 100000 71 -1 3  ,./perfexp--cpp-stlref--queue-insfirst-allhead,177500000,5.021209,28.288501
+2023-04-06 23:59:56,1,5 1000000 7 -1 1  ,./perfexp--cfa-cfa--queue-inslast-remelem,959000000,5.000634,5.214425
+2023-04-07 00:00:01,1,5 10000 809 -1 1  ,./perfexp--cpp-stlref--queue-inslast-allhead,177980000,5.123476,28.786808
+2023-04-07 00:00:07,5,5 10000 809 -1 5  ,./perfexp--upp-upp--stack-insfirst-remelem,574390000,5.003850,8.711590
+2023-04-07 00:00:12,1,5 1000 9051 -1 1  ,./perfexp--lq-tailq--stack-inslast-remelem,678825000,5.004920,7.372916
+2023-04-07 00:00:17,3,5 100000 71 -1 3  ,./perfexp--lq-tailq--queue-insfirst-inselem,788100000,5.031101,6.383836
+2023-04-07 00:00:22,4,5 1000 9051 -1 4  ,./perfexp--upp-upp--stack-inslast-allhead,334887000,5.030583,15.021733
+2023-04-07 00:00:27,3,5 1000 9051 -1 3  ,./perfexp--lq-tailq--queue-insfirst-inselem,298683000,5.139339,17.206667
+2023-04-07 00:00:32,3,5 10000 809 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,485400000,5.084587,10.475045
+2023-04-07 00:00:37,1,5 10000 809 -1 1  ,./perfexp--lq-tailq--queue-inslast-remelem,590570000,5.043516,8.540082
+2023-04-07 00:00:42,3,5 1000000 7 -1 3  ,./perfexp--cpp-stlref--queue-insfirst-allhead,231000000,5.119258,22.161290
+2023-04-07 00:00:47,2,5 1000 9051 -1 2  ,./perfexp--upp-upp--stack-insfirst-remelem,461601000,5.024322,10.884556
+2023-04-07 00:00:52,3,5 10000 809 -1 3  ,./perfexp--lq-tailq--queue-insfirst-allhead,461130000,5.076500,11.008826
+2023-04-07 00:00:57,1,5 1000000 7 -1 1  ,./perfexp--upp-upp--queue-insfirst-inselem,588000000,5.001611,8.506141
+2023-04-07 00:01:02,1,5 10000 809 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-inselem,169890000,5.145494,30.287209
+2023-04-07 00:01:07,3,5 1000000 7 -1 3  ,./perfexp--cfa-cfa--stack-inslast-allhead,672000000,5.044544,7.506762
+2023-04-07 00:01:12,5,5 1000 9051 -1 5  ,./perfexp--lq-tailq--stack-insfirst-remelem,534009000,5.004349,9.371282
+2023-04-07 00:01:17,4,5 1000000 7 -1 4  ,./perfexp--lq-tailq--stack-inslast-inselem,987000000,5.025173,5.091361
+2023-04-07 00:01:23,2,5 10000 809 -1 2  ,./perfexp--cpp-stlref--stack-inslast-remelem,169890000,5.236716,30.824157
+2023-04-07 00:01:28,1,5 1000 9051 -1 1  ,./perfexp--cfa-cfa--queue-insfirst-allhead,334887000,5.055747,15.096874
+2023-04-07 00:01:33,2,5 1000000 7 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,924000000,5.034723,5.448834
+2023-04-07 00:01:38,2,5 100 72421 -1 2  ,./perfexp--lq-tailq--queue-insfirst-remelem,296926100,5.111804,17.215745
+2023-04-07 00:01:43,1,5 100 72421 -1 1  ,./perfexp--cfa-cfa--stack-inslast-remelem,325894500,5.092882,15.627395
+2023-04-07 00:01:48,2,5 10000 809 -1 2  ,./perfexp--lq-tailq--stack-inslast-inselem,493490000,5.012330,10.156903
+2023-04-07 00:01:53,1,5 100000 71 -1 1  ,./perfexp--upp-upp--queue-insfirst-allhead,660300000,5.052296,7.651516
+2023-04-07 00:01:58,3,5 10000 809 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-inselem,169890000,5.023551,29.569433
+2023-04-07 00:02:03,3,5 1000 9051 -1 3  ,./perfexp--cpp-stlref--stack-inslast-inselem,162918000,5.065419,31.091831
+2023-04-07 00:02:08,1,5 100 72421 -1 1  ,./perfexp--cpp-stlref--stack-inslast-inselem,159326200,5.065417,31.792743
+2023-04-07 00:02:13,4,5 100000 71 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-inselem,610600000,5.045429,8.263067
+2023-04-07 00:02:18,3,5 100 72421 -1 3  ,./perfexp--cpp-stlref--queue-insfirst-remelem,159326200,5.086272,31.923638
+2023-04-07 00:02:24,1,5 100000 71 -1 1  ,./perfexp--upp-upp--queue-insfirst-remelem,773900000,5.011786,6.476012
+2023-04-07 00:02:29,1,5 10000 809 -1 1  ,./perfexp--cfa-cfa--queue-inslast-remelem,695740000,5.035083,7.237018
+2023-04-07 00:02:34,5,5 100000 71 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-inselem,617700000,5.034056,8.149678
+2023-04-07 00:02:39,2,5 1000 9051 -1 2  ,./perfexp--lq-tailq--queue-insfirst-allhead,316785000,5.101400,16.103667
+2023-04-07 00:02:44,4,5 100000 71 -1 4  ,./perfexp--upp-upp--queue-insfirst-allhead,624800000,5.004312,8.009462
+2023-04-07 00:02:49,5,5 10000 809 -1 5  ,./perfexp--lq-tailq--queue-insfirst-inselem,444950000,5.086458,11.431527
+2023-04-07 00:02:54,4,5 1000 9051 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-inselem,343938000,5.095479,14.815109
+2023-04-07 00:02:59,3,5 10000 809 -1 3  ,./perfexp--upp-upp--stack-inslast-allhead,501580000,5.078669,10.125342
+2023-04-07 00:03:04,3,5 1000 9051 -1 3  ,./perfexp--lq-tailq--stack-inslast-allhead,325836000,5.035838,15.455131
+2023-04-07 00:03:09,5,5 1000 9051 -1 5  ,./perfexp--lq-tailq--queue-insfirst-remelem,642621000,5.048161,7.855581
+2023-04-07 00:03:14,5,5 1000 9051 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,343938000,5.068172,14.735714
+2023-04-07 00:03:19,2,5 10000 809 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,509670000,5.010027,9.829943
+2023-04-07 00:03:24,3,5 10000 809 -1 3  ,./perfexp--lq-tailq--queue-insfirst-remelem,711920000,5.004285,7.029280
+2023-04-07 00:03:29,4,5 1000 9051 -1 4  ,./perfexp--cfa-cfa--queue-inslast-inselem,343938000,5.124094,14.898307
+2023-04-07 00:03:35,2,5 100 72421 -1 2  ,./perfexp--cfa-cfa--queue-insfirst-remelem,289684000,5.109375,17.637754
+2023-04-07 00:03:40,1,5 10000 809 -1 1  ,./perfexp--cpp-stlref--queue-inslast-inselem,177980000,5.226474,29.365513
+2023-04-07 00:03:45,2,5 1000000 7 -1 2  ,./perfexp--lq-tailq--stack-inslast-remelem,1421000000,5.024039,3.535566
+2023-04-07 00:03:50,3,5 100 72421 -1 3  ,./perfexp--upp-upp--queue-inslast-allhead,137599900,5.041139,36.636211
+2023-04-07 00:03:55,4,5 100 72421 -1 4  ,./perfexp--upp-upp--stack-inslast-allhead,159326200,5.081520,31.893813
+2023-04-07 00:04:00,4,5 1000000 7 -1 4  ,./perfexp--lq-tailq--stack-insfirst-inselem,581000000,5.046014,8.685050
+2023-04-07 00:04:05,5,5 10000 809 -1 5  ,./perfexp--upp-upp--stack-inslast-allhead,493490000,5.016015,10.164370
+2023-04-07 00:04:10,3,5 1000000 7 -1 3  ,./perfexp--lq-tailq--stack-insfirst-inselem,581000000,5.003459,8.611806
+2023-04-07 00:04:15,1,5 1000000 7 -1 1  ,./perfexp--upp-upp--queue-inslast-inselem,693000000,5.001641,7.217375
+2023-04-07 00:04:20,4,5 100 72421 -1 4  ,./perfexp--cfa-cfa--stack-inslast-allhead,159326200,5.162225,32.400352
+2023-04-07 00:04:25,3,5 100 72421 -1 3  ,./perfexp--cfa-cfa--stack-inslast-remelem,325894500,5.086104,15.606597
+2023-04-07 00:04:31,2,5 1000 9051 -1 2  ,./perfexp--upp-upp--queue-insfirst-inselem,307734000,5.019841,16.312273
+2023-04-07 00:04:36,4,5 10000 809 -1 4  ,./perfexp--cfa-cfa--stack-inslast-allhead,469220000,5.001562,10.659311
+2023-04-07 00:04:41,3,5 100 72421 -1 3  ,./perfexp--lq-tailq--queue-insfirst-inselem,130357800,5.142624,39.450067
+2023-04-07 00:04:46,3,5 100000 71 -1 3  ,./perfexp--cfa-cfa--queue-insfirst-allhead,553800000,5.013626,9.053135
+2023-04-07 00:04:51,1,5 100 72421 -1 1  ,./perfexp--lq-tailq--stack-insfirst-remelem,333136600,5.076545,15.238629
+2023-04-07 00:04:56,5,5 10000 809 -1 5  ,./perfexp--cpp-stlref--stack-inslast-inselem,169890000,5.071793,29.853393
+2023-04-07 00:05:01,3,5 10000 809 -1 3  ,./perfexp--upp-upp--queue-inslast-allhead,501580000,5.064339,10.096772
+2023-04-07 00:05:06,1,5 1000 9051 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-remelem,153867000,5.176563,33.643101
+2023-04-07 00:05:11,5,5 100000 71 -1 5  ,./perfexp--cpp-stlref--queue-insfirst-allhead,184600000,5.032819,27.263375
+2023-04-07 00:05:16,3,5 1000000 7 -1 3  ,./perfexp--cpp-stlref--queue-insfirst-remelem,224000000,5.024146,22.429223
+2023-04-07 00:05:21,2,5 1000 9051 -1 2  ,./perfexp--cfa-cfa--queue-inslast-remelem,588315000,5.050261,8.584281
+2023-04-07 00:05:26,5,5 1000000 7 -1 5  ,./perfexp--cfa-cfa--queue-inslast-remelem,980000000,5.025545,5.128107
+2023-04-07 00:05:32,3,5 100 72421 -1 3  ,./perfexp--cpp-stlref--queue-insfirst-inselem,166568300,5.065528,30.411117
+2023-04-07 00:05:37,4,5 100 72421 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-remelem,318652400,5.015438,15.739527
+2023-04-07 00:05:42,4,5 100000 71 -1 4  ,./perfexp--upp-upp--stack-inslast-remelem,823600000,5.033144,6.111151
+2023-04-07 00:05:47,1,5 100000 71 -1 1  ,./perfexp--upp-upp--queue-inslast-allhead,710000000,5.007572,7.052918
+2023-04-07 00:05:52,3,5 100 72421 -1 3  ,./perfexp--upp-upp--queue-insfirst-inselem,130357800,5.098879,39.114491
+2023-04-07 00:05:57,4,5 100 72421 -1 4  ,./perfexp--cpp-stlref--queue-inslast-allhead,166568300,5.181296,31.106135
+2023-04-07 00:06:02,2,5 100 72421 -1 2  ,./perfexp--upp-upp--stack-insfirst-inselem,159326200,5.206496,32.678216
+2023-04-07 00:06:07,4,5 100 72421 -1 4  ,./perfexp--lq-tailq--stack-insfirst-remelem,333136600,5.083054,15.258167
+2023-04-07 00:06:12,3,5 100 72421 -1 3  ,./perfexp--cpp-stlref--queue-inslast-inselem,159326200,5.023020,31.526642
+2023-04-07 00:06:17,5,5 10000 809 -1 5  ,./perfexp--upp-upp--stack-insfirst-inselem,477310000,5.066548,10.614795
+2023-04-07 00:06:23,4,5 10000 809 -1 4  ,./perfexp--upp-upp--queue-inslast-inselem,444950000,5.002215,11.242196
+2023-04-07 00:06:28,5,5 100000 71 -1 5  ,./perfexp--lq-tailq--queue-insfirst-allhead,731300000,5.007529,6.847435
+2023-04-07 00:06:33,5,5 1000 9051 -1 5  ,./perfexp--lq-tailq--stack-insfirst-inselem,316785000,5.004748,15.798564
+2023-04-07 00:06:38,5,5 1000000 7 -1 5  ,./perfexp--upp-upp--stack-inslast-inselem,588000000,5.046407,8.582325
+2023-04-07 00:06:43,3,5 1000000 7 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-remelem,917000000,5.029605,5.484847
+2023-04-07 00:06:48,5,5 1000000 7 -1 5  ,./perfexp--lq-tailq--queue-inslast-inselem,833000000,5.018035,6.024052
+2023-04-07 00:06:53,4,5 10000 809 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,525850000,5.070215,9.641942
+2023-04-07 00:06:58,5,5 100000 71 -1 5  ,./perfexp--upp-upp--stack-insfirst-remelem,731300000,5.028043,6.875486
+2023-04-07 00:07:03,5,5 10000 809 -1 5  ,./perfexp--upp-upp--queue-inslast-remelem,614840000,5.028645,8.178786
+2023-04-07 00:07:08,3,5 10000 809 -1 3  ,./perfexp--cfa-cfa--stack-inslast-remelem,720010000,5.048400,7.011569
+2023-04-07 00:07:13,1,5 1000000 7 -1 1  ,./perfexp--cpp-stlref--stack-inslast-remelem,224000000,5.107446,22.801098
+2023-04-07 00:07:18,4,5 1000000 7 -1 4  ,./perfexp--lq-tailq--queue-inslast-allhead,959000000,5.009608,5.223783
+2023-04-07 00:07:23,5,5 100000 71 -1 5  ,./perfexp--cpp-stlref--queue-insfirst-remelem,184600000,5.136296,27.823922
+2023-04-07 00:07:28,2,5 10000 809 -1 2  ,./perfexp--cfa-cfa--queue-inslast-remelem,695740000,5.019980,7.215310
+2023-04-07 00:07:33,4,5 10000 809 -1 4  ,./perfexp--upp-upp--queue-inslast-allhead,493490000,5.031048,10.194833
+2023-04-07 00:07:38,3,5 1000 9051 -1 3  ,./perfexp--upp-upp--queue-insfirst-remelem,534009000,5.044507,9.446483
+2023-04-07 00:07:43,2,5 1000 9051 -1 2  ,./perfexp--cfa-cfa--stack-inslast-inselem,343938000,5.079265,14.767967
+2023-04-07 00:07:48,3,5 100000 71 -1 3  ,./perfexp--cfa-cfa--queue-inslast-inselem,568000000,5.039315,8.872033
+2023-04-07 00:07:53,1,5 10000 809 -1 1  ,./perfexp--lq-tailq--queue-insfirst-inselem,436860000,5.036864,11.529698
+2023-04-07 00:07:58,2,5 100000 71 -1 2  ,./perfexp--lq-tailq--queue-inslast-inselem,724200000,5.004672,6.910621
+2023-04-07 00:08:03,2,5 100 72421 -1 2  ,./perfexp--lq-tailq--stack-inslast-inselem,159326200,5.152197,32.337412
+2023-04-07 00:08:09,4,5 100 72421 -1 4  ,./perfexp--upp-upp--queue-inslast-allhead,137599900,5.043725,36.655005
+2023-04-07 00:08:14,1,5 1000 9051 -1 1  ,./perfexp--upp-upp--stack-insfirst-remelem,461601000,5.010361,10.854311
+2023-04-07 00:08:19,4,5 10000 809 -1 4  ,./perfexp--cfa-cfa--queue-insfirst-allhead,444950000,5.008312,11.255898
+2023-04-07 00:08:24,5,5 100000 71 -1 5  ,./perfexp--upp-upp--queue-insfirst-allhead,646100000,5.052912,7.820635
+2023-04-07 00:08:29,3,5 1000000 7 -1 3  ,./perfexp--upp-upp--queue-inslast-inselem,693000000,5.024033,7.249687
+2023-04-07 00:08:34,5,5 1000 9051 -1 5  ,./perfexp--cpp-stlref--queue-inslast-inselem,171969000,5.113559,29.735353
+2023-04-07 00:08:39,1,5 1000000 7 -1 1  ,./perfexp--cpp-stlref--queue-inslast-remelem,224000000,5.136808,22.932179
+2023-04-07 00:08:44,2,5 1000000 7 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,224000000,5.087099,22.710263
+2023-04-07 00:08:49,4,5 1000000 7 -1 4  ,./perfexp--upp-upp--queue-inslast-inselem,693000000,5.001977,7.217860
+2023-04-07 00:08:54,3,5 1000 9051 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,325836000,5.086269,15.609905
+2023-04-07 00:08:59,2,5 100 72421 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-remelem,152084100,5.070523,33.340257
+2023-04-07 00:09:04,4,5 1000 9051 -1 4  ,./perfexp--upp-upp--stack-insfirst-inselem,307734000,5.001254,16.251873
+2023-04-07 00:09:09,3,5 1000 9051 -1 3  ,./perfexp--cpp-stlref--queue-insfirst-inselem,181020000,5.244969,28.974528
+2023-04-07 00:09:15,3,5 100 72421 -1 3  ,./perfexp--upp-upp--stack-inslast-allhead,159326200,5.076574,31.862770
+2023-04-07 00:09:20,2,5 100000 71 -1 2  ,./perfexp--cfa-cfa--queue-insfirst-allhead,560900000,5.015707,8.942248
+2023-04-07 00:09:25,1,5 100000 71 -1 1  ,./perfexp--upp-upp--stack-inslast-remelem,937200000,5.038076,5.375668
+2023-04-07 00:09:30,3,5 10000 809 -1 3  ,./perfexp--cpp-stlref--queue-insfirst-inselem,177980000,5.087129,28.582588
+2023-04-07 00:09:35,4,5 10000 809 -1 4  ,./perfexp--lq-list--stack-insfirst-remelem,590570000,5.057216,8.563280
+2023-04-07 00:09:40,4,5 100 72421 -1 4  ,./perfexp--lq-tailq--stack-inslast-inselem,159326200,5.148371,32.313399
+2023-04-07 00:09:45,1,5 1000 9051 -1 1  ,./perfexp--upp-upp--stack-insfirst-inselem,307734000,5.017681,16.305254
+2023-04-07 00:09:50,1,5 10000 809 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-remelem,703830000,5.001011,7.105425
+2023-04-07 00:09:55,5,5 100 72421 -1 5  ,./perfexp--upp-upp--stack-inslast-inselem,159326200,5.146824,32.303689
+2023-04-07 00:10:00,4,5 100000 71 -1 4  ,./perfexp--lq-list--stack-insfirst-inselem,560900000,5.037575,8.981236
+2023-04-07 00:10:05,3,5 100 72421 -1 3  ,./perfexp--upp-upp--stack-insfirst-inselem,159326200,5.206990,32.681317
+2023-04-07 00:10:11,3,5 10000 809 -1 3  ,./perfexp--cpp-stlref--stack-inslast-inselem,177980000,5.212465,29.286802
+2023-04-07 00:10:16,4,5 1000000 7 -1 4  ,./perfexp--cfa-cfa--queue-inslast-remelem,980000000,5.014558,5.116896
+2023-04-07 00:10:21,5,5 1000 9051 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-inselem,343938000,5.094368,14.811879
+2023-04-07 00:10:26,3,5 100000 71 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-inselem,610600000,5.038606,8.251893
+2023-04-07 00:10:31,3,5 100000 71 -1 3  ,./perfexp--upp-upp--stack-insfirst-remelem,738400000,5.012787,6.788715
+2023-04-07 00:10:36,3,5 10000 809 -1 3  ,./perfexp--upp-upp--stack-inslast-remelem,679560000,5.029846,7.401622
+2023-04-07 00:10:41,2,5 10000 809 -1 2  ,./perfexp--upp-upp--queue-inslast-inselem,453040000,5.073771,11.199389
+2023-04-07 00:10:46,2,5 1000000 7 -1 2  ,./perfexp--lq-list--stack-insfirst-remelem,798000000,5.015579,6.285187
+2023-04-07 00:10:51,3,5 10000 809 -1 3  ,./perfexp--lq-tailq--stack-inslast-inselem,493490000,5.060374,10.254258
+2023-04-07 00:10:56,1,5 100000 71 -1 1  ,./perfexp--cfa-cfa--queue-inslast-remelem,766800000,5.015732,6.541122
+2023-04-07 00:11:01,1,5 10000 809 -1 1  ,./perfexp--cfa-cfa--queue-inslast-inselem,453040000,5.070851,11.192943
+2023-04-07 00:11:06,2,5 10000 809 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,509670000,5.009743,9.829386
+2023-04-07 00:11:11,2,5 100000 71 -1 2  ,./perfexp--upp-upp--queue-inslast-inselem,610600000,5.024440,8.228693
+2023-04-07 00:11:16,2,5 100000 71 -1 2  ,./perfexp--lq-tailq--queue-inslast-allhead,759700000,5.040553,6.634926
+2023-04-07 00:11:21,1,5 100 72421 -1 1  ,./perfexp--cpp-stlref--stack-inslast-remelem,159326200,5.193180,32.594639
+2023-04-07 00:11:27,5,5 1000 9051 -1 5  ,./perfexp--cfa-cfa--queue-inslast-allhead,343938000,5.052484,14.690101
+2023-04-07 00:11:32,1,5 100000 71 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,788100000,5.016808,6.365700
+2023-04-07 00:11:37,2,5 100000 71 -1 2  ,./perfexp--upp-upp--queue-insfirst-allhead,660300000,5.045791,7.641664
+2023-04-07 00:11:42,4,5 100 72421 -1 4  ,./perfexp--upp-upp--stack-inslast-inselem,159326200,5.146330,32.300588
+2023-04-07 00:11:47,3,5 10000 809 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,509670000,5.049794,9.907968
+2023-04-07 00:11:52,1,5 100 72421 -1 1  ,./perfexp--cpp-stlref--queue-insfirst-inselem,166568300,5.161840,30.989330
+2023-04-07 00:11:57,4,5 100 72421 -1 4  ,./perfexp--lq-tailq--queue-insfirst-allhead,130357800,5.062710,38.837032
+2023-04-07 00:12:02,4,5 100 72421 -1 4  ,./perfexp--cpp-stlref--queue-inslast-inselem,159326200,5.089807,31.945826
+2023-04-07 00:12:08,5,5 100 72421 -1 5  ,./perfexp--cfa-cfa--queue-insfirst-remelem,282441900,5.058237,17.908947
+2023-04-07 00:12:13,1,5 1000000 7 -1 1  ,./perfexp--cpp-stlref--queue-insfirst-remelem,224000000,5.036237,22.483201
+2023-04-07 00:12:18,2,5 100000 71 -1 2  ,./perfexp--cpp-stlref--stack-inslast-allhead,177500000,5.014610,28.251324
+2023-04-07 00:12:23,1,5 10000 809 -1 1  ,./perfexp--upp-upp--queue-insfirst-remelem,647200000,5.039386,7.786443
+2023-04-07 00:12:28,2,5 1000 9051 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,343938000,5.069521,14.739636
+2023-04-07 00:12:33,2,5 100 72421 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,159326200,5.100854,32.015161
+2023-04-07 00:12:38,5,5 100 72421 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,166568300,5.125007,30.768201
+2023-04-07 00:12:43,4,5 10000 809 -1 4  ,./perfexp--cpp-stlref--queue-insfirst-allhead,177980000,5.117398,28.752658
+2023-04-07 00:12:48,5,5 10000 809 -1 5  ,./perfexp--lq-tailq--queue-inslast-remelem,590570000,5.052605,8.555472
+2023-04-07 00:12:53,4,5 1000 9051 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,343938000,5.025513,14.611683
+2023-04-07 00:12:58,3,5 10000 809 -1 3  ,./perfexp--cpp-stlref--queue-inslast-allhead,177980000,5.199746,29.215339
+2023-04-07 00:13:04,1,5 10000 809 -1 1  ,./perfexp--upp-upp--stack-inslast-remelem,679560000,5.058526,7.443825
+2023-04-07 00:13:09,2,5 100000 71 -1 2  ,./perfexp--upp-upp--queue-insfirst-remelem,710000000,5.003660,7.047408
+2023-04-07 00:13:14,2,5 100000 71 -1 2  ,./perfexp--upp-upp--queue-insfirst-inselem,560900000,5.048259,9.000283
+2023-04-07 00:13:19,3,5 1000000 7 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,896000000,5.014332,5.596353
+2023-04-07 00:13:24,1,5 100000 71 -1 1  ,./perfexp--cpp-stlref--queue-inslast-allhead,184600000,5.190548,28.117811
+2023-04-07 00:13:29,3,5 100 72421 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-remelem,325894500,5.111016,15.683039
+2023-04-07 00:13:34,5,5 1000000 7 -1 5  ,./perfexp--upp-upp--stack-inslast-allhead,763000000,5.017561,6.576096
+2023-04-07 00:13:39,1,5 1000000 7 -1 1  ,./perfexp--lq-tailq--queue-inslast-inselem,833000000,5.019453,6.025754
+2023-04-07 00:13:44,5,5 10000 809 -1 5  ,./perfexp--lq-tailq--stack-insfirst-remelem,590570000,5.047563,8.546934
+2023-04-07 00:13:49,4,5 10000 809 -1 4  ,./perfexp--lq-tailq--queue-insfirst-inselem,436860000,5.034155,11.523497
+2023-04-07 00:13:54,4,5 1000 9051 -1 4  ,./perfexp--upp-upp--stack-inslast-remelem,570213000,5.051648,8.859230
+2023-04-07 00:13:59,1,5 100000 71 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,610600000,5.015572,8.214170
+2023-04-07 00:14:04,2,5 1000000 7 -1 2  ,./perfexp--lq-tailq--queue-insfirst-allhead,1022000000,5.030284,4.922000
+2023-04-07 00:14:09,3,5 1000000 7 -1 3  ,./perfexp--cfa-cfa--stack-inslast-remelem,966000000,5.018343,5.194972
+2023-04-07 00:14:14,2,5 1000000 7 -1 2  ,./perfexp--lq-tailq--stack-insfirst-remelem,784000000,5.042359,6.431580
+2023-04-07 00:14:19,5,5 100000 71 -1 5  ,./perfexp--cpp-stlref--stack-inslast-allhead,184600000,5.173540,28.025677
+2023-04-07 00:14:25,3,5 100000 71 -1 3  ,./perfexp--upp-upp--stack-inslast-inselem,553800000,5.046826,9.113084
+2023-04-07 00:14:30,1,5 10000 809 -1 1  ,./perfexp--upp-upp--stack-inslast-allhead,493490000,5.025143,10.182867
+2023-04-07 00:14:35,4,5 100000 71 -1 4  ,./perfexp--lq-list--stack-insfirst-remelem,702900000,5.050739,7.185573
+2023-04-07 00:14:40,2,5 1000 9051 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,162918000,5.172527,31.749267
+2023-04-07 00:14:45,4,5 100 72421 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-inselem,159326200,5.130366,32.200391
+2023-04-07 00:14:50,2,5 100000 71 -1 2  ,./perfexp--cfa-cfa--queue-insfirst-remelem,830700000,5.005727,6.025914
+2023-04-07 00:14:55,3,5 100 72421 -1 3  ,./perfexp--lq-tailq--stack-inslast-allhead,159326200,5.105089,32.041742
+2023-04-07 00:15:00,5,5 1000000 7 -1 5  ,./perfexp--lq-tailq--stack-insfirst-inselem,581000000,5.027483,8.653155
+2023-04-07 00:15:05,5,5 100 72421 -1 5  ,./perfexp--upp-upp--stack-inslast-allhead,159326200,5.079283,31.879772
+2023-04-07 00:15:10,5,5 10000 809 -1 5  ,./perfexp--cpp-stlref--stack-inslast-remelem,169890000,5.225200,30.756372
+2023-04-07 00:15:16,3,5 100 72421 -1 3  ,./perfexp--lq-tailq--stack-inslast-inselem,159326200,5.152960,32.342201
+2023-04-07 00:15:21,3,5 1000000 7 -1 3  ,./perfexp--lq-tailq--queue-inslast-remelem,777000000,5.023512,6.465266
+2023-04-07 00:15:26,5,5 1000000 7 -1 5  ,./perfexp--upp-upp--queue-inslast-inselem,693000000,5.042654,7.276557
+2023-04-07 00:15:31,1,5 10000 809 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,169890000,5.097853,30.006787
+2023-04-07 00:15:36,2,5 100 72421 -1 2  ,./perfexp--lq-tailq--queue-inslast-remelem,311410300,5.100699,16.379352
+2023-04-07 00:15:41,5,5 100 72421 -1 5  ,./perfexp--cfa-cfa--queue-inslast-inselem,137599900,5.246073,38.125558
+2023-04-07 00:15:46,2,5 1000 9051 -1 2  ,./perfexp--upp-upp--stack-inslast-inselem,325836000,5.127345,15.735968
+2023-04-07 00:15:52,4,5 1000 9051 -1 4  ,./perfexp--lq-tailq--stack-inslast-allhead,325836000,5.027188,15.428584
+2023-04-07 00:15:57,3,5 1000000 7 -1 3  ,./perfexp--cpp-stlref--queue-inslast-inselem,224000000,5.015171,22.389156
+2023-04-07 00:16:02,4,5 10000 809 -1 4  ,./perfexp--lq-tailq--stack-inslast-inselem,493490000,5.011236,10.154686
+2023-04-07 00:16:07,4,5 100000 71 -1 4  ,./perfexp--cfa-cfa--queue-insfirst-inselem,546700000,5.018107,9.178904
+2023-04-07 00:16:12,1,5 1000000 7 -1 1  ,./perfexp--upp-upp--queue-inslast-allhead,882000000,5.002161,5.671384
+2023-04-07 00:16:17,4,5 10000 809 -1 4  ,./perfexp--lq-tailq--stack-inslast-remelem,792820000,5.043780,6.361822
+2023-04-07 00:16:22,1,5 100 72421 -1 1  ,./perfexp--upp-upp--stack-inslast-remelem,318652400,5.040033,15.816711
+2023-04-07 00:16:27,2,5 10000 809 -1 2  ,./perfexp--lq-tailq--queue-insfirst-inselem,388320000,5.085010,13.094896
+2023-04-07 00:16:32,3,5 100 72421 -1 3  ,./perfexp--lq-list--stack-insfirst-remelem,333136600,5.078881,15.245641
+2023-04-07 00:16:37,4,5 1000000 7 -1 4  ,./perfexp--upp-upp--queue-inslast-allhead,868000000,5.019333,5.782642
+2023-04-07 00:16:42,4,5 100000 71 -1 4  ,./perfexp--cpp-stlref--queue-inslast-allhead,177500000,5.028223,28.328017
+2023-04-07 00:16:47,4,5 100000 71 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,631900000,5.013989,7.934782
+2023-04-07 00:16:52,5,5 1000000 7 -1 5  ,./perfexp--cpp-stlref--queue-inslast-allhead,224000000,5.103798,22.784813
+2023-04-07 00:16:57,3,5 100 72421 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,166568300,5.053284,30.337609
+2023-04-07 00:17:02,3,5 10000 809 -1 3  ,./perfexp--lq-tailq--stack-insfirst-inselem,493490000,5.046497,10.226138
+2023-04-07 00:17:07,4,5 1000 9051 -1 4  ,./perfexp--upp-upp--queue-inslast-allhead,334887000,5.070579,15.141164
+2023-04-07 00:17:12,3,5 1000 9051 -1 3  ,./perfexp--lq-tailq--queue-inslast-inselem,352989000,5.106015,14.465082
+2023-04-07 00:17:18,1,5 1000000 7 -1 1  ,./perfexp--cfa-cfa--stack-inslast-allhead,672000000,5.053260,7.519732
+2023-04-07 00:17:23,1,5 100000 71 -1 1  ,./perfexp--cpp-stlref--stack-inslast-inselem,184600000,5.086013,27.551533
+2023-04-07 00:17:28,3,5 100000 71 -1 3  ,./perfexp--cpp-stlref--queue-inslast-inselem,177500000,5.041333,28.401876
+2023-04-07 00:17:33,3,5 100000 71 -1 3  ,./perfexp--lq-tailq--queue-insfirst-remelem,944300000,5.027667,5.324226
+2023-04-07 00:17:38,1,5 10000 809 -1 1  ,./perfexp--cfa-cfa--queue-insfirst-remelem,695740000,5.024660,7.222037
+2023-04-07 00:17:43,3,5 100 72421 -1 3  ,./perfexp--lq-tailq--queue-insfirst-allhead,130357800,5.060227,38.817984
+2023-04-07 00:17:48,2,5 10000 809 -1 2  ,./perfexp--cfa-cfa--queue-insfirst-allhead,453040000,5.060348,11.169760
+2023-04-07 00:17:53,1,5 100000 71 -1 1  ,./perfexp--lq-tailq--stack-inslast-remelem,1263800000,5.002587,3.958369
+2023-04-07 00:17:58,3,5 10000 809 -1 3  ,./perfexp--cpp-stlref--queue-inslast-remelem,169890000,5.032008,29.619212
+2023-04-07 00:18:03,3,5 10000 809 -1 3  ,./perfexp--cfa-cfa--stack-inslast-inselem,469220000,5.038856,10.738792
+2023-04-07 00:18:08,1,5 100000 71 -1 1  ,./perfexp--cpp-stlref--stack-inslast-allhead,184600000,5.132353,27.802562
+2023-04-07 00:18:13,3,5 10000 809 -1 3  ,./perfexp--lq-tailq--queue-insfirst-inselem,388320000,5.061103,13.033331
+2023-04-07 00:18:18,4,5 10000 809 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-inselem,169890000,5.089740,29.959032
+2023-04-07 00:18:23,2,5 100 72421 -1 2  ,./perfexp--upp-upp--queue-insfirst-allhead,130357800,5.096965,39.099808
+2023-04-07 00:18:29,1,5 1000 9051 -1 1  ,./perfexp--cpp-stlref--queue-inslast-inselem,171969000,5.103011,29.674017
+2023-04-07 00:18:34,3,5 1000000 7 -1 3  ,./perfexp--cfa-cfa--queue-insfirst-inselem,658000000,5.036277,7.653916
+2023-04-07 00:18:39,4,5 10000 809 -1 4  ,./perfexp--cpp-stlref--stack-inslast-inselem,177980000,5.212807,29.288723
+2023-04-07 00:18:44,4,5 10000 809 -1 4  ,./perfexp--cfa-cfa--stack-inslast-inselem,477310000,5.072814,10.627923
+2023-04-07 00:18:49,4,5 100 72421 -1 4  ,./perfexp--lq-tailq--queue-inslast-remelem,311410300,5.096826,16.366915
+2023-04-07 00:18:54,4,5 10000 809 -1 4  ,./perfexp--cpp-stlref--stack-inslast-allhead,169890000,5.016611,29.528583
+2023-04-07 00:18:59,4,5 100000 71 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-remelem,937200000,5.001450,5.336588
+2023-04-07 00:19:04,4,5 1000000 7 -1 4  ,./perfexp--upp-upp--stack-inslast-inselem,588000000,5.027147,8.549570
+2023-04-07 00:19:09,2,5 100000 71 -1 2  ,./perfexp--cpp-stlref--stack-inslast-inselem,184600000,5.170569,28.009583
+2023-04-07 00:19:14,4,5 1000 9051 -1 4  ,./perfexp--cpp-stlref--queue-inslast-allhead,181020000,5.255817,29.034455
+2023-04-07 00:19:20,2,5 100000 71 -1 2  ,./perfexp--cfa-cfa--stack-inslast-allhead,603500000,5.004894,8.293114
+2023-04-07 00:19:25,4,5 10000 809 -1 4  ,./perfexp--upp-upp--stack-inslast-allhead,493490000,5.060646,10.254810
+2023-04-07 00:19:30,4,5 1000000 7 -1 4  ,./perfexp--upp-upp--stack-insfirst-remelem,609000000,5.021341,8.245223
+2023-04-07 00:19:35,2,5 1000 9051 -1 2  ,./perfexp--cfa-cfa--queue-inslast-inselem,334887000,5.004467,14.943748
+2023-04-07 00:19:40,3,5 10000 809 -1 3  ,./perfexp--cfa-cfa--queue-insfirst-remelem,687650000,5.004454,7.277618
+2023-04-07 00:19:45,1,5 100 72421 -1 1  ,./perfexp--cfa-cfa--queue-insfirst-remelem,289684000,5.114885,17.656774
+2023-04-07 00:19:50,2,5 10000 809 -1 2  ,./perfexp--lq-tailq--queue-inslast-inselem,485400000,5.081049,10.467756
+2023-04-07 00:19:55,5,5 100 72421 -1 5  ,./perfexp--upp-upp--stack-inslast-remelem,318652400,5.038741,15.812657
+2023-04-07 00:20:00,1,5 1000 9051 -1 1  ,./perfexp--cfa-cfa--queue-insfirst-remelem,588315000,5.013924,8.522516
+2023-04-07 00:20:05,5,5 1000000 7 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,889000000,5.011883,5.637664
+2023-04-07 00:20:10,1,5 10000 809 -1 1  ,./perfexp--upp-upp--stack-inslast-inselem,444950000,5.067489,11.388895
+2023-04-07 00:20:15,3,5 100 72421 -1 3  ,./perfexp--cpp-stlref--stack-inslast-allhead,159326200,5.066920,31.802177
+2023-04-07 00:20:20,3,5 100000 71 -1 3  ,./perfexp--cpp-stlref--queue-inslast-allhead,177500000,5.042851,28.410428
+2023-04-07 00:20:25,1,5 100 72421 -1 1  ,./perfexp--upp-upp--queue-inslast-allhead,137599900,5.041518,36.638966
+2023-04-07 00:20:30,1,5 1000 9051 -1 1  ,./perfexp--lq-tailq--queue-inslast-remelem,534009000,5.035769,9.430120
+2023-04-07 00:20:35,5,5 10000 809 -1 5  ,./perfexp--cpp-stlref--queue-inslast-allhead,169890000,5.014708,29.517382
+2023-04-07 00:20:40,2,5 10000 809 -1 2  ,./perfexp--cpp-stlref--queue-inslast-remelem,169890000,5.074810,29.871152
+2023-04-07 00:20:46,5,5 100 72421 -1 5  ,./perfexp--lq-tailq--queue-inslast-inselem,144842000,5.151741,35.568005
+2023-04-07 00:20:51,3,5 10000 809 -1 3  ,./perfexp--upp-upp--queue-inslast-remelem,606750000,5.015496,8.266166
+2023-04-07 00:20:56,3,5 1000 9051 -1 3  ,./perfexp--upp-upp--queue-inslast-allhead,334887000,5.048050,15.073891
+2023-04-07 00:21:01,4,5 1000000 7 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,665000000,5.000859,7.520089
+2023-04-07 00:21:06,2,5 1000 9051 -1 2  ,./perfexp--upp-upp--stack-insfirst-inselem,316785000,5.145817,16.243878
+2023-04-07 00:21:11,5,5 1000 9051 -1 5  ,./perfexp--upp-upp--queue-insfirst-inselem,307734000,5.028541,16.340544
+2023-04-07 00:21:16,3,5 10000 809 -1 3  ,./perfexp--upp-upp--queue-insfirst-remelem,574390000,5.000948,8.706537
+2023-04-07 00:21:21,3,5 1000000 7 -1 3  ,./perfexp--lq-tailq--queue-insfirst-allhead,1022000000,5.024777,4.916612
+2023-04-07 00:21:26,5,5 10000 809 -1 5  ,./perfexp--upp-upp--queue-inslast-allhead,493490000,5.064331,10.262277
+2023-04-07 00:21:31,1,5 1000000 7 -1 1  ,./perfexp--cpp-stlref--queue-inslast-inselem,224000000,5.122860,22.869911
+2023-04-07 00:21:36,5,5 100000 71 -1 5  ,./perfexp--lq-tailq--queue-inslast-allhead,710000000,5.003407,7.047052
+2023-04-07 00:21:41,4,5 1000000 7 -1 4  ,./perfexp--lq-tailq--stack-inslast-allhead,1078000000,5.014066,4.651267
+2023-04-07 00:21:46,4,5 1000000 7 -1 4  ,./perfexp--cpp-stlref--stack-inslast-allhead,224000000,5.121987,22.866013
+2023-04-07 00:21:51,2,5 10000 809 -1 2  ,./perfexp--lq-tailq--stack-insfirst-remelem,590570000,5.012351,8.487311
+2023-04-07 00:21:56,1,5 100000 71 -1 1  ,./perfexp--cpp-stlref--queue-inslast-remelem,177500000,5.128494,28.892924
+2023-04-07 00:22:02,5,5 100000 71 -1 5  ,./perfexp--cpp-stlref--queue-insfirst-inselem,184600000,5.024489,27.218250
+2023-04-07 00:22:07,2,5 100000 71 -1 2  ,./perfexp--lq-tailq--queue-insfirst-allhead,788100000,5.040492,6.395752
+2023-04-07 00:22:12,2,5 10000 809 -1 2  ,./perfexp--cfa-cfa--queue-inslast-allhead,461130000,5.072015,10.999100
+2023-04-07 00:22:17,5,5 100000 71 -1 5  ,./perfexp--cpp-stlref--queue-inslast-allhead,184600000,5.131083,27.795683
+2023-04-07 00:22:22,2,5 100 72421 -1 2  ,./perfexp--cpp-stlref--queue-insfirst-inselem,166568300,5.142531,30.873407
+2023-04-07 00:22:27,4,5 100 72421 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,166568300,5.044477,30.284736
+2023-04-07 00:22:32,1,5 100 72421 -1 1  ,./perfexp--upp-upp--stack-inslast-inselem,159326200,5.141698,32.271516
+2023-04-07 00:22:37,5,5 1000 9051 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,325836000,5.094147,15.634083
+2023-04-07 00:22:42,2,5 10000 809 -1 2  ,./perfexp--cfa-cfa--stack-inslast-inselem,477310000,5.069685,10.621368
+2023-04-07 00:22:47,5,5 100 72421 -1 5  ,./perfexp--lq-tailq--queue-insfirst-inselem,130357800,5.145580,39.472743
+2023-04-07 00:22:53,4,5 100000 71 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-inselem,184600000,5.108413,27.672876
+2023-04-07 00:22:58,2,5 100 72421 -1 2  ,./perfexp--upp-upp--stack-inslast-remelem,318652400,5.036010,15.804086
+2023-04-07 00:23:03,1,5 10000 809 -1 1  ,./perfexp--lq-tailq--queue-insfirst-allhead,461130000,5.085039,11.027344
+2023-04-07 00:23:08,2,5 100000 71 -1 2  ,./perfexp--cpp-stlref--queue-insfirst-remelem,184600000,5.172400,28.019502
+2023-04-07 00:23:13,2,5 100000 71 -1 2  ,./perfexp--lq-tailq--stack-insfirst-remelem,674500000,5.047846,7.483834
+2023-04-07 00:23:18,2,5 1000000 7 -1 2  ,./perfexp--lq-tailq--queue-insfirst-remelem,1309000000,5.005255,3.823724
+2023-04-07 00:23:23,4,5 1000000 7 -1 4  ,./perfexp--cfa-cfa--queue-inslast-inselem,658000000,5.016826,7.624356
+2023-04-07 00:23:28,4,5 1000 9051 -1 4  ,./perfexp--upp-upp--queue-inslast-remelem,515907000,5.025500,9.741097
+2023-04-07 00:23:33,1,5 1000000 7 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,231000000,5.117156,22.152190
+2023-04-07 00:23:38,4,5 10000 809 -1 4  ,./perfexp--lq-tailq--stack-inslast-allhead,509670000,5.046288,9.901089
+2023-04-07 00:23:43,3,5 100 72421 -1 3  ,./perfexp--lq-tailq--stack-insfirst-inselem,166568300,5.221492,31.347453
+2023-04-07 00:23:49,1,5 100 72421 -1 1  ,./perfexp--lq-tailq--queue-insfirst-remelem,296926100,5.106445,17.197697
+2023-04-07 00:23:54,2,5 100 72421 -1 2  ,./perfexp--lq-tailq--stack-insfirst-remelem,333136600,5.079056,15.246166
+2023-04-07 00:23:59,4,5 100000 71 -1 4  ,./perfexp--cpp-stlref--queue-inslast-inselem,184600000,5.131130,27.795937
+2023-04-07 00:24:04,2,5 100000 71 -1 2  ,./perfexp--lq-tailq--stack-inslast-inselem,880400000,5.012434,5.693360
+2023-04-07 00:24:09,2,5 1000 9051 -1 2  ,./perfexp--upp-upp--queue-inslast-inselem,325836000,5.094942,15.636523
+2023-04-07 00:24:14,1,5 1000 9051 -1 1  ,./perfexp--lq-tailq--queue-inslast-allhead,352989000,5.061654,14.339410
+2023-04-07 00:24:19,5,5 100000 71 -1 5  ,./perfexp--lq-list--stack-insfirst-inselem,731300000,5.012975,6.854882
+2023-04-07 00:24:24,3,5 1000 9051 -1 3  ,./perfexp--upp-upp--queue-insfirst-allhead,325836000,5.139636,15.773690
+2023-04-07 00:24:30,1,5 1000000 7 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,665000000,5.024825,7.556128
+2023-04-07 00:24:35,1,5 1000 9051 -1 1  ,./perfexp--cfa-cfa--stack-inslast-allhead,334887000,5.006794,14.950697
+2023-04-07 00:24:40,3,5 1000 9051 -1 3  ,./perfexp--cfa-cfa--queue-insfirst-allhead,334887000,5.056826,15.100096
+2023-04-07 00:24:45,4,5 1000 9051 -1 4  ,./perfexp--lq-tailq--queue-inslast-allhead,352989000,5.047526,14.299386
+2023-04-07 00:24:50,5,5 1000000 7 -1 5  ,./perfexp--upp-upp--stack-inslast-remelem,903000000,5.002012,5.539327
+2023-04-07 00:24:55,1,5 100000 71 -1 1  ,./perfexp--lq-tailq--queue-insfirst-remelem,894600000,5.017897,5.609096
+2023-04-07 00:25:00,5,5 100000 71 -1 5  ,./perfexp--cfa-cfa--queue-insfirst-inselem,546700000,5.050560,9.238266
+2023-04-07 00:25:05,4,5 1000000 7 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-remelem,231000000,5.084063,22.008931
+2023-04-07 00:25:10,2,5 100 72421 -1 2  ,./perfexp--upp-upp--queue-inslast-inselem,137599900,5.086801,36.968057
+2023-04-07 00:25:15,2,5 10000 809 -1 2  ,./perfexp--lq-tailq--queue-insfirst-remelem,720010000,5.029074,6.984728
+2023-04-07 00:25:20,4,5 1000 9051 -1 4  ,./perfexp--lq-tailq--queue-inslast-remelem,534009000,5.024933,9.409828
+2023-04-07 00:25:25,4,5 100 72421 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,159326200,5.104904,32.040581
+2023-04-07 00:25:30,3,5 10000 809 -1 3  ,./perfexp--upp-upp--queue-inslast-inselem,444950000,5.013109,11.266679
+2023-04-07 00:25:35,3,5 100000 71 -1 3  ,./perfexp--cpp-stlref--stack-inslast-remelem,177500000,5.116110,28.823155
+2023-04-07 00:25:41,2,5 10000 809 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-inselem,477310000,5.017041,10.511075
+2023-04-07 00:25:46,5,5 100 72421 -1 5  ,./perfexp--lq-tailq--queue-insfirst-allhead,130357800,5.060870,38.822917
+2023-04-07 00:25:51,3,5 1000 9051 -1 3  ,./perfexp--upp-upp--stack-insfirst-inselem,307734000,5.017423,16.304416
+2023-04-07 00:25:56,2,5 100 72421 -1 2  ,./perfexp--cfa-cfa--queue-inslast-remelem,289684000,5.096670,17.593895
+2023-04-07 00:26:01,1,5 1000000 7 -1 1  ,./perfexp--lq-tailq--stack-insfirst-inselem,581000000,5.003206,8.611370
+2023-04-07 00:26:06,3,5 100000 71 -1 3  ,./perfexp--cfa-cfa--stack-inslast-remelem,1015300000,5.026273,4.950530
+2023-04-07 00:26:11,3,5 100 72421 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,159326200,5.149416,32.319957
+2023-04-07 00:26:16,4,5 1000 9051 -1 4  ,./perfexp--lq-tailq--stack-inslast-inselem,316785000,5.019917,15.846448
+2023-04-07 00:26:21,4,5 10000 809 -1 4  ,./perfexp--cfa-cfa--queue-inslast-remelem,687650000,5.023642,7.305522
+2023-04-07 00:26:26,4,5 100000 71 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,788100000,5.021043,6.371073
+2023-04-07 00:26:31,3,5 100000 71 -1 3  ,./perfexp--lq-tailq--stack-inslast-remelem,1320600000,5.018016,3.799800
+2023-04-07 00:26:36,3,5 100000 71 -1 3  ,./perfexp--upp-upp--queue-inslast-remelem,667400000,5.007560,7.503087
Index: doc/theses/mike_brooks_MMath/benchmarks/list/results-sizing.csv
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/results-sizing.csv	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/results-sizing.csv	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -0,0 +1,1050 @@
+2023-04-07 09:17:04,4,5 100 51203 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,179210500,5.048625,28.171480
+2023-04-07 09:17:09,5,5 1000 1151 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,440833000,5.004263,11.351834
+2023-04-07 09:17:14,5,5 1 1638431 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,47514499,5.110824,107.563462
+2023-04-07 09:17:20,5,5 100000 13 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,811200000,5.006440,6.171647
+2023-04-07 09:17:25,2,5 10000 809 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,169890000,5.081369,29.909759
+2023-04-07 09:17:30,3,5 1 9268211 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,37072844,5.455016,147.143176
+2023-04-07 09:17:37,4,5 10 409609 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,61441350,5.003666,81.438087
+2023-04-07 09:17:42,3,5 1000 3203 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,361939000,5.012686,13.849533
+2023-04-07 09:17:47,1,5 1000 1601 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,163302000,5.011991,30.691547
+2023-04-07 09:17:52,1,5 100 25601 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,261130200,5.005104,19.167082
+2023-04-07 09:17:57,1,5 1 3276803 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,127795317,5.023938,39.312379
+2023-04-07 09:18:03,2,5 10000 149 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,692850000,5.009041,7.229618
+2023-04-07 09:18:08,5,5 10000 149 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,596000000,5.011383,8.408361
+2023-04-07 09:18:13,2,5 1 9268211 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,37072844,5.451339,147.043993
+2023-04-07 09:18:21,4,5 10000 211 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,179350000,5.000449,27.880953
+2023-04-07 09:18:26,2,5 1 9268211 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,129754954,5.236155,40.354182
+2023-04-07 09:18:33,4,5 10000 809 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,517760000,5.076674,9.805072
+2023-04-07 09:18:38,3,5 1 1158613 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,119337139,5.008257,41.967296
+2023-04-07 09:18:43,5,5 1000 4547 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,354666000,5.026793,14.173315
+2023-04-07 09:18:48,2,5 10 102407 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,154634570,5.006412,32.375762
+2023-04-07 09:18:54,4,5 1 9268211 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,129754954,5.276164,40.662525
+2023-04-07 09:19:01,1,5 1000 1151 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,441984000,5.005296,11.324609
+2023-04-07 09:19:06,4,5 1000 1151 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,450041000,5.006789,11.125184
+2023-04-07 09:19:11,4,5 10000 401 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,509270000,5.003327,9.824508
+2023-04-07 09:19:16,1,5 1000 2267 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,158690000,5.066015,31.923971
+2023-04-07 09:19:21,2,5 10 579263 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,57926300,5.181565,89.450992
+2023-04-07 09:19:26,5,5 1000 1601 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,385841000,5.015242,12.998209
+2023-04-07 09:19:31,1,5 1 1158613 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,48661746,5.001179,102.774344
+2023-04-07 09:19:37,3,5 10000 809 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,485400000,5.082043,10.469804
+2023-04-07 09:19:42,5,5 10000 569 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,489340000,5.027788,10.274631
+2023-04-07 09:19:47,2,5 10 102407 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,147466080,5.016418,34.017436
+2023-04-07 09:19:52,3,5 100000 37 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,839900000,5.014467,5.970314
+2023-04-07 09:19:57,5,5 1 9268211 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,37072844,5.362344,144.643448
+2023-04-07 09:20:04,3,5 10 819229 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,57346030,5.402361,94.206364
+2023-04-07 09:20:10,3,5 1 9268211 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,37072844,5.602697,151.126712
+2023-04-07 09:20:18,5,5 100 36209 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,195528600,5.090764,26.035905
+2023-04-07 09:20:23,2,5 10000 101 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,749420000,5.003401,6.676364
+2023-04-07 09:20:28,1,5 1000 4547 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,331931000,5.011689,15.098587
+2023-04-07 09:20:33,5,5 100 36209 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,162940500,5.077350,31.160761
+2023-04-07 09:20:38,2,5 10000 809 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,517760000,5.075663,9.803119
+2023-04-07 09:20:43,1,5 1 4634111 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,41706999,5.080947,121.824805
+2023-04-07 09:20:49,3,5 100 25601 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,258570100,5.004193,19.353332
+2023-04-07 09:20:54,2,5 10000 283 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,642410000,5.012980,7.803397
+2023-04-07 09:20:59,3,5 10 102407 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,145417940,5.022528,34.538572
+2023-04-07 09:21:04,3,5 1 3276803 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,45875242,5.220037,113.787672
+2023-04-07 09:21:10,4,5 1 3276803 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,45875242,5.219001,113.765089
+2023-04-07 09:21:16,2,5 10000 809 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,485400000,5.050960,10.405768
+2023-04-07 09:21:21,5,5 10 409609 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,61441350,5.000377,81.384556
+2023-04-07 09:21:26,2,5 1 9268211 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,37072844,5.605919,151.213621
+2023-04-07 09:21:34,2,5 10 579263 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,57926300,5.377924,92.840799
+2023-04-07 09:21:39,4,5 1000 1151 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,432776000,5.006829,11.569100
+2023-04-07 09:21:44,5,5 10000 401 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,569420000,5.017691,8.811933
+2023-04-07 09:21:49,3,5 100000 71 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,724200000,5.025328,6.939144
+2023-04-07 09:21:54,3,5 1 2317057 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,48658197,5.233001,107.546135
+2023-04-07 09:22:00,3,5 100 25601 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,245769600,5.008432,20.378566
+2023-04-07 09:22:05,3,5 100 18119 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,302587300,5.023342,16.601298
+2023-04-07 09:22:10,2,5 1 1638431 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,47514499,5.127201,107.908136
+2023-04-07 09:22:15,1,5 1000 9051 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,343938000,5.074921,14.755337
+2023-04-07 09:22:21,3,5 10 819229 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,57346030,5.299851,92.418795
+2023-04-07 09:22:26,2,5 100 36209 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,206391300,5.001043,24.230881
+2023-04-07 09:22:31,4,5 1000 9051 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,153867000,5.002372,32.511013
+2023-04-07 09:22:36,4,5 100 25601 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,248329700,5.013595,20.189269
+2023-04-07 09:22:41,5,5 10000 101 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,742350000,5.000031,6.735409
+2023-04-07 09:22:46,5,5 10 204803 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,77825140,5.020372,64.508358
+2023-04-07 09:22:51,3,5 100000 11 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,871200000,5.000530,5.739819
+2023-04-07 09:22:56,1,5 1 2317057 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,46341140,5.078515,109.589773
+2023-04-07 09:23:02,5,5 100000 13 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,859300000,5.006053,5.825734
+2023-04-07 09:23:07,1,5 1 1638431 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,49152930,5.009290,101.912338
+2023-04-07 09:23:12,5,5 10000 401 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,180450000,5.080560,28.154946
+2023-04-07 09:23:17,4,5 1 1638431 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,47514499,5.127508,107.914597
+2023-04-07 09:23:23,3,5 10 102407 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,155658640,5.002560,32.138017
+2023-04-07 09:23:28,3,5 1000 1151 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,440833000,5.003311,11.349674
+2023-04-07 09:23:33,1,5 10 819229 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,57346030,5.410477,94.347891
+2023-04-07 09:23:38,2,5 10 289637 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,66616510,5.152523,77.346036
+2023-04-07 09:23:43,2,5 10 819229 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,57346030,5.609074,97.811025
+2023-04-07 09:23:49,3,5 100 72421 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,166568300,5.050671,30.321922
+2023-04-07 09:23:54,4,5 100 18119 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,286280200,5.000578,17.467425
+2023-04-07 09:23:59,4,5 1000 6473 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,330123000,5.086901,15.409108
+2023-04-07 09:24:04,4,5 1000 4547 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,331931000,5.006751,15.083710
+2023-04-07 09:24:09,3,5 1 2317057 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,127438135,5.014814,39.350968
+2023-04-07 09:24:15,1,5 1000 2267 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,380856000,5.009023,13.152013
+2023-04-07 09:24:20,3,5 100000 71 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,184600000,5.162743,27.967189
+2023-04-07 09:24:25,4,5 10000 283 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,633920000,5.001630,7.890002
+2023-04-07 09:24:30,5,5 100000 19 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,834100000,5.006990,6.002865
+2023-04-07 09:24:35,2,5 100000 71 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,773900000,5.009113,6.472558
+2023-04-07 09:24:40,4,5 10000 401 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,561400000,5.034299,8.967401
+2023-04-07 09:24:45,4,5 1000 1601 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,395447000,5.009911,12.668982
+2023-04-07 09:24:50,1,5 100000 11 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,810700000,5.002286,6.170329
+2023-04-07 09:24:55,5,5 10000 283 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,178290000,5.002616,28.058870
+2023-04-07 09:25:00,2,5 100 25601 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,250889800,5.012143,19.977468
+2023-04-07 09:25:05,3,5 10000 101 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,618120000,5.001582,8.091604
+2023-04-07 09:25:10,5,5 100 18119 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,300775400,5.005188,16.640949
+2023-04-07 09:25:15,3,5 1000 1601 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,397048000,5.010473,12.619313
+2023-04-07 09:25:20,3,5 10000 211 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,692080000,5.005679,7.232804
+2023-04-07 09:25:25,2,5 10 819229 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,57346030,5.298997,92.403903
+2023-04-07 09:25:31,3,5 1000 9051 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,343938000,5.058876,14.708686
+2023-04-07 09:25:36,4,5 1 6553621 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,39321726,5.462242,138.911552
+2023-04-07 09:25:43,3,5 100 12809 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,338157600,5.008324,14.810621
+2023-04-07 09:25:48,3,5 100000 53 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,800300000,5.003542,6.252083
+2023-04-07 09:25:53,5,5 1 6553621 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,131072420,5.190176,39.597774
+2023-04-07 09:25:59,5,5 10 102407 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,154634570,5.009776,32.397516
+2023-04-07 09:26:05,5,5 100 72421 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,166568300,5.128275,30.787821
+2023-04-07 09:26:10,1,5 10000 569 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,500720000,5.010625,10.006840
+2023-04-07 09:26:15,4,5 10000 101 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,754470000,5.006643,6.635974
+2023-04-07 09:26:20,2,5 10 144817 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,117301770,5.015928,42.760889
+2023-04-07 09:26:25,1,5 1000000 7 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,665000000,5.003369,7.523863
+2023-04-07 09:26:30,1,5 1000 1151 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,169197000,5.025974,29.704865
+2023-04-07 09:26:35,5,5 1 1158613 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,52137585,5.071466,97.270827
+2023-04-07 09:26:40,4,5 1 4634111 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,41706999,5.178750,124.169807
+2023-04-07 09:26:46,3,5 100 72421 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,166568300,5.127112,30.780839
+2023-04-07 09:26:51,5,5 1000 9051 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,343938000,5.025528,14.611727
+2023-04-07 09:26:56,1,5 100 18119 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,166694800,5.037007,30.216941
+2023-04-07 09:27:01,5,5 1 1638431 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,49152930,5.008781,101.901982
+2023-04-07 09:27:07,1,5 100000 13 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,800800000,5.003390,6.247990
+2023-04-07 09:27:12,3,5 100000 19 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,843600000,5.007258,5.935583
+2023-04-07 09:27:17,2,5 10000 149 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,181780000,5.009261,27.556722
+2023-04-07 09:27:22,1,5 10000 211 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,694190000,5.003507,7.207691
+2023-04-07 09:27:27,3,5 1 9268211 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,37072844,5.363783,144.682264
+2023-04-07 09:27:34,3,5 10 102407 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,147466080,5.015432,34.010750
+2023-04-07 09:27:39,4,5 10000 809 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,485400000,5.067667,10.440187
+2023-04-07 09:27:45,3,5 100 25601 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,156166100,5.024177,32.172008
+2023-04-07 09:27:50,5,5 100 18119 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,300775400,5.026238,16.710934
+2023-04-07 09:27:55,2,5 100 12809 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,338157600,5.017159,14.836748
+2023-04-07 09:28:00,2,5 100000 37 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,677100000,5.022880,7.418225
+2023-04-07 09:28:05,5,5 1 3276803 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,127795317,5.109757,39.983914
+2023-04-07 09:28:10,4,5 10000 569 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,540550000,5.045736,9.334448
+2023-04-07 09:28:15,2,5 1000 1601 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,403452000,5.005002,12.405446
+2023-04-07 09:28:21,1,5 100 18119 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,302587300,5.027678,16.615628
+2023-04-07 09:28:26,4,5 100 18119 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,308023000,5.014791,16.280573
+2023-04-07 09:28:31,3,5 10 289637 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,136129390,5.080663,37.322308
+2023-04-07 09:28:36,1,5 1000 1151 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,443135000,5.001267,11.286102
+2023-04-07 09:28:41,3,5 1000 3203 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,345924000,5.027450,14.533395
+2023-04-07 09:28:46,3,5 1000 6473 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,349542000,5.027702,14.383685
+2023-04-07 09:28:51,3,5 1000000 7 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,910000000,5.005138,5.500152
+2023-04-07 09:28:56,4,5 10000 101 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,772650000,5.003929,6.476320
+2023-04-07 09:29:01,2,5 100000 13 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,864500000,5.002411,5.786479
+2023-04-07 09:29:06,1,5 1 1638431 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,49152930,5.007652,101.879013
+2023-04-07 09:29:11,2,5 1 1158613 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,52137585,5.051022,96.878710
+2023-04-07 09:29:17,3,5 10 579263 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,57926300,5.074568,87.603869
+2023-04-07 09:29:22,4,5 1 4634111 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,41706999,5.074290,121.665191
+2023-04-07 09:29:28,5,5 1 2317057 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,46341140,5.074777,109.509110
+2023-04-07 09:29:33,1,5 1000 1601 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,398649000,5.011464,12.571119
+2023-04-07 09:29:38,5,5 100000 53 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,678400000,5.010575,7.385871
+2023-04-07 09:29:43,2,5 10000 101 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,178770000,5.001734,27.978598
+2023-04-07 09:29:48,4,5 100000 11 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,866800000,5.003338,5.772194
+2023-04-07 09:29:53,3,5 1 3276803 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,42598439,5.123008,120.262811
+2023-04-07 09:29:59,4,5 10 289637 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,66616510,5.160238,77.461848
+2023-04-07 09:30:04,1,5 100000 13 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,665600000,5.005949,7.520957
+2023-04-07 09:30:09,1,5 1000000 7 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,231000000,5.148011,22.285762
+2023-04-07 09:30:15,5,5 1000 4547 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,163692000,5.073455,30.993909
+2023-04-07 09:30:20,3,5 1000000 7 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,665000000,5.002480,7.522526
+2023-04-07 09:30:25,2,5 100000 29 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,182700000,5.024854,27.503306
+2023-04-07 09:30:30,2,5 1000 1151 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,446588000,5.011597,11.221970
+2023-04-07 09:30:35,4,5 1000 4547 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,359213000,5.060797,14.088569
+2023-04-07 09:30:40,1,5 10000 149 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,177310000,5.037534,28.410885
+2023-04-07 09:30:45,3,5 10 819229 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,57346030,5.290797,92.260912
+2023-04-07 09:30:50,3,5 1000 4547 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,163692000,5.061204,30.919068
+2023-04-07 09:30:55,2,5 1 1158613 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,52137585,5.055031,96.955603
+2023-04-07 09:31:01,5,5 1000 6473 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,349542000,5.037693,14.412268
+2023-04-07 09:31:06,5,5 10 409609 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,61441350,5.118414,83.305689
+2023-04-07 09:31:11,3,5 100 12809 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,339438500,5.008846,14.756270
+2023-04-07 09:31:16,3,5 10 144817 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,110060920,5.022036,45.629602
+2023-04-07 09:31:21,5,5 10 289637 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,69512880,5.196116,74.750406
+2023-04-07 09:31:26,5,5 1 3276803 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,45875242,5.321110,115.990887
+2023-04-07 09:31:32,3,5 1000 1151 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,452343000,5.011535,11.079059
+2023-04-07 09:31:37,3,5 1 1158613 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,52137585,5.047997,96.820691
+2023-04-07 09:31:42,3,5 100000 11 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,195800000,5.022937,25.653407
+2023-04-07 09:31:47,5,5 10 579263 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,57926300,5.074571,87.603921
+2023-04-07 09:31:53,2,5 1000 1151 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,430474000,5.013255,11.645895
+2023-04-07 09:31:58,5,5 10000 211 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,179350000,5.057893,28.201243
+2023-04-07 09:32:03,4,5 100000 29 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,669900000,5.014899,7.486041
+2023-04-07 09:32:08,4,5 1 2317057 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,44024083,5.097059,115.778879
+2023-04-07 09:32:13,5,5 1000 3203 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,342721000,5.004216,14.601428
+2023-04-07 09:32:18,1,5 100000 19 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,843600000,5.009552,5.938303
+2023-04-07 09:32:23,3,5 100 18119 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,166694800,5.011997,30.066907
+2023-04-07 09:32:28,5,5 100000 71 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,624800000,5.045015,8.074608
+2023-04-07 09:32:34,1,5 1000 3203 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,163353000,5.075846,31.072867
+2023-04-07 09:32:39,5,5 10000 101 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,762550000,5.004829,6.563280
+2023-04-07 09:32:44,4,5 10000 809 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,509670000,5.054060,9.916338
+2023-04-07 09:32:49,4,5 100000 37 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,839900000,5.011379,5.966638
+2023-04-07 09:32:54,2,5 1 1158613 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,121654365,5.042318,41.447900
+2023-04-07 09:32:59,2,5 10000 809 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,517760000,5.059907,9.772688
+2023-04-07 09:33:04,5,5 1000 6473 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,349542000,5.093618,14.572263
+2023-04-07 09:33:09,3,5 100000 53 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,646600000,5.031816,7.781961
+2023-04-07 09:33:14,3,5 100 36209 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,162940500,5.084222,31.202936
+2023-04-07 09:33:19,2,5 10 289637 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,69512880,5.198193,74.780285
+2023-04-07 09:33:25,3,5 1000 9051 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,162918000,5.171006,31.739931
+2023-04-07 09:33:30,3,5 1 2317057 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,46341140,5.069974,109.405466
+2023-04-07 09:33:35,5,5 1 4634111 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,41706999,5.078112,121.756830
+2023-04-07 09:33:41,4,5 100 25601 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,156166100,5.035543,32.244789
+2023-04-07 09:33:46,2,5 1 4634111 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,41706999,5.178771,124.170310
+2023-04-07 09:33:53,5,5 1 4634111 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,41706999,5.176989,124.127583
+2023-04-07 09:33:59,2,5 1000 2267 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,371788000,5.006653,13.466419
+2023-04-07 09:34:04,2,5 1000 9051 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,162918000,5.174871,31.763654
+2023-04-07 09:34:09,1,5 1 1638431 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,47514499,5.131150,107.991247
+2023-04-07 09:34:14,4,5 100 18119 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,166694800,5.035664,30.208885
+2023-04-07 09:34:19,5,5 1000000 7 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,910000000,5.010621,5.506177
+2023-04-07 09:34:24,1,5 100000 53 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,185500000,5.109103,27.542334
+2023-04-07 09:34:30,2,5 10 102407 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,156682710,5.018546,32.029992
+2023-04-07 09:34:35,3,5 100 36209 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,195528600,5.071423,25.936988
+2023-04-07 09:34:40,4,5 10000 149 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,718180000,5.004441,6.968227
+2023-04-07 09:34:45,5,5 10 204803 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,151554220,5.058008,33.374247
+2023-04-07 09:34:50,1,5 100000 37 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,839900000,5.014135,5.969919
+2023-04-07 09:34:55,3,5 100000 13 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,200200000,5.003222,24.991119
+2023-04-07 09:35:00,3,5 1000 1601 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,164903000,5.031976,30.514763
+2023-04-07 09:35:05,3,5 10000 149 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,683910000,5.007571,7.321974
+2023-04-07 09:35:10,5,5 10 819229 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,57346030,5.289508,92.238434
+2023-04-07 09:35:15,1,5 10 579263 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,57926300,5.067903,87.488809
+2023-04-07 09:35:21,5,5 1000 9051 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,343938000,5.067591,14.734025
+2023-04-07 09:35:26,3,5 100000 53 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,816200000,5.006992,6.134516
+2023-04-07 09:35:31,5,5 100 12809 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,336876700,5.010752,14.874142
+2023-04-07 09:35:36,1,5 100000 11 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,665500000,5.002855,7.517438
+2023-04-07 09:35:41,3,5 10 102407 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,154634570,5.004757,32.365059
+2023-04-07 09:35:46,5,5 1000 2267 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,374055000,5.012454,13.400313
+2023-04-07 09:35:51,5,5 1 4634111 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,129755108,5.082164,39.167352
+2023-04-07 09:35:57,5,5 100000 19 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,193800000,5.031826,25.964014
+2023-04-07 09:36:02,5,5 1 9268211 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,37072844,5.609511,151.310512
+2023-04-07 09:36:10,2,5 1000 4547 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,336478000,5.064481,15.051448
+2023-04-07 09:36:15,2,5 100000 13 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,202800000,5.022310,24.764842
+2023-04-07 09:36:20,4,5 10 144817 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,117301770,5.048557,43.039052
+2023-04-07 09:36:25,4,5 1 1158613 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,52137585,5.067907,97.202565
+2023-04-07 09:36:30,2,5 100 25601 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,258570100,5.014467,19.393066
+2023-04-07 09:36:35,4,5 10 409609 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,61441350,5.122865,83.378132
+2023-04-07 09:36:40,5,5 100000 13 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,867100000,5.002631,5.769382
+2023-04-07 09:36:45,4,5 1000 1601 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,163302000,5.029273,30.797375
+2023-04-07 09:36:50,2,5 1000 6473 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,161825000,5.092144,31.466980
+2023-04-07 09:36:55,4,5 100 18119 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,298963500,5.015041,16.774760
+2023-04-07 09:37:00,1,5 100 25601 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,243209500,5.003590,20.573168
+2023-04-07 09:37:06,1,5 1 2317057 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,44024083,5.009169,113.782472
+2023-04-07 09:37:11,1,5 10 409609 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,61441350,5.297462,86.219818
+2023-04-07 09:37:16,1,5 100 36209 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,191907700,5.001946,26.064332
+2023-04-07 09:37:21,5,5 1000 6473 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,323650000,5.001094,15.452167
+2023-04-07 09:37:26,3,5 1000 9051 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,352989000,5.127846,14.526929
+2023-04-07 09:37:32,5,5 100 72421 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,159326200,5.103398,32.031129
+2023-04-07 09:37:37,5,5 10 819229 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,57346030,5.291935,92.280756
+2023-04-07 09:37:42,1,5 10000 809 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,177980000,5.230895,29.390353
+2023-04-07 09:37:47,5,5 10000 283 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,611280000,5.010680,8.197029
+2023-04-07 09:37:52,5,5 1000 1151 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,430474000,5.000556,11.616395
+2023-04-07 09:37:57,4,5 10 102407 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,154634570,5.010480,32.402069
+2023-04-07 09:38:02,1,5 10000 809 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,525850000,5.067747,9.637248
+2023-04-07 09:38:07,5,5 100 25601 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,245769600,5.037023,20.494898
+2023-04-07 09:38:13,2,5 100 25601 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,245769600,5.004331,20.361880
+2023-04-07 09:38:18,5,5 100 12809 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,160112500,5.018944,31.346360
+2023-04-07 09:38:23,5,5 10 579263 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,57926300,5.370957,92.720526
+2023-04-07 09:38:28,5,5 10 289637 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,69512880,5.070523,72.943647
+2023-04-07 09:38:33,5,5 10000 211 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,677310000,5.007551,7.393293
+2023-04-07 09:38:38,4,5 100000 11 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,874500000,5.006112,5.724542
+2023-04-07 09:38:43,4,5 10 579263 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,57926300,5.366032,92.635504
+2023-04-07 09:38:49,1,5 1000000 7 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,917000000,5.031217,5.486605
+2023-04-07 09:38:54,5,5 1 3276803 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,45875242,5.219093,113.767095
+2023-04-07 09:39:00,3,5 10 289637 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,69512880,5.082909,73.121830
+2023-04-07 09:39:05,4,5 10000 149 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,698810000,5.009952,7.169262
+2023-04-07 09:39:10,4,5 1 6553621 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,39321726,5.197282,132.173293
+2023-04-07 09:39:16,4,5 10000 401 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,565410000,5.012525,8.865292
+2023-04-07 09:39:21,5,5 100000 71 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,788100000,5.002814,6.347943
+2023-04-07 09:39:26,4,5 10 204803 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,83969230,5.098252,60.715717
+2023-04-07 09:39:32,2,5 1 6553621 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,39321726,5.457067,138.779946
+2023-04-07 09:39:38,4,5 1 1158613 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,52137585,5.048187,96.824335
+2023-04-07 09:39:44,1,5 1 9268211 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,37072844,5.357970,144.525465
+2023-04-07 09:39:51,2,5 1000 1601 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,390644000,5.010242,12.825596
+2023-04-07 09:39:56,5,5 10000 149 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,724140000,5.002903,6.908751
+2023-04-07 09:40:01,4,5 1000000 7 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,231000000,5.077361,21.979918
+2023-04-07 09:40:06,4,5 10000 149 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,181780000,5.009555,27.558340
+2023-04-07 09:40:11,1,5 10 579263 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,57926300,5.175896,89.353126
+2023-04-07 09:40:17,4,5 10000 283 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,616940000,5.020322,8.137456
+2023-04-07 09:40:22,5,5 100 12809 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,342000300,5.004889,14.634166
+2023-04-07 09:40:27,1,5 100 51203 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,179210500,5.051753,28.188934
+2023-04-07 09:40:32,5,5 1000000 7 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,665000000,5.009576,7.533197
+2023-04-07 09:40:37,5,5 1 1158613 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,125130204,5.032699,40.219698
+2023-04-07 09:40:42,4,5 100000 37 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,673400000,5.003880,7.430769
+2023-04-07 09:40:47,1,5 10 579263 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,57926300,5.073866,87.591750
+2023-04-07 09:40:52,1,5 10000 149 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,698810000,5.004903,7.162037
+2023-04-07 09:40:57,2,5 10 289637 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,139025760,5.045032,36.288469
+2023-04-07 09:41:02,5,5 100000 29 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,846800000,5.014948,5.922234
+2023-04-07 09:41:07,3,5 10000 283 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,628260000,5.007982,7.971193
+2023-04-07 09:41:12,2,5 1000 9051 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,343938000,5.005023,14.552108
+2023-04-07 09:41:17,2,5 10 819229 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,57346030,5.297263,92.373666
+2023-04-07 09:41:23,1,5 100 25601 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,245769600,5.016242,20.410344
+2023-04-07 09:41:28,2,5 10000 211 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,668870000,5.003546,7.480596
+2023-04-07 09:41:33,4,5 1000 2267 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,374055000,5.004247,13.378372
+2023-04-07 09:41:38,5,5 10000 809 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,517760000,5.076154,9.804068
+2023-04-07 09:41:43,3,5 1000 6473 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,330123000,5.088777,15.414791
+2023-04-07 09:41:48,5,5 1 3276803 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,45875242,5.223599,113.865318
+2023-04-07 09:41:54,4,5 1 4634111 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,41706999,5.354376,128.380755
+2023-04-07 09:42:00,5,5 1000 4547 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,354666000,5.045521,14.226120
+2023-04-07 09:42:05,1,5 100000 53 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,673100000,5.003055,7.432855
+2023-04-07 09:42:10,1,5 1000 9051 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,162918000,5.198940,31.911391
+2023-04-07 09:42:15,2,5 10 409609 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,61441350,5.300017,86.261402
+2023-04-07 09:42:21,1,5 10000 101 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,740330000,5.001894,6.756303
+2023-04-07 09:42:26,1,5 1000 3203 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,345924000,5.029049,14.538017
+2023-04-07 09:42:31,2,5 10000 283 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,631090000,5.008317,7.935979
+2023-04-07 09:42:36,5,5 100000 13 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,668200000,5.008850,7.496034
+2023-04-07 09:42:41,2,5 10000 211 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,717400000,5.003420,6.974380
+2023-04-07 09:42:46,5,5 1000 3203 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,365142000,5.024766,13.761129
+2023-04-07 09:42:51,4,5 1 1638431 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,49152930,5.006960,101.864935
+2023-04-07 09:42:56,1,5 100000 29 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,843900000,5.007761,5.934069
+2023-04-07 09:43:01,2,5 100 12809 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,316382300,5.003693,15.815338
+2023-04-07 09:43:06,2,5 10000 101 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,750430000,5.006048,6.670906
+2023-04-07 09:43:11,4,5 1000000 7 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,665000000,5.003294,7.523750
+2023-04-07 09:43:16,2,5 1 2317057 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,48658197,5.238138,107.651708
+2023-04-07 09:43:22,4,5 100 51203 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,179210500,5.140141,28.682142
+2023-04-07 09:43:27,3,5 10 289637 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,69512880,5.198621,74.786442
+2023-04-07 09:43:33,2,5 10 409609 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,131074880,5.052058,38.543297
+2023-04-07 09:43:38,1,5 1000 6473 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,349542000,5.048733,14.443852
+2023-04-07 09:43:43,4,5 100000 13 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,811200000,5.006809,6.172102
+2023-04-07 09:43:48,4,5 1 9268211 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,37072844,5.360664,144.598132
+2023-04-07 09:43:55,5,5 10 289637 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,136129390,5.054552,37.130498
+2023-04-07 09:44:00,5,5 1 1158613 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,50978972,5.048521,99.031440
+2023-04-07 09:44:06,1,5 10 102407 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,155658640,5.003868,32.146420
+2023-04-07 09:44:11,3,5 1 4634111 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,41706999,5.075483,121.693795
+2023-04-07 09:44:17,4,5 10000 149 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,587060000,5.009753,8.533630
+2023-04-07 09:44:22,4,5 10000 283 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,181120000,5.068738,27.985523
+2023-04-07 09:44:27,1,5 10000 149 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,584080000,5.012245,8.581436
+2023-04-07 09:44:32,1,5 10 204803 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,83969230,5.107015,60.820077
+2023-04-07 09:44:37,3,5 100000 53 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,832100000,5.009366,6.020149
+2023-04-07 09:44:42,1,5 1000 2267 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,364987000,5.024582,13.766468
+2023-04-07 09:44:47,2,5 1 3276803 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,45875242,5.218398,113.751945
+2023-04-07 09:44:53,2,5 100000 19 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,666900000,5.013401,7.517470
+2023-04-07 09:44:58,5,5 100000 37 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,799200000,5.004424,6.261792
+2023-04-07 09:45:03,4,5 100000 71 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,631900000,5.016195,7.938273
+2023-04-07 09:45:08,3,5 1 3276803 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,45875242,5.236434,114.145098
+2023-04-07 09:45:14,4,5 100 36209 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,162940500,5.078951,31.170587
+2023-04-07 09:45:19,3,5 100000 71 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,795200000,5.015114,6.306733
+2023-04-07 09:45:24,4,5 1 6553621 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,39321726,5.293279,134.614615
+2023-04-07 09:45:31,1,5 100000 11 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,864600000,5.003455,5.787017
+2023-04-07 09:45:36,3,5 1 6553621 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,39321726,5.198401,132.201750
+2023-04-07 09:45:42,1,5 10000 569 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,540550000,5.047043,9.336866
+2023-04-07 09:45:47,3,5 1 4634111 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,41706999,5.345525,128.168536
+2023-04-07 09:45:54,4,5 1 9268211 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,37072844,5.362751,144.654427
+2023-04-07 09:46:01,2,5 10000 149 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,736060000,5.002210,6.795927
+2023-04-07 09:46:06,5,5 100 25601 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,250889800,5.043473,20.102344
+2023-04-07 09:46:11,4,5 10000 211 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,582360000,5.011894,8.606178
+2023-04-07 09:46:16,2,5 100 51203 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,168969900,5.037736,29.814399
+2023-04-07 09:46:21,5,5 1 1638431 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,49152930,5.108694,103.934679
+2023-04-07 09:46:27,4,5 10000 101 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,636300000,5.002842,7.862395
+2023-04-07 09:46:32,5,5 100000 53 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,842700000,5.020482,5.957615
+2023-04-07 09:46:37,1,5 10000 809 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,485400000,5.069042,10.443020
+2023-04-07 09:46:42,3,5 10000 211 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,177240000,5.029883,28.378938
+2023-04-07 09:46:47,2,5 100000 11 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,876700000,5.005385,5.709348
+2023-04-07 09:46:52,4,5 10 204803 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,77825140,5.030183,64.634423
+2023-04-07 09:46:57,4,5 100 12809 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,340719400,5.008490,14.699750
+2023-04-07 09:47:02,2,5 10 579263 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,127437860,5.031642,39.483102
+2023-04-07 09:47:07,5,5 10000 101 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,181800000,5.020714,27.616689
+2023-04-07 09:47:12,3,5 1 1158613 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,50978972,5.034285,98.752187
+2023-04-07 09:47:18,5,5 1 9268211 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,129754954,5.148500,39.678639
+2023-04-07 09:47:25,2,5 100 72421 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,166568300,5.123029,30.756326
+2023-04-07 09:47:30,3,5 100000 29 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,846800000,5.008078,5.914121
+2023-04-07 09:47:35,3,5 1000 4547 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,354666000,5.000933,14.100402
+2023-04-07 09:47:40,1,5 10 819229 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,57346030,5.286917,92.193252
+2023-04-07 09:47:46,3,5 10 144817 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,117301770,5.056550,43.107193
+2023-04-07 09:47:51,3,5 1 6553621 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,39321726,5.195212,132.120650
+2023-04-07 09:47:57,1,5 1 4634111 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,41706999,5.072826,121.630089
+2023-04-07 09:48:03,1,5 10000 211 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,673090000,5.015598,7.451601
+2023-04-07 09:48:08,3,5 1 6553621 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,131072420,5.222720,39.846064
+2023-04-07 09:48:15,3,5 100000 37 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,799200000,5.003830,6.261049
+2023-04-07 09:48:20,2,5 100 36209 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,191907700,5.000161,26.055031
+2023-04-07 09:48:25,4,5 10 102407 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,153610500,5.027934,32.731708
+2023-04-07 09:48:30,4,5 10 579263 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,57926300,5.070137,87.527375
+2023-04-07 09:48:35,5,5 100 18119 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,164882900,5.004842,30.353918
+2023-04-07 09:48:40,4,5 1 9268211 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,37072844,5.448085,146.956219
+2023-04-07 09:48:48,1,5 100000 29 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,841000000,5.013705,5.961599
+2023-04-07 09:48:53,1,5 1000 1151 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,425870000,5.007990,11.759434
+2023-04-07 09:48:58,2,5 1 9268211 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,37072844,5.369492,144.836258
+2023-04-07 09:49:05,5,5 10000 283 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,645240000,5.006650,7.759361
+2023-04-07 09:49:10,5,5 1 4634111 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,41706999,5.346453,128.190786
+2023-04-07 09:49:17,5,5 10 144817 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,110060920,5.062244,45.994927
+2023-04-07 09:49:22,1,5 1 3276803 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,45875242,5.222921,113.850538
+2023-04-07 09:49:28,2,5 100000 53 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,185500000,5.117409,27.587111
+2023-04-07 09:49:33,2,5 100000 11 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,862400000,5.003361,5.801671
+2023-04-07 09:49:38,4,5 100000 19 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,180500000,5.012228,27.768576
+2023-04-07 09:49:43,1,5 10 144817 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,112957260,5.025433,44.489686
+2023-04-07 09:49:48,5,5 100000 11 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,874500000,5.001729,5.719530
+2023-04-07 09:49:53,5,5 100000 71 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,731300000,5.042114,6.894727
+2023-04-07 09:49:58,3,5 100000 53 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,180200000,5.111337,28.364800
+2023-04-07 09:50:03,5,5 100000 29 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,838100000,5.016830,5.985956
+2023-04-07 09:50:08,4,5 10 102407 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,145417940,5.025903,34.561781
+2023-04-07 09:50:13,2,5 1000 1151 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,168046000,5.003947,29.777246
+2023-04-07 09:50:18,1,5 100000 13 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,864500000,5.003595,5.787848
+2023-04-07 09:50:23,1,5 100000 13 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,195000000,5.008069,25.682405
+2023-04-07 09:50:28,4,5 1000 9051 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,325836000,5.093913,15.633365
+2023-04-07 09:50:33,3,5 10000 149 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,178800000,5.025970,28.109452
+2023-04-07 09:50:38,3,5 10000 101 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,730230000,5.006338,6.855837
+2023-04-07 09:50:43,3,5 1000 6473 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,343069000,5.004156,14.586442
+2023-04-07 09:50:48,3,5 100 18119 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,284468300,5.008843,17.607737
+2023-04-07 09:50:53,4,5 100000 71 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,788100000,5.013948,6.362071
+2023-04-07 09:50:58,3,5 1 2317057 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,48658197,5.226990,107.422599
+2023-04-07 09:51:04,1,5 10000 283 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,625430000,5.001714,7.997240
+2023-04-07 09:51:09,4,5 1000 6473 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,161825000,5.109507,31.574275
+2023-04-07 09:51:14,2,5 100000 29 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,669900000,5.013876,7.484514
+2023-04-07 09:51:19,4,5 10 819229 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,57346030,5.292939,92.298264
+2023-04-07 09:51:25,5,5 10000 283 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,540530000,5.010321,9.269275
+2023-04-07 09:51:30,5,5 100000 13 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,192400000,5.025722,26.121216
+2023-04-07 09:51:35,1,5 1 3276803 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,42598439,5.126412,120.342720
+2023-04-07 09:51:41,1,5 1 1158613 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,125130204,5.041745,40.291991
+2023-04-07 09:51:46,1,5 1000 9051 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,325836000,5.102316,15.659154
+2023-04-07 09:51:51,2,5 100000 19 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,182400000,5.047790,27.674287
+2023-04-07 09:51:56,1,5 10 289637 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,69512880,5.077480,73.043729
+2023-04-07 09:52:01,1,5 1000 4547 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,350119000,5.019561,14.336728
+2023-04-07 09:52:06,3,5 1 1158613 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,49820359,5.113486,102.638482
+2023-04-07 09:52:11,2,5 1000 3203 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,358736000,5.006418,13.955717
+2023-04-07 09:52:16,4,5 100000 37 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,185000000,5.001781,27.036654
+2023-04-07 09:52:21,3,5 100000 13 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,865800000,5.007051,5.783150
+2023-04-07 09:52:27,4,5 1000 3203 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,365142000,5.018122,13.742933
+2023-04-07 09:52:32,4,5 10 289637 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,69512880,5.066742,72.889254
+2023-04-07 09:52:37,2,5 1000000 7 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,910000000,5.004487,5.499436
+2023-04-07 09:52:42,2,5 100 12809 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,338157600,5.014115,14.827746
+2023-04-07 09:52:47,4,5 100000 19 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,843600000,5.003575,5.931217
+2023-04-07 09:52:52,5,5 10 579263 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,57926300,5.178872,89.404502
+2023-04-07 09:52:57,2,5 100000 13 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,855400000,5.000110,5.845347
+2023-04-07 09:53:02,2,5 1 9268211 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,37072844,5.360510,144.593978
+2023-04-07 09:53:09,2,5 100 51203 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,179210500,5.036214,28.102226
+2023-04-07 09:53:15,5,5 100000 37 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,673400000,5.004207,7.431255
+2023-04-07 09:53:20,3,5 10000 283 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,178290000,5.049447,28.321538
+2023-04-07 09:53:25,2,5 1000 9051 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,343938000,5.072806,14.749187
+2023-04-07 09:53:30,1,5 1000000 7 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,847000000,5.009923,5.914903
+2023-04-07 09:53:35,4,5 100 36209 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,202770400,5.061130,24.959905
+2023-04-07 09:53:40,2,5 100 72421 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,159326200,5.163881,32.410746
+2023-04-07 09:53:45,5,5 10000 401 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,505260000,5.034937,9.965042
+2023-04-07 09:53:50,2,5 1000 3203 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,163353000,5.065905,31.012011
+2023-04-07 09:53:55,2,5 100000 37 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,839900000,5.016052,5.972201
+2023-04-07 09:54:00,2,5 10 289637 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,69512880,5.068929,72.920716
+2023-04-07 09:54:05,3,5 100 72421 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,159326200,5.107289,32.055550
+2023-04-07 09:54:10,2,5 10 144817 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,117301770,5.039460,42.961500
+2023-04-07 09:54:15,3,5 1000 2267 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,158690000,5.064518,31.914538
+2023-04-07 09:54:21,2,5 1 6553621 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,39321726,5.289410,134.516221
+2023-04-07 09:54:27,4,5 10000 211 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,679420000,5.010247,7.374300
+2023-04-07 09:54:32,1,5 10000 283 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,633920000,5.011860,7.906140
+2023-04-07 09:54:37,1,5 1 1638431 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,49152930,5.110134,103.963975
+2023-04-07 09:54:43,5,5 10000 569 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,176390000,5.094806,28.883758
+2023-04-07 09:54:48,3,5 100 12809 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,340719400,5.004029,14.686657
+2023-04-07 09:54:53,5,5 10000 149 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,680930000,5.003445,7.347958
+2023-04-07 09:54:58,3,5 100000 71 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,653200000,5.016524,7.679920
+2023-04-07 09:55:03,1,5 1 4634111 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,41706999,5.351419,128.309855
+2023-04-07 09:55:09,5,5 1 1158613 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,52137585,5.049786,96.855004
+2023-04-07 09:55:15,1,5 1000 3203 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,361939000,5.003257,13.823481
+2023-04-07 09:55:20,2,5 10 102407 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,153610500,5.015474,32.650594
+2023-04-07 09:55:25,2,5 1 6553621 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,39321726,5.195927,132.138833
+2023-04-07 09:55:31,5,5 100000 37 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,839900000,5.014064,5.969835
+2023-04-07 09:55:36,2,5 1 3276803 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,45875242,5.210202,113.573286
+2023-04-07 09:55:42,3,5 100 72421 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,159326200,5.098219,31.998623
+2023-04-07 09:55:47,2,5 10000 211 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,179350000,5.050498,28.160011
+2023-04-07 09:55:52,5,5 100 25601 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,158726200,5.080416,32.007419
+2023-04-07 09:55:57,5,5 10 579263 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,57926300,5.070690,87.536922
+2023-04-07 09:56:02,4,5 10 289637 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,139025760,5.050722,36.329397
+2023-04-07 09:56:08,4,5 100000 71 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,809400000,5.033625,6.218958
+2023-04-07 09:56:13,5,5 10000 211 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,692080000,5.010896,7.240342
+2023-04-07 09:56:18,3,5 10000 569 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,176390000,5.101254,28.920313
+2023-04-07 09:56:23,3,5 100000 37 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,677100000,5.026249,7.423200
+2023-04-07 09:56:28,4,5 10 289637 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,69512880,5.196569,74.756923
+2023-04-07 09:56:33,4,5 1 1158613 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,50978972,5.042514,98.913607
+2023-04-07 09:56:38,3,5 1 2317057 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,44024083,5.006613,113.724413
+2023-04-07 09:56:44,4,5 100000 53 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,816200000,5.020393,6.150935
+2023-04-07 09:56:49,3,5 1000 2267 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,362720000,5.023925,13.850698
+2023-04-07 09:56:54,2,5 100000 53 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,795000000,5.008068,6.299457
+2023-04-07 09:56:59,1,5 100 51203 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,179210500,5.146019,28.714941
+2023-04-07 09:57:04,1,5 100 12809 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,336876700,5.012403,14.879043
+2023-04-07 09:57:09,4,5 10000 283 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,534870000,5.010647,9.367972
+2023-04-07 09:57:14,2,5 100000 71 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,617700000,5.015097,8.118985
+2023-04-07 09:57:19,1,5 10000 569 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,176390000,5.115755,29.002523
+2023-04-07 09:57:24,2,5 1000 4547 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,354666000,5.001010,14.100619
+2023-04-07 09:57:29,2,5 10000 211 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,651990000,5.015182,7.692115
+2023-04-07 09:57:34,3,5 10 289637 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,69512880,5.065842,72.876307
+2023-04-07 09:57:40,5,5 100 36209 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,210012200,5.072234,24.152092
+2023-04-07 09:57:45,5,5 1000 1601 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,401851000,5.012058,12.472429
+2023-04-07 09:57:50,2,5 10000 401 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,569420000,5.030667,8.834721
+2023-04-07 09:57:55,5,5 10 289637 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,66616510,5.149631,77.302624
+2023-04-07 09:58:00,2,5 100000 37 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,913900000,5.005863,5.477473
+2023-04-07 09:58:05,4,5 10 819229 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,57346030,5.297419,92.376386
+2023-04-07 09:58:10,5,5 100000 71 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,184600000,5.164554,27.976999
+2023-04-07 09:58:16,4,5 1 3276803 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,127795317,5.077942,39.734961
+2023-04-07 09:58:21,4,5 100 36209 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,195528600,5.087965,26.021590
+2023-04-07 09:58:26,1,5 10000 211 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,582360000,5.012682,8.607531
+2023-04-07 09:58:31,2,5 1000 1151 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,447739000,5.003394,11.174800
+2023-04-07 09:58:36,2,5 100 12809 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,156269800,5.007923,32.046646
+2023-04-07 09:58:42,1,5 100 12809 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,338157600,5.003783,14.797192
+2023-04-07 09:58:47,1,5 1000 9051 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,343938000,5.006674,14.556909
+2023-04-07 09:58:52,5,5 1000 6473 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,161825000,5.066722,31.309884
+2023-04-07 09:58:57,5,5 100 36209 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,195528600,5.042417,25.788642
+2023-04-07 09:59:02,5,5 100000 11 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,799700000,5.004969,6.258558
+2023-04-07 09:59:07,4,5 1 2317057 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,48658197,5.224689,107.375310
+2023-04-07 09:59:12,4,5 100000 53 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,678400000,5.010920,7.386380
+2023-04-07 09:59:17,5,5 1000 4547 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,336478000,5.059042,15.035283
+2023-04-07 09:59:22,4,5 1 2317057 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,48658197,5.216535,107.207733
+2023-04-07 09:59:28,3,5 10000 211 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,660430000,5.000178,7.571095
+2023-04-07 09:59:33,4,5 1000 6473 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,349542000,5.026286,14.379634
+2023-04-07 09:59:38,5,5 10000 569 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,529170000,5.021428,9.489253
+2023-04-07 09:59:43,1,5 100000 19 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,845500000,5.004181,5.918606
+2023-04-07 09:59:48,5,5 100 36209 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,202770400,5.054764,24.928510
+2023-04-07 09:59:53,3,5 100000 19 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,195700000,5.048412,25.796689
+2023-04-07 09:59:58,3,5 100 51203 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,168969900,5.036143,29.804971
+2023-04-07 10:00:03,2,5 100000 19 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,853100000,5.001988,5.863308
+2023-04-07 10:00:08,2,5 100000 71 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,773900000,5.044465,6.518239
+2023-04-07 10:00:14,4,5 1000 9051 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,343938000,5.044099,14.665722
+2023-04-07 10:00:19,2,5 1 1638431 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,49152930,5.006190,101.849269
+2023-04-07 10:00:24,5,5 100000 53 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,816200000,5.006537,6.133959
+2023-04-07 10:00:29,5,5 10000 211 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,580250000,5.012370,8.638294
+2023-04-07 10:00:34,5,5 1000 4547 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,350119000,5.014141,14.321248
+2023-04-07 10:00:39,1,5 1000 9051 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,343938000,5.034283,14.637182
+2023-04-07 10:00:44,2,5 100 72421 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,159326200,5.104260,32.036539
+2023-04-07 10:00:49,3,5 100000 11 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,798600000,5.000424,6.261488
+2023-04-07 10:00:54,4,5 10 579263 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,127437860,5.057602,39.686809
+2023-04-07 10:00:59,2,5 10000 149 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,680930000,5.010171,7.357836
+2023-04-07 10:01:04,5,5 100 72421 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,159326200,5.124469,32.163379
+2023-04-07 10:01:10,3,5 1000 6473 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,349542000,5.050891,14.450026
+2023-04-07 10:01:15,2,5 1000 1601 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,397048000,5.007866,12.612747
+2023-04-07 10:01:20,4,5 10 144817 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,154954190,5.044267,32.553279
+2023-04-07 10:01:25,3,5 10000 283 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,546190000,5.007632,9.168297
+2023-04-07 10:01:30,4,5 100 12809 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,316382300,5.003399,15.814409
+2023-04-07 10:01:35,1,5 1000 1601 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,389043000,5.015936,12.893012
+2023-04-07 10:01:40,1,5 1 2317057 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,48658197,5.230985,107.504703
+2023-04-07 10:01:45,1,5 100000 37 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,677100000,5.025219,7.421679
+2023-04-07 10:01:50,1,5 10 144817 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,154954190,5.046895,32.570239
+2023-04-07 10:01:56,1,5 100000 37 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,858400000,5.010083,5.836537
+2023-04-07 10:02:01,1,5 10 579263 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,57926300,5.369056,92.687708
+2023-04-07 10:02:06,2,5 1000000 7 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,819000000,5.043791,6.158475
+2023-04-07 10:02:11,2,5 1000 2267 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,378589000,5.027829,13.280441
+2023-04-07 10:02:16,3,5 10000 569 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,523480000,5.010779,9.572054
+2023-04-07 10:02:21,2,5 1000000 7 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,665000000,5.006551,7.528648
+2023-04-07 10:02:26,5,5 100 18119 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,306211100,5.005805,16.347562
+2023-04-07 10:02:31,4,5 1 1638431 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,127797618,5.039067,39.430054
+2023-04-07 10:02:37,1,5 10 204803 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,79873170,5.004782,62.659113
+2023-04-07 10:02:42,5,5 10 819229 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,131076640,5.276709,40.256670
+2023-04-07 10:02:47,1,5 100 18119 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,300775400,5.017971,16.683449
+2023-04-07 10:02:52,3,5 1 1638431 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,49152930,5.111653,103.994879
+2023-04-07 10:02:58,4,5 1 1158613 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,49820359,5.113693,102.642637
+2023-04-07 10:03:03,5,5 1 6553621 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,39321726,5.206265,132.401741
+2023-04-07 10:03:10,4,5 100 36209 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,206391300,5.030947,24.375771
+2023-04-07 10:03:15,2,5 10 204803 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,77825140,5.027495,64.599884
+2023-04-07 10:03:20,5,5 10 819229 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,57346030,5.605857,97.754927
+2023-04-07 10:03:25,2,5 10000 569 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,489340000,5.017682,10.253979
+2023-04-07 10:03:31,3,5 100000 29 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,843900000,5.000088,5.924977
+2023-04-07 10:03:36,1,5 100000 53 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,890400000,5.023961,5.642364
+2023-04-07 10:03:41,3,5 10 409609 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,61441350,5.119943,83.330575
+2023-04-07 10:03:46,5,5 10000 809 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,517760000,5.018735,9.693169
+2023-04-07 10:03:51,5,5 10 819229 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,57346030,5.535725,96.531966
+2023-04-07 10:03:56,3,5 100 51203 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,163849600,5.153951,31.455377
+2023-04-07 10:04:02,5,5 10000 149 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,691360000,5.002781,7.236145
+2023-04-07 10:04:07,1,5 100 12809 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,316382300,5.018773,15.863002
+2023-04-07 10:04:12,2,5 100 12809 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,339438500,5.005192,14.745505
+2023-04-07 10:04:17,3,5 1000 2267 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,374055000,5.021375,13.424162
+2023-04-07 10:04:22,5,5 1000 3203 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,358736000,5.021221,13.996981
+2023-04-07 10:04:27,5,5 1000 3203 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,163353000,5.026323,30.769701
+2023-04-07 10:04:32,2,5 100000 37 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,185000000,5.004536,27.051546
+2023-04-07 10:04:37,4,5 10000 569 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,176390000,5.150086,29.197154
+2023-04-07 10:04:42,5,5 10000 809 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,169890000,5.042268,29.679604
+2023-04-07 10:04:47,2,5 10000 809 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,509670000,5.014189,9.838109
+2023-04-07 10:04:52,3,5 100000 13 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,666900000,5.009341,7.511383
+2023-04-07 10:04:57,4,5 1000 1151 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,439682000,5.003161,11.379044
+2023-04-07 10:05:02,4,5 1000 2267 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,378589000,5.015274,13.247279
+2023-04-07 10:05:07,1,5 1000 4547 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,163692000,5.019521,30.664425
+2023-04-07 10:05:12,1,5 1 2317057 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,127438135,5.003412,39.261497
+2023-04-07 10:05:18,2,5 10 144817 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,110060920,5.001005,45.438517
+2023-04-07 10:05:23,3,5 1000 2267 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,378589000,5.022427,13.266173
+2023-04-07 10:05:28,4,5 1 2317057 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,46341140,5.078865,109.597325
+2023-04-07 10:05:33,2,5 1000 3203 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,342721000,5.000845,14.591592
+2023-04-07 10:05:38,3,5 1 1638431 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,49152930,5.021088,102.152364
+2023-04-07 10:05:44,3,5 10000 401 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,509270000,5.019658,9.856575
+2023-04-07 10:05:49,1,5 10 819229 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,57346030,5.295784,92.347875
+2023-04-07 10:05:54,1,5 1 1158613 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,50978972,5.046129,98.984519
+2023-04-07 10:06:00,3,5 10000 401 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,176440000,5.030972,28.513784
+2023-04-07 10:06:05,1,5 1 9268211 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,37072844,5.606051,151.217182
+2023-04-07 10:06:12,1,5 1000 6473 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,161825000,5.043042,31.163553
+2023-04-07 10:06:17,5,5 1 6553621 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,39321726,5.454058,138.703423
+2023-04-07 10:06:24,2,5 1000 6473 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,349542000,5.010543,14.334595
+2023-04-07 10:06:29,2,5 10 409609 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,65537440,5.329276,81.316512
+2023-04-07 10:06:35,2,5 1 2317057 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,125121078,5.023900,40.152308
+2023-04-07 10:06:40,3,5 1 4634111 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,41706999,5.168520,123.924524
+2023-04-07 10:06:46,3,5 10 102407 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,153610500,5.022965,32.699360
+2023-04-07 10:06:51,4,5 1000 1601 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,393846000,5.006856,12.712725
+2023-04-07 10:06:56,2,5 1000 2267 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,158690000,5.061032,31.892570
+2023-04-07 10:07:02,2,5 10 204803 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,151554220,5.022782,33.141816
+2023-04-07 10:07:07,2,5 1 1158613 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,50978972,5.099746,100.036266
+2023-04-07 10:07:12,2,5 1000 2267 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,371788000,5.000283,13.449286
+2023-04-07 10:07:17,2,5 100 72421 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,166568300,5.052158,30.330849
+2023-04-07 10:07:22,1,5 100000 37 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,185000000,5.034764,27.214941
+2023-04-07 10:07:27,2,5 1 3276803 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,127795317,5.012432,39.222345
+2023-04-07 10:07:33,1,5 10000 149 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,709240000,5.004953,7.056783
+2023-04-07 10:07:38,2,5 1 1638431 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,49152930,5.009175,101.909998
+2023-04-07 10:07:43,5,5 100 51203 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,179210500,5.030972,28.072976
+2023-04-07 10:07:48,5,5 1 4634111 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,41706999,5.076365,121.714943
+2023-04-07 10:07:54,1,5 10 102407 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,145417940,5.023880,34.547869
+2023-04-07 10:07:59,3,5 10 579263 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,127437860,5.078650,39.851972
+2023-04-07 10:08:04,3,5 10 204803 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,151554220,5.040866,33.261139
+2023-04-07 10:08:09,2,5 100000 11 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,665500000,5.005708,7.521725
+2023-04-07 10:08:14,4,5 10000 149 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,710730000,5.001395,7.036983
+2023-04-07 10:08:19,1,5 100000 71 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,184600000,5.135656,27.820455
+2023-04-07 10:08:25,1,5 10000 401 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,565410000,5.028310,8.893210
+2023-04-07 10:08:30,1,5 100 72421 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,159326200,5.105383,32.043587
+2023-04-07 10:08:35,4,5 100 72421 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,166568300,5.051472,30.326731
+2023-04-07 10:08:40,1,5 10 144817 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,117301770,5.000858,42.632417
+2023-04-07 10:08:45,4,5 1000 3203 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,361939000,5.031134,13.900503
+2023-04-07 10:08:50,2,5 1000 6473 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,349542000,5.042494,14.426003
+2023-04-07 10:08:55,4,5 100 72421 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,166568300,5.126143,30.775021
+2023-04-07 10:09:00,1,5 100000 53 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,795000000,5.013306,6.306045
+2023-04-07 10:09:05,1,5 10000 401 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,565410000,5.034758,8.904614
+2023-04-07 10:09:10,1,5 10 289637 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,66616510,5.148906,77.291740
+2023-04-07 10:09:15,5,5 1000000 7 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,819000000,5.011415,6.118944
+2023-04-07 10:09:20,2,5 10000 569 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,176390000,5.148411,29.187658
+2023-04-07 10:09:26,2,5 1000 6473 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,349542000,5.083369,14.542942
+2023-04-07 10:09:31,4,5 100000 29 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,823600000,5.007978,6.080595
+2023-04-07 10:09:36,1,5 1 1158613 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,52137585,5.046164,96.785534
+2023-04-07 10:09:41,2,5 1000 1151 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,445437000,5.003952,11.233804
+2023-04-07 10:09:46,4,5 1000 4547 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,354666000,5.044282,14.222626
+2023-04-07 10:09:51,4,5 10 289637 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,69512880,5.072499,72.972074
+2023-04-07 10:09:56,5,5 10 289637 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,69512880,5.066830,72.890520
+2023-04-07 10:10:01,1,5 10 409609 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,61441350,5.118328,83.304289
+2023-04-07 10:10:07,2,5 1000 3203 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,361939000,5.009039,13.839456
+2023-04-07 10:10:12,3,5 100000 11 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,862400000,5.004356,5.802825
+2023-04-07 10:10:17,5,5 1 1158613 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,49820359,5.113854,102.645868
+2023-04-07 10:10:22,2,5 100000 11 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,805200000,5.001661,6.211700
+2023-04-07 10:10:27,4,5 10000 809 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,509670000,5.043044,9.894724
+2023-04-07 10:10:32,4,5 1 1158613 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,121654365,5.018090,41.248746
+2023-04-07 10:10:37,4,5 10 579263 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,57926300,5.064990,87.438521
+2023-04-07 10:10:42,4,5 1 9268211 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,37072844,5.604154,151.166013
+2023-04-07 10:10:50,2,5 1 4634111 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,41706999,5.346947,128.202631
+2023-04-07 10:10:56,1,5 10 102407 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,152586430,5.001367,32.777273
+2023-04-07 10:11:01,4,5 100 51203 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,168969900,5.079000,30.058608
+2023-04-07 10:11:07,1,5 1 6553621 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,39321726,5.200653,132.259021
+2023-04-07 10:11:13,2,5 10000 283 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,540530000,5.019198,9.285697
+2023-04-07 10:11:18,5,5 1000 9051 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,162918000,5.185724,31.830270
+2023-04-07 10:11:23,5,5 100000 11 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,666600000,5.003329,7.505744
+2023-04-07 10:11:28,3,5 10000 211 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,666760000,5.005038,7.506506
+2023-04-07 10:11:33,5,5 10 579263 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,127437860,5.035282,39.511665
+2023-04-07 10:11:39,2,5 100000 13 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,665600000,5.002035,7.515077
+2023-04-07 10:11:44,2,5 100 72421 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,159326200,5.152754,32.340908
+2023-04-07 10:11:49,2,5 100 18119 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,297151600,5.021822,16.899865
+2023-04-07 10:11:54,4,5 1 3276803 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,45875242,5.221516,113.819912
+2023-04-07 10:12:00,4,5 1000 6473 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,349542000,5.093192,14.571044
+2023-04-07 10:12:05,2,5 1 3276803 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,45875242,5.327501,116.130199
+2023-04-07 10:12:11,4,5 100000 29 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,843900000,5.006865,5.933007
+2023-04-07 10:12:16,5,5 100 51203 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,179210500,5.144722,28.707704
+2023-04-07 10:12:21,3,5 10 204803 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,83969230,5.102832,60.770261
+2023-04-07 10:12:26,4,5 10000 283 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,628260000,5.013218,7.979528
+2023-04-07 10:12:31,3,5 100000 29 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,823600000,5.006814,6.079182
+2023-04-07 10:12:36,4,5 1000 1151 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,451192000,5.011767,11.107837
+2023-04-07 10:12:41,4,5 10 819229 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,57346030,5.605311,97.745406
+2023-04-07 10:12:47,5,5 10 102407 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,154634570,5.015284,32.433136
+2023-04-07 10:12:52,1,5 100 36209 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,195528600,5.034502,25.748162
+2023-04-07 10:12:57,5,5 10000 809 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,509670000,5.023398,9.856178
+2023-04-07 10:13:02,5,5 10 102407 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,153610500,5.031158,32.752696
+2023-04-07 10:13:07,1,5 10000 149 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,701790000,5.008532,7.136796
+2023-04-07 10:13:12,1,5 100 72421 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,159326200,5.153915,32.348195
+2023-04-07 10:13:17,3,5 10000 401 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,565410000,5.027317,8.891454
+2023-04-07 10:13:22,4,5 100000 19 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,665000000,5.009112,7.532499
+2023-04-07 10:13:27,2,5 1 4634111 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,41706999,5.171267,123.990388
+2023-04-07 10:13:34,2,5 100000 29 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,838100000,5.004951,5.971783
+2023-04-07 10:13:39,3,5 1000 3203 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,163353000,5.046362,30.892374
+2023-04-07 10:13:44,2,5 10 819229 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,131076640,5.296931,40.410946
+2023-04-07 10:13:49,2,5 100000 11 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,204600000,5.017009,24.521061
+2023-04-07 10:13:54,2,5 10 102407 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,145417940,5.025803,34.561093
+2023-04-07 10:13:59,1,5 10000 401 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,180450000,5.095540,28.237961
+2023-04-07 10:14:04,5,5 1 1638431 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,127797618,5.017929,39.264652
+2023-04-07 10:14:10,5,5 100000 37 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,188700000,5.076207,26.900938
+2023-04-07 10:14:15,4,5 100 36209 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,195528600,5.033879,25.744975
+2023-04-07 10:14:20,2,5 1 1638431 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,49152930,5.103962,103.838408
+2023-04-07 10:14:25,1,5 10 289637 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,69512880,5.063376,72.840832
+2023-04-07 10:14:30,3,5 100000 19 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,853100000,5.002514,5.863925
+2023-04-07 10:14:35,2,5 1 4634111 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,129755108,5.113571,39.409400
+2023-04-07 10:14:42,4,5 100 25601 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,261130200,5.047201,19.328293
+2023-04-07 10:14:47,1,5 10 409609 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,61441350,5.003805,81.440349
+2023-04-07 10:14:52,3,5 100 25601 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,250889800,5.025927,20.032409
+2023-04-07 10:14:57,5,5 10 144817 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,150609680,5.015114,33.298749
+2023-04-07 10:15:02,1,5 100000 19 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,665000000,5.008605,7.531737
+2023-04-07 10:15:07,3,5 1000 3203 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,365142000,5.039542,13.801595
+2023-04-07 10:15:12,2,5 100 25601 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,156166100,5.056772,32.380728
+2023-04-07 10:15:17,3,5 1 1638431 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,127797618,5.033775,39.388645
+2023-04-07 10:15:22,2,5 100000 19 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,790400000,5.006586,6.334243
+2023-04-07 10:15:27,1,5 100 72421 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,166568300,5.128075,30.786620
+2023-04-07 10:15:33,2,5 1000 6473 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,330123000,5.070328,15.358906
+2023-04-07 10:15:38,5,5 10000 149 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,180290000,5.016930,27.827001
+2023-04-07 10:15:43,5,5 100 51203 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,163849600,5.160641,31.496207
+2023-04-07 10:15:48,3,5 10000 809 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,509670000,5.036933,9.882734
+2023-04-07 10:15:53,2,5 100 36209 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,195528600,5.029227,25.721183
+2023-04-07 10:15:58,5,5 100 72421 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,159326200,5.149598,32.321100
+2023-04-07 10:16:03,1,5 10000 283 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,540530000,5.000308,9.250750
+2023-04-07 10:16:08,1,5 100000 29 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,667000000,5.004765,7.503396
+2023-04-07 10:16:13,1,5 1 1158613 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,52137585,5.068714,97.218043
+2023-04-07 10:16:18,5,5 100000 11 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,200200000,5.011840,25.034166
+2023-04-07 10:16:24,4,5 100000 13 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,665600000,5.001051,7.513598
+2023-04-07 10:16:29,4,5 100 25601 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,243209500,5.009023,20.595507
+2023-04-07 10:16:34,2,5 10000 401 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,561400000,5.005223,8.915609
+2023-04-07 10:16:39,1,5 100000 29 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,176900000,5.014175,28.344686
+2023-04-07 10:16:44,1,5 1 9268211 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,37072844,5.452601,147.078034
+2023-04-07 10:16:51,1,5 1000 3203 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,368345000,5.028426,13.651403
+2023-04-07 10:16:56,2,5 100 18119 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,284468300,5.025072,17.664787
+2023-04-07 10:17:01,5,5 10 204803 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,83969230,5.102988,60.772119
+2023-04-07 10:17:06,5,5 100000 37 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,832500000,5.000588,6.006712
+2023-04-07 10:17:11,2,5 1000 2267 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,360453000,5.018848,13.923724
+2023-04-07 10:17:17,2,5 1000000 7 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,231000000,5.147951,22.285502
+2023-04-07 10:17:22,2,5 100000 37 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,817700000,5.021130,6.140553
+2023-04-07 10:17:27,4,5 100000 11 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,827200000,5.003925,6.049232
+2023-04-07 10:17:32,3,5 1 3276803 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,45875242,5.334448,116.281632
+2023-04-07 10:17:38,4,5 100 72421 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,159326200,5.115253,32.105536
+2023-04-07 10:17:43,5,5 100 12809 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,317663200,5.013239,15.781617
+2023-04-07 10:17:48,2,5 100 18119 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,298963500,5.005250,16.742010
+2023-04-07 10:17:53,3,5 1000 1151 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,451192000,5.011992,11.108335
+2023-04-07 10:17:58,3,5 1000 1151 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,430474000,5.000340,11.615893
+2023-04-07 10:18:03,4,5 10 409609 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,61441350,5.309618,86.417665
+2023-04-07 10:18:08,3,5 100000 37 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,188700000,5.010605,26.553286
+2023-04-07 10:18:13,5,5 1000 1601 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,163302000,5.003912,30.642074
+2023-04-07 10:18:18,3,5 100000 37 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,880600000,5.004174,5.682687
+2023-04-07 10:18:23,2,5 100 18119 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,309834900,5.028903,16.230912
+2023-04-07 10:18:28,4,5 1 6553621 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,39321726,5.205466,132.381422
+2023-04-07 10:18:35,1,5 100 51203 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,163849600,5.086716,31.045032
+2023-04-07 10:18:40,1,5 1000 2267 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,376322000,5.014964,13.326258
+2023-04-07 10:18:45,2,5 10 289637 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,69512880,5.074942,73.007218
+2023-04-07 10:18:50,1,5 10 144817 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,110060920,5.036067,45.757086
+2023-04-07 10:18:55,2,5 10 204803 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,81921200,5.017544,61.248419
+2023-04-07 10:19:00,1,5 100 25601 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,156166100,5.017205,32.127363
+2023-04-07 10:19:05,4,5 1 4634111 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,41706999,5.089591,122.032060
+2023-04-07 10:19:12,1,5 10 579263 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,127437860,5.024208,39.424767
+2023-04-07 10:19:17,1,5 100000 53 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,816200000,5.013970,6.143065
+2023-04-07 10:19:22,5,5 10000 101 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,597920000,5.003246,8.367752
+2023-04-07 10:19:27,3,5 1000000 7 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,819000000,5.021580,6.131355
+2023-04-07 10:19:32,1,5 1 4634111 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,41706999,5.175768,124.098308
+2023-04-07 10:19:38,1,5 1 6553621 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,39321726,5.288009,134.480592
+2023-04-07 10:19:45,3,5 100 18119 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,298963500,5.005306,16.742198
+2023-04-07 10:19:50,5,5 1000 3203 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,361939000,5.027274,13.889838
+2023-04-07 10:19:55,4,5 1000 9051 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,343938000,5.025310,14.611093
+2023-04-07 10:20:00,1,5 100000 11 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,203500000,5.019622,24.666447
+2023-04-07 10:20:05,5,5 1 2317057 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,44024083,5.020202,114.033085
+2023-04-07 10:20:10,2,5 100 51203 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,168969900,5.077861,30.051867
+2023-04-07 10:20:15,3,5 10 579263 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,57926300,5.368875,92.684584
+2023-04-07 10:20:21,2,5 10000 401 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,561400000,5.016388,8.935497
+2023-04-07 10:20:26,4,5 100000 29 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,182700000,5.048238,27.631297
+2023-04-07 10:20:31,3,5 1 4634111 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,129755108,5.083346,39.176462
+2023-04-07 10:20:37,2,5 10000 401 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,513280000,5.000953,9.743129
+2023-04-07 10:20:42,4,5 100000 13 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,859300000,5.007072,5.826920
+2023-04-07 10:20:47,1,5 100 36209 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,206391300,5.011608,24.282070
+2023-04-07 10:20:52,3,5 100 36209 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,195528600,5.032284,25.736818
+2023-04-07 10:20:57,5,5 100000 19 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,665000000,5.000657,7.519785
+2023-04-07 10:21:02,3,5 1000 4547 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,331931000,5.013658,15.104519
+2023-04-07 10:21:07,3,5 1 1638431 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,47514499,5.129208,107.950375
+2023-04-07 10:21:12,1,5 1000 4547 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,354666000,5.039032,14.207824
+2023-04-07 10:21:18,1,5 10 204803 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,77825140,5.069628,65.141264
+2023-04-07 10:21:23,4,5 1 2317057 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,129755192,5.093432,39.254167
+2023-04-07 10:21:28,5,5 1 2317057 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,48658197,5.232841,107.542846
+2023-04-07 10:21:34,5,5 1 9268211 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,37072844,5.362152,144.638269
+2023-04-07 10:21:41,5,5 10000 283 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,611280000,5.014672,8.203560
+2023-04-07 10:21:46,2,5 1 4634111 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,41706999,5.080272,121.808620
+2023-04-07 10:21:52,3,5 10 409609 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,61441350,5.000199,81.381659
+2023-04-07 10:21:58,4,5 100 25601 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,245769600,5.009451,20.382712
+2023-04-07 10:22:03,2,5 1 3276803 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,42598439,5.127230,120.361922
+2023-04-07 10:22:08,4,5 100 12809 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,336876700,5.004649,14.856026
+2023-04-07 10:22:13,3,5 100000 11 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,665500000,5.004104,7.519315
+2023-04-07 10:22:18,5,5 1 6553621 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,39321726,5.197170,132.170444
+2023-04-07 10:22:25,1,5 1000 4547 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,354666000,5.006406,14.115833
+2023-04-07 10:22:30,2,5 10 204803 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,83969230,5.104239,60.787017
+2023-04-07 10:22:35,5,5 10 102407 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,146442010,5.005284,34.179290
+2023-04-07 10:22:40,2,5 100 51203 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,158729300,5.049138,31.809741
+2023-04-07 10:22:45,3,5 10000 149 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,686890000,5.001641,7.281575
+2023-04-07 10:22:50,1,5 10000 211 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,177240000,5.014900,28.294403
+2023-04-07 10:22:55,3,5 1 1158613 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,52137585,5.045239,96.767792
+2023-04-07 10:23:01,1,5 10 204803 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,83969230,5.113204,60.893782
+2023-04-07 10:23:06,4,5 1000 2267 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,380856000,5.006462,13.145289
+2023-04-07 10:23:11,1,5 1000 6473 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,330123000,5.083674,15.399333
+2023-04-07 10:23:16,2,5 10 144817 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,153506020,5.029787,32.766057
+2023-04-07 10:23:21,5,5 100000 71 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,781000000,5.028076,6.437997
+2023-04-07 10:23:26,3,5 10000 149 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,713710000,5.002940,7.009766
+2023-04-07 10:23:31,2,5 10 579263 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,57926300,5.076038,87.629246
+2023-04-07 10:23:36,4,5 1000 4547 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,350119000,5.011634,14.314087
+2023-04-07 10:23:41,4,5 100000 11 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,205700000,5.020986,24.409266
+2023-04-07 10:23:46,4,5 100000 71 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,177500000,5.023442,28.301082
+2023-04-07 10:23:51,2,5 1000000 7 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,917000000,5.011224,5.464803
+2023-04-07 10:23:56,3,5 100000 13 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,798200000,5.000388,6.264580
+2023-04-07 10:24:01,5,5 100 25601 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,243209500,5.050707,20.766898
+2023-04-07 10:24:06,4,5 100000 19 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,853100000,5.006892,5.869056
+2023-04-07 10:24:11,2,5 100 36209 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,202770400,5.044711,24.878932
+2023-04-07 10:24:16,2,5 1000 4547 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,163692000,5.015543,30.640123
+2023-04-07 10:24:21,3,5 10 204803 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,79873170,5.002431,62.629679
+2023-04-07 10:24:27,3,5 10 579263 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,57926300,5.070300,87.530189
+2023-04-07 10:24:32,3,5 10000 283 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,614110000,5.004730,8.149566
+2023-04-07 10:24:37,1,5 100000 13 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,854100000,5.006719,5.861982
+2023-04-07 10:24:42,2,5 100000 53 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,683700000,5.035954,7.365736
+2023-04-07 10:24:47,1,5 10 204803 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,149506190,5.023456,33.600321
+2023-04-07 10:24:52,2,5 100000 71 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,184600000,5.107239,27.666517
+2023-04-07 10:24:57,4,5 1000000 7 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,910000000,5.002830,5.497615
+2023-04-07 10:25:02,1,5 1000 1601 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,400250000,5.007481,12.510883
+2023-04-07 10:25:07,3,5 100000 19 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,853100000,5.007032,5.869220
+2023-04-07 10:25:12,1,5 10000 809 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,517760000,5.076620,9.804968
+2023-04-07 10:25:17,2,5 10 819229 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,57346030,5.403672,94.229226
+2023-04-07 10:25:23,5,5 1000 2267 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,362720000,5.021241,13.843298
+2023-04-07 10:25:28,3,5 10000 809 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,525850000,5.056304,9.615487
+2023-04-07 10:25:33,3,5 100 18119 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,308023000,5.021292,16.301679
+2023-04-07 10:25:38,3,5 10000 401 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,569420000,5.019648,8.815370
+2023-04-07 10:25:43,4,5 1000 1601 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,397048000,5.000326,12.593757
+2023-04-07 10:25:48,1,5 1000 6473 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,349542000,5.088045,14.556319
+2023-04-07 10:25:53,5,5 1000000 7 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,231000000,5.033218,21.788823
+2023-04-07 10:25:58,2,5 100 18119 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,164882900,5.029359,30.502611
+2023-04-07 10:26:03,3,5 100 12809 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,317663200,5.016867,15.793038
+2023-04-07 10:26:08,5,5 100000 19 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,841700000,5.001211,5.941798
+2023-04-07 10:26:13,3,5 10000 809 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,177980000,5.225656,29.360917
+2023-04-07 10:26:18,3,5 100 51203 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,179210500,5.142813,28.697052
+2023-04-07 10:26:23,5,5 10 102407 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,145417940,5.027803,34.574847
+2023-04-07 10:26:28,3,5 100 51203 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,168969900,5.082401,30.078736
+2023-04-07 10:26:34,4,5 100000 37 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,843600000,5.013215,5.942645
+2023-04-07 10:26:39,4,5 1 1638431 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,49152930,5.102512,103.808908
+2023-04-07 10:26:44,3,5 10 819229 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,57346030,5.604066,97.723696
+2023-04-07 10:26:50,3,5 10 579263 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,57926300,5.181007,89.441359
+2023-04-07 10:26:55,5,5 10 409609 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,61441350,5.300824,86.274537
+2023-04-07 10:27:00,4,5 100000 71 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,795200000,5.014248,6.305644
+2023-04-07 10:27:06,4,5 100000 53 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,816200000,5.027357,6.159467
+2023-04-07 10:27:11,3,5 100 25601 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,245769600,5.049258,20.544681
+2023-04-07 10:27:16,5,5 100000 53 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,180200000,5.058765,28.073058
+2023-04-07 10:27:21,5,5 1 6553621 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,39321726,5.289035,134.506685
+2023-04-07 10:27:27,2,5 1000 4547 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,354666000,5.061272,14.270531
+2023-04-07 10:27:32,2,5 100000 29 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,820700000,5.007117,6.101032
+2023-04-07 10:27:37,3,5 100 36209 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,202770400,5.068419,24.995852
+2023-04-07 10:27:43,1,5 1 4634111 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,129755108,5.175280,39.884981
+2023-04-07 10:27:49,2,5 1000 9051 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,325836000,5.101026,15.655195
+2023-04-07 10:27:54,2,5 100000 19 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,841700000,5.000442,5.940884
+2023-04-07 10:27:59,5,5 100 12809 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,339438500,5.000165,14.730695
+2023-04-07 10:28:04,1,5 1 9268211 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,129754954,5.128537,39.524788
+2023-04-07 10:28:11,3,5 10 144817 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,112957260,5.014487,44.392782
+2023-04-07 10:28:16,3,5 10 289637 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,66616510,5.150986,77.322964
+2023-04-07 10:28:22,5,5 1000 2267 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,376322000,5.007813,13.307255
+2023-04-07 10:28:27,2,5 10000 401 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,180450000,5.063096,28.058166
+2023-04-07 10:28:32,4,5 10 102407 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,147466080,5.010950,33.980357
+2023-04-07 10:28:37,2,5 1000 3203 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,368345000,5.037070,13.674870
+2023-04-07 10:28:42,1,5 1 2317057 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,48658197,5.220886,107.297153
+2023-04-07 10:28:47,5,5 1000 1601 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,395447000,5.006577,12.660551
+2023-04-07 10:28:52,4,5 10 579263 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,57926300,5.177884,89.387446
+2023-04-07 10:28:58,3,5 1 4634111 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,41706999,5.081329,121.833964
+2023-04-07 10:29:04,1,5 10 409609 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,131074880,5.047039,38.505006
+2023-04-07 10:29:09,2,5 1000 1601 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,406654000,5.014171,12.330313
+2023-04-07 10:29:14,4,5 10 102407 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,155658640,5.020200,32.251342
+2023-04-07 10:29:19,2,5 100000 13 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,803400000,5.002656,6.226856
+2023-04-07 10:29:24,1,5 10 144817 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,117301770,5.052820,43.075394
+2023-04-07 10:29:29,4,5 10 819229 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,57346030,5.400814,94.179388
+2023-04-07 10:29:35,4,5 10 144817 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,112957260,5.036869,44.590928
+2023-04-07 10:29:40,4,5 1000 9051 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,352989000,5.119696,14.503840
+2023-04-07 10:29:45,1,5 100000 19 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,190000000,5.017182,26.406221
+2023-04-07 10:29:50,1,5 1000000 7 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,917000000,5.016286,5.470323
+2023-04-07 10:29:55,3,5 10000 211 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,576030000,5.003176,8.685617
+2023-04-07 10:30:00,5,5 100000 19 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,853100000,5.010452,5.873229
+2023-04-07 10:30:05,4,5 1000 2267 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,158690000,5.048681,31.814739
+2023-04-07 10:30:10,4,5 10000 211 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,679420000,5.012799,7.378056
+2023-04-07 10:30:15,3,5 10000 149 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,585570000,5.005022,8.547265
+2023-04-07 10:30:20,2,5 1000 9051 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,343938000,5.029449,14.623127
+2023-04-07 10:30:25,1,5 10 289637 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,69512880,5.193280,74.709608
+2023-04-07 10:30:30,5,5 100 72421 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,166568300,5.049124,30.312635
+2023-04-07 10:30:35,1,5 100 18119 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,286280200,5.031503,17.575449
+2023-04-07 10:30:40,4,5 100 51203 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,168969900,5.035613,29.801835
+2023-04-07 10:30:46,3,5 1000 1601 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,403452000,5.018333,12.438488
+2023-04-07 10:30:51,5,5 10 204803 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,83969230,5.116111,60.928402
+2023-04-07 10:30:56,3,5 1000 4547 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,354666000,5.054096,14.250297
+2023-04-07 10:31:01,1,5 10000 211 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,662540000,5.007442,7.557947
+2023-04-07 10:31:06,4,5 1000 2267 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,362720000,5.007508,13.805437
+2023-04-07 10:31:11,4,5 1000 4547 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,163692000,5.111924,31.228918
+2023-04-07 10:31:16,2,5 10 579263 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,57926300,5.071721,87.554720
+2023-04-07 10:31:21,3,5 1000 3203 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,368345000,5.022350,13.634907
+2023-04-07 10:31:26,5,5 1 3276803 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,42598439,5.116736,120.115575
+2023-04-07 10:31:32,1,5 10000 101 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,177760000,5.009189,28.179506
+2023-04-07 10:31:37,5,5 1000 2267 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,158690000,5.034267,31.723908
+2023-04-07 10:31:42,3,5 1000 1151 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,166895000,5.002645,29.974805
+2023-04-07 10:31:47,5,5 10000 569 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,540550000,5.016880,9.281066
+2023-04-07 10:31:52,1,5 1 6553621 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,39321726,5.197726,132.184584
+2023-04-07 10:31:59,5,5 10 409609 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,131074880,5.044480,38.485482
+2023-04-07 10:32:04,3,5 100 12809 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,154988900,5.011795,32.336477
+2023-04-07 10:32:09,1,5 1 1638431 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,127797618,5.033446,39.386071
+2023-04-07 10:32:14,4,5 10000 401 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,180450000,5.100551,28.265730
+2023-04-07 10:32:19,4,5 10 204803 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,83969230,5.122545,61.005025
+2023-04-07 10:32:24,4,5 100 72421 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,159326200,5.053651,31.718895
+2023-04-07 10:32:30,2,5 10000 569 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,540550000,5.020819,9.288353
+2023-04-07 10:32:35,1,5 100 72421 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,166568300,5.049959,30.317647
+2023-04-07 10:32:40,5,5 100 51203 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,168969900,5.036544,29.807344
+2023-04-07 10:32:45,5,5 100 51203 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,168969900,5.072777,30.021779
+2023-04-07 10:32:50,2,5 10000 283 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,622600000,5.013538,8.052583
+2023-04-07 10:32:55,1,5 100000 29 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,838100000,5.004638,5.971409
+2023-04-07 10:33:00,5,5 10 204803 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,81921200,5.127429,62.589769
+2023-04-07 10:33:05,4,5 10 819229 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,122884350,5.044710,41.052502
+2023-04-07 10:33:10,1,5 100 36209 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,202770400,5.070571,25.006465
+2023-04-07 10:33:15,3,5 10000 401 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,565410000,5.012472,8.865199
+2023-04-07 10:33:20,2,5 1000 4547 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,354666000,5.034762,14.195784
+2023-04-07 10:33:25,4,5 1 4634111 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,129755108,5.054013,38.950397
+2023-04-07 10:33:32,1,5 10000 401 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,509270000,5.026745,9.870491
+2023-04-07 10:33:37,4,5 100000 19 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,834100000,5.004287,5.999625
+2023-04-07 10:33:42,3,5 10000 283 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,639580000,5.015402,7.841712
+2023-04-07 10:33:47,4,5 10000 101 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,180790000,5.010941,27.716915
+2023-04-07 10:33:52,3,5 1 1638431 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,49152930,5.011158,101.950342
+2023-04-07 10:33:57,5,5 100 18119 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,286280200,5.008426,17.494839
+2023-04-07 10:34:02,5,5 1000 1151 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,446588000,5.011691,11.222180
+2023-04-07 10:34:07,4,5 1000 3203 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,166556000,5.088777,30.552949
+2023-04-07 10:34:12,4,5 10000 569 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,534860000,5.041377,9.425601
+2023-04-07 10:34:17,2,5 10 204803 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,77825140,5.094008,65.454531
+2023-04-07 10:34:22,5,5 10000 101 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,736290000,5.000904,6.792030
+2023-04-07 10:34:27,1,5 1000 1151 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,443135000,5.009934,11.305661
+2023-04-07 10:34:32,2,5 100000 53 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,816200000,5.020482,6.151044
+2023-04-07 10:34:37,3,5 10 409609 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,131074880,5.021891,38.313146
+2023-04-07 10:34:42,1,5 10000 401 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,569420000,5.009670,8.797847
+2023-04-07 10:34:47,5,5 1000 2267 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,383123000,5.029040,13.126437
+2023-04-07 10:34:53,2,5 10000 101 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,615090000,5.001265,8.130948
+2023-04-07 10:34:58,5,5 10000 401 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,565410000,5.032623,8.900838
+2023-04-07 10:35:03,1,5 100000 71 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,788100000,5.021822,6.372062
+2023-04-07 10:35:08,2,5 1000 1601 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,163302000,5.006628,30.658706
+2023-04-07 10:35:13,5,5 10000 211 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,670980000,5.009727,7.466284
+2023-04-07 10:35:18,1,5 10000 283 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,633920000,5.009819,7.902920
+2023-04-07 10:35:23,4,5 10000 809 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,169890000,5.032924,29.624604
+2023-04-07 10:35:28,2,5 100000 29 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,829400000,5.001136,6.029824
+2023-04-07 10:35:33,1,5 10 819229 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,57346030,5.605720,97.752538
+2023-04-07 10:35:38,4,5 100000 29 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,812000000,5.001930,6.160012
+2023-04-07 10:35:43,3,5 100000 29 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,669900000,5.013277,7.483620
+2023-04-07 10:35:48,2,5 10000 569 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,523480000,5.002169,9.555607
+2023-04-07 10:35:53,4,5 100000 13 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,867100000,5.007104,5.774540
+2023-04-07 10:35:58,1,5 10 102407 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,154634570,5.005697,32.371138
+2023-04-07 10:36:04,2,5 10000 149 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,587060000,5.001868,8.520199
+2023-04-07 10:36:09,2,5 10 409609 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,61441350,5.010355,81.546955
+2023-04-07 10:36:14,1,5 100000 71 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,639000000,5.034157,7.878180
+2023-04-07 10:36:19,5,5 1000 1151 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,165744000,5.000159,30.167964
+2023-04-07 10:36:24,5,5 1000 9051 -1 5  ,./perfexp--upp-upp--stack-insfirst-allhead,325836000,5.088595,15.617044
+2023-04-07 10:36:29,1,5 100 51203 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,168969900,5.087748,30.110381
+2023-04-07 10:36:34,3,5 1000 1601 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,403452000,5.015423,12.431276
+2023-04-07 10:36:39,3,5 1 3276803 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,127795317,5.022126,39.298201
+2023-04-07 10:36:45,3,5 10000 101 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,181800000,5.002351,27.515682
+2023-04-07 10:36:50,4,5 1000 3203 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,342721000,5.006339,14.607623
+2023-04-07 10:36:55,1,5 10000 569 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,546240000,5.024201,9.197790
+2023-04-07 10:37:00,3,5 1 9268211 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,37072844,5.361456,144.619496
+2023-04-07 10:37:07,5,5 1 9268211 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,37072844,5.452010,147.062092
+2023-04-07 10:37:15,4,5 10000 211 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,692080000,5.003233,7.229270
+2023-04-07 10:37:20,1,5 100 12809 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,340719400,5.010599,14.705940
+2023-04-07 10:37:25,3,5 1000000 7 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,231000000,5.042267,21.827996
+2023-04-07 10:37:30,2,5 10000 101 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,753460000,5.001460,6.637990
+2023-04-07 10:37:35,5,5 100000 29 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,669900000,5.014844,7.485959
+2023-04-07 10:37:40,5,5 10 144817 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,117301770,5.036921,42.939855
+2023-04-07 10:37:45,2,5 100000 53 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,810900000,5.001411,6.167728
+2023-04-07 10:37:50,3,5 10000 569 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,540550000,5.041958,9.327459
+2023-04-07 10:37:55,1,5 100000 37 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,817700000,5.019528,6.138594
+2023-04-07 10:38:00,2,5 10 409609 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,61441350,5.115563,83.259287
+2023-04-07 10:38:05,3,5 1000000 7 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,924000000,5.036718,5.450994
+2023-04-07 10:38:10,4,5 10 409609 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,131074880,5.019672,38.296217
+2023-04-07 10:38:15,1,5 10 102407 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,147466080,5.022459,34.058402
+2023-04-07 10:38:20,2,5 100 36209 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,162940500,5.032298,30.884268
+2023-04-07 10:38:25,5,5 10 144817 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,112957260,5.002685,44.288300
+2023-04-07 10:38:30,3,5 10 144817 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,153506020,5.001601,32.582442
+2023-04-07 10:38:36,4,5 1000 1601 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,401851000,5.011603,12.471297
+2023-04-07 10:38:41,1,5 10 289637 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,139025760,5.070846,36.474147
+2023-04-07 10:38:46,5,5 10000 401 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,569420000,5.024206,8.823375
+2023-04-07 10:38:51,5,5 10000 569 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,529170000,5.021151,9.488730
+2023-04-07 10:38:56,1,5 10000 101 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,618120000,5.000039,8.089107
+2023-04-07 10:39:01,5,5 1000 1151 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,446588000,5.008737,11.215566
+2023-04-07 10:39:06,2,5 100 25601 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,243209500,5.019746,20.639597
+2023-04-07 10:39:11,2,5 10000 283 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,178290000,5.007905,28.088536
+2023-04-07 10:39:16,2,5 1 2317057 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,44024083,5.001446,113.607045
+2023-04-07 10:39:21,4,5 10 144817 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,110060920,5.008781,45.509169
+2023-04-07 10:39:26,4,5 100 12809 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,338157600,5.003976,14.797763
+2023-04-07 10:39:31,1,5 1000 3203 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,361939000,5.043313,13.934152
+2023-04-07 10:39:36,3,5 1 9268211 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,129754954,5.133653,39.564216
+2023-04-07 10:39:44,3,5 10 409609 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,61441350,5.007132,81.494498
+2023-04-07 10:39:49,4,5 10 409609 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,65537440,5.332330,81.363111
+2023-04-07 10:39:54,5,5 1000 6473 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,349542000,5.061086,14.479193
+2023-04-07 10:39:59,4,5 1000000 7 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,805000000,5.042344,6.263781
+2023-04-07 10:40:04,1,5 1000 6473 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,349542000,5.013376,14.342700
+2023-04-07 10:40:09,5,5 100000 11 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,863500000,5.003958,5.794972
+2023-04-07 10:40:14,1,5 100 12809 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,158831600,5.017407,31.589476
+2023-04-07 10:40:19,1,5 100 72421 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,159326200,5.058477,31.749185
+2023-04-07 10:40:24,4,5 10000 569 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,534860000,5.024288,9.393651
+2023-04-07 10:40:30,2,5 1 2317057 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,48658197,5.218185,107.241643
+2023-04-07 10:40:35,4,5 100000 11 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,665500000,5.001694,7.515693
+2023-04-07 10:40:40,1,5 100000 11 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,875600000,5.006101,5.717338
+2023-04-07 10:40:45,4,5 100000 53 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,185500000,5.035072,27.143245
+2023-04-07 10:40:50,5,5 100000 53 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,816200000,5.011945,6.140584
+2023-04-07 10:40:55,4,5 1 3276803 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,45875242,5.319582,115.957579
+2023-04-07 10:41:01,5,5 1000 1601 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,400250000,5.009892,12.516907
+2023-04-07 10:41:06,1,5 1 9268211 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,37072844,5.366748,144.762242
+2023-04-07 10:41:14,3,5 10 204803 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,77825140,5.022252,64.532515
+2023-04-07 10:41:19,1,5 1000 1601 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,395447000,5.004992,12.656543
+2023-04-07 10:41:24,2,5 100000 71 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,766800000,5.014661,6.539725
+2023-04-07 10:41:29,3,5 10 144817 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,117301770,5.001176,42.635128
+2023-04-07 10:41:34,4,5 100 51203 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,163849600,5.079646,31.001882
+2023-04-07 10:41:39,3,5 10000 569 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,529170000,5.051310,9.545723
+2023-04-07 10:41:44,2,5 100 51203 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,179210500,5.139262,28.677237
+2023-04-07 10:41:49,1,5 1 6553621 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,131072420,5.100611,38.914449
+2023-04-07 10:41:56,3,5 1000 1601 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,389043000,5.006115,12.867768
+2023-04-07 10:42:01,5,5 1000000 7 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,917000000,5.033088,5.488646
+2023-04-07 10:42:06,1,5 10000 809 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,509670000,5.055970,9.920086
+2023-04-07 10:42:11,3,5 10 819229 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,131076640,5.307361,40.490518
+2023-04-07 10:42:16,3,5 100000 71 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,802300000,5.006943,6.240737
+2023-04-07 10:42:21,2,5 1 6553621 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,131072420,5.175077,39.482578
+2023-04-07 10:42:28,4,5 1 6553621 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,131072420,5.126700,39.113492
+2023-04-07 10:42:35,4,5 10000 101 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,751440000,5.004486,6.659861
+2023-04-07 10:42:40,4,5 100000 13 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,202800000,5.021342,24.760069
+2023-04-07 10:42:45,4,5 10 204803 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,151554220,5.023206,33.144613
+2023-04-07 10:42:50,3,5 100000 13 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,848900000,5.004762,5.895585
+2023-04-07 10:42:55,2,5 10000 211 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,578140000,5.015599,8.675406
+2023-04-07 10:43:00,4,5 1000 3203 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,358736000,5.007305,13.958189
+2023-04-07 10:43:05,1,5 100 36209 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,162940500,5.045069,30.962646
+2023-04-07 10:43:10,2,5 1 1638431 -1 2  ,./perfexp--cpp-stlref--stack-insfirst-allhead,127797618,5.055597,39.559399
+2023-04-07 10:43:15,3,5 1000 6473 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,161825000,5.034375,31.109995
+2023-04-07 10:43:20,1,5 100000 71 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,781000000,5.031063,6.441822
+2023-04-07 10:43:25,2,5 1 1158613 -1 2  ,./perfexp--upp-upp--stack-insfirst-allhead,49820359,5.100944,102.386737
+2023-04-07 10:43:31,2,5 1 2317057 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,46341140,5.073273,109.476655
+2023-04-07 10:43:36,4,5 1 3276803 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,42598439,5.118094,120.147454
+2023-04-07 10:43:42,5,5 100000 29 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,823600000,5.005723,6.077857
+2023-04-07 10:43:47,5,5 1 2317057 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,48658197,5.223801,107.357061
+2023-04-07 10:43:53,4,5 100000 53 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,816200000,5.003753,6.130548
+2023-04-07 10:43:58,3,5 1 6553621 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,39321726,5.293454,134.619065
+2023-04-07 10:44:04,4,5 1000 6473 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,349542000,5.053269,14.456829
+2023-04-07 10:44:10,5,5 10 409609 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,61441350,5.005533,81.468474
+2023-04-07 10:44:15,1,5 10000 283 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,181120000,5.037688,27.814090
+2023-04-07 10:44:20,4,5 10000 401 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,573430000,5.019832,8.754045
+2023-04-07 10:44:25,3,5 10000 101 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,760530000,5.006003,6.582256
+2023-04-07 10:44:30,3,5 1000 9051 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,325836000,5.083551,15.601563
+2023-04-07 10:44:35,4,5 100 18119 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,300775400,5.002699,16.632673
+2023-04-07 10:44:40,5,5 1000 9051 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,352989000,5.127789,14.526767
+2023-04-07 10:44:45,3,5 100 36209 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,210012200,5.049515,24.043913
+2023-04-07 10:44:50,3,5 1000 9051 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,343938000,5.031892,14.630230
+2023-04-07 10:44:55,4,5 1000 1151 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,169197000,5.018167,29.658723
+2023-04-07 10:45:00,3,5 10000 809 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,509670000,5.046045,9.900612
+2023-04-07 10:45:05,1,5 100 51203 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,168969900,5.043548,29.848796
+2023-04-07 10:45:10,1,5 10 819229 -1 1  ,./perfexp--cpp-stlref--stack-insfirst-allhead,131076640,5.305296,40.474763
+2023-04-07 10:45:16,1,5 100000 19 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,853100000,5.003853,5.865494
+2023-04-07 10:45:21,3,5 10 409609 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,61441350,5.300521,86.269605
+2023-04-07 10:45:26,2,5 10000 569 -1 2  ,./perfexp--lq-list--stack-insfirst-allhead,529170000,5.011900,9.471247
+2023-04-07 10:45:31,3,5 10000 569 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,495030000,5.037963,10.177086
+2023-04-07 10:45:36,3,5 10000 101 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,740330000,5.006812,6.762946
+2023-04-07 10:45:41,4,5 1000000 7 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,917000000,5.027289,5.482322
+2023-04-07 10:45:46,4,5 10000 569 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,489340000,5.017968,10.254563
+2023-04-07 10:45:51,4,5 100 72421 -1 4  ,./perfexp--upp-upp--stack-insfirst-allhead,159326200,5.150346,32.325795
+2023-04-07 10:45:56,3,5 10 204803 -1 3  ,./perfexp--lq-tailq--stack-insfirst-allhead,83969230,5.114735,60.912015
+2023-04-07 10:46:02,1,5 100 25601 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,243209500,5.021457,20.646632
+2023-04-07 10:46:07,5,5 10000 809 -1 5  ,./perfexp--cfa-cfa--stack-insfirst-allhead,485400000,5.064438,10.433535
+2023-04-07 10:46:12,4,5 100 12809 -1 4  ,./perfexp--cpp-stlref--stack-insfirst-allhead,160112500,5.038368,31.467674
+2023-04-07 10:46:17,4,5 10 204803 -1 4  ,./perfexp--cfa-cfa--stack-insfirst-allhead,79873170,5.000134,62.600921
+2023-04-07 10:46:22,1,5 10000 101 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,745380000,5.003870,6.713180
+2023-04-07 10:46:27,3,5 1 6553621 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,39321726,5.453028,138.677229
+2023-04-07 10:46:34,4,5 100000 37 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,817700000,5.019752,6.138868
+2023-04-07 10:46:39,5,5 100 25601 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,261130200,5.009043,19.182167
+2023-04-07 10:46:44,1,5 1000 2267 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,376322000,5.024055,13.350415
+2023-04-07 10:46:49,1,5 10 409609 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,65537440,5.331472,81.350019
+2023-04-07 10:46:54,2,5 1 6553621 -1 2  ,./perfexp--lq-tailq--stack-insfirst-allhead,39321726,5.198942,132.215509
+2023-04-07 10:47:01,3,5 100000 29 -1 3  ,./perfexp--cpp-stlref--stack-insfirst-allhead,179800000,5.015683,27.895901
+2023-04-07 10:47:06,5,5 100000 29 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,185600000,5.048791,27.202538
+2023-04-07 10:47:11,1,5 100 18119 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,306211100,5.020095,16.394229
+2023-04-07 10:47:16,1,5 1 3276803 -1 1  ,./perfexp--cfa-cfa--stack-insfirst-allhead,45875242,5.313730,115.830016
+2023-04-07 10:47:22,3,5 1000 2267 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,374055000,5.014981,13.407068
+2023-04-07 10:47:27,3,5 100 51203 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,179210500,5.042253,28.135924
+2023-04-07 10:47:32,4,5 10 144817 -1 4  ,./perfexp--lq-list--stack-insfirst-allhead,117301770,5.053833,43.084030
+2023-04-07 10:47:37,3,5 1000 4547 -1 3  ,./perfexp--lq-list--stack-insfirst-allhead,350119000,5.016849,14.328982
+2023-04-07 10:47:42,2,5 10 144817 -1 2  ,./perfexp--cfa-cfa--stack-insfirst-allhead,112957260,5.043750,44.651844
+2023-04-07 10:47:47,3,5 100 72421 -1 3  ,./perfexp--upp-upp--stack-insfirst-allhead,159326200,5.151182,32.331042
+2023-04-07 10:47:52,1,5 10000 569 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,529170000,5.005851,9.459816
+2023-04-07 10:47:57,1,5 1 6553621 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,39321726,5.456614,138.768425
+2023-04-07 10:48:04,5,5 1 1638431 -1 5  ,./perfexp--lq-list--stack-insfirst-allhead,50791361,5.166060,101.711391
+2023-04-07 10:48:10,1,5 1 3276803 -1 1  ,./perfexp--lq-list--stack-insfirst-allhead,45875242,5.209676,113.561821
+2023-04-07 10:48:16,5,5 1 2317057 -1 5  ,./perfexp--cpp-stlref--stack-insfirst-allhead,129755192,5.096831,39.280363
+2023-04-07 10:48:21,3,5 100000 19 -1 3  ,./perfexp--cfa-cfa--stack-insfirst-allhead,665000000,5.012923,7.538230
+2023-04-07 10:48:26,5,5 10 144817 -1 5  ,./perfexp--lq-tailq--stack-insfirst-allhead,117301770,5.030084,42.881569
+2023-04-07 10:48:31,4,5 1 1638431 -1 4  ,./perfexp--lq-tailq--stack-insfirst-allhead,50791361,5.159719,101.586547
+2023-04-07 10:48:37,1,5 100000 71 -1 1  ,./perfexp--upp-upp--stack-insfirst-allhead,788100000,5.000492,6.344997
+2023-04-07 10:48:42,1,5 10000 101 -1 1  ,./perfexp--lq-tailq--stack-insfirst-allhead,763560000,5.004260,6.553853
Index: doc/theses/rob_schluntz_MMath/thesis.bib
===================================================================
--- doc/theses/rob_schluntz_MMath/thesis.bib	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ doc/theses/rob_schluntz_MMath/thesis.bib	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
Index: driver/cfa.cc
===================================================================
--- driver/cfa.cc	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ driver/cfa.cc	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -10,6 +10,6 @@
 // Created On       : Tue Aug 20 13:44:49 2002
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Feb 14 22:46:38 2023
-// Update Count     : 470
+// Last Modified On : Mon Apr 10 21:16:00 2023
+// Update Count     : 476
 //
 
@@ -44,4 +44,8 @@
 	static int flags = 0;
 
+    // This allocation 'leaks' memory from the program to the execution
+    // environment, as putenv does not manage the storage of the string used
+    // as an environment variable. This leak is necessary to ensure the
+    // underlying C string is allocated long enough.
 	if ( putenv( (char *)( *new string( string( __CFA_FLAGPREFIX__ + to_string( flags++ ) + "__=" ) + arg ) ).c_str() ) ) {
 		cerr << argv[0] << " error, cannot set environment variable." << endl;
@@ -198,23 +202,27 @@
 				} // if
 			} else if ( arg == "-CFA" ) {
-				CFA_flag = true;						// strip the -CFA flag
+				CFA_flag = true;						// strip -CFA flag
 				link = false;
 				args[nargs++] = "-fsyntax-only";		// stop after stage 2
 			} else if ( arg == "-debug" ) {
-				debug = true;							// strip the debug flag
+				debug = true;							// strip debug flag
 			} else if ( arg == "-nodebug" ) {
-				debug = false;							// strip the nodebug flag
+				debug = false;							// strip nodebug flag
 			} else if ( arg == "-quiet" ) {
-				quiet = true;							// strip the quiet flag
+				quiet = true;							// strip quiet flag
 			} else if ( arg == "-noquiet" ) {
-				quiet = false;							// strip the noquiet flag
+				quiet = false;							// strip noquiet flag
+			} else if ( arg == "-invariant" ) {
+				Putenv( argv, "-" + arg );
+			} else if ( arg == "--invariant" ) {
+				Putenv( argv, arg );
 			} else if ( arg == "-no-include-stdhdr" ) {
-				noincstd_flag = true;					// strip the no-include-stdhdr flag
+				noincstd_flag = true;					// strip no-include-stdhdr flag
 			} else if ( arg == "-nolib" ) {
-				nolib = true;							// strip the nolib flag
+				nolib = true;							// strip nolib flag
 			} else if ( arg == "-help" ) {
-				help = true;							// strip the help flag
+				help = true;							// strip help flag
 			} else if ( arg == "-nohelp" ) {
-				help = false;							// strip the nohelp flag
+				help = false;							// strip nohelp flag
 			} else if ( arg == "-cfalib") {
 				compiling_libs = true;
@@ -274,5 +282,5 @@
 				} // if
 			} else if ( prefix( arg, "-B" ) ) {
-				bprefix = arg.substr(2);				// strip the -B flag
+				bprefix = arg.substr(2);				// strip -B flag
 			} else if ( arg == "-c" || arg == "-S" || arg == "-E" || arg == "-M" || arg == "-MM" ) {
 				args[nargs++] = argv[i];				// pass flag along
Index: src/AST/Attribute.hpp
===================================================================
--- src/AST/Attribute.hpp	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/AST/Attribute.hpp	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -27,4 +27,5 @@
 class Expr;
 
+/// An entry in an attribute list: `__attribute__(( ... ))`
 class Attribute final : public Node {
 public:
Index: src/AST/Convert.cpp
===================================================================
--- src/AST/Convert.cpp	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/AST/Convert.cpp	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -559,5 +559,5 @@
 		auto stmt = new SuspendStmt();
 		stmt->then   = get<CompoundStmt>().accept1( node->then   );
-		switch(node->type) {
+		switch (node->kind) {
 			case ast::SuspendStmt::None     : stmt->type = SuspendStmt::None     ; break;
 			case ast::SuspendStmt::Coroutine: stmt->type = SuspendStmt::Coroutine; break;
@@ -1695,5 +1695,5 @@
 			GET_ACCEPT_V(attributes, Attribute),
 			{ old->get_funcSpec().val },
-			old->type->isVarArgs
+			(old->type->isVarArgs) ? ast::VariableArgs : ast::FixedArgs
 		};
 
@@ -2001,5 +2001,5 @@
 			GET_ACCEPT_1(else_, Stmt),
 			GET_ACCEPT_V(initialization, Stmt),
-			old->isDoWhile,
+			(old->isDoWhile) ? ast::DoWhile : ast::While,
 			GET_LABELS_V(old->labels)
 		);
@@ -2143,5 +2143,5 @@
 	virtual void visit( const SuspendStmt * old ) override final {
 		if ( inCache( old ) ) return;
-		ast::SuspendStmt::Type type;
+		ast::SuspendStmt::Kind type;
 		switch (old->type) {
 			case SuspendStmt::Coroutine: type = ast::SuspendStmt::Coroutine; break;
Index: src/AST/Decl.cpp
===================================================================
--- src/AST/Decl.cpp	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/AST/Decl.cpp	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -57,9 +57,9 @@
 	std::vector<ptr<DeclWithType>>&& params, std::vector<ptr<DeclWithType>>&& returns,
 	CompoundStmt * stmts, Storage::Classes storage, Linkage::Spec linkage,
-	std::vector<ptr<Attribute>>&& attrs, Function::Specs fs, bool isVarArgs)
+	std::vector<ptr<Attribute>>&& attrs, Function::Specs fs, ArgumentFlag isVarArgs )
 : DeclWithType( loc, name, storage, linkage, std::move(attrs), fs ),
 	type_params(std::move(forall)), assertions(),
 	params(std::move(params)), returns(std::move(returns)), stmts( stmts ) {
-	FunctionType * ftype = new FunctionType(static_cast<ArgumentFlag>(isVarArgs));
+	FunctionType * ftype = new FunctionType( isVarArgs );
 	for (auto & param : this->params) {
 		ftype->params.emplace_back(param->get_type());
@@ -81,10 +81,10 @@
 	std::vector<ptr<DeclWithType>>&& params, std::vector<ptr<DeclWithType>>&& returns,
 	CompoundStmt * stmts, Storage::Classes storage, Linkage::Spec linkage,
-	std::vector<ptr<Attribute>>&& attrs, Function::Specs fs, bool isVarArgs)
+	std::vector<ptr<Attribute>>&& attrs, Function::Specs fs, ArgumentFlag isVarArgs )
 : DeclWithType( location, name, storage, linkage, std::move(attrs), fs ),
 		type_params( std::move( forall) ), assertions( std::move( assertions ) ),
 		params( std::move(params) ), returns( std::move(returns) ),
 		type( nullptr ), stmts( stmts ) {
-	FunctionType * type = new FunctionType( (isVarArgs) ? VariableArgs : FixedArgs );
+	FunctionType * type = new FunctionType( isVarArgs );
 	for ( auto & param : this->params ) {
 		type->params.emplace_back( param->get_type() );
Index: src/AST/Decl.hpp
===================================================================
--- src/AST/Decl.hpp	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/AST/Decl.hpp	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -10,6 +10,6 @@
 // Created On       : Thu May 9 10:00:00 2019
 // Last Modified By : Andrew Beach
-// Last Modified On : Thu Nov 24  9:44:00 2022
-// Update Count     : 34
+// Last Modified On : Wed Apr  5 10:42:00 2023
+// Update Count     : 35
 //
 
@@ -122,4 +122,7 @@
 };
 
+/// Function variable arguments flag
+enum ArgumentFlag { FixedArgs, VariableArgs };
+
 /// Object declaration `int foo()`
 class FunctionDecl : public DeclWithType {
@@ -144,5 +147,5 @@
 		std::vector<ptr<DeclWithType>>&& params, std::vector<ptr<DeclWithType>>&& returns,
 		CompoundStmt * stmts, Storage::Classes storage = {}, Linkage::Spec linkage = Linkage::Cforall,
-		std::vector<ptr<Attribute>>&& attrs = {}, Function::Specs fs = {}, bool isVarArgs = false);
+		std::vector<ptr<Attribute>>&& attrs = {}, Function::Specs fs = {}, ArgumentFlag isVarArgs = FixedArgs );
 
 	FunctionDecl( const CodeLocation & location, const std::string & name,
@@ -150,5 +153,5 @@
 		std::vector<ptr<DeclWithType>>&& params, std::vector<ptr<DeclWithType>>&& returns,
 		CompoundStmt * stmts, Storage::Classes storage = {}, Linkage::Spec linkage = Linkage::Cforall,
-		std::vector<ptr<Attribute>>&& attrs = {}, Function::Specs fs = {}, bool isVarArgs = false);
+		std::vector<ptr<Attribute>>&& attrs = {}, Function::Specs fs = {}, ArgumentFlag isVarArgs = FixedArgs );
 
 	const Type * get_type() const override;
@@ -313,5 +316,5 @@
 public:
 	bool isTyped; // isTyped indicated if the enum has a declaration like:
-	// enum (type_optional) Name {...} 
+	// enum (type_optional) Name {...}
 	ptr<Type> base; // if isTyped == true && base.get() == nullptr, it is a "void" type enum
 	enum class EnumHiding { Visible, Hide } hide;
@@ -371,4 +374,5 @@
 };
 
+/// Assembly declaration: `asm ... ( "..." : ... )`
 class AsmDecl : public Decl {
 public:
Index: src/AST/Expr.hpp
===================================================================
--- src/AST/Expr.hpp	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/AST/Expr.hpp	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -254,4 +254,5 @@
 };
 
+/// A name qualified by a namespace or type.
 class QualifiedNameExpr final : public Expr {
 public:
@@ -259,5 +260,5 @@
 	std::string name;
 
-	QualifiedNameExpr( const CodeLocation & loc, const Decl * d, const std::string & n ) 
+	QualifiedNameExpr( const CodeLocation & loc, const Decl * d, const std::string & n )
 	: Expr( loc ), type_decl( d ), name( n ) {}
 
@@ -621,4 +622,5 @@
 };
 
+/// A name that refers to a generic dimension parameter.
 class DimensionExpr final : public Expr {
 public:
@@ -910,5 +912,4 @@
 };
 
-
 }
 
Index: src/AST/Init.hpp
===================================================================
--- src/AST/Init.hpp	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/AST/Init.hpp	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -117,5 +117,5 @@
 	ptr<Init> init;
 
-	ConstructorInit( 
+	ConstructorInit(
 		const CodeLocation & loc, const Stmt * ctor, const Stmt * dtor, const Init * init )
 	: Init( loc, MaybeConstruct ), ctor( ctor ), dtor( dtor ), init( init ) {}
Index: src/AST/Inspect.cpp
===================================================================
--- src/AST/Inspect.cpp	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/AST/Inspect.cpp	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -10,6 +10,6 @@
 // Created On       : Fri Jun 24 13:16:31 2022
 // Last Modified By : Andrew Beach
-// Last Modified On : Mon Oct  3 11:04:00 2022
-// Update Count     : 3
+// Last Modified On : Fri Apr 14 15:09:00 2023
+// Update Count     : 4
 //
 
@@ -168,3 +168,7 @@
 }
 
+bool isUnnamedBitfield( const ast::ObjectDecl * obj ) {
+	return obj && obj->name.empty() && obj->bitfieldWidth;
+}
+
 } // namespace ast
Index: src/AST/Inspect.hpp
===================================================================
--- src/AST/Inspect.hpp	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/AST/Inspect.hpp	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -10,6 +10,6 @@
 // Created On       : Fri Jun 24 13:16:31 2022
 // Last Modified By : Andrew Beach
-// Last Modified On : Thr Sep 22 13:44:00 2022
-// Update Count     : 2
+// Last Modified On : Fri Apr 14 15:09:00 2023
+// Update Count     : 3
 //
 
@@ -38,3 +38,6 @@
 const ApplicationExpr * isIntrinsicCallExpr( const Expr * expr );
 
+/// Returns true if obj's name is the empty string and it has a bitfield width.
+bool isUnnamedBitfield( const ObjectDecl * obj );
+
 }
Index: src/AST/Pass.impl.hpp
===================================================================
--- src/AST/Pass.impl.hpp	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/AST/Pass.impl.hpp	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -2075,5 +2075,4 @@
 	if ( __visit_children() ) {
 		maybe_accept( node, &TupleType::types );
-		maybe_accept( node, &TupleType::members );
 	}
 
Index: src/AST/Print.cpp
===================================================================
--- src/AST/Print.cpp	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/AST/Print.cpp	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -766,8 +766,8 @@
 	virtual const ast::Stmt * visit( const ast::SuspendStmt * node ) override final {
 		os << "Suspend Statement";
-		switch (node->type) {
-			case ast::SuspendStmt::None     : os << " with implicit target"; break;
-			case ast::SuspendStmt::Generator: os << " for generator"; break;
-			case ast::SuspendStmt::Coroutine: os << " for coroutine"; break;
+		switch (node->kind) {
+		case ast::SuspendStmt::None     : os << " with implicit target"; break;
+		case ast::SuspendStmt::Generator: os << " for generator"; break;
+		case ast::SuspendStmt::Coroutine: os << " for coroutine"; break;
 		}
 		os << endl;
Index: src/AST/Stmt.hpp
===================================================================
--- src/AST/Stmt.hpp	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/AST/Stmt.hpp	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -10,6 +10,6 @@
 // Created On       : Wed May  8 13:00:00 2019
 // Last Modified By : Andrew Beach
-// Last Modified On : Wed Apr 20 14:34:00 2022
-// Update Count     : 36
+// Last Modified On : Wed Apr  5 10:34:00 2023
+// Update Count     : 37
 //
 
@@ -205,4 +205,7 @@
 };
 
+// A while loop or a do-while loop:
+enum WhileDoKind { While, DoWhile };
+
 // While loop: while (...) ... else ... or do ... while (...) else ...;
 class WhileDoStmt final : public Stmt {
@@ -212,12 +215,12 @@
 	ptr<Stmt> else_;
 	std::vector<ptr<Stmt>> inits;
-	bool isDoWhile;
+	WhileDoKind isDoWhile;
 
 	WhileDoStmt( const CodeLocation & loc, const Expr * cond, const Stmt * body,
-				 const std::vector<ptr<Stmt>> && inits, bool isDoWhile = false, const std::vector<Label> && labels = {} )
+				 const std::vector<ptr<Stmt>> && inits, WhileDoKind isDoWhile = While, const std::vector<Label> && labels = {} )
 		: Stmt(loc, std::move(labels)), cond(cond), body(body), else_(nullptr), inits(std::move(inits)), isDoWhile(isDoWhile) {}
 
 	WhileDoStmt( const CodeLocation & loc, const Expr * cond, const Stmt * body, const Stmt * else_,
-				 const std::vector<ptr<Stmt>> && inits, bool isDoWhile = false, const std::vector<Label> && labels = {} )
+				 const std::vector<ptr<Stmt>> && inits, WhileDoKind isDoWhile = While, const std::vector<Label> && labels = {} )
 		: Stmt(loc, std::move(labels)), cond(cond), body(body), else_(else_), inits(std::move(inits)), isDoWhile(isDoWhile) {}
 
@@ -364,8 +367,8 @@
   public:
 	ptr<CompoundStmt> then;
-	enum Type { None, Coroutine, Generator } type = None;
-
-	SuspendStmt( const CodeLocation & loc, const CompoundStmt * then, Type type, const std::vector<Label> && labels = {} )
-		: Stmt(loc, std::move(labels)), then(then), type(type) {}
+	enum Kind { None, Coroutine, Generator } kind = None;
+
+	SuspendStmt( const CodeLocation & loc, const CompoundStmt * then, Kind kind, const std::vector<Label> && labels = {} )
+		: Stmt(loc, std::move(labels)), then(then), kind(kind) {}
 
 	const Stmt * accept( Visitor & v ) const override { return v.visit( this ); }
@@ -424,4 +427,5 @@
 };
 
+// Clause in a waitfor statement: waitfor (..., ...) ...
 class WaitForClause final : public WhenClause {
   public:
@@ -527,4 +531,5 @@
 	MUTATE_FRIEND
 };
+
 } // namespace ast
 
Index: src/AST/SymbolTable.cpp
===================================================================
--- src/AST/SymbolTable.cpp	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/AST/SymbolTable.cpp	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -260,10 +260,10 @@
 void SymbolTable::addId( const DeclWithType * decl, const Expr * baseExpr ) {
 	// default handling of conflicts is to raise an error
-	addId( decl, OnConflict::error(), baseExpr, decl->isDeleted ? decl : nullptr );
+	addIdCommon( decl, OnConflict::error(), baseExpr, decl->isDeleted ? decl : nullptr );
 }
 
 void SymbolTable::addDeletedId( const DeclWithType * decl, const Decl * deleter ) {
 	// default handling of conflicts is to raise an error
-	addId( decl, OnConflict::error(), nullptr, deleter );
+	addIdCommon( decl, OnConflict::error(), nullptr, deleter );
 }
 
@@ -677,10 +677,10 @@
 }
 
-void SymbolTable::addId(
-		const DeclWithType * decl, SymbolTable::OnConflict handleConflicts, const Expr * baseExpr,
-		const Decl * deleter ) {
+void SymbolTable::addIdCommon(
+		const DeclWithType * decl, SymbolTable::OnConflict handleConflicts,
+		const Expr * baseExpr, const Decl * deleter ) {
 	SpecialFunctionKind kind = getSpecialFunctionKind(decl->name);
 	if (kind == NUMBER_OF_KINDS) { // not a special decl
-		addId(decl, decl->name, idTable, handleConflicts, baseExpr, deleter);
+		addIdToTable(decl, decl->name, idTable, handleConflicts, baseExpr, deleter);
 	}
 	else {
@@ -695,11 +695,12 @@
 			assertf(false, "special decl with non-function type");
 		}
-		addId(decl, key, specialFunctionTable[kind], handleConflicts, baseExpr, deleter);
-	}
-}
-
-void SymbolTable::addId(
-		const DeclWithType * decl, const std::string & lookupKey, IdTable::Ptr & table, SymbolTable::OnConflict handleConflicts, const Expr * baseExpr,
-		const Decl * deleter ) {
+		addIdToTable(decl, key, specialFunctionTable[kind], handleConflicts, baseExpr, deleter);
+	}
+}
+
+void SymbolTable::addIdToTable(
+		const DeclWithType * decl, const std::string & lookupKey,
+		IdTable::Ptr & table, SymbolTable::OnConflict handleConflicts,
+		const Expr * baseExpr, const Decl * deleter ) {
 	++*stats().add_calls;
 	const std::string &name = decl->name;
@@ -778,22 +779,22 @@
 void SymbolTable::addMembers(
 		const AggregateDecl * aggr, const Expr * expr, SymbolTable::OnConflict handleConflicts ) {
-	for ( const Decl * decl : aggr->members ) {
-		if ( auto dwt = dynamic_cast< const DeclWithType * >( decl ) ) {
-			addId( dwt, handleConflicts, expr );
-			if ( dwt->name == "" ) {
-				const Type * t = dwt->get_type()->stripReferences();
-				if ( auto rty = dynamic_cast<const BaseInstType *>( t ) ) {
-					if ( ! dynamic_cast<const StructInstType *>(rty)
-						&& ! dynamic_cast<const UnionInstType *>(rty) ) continue;
-					ResolvExpr::Cost cost = ResolvExpr::Cost::zero;
-					ast::ptr<ast::TypeSubstitution> tmp = expr->env;
-					expr = mutate_field(expr, &Expr::env, nullptr);
-					const Expr * base = ResolvExpr::referenceToRvalueConversion( expr, cost );
-					base = mutate_field(base, &Expr::env, tmp);
-
-					addMembers(
-						rty->aggr(), new MemberExpr{ base->location, dwt, base }, handleConflicts );
-				}
-			}
+	for ( const ptr<Decl> & decl : aggr->members ) {
+		auto dwt = decl.as<DeclWithType>();
+		if ( nullptr == dwt ) continue;
+		addIdCommon( dwt, handleConflicts, expr );
+		// Inline through unnamed struct/union members.
+		if ( "" != dwt->name ) continue;
+		const Type * t = dwt->get_type()->stripReferences();
+		if ( auto rty = dynamic_cast<const BaseInstType *>( t ) ) {
+			if ( ! dynamic_cast<const StructInstType *>(rty)
+				&& ! dynamic_cast<const UnionInstType *>(rty) ) continue;
+			ResolvExpr::Cost cost = ResolvExpr::Cost::zero;
+			ast::ptr<ast::TypeSubstitution> tmp = expr->env;
+			expr = mutate_field(expr, &Expr::env, nullptr);
+			const Expr * base = ResolvExpr::referenceToRvalueConversion( expr, cost );
+			base = mutate_field(base, &Expr::env, tmp);
+
+			addMembers(
+				rty->aggr(), new MemberExpr{ base->location, dwt, base }, handleConflicts );
 		}
 	}
Index: src/AST/SymbolTable.hpp
===================================================================
--- src/AST/SymbolTable.hpp	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/AST/SymbolTable.hpp	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -192,13 +192,14 @@
 
 	/// common code for addId, addDeletedId, etc.
-	void addId(
-		const DeclWithType * decl, OnConflict handleConflicts, const Expr * baseExpr = nullptr,
-		const Decl * deleter = nullptr );
+	void addIdCommon(
+		const DeclWithType * decl, OnConflict handleConflicts,
+		const Expr * baseExpr = nullptr, const Decl * deleter = nullptr );
 
 	/// common code for addId when special decls are placed into separate tables
-	void addId(
-		const DeclWithType * decl, const std::string & lookupKey, IdTable::Ptr & idTable, OnConflict handleConflicts, 
+	void addIdToTable(
+		const DeclWithType * decl, const std::string & lookupKey,
+		IdTable::Ptr & idTable, OnConflict handleConflicts,
 		const Expr * baseExpr = nullptr, const Decl * deleter = nullptr);
-	
+
 	/// adds all of the members of the Aggregate (addWith helper)
 	void addMembers( const AggregateDecl * aggr, const Expr * expr, OnConflict handleConflicts );
Index: src/AST/Type.cpp
===================================================================
--- src/AST/Type.cpp	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/AST/Type.cpp	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 13 15:00:00 2019
 // Last Modified By : Andrew Beach
-// Last Modified On : Thu Nov 24  9:49:00 2022
-// Update Count     : 6
+// Last Modified On : Thu Apr  6 15:59:00 2023
+// Update Count     : 7
 //
 
@@ -199,23 +199,5 @@
 
 TupleType::TupleType( std::vector<ptr<Type>> && ts, CV::Qualifiers q )
-: Type( q ), types( std::move(ts) ), members() {
-	// This constructor is awkward. `TupleType` needs to contain objects so that members can be
-	// named, but members without initializer nodes end up getting constructors, which breaks
-	// things. This happens because the object decls have to be visited so that their types are
-	// kept in sync with the types listed here. Ultimately, the types listed here should perhaps
-	// be eliminated and replaced with a list-view over members. The temporary solution is to
-	// make a `ListInit` with `maybeConstructed = false`, so when the object is visited it is not
-	// constructed. Potential better solutions include:
-	//   a) Separate `TupleType` from its declarations, into `TupleDecl` and `Tuple{Inst?}Type`,
-	//      similar to the aggregate types.
-	//   b) Separate initializer nodes better, e.g. add a `MaybeConstructed` node that is replaced
-	//      by `genInit`, rather than the current boolean flag.
-	members.reserve( types.size() );
-	for ( const Type * ty : types ) {
-		members.emplace_back( new ObjectDecl{
-			CodeLocation(), "", ty, new ListInit( CodeLocation(), {}, {}, NoConstruct ),
-			Storage::Classes{}, Linkage::Cforall } );
-	}
-}
+: Type( q ), types( std::move(ts) ) {}
 
 bool isUnboundType(const Type * type) {
Index: src/AST/Type.hpp
===================================================================
--- src/AST/Type.hpp	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/AST/Type.hpp	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -10,6 +10,6 @@
 // Created On       : Thu May 9 10:00:00 2019
 // Last Modified By : Andrew Beach
-// Last Modified On : Thu Nov 24  9:47:00 2022
-// Update Count     : 8
+// Last Modified On : Thu Apr  6 15:58:00 2023
+// Update Count     : 9
 //
 
@@ -265,7 +265,4 @@
 };
 
-/// Function variable arguments flag
-enum ArgumentFlag { FixedArgs, VariableArgs };
-
 /// Type of a function `[R1, R2](*)(P1, P2, P3)`
 class FunctionType final : public Type {
@@ -460,5 +457,4 @@
 public:
 	std::vector<ptr<Type>> types;
-	std::vector<ptr<Decl>> members;
 
 	TupleType( std::vector<ptr<Type>> && ts, CV::Qualifiers q = {} );
Index: src/Common/CodeLocationTools.cpp
===================================================================
--- src/Common/CodeLocationTools.cpp	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/Common/CodeLocationTools.cpp	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -210,9 +210,9 @@
 
 struct LeafKindVisitor : public ast::Visitor {
-	LeafKind kind;
+	LeafKind result;
 
 #define VISIT(node_type, return_type) \
 	const ast::return_type * visit( const ast::node_type * ) final { \
-		kind = LeafKind::node_type; \
+		result = LeafKind::node_type; \
 		return nullptr; \
 	}
@@ -224,7 +224,5 @@
 
 LeafKind get_leaf_kind( ast::Node const * node ) {
-	LeafKindVisitor visitor;
-	node->accept( visitor );
-	return visitor.kind;
+	return ast::Pass<LeafKindVisitor>::read( node );
 }
 
Index: src/Common/Iterate.hpp
===================================================================
--- src/Common/Iterate.hpp	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/Common/Iterate.hpp	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -20,5 +20,5 @@
 #include <iterator>
 
-// it's nice to actually be able to increment iterators by an arbitrary amount
+// Returns an iterator that is it advanced n times.
 template< class InputIt, class Distance >
 InputIt operator+( InputIt it, Distance n ) {
@@ -50,4 +50,8 @@
 
 // -----------------------------------------------------------------------------
+// Helper struct and function to support
+// for ( val_and_index : enumerate( container ) ) {}
+// which iterates through the container and tracks the index as well.
+
 template< typename T >
 struct enumerate_t {
@@ -109,4 +113,6 @@
 
 // -----------------------------------------------------------------------------
+// Helper function to transform one iterable container into another.
+
 template< typename OutType, typename Range, typename Functor >
 OutType map_range( const Range& range, Functor&& functor ) {
@@ -206,5 +212,7 @@
 // Helper struct and function to support
 // for ( val : lazy_map( container1, f ) ) {}
-// syntax to have a for each that iterates a container, mapping each element by applying f
+// syntax to have a for each that iterates a container,
+// mapping each element by applying f.
+
 template< typename T, typename Func >
 struct lambda_iterate_t {
Index: src/CompilationState.cc
===================================================================
--- src/CompilationState.cc	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/CompilationState.cc	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -9,7 +9,7 @@
 // Author           : Rob Schluntz
 // Created On       : Mon Ju1 30 10:47:01 2018
-// Last Modified By : Henry Xue
-// Last Modified On : Tue Jul 20 04:27:35 2021
-// Update Count     : 5
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Mon Apr 10 19:12:50 2023
+// Update Count     : 6
 //
 
@@ -27,4 +27,5 @@
 	expraltp = false,
 	genericsp = false,
+	invariant = false,
 	libcfap = false,
 	nopreludep = false,
Index: src/CompilationState.h
===================================================================
--- src/CompilationState.h	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/CompilationState.h	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -9,7 +9,7 @@
 // Author           : Rob Schluntz
 // Created On       : Mon Ju1 30 10:47:01 2018
-// Last Modified By : Henry Xue
-// Last Modified On : Tue Jul 20 04:27:35 2021
-// Update Count     : 5
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Mon Apr 10 19:12:53 2023
+// Update Count     : 6
 //
 
@@ -26,4 +26,5 @@
 	expraltp,
 	genericsp,
+	invariant,
 	libcfap,
 	nopreludep,
Index: src/Concurrency/KeywordsNew.cpp
===================================================================
--- src/Concurrency/KeywordsNew.cpp	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/Concurrency/KeywordsNew.cpp	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -779,5 +779,5 @@
 
 const ast::Stmt * SuspendKeyword::postvisit( const ast::SuspendStmt * stmt ) {
-	switch ( stmt->type ) {
+	switch ( stmt->kind ) {
 	case ast::SuspendStmt::None:
 		// Use the context to determain the implicit target.
Index: src/InitTweak/FixInitNew.cpp
===================================================================
--- src/InitTweak/FixInitNew.cpp	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/InitTweak/FixInitNew.cpp	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -14,8 +14,14 @@
 #include <utility>                     // for pair
 
+#include "AST/DeclReplacer.hpp"
+#include "AST/Expr.hpp"
 #include "AST/Inspect.hpp"             // for getFunction, getPointerBase, g...
+#include "AST/Node.hpp"
+#include "AST/Pass.hpp"
+#include "AST/Print.hpp"
+#include "AST/SymbolTable.hpp"
+#include "AST/Type.hpp"
 #include "CodeGen/GenType.h"           // for genPrettyType
 #include "CodeGen/OperatorTable.h"
-#include "Common/CodeLocationTools.hpp"
 #include "Common/PassVisitor.h"        // for PassVisitor, WithStmtsToAdd
 #include "Common/SemanticError.h"      // for SemanticError
@@ -28,4 +34,5 @@
 #include "ResolvExpr/Unify.h"          // for typesCompatible
 #include "SymTab/Autogen.h"            // for genImplicitCall
+#include "SymTab/GenImplicitCall.hpp"  // for genImplicitCall
 #include "SymTab/Indexer.h"            // for Indexer
 #include "SymTab/Mangler.h"            // for Mangler
@@ -45,12 +52,4 @@
 #include "Validate/FindSpecialDecls.h" // for dtorStmt, dtorStructDestroy
 
-#include "AST/Expr.hpp"
-#include "AST/Node.hpp"
-#include "AST/Pass.hpp"
-#include "AST/Print.hpp"
-#include "AST/SymbolTable.hpp"
-#include "AST/Type.hpp"
-#include "AST/DeclReplacer.hpp"
-
 extern bool ctordtorp; // print all debug
 extern bool ctorp; // print ctor debug
@@ -63,4 +62,42 @@
 namespace InitTweak {
 namespace {
+
+	// Shallow copy the pointer list for return.
+	std::vector<ast::ptr<ast::TypeDecl>> getGenericParams( const ast::Type * t ) {
+		if ( auto inst = dynamic_cast<const ast::StructInstType *>( t ) ) {
+			return inst->base->params;
+		}
+		if ( auto inst = dynamic_cast<const ast::UnionInstType *>( t ) ) {
+			return inst->base->params;
+		}
+		return {};
+	}
+
+	/// Given type T, generate type of default ctor/dtor, i.e. function type void (*) (T &).
+	ast::FunctionDecl * genDefaultFunc(
+			const CodeLocation loc,
+			const std::string fname,
+			const ast::Type * paramType,
+			bool maybePolymorphic = true) {
+		std::vector<ast::ptr<ast::TypeDecl>> typeParams;
+		if ( maybePolymorphic ) typeParams = getGenericParams( paramType );
+		auto dstParam = new ast::ObjectDecl( loc,
+			"_dst",
+			new ast::ReferenceType( paramType ),
+			nullptr,
+			{},
+			ast::Linkage::Cforall
+		);
+		return new ast::FunctionDecl( loc,
+			fname,
+			std::move(typeParams),
+			{dstParam},
+			{},
+			new ast::CompoundStmt(loc),
+			{},
+			ast::Linkage::Cforall
+		);
+	}
+
 	struct SelfAssignChecker {
 		void previsit( const ast::ApplicationExpr * appExpr );
@@ -121,5 +158,5 @@
 		void previsit( const ast::FunctionDecl * ) { visit_children = false; }
 
-	  protected:
+	protected:
 		ObjectSet curVars;
 	};
@@ -202,5 +239,5 @@
 
 		SemanticErrorException errors;
-	  private:
+	private:
 		template< typename... Params >
 		void emit( CodeLocation, const Params &... params );
@@ -288,5 +325,5 @@
 		static UniqueName dtorNamer( "__cleanup_dtor" );
 		std::string name = dtorNamer.newName();
-		ast::FunctionDecl * dtorFunc = SymTab::genDefaultFunc( loc, name, objDecl->type->stripReferences(), false );
+		ast::FunctionDecl * dtorFunc = genDefaultFunc( loc, name, objDecl->type->stripReferences(), false );
 		stmtsToAdd.push_back( new ast::DeclStmt(loc, dtorFunc ) );
 
@@ -1080,12 +1117,12 @@
 	void InsertDtors::previsit( const ast::BranchStmt * stmt ) {
 		switch( stmt->kind ) {
-		  case ast::BranchStmt::Continue:
-		  case ast::BranchStmt::Break:
+		case ast::BranchStmt::Continue:
+		case ast::BranchStmt::Break:
 			// could optimize the break/continue case, because the S_L-S_G check is unnecessary (this set should
 			// always be empty), but it serves as a small sanity check.
-		  case ast::BranchStmt::Goto:
+		case ast::BranchStmt::Goto:
 			handleGoto( stmt );
 			break;
-		  default:
+		default:
 			assert( false );
 		} // switch
@@ -1312,7 +1349,5 @@
 		// xxx - functions returning ast::ptr seems wrong...
 		auto res = ResolvExpr::findVoidExpression( untypedExpr, { symtab, transUnit().global } );
-		// Fix CodeLocation (at least until resolver is fixed).
-		auto fix = localFillCodeLocations( untypedExpr->location, res.release() );
-		return strict_dynamic_cast<const ast::Expr *>( fix );
+		return res.release();
 	}
 
Index: src/InitTweak/GenInit.cc
===================================================================
--- src/InitTweak/GenInit.cc	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/InitTweak/GenInit.cc	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -39,4 +39,5 @@
 #include "ResolvExpr/Resolver.h"
 #include "SymTab/Autogen.h"            // for genImplicitCall
+#include "SymTab/GenImplicitCall.hpp"  // for genImplicitCall
 #include "SymTab/Mangler.h"            // for Mangler
 #include "SynTree/LinkageSpec.h"       // for isOverridable, C
Index: src/Parser/DeclarationNode.cc
===================================================================
--- src/Parser/DeclarationNode.cc	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/Parser/DeclarationNode.cc	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -10,7 +10,9 @@
 // Created On       : Sat May 16 12:34:05 2015
 // Last Modified By : Andrew Beach
-// Last Modified On : Tue Apr  4 10:28:00 2023
-// Update Count     : 1392
+// Last Modified On : Thr Apr 20 11:46:00 2023
+// Update Count     : 1393
 //
+
+#include "DeclarationNode.h"
 
 #include <cassert>                 // for assert, assertf, strict_dynamic_cast
@@ -34,5 +36,7 @@
 #include "Common/UniqueName.h"     // for UniqueName
 #include "Common/utility.h"        // for maybeClone
-#include "Parser/ParseNode.h"      // for DeclarationNode, ExpressionNode
+#include "Parser/ExpressionNode.h" // for ExpressionNode
+#include "Parser/InitializerNode.h"// for InitializerNode
+#include "Parser/StatementNode.h"  // for StatementNode
 #include "TypeData.h"              // for TypeData, TypeData::Aggregate_t
 #include "TypedefTable.h"          // for TypedefTable
@@ -999,66 +1003,116 @@
 }
 
-void buildList( const DeclarationNode * firstNode,
+// If a typedef wraps an anonymous declaration, name the inner declaration
+// so it has a consistent name across translation units.
+static void nameTypedefedDecl(
+		DeclarationNode * innerDecl,
+		const DeclarationNode * outerDecl ) {
+	TypeData * outer = outerDecl->type;
+	assert( outer );
+	// First make sure this is a typedef:
+	if ( outer->kind != TypeData::Symbolic || !outer->symbolic.isTypedef ) {
+		return;
+	}
+	TypeData * inner = innerDecl->type;
+	assert( inner );
+	// Always clear any CVs associated with the aggregate:
+	inner->qualifiers.reset();
+	// Handle anonymous aggregates: typedef struct { int i; } foo
+	if ( inner->kind == TypeData::Aggregate && inner->aggregate.anon ) {
+		delete inner->aggregate.name;
+		inner->aggregate.name = new string( "__anonymous_" + *outerDecl->name );
+		inner->aggregate.anon = false;
+		assert( outer->base );
+		delete outer->base->aggInst.aggregate->aggregate.name;
+		outer->base->aggInst.aggregate->aggregate.name = new string( "__anonymous_" + *outerDecl->name );
+		outer->base->aggInst.aggregate->aggregate.anon = false;
+		outer->base->aggInst.aggregate->qualifiers.reset();
+	// Handle anonymous enumeration: typedef enum { A, B, C } foo
+	} else if ( inner->kind == TypeData::Enum && inner->enumeration.anon ) {
+		delete inner->enumeration.name;
+		inner->enumeration.name = new string( "__anonymous_" + *outerDecl->name );
+		inner->enumeration.anon = false;
+		assert( outer->base );
+		delete outer->base->aggInst.aggregate->enumeration.name;
+		outer->base->aggInst.aggregate->enumeration.name = new string( "__anonymous_" + *outerDecl->name );
+		outer->base->aggInst.aggregate->enumeration.anon = false;
+		// No qualifiers.reset() here.
+	}
+}
+
+// This code handles a special issue with the attribute transparent_union.
+//
+//    typedef union U { int i; } typedef_name __attribute__(( aligned(16) )) __attribute__(( transparent_union ))
+//
+// Here the attribute aligned goes with the typedef_name, so variables declared of this type are
+// aligned.  However, the attribute transparent_union must be moved from the typedef_name to
+// alias union U.  Currently, this is the only know attribute that must be moved from typedef to
+// alias.
+static void moveUnionAttribute( ast::Decl * decl, ast::UnionDecl * unionDecl ) {
+	if ( auto typedefDecl = dynamic_cast<ast::TypedefDecl *>( decl ) ) {
+		// Is the typedef alias a union aggregate?
+		if ( nullptr == unionDecl ) return;
+
+		// If typedef is an alias for a union, then its alias type was hoisted above and remembered.
+		if ( auto unionInstType = typedefDecl->base.as<ast::UnionInstType>() ) {
+			auto instType = ast::mutate( unionInstType );
+			// Remove all transparent_union attributes from typedef and move to alias union.
+			for ( auto attr = instType->attributes.begin() ; attr != instType->attributes.end() ; ) {
+				assert( *attr );
+				if ( (*attr)->name == "transparent_union" || (*attr)->name == "__transparent_union__" ) {
+					unionDecl->attributes.emplace_back( attr->release() );
+					attr = instType->attributes.erase( attr );
+				} else {
+					attr++;
+				}
+			}
+			typedefDecl->base = instType;
+		}
+	}
+}
+
+// Get the non-anonymous name of the instance type of the declaration,
+// if one exists.
+static const std::string * getInstTypeOfName( ast::Decl * decl ) {
+	if ( auto dwt = dynamic_cast<ast::DeclWithType *>( decl ) ) {
+		if ( auto aggr = dynamic_cast<ast::BaseInstType const *>( dwt->get_type() ) ) {
+			if ( aggr->name.find("anonymous") == std::string::npos ) {
+				return &aggr->name;
+			}
+		}
+	}
+	return nullptr;
+}
+
+void buildList( DeclarationNode * firstNode,
 		std::vector<ast::ptr<ast::Decl>> & outputList ) {
 	SemanticErrorException errors;
 	std::back_insert_iterator<std::vector<ast::ptr<ast::Decl>>> out( outputList );
 
-	for ( const DeclarationNode * cur = firstNode; cur; cur = dynamic_cast< DeclarationNode * >( cur->get_next() ) ) {
+	for ( const DeclarationNode * cur = firstNode ; cur ; cur = strict_next( cur ) ) {
 		try {
-			bool extracted = false, anon = false;
-			ast::AggregateDecl * unionDecl = nullptr;
+			bool extracted_named = false;
+			ast::UnionDecl * unionDecl = nullptr;
 
 			if ( DeclarationNode * extr = cur->extractAggregate() ) {
-				// Handle the case where a SUE declaration is contained within an object or type declaration.
-
 				assert( cur->type );
-				// Replace anonymous SUE name with typedef name to prevent anonymous naming problems across translation units.
-				if ( cur->type->kind == TypeData::Symbolic && cur->type->symbolic.isTypedef ) {
-					assert( extr->type );
-					// Handle anonymous aggregates: typedef struct { int i; } foo
-					extr->type->qualifiers.reset();		// clear any CVs associated with the aggregate
-					if ( extr->type->kind == TypeData::Aggregate && extr->type->aggregate.anon ) {
-						delete extr->type->aggregate.name;
-						extr->type->aggregate.name = new string( "__anonymous_" + *cur->name );
-						extr->type->aggregate.anon = false;
-						assert( cur->type->base );
-						if ( cur->type->base ) {
-							delete cur->type->base->aggInst.aggregate->aggregate.name;
-							cur->type->base->aggInst.aggregate->aggregate.name = new string( "__anonymous_" + *cur->name );
-							cur->type->base->aggInst.aggregate->aggregate.anon = false;
-							cur->type->base->aggInst.aggregate->qualifiers.reset();
-						} // if
-					} // if
-					// Handle anonymous enumeration: typedef enum { A, B, C } foo
-					if ( extr->type->kind == TypeData::Enum && extr->type->enumeration.anon ) {
-						delete extr->type->enumeration.name;
-						extr->type->enumeration.name = new string( "__anonymous_" + *cur->name );
-						extr->type->enumeration.anon = false;
-						assert( cur->type->base );
-						if ( cur->type->base ) {
-							delete cur->type->base->aggInst.aggregate->enumeration.name;
-							cur->type->base->aggInst.aggregate->enumeration.name = new string( "__anonymous_" + *cur->name );
-							cur->type->base->aggInst.aggregate->enumeration.anon = false;
-						} // if
-					} // if
-				} // if
-
-				ast::Decl * decl = extr->build();
-				if ( decl ) {
+				nameTypedefedDecl( extr, cur );
+
+				if ( ast::Decl * decl = extr->build() ) {
 					// Remember the declaration if it is a union aggregate ?
 					unionDecl = dynamic_cast<ast::UnionDecl *>( decl );
 
-					decl->location = cur->location;
 					*out++ = decl;
 
 					// need to remember the cases where a declaration contains an anonymous aggregate definition
-					extracted = true;
 					assert( extr->type );
 					if ( extr->type->kind == TypeData::Aggregate ) {
 						// typedef struct { int A } B is the only case?
-						anon = extr->type->aggregate.anon;
+						extracted_named = !extr->type->aggregate.anon;
 					} else if ( extr->type->kind == TypeData::Enum ) {
 						// typedef enum { A } B is the only case?
-						anon = extr->type->enumeration.anon;
+						extracted_named = !extr->type->enumeration.anon;
+					} else {
+						extracted_named = true;
 					}
 				} // if
@@ -1066,60 +1120,28 @@
 			} // if
 
-			ast::Decl * decl = cur->build();
-			if ( decl ) {
-				if ( auto typedefDecl = dynamic_cast<ast::TypedefDecl *>( decl ) ) {
-					if ( unionDecl ) {					// is the typedef alias a union aggregate ?
-						// This code handles a special issue with the attribute transparent_union.
-						//
-						//    typedef union U { int i; } typedef_name __attribute__(( aligned(16) )) __attribute__(( transparent_union ))
-						//
-						// Here the attribute aligned goes with the typedef_name, so variables declared of this type are
-						// aligned.  However, the attribute transparent_union must be moved from the typedef_name to
-						// alias union U.  Currently, this is the only know attribute that must be moved from typedef to
-						// alias.
-
-						// If typedef is an alias for a union, then its alias type was hoisted above and remembered.
-						if ( auto unionInstType = typedefDecl->base.as<ast::UnionInstType>() ) {
-							auto instType = ast::mutate( unionInstType );
-							// Remove all transparent_union attributes from typedef and move to alias union.
-							for ( auto attr = instType->attributes.begin() ; attr != instType->attributes.end() ; ) { // forward order
-								assert( *attr );
-								if ( (*attr)->name == "transparent_union" || (*attr)->name == "__transparent_union__" ) {
-									unionDecl->attributes.emplace_back( attr->release() );
-									attr = instType->attributes.erase( attr );
-								} else {
-									attr++;
-								} // if
-							} // for
-							typedefDecl->base = instType;
-						} // if
-					} // if
+			if ( ast::Decl * decl = cur->build() ) {
+				moveUnionAttribute( decl, unionDecl );
+
+				if ( "" == decl->name && !cur->get_inLine() ) {
+					// Don't include anonymous declaration for named aggregates,
+					// but do include them for anonymous aggregates, e.g.:
+					// struct S {
+					//   struct T { int x; }; // no anonymous member
+					//   struct { int y; };   // anonymous member
+					//   struct T;            // anonymous member
+					// };
+					if ( extracted_named ) {
+						continue;
+					}
+
+					if ( auto name = getInstTypeOfName( decl ) ) {
+						// Temporary: warn about anonymous member declarations of named types, since
+						// this conflicts with the syntax for the forward declaration of an anonymous type.
+						SemanticWarning( cur->location, Warning::AggrForwardDecl, name->c_str() );
+					}
 				} // if
-
-				// don't include anonymous declaration for named aggregates, but do include them for anonymous aggregates, e.g.:
-				// struct S {
-				//   struct T { int x; }; // no anonymous member
-				//   struct { int y; };   // anonymous member
-				//   struct T;            // anonymous member
-				// };
-				if ( ! (extracted && decl->name == "" && ! anon && ! cur->get_inLine()) ) {
-					if ( decl->name == "" ) {
-						if ( auto dwt = dynamic_cast<ast::DeclWithType *>( decl ) ) {
-							if ( auto aggr = dynamic_cast<ast::BaseInstType const *>( dwt->get_type() ) ) {
-								if ( aggr->name.find("anonymous") == std::string::npos ) {
-									if ( ! cur->get_inLine() ) {
-										// temporary: warn about anonymous member declarations of named types, since
-										// this conflicts with the syntax for the forward declaration of an anonymous type
-										SemanticWarning( cur->location, Warning::AggrForwardDecl, aggr->name.c_str() );
-									} // if
-								} // if
-							} // if
-						} // if
-					} // if
-					decl->location = cur->location;
-					*out++ = decl;
-				} // if
+				*out++ = decl;
 			} // if
-		} catch( SemanticErrorException & e ) {
+		} catch ( SemanticErrorException & e ) {
 			errors.append( e );
 		} // try
@@ -1132,12 +1154,12 @@
 
 // currently only builds assertions, function parameters, and return values
-void buildList( const DeclarationNode * firstNode, std::vector<ast::ptr<ast::DeclWithType>> & outputList ) {
+void buildList( DeclarationNode * firstNode, std::vector<ast::ptr<ast::DeclWithType>> & outputList ) {
 	SemanticErrorException errors;
 	std::back_insert_iterator<std::vector<ast::ptr<ast::DeclWithType>>> out( outputList );
 
-	for ( const DeclarationNode * cur = firstNode; cur; cur = dynamic_cast< DeclarationNode * >( cur->get_next() ) ) {
+	for ( const DeclarationNode * cur = firstNode; cur; cur = strict_next( cur ) ) {
 		try {
 			ast::Decl * decl = cur->build();
-			assert( decl );
+			assertf( decl, "buildList: build for ast::DeclWithType." );
 			if ( ast::DeclWithType * dwt = dynamic_cast<ast::DeclWithType *>( decl ) ) {
 				dwt->location = cur->location;
@@ -1168,6 +1190,8 @@
 				);
 				*out++ = obj;
+			} else {
+				assertf( false, "buildList: Could not convert to ast::DeclWithType." );
 			} // if
-		} catch( SemanticErrorException & e ) {
+		} catch ( SemanticErrorException & e ) {
 			errors.append( e );
 		} // try
@@ -1183,14 +1207,12 @@
 	SemanticErrorException errors;
 	std::back_insert_iterator<std::vector<ast::ptr<ast::Type>>> out( outputList );
-	const DeclarationNode * cur = firstNode;
-
-	while ( cur ) {
+
+	for ( const DeclarationNode * cur = firstNode ; cur ; cur = strict_next( cur ) ) {
 		try {
 			* out++ = cur->buildType();
-		} catch( SemanticErrorException & e ) {
+		} catch ( SemanticErrorException & e ) {
 			errors.append( e );
 		} // try
-		cur = dynamic_cast< DeclarationNode * >( cur->get_next() );
-	} // while
+	} // for
 
 	if ( ! errors.isEmpty() ) {
Index: src/Parser/DeclarationNode.h
===================================================================
--- src/Parser/DeclarationNode.h	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
+++ src/Parser/DeclarationNode.h	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -0,0 +1,219 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// DeclarationNode.h --
+//
+// Author           : Andrew Beach
+// Created On       : Wed Apr  5 11:38:00 2023
+// Last Modified By : Andrew Beach
+// Last Modified On : Wed Apr  5 11:55:00 2023
+// Update Count     : 0
+//
+
+#pragma once
+
+#include "ParseNode.h"
+
+struct TypeData;
+class InitializerNode;
+
+struct DeclarationNode : public ParseNode {
+	// These enumerations must harmonize with their names in DeclarationNode.cc.
+	enum BasicType {
+		Void, Bool, Char, Int, Int128,
+		Float, Double, LongDouble, uuFloat80, uuFloat128,
+		uFloat16, uFloat32, uFloat32x, uFloat64, uFloat64x, uFloat128, uFloat128x,
+		NoBasicType
+	};
+	static const char * basicTypeNames[];
+	enum ComplexType { Complex, NoComplexType, Imaginary };
+	// Imaginary unsupported => parse, but make invisible and print error message
+	static const char * complexTypeNames[];
+	enum Signedness { Signed, Unsigned, NoSignedness };
+	static const char * signednessNames[];
+	enum Length { Short, Long, LongLong, NoLength };
+	static const char * lengthNames[];
+	enum BuiltinType { Valist, AutoType, Zero, One, NoBuiltinType };
+	static const char * builtinTypeNames[];
+
+	static DeclarationNode * newStorageClass( ast::Storage::Classes );
+	static DeclarationNode * newFuncSpecifier( ast::Function::Specs );
+	static DeclarationNode * newTypeQualifier( ast::CV::Qualifiers );
+	static DeclarationNode * newBasicType( BasicType );
+	static DeclarationNode * newComplexType( ComplexType );
+	static DeclarationNode * newSignedNess( Signedness );
+	static DeclarationNode * newLength( Length );
+	static DeclarationNode * newBuiltinType( BuiltinType );
+	static DeclarationNode * newForall( DeclarationNode * );
+	static DeclarationNode * newFromTypedef( const std::string * );
+	static DeclarationNode * newFromGlobalScope();
+	static DeclarationNode * newQualifiedType( DeclarationNode *, DeclarationNode * );
+	static DeclarationNode * newFunction( const std::string * name, DeclarationNode * ret, DeclarationNode * param, StatementNode * body );
+	static DeclarationNode * newAggregate( ast::AggregateDecl::Aggregate kind, const std::string * name, ExpressionNode * actuals, DeclarationNode * fields, bool body );
+	static DeclarationNode * newEnum( const std::string * name, DeclarationNode * constants, bool body, bool typed, DeclarationNode * base = nullptr, EnumHiding hiding = EnumHiding::Visible );
+	static DeclarationNode * newEnumConstant( const std::string * name, ExpressionNode * constant );
+	static DeclarationNode * newEnumValueGeneric( const std::string * name, InitializerNode * init );
+	static DeclarationNode * newEnumInLine( const std::string name );
+	static DeclarationNode * newName( const std::string * );
+	static DeclarationNode * newFromTypeGen( const std::string *, ExpressionNode * params );
+	static DeclarationNode * newTypeParam( ast::TypeDecl::Kind, const std::string * );
+	static DeclarationNode * newTrait( const std::string * name, DeclarationNode * params, DeclarationNode * asserts );
+	static DeclarationNode * newTraitUse( const std::string * name, ExpressionNode * params );
+	static DeclarationNode * newTypeDecl( const std::string * name, DeclarationNode * typeParams );
+	static DeclarationNode * newPointer( DeclarationNode * qualifiers, OperKinds kind );
+	static DeclarationNode * newArray( ExpressionNode * size, DeclarationNode * qualifiers, bool isStatic );
+	static DeclarationNode * newVarArray( DeclarationNode * qualifiers );
+	static DeclarationNode * newBitfield( ExpressionNode * size );
+	static DeclarationNode * newTuple( DeclarationNode * members );
+	static DeclarationNode * newTypeof( ExpressionNode * expr, bool basetypeof = false );
+	static DeclarationNode * newVtableType( DeclarationNode * expr );
+	static DeclarationNode * newAttribute( const std::string *, ExpressionNode * expr = nullptr ); // gcc attributes
+	static DeclarationNode * newDirectiveStmt( StatementNode * stmt ); // gcc external directive statement
+	static DeclarationNode * newAsmStmt( StatementNode * stmt ); // gcc external asm statement
+	static DeclarationNode * newStaticAssert( ExpressionNode * condition, ast::Expr * message );
+
+	DeclarationNode();
+	~DeclarationNode();
+	DeclarationNode * clone() const override;
+
+	DeclarationNode * addQualifiers( DeclarationNode * );
+	void checkQualifiers( const TypeData *, const TypeData * );
+	void checkSpecifiers( DeclarationNode * );
+	DeclarationNode * copySpecifiers( DeclarationNode * );
+	DeclarationNode * addType( DeclarationNode * );
+	DeclarationNode * addTypedef();
+	DeclarationNode * addEnumBase( DeclarationNode * );
+	DeclarationNode * addAssertions( DeclarationNode * );
+	DeclarationNode * addName( std::string * );
+	DeclarationNode * addAsmName( DeclarationNode * );
+	DeclarationNode * addBitfield( ExpressionNode * size );
+	DeclarationNode * addVarArgs();
+	DeclarationNode * addFunctionBody( StatementNode * body, ExpressionNode * with = nullptr );
+	DeclarationNode * addOldDeclList( DeclarationNode * list );
+	DeclarationNode * setBase( TypeData * newType );
+	DeclarationNode * copyAttribute( DeclarationNode * attr );
+	DeclarationNode * addPointer( DeclarationNode * qualifiers );
+	DeclarationNode * addArray( DeclarationNode * array );
+	DeclarationNode * addNewPointer( DeclarationNode * pointer );
+	DeclarationNode * addNewArray( DeclarationNode * array );
+	DeclarationNode * addParamList( DeclarationNode * list );
+	DeclarationNode * addIdList( DeclarationNode * list ); // old-style functions
+	DeclarationNode * addInitializer( InitializerNode * init );
+	DeclarationNode * addTypeInitializer( DeclarationNode * init );
+
+	DeclarationNode * cloneType( std::string * newName );
+	DeclarationNode * cloneBaseType( DeclarationNode * newdecl );
+
+	DeclarationNode * appendList( DeclarationNode * node ) {
+		return (DeclarationNode *)set_last( node );
+	}
+
+	virtual void print( __attribute__((unused)) std::ostream & os, __attribute__((unused)) int indent = 0 ) const override;
+	virtual void printList( __attribute__((unused)) std::ostream & os, __attribute__((unused)) int indent = 0 ) const override;
+
+	ast::Decl * build() const;
+	ast::Type * buildType() const;
+
+	ast::Linkage::Spec get_linkage() const { return linkage; }
+	DeclarationNode * extractAggregate() const;
+	bool has_enumeratorValue() const { return (bool)enumeratorValue; }
+	ExpressionNode * consume_enumeratorValue() const { return const_cast<DeclarationNode *>(this)->enumeratorValue.release(); }
+
+	bool get_extension() const { return extension; }
+	DeclarationNode * set_extension( bool exten ) { extension = exten; return this; }
+
+	bool get_inLine() const { return inLine; }
+	DeclarationNode * set_inLine( bool inL ) { inLine = inL; return this; }
+
+	DeclarationNode * get_last() { return (DeclarationNode *)ParseNode::get_last(); }
+
+	struct Variable_t {
+//		const std::string * name;
+		ast::TypeDecl::Kind tyClass;
+		DeclarationNode * assertions;
+		DeclarationNode * initializer;
+	};
+	Variable_t variable;
+
+	struct StaticAssert_t {
+		ExpressionNode * condition;
+		ast::Expr * message;
+	};
+	StaticAssert_t assert;
+
+	BuiltinType builtin = NoBuiltinType;
+
+	TypeData * type = nullptr;
+
+	bool inLine = false;
+	bool enumInLine = false;
+	ast::Function::Specs funcSpecs;
+	ast::Storage::Classes storageClasses;
+
+	ExpressionNode * bitfieldWidth = nullptr;
+	std::unique_ptr<ExpressionNode> enumeratorValue;
+	bool hasEllipsis = false;
+	ast::Linkage::Spec linkage;
+	ast::Expr * asmName = nullptr;
+	std::vector<ast::ptr<ast::Attribute>> attributes;
+	InitializerNode * initializer = nullptr;
+	bool extension = false;
+	std::string error;
+	StatementNode * asmStmt = nullptr;
+	StatementNode * directiveStmt = nullptr;
+
+	static UniqueName anonymous;
+}; // DeclarationNode
+
+ast::Type * buildType( TypeData * type );
+
+static inline ast::Type * maybeMoveBuildType( const DeclarationNode * orig ) {
+	ast::Type * ret = orig ? orig->buildType() : nullptr;
+	delete orig;
+	return ret;
+}
+
+template<typename NodeType>
+NodeType * strict_next( NodeType * node ) {
+	ParseNode * next = node->get_next();
+	if ( nullptr == next ) return nullptr;
+	if ( NodeType * ret = dynamic_cast<NodeType *>( next ) ) return ret;
+	SemanticError( next->location, "internal error, non-homogeneous nodes founds in buildList processing." );
+}
+
+// This generic buildList is here along side its overloads.
+template<typename AstType, typename NodeType,
+		template<typename, typename...> class Container, typename... Args>
+void buildList( NodeType * firstNode,
+		Container<ast::ptr<AstType>, Args...> & output ) {
+	SemanticErrorException errors;
+	std::back_insert_iterator<Container<ast::ptr<AstType>, Args...>> out( output );
+
+	for ( NodeType * cur = firstNode ; cur ; cur = strict_next( cur ) ) {
+		try {
+			AstType * node = dynamic_cast<AstType *>( maybeBuild( cur ) );
+			assertf( node, "buildList: Did not build node of correct type." );
+			*out++ = node;
+		} catch ( SemanticErrorException & e ) {
+			errors.append( e );
+		} // try
+	} // for
+	if ( ! errors.isEmpty() ) {
+		throw errors;
+	} // if
+}
+
+void buildList( DeclarationNode * firstNode, std::vector<ast::ptr<ast::Decl>> & outputList );
+void buildList( DeclarationNode * firstNode, std::vector<ast::ptr<ast::DeclWithType>> & outputList );
+void buildTypeList( const DeclarationNode * firstNode, std::vector<ast::ptr<ast::Type>> & outputList );
+
+template<typename AstType, typename NodeType,
+		template<typename, typename...> class Container, typename... Args>
+void buildMoveList( NodeType * firstNode,
+		Container<ast::ptr<AstType>, Args...> & output ) {
+	buildList<AstType, NodeType, Container, Args...>( firstNode, output );
+	delete firstNode;
+}
Index: src/Parser/ExpressionNode.cc
===================================================================
--- src/Parser/ExpressionNode.cc	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/Parser/ExpressionNode.cc	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -13,4 +13,6 @@
 // Update Count     : 1083
 //
+
+#include "ExpressionNode.h"
 
 #include <cassert>                 // for assert
@@ -25,5 +27,6 @@
 #include "Common/SemanticError.h"  // for SemanticError
 #include "Common/utility.h"        // for maybeMoveBuild, maybeBuild, CodeLo...
-#include "ParseNode.h"             // for ExpressionNode, maybeMoveBuildType
+#include "DeclarationNode.h"       // for DeclarationNode
+#include "InitializerNode.h"       // for InitializerNode
 #include "parserutility.h"         // for notZeroExpr
 
@@ -699,11 +702,4 @@
 } // build_binary_val
 
-ast::Expr * build_binary_ptr( const CodeLocation & location,
-		OperKinds op,
-		ExpressionNode * expr_node1,
-		ExpressionNode * expr_node2 ) {
-	return build_binary_val( location, op, expr_node1, expr_node2 );
-} // build_binary_ptr
-
 ast::Expr * build_cond( const CodeLocation & location,
 		ExpressionNode * expr_node1,
Index: src/Parser/ExpressionNode.h
===================================================================
--- src/Parser/ExpressionNode.h	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
+++ src/Parser/ExpressionNode.h	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -0,0 +1,84 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// ExpressionNode.h --
+//
+// Author           : Andrew Beach
+// Created On       : Wed Apr  5 11:34:00 2023
+// Last Modified By : Andrew Beach
+// Last Modified On : Wed Apr  5 11:50:00 2023
+// Update Count     : 0
+//
+
+#pragma once
+
+#include "ParseNode.h"
+
+class InitializerNode;
+
+class ExpressionNode final : public ParseNode {
+public:
+	ExpressionNode( ast::Expr * expr = nullptr ) : expr( expr ) {}
+	virtual ~ExpressionNode() {}
+	virtual ExpressionNode * clone() const override {
+		if ( nullptr == expr ) return nullptr;
+		return static_cast<ExpressionNode*>(
+			(new ExpressionNode( ast::shallowCopy( expr.get() ) ))->set_next( maybeCopy( get_next() ) ));
+	}
+
+	bool get_extension() const { return extension; }
+	ExpressionNode * set_extension( bool exten ) { extension = exten; return this; }
+
+	virtual void print( std::ostream & os, __attribute__((unused)) int indent = 0 ) const override {
+		os << expr.get();
+	}
+	void printOneLine( __attribute__((unused)) std::ostream & os, __attribute__((unused)) int indent = 0 ) const {}
+
+	template<typename T>
+	bool isExpressionType() const {  return nullptr != dynamic_cast<T>(expr.get()); }
+
+	ast::Expr * build() {
+		ast::Expr * node = expr.release();
+		node->set_extension( this->get_extension() );
+		node->location = this->location;
+		return node;
+	}
+
+	// Public because of lifetime implications (what lifetime implications?)
+	std::unique_ptr<ast::Expr> expr;
+private:
+	bool extension = false;
+}; // ExpressionNode
+
+// These 4 routines modify the string:
+ast::Expr * build_constantInteger( const CodeLocation &, std::string & );
+ast::Expr * build_constantFloat( const CodeLocation &, std::string & );
+ast::Expr * build_constantChar( const CodeLocation &, std::string & );
+ast::Expr * build_constantStr( const CodeLocation &, std::string & );
+ast::Expr * build_field_name_FLOATING_FRACTIONconstant( const CodeLocation &, const std::string & str );
+ast::Expr * build_field_name_FLOATING_DECIMALconstant( const CodeLocation &, const std::string & str );
+ast::Expr * build_field_name_FLOATINGconstant( const CodeLocation &, const std::string & str );
+ast::Expr * build_field_name_fraction_constants( const CodeLocation &, ast::Expr * fieldName, ExpressionNode * fracts );
+
+ast::NameExpr * build_varref( const CodeLocation &, const std::string * name );
+ast::QualifiedNameExpr * build_qualified_expr( const CodeLocation &, const DeclarationNode * decl_node, const ast::NameExpr * name );
+ast::QualifiedNameExpr * build_qualified_expr( const CodeLocation &, const ast::EnumDecl * decl, const ast::NameExpr * name );
+ast::DimensionExpr * build_dimensionref( const CodeLocation &, const std::string * name );
+
+ast::Expr * build_cast( const CodeLocation &, DeclarationNode * decl_node, ExpressionNode * expr_node );
+ast::Expr * build_keyword_cast( const CodeLocation &, ast::AggregateDecl::Aggregate target, ExpressionNode * expr_node );
+ast::Expr * build_virtual_cast( const CodeLocation &, DeclarationNode * decl_node, ExpressionNode * expr_node );
+ast::Expr * build_fieldSel( const CodeLocation &, ExpressionNode * expr_node, ast::Expr * member );
+ast::Expr * build_pfieldSel( const CodeLocation &, ExpressionNode * expr_node, ast::Expr * member );
+ast::Expr * build_offsetOf( const CodeLocation &, DeclarationNode * decl_node, ast::NameExpr * member );
+ast::Expr * build_and( const CodeLocation &, ExpressionNode * expr_node1, ExpressionNode * expr_node2 );
+ast::Expr * build_and_or( const CodeLocation &, ExpressionNode * expr_node1, ExpressionNode * expr_node2, ast::LogicalFlag flag );
+ast::Expr * build_unary_val( const CodeLocation &, OperKinds op, ExpressionNode * expr_node );
+ast::Expr * build_binary_val( const CodeLocation &, OperKinds op, ExpressionNode * expr_node1, ExpressionNode * expr_node2 );
+ast::Expr * build_cond( const CodeLocation &, ExpressionNode * expr_node1, ExpressionNode * expr_node2, ExpressionNode * expr_node3 );
+ast::Expr * build_tuple( const CodeLocation &, ExpressionNode * expr_node = nullptr );
+ast::Expr * build_func( const CodeLocation &, ExpressionNode * function, ExpressionNode * expr_node );
+ast::Expr * build_compoundLiteral( const CodeLocation &, DeclarationNode * decl_node, InitializerNode * kids );
Index: src/Parser/InitializerNode.cc
===================================================================
--- src/Parser/InitializerNode.cc	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/Parser/InitializerNode.cc	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -14,9 +14,9 @@
 //
 
+#include "InitializerNode.h"
+
 #include <iostream>                // for operator<<, ostream, basic_ostream
 #include <list>                    // for list
 #include <string>                  // for operator<<, string
-
-using namespace std;
 
 #include "AST/Expr.hpp"            // for Expr
@@ -24,5 +24,8 @@
 #include "Common/SemanticError.h"  // for SemanticError
 #include "Common/utility.h"        // for maybeBuild
-#include "ParseNode.h"             // for InitializerNode, ExpressionNode
+#include "ExpressionNode.h"        // for ExpressionNode
+#include "DeclarationNode.h"       // for buildList
+
+using namespace std;
 
 static ast::ConstructFlag toConstructFlag( bool maybeConstructed ) {
Index: src/Parser/InitializerNode.h
===================================================================
--- src/Parser/InitializerNode.h	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
+++ src/Parser/InitializerNode.h	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -0,0 +1,51 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// InitializerNode.h --
+//
+// Author           : Andrew Beach
+// Created On       : Wed Apr  5 11:31:00 2023
+// Last Modified By : Andrew Beach
+// Last Modified On : Wed Apr  5 11:48:00 2023
+// Update Count     : 0
+//
+
+#pragma once
+
+#include "ParseNode.h"
+
+class InitializerNode : public ParseNode {
+public:
+	InitializerNode( ExpressionNode *, bool aggrp = false, ExpressionNode * des = nullptr );
+	InitializerNode( InitializerNode *, bool aggrp = false, ExpressionNode * des = nullptr );
+	InitializerNode( bool isDelete );
+	~InitializerNode();
+	virtual InitializerNode * clone() const { assert( false ); return nullptr; }
+
+	ExpressionNode * get_expression() const { return expr; }
+
+	InitializerNode * set_designators( ExpressionNode * des ) { designator = des; return this; }
+	ExpressionNode * get_designators() const { return designator; }
+
+	InitializerNode * set_maybeConstructed( bool value ) { maybeConstructed = value; return this; }
+	bool get_maybeConstructed() const { return maybeConstructed; }
+
+	bool get_isDelete() const { return isDelete; }
+
+	InitializerNode * next_init() const { return kids; }
+
+	void print( std::ostream & os, int indent = 0 ) const;
+	void printOneLine( std::ostream & ) const;
+
+	virtual ast::Init * build() const;
+private:
+	ExpressionNode * expr;
+	bool aggregate;
+	ExpressionNode * designator;                        // may be list
+	InitializerNode * kids;
+	bool maybeConstructed;
+	bool isDelete;
+}; // InitializerNode
Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/Parser/ParseNode.h	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -38,4 +38,5 @@
 class DeclarationWithType;
 class Initializer;
+class InitializerNode;
 class ExpressionNode;
 struct StatementNode;
@@ -80,75 +81,4 @@
 }; // ParseNode
 
-//##############################################################################
-
-class InitializerNode : public ParseNode {
-  public:
-	InitializerNode( ExpressionNode *, bool aggrp = false, ExpressionNode * des = nullptr );
-	InitializerNode( InitializerNode *, bool aggrp = false, ExpressionNode * des = nullptr );
-	InitializerNode( bool isDelete );
-	~InitializerNode();
-	virtual InitializerNode * clone() const { assert( false ); return nullptr; }
-
-	ExpressionNode * get_expression() const { return expr; }
-
-	InitializerNode * set_designators( ExpressionNode * des ) { designator = des; return this; }
-	ExpressionNode * get_designators() const { return designator; }
-
-	InitializerNode * set_maybeConstructed( bool value ) { maybeConstructed = value; return this; }
-	bool get_maybeConstructed() const { return maybeConstructed; }
-
-	bool get_isDelete() const { return isDelete; }
-
-	InitializerNode * next_init() const { return kids; }
-
-	void print( std::ostream & os, int indent = 0 ) const;
-	void printOneLine( std::ostream & ) const;
-
-	virtual ast::Init * build() const;
-  private:
-	ExpressionNode * expr;
-	bool aggregate;
-	ExpressionNode * designator;						// may be list
-	InitializerNode * kids;
-	bool maybeConstructed;
-	bool isDelete;
-}; // InitializerNode
-
-//##############################################################################
-
-class ExpressionNode final : public ParseNode {
-  public:
-	ExpressionNode( ast::Expr * expr = nullptr ) : expr( expr ) {}
-	virtual ~ExpressionNode() {}
-	virtual ExpressionNode * clone() const override {
-		if ( nullptr == expr ) return nullptr;
-		return static_cast<ExpressionNode*>(
-			(new ExpressionNode( ast::shallowCopy( expr.get() ) ))->set_next( maybeCopy( get_next() ) ));
-	}
-
-	bool get_extension() const { return extension; }
-	ExpressionNode * set_extension( bool exten ) { extension = exten; return this; }
-
-	virtual void print( std::ostream & os, __attribute__((unused)) int indent = 0 ) const override {
-		os << expr.get();
-	}
-	void printOneLine( __attribute__((unused)) std::ostream & os, __attribute__((unused)) int indent = 0 ) const {}
-
-	template<typename T>
-	bool isExpressionType() const {	return nullptr != dynamic_cast<T>(expr.get()); }
-
-	ast::Expr * build() const {
-		ast::Expr * node = const_cast<ExpressionNode *>(this)->expr.release();
-		node->set_extension( this->get_extension() );
-		node->location = this->location;
-		return node;
-	}
-
-	// Public because of lifetime implications (what lifetime implications?)
-	std::unique_ptr<ast::Expr> expr;
-  private:
-	bool extension = false;
-}; // ExpressionNode
-
 // Must harmonize with OperName.
 enum class OperKinds {
@@ -169,330 +99,4 @@
 };
 
-// These 4 routines modify the string:
-ast::Expr * build_constantInteger( const CodeLocation &, std::string & );
-ast::Expr * build_constantFloat( const CodeLocation &, std::string & );
-ast::Expr * build_constantChar( const CodeLocation &, std::string & );
-ast::Expr * build_constantStr( const CodeLocation &, std::string & );
-ast::Expr * build_field_name_FLOATING_FRACTIONconstant( const CodeLocation &, const std::string & str );
-ast::Expr * build_field_name_FLOATING_DECIMALconstant( const CodeLocation &, const std::string & str );
-ast::Expr * build_field_name_FLOATINGconstant( const CodeLocation &, const std::string & str );
-ast::Expr * build_field_name_fraction_constants( const CodeLocation &, ast::Expr * fieldName, ExpressionNode * fracts );
-
-ast::NameExpr * build_varref( const CodeLocation &, const std::string * name );
-ast::QualifiedNameExpr * build_qualified_expr( const CodeLocation &, const DeclarationNode * decl_node, const ast::NameExpr * name );
-ast::QualifiedNameExpr * build_qualified_expr( const CodeLocation &, const ast::EnumDecl * decl, const ast::NameExpr * name );
-ast::DimensionExpr * build_dimensionref( const CodeLocation &, const std::string * name );
-
-ast::Expr * build_cast( const CodeLocation &, DeclarationNode * decl_node, ExpressionNode * expr_node );
-ast::Expr * build_keyword_cast( const CodeLocation &, ast::AggregateDecl::Aggregate target, ExpressionNode * expr_node );
-ast::Expr * build_virtual_cast( const CodeLocation &, DeclarationNode * decl_node, ExpressionNode * expr_node );
-ast::Expr * build_fieldSel( const CodeLocation &, ExpressionNode * expr_node, ast::Expr * member );
-ast::Expr * build_pfieldSel( const CodeLocation &, ExpressionNode * expr_node, ast::Expr * member );
-ast::Expr * build_offsetOf( const CodeLocation &, DeclarationNode * decl_node, ast::NameExpr * member );
-ast::Expr * build_and( const CodeLocation &, ExpressionNode * expr_node1, ExpressionNode * expr_node2 );
-ast::Expr * build_and_or( const CodeLocation &, ExpressionNode * expr_node1, ExpressionNode * expr_node2, ast::LogicalFlag flag );
-ast::Expr * build_unary_val( const CodeLocation &, OperKinds op, ExpressionNode * expr_node );
-ast::Expr * build_binary_val( const CodeLocation &, OperKinds op, ExpressionNode * expr_node1, ExpressionNode * expr_node2 );
-ast::Expr * build_binary_ptr( const CodeLocation &, OperKinds op, ExpressionNode * expr_node1, ExpressionNode * expr_node2 );
-ast::Expr * build_cond( const CodeLocation &, ExpressionNode * expr_node1, ExpressionNode * expr_node2, ExpressionNode * expr_node3 );
-ast::Expr * build_tuple( const CodeLocation &, ExpressionNode * expr_node = nullptr );
-ast::Expr * build_func( const CodeLocation &, ExpressionNode * function, ExpressionNode * expr_node );
-ast::Expr * build_compoundLiteral( const CodeLocation &, DeclarationNode * decl_node, InitializerNode * kids );
-
-//##############################################################################
-
-struct TypeData;
-
-struct DeclarationNode : public ParseNode {
-	// These enumerations must harmonize with their names in DeclarationNode.cc.
-	enum BasicType {
-		Void, Bool, Char, Int, Int128,
-		Float, Double, LongDouble, uuFloat80, uuFloat128,
-		uFloat16, uFloat32, uFloat32x, uFloat64, uFloat64x, uFloat128, uFloat128x,
-		NoBasicType
-	};
-	static const char * basicTypeNames[];
-	enum ComplexType { Complex, NoComplexType, Imaginary };	// Imaginary unsupported => parse, but make invisible and print error message
-	static const char * complexTypeNames[];
-	enum Signedness { Signed, Unsigned, NoSignedness };
-	static const char * signednessNames[];
-	enum Length { Short, Long, LongLong, NoLength };
-	static const char * lengthNames[];
-	enum BuiltinType { Valist, AutoType, Zero, One, NoBuiltinType };
-	static const char * builtinTypeNames[];
-
-	static DeclarationNode * newStorageClass( ast::Storage::Classes );
-	static DeclarationNode * newFuncSpecifier( ast::Function::Specs );
-	static DeclarationNode * newTypeQualifier( ast::CV::Qualifiers );
-	static DeclarationNode * newBasicType( BasicType );
-	static DeclarationNode * newComplexType( ComplexType );
-	static DeclarationNode * newSignedNess( Signedness );
-	static DeclarationNode * newLength( Length );
-	static DeclarationNode * newBuiltinType( BuiltinType );
-	static DeclarationNode * newForall( DeclarationNode * );
-	static DeclarationNode * newFromTypedef( const std::string * );
-	static DeclarationNode * newFromGlobalScope();
-	static DeclarationNode * newQualifiedType( DeclarationNode *, DeclarationNode * );
-	static DeclarationNode * newFunction( const std::string * name, DeclarationNode * ret, DeclarationNode * param, StatementNode * body );
-	static DeclarationNode * newAggregate( ast::AggregateDecl::Aggregate kind, const std::string * name, ExpressionNode * actuals, DeclarationNode * fields, bool body );
-	static DeclarationNode * newEnum( const std::string * name, DeclarationNode * constants, bool body, bool typed, DeclarationNode * base = nullptr, EnumHiding hiding = EnumHiding::Visible );
-	static DeclarationNode * newEnumConstant( const std::string * name, ExpressionNode * constant );
-	static DeclarationNode * newEnumValueGeneric( const std::string * name, InitializerNode * init );
-	static DeclarationNode * newEnumInLine( const std::string name );
-	static DeclarationNode * newName( const std::string * );
-	static DeclarationNode * newFromTypeGen( const std::string *, ExpressionNode * params );
-	static DeclarationNode * newTypeParam( ast::TypeDecl::Kind, const std::string * );
-	static DeclarationNode * newTrait( const std::string * name, DeclarationNode * params, DeclarationNode * asserts );
-	static DeclarationNode * newTraitUse( const std::string * name, ExpressionNode * params );
-	static DeclarationNode * newTypeDecl( const std::string * name, DeclarationNode * typeParams );
-	static DeclarationNode * newPointer( DeclarationNode * qualifiers, OperKinds kind );
-	static DeclarationNode * newArray( ExpressionNode * size, DeclarationNode * qualifiers, bool isStatic );
-	static DeclarationNode * newVarArray( DeclarationNode * qualifiers );
-	static DeclarationNode * newBitfield( ExpressionNode * size );
-	static DeclarationNode * newTuple( DeclarationNode * members );
-	static DeclarationNode * newTypeof( ExpressionNode * expr, bool basetypeof = false );
-	static DeclarationNode * newVtableType( DeclarationNode * expr );
-	static DeclarationNode * newAttribute( const std::string *, ExpressionNode * expr = nullptr ); // gcc attributes
-	static DeclarationNode * newDirectiveStmt( StatementNode * stmt ); // gcc external directive statement
-	static DeclarationNode * newAsmStmt( StatementNode * stmt ); // gcc external asm statement
-	static DeclarationNode * newStaticAssert( ExpressionNode * condition, ast::Expr * message );
-
-	DeclarationNode();
-	~DeclarationNode();
-	DeclarationNode * clone() const override;
-
-	DeclarationNode * addQualifiers( DeclarationNode * );
-	void checkQualifiers( const TypeData *, const TypeData * );
-	void checkSpecifiers( DeclarationNode * );
-	DeclarationNode * copySpecifiers( DeclarationNode * );
-	DeclarationNode * addType( DeclarationNode * );
-	DeclarationNode * addTypedef();
-	DeclarationNode * addEnumBase( DeclarationNode * );
-	DeclarationNode * addAssertions( DeclarationNode * );
-	DeclarationNode * addName( std::string * );
-	DeclarationNode * addAsmName( DeclarationNode * );
-	DeclarationNode * addBitfield( ExpressionNode * size );
-	DeclarationNode * addVarArgs();
-	DeclarationNode * addFunctionBody( StatementNode * body, ExpressionNode * with = nullptr );
-	DeclarationNode * addOldDeclList( DeclarationNode * list );
-	DeclarationNode * setBase( TypeData * newType );
-	DeclarationNode * copyAttribute( DeclarationNode * attr );
-	DeclarationNode * addPointer( DeclarationNode * qualifiers );
-	DeclarationNode * addArray( DeclarationNode * array );
-	DeclarationNode * addNewPointer( DeclarationNode * pointer );
-	DeclarationNode * addNewArray( DeclarationNode * array );
-	DeclarationNode * addParamList( DeclarationNode * list );
-	DeclarationNode * addIdList( DeclarationNode * list ); // old-style functions
-	DeclarationNode * addInitializer( InitializerNode * init );
-	DeclarationNode * addTypeInitializer( DeclarationNode * init );
-
-	DeclarationNode * cloneType( std::string * newName );
-	DeclarationNode * cloneBaseType( DeclarationNode * newdecl );
-
-	DeclarationNode * appendList( DeclarationNode * node ) {
-		return (DeclarationNode *)set_last( node );
-	}
-
-	virtual void print( __attribute__((unused)) std::ostream & os, __attribute__((unused)) int indent = 0 ) const override;
-	virtual void printList( __attribute__((unused)) std::ostream & os, __attribute__((unused)) int indent = 0 ) const override;
-
-	ast::Decl * build() const;
-	ast::Type * buildType() const;
-
-	ast::Linkage::Spec get_linkage() const { return linkage; }
-	DeclarationNode * extractAggregate() const;
-	bool has_enumeratorValue() const { return (bool)enumeratorValue; }
-	ExpressionNode * consume_enumeratorValue() const { return const_cast<DeclarationNode *>(this)->enumeratorValue.release(); }
-
-	bool get_extension() const { return extension; }
-	DeclarationNode * set_extension( bool exten ) { extension = exten; return this; }
-
-	bool get_inLine() const { return inLine; }
-	DeclarationNode * set_inLine( bool inL ) { inLine = inL; return this; }
-
-	DeclarationNode * get_last() { return (DeclarationNode *)ParseNode::get_last(); }
-
-	struct Variable_t {
-//		const std::string * name;
-		ast::TypeDecl::Kind tyClass;
-		DeclarationNode * assertions;
-		DeclarationNode * initializer;
-	};
-	Variable_t variable;
-
-	struct StaticAssert_t {
-		ExpressionNode * condition;
-		ast::Expr * message;
-	};
-	StaticAssert_t assert;
-
-	BuiltinType builtin = NoBuiltinType;
-
-	TypeData * type = nullptr;
-
-	bool inLine = false;
-	bool enumInLine = false;
-	ast::Function::Specs funcSpecs;
-	ast::Storage::Classes storageClasses;
-
-	ExpressionNode * bitfieldWidth = nullptr;
-	std::unique_ptr<ExpressionNode> enumeratorValue;
-	bool hasEllipsis = false;
-	ast::Linkage::Spec linkage;
-	ast::Expr * asmName = nullptr;
-	std::vector<ast::ptr<ast::Attribute>> attributes;
-	InitializerNode * initializer = nullptr;
-	bool extension = false;
-	std::string error;
-	StatementNode * asmStmt = nullptr;
-	StatementNode * directiveStmt = nullptr;
-
-	static UniqueName anonymous;
-}; // DeclarationNode
-
-ast::Type * buildType( TypeData * type );
-
-static inline ast::Type * maybeMoveBuildType( const DeclarationNode * orig ) {
-	ast::Type * ret = orig ? orig->buildType() : nullptr;
-	delete orig;
-	return ret;
-}
-
-//##############################################################################
-
-struct StatementNode final : public ParseNode {
-	StatementNode() :
-		stmt( nullptr ), clause( nullptr ) {}
-	StatementNode( ast::Stmt * stmt ) :
-		stmt( stmt ), clause( nullptr ) {}
-	StatementNode( ast::StmtClause * clause ) :
-		stmt( nullptr ), clause( clause ) {}
-	StatementNode( DeclarationNode * decl );
-	virtual ~StatementNode() {}
-
-	virtual StatementNode * clone() const final { assert( false ); return nullptr; }
-	ast::Stmt * build() const { return const_cast<StatementNode *>(this)->stmt.release(); }
-
-	virtual StatementNode * add_label(
-			const CodeLocation & location,
-			const std::string * name,
-			DeclarationNode * attr = nullptr ) {
-		stmt->labels.emplace_back( location,
-			*name,
-			attr ? std::move( attr->attributes )
-				: std::vector<ast::ptr<ast::Attribute>>{} );
-		delete attr;
-		delete name;
-		return this;
-	}
-
-	virtual StatementNode * append_last_case( StatementNode * );
-
-	virtual void print( std::ostream & os, __attribute__((unused)) int indent = 0 ) const override {
-		os << stmt.get() << std::endl;
-	}
-
-	std::unique_ptr<ast::Stmt> stmt;
-	std::unique_ptr<ast::StmtClause> clause;
-}; // StatementNode
-
-ast::Stmt * build_expr( CodeLocation const &, ExpressionNode * ctl );
-
-struct CondCtl {
-	CondCtl( DeclarationNode * decl, ExpressionNode * condition ) :
-		init( decl ? new StatementNode( decl ) : nullptr ), condition( condition ) {}
-
-	StatementNode * init;
-	ExpressionNode * condition;
-};
-
-struct ForCtrl {
-	ForCtrl( StatementNode * stmt, ExpressionNode * condition, ExpressionNode * change ) :
-		init( stmt ), condition( condition ), change( change ) {}
-
-	StatementNode * init;
-	ExpressionNode * condition;
-	ExpressionNode * change;
-};
-
-ast::Stmt * build_if( const CodeLocation &, CondCtl * ctl, StatementNode * then, StatementNode * else_ );
-ast::Stmt * build_switch( const CodeLocation &, bool isSwitch, ExpressionNode * ctl, StatementNode * stmt );
-ast::CaseClause * build_case( ExpressionNode * ctl );
-ast::CaseClause * build_default( const CodeLocation & );
-ast::Stmt * build_while( const CodeLocation &, CondCtl * ctl, StatementNode * stmt, StatementNode * else_ = nullptr );
-ast::Stmt * build_do_while( const CodeLocation &, ExpressionNode * ctl, StatementNode * stmt, StatementNode * else_ = nullptr );
-ast::Stmt * build_for( const CodeLocation &, ForCtrl * forctl, StatementNode * stmt, StatementNode * else_ = nullptr );
-ast::Stmt * build_branch( const CodeLocation &, ast::BranchStmt::Kind kind );
-ast::Stmt * build_branch( const CodeLocation &, std::string * identifier, ast::BranchStmt::Kind kind );
-ast::Stmt * build_computedgoto( ExpressionNode * ctl );
-ast::Stmt * build_return( const CodeLocation &, ExpressionNode * ctl );
-ast::Stmt * build_throw( const CodeLocation &, ExpressionNode * ctl );
-ast::Stmt * build_resume( const CodeLocation &, ExpressionNode * ctl );
-ast::Stmt * build_resume_at( ExpressionNode * ctl , ExpressionNode * target );
-ast::Stmt * build_try( const CodeLocation &, StatementNode * try_, StatementNode * catch_, StatementNode * finally_ );
-ast::CatchClause * build_catch( const CodeLocation &, ast::ExceptionKind kind, DeclarationNode * decl, ExpressionNode * cond, StatementNode * body );
-ast::FinallyClause * build_finally( const CodeLocation &, StatementNode * stmt );
-ast::Stmt * build_compound( const CodeLocation &, StatementNode * first );
-StatementNode * maybe_build_compound( const CodeLocation &, StatementNode * first );
-ast::Stmt * build_asm( const CodeLocation &, bool voltile, ast::Expr * instruction, ExpressionNode * output = nullptr, ExpressionNode * input = nullptr, ExpressionNode * clobber = nullptr, LabelNode * gotolabels = nullptr );
-ast::Stmt * build_directive( const CodeLocation &, std::string * directive );
-ast::SuspendStmt * build_suspend( const CodeLocation &, StatementNode *, ast::SuspendStmt::Type );
-ast::WaitForStmt * build_waitfor( const CodeLocation &, ast::WaitForStmt * existing, ExpressionNode * when, ExpressionNode * targetExpr, StatementNode * stmt );
-ast::WaitForStmt * build_waitfor_else( const CodeLocation &, ast::WaitForStmt * existing, ExpressionNode * when, StatementNode * stmt );
-ast::WaitForStmt * build_waitfor_timeout( const CodeLocation &, ast::WaitForStmt * existing, ExpressionNode * when, ExpressionNode * timeout, StatementNode * stmt );
-ast::WaitUntilStmt::ClauseNode * build_waituntil_clause( const CodeLocation &, ExpressionNode * when, ExpressionNode * targetExpr, StatementNode * stmt );
-ast::WaitUntilStmt::ClauseNode * build_waituntil_else( const CodeLocation &, ExpressionNode * when, StatementNode * stmt );
-ast::WaitUntilStmt::ClauseNode * build_waituntil_timeout( const CodeLocation &, ExpressionNode * when, ExpressionNode * timeout, StatementNode * stmt );
-ast::WaitUntilStmt * build_waituntil_stmt( const CodeLocation &, ast::WaitUntilStmt::ClauseNode * root );
-ast::Stmt * build_with( const CodeLocation &, ExpressionNode * exprs, StatementNode * stmt );
-ast::Stmt * build_mutex( const CodeLocation &, ExpressionNode * exprs, StatementNode * stmt );
-
-//##############################################################################
-
-template<typename AstType, typename NodeType,
-	template<typename, typename...> class Container, typename... Args>
-void buildList( const NodeType * firstNode,
-		Container<ast::ptr<AstType>, Args...> & output ) {
-	SemanticErrorException errors;
-	std::back_insert_iterator<Container<ast::ptr<AstType>, Args...>> out( output );
-	const NodeType * cur = firstNode;
-
-	while ( cur ) {
-		try {
-			if ( auto result = dynamic_cast<AstType *>( maybeBuild( cur ) ) ) {
-				*out++ = result;
-			} else {
-				assertf(false, __PRETTY_FUNCTION__ );
-				SemanticError( cur->location, "type specifier declaration in forall clause is currently unimplemented." );
-			} // if
-		} catch( SemanticErrorException & e ) {
-			errors.append( e );
-		} // try
-		const ParseNode * temp = cur->get_next();
-		// Should not return nullptr, then it is non-homogeneous:
-		cur = dynamic_cast<const NodeType *>( temp );
-		if ( !cur && temp ) {
-			SemanticError( temp->location, "internal error, non-homogeneous nodes founds in buildList processing." );
-		} // if
-	} // while
-	if ( ! errors.isEmpty() ) {
-		throw errors;
-	} // if
-}
-
-// in DeclarationNode.cc
-void buildList( const DeclarationNode * firstNode, std::vector<ast::ptr<ast::Decl>> & outputList );
-void buildList( const DeclarationNode * firstNode, std::vector<ast::ptr<ast::DeclWithType>> & outputList );
-void buildTypeList( const DeclarationNode * firstNode, std::vector<ast::ptr<ast::Type>> & outputList );
-
-template<typename AstType, typename NodeType,
-	template<typename, typename...> class Container, typename... Args>
-void buildMoveList( const NodeType * firstNode,
-		Container<ast::ptr<AstType>, Args...> & output ) {
-	buildList<AstType, NodeType, Container, Args...>( firstNode, output );
-	delete firstNode;
-}
-
-// in ParseNode.cc
 std::ostream & operator<<( std::ostream & out, const ParseNode * node );
 
Index: src/Parser/RunParser.cpp
===================================================================
--- src/Parser/RunParser.cpp	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/Parser/RunParser.cpp	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -20,5 +20,5 @@
 #include "CodeTools/TrackLoc.h"             // for fillLocations
 #include "Common/CodeLocationTools.hpp"     // for forceFillCodeLocations
-#include "Parser/ParseNode.h"               // for DeclarationNode, buildList
+#include "Parser/DeclarationNode.h"         // for DeclarationNode, buildList
 #include "Parser/TypedefTable.h"            // for TypedefTable
 
Index: src/Parser/StatementNode.cc
===================================================================
--- src/Parser/StatementNode.cc	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/Parser/StatementNode.cc	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -11,7 +11,9 @@
 // Created On       : Sat May 16 14:59:41 2015
 // Last Modified By : Andrew Beach
-// Last Modified On : Tue Apr  4 11:40:00 2023
-// Update Count     : 427
+// Last Modified On : Tue Apr 11 10:16:00 2023
+// Update Count     : 428
 //
+
+#include "StatementNode.h"
 
 #include <cassert>                 // for assert, strict_dynamic_cast, assertf
@@ -23,5 +25,6 @@
 #include "Common/SemanticError.h"  // for SemanticError
 #include "Common/utility.h"        // for maybeMoveBuild, maybeBuild
-#include "ParseNode.h"             // for StatementNode, ExpressionNode, bui...
+#include "DeclarationNode.h"       // for DeclarationNode
+#include "ExpressionNode.h"        // for ExpressionNode
 #include "parserutility.h"         // for notZeroExpr
 
@@ -29,4 +32,19 @@
 
 using namespace std;
+
+// Some helpers for cases that really want a single node but check for lists.
+static const ast::Stmt * buildMoveSingle( StatementNode * node ) {
+	std::vector<ast::ptr<ast::Stmt>> list;
+	buildMoveList( node, list );
+	assertf( list.size() == 1, "CFA Internal Error: Extra/Missing Nodes" );
+	return list.front().release();
+}
+
+static const ast::Stmt * buildMoveOptional( StatementNode * node ) {
+	std::vector<ast::ptr<ast::Stmt>> list;
+	buildMoveList( node, list );
+	assertf( list.size() <= 1, "CFA Internal Error: Extra Nodes" );
+	return list.empty() ? nullptr : list.front().release();
+}
 
 StatementNode::StatementNode( DeclarationNode * decl ) {
@@ -53,15 +71,27 @@
 } // StatementNode::StatementNode
 
-StatementNode * StatementNode::append_last_case( StatementNode * stmt ) {
-	StatementNode * prev = this;
+StatementNode * StatementNode::add_label(
+		const CodeLocation & location,
+		const std::string * name,
+		DeclarationNode * attr ) {
+	stmt->labels.emplace_back( location,
+		*name,
+		attr ? std::move( attr->attributes )
+			: std::vector<ast::ptr<ast::Attribute>>{} );
+	delete attr;
+	delete name;
+	return this;
+}
+
+ClauseNode * ClauseNode::append_last_case( StatementNode * stmt ) {
+	ClauseNode * prev = this;
 	// find end of list and maintain previous pointer
-	for ( StatementNode * curr = prev; curr != nullptr; curr = (StatementNode *)curr->get_next() ) {
-		StatementNode * node = strict_dynamic_cast< StatementNode * >(curr);
-		assert( nullptr == node->stmt.get() );
+	for ( ClauseNode * curr = prev; curr != nullptr; curr = (ClauseNode *)curr->get_next() ) {
+		ClauseNode * node = strict_dynamic_cast< ClauseNode * >(curr);
 		assert( dynamic_cast<ast::CaseClause *>( node->clause.get() ) );
 		prev = curr;
 	} // for
+	ClauseNode * node = dynamic_cast< ClauseNode * >(prev);
 	// convert from StatementNode list to Statement list
-	StatementNode * node = dynamic_cast< StatementNode * >(prev);
 	std::vector<ast::ptr<ast::Stmt>> stmts;
 	buildMoveList( stmt, stmts );
@@ -73,5 +103,5 @@
 	stmts.clear();
 	return this;
-} // StatementNode::append_last_case
+} // ClauseNode::append_last_case
 
 ast::Stmt * build_expr( CodeLocation const & location, ExpressionNode * ctl ) {
@@ -97,7 +127,5 @@
 		for ( ast::ptr<ast::Stmt> & stmt : inits ) {
 			// build the && of all of the declared variables compared against 0
-			//auto declStmt = strict_dynamic_cast<ast::DeclStmt *>( stmt );
 			auto declStmt = stmt.strict_as<ast::DeclStmt>();
-			//ast::DeclWithType * dwt = strict_dynamic_cast<ast::DeclWithType *>( declStmt->decl );
 			auto dwt = declStmt->decl.strict_as<ast::DeclWithType>();
 			ast::Expr * nze = notZeroExpr( new ast::VariableExpr( dwt->location, dwt ) );
@@ -113,16 +141,6 @@
 	ast::Expr * astcond = build_if_control( ctl, astinit ); // ctl deleted, cond/init set
 
-	std::vector<ast::ptr<ast::Stmt>> aststmt;
-	buildMoveList( then, aststmt );
-	assert( aststmt.size() == 1 );
-	ast::Stmt const * astthen = aststmt.front().release();
-
-	ast::Stmt const * astelse = nullptr;
-	if ( else_ ) {
-		std::vector<ast::ptr<ast::Stmt>> aststmt;
-		buildMoveList( else_, aststmt );
-		assert( aststmt.size() == 1 );
-		astelse = aststmt.front().release();
-	} // if
+	ast::Stmt const * astthen = buildMoveSingle( then );
+	ast::Stmt const * astelse = buildMoveOptional( else_ );
 
 	return new ast::IfStmt( location, astcond, astthen, astelse,
@@ -131,42 +149,7 @@
 } // build_if
 
-// Temporary work around. Split StmtClause off from StatementNode.
-template<typename clause_t>
-static void buildMoveClauseList( StatementNode * firstNode,
-		std::vector<ast::ptr<clause_t>> & output ) {
-	SemanticErrorException errors;
-	std::back_insert_iterator<std::vector<ast::ptr<clause_t>>>
-		out( output );
-	StatementNode * cur = firstNode;
-
-	while ( cur ) {
-		try {
-			auto clause = cur->clause.release();
-			if ( auto result = dynamic_cast<clause_t *>( clause ) ) {
-				*out++ = result;
-			} else {
-				assertf(false, __PRETTY_FUNCTION__ );
-				SemanticError( cur->location, "type specifier declaration in forall clause is currently unimplemented." );
-			} // if
-		} catch( SemanticErrorException & e ) {
-			errors.append( e );
-		} // try
-		ParseNode * temp = cur->get_next();
-		// Should not return nullptr, then it is non-homogeneous:
-		cur = dynamic_cast<StatementNode *>( temp );
-		if ( !cur && temp ) {
-			SemanticError( temp->location, "internal error, non-homogeneous nodes founds in buildList processing." );
-		} // if
-	} // while
-	if ( ! errors.isEmpty() ) {
-		throw errors;
-	} // if
-	// Usually in the wrapper.
-	delete firstNode;
-}
-
-ast::Stmt * build_switch( const CodeLocation & location, bool isSwitch, ExpressionNode * ctl, StatementNode * stmt ) {
+ast::Stmt * build_switch( const CodeLocation & location, bool isSwitch, ExpressionNode * ctl, ClauseNode * stmt ) {
 	std::vector<ast::ptr<ast::CaseClause>> aststmt;
-	buildMoveClauseList( stmt, aststmt );
+	buildMoveList( stmt, aststmt );
 	// If it is not a switch it is a choose statement.
 	if ( ! isSwitch ) {
@@ -190,8 +173,8 @@
 } // build_switch
 
-ast::CaseClause * build_case( ExpressionNode * ctl ) {
+ast::CaseClause * build_case( const CodeLocation & location, ExpressionNode * ctl ) {
 	// stmt starts empty and then added to
 	auto expr = maybeMoveBuild( ctl );
-	return new ast::CaseClause( expr->location, expr, {} );
+	return new ast::CaseClause( location, expr, {} );
 } // build_case
 
@@ -205,37 +188,21 @@
 	ast::Expr * astcond = build_if_control( ctl, astinit ); // ctl deleted, cond/init set
 
-	std::vector<ast::ptr<ast::Stmt>> aststmt;						// loop body, compound created if empty
-	buildMoveList( stmt, aststmt );
-	assert( aststmt.size() == 1 );
-
-	std::vector<ast::ptr<ast::Stmt>> astelse;						// else clause, maybe empty
-	buildMoveList( else_, astelse );
-	assert( astelse.size() <= 1 );
-
 	return new ast::WhileDoStmt( location,
 		astcond,
-		aststmt.front(),
-		astelse.empty() ? nullptr : astelse.front().release(),
+		buildMoveSingle( stmt ),
+		buildMoveOptional( else_ ),
 		std::move( astinit ),
-		false
+		ast::While
 	);
 } // build_while
 
 ast::Stmt * build_do_while( const CodeLocation & location, ExpressionNode * ctl, StatementNode * stmt, StatementNode * else_ ) {
-	std::vector<ast::ptr<ast::Stmt>> aststmt;						// loop body, compound created if empty
-	buildMoveList( stmt, aststmt );
-	assert( aststmt.size() == 1 );						// compound created if empty
-
-	std::vector<ast::ptr<ast::Stmt>> astelse;						// else clause, maybe empty
-	buildMoveList( else_, astelse );
-	assert( astelse.size() <= 1 );
-
 	// do-while cannot have declarations in the contitional, so init is always empty
 	return new ast::WhileDoStmt( location,
 		notZeroExpr( maybeMoveBuild( ctl ) ),
-		aststmt.front(),
-		astelse.empty() ? nullptr : astelse.front().release(),
+		buildMoveSingle( stmt ),
+		buildMoveOptional( else_ ),
 		{},
-		true
+		ast::DoWhile
 	);
 } // build_do_while
@@ -251,12 +218,4 @@
 	astincr = maybeMoveBuild( forctl->change );
 	delete forctl;
-
-	std::vector<ast::ptr<ast::Stmt>> aststmt;						// loop body, compound created if empty
-	buildMoveList( stmt, aststmt );
-	assert( aststmt.size() == 1 );
-
-	std::vector<ast::ptr<ast::Stmt>> astelse;						// else clause, maybe empty
-	buildMoveList( else_, astelse );
-	assert( astelse.size() <= 1 );
 
 	return new ast::ForStmt( location,
@@ -264,6 +223,6 @@
 		astcond,
 		astincr,
-		aststmt.front(),
-		astelse.empty() ? nullptr : astelse.front().release()
+		buildMoveSingle( stmt ),
+		buildMoveOptional( else_ )
 	);
 } // build_for
@@ -326,7 +285,7 @@
 } // build_resume_at
 
-ast::Stmt * build_try( const CodeLocation & location, StatementNode * try_, StatementNode * catch_, StatementNode * finally_ ) {
+ast::Stmt * build_try( const CodeLocation & location, StatementNode * try_, ClauseNode * catch_, ClauseNode * finally_ ) {
 	std::vector<ast::ptr<ast::CatchClause>> aststmt;
-	buildMoveClauseList( catch_, aststmt );
+	buildMoveList( catch_, aststmt );
 	ast::CompoundStmt * tryBlock = strict_dynamic_cast<ast::CompoundStmt *>( maybeMoveBuild( try_ ) );
 	ast::FinallyClause * finallyBlock = nullptr;
@@ -342,35 +301,27 @@
 
 ast::CatchClause * build_catch( const CodeLocation & location, ast::ExceptionKind kind, DeclarationNode * decl, ExpressionNode * cond, StatementNode * body ) {
-	std::vector<ast::ptr<ast::Stmt>> aststmt;
-	buildMoveList( body, aststmt );
-	assert( aststmt.size() == 1 );
 	return new ast::CatchClause( location,
 		kind,
 		maybeMoveBuild( decl ),
 		maybeMoveBuild( cond ),
-		aststmt.front().release()
+		buildMoveSingle( body )
 	);
 } // build_catch
 
 ast::FinallyClause * build_finally( const CodeLocation & location, StatementNode * stmt ) {
-	std::vector<ast::ptr<ast::Stmt>> aststmt;
-	buildMoveList( stmt, aststmt );
-	assert( aststmt.size() == 1 );
 	return new ast::FinallyClause( location,
-		aststmt.front().strict_as<ast::CompoundStmt>()
+		strict_dynamic_cast<const ast::CompoundStmt *>(
+			buildMoveSingle( stmt )
+		)
 	);
 } // build_finally
 
-ast::SuspendStmt * build_suspend( const CodeLocation & location, StatementNode * then, ast::SuspendStmt::Type type ) {
-	std::vector<ast::ptr<ast::Stmt>> stmts;
-	buildMoveList( then, stmts );
-	ast::CompoundStmt const * then2 = nullptr;
-	if(!stmts.empty()) {
-		assert( stmts.size() == 1 );
-		then2 = stmts.front().strict_as<ast::CompoundStmt>();
-	}
-	auto node = new ast::SuspendStmt( location, then2, ast::SuspendStmt::None );
-	node->type = type;
-	return node;
+ast::SuspendStmt * build_suspend( const CodeLocation & location, StatementNode * then, ast::SuspendStmt::Kind kind ) {
+	return new ast::SuspendStmt( location,
+		strict_dynamic_cast<const ast::CompoundStmt *, nullptr>(
+			buildMoveOptional( then )
+		),
+		kind
+	);
 } // build_suspend
 
@@ -525,5 +476,5 @@
 
 // Question
-ast::Stmt * build_asm( const CodeLocation & location, bool voltile, ast::Expr * instruction, ExpressionNode * output, ExpressionNode * input, ExpressionNode * clobber, LabelNode * gotolabels ) {
+ast::Stmt * build_asm( const CodeLocation & location, bool is_volatile, ExpressionNode * instruction, ExpressionNode * output, ExpressionNode * input, ExpressionNode * clobber, LabelNode * gotolabels ) {
 	std::vector<ast::ptr<ast::Expr>> out, in;
 	std::vector<ast::ptr<ast::ConstantExpr>> clob;
@@ -533,6 +484,6 @@
 	buildMoveList( clobber, clob );
 	return new ast::AsmStmt( location,
-		voltile,
-		instruction,
+		is_volatile,
+		maybeMoveBuild( instruction ),
 		std::move( out ),
 		std::move( in ),
Index: src/Parser/StatementNode.h
===================================================================
--- src/Parser/StatementNode.h	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
+++ src/Parser/StatementNode.h	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -0,0 +1,107 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// StatementNode.h --
+//
+// Author           : Andrew Beach
+// Created On       : Wed Apr  5 11:42:00 2023
+// Last Modified By : Andrew Beach
+// Last Modified On : Tue Apr 11  9:43:00 2023
+// Update Count     : 1
+//
+
+#pragma once
+
+#include "ParseNode.h"
+
+struct StatementNode final : public ParseNode {
+	StatementNode() : stmt( nullptr ) {}
+	StatementNode( ast::Stmt * stmt ) : stmt( stmt ) {}
+	StatementNode( DeclarationNode * decl );
+	virtual ~StatementNode() {}
+
+	virtual StatementNode * clone() const final { assert( false ); return nullptr; }
+	ast::Stmt * build() { return stmt.release(); }
+
+	StatementNode * add_label(
+			const CodeLocation & location,
+			const std::string * name,
+			DeclarationNode * attr = nullptr );
+
+	virtual void print( std::ostream & os, __attribute__((unused)) int indent = 0 ) const override {
+		os << stmt.get() << std::endl;
+	}
+
+	std::unique_ptr<ast::Stmt> stmt;
+}; // StatementNode
+
+struct ClauseNode final : public ParseNode {
+	ClauseNode( ast::StmtClause * clause ) : clause( clause ) {}
+	virtual ~ClauseNode() {}
+
+	ClauseNode * set_last( ParseNode * newlast ) {
+		ParseNode::set_last( newlast );
+        return this;
+    }
+
+	virtual ClauseNode * clone() const final { assert( false ); return nullptr; }
+	ast::StmtClause * build() { return clause.release(); }
+
+	virtual ClauseNode * append_last_case( StatementNode * );
+
+	std::unique_ptr<ast::StmtClause> clause;
+};
+
+ast::Stmt * build_expr( CodeLocation const &, ExpressionNode * ctl );
+
+struct CondCtl {
+	CondCtl( DeclarationNode * decl, ExpressionNode * condition ) :
+		init( decl ? new StatementNode( decl ) : nullptr ), condition( condition ) {}
+
+	StatementNode * init;
+	ExpressionNode * condition;
+};
+
+struct ForCtrl {
+	ForCtrl( StatementNode * stmt, ExpressionNode * condition, ExpressionNode * change ) :
+		init( stmt ), condition( condition ), change( change ) {}
+
+	StatementNode * init;
+	ExpressionNode * condition;
+	ExpressionNode * change;
+};
+
+ast::Stmt * build_if( const CodeLocation &, CondCtl * ctl, StatementNode * then, StatementNode * else_ );
+ast::Stmt * build_switch( const CodeLocation &, bool isSwitch, ExpressionNode * ctl, ClauseNode * stmt );
+ast::CaseClause * build_case( const CodeLocation &, ExpressionNode * ctl );
+ast::CaseClause * build_default( const CodeLocation & );
+ast::Stmt * build_while( const CodeLocation &, CondCtl * ctl, StatementNode * stmt, StatementNode * else_ = nullptr );
+ast::Stmt * build_do_while( const CodeLocation &, ExpressionNode * ctl, StatementNode * stmt, StatementNode * else_ = nullptr );
+ast::Stmt * build_for( const CodeLocation &, ForCtrl * forctl, StatementNode * stmt, StatementNode * else_ = nullptr );
+ast::Stmt * build_branch( const CodeLocation &, ast::BranchStmt::Kind kind );
+ast::Stmt * build_branch( const CodeLocation &, std::string * identifier, ast::BranchStmt::Kind kind );
+ast::Stmt * build_computedgoto( ExpressionNode * ctl );
+ast::Stmt * build_return( const CodeLocation &, ExpressionNode * ctl );
+ast::Stmt * build_throw( const CodeLocation &, ExpressionNode * ctl );
+ast::Stmt * build_resume( const CodeLocation &, ExpressionNode * ctl );
+ast::Stmt * build_resume_at( ExpressionNode * ctl , ExpressionNode * target );
+ast::Stmt * build_try( const CodeLocation &, StatementNode * try_, ClauseNode * catch_, ClauseNode * finally_ );
+ast::CatchClause * build_catch( const CodeLocation &, ast::ExceptionKind kind, DeclarationNode * decl, ExpressionNode * cond, StatementNode * body );
+ast::FinallyClause * build_finally( const CodeLocation &, StatementNode * stmt );
+ast::Stmt * build_compound( const CodeLocation &, StatementNode * first );
+StatementNode * maybe_build_compound( const CodeLocation &, StatementNode * first );
+ast::Stmt * build_asm( const CodeLocation &, bool is_volatile, ExpressionNode * instruction, ExpressionNode * output = nullptr, ExpressionNode * input = nullptr, ExpressionNode * clobber = nullptr, LabelNode * gotolabels = nullptr );
+ast::Stmt * build_directive( const CodeLocation &, std::string * directive );
+ast::SuspendStmt * build_suspend( const CodeLocation &, StatementNode *, ast::SuspendStmt::Kind );
+ast::WaitForStmt * build_waitfor( const CodeLocation &, ast::WaitForStmt * existing, ExpressionNode * when, ExpressionNode * targetExpr, StatementNode * stmt );
+ast::WaitForStmt * build_waitfor_else( const CodeLocation &, ast::WaitForStmt * existing, ExpressionNode * when, StatementNode * stmt );
+ast::WaitForStmt * build_waitfor_timeout( const CodeLocation &, ast::WaitForStmt * existing, ExpressionNode * when, ExpressionNode * timeout, StatementNode * stmt );
+ast::WaitUntilStmt::ClauseNode * build_waituntil_clause( const CodeLocation &, ExpressionNode * when, ExpressionNode * targetExpr, StatementNode * stmt );
+ast::WaitUntilStmt::ClauseNode * build_waituntil_else( const CodeLocation &, ExpressionNode * when, StatementNode * stmt );
+ast::WaitUntilStmt::ClauseNode * build_waituntil_timeout( const CodeLocation &, ExpressionNode * when, ExpressionNode * timeout, StatementNode * stmt );
+ast::WaitUntilStmt * build_waituntil_stmt( const CodeLocation &, ast::WaitUntilStmt::ClauseNode * root );
+ast::Stmt * build_with( const CodeLocation &, ExpressionNode * exprs, StatementNode * stmt );
+ast::Stmt * build_mutex( const CodeLocation &, ExpressionNode * exprs, StatementNode * stmt );
Index: src/Parser/TypeData.cc
===================================================================
--- src/Parser/TypeData.cc	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/Parser/TypeData.cc	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -24,6 +24,6 @@
 #include "Common/SemanticError.h"  // for SemanticError
 #include "Common/utility.h"        // for splice, spliceBegin
-#include "Parser/parserutility.h"  // for maybeCopy, maybeBuild, maybeMoveB...
-#include "Parser/ParseNode.h"      // for DeclarationNode, ExpressionNode
+#include "Parser/ExpressionNode.h" // for ExpressionNode
+#include "Parser/StatementNode.h"  // for StatementNode
 
 class Attribute;
@@ -1397,5 +1397,5 @@
 		std::move( attributes ),
 		funcSpec,
-		isVarArgs
+		(isVarArgs) ? ast::VariableArgs : ast::FixedArgs
 	);
 	buildList( td->function.withExprs, decl->withExprs );
Index: src/Parser/TypeData.h
===================================================================
--- src/Parser/TypeData.h	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/Parser/TypeData.h	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -16,10 +16,10 @@
 #pragma once
 
-#include <iosfwd>										// for ostream
-#include <list>											// for list
-#include <string>										// for string
+#include <iosfwd>                                   // for ostream
+#include <list>                                     // for list
+#include <string>                                   // for string
 
-#include "AST/Type.hpp"									// for Type
-#include "ParseNode.h"									// for DeclarationNode, DeclarationNode::Ag...
+#include "AST/Type.hpp"                             // for Type
+#include "DeclarationNode.h"                        // for DeclarationNode
 
 struct TypeData {
Index: src/Parser/TypedefTable.cc
===================================================================
--- src/Parser/TypedefTable.cc	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/Parser/TypedefTable.cc	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -16,29 +16,34 @@
 
 #include "TypedefTable.h"
-#include <cassert>										// for assert
-#include <iostream>
+
+#include <cassert>                                // for assert
+#include <string>                                 // for string
+#include <iostream>                               // for iostream
+
+#include "ExpressionNode.h"                       // for LabelNode
+#include "ParserTypes.h"                          // for Token
+#include "StatementNode.h"                        // for CondCtl, ForCtrl
+// This (generated) header must come late as it is missing includes.
+#include "parser.hh"              // for IDENTIFIER, TYPEDEFname, TYPEGENname
+
 using namespace std;
 
 #if 0
 #define debugPrint( code ) code
+
+static const char *kindName( int kind ) {
+	switch ( kind ) {
+	case IDENTIFIER: return "identifier";
+	case TYPEDIMname: return "typedim";
+	case TYPEDEFname: return "typedef";
+	case TYPEGENname: return "typegen";
+	default:
+		cerr << "Error: cfa-cpp internal error, invalid kind of identifier" << endl;
+		abort();
+	} // switch
+} // kindName
 #else
 #define debugPrint( code )
 #endif
-
-using namespace std;									// string, iostream
-
-debugPrint(
-	static const char *kindName( int kind ) {
-		switch ( kind ) {
-		case IDENTIFIER: return "identifier";
-		case TYPEDIMname: return "typedim";
-		case TYPEDEFname: return "typedef";
-		case TYPEGENname: return "typegen";
-		default:
-			cerr << "Error: cfa-cpp internal error, invalid kind of identifier" << endl;
-			abort();
-		} // switch
-	} // kindName
-);
 
 TypedefTable::~TypedefTable() {
@@ -78,4 +83,8 @@
 		typedefTable.addToEnclosingScope( name, kind, "MTD" );
 	} // if
+} // TypedefTable::makeTypedef
+
+void TypedefTable::makeTypedef( const string & name ) {
+	return makeTypedef( name, TYPEDEFname );
 } // TypedefTable::makeTypedef
 
Index: src/Parser/TypedefTable.h
===================================================================
--- src/Parser/TypedefTable.h	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/Parser/TypedefTable.h	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -19,11 +19,9 @@
 
 #include "Common/ScopedMap.h"							// for ScopedMap
-#include "ParserTypes.h"
-#include "parser.hh"									// for IDENTIFIER, TYPEDEFname, TYPEGENname
 
 class TypedefTable {
 	struct Note { size_t level; bool forall; };
 	typedef ScopedMap< std::string, int, Note > KindTable;
-	KindTable kindTable;	
+	KindTable kindTable;
 	unsigned int level = 0;
   public:
@@ -33,5 +31,6 @@
 	bool existsCurr( const std::string & identifier ) const;
 	int isKind( const std::string & identifier ) const;
-	void makeTypedef( const std::string & name, int kind = TYPEDEFname );
+	void makeTypedef( const std::string & name, int kind );
+	void makeTypedef( const std::string & name );
 	void addToScope( const std::string & identifier, int kind, const char * );
 	void addToEnclosingScope( const std::string & identifier, int kind, const char * );
Index: src/Parser/lex.ll
===================================================================
--- src/Parser/lex.ll	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/Parser/lex.ll	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -44,6 +44,13 @@
 
 #include "config.h"										// configure info
+#include "DeclarationNode.h"                            // for DeclarationNode
+#include "ExpressionNode.h"                             // for LabelNode
+#include "InitializerNode.h"                            // for InitializerNode
 #include "ParseNode.h"
+#include "ParserTypes.h"                                // for Token
+#include "StatementNode.h"                              // for CondCtl, ForCtrl
 #include "TypedefTable.h"
+// This (generated) header must come late as it is missing includes.
+#include "parser.hh"                                    // generated info
 
 string * build_postfix_name( string * name );
Index: src/Parser/module.mk
===================================================================
--- src/Parser/module.mk	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/Parser/module.mk	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -21,6 +21,9 @@
 SRC += \
        Parser/DeclarationNode.cc \
+       Parser/DeclarationNode.h \
        Parser/ExpressionNode.cc \
+       Parser/ExpressionNode.h \
        Parser/InitializerNode.cc \
+       Parser/InitializerNode.h \
        Parser/lex.ll \
        Parser/ParseNode.cc \
@@ -33,4 +36,5 @@
        Parser/RunParser.hpp \
        Parser/StatementNode.cc \
+       Parser/StatementNode.h \
        Parser/TypeData.cc \
        Parser/TypeData.h \
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/Parser/parser.yy	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -9,7 +9,7 @@
 // Author           : Peter A. Buhr
 // Created On       : Sat Sep  1 20:22:55 2001
-// Last Modified By : Andrew Beach
-// Last Modified On : Tue Apr  4 14:02:00 2023
-// Update Count     : 6329
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Apr 26 16:45:37 2023
+// Update Count     : 6330
 //
 
@@ -48,9 +48,12 @@
 using namespace std;
 
-#include "SynTree/Declaration.h"
-#include "ParseNode.h"
+#include "SynTree/Type.h"                               // for Type
+#include "DeclarationNode.h"                            // for DeclarationNode, ...
+#include "ExpressionNode.h"                             // for ExpressionNode, ...
+#include "InitializerNode.h"                            // for InitializerNode, ...
+#include "ParserTypes.h"
+#include "StatementNode.h"                              // for build_...
 #include "TypedefTable.h"
 #include "TypeData.h"
-#include "SynTree/LinkageSpec.h"
 #include "Common/SemanticError.h"						// error_str
 #include "Common/utility.h"								// for maybeMoveBuild, maybeBuild, CodeLo...
@@ -297,23 +300,21 @@
 %union {
 	Token tok;
-	ParseNode * pn;
-	ExpressionNode * en;
+	ExpressionNode * expr;
 	DeclarationNode * decl;
 	ast::AggregateDecl::Aggregate aggKey;
 	ast::TypeDecl::Kind tclass;
-	StatementNode * sn;
+	StatementNode * stmt;
+	ClauseNode * clause;
 	ast::WaitForStmt * wfs;
-    ast::WaitUntilStmt::ClauseNode * wuscn;
-	ast::Expr * constant;
+    ast::WaitUntilStmt::ClauseNode * wucn;
 	CondCtl * ifctl;
-	ForCtrl * fctl;
-	OperKinds compop;
-	LabelNode * label;
-	InitializerNode * in;
-	OperKinds op;
+	ForCtrl * forctl;
+	LabelNode * labels;
+	InitializerNode * init;
+	OperKinds oper;
 	std::string * str;
-	bool flag;
-	EnumHiding hide;
-	ast::ExceptionKind catch_kind;
+	bool is_volatile;
+	EnumHiding enum_hiding;
+	ast::ExceptionKind except_kind;
 	ast::GenericExpr * genexpr;
 }
@@ -381,51 +382,52 @@
 %type<tok> identifier					identifier_at				identifier_or_type_name		attr_name
 %type<tok> quasi_keyword
-%type<constant> string_literal
+%type<expr> string_literal
 %type<str> string_literal_list
 
-%type<hide> hide_opt					visible_hide_opt
+%type<enum_hiding> hide_opt					visible_hide_opt
 
 // expressions
-%type<en> constant
-%type<en> tuple							tuple_expression_list
-%type<op> ptrref_operator				unary_operator				assignment_operator			simple_assignment_operator	compound_assignment_operator
-%type<en> primary_expression			postfix_expression			unary_expression
-%type<en> cast_expression_list			cast_expression				exponential_expression		multiplicative_expression	additive_expression
-%type<en> shift_expression				relational_expression		equality_expression
-%type<en> AND_expression				exclusive_OR_expression		inclusive_OR_expression
-%type<en> logical_AND_expression		logical_OR_expression
-%type<en> conditional_expression		constant_expression			assignment_expression		assignment_expression_opt
-%type<en> comma_expression				comma_expression_opt
-%type<en> argument_expression_list_opt	argument_expression_list	argument_expression			default_initializer_opt
+%type<expr> constant
+%type<expr> tuple							tuple_expression_list
+%type<oper> ptrref_operator				unary_operator				assignment_operator			simple_assignment_operator	compound_assignment_operator
+%type<expr> primary_expression			postfix_expression			unary_expression
+%type<expr> cast_expression_list			cast_expression				exponential_expression		multiplicative_expression	additive_expression
+%type<expr> shift_expression				relational_expression		equality_expression
+%type<expr> AND_expression				exclusive_OR_expression		inclusive_OR_expression
+%type<expr> logical_AND_expression		logical_OR_expression
+%type<expr> conditional_expression		constant_expression			assignment_expression		assignment_expression_opt
+%type<expr> comma_expression				comma_expression_opt
+%type<expr> argument_expression_list_opt	argument_expression_list	argument_expression			default_initializer_opt
 %type<ifctl> conditional_declaration
-%type<fctl> for_control_expression		for_control_expression_list
-%type<compop> upupeq updown updowneq downupdowneq
-%type<en> subrange
+%type<forctl> for_control_expression		for_control_expression_list
+%type<oper> upupeq updown updowneq downupdowneq
+%type<expr> subrange
 %type<decl> asm_name_opt
-%type<en> asm_operands_opt				asm_operands_list			asm_operand
-%type<label> label_list
-%type<en> asm_clobbers_list_opt
-%type<flag> asm_volatile_opt
-%type<en> handler_predicate_opt
+%type<expr> asm_operands_opt				asm_operands_list			asm_operand
+%type<labels> label_list
+%type<expr> asm_clobbers_list_opt
+%type<is_volatile> asm_volatile_opt
+%type<expr> handler_predicate_opt
 %type<genexpr> generic_association		generic_assoc_list
 
 // statements
-%type<sn> statement						labeled_statement			compound_statement
-%type<sn> statement_decl				statement_decl_list			statement_list_nodecl
-%type<sn> selection_statement			if_statement
-%type<sn> switch_clause_list_opt		switch_clause_list
-%type<en> case_value
-%type<sn> case_clause					case_value_list				case_label					case_label_list
-%type<sn> iteration_statement			jump_statement
-%type<sn> expression_statement			asm_statement
-%type<sn> with_statement
-%type<en> with_clause_opt
-%type<sn> exception_statement			handler_clause				finally_clause
-%type<catch_kind> handler_key
-%type<sn> mutex_statement
-%type<en> when_clause					when_clause_opt				waitfor		waituntil		timeout
-%type<sn> waitfor_statement				waituntil_statement
+%type<stmt> statement						labeled_statement			compound_statement
+%type<stmt> statement_decl				statement_decl_list			statement_list_nodecl
+%type<stmt> selection_statement			if_statement
+%type<clause> switch_clause_list_opt		switch_clause_list
+%type<expr> case_value
+%type<clause> case_clause				case_value_list				case_label					case_label_list
+%type<stmt> iteration_statement			jump_statement
+%type<stmt> expression_statement			asm_statement
+%type<stmt> with_statement
+%type<expr> with_clause_opt
+%type<stmt> exception_statement
+%type<clause> handler_clause			finally_clause
+%type<except_kind> handler_key
+%type<stmt> mutex_statement
+%type<expr> when_clause					when_clause_opt				waitfor		waituntil		timeout
+%type<stmt> waitfor_statement				waituntil_statement
 %type<wfs> wor_waitfor_clause
-%type<wuscn> waituntil_clause			wand_waituntil_clause       wor_waituntil_clause
+%type<wucn> waituntil_clause			wand_waituntil_clause       wor_waituntil_clause
 
 // declarations
@@ -439,5 +441,5 @@
 %type<decl> assertion assertion_list assertion_list_opt
 
-%type<en> bit_subrange_size_opt bit_subrange_size
+%type<expr> bit_subrange_size_opt bit_subrange_size
 
 %type<decl> basic_declaration_specifier basic_type_name basic_type_specifier direct_type indirect_type
@@ -452,5 +454,5 @@
 
 %type<decl> enumerator_list enum_type enum_type_nobody
-%type<in> enumerator_value_opt
+%type<init> enumerator_value_opt
 
 %type<decl> external_definition external_definition_list external_definition_list_opt
@@ -459,5 +461,5 @@
 
 %type<decl> field_declaration_list_opt field_declaration field_declaring_list_opt field_declarator field_abstract_list_opt field_abstract
-%type<en> field field_name_list field_name fraction_constants_opt
+%type<expr> field field_name_list field_name fraction_constants_opt
 
 %type<decl> external_function_definition function_definition function_array function_declarator function_no_ptr function_ptr
@@ -508,5 +510,5 @@
 %type<decl> type_parameter type_parameter_list type_initializer_opt
 
-%type<en> type_parameters_opt type_list array_type_list
+%type<expr> type_parameters_opt type_list array_type_list
 
 %type<decl> type_qualifier type_qualifier_name forall type_qualifier_list_opt type_qualifier_list
@@ -519,8 +521,8 @@
 
 // initializers
-%type<in>  initializer initializer_list_opt initializer_opt
+%type<init>  initializer initializer_list_opt initializer_opt
 
 // designators
-%type<en>  designator designator_list designation
+%type<expr>  designator designator_list designation
 
 
@@ -644,5 +646,5 @@
 
 string_literal:
-	string_literal_list							{ $$ = build_constantStr( yylloc, *$1 ); }
+	string_literal_list							{ $$ = new ExpressionNode( build_constantStr( yylloc, *$1 ) ); }
 	;
 
@@ -739,5 +741,5 @@
 		{ $$ = new ExpressionNode( build_binary_val( yylloc, OperKinds::Index, $1, $3 ) ); }
 	| string_literal '[' assignment_expression ']'		// "abc"[3], 3["abc"]
-		{ $$ = new ExpressionNode( build_binary_val( yylloc, OperKinds::Index, new ExpressionNode( $1 ), $3 ) ); }
+		{ $$ = new ExpressionNode( build_binary_val( yylloc, OperKinds::Index, $1, $3 ) ); }
 	| postfix_expression '{' argument_expression_list_opt '}' // CFA, constructor call
 		{
@@ -757,5 +759,5 @@
 		{ $$ = new ExpressionNode( build_func( yylloc, new ExpressionNode( build_varref( yylloc, build_postfix_name( $3 ) ) ), $1 ) ); }
 	| string_literal '`' identifier						// CFA, postfix call
-		{ $$ = new ExpressionNode( build_func( yylloc, new ExpressionNode( build_varref( yylloc, build_postfix_name( $3 ) ) ), new ExpressionNode( $1 ) ) ); }
+		{ $$ = new ExpressionNode( build_func( yylloc, new ExpressionNode( build_varref( yylloc, build_postfix_name( $3 ) ) ), $1 ) ); }
 	| postfix_expression '.' identifier
 		{ $$ = new ExpressionNode( build_fieldSel( yylloc, $1, build_varref( yylloc, $3 ) ) ); }
@@ -857,5 +859,5 @@
 	| constant
 	| string_literal
-		{ $$ = new ExpressionNode( $1 ); }
+		{ $$ = $1; }
 	| EXTENSION cast_expression							// GCC
 		{ $$ = $2->set_extension( true ); }
@@ -1260,7 +1262,7 @@
 
 case_value_list:										// CFA
-	case_value									{ $$ = new StatementNode( build_case( $1 ) ); }
+	case_value									{ $$ = new ClauseNode( build_case( yylloc, $1 ) ); }
 		// convert case list, e.g., "case 1, 3, 5:" into "case 1: case 3: case 5"
-	| case_value_list ',' case_value			{ $$ = (StatementNode *)($1->set_last( new StatementNode( build_case( $3 ) ) ) ); }
+	| case_value_list ',' case_value			{ $$ = $1->set_last( new ClauseNode( build_case( yylloc, $3 ) ) ); }
 	;
 
@@ -1271,5 +1273,5 @@
 	| CASE case_value_list error						// syntax error
 		{ SemanticError( yylloc, "Missing colon after case list." ); $$ = nullptr; }
-	| DEFAULT ':'								{ $$ = new StatementNode( build_default( yylloc ) ); }
+	| DEFAULT ':'								{ $$ = new ClauseNode( build_default( yylloc ) ); }
 		// A semantic check is required to ensure only one default clause per switch/choose statement.
 	| DEFAULT error										//  syntax error
@@ -1279,5 +1281,5 @@
 case_label_list:										// CFA
 	case_label
-	| case_label_list case_label				{ $$ = (StatementNode *)( $1->set_last( $2 )); }
+	| case_label_list case_label				{ $$ = $1->set_last( $2 ); }
 	;
 
@@ -1296,5 +1298,5 @@
 		{ $$ = $1->append_last_case( new StatementNode( build_compound( yylloc, $2 ) ) ); }
 	| switch_clause_list case_label_list statement_list_nodecl
-		{ $$ = (StatementNode *)( $1->set_last( $2->append_last_case( new StatementNode( build_compound( yylloc, $3 ) ) ) ) ); }
+		{ $$ = $1->set_last( $2->append_last_case( new StatementNode( build_compound( yylloc, $3 ) ) ) ); }
 	;
 
@@ -1679,5 +1681,5 @@
 
 waituntil:
-	WAITUNTIL '(' cast_expression ')'
+	WAITUNTIL '(' comma_expression ')'
 		{ $$ = $3; }
 	;
@@ -1736,7 +1738,7 @@
 handler_clause:
 	handler_key '(' push exception_declaration pop handler_predicate_opt ')' compound_statement
-		{ $$ = new StatementNode( build_catch( yylloc, $1, $4, $6, $8 ) ); }
+		{ $$ = new ClauseNode( build_catch( yylloc, $1, $4, $6, $8 ) ); }
 	| handler_clause handler_key '(' push exception_declaration pop handler_predicate_opt ')' compound_statement
-		{ $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( yylloc, $2, $5, $7, $9 ) ) ); }
+		{ $$ = $1->set_last( new ClauseNode( build_catch( yylloc, $2, $5, $7, $9 ) ) ); }
 	;
 
@@ -1755,5 +1757,5 @@
 
 finally_clause:
-	FINALLY compound_statement					{ $$ = new StatementNode( build_finally( yylloc, $2 ) ); }
+	FINALLY compound_statement					{ $$ = new ClauseNode( build_finally( yylloc, $2 ) ); }
 	;
 
@@ -1813,8 +1815,8 @@
 asm_operand:											// GCC
 	string_literal '(' constant_expression ')'
-		{ $$ = new ExpressionNode( new ast::AsmExpr( yylloc, "", $1, maybeMoveBuild( $3 ) ) ); }
+		{ $$ = new ExpressionNode( new ast::AsmExpr( yylloc, "", maybeMoveBuild( $1 ), maybeMoveBuild( $3 ) ) ); }
 	| '[' IDENTIFIER ']' string_literal '(' constant_expression ')'
 		{
-			$$ = new ExpressionNode( new ast::AsmExpr( yylloc, *$2.str, $4, maybeMoveBuild( $6 ) ) );
+			$$ = new ExpressionNode( new ast::AsmExpr( yylloc, *$2.str, maybeMoveBuild( $4 ), maybeMoveBuild( $6 ) ) );
 			delete $2.str;
 		}
@@ -1825,7 +1827,7 @@
 		{ $$ = nullptr; }								// use default argument
 	| string_literal
-		{ $$ = new ExpressionNode( $1 ); }
+		{ $$ = $1; }
 	| asm_clobbers_list_opt ',' string_literal
-		{ $$ = (ExpressionNode *)($1->set_last( new ExpressionNode( $3 ) )); }
+		{ $$ = (ExpressionNode *)( $1->set_last( $3 ) ); }
 	;
 
@@ -1899,5 +1901,5 @@
 static_assert:
 	STATICASSERT '(' constant_expression ',' string_literal ')' ';' // C11
-		{ $$ = DeclarationNode::newStaticAssert( $3, $5 ); }
+		{ $$ = DeclarationNode::newStaticAssert( $3, maybeMoveBuild( $5 ) ); }
 	| STATICASSERT '(' constant_expression ')' ';'		// CFA
 		{ $$ = DeclarationNode::newStaticAssert( $3, build_constantStr( yylloc, *new string( "\"\"" ) ) ); }
@@ -3329,5 +3331,5 @@
 		{
 			DeclarationNode * name = new DeclarationNode();
-			name->asmName = $3;
+			name->asmName = maybeMoveBuild( $3 );
 			$$ = name->addQualifiers( $5 );
 		}
Index: src/Parser/parserutility.h
===================================================================
--- src/Parser/parserutility.h	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/Parser/parserutility.h	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -24,10 +24,10 @@
 
 template< typename T >
-static inline auto maybeBuild( const T *orig ) -> decltype(orig->build()) {
+static inline auto maybeBuild( T * orig ) -> decltype(orig->build()) {
 	return (orig) ? orig->build() : nullptr;
 }
 
 template< typename T >
-static inline auto maybeMoveBuild( const T *orig ) -> decltype(orig->build()) {
+static inline auto maybeMoveBuild( T * orig ) -> decltype(orig->build()) {
 	auto ret = maybeBuild<T>(orig);
 	delete orig;
Index: src/ResolvExpr/CandidateFinder.cpp
===================================================================
--- src/ResolvExpr/CandidateFinder.cpp	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/ResolvExpr/CandidateFinder.cpp	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -55,4 +55,1882 @@
 namespace ResolvExpr {
 
+/// Unique identifier for matching expression resolutions to their requesting expression
+UniqueId globalResnSlot = 0;
+
+namespace {
+	/// First index is which argument, second is which alternative, third is which exploded element
+	using ExplodedArgs_new = std::deque< std::vector< ExplodedArg > >;
+
+	/// Returns a list of alternatives with the minimum cost in the given list
+	CandidateList findMinCost( const CandidateList & candidates ) {
+		CandidateList out;
+		Cost minCost = Cost::infinity;
+		for ( const CandidateRef & r : candidates ) {
+			if ( r->cost < minCost ) {
+				minCost = r->cost;
+				out.clear();
+				out.emplace_back( r );
+			} else if ( r->cost == minCost ) {
+				out.emplace_back( r );
+			}
+		}
+		return out;
+	}
+
+	/// Computes conversion cost for a given expression to a given type
+	const ast::Expr * computeExpressionConversionCost(
+		const ast::Expr * arg, const ast::Type * paramType, const ast::SymbolTable & symtab, const ast::TypeEnvironment & env, Cost & outCost
+	) {
+		Cost convCost = computeConversionCost(
+				arg->result, paramType, arg->get_lvalue(), symtab, env );
+		outCost += convCost;
+
+		// If there is a non-zero conversion cost, ignoring poly cost, then the expression requires
+		// conversion. Ignore poly cost for now, since this requires resolution of the cast to
+		// infer parameters and this does not currently work for the reason stated below
+		Cost tmpCost = convCost;
+		tmpCost.incPoly( -tmpCost.get_polyCost() );
+		if ( tmpCost != Cost::zero ) {
+			ast::ptr< ast::Type > newType = paramType;
+			env.apply( newType );
+			return new ast::CastExpr{ arg, newType };
+
+			// xxx - *should* be able to resolve this cast, but at the moment pointers are not
+			// castable to zero_t, but are implicitly convertible. This is clearly inconsistent,
+			// once this is fixed it should be possible to resolve the cast.
+			// xxx - this isn't working, it appears because type1 (parameter) is seen as widenable,
+			// but it shouldn't be because this makes the conversion from DT* to DT* since
+			// commontype(zero_t, DT*) is DT*, rather than nothing
+
+			// CandidateFinder finder{ symtab, env };
+			// finder.find( arg, ResolvMode::withAdjustment() );
+			// assertf( finder.candidates.size() > 0,
+			// 	"Somehow castable expression failed to find alternatives." );
+			// assertf( finder.candidates.size() == 1,
+			// 	"Somehow got multiple alternatives for known cast expression." );
+			// return finder.candidates.front()->expr;
+		}
+
+		return arg;
+	}
+
+	/// Computes conversion cost for a given candidate
+	Cost computeApplicationConversionCost(
+		CandidateRef cand, const ast::SymbolTable & symtab
+	) {
+		auto appExpr = cand->expr.strict_as< ast::ApplicationExpr >();
+		auto pointer = appExpr->func->result.strict_as< ast::PointerType >();
+		auto function = pointer->base.strict_as< ast::FunctionType >();
+
+		Cost convCost = Cost::zero;
+		const auto & params = function->params;
+		auto param = params.begin();
+		auto & args = appExpr->args;
+
+		for ( unsigned i = 0; i < args.size(); ++i ) {
+			const ast::Type * argType = args[i]->result;
+			PRINT(
+				std::cerr << "arg expression:" << std::endl;
+				ast::print( std::cerr, args[i], 2 );
+				std::cerr << "--- results are" << std::endl;
+				ast::print( std::cerr, argType, 2 );
+			)
+
+			if ( param == params.end() ) {
+				if ( function->isVarArgs ) {
+					convCost.incUnsafe();
+					PRINT( std::cerr << "end of params with varargs function: inc unsafe: "
+						<< convCost << std::endl; ; )
+					// convert reference-typed expressions into value-typed expressions
+					cand->expr = ast::mutate_field_index(
+						appExpr, &ast::ApplicationExpr::args, i,
+						referenceToRvalueConversion( args[i], convCost ) );
+					continue;
+				} else return Cost::infinity;
+			}
+
+			if ( auto def = args[i].as< ast::DefaultArgExpr >() ) {
+				// Default arguments should be free - don't include conversion cost.
+				// Unwrap them here because they are not relevant to the rest of the system
+				cand->expr = ast::mutate_field_index(
+					appExpr, &ast::ApplicationExpr::args, i, def->expr );
+				++param;
+				continue;
+			}
+
+			// mark conversion cost and also specialization cost of param type
+			// const ast::Type * paramType = (*param)->get_type();
+			cand->expr = ast::mutate_field_index(
+				appExpr, &ast::ApplicationExpr::args, i,
+				computeExpressionConversionCost(
+					args[i], *param, symtab, cand->env, convCost ) );
+			convCost.decSpec( specCost( *param ) );
+			++param;  // can't be in for-loop update because of the continue
+		}
+
+		if ( param != params.end() ) return Cost::infinity;
+
+		// specialization cost of return types can't be accounted for directly, it disables
+		// otherwise-identical calls, like this example based on auto-newline in the I/O lib:
+		//
+		//   forall(otype OS) {
+		//     void ?|?(OS&, int);  // with newline
+		//     OS&  ?|?(OS&, int);  // no newline, always chosen due to more specialization
+		//   }
+
+		// mark type variable and specialization cost of forall clause
+		convCost.incVar( function->forall.size() );
+		convCost.decSpec( function->assertions.size() );
+
+		return convCost;
+	}
+
+	void makeUnifiableVars(
+		const ast::FunctionType * type, ast::OpenVarSet & unifiableVars,
+		ast::AssertionSet & need
+	) {
+		for ( auto & tyvar : type->forall ) {
+			unifiableVars[ *tyvar ] = ast::TypeData{ tyvar->base };
+		}
+		for ( auto & assn : type->assertions ) {
+			need[ assn ].isUsed = true;
+		}
+	}
+
+	/// Gets a default value from an initializer, nullptr if not present
+	const ast::ConstantExpr * getDefaultValue( const ast::Init * init ) {
+		if ( auto si = dynamic_cast< const ast::SingleInit * >( init ) ) {
+			if ( auto ce = si->value.as< ast::CastExpr >() ) {
+				return ce->arg.as< ast::ConstantExpr >();
+			} else {
+				return si->value.as< ast::ConstantExpr >();
+			}
+		}
+		return nullptr;
+	}
+
+	/// State to iteratively build a match of parameter expressions to arguments
+	struct ArgPack {
+		std::size_t parent;          ///< Index of parent pack
+		ast::ptr< ast::Expr > expr;  ///< The argument stored here
+		Cost cost;                   ///< The cost of this argument
+		ast::TypeEnvironment env;    ///< Environment for this pack
+		ast::AssertionSet need;      ///< Assertions outstanding for this pack
+		ast::AssertionSet have;      ///< Assertions found for this pack
+		ast::OpenVarSet open;        ///< Open variables for this pack
+		unsigned nextArg;            ///< Index of next argument in arguments list
+		unsigned tupleStart;         ///< Number of tuples that start at this index
+		unsigned nextExpl;           ///< Index of next exploded element
+		unsigned explAlt;            ///< Index of alternative for nextExpl > 0
+
+		ArgPack()
+		: parent( 0 ), expr(), cost( Cost::zero ), env(), need(), have(), open(), nextArg( 0 ),
+		  tupleStart( 0 ), nextExpl( 0 ), explAlt( 0 ) {}
+
+		ArgPack(
+			const ast::TypeEnvironment & env, const ast::AssertionSet & need,
+			const ast::AssertionSet & have, const ast::OpenVarSet & open )
+		: parent( 0 ), expr(), cost( Cost::zero ), env( env ), need( need ), have( have ),
+		  open( open ), nextArg( 0 ), tupleStart( 0 ), nextExpl( 0 ), explAlt( 0 ) {}
+
+		ArgPack(
+			std::size_t parent, const ast::Expr * expr, ast::TypeEnvironment && env,
+			ast::AssertionSet && need, ast::AssertionSet && have, ast::OpenVarSet && open,
+			unsigned nextArg, unsigned tupleStart = 0, Cost cost = Cost::zero,
+			unsigned nextExpl = 0, unsigned explAlt = 0 )
+		: parent(parent), expr( expr ), cost( cost ), env( std::move( env ) ), need( std::move( need ) ),
+		  have( std::move( have ) ), open( std::move( open ) ), nextArg( nextArg ), tupleStart( tupleStart ),
+		  nextExpl( nextExpl ), explAlt( explAlt ) {}
+
+		ArgPack(
+			const ArgPack & o, ast::TypeEnvironment && env, ast::AssertionSet && need,
+			ast::AssertionSet && have, ast::OpenVarSet && open, unsigned nextArg, Cost added )
+		: parent( o.parent ), expr( o.expr ), cost( o.cost + added ), env( std::move( env ) ),
+		  need( std::move( need ) ), have( std::move( have ) ), open( std::move( open ) ), nextArg( nextArg ),
+		  tupleStart( o.tupleStart ), nextExpl( 0 ), explAlt( 0 ) {}
+
+		/// true if this pack is in the middle of an exploded argument
+		bool hasExpl() const { return nextExpl > 0; }
+
+		/// Gets the list of exploded candidates for this pack
+		const ExplodedArg & getExpl( const ExplodedArgs_new & args ) const {
+			return args[ nextArg-1 ][ explAlt ];
+		}
+
+		/// Ends a tuple expression, consolidating the appropriate args
+		void endTuple( const std::vector< ArgPack > & packs ) {
+			// add all expressions in tuple to list, summing cost
+			std::deque< const ast::Expr * > exprs;
+			const ArgPack * pack = this;
+			if ( expr ) { exprs.emplace_front( expr ); }
+			while ( pack->tupleStart == 0 ) {
+				pack = &packs[pack->parent];
+				exprs.emplace_front( pack->expr );
+				cost += pack->cost;
+			}
+			// reset pack to appropriate tuple
+			std::vector< ast::ptr< ast::Expr > > exprv( exprs.begin(), exprs.end() );
+			expr = new ast::TupleExpr{ expr->location, std::move( exprv ) };
+			tupleStart = pack->tupleStart - 1;
+			parent = pack->parent;
+		}
+	};
+
+	/// Instantiates an argument to match a parameter, returns false if no matching results left
+	bool instantiateArgument(
+		const CodeLocation & location,
+		const ast::Type * paramType, const ast::Init * init, const ExplodedArgs_new & args,
+		std::vector< ArgPack > & results, std::size_t & genStart, const ast::SymbolTable & symtab,
+		unsigned nTuples = 0
+	) {
+		if ( auto tupleType = dynamic_cast< const ast::TupleType * >( paramType ) ) {
+			// paramType is a TupleType -- group args into a TupleExpr
+			++nTuples;
+			for ( const ast::Type * type : *tupleType ) {
+				// xxx - dropping initializer changes behaviour from previous, but seems correct
+				// ^^^ need to handle the case where a tuple has a default argument
+				if ( ! instantiateArgument( location,
+					type, nullptr, args, results, genStart, symtab, nTuples ) ) return false;
+				nTuples = 0;
+			}
+			// re-constitute tuples for final generation
+			for ( auto i = genStart; i < results.size(); ++i ) {
+				results[i].endTuple( results );
+			}
+			return true;
+		} else if ( const ast::TypeInstType * ttype = Tuples::isTtype( paramType ) ) {
+			// paramType is a ttype, consumes all remaining arguments
+
+			// completed tuples; will be spliced to end of results to finish
+			std::vector< ArgPack > finalResults{};
+
+			// iterate until all results completed
+			std::size_t genEnd;
+			++nTuples;
+			do {
+				genEnd = results.size();
+
+				// add another argument to results
+				for ( std::size_t i = genStart; i < genEnd; ++i ) {
+					unsigned nextArg = results[i].nextArg;
+
+					// use next element of exploded tuple if present
+					if ( results[i].hasExpl() ) {
+						const ExplodedArg & expl = results[i].getExpl( args );
+
+						unsigned nextExpl = results[i].nextExpl + 1;
+						if ( nextExpl == expl.exprs.size() ) { nextExpl = 0; }
+
+						results.emplace_back(
+							i, expl.exprs[ results[i].nextExpl ], copy( results[i].env ),
+							copy( results[i].need ), copy( results[i].have ),
+							copy( results[i].open ), nextArg, nTuples, Cost::zero, nextExpl,
+							results[i].explAlt );
+
+						continue;
+					}
+
+					// finish result when out of arguments
+					if ( nextArg >= args.size() ) {
+						ArgPack newResult{
+							results[i].env, results[i].need, results[i].have, results[i].open };
+						newResult.nextArg = nextArg;
+						const ast::Type * argType = nullptr;
+
+						if ( nTuples > 0 || ! results[i].expr ) {
+							// first iteration or no expression to clone,
+							// push empty tuple expression
+							newResult.parent = i;
+							newResult.expr = new ast::TupleExpr( location, {} );
+							argType = newResult.expr->result;
+						} else {
+							// clone result to collect tuple
+							newResult.parent = results[i].parent;
+							newResult.cost = results[i].cost;
+							newResult.tupleStart = results[i].tupleStart;
+							newResult.expr = results[i].expr;
+							argType = newResult.expr->result;
+
+							if ( results[i].tupleStart > 0 && Tuples::isTtype( argType ) ) {
+								// the case where a ttype value is passed directly is special,
+								// e.g. for argument forwarding purposes
+								// xxx - what if passing multiple arguments, last of which is
+								//       ttype?
+								// xxx - what would happen if unify was changed so that unifying
+								//       tuple
+								// types flattened both before unifying lists? then pass in
+								// TupleType (ttype) below.
+								--newResult.tupleStart;
+							} else {
+								// collapse leftover arguments into tuple
+								newResult.endTuple( results );
+								argType = newResult.expr->result;
+							}
+						}
+
+						// check unification for ttype before adding to final
+						if (
+							unify(
+								ttype, argType, newResult.env, newResult.need, newResult.have,
+								newResult.open, symtab )
+						) {
+							finalResults.emplace_back( std::move( newResult ) );
+						}
+
+						continue;
+					}
+
+					// add each possible next argument
+					for ( std::size_t j = 0; j < args[nextArg].size(); ++j ) {
+						const ExplodedArg & expl = args[nextArg][j];
+
+						// fresh copies of parent parameters for this iteration
+						ast::TypeEnvironment env = results[i].env;
+						ast::OpenVarSet open = results[i].open;
+
+						env.addActual( expl.env, open );
+
+						// skip empty tuple arguments by (nearly) cloning parent into next gen
+						if ( expl.exprs.empty() ) {
+							results.emplace_back(
+								results[i], std::move( env ), copy( results[i].need ),
+								copy( results[i].have ), std::move( open ), nextArg + 1, expl.cost );
+
+							continue;
+						}
+
+						// add new result
+						results.emplace_back(
+							i, expl.exprs.front(), std::move( env ), copy( results[i].need ),
+							copy( results[i].have ), std::move( open ), nextArg + 1, nTuples,
+							expl.cost, expl.exprs.size() == 1 ? 0 : 1, j );
+					}
+				}
+
+				// reset for next round
+				genStart = genEnd;
+				nTuples = 0;
+			} while ( genEnd != results.size() );
+
+			// splice final results onto results
+			for ( std::size_t i = 0; i < finalResults.size(); ++i ) {
+				results.emplace_back( std::move( finalResults[i] ) );
+			}
+			return ! finalResults.empty();
+		}
+
+		// iterate each current subresult
+		std::size_t genEnd = results.size();
+		for ( std::size_t i = genStart; i < genEnd; ++i ) {
+			unsigned nextArg = results[i].nextArg;
+
+			// use remainder of exploded tuple if present
+			if ( results[i].hasExpl() ) {
+				const ExplodedArg & expl = results[i].getExpl( args );
+				const ast::Expr * expr = expl.exprs[ results[i].nextExpl ];
+
+				ast::TypeEnvironment env = results[i].env;
+				ast::AssertionSet need = results[i].need, have = results[i].have;
+				ast::OpenVarSet open = results[i].open;
+
+				const ast::Type * argType = expr->result;
+
+				PRINT(
+					std::cerr << "param type is ";
+					ast::print( std::cerr, paramType );
+					std::cerr << std::endl << "arg type is ";
+					ast::print( std::cerr, argType );
+					std::cerr << std::endl;
+				)
+
+				if ( unify( paramType, argType, env, need, have, open, symtab ) ) {
+					unsigned nextExpl = results[i].nextExpl + 1;
+					if ( nextExpl == expl.exprs.size() ) { nextExpl = 0; }
+
+					results.emplace_back(
+						i, expr, std::move( env ), std::move( need ), std::move( have ), std::move( open ), nextArg,
+						nTuples, Cost::zero, nextExpl, results[i].explAlt );
+				}
+
+				continue;
+			}
+
+			// use default initializers if out of arguments
+			if ( nextArg >= args.size() ) {
+				if ( const ast::ConstantExpr * cnst = getDefaultValue( init ) ) {
+					ast::TypeEnvironment env = results[i].env;
+					ast::AssertionSet need = results[i].need, have = results[i].have;
+					ast::OpenVarSet open = results[i].open;
+
+					if ( unify( paramType, cnst->result, env, need, have, open, symtab ) ) {
+						results.emplace_back(
+							i, new ast::DefaultArgExpr{ cnst->location, cnst }, std::move( env ),
+							std::move( need ), std::move( have ), std::move( open ), nextArg, nTuples );
+					}
+				}
+
+				continue;
+			}
+
+			// Check each possible next argument
+			for ( std::size_t j = 0; j < args[nextArg].size(); ++j ) {
+				const ExplodedArg & expl = args[nextArg][j];
+
+				// fresh copies of parent parameters for this iteration
+				ast::TypeEnvironment env = results[i].env;
+				ast::AssertionSet need = results[i].need, have = results[i].have;
+				ast::OpenVarSet open = results[i].open;
+
+				env.addActual( expl.env, open );
+
+				// skip empty tuple arguments by (nearly) cloning parent into next gen
+				if ( expl.exprs.empty() ) {
+					results.emplace_back(
+						results[i], std::move( env ), std::move( need ), std::move( have ), std::move( open ),
+						nextArg + 1, expl.cost );
+
+					continue;
+				}
+
+				// consider only first exploded arg
+				const ast::Expr * expr = expl.exprs.front();
+				const ast::Type * argType = expr->result;
+
+				PRINT(
+					std::cerr << "param type is ";
+					ast::print( std::cerr, paramType );
+					std::cerr << std::endl << "arg type is ";
+					ast::print( std::cerr, argType );
+					std::cerr << std::endl;
+				)
+
+				// attempt to unify types
+				if ( unify( paramType, argType, env, need, have, open, symtab ) ) {
+					// add new result
+					results.emplace_back(
+						i, expr, std::move( env ), std::move( need ), std::move( have ), std::move( open ),
+						nextArg + 1, nTuples, expl.cost, expl.exprs.size() == 1 ? 0 : 1, j );
+				}
+			}
+		}
+
+		// reset for next parameter
+		genStart = genEnd;
+
+		return genEnd != results.size();  // were any new results added?
+	}
+
+	/// Generate a cast expression from `arg` to `toType`
+	const ast::Expr * restructureCast(
+		ast::ptr< ast::Expr > & arg, const ast::Type * toType, ast::GeneratedFlag isGenerated = ast::GeneratedCast
+	) {
+		if (
+			arg->result->size() > 1
+			&& ! toType->isVoid()
+			&& ! dynamic_cast< const ast::ReferenceType * >( toType )
+		) {
+			// Argument is a tuple and the target type is neither void nor a reference. Cast each
+			// member of the tuple to its corresponding target type, producing the tuple of those
+			// cast expressions. If there are more components of the tuple than components in the
+			// target type, then excess components do not come out in the result expression (but
+			// UniqueExpr ensures that the side effects will still be produced)
+			if ( Tuples::maybeImpureIgnoreUnique( arg ) ) {
+				// expressions which may contain side effects require a single unique instance of
+				// the expression
+				arg = new ast::UniqueExpr{ arg->location, arg };
+			}
+			std::vector< ast::ptr< ast::Expr > > components;
+			for ( unsigned i = 0; i < toType->size(); ++i ) {
+				// cast each component
+				ast::ptr< ast::Expr > idx = new ast::TupleIndexExpr{ arg->location, arg, i };
+				components.emplace_back(
+					restructureCast( idx, toType->getComponent( i ), isGenerated ) );
+			}
+			return new ast::TupleExpr{ arg->location, std::move( components ) };
+		} else {
+			// handle normally
+			return new ast::CastExpr{ arg->location, arg, toType, isGenerated };
+		}
+	}
+
+	/// Gets the name from an untyped member expression (must be NameExpr)
+	const std::string & getMemberName( const ast::UntypedMemberExpr * memberExpr ) {
+		if ( memberExpr->member.as< ast::ConstantExpr >() ) {
+			SemanticError( memberExpr, "Indexed access to struct fields unsupported: " );
+		}
+
+		return memberExpr->member.strict_as< ast::NameExpr >()->name;
+	}
+
+	/// Actually visits expressions to find their candidate interpretations
+	class Finder final : public ast::WithShortCircuiting {
+		const ResolveContext & context;
+		const ast::SymbolTable & symtab;
+	public:
+		// static size_t traceId;
+		CandidateFinder & selfFinder;
+		CandidateList & candidates;
+		const ast::TypeEnvironment & tenv;
+		ast::ptr< ast::Type > & targetType;
+
+		enum Errors {
+			NotFound,
+			NoMatch,
+			ArgsToFew,
+			ArgsToMany,
+			RetsToFew,
+			RetsToMany,
+			NoReason
+		};
+
+		struct {
+			Errors code = NotFound;
+		} reason;
+
+		Finder( CandidateFinder & f )
+		: context( f.context ), symtab( context.symtab ), selfFinder( f ),
+		  candidates( f.candidates ), tenv( f.env ), targetType( f.targetType ) {}
+
+		void previsit( const ast::Node * ) { visit_children = false; }
+
+		/// Convenience to add candidate to list
+		template<typename... Args>
+		void addCandidate( Args &&... args ) {
+			candidates.emplace_back( new Candidate{ std::forward<Args>( args )... } );
+			reason.code = NoReason;
+		}
+
+		void postvisit( const ast::ApplicationExpr * applicationExpr ) {
+			addCandidate( applicationExpr, tenv );
+		}
+
+		/// Set up candidate assertions for inference
+		void inferParameters( CandidateRef & newCand, CandidateList & out );
+
+		/// Completes a function candidate with arguments located
+		void validateFunctionCandidate(
+			const CandidateRef & func, ArgPack & result, const std::vector< ArgPack > & results,
+			CandidateList & out );
+
+		/// Builds a list of candidates for a function, storing them in out
+		void makeFunctionCandidates(
+			const CodeLocation & location,
+			const CandidateRef & func, const ast::FunctionType * funcType,
+			const ExplodedArgs_new & args, CandidateList & out );
+
+		/// Adds implicit struct-conversions to the alternative list
+		void addAnonConversions( const CandidateRef & cand );
+
+		/// Adds aggregate member interpretations
+		void addAggMembers(
+			const ast::BaseInstType * aggrInst, const ast::Expr * expr,
+			const Candidate & cand, const Cost & addedCost, const std::string & name
+		);
+
+		/// Adds tuple member interpretations
+		void addTupleMembers(
+			const ast::TupleType * tupleType, const ast::Expr * expr, const Candidate & cand,
+			const Cost & addedCost, const ast::Expr * member
+		);
+
+		/// true if expression is an lvalue
+		static bool isLvalue( const ast::Expr * x ) {
+			return x->result && ( x->get_lvalue() || x->result.as< ast::ReferenceType >() );
+		}
+
+		void postvisit( const ast::UntypedExpr * untypedExpr );
+		void postvisit( const ast::VariableExpr * variableExpr );
+		void postvisit( const ast::ConstantExpr * constantExpr );
+		void postvisit( const ast::SizeofExpr * sizeofExpr );
+		void postvisit( const ast::AlignofExpr * alignofExpr );
+		void postvisit( const ast::AddressExpr * addressExpr );
+		void postvisit( const ast::LabelAddressExpr * labelExpr );
+		void postvisit( const ast::CastExpr * castExpr );
+		void postvisit( const ast::VirtualCastExpr * castExpr );
+		void postvisit( const ast::KeywordCastExpr * castExpr );
+		void postvisit( const ast::UntypedMemberExpr * memberExpr );
+		void postvisit( const ast::MemberExpr * memberExpr );
+		void postvisit( const ast::NameExpr * nameExpr );
+		void postvisit( const ast::UntypedOffsetofExpr * offsetofExpr );
+		void postvisit( const ast::OffsetofExpr * offsetofExpr );
+		void postvisit( const ast::OffsetPackExpr * offsetPackExpr );
+		void postvisit( const ast::LogicalExpr * logicalExpr );
+		void postvisit( const ast::ConditionalExpr * conditionalExpr );
+		void postvisit( const ast::CommaExpr * commaExpr );
+		void postvisit( const ast::ImplicitCopyCtorExpr * ctorExpr );
+		void postvisit( const ast::ConstructorExpr * ctorExpr );
+		void postvisit( const ast::RangeExpr * rangeExpr );
+		void postvisit( const ast::UntypedTupleExpr * tupleExpr );
+		void postvisit( const ast::TupleExpr * tupleExpr );
+		void postvisit( const ast::TupleIndexExpr * tupleExpr );
+		void postvisit( const ast::TupleAssignExpr * tupleExpr );
+		void postvisit( const ast::UniqueExpr * unqExpr );
+		void postvisit( const ast::StmtExpr * stmtExpr );
+		void postvisit( const ast::UntypedInitExpr * initExpr );
+
+		void postvisit( const ast::InitExpr * ) {
+			assertf( false, "CandidateFinder should never see a resolved InitExpr." );
+		}
+
+		void postvisit( const ast::DeletedExpr * ) {
+			assertf( false, "CandidateFinder should never see a DeletedExpr." );
+		}
+
+		void postvisit( const ast::GenericExpr * ) {
+			assertf( false, "_Generic is not yet supported." );
+		}
+	};
+
+	/// Set up candidate assertions for inference
+	void Finder::inferParameters( CandidateRef & newCand, CandidateList & out ) {
+		// Set need bindings for any unbound assertions
+		UniqueId crntResnSlot = 0; // matching ID for this expression's assertions
+		for ( auto & assn : newCand->need ) {
+			// skip already-matched assertions
+			if ( assn.second.resnSlot != 0 ) continue;
+			// assign slot for expression if needed
+			if ( crntResnSlot == 0 ) { crntResnSlot = ++globalResnSlot; }
+			// fix slot to assertion
+			assn.second.resnSlot = crntResnSlot;
+		}
+		// pair slot to expression
+		if ( crntResnSlot != 0 ) {
+			newCand->expr.get_and_mutate()->inferred.resnSlots().emplace_back( crntResnSlot );
+		}
+
+		// add to output list; assertion satisfaction will occur later
+		out.emplace_back( newCand );
+	}
+
+	/// Completes a function candidate with arguments located
+	void Finder::validateFunctionCandidate(
+		const CandidateRef & func, ArgPack & result, const std::vector< ArgPack > & results,
+		CandidateList & out
+	) {
+		ast::ApplicationExpr * appExpr =
+			new ast::ApplicationExpr{ func->expr->location, func->expr };
+		// sum cost and accumulate arguments
+		std::deque< const ast::Expr * > args;
+		Cost cost = func->cost;
+		const ArgPack * pack = &result;
+		while ( pack->expr ) {
+			args.emplace_front( pack->expr );
+			cost += pack->cost;
+			pack = &results[pack->parent];
+		}
+		std::vector< ast::ptr< ast::Expr > > vargs( args.begin(), args.end() );
+		appExpr->args = std::move( vargs );
+		// build and validate new candidate
+		auto newCand =
+			std::make_shared<Candidate>( appExpr, result.env, result.open, result.need, cost );
+		PRINT(
+			std::cerr << "instantiate function success: " << appExpr << std::endl;
+			std::cerr << "need assertions:" << std::endl;
+			ast::print( std::cerr, result.need, 2 );
+		)
+		inferParameters( newCand, out );
+	}
+
+	/// Builds a list of candidates for a function, storing them in out
+	void Finder::makeFunctionCandidates(
+		const CodeLocation & location,
+		const CandidateRef & func, const ast::FunctionType * funcType,
+		const ExplodedArgs_new & args, CandidateList & out
+	) {
+		ast::OpenVarSet funcOpen;
+		ast::AssertionSet funcNeed, funcHave;
+		ast::TypeEnvironment funcEnv{ func->env };
+		makeUnifiableVars( funcType, funcOpen, funcNeed );
+		// add all type variables as open variables now so that those not used in the
+		// parameter list are still considered open
+		funcEnv.add( funcType->forall );
+
+		if ( targetType && ! targetType->isVoid() && ! funcType->returns.empty() ) {
+			// attempt to narrow based on expected target type
+			const ast::Type * returnType = funcType->returns.front();
+			if ( ! unify(
+				returnType, targetType, funcEnv, funcNeed, funcHave, funcOpen, symtab )
+			) {
+				// unification failed, do not pursue this candidate
+				return;
+			}
+		}
+
+		// iteratively build matches, one parameter at a time
+		std::vector< ArgPack > results;
+		results.emplace_back( funcEnv, funcNeed, funcHave, funcOpen );
+		std::size_t genStart = 0;
+
+		// xxx - how to handle default arg after change to ftype representation?
+		if (const ast::VariableExpr * varExpr = func->expr.as<ast::VariableExpr>()) {
+			if (const ast::FunctionDecl * funcDecl = varExpr->var.as<ast::FunctionDecl>()) {
+				// function may have default args only if directly calling by name
+				// must use types on candidate however, due to RenameVars substitution
+				auto nParams = funcType->params.size();
+
+				for (size_t i=0; i<nParams; ++i) {
+					auto obj = funcDecl->params[i].strict_as<ast::ObjectDecl>();
+					if (!instantiateArgument( location,
+						funcType->params[i], obj->init, args, results, genStart, symtab)) return;
+				}
+				goto endMatch;
+			}
+		}
+		for ( const auto & param : funcType->params ) {
+			// Try adding the arguments corresponding to the current parameter to the existing
+			// matches
+			// no default args for indirect calls
+			if ( ! instantiateArgument( location,
+				param, nullptr, args, results, genStart, symtab ) ) return;
+		}
+
+		endMatch:
+		if ( funcType->isVarArgs ) {
+			// append any unused arguments to vararg pack
+			std::size_t genEnd;
+			do {
+				genEnd = results.size();
+
+				// iterate results
+				for ( std::size_t i = genStart; i < genEnd; ++i ) {
+					unsigned nextArg = results[i].nextArg;
+
+					// use remainder of exploded tuple if present
+					if ( results[i].hasExpl() ) {
+						const ExplodedArg & expl = results[i].getExpl( args );
+
+						unsigned nextExpl = results[i].nextExpl + 1;
+						if ( nextExpl == expl.exprs.size() ) { nextExpl = 0; }
+
+						results.emplace_back(
+							i, expl.exprs[ results[i].nextExpl ], copy( results[i].env ),
+							copy( results[i].need ), copy( results[i].have ),
+							copy( results[i].open ), nextArg, 0, Cost::zero, nextExpl,
+							results[i].explAlt );
+
+						continue;
+					}
+
+					// finish result when out of arguments
+					if ( nextArg >= args.size() ) {
+						validateFunctionCandidate( func, results[i], results, out );
+
+						continue;
+					}
+
+					// add each possible next argument
+					for ( std::size_t j = 0; j < args[nextArg].size(); ++j ) {
+						const ExplodedArg & expl = args[nextArg][j];
+
+						// fresh copies of parent parameters for this iteration
+						ast::TypeEnvironment env = results[i].env;
+						ast::OpenVarSet open = results[i].open;
+
+						env.addActual( expl.env, open );
+
+						// skip empty tuple arguments by (nearly) cloning parent into next gen
+						if ( expl.exprs.empty() ) {
+							results.emplace_back(
+								results[i], std::move( env ), copy( results[i].need ),
+								copy( results[i].have ), std::move( open ), nextArg + 1,
+								expl.cost );
+
+							continue;
+						}
+
+						// add new result
+						results.emplace_back(
+							i, expl.exprs.front(), std::move( env ), copy( results[i].need ),
+							copy( results[i].have ), std::move( open ), nextArg + 1, 0, expl.cost,
+							expl.exprs.size() == 1 ? 0 : 1, j );
+					}
+				}
+
+				genStart = genEnd;
+			} while( genEnd != results.size() );
+		} else {
+			// filter out the results that don't use all the arguments
+			for ( std::size_t i = genStart; i < results.size(); ++i ) {
+				ArgPack & result = results[i];
+				if ( ! result.hasExpl() && result.nextArg >= args.size() ) {
+					validateFunctionCandidate( func, result, results, out );
+				}
+			}
+		}
+	}
+
+	/// Adds implicit struct-conversions to the alternative list
+	void Finder::addAnonConversions( const CandidateRef & cand ) {
+		// adds anonymous member interpretations whenever an aggregate value type is seen.
+		// it's okay for the aggregate expression to have reference type -- cast it to the
+		// base type to treat the aggregate as the referenced value
+		ast::ptr< ast::Expr > aggrExpr( cand->expr );
+		ast::ptr< ast::Type > & aggrType = aggrExpr.get_and_mutate()->result;
+		cand->env.apply( aggrType );
+
+		if ( aggrType.as< ast::ReferenceType >() ) {
+			aggrExpr = new ast::CastExpr{ aggrExpr, aggrType->stripReferences() };
+		}
+
+		if ( auto structInst = aggrExpr->result.as< ast::StructInstType >() ) {
+			addAggMembers( structInst, aggrExpr, *cand, Cost::safe, "" );
+		} else if ( auto unionInst = aggrExpr->result.as< ast::UnionInstType >() ) {
+			addAggMembers( unionInst, aggrExpr, *cand, Cost::safe, "" );
+		}
+	}
+
+	/// Adds aggregate member interpretations
+	void Finder::addAggMembers(
+		const ast::BaseInstType * aggrInst, const ast::Expr * expr,
+		const Candidate & cand, const Cost & addedCost, const std::string & name
+	) {
+		for ( const ast::Decl * decl : aggrInst->lookup( name ) ) {
+			auto dwt = strict_dynamic_cast< const ast::DeclWithType * >( decl );
+			CandidateRef newCand = std::make_shared<Candidate>(
+				cand, new ast::MemberExpr{ expr->location, dwt, expr }, addedCost );
+			// add anonymous member interpretations whenever an aggregate value type is seen
+			// as a member expression
+			addAnonConversions( newCand );
+			candidates.emplace_back( std::move( newCand ) );
+		}
+	}
+
+	/// Adds tuple member interpretations
+	void Finder::addTupleMembers(
+		const ast::TupleType * tupleType, const ast::Expr * expr, const Candidate & cand,
+		const Cost & addedCost, const ast::Expr * member
+	) {
+		if ( auto constantExpr = dynamic_cast< const ast::ConstantExpr * >( member ) ) {
+			// get the value of the constant expression as an int, must be between 0 and the
+			// length of the tuple to have meaning
+			long long val = constantExpr->intValue();
+			if ( val >= 0 && (unsigned long long)val < tupleType->size() ) {
+				addCandidate(
+					cand, new ast::TupleIndexExpr{ expr->location, expr, (unsigned)val },
+					addedCost );
+			}
+		}
+	}
+
+	void Finder::postvisit( const ast::UntypedExpr * untypedExpr ) {
+		std::vector< CandidateFinder > argCandidates =
+			selfFinder.findSubExprs( untypedExpr->args );
+
+		// take care of possible tuple assignments
+		// if not tuple assignment, handled as normal function call
+		Tuples::handleTupleAssignment( selfFinder, untypedExpr, argCandidates );
+
+		CandidateFinder funcFinder( context, tenv );
+		if (auto nameExpr = untypedExpr->func.as<ast::NameExpr>()) {
+			auto kind = ast::SymbolTable::getSpecialFunctionKind(nameExpr->name);
+			if (kind != ast::SymbolTable::SpecialFunctionKind::NUMBER_OF_KINDS) {
+				assertf(!argCandidates.empty(), "special function call without argument");
+				for (auto & firstArgCand: argCandidates[0]) {
+					ast::ptr<ast::Type> argType = firstArgCand->expr->result;
+					firstArgCand->env.apply(argType);
+					// strip references
+					// xxx - is this correct?
+					while (argType.as<ast::ReferenceType>()) argType = argType.as<ast::ReferenceType>()->base;
+
+					// convert 1-tuple to plain type
+					if (auto tuple = argType.as<ast::TupleType>()) {
+						if (tuple->size() == 1) {
+							argType = tuple->types[0];
+						}
+					}
+
+					// if argType is an unbound type parameter, all special functions need to be searched.
+					if (isUnboundType(argType)) {
+						funcFinder.otypeKeys.clear();
+						break;
+					}
+
+					if (argType.as<ast::PointerType>()) funcFinder.otypeKeys.insert(Mangle::Encoding::pointer);						
+					// else if (const ast::EnumInstType * enumInst = argType.as<ast::EnumInstType>()) {
+					// 	const ast::EnumDecl * enumDecl = enumInst->base; // Here
+					// 	if ( const ast::Type* enumType = enumDecl->base ) {
+					// 		// instance of enum (T) is a instance of type (T)
+					// 		funcFinder.otypeKeys.insert(Mangle::mangle(enumType, Mangle::NoGenericParams | Mangle::Type));
+					// 	} else {
+					// 		// instance of an untyped enum is techically int
+					// 		funcFinder.otypeKeys.insert(Mangle::mangle(enumDecl, Mangle::NoGenericParams | Mangle::Type));
+					// 	}
+					// }
+					else funcFinder.otypeKeys.insert(Mangle::mangle(argType, Mangle::NoGenericParams | Mangle::Type));
+				}
+			}
+		}
+		// if candidates are already produced, do not fail
+		// xxx - is it possible that handleTupleAssignment and main finder both produce candidates?
+		// this means there exists ctor/assign functions with a tuple as first parameter.
+		ResolvMode mode = {
+			true, // adjust
+			!untypedExpr->func.as<ast::NameExpr>(), // prune if not calling by name
+			selfFinder.candidates.empty() // failfast if other options are not found
+		};
+		funcFinder.find( untypedExpr->func, mode );
+		// short-circuit if no candidates
+		// if ( funcFinder.candidates.empty() ) return;
+
+		reason.code = NoMatch;
+
+		// find function operators
+		ast::ptr< ast::Expr > opExpr = new ast::NameExpr{ untypedExpr->location, "?()" }; // ??? why not ?{}
+		CandidateFinder opFinder( context, tenv );
+		// okay if there aren't any function operations
+		opFinder.find( opExpr, ResolvMode::withoutFailFast() );
+		PRINT(
+			std::cerr << "known function ops:" << std::endl;
+			print( std::cerr, opFinder.candidates, 1 );
+		)
+
+		// pre-explode arguments
+		ExplodedArgs_new argExpansions;
+		for ( const CandidateFinder & args : argCandidates ) {
+			argExpansions.emplace_back();
+			auto & argE = argExpansions.back();
+			for ( const CandidateRef & arg : args ) { argE.emplace_back( *arg, symtab ); }
+		}
+
+		// Find function matches
+		CandidateList found;
+		SemanticErrorException errors;
+		for ( CandidateRef & func : funcFinder ) {
+			try {
+				PRINT(
+					std::cerr << "working on alternative:" << std::endl;
+					print( std::cerr, *func, 2 );
+				)
+
+				// check if the type is a pointer to function
+				const ast::Type * funcResult = func->expr->result->stripReferences();
+				if ( auto pointer = dynamic_cast< const ast::PointerType * >( funcResult ) ) {
+					if ( auto function = pointer->base.as< ast::FunctionType >() ) {
+						CandidateRef newFunc{ new Candidate{ *func } };
+						newFunc->expr =
+							referenceToRvalueConversion( newFunc->expr, newFunc->cost );
+						makeFunctionCandidates( untypedExpr->location,
+							newFunc, function, argExpansions, found );
+					}
+				} else if (
+					auto inst = dynamic_cast< const ast::TypeInstType * >( funcResult )
+				) {
+					if ( const ast::EqvClass * clz = func->env.lookup( *inst ) ) {
+						if ( auto function = clz->bound.as< ast::FunctionType >() ) {
+							CandidateRef newFunc{ new Candidate{ *func } };
+							newFunc->expr =
+								referenceToRvalueConversion( newFunc->expr, newFunc->cost );
+							makeFunctionCandidates( untypedExpr->location,
+								newFunc, function, argExpansions, found );
+						}
+					}
+				}
+			} catch ( SemanticErrorException & e ) { errors.append( e ); }
+		}
+
+		// Find matches on function operators `?()`
+		if ( ! opFinder.candidates.empty() ) {
+			// add exploded function alternatives to front of argument list
+			std::vector< ExplodedArg > funcE;
+			funcE.reserve( funcFinder.candidates.size() );
+			for ( const CandidateRef & func : funcFinder ) {
+				funcE.emplace_back( *func, symtab );
+			}
+			argExpansions.emplace_front( std::move( funcE ) );
+
+			for ( const CandidateRef & op : opFinder ) {
+				try {
+					// check if type is pointer-to-function
+					const ast::Type * opResult = op->expr->result->stripReferences();
+					if ( auto pointer = dynamic_cast< const ast::PointerType * >( opResult ) ) {
+						if ( auto function = pointer->base.as< ast::FunctionType >() ) {
+							CandidateRef newOp{ new Candidate{ *op} };
+							newOp->expr =
+								referenceToRvalueConversion( newOp->expr, newOp->cost );
+							makeFunctionCandidates( untypedExpr->location,
+								newOp, function, argExpansions, found );
+						}
+					}
+				} catch ( SemanticErrorException & e ) { errors.append( e ); }
+			}
+		}
+
+		// Implement SFINAE; resolution errors are only errors if there aren't any non-error
+		// candidates
+		if ( found.empty() && ! errors.isEmpty() ) { throw errors; }
+
+		// Compute conversion costs
+		for ( CandidateRef & withFunc : found ) {
+			Cost cvtCost = computeApplicationConversionCost( withFunc, symtab );
+
+			PRINT(
+				auto appExpr = withFunc->expr.strict_as< ast::ApplicationExpr >();
+				auto pointer = appExpr->func->result.strict_as< ast::PointerType >();
+				auto function = pointer->base.strict_as< ast::FunctionType >();
+
+				std::cerr << "Case +++++++++++++ " << appExpr->func << std::endl;
+				std::cerr << "parameters are:" << std::endl;
+				ast::printAll( std::cerr, function->params, 2 );
+				std::cerr << "arguments are:" << std::endl;
+				ast::printAll( std::cerr, appExpr->args, 2 );
+				std::cerr << "bindings are:" << std::endl;
+				ast::print( std::cerr, withFunc->env, 2 );
+				std::cerr << "cost is: " << withFunc->cost << std::endl;
+				std::cerr << "cost of conversion is:" << cvtCost << std::endl;
+			)
+
+			if ( cvtCost != Cost::infinity ) {
+				withFunc->cvtCost = cvtCost;
+				candidates.emplace_back( std::move( withFunc ) );
+			}
+		}
+		found = std::move( candidates );
+
+		// use a new list so that candidates are not examined by addAnonConversions twice
+		CandidateList winners = findMinCost( found );
+		promoteCvtCost( winners );
+
+		// function may return a struct/union value, in which case we need to add candidates
+		// for implicit conversions to each of the anonymous members, which must happen after
+		// `findMinCost`, since anon conversions are never the cheapest
+		for ( const CandidateRef & c : winners ) {
+			addAnonConversions( c );
+		}
+		spliceBegin( candidates, winners );
+
+		if ( candidates.empty() && targetType && ! targetType->isVoid() ) {
+			// If resolution is unsuccessful with a target type, try again without, since it
+			// will sometimes succeed when it wouldn't with a target type binding.
+			// For example:
+			//   forall( otype T ) T & ?[]( T *, ptrdiff_t );
+			//   const char * x = "hello world";
+			//   unsigned char ch = x[0];
+			// Fails with simple return type binding (xxx -- check this!) as follows:
+			// * T is bound to unsigned char
+			// * (x: const char *) is unified with unsigned char *, which fails
+			// xxx -- fix this better
+			targetType = nullptr;
+			postvisit( untypedExpr );
+		}
+	}
+
+	void Finder::postvisit( const ast::AddressExpr * addressExpr ) {
+		CandidateFinder finder( context, tenv );
+		finder.find( addressExpr->arg );
+
+		if ( finder.candidates.empty() ) return;
+
+		reason.code = NoMatch;
+
+		for ( CandidateRef & r : finder.candidates ) {
+			if ( ! isLvalue( r->expr ) ) continue;
+			addCandidate( *r, new ast::AddressExpr{ addressExpr->location, r->expr } );
+		}
+	}
+
+	void Finder::postvisit( const ast::LabelAddressExpr * labelExpr ) {
+		addCandidate( labelExpr, tenv );
+	}
+
+	void Finder::postvisit( const ast::CastExpr * castExpr ) {
+		ast::ptr< ast::Type > toType = castExpr->result;
+		assert( toType );
+		toType = resolveTypeof( toType, context );
+		toType = adjustExprType( toType, tenv, symtab );
+
+		CandidateFinder finder( context, tenv, toType );
+		finder.find( castExpr->arg, ResolvMode::withAdjustment() );
+
+		if ( !finder.candidates.empty() ) reason.code = NoMatch;
+
+		CandidateList matches;
+		for ( CandidateRef & cand : finder.candidates ) {
+			ast::AssertionSet need( cand->need.begin(), cand->need.end() ), have;
+			ast::OpenVarSet open( cand->open );
+
+			cand->env.extractOpenVars( open );
+
+			// It is possible that a cast can throw away some values in a multiply-valued
+			// expression, e.g. cast-to-void, one value to zero. Figure out the prefix of the
+			// subexpression results that are cast directly. The candidate is invalid if it
+			// has fewer results than there are types to cast to.
+			int discardedValues = cand->expr->result->size() - toType->size();
+			if ( discardedValues < 0 ) continue;
+
+			// unification run for side-effects
+			unify( toType, cand->expr->result, cand->env, need, have, open, symtab );
+			Cost thisCost =
+				(castExpr->isGenerated == ast::GeneratedFlag::GeneratedCast)
+					? conversionCost( cand->expr->result, toType, cand->expr->get_lvalue(), symtab, cand->env )
+					: castCost( cand->expr->result, toType, cand->expr->get_lvalue(), symtab, cand->env );
+
+			PRINT(
+				std::cerr << "working on cast with result: " << toType << std::endl;
+				std::cerr << "and expr type: " << cand->expr->result << std::endl;
+				std::cerr << "env: " << cand->env << std::endl;
+			)
+			if ( thisCost != Cost::infinity ) {
+				PRINT(
+					std::cerr << "has finite cost." << std::endl;
+				)
+				// count one safe conversion for each value that is thrown away
+				thisCost.incSafe( discardedValues );
+				CandidateRef newCand = std::make_shared<Candidate>(
+					restructureCast( cand->expr, toType, castExpr->isGenerated ),
+					copy( cand->env ), std::move( open ), std::move( need ), cand->cost,
+					cand->cost + thisCost );
+				inferParameters( newCand, matches );
+			}
+		}
+
+		// select first on argument cost, then conversion cost
+		CandidateList minArgCost = findMinCost( matches );
+		promoteCvtCost( minArgCost );
+		candidates = findMinCost( minArgCost );
+	}
+
+	void Finder::postvisit( const ast::VirtualCastExpr * castExpr ) {
+		assertf( castExpr->result, "Implicit virtual cast targets not yet supported." );
+		CandidateFinder finder( context, tenv );
+		// don't prune here, all alternatives guaranteed to have same type
+		finder.find( castExpr->arg, ResolvMode::withoutPrune() );
+		for ( CandidateRef & r : finder.candidates ) {
+			addCandidate(
+				*r,
+				new ast::VirtualCastExpr{ castExpr->location, r->expr, castExpr->result } );
+		}
+	}
+
+	void Finder::postvisit( const ast::KeywordCastExpr * castExpr ) {
+		const auto & loc = castExpr->location;
+		assertf( castExpr->result, "Cast target should have been set in Validate." );
+		auto ref = castExpr->result.strict_as<ast::ReferenceType>();
+		auto inst = ref->base.strict_as<ast::StructInstType>();
+		auto target = inst->base.get();
+
+		CandidateFinder finder( context, tenv );
+
+		auto pick_alternatives = [target, this](CandidateList & found, bool expect_ref) {
+			for (auto & cand : found) {
+				const ast::Type * expr = cand->expr->result.get();
+				if (expect_ref) {
+					auto res = dynamic_cast<const ast::ReferenceType*>(expr);
+					if (!res) { continue; }
+					expr = res->base.get();
+				}
+
+				if (auto insttype = dynamic_cast<const ast::TypeInstType*>(expr)) {
+					auto td = cand->env.lookup(*insttype);
+					if (!td) { continue; }
+					expr = td->bound.get();
+				}
+
+				if (auto base = dynamic_cast<const ast::StructInstType*>(expr)) {
+					if (base->base == target) {
+						candidates.push_back( std::move(cand) );
+						reason.code = NoReason;
+					}
+				}
+			}
+		};
+
+		try {
+			// Attempt 1 : turn (thread&)X into (thread$&)X.__thrd
+			// Clone is purely for memory management
+			std::unique_ptr<const ast::Expr> tech1 { new ast::UntypedMemberExpr(loc, new ast::NameExpr(loc, castExpr->concrete_target.field), castExpr->arg) };
+
+			// don't prune here, since it's guaranteed all alternatives will have the same type
+			finder.find( tech1.get(), ResolvMode::withoutPrune() );
+			pick_alternatives(finder.candidates, false);
+
+			return;
+		} catch(SemanticErrorException & ) {}
+
+		// Fallback : turn (thread&)X into (thread$&)get_thread(X)
+		std::unique_ptr<const ast::Expr> fallback { ast::UntypedExpr::createDeref(loc,  new ast::UntypedExpr(loc, new ast::NameExpr(loc, castExpr->concrete_target.getter), { castExpr->arg })) };
+		// don't prune here, since it's guaranteed all alternatives will have the same type
+		finder.find( fallback.get(), ResolvMode::withoutPrune() );
+
+		pick_alternatives(finder.candidates, true);
+
+		// Whatever happens here, we have no more fallbacks
+	}
+
+	void Finder::postvisit( const ast::UntypedMemberExpr * memberExpr ) {
+		CandidateFinder aggFinder( context, tenv );
+		aggFinder.find( memberExpr->aggregate, ResolvMode::withAdjustment() );
+		for ( CandidateRef & agg : aggFinder.candidates ) {
+			// it's okay for the aggregate expression to have reference type -- cast it to the
+			// base type to treat the aggregate as the referenced value
+			Cost addedCost = Cost::zero;
+			agg->expr = referenceToRvalueConversion( agg->expr, addedCost );
+
+			// find member of the given type
+			if ( auto structInst = agg->expr->result.as< ast::StructInstType >() ) {
+				addAggMembers(
+					structInst, agg->expr, *agg, addedCost, getMemberName( memberExpr ) );
+			} else if ( auto unionInst = agg->expr->result.as< ast::UnionInstType >() ) {
+				addAggMembers(
+					unionInst, agg->expr, *agg, addedCost, getMemberName( memberExpr ) );
+			} else if ( auto tupleType = agg->expr->result.as< ast::TupleType >() ) {
+				addTupleMembers( tupleType, agg->expr, *agg, addedCost, memberExpr->member );
+			}
+		}
+	}
+
+	void Finder::postvisit( const ast::MemberExpr * memberExpr ) {
+		addCandidate( memberExpr, tenv );
+	}
+
+	void Finder::postvisit( const ast::NameExpr * nameExpr ) {
+		std::vector< ast::SymbolTable::IdData > declList;
+		if (!selfFinder.otypeKeys.empty()) {
+			auto kind = ast::SymbolTable::getSpecialFunctionKind(nameExpr->name);
+			assertf(kind != ast::SymbolTable::SpecialFunctionKind::NUMBER_OF_KINDS, "special lookup with non-special target: %s", nameExpr->name.c_str());
+
+			for (auto & otypeKey: selfFinder.otypeKeys) {
+				auto result = symtab.specialLookupId(kind, otypeKey);
+				declList.insert(declList.end(), std::make_move_iterator(result.begin()), std::make_move_iterator(result.end()));
+			}
+		} else {
+			declList = symtab.lookupId( nameExpr->name );
+		}
+		PRINT( std::cerr << "nameExpr is " << nameExpr->name << std::endl; )
+
+		if ( declList.empty() ) return;
+
+		reason.code = NoMatch;
+
+		for ( auto & data : declList ) {
+			Cost cost = Cost::zero;
+			ast::Expr * newExpr = data.combine( nameExpr->location, cost );
+
+			CandidateRef newCand = std::make_shared<Candidate>(
+				newExpr, copy( tenv ), ast::OpenVarSet{}, ast::AssertionSet{}, Cost::zero,
+				cost );
+
+			if (newCand->expr->env) {
+				newCand->env.add(*newCand->expr->env);
+				auto mutExpr = newCand->expr.get_and_mutate();
+				mutExpr->env  = nullptr;
+				newCand->expr = mutExpr;
+			}
+
+			PRINT(
+				std::cerr << "decl is ";
+				ast::print( std::cerr, data.id );
+				std::cerr << std::endl;
+				std::cerr << "newExpr is ";
+				ast::print( std::cerr, newExpr );
+				std::cerr << std::endl;
+			)
+			newCand->expr = ast::mutate_field(
+				newCand->expr.get(), &ast::Expr::result,
+				renameTyVars( newCand->expr->result ) );
+			// add anonymous member interpretations whenever an aggregate value type is seen
+			// as a name expression
+			addAnonConversions( newCand );
+			candidates.emplace_back( std::move( newCand ) );
+		}
+	}
+
+	void Finder::postvisit( const ast::VariableExpr * variableExpr ) {
+		// not sufficient to just pass `variableExpr` here, type might have changed since
+		// creation
+		addCandidate(
+			new ast::VariableExpr{ variableExpr->location, variableExpr->var }, tenv );
+	}
+
+	void Finder::postvisit( const ast::ConstantExpr * constantExpr ) {
+		addCandidate( constantExpr, tenv );
+	}
+
+	void Finder::postvisit( const ast::SizeofExpr * sizeofExpr ) {
+		if ( sizeofExpr->type ) {
+			addCandidate(
+				new ast::SizeofExpr{
+					sizeofExpr->location, resolveTypeof( sizeofExpr->type, context ) },
+				tenv );
+		} else {
+			// find all candidates for the argument to sizeof
+			CandidateFinder finder( context, tenv );
+			finder.find( sizeofExpr->expr );
+			// find the lowest-cost candidate, otherwise ambiguous
+			CandidateList winners = findMinCost( finder.candidates );
+			if ( winners.size() != 1 ) {
+				SemanticError(
+					sizeofExpr->expr.get(), "Ambiguous expression in sizeof operand: " );
+			}
+			// return the lowest-cost candidate
+			CandidateRef & choice = winners.front();
+			choice->expr = referenceToRvalueConversion( choice->expr, choice->cost );
+			choice->cost = Cost::zero;
+			addCandidate( *choice, new ast::SizeofExpr{ sizeofExpr->location, choice->expr } );
+		}
+	}
+
+	void Finder::postvisit( const ast::AlignofExpr * alignofExpr ) {
+		if ( alignofExpr->type ) {
+			addCandidate(
+				new ast::AlignofExpr{
+					alignofExpr->location, resolveTypeof( alignofExpr->type, context ) },
+				tenv );
+		} else {
+			// find all candidates for the argument to alignof
+			CandidateFinder finder( context, tenv );
+			finder.find( alignofExpr->expr );
+			// find the lowest-cost candidate, otherwise ambiguous
+			CandidateList winners = findMinCost( finder.candidates );
+			if ( winners.size() != 1 ) {
+				SemanticError(
+					alignofExpr->expr.get(), "Ambiguous expression in alignof operand: " );
+			}
+			// return the lowest-cost candidate
+			CandidateRef & choice = winners.front();
+			choice->expr = referenceToRvalueConversion( choice->expr, choice->cost );
+			choice->cost = Cost::zero;
+			addCandidate(
+				*choice, new ast::AlignofExpr{ alignofExpr->location, choice->expr } );
+		}
+	}
+
+	void Finder::postvisit( const ast::UntypedOffsetofExpr * offsetofExpr ) {
+		const ast::BaseInstType * aggInst;
+		if (( aggInst = offsetofExpr->type.as< ast::StructInstType >() )) ;
+		else if (( aggInst = offsetofExpr->type.as< ast::UnionInstType >() )) ;
+		else return;
+
+		for ( const ast::Decl * member : aggInst->lookup( offsetofExpr->member ) ) {
+			auto dwt = strict_dynamic_cast< const ast::DeclWithType * >( member );
+			addCandidate(
+				new ast::OffsetofExpr{ offsetofExpr->location, aggInst, dwt }, tenv );
+		}
+	}
+
+	void Finder::postvisit( const ast::OffsetofExpr * offsetofExpr ) {
+		addCandidate( offsetofExpr, tenv );
+	}
+
+	void Finder::postvisit( const ast::OffsetPackExpr * offsetPackExpr ) {
+		addCandidate( offsetPackExpr, tenv );
+	}
+
+	void Finder::postvisit( const ast::LogicalExpr * logicalExpr ) {
+		CandidateFinder finder1( context, tenv );
+		finder1.find( logicalExpr->arg1, ResolvMode::withAdjustment() );
+		if ( finder1.candidates.empty() ) return;
+
+		CandidateFinder finder2( context, tenv );
+		finder2.find( logicalExpr->arg2, ResolvMode::withAdjustment() );
+		if ( finder2.candidates.empty() ) return;
+
+		reason.code = NoMatch;
+
+		for ( const CandidateRef & r1 : finder1.candidates ) {
+			for ( const CandidateRef & r2 : finder2.candidates ) {
+				ast::TypeEnvironment env{ r1->env };
+				env.simpleCombine( r2->env );
+				ast::OpenVarSet open{ r1->open };
+				mergeOpenVars( open, r2->open );
+				ast::AssertionSet need;
+				mergeAssertionSet( need, r1->need );
+				mergeAssertionSet( need, r2->need );
+
+				addCandidate(
+					new ast::LogicalExpr{
+						logicalExpr->location, r1->expr, r2->expr, logicalExpr->isAnd },
+					std::move( env ), std::move( open ), std::move( need ), r1->cost + r2->cost );
+			}
+		}
+	}
+
+	void Finder::postvisit( const ast::ConditionalExpr * conditionalExpr ) {
+		// candidates for condition
+		CandidateFinder finder1( context, tenv );
+		finder1.find( conditionalExpr->arg1, ResolvMode::withAdjustment() );
+		if ( finder1.candidates.empty() ) return;
+
+		// candidates for true result
+		CandidateFinder finder2( context, tenv );
+		finder2.find( conditionalExpr->arg2, ResolvMode::withAdjustment() );
+		if ( finder2.candidates.empty() ) return;
+
+		// candidates for false result
+		CandidateFinder finder3( context, tenv );
+		finder3.find( conditionalExpr->arg3, ResolvMode::withAdjustment() );
+		if ( finder3.candidates.empty() ) return;
+
+		reason.code = NoMatch;
+
+		for ( const CandidateRef & r1 : finder1.candidates ) {
+			for ( const CandidateRef & r2 : finder2.candidates ) {
+				for ( const CandidateRef & r3 : finder3.candidates ) {
+					ast::TypeEnvironment env{ r1->env };
+					env.simpleCombine( r2->env );
+					env.simpleCombine( r3->env );
+					ast::OpenVarSet open{ r1->open };
+					mergeOpenVars( open, r2->open );
+					mergeOpenVars( open, r3->open );
+					ast::AssertionSet need;
+					mergeAssertionSet( need, r1->need );
+					mergeAssertionSet( need, r2->need );
+					mergeAssertionSet( need, r3->need );
+					ast::AssertionSet have;
+
+					// unify true and false results, then infer parameters to produce new
+					// candidates
+					ast::ptr< ast::Type > common;
+					if (
+						unify(
+							r2->expr->result, r3->expr->result, env, need, have, open, symtab,
+							common )
+					) {
+						// generate typed expression
+						ast::ConditionalExpr * newExpr = new ast::ConditionalExpr{
+							conditionalExpr->location, r1->expr, r2->expr, r3->expr };
+						newExpr->result = common ? common : r2->expr->result;
+						// convert both options to result type
+						Cost cost = r1->cost + r2->cost + r3->cost;
+						newExpr->arg2 = computeExpressionConversionCost(
+							newExpr->arg2, newExpr->result, symtab, env, cost );
+						newExpr->arg3 = computeExpressionConversionCost(
+							newExpr->arg3, newExpr->result, symtab, env, cost );
+						// output candidate
+						CandidateRef newCand = std::make_shared<Candidate>(
+							newExpr, std::move( env ), std::move( open ), std::move( need ), cost );
+						inferParameters( newCand, candidates );
+					}
+				}
+			}
+		}
+	}
+
+	void Finder::postvisit( const ast::CommaExpr * commaExpr ) {
+		ast::TypeEnvironment env{ tenv };
+		ast::ptr< ast::Expr > arg1 = resolveInVoidContext( commaExpr->arg1, context, env );
+
+		CandidateFinder finder2( context, env );
+		finder2.find( commaExpr->arg2, ResolvMode::withAdjustment() );
+
+		for ( const CandidateRef & r2 : finder2.candidates ) {
+			addCandidate( *r2, new ast::CommaExpr{ commaExpr->location, arg1, r2->expr } );
+		}
+	}
+
+	void Finder::postvisit( const ast::ImplicitCopyCtorExpr * ctorExpr ) {
+		addCandidate( ctorExpr, tenv );
+	}
+
+	void Finder::postvisit( const ast::ConstructorExpr * ctorExpr ) {
+		CandidateFinder finder( context, tenv );
+		finder.find( ctorExpr->callExpr, ResolvMode::withoutPrune() );
+		for ( CandidateRef & r : finder.candidates ) {
+			addCandidate( *r, new ast::ConstructorExpr{ ctorExpr->location, r->expr } );
+		}
+	}
+
+	void Finder::postvisit( const ast::RangeExpr * rangeExpr ) {
+		// resolve low and high, accept candidates where low and high types unify
+		CandidateFinder finder1( context, tenv );
+		finder1.find( rangeExpr->low, ResolvMode::withAdjustment() );
+		if ( finder1.candidates.empty() ) return;
+
+		CandidateFinder finder2( context, tenv );
+		finder2.find( rangeExpr->high, ResolvMode::withAdjustment() );
+		if ( finder2.candidates.empty() ) return;
+
+		reason.code = NoMatch;
+
+		for ( const CandidateRef & r1 : finder1.candidates ) {
+			for ( const CandidateRef & r2 : finder2.candidates ) {
+				ast::TypeEnvironment env{ r1->env };
+				env.simpleCombine( r2->env );
+				ast::OpenVarSet open{ r1->open };
+				mergeOpenVars( open, r2->open );
+				ast::AssertionSet need;
+				mergeAssertionSet( need, r1->need );
+				mergeAssertionSet( need, r2->need );
+				ast::AssertionSet have;
+
+				ast::ptr< ast::Type > common;
+				if (
+					unify(
+						r1->expr->result, r2->expr->result, env, need, have, open, symtab,
+						common )
+				) {
+					// generate new expression
+					ast::RangeExpr * newExpr =
+						new ast::RangeExpr{ rangeExpr->location, r1->expr, r2->expr };
+					newExpr->result = common ? common : r1->expr->result;
+					// add candidate
+					CandidateRef newCand = std::make_shared<Candidate>(
+						newExpr, std::move( env ), std::move( open ), std::move( need ),
+						r1->cost + r2->cost );
+					inferParameters( newCand, candidates );
+				}
+			}
+		}
+	}
+
+	void Finder::postvisit( const ast::UntypedTupleExpr * tupleExpr ) {
+		std::vector< CandidateFinder > subCandidates =
+			selfFinder.findSubExprs( tupleExpr->exprs );
+		std::vector< CandidateList > possibilities;
+		combos( subCandidates.begin(), subCandidates.end(), back_inserter( possibilities ) );
+
+		for ( const CandidateList & subs : possibilities ) {
+			std::vector< ast::ptr< ast::Expr > > exprs;
+			exprs.reserve( subs.size() );
+			for ( const CandidateRef & sub : subs ) { exprs.emplace_back( sub->expr ); }
+
+			ast::TypeEnvironment env;
+			ast::OpenVarSet open;
+			ast::AssertionSet need;
+			for ( const CandidateRef & sub : subs ) {
+				env.simpleCombine( sub->env );
+				mergeOpenVars( open, sub->open );
+				mergeAssertionSet( need, sub->need );
+			}
+
+			addCandidate(
+				new ast::TupleExpr{ tupleExpr->location, std::move( exprs ) },
+				std::move( env ), std::move( open ), std::move( need ), sumCost( subs ) );
+		}
+	}
+
+	void Finder::postvisit( const ast::TupleExpr * tupleExpr ) {
+		addCandidate( tupleExpr, tenv );
+	}
+
+	void Finder::postvisit( const ast::TupleIndexExpr * tupleExpr ) {
+		addCandidate( tupleExpr, tenv );
+	}
+
+	void Finder::postvisit( const ast::TupleAssignExpr * tupleExpr ) {
+		addCandidate( tupleExpr, tenv );
+	}
+
+	void Finder::postvisit( const ast::UniqueExpr * unqExpr ) {
+		CandidateFinder finder( context, tenv );
+		finder.find( unqExpr->expr, ResolvMode::withAdjustment() );
+		for ( CandidateRef & r : finder.candidates ) {
+			// ensure that the the id is passed on so that the expressions are "linked"
+			addCandidate( *r, new ast::UniqueExpr{ unqExpr->location, r->expr, unqExpr->id } );
+		}
+	}
+
+	void Finder::postvisit( const ast::StmtExpr * stmtExpr ) {
+		addCandidate( resolveStmtExpr( stmtExpr, context ), tenv );
+	}
+
+	void Finder::postvisit( const ast::UntypedInitExpr * initExpr ) {
+		// handle each option like a cast
+		CandidateList matches;
+		PRINT(
+			std::cerr << "untyped init expr: " << initExpr << std::endl;
+		)
+		// O(n^2) checks of d-types with e-types
+		for ( const ast::InitAlternative & initAlt : initExpr->initAlts ) {
+			// calculate target type
+			const ast::Type * toType = resolveTypeof( initAlt.type, context );
+			toType = adjustExprType( toType, tenv, symtab );
+			// The call to find must occur inside this loop, otherwise polymorphic return
+			// types are not bound to the initialization type, since return type variables are
+			// only open for the duration of resolving the UntypedExpr.
+			CandidateFinder finder( context, tenv, toType );
+			finder.find( initExpr->expr, ResolvMode::withAdjustment() );
+			for ( CandidateRef & cand : finder.candidates ) {
+				if (reason.code == NotFound) reason.code = NoMatch;
+
+				ast::TypeEnvironment env{ cand->env };
+				ast::AssertionSet need( cand->need.begin(), cand->need.end() ), have;
+				ast::OpenVarSet open{ cand->open };
+
+				PRINT(
+					std::cerr << "  @ " << toType << " " << initAlt.designation << std::endl;
+				)
+
+				// It is possible that a cast can throw away some values in a multiply-valued
+				// expression, e.g. cast-to-void, one value to zero. Figure out the prefix of
+				// the subexpression results that are cast directly. The candidate is invalid
+				// if it has fewer results than there are types to cast to.
+				int discardedValues = cand->expr->result->size() - toType->size();
+				if ( discardedValues < 0 ) continue;
+
+				// unification run for side-effects
+				bool canUnify = unify( toType, cand->expr->result, env, need, have, open, symtab );
+				(void) canUnify;
+				Cost thisCost = computeConversionCost( cand->expr->result, toType, cand->expr->get_lvalue(),
+					symtab, env );
+				PRINT(
+					Cost legacyCost = castCost( cand->expr->result, toType, cand->expr->get_lvalue(),
+						symtab, env );
+					std::cerr << "Considering initialization:";
+					std::cerr << std::endl << "  FROM: " << cand->expr->result << std::endl;
+					std::cerr << std::endl << "  TO: "   << toType             << std::endl;
+					std::cerr << std::endl << "  Unification " << (canUnify ? "succeeded" : "failed");
+					std::cerr << std::endl << "  Legacy cost " << legacyCost;
+					std::cerr << std::endl << "  New cost " << thisCost;
+					std::cerr << std::endl;
+				)
+				if ( thisCost != Cost::infinity ) {
+					// count one safe conversion for each value that is thrown away
+					thisCost.incSafe( discardedValues );
+					CandidateRef newCand = std::make_shared<Candidate>(
+						new ast::InitExpr{
+							initExpr->location, restructureCast( cand->expr, toType ),
+							initAlt.designation },
+						std::move(env), std::move( open ), std::move( need ), cand->cost, thisCost );
+					inferParameters( newCand, matches );
+				}
+			}
+		}
+
+		// select first on argument cost, then conversion cost
+		CandidateList minArgCost = findMinCost( matches );
+		promoteCvtCost( minArgCost );
+		candidates = findMinCost( minArgCost );
+	}
+
+	// size_t Finder::traceId = Stats::Heap::new_stacktrace_id("Finder");
+	/// Prunes a list of candidates down to those that have the minimum conversion cost for a given
+	/// return type. Skips ambiguous candidates.
+
+} // anonymous namespace
+
+bool CandidateFinder::pruneCandidates( CandidateList & candidates, CandidateList & out, std::vector<std::string> & errors ) {
+	struct PruneStruct {
+		CandidateRef candidate;
+		bool ambiguous;
+
+		PruneStruct() = default;
+		PruneStruct( const CandidateRef & c ) : candidate( c ), ambiguous( false ) {}
+	};
+
+	// find lowest-cost candidate for each type
+	std::unordered_map< std::string, PruneStruct > selected;
+	// attempt to skip satisfyAssertions on more expensive alternatives if better options have been found
+	std::sort(candidates.begin(), candidates.end(), [](const CandidateRef & x, const CandidateRef & y){return x->cost < y->cost;});
+	for ( CandidateRef & candidate : candidates ) {
+		std::string mangleName;
+		{
+			ast::ptr< ast::Type > newType = candidate->expr->result;
+			assertf(candidate->expr->result, "Result of expression %p for candidate is null", candidate->expr.get());
+			candidate->env.apply( newType );
+			mangleName = Mangle::mangle( newType );
+		}
+
+		auto found = selected.find( mangleName );
+		if (found != selected.end() && found->second.candidate->cost < candidate->cost) {
+			PRINT(
+				std::cerr << "cost " << candidate->cost << " loses to "
+					<< found->second.candidate->cost << std::endl;
+			)
+			continue;
+		}
+
+		// xxx - when do satisfyAssertions produce more than 1 result?
+		// this should only happen when initial result type contains
+		// unbound type parameters, then it should never be pruned by
+		// the previous step, since renameTyVars guarantees the mangled name
+		// is unique.
+		CandidateList satisfied;
+		bool needRecomputeKey = false;
+		if (candidate->need.empty()) {
+			satisfied.emplace_back(candidate);
+		}
+		else {
+			satisfyAssertions(candidate, context.symtab, satisfied, errors);
+			needRecomputeKey = true;
+		}
+
+		for (auto & newCand : satisfied) {
+			// recomputes type key, if satisfyAssertions changed it
+			if (needRecomputeKey)
+			{
+				ast::ptr< ast::Type > newType = newCand->expr->result;
+				assertf(newCand->expr->result, "Result of expression %p for candidate is null", newCand->expr.get());
+				newCand->env.apply( newType );
+				mangleName = Mangle::mangle( newType );
+			}
+			auto found = selected.find( mangleName );
+			if ( found != selected.end() ) {
+				if ( newCand->cost < found->second.candidate->cost ) {
+					PRINT(
+						std::cerr << "cost " << newCand->cost << " beats "
+							<< found->second.candidate->cost << std::endl;
+					)
+
+					found->second = PruneStruct{ newCand };
+				} else if ( newCand->cost == found->second.candidate->cost ) {
+					// if one of the candidates contains a deleted identifier, can pick the other,
+					// since deleted expressions should not be ambiguous if there is another option
+					// that is at least as good
+					if ( findDeletedExpr( newCand->expr ) ) {
+						// do nothing
+						PRINT( std::cerr << "candidate is deleted" << std::endl; )
+					} else if ( findDeletedExpr( found->second.candidate->expr ) ) {
+						PRINT( std::cerr << "current is deleted" << std::endl; )
+						found->second = PruneStruct{ newCand };
+					} else {
+						PRINT( std::cerr << "marking ambiguous" << std::endl; )
+						found->second.ambiguous = true;
+					}
+				} else {
+					// xxx - can satisfyAssertions increase the cost?
+					PRINT(
+						std::cerr << "cost " << newCand->cost << " loses to "
+							<< found->second.candidate->cost << std::endl;
+					)
+				}
+			} else {
+				selected.emplace_hint( found, mangleName, newCand );
+			}
+		}
+	}
+
+	// report unambiguous min-cost candidates
+	// CandidateList out;
+	for ( auto & target : selected ) {
+		if ( target.second.ambiguous ) continue;
+
+		CandidateRef cand = target.second.candidate;
+
+		ast::ptr< ast::Type > newResult = cand->expr->result;
+		cand->env.applyFree( newResult );
+		cand->expr = ast::mutate_field(
+			cand->expr.get(), &ast::Expr::result, std::move( newResult ) );
+
+		out.emplace_back( cand );
+	}
+	// if everything is lost in satisfyAssertions, report the error
+	return !selected.empty();
+}
+
+void CandidateFinder::find( const ast::Expr * expr, ResolvMode mode ) {
+	// Find alternatives for expression
+	ast::Pass<Finder> finder{ *this };
+	expr->accept( finder );
+
+	if ( mode.failFast && candidates.empty() ) {
+		switch(finder.core.reason.code) {
+		case Finder::NotFound:
+			{ SemanticError( expr, "No alternatives for expression " ); break; }
+		case Finder::NoMatch:
+			{ SemanticError( expr, "Invalid application of existing declaration(s) in expression " ); break; }
+		case Finder::ArgsToFew:
+		case Finder::ArgsToMany:
+		case Finder::RetsToFew:
+		case Finder::RetsToMany:
+		case Finder::NoReason:
+		default:
+			{ SemanticError( expr->location, "No reasonable alternatives for expression : reasons unkown" ); }
+		}
+	}
+
+	/*
+	if ( mode.satisfyAssns || mode.prune ) {
+		// trim candidates to just those where the assertions are satisfiable
+		// - necessary pre-requisite to pruning
+		CandidateList satisfied;
+		std::vector< std::string > errors;
+		for ( CandidateRef & candidate : candidates ) {
+			satisfyAssertions( candidate, localSyms, satisfied, errors );
+		}
+
+		// fail early if none such
+		if ( mode.failFast && satisfied.empty() ) {
+			std::ostringstream stream;
+			stream << "No alternatives with satisfiable assertions for " << expr << "\n";
+			for ( const auto& err : errors ) {
+				stream << err;
+			}
+			SemanticError( expr->location, stream.str() );
+		}
+
+		// reset candidates
+		candidates = move( satisfied );
+	}
+	*/
+
+	if ( mode.prune ) {
+		// trim candidates to single best one
+		PRINT(
+			std::cerr << "alternatives before prune:" << std::endl;
+			print( std::cerr, candidates );
+		)
+
+		CandidateList pruned;
+		std::vector<std::string> errors;
+		bool found = pruneCandidates( candidates, pruned, errors );
+
+		if ( mode.failFast && pruned.empty() ) {
+			std::ostringstream stream;
+			if (found) {
+				CandidateList winners = findMinCost( candidates );
+				stream << "Cannot choose between " << winners.size() << " alternatives for "
+					"expression\n";
+				ast::print( stream, expr );
+				stream << " Alternatives are:\n";
+				print( stream, winners, 1 );
+				SemanticError( expr->location, stream.str() );
+			}
+			else {
+				stream << "No alternatives with satisfiable assertions for " << expr << "\n";
+				for ( const auto& err : errors ) {
+					stream << err;
+				}
+				SemanticError( expr->location, stream.str() );
+			}
+		}
+
+		auto oldsize = candidates.size();
+		candidates = std::move( pruned );
+
+		PRINT(
+			std::cerr << "there are " << oldsize << " alternatives before elimination" << std::endl;
+		)
+		PRINT(
+			std::cerr << "there are " << candidates.size() << " alternatives after elimination"
+				<< std::endl;
+		)
+	}
+
+	// adjust types after pruning so that types substituted by pruneAlternatives are correctly
+	// adjusted
+	if ( mode.adjust ) {
+		for ( CandidateRef & r : candidates ) {
+			r->expr = ast::mutate_field(
+				r->expr.get(), &ast::Expr::result,
+				adjustExprType( r->expr->result, r->env, context.symtab ) );
+		}
+	}
+
+	// Central location to handle gcc extension keyword, etc. for all expressions
+	for ( CandidateRef & r : candidates ) {
+		if ( r->expr->extension != expr->extension ) {
+			r->expr.get_and_mutate()->extension = expr->extension;
+		}
+	}
+}
+
+std::vector< CandidateFinder > CandidateFinder::findSubExprs(
+	const std::vector< ast::ptr< ast::Expr > > & xs
+) {
+	std::vector< CandidateFinder > out;
+
+	for ( const auto & x : xs ) {
+		out.emplace_back( context, env );
+		out.back().find( x, ResolvMode::withAdjustment() );
+
+		PRINT(
+			std::cerr << "findSubExprs" << std::endl;
+			print( std::cerr, out.back().candidates );
+		)
+	}
+
+	return out;
+}
+
 const ast::Expr * referenceToRvalueConversion( const ast::Expr * expr, Cost & cost ) {
 	if ( expr->result.as< ast::ReferenceType >() ) {
@@ -64,7 +1942,4 @@
 	return expr;
 }
-
-/// Unique identifier for matching expression resolutions to their requesting expression
-UniqueId globalResnSlot = 0;
 
 Cost computeConversionCost(
@@ -93,1817 +1968,4 @@
 }
 
-namespace {
-	/// First index is which argument, second is which alternative, third is which exploded element
-	using ExplodedArgs_new = std::deque< std::vector< ExplodedArg > >;
-
-	/// Returns a list of alternatives with the minimum cost in the given list
-	CandidateList findMinCost( const CandidateList & candidates ) {
-		CandidateList out;
-		Cost minCost = Cost::infinity;
-		for ( const CandidateRef & r : candidates ) {
-			if ( r->cost < minCost ) {
-				minCost = r->cost;
-				out.clear();
-				out.emplace_back( r );
-			} else if ( r->cost == minCost ) {
-				out.emplace_back( r );
-			}
-		}
-		return out;
-	}
-
-	/// Computes conversion cost for a given expression to a given type
-	const ast::Expr * computeExpressionConversionCost(
-		const ast::Expr * arg, const ast::Type * paramType, const ast::SymbolTable & symtab, const ast::TypeEnvironment & env, Cost & outCost
-	) {
-		Cost convCost = computeConversionCost(
-				arg->result, paramType, arg->get_lvalue(), symtab, env );
-		outCost += convCost;
-
-		// If there is a non-zero conversion cost, ignoring poly cost, then the expression requires
-		// conversion. Ignore poly cost for now, since this requires resolution of the cast to
-		// infer parameters and this does not currently work for the reason stated below
-		Cost tmpCost = convCost;
-		tmpCost.incPoly( -tmpCost.get_polyCost() );
-		if ( tmpCost != Cost::zero ) {
-			ast::ptr< ast::Type > newType = paramType;
-			env.apply( newType );
-			return new ast::CastExpr{ arg, newType };
-
-			// xxx - *should* be able to resolve this cast, but at the moment pointers are not
-			// castable to zero_t, but are implicitly convertible. This is clearly inconsistent,
-			// once this is fixed it should be possible to resolve the cast.
-			// xxx - this isn't working, it appears because type1 (parameter) is seen as widenable,
-			// but it shouldn't be because this makes the conversion from DT* to DT* since
-			// commontype(zero_t, DT*) is DT*, rather than nothing
-
-			// CandidateFinder finder{ symtab, env };
-			// finder.find( arg, ResolvMode::withAdjustment() );
-			// assertf( finder.candidates.size() > 0,
-			// 	"Somehow castable expression failed to find alternatives." );
-			// assertf( finder.candidates.size() == 1,
-			// 	"Somehow got multiple alternatives for known cast expression." );
-			// return finder.candidates.front()->expr;
-		}
-
-		return arg;
-	}
-
-	/// Computes conversion cost for a given candidate
-	Cost computeApplicationConversionCost(
-		CandidateRef cand, const ast::SymbolTable & symtab
-	) {
-		auto appExpr = cand->expr.strict_as< ast::ApplicationExpr >();
-		auto pointer = appExpr->func->result.strict_as< ast::PointerType >();
-		auto function = pointer->base.strict_as< ast::FunctionType >();
-
-		Cost convCost = Cost::zero;
-		const auto & params = function->params;
-		auto param = params.begin();
-		auto & args = appExpr->args;
-
-		for ( unsigned i = 0; i < args.size(); ++i ) {
-			const ast::Type * argType = args[i]->result;
-			PRINT(
-				std::cerr << "arg expression:" << std::endl;
-				ast::print( std::cerr, args[i], 2 );
-				std::cerr << "--- results are" << std::endl;
-				ast::print( std::cerr, argType, 2 );
-			)
-
-			if ( param == params.end() ) {
-				if ( function->isVarArgs ) {
-					convCost.incUnsafe();
-					PRINT( std::cerr << "end of params with varargs function: inc unsafe: "
-						<< convCost << std::endl; ; )
-					// convert reference-typed expressions into value-typed expressions
-					cand->expr = ast::mutate_field_index(
-						appExpr, &ast::ApplicationExpr::args, i,
-						referenceToRvalueConversion( args[i], convCost ) );
-					continue;
-				} else return Cost::infinity;
-			}
-
-			if ( auto def = args[i].as< ast::DefaultArgExpr >() ) {
-				// Default arguments should be free - don't include conversion cost.
-				// Unwrap them here because they are not relevant to the rest of the system
-				cand->expr = ast::mutate_field_index(
-					appExpr, &ast::ApplicationExpr::args, i, def->expr );
-				++param;
-				continue;
-			}
-
-			// mark conversion cost and also specialization cost of param type
-			// const ast::Type * paramType = (*param)->get_type();
-			cand->expr = ast::mutate_field_index(
-				appExpr, &ast::ApplicationExpr::args, i,
-				computeExpressionConversionCost(
-					args[i], *param, symtab, cand->env, convCost ) );
-			convCost.decSpec( specCost( *param ) );
-			++param;  // can't be in for-loop update because of the continue
-		}
-
-		if ( param != params.end() ) return Cost::infinity;
-
-		// specialization cost of return types can't be accounted for directly, it disables
-		// otherwise-identical calls, like this example based on auto-newline in the I/O lib:
-		//
-		//   forall(otype OS) {
-		//     void ?|?(OS&, int);  // with newline
-		//     OS&  ?|?(OS&, int);  // no newline, always chosen due to more specialization
-		//   }
-
-		// mark type variable and specialization cost of forall clause
-		convCost.incVar( function->forall.size() );
-		convCost.decSpec( function->assertions.size() );
-
-		return convCost;
-	}
-
-	void makeUnifiableVars(
-		const ast::FunctionType * type, ast::OpenVarSet & unifiableVars,
-		ast::AssertionSet & need
-	) {
-		for ( auto & tyvar : type->forall ) {
-			unifiableVars[ *tyvar ] = ast::TypeData{ tyvar->base };
-		}
-		for ( auto & assn : type->assertions ) {
-			need[ assn ].isUsed = true;
-		}
-	}
-
-	/// Gets a default value from an initializer, nullptr if not present
-	const ast::ConstantExpr * getDefaultValue( const ast::Init * init ) {
-		if ( auto si = dynamic_cast< const ast::SingleInit * >( init ) ) {
-			if ( auto ce = si->value.as< ast::CastExpr >() ) {
-				return ce->arg.as< ast::ConstantExpr >();
-			} else {
-				return si->value.as< ast::ConstantExpr >();
-			}
-		}
-		return nullptr;
-	}
-
-	/// State to iteratively build a match of parameter expressions to arguments
-	struct ArgPack {
-		std::size_t parent;          ///< Index of parent pack
-		ast::ptr< ast::Expr > expr;  ///< The argument stored here
-		Cost cost;                   ///< The cost of this argument
-		ast::TypeEnvironment env;    ///< Environment for this pack
-		ast::AssertionSet need;      ///< Assertions outstanding for this pack
-		ast::AssertionSet have;      ///< Assertions found for this pack
-		ast::OpenVarSet open;        ///< Open variables for this pack
-		unsigned nextArg;            ///< Index of next argument in arguments list
-		unsigned tupleStart;         ///< Number of tuples that start at this index
-		unsigned nextExpl;           ///< Index of next exploded element
-		unsigned explAlt;            ///< Index of alternative for nextExpl > 0
-
-		ArgPack()
-		: parent( 0 ), expr(), cost( Cost::zero ), env(), need(), have(), open(), nextArg( 0 ),
-		  tupleStart( 0 ), nextExpl( 0 ), explAlt( 0 ) {}
-
-		ArgPack(
-			const ast::TypeEnvironment & env, const ast::AssertionSet & need,
-			const ast::AssertionSet & have, const ast::OpenVarSet & open )
-		: parent( 0 ), expr(), cost( Cost::zero ), env( env ), need( need ), have( have ),
-		  open( open ), nextArg( 0 ), tupleStart( 0 ), nextExpl( 0 ), explAlt( 0 ) {}
-
-		ArgPack(
-			std::size_t parent, const ast::Expr * expr, ast::TypeEnvironment && env,
-			ast::AssertionSet && need, ast::AssertionSet && have, ast::OpenVarSet && open,
-			unsigned nextArg, unsigned tupleStart = 0, Cost cost = Cost::zero,
-			unsigned nextExpl = 0, unsigned explAlt = 0 )
-		: parent(parent), expr( expr ), cost( cost ), env( std::move( env ) ), need( std::move( need ) ),
-		  have( std::move( have ) ), open( std::move( open ) ), nextArg( nextArg ), tupleStart( tupleStart ),
-		  nextExpl( nextExpl ), explAlt( explAlt ) {}
-
-		ArgPack(
-			const ArgPack & o, ast::TypeEnvironment && env, ast::AssertionSet && need,
-			ast::AssertionSet && have, ast::OpenVarSet && open, unsigned nextArg, Cost added )
-		: parent( o.parent ), expr( o.expr ), cost( o.cost + added ), env( std::move( env ) ),
-		  need( std::move( need ) ), have( std::move( have ) ), open( std::move( open ) ), nextArg( nextArg ),
-		  tupleStart( o.tupleStart ), nextExpl( 0 ), explAlt( 0 ) {}
-
-		/// true if this pack is in the middle of an exploded argument
-		bool hasExpl() const { return nextExpl > 0; }
-
-		/// Gets the list of exploded candidates for this pack
-		const ExplodedArg & getExpl( const ExplodedArgs_new & args ) const {
-			return args[ nextArg-1 ][ explAlt ];
-		}
-
-		/// Ends a tuple expression, consolidating the appropriate args
-		void endTuple( const std::vector< ArgPack > & packs ) {
-			// add all expressions in tuple to list, summing cost
-			std::deque< const ast::Expr * > exprs;
-			const ArgPack * pack = this;
-			if ( expr ) { exprs.emplace_front( expr ); }
-			while ( pack->tupleStart == 0 ) {
-				pack = &packs[pack->parent];
-				exprs.emplace_front( pack->expr );
-				cost += pack->cost;
-			}
-			// reset pack to appropriate tuple
-			std::vector< ast::ptr< ast::Expr > > exprv( exprs.begin(), exprs.end() );
-			expr = new ast::TupleExpr{ expr->location, std::move( exprv ) };
-			tupleStart = pack->tupleStart - 1;
-			parent = pack->parent;
-		}
-	};
-
-	/// Instantiates an argument to match a parameter, returns false if no matching results left
-	bool instantiateArgument(
-		const ast::Type * paramType, const ast::Init * init, const ExplodedArgs_new & args,
-		std::vector< ArgPack > & results, std::size_t & genStart, const ast::SymbolTable & symtab,
-		unsigned nTuples = 0
-	) {
-		if ( auto tupleType = dynamic_cast< const ast::TupleType * >( paramType ) ) {
-			// paramType is a TupleType -- group args into a TupleExpr
-			++nTuples;
-			for ( const ast::Type * type : *tupleType ) {
-				// xxx - dropping initializer changes behaviour from previous, but seems correct
-				// ^^^ need to handle the case where a tuple has a default argument
-				if ( ! instantiateArgument(
-					type, nullptr, args, results, genStart, symtab, nTuples ) ) return false;
-				nTuples = 0;
-			}
-			// re-constitute tuples for final generation
-			for ( auto i = genStart; i < results.size(); ++i ) {
-				results[i].endTuple( results );
-			}
-			return true;
-		} else if ( const ast::TypeInstType * ttype = Tuples::isTtype( paramType ) ) {
-			// paramType is a ttype, consumes all remaining arguments
-
-			// completed tuples; will be spliced to end of results to finish
-			std::vector< ArgPack > finalResults{};
-
-			// iterate until all results completed
-			std::size_t genEnd;
-			++nTuples;
-			do {
-				genEnd = results.size();
-
-				// add another argument to results
-				for ( std::size_t i = genStart; i < genEnd; ++i ) {
-					unsigned nextArg = results[i].nextArg;
-
-					// use next element of exploded tuple if present
-					if ( results[i].hasExpl() ) {
-						const ExplodedArg & expl = results[i].getExpl( args );
-
-						unsigned nextExpl = results[i].nextExpl + 1;
-						if ( nextExpl == expl.exprs.size() ) { nextExpl = 0; }
-
-						results.emplace_back(
-							i, expl.exprs[ results[i].nextExpl ], copy( results[i].env ),
-							copy( results[i].need ), copy( results[i].have ),
-							copy( results[i].open ), nextArg, nTuples, Cost::zero, nextExpl,
-							results[i].explAlt );
-
-						continue;
-					}
-
-					// finish result when out of arguments
-					if ( nextArg >= args.size() ) {
-						ArgPack newResult{
-							results[i].env, results[i].need, results[i].have, results[i].open };
-						newResult.nextArg = nextArg;
-						const ast::Type * argType = nullptr;
-
-						if ( nTuples > 0 || ! results[i].expr ) {
-							// first iteration or no expression to clone,
-							// push empty tuple expression
-							newResult.parent = i;
-							newResult.expr = new ast::TupleExpr{ CodeLocation{}, {} };
-							argType = newResult.expr->result;
-						} else {
-							// clone result to collect tuple
-							newResult.parent = results[i].parent;
-							newResult.cost = results[i].cost;
-							newResult.tupleStart = results[i].tupleStart;
-							newResult.expr = results[i].expr;
-							argType = newResult.expr->result;
-
-							if ( results[i].tupleStart > 0 && Tuples::isTtype( argType ) ) {
-								// the case where a ttype value is passed directly is special,
-								// e.g. for argument forwarding purposes
-								// xxx - what if passing multiple arguments, last of which is
-								//       ttype?
-								// xxx - what would happen if unify was changed so that unifying
-								//       tuple
-								// types flattened both before unifying lists? then pass in
-								// TupleType (ttype) below.
-								--newResult.tupleStart;
-							} else {
-								// collapse leftover arguments into tuple
-								newResult.endTuple( results );
-								argType = newResult.expr->result;
-							}
-						}
-
-						// check unification for ttype before adding to final
-						if (
-							unify(
-								ttype, argType, newResult.env, newResult.need, newResult.have,
-								newResult.open, symtab )
-						) {
-							finalResults.emplace_back( std::move( newResult ) );
-						}
-
-						continue;
-					}
-
-					// add each possible next argument
-					for ( std::size_t j = 0; j < args[nextArg].size(); ++j ) {
-						const ExplodedArg & expl = args[nextArg][j];
-
-						// fresh copies of parent parameters for this iteration
-						ast::TypeEnvironment env = results[i].env;
-						ast::OpenVarSet open = results[i].open;
-
-						env.addActual( expl.env, open );
-
-						// skip empty tuple arguments by (nearly) cloning parent into next gen
-						if ( expl.exprs.empty() ) {
-							results.emplace_back(
-								results[i], std::move( env ), copy( results[i].need ),
-								copy( results[i].have ), std::move( open ), nextArg + 1, expl.cost );
-
-							continue;
-						}
-
-						// add new result
-						results.emplace_back(
-							i, expl.exprs.front(), std::move( env ), copy( results[i].need ),
-							copy( results[i].have ), std::move( open ), nextArg + 1, nTuples,
-							expl.cost, expl.exprs.size() == 1 ? 0 : 1, j );
-					}
-				}
-
-				// reset for next round
-				genStart = genEnd;
-				nTuples = 0;
-			} while ( genEnd != results.size() );
-
-			// splice final results onto results
-			for ( std::size_t i = 0; i < finalResults.size(); ++i ) {
-				results.emplace_back( std::move( finalResults[i] ) );
-			}
-			return ! finalResults.empty();
-		}
-
-		// iterate each current subresult
-		std::size_t genEnd = results.size();
-		for ( std::size_t i = genStart; i < genEnd; ++i ) {
-			unsigned nextArg = results[i].nextArg;
-
-			// use remainder of exploded tuple if present
-			if ( results[i].hasExpl() ) {
-				const ExplodedArg & expl = results[i].getExpl( args );
-				const ast::Expr * expr = expl.exprs[ results[i].nextExpl ];
-
-				ast::TypeEnvironment env = results[i].env;
-				ast::AssertionSet need = results[i].need, have = results[i].have;
-				ast::OpenVarSet open = results[i].open;
-
-				const ast::Type * argType = expr->result;
-
-				PRINT(
-					std::cerr << "param type is ";
-					ast::print( std::cerr, paramType );
-					std::cerr << std::endl << "arg type is ";
-					ast::print( std::cerr, argType );
-					std::cerr << std::endl;
-				)
-
-				if ( unify( paramType, argType, env, need, have, open, symtab ) ) {
-					unsigned nextExpl = results[i].nextExpl + 1;
-					if ( nextExpl == expl.exprs.size() ) { nextExpl = 0; }
-
-					results.emplace_back(
-						i, expr, std::move( env ), std::move( need ), std::move( have ), std::move( open ), nextArg,
-						nTuples, Cost::zero, nextExpl, results[i].explAlt );
-				}
-
-				continue;
-			}
-
-			// use default initializers if out of arguments
-			if ( nextArg >= args.size() ) {
-				if ( const ast::ConstantExpr * cnst = getDefaultValue( init ) ) {
-					ast::TypeEnvironment env = results[i].env;
-					ast::AssertionSet need = results[i].need, have = results[i].have;
-					ast::OpenVarSet open = results[i].open;
-
-					if ( unify( paramType, cnst->result, env, need, have, open, symtab ) ) {
-						results.emplace_back(
-							i, new ast::DefaultArgExpr{ cnst->location, cnst }, std::move( env ),
-							std::move( need ), std::move( have ), std::move( open ), nextArg, nTuples );
-					}
-				}
-
-				continue;
-			}
-
-			// Check each possible next argument
-			for ( std::size_t j = 0; j < args[nextArg].size(); ++j ) {
-				const ExplodedArg & expl = args[nextArg][j];
-
-				// fresh copies of parent parameters for this iteration
-				ast::TypeEnvironment env = results[i].env;
-				ast::AssertionSet need = results[i].need, have = results[i].have;
-				ast::OpenVarSet open = results[i].open;
-
-				env.addActual( expl.env, open );
-
-				// skip empty tuple arguments by (nearly) cloning parent into next gen
-				if ( expl.exprs.empty() ) {
-					results.emplace_back(
-						results[i], std::move( env ), std::move( need ), std::move( have ), std::move( open ),
-						nextArg + 1, expl.cost );
-
-					continue;
-				}
-
-				// consider only first exploded arg
-				const ast::Expr * expr = expl.exprs.front();
-				const ast::Type * argType = expr->result;
-
-				PRINT(
-					std::cerr << "param type is ";
-					ast::print( std::cerr, paramType );
-					std::cerr << std::endl << "arg type is ";
-					ast::print( std::cerr, argType );
-					std::cerr << std::endl;
-				)
-
-				// attempt to unify types
-				if ( unify( paramType, argType, env, need, have, open, symtab ) ) {
-					// add new result
-					results.emplace_back(
-						i, expr, std::move( env ), std::move( need ), std::move( have ), std::move( open ),
-						nextArg + 1, nTuples, expl.cost, expl.exprs.size() == 1 ? 0 : 1, j );
-				}
-			}
-		}
-
-		// reset for next parameter
-		genStart = genEnd;
-
-		return genEnd != results.size();  // were any new results added?
-	}
-
-	/// Generate a cast expression from `arg` to `toType`
-	const ast::Expr * restructureCast(
-		ast::ptr< ast::Expr > & arg, const ast::Type * toType, ast::GeneratedFlag isGenerated = ast::GeneratedCast
-	) {
-		if (
-			arg->result->size() > 1
-			&& ! toType->isVoid()
-			&& ! dynamic_cast< const ast::ReferenceType * >( toType )
-		) {
-			// Argument is a tuple and the target type is neither void nor a reference. Cast each
-			// member of the tuple to its corresponding target type, producing the tuple of those
-			// cast expressions. If there are more components of the tuple than components in the
-			// target type, then excess components do not come out in the result expression (but
-			// UniqueExpr ensures that the side effects will still be produced)
-			if ( Tuples::maybeImpureIgnoreUnique( arg ) ) {
-				// expressions which may contain side effects require a single unique instance of
-				// the expression
-				arg = new ast::UniqueExpr{ arg->location, arg };
-			}
-			std::vector< ast::ptr< ast::Expr > > components;
-			for ( unsigned i = 0; i < toType->size(); ++i ) {
-				// cast each component
-				ast::ptr< ast::Expr > idx = new ast::TupleIndexExpr{ arg->location, arg, i };
-				components.emplace_back(
-					restructureCast( idx, toType->getComponent( i ), isGenerated ) );
-			}
-			return new ast::TupleExpr{ arg->location, std::move( components ) };
-		} else {
-			// handle normally
-			return new ast::CastExpr{ arg->location, arg, toType, isGenerated };
-		}
-	}
-
-	/// Gets the name from an untyped member expression (must be NameExpr)
-	const std::string & getMemberName( const ast::UntypedMemberExpr * memberExpr ) {
-		if ( memberExpr->member.as< ast::ConstantExpr >() ) {
-			SemanticError( memberExpr, "Indexed access to struct fields unsupported: " );
-		}
-
-		return memberExpr->member.strict_as< ast::NameExpr >()->name;
-	}
-
-	/// Actually visits expressions to find their candidate interpretations
-	class Finder final : public ast::WithShortCircuiting {
-		const ResolveContext & context;
-		const ast::SymbolTable & symtab;
-	public:
-		// static size_t traceId;
-		CandidateFinder & selfFinder;
-		CandidateList & candidates;
-		const ast::TypeEnvironment & tenv;
-		ast::ptr< ast::Type > & targetType;
-
-		enum Errors {
-			NotFound,
-			NoMatch,
-			ArgsToFew,
-			ArgsToMany,
-			RetsToFew,
-			RetsToMany,
-			NoReason
-		};
-
-		struct {
-			Errors code = NotFound;
-		} reason;
-
-		Finder( CandidateFinder & f )
-		: context( f.context ), symtab( context.symtab ), selfFinder( f ),
-		  candidates( f.candidates ), tenv( f.env ), targetType( f.targetType ) {}
-
-		void previsit( const ast::Node * ) { visit_children = false; }
-
-		/// Convenience to add candidate to list
-		template<typename... Args>
-		void addCandidate( Args &&... args ) {
-			candidates.emplace_back( new Candidate{ std::forward<Args>( args )... } );
-			reason.code = NoReason;
-		}
-
-		void postvisit( const ast::ApplicationExpr * applicationExpr ) {
-			addCandidate( applicationExpr, tenv );
-		}
-
-		/// Set up candidate assertions for inference
-		void inferParameters( CandidateRef & newCand, CandidateList & out ) {
-			// Set need bindings for any unbound assertions
-			UniqueId crntResnSlot = 0; // matching ID for this expression's assertions
-			for ( auto & assn : newCand->need ) {
-				// skip already-matched assertions
-				if ( assn.second.resnSlot != 0 ) continue;
-				// assign slot for expression if needed
-				if ( crntResnSlot == 0 ) { crntResnSlot = ++globalResnSlot; }
-				// fix slot to assertion
-				assn.second.resnSlot = crntResnSlot;
-			}
-			// pair slot to expression
-			if ( crntResnSlot != 0 ) {
-				newCand->expr.get_and_mutate()->inferred.resnSlots().emplace_back( crntResnSlot );
-			}
-
-			// add to output list; assertion satisfaction will occur later
-			out.emplace_back( newCand );
-		}
-
-		/// Completes a function candidate with arguments located
-		void validateFunctionCandidate(
-			const CandidateRef & func, ArgPack & result, const std::vector< ArgPack > & results,
-			CandidateList & out
-		) {
-			ast::ApplicationExpr * appExpr =
-				new ast::ApplicationExpr{ func->expr->location, func->expr };
-			// sum cost and accumulate arguments
-			std::deque< const ast::Expr * > args;
-			Cost cost = func->cost;
-			const ArgPack * pack = &result;
-			while ( pack->expr ) {
-				args.emplace_front( pack->expr );
-				cost += pack->cost;
-				pack = &results[pack->parent];
-			}
-			std::vector< ast::ptr< ast::Expr > > vargs( args.begin(), args.end() );
-			appExpr->args = std::move( vargs );
-			// build and validate new candidate
-			auto newCand =
-				std::make_shared<Candidate>( appExpr, result.env, result.open, result.need, cost );
-			PRINT(
-				std::cerr << "instantiate function success: " << appExpr << std::endl;
-				std::cerr << "need assertions:" << std::endl;
-				ast::print( std::cerr, result.need, 2 );
-			)
-			inferParameters( newCand, out );
-		}
-
-		/// Builds a list of candidates for a function, storing them in out
-		void makeFunctionCandidates(
-			const CandidateRef & func, const ast::FunctionType * funcType,
-			const ExplodedArgs_new & args, CandidateList & out
-		) {
-			ast::OpenVarSet funcOpen;
-			ast::AssertionSet funcNeed, funcHave;
-			ast::TypeEnvironment funcEnv{ func->env };
-			makeUnifiableVars( funcType, funcOpen, funcNeed );
-			// add all type variables as open variables now so that those not used in the
-			// parameter list are still considered open
-			funcEnv.add( funcType->forall );
-
-			if ( targetType && ! targetType->isVoid() && ! funcType->returns.empty() ) {
-				// attempt to narrow based on expected target type
-				const ast::Type * returnType = funcType->returns.front();
-				if ( ! unify(
-					returnType, targetType, funcEnv, funcNeed, funcHave, funcOpen, symtab )
-				) {
-					// unification failed, do not pursue this candidate
-					return;
-				}
-			}
-
-			// iteratively build matches, one parameter at a time
-			std::vector< ArgPack > results;
-			results.emplace_back( funcEnv, funcNeed, funcHave, funcOpen );
-			std::size_t genStart = 0;
-
-			// xxx - how to handle default arg after change to ftype representation?
-			if (const ast::VariableExpr * varExpr = func->expr.as<ast::VariableExpr>()) {
-				if (const ast::FunctionDecl * funcDecl = varExpr->var.as<ast::FunctionDecl>()) {
-					// function may have default args only if directly calling by name
-					// must use types on candidate however, due to RenameVars substitution
-					auto nParams = funcType->params.size();
-
-					for (size_t i=0; i<nParams; ++i) {
-						auto obj = funcDecl->params[i].strict_as<ast::ObjectDecl>();
-						if (!instantiateArgument(
-							funcType->params[i], obj->init, args, results, genStart, symtab)) return;
-					}
-					goto endMatch;
-				}
-			}
-			for ( const auto & param : funcType->params ) {
-				// Try adding the arguments corresponding to the current parameter to the existing
-				// matches
-				// no default args for indirect calls
-				if ( ! instantiateArgument(
-					param, nullptr, args, results, genStart, symtab ) ) return;
-			}
-
-			endMatch:
-			if ( funcType->isVarArgs ) {
-				// append any unused arguments to vararg pack
-				std::size_t genEnd;
-				do {
-					genEnd = results.size();
-
-					// iterate results
-					for ( std::size_t i = genStart; i < genEnd; ++i ) {
-						unsigned nextArg = results[i].nextArg;
-
-						// use remainder of exploded tuple if present
-						if ( results[i].hasExpl() ) {
-							const ExplodedArg & expl = results[i].getExpl( args );
-
-							unsigned nextExpl = results[i].nextExpl + 1;
-							if ( nextExpl == expl.exprs.size() ) { nextExpl = 0; }
-
-							results.emplace_back(
-								i, expl.exprs[ results[i].nextExpl ], copy( results[i].env ),
-								copy( results[i].need ), copy( results[i].have ),
-								copy( results[i].open ), nextArg, 0, Cost::zero, nextExpl,
-								results[i].explAlt );
-
-							continue;
-						}
-
-						// finish result when out of arguments
-						if ( nextArg >= args.size() ) {
-							validateFunctionCandidate( func, results[i], results, out );
-
-							continue;
-						}
-
-						// add each possible next argument
-						for ( std::size_t j = 0; j < args[nextArg].size(); ++j ) {
-							const ExplodedArg & expl = args[nextArg][j];
-
-							// fresh copies of parent parameters for this iteration
-							ast::TypeEnvironment env = results[i].env;
-							ast::OpenVarSet open = results[i].open;
-
-							env.addActual( expl.env, open );
-
-							// skip empty tuple arguments by (nearly) cloning parent into next gen
-							if ( expl.exprs.empty() ) {
-								results.emplace_back(
-									results[i], std::move( env ), copy( results[i].need ),
-									copy( results[i].have ), std::move( open ), nextArg + 1,
-									expl.cost );
-
-								continue;
-							}
-
-							// add new result
-							results.emplace_back(
-								i, expl.exprs.front(), std::move( env ), copy( results[i].need ),
-								copy( results[i].have ), std::move( open ), nextArg + 1, 0, expl.cost,
-								expl.exprs.size() == 1 ? 0 : 1, j );
-						}
-					}
-
-					genStart = genEnd;
-				} while( genEnd != results.size() );
-			} else {
-				// filter out the results that don't use all the arguments
-				for ( std::size_t i = genStart; i < results.size(); ++i ) {
-					ArgPack & result = results[i];
-					if ( ! result.hasExpl() && result.nextArg >= args.size() ) {
-						validateFunctionCandidate( func, result, results, out );
-					}
-				}
-			}
-		}
-
-		/// Adds implicit struct-conversions to the alternative list
-		void addAnonConversions( const CandidateRef & cand ) {
-			// adds anonymous member interpretations whenever an aggregate value type is seen.
-			// it's okay for the aggregate expression to have reference type -- cast it to the
-			// base type to treat the aggregate as the referenced value
-			ast::ptr< ast::Expr > aggrExpr( cand->expr );
-			ast::ptr< ast::Type > & aggrType = aggrExpr.get_and_mutate()->result;
-			cand->env.apply( aggrType );
-
-			if ( aggrType.as< ast::ReferenceType >() ) {
-				aggrExpr = new ast::CastExpr{ aggrExpr, aggrType->stripReferences() };
-			}
-
-			if ( auto structInst = aggrExpr->result.as< ast::StructInstType >() ) {
-				addAggMembers( structInst, aggrExpr, *cand, Cost::safe, "" );
-			} else if ( auto unionInst = aggrExpr->result.as< ast::UnionInstType >() ) {
-				addAggMembers( unionInst, aggrExpr, *cand, Cost::safe, "" );
-			}
-		}
-
-		/// Adds aggregate member interpretations
-		void addAggMembers(
-			const ast::BaseInstType * aggrInst, const ast::Expr * expr,
-			const Candidate & cand, const Cost & addedCost, const std::string & name
-		) {
-			for ( const ast::Decl * decl : aggrInst->lookup( name ) ) {
-				auto dwt = strict_dynamic_cast< const ast::DeclWithType * >( decl );
-				CandidateRef newCand = std::make_shared<Candidate>(
-					cand, new ast::MemberExpr{ expr->location, dwt, expr }, addedCost );
-				// add anonymous member interpretations whenever an aggregate value type is seen
-				// as a member expression
-				addAnonConversions( newCand );
-				candidates.emplace_back( std::move( newCand ) );
-			}
-		}
-
-		/// Adds tuple member interpretations
-		void addTupleMembers(
-			const ast::TupleType * tupleType, const ast::Expr * expr, const Candidate & cand,
-			const Cost & addedCost, const ast::Expr * member
-		) {
-			if ( auto constantExpr = dynamic_cast< const ast::ConstantExpr * >( member ) ) {
-				// get the value of the constant expression as an int, must be between 0 and the
-				// length of the tuple to have meaning
-				long long val = constantExpr->intValue();
-				if ( val >= 0 && (unsigned long long)val < tupleType->size() ) {
-					addCandidate(
-						cand, new ast::TupleIndexExpr{ expr->location, expr, (unsigned)val },
-						addedCost );
-				}
-			}
-		}
-
-		void postvisit( const ast::UntypedExpr * untypedExpr ) {
-			std::vector< CandidateFinder > argCandidates =
-				selfFinder.findSubExprs( untypedExpr->args );
-
-			// take care of possible tuple assignments
-			// if not tuple assignment, handled as normal function call
-			Tuples::handleTupleAssignment( selfFinder, untypedExpr, argCandidates );
-
-			CandidateFinder funcFinder( context, tenv );
-			if (auto nameExpr = untypedExpr->func.as<ast::NameExpr>()) {
-				auto kind = ast::SymbolTable::getSpecialFunctionKind(nameExpr->name);
-				if (kind != ast::SymbolTable::SpecialFunctionKind::NUMBER_OF_KINDS) {
-					assertf(!argCandidates.empty(), "special function call without argument");
-					for (auto & firstArgCand: argCandidates[0]) {
-						ast::ptr<ast::Type> argType = firstArgCand->expr->result;
-						firstArgCand->env.apply(argType);
-						// strip references
-						// xxx - is this correct?
-						while (argType.as<ast::ReferenceType>()) argType = argType.as<ast::ReferenceType>()->base;
-
-						// convert 1-tuple to plain type
-						if (auto tuple = argType.as<ast::TupleType>()) {
-							if (tuple->size() == 1) {
-								argType = tuple->types[0];
-							}
-						}
-
-						// if argType is an unbound type parameter, all special functions need to be searched.
-						if (isUnboundType(argType)) {
-							funcFinder.otypeKeys.clear();
-							break;
-						}
-
-						if (argType.as<ast::PointerType>()) funcFinder.otypeKeys.insert(Mangle::Encoding::pointer);						
-						// else if (const ast::EnumInstType * enumInst = argType.as<ast::EnumInstType>()) {
-						// 	const ast::EnumDecl * enumDecl = enumInst->base; // Here
-						// 	if ( const ast::Type* enumType = enumDecl->base ) {
-						// 		// instance of enum (T) is a instance of type (T) 
-						// 		funcFinder.otypeKeys.insert(Mangle::mangle(enumType, Mangle::NoGenericParams | Mangle::Type));
-						// 	} else {
-						// 		// instance of an untyped enum is techically int
-						// 		funcFinder.otypeKeys.insert(Mangle::mangle(enumDecl, Mangle::NoGenericParams | Mangle::Type));
-						// 	}
-						// }
-						else funcFinder.otypeKeys.insert(Mangle::mangle(argType, Mangle::NoGenericParams | Mangle::Type));
-					}
-				}
-			}
-			// if candidates are already produced, do not fail
-			// xxx - is it possible that handleTupleAssignment and main finder both produce candidates?
-			// this means there exists ctor/assign functions with a tuple as first parameter.
-			ResolvMode mode = {
-				true, // adjust
-				!untypedExpr->func.as<ast::NameExpr>(), // prune if not calling by name
-				selfFinder.candidates.empty() // failfast if other options are not found
-			};
-			funcFinder.find( untypedExpr->func, mode );
-			// short-circuit if no candidates
-			// if ( funcFinder.candidates.empty() ) return;
-
-			reason.code = NoMatch;
-
-			// find function operators
-			ast::ptr< ast::Expr > opExpr = new ast::NameExpr{ untypedExpr->location, "?()" }; // ??? why not ?{}
-			CandidateFinder opFinder( context, tenv );
-			// okay if there aren't any function operations
-			opFinder.find( opExpr, ResolvMode::withoutFailFast() );
-			PRINT(
-				std::cerr << "known function ops:" << std::endl;
-				print( std::cerr, opFinder.candidates, 1 );
-			)
-
-			// pre-explode arguments
-			ExplodedArgs_new argExpansions;
-			for ( const CandidateFinder & args : argCandidates ) {
-				argExpansions.emplace_back();
-				auto & argE = argExpansions.back();
-				for ( const CandidateRef & arg : args ) { argE.emplace_back( *arg, symtab ); }
-			}
-
-			// Find function matches
-			CandidateList found;
-			SemanticErrorException errors;
-			for ( CandidateRef & func : funcFinder ) {
-				try {
-					PRINT(
-						std::cerr << "working on alternative:" << std::endl;
-						print( std::cerr, *func, 2 );
-					)
-
-					// check if the type is a pointer to function
-					const ast::Type * funcResult = func->expr->result->stripReferences();
-					if ( auto pointer = dynamic_cast< const ast::PointerType * >( funcResult ) ) {
-						if ( auto function = pointer->base.as< ast::FunctionType >() ) {
-							CandidateRef newFunc{ new Candidate{ *func } };
-							newFunc->expr =
-								referenceToRvalueConversion( newFunc->expr, newFunc->cost );
-							makeFunctionCandidates( newFunc, function, argExpansions, found );
-						}
-					} else if (
-						auto inst = dynamic_cast< const ast::TypeInstType * >( funcResult )
-					) {
-						if ( const ast::EqvClass * clz = func->env.lookup( *inst ) ) {
-							if ( auto function = clz->bound.as< ast::FunctionType >() ) {
-								CandidateRef newFunc{ new Candidate{ *func } };
-								newFunc->expr =
-									referenceToRvalueConversion( newFunc->expr, newFunc->cost );
-								makeFunctionCandidates( newFunc, function, argExpansions, found );
-							}
-						}
-					}
-				} catch ( SemanticErrorException & e ) { errors.append( e ); }
-			}
-
-			// Find matches on function operators `?()`
-			if ( ! opFinder.candidates.empty() ) {
-				// add exploded function alternatives to front of argument list
-				std::vector< ExplodedArg > funcE;
-				funcE.reserve( funcFinder.candidates.size() );
-				for ( const CandidateRef & func : funcFinder ) {
-					funcE.emplace_back( *func, symtab );
-				}
-				argExpansions.emplace_front( std::move( funcE ) );
-
-				for ( const CandidateRef & op : opFinder ) {
-					try {
-						// check if type is pointer-to-function
-						const ast::Type * opResult = op->expr->result->stripReferences();
-						if ( auto pointer = dynamic_cast< const ast::PointerType * >( opResult ) ) {
-							if ( auto function = pointer->base.as< ast::FunctionType >() ) {
-								CandidateRef newOp{ new Candidate{ *op} };
-								newOp->expr =
-									referenceToRvalueConversion( newOp->expr, newOp->cost );
-								makeFunctionCandidates( newOp, function, argExpansions, found );
-							}
-						}
-					} catch ( SemanticErrorException & e ) { errors.append( e ); }
-				}
-			}
-
-			// Implement SFINAE; resolution errors are only errors if there aren't any non-error
-			// candidates
-			if ( found.empty() && ! errors.isEmpty() ) { throw errors; }
-
-			// Compute conversion costs
-			for ( CandidateRef & withFunc : found ) {
-				Cost cvtCost = computeApplicationConversionCost( withFunc, symtab );
-
-				PRINT(
-					auto appExpr = withFunc->expr.strict_as< ast::ApplicationExpr >();
-					auto pointer = appExpr->func->result.strict_as< ast::PointerType >();
-					auto function = pointer->base.strict_as< ast::FunctionType >();
-
-					std::cerr << "Case +++++++++++++ " << appExpr->func << std::endl;
-					std::cerr << "parameters are:" << std::endl;
-					ast::printAll( std::cerr, function->params, 2 );
-					std::cerr << "arguments are:" << std::endl;
-					ast::printAll( std::cerr, appExpr->args, 2 );
-					std::cerr << "bindings are:" << std::endl;
-					ast::print( std::cerr, withFunc->env, 2 );
-					std::cerr << "cost is: " << withFunc->cost << std::endl;
-					std::cerr << "cost of conversion is:" << cvtCost << std::endl;
-				)
-
-				if ( cvtCost != Cost::infinity ) {
-					withFunc->cvtCost = cvtCost;
-					candidates.emplace_back( std::move( withFunc ) );
-				}
-			}
-			found = std::move( candidates );
-
-			// use a new list so that candidates are not examined by addAnonConversions twice
-			CandidateList winners = findMinCost( found );
-			promoteCvtCost( winners );
-
-			// function may return a struct/union value, in which case we need to add candidates
-			// for implicit conversions to each of the anonymous members, which must happen after
-			// `findMinCost`, since anon conversions are never the cheapest
-			for ( const CandidateRef & c : winners ) {
-				addAnonConversions( c );
-			}
-			spliceBegin( candidates, winners );
-
-			if ( candidates.empty() && targetType && ! targetType->isVoid() ) {
-				// If resolution is unsuccessful with a target type, try again without, since it
-				// will sometimes succeed when it wouldn't with a target type binding.
-				// For example:
-				//   forall( otype T ) T & ?[]( T *, ptrdiff_t );
-				//   const char * x = "hello world";
-				//   unsigned char ch = x[0];
-				// Fails with simple return type binding (xxx -- check this!) as follows:
-				// * T is bound to unsigned char
-				// * (x: const char *) is unified with unsigned char *, which fails
-				// xxx -- fix this better
-				targetType = nullptr;
-				postvisit( untypedExpr );
-			}
-		}
-
-		/// true if expression is an lvalue
-		static bool isLvalue( const ast::Expr * x ) {
-			return x->result && ( x->get_lvalue() || x->result.as< ast::ReferenceType >() );
-		}
-
-		void postvisit( const ast::AddressExpr * addressExpr ) {
-			CandidateFinder finder( context, tenv );
-			finder.find( addressExpr->arg );
-
-			if( finder.candidates.empty() ) return;
-
-			reason.code = NoMatch;
-
-			for ( CandidateRef & r : finder.candidates ) {
-				if ( ! isLvalue( r->expr ) ) continue;
-				addCandidate( *r, new ast::AddressExpr{ addressExpr->location, r->expr } );
-			}
-		}
-
-		void postvisit( const ast::LabelAddressExpr * labelExpr ) {
-			addCandidate( labelExpr, tenv );
-		}
-
-		void postvisit( const ast::CastExpr * castExpr ) {
-			ast::ptr< ast::Type > toType = castExpr->result;
-			assert( toType );
-			toType = resolveTypeof( toType, context );
-			toType = adjustExprType( toType, tenv, symtab );
-
-			CandidateFinder finder( context, tenv, toType );
-			finder.find( castExpr->arg, ResolvMode::withAdjustment() );
-
-			if( !finder.candidates.empty() ) reason.code = NoMatch;
-
-			CandidateList matches;
-			for ( CandidateRef & cand : finder.candidates ) {
-				ast::AssertionSet need( cand->need.begin(), cand->need.end() ), have;
-				ast::OpenVarSet open( cand->open );
-
-				cand->env.extractOpenVars( open );
-
-				// It is possible that a cast can throw away some values in a multiply-valued
-				// expression, e.g. cast-to-void, one value to zero. Figure out the prefix of the
-				// subexpression results that are cast directly. The candidate is invalid if it
-				// has fewer results than there are types to cast to.
-				int discardedValues = cand->expr->result->size() - toType->size();
-				if ( discardedValues < 0 ) continue;
-
-				// unification run for side-effects
-				unify( toType, cand->expr->result, cand->env, need, have, open, symtab );
-				Cost thisCost =
-					(castExpr->isGenerated == ast::GeneratedFlag::GeneratedCast)
- 	                    ? conversionCost( cand->expr->result, toType, cand->expr->get_lvalue(), symtab, cand->env )
- 	                    : castCost( cand->expr->result, toType, cand->expr->get_lvalue(), symtab, cand->env );
-
-				PRINT(
-					std::cerr << "working on cast with result: " << toType << std::endl;
-					std::cerr << "and expr type: " << cand->expr->result << std::endl;
-					std::cerr << "env: " << cand->env << std::endl;
-				)
-				if ( thisCost != Cost::infinity ) {
-					PRINT(
-						std::cerr << "has finite cost." << std::endl;
-					)
-					// count one safe conversion for each value that is thrown away
-					thisCost.incSafe( discardedValues );
-					CandidateRef newCand = std::make_shared<Candidate>(
-						restructureCast( cand->expr, toType, castExpr->isGenerated ),
-						copy( cand->env ), std::move( open ), std::move( need ), cand->cost,
-						cand->cost + thisCost );
-					inferParameters( newCand, matches );
-				}
-			}
-
-			// select first on argument cost, then conversion cost
-			CandidateList minArgCost = findMinCost( matches );
-			promoteCvtCost( minArgCost );
-			candidates = findMinCost( minArgCost );
-		}
-
-		void postvisit( const ast::VirtualCastExpr * castExpr ) {
-			assertf( castExpr->result, "Implicit virtual cast targets not yet supported." );
-			CandidateFinder finder( context, tenv );
-			// don't prune here, all alternatives guaranteed to have same type
-			finder.find( castExpr->arg, ResolvMode::withoutPrune() );
-			for ( CandidateRef & r : finder.candidates ) {
-				addCandidate(
-					*r,
-					new ast::VirtualCastExpr{ castExpr->location, r->expr, castExpr->result } );
-			}
-		}
-
-		void postvisit( const ast::KeywordCastExpr * castExpr ) {
-			const auto & loc = castExpr->location;
-			assertf( castExpr->result, "Cast target should have been set in Validate." );
-			auto ref = castExpr->result.strict_as<ast::ReferenceType>();
-			auto inst = ref->base.strict_as<ast::StructInstType>();
-			auto target = inst->base.get();
-
-			CandidateFinder finder( context, tenv );
-
-			auto pick_alternatives = [target, this](CandidateList & found, bool expect_ref) {
-				for(auto & cand : found) {
-					const ast::Type * expr = cand->expr->result.get();
-					if(expect_ref) {
-						auto res = dynamic_cast<const ast::ReferenceType*>(expr);
-						if(!res) { continue; }
-						expr = res->base.get();
-					}
-
-					if(auto insttype = dynamic_cast<const ast::TypeInstType*>(expr)) {
-						auto td = cand->env.lookup(*insttype);
-						if(!td) { continue; }
-						expr = td->bound.get();
-					}
-
-					if(auto base = dynamic_cast<const ast::StructInstType*>(expr)) {
-						if(base->base == target) {
-							candidates.push_back( std::move(cand) );
-							reason.code = NoReason;
-						}
-					}
-				}
-			};
-
-			try {
-				// Attempt 1 : turn (thread&)X into (thread$&)X.__thrd
-				// Clone is purely for memory management
-				std::unique_ptr<const ast::Expr> tech1 { new ast::UntypedMemberExpr(loc, new ast::NameExpr(loc, castExpr->concrete_target.field), castExpr->arg) };
-
-				// don't prune here, since it's guaranteed all alternatives will have the same type
-				finder.find( tech1.get(), ResolvMode::withoutPrune() );
-				pick_alternatives(finder.candidates, false);
-
-				return;
-			} catch(SemanticErrorException & ) {}
-
-			// Fallback : turn (thread&)X into (thread$&)get_thread(X)
-			std::unique_ptr<const ast::Expr> fallback { ast::UntypedExpr::createDeref(loc,  new ast::UntypedExpr(loc, new ast::NameExpr(loc, castExpr->concrete_target.getter), { castExpr->arg })) };
-			// don't prune here, since it's guaranteed all alternatives will have the same type
-			finder.find( fallback.get(), ResolvMode::withoutPrune() );
-
-			pick_alternatives(finder.candidates, true);
-
-			// Whatever happens here, we have no more fallbacks
-		}
-
-		void postvisit( const ast::UntypedMemberExpr * memberExpr ) {
-			CandidateFinder aggFinder( context, tenv );
-			aggFinder.find( memberExpr->aggregate, ResolvMode::withAdjustment() );
-			for ( CandidateRef & agg : aggFinder.candidates ) {
-				// it's okay for the aggregate expression to have reference type -- cast it to the
-				// base type to treat the aggregate as the referenced value
-				Cost addedCost = Cost::zero;
-				agg->expr = referenceToRvalueConversion( agg->expr, addedCost );
-
-				// find member of the given type
-				if ( auto structInst = agg->expr->result.as< ast::StructInstType >() ) {
-					addAggMembers(
-						structInst, agg->expr, *agg, addedCost, getMemberName( memberExpr ) );
-				} else if ( auto unionInst = agg->expr->result.as< ast::UnionInstType >() ) {
-					addAggMembers(
-						unionInst, agg->expr, *agg, addedCost, getMemberName( memberExpr ) );
-				} else if ( auto tupleType = agg->expr->result.as< ast::TupleType >() ) {
-					addTupleMembers( tupleType, agg->expr, *agg, addedCost, memberExpr->member );
-				}
-			}
-		}
-
-		void postvisit( const ast::MemberExpr * memberExpr ) {
-			addCandidate( memberExpr, tenv );
-		}
-
-		void postvisit( const ast::NameExpr * nameExpr ) {
-			std::vector< ast::SymbolTable::IdData > declList;
-			if (!selfFinder.otypeKeys.empty()) {
-				auto kind = ast::SymbolTable::getSpecialFunctionKind(nameExpr->name);
-				assertf(kind != ast::SymbolTable::SpecialFunctionKind::NUMBER_OF_KINDS, "special lookup with non-special target: %s", nameExpr->name.c_str());
-
-				for (auto & otypeKey: selfFinder.otypeKeys) {
-					auto result = symtab.specialLookupId(kind, otypeKey);
-					declList.insert(declList.end(), std::make_move_iterator(result.begin()), std::make_move_iterator(result.end()));
-				}
-			}
-			else {
-				declList = symtab.lookupId( nameExpr->name );
-			}
-			PRINT( std::cerr << "nameExpr is " << nameExpr->name << std::endl; )
-
-			if( declList.empty() ) return;
-
-			reason.code = NoMatch;
-
-			for ( auto & data : declList ) {
-				Cost cost = Cost::zero;
-				ast::Expr * newExpr = data.combine( nameExpr->location, cost );
-
-				CandidateRef newCand = std::make_shared<Candidate>(
-					newExpr, copy( tenv ), ast::OpenVarSet{}, ast::AssertionSet{}, Cost::zero,
-					cost );
-
-				if (newCand->expr->env) {
-					newCand->env.add(*newCand->expr->env);
-					auto mutExpr = newCand->expr.get_and_mutate();
-					mutExpr->env  = nullptr;
-					newCand->expr = mutExpr;
-				}
-
-				PRINT(
-					std::cerr << "decl is ";
-					ast::print( std::cerr, data.id );
-					std::cerr << std::endl;
-					std::cerr << "newExpr is ";
-					ast::print( std::cerr, newExpr );
-					std::cerr << std::endl;
-				)
-				newCand->expr = ast::mutate_field(
-					newCand->expr.get(), &ast::Expr::result,
-					renameTyVars( newCand->expr->result ) );
-				// add anonymous member interpretations whenever an aggregate value type is seen
-				// as a name expression
-				addAnonConversions( newCand );
-				candidates.emplace_back( std::move( newCand ) );
-			}
-		}
-
-		void postvisit( const ast::VariableExpr * variableExpr ) {
-			// not sufficient to just pass `variableExpr` here, type might have changed since
-			// creation
-			addCandidate(
-				new ast::VariableExpr{ variableExpr->location, variableExpr->var }, tenv );
-		}
-
-		void postvisit( const ast::ConstantExpr * constantExpr ) {
-			addCandidate( constantExpr, tenv );
-		}
-
-		void postvisit( const ast::SizeofExpr * sizeofExpr ) {
-			if ( sizeofExpr->type ) {
-				addCandidate(
-					new ast::SizeofExpr{
-						sizeofExpr->location, resolveTypeof( sizeofExpr->type, context ) },
-					tenv );
-			} else {
-				// find all candidates for the argument to sizeof
-				CandidateFinder finder( context, tenv );
-				finder.find( sizeofExpr->expr );
-				// find the lowest-cost candidate, otherwise ambiguous
-				CandidateList winners = findMinCost( finder.candidates );
-				if ( winners.size() != 1 ) {
-					SemanticError(
-						sizeofExpr->expr.get(), "Ambiguous expression in sizeof operand: " );
-				}
-				// return the lowest-cost candidate
-				CandidateRef & choice = winners.front();
-				choice->expr = referenceToRvalueConversion( choice->expr, choice->cost );
-				choice->cost = Cost::zero;
-				addCandidate( *choice, new ast::SizeofExpr{ sizeofExpr->location, choice->expr } );
-			}
-		}
-
-		void postvisit( const ast::AlignofExpr * alignofExpr ) {
-			if ( alignofExpr->type ) {
-				addCandidate(
-					new ast::AlignofExpr{
-						alignofExpr->location, resolveTypeof( alignofExpr->type, context ) },
-					tenv );
-			} else {
-				// find all candidates for the argument to alignof
-				CandidateFinder finder( context, tenv );
-				finder.find( alignofExpr->expr );
-				// find the lowest-cost candidate, otherwise ambiguous
-				CandidateList winners = findMinCost( finder.candidates );
-				if ( winners.size() != 1 ) {
-					SemanticError(
-						alignofExpr->expr.get(), "Ambiguous expression in alignof operand: " );
-				}
-				// return the lowest-cost candidate
-				CandidateRef & choice = winners.front();
-				choice->expr = referenceToRvalueConversion( choice->expr, choice->cost );
-				choice->cost = Cost::zero;
-				addCandidate(
-					*choice, new ast::AlignofExpr{ alignofExpr->location, choice->expr } );
-			}
-		}
-
-		void postvisit( const ast::UntypedOffsetofExpr * offsetofExpr ) {
-			const ast::BaseInstType * aggInst;
-			if (( aggInst = offsetofExpr->type.as< ast::StructInstType >() )) ;
-			else if (( aggInst = offsetofExpr->type.as< ast::UnionInstType >() )) ;
-			else return;
-
-			for ( const ast::Decl * member : aggInst->lookup( offsetofExpr->member ) ) {
-				auto dwt = strict_dynamic_cast< const ast::DeclWithType * >( member );
-				addCandidate(
-					new ast::OffsetofExpr{ offsetofExpr->location, aggInst, dwt }, tenv );
-			}
-		}
-
-		void postvisit( const ast::OffsetofExpr * offsetofExpr ) {
-			addCandidate( offsetofExpr, tenv );
-		}
-
-		void postvisit( const ast::OffsetPackExpr * offsetPackExpr ) {
-			addCandidate( offsetPackExpr, tenv );
-		}
-
-		void postvisit( const ast::LogicalExpr * logicalExpr ) {
-			CandidateFinder finder1( context, tenv );
-			finder1.find( logicalExpr->arg1, ResolvMode::withAdjustment() );
-			if ( finder1.candidates.empty() ) return;
-
-			CandidateFinder finder2( context, tenv );
-			finder2.find( logicalExpr->arg2, ResolvMode::withAdjustment() );
-			if ( finder2.candidates.empty() ) return;
-
-			reason.code = NoMatch;
-
-			for ( const CandidateRef & r1 : finder1.candidates ) {
-				for ( const CandidateRef & r2 : finder2.candidates ) {
-					ast::TypeEnvironment env{ r1->env };
-					env.simpleCombine( r2->env );
-					ast::OpenVarSet open{ r1->open };
-					mergeOpenVars( open, r2->open );
-					ast::AssertionSet need;
-					mergeAssertionSet( need, r1->need );
-					mergeAssertionSet( need, r2->need );
-
-					addCandidate(
-						new ast::LogicalExpr{
-							logicalExpr->location, r1->expr, r2->expr, logicalExpr->isAnd },
-						std::move( env ), std::move( open ), std::move( need ), r1->cost + r2->cost );
-				}
-			}
-		}
-
-		void postvisit( const ast::ConditionalExpr * conditionalExpr ) {
-			// candidates for condition
-			CandidateFinder finder1( context, tenv );
-			finder1.find( conditionalExpr->arg1, ResolvMode::withAdjustment() );
-			if ( finder1.candidates.empty() ) return;
-
-			// candidates for true result
-			CandidateFinder finder2( context, tenv );
-			finder2.find( conditionalExpr->arg2, ResolvMode::withAdjustment() );
-			if ( finder2.candidates.empty() ) return;
-
-			// candidates for false result
-			CandidateFinder finder3( context, tenv );
-			finder3.find( conditionalExpr->arg3, ResolvMode::withAdjustment() );
-			if ( finder3.candidates.empty() ) return;
-
-			reason.code = NoMatch;
-
-			for ( const CandidateRef & r1 : finder1.candidates ) {
-				for ( const CandidateRef & r2 : finder2.candidates ) {
-					for ( const CandidateRef & r3 : finder3.candidates ) {
-						ast::TypeEnvironment env{ r1->env };
-						env.simpleCombine( r2->env );
-						env.simpleCombine( r3->env );
-						ast::OpenVarSet open{ r1->open };
-						mergeOpenVars( open, r2->open );
-						mergeOpenVars( open, r3->open );
-						ast::AssertionSet need;
-						mergeAssertionSet( need, r1->need );
-						mergeAssertionSet( need, r2->need );
-						mergeAssertionSet( need, r3->need );
-						ast::AssertionSet have;
-
-						// unify true and false results, then infer parameters to produce new
-						// candidates
-						ast::ptr< ast::Type > common;
-						if (
-							unify(
-								r2->expr->result, r3->expr->result, env, need, have, open, symtab,
-								common )
-						) {
-							// generate typed expression
-							ast::ConditionalExpr * newExpr = new ast::ConditionalExpr{
-								conditionalExpr->location, r1->expr, r2->expr, r3->expr };
-							newExpr->result = common ? common : r2->expr->result;
-							// convert both options to result type
-							Cost cost = r1->cost + r2->cost + r3->cost;
-							newExpr->arg2 = computeExpressionConversionCost(
-								newExpr->arg2, newExpr->result, symtab, env, cost );
-							newExpr->arg3 = computeExpressionConversionCost(
-								newExpr->arg3, newExpr->result, symtab, env, cost );
-							// output candidate
-							CandidateRef newCand = std::make_shared<Candidate>(
-								newExpr, std::move( env ), std::move( open ), std::move( need ), cost );
-							inferParameters( newCand, candidates );
-						}
-					}
-				}
-			}
-		}
-
-		void postvisit( const ast::CommaExpr * commaExpr ) {
-			ast::TypeEnvironment env{ tenv };
-			ast::ptr< ast::Expr > arg1 = resolveInVoidContext( commaExpr->arg1, context, env );
-
-			CandidateFinder finder2( context, env );
-			finder2.find( commaExpr->arg2, ResolvMode::withAdjustment() );
-
-			for ( const CandidateRef & r2 : finder2.candidates ) {
-				addCandidate( *r2, new ast::CommaExpr{ commaExpr->location, arg1, r2->expr } );
-			}
-		}
-
-		void postvisit( const ast::ImplicitCopyCtorExpr * ctorExpr ) {
-			addCandidate( ctorExpr, tenv );
-		}
-
-		void postvisit( const ast::ConstructorExpr * ctorExpr ) {
-			CandidateFinder finder( context, tenv );
-			finder.find( ctorExpr->callExpr, ResolvMode::withoutPrune() );
-			for ( CandidateRef & r : finder.candidates ) {
-				addCandidate( *r, new ast::ConstructorExpr{ ctorExpr->location, r->expr } );
-			}
-		}
-
-		void postvisit( const ast::RangeExpr * rangeExpr ) {
-			// resolve low and high, accept candidates where low and high types unify
-			CandidateFinder finder1( context, tenv );
-			finder1.find( rangeExpr->low, ResolvMode::withAdjustment() );
-			if ( finder1.candidates.empty() ) return;
-
-			CandidateFinder finder2( context, tenv );
-			finder2.find( rangeExpr->high, ResolvMode::withAdjustment() );
-			if ( finder2.candidates.empty() ) return;
-
-			reason.code = NoMatch;
-
-			for ( const CandidateRef & r1 : finder1.candidates ) {
-				for ( const CandidateRef & r2 : finder2.candidates ) {
-					ast::TypeEnvironment env{ r1->env };
-					env.simpleCombine( r2->env );
-					ast::OpenVarSet open{ r1->open };
-					mergeOpenVars( open, r2->open );
-					ast::AssertionSet need;
-					mergeAssertionSet( need, r1->need );
-					mergeAssertionSet( need, r2->need );
-					ast::AssertionSet have;
-
-					ast::ptr< ast::Type > common;
-					if (
-						unify(
-							r1->expr->result, r2->expr->result, env, need, have, open, symtab,
-							common )
-					) {
-						// generate new expression
-						ast::RangeExpr * newExpr =
-							new ast::RangeExpr{ rangeExpr->location, r1->expr, r2->expr };
-						newExpr->result = common ? common : r1->expr->result;
-						// add candidate
-						CandidateRef newCand = std::make_shared<Candidate>(
-							newExpr, std::move( env ), std::move( open ), std::move( need ),
-							r1->cost + r2->cost );
-						inferParameters( newCand, candidates );
-					}
-				}
-			}
-		}
-
-		void postvisit( const ast::UntypedTupleExpr * tupleExpr ) {
-			std::vector< CandidateFinder > subCandidates =
-				selfFinder.findSubExprs( tupleExpr->exprs );
-			std::vector< CandidateList > possibilities;
-			combos( subCandidates.begin(), subCandidates.end(), back_inserter( possibilities ) );
-
-			for ( const CandidateList & subs : possibilities ) {
-				std::vector< ast::ptr< ast::Expr > > exprs;
-				exprs.reserve( subs.size() );
-				for ( const CandidateRef & sub : subs ) { exprs.emplace_back( sub->expr ); }
-
-				ast::TypeEnvironment env;
-				ast::OpenVarSet open;
-				ast::AssertionSet need;
-				for ( const CandidateRef & sub : subs ) {
-					env.simpleCombine( sub->env );
-					mergeOpenVars( open, sub->open );
-					mergeAssertionSet( need, sub->need );
-				}
-
-				addCandidate(
-					new ast::TupleExpr{ tupleExpr->location, std::move( exprs ) },
-					std::move( env ), std::move( open ), std::move( need ), sumCost( subs ) );
-			}
-		}
-
-		void postvisit( const ast::TupleExpr * tupleExpr ) {
-			addCandidate( tupleExpr, tenv );
-		}
-
-		void postvisit( const ast::TupleIndexExpr * tupleExpr ) {
-			addCandidate( tupleExpr, tenv );
-		}
-
-		void postvisit( const ast::TupleAssignExpr * tupleExpr ) {
-			addCandidate( tupleExpr, tenv );
-		}
-
-		void postvisit( const ast::UniqueExpr * unqExpr ) {
-			CandidateFinder finder( context, tenv );
-			finder.find( unqExpr->expr, ResolvMode::withAdjustment() );
-			for ( CandidateRef & r : finder.candidates ) {
-				// ensure that the the id is passed on so that the expressions are "linked"
-				addCandidate( *r, new ast::UniqueExpr{ unqExpr->location, r->expr, unqExpr->id } );
-			}
-		}
-
-		void postvisit( const ast::StmtExpr * stmtExpr ) {
-			addCandidate( resolveStmtExpr( stmtExpr, context ), tenv );
-		}
-
-		void postvisit( const ast::UntypedInitExpr * initExpr ) {
-			// handle each option like a cast
-			CandidateList matches;
-			PRINT(
-				std::cerr << "untyped init expr: " << initExpr << std::endl;
-			)
-			// O(n^2) checks of d-types with e-types
-			for ( const ast::InitAlternative & initAlt : initExpr->initAlts ) {
-				// calculate target type
-				const ast::Type * toType = resolveTypeof( initAlt.type, context );
-				toType = adjustExprType( toType, tenv, symtab );
-				// The call to find must occur inside this loop, otherwise polymorphic return
-				// types are not bound to the initialization type, since return type variables are
-				// only open for the duration of resolving the UntypedExpr.
-				CandidateFinder finder( context, tenv, toType );
-				finder.find( initExpr->expr, ResolvMode::withAdjustment() );
-				for ( CandidateRef & cand : finder.candidates ) {
-					if(reason.code == NotFound) reason.code = NoMatch;
-
-					ast::TypeEnvironment env{ cand->env };
-					ast::AssertionSet need( cand->need.begin(), cand->need.end() ), have;
-					ast::OpenVarSet open{ cand->open };
-
-					PRINT(
-						std::cerr << "  @ " << toType << " " << initAlt.designation << std::endl;
-					)
-
-					// It is possible that a cast can throw away some values in a multiply-valued
-					// expression, e.g. cast-to-void, one value to zero. Figure out the prefix of
-					// the subexpression results that are cast directly. The candidate is invalid
-					// if it has fewer results than there are types to cast to.
-					int discardedValues = cand->expr->result->size() - toType->size();
-					if ( discardedValues < 0 ) continue;
-
-					// unification run for side-effects
-					bool canUnify = unify( toType, cand->expr->result, env, need, have, open, symtab );
-					(void) canUnify;
-					Cost thisCost = computeConversionCost( cand->expr->result, toType, cand->expr->get_lvalue(),
-						symtab, env );
-					PRINT(
-						Cost legacyCost = castCost( cand->expr->result, toType, cand->expr->get_lvalue(),
-							symtab, env );
-						std::cerr << "Considering initialization:";
-						std::cerr << std::endl << "  FROM: " << cand->expr->result << std::endl;
-						std::cerr << std::endl << "  TO: "   << toType             << std::endl;
-						std::cerr << std::endl << "  Unification " << (canUnify ? "succeeded" : "failed");
-						std::cerr << std::endl << "  Legacy cost " << legacyCost;
-						std::cerr << std::endl << "  New cost " << thisCost;
-						std::cerr << std::endl;
-					)
-					if ( thisCost != Cost::infinity ) {
-						// count one safe conversion for each value that is thrown away
-						thisCost.incSafe( discardedValues );
-						CandidateRef newCand = std::make_shared<Candidate>(
-							new ast::InitExpr{
-								initExpr->location, restructureCast( cand->expr, toType ),
-								initAlt.designation },
-							std::move(env), std::move( open ), std::move( need ), cand->cost, thisCost );
-						inferParameters( newCand, matches );
-					}
-				}
-
-			}
-
-			// select first on argument cost, then conversion cost
-			CandidateList minArgCost = findMinCost( matches );
-			promoteCvtCost( minArgCost );
-			candidates = findMinCost( minArgCost );
-		}
-
-		void postvisit( const ast::InitExpr * ) {
-			assertf( false, "CandidateFinder should never see a resolved InitExpr." );
-		}
-
-		void postvisit( const ast::DeletedExpr * ) {
-			assertf( false, "CandidateFinder should never see a DeletedExpr." );
-		}
-
-		void postvisit( const ast::GenericExpr * ) {
-			assertf( false, "_Generic is not yet supported." );
-		}
-	};
-
-	// size_t Finder::traceId = Stats::Heap::new_stacktrace_id("Finder");
-	/// Prunes a list of candidates down to those that have the minimum conversion cost for a given
-	/// return type. Skips ambiguous candidates.
-
-} // anonymous namespace
-
-bool CandidateFinder::pruneCandidates( CandidateList & candidates, CandidateList & out, std::vector<std::string> & errors ) {
-	struct PruneStruct {
-		CandidateRef candidate;
-		bool ambiguous;
-
-		PruneStruct() = default;
-		PruneStruct( const CandidateRef & c ) : candidate( c ), ambiguous( false ) {}
-	};
-
-	// find lowest-cost candidate for each type
-	std::unordered_map< std::string, PruneStruct > selected;
-	// attempt to skip satisfyAssertions on more expensive alternatives if better options have been found
-	std::sort(candidates.begin(), candidates.end(), [](const CandidateRef & x, const CandidateRef & y){return x->cost < y->cost;});
-	for ( CandidateRef & candidate : candidates ) {
-		std::string mangleName;
-		{
-			ast::ptr< ast::Type > newType = candidate->expr->result;
-			assertf(candidate->expr->result, "Result of expression %p for candidate is null", candidate->expr.get());
-			candidate->env.apply( newType );
-			mangleName = Mangle::mangle( newType );
-		}
-
-		auto found = selected.find( mangleName );
-		if (found != selected.end() && found->second.candidate->cost < candidate->cost) {
-			PRINT(
-				std::cerr << "cost " << candidate->cost << " loses to "
-					<< found->second.candidate->cost << std::endl;
-			)
-			continue;
-		}
-
-		// xxx - when do satisfyAssertions produce more than 1 result?
-		// this should only happen when initial result type contains
-		// unbound type parameters, then it should never be pruned by
-		// the previous step, since renameTyVars guarantees the mangled name
-		// is unique.
-		CandidateList satisfied;
-		bool needRecomputeKey = false;
-		if (candidate->need.empty()) {
-			satisfied.emplace_back(candidate);
-		}
-		else {
-			satisfyAssertions(candidate, context.symtab, satisfied, errors);
-			needRecomputeKey = true;
-		}
-
-		for (auto & newCand : satisfied) {
-			// recomputes type key, if satisfyAssertions changed it
-			if (needRecomputeKey)
-			{
-				ast::ptr< ast::Type > newType = newCand->expr->result;
-				assertf(newCand->expr->result, "Result of expression %p for candidate is null", newCand->expr.get());
-				newCand->env.apply( newType );
-				mangleName = Mangle::mangle( newType );
-			}
-			auto found = selected.find( mangleName );
-			if ( found != selected.end() ) {
-				if ( newCand->cost < found->second.candidate->cost ) {
-					PRINT(
-						std::cerr << "cost " << newCand->cost << " beats "
-							<< found->second.candidate->cost << std::endl;
-					)
-
-					found->second = PruneStruct{ newCand };
-				} else if ( newCand->cost == found->second.candidate->cost ) {
-					// if one of the candidates contains a deleted identifier, can pick the other,
-					// since deleted expressions should not be ambiguous if there is another option
-					// that is at least as good
-					if ( findDeletedExpr( newCand->expr ) ) {
-						// do nothing
-						PRINT( std::cerr << "candidate is deleted" << std::endl; )
-					} else if ( findDeletedExpr( found->second.candidate->expr ) ) {
-						PRINT( std::cerr << "current is deleted" << std::endl; )
-						found->second = PruneStruct{ newCand };
-					} else {
-						PRINT( std::cerr << "marking ambiguous" << std::endl; )
-						found->second.ambiguous = true;
-					}
-				} else {
-					// xxx - can satisfyAssertions increase the cost?
-					PRINT(
-						std::cerr << "cost " << newCand->cost << " loses to "
-							<< found->second.candidate->cost << std::endl;
-					)
-				}
-			} else {
-				selected.emplace_hint( found, mangleName, newCand );
-			}
-		}
-	}
-
-	// report unambiguous min-cost candidates
-	// CandidateList out;
-	for ( auto & target : selected ) {
-		if ( target.second.ambiguous ) continue;
-
-		CandidateRef cand = target.second.candidate;
-
-		ast::ptr< ast::Type > newResult = cand->expr->result;
-		cand->env.applyFree( newResult );
-		cand->expr = ast::mutate_field(
-			cand->expr.get(), &ast::Expr::result, std::move( newResult ) );
-
-		out.emplace_back( cand );
-	}
-	// if everything is lost in satisfyAssertions, report the error
-	return !selected.empty();
-}
-
-void CandidateFinder::find( const ast::Expr * expr, ResolvMode mode ) {
-	// Find alternatives for expression
-	ast::Pass<Finder> finder{ *this };
-	expr->accept( finder );
-
-	if ( mode.failFast && candidates.empty() ) {
-		switch(finder.core.reason.code) {
-		case Finder::NotFound:
-			{ SemanticError( expr, "No alternatives for expression " ); break; }
-		case Finder::NoMatch:
-			{ SemanticError( expr, "Invalid application of existing declaration(s) in expression " ); break; }
-		case Finder::ArgsToFew:
-		case Finder::ArgsToMany:
-		case Finder::RetsToFew:
-		case Finder::RetsToMany:
-		case Finder::NoReason:
-		default:
-			{ SemanticError( expr->location, "No reasonable alternatives for expression : reasons unkown" ); }
-		}
-	}
-
-	/*
-	if ( mode.satisfyAssns || mode.prune ) {
-		// trim candidates to just those where the assertions are satisfiable
-		// - necessary pre-requisite to pruning
-		CandidateList satisfied;
-		std::vector< std::string > errors;
-		for ( CandidateRef & candidate : candidates ) {
-			satisfyAssertions( candidate, localSyms, satisfied, errors );
-		}
-
-		// fail early if none such
-		if ( mode.failFast && satisfied.empty() ) {
-			std::ostringstream stream;
-			stream << "No alternatives with satisfiable assertions for " << expr << "\n";
-			for ( const auto& err : errors ) {
-				stream << err;
-			}
-			SemanticError( expr->location, stream.str() );
-		}
-
-		// reset candidates
-		candidates = move( satisfied );
-	}
-	*/
-
-	if ( mode.prune ) {
-		// trim candidates to single best one
-		PRINT(
-			std::cerr << "alternatives before prune:" << std::endl;
-			print( std::cerr, candidates );
-		)
-
-		CandidateList pruned;
-		std::vector<std::string> errors;
-		bool found = pruneCandidates( candidates, pruned, errors );
-
-		if ( mode.failFast && pruned.empty() ) {
-			std::ostringstream stream;
-			if (found) {
-				CandidateList winners = findMinCost( candidates );
-				stream << "Cannot choose between " << winners.size() << " alternatives for "
-					"expression\n";
-				ast::print( stream, expr );
-				stream << " Alternatives are:\n";
-				print( stream, winners, 1 );
-				SemanticError( expr->location, stream.str() );
-			}
-			else {
-				stream << "No alternatives with satisfiable assertions for " << expr << "\n";
-				for ( const auto& err : errors ) {
-					stream << err;
-				}
-				SemanticError( expr->location, stream.str() );
-			}
-		}
-
-		auto oldsize = candidates.size();
-		candidates = std::move( pruned );
-
-		PRINT(
-			std::cerr << "there are " << oldsize << " alternatives before elimination" << std::endl;
-		)
-		PRINT(
-			std::cerr << "there are " << candidates.size() << " alternatives after elimination"
-				<< std::endl;
-		)
-	}
-
-	// adjust types after pruning so that types substituted by pruneAlternatives are correctly
-	// adjusted
-	if ( mode.adjust ) {
-		for ( CandidateRef & r : candidates ) {
-			r->expr = ast::mutate_field(
-				r->expr.get(), &ast::Expr::result,
-				adjustExprType( r->expr->result, r->env, context.symtab ) );
-		}
-	}
-
-	// Central location to handle gcc extension keyword, etc. for all expressions
-	for ( CandidateRef & r : candidates ) {
-		if ( r->expr->extension != expr->extension ) {
-			r->expr.get_and_mutate()->extension = expr->extension;
-		}
-	}
-}
-
-std::vector< CandidateFinder > CandidateFinder::findSubExprs(
-	const std::vector< ast::ptr< ast::Expr > > & xs
-) {
-	std::vector< CandidateFinder > out;
-
-	for ( const auto & x : xs ) {
-		out.emplace_back( context, env );
-		out.back().find( x, ResolvMode::withAdjustment() );
-
-		PRINT(
-			std::cerr << "findSubExprs" << std::endl;
-			print( std::cerr, out.back().candidates );
-		)
-	}
-
-	return out;
-}
-
 } // namespace ResolvExpr
 
Index: src/ResolvExpr/CurrentObject.cc
===================================================================
--- src/ResolvExpr/CurrentObject.cc	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/ResolvExpr/CurrentObject.cc	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -9,7 +9,7 @@
 // Author           : Rob Schluntz
 // Created On       : Tue Jun 13 15:28:32 2017
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jul  1 09:16:01 2022
-// Update Count     : 15
+// Last Modified By : Andrew Beach
+// Last Modified On : Mon Apr 10  9:40:00 2023
+// Update Count     : 18
 //
 
@@ -593,4 +593,43 @@
 
 namespace ast {
+	/// Iterates members of a type by initializer.
+	class MemberIterator {
+	public:
+		virtual ~MemberIterator() {}
+
+		/// Internal set position based on iterator ranges.
+		virtual void setPosition(
+			std::deque< ptr< Expr > >::const_iterator it,
+			std::deque< ptr< Expr > >::const_iterator end ) = 0;
+
+		/// Walks the current object using the given designators as a guide.
+		void setPosition( const std::deque< ptr< Expr > > & designators ) {
+			setPosition( designators.begin(), designators.end() );
+		}
+
+		/// Retrieve the list of possible (Type,Designation) pairs for the
+		/// current position in the current object.
+		virtual std::deque< InitAlternative > operator* () const = 0;
+
+		/// True if the iterator is not currently at the end.
+		virtual operator bool() const = 0;
+
+		/// Moves the iterator by one member in the current object.
+		virtual MemberIterator & bigStep() = 0;
+
+		/// Moves the iterator by one member in the current subobject.
+		virtual MemberIterator & smallStep() = 0;
+
+		/// The type of the current object.
+		virtual const Type * getType() = 0;
+
+		/// The type of the current subobject.
+		virtual const Type * getNext() = 0;
+
+		/// Helper for operator*; aggregates must add designator to each init
+		/// alternative, but adding designators in operator* creates duplicates.
+		virtual std::deque< InitAlternative > first() const = 0;
+	};
+
 	/// create a new MemberIterator that traverses a type correctly
 	MemberIterator * createMemberIterator( const CodeLocation & loc, const Type * type );
@@ -632,30 +671,15 @@
 	};
 
-	/// Iterates array types
-	class ArrayIterator final : public MemberIterator {
+	/// Iterates over an indexed type:
+	class IndexIterator : public MemberIterator {
+	protected:
 		CodeLocation location;
-		const ArrayType * array = nullptr;
-		const Type * base = nullptr;
 		size_t index = 0;
 		size_t size = 0;
-		std::unique_ptr< MemberIterator > memberIter;
-
-		void setSize( const Expr * expr ) {
-			auto res = eval( expr );
-			if ( ! res.second ) {
-				SemanticError( location, toString( "Array designator must be a constant expression: ", expr ) );
-			}
-			size = res.first;
-		}
-
-	public:
-		ArrayIterator( const CodeLocation & loc, const ArrayType * at ) : location( loc ), array( at ), base( at->base ) {
-			PRINT( std::cerr << "Creating array iterator: " << at << std::endl; )
-			memberIter.reset( createMemberIterator( loc, base ) );
-			if ( at->isVarLen ) {
-				SemanticError( location, at, "VLA initialization does not support @=: " );
-			}
-			setSize( at->dimension );
-		}
+		std::unique_ptr<MemberIterator> memberIter;
+	public:
+		IndexIterator( const CodeLocation & loc, size_t size ) :
+			location( loc ), size( size )
+		{}
 
 		void setPosition( const Expr * expr ) {
@@ -666,5 +690,4 @@
 			auto arg = eval( expr );
 			index = arg.first;
-			return;
 
 			// if ( auto constExpr = dynamic_cast< const ConstantExpr * >( expr ) ) {
@@ -684,6 +707,6 @@
 
 		void setPosition(
-			std::deque< ptr< Expr > >::const_iterator begin,
-			std::deque< ptr< Expr > >::const_iterator end
+			std::deque<ast::ptr<ast::Expr>>::const_iterator begin,
+			std::deque<ast::ptr<ast::Expr>>::const_iterator end
 		) override {
 			if ( begin == end ) return;
@@ -696,4 +719,29 @@
 
 		operator bool() const override { return index < size; }
+	};
+
+	/// Iterates over the members of array types:
+	class ArrayIterator final : public IndexIterator {
+		const ArrayType * array = nullptr;
+		const Type * base = nullptr;
+
+		size_t getSize( const Expr * expr ) {
+			auto res = eval( expr );
+			if ( !res.second ) {
+				SemanticError( location, toString( "Array designator must be a constant expression: ", expr ) );
+			}
+			return res.first;
+		}
+
+	public:
+		ArrayIterator( const CodeLocation & loc, const ArrayType * at ) :
+				IndexIterator( loc, getSize( at->dimension) ),
+				array( at ), base( at->base ) {
+			PRINT( std::cerr << "Creating array iterator: " << at << std::endl; )
+			memberIter.reset( createMemberIterator( loc, base ) );
+			if ( at->isVarLen ) {
+				SemanticError( location, at, "VLA initialization does not support @=: " );
+			}
+		}
 
 		ArrayIterator & bigStep() override {
@@ -834,5 +882,6 @@
 
 		const Type * getNext() final {
-			return ( memberIter && *memberIter ) ? memberIter->getType() : nullptr;
+			bool hasMember = memberIter && *memberIter;
+			return hasMember ? memberIter->getType() : nullptr;
 		}
 
@@ -898,25 +947,59 @@
 	};
 
-	class TupleIterator final : public AggregateIterator {
-	public:
-		TupleIterator( const CodeLocation & loc, const TupleType * inst )
-		: AggregateIterator(
-			loc, "TupleIterator", toString("Tuple", inst->size()), inst, inst->members
-		) {}
-
-		operator bool() const override {
-			return curMember != members.end() || (memberIter && *memberIter);
+	/// Iterates across the positions in a tuple:
+	class TupleIterator final : public IndexIterator {
+		ast::TupleType const * const tuple;
+
+		const ast::Type * typeAtIndex() const {
+			assert( index < size );
+			return tuple->types[ index ].get();
+		}
+
+	public:
+		TupleIterator( const CodeLocation & loc, const TupleType * type )
+		: IndexIterator( loc, type->size() ), tuple( type ) {
+			PRINT( std::cerr << "Creating tuple iterator: " << type << std::endl; )
+			memberIter.reset( createMemberIterator( loc, typeAtIndex() ) );
 		}
 
 		TupleIterator & bigStep() override {
-			PRINT( std::cerr << "bigStep in " << kind << std::endl; )
-			atbegin = false;
-			memberIter = nullptr;
-			curType = nullptr;
-			while ( curMember != members.end() ) {
-				++curMember;
-				if ( init() ) return *this;
-			}
+			++index;
+			memberIter.reset( index < size ?
+				createMemberIterator( location, typeAtIndex() ) : nullptr );
 			return *this;
+		}
+
+		TupleIterator & smallStep() override {
+			if ( memberIter ) {
+				PRINT( std::cerr << "has member iter: " << *memberIter << std::endl; )
+				memberIter->smallStep();
+				if ( !memberIter ) {
+					PRINT( std::cerr << "has valid member iter" << std::endl; )
+					return *this;
+				}
+			}
+			return bigStep();
+		}
+
+		const ast::Type * getType() override {
+			return tuple;
+		}
+
+		const ast::Type * getNext() override {
+			bool hasMember = memberIter && *memberIter;
+			return hasMember ? memberIter->getType() : nullptr;
+		}
+
+		std::deque< InitAlternative > first() const override {
+			PRINT( std::cerr << "first in TupleIterator (" << index << "/" << size << ")" << std::endl; )
+			if ( memberIter && *memberIter ) {
+				std::deque< InitAlternative > ret = memberIter->first();
+				for ( InitAlternative & alt : ret ) {
+					alt.designation.get_and_mutate()->designators.emplace_front(
+						ConstantExpr::from_ulong( location, index ) );
+				}
+				return ret;
+			}
+			return {};
 		}
 	};
Index: src/ResolvExpr/CurrentObject.h
===================================================================
--- src/ResolvExpr/CurrentObject.h	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/ResolvExpr/CurrentObject.h	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -9,7 +9,7 @@
 // Author           : Rob Schluntz
 // Created On       : Thu Jun  8 11:07:25 2017
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Jul 22 09:36:48 2017
-// Update Count     : 3
+// Last Modified By : Andrew Beach
+// Last Modified On : Thu Apr  6 16:14:00 2023
+// Update Count     : 4
 //
 
@@ -65,41 +65,5 @@
 
 	/// Iterates members of a type by initializer
-	class MemberIterator {
-	public:
-		virtual ~MemberIterator() {}
-
-		/// Internal set position based on iterator ranges
-		virtual void setPosition( 
-			std::deque< ptr< Expr > >::const_iterator it, 
-			std::deque< ptr< Expr > >::const_iterator end ) = 0;
-
-		/// walks the current object using the given designators as a guide
-		void setPosition( const std::deque< ptr< Expr > > & designators ) {
-			setPosition( designators.begin(), designators.end() );
-		}
-
-		/// retrieve the list of possible (Type,Designation) pairs for the current position in the 
-		/// current object
-		virtual std::deque< InitAlternative > operator* () const = 0;
-
-		/// true if the iterator is not currently at the end
-		virtual operator bool() const = 0;
-
-		/// moves the iterator by one member in the current object
-		virtual MemberIterator & bigStep() = 0;
-
-		/// moves the iterator by one member in the current subobject
-		virtual MemberIterator & smallStep() = 0;
-
-		/// the type of the current object
-		virtual const Type * getType() = 0;
-
-		/// the type of the current subobject
-		virtual const Type * getNext() = 0;
-	
-		/// helper for operator*; aggregates must add designator to each init alternative, but 
-		/// adding designators in operator* creates duplicates
-		virtual std::deque< InitAlternative > first() const = 0;
-	};
+	class MemberIterator;
 
 	/// Builds initializer lists in resolution
Index: src/ResolvExpr/ExplodedArg.hpp
===================================================================
--- src/ResolvExpr/ExplodedArg.hpp	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/ResolvExpr/ExplodedArg.hpp	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -35,5 +35,5 @@
 	ExplodedArg() : env(), cost( Cost::zero ), exprs() {}
 	ExplodedArg( const Candidate & arg, const ast::SymbolTable & symtab );
-	
+
 	ExplodedArg( ExplodedArg && ) = default;
 	ExplodedArg & operator= ( ExplodedArg && ) = default;
Index: src/SymTab/Autogen.cc
===================================================================
--- src/SymTab/Autogen.cc	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/SymTab/Autogen.cc	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -10,6 +10,6 @@
 // Created On       : Thu Mar 03 15:45:56 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Apr 27 14:39:06 2018
-// Update Count     : 63
+// Last Modified On : Fri Apr 14 15:03:00 2023
+// Update Count     : 64
 //
 
@@ -211,8 +211,4 @@
 	}
 
-	bool isUnnamedBitfield( const ast::ObjectDecl * obj ) {
-		return obj && obj->name.empty() && obj->bitfieldWidth;
-	}
-
 	/// inserts a forward declaration for functionDecl into declsToAdd
 	void addForwardDecl( FunctionDecl * functionDecl, std::list< Declaration * > & declsToAdd ) {
@@ -234,15 +230,4 @@
 	}
 
-	// shallow copy the pointer list for return
-	std::vector<ast::ptr<ast::TypeDecl>> getGenericParams (const ast::Type * t) {
-		if (auto structInst = dynamic_cast<const ast::StructInstType*>(t)) {
-			return structInst->base->params;
-		}
-		if (auto unionInst = dynamic_cast<const ast::UnionInstType*>(t)) {
-			return unionInst->base->params;
-		}
-		return {};
-	}
-
 	/// given type T, generate type of default ctor/dtor, i.e. function type void (*) (T *)
 	FunctionType * genDefaultType( Type * paramType, bool maybePolymorphic ) {
@@ -256,12 +241,4 @@
 		ftype->parameters.push_back( dstParam );
 		return ftype;
-	}
-
-	/// Given type T, generate type of default ctor/dtor, i.e. function type void (*) (T &).
-	ast::FunctionDecl * genDefaultFunc(const CodeLocation loc, const std::string fname, const ast::Type * paramType, bool maybePolymorphic) {
-		std::vector<ast::ptr<ast::TypeDecl>> typeParams;
-		if (maybePolymorphic) typeParams = getGenericParams(paramType);
-		auto dstParam = new ast::ObjectDecl(loc, "_dst", new ast::ReferenceType(paramType), nullptr, {}, ast::Linkage::Cforall);
-		return new ast::FunctionDecl(loc, fname, std::move(typeParams), {dstParam}, {}, new ast::CompoundStmt(loc), {}, ast::Linkage::Cforall);
 	}
 
Index: src/SymTab/Autogen.h
===================================================================
--- src/SymTab/Autogen.h	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/SymTab/Autogen.h	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -9,7 +9,7 @@
 // Author           : Rob Schluntz
 // Created On       : Sun May 17 21:53:34 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Dec 13 16:38:06 2019
-// Update Count     : 16
+// Last Modified By : Andrew Beach
+// Last Modified On : Fri Apr 14 15:06:00 2023
+// Update Count     : 17
 //
 
@@ -45,5 +45,4 @@
 	/// returns true if obj's name is the empty string and it has a bitfield width
 	bool isUnnamedBitfield( ObjectDecl * obj );
-	bool isUnnamedBitfield( const ast::ObjectDecl * obj );
 
 	/// generate the type of an assignment function for paramType.
@@ -55,6 +54,4 @@
 	FunctionType * genDefaultType( Type * paramType, bool maybePolymorphic = true );
 
-	ast::FunctionDecl * genDefaultFunc(const CodeLocation loc, const std::string fname, const ast::Type * paramType, bool maybePolymorphic = true);
-
 	/// generate the type of a copy constructor for paramType.
 	/// maybePolymorphic is true if the resulting FunctionType is allowed to be polymorphic
@@ -67,10 +64,4 @@
 	template< typename OutputIterator >
 	Statement * genCall( InitTweak::InitExpander_old & srcParam, Expression * dstParam, const std::string & fname, OutputIterator out, Type * type, Type * addCast = nullptr, bool forward = true );
-
-	template< typename OutIter >
-	ast::ptr< ast::Stmt > genCall(
-		InitTweak::InitExpander_new & srcParam, const ast::Expr * dstParam,
-		const CodeLocation & loc, const std::string & fname, OutIter && out,
-		const ast::Type * type, const ast::Type * addCast, LoopDirection forward = LoopForward );
 
 	/// inserts into out a generated call expression to function fname with arguments dstParam and srcParam. Should only be called with non-array types.
@@ -121,61 +112,4 @@
 
 		*out++ = new ExprStmt( fExpr );
-
-		srcParam.clearArrayIndices();
-
-		return listInit;
-	}
-
-	/// inserts into out a generated call expression to function fname with arguments dstParam and
-	/// srcParam. Should only be called with non-array types.
-	/// optionally returns a statement which must be inserted prior to the containing loop, if
-	/// there is one
-	template< typename OutIter >
-	ast::ptr< ast::Stmt > genScalarCall(
-		InitTweak::InitExpander_new & srcParam, const ast::Expr * dstParam,
-		const CodeLocation & loc, std::string fname, OutIter && out, const ast::Type * type,
-		const ast::Type * addCast = nullptr
-	) {
-		bool isReferenceCtorDtor = false;
-		if ( dynamic_cast< const ast::ReferenceType * >( type ) && CodeGen::isCtorDtor( fname ) ) {
-			// reference constructors are essentially application of the rebind operator.
-			// apply & to both arguments, do not need a cast
-			fname = "?=?";
-			dstParam = new ast::AddressExpr{ dstParam };
-			addCast = nullptr;
-			isReferenceCtorDtor = true;
-		}
-
-		// want to be able to generate assignment, ctor, and dtor generically, so fname is one of
-		// "?=?", "?{}", or "^?{}"
-		ast::UntypedExpr * fExpr = new ast::UntypedExpr{ loc, new ast::NameExpr{ loc, fname } };
-
-		if ( addCast ) {
-			// cast to T& with qualifiers removed, so that qualified objects can be constructed and
-			// destructed with the same functions as non-qualified objects. Unfortunately, lvalue
-			// is considered a qualifier - for AddressExpr to resolve, its argument must have an
-			// lvalue-qualified type, so remove all qualifiers except lvalue.
-			// xxx -- old code actually removed lvalue too...
-			ast::ptr< ast::Type > guard = addCast;  // prevent castType from mutating addCast
-			ast::ptr< ast::Type > castType = addCast;
-			ast::remove_qualifiers(
-				castType,
-				ast::CV::Const | ast::CV::Volatile | ast::CV::Restrict | ast::CV::Atomic );
-			dstParam = new ast::CastExpr{ dstParam, new ast::ReferenceType{ castType } };
-		}
-		fExpr->args.emplace_back( dstParam );
-
-		ast::ptr<ast::Stmt> listInit = srcParam.buildListInit( fExpr );
-
-		// fetch next set of arguments
-		++srcParam;
-
-		// return if adding reference fails -- will happen on default ctor and dtor
-		if ( isReferenceCtorDtor && ! srcParam.addReference() ) return listInit;
-
-		std::vector< ast::ptr< ast::Expr > > args = *srcParam;
-		splice( fExpr->args, args );
-
-		*out++ = new ast::ExprStmt{ loc, fExpr };
 
 		srcParam.clearArrayIndices();
@@ -248,74 +182,4 @@
 	}
 
-	/// Store in out a loop which calls fname on each element of the array with srcParam and
-	/// dstParam as arguments. If forward is true, loop goes from 0 to N-1, else N-1 to 0
-	template< typename OutIter >
-	void genArrayCall(
-		InitTweak::InitExpander_new & srcParam, const ast::Expr * dstParam,
-		const CodeLocation & loc, const std::string & fname, OutIter && out,
-		const ast::ArrayType * array, const ast::Type * addCast = nullptr,
-		LoopDirection forward = LoopForward
-	) {
-		static UniqueName indexName( "_index" );
-
-		// for a flexible array member nothing is done -- user must define own assignment
-		if ( ! array->dimension ) return;
-
-		if ( addCast ) {
-			// peel off array layer from cast
-			addCast = strict_dynamic_cast< const ast::ArrayType * >( addCast )->base;
-		}
-
-		ast::ptr< ast::Expr > begin, end;
-		std::string cmp, update;
-
-		if ( forward ) {
-			// generate: for ( int i = 0; i < N; ++i )
-			begin = ast::ConstantExpr::from_int( loc, 0 );
-			end = array->dimension;
-			cmp = "?<?";
-			update = "++?";
-		} else {
-			// generate: for ( int i = N-1; i >= 0; --i )
-			begin = ast::UntypedExpr::createCall( loc, "?-?",
-				{ array->dimension, ast::ConstantExpr::from_int( loc, 1 ) } );
-			end = ast::ConstantExpr::from_int( loc, 0 );
-			cmp = "?>=?";
-			update = "--?";
-		}
-
-		ast::ptr< ast::DeclWithType > index = new ast::ObjectDecl{
-			loc, indexName.newName(), new ast::BasicType{ ast::BasicType::SignedInt },
-			new ast::SingleInit{ loc, begin } };
-		ast::ptr< ast::Expr > indexVar = new ast::VariableExpr{ loc, index };
-
-		ast::ptr< ast::Expr > cond = ast::UntypedExpr::createCall(
-			loc, cmp, { indexVar, end } );
-
-		ast::ptr< ast::Expr > inc = ast::UntypedExpr::createCall(
-			loc, update, { indexVar } );
-
-		ast::ptr< ast::Expr > dstIndex = ast::UntypedExpr::createCall(
-			loc, "?[?]", { dstParam, indexVar } );
-
-		// srcParam must keep track of the array indices to build the source parameter and/or
-		// array list initializer
-		srcParam.addArrayIndex( indexVar, array->dimension );
-
-		// for stmt's body, eventually containing call
-		ast::CompoundStmt * body = new ast::CompoundStmt{ loc };
-		ast::ptr< ast::Stmt > listInit = genCall(
-			srcParam, dstIndex, loc, fname, std::back_inserter( body->kids ), array->base, addCast,
-			forward );
-
-		// block containing the stmt and index variable
-		ast::CompoundStmt * block = new ast::CompoundStmt{ loc };
-		block->push_back( new ast::DeclStmt{ loc, index } );
-		if ( listInit ) { block->push_back( listInit ); }
-		block->push_back( new ast::ForStmt{ loc, {}, cond, inc, body } );
-
-		*out++ = block;
-	}
-
 	template< typename OutputIterator >
 	Statement * genCall( InitTweak::InitExpander_old & srcParam, Expression * dstParam, const std::string & fname, OutputIterator out, Type * type, Type * addCast, bool forward ) {
@@ -325,21 +189,4 @@
 		} else {
 			return genScalarCall( srcParam, dstParam, fname, out, type, addCast );
-		}
-	}
-
-	template< typename OutIter >
-	ast::ptr< ast::Stmt > genCall(
-		InitTweak::InitExpander_new & srcParam, const ast::Expr * dstParam,
-		const CodeLocation & loc, const std::string & fname, OutIter && out,
-		const ast::Type * type, const ast::Type * addCast, LoopDirection forward
-	) {
-		if ( auto at = dynamic_cast< const ast::ArrayType * >( type ) ) {
-			genArrayCall(
-				srcParam, dstParam, loc, fname, std::forward< OutIter >(out), at, addCast,
-				forward );
-			return {};
-		} else {
-			return genScalarCall(
-				srcParam, dstParam, loc, fname, std::forward< OutIter >( out ), type, addCast );
 		}
 	}
@@ -379,37 +226,4 @@
 	}
 
-	static inline ast::ptr< ast::Stmt > genImplicitCall(
-		InitTweak::InitExpander_new & srcParam, const ast::Expr * dstParam,
-		const CodeLocation & loc, const std::string & fname, const ast::ObjectDecl * obj,
-		LoopDirection forward = LoopForward
-	) {
-		// unnamed bit fields are not copied as they cannot be accessed
-		if ( isUnnamedBitfield( obj ) ) return {};
-
-		ast::ptr< ast::Type > addCast;
-		if ( (fname == "?{}" || fname == "^?{}") && ( ! obj || ( obj && ! obj->bitfieldWidth ) ) ) {
-			assert( dstParam->result );
-			addCast = dstParam->result;
-		}
-
-		std::vector< ast::ptr< ast::Stmt > > stmts;
-		genCall(
-			srcParam, dstParam, loc, fname, back_inserter( stmts ), obj->type, addCast, forward );
-
-		if ( stmts.empty() ) {
-			return {};
-		} else if ( stmts.size() == 1 ) {
-			const ast::Stmt * callStmt = stmts.front();
-			if ( addCast ) {
-				// implicitly generated ctor/dtor calls should be wrapped so that later passes are
-				// aware they were generated.
-				callStmt = new ast::ImplicitCtorDtorStmt{ callStmt->location, callStmt };
-			}
-			return callStmt;
-		} else {
-			assert( false );
-			return {};
-		}
-	}
 } // namespace SymTab
 
Index: src/SymTab/GenImplicitCall.cpp
===================================================================
--- src/SymTab/GenImplicitCall.cpp	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
+++ src/SymTab/GenImplicitCall.cpp	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -0,0 +1,217 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2018 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// GenImplicitCall.hpp --
+//
+// Author           : Andrew Beach
+// Created On       : Fri Apr 14 14:38:00 2023
+// Last Modified By : Andrew Beach
+// Last Modified On : Fri Apr 14 14:46:00 2023
+// Update Count     : 0
+//
+
+#include "GenImplicitCall.hpp"
+
+#include "AST/Inspect.hpp"               // for isUnnamedBitfield
+#include "CodeGen/OperatorTable.h"       // for isCtorDtor
+#include "Common/UniqueName.h"           // for UniqueName
+
+namespace SymTab {
+
+template< typename OutIter >
+ast::ptr< ast::Stmt > genCall(
+	InitTweak::InitExpander_new & srcParam, const ast::Expr * dstParam,
+	const CodeLocation & loc, const std::string & fname, OutIter && out,
+	const ast::Type * type, const ast::Type * addCast, LoopDirection forward = LoopForward );
+
+/// inserts into out a generated call expression to function fname with arguments dstParam and
+/// srcParam. Should only be called with non-array types.
+/// optionally returns a statement which must be inserted prior to the containing loop, if
+/// there is one
+template< typename OutIter >
+ast::ptr< ast::Stmt > genScalarCall(
+	InitTweak::InitExpander_new & srcParam, const ast::Expr * dstParam,
+	const CodeLocation & loc, std::string fname, OutIter && out, const ast::Type * type,
+	const ast::Type * addCast = nullptr
+) {
+	bool isReferenceCtorDtor = false;
+	if ( dynamic_cast< const ast::ReferenceType * >( type ) && CodeGen::isCtorDtor( fname ) ) {
+		// reference constructors are essentially application of the rebind operator.
+		// apply & to both arguments, do not need a cast
+		fname = "?=?";
+		dstParam = new ast::AddressExpr( dstParam );
+		addCast = nullptr;
+		isReferenceCtorDtor = true;
+	}
+
+	// want to be able to generate assignment, ctor, and dtor generically, so fname is one of
+	// "?=?", "?{}", or "^?{}"
+	ast::UntypedExpr * fExpr = new ast::UntypedExpr( loc, new ast::NameExpr( loc, fname ) );
+
+	if ( addCast ) {
+		// cast to T& with qualifiers removed, so that qualified objects can be constructed and
+		// destructed with the same functions as non-qualified objects. Unfortunately, lvalue
+		// is considered a qualifier - for AddressExpr to resolve, its argument must have an
+		// lvalue-qualified type, so remove all qualifiers except lvalue.
+		// xxx -- old code actually removed lvalue too...
+		ast::ptr< ast::Type > guard = addCast;  // prevent castType from mutating addCast
+		ast::ptr< ast::Type > castType = addCast;
+		ast::remove_qualifiers(
+			castType,
+			ast::CV::Const | ast::CV::Volatile | ast::CV::Restrict | ast::CV::Atomic );
+			dstParam = new ast::CastExpr{ dstParam, new ast::ReferenceType{ castType } };
+	}
+	fExpr->args.emplace_back( dstParam );
+
+	ast::ptr<ast::Stmt> listInit = srcParam.buildListInit( fExpr );
+
+	// fetch next set of arguments
+	++srcParam;
+
+	// return if adding reference fails -- will happen on default ctor and dtor
+	if ( isReferenceCtorDtor && ! srcParam.addReference() ) return listInit;
+
+	std::vector< ast::ptr< ast::Expr > > args = *srcParam;
+	splice( fExpr->args, args );
+
+	*out++ = new ast::ExprStmt{ loc, fExpr };
+
+	srcParam.clearArrayIndices();
+
+	return listInit;
+}
+
+
+/// Store in out a loop which calls fname on each element of the array with srcParam and
+/// dstParam as arguments. If forward is true, loop goes from 0 to N-1, else N-1 to 0
+template< typename OutIter >
+void genArrayCall(
+	InitTweak::InitExpander_new & srcParam, const ast::Expr * dstParam,
+	const CodeLocation & loc, const std::string & fname, OutIter && out,
+	const ast::ArrayType * array, const ast::Type * addCast = nullptr,
+	LoopDirection forward = LoopForward
+) {
+	static UniqueName indexName( "_index" );
+
+	// for a flexible array member nothing is done -- user must define own assignment
+	if ( ! array->dimension ) return;
+
+	if ( addCast ) {
+		// peel off array layer from cast
+		addCast = strict_dynamic_cast< const ast::ArrayType * >( addCast )->base;
+	}
+
+	ast::ptr< ast::Expr > begin, end;
+	std::string cmp, update;
+
+	if ( forward ) {
+		// generate: for ( int i = 0; i < N; ++i )
+		begin = ast::ConstantExpr::from_int( loc, 0 );
+		end = array->dimension;
+		cmp = "?<?";
+		update = "++?";
+	} else {
+		// generate: for ( int i = N-1; i >= 0; --i )
+		begin = ast::UntypedExpr::createCall( loc, "?-?",
+			{ array->dimension, ast::ConstantExpr::from_int( loc, 1 ) } );
+		end = ast::ConstantExpr::from_int( loc, 0 );
+		cmp = "?>=?";
+		update = "--?";
+	}
+
+	ast::ptr< ast::DeclWithType > index = new ast::ObjectDecl(
+		loc, indexName.newName(), new ast::BasicType( ast::BasicType::SignedInt ),
+		new ast::SingleInit( loc, begin ) );
+	ast::ptr< ast::Expr > indexVar = new ast::VariableExpr( loc, index );
+
+	ast::ptr< ast::Expr > cond = ast::UntypedExpr::createCall(
+		loc, cmp, { indexVar, end } );
+
+	ast::ptr< ast::Expr > inc = ast::UntypedExpr::createCall(
+		loc, update, { indexVar } );
+
+	ast::ptr< ast::Expr > dstIndex = ast::UntypedExpr::createCall(
+		loc, "?[?]", { dstParam, indexVar } );
+
+	// srcParam must keep track of the array indices to build the source parameter and/or
+	// array list initializer
+	srcParam.addArrayIndex( indexVar, array->dimension );
+
+	// for stmt's body, eventually containing call
+	ast::CompoundStmt * body = new ast::CompoundStmt( loc );
+	ast::ptr< ast::Stmt > listInit = genCall(
+		srcParam, dstIndex, loc, fname, std::back_inserter( body->kids ), array->base, addCast,
+		forward );
+
+	// block containing the stmt and index variable
+	ast::CompoundStmt * block = new ast::CompoundStmt( loc );
+	block->push_back( new ast::DeclStmt( loc, index ) );
+	if ( listInit ) { block->push_back( listInit ); }
+	block->push_back( new ast::ForStmt( loc, {}, cond, inc, body ) );
+
+	*out++ = block;
+}
+
+template< typename OutIter >
+ast::ptr< ast::Stmt > genCall(
+	InitTweak::InitExpander_new & srcParam, const ast::Expr * dstParam,
+	const CodeLocation & loc, const std::string & fname, OutIter && out,
+	const ast::Type * type, const ast::Type * addCast, LoopDirection forward
+) {
+	if ( auto at = dynamic_cast< const ast::ArrayType * >( type ) ) {
+		genArrayCall(
+			srcParam, dstParam, loc, fname, std::forward< OutIter >(out), at, addCast,
+			forward );
+		return {};
+	} else {
+		return genScalarCall(
+			srcParam, dstParam, loc, fname, std::forward< OutIter >( out ), type, addCast );
+	}
+}
+
+ast::ptr< ast::Stmt > genImplicitCall(
+	InitTweak::InitExpander_new & srcParam, const ast::Expr * dstParam,
+	const CodeLocation & loc, const std::string & fname, const ast::ObjectDecl * obj,
+	LoopDirection forward
+) {
+	// unnamed bit fields are not copied as they cannot be accessed
+	if ( isUnnamedBitfield( obj ) ) return {};
+
+	ast::ptr< ast::Type > addCast;
+	if ( (fname == "?{}" || fname == "^?{}") && ( ! obj || ( obj && ! obj->bitfieldWidth ) ) ) {
+		assert( dstParam->result );
+		addCast = dstParam->result;
+	}
+
+	std::vector< ast::ptr< ast::Stmt > > stmts;
+	genCall(
+		srcParam, dstParam, loc, fname, back_inserter( stmts ), obj->type, addCast, forward );
+
+	if ( stmts.empty() ) {
+		return {};
+	} else if ( stmts.size() == 1 ) {
+		const ast::Stmt * callStmt = stmts.front();
+		if ( addCast ) {
+			// implicitly generated ctor/dtor calls should be wrapped so that later passes are
+			// aware they were generated.
+			callStmt = new ast::ImplicitCtorDtorStmt( callStmt->location, callStmt );
+		}
+		return callStmt;
+	} else {
+		assert( false );
+		return {};
+	}
+}
+
+} // namespace SymTab
+
+// Local Variables: //
+// tab-width: 4 //
+// mode: c++ //
+// compile-command: "make install" //
+// End: //
+
+
Index: src/SymTab/GenImplicitCall.hpp
===================================================================
--- src/SymTab/GenImplicitCall.hpp	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
+++ src/SymTab/GenImplicitCall.hpp	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -0,0 +1,36 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2018 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// GenImplicitCall.hpp --
+//
+// Author           : Andrew Beach
+// Created On       : Fri Apr 14 14:29:00 2023
+// Last Modified By : Andrew Beach
+// Last Modified On : Fri Apr 14 14:29:00 2023
+// Update Count     : 0
+//
+
+#pragma once
+
+#include "InitTweak/InitTweak.h"  // for InitExpander
+#include "SymTab/Autogen.h"       // for LoopDirection
+
+namespace SymTab {
+
+ast::ptr<ast::Stmt> genImplicitCall(
+	InitTweak::InitExpander_new & srcParam, const ast::Expr * dstParam,
+	const CodeLocation & loc, const std::string & fname, const ast::ObjectDecl * obj,
+	LoopDirection forward = LoopForward
+);
+
+} // namespace SymTab
+
+// Local Variables: //
+// tab-width: 4 //
+// mode: c++ //
+// compile-command: "make install" //
+// End: //
+
Index: src/SymTab/module.mk
===================================================================
--- src/SymTab/module.mk	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/SymTab/module.mk	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -20,4 +20,6 @@
 	SymTab/FixFunction.cc \
 	SymTab/FixFunction.h \
+	SymTab/GenImplicitCall.cpp \
+	SymTab/GenImplicitCall.hpp \
 	SymTab/Indexer.cc \
 	SymTab/Indexer.h \
Index: src/Validate/Autogen.cpp
===================================================================
--- src/Validate/Autogen.cpp	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/Validate/Autogen.cpp	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -39,4 +39,5 @@
 #include "InitTweak/GenInit.h"     // for fixReturnStatements
 #include "InitTweak/InitTweak.h"   // for isAssignment, isCopyConstructor
+#include "SymTab/GenImplicitCall.hpp"  // for genImplicitCall
 #include "SymTab/Mangler.h"        // for Mangler
 #include "CompilationState.h"
@@ -423,5 +424,5 @@
 	for ( unsigned int index = 0 ; index < fields ; ++index ) {
 		auto member = aggr->members[index].strict_as<ast::DeclWithType>();
-		if ( SymTab::isUnnamedBitfield(
+		if ( ast::isUnnamedBitfield(
 				dynamic_cast<const ast::ObjectDecl *>( member ) ) ) {
 			if ( index == fields - 1 ) {
@@ -599,5 +600,5 @@
 		// Not sure why it could be null.
 		// Don't make a function for a parameter that is an unnamed bitfield.
-		if ( nullptr == field || SymTab::isUnnamedBitfield( field ) ) {
+		if ( nullptr == field || ast::isUnnamedBitfield( field ) ) {
 			continue;
 		// Matching Parameter: Initialize the field by copy.
Index: src/main.cc
===================================================================
--- src/main.cc	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ src/main.cc	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -9,7 +9,7 @@
 // Author           : Peter Buhr and Rob Schluntz
 // Created On       : Fri May 15 23:12:02 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Thr Feb 16 10:08:00 2023
-// Update Count     : 680
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Mon Apr 10 21:12:17 2023
+// Update Count     : 682
 //
 
@@ -32,4 +32,5 @@
 
 #include "AST/Convert.hpp"
+#include "AST/Util.hpp"                     // for checkInvariants
 #include "CompilationState.h"
 #include "../config.h"                      // for CFA_LIBDIR
@@ -102,10 +103,23 @@
 }
 
-#define PASS( name, pass )                  \
+// Helpers for checkInvariant:
+void checkInvariants( std::list< Declaration * > & ) {}
+using ast::checkInvariants;
+
+#define PASS( name, pass, unit, ... )       \
 	if ( errorp ) { cerr << name << endl; } \
 	NewPass(name);                          \
 	Stats::Time::StartBlock(name);          \
-	pass;                                   \
-	Stats::Time::StopBlock();
+	pass(unit,##__VA_ARGS__);               \
+	Stats::Time::StopBlock();               \
+	if ( invariant ) {                      \
+		checkInvariants(unit);              \
+	}
+
+#define DUMP( cond, unit )                  \
+	if ( cond ) {                           \
+		dump(unit);                         \
+		return EXIT_SUCCESS;                \
+	}
 
 static bool waiting_for_gdb = false;					// flag to set cfa-cpp to wait for gdb on start
@@ -298,8 +312,5 @@
 		transUnit = buildUnit();
 
-		if ( astp ) {
-			dump( std::move( transUnit ) );
-			return EXIT_SUCCESS;
-		} // if
+		DUMP( astp, std::move( transUnit ) );
 
 		Stats::Time::StopBlock();
@@ -310,45 +321,37 @@
 		}
 
-		PASS( "Hoist Type Decls", Validate::hoistTypeDecls( transUnit ) );
-		// Hoist Type Decls pulls some declarations out of contexts where
-		// locations are not tracked. Perhaps they should be, but for now
-		// the full fill solves it.
-		forceFillCodeLocations( transUnit );
-
-		PASS( "Translate Exception Declarations", ControlStruct::translateExcept( transUnit ) );
-		if ( exdeclp ) {
-			dump( std::move( transUnit ) );
-			return EXIT_SUCCESS;
-		}
-
-		PASS( "Verify Ctor, Dtor & Assign", Validate::verifyCtorDtorAssign( transUnit ) );
-		PASS( "Replace Typedefs", Validate::replaceTypedef( transUnit ) );
-		PASS( "Fix Return Types", Validate::fixReturnTypes( transUnit ) );
-		PASS( "Enum and Pointer Decay", Validate::decayEnumsAndPointers( transUnit ) );
-
-		PASS( "Link Reference To Types", Validate::linkReferenceToTypes( transUnit ) );
-
-		PASS( "Fix Qualified Types", Validate::fixQualifiedTypes( transUnit ) );
-		PASS( "Hoist Struct", Validate::hoistStruct( transUnit ) );
-		PASS( "Eliminate Typedef", Validate::eliminateTypedef( transUnit ) );
-		PASS( "Validate Generic Parameters", Validate::fillGenericParameters( transUnit ) );
-		PASS( "Translate Dimensions", Validate::translateDimensionParameters( transUnit ) );
-		PASS( "Check Function Returns", Validate::checkReturnStatements( transUnit ) );
-		PASS( "Fix Return Statements", InitTweak::fixReturnStatements( transUnit ) );
-		PASS( "Implement Concurrent Keywords", Concurrency::implementKeywords( transUnit ) );
-		PASS( "Forall Pointer Decay", Validate::decayForallPointers( transUnit ) );
-        PASS( "Implement Waituntil", Concurrency::generateWaitUntil( transUnit ) );
-		PASS( "Hoist Control Declarations", ControlStruct::hoistControlDecls( transUnit ) );
-
-		PASS( "Generate Autogen Routines", Validate::autogenerateRoutines( transUnit ) );
-
-		PASS( "Implement Actors", Concurrency::implementActors( transUnit ) );
-        PASS( "Implement Virtual Destructors", Virtual::implementVirtDtors(transUnit) );
-		PASS( "Implement Mutex", Concurrency::implementMutex( transUnit ) );
-		PASS( "Implement Thread Start", Concurrency::implementThreadStarter( transUnit ) );
-		PASS( "Compound Literal", Validate::handleCompoundLiterals( transUnit ) );
-		PASS( "Set Length From Initializer", Validate::setLengthFromInitializer( transUnit ) );
-		PASS( "Find Global Decls", Validate::findGlobalDecls( transUnit ) );
-		PASS( "Fix Label Address", Validate::fixLabelAddresses( transUnit ) );
+		PASS( "Hoist Type Decls", Validate::hoistTypeDecls, transUnit );
+
+		PASS( "Translate Exception Declarations", ControlStruct::translateExcept, transUnit );
+		DUMP( exdeclp, std::move( transUnit ) );
+		PASS( "Verify Ctor, Dtor & Assign", Validate::verifyCtorDtorAssign, transUnit );
+		PASS( "Replace Typedefs", Validate::replaceTypedef, transUnit );
+		PASS( "Fix Return Types", Validate::fixReturnTypes, transUnit );
+		PASS( "Enum and Pointer Decay", Validate::decayEnumsAndPointers, transUnit );
+
+		PASS( "Link Reference To Types", Validate::linkReferenceToTypes, transUnit );
+
+		PASS( "Fix Qualified Types", Validate::fixQualifiedTypes, transUnit );
+		PASS( "Hoist Struct", Validate::hoistStruct, transUnit );
+		PASS( "Eliminate Typedef", Validate::eliminateTypedef, transUnit );
+		PASS( "Validate Generic Parameters", Validate::fillGenericParameters, transUnit );
+		PASS( "Translate Dimensions", Validate::translateDimensionParameters, transUnit );
+		PASS( "Check Function Returns", Validate::checkReturnStatements, transUnit );
+		PASS( "Fix Return Statements", InitTweak::fixReturnStatements, transUnit );
+		PASS( "Implement Concurrent Keywords", Concurrency::implementKeywords, transUnit );
+		PASS( "Forall Pointer Decay", Validate::decayForallPointers, transUnit );
+        PASS( "Implement Waituntil", Concurrency::generateWaitUntil, transUnit  );
+		PASS( "Hoist Control Declarations", ControlStruct::hoistControlDecls, transUnit );
+
+		PASS( "Generate Autogen Routines", Validate::autogenerateRoutines, transUnit );
+
+		PASS( "Implement Actors", Concurrency::implementActors, transUnit );
+		PASS( "Implement Virtual Destructors", Virtual::implementVirtDtors, transUnit );
+		PASS( "Implement Mutex", Concurrency::implementMutex, transUnit );
+		PASS( "Implement Thread Start", Concurrency::implementThreadStarter, transUnit );
+		PASS( "Compound Literal", Validate::handleCompoundLiterals, transUnit );
+		PASS( "Set Length From Initializer", Validate::setLengthFromInitializer, transUnit );
+		PASS( "Find Global Decls", Validate::findGlobalDecls, transUnit );
+		PASS( "Fix Label Address", Validate::fixLabelAddresses, transUnit );
 
 		if ( symtabp ) {
@@ -361,14 +364,11 @@
 		} // if
 
-		if ( validp ) {
-			dump( std::move( transUnit ) );
-			return EXIT_SUCCESS;
-		} // if
-
-		PASS( "Translate Throws", ControlStruct::translateThrows( transUnit ) );
-		PASS( "Fix Labels", ControlStruct::fixLabels( transUnit ) );
-		PASS( "Fix Names", CodeGen::fixNames( transUnit ) );
-		PASS( "Gen Init", InitTweak::genInit( transUnit ) );
-		PASS( "Expand Member Tuples" , Tuples::expandMemberTuples( transUnit ) );
+		DUMP( validp, std::move( transUnit ) );
+
+		PASS( "Translate Throws", ControlStruct::translateThrows, transUnit );
+		PASS( "Fix Labels", ControlStruct::fixLabels, transUnit );
+		PASS( "Fix Names", CodeGen::fixNames, transUnit );
+		PASS( "Gen Init", InitTweak::genInit, transUnit );
+		PASS( "Expand Member Tuples" , Tuples::expandMemberTuples, transUnit );
 
 		if ( libcfap ) {
@@ -382,8 +382,5 @@
 		} // if
 
-		if ( bresolvep ) {
-			dump( std::move( transUnit ) );
-			return EXIT_SUCCESS;
-		} // if
+		DUMP( bresolvep, std::move( transUnit ) );
 
 		if ( resolvprotop ) {
@@ -392,63 +389,42 @@
 		} // if
 
-		PASS( "Resolve", ResolvExpr::resolve( transUnit ) );
-		if ( exprp ) {
-			dump( std::move( transUnit ) );
-			return EXIT_SUCCESS;
-		} // if
-
-		forceFillCodeLocations( transUnit );
-
-		PASS( "Fix Init", InitTweak::fix(transUnit, buildingLibrary()));
+		PASS( "Resolve", ResolvExpr::resolve, transUnit );
+		DUMP( exprp, std::move( transUnit ) );
+
+		PASS( "Fix Init", InitTweak::fix, transUnit, buildingLibrary() );
 
 		// fix ObjectDecl - replaces ConstructorInit nodes
-		if ( ctorinitp ) {
-			dump( std::move( transUnit ) );
-			return EXIT_SUCCESS;
-		} // if
+		DUMP( ctorinitp, std::move( transUnit ) );
 
 		// Currently not working due to unresolved issues with UniqueExpr
-		PASS( "Expand Unique Expr", Tuples::expandUniqueExpr( transUnit ) ); // xxx - is this the right place for this? want to expand ASAP so tha, sequent passes don't need to worry about double-visiting a unique expr - needs to go after InitTweak::fix so that copy constructed return declarations are reused
-
-		PASS( "Translate Tries", ControlStruct::translateTries( transUnit ) );
-		PASS( "Gen Waitfor", Concurrency::generateWaitFor( transUnit ) );
+		PASS( "Expand Unique Expr", Tuples::expandUniqueExpr, transUnit ); // xxx - is this the right place for this? want to expand ASAP so tha, sequent passes don't need to worry about double-visiting a unique expr - needs to go after InitTweak::fix so that copy constructed return declarations are reused
+
+		PASS( "Translate Tries", ControlStruct::translateTries, transUnit );
+		PASS( "Gen Waitfor", Concurrency::generateWaitFor, transUnit );
 
 		// Needs to happen before tuple types are expanded.
-		PASS( "Convert Specializations",  GenPoly::convertSpecializations( transUnit ) );
-
-		PASS( "Expand Tuples", Tuples::expandTuples( transUnit ) );
-
-		if ( tuplep ) {
-			dump( std::move( transUnit ) );
-			return EXIT_SUCCESS;
-		} // if
+		PASS( "Convert Specializations",  GenPoly::convertSpecializations, transUnit );
+
+		PASS( "Expand Tuples", Tuples::expandTuples, transUnit );
+		DUMP( tuplep, std::move( transUnit ) );
 
 		// Must come after Translate Tries.
-		PASS( "Virtual Expand Casts", Virtual::expandCasts( transUnit ) );
-
-		PASS( "Instantiate Generics", GenPoly::instantiateGeneric( transUnit ) );
-		if ( genericsp ) {
-			dump( std::move( transUnit ) );
-			return EXIT_SUCCESS;
-		} // if
-
-		PASS( "Convert L-Value", GenPoly::convertLvalue( transUnit ) );
+		PASS( "Virtual Expand Casts", Virtual::expandCasts, transUnit );
+
+		PASS( "Instantiate Generics", GenPoly::instantiateGeneric, transUnit );
+		DUMP( genericsp, std::move( transUnit ) );
+
+		PASS( "Convert L-Value", GenPoly::convertLvalue, transUnit );
 
 		translationUnit = convert( std::move( transUnit ) );
 
-		if ( bboxp ) {
-			dump( translationUnit );
-			return EXIT_SUCCESS;
-		} // if
-		PASS( "Box", GenPoly::box( translationUnit ) );
-
-		PASS( "Link-Once", CodeGen::translateLinkOnce( translationUnit ) );
+		DUMP( bboxp, translationUnit );
+		PASS( "Box", GenPoly::box, translationUnit );
+
+		PASS( "Link-Once", CodeGen::translateLinkOnce, translationUnit );
 
 		// Code has been lowered to C, now we can start generation.
 
-		if ( bcodegenp ) {
-			dump( translationUnit );
-			return EXIT_SUCCESS;
-		} // if
+		DUMP( bcodegenp, translationUnit );
 
 		if ( optind < argc ) {							// any commands after the flags and input file ? => output file name
@@ -457,5 +433,5 @@
 
 		CodeTools::fillLocations( translationUnit );
-		PASS( "Code Gen", CodeGen::generate( translationUnit, *output, ! genproto, prettycodegenp, true, linemarks ) );
+		PASS( "Code Gen", CodeGen::generate, translationUnit, *output, ! genproto, prettycodegenp, true, linemarks );
 
 		CodeGen::FixMain::fix( translationUnit, *output,
@@ -505,5 +481,5 @@
 
 
-static const char optstring[] = ":c:ghlLmNnpdP:S:twW:D:";
+static const char optstring[] = ":c:ghilLmNnpdP:S:twW:D:";
 
 enum { PreludeDir = 128 };
@@ -512,7 +488,8 @@
 	{ "gdb", no_argument, nullptr, 'g' },
 	{ "help", no_argument, nullptr, 'h' },
+	{ "invariant", no_argument, nullptr, 'i' },
 	{ "libcfa", no_argument, nullptr, 'l' },
 	{ "linemarks", no_argument, nullptr, 'L' },
-	{ "no-main", no_argument, 0, 'm' },
+	{ "no-main", no_argument, nullptr, 'm' },
 	{ "no-linemarks", no_argument, nullptr, 'N' },
 	{ "no-prelude", no_argument, nullptr, 'n' },
@@ -533,4 +510,5 @@
 	"wait for gdb to attach",							// -g
 	"print translator help message",					// -h
+	"invariant checking during AST passes",				// -i
 	"generate libcfa.c",								// -l
 	"generate line marks",								// -L
@@ -626,4 +604,7 @@
 			usage( argv );								// no return
 			break;
+		  case 'i':										// invariant checking
+			invariant = true;
+			break;
 		  case 'l':										// generate libcfa.c
 			libcfap = true;
Index: tests/.expect/PRNG.x64.txt
===================================================================
--- tests/.expect/PRNG.x64.txt	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ tests/.expect/PRNG.x64.txt	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -1,2 +1,4 @@
+
+CFA xoshiro256pp
 
                     PRNG()     PRNG(5)   PRNG(0,5)
@@ -56,11 +58,11 @@
 
 Sequential
-trials 100000000 buckets 100000 min 875 max 1146 avg 1000.0 std 31.6 rstd 3.2%
+trials 20000000 buckets 100000 min 139 max 265 avg 200.0 std 14.1 rstd 7.0%
 
 Concurrent
-trials 100000000 buckets 100000 min 875 max 1146 avg 1000.0 std 31.6 rstd 3.2%
-trials 100000000 buckets 100000 min 875 max 1146 avg 1000.0 std 31.6 rstd 3.2%
-trials 100000000 buckets 100000 min 875 max 1146 avg 1000.0 std 31.6 rstd 3.2%
-trials 100000000 buckets 100000 min 875 max 1146 avg 1000.0 std 31.6 rstd 3.2%
+trials 20000000 buckets 100000 min 139 max 265 avg 200.0 std 14.1 rstd 7.0%
+trials 20000000 buckets 100000 min 139 max 265 avg 200.0 std 14.1 rstd 7.0%
+trials 20000000 buckets 100000 min 139 max 265 avg 200.0 std 14.1 rstd 7.0%
+trials 20000000 buckets 100000 min 139 max 265 avg 200.0 std 14.1 rstd 7.0%
 
                    prng(t)   prng(t,5) prng(t,0,5)
Index: tests/.expect/PRNG.x86.txt
===================================================================
--- tests/.expect/PRNG.x86.txt	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ tests/.expect/PRNG.x86.txt	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -1,2 +1,4 @@
+
+CFA xoshiro128pp
 
                     PRNG()     PRNG(5)   PRNG(0,5)
@@ -56,11 +58,11 @@
 
 Sequential
-trials 100000000 buckets 100000 min 858 max 1147 avg 1000.0 std 31.5 rstd 3.2%
+trials 20000000 buckets 100000 min 144 max 270 avg 200.0 std 14.1 rstd 7.1%
 
 Concurrent
-trials 100000000 buckets 100000 min 858 max 1147 avg 1000.0 std 31.5 rstd 3.2%
-trials 100000000 buckets 100000 min 858 max 1147 avg 1000.0 std 31.5 rstd 3.2%
-trials 100000000 buckets 100000 min 858 max 1147 avg 1000.0 std 31.5 rstd 3.2%
-trials 100000000 buckets 100000 min 858 max 1147 avg 1000.0 std 31.5 rstd 3.2%
+trials 20000000 buckets 100000 min 144 max 270 avg 200.0 std 14.1 rstd 7.1%
+trials 20000000 buckets 100000 min 144 max 270 avg 200.0 std 14.1 rstd 7.1%
+trials 20000000 buckets 100000 min 144 max 270 avg 200.0 std 14.1 rstd 7.1%
+trials 20000000 buckets 100000 min 144 max 270 avg 200.0 std 14.1 rstd 7.1%
 
                    prng(t)   prng(t,5) prng(t,0,5)
Index: tests/Makefile.am
===================================================================
--- tests/Makefile.am	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ tests/Makefile.am	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -11,6 +11,6 @@
 ## Created On       : Sun May 31 09:08:15 2015
 ## Last Modified By : Peter A. Buhr
-## Last Modified On : Fri Feb  3 23:06:44 2023
-## Update Count     : 94
+## Last Modified On : Mon Apr 10 23:24:02 2023
+## Update Count     : 96
 ###############################################################################
 
@@ -184,5 +184,5 @@
 
 SYNTAX_ONLY_CODE = expression typedefRedef variableDeclarator switch numericConstants identFuncDeclarator \
-	init1 limits nested-types cast labelledExit array quasiKeyword include/stdincludes include/includes builtins/sync warnings/self-assignment
+	init1 limits nested-types cast labelledExit array quasiKeyword include/stdincludes include/includes builtins/sync warnings/self-assignment concurrent/waitfor/parse
 $(SYNTAX_ONLY_CODE): % : %.cfa $(CFACCBIN)
 	$(CFACOMPILE_SYNTAX)
Index: tests/PRNG.cfa
===================================================================
--- tests/PRNG.cfa	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ tests/PRNG.cfa	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -8,6 +8,6 @@
 // Created On       : Wed Dec 29 09:38:12 2021
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Dec 21 20:39:59 2022
-// Update Count     : 406
+// Last Modified On : Sun Apr 23 22:02:09 2023
+// Update Count     : 420
 // 
 
@@ -15,16 +15,21 @@
 #include <stdlib.hfa>									// PRNG
 #include <clock.hfa>
-#include <thread.hfa>
 #include <limits.hfa>									// MAX
 #include <math.hfa>										// sqrt
 #include <malloc.h>										// malloc_stats
 #include <locale.h>										// setlocale
+#include <thread.hfa>
 #include <mutex_stmt.hfa>
 
-#ifdef __x86_64__										// 64-bit architecture
+#define xstr(s) str(s)
+#define str(s) #s
+
+#if defined( __x86_64__ ) || defined( __aarch64__ )		// 64-bit architecture
 #define PRNG PRNG64
 #else													// 32-bit architecture
 #define PRNG PRNG32
 #endif // __x86_64__
+
+//#define TIME
 
 #ifdef TIME												// use -O2 -nodebug
@@ -38,6 +43,6 @@
 #endif // TIME
 
-void avgstd( unsigned int buckets[] ) {
-	unsigned int min = MAX, max = 0;
+static void avgstd( size_t trials, size_t buckets[] ) {
+	size_t min = MAX, max = 0;
 	double sum = 0.0, diff;
 	for ( i; BUCKETS ) {
@@ -54,5 +59,5 @@
 	} // for
 	double std = sqrt( sum / BUCKETS );
-	mutex( sout ) sout | "trials"  | TRIALS | "buckets" | BUCKETS
+	mutex( sout ) sout | "trials"  | trials | "buckets" | BUCKETS
 		| "min" | min | "max" | max
 		| "avg" | wd(0,1, avg) | "std" | wd(0,1, std) | "rstd" | wd(0,1, (avg == 0 ? 0.0 : std / avg * 100)) | "%";
@@ -64,9 +69,9 @@
 thread T1 {};
 void main( T1 & ) {
-	unsigned int * buckets = calloc( BUCKETS );			// too big for task stack
-	for ( TRIALS / 100 ) {
+	size_t * buckets = calloc( BUCKETS );				// too big for task stack
+	for ( TRIALS / 50 ) {
 		buckets[rand() % BUCKETS] += 1;					// concurrent
 	} // for
-	avgstd( buckets );
+	avgstd( TRIALS / 50, buckets );
 	free( buckets );
 } // main
@@ -76,9 +81,9 @@
 	PRNG prng;
 	if ( seed != 0 ) set_seed( prng, seed );
-	unsigned int * buckets = calloc( BUCKETS );			// too big for task stack
+	size_t * buckets = calloc( BUCKETS );				// too big for task stack
 	for ( TRIALS ) {
 		buckets[prng( prng ) % BUCKETS] += 1;			// concurrent
 	} // for
-	avgstd( buckets );
+	avgstd( TRIALS, buckets );
 	free( buckets );
 } // main
@@ -86,9 +91,9 @@
 thread T3 {};
 void main( T3 & th ) {
-	unsigned int * buckets = calloc( BUCKETS );			// too big for task stack
-	for ( TRIALS ) {
+	size_t * buckets = calloc( BUCKETS );				// too big for task stack
+	for ( TRIALS / 5 ) {
 		buckets[prng() % BUCKETS] += 1;					// concurrent
 	} // for
-	avgstd( buckets );
+	avgstd( TRIALS / 5, buckets );
 	free( buckets );
 } // main
@@ -96,9 +101,9 @@
 thread T4 {};
 void main( T4 & th ) {
-	unsigned int * buckets = calloc( BUCKETS );			// too big for task stack
+	size_t * buckets = calloc( BUCKETS );				// too big for task stack
 	for ( TRIALS ) {
-		buckets[prng( th ) % BUCKETS] += 1;	// concurrent
-	} // for
-	avgstd( buckets );
+		buckets[prng( th ) % BUCKETS] += 1;				// concurrent
+	} // for
+	avgstd( TRIALS, buckets );
 	free( buckets );
 } // main
@@ -108,9 +113,9 @@
 static void dummy( thread$ & th ) __attribute__(( noinline ));
 static void dummy( thread$ & th ) {
-	unsigned int * buckets = (unsigned int *)calloc( BUCKETS, sizeof(unsigned int) ); // too big for task stack
-	for ( unsigned int i = 0; i < TRIALS; i += 1 ) {
+	size_t * buckets = (size_t *)calloc( BUCKETS, sizeof(size_t) ); // too big for task stack
+	for ( size_t i = 0; i < TRIALS; i += 1 ) {
 		buckets[prng( th ) % BUCKETS] += 1;				// sequential
 	} // for
-	avgstd( buckets );
+	avgstd( TRIALS, buckets );
 	free( buckets );
 } // dummy
@@ -118,6 +123,7 @@
 
 int main() {
-	// causes leaked storage message
-	// setlocale( LC_NUMERIC, getenv( "LANG" ) );			// print digit separator
+	// setlocale( LC_NUMERIC, getenv( "LANG" ) );		// causes leaked storage message
+
+	// only works on the current pthread thread
 	// locale_t loc = newlocale( LC_NUMERIC_MASK, getenv( "LANG" ), (locale_t)0p );
 	// if ( loc == (locale_t)0p ) abort( "newlocale" );
@@ -126,7 +132,10 @@
 	enum { TASKS = 4 };
 	Time start;
+
 #ifdef TIME												// too slow for test and generates non-repeatable results
 #if 1
-	unsigned int rseed;
+	sout | "glib rand" | nl | nl;
+
+	size_t rseed;
 	if ( seed != 0 ) rseed = seed;
 	else rseed = rdtscl();
@@ -134,5 +143,5 @@
 
 	sout | sepDisable;
-	sout | wd(26, "rand()" ) | wd(12, "rand(5)") | wd(12, "rand(0,5)" );
+	sout | nl | wd(26, "rand()" ) | wd(12, "rand(5)") | wd(12, "rand(0,5)" );
 	for ( 20 ) {
 		sout | wd(26, rand()) | nonl;
@@ -146,12 +155,12 @@
 	STARTTIME;
 	{
-		unsigned int * buckets = calloc( BUCKETS );		// too big for task stack
-		for ( i; TRIALS / 10 ) {
+		size_t * buckets = calloc( BUCKETS );			// too big for task stack
+		for ( i; TRIALS / 5 ) {
 			buckets[rand() % BUCKETS] += 1;				// sequential
 		} // for
-		avgstd( buckets );
+		avgstd( TRIALS / 5, buckets );
 		free( buckets );
 	}
-	ENDTIME( " x 10 " );
+	ENDTIME( " x 5 " );
 
 	sout | nl | "Concurrent";
@@ -163,7 +172,10 @@
 		} // wait for threads to complete
 	}
-	ENDTIME( " x 100 " );
+	ENDTIME( " x 50 " );
 #endif // 0
 #endif // TIME
+
+	sout | nl | "CFA " xstr(PRNG_NAME);
+
 #if 1
 	PRNG prng;
@@ -184,9 +196,9 @@
 	STARTTIME;
 	{
-		unsigned int * buckets = calloc( BUCKETS );		// too big for task stack
+		size_t * buckets = calloc( BUCKETS );			// too big for task stack
 		for ( TRIALS ) {
 			buckets[prng( prng ) % BUCKETS] += 1;		// sequential
 		} // for
-		avgstd( buckets );
+		avgstd( TRIALS, buckets );
 		free( buckets );
 	}
@@ -219,12 +231,12 @@
 	STARTTIME;
 	{
-		unsigned int * buckets = calloc( BUCKETS );		// too big for task stack
-		for ( TRIALS ) {
+		size_t * buckets = calloc( BUCKETS );			// too big for task stack
+		for ( TRIALS / 5 ) {
 			buckets[prng() % BUCKETS] += 1;
 		} // for
-		avgstd( buckets );
+		avgstd( TRIALS / 5, buckets );
 		free( buckets );
 	}
-	ENDTIME();
+	ENDTIME( " x 5 " );
 
 	sout | nl | "Concurrent";
@@ -236,5 +248,5 @@
 		} // wait for threads to complete
 	}
-	ENDTIME();
+	ENDTIME( " x 5 " );
 #endif // 0
 #if 1
Index: tests/concurrent/waitfor/parse.cfa
===================================================================
--- tests/concurrent/waitfor/parse.cfa	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ tests/concurrent/waitfor/parse.cfa	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -1,10 +1,16 @@
-//----------------------------------------------------------------------------------------
-//----------------------------------------------------------------------------------------
+// 
+// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
 //
-//		DEPRECATED TEST
-//		DIFFERS BETWEEN DEBUG AND RELEASE
-//
-//----------------------------------------------------------------------------------------
-//----------------------------------------------------------------------------------------
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+// 
+// waitfor.c -- 
+// 
+// Author           : Peter A. Buhr
+// Created On       : Wed Aug 30 17:53:29 2017
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Mon Apr 10 22:52:18 2023
+// Update Count     : 64
+// 
 
 #include <monitor.hfa>
@@ -12,91 +18,244 @@
 monitor M {};
 
-M a;
-
-void f1( M & mutex a );
-void f2( M & mutex a );
-void f2( M & mutex a, M & mutex b );
-void f3( M & mutex a );
-void f3( M & mutex a, M & mutex b );
-void f3( M & mutex a, M & mutex b, M & mutex c );
-
-void foo() {
-
-	//---------------------------------------
-	waitfor( f1 : a ) {
-		1;
-	}
-
-	//---------------------------------------
-	waitfor( f1 : a ) {
-		2;
-	}
-	waitfor( f2 : a ) {
-		3;
-	}
-
-	//---------------------------------------
-	when( 1 < 3 ) waitfor( f2 : a, a ) {
-		4;
-	}
-	or timeout( 100 ) {
-		5;
-	}
-
-	//---------------------------------------
-	when( 2 < 3 ) waitfor( f3 : a ) {
-		5;
-	}
+void notcalled( M & mutex m1, M & mutex m2 ) {
+	abort();
+}
+void or( M & mutex m ) {
+	abort();
+}
+void timeout( M & mutex m ) {
+	abort();
+}
+
+void fred( M & mutex m, M & mutex or, M & mutex timeout ) {
+	// test waitfor and when
+
+	waitfor( notcalled : m, m );
+
+	waitfor( notcalled : m, m ) {
+	}
+
+	waitfor( notcalled : m, m ) {
+	}
+
+	when( true ) waitfor( notcalled : m, m );
+
+	when( true ) waitfor( notcalled : m, m ) {
+	}
+
+	waitfor( notcalled : m, m );
+	or waitfor( notcalled : m, m );
+
+	when( true ) waitfor( notcalled : m, m );
+	or when( true ) waitfor( notcalled : m, m );
+
+	waitfor( notcalled : m, m ) {
+	} or waitfor( notcalled : m, m ) {
+	}
+
+	waitfor( notcalled : m, m ) {
+	} or waitfor( notcalled : m, m ) {
+	}
+
+	when( true ) waitfor( notcalled : m, m ) {
+	} or when( true ) waitfor( notcalled : m, m ) {
+	}
+
+	waitfor( notcalled : m, m );
+	or waitfor( notcalled : m, m ) {
+	}
+
+	when( true ) waitfor( notcalled : m, m );
+	or when( true ) waitfor( notcalled : m, m ) {
+	}
+
+	waitfor( notcalled : m, m ) {
+	} or waitfor( notcalled : m, m );
+
+	when( true ) waitfor( notcalled : m, m ) {
+	} or when( true ) waitfor( notcalled : m, m );
+
+	// test when, waitfor and else
+
+	waitfor( notcalled : m, m );
+	or else;
+
+	when( true ) waitfor( notcalled : m, m );
+	or else;
+
+	when( true ) waitfor( notcalled : m, m );
+	or else;
+
+	waitfor( notcalled : m, m ) {
+	} or else {
+	}
+
+	when( true ) waitfor( notcalled : m, m ) {
+	} or else {
+	}
+
+	waitfor( notcalled : m, m );
 	or else {
-		6;
-	}
-
-	//---------------------------------------
-	when( 3 < 3 ) waitfor( f3 : a, a ) {
-		7;
-	}
-	or when( 4 < 3 ) timeout( 101 ) {
-		8;
-	}
-	or when( 5 < 3 ) else {
-		9;
-	}
-
-	//---------------------------------------
-	when( 6 < 3 ) waitfor( f3 : a, a, a ) {
-		10;
-	}
- 	or when( 7 < 3 ) waitfor( f1 : a  ) {
-		11;
-	}
+	}
+
+	when( true ) waitfor( notcalled : m, m );
 	or else {
-		12;
-	}
-
-	//---------------------------------------
-	when( 8 < 3 ) waitfor( f3 : a, a ) {
-		13;
-	}
- 	or waitfor( f1 : a  ) {
-		14;
-	}
-	or when( 9 < 3 ) timeout( 102 ) {
-		15;
-	}
-
-	//---------------------------------------
-	when( 10 < 3 ) waitfor( f1 : a ) {
-		16;
-	}
- 	or waitfor( f2 : a, a ) {
-		17;
-	}
-	or timeout( 103 ) {
-		18;
-	}
-	or when( 11 < 3 ) else {
-		19;
-	}
-}
-
-int main() {}
+	}
+
+	when( true ) waitfor( notcalled : m, m );
+	or else {
+	}
+
+	waitfor( notcalled : m, m ) {
+	} or else;
+
+	when( true ) waitfor( notcalled : m, m ) {
+	} or else;
+
+	waitfor( notcalled : m, m );
+	or when( true ) else;
+
+	when( true ) waitfor( notcalled : m, m );
+	or when( true ) else;
+
+	when( true ) waitfor( notcalled : m, m );
+	or when( true ) else;
+
+	waitfor( notcalled : m, m ) {
+	} or when( true ) else {
+	}
+
+	when( true ) waitfor( notcalled : m, m ) {
+	} or when( true ) else {
+	}
+
+	waitfor( notcalled : m, m );
+	or when( true ) else {
+	}
+
+	when( true ) waitfor( notcalled : m, m );
+	or when( true ) else {
+	}
+
+	when( true ) waitfor( notcalled : m, m );
+	or when( true ) else {
+	}
+
+	waitfor( notcalled : m, m ) {
+	} or when( true ) else;
+
+	when( true ) waitfor( notcalled : m, m ) {
+	} or when( true ) else;
+
+	// test when, waitfor and timeout
+
+	waitfor( notcalled : m, m );
+	or timeout( 3 );
+
+	waitfor( notcalled : m, m );
+	or timeout( 3 );
+
+	when( true ) waitfor( notcalled : m, m );
+	or timeout( 3 );
+
+	waitfor( notcalled : m, m ) {
+	} or timeout( 3 ) {
+	}
+
+	when( true ) waitfor( notcalled : m, m ) {
+	} or timeout( 3 ) {
+	}
+
+	when( true ) waitfor( notcalled : m, m ) {
+	} or timeout( 3 ) {
+	}
+
+	when( true ) waitfor( notcalled : m, m ) {
+	} or when ( true ) timeout( 3 ) {
+	}
+
+	when( true ) waitfor( notcalled : m, m ) {
+	} or when ( true ) timeout( 3 ) {
+	}
+
+	waitfor( notcalled : m, m );
+	or timeout( 3 ) {
+	}
+
+	when( true ) waitfor( notcalled : m, m );
+	or timeout( 3 ) {
+	}
+
+	when( true ) waitfor( notcalled : m, m );
+	or when( true ) timeout( 3 ) {
+	}
+
+	waitfor( notcalled : m, m ) {
+	} or timeout( 3 );
+
+	when( true ) waitfor( notcalled : m, m ) {
+	} or timeout( 3 );
+
+	when( true ) waitfor( notcalled : m, m ) {
+	} or when( true ) timeout( 3 );
+
+	// test when, waitfor, timeout and else
+
+	waitfor( notcalled : m, m ) {
+	} or timeout( 3 ) {
+	} or when( true ) else {}
+
+	when( true ) waitfor( notcalled : m, m ) {
+	} or timeout( 3 ) {
+	} or when( true ) else {}
+
+	waitfor( notcalled : m, m ) {
+	} or timeout( 3 ) {
+	} or when( true ) else {}
+
+	waitfor( notcalled : m, m ) {
+	} or when( true ) timeout( 3 ) {
+	} or when( true ) else {}
+
+	when( true ) waitfor( notcalled : m, m ) {
+	} or timeout( 3 ) {
+	} or when( true ) else {}
+
+	waitfor( notcalled : m, m ) {
+	} or when( true ) timeout( 3 ) {
+	} or when( true ) else {}
+
+	when( true ) waitfor( notcalled : m, m ) {
+	} or when( true ) timeout( 3 ) {
+	} or when( true ) else {}
+
+	// test quasi-keywords "or" and "timeout"
+
+	int or = 0, timeout = 0;
+	waitfor( timeout : timeout ) timeout += 1; or timeout( timeout );
+	waitfor( notcalled : or, or ) or += 1; or timeout( or ) 3;
+	when( or ) waitfor( or : m ) { 4; } or timeout( or ) or += 1;
+	when( timeout ) waitfor( notcalled : timeout, timeout ) or += 1; or else timeout += 1;
+	when( or + timeout ) waitfor( or : m ) 4; or when( or ) timeout( or ) 4; or when( or ) else timeout += 1;
+	when( 3 ) waitfor( or : or ) 3; or when( or ) waitfor( notcalled : or, or ) 4; or else 4;
+	when( timeout ) waitfor( or : timeout ) 3; or waitfor( notcalled : timeout, or ) 4; or when( or ) timeout( timeout ) 4;
+	when( 3 ) waitfor( or : timeout ) or += 1;
+	or waitfor( or : or ) timeout += 1;
+	or timeout( timeout ) or += 1;
+	or when( 3 ) else or += 1;
+
+	// test else selection
+
+	if ( or > timeout ) waitfor( or : or ) 3;
+	else waitfor( timeout : timeout ) 4;
+}
+
+//Dummy main
+int main( int argc, char const * argv[] ) {
+    #pragma GCC warning "Compiled"                      // force non-empty .expect file, NO TABS!!!
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa waitfor.cfa" //
+// End: //
Index: sts/concurrent/waitfor/parse2.cfa
===================================================================
--- tests/concurrent/waitfor/parse2.cfa	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ 	(revision )
@@ -1,249 +1,0 @@
-// 
-// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-// 
-// waitfor.c -- 
-// 
-// Author           : Peter A. Buhr
-// Created On       : Wed Aug 30 17:53:29 2017
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Jan 16 23:13:37 2020
-// Update Count     : 6
-// 
-
-#include <stdbool.h>
-
-int fred() {
-	int x, z;
-
-	// test waitfor and when
-
-	waitfor( x );
-
-	waitfor( x ) {
-	}
-
-	waitfor( x : z ) {
-	}
-
-	when( true ) waitfor( x );
-
-	when( true ) waitfor( x ) {
-	}
-
-	waitfor( x );
-	or waitfor( y );
-
-	waitfor( x : z );
-	or waitfor( y );
-
-	when( true ) waitfor( x );
-	or when( true ) waitfor( y );
-
-	when( true ) waitfor( x : z );
-	or when( true ) waitfor( y );
-
-	waitfor( x ) {
-	} or waitfor( y ) {
-	}
-
-	waitfor( x : z ) {
-	} or waitfor( y ) {
-	}
-
-	when( true ) waitfor( x ) {
-	} or when( true ) waitfor( y ) {
-	}
-
-	waitfor( x );
-	or waitfor( y ) {
-	}
-
-	when( true ) waitfor( x );
-	or when( true ) waitfor( y ) {
-	}
-
-	waitfor( x ) {
-	} or waitfor( y );
-
-	when( true ) waitfor( x ) {
-	} or when( true ) waitfor( y );
-
-	// test when, waitfor and else
-
-	waitfor( x );
-	or else;
-
-	when( true ) waitfor( x );
-	or else;
-
-	when( true ) waitfor( x : z );
-	or else;
-
-	waitfor( x ) {
-	} or else {
-	}
-
-	when( true ) waitfor( x ) {
-	} or else {
-	}
-
-	waitfor( x );
-	or else {
-	}
-
-	when( true ) waitfor( x );
-	or else {
-	}
-
-	when( true ) waitfor( x : z );
-	or else {
-	}
-
-	waitfor( x ) {
-	} or else;
-
-	when( true ) waitfor( x ) {
-	} or else;
-
-	waitfor( x );
-	or when( true ) else;
-
-	when( true ) waitfor( x );
-	or when( true ) else;
-
-	when( true ) waitfor( x : z );
-	or when( true ) else;
-
-	waitfor( x ) {
-	} or when( true ) else {
-	}
-
-	when( true ) waitfor( x ) {
-	} or when( true ) else {
-	}
-
-	waitfor( x );
-	or when( true ) else {
-	}
-
-	when( true ) waitfor( x );
-	or when( true ) else {
-	}
-
-	when( true ) waitfor( x : z );
-	or when( true ) else {
-	}
-
-	waitfor( x ) {
-	} or when( true ) else;
-
-	when( true ) waitfor( x ) {
-	} or when( true ) else;
-
-	// test when, waitfor and timeout
-
-	waitfor( x );
-	or timeout( 3 );
-
-	waitfor( x : z );
-	or timeout( 3 );
-
-	when( true ) waitfor( x );
-	or timeout( 3 );
-
-	waitfor( x ) {
-	} or timeout( 3 ) {
-	}
-
-	when( true ) waitfor( x ) {
-	} or timeout( 3 ) {
-	}
-
-	when( true ) waitfor( x : z ) {
-	} or timeout( 3 ) {
-	}
-
-	when( true ) waitfor( x ) {
-	} or when ( true ) timeout( 3 ) {
-	}
-
-	when( true ) waitfor( x : z ) {
-	} or when ( true ) timeout( 3 ) {
-	}
-
-	waitfor( x );
-	or timeout( 3 ) {
-	}
-
-	when( true ) waitfor( x );
-	or timeout( 3 ) {
-	}
-
-	when( true ) waitfor( x );
-	or when( true ) timeout( 3 ) {
-	}
-
-	waitfor( x ) {
-	} or timeout( 3 );
-
-	when( true ) waitfor( x ) {
-	} or timeout( 3 );
-
-	when( true ) waitfor( x ) {
-	} or when( true ) timeout( 3 );
-
-	// test when, waitfor, timeout and else
-
-	waitfor( x ) {
-	} or timeout( 3 ) {
-	} or when( true ) else {}
-
-	when( true ) waitfor( x ) {
-	} or timeout( 3 ) {
-	} or when( true ) else {}
-
-	waitfor( x ) {
-	} or timeout( 3 ) {
-	} or when( true ) else {}
-
-	waitfor( x ) {
-	} or when( true ) timeout( 3 ) {
-	} or when( true ) else {}
-
-	when( true ) waitfor( x ) {
-	} or timeout( 3 ) {
-	} or when( true ) else {}
-
-	waitfor( x ) {
-	} or when( true ) timeout( 3 ) {
-	} or when( true ) else {}
-
-	when( true ) waitfor( x ) {
-	} or when( true ) timeout( 3 ) {
-	} or when( true ) else {}
-
-	// test quasi-keywords "or" and "timeout"
-
-	int or, timeout;
-	waitfor( timeout : 7 ) 3;
-	waitfor( timeout : 7 ) 3; or waitfor( timeout : 7 ) 3;
-	when( or ) waitfor( or : ) { 4; } or timeout( 1 ) 3;
-	when( 3 ) waitfor( or : 2 ) 4; or else 4;
-	when( 3 ) waitfor( or : 3 ) 4; or when( or ) timeout( or ) 4; or when( or ) else timeout;
-	when( 3 ) waitfor( or : or ) 3; or when( or ) waitfor( or : timeout ) 4; or else 4;
-	when( 3 ) waitfor( or : or ) 3; or waitfor( or : 9 ) 4; or when( or ) timeout( timeout ) 4;
-	when( 3 ) waitfor( or : 3 ) 3; or waitfor( or : 7 ) or; or timeout( 1 ) or; or when( 3 ) else or;
-
-	// test else selection
-
-	if ( or > timeout ) waitfor( or ) 3;
-	else waitfor( timeout ) 4;
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa waitfor.cfa" //
-// End: //
Index: tests/pybin/settings.py
===================================================================
--- tests/pybin/settings.py	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ tests/pybin/settings.py	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -126,4 +126,5 @@
 	global archive
 	global install
+	global invariant
 
 	global continue_
@@ -140,4 +141,5 @@
 	all_install  = [Install(o)      for o in list(dict.fromkeys(options.install))]
 	archive      = os.path.abspath(os.path.join(original_path, options.archive_errors)) if options.archive_errors else None
+	invariant    = options.invariant
 	continue_    = options.continue_
 	dry_run      = options.dry_run # must be called before tools.config_hash()
Index: tests/test.py
===================================================================
--- tests/test.py	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ tests/test.py	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
@@ -114,4 +114,5 @@
 	parser.add_argument('--install', help='Run all tests based on installed binaries or tree binaries', type=comma_separated(yes_no), default='no')
 	parser.add_argument('--continue', help='When multiple specifications are passed (debug/install/arch), sets whether or not to continue if the last specification failed', type=yes_no, default='yes', dest='continue_')
+	parser.add_argument('--invariant', help='Tell the compiler to check invariants while running.', action='store_true')
 	parser.add_argument('--timeout', help='Maximum duration in seconds after a single test is considered to have timed out', type=int, default=180)
 	parser.add_argument('--global-timeout', help='Maximum cumulative duration in seconds after the ALL tests are considered to have timed out', type=int, default=7200)
@@ -172,4 +173,7 @@
 	test.prepare()
 
+	# extra flags for cfa to pass through make.
+	cfa_flags = 'CFAFLAGS=--invariant' if settings.invariant else None
+
 	# ----------
 	# MAKE
@@ -177,5 +181,5 @@
 	# build, skipping to next test on error
 	with Timed() as comp_dur:
-		make_ret, _, _ = make( test.target(), output_file=subprocess.DEVNULL, error=out_file, error_file = err_file )
+		make_ret, _, _ = make(test.target(), flags=cfa_flags, output_file=subprocess.DEVNULL, error=out_file, error_file=err_file)
 
 	# ----------
Index: tests/zombies/gc_no_raii/bug-repro/deref.c
===================================================================
--- tests/zombies/gc_no_raii/bug-repro/deref.c	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ tests/zombies/gc_no_raii/bug-repro/deref.c	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
Index: tests/zombies/gc_no_raii/bug-repro/malloc.c
===================================================================
--- tests/zombies/gc_no_raii/bug-repro/malloc.c	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ tests/zombies/gc_no_raii/bug-repro/malloc.c	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
Index: tests/zombies/gc_no_raii/bug-repro/zero.c
===================================================================
--- tests/zombies/gc_no_raii/bug-repro/zero.c	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ tests/zombies/gc_no_raii/bug-repro/zero.c	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
Index: tests/zombies/gc_no_raii/test/operators.c
===================================================================
--- tests/zombies/gc_no_raii/test/operators.c	(revision a50fdfbfae933dc68ef63eb07fe97924c504fe1b)
+++ tests/zombies/gc_no_raii/test/operators.c	(revision 6e1e2d0299e4210d269f7a30ec3864a8bddceabb)
