Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Perf] Windows/x64: 13 Regressions on 7/1/2023 10:14:52 PM #88376

Closed
performanceautofiler bot opened this issue Jul 4, 2023 · 11 comments
Closed

[Perf] Windows/x64: 13 Regressions on 7/1/2023 10:14:52 PM #88376

performanceautofiler bot opened this issue Jul 4, 2023 · 11 comments
Milestone

Comments

@performanceautofiler
Copy link

Run Information

Name Value
Architecture x64
OS Windows 10.0.19042
Queue OwlWindows
Baseline 1db4357891752cc028620710fe924425235b8f89
Compare 779d53611efd10526ca2bc3e94ce13ee18ad493a
Diff Diff
Configs CompilationMode:tiered, RunKind:micro

Regressions in System.Linq.Tests.Perf_Enumerable

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
EmptyTakeSelectToArray - Duration of single invocation 13.59 ns 23.69 ns 1.74 0.13 False
Contains_ElementNotFound - Duration of single invocation 10.39 ns 12.53 ns 1.21 0.10 False

graph
graph
Test Report

Repro

General Docs link: https://github.com/dotnet/performance/blob/main/docs/benchmarking-workflow-dotnet-runtime.md

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Linq.Tests.Perf_Enumerable*'

Payloads

Baseline
Compare

System.Linq.Tests.Perf_Enumerable.EmptyTakeSelectToArray

Histogram


Description of detection logic

IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 23.691572329848345 > 14.537807447822592.
IsChangePoint: Marked as a change because one of 5/19/2023 10:30:38 AM, 7/1/2023 6:36:20 PM, 7/3/2023 9:53:34 PM falls between 6/24/2023 6:56:43 PM and 7/3/2023 9:53:34 PM.
IsRegressionStdDev: Marked as regression because -34.470840139848164 (T) = (0 -23.99248747029873) / Math.Sqrt((0.0506736983993927 / (40)) + (0.35447750328125177 / (4))) is less than -2.0180817028167235 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (40) + (4) - 2, .025) and -0.7566908591085725 = (13.657774414829964 - 23.99248747029873) / 13.657774414829964 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

JIT Disasms

System.Linq.Tests.Perf_Enumerable.Contains_ElementNotFound(input: ICollection)

Histogram


Description of detection logic

IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 12.527155689557919 > 10.81055521742021.
IsChangePoint: Marked as a change because one of 4/10/2023 1:33:42 PM, 4/25/2023 3:46:39 AM, 5/26/2023 6:22:05 AM, 6/2/2023 6:53:36 PM, 6/30/2023 8:34:57 AM, 7/3/2023 9:53:34 PM falls between 6/24/2023 6:56:43 PM and 7/3/2023 9:53:34 PM.
IsRegressionStdDev: Marked as regression because -106.63333857763865 (T) = (0 -12.531498407064118) / Math.Sqrt((0.01317404310541409 / (35)) + (0.0002711042974289965 / (9))) is less than -2.0180817028167235 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (35) + (9) - 2, .025) and -0.20709782006992145 = (10.381510262638225 - 12.531498407064118) / 10.381510262638225 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

JIT Disasms

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository


Run Information

Name Value
Architecture x64
OS Windows 10.0.19042
Queue OwlWindows
Baseline 1db4357891752cc028620710fe924425235b8f89
Compare 779d53611efd10526ca2bc3e94ce13ee18ad493a
Diff Diff
Configs CompilationMode:tiered, RunKind:micro

Regressions in System.Tests.Perf_Int32

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
ToStringHex - Duration of single invocation 19.88 ns 33.76 ns 1.70 0.12 False
ToStringHex - Duration of single invocation 20.13 ns 31.72 ns 1.58 0.27 False

graph
graph
Test Report

Repro

General Docs link: https://github.com/dotnet/performance/blob/main/docs/benchmarking-workflow-dotnet-runtime.md

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Tests.Perf_Int32*'

Payloads

Baseline
Compare

System.Tests.Perf_Int32.ToStringHex(value: -2147483648)

Histogram


Description of detection logic

IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 33.75656895815466 > 21.202216950657487.
IsChangePoint: Marked as a change because one of 5/25/2023 6:27:07 PM, 6/22/2023 7:55:14 AM, 7/1/2023 6:36:20 PM, 7/3/2023 9:53:34 PM falls between 6/24/2023 6:56:43 PM and 7/3/2023 9:53:34 PM.
IsRegressionStdDev: Marked as regression because -58.34542926942731 (T) = (0 -33.921356757407224) / Math.Sqrt((1.733048536075712 / (40)) + (0.02187401944515169 / (4))) is less than -2.0180817028167235 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (40) + (4) - 2, .025) and -0.6127585626022941 = (21.03312767577116 - 33.921356757407224) / 21.03312767577116 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

JIT Disasms

System.Tests.Perf_Int32.ToStringHex(value: 2147483647)

Histogram


Description of detection logic

IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 31.715216334903133 > 21.330520466731336.
IsChangePoint: Marked as a change because one of 5/26/2023 9:55:14 AM, 6/3/2023 11:04:56 AM, 7/1/2023 6:36:20 PM, 7/3/2023 9:53:34 PM falls between 6/24/2023 6:56:43 PM and 7/3/2023 9:53:34 PM.
IsRegressionStdDev: Marked as regression because -33.58485450141158 (T) = (0 -30.866034245422558) / Math.Sqrt((0.579128423311183 / (40)) + (0.328134426999376 / (4))) is less than -2.0180817028167235 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (40) + (4) - 2, .025) and -0.5106382823088309 = (20.432445415223754 - 30.866034245422558) / 20.432445415223754 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

JIT Disasms

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository


Run Information

Name Value
Architecture x64
OS Windows 10.0.19042
Queue OwlWindows
Baseline 1db4357891752cc028620710fe924425235b8f89
Compare 779d53611efd10526ca2bc3e94ce13ee18ad493a
Diff Diff
Configs CompilationMode:tiered, RunKind:micro

Regressions in System.Text.Perf_Ascii

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
ToUpperInPlace_Bytes - Duration of single invocation 8.61 ns 16.95 ns 1.97 0.07 False
ToLowerInPlace_Chars - Duration of single invocation 15.16 ns 19.97 ns 1.32 0.09 False
ToUpperInPlace_Chars - Duration of single invocation 16.09 ns 20.83 ns 1.29 0.14 False
ToLowerInPlace_Bytes - Duration of single invocation 8.64 ns 16.93 ns 1.96 0.08 False
Equals_Bytes_Chars - Duration of single invocation 9.52 ns 10.80 ns 1.13 0.10 False

graph
graph
graph
graph
graph
Test Report

Repro

General Docs link: https://github.com/dotnet/performance/blob/main/docs/benchmarking-workflow-dotnet-runtime.md

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Text.Perf_Ascii*'

Payloads

Baseline
Compare

System.Text.Perf_Ascii.ToUpperInPlace_Bytes(Size: 128)

Histogram


Description of detection logic

IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 16.945757154730803 > 9.014277712862944.
IsChangePoint: Marked as a change because one of 6/5/2023 10:43:22 AM, 6/9/2023 2:21:24 AM, 7/1/2023 6:36:20 PM, 7/3/2023 9:53:34 PM falls between 6/24/2023 6:56:43 PM and 7/3/2023 9:53:34 PM.
IsRegressionStdDev: Marked as regression because -151.00879842497986 (T) = (0 -16.8930924125945) / Math.Sqrt((0.08129746091841983 / (40)) + (0.0032330291631983525 / (4))) is less than -2.0180817028167235 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (40) + (4) - 2, .025) and -0.909989121253438 = (8.844601377367185 - 16.8930924125945) / 8.844601377367185 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

JIT Disasms

System.Text.Perf_Ascii.ToLowerInPlace_Chars(Size: 128)

Histogram


Description of detection logic

IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 19.972740460327508 > 15.927634170939974.
IsChangePoint: Marked as a change because one of 6/5/2023 10:43:22 AM, 6/8/2023 8:20:44 PM, 7/1/2023 6:36:20 PM, 7/3/2023 9:53:34 PM falls between 6/24/2023 6:56:43 PM and 7/3/2023 9:53:34 PM.
IsRegressionStdDev: Marked as regression because -20.600311019009634 (T) = (0 -20.352641518797515) / Math.Sqrt((0.2610780571372627 / (40)) + (0.17970877092796447 / (4))) is less than -2.0180817028167235 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (40) + (4) - 2, .025) and -0.2980192405173004 = (15.679768745713172 - 20.352641518797515) / 15.679768745713172 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

JIT Disasms

System.Text.Perf_Ascii.ToUpperInPlace_Chars(Size: 128)

Histogram


Description of detection logic

IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 20.832599744015933 > 16.97548517446338.
IsChangePoint: Marked as a change because one of 6/6/2023 4:05:41 PM, 6/14/2023 10:30:12 PM, 7/1/2023 6:36:20 PM, 7/3/2023 9:53:34 PM falls between 6/24/2023 6:56:43 PM and 7/3/2023 9:53:34 PM.
IsRegressionStdDev: Marked as regression because -25.709632437153054 (T) = (0 -20.657727001670693) / Math.Sqrt((0.25947699057604795 / (40)) + (0.11759928911368989 / (4))) is less than -2.0180817028167235 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (40) + (4) - 2, .025) and -0.3084990140523442 = (15.787346249268413 - 20.657727001670693) / 15.787346249268413 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

JIT Disasms

System.Text.Perf_Ascii.ToLowerInPlace_Bytes(Size: 128)

Histogram


Description of detection logic

IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 16.934460378839493 > 9.059669783187108.
IsChangePoint: Marked as a change because one of 6/5/2023 10:43:22 AM, 6/8/2023 12:15:18 PM, 7/1/2023 6:36:20 PM, 7/3/2023 9:53:34 PM falls between 6/24/2023 6:56:43 PM and 7/3/2023 9:53:34 PM.
IsRegressionStdDev: Marked as regression because -63.72675863098483 (T) = (0 -16.783452023631064) / Math.Sqrt((0.07859240846920844 / (40)) + (0.05394467739193239 / (4))) is less than -2.0180817028167235 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (40) + (4) - 2, .025) and -0.8938479755739479 = (8.862090431807065 - 16.783452023631064) / 8.862090431807065 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

JIT Disasms

System.Text.Perf_Ascii.Equals_Bytes_Chars(Size: 128)

Histogram


Description of detection logic

IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 10.801042205841588 > 9.998102832079615.
IsChangePoint: Marked as a change because one of 5/11/2023 1:19:27 PM, 6/19/2023 6:37:24 PM, 6/26/2023 10:42:28 PM, 7/3/2023 9:53:34 PM falls between 6/24/2023 6:56:43 PM and 7/3/2023 9:53:34 PM.
IsRegressionStdDev: Marked as regression because -9.229224395278091 (T) = (0 -10.525148882049088) / Math.Sqrt((0.009524277872660743 / (19)) + (0.2640697965762095 / (25))) is less than -2.0180817028167235 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (19) + (25) - 2, .025) and -0.10160634694897282 = (9.554364779396664 - 10.525148882049088) / 9.554364779396664 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

JIT Disasms

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository


Run Information

Name Value
Architecture x64
OS Windows 10.0.19042
Queue OwlWindows
Baseline 1db4357891752cc028620710fe924425235b8f89
Compare 779d53611efd10526ca2bc3e94ce13ee18ad493a
Diff Diff
Configs CompilationMode:tiered, RunKind:micro

Regressions in System.Globalization.Tests.StringSearch

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
IsPrefix_FirstHalf - Duration of single invocation 27.34 ns 29.43 ns 1.08 0.05 False
IsPrefix_DifferentFirstChar - Duration of single invocation 8.57 ns 11.13 ns 1.30 0.04 False

graph
graph
Test Report

Repro

General Docs link: https://github.com/dotnet/performance/blob/main/docs/benchmarking-workflow-dotnet-runtime.md

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Globalization.Tests.StringSearch*'

Payloads

Baseline
Compare

System.Globalization.Tests.StringSearch.IsPrefix_FirstHalf(Options: (en-US, OrdinalIgnoreCase, False))

Histogram


Description of detection logic

IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 29.427564114470147 > 28.18491171324216.
IsChangePoint: Marked as a change because one of 5/18/2023 1:58:11 PM, 6/6/2023 4:05:41 PM, 6/9/2023 2:21:24 AM, 6/22/2023 1:44:15 PM, 7/1/2023 6:36:20 PM, 7/3/2023 9:53:34 PM falls between 6/24/2023 6:56:43 PM and 7/3/2023 9:53:34 PM.
IsRegressionStdDev: Marked as regression because -30.410940801948552 (T) = (0 -29.45580965552056) / Math.Sqrt((0.2744272679300626 / (40)) + (0.000558904779451763 / (4))) is less than -2.0180817028167235 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (40) + (4) - 2, .025) and -0.0945487218262464 = (26.911373672223345 - 29.45580965552056) / 26.911373672223345 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

JIT Disasms

System.Globalization.Tests.StringSearch.IsPrefix_DifferentFirstChar(Options: (en-US, OrdinalIgnoreCase, False))

Histogram


Description of detection logic

IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 11.133991963718673 > 8.996599145260538.
IsChangePoint: Marked as a change because one of 5/26/2023 9:55:14 AM, 6/5/2023 10:43:22 AM, 6/9/2023 2:21:24 AM, 6/22/2023 7:55:14 AM, 7/1/2023 6:36:20 PM, 7/3/2023 9:53:34 PM falls between 6/24/2023 6:56:43 PM and 7/3/2023 9:53:34 PM.
IsRegressionStdDev: Marked as regression because -55.34879058916811 (T) = (0 -11.079546820537718) / Math.Sqrt((0.059902227823027156 / (40)) + (0.0018931626068120124 / (4))) is less than -2.0180817028167235 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (40) + (4) - 2, .025) and -0.2849753692394309 = (8.622380697534798 - 11.079546820537718) / 8.622380697534798 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

JIT Disasms

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository


Run Information

Name Value
Architecture x64
OS Windows 10.0.19042
Queue OwlWindows
Baseline 1db4357891752cc028620710fe924425235b8f89
Compare 779d53611efd10526ca2bc3e94ce13ee18ad493a
Diff Diff
Configs CompilationMode:tiered, RunKind:micro

Regressions in System.Tests.Perf_Enum

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
GetName_Generic_Flags - Duration of single invocation 8.14 ns 9.63 ns 1.18 0.09 False

graph
Test Report

Repro

General Docs link: https://github.com/dotnet/performance/blob/main/docs/benchmarking-workflow-dotnet-runtime.md

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Tests.Perf_Enum*'

Payloads

Baseline
Compare

System.Tests.Perf_Enum.GetName_Generic_Flags

Histogram


Description of detection logic

IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 9.631895613905973 > 8.18644994290847.
IsChangePoint: Marked as a change because one of 4/25/2023 6:46:56 PM, 5/2/2023 3:18:41 PM, 5/19/2023 10:30:38 AM, 6/22/2023 7:55:14 AM, 6/29/2023 3:17:38 AM, 7/1/2023 6:36:20 PM, 7/3/2023 9:53:34 PM falls between 6/24/2023 6:56:43 PM and 7/3/2023 9:53:34 PM.
IsRegressionStdDev: Marked as regression because -14.428731424110174 (T) = (0 -9.487004001904204) / Math.Sqrt((0.6558188555040996 / (40)) + (0.026771985569492715 / (4))) is less than -2.0180817028167235 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (40) + (4) - 2, .025) and -0.3005562492753936 = (7.294574154089759 - 9.487004001904204) / 7.294574154089759 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

JIT Disasms

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository


Run Information

Name Value
Architecture x64
OS Windows 10.0.19042
Queue OwlWindows
Baseline 1db4357891752cc028620710fe924425235b8f89
Compare 779d53611efd10526ca2bc3e94ce13ee18ad493a
Diff Diff
Configs CompilationMode:tiered, RunKind:micro

Regressions in Benchstone.BenchI.TreeInsert

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
Test - Duration of single invocation 43.51 μs 48.65 μs 1.12 0.04 False

graph
Test Report

Repro

General Docs link: https://github.com/dotnet/performance/blob/main/docs/benchmarking-workflow-dotnet-runtime.md

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'Benchstone.BenchI.TreeInsert*'

Payloads

Baseline
Compare

Benchstone.BenchI.TreeInsert.Test

Histogram


Description of detection logic

IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 48.6515 > 45.69014879609668.
IsChangePoint: Marked as a change because one of 4/25/2023 6:46:56 PM, 5/1/2023 3:42:23 PM, 6/13/2023 11:57:38 AM, 6/22/2023 7:55:14 AM, 7/1/2023 6:36:20 PM, 7/3/2023 9:53:34 PM falls between 6/24/2023 6:56:43 PM and 7/3/2023 9:53:34 PM.
IsRegressionStdDev: Marked as regression because -18.54451797515939 (T) = (0 -48260.33791208791) / Math.Sqrt((1190351.7026885014 / (40)) + (72826.05635012857 / (4))) is less than -2.0180817028167235 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (40) + (4) - 2, .025) and -0.09188987074540791 = (44198.906139812156 - 48260.33791208791) / 44198.906139812156 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

JIT Disasms

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository

@performanceautofiler performanceautofiler bot added arch-x64 os-windows runtime-coreclr specific to the CoreCLR runtime untriaged New issue has not been triaged by the area owner labels Jul 4, 2023
@cincuranet
Copy link
Contributor

The diff is always 7180d7b...0d77cf0.

The System.Linq.Tests.Perf_Enumerable is likely #88249.

The rest probably again #88249 and/or #88238.

cc @stephentoub @jakobbotsch

@cincuranet cincuranet removed the untriaged New issue has not been triaged by the area owner label Jul 4, 2023
@cincuranet cincuranet transferred this issue from dotnet/perf-autofiling-issues Jul 4, 2023
@dotnet-issue-labeler dotnet-issue-labeler bot added the needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners label Jul 4, 2023
@ghost ghost added the untriaged New issue has not been triaged by the area owner label Jul 4, 2023
@cincuranet
Copy link
Contributor

cincuranet commented Jul 4, 2023

@stephentoub
Copy link
Member

The System.Linq.Tests.Perf_Enumerable is likely #88249. The rest probably again #88249 and/or #88238.

I'll take a look at the Perf_Enumerable ones. But the others aren't related to LINQ at all and wouldn't be affected by my change.

@jakobbotsch
Copy link
Member

I'll take a look at the others.

@jakobbotsch
Copy link
Member

Report of diffs:

System.Linq.Tests.Perf_Enumerable.EmptyTakeSelectToArray

Hot functions:

  • (37.67%) CastHelpers.IsInstanceOfInterface (Tier-1)
    • Has diffs
  • (30.26%) Enumerable.Select (Tier-1)
    • Has diffs
  • (11.18%) CastHelpers.IsInstanceOfClass (Tier-1)
    • No diffs
  • (10.10%) Perf_Enumerable.EmptyTakeSelectToArray (Tier-1)
    • Has diffs
  • (2.08%) Runnable_0.WorkloadActionUnroll (Tier-1)
    • No diffs
Diffs

[System.Private.CoreLib]CastHelpers.IsInstanceOfInterface(void*,class System.Object)

 ; optimized using Dynamic PGO
 ; rsp based frame
 ; fully interruptible
-; with Dynamic PGO: edge weights are valid, and fgCalledCount is 108304
+; with Dynamic PGO: edge weights are valid, and fgCalledCount is 129600
 ; 2 inlinees with PGO data; 0 single block inlinees; 0 inlinees without PGO data
 ; Final local variable assignments
 ;
-;  V00 arg0         [V00,T01] (  8,  4.73)    long  ->  rcx         single-def
-;  V01 arg1         [V01,T00] (  7,  5.25)     ref  ->  rdx         class-hnd
-;  V02 loc0         [V02,T04] (  4,  3.25)    long  ->  rax        
-;  V03 loc1         [V03,T02] ( 10,  6.21)    long  ->   r8        
-;  V04 loc2         [V04,T03] ( 10,  5.70)    long  ->  r10        
+;  V00 arg0         [V00,T00] (  8,  7.32)    long  ->  rcx         single-def
+;  V01 arg1         [V01,T03] (  7,  5.00)     ref  ->  rdx         class-hnd
+;  V02 loc0         [V02,T04] (  4,  3.01)    long  ->   r8        
+;  V03 loc1         [V03,T02] ( 10,  7.31)    long  ->  r10        
+;  V04 loc2         [V04,T01] ( 10,  8.97)    long  ->   r9        
 ;# V05 OutArgs      [V05    ] (  1,  1   )  struct ( 0) [rsp+00H]   do-not-enreg[XS] addr-exposed "OutgoingArgSpace"
 ;
 ; Lcl frame size = 0
@@ -196,49 +196,47 @@ G_M24157_IG02:
        je       SHORT G_M24157_IG10
 						;; size=5 bbWeight=1 PerfScore 1.25
 G_M24157_IG03:
-       mov      rax, qword ptr [rdx]
-       movzx    r8, word  ptr [rax+0EH]
-       test     r8, r8
-       je       SHORT G_M24157_IG09
-						;; size=13 bbWeight=1.00 PerfScore 5.25
-G_M24157_IG04:
-       mov      r10, qword ptr [rax+38H]
-       cmp      r8, 4
+       mov      r8, qword ptr [rdx]
+       movzx    r10, word  ptr [r8+0EH]
+       test     r10, r10
+       je       SHORT G_M24157_IG13
+       mov      r9, qword ptr [r8+38H]
+       cmp      r10, 4
        jl       SHORT G_M24157_IG08
-						;; size=10 bbWeight=1.00 PerfScore 3.25
+						;; size=23 bbWeight=1.00 PerfScore 8.52
+G_M24157_IG04:
+       cmp      qword ptr [r9], rcx
+       je       SHORT G_M24157_IG10
+						;; size=5 bbWeight=1.33 PerfScore 5.32
 G_M24157_IG05:
-       cmp      qword ptr [r10], rcx
+       cmp      qword ptr [r9+08H], rcx
+       je       SHORT G_M24157_IG10
+       cmp      qword ptr [r9+10H], rcx
+       je       SHORT G_M24157_IG10
+       cmp      qword ptr [r9+18H], rcx
+       je       SHORT G_M24157_IG10
+						;; size=18 bbWeight=1.00 PerfScore 11.96
+G_M24157_IG06:
+       add      r9, 32
+       add      r10, -4
+       cmp      r10, 4
+       jge      SHORT G_M24157_IG04
+						;; size=14 bbWeight=0.66 PerfScore 1.16
+G_M24157_IG07:
+       test     r10, r10
+       je       SHORT G_M24157_IG13
+						;; size=5 bbWeight=0.33 PerfScore 0.41
+G_M24157_IG08:
+       cmp      qword ptr [r9], rcx
        je       SHORT G_M24157_IG10
 						;; size=5 bbWeight=1.00 PerfScore 3.99
-G_M24157_IG06:
-       cmp      qword ptr [r10+08H], rcx
-       je       SHORT G_M24157_IG10
-						;; size=6 bbWeight=0.50 PerfScore 1.99
-G_M24157_IG07:
-       cmp      qword ptr [r10+10H], rcx
-       je       SHORT G_M24157_IG10
-       cmp      qword ptr [r10+18H], rcx
-       je       SHORT G_M24157_IG10
-       add      r10, 32
-       add      r8, -4
-       cmp      r8, 4
-       jge      SHORT G_M24157_IG05
-       test     r8, r8
-       je       SHORT G_M24157_IG09
-						;; size=31 bbWeight=0.25 PerfScore 2.73
-G_M24157_IG08:
-       cmp      qword ptr [r10], rcx
-       je       SHORT G_M24157_IG10
-       add      r10, 8
-       dec      r8
-       test     r8, r8
-       jg       SHORT G_M24157_IG08
-						;; size=17 bbWeight=0.74 PerfScore 4.25
 G_M24157_IG09:
-       test     dword ptr [rax], 0xD1FFAB1E
-       jne      SHORT G_M24157_IG12
-       xor      rdx, rdx
-						;; size=10 bbWeight=0.25 PerfScore 1.06
+       add      r9, 8
+       dec      r10
+       test     r10, r10
+       jle      SHORT G_M24157_IG13
+       jmp      SHORT G_M24157_IG08
+						;; size=14 bbWeight=0.66 PerfScore 2.48
 G_M24157_IG10:
        mov      rax, rdx
 						;; size=3 bbWeight=1 PerfScore 0.25
@@ -248,7 +246,13 @@ G_M24157_IG11:
 G_M24157_IG12:
        tail.jmp [<unknown method>]
 						;; size=6 bbWeight=0 PerfScore 0.00
+G_M24157_IG13:
+       test     dword ptr [r8], 0xD1FFAB1E
+       jne      SHORT G_M24157_IG12
+       xor      rdx, rdx
+       jmp      SHORT G_M24157_IG10
+						;; size=13 bbWeight=0 PerfScore 0.00
 
-; Total bytes of code 107, prolog size 0, PerfScore 35.71, instruction count 35, allocated bytes for code 107 (MethodHash=fe85a1a2) for method System.Runtime.CompilerServices.CastHelpers:IsInstanceOfInterface(ulong,System.Object):System.Object (Tier1)
+; Total bytes of code 112, prolog size 0, PerfScore 47.55, instruction count 37, allocated bytes for code 112 (MethodHash=fe85a1a2) for method System.Runtime.CompilerServices.CastHelpers:IsInstanceOfInterface(ulong,System.Object):System.Object (Tier1)
 ; ============================================================
 

[System.Linq]Enumerable.Select(class System.Collections.Generic.IEnumerable`1<!!0>,class System.Func`2<!!0,!!1>)

 ; optimized using Dynamic PGO
 ; rsp based frame
 ; partially interruptible
-; with Dynamic PGO: edge weights are invalid, and fgCalledCount is 136992
-; 1 inlinees with PGO data; 2 single block inlinees; 0 inlinees without PGO data
+; with Dynamic PGO: edge weights are valid, and fgCalledCount is 156256
+; 1 inlinees with PGO data; 3 single block inlinees; 0 inlinees without PGO data
 ; Final local variable assignments
 ;
-;  V00 arg0         [V00,T01] (  9,  6   )     ref  ->  rbx         class-hnd single-def
-;  V01 arg1         [V01,T02] (  9,  3.00)     ref  ->  rsi         class-hnd single-def
+;  V00 arg0         [V00,T01] (  9,  7   )     ref  ->  rbx         class-hnd single-def
+;  V01 arg1         [V01,T02] (  9,  4   )     ref  ->  rsi         class-hnd single-def
 ;  V02 loc0         [V02,T05] (  4,  2   )     ref  ->  rdi         class-hnd single-def
-;  V03 loc1         [V03,T06] (  3,  2   )     ref  ->  rbp         class-hnd single-def
-;  V04 loc2         [V04,T04] (  4,  3.00)     ref  ->  rdi         class-hnd single-def
-;  V05 loc3         [V05,T11] (  4,  0   )     ref  ->  rdi         class-hnd single-def
-;  V06 loc4         [V06,T12] (  3,  0   )     ref  ->  rbx         class-hnd single-def
+;  V03 loc1         [V03,T04] (  3,  3   )     ref  ->  rdi         class-hnd single-def
+;  V04 loc2         [V04,T08] (  3,  0   )     ref  ->  rax         class-hnd single-def
+;  V05 loc3         [V05,T06] (  4,  2   )     ref  ->  rbp         class-hnd single-def
+;  V06 loc4         [V06,T07] (  3,  2   )     ref  ->  rbx         class-hnd single-def
 ;* V07 loc5         [V07    ] (  0,  0   )     ref  ->  zero-ref    class-hnd exact
-;  V08 loc6         [V08    ] (  4,  4   )     ref  ->  [rsp+28H]   do-not-enreg[X] must-init addr-exposed ld-addr-op class-hnd
+;  V08 loc6         [V08    ] (  4,  0   )     ref  ->  [rsp+28H]   do-not-enreg[X] must-init addr-exposed ld-addr-op class-hnd
 ;  V09 OutArgs      [V09    ] (  1,  1   )  struct (32) [rsp+00H]   do-not-enreg[XS] addr-exposed "OutgoingArgSpace"
-;  V10 tmp1         [V10,T13] (  3,  0   )     ref  ->  rdi         class-hnd exact single-def "NewObj constructor temp"
-;  V11 tmp2         [V11,T14] (  3,  0   )     ref  ->  rbx         class-hnd exact single-def "NewObj constructor temp"
-;  V12 tmp3         [V12,T15] (  3,  0   )     ref  ->  rbp         class-hnd exact single-def "NewObj constructor temp"
-;  V13 tmp4         [V13,T16] (  3,  0   )     ref  ->  rbx         class-hnd exact single-def "NewObj constructor temp"
-;  V14 tmp5         [V14,T17] (  2,  0   )    long  ->  rax         "VirtualCall through function pointer"
-;  V15 tmp6         [V15,T00] (  5, 10   )     ref  ->  rcx         class-hnd "spilling QMark2"
-;  V16 tmp7         [V16,T07] (  3,  2   )   byref  ->  rbp         single-def
-;  V17 tmp8         [V17,T08] (  3,  2   )   byref  ->  rcx        
-;  V18 tmp9         [V18,T09] (  3,  2   )     ref  ->  rdx        
-;  V19 tmp10        [V19,T10] (  5,  0.03)     ref  ->  r14         class-hnd exact single-def "NewObj constructor temp"
-;* V20 tmp11        [V20    ] (  0,  0   )     ref  ->  zero-ref    class-hnd exact single-def "Inline stloc first use temp"
-;  V21 tmp12        [V21,T03] (  8,  4   )     ref  ->  rax         "Single return block return value"
+;  V10 tmp1         [V10,T09] (  3,  0   )     ref  ->  rdi         class-hnd exact single-def "NewObj constructor temp"
+;  V11 tmp2         [V11,T00] (  5, 10   )     ref  ->  r14         class-hnd exact single-def "NewObj constructor temp"
+;  V12 tmp3         [V12,T10] (  3,  0   )     ref  ->  rdi         class-hnd exact single-def "NewObj constructor temp"
+;  V13 tmp4         [V13,T11] (  3,  0   )     ref  ->  rbx         class-hnd exact single-def "NewObj constructor temp"
+;  V14 tmp5         [V14,T12] (  2,  0   )    long  ->  rax         "VirtualCall through function pointer"
+;  V15 tmp6         [V15,T03] (  8,  4   )     ref  ->  rax         "Single return block return value"
 ;
 ; Lcl frame size = 48
 
@@ -930,50 +924,47 @@ G_M53193_IG01:
 						;; size=23 bbWeight=1 PerfScore 7.00
 G_M53193_IG02:
        test     rbx, rbx
-       je       G_M53193_IG08
+       je       G_M53193_IG04
        test     rsi, rsi
-       je       G_M53193_IG09
+       je       G_M53193_IG05
        mov      rdx, rbx
        mov      rcx, 0xD1FFAB1E      ; System.Linq.Enumerable+Iterator`1[int]
        call     [CORINFO_HELP_ISINSTANCEOFCLASS]
        mov      rdi, rax
        test     rdi, rdi
-       jne      G_M53193_IG10
+       jne      G_M53193_IG06
        mov      rdx, rbx
        mov      rcx, 0xD1FFAB1E      ; System.Collections.Generic.IList`1[int]
        call     [CORINFO_HELP_ISINSTANCEOFINTERFACE]
-       mov      rbp, rax
-       test     rbp, rbp
-       jne      G_M53193_IG11
-       mov      rdx, rbx
-       mov      rcx, 0xD1FFAB1E      ; System.Linq.IPartition`1[int]
-       call     [CORINFO_HELP_ISINSTANCEOFINTERFACE]
        mov      rdi, rax
        test     rdi, rdi
-       je       G_M53193_IG07
-       xor      rcx, rcx
-       mov      gword ptr [rsp+28H], rcx
-       mov      rcx, rdi
-       mov      rax, 0xD1FFAB1E      ; <unknown class>
-       xor      rdx, rdx
-       cmp      qword ptr [rcx], rax
-       cmovne   rcx, rdx
-       lea      rbp, bword ptr [rsp+28H]
-       test     rcx, rcx
-       je       SHORT G_M53193_IG06
-						;; size=150 bbWeight=1 PerfScore 24.50
+       je       G_M53193_IG10
+       mov      rdx, rbx
+       mov      rcx, 0xD1FFAB1E      ; int[]
+       call     [CORINFO_HELP_ISINSTANCEOFARRAY]
+       mov      rbp, rax
+       test     rbp, rbp
+       jne      G_M53193_IG07
+       mov      rdx, rbx
+       mov      rcx, 0xD1FFAB1E      ; System.Collections.Generic.List`1[int]
+       call     [CORINFO_HELP_ISINSTANCEOFCLASS]
+       mov      rbx, rax
+       test     rbx, rbx
+       jne      G_M53193_IG09
+       mov      rcx, 0xD1FFAB1E      ; System.Linq.Enumerable+SelectIListIterator`2[int,int]
+       call     CORINFO_HELP_NEWSFAST
+       mov      r14, rax
+       call     <unknown method>
+       mov      dword ptr [r14+08H], eax
+       lea      rcx, bword ptr [r14+18H]
+       mov      rdx, rdi
+       call     CORINFO_HELP_ASSIGN_REF
+       lea      rcx, bword ptr [r14+20H]
+       mov      rdx, rsi
+       call     CORINFO_HELP_ASSIGN_REF
+       mov      rax, r14
+						;; size=196 bbWeight=1 PerfScore 29.75
 G_M53193_IG03:
-       mov      rcx, rbp
-       mov      rdx, 0xD1FFAB1E      ; const ptr
-       mov      rdx, gword ptr [rdx]
-						;; size=16 bbWeight=1.00 PerfScore 2.49
-G_M53193_IG04:
-       call     CORINFO_HELP_CHECKED_ASSIGN_REF
-       cmp      gword ptr [rsp+28H], 0
-       je       SHORT G_M53193_IG07
-       mov      rax, gword ptr [rsp+28H]
-						;; size=18 bbWeight=1 PerfScore 5.00
-G_M53193_IG05:
        add      rsp, 48
        pop      rbx
        pop      rbp
@@ -982,23 +973,73 @@ G_M53193_IG05:
        pop      r14
        ret      
 						;; size=11 bbWeight=1 PerfScore 3.75
+G_M53193_IG04:
+       mov      ecx, 16
+       call     [System.Linq.ThrowHelper:ThrowArgumentNullException(int)]
+       int3     
+						;; size=12 bbWeight=0 PerfScore 0.00
+G_M53193_IG05:
+       mov      ecx, 15
+       call     [System.Linq.ThrowHelper:ThrowArgumentNullException(int)]
+       int3     
+						;; size=12 bbWeight=0 PerfScore 0.00
 G_M53193_IG06:
-       mov      rcx, 0xD1FFAB1E      ; System.Linq.Enumerable+SelectIPartitionIterator`2[int,int]
-       call     CORINFO_HELP_NEWSFAST
-       mov      r14, rax
-       mov      rcx, r14
-       call     [System.Linq.Enumerable+Iterator`1[int]:.ctor():this]
-       lea      rcx, bword ptr [r14+18H]
-       mov      rdx, rdi
-       call     CORINFO_HELP_ASSIGN_REF
-       lea      rcx, bword ptr [r14+20H]
+       mov      rcx, rdi
+       mov      rdx, 0xD1FFAB1E      ; System.Linq.Enumerable+Iterator`1[int]
+       mov      r8, 0xD1FFAB1E      ; token handle
+       call     CORINFO_HELP_VIRTUAL_FUNC_PTR
+       mov      rcx, rdi
        mov      rdx, rsi
-       call     CORINFO_HELP_ASSIGN_REF
-       mov      rcx, rbp
-       mov      rdx, r14
-       jmp      SHORT G_M53193_IG04
-						;; size=59 bbWeight=0.00 PerfScore 0.03
+       call     rax
+       jmp      SHORT G_M53193_IG03
+						;; size=38 bbWeight=0 PerfScore 0.00
 G_M53193_IG07:
+       cmp      dword ptr [rbp+08H], 0
+       je       SHORT G_M53193_IG08
+       mov      rcx, 0xD1FFAB1E      ; System.Linq.Enumerable+SelectArrayIterator`2[int,int]
+       call     CORINFO_HELP_NEWSFAST
+       mov      rbx, rax
+       mov      rcx, rbx
+       mov      rdx, rbp
+       mov      r8, rsi
+       call     [System.Linq.Enumerable+SelectArrayIterator`2[int,int]:.ctor(int[],System.Func`2[int,int]):this]
+       mov      rax, rbx
+       jmp      SHORT G_M53193_IG03
+						;; size=44 bbWeight=0 PerfScore 0.00
+G_M53193_IG08:
+       mov      rax, 0xD1FFAB1E      ; const ptr
+       mov      rax, gword ptr [rax]
+       jmp      G_M53193_IG03
+						;; size=18 bbWeight=0 PerfScore 0.00
+G_M53193_IG09:
+       mov      rcx, 0xD1FFAB1E      ; System.Linq.Enumerable+SelectListIterator`2[int,int]
+       call     CORINFO_HELP_NEWSFAST
+       mov      rdi, rax
+       mov      rcx, rdi
+       mov      rdx, rbx
+       mov      r8, rsi
+       call     [System.Linq.Enumerable+SelectListIterator`2[int,int]:.ctor(System.Collections.Generic.List`1[int],System.Func`2[int,int]):this]
+       mov      rax, rdi
+       jmp      G_M53193_IG03
+						;; size=41 bbWeight=0 PerfScore 0.00
+G_M53193_IG10:
+       mov      rdx, rbx
+       mov      rcx, 0xD1FFAB1E      ; System.Linq.IPartition`1[int]
+       call     [CORINFO_HELP_ISINSTANCEOFINTERFACE]
+       test     rax, rax
+       je       SHORT G_M53193_IG11
+       xor      r8, r8
+       mov      gword ptr [rsp+28H], r8
+       lea      r8, [rsp+28H]
+       mov      rcx, rsi
+       mov      rdx, rax
+       call     [System.Linq.Enumerable:CreateSelectIPartitionIterator[int,int](System.Func`2[int,int],System.Linq.IPartition`1[int],byref)]
+       cmp      gword ptr [rsp+28H], 0
+       je       SHORT G_M53193_IG11
+       mov      rax, gword ptr [rsp+28H]
+       jmp      G_M53193_IG03
+						;; size=67 bbWeight=0 PerfScore 0.00
+G_M53193_IG11:
        mov      rcx, 0xD1FFAB1E      ; System.Linq.Enumerable+SelectEnumerableIterator`2[int,int]
        call     CORINFO_HELP_NEWSFAST
        mov      rdi, rax
@@ -1007,82 +1048,10 @@ G_M53193_IG07:
        mov      r8, rsi
        call     [System.Linq.Enumerable+SelectEnumerableIterator`2[int,int]:.ctor(System.Collections.Generic.IEnumerable`1[int],System.Func`2[int,int]):this]
        mov      rax, rdi
-       jmp      SHORT G_M53193_IG05
-						;; size=38 bbWeight=0 PerfScore 0.00
-G_M53193_IG08:
-       mov      ecx, 16
-       call     [System.Linq.ThrowHelper:ThrowArgumentNullException(int)]
-       int3     
-						;; size=12 bbWeight=0 PerfScore 0.00
-G_M53193_IG09:
-       mov      ecx, 15
-       call     [System.Linq.ThrowHelper:ThrowArgumentNullException(int)]
-       int3     
-						;; size=12 bbWeight=0 PerfScore 0.00
-G_M53193_IG10:
-       mov      rcx, rdi
-       mov      rdx, 0xD1FFAB1E      ; System.Linq.Enumerable+Iterator`1[int]
-       mov      r8, 0xD1FFAB1E      ; token handle
-       call     CORINFO_HELP_VIRTUAL_FUNC_PTR
-       mov      rcx, rdi
-       mov      rdx, rsi
-       call     rax
-       jmp      G_M53193_IG05
-						;; size=41 bbWeight=0 PerfScore 0.00
-G_M53193_IG11:
-       mov      rdx, rbx
-       mov      rcx, 0xD1FFAB1E      ; int[]
-       call     [CORINFO_HELP_ISINSTANCEOFARRAY]
-       mov      rdi, rax
-       test     rdi, rdi
-       je       SHORT G_M53193_IG13
-       cmp      dword ptr [rdi+08H], 0
-       je       SHORT G_M53193_IG12
-       mov      rcx, 0xD1FFAB1E      ; System.Linq.Enumerable+SelectArrayIterator`2[int,int]
-       call     CORINFO_HELP_NEWSFAST
-       mov      rbx, rax
-       mov      rcx, rbx
-       mov      rdx, rdi
-       mov      r8, rsi
-       call     [System.Linq.Enumerable+SelectArrayIterator`2[int,int]:.ctor(int[],System.Func`2[int,int]):this]
-       mov      rax, rbx
-       jmp      G_M53193_IG05
-						;; size=74 bbWeight=0 PerfScore 0.00
-G_M53193_IG12:
-       mov      rax, 0xD1FFAB1E      ; const ptr
-       mov      rax, gword ptr [rax]
-       jmp      G_M53193_IG05
-						;; size=18 bbWeight=0 PerfScore 0.00
-G_M53193_IG13:
-       mov      rdx, rbx
-       mov      rcx, 0xD1FFAB1E      ; System.Collections.Generic.List`1[int]
-       call     [CORINFO_HELP_ISINSTANCEOFCLASS]
-       mov      rbx, rax
-       test     rbx, rbx
-       je       SHORT G_M53193_IG14
-       mov      rcx, 0xD1FFAB1E      ; System.Linq.Enumerable+SelectListIterator`2[int,int]
-       call     CORINFO_HELP_NEWSFAST
-       mov      rbp, rax
-       mov      rcx, rbp
-       mov      rdx, rbx
-       mov      r8, rsi
-       call     [System.Linq.Enumerable+SelectListIterator`2[int,int]:.ctor(System.Collections.Generic.List`1[int],System.Func`2[int,int]):this]
-       mov      rax, rbp
-       jmp      G_M53193_IG05
-						;; size=68 bbWeight=0 PerfScore 0.00
-G_M53193_IG14:
-       mov      rcx, 0xD1FFAB1E      ; System.Linq.Enumerable+SelectIListIterator`2[int,int]
-       call     CORINFO_HELP_NEWSFAST
-       mov      rbx, rax
-       mov      rcx, rbx
-       mov      rdx, rbp
-       mov      r8, rsi
-       call     [System.Linq.Enumerable+SelectIListIterator`2[int,int]:.ctor(System.Collections.Generic.IList`1[int],System.Func`2[int,int]):this]
-       mov      rax, rbx
-       jmp      G_M53193_IG05
+       jmp      G_M53193_IG03
 						;; size=41 bbWeight=0 PerfScore 0.00
 
-; Total bytes of code 581, prolog size 17, PerfScore 100.88, instruction count 137, allocated bytes for code 581 (MethodHash=ae9f3036) for method System.Linq.Enumerable:Select[int,int](System.Collections.Generic.IEnumerable`1[int],System.Func`2[int,int]):System.Collections.Generic.IEnumerable`1[int] (Tier1)
+; Total bytes of code 503, prolog size 17, PerfScore 90.80, instruction count 118, allocated bytes for code 503 (MethodHash=ae9f3036) for method System.Linq.Enumerable:Select[int,int](System.Collections.Generic.IEnumerable`1[int],System.Func`2[int,int]):System.Collections.Generic.IEnumerable`1[int] (Tier1)
 ; ============================================================
 
 ; Assembly listing for method System.Linq.Enumerable:Select[BenchmarkDotNet.Reports.Measurement,double](System.Collections.Generic.IEnumerable`1[BenchmarkDotNet.Reports.Measurement],System.Func`2[BenchmarkDotNet.Reports.Measurement,double]):System.Collections.Generic.IEnumerable`1[double] (Tier0)

[MicroBenchmarks]Perf_Enumerable.EmptyTakeSelectToArray()

 ; optimized using Dynamic PGO
 ; rsp based frame
 ; partially interruptible
-; with Dynamic PGO: edge weights are valid, and fgCalledCount is 37536
-; 4 inlinees with PGO data; 3 single block inlinees; 0 inlinees without PGO data
+; with Dynamic PGO: edge weights are valid, and fgCalledCount is 71792
+; 7 inlinees with PGO data; 3 single block inlinees; 0 inlinees without PGO data
 ; Final local variable assignments
 ;
 ;* V00 this         [V00    ] (  0,  0   )     ref  ->  zero-ref    this class-hnd single-def
 ;  V01 OutArgs      [V01    ] (  1,  1   )  struct (32) [rsp+00H]   do-not-enreg[XS] addr-exposed "OutgoingArgSpace"
-;  V02 tmp1         [V02,T01] (  2,  4   )     ref  ->  rdx         class-hnd single-def "dup spill"
+;  V02 tmp1         [V02,T03] (  2,  4   )     ref  ->  rdx         class-hnd single-def "dup spill"
 ;* V03 tmp2         [V03    ] (  0,  0   )     ref  ->  zero-ref    class-hnd single-def "impAppendStmt"
-;  V04 tmp3         [V04,T05] (  2,  2   )     ref  ->  rbx         single-def
-;  V05 tmp4         [V05,T03] (  4,  3   )     ref  ->  rdx        
-;  V06 tmp5         [V06,T08] (  4,  0   )     ref  ->  rsi         class-hnd exact single-def "NewObj constructor temp"
-;  V07 tmp6         [V07,T02] (  2,  4   )     ref  ->  rbx         class-hnd exact single-def "Inlining Arg"
-;  V08 tmp7         [V08,T06] (  2,  2   )     ref  ->  rbx         class-hnd "Inline return value spill temp"
-;  V09 tmp8         [V09,T07] (  2,  2   )     ref  ->  rbx         class-hnd exact single-def "Inline stloc first use temp"
-;* V10 tmp9         [V10    ] (  0,  0   )     ref  ->  zero-ref    class-hnd single-def "Inline stloc first use temp"
-;* V11 tmp10        [V11    ] (  0,  0   )     ref  ->  zero-ref    class-hnd exact "NewObj constructor temp"
-;* V12 tmp11        [V12    ] (  0,  0   )     ref  ->  zero-ref    class-hnd single-def "Inline stloc first use temp"
+;  V04 tmp3         [V04,T09] (  2,  2   )     ref  ->  rbx         single-def
+;  V05 tmp4         [V05,T05] (  4,  3   )     ref  ->  rdx        
+;  V06 tmp5         [V06,T12] (  4,  0   )     ref  ->  rsi         class-hnd exact single-def "NewObj constructor temp"
+;  V07 tmp6         [V07,T04] (  2,  4   )     ref  ->  rbx         class-hnd exact single-def "Inlining Arg"
+;  V08 tmp7         [V08,T10] (  2,  2   )     ref  ->  rbx         class-hnd "Inline return value spill temp"
+;  V09 tmp8         [V09,T11] (  2,  2   )     ref  ->  rbx         class-hnd exact single-def "Inline stloc first use temp"
+;* V10 tmp9         [V10    ] (  0,  0   )     ref  ->  zero-ref    class-hnd exact single-def "Inline stloc first use temp"
+;* V11 tmp10        [V11    ] (  0,  0   )     ref  ->  zero-ref    class-hnd exact single-def "NewObj constructor temp"
+;* V12 tmp11        [V12    ] (  0,  0   )     ref  ->  zero-ref    class-hnd "Inline stloc first use temp"
 ;* V13 tmp12        [V13    ] (  0,  0   )     ref  ->  zero-ref    class-hnd exact single-def "NewObj constructor temp"
 ;* V14 tmp13        [V14    ] (  0,  0   )     ref  ->  zero-ref    class-hnd "Inline return value spill temp"
 ;  V15 tmp14        [V15,T00] (  4,  6   )     ref  ->  rsi         class-hnd single-def "Inlining Arg"
-;  V16 tmp15        [V16,T04] (  4,  3   )     ref  ->  rax         class-hnd single-def "Inline stloc first use temp"
+;  V16 tmp15        [V16,T01] (  5,  4   )     ref  ->  rdi         class-hnd single-def "Inline stloc first use temp"
 ;* V17 tmp16        [V17    ] (  0,  0   )     ref  ->  zero-ref    "guarded devirt return temp"
-;* V18 tmp17        [V18    ] (  0,  0   )     ref  ->  zero-ref    class-hnd exact "guarded devirt this exact temp"
+;  V18 tmp17        [V18,T07] (  4,  2   )     ref  ->  rdi         class-hnd exact single-def "guarded devirt this exact temp"
+;  V19 tmp18        [V19,T06] (  5,  2   )     int  ->  rbp         "Inline stloc first use temp"
+;  V20 tmp19        [V20,T13] (  3,  0   )     ref  ->  rax         class-hnd exact single-def "Inline stloc first use temp"
+;  V21 tmp20        [V21,T14] (  2,  0   )     ref  ->  rcx         class-hnd single-def "impAppendStmt"
+;* V22 tmp21        [V22    ] (  0,  0   )  struct (16) zero-ref    "spilled call-like call argument"
+;  V23 tmp22        [V23,T08] (  4,  2   )     int  ->  rbp         "guarded devirt return temp"
+;  V24 tmp23        [V24,T02] (  3,  4   )     ref  ->  rcx         single-def "guarded devirt arg temp"
+;* V25 tmp24        [V25    ] (  0,  0   )     ref  ->  zero-ref    class-hnd exact "guarded devirt this exact temp"
+;* V26 tmp25        [V26    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp"
+;* V27 tmp26        [V27    ] (  0,  0   )   byref  ->  zero-ref    "field V22._reference (fldOffset=0x0)" P-INDEP
+;* V28 tmp27        [V28    ] (  0,  0   )     int  ->  zero-ref    "field V22._length (fldOffset=0x8)" P-INDEP
+;  V29 tmp28        [V29,T15] (  2,  0   )   byref  ->  rdx         "field V26._reference (fldOffset=0x0)" P-INDEP
+;  V30 tmp29        [V30,T17] (  2,  0   )     int  ->   r8         "field V26._length (fldOffset=0x8)" P-INDEP
+;  V31 tmp30        [V31    ] (  3,  0   )  struct (16) [rsp+28H]   do-not-enreg[XSF] must-init addr-exposed "by-value struct argument"
+;  V32 tmp31        [V32,T16] (  2,  0   )     ref  ->  rcx         single-def "argument with side effect"
 ;
-; Lcl frame size = 40
+; Lcl frame size = 56
 
 G_M60061_IG01:
+       push     rdi
        push     rsi
+       push     rbp
        push     rbx
-       sub      rsp, 40
-						;; size=6 bbWeight=1 PerfScore 2.25
+       sub      rsp, 56
+       xor      eax, eax
+       mov      qword ptr [rsp+28H], rax
+						;; size=15 bbWeight=1 PerfScore 5.50
 G_M60061_IG02:
        mov      rcx, 0xD1FFAB1E      ; const ptr
        mov      rbx, gword ptr [rcx]
@@ -217,22 +235,31 @@ G_M60061_IG03:
        call     [System.Linq.Enumerable:Select[int,int](System.Collections.Generic.IEnumerable`1[int],System.Func`2[int,int]):System.Collections.Generic.IEnumerable`1[int]]
        mov      rsi, rax
        test     rsi, rsi
-       je       SHORT G_M60061_IG06
+       je       G_M60061_IG06
        mov      rdx, rsi
        mov      rcx, 0xD1FFAB1E      ; <unknown class>
        call     [CORINFO_HELP_ISINSTANCEOFINTERFACE]
-       test     rax, rax
-       je       SHORT G_M60061_IG07
-       mov      rcx, 0xD1FFAB1E      ; System.Linq.EmptyPartition`1[int]
-       cmp      qword ptr [rax], rcx
+       mov      rdi, rax
+       test     rdi, rdi
+       je       G_M60061_IG07
+       mov      rcx, 0xD1FFAB1E      ; System.Linq.Enumerable+SelectIListIterator`2[int,int]
+       cmp      qword ptr [rdi], rcx
+       jne      G_M60061_IG10
+       mov      rcx, gword ptr [rdi+18H]
+       mov      rax, 0xD1FFAB1E      ; System.Linq.EmptyPartition`1[int]
+       cmp      qword ptr [rcx], rax
        jne      SHORT G_M60061_IG08
-						;; size=56 bbWeight=1 PerfScore 13.75
+       xor      ebp, ebp
+       jne      G_M60061_IG09
+						;; size=98 bbWeight=1 PerfScore 21.50
 G_M60061_IG04:
-       add      rsp, 40
+       add      rsp, 56
        pop      rbx
+       pop      rbp
        pop      rsi
+       pop      rdi
        ret      
-						;; size=7 bbWeight=1 PerfScore 2.25
+						;; size=9 bbWeight=1 PerfScore 3.25
 G_M60061_IG05:
        mov      rcx, 0xD1FFAB1E      ; System.Func`2[int,int]
        call     CORINFO_HELP_NEWSFAST
@@ -259,12 +286,33 @@ G_M60061_IG07:
        jmp      SHORT G_M60061_IG04
 						;; size=11 bbWeight=0 PerfScore 0.00
 G_M60061_IG08:
-       mov      rcx, rax
        mov      r11, 0xD1FFAB1E      ; code for <unknown method>
        call     [r11]<unknown method>
-       jmp      SHORT G_M60061_IG04
-						;; size=18 bbWeight=0 PerfScore 0.00
+       mov      ebp, eax
+       test     ebp, ebp
+       je       SHORT G_M60061_IG04
+						;; size=19 bbWeight=0 PerfScore 0.00
+G_M60061_IG09:
+       movsxd   rdx, ebp
+       mov      rcx, 0xD1FFAB1E      ; int[]
+       call     CORINFO_HELP_NEWARR_1_VC
+       mov      rcx, gword ptr [rdi+18H]
+       lea      rdx, bword ptr [rax+10H]
+       mov      r8d, dword ptr [rax+08H]
+       mov      bword ptr [rsp+28H], rdx
+       mov      dword ptr [rsp+30H], r8d
+       lea      rdx, [rsp+28H]
+       mov      r8, gword ptr [rdi+20H]
+       call     [System.Linq.Enumerable+SelectIListIterator`2[int,int]:Fill(System.Collections.Generic.IList`1[int],System.Span`1[int],System.Func`2[int,int])]
+       jmp      G_M60061_IG04
+						;; size=60 bbWeight=0 PerfScore 0.00
+G_M60061_IG10:
+       mov      rcx, rdi
+       mov      r11, 0xD1FFAB1E      ; code for <unknown method>
+       call     [r11]<unknown method>
+       jmp      G_M60061_IG04
+						;; size=21 bbWeight=0 PerfScore 0.00
 
-; Total bytes of code 217, prolog size 6, PerfScore 45.70, instruction count 49, allocated bytes for code 217 (MethodHash=d56b1562) for method System.Linq.Tests.Perf_Enumerable:EmptyTakeSelectToArray():this (Tier1)
+; Total bytes of code 352, prolog size 15, PerfScore 71.20, instruction count 79, allocated bytes for code 352 (MethodHash=d56b1562) for method System.Linq.Tests.Perf_Enumerable:EmptyTakeSelectToArray():this (Tier1)
 ; ============================================================
 

System.Linq.Tests.Perf_Enumerable.Contains_ElementNotFound(input: ICollection)

Hot functions:

  • (60.34%) SpanHelpers.NonPackedIndexOfValueType (Tier-1)
    • No diffs
  • (12.34%) CastHelpers.IsInstanceOfInterface (Tier-1)
    • No diffs
  • (11.49%) Array.IndexOf (Tier-1)
    • No diffs
  • (9.66%) Perf_Enumerable.Contains_ElementNotFound (Tier-1)
    • No diffs
  • (2.91%) Runnable_0.WorkloadActionUnroll (Tier-1)
    • No diffs

System.Tests.Perf_Int32.ToStringHex(value: -2147483648)

Hot functions:

  • (37.49%) Number.<FormatInt32>g__FormatInt32Slow|41_0 (Tier-1)
    • Has diffs
  • (16.98%) Number.ParseFormatSpecifier (Tier-1)
    • No diffs
  • (3.81%) Runnable_0.WorkloadActionUnroll (Tier-1)
    • No diffs
  • (1.80%) Perf_Int32.ToStringHex (Tier-1)
    • No diffs
Diffs

[System.Private.CoreLib]Number.<FormatInt32>g__FormatInt32Slow|41_0(int32,int32,class System.String,class System.IFormatProvider)

 ; optimized using Dynamic PGO
 ; rbp based frame
 ; fully interruptible
-; with Dynamic PGO: edge weights are valid, and fgCalledCount is 106864
+; with Dynamic PGO: edge weights are valid, and fgCalledCount is 101264
 ; 34 inlinees with PGO data; 0 single block inlinees; 0 inlinees without PGO data
 ; Final local variable assignments
 ;
@@ -478,9 +478,9 @@ G_M62987_IG41:
 ;  V02 arg2         [V02,T13] (  3,  3   )     ref  ->   r8         class-hnd single-def
 ;  V03 arg3         [V03,T14] (  3,  3   )     ref  ->   r9         class-hnd single-def
 ;* V04 loc0         [V04    ] (  0,  0   )  struct (16) zero-ref   
-;  V05 loc1         [V05,T30] (  5,  2.01)  ushort  ->  r13        
-;  V06 loc2         [V06    ] (  7,  3.02)     int  ->  [rbp+88H]   do-not-enreg[X] addr-exposed ld-addr-op ptr
-;  V07 loc3         [V07,T21] (  5,  4   )  ushort  ->  r12        
+;  V05 loc1         [V05,T26] (  5,  2.06)  ushort  ->  r13        
+;  V06 loc2         [V06    ] (  7,  3   )     int  ->  [rbp+88H]   do-not-enreg[X] addr-exposed ld-addr-op ptr
+;  V07 loc3         [V07,T19] (  5,  4   )  ushort  ->  r12        
 ;  V08 loc4         [V08,T45] (  3,  0   )     ref  ->  rbx         class-hnd single-def
 ;  V09 loc5         [V09,T60] (  2,  0   )    long  ->   r8        
 ;  V10 loc6         [V10    ] ( 10,  0   )  struct (32) [rbp+68H]   do-not-enreg[XS] must-init addr-exposed ld-addr-op ptr
@@ -496,35 +496,35 @@ G_M62987_IG41:
 ;* V20 tmp5         [V20    ] (  0,  0   )  struct (16) zero-ref    "Inline return value spill temp"
 ;* V21 tmp6         [V21    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "NewObj constructor temp"
 ;* V22 tmp7         [V22    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inline ldloca(s) first use temp"
-;  V23 tmp8         [V23,T23] (  2,  3.99)   byref  ->  r14         single-def "Inlining Arg"
-;  V24 tmp9         [V24,T24] (  2,  3.99)     int  ->  r15         "Inlining Arg"
+;  V23 tmp8         [V23,T21] (  2,  3.99)   byref  ->  r14         single-def "Inlining Arg"
+;  V24 tmp9         [V24,T22] (  2,  3.99)     int  ->  r15         "Inlining Arg"
 ;  V25 tmp10        [V25,T46] (  3,  0   )     ref  ->  rax         class-hnd "Inline return value spill temp"
 ;* V26 tmp11        [V26    ] (  0,  0   )     ref  ->  zero-ref    class-hnd "Inline return value spill temp"
-;  V27 tmp12        [V27,T09] (  7, 13.78)     int  ->  rbx         "Inlining Arg"
-;  V28 tmp13        [V28,T12] (  3,  6.07)     int  ->  rdi         "Inlining Arg"
-;  V29 tmp14        [V29,T25] (  3,  3.03)     int  ->  r12         "Inline stloc first use temp"
-;  V30 tmp15        [V30,T19] (  4,  4.05)     ref  ->  rax         class-hnd single-def "Inline stloc first use temp"
-;  V31 tmp16        [V31    ] (  3,  3.03)   byref  ->  [rbp+30H]   must-init pinned ptr "Inline stloc first use temp"
-;  V32 tmp17        [V32,T28] (  3,  2.02)    long  ->  rcx        
+;  V27 tmp12        [V27,T09] (  6, 11.54)     int  ->  rbx         "Inlining Arg"
+;  V28 tmp13        [V28,T12] (  3,  6.00)     int  ->  rdi         "Inlining Arg"
+;  V29 tmp14        [V29,T25] (  3,  3.00)     int  ->  r12         "Inline stloc first use temp"
+;  V30 tmp15        [V30,T23] (  4,  3.98)     ref  ->  rax         class-hnd single-def "Inline stloc first use temp"
+;  V31 tmp16        [V31    ] (  3,  2.96)   byref  ->  [rbp+30H]   must-init pinned ptr "Inline stloc first use temp"
+;  V32 tmp17        [V32,T30] (  3,  2.00)    long  ->  rcx        
 ;* V33 tmp18        [V33    ] (  0,  0   )    long  ->  zero-ref    "Inline stloc first use temp"
 ;* V34 tmp19        [V34    ] (  0,  0   )  ushort  ->  zero-ref    "Inlining Arg"
 ;* V35 tmp20        [V35    ] (  0,  0   )    long  ->  zero-ref    "Inline stloc first use temp"
 ;* V36 tmp21        [V36    ] (  0,  0   )    long  ->  zero-ref    "Inlining Arg"
 ;* V37 tmp22        [V37    ] (  0,  0   )     int  ->  zero-ref    "Inline return value spill temp"
 ;* V38 tmp23        [V38    ] (  0,  0   )    long  ->  zero-ref    "Inlining Arg"
-;  V39 tmp24        [V39,T26] (  3,  2.03)     int  ->  r12         "Inline return value spill temp"
-;  V40 tmp25        [V40,T17] (  3,  4.49)     int  ->  r12         "Inlining Arg"
-;  V41 tmp26        [V41,T02] (  7, 56.22)     int  ->  rdx         "Inlining Arg"
-;  V42 tmp27        [V42,T03] (  4, 36.14)     int  ->  rdx         "dup spill"
-;  V43 tmp28        [V43,T01] (  5, 66.61)     int  ->  rdi         "Inlining Arg"
-;  V44 tmp29        [V44,T08] (  2, 16.07)   ubyte  ->   r8         "Inline stloc first use temp"
-;  V45 tmp30        [V45,T00] (  4, 50.22)    long  ->  rcx         "Inlining Arg"
-;  V46 tmp31        [V46,T04] (  2, 32.14)    long  ->  rcx         "dup spill"
+;  V39 tmp24        [V39,T31] (  3,  2.00)     int  ->  r12         "Inline return value spill temp"
+;  V40 tmp25        [V40,T17] (  3,  4.42)     int  ->  r12         "Inlining Arg"
+;  V41 tmp26        [V41,T02] (  7, 56.24)     int  ->  rbx         "Inlining Arg"
+;  V42 tmp27        [V42,T03] (  4, 36.16)     int  ->  rbx         "dup spill"
+;  V43 tmp28        [V43,T01] (  5, 66.48)     int  ->  rdi         "Inlining Arg"
+;  V44 tmp29        [V44,T08] (  2, 16.08)   ubyte  ->  rdx         "Inline stloc first use temp"
+;  V45 tmp30        [V45,T00] (  4, 50.24)    long  ->  rcx         "Inlining Arg"
+;  V46 tmp31        [V46,T04] (  2, 32.16)    long  ->  rcx         "dup spill"
 ;* V47 tmp32        [V47,T11] (  0,  0   )    long  ->  zero-ref    ptr
-;  V48 tmp33        [V48,T05] (  4, 24.11)     int  ->   r8        
+;  V48 tmp33        [V48,T05] (  4, 24.12)     int  ->  rdx        
 ;* V49 tmp34        [V49,T10] (  0,  0   )    long  ->  zero-ref    ptr
-;  V50 tmp35        [V50,T06] (  3, 16.07)     int  ->   r8        
-;  V51 tmp36        [V51,T07] (  3, 16.07)     int  ->  r10        
+;  V50 tmp35        [V50,T06] (  3, 16.08)     int  ->  rdx        
+;  V51 tmp36        [V51,T07] (  3, 16.08)     int  ->   r8        
 ;* V52 tmp37        [V52    ] (  0,  0   )     int  ->  zero-ref    "Inlining Arg"
 ;* V53 tmp38        [V53    ] (  0,  0   )     int  ->  zero-ref    "Inlining Arg"
 ;  V54 tmp39        [V54,T47] (  3,  0   )     ref  ->  rbx         class-hnd "Inline return value spill temp"
@@ -558,15 +558,15 @@ G_M62987_IG41:
 ;* V82 tmp67        [V82    ] (  0,  0   )     int  ->  zero-ref    "Inlining Arg"
 ;* V83 tmp68        [V83    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg"
 ;  V84 tmp69        [V84,T48] (  3,  0   )     ref  ->  rdx         class-hnd single-def "Inline stloc first use temp"
-;  V85 tmp70        [V85,T20] (  6,  4   )     ref  ->  rax         "Single return block return value"
-;  V86 tmp71        [V86,T31] (  3,  2   )   byref  ->  r14         single-def "field V04._reference (fldOffset=0x0)" P-INDEP
-;  V87 tmp72        [V87,T33] (  3,  2   )     int  ->  r15         "field V04._length (fldOffset=0x8)" P-INDEP
+;  V85 tmp70        [V85,T18] (  6,  4.00)     ref  ->  rax         "Single return block return value"
+;  V86 tmp71        [V86,T28] (  3,  2   )   byref  ->  r14         single-def "field V04._reference (fldOffset=0x0)" P-INDEP
+;  V87 tmp72        [V87,T32] (  3,  2   )     int  ->  r15         "field V04._length (fldOffset=0x8)" P-INDEP
 ;  V88 tmp73        [V88    ] (  2,  0   )   byref  ->  [rbp+38H]   do-not-enreg[X] addr-exposed "field V14._reference (fldOffset=0x0)" P-DEP
 ;  V89 tmp74        [V89    ] (  2,  0   )     int  ->  [rbp+40H]   do-not-enreg[X] addr-exposed "field V14._length (fldOffset=0x8)" P-DEP
 ;  V90 tmp75        [V90,T56] (  2,  0   )   byref  ->  rdx         single-def "field V18._reference (fldOffset=0x0)" P-INDEP
 ;* V91 tmp76        [V91,T69] (  0,  0   )     int  ->  zero-ref    ptr "field V18._length (fldOffset=0x8)" P-INDEP
-;  V92 tmp77        [V92,T32] (  3,  2.00)   byref  ->  r14         "field V20._reference (fldOffset=0x0)" P-INDEP
-;  V93 tmp78        [V93,T34] (  3,  2.00)     int  ->  r15         "field V20._length (fldOffset=0x8)" P-INDEP
+;  V92 tmp77        [V92,T29] (  3,  2.00)   byref  ->  r14         "field V20._reference (fldOffset=0x0)" P-INDEP
+;  V93 tmp78        [V93,T33] (  3,  2.00)     int  ->  r15         "field V20._length (fldOffset=0x8)" P-INDEP
 ;  V94 tmp79        [V94,T35] (  2,  1.99)   byref  ->  r14         single-def "field V21._reference (fldOffset=0x0)" P-INDEP
 ;  V95 tmp80        [V95,T36] (  2,  1.99)     int  ->  r15         "field V21._length (fldOffset=0x8)" P-INDEP
 ;* V96 tmp81        [V96    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V22._reference (fldOffset=0x0)" P-INDEP
@@ -586,15 +586,15 @@ G_M62987_IG41:
 ;  V110 tmp95       [V110,T59] (  2,  0   )   byref  ->  rax         single-def "field V83._reference (fldOffset=0x0)" P-INDEP
 ;* V111 tmp96       [V111    ] (  0,  0   )     int  ->  zero-ref    "field V83._length (fldOffset=0x8)" P-INDEP
 ;  V112 tmp97       [V112    ] (  6,  6   )  struct (16) [rbp+20H]   do-not-enreg[XSF] must-init addr-exposed ptr "by-value struct argument"
-;  V113 tmp98       [V113,T18] (  2,  4.06)    long  ->  rcx         "Cast away GC"
+;  V113 tmp98       [V113,T24] (  2,  3.92)    long  ->  rcx         "Cast away GC"
 ;  V114 tmp99       [V114    ] (  3,  0   )  struct (16) [rbp+10H]   do-not-enreg[XSF] must-init addr-exposed ptr "by-value struct argument"
 ;  V115 tmp100      [V115,T67] (  2,  0   )    long  ->  rcx         "Cast away GC"
 ;  V116 tmp101      [V116,T68] (  2,  0   )    long  ->  rax         "Cast away GC"
 ;  V117 tmp102      [V117    ] (  3,  0   )  struct (16) [rbp+00H]   do-not-enreg[XSF] must-init addr-exposed ptr "by-value struct argument"
 ;  V118 GsCookie    [V118    ] (  1,  1   )    long  ->  [rbp+A0H]   do-not-enreg[X] addr-exposed "GSSecurityCookie"
-;  V119 tmp104      [V119,T27] (  7,  2.02)     int  ->  rdi         "shadowVar"
-;  V120 tmp105      [V120,T29] (  3,  2.02)     int  ->  rsi         "shadowVar"
-;  V121 tmp106      [V121,T22] (  4,  3.99)     ref  ->   r8         single-def "shadowVar"
+;  V119 tmp104      [V119,T27] (  7,  2   )     int  ->  rdi         "shadowVar"
+;  V120 tmp105      [V120,T34] (  3,  2   )     int  ->  rsi         "shadowVar"
+;  V121 tmp106      [V121,T20] (  4,  3.99)     ref  ->   r8         single-def "shadowVar"
 ;  V122 tmp107      [V122,T37] (  5,  1   )     ref  ->  rbx         single-def "shadowVar"
 ;
 ; Lcl frame size = 216
@@ -644,10 +644,10 @@ G_M62987_IG04:
        mov      r12d, r13d
        and      r12d, 0xFFDF
        cmp      r12d, 71
-       je       G_M62987_IG25
+       je       G_M62987_IG27
        cmp      r12d, 68
        jne      SHORT G_M62987_IG12
-       jmp      G_M62987_IG26
+       jmp      G_M62987_IG28
 						;; size=59 bbWeight=1 PerfScore 11.25
 G_M62987_IG05:
        xor      r14, r14
@@ -655,44 +655,48 @@ G_M62987_IG05:
        jmp      SHORT G_M62987_IG04
 						;; size=8 bbWeight=0.00 PerfScore 0.01
 G_M62987_IG06:
-       mov      r10d, 48
-						;; size=6 bbWeight=8.03 PerfScore 2.01
+       mov      r8d, 48
+						;; size=6 bbWeight=7.98 PerfScore 2.00
 G_M62987_IG07:
-       add      r8d, r10d
-       mov      word  ptr [rcx], r8w
+       add      edx, r8d
+       mov      word  ptr [rcx], dx
        shr      edi, 4
-       dec      edx
+       dec      ebx
        js       SHORT G_M62987_IG10
-						;; size=14 bbWeight=8.04 PerfScore 24.11
+						;; size=13 bbWeight=8.04 PerfScore 24.12
 G_M62987_IG08:
-       mov      r8d, edi
-       and      r8d, 15
+       mov      edx, edi
+       and      edx, 15
        add      rcx, -2
-       cmp      r8d, 10
+       cmp      edx, 10
        jl       SHORT G_M62987_IG06
-						;; size=17 bbWeight=8.04 PerfScore 16.07
+						;; size=14 bbWeight=8.04 PerfScore 16.08
 G_M62987_IG09:
-       jmp      SHORT G_M62987_IG21
-						;; size=2 bbWeight=0.01 PerfScore 0.02
+       jmp      SHORT G_M62987_IG23
+						;; size=2 bbWeight=0.06 PerfScore 0.11
 G_M62987_IG10:
        test     edi, edi
        jne      SHORT G_M62987_IG08
-						;; size=4 bbWeight=8.19 PerfScore 10.24
+						;; size=4 bbWeight=8.12 PerfScore 10.15
 G_M62987_IG11:
-       xor      r10d, r10d
-       mov      bword ptr [rbp+30H], r10
-       jmp      SHORT G_M62987_IG22
-						;; size=9 bbWeight=1 PerfScore 3.25
+       xor      r8d, r8d
+       mov      bword ptr [rbp+30H], r8
+       jmp      SHORT G_M62987_IG24
+						;; size=9 bbWeight=1.00 PerfScore 3.25
 G_M62987_IG12:
        cmp      r12d, 88
-       jne      G_M62987_IG30
+       jne      G_M62987_IG32
 						;; size=10 bbWeight=1 PerfScore 1.25
 G_M62987_IG13:
        and      edi, esi
        mov      ebx, dword ptr [rbp+88H]
-       mov      ecx, 1
        test     ebx, ebx
-       cmovle   ebx, ecx
+       jg       SHORT G_M62987_IG15
+						;; size=12 bbWeight=1.00 PerfScore 2.50
+G_M62987_IG14:
+       mov      ebx, 1
+						;; size=5 bbWeight=0.98 PerfScore 0.24
+G_M62987_IG15:
        mov      ecx, edi
        or       rcx, 1
        xor      r12d, r12d
@@ -701,54 +705,53 @@ G_M62987_IG13:
        sar      r12d, 2
        inc      r12d
        cmp      ebx, r12d
-       jl       SHORT G_M62987_IG20
-						;; size=48 bbWeight=1.02 PerfScore 7.12
-G_M62987_IG14:
+       jl       SHORT G_M62987_IG22
+						;; size=30 bbWeight=1.00 PerfScore 5.00
+G_M62987_IG16:
        mov      r12d, ebx
-						;; size=3 bbWeight=0.80 PerfScore 0.20
-G_M62987_IG15:
+						;; size=3 bbWeight=0.79 PerfScore 0.20
+G_M62987_IG17:
        mov      ecx, r12d
        call     <unknown method>
        test     rax, rax
-       je       SHORT G_M62987_IG19
-						;; size=13 bbWeight=1.02 PerfScore 2.54
-G_M62987_IG16:
+       je       SHORT G_M62987_IG21
+						;; size=13 bbWeight=1.00 PerfScore 2.50
+G_M62987_IG18:
        lea      rcx, bword ptr [rax+0CH]
        mov      bword ptr [rbp+30H], rcx
        mov      rcx, bword ptr [rbp+30H]
-						;; size=12 bbWeight=1.02 PerfScore 2.54
-G_M62987_IG17:
+						;; size=12 bbWeight=0.98 PerfScore 2.45
+G_M62987_IG19:
        movsxd   rdx, r12d
        lea      rcx, [rcx+2*rdx]
-       mov      edx, ebx
-       dec      edx
+       dec      ebx
        js       SHORT G_M62987_IG10
-						;; size=13 bbWeight=1 PerfScore 2.25
-G_M62987_IG18:
-       jmp      G_M62987_IG08
-						;; size=5 bbWeight=0.89 PerfScore 1.79
-G_M62987_IG19:
-       xor      ecx, ecx
-       jmp      SHORT G_M62987_IG17
-						;; size=4 bbWeight=0.00 PerfScore 0.00
+						;; size=11 bbWeight=1.00 PerfScore 2.00
 G_M62987_IG20:
-       jmp      SHORT G_M62987_IG15
-						;; size=2 bbWeight=0.21 PerfScore 0.43
+       jmp      SHORT G_M62987_IG08
+						;; size=2 bbWeight=0.89 PerfScore 1.78
 G_M62987_IG21:
-       lea      r10d, [r13-21H]
-       movzx    r10, r10w
-       jmp      G_M62987_IG07
-						;; size=13 bbWeight=0.01 PerfScore 0.02
+       xor      ecx, ecx
+       jmp      SHORT G_M62987_IG19
+						;; size=4 bbWeight=0.02 PerfScore 0.04
 G_M62987_IG22:
+       jmp      SHORT G_M62987_IG17
+						;; size=2 bbWeight=0.21 PerfScore 0.42
+G_M62987_IG23:
+       lea      r8d, [r13-21H]
+       movzx    r8, r8w
+       jmp      G_M62987_IG07
+						;; size=13 bbWeight=0.06 PerfScore 0.15
+G_M62987_IG24:
        mov      rcx, 0xD1FFAB1E
        cmp      qword ptr [rbp+A0H], rcx
-       je       SHORT G_M62987_IG23
+       je       SHORT G_M62987_IG25
        call     CORINFO_HELP_FAIL_FAST
-						;; size=24 bbWeight=1 PerfScore 4.25
-G_M62987_IG23:
+						;; size=24 bbWeight=1.00 PerfScore 4.25
+G_M62987_IG25:
        nop      
-						;; size=1 bbWeight=1 PerfScore 0.25
-G_M62987_IG24:
+						;; size=1 bbWeight=1.00 PerfScore 0.25
+G_M62987_IG26:
        lea      rsp, [rbp+A8H]
        pop      rbx
        pop      rsi
@@ -759,59 +762,59 @@ G_M62987_IG24:
        pop      r15
        pop      rbp
        ret      
-						;; size=20 bbWeight=1 PerfScore 5.50
-G_M62987_IG25:
+						;; size=20 bbWeight=1.00 PerfScore 5.50
+G_M62987_IG27:
        cmp      dword ptr [rbp+88H], 0
        jg       G_M62987_IG12
 						;; size=13 bbWeight=1 PerfScore 3.00
-G_M62987_IG26:
+G_M62987_IG28:
        test     edi, edi
-       jge      SHORT G_M62987_IG29
+       jge      SHORT G_M62987_IG31
        mov      esi, dword ptr [rbp+88H]
        test     rbx, rbx
-       je       SHORT G_M62987_IG27
+       je       SHORT G_M62987_IG29
        mov      rcx, rbx
        call     [System.Globalization.NumberFormatInfo:<GetInstance>g__GetProviderNonNull|58_0(System.IFormatProvider):System.Globalization.NumberFormatInfo]
-       jmp      SHORT G_M62987_IG28
+       jmp      SHORT G_M62987_IG30
 						;; size=26 bbWeight=0 PerfScore 0.00
-G_M62987_IG27:
+G_M62987_IG29:
        call     [System.Globalization.NumberFormatInfo:get_CurrentInfo():System.Globalization.NumberFormatInfo]
 						;; size=6 bbWeight=0 PerfScore 0.00
-G_M62987_IG28:
+G_M62987_IG30:
        mov      r8, gword ptr [rax+28H]
        mov      ecx, edi
        mov      edx, esi
        call     [System.Number:NegativeInt32ToDecStr(int,int,System.String):System.String]
-       jmp      SHORT G_M62987_IG22
+       jmp      SHORT G_M62987_IG24
 						;; size=16 bbWeight=0 PerfScore 0.00
-G_M62987_IG29:
+G_M62987_IG31:
        mov      ecx, edi
        mov      edx, dword ptr [rbp+88H]
        call     [System.Number:UInt32ToDecStr(uint,int):System.String]
-       jmp      SHORT G_M62987_IG22
+       jmp      SHORT G_M62987_IG24
 						;; size=16 bbWeight=0 PerfScore 0.00
-G_M62987_IG30:
+G_M62987_IG32:
        cmp      r12d, 66
-       jne      SHORT G_M62987_IG31
+       jne      SHORT G_M62987_IG33
        mov      ecx, edi
        and      ecx, esi
        mov      edx, dword ptr [rbp+88H]
        call     [System.Number:UInt32ToBinaryStr(uint,int):System.String]
-       jmp      G_M62987_IG22
+       jmp      G_M62987_IG24
 						;; size=27 bbWeight=0 PerfScore 0.00
-G_M62987_IG31:
+G_M62987_IG33:
        test     rbx, rbx
-       je       SHORT G_M62987_IG32
+       je       SHORT G_M62987_IG34
        mov      rcx, rbx
        call     [System.Globalization.NumberFormatInfo:<GetInstance>g__GetProviderNonNull|58_0(System.IFormatProvider):System.Globalization.NumberFormatInfo]
        mov      rbx, rax
-       jmp      SHORT G_M62987_IG33
+       jmp      SHORT G_M62987_IG35
 						;; size=19 bbWeight=0 PerfScore 0.00
-G_M62987_IG32:
+G_M62987_IG34:
        call     [System.Globalization.NumberFormatInfo:get_CurrentInfo():System.Globalization.NumberFormatInfo]
        mov      rbx, rax
 						;; size=9 bbWeight=0 PerfScore 0.00
-G_M62987_IG33:
+G_M62987_IG35:
        lea      r8, [rbp+90H]
        mov      bword ptr [rbp+10H], r8
        mov      dword ptr [rbp+18H], 11
@@ -822,22 +825,22 @@ G_M62987_IG33:
        mov      edx, edi
        mov      dword ptr [rbp+68H], 10
        test     edx, edx
-       jl       SHORT G_M62987_IG34
+       jl       SHORT G_M62987_IG36
        mov      byte  ptr [rbp+70H], 0
-       jmp      SHORT G_M62987_IG35
+       jmp      SHORT G_M62987_IG37
 						;; size=56 bbWeight=0 PerfScore 0.00
-G_M62987_IG34:
+G_M62987_IG36:
        mov      byte  ptr [rbp+70H], 1
        neg      edx
 						;; size=6 bbWeight=0 PerfScore 0.00
-G_M62987_IG35:
+G_M62987_IG37:
        mov      rcx, bword ptr [rbp+78H]
        lea      rax, [rcx+0AH]
        xor      r8d, r8d
        cmp      edx, 100
-       jb       SHORT G_M62987_IG37
+       jb       SHORT G_M62987_IG39
 						;; size=16 bbWeight=0 PerfScore 0.00
-G_M62987_IG36:
+G_M62987_IG38:
        add      rax, -2
        add      r8d, -2
        mov      r10d, edx
@@ -852,13 +855,13 @@ G_M62987_IG36:
        mov      word  ptr [rax], dx
        cmp      r10d, 100
        mov      edx, r10d
-       jae      SHORT G_M62987_IG36
+       jae      SHORT G_M62987_IG38
 						;; size=62 bbWeight=0 PerfScore 0.00
-G_M62987_IG37:
+G_M62987_IG39:
        test     edx, edx
-       je       SHORT G_M62987_IG39
+       je       SHORT G_M62987_IG41
 						;; size=4 bbWeight=0 PerfScore 0.00
-G_M62987_IG38:
+G_M62987_IG40:
        dec      r8d
        mov      r10d, 0xD1FFAB1E
        mov      r9d, edx
@@ -873,20 +876,20 @@ G_M62987_IG38:
        add      r11d, 48
        mov      byte  ptr [rax], r11b
        test     edx, edx
-       jne      SHORT G_M62987_IG38
+       jne      SHORT G_M62987_IG40
 						;; size=50 bbWeight=0 PerfScore 0.00
-G_M62987_IG39:
+G_M62987_IG41:
        test     r8d, r8d
-       jg       SHORT G_M62987_IG38
+       jg       SHORT G_M62987_IG40
        mov      rdx, rax
        add      rcx, 10
        sub      rcx, rdx
        mov      dword ptr [rbp+68H], ecx
        mov      dword ptr [rbp+6CH], ecx
        mov      rax, bword ptr [rbp+78H]
-       jmp      SHORT G_M62987_IG41
+       jmp      SHORT G_M62987_IG43
 						;; size=27 bbWeight=0 PerfScore 0.00
-G_M62987_IG40:
+G_M62987_IG42:
        lea      r8, [rax+01H]
        lea      r10, [rdx+01H]
        movzx    rdx, byte  ptr [rdx]
@@ -894,9 +897,9 @@ G_M62987_IG40:
        mov      rax, r8
        mov      rdx, r10
 						;; size=19 bbWeight=0 PerfScore 0.00
-G_M62987_IG41:
+G_M62987_IG43:
        dec      ecx
-       jns      SHORT G_M62987_IG40
+       jns      SHORT G_M62987_IG42
        mov      byte  ptr [rax], 0
        test     dword ptr [rsp], esp
        sub      rsp, 64
@@ -907,16 +910,16 @@ G_M62987_IG41:
        lea      rcx, [rbp+48H]
        call     [System.Collections.Generic.ValueListBuilder`1[ushort]:.ctor(System.Span`1[ushort]):this]
        test     r13d, r13d
-       je       SHORT G_M62987_IG42
+       je       SHORT G_M62987_IG44
        mov      gword ptr [rsp+20H], rbx
        lea      rcx, [rbp+48H]
        lea      rdx, [rbp+68H]
        mov      r8d, r13d
        mov      r9d, dword ptr [rbp+88H]
        call     [<unknown method>]
-       jmp      SHORT G_M62987_IG43
+       jmp      SHORT G_M62987_IG45
 						;; size=80 bbWeight=0 PerfScore 0.00
-G_M62987_IG42:
+G_M62987_IG44:
        mov      bword ptr [rbp+20H], r14
        mov      dword ptr [rbp+28H], r15d
        lea      r8, [rbp+20H]
@@ -925,7 +928,7 @@ G_M62987_IG42:
        mov      r9, rbx
        call     [<unknown method>]
 						;; size=29 bbWeight=0 PerfScore 0.00
-G_M62987_IG43:
+G_M62987_IG45:
        lea      rcx, [rbp+48H]
        lea      rdx, [rbp+38H]
        call     [System.Collections.Generic.ValueListBuilder`1[ushort]:AsSpan():System.ReadOnlySpan`1[ushort]:this]
@@ -934,7 +937,7 @@ G_M62987_IG43:
        mov      rbx, rax
        mov      rdx, gword ptr [rbp+48H]
        test     rdx, rdx
-       je       SHORT G_M62987_IG44
+       je       SHORT G_M62987_IG46
        xor      rcx, rcx
        mov      gword ptr [rbp+48H], rcx
        mov      rcx, 0xD1FFAB1E      ; const ptr
@@ -942,11 +945,11 @@ G_M62987_IG43:
        xor      r8d, r8d
        call     [<unknown method>]
 						;; size=64 bbWeight=0 PerfScore 0.00
-G_M62987_IG44:
+G_M62987_IG46:
        mov      rax, rbx
-       jmp      G_M62987_IG22
+       jmp      G_M62987_IG24
 						;; size=8 bbWeight=0 PerfScore 0.00
 
-; Total bytes of code 965, prolog size 105, PerfScore 221.92, instruction count 259, allocated bytes for code 965 (MethodHash=69a809f4) for method System.Number:<FormatInt32>g__FormatInt32Slow|41_0(int,int,System.String,System.IFormatProvider):System.String (Tier1)
+; Total bytes of code 955, prolog size 105, PerfScore 221.33, instruction count 258, allocated bytes for code 955 (MethodHash=69a809f4) for method System.Number:<FormatInt32>g__FormatInt32Slow|41_0(int,int,System.String,System.IFormatProvider):System.String (Tier1)
 ; ============================================================
 

System.Tests.Perf_Int32.ToStringHex(value: 2147483647)

Hot functions:

  • (36.56%) Number.<FormatInt32>g__FormatInt32Slow|41_0 (Tier-1)
    • Has diffs
  • (11.12%) Number.ParseFormatSpecifier (Tier-1)
    • No diffs
  • (1.94%) Runnable_0.WorkloadActionUnroll (Tier-1)
    • No diffs
  • (1.28%) Perf_Int32.ToStringHex (Tier-1)
    • No diffs
Diffs

[System.Private.CoreLib]Number.<FormatInt32>g__FormatInt32Slow|41_0(int32,int32,class System.String,class System.IFormatProvider)

 ; optimized using Dynamic PGO
 ; rbp based frame
 ; fully interruptible
-; with Dynamic PGO: edge weights are valid, and fgCalledCount is 109520
+; with Dynamic PGO: edge weights are valid, and fgCalledCount is 106400
 ; 34 inlinees with PGO data; 0 single block inlinees; 0 inlinees without PGO data
 ; Final local variable assignments
 ;
-;  V00 arg0         [V00,T16] (  3,  3   )     int  ->  rcx         single-def
-;  V01 arg1         [V01,T17] (  3,  3   )     int  ->  rdx         single-def
-;  V02 arg2         [V02,T14] (  3,  3   )     ref  ->   r8         class-hnd single-def
-;  V03 arg3         [V03,T15] (  3,  3   )     ref  ->   r9         class-hnd single-def
+;  V00 arg0         [V00,T17] (  3,  3   )     int  ->  rcx         single-def
+;  V01 arg1         [V01,T18] (  3,  3   )     int  ->  rdx         single-def
+;  V02 arg2         [V02,T15] (  3,  3   )     ref  ->   r8         class-hnd single-def
+;  V03 arg3         [V03,T16] (  3,  3   )     ref  ->   r9         class-hnd single-def
 ;* V04 loc0         [V04    ] (  0,  0   )  struct (16) zero-ref   
-;  V05 loc1         [V05,T10] (  5,  8.98)  ushort  ->  r13        
+;  V05 loc1         [V05,T10] (  5,  8.96)  ushort  ->  r13        
 ;  V06 loc2         [V06    ] (  7,  3   )     int  ->  [rbp+88H]   do-not-enreg[X] addr-exposed ld-addr-op ptr
 ;  V07 loc3         [V07,T20] (  5,  4   )  ushort  ->  r12        
 ;  V08 loc4         [V08,T45] (  3,  0   )     ref  ->  rbx         class-hnd single-def
@@ -500,31 +500,31 @@ G_M62987_IG41:
 ;  V24 tmp9         [V24,T24] (  2,  3.99)     int  ->  r15         "Inlining Arg"
 ;  V25 tmp10        [V25,T46] (  3,  0   )     ref  ->  rax         class-hnd "Inline return value spill temp"
 ;* V26 tmp11        [V26    ] (  0,  0   )     ref  ->  zero-ref    class-hnd "Inline return value spill temp"
-;  V27 tmp12        [V27,T09] (  6, 11.51)     int  ->  rbx         "Inlining Arg"
-;  V28 tmp13        [V28,T13] (  3,  6.00)     int  ->  rdi         "Inlining Arg"
-;  V29 tmp14        [V29,T26] (  3,  3.00)     int  ->  r12         "Inline stloc first use temp"
+;  V27 tmp12        [V27,T09] (  7, 14   )     int  ->  rbx         "Inlining Arg"
+;  V28 tmp13        [V28,T13] (  3,  6   )     int  ->  rdi         "Inlining Arg"
+;  V29 tmp14        [V29,T26] (  3,  3   )     int  ->  r12         "Inline stloc first use temp"
 ;  V30 tmp15        [V30,T22] (  4,  3.99)     ref  ->  rax         class-hnd single-def "Inline stloc first use temp"
 ;  V31 tmp16        [V31    ] (  3,  2.98)   byref  ->  [rbp+30H]   must-init pinned ptr "Inline stloc first use temp"
-;  V32 tmp17        [V32,T30] (  3,  2.00)    long  ->  rcx        
+;  V32 tmp17        [V32,T30] (  3,  2   )    long  ->  rcx        
 ;* V33 tmp18        [V33    ] (  0,  0   )    long  ->  zero-ref    "Inline stloc first use temp"
 ;* V34 tmp19        [V34    ] (  0,  0   )  ushort  ->  zero-ref    "Inlining Arg"
 ;* V35 tmp20        [V35    ] (  0,  0   )    long  ->  zero-ref    "Inline stloc first use temp"
 ;* V36 tmp21        [V36    ] (  0,  0   )    long  ->  zero-ref    "Inlining Arg"
 ;* V37 tmp22        [V37    ] (  0,  0   )     int  ->  zero-ref    "Inline return value spill temp"
 ;* V38 tmp23        [V38    ] (  0,  0   )    long  ->  zero-ref    "Inlining Arg"
-;  V39 tmp24        [V39,T31] (  3,  2.00)     int  ->  r12         "Inline return value spill temp"
-;  V40 tmp25        [V40,T18] (  3,  4.42)     int  ->  r12         "Inlining Arg"
-;  V41 tmp26        [V41,T02] (  7, 55.91)     int  ->  rbx         "Inlining Arg"
-;  V42 tmp27        [V42,T03] (  4, 35.94)     int  ->  rbx         "dup spill"
-;  V43 tmp28        [V43,T01] (  5, 65.96)     int  ->  rdi         "Inlining Arg"
-;  V44 tmp29        [V44,T08] (  2, 15.97)   ubyte  ->  rdx         "Inline stloc first use temp"
-;  V45 tmp30        [V45,T00] (  4, 49.91)    long  ->  rcx         "Inlining Arg"
-;  V46 tmp31        [V46,T04] (  2, 31.94)    long  ->  rcx         "dup spill"
+;  V39 tmp24        [V39,T34] (  2,  2   )     int  ->  r12         "Inline return value spill temp"
+;  V40 tmp25        [V40,T14] (  3,  6   )     int  ->  rcx         "Inlining Arg"
+;  V41 tmp26        [V41,T02] (  7, 55.73)     int  ->  rdx         "Inlining Arg"
+;  V42 tmp27        [V42,T03] (  4, 35.82)     int  ->  rdx         "dup spill"
+;  V43 tmp28        [V43,T01] (  5, 65.69)     int  ->  rdi         "Inlining Arg"
+;  V44 tmp29        [V44,T08] (  2, 15.91)   ubyte  ->   r8         "Inline stloc first use temp"
+;  V45 tmp30        [V45,T00] (  4, 49.73)    long  ->  rcx         "Inlining Arg"
+;  V46 tmp31        [V46,T04] (  2, 31.82)    long  ->  rcx         "dup spill"
 ;* V47 tmp32        [V47,T12] (  0,  0   )    long  ->  zero-ref    ptr
-;  V48 tmp33        [V48,T05] (  4, 23.95)     int  ->  rdx        
+;  V48 tmp33        [V48,T05] (  4, 23.87)     int  ->   r8        
 ;* V49 tmp34        [V49,T11] (  0,  0   )    long  ->  zero-ref    ptr
-;  V50 tmp35        [V50,T06] (  3, 15.97)     int  ->  rdx        
-;  V51 tmp36        [V51,T07] (  3, 15.97)     int  ->   r8        
+;  V50 tmp35        [V50,T06] (  3, 15.91)     int  ->   r8        
+;  V51 tmp36        [V51,T07] (  3, 15.91)     int  ->  r10        
 ;* V52 tmp37        [V52    ] (  0,  0   )     int  ->  zero-ref    "Inlining Arg"
 ;* V53 tmp38        [V53    ] (  0,  0   )     int  ->  zero-ref    "Inlining Arg"
 ;  V54 tmp39        [V54,T47] (  3,  0   )     ref  ->  rbx         class-hnd "Inline return value spill temp"
@@ -558,15 +558,15 @@ G_M62987_IG41:
 ;* V82 tmp67        [V82    ] (  0,  0   )     int  ->  zero-ref    "Inlining Arg"
 ;* V83 tmp68        [V83    ] (  0,  0   )  struct (16) zero-ref    ld-addr-op "Inlining Arg"
 ;  V84 tmp69        [V84,T48] (  3,  0   )     ref  ->  rdx         class-hnd single-def "Inline stloc first use temp"
-;  V85 tmp70        [V85,T19] (  6,  4.00)     ref  ->  rax         "Single return block return value"
+;  V85 tmp70        [V85,T19] (  6,  4   )     ref  ->  rax         "Single return block return value"
 ;  V86 tmp71        [V86,T28] (  3,  2   )   byref  ->  r14         single-def "field V04._reference (fldOffset=0x0)" P-INDEP
-;  V87 tmp72        [V87,T32] (  3,  2   )     int  ->  r15         "field V04._length (fldOffset=0x8)" P-INDEP
+;  V87 tmp72        [V87,T31] (  3,  2   )     int  ->  r15         "field V04._length (fldOffset=0x8)" P-INDEP
 ;  V88 tmp73        [V88    ] (  2,  0   )   byref  ->  [rbp+38H]   do-not-enreg[X] addr-exposed "field V14._reference (fldOffset=0x0)" P-DEP
 ;  V89 tmp74        [V89    ] (  2,  0   )     int  ->  [rbp+40H]   do-not-enreg[X] addr-exposed "field V14._length (fldOffset=0x8)" P-DEP
 ;  V90 tmp75        [V90,T56] (  2,  0   )   byref  ->  rdx         single-def "field V18._reference (fldOffset=0x0)" P-INDEP
 ;* V91 tmp76        [V91,T69] (  0,  0   )     int  ->  zero-ref    ptr "field V18._length (fldOffset=0x8)" P-INDEP
 ;  V92 tmp77        [V92,T29] (  3,  2.00)   byref  ->  r14         "field V20._reference (fldOffset=0x0)" P-INDEP
-;  V93 tmp78        [V93,T33] (  3,  2.00)     int  ->  r15         "field V20._length (fldOffset=0x8)" P-INDEP
+;  V93 tmp78        [V93,T32] (  3,  2.00)     int  ->  r15         "field V20._length (fldOffset=0x8)" P-INDEP
 ;  V94 tmp79        [V94,T35] (  2,  1.99)   byref  ->  r14         single-def "field V21._reference (fldOffset=0x0)" P-INDEP
 ;  V95 tmp80        [V95,T36] (  2,  1.99)     int  ->  r15         "field V21._length (fldOffset=0x8)" P-INDEP
 ;* V96 tmp81        [V96    ] (  0,  0   )   byref  ->  zero-ref    single-def "field V22._reference (fldOffset=0x0)" P-INDEP
@@ -586,14 +586,14 @@ G_M62987_IG41:
 ;  V110 tmp95       [V110,T59] (  2,  0   )   byref  ->  rax         single-def "field V83._reference (fldOffset=0x0)" P-INDEP
 ;* V111 tmp96       [V111    ] (  0,  0   )     int  ->  zero-ref    "field V83._length (fldOffset=0x8)" P-INDEP
 ;  V112 tmp97       [V112    ] (  6,  6   )  struct (16) [rbp+20H]   do-not-enreg[XSF] must-init addr-exposed ptr "by-value struct argument"
-;  V113 tmp98       [V113,T25] (  2,  3.96)    long  ->  rcx         "Cast away GC"
+;  V113 tmp98       [V113,T25] (  2,  3.95)    long  ->  rcx         "Cast away GC"
 ;  V114 tmp99       [V114    ] (  3,  0   )  struct (16) [rbp+10H]   do-not-enreg[XSF] must-init addr-exposed ptr "by-value struct argument"
 ;  V115 tmp100      [V115,T67] (  2,  0   )    long  ->  rcx         "Cast away GC"
 ;  V116 tmp101      [V116,T68] (  2,  0   )    long  ->  rax         "Cast away GC"
 ;  V117 tmp102      [V117    ] (  3,  0   )  struct (16) [rbp+00H]   do-not-enreg[XSF] must-init addr-exposed ptr "by-value struct argument"
 ;  V118 GsCookie    [V118    ] (  1,  1   )    long  ->  [rbp+A0H]   do-not-enreg[X] addr-exposed "GSSecurityCookie"
 ;  V119 tmp104      [V119,T27] (  7,  2   )     int  ->  rdi         "shadowVar"
-;  V120 tmp105      [V120,T34] (  3,  2   )     int  ->  rsi         "shadowVar"
+;  V120 tmp105      [V120,T33] (  3,  2   )     int  ->  rsi         "shadowVar"
 ;  V121 tmp106      [V121,T21] (  4,  3.99)     ref  ->   r8         single-def "shadowVar"
 ;  V122 tmp107      [V122,T37] (  5,  1   )     ref  ->  rbx         single-def "shadowVar"
 ;
@@ -647,7 +647,7 @@ G_M62987_IG04:
        je       SHORT G_M62987_IG07
        cmp      r12d, 68
        jne      SHORT G_M62987_IG08
-       jmp      G_M62987_IG41
+       jmp      G_M62987_IG35
 						;; size=55 bbWeight=1 PerfScore 11.25
 G_M62987_IG05:
        xor      r14, r14
@@ -655,93 +655,83 @@ G_M62987_IG05:
        jmp      SHORT G_M62987_IG04
 						;; size=8 bbWeight=0.00 PerfScore 0.01
 G_M62987_IG06:
-       mov      r8d, 48
-       jmp      G_M62987_IG18
-						;; size=11 bbWeight=1.00 PerfScore 2.25
+       mov      r10d, 48
+       jmp      G_M62987_IG13
+						;; size=11 bbWeight=0.99 PerfScore 2.24
 G_M62987_IG07:
        cmp      dword ptr [rbp+88H], 0
-       jle      G_M62987_IG41
+       jle      G_M62987_IG35
 						;; size=13 bbWeight=1 PerfScore 3.00
 G_M62987_IG08:
        cmp      r12d, 88
-       jne      G_M62987_IG26
-						;; size=10 bbWeight=1 PerfScore 1.25
-G_M62987_IG09:
+       jne      G_M62987_IG20
        and      edi, esi
        mov      ebx, dword ptr [rbp+88H]
+       mov      ecx, 1
        test     ebx, ebx
-       jg       SHORT G_M62987_IG11
-						;; size=12 bbWeight=1.00 PerfScore 2.50
-G_M62987_IG10:
-       mov      ebx, 1
-						;; size=5 bbWeight=0.97 PerfScore 0.24
-G_M62987_IG11:
+       cmovle   ebx, ecx
        mov      ecx, edi
        or       rcx, 1
-       xor      r12d, r12d
-       lzcnt    r12, rcx
-       xor      r12d, 63
-       sar      r12d, 2
-       inc      r12d
-       cmp      ebx, r12d
-       jl       G_M62987_IG24
-						;; size=34 bbWeight=1.00 PerfScore 5.00
-G_M62987_IG12:
-       mov      r12d, ebx
-						;; size=3 bbWeight=0.79 PerfScore 0.20
-G_M62987_IG13:
+       lzcnt    rcx, rcx
+       xor      ecx, 63
+       sar      ecx, 2
+       inc      ecx
+       cmp      ebx, ecx
+       mov      r12d, ecx
+       cmovge   r12d, ebx
        mov      ecx, r12d
        call     <unknown method>
        test     rax, rax
-       je       SHORT G_M62987_IG25
-						;; size=13 bbWeight=1.00 PerfScore 2.50
-G_M62987_IG14:
+       je       SHORT G_M62987_IG19
+						;; size=69 bbWeight=1 PerfScore 10.00
+G_M62987_IG09:
        lea      rcx, bword ptr [rax+0CH]
        mov      bword ptr [rbp+30H], rcx
        mov      rcx, bword ptr [rbp+30H]
 						;; size=12 bbWeight=0.99 PerfScore 2.47
-G_M62987_IG15:
+G_M62987_IG10:
        movsxd   rdx, r12d
        lea      rcx, [rcx+2*rdx]
-       dec      ebx
-       js       SHORT G_M62987_IG19
-						;; size=11 bbWeight=1.00 PerfScore 2.00
-G_M62987_IG16:
-       mov      edx, edi
-       and      edx, 15
+       mov      edx, ebx
+       dec      edx
+       js       SHORT G_M62987_IG14
+						;; size=13 bbWeight=1 PerfScore 2.25
+G_M62987_IG11:
+       mov      r8d, edi
+       and      r8d, 15
        add      rcx, -2
-       cmp      edx, 10
+       cmp      r8d, 10
        jl       G_M62987_IG06
-						;; size=18 bbWeight=7.98 PerfScore 15.97
-G_M62987_IG17:
-       lea      r8d, [r13-21H]
-       movzx    r8, r8w
-						;; size=8 bbWeight=6.98 PerfScore 5.24
-G_M62987_IG18:
-       add      edx, r8d
-       mov      word  ptr [rcx], dx
+						;; size=21 bbWeight=7.96 PerfScore 15.91
+G_M62987_IG12:
+       lea      r10d, [r13-21H]
+       movzx    r10, r10w
+						;; size=8 bbWeight=6.96 PerfScore 5.22
+G_M62987_IG13:
+       add      r8d, r10d
+       mov      word  ptr [rcx], r8w
        shr      edi, 4
-       dec      ebx
-       jns      SHORT G_M62987_IG16
-						;; size=13 bbWeight=7.98 PerfScore 23.95
-G_M62987_IG19:
+       dec      edx
+       jns      SHORT G_M62987_IG11
+						;; size=14 bbWeight=7.96 PerfScore 23.87
+G_M62987_IG14:
        test     edi, edi
-       jne      SHORT G_M62987_IG16
-						;; size=4 bbWeight=8.03 PerfScore 10.03
-G_M62987_IG20:
+       jne      SHORT G_M62987_IG11
+						;; size=4 bbWeight=7.98 PerfScore 9.97
+G_M62987_IG15:
        xor      ecx, ecx
        mov      bword ptr [rbp+30H], rcx
-						;; size=6 bbWeight=1.00 PerfScore 1.25
-G_M62987_IG21:
+						;; size=6 bbWeight=1 PerfScore 1.25
+G_M62987_IG16:
        mov      rcx, 0xD1FFAB1E
        cmp      qword ptr [rbp+A0H], rcx
-       je       SHORT G_M62987_IG22
+       je       SHORT G_M62987_IG17
        call     CORINFO_HELP_FAIL_FAST
-						;; size=24 bbWeight=1.00 PerfScore 4.25
-G_M62987_IG22:
+						;; size=24 bbWeight=1 PerfScore 4.25
+G_M62987_IG17:
        nop      
-						;; size=1 bbWeight=1.00 PerfScore 0.25
-G_M62987_IG23:
+						;; size=1 bbWeight=1 PerfScore 0.25
+G_M62987_IG18:
        lea      rsp, [rbp+A8H]
        pop      rbx
        pop      rsi
@@ -752,36 +742,33 @@ G_M62987_IG23:
        pop      r15
        pop      rbp
        ret      
-						;; size=20 bbWeight=1.00 PerfScore 5.50
-G_M62987_IG24:
-       jmp      G_M62987_IG13
-						;; size=5 bbWeight=0.21 PerfScore 0.42
-G_M62987_IG25:
+						;; size=20 bbWeight=1 PerfScore 5.50
+G_M62987_IG19:
        xor      ecx, ecx
-       jmp      SHORT G_M62987_IG15
-						;; size=4 bbWeight=0.01 PerfScore 0.02
-G_M62987_IG26:
+       jmp      SHORT G_M62987_IG10
+						;; size=4 bbWeight=0.01 PerfScore 0.03
+G_M62987_IG20:
        cmp      r12d, 66
-       jne      SHORT G_M62987_IG27
+       jne      SHORT G_M62987_IG21
        mov      ecx, edi
        and      ecx, esi
        mov      edx, dword ptr [rbp+88H]
        call     [System.Number:UInt32ToBinaryStr(uint,int):System.String]
-       jmp      SHORT G_M62987_IG21
+       jmp      SHORT G_M62987_IG16
 						;; size=24 bbWeight=0 PerfScore 0.00
-G_M62987_IG27:
+G_M62987_IG21:
        test     rbx, rbx
-       je       SHORT G_M62987_IG28
+       je       SHORT G_M62987_IG22
        mov      rcx, rbx
        call     [System.Globalization.NumberFormatInfo:<GetInstance>g__GetProviderNonNull|58_0(System.IFormatProvider):System.Globalization.NumberFormatInfo]
        mov      rbx, rax
-       jmp      SHORT G_M62987_IG29
+       jmp      SHORT G_M62987_IG23
 						;; size=19 bbWeight=0 PerfScore 0.00
-G_M62987_IG28:
+G_M62987_IG22:
        call     [System.Globalization.NumberFormatInfo:get_CurrentInfo():System.Globalization.NumberFormatInfo]
        mov      rbx, rax
 						;; size=9 bbWeight=0 PerfScore 0.00
-G_M62987_IG29:
+G_M62987_IG23:
        lea      r8, [rbp+90H]
        mov      bword ptr [rbp+10H], r8
        mov      dword ptr [rbp+18H], 11
@@ -792,22 +779,22 @@ G_M62987_IG29:
        mov      edx, edi
        mov      dword ptr [rbp+68H], 10
        test     edx, edx
-       jl       SHORT G_M62987_IG30
+       jl       SHORT G_M62987_IG24
        mov      byte  ptr [rbp+70H], 0
-       jmp      SHORT G_M62987_IG31
+       jmp      SHORT G_M62987_IG25
 						;; size=56 bbWeight=0 PerfScore 0.00
-G_M62987_IG30:
+G_M62987_IG24:
        mov      byte  ptr [rbp+70H], 1
        neg      edx
 						;; size=6 bbWeight=0 PerfScore 0.00
-G_M62987_IG31:
+G_M62987_IG25:
        mov      rcx, bword ptr [rbp+78H]
        lea      rax, [rcx+0AH]
        xor      r8d, r8d
        cmp      edx, 100
-       jb       SHORT G_M62987_IG33
+       jb       SHORT G_M62987_IG27
 						;; size=16 bbWeight=0 PerfScore 0.00
-G_M62987_IG32:
+G_M62987_IG26:
        add      rax, -2
        add      r8d, -2
        mov      r10d, edx
@@ -822,13 +809,13 @@ G_M62987_IG32:
        mov      word  ptr [rax], dx
        cmp      r10d, 100
        mov      edx, r10d
-       jae      SHORT G_M62987_IG32
+       jae      SHORT G_M62987_IG26
 						;; size=62 bbWeight=0 PerfScore 0.00
-G_M62987_IG33:
+G_M62987_IG27:
        test     edx, edx
-       je       SHORT G_M62987_IG35
+       je       SHORT G_M62987_IG29
 						;; size=4 bbWeight=0 PerfScore 0.00
-G_M62987_IG34:
+G_M62987_IG28:
        dec      r8d
        mov      r10d, 0xD1FFAB1E
        mov      r9d, edx
@@ -843,20 +830,20 @@ G_M62987_IG34:
        add      r11d, 48
        mov      byte  ptr [rax], r11b
        test     edx, edx
-       jne      SHORT G_M62987_IG34
+       jne      SHORT G_M62987_IG28
 						;; size=50 bbWeight=0 PerfScore 0.00
-G_M62987_IG35:
+G_M62987_IG29:
        test     r8d, r8d
-       jg       SHORT G_M62987_IG34
+       jg       SHORT G_M62987_IG28
        mov      rdx, rax
        add      rcx, 10
        sub      rcx, rdx
        mov      dword ptr [rbp+68H], ecx
        mov      dword ptr [rbp+6CH], ecx
        mov      rax, bword ptr [rbp+78H]
-       jmp      SHORT G_M62987_IG37
+       jmp      SHORT G_M62987_IG31
 						;; size=27 bbWeight=0 PerfScore 0.00
-G_M62987_IG36:
+G_M62987_IG30:
        lea      r8, [rax+01H]
        lea      r10, [rdx+01H]
        movzx    rdx, byte  ptr [rdx]
@@ -864,9 +851,9 @@ G_M62987_IG36:
        mov      rax, r8
        mov      rdx, r10
 						;; size=19 bbWeight=0 PerfScore 0.00
-G_M62987_IG37:
+G_M62987_IG31:
        dec      ecx
-       jns      SHORT G_M62987_IG36
+       jns      SHORT G_M62987_IG30
        mov      byte  ptr [rax], 0
        test     dword ptr [rsp], esp
        sub      rsp, 64
@@ -877,16 +864,16 @@ G_M62987_IG37:
        lea      rcx, [rbp+48H]
        call     [System.Collections.Generic.ValueListBuilder`1[ushort]:.ctor(System.Span`1[ushort]):this]
        test     r13d, r13d
-       je       SHORT G_M62987_IG38
+       je       SHORT G_M62987_IG32
        mov      gword ptr [rsp+20H], rbx
        lea      rcx, [rbp+48H]
        lea      rdx, [rbp+68H]
        mov      r8d, r13d
        mov      r9d, dword ptr [rbp+88H]
        call     [<unknown method>]
-       jmp      SHORT G_M62987_IG39
+       jmp      SHORT G_M62987_IG33
 						;; size=80 bbWeight=0 PerfScore 0.00
-G_M62987_IG38:
+G_M62987_IG32:
        mov      bword ptr [rbp+20H], r14
        mov      dword ptr [rbp+28H], r15d
        lea      r8, [rbp+20H]
@@ -895,7 +882,7 @@ G_M62987_IG38:
        mov      r9, rbx
        call     [<unknown method>]
 						;; size=29 bbWeight=0 PerfScore 0.00
-G_M62987_IG39:
+G_M62987_IG33:
        lea      rcx, [rbp+48H]
        lea      rdx, [rbp+38H]
        call     [System.Collections.Generic.ValueListBuilder`1[ushort]:AsSpan():System.ReadOnlySpan`1[ushort]:this]
@@ -904,7 +891,7 @@ G_M62987_IG39:
        mov      rbx, rax
        mov      rdx, gword ptr [rbp+48H]
        test     rdx, rdx
-       je       SHORT G_M62987_IG40
+       je       SHORT G_M62987_IG34
        xor      rcx, rcx
        mov      gword ptr [rbp+48H], rcx
        mov      rcx, 0xD1FFAB1E      ; const ptr
@@ -912,37 +899,37 @@ G_M62987_IG39:
        xor      r8d, r8d
        call     [<unknown method>]
 						;; size=64 bbWeight=0 PerfScore 0.00
-G_M62987_IG40:
+G_M62987_IG34:
        mov      rax, rbx
-       jmp      G_M62987_IG21
+       jmp      G_M62987_IG16
 						;; size=8 bbWeight=0 PerfScore 0.00
-G_M62987_IG41:
+G_M62987_IG35:
        test     edi, edi
-       jge      SHORT G_M62987_IG44
+       jge      SHORT G_M62987_IG38
        mov      esi, dword ptr [rbp+88H]
        test     rbx, rbx
-       je       SHORT G_M62987_IG42
+       je       SHORT G_M62987_IG36
        mov      rcx, rbx
        call     [System.Globalization.NumberFormatInfo:<GetInstance>g__GetProviderNonNull|58_0(System.IFormatProvider):System.Globalization.NumberFormatInfo]
-       jmp      SHORT G_M62987_IG43
+       jmp      SHORT G_M62987_IG37
 						;; size=26 bbWeight=0 PerfScore 0.00
-G_M62987_IG42:
+G_M62987_IG36:
        call     [System.Globalization.NumberFormatInfo:get_CurrentInfo():System.Globalization.NumberFormatInfo]
 						;; size=6 bbWeight=0 PerfScore 0.00
-G_M62987_IG43:
+G_M62987_IG37:
        mov      r8, gword ptr [rax+28H]
        mov      ecx, edi
        mov      edx, esi
        call     [System.Number:NegativeInt32ToDecStr(int,int,System.String):System.String]
-       jmp      G_M62987_IG21
+       jmp      G_M62987_IG16
 						;; size=19 bbWeight=0 PerfScore 0.00
-G_M62987_IG44:
+G_M62987_IG38:
        mov      ecx, edi
        mov      edx, dword ptr [rbp+88H]
        call     [System.Number:UInt32ToDecStr(uint,int):System.String]
-       jmp      G_M62987_IG21
+       jmp      G_M62987_IG16
 						;; size=19 bbWeight=0 PerfScore 0.00
 
-; Total bytes of code 958, prolog size 105, PerfScore 222.68, instruction count 255, allocated bytes for code 958 (MethodHash=69a809f4) for method System.Number:<FormatInt32>g__FormatInt32Slow|41_0(int,int,System.String,System.IFormatProvider):System.String (Tier1)
+; Total bytes of code 951, prolog size 105, PerfScore 219.89, instruction count 254, allocated bytes for code 951 (MethodHash=69a809f4) for method System.Number:<FormatInt32>g__FormatInt32Slow|41_0(int,int,System.String,System.IFormatProvider):System.String (Tier1)
 ; ============================================================
 

System.Text.Perf_Ascii.ToUpperInPlace_Bytes(Size: 128)

Hot functions:

  • (76.09%) Ascii.ChangeCase (Tier-1)
    • Has diffs
  • (19.32%) Perf_Ascii.ToUpperInPlace_Bytes (Tier-1)
    • No diffs
Diffs

[System.Private.CoreLib]Ascii.ChangeCase(!!0*,!!1*,unsigned int)

 ; optimized using Dynamic PGO
 ; rsp based frame
 ; fully interruptible
-; with Dynamic PGO: edge weights are valid, and fgCalledCount is 1992704
+; with Dynamic PGO: edge weights are valid, and fgCalledCount is 1230848
 ; 25 inlinees with PGO data; 9 single block inlinees; 20 inlinees without PGO data
 ; Final local variable assignments
 ;
-;  V00 arg0         [V00,T03] (  7, 10.82)    long  ->  rcx         single-def
-;  V01 arg1         [V01,T02] (  8, 11.85)    long  ->  rdx         single-def
-;  V02 arg2         [V02,T01] ( 10, 14.83)    long  ->   r8         single-def
-;* V03 loc0         [V03,T15] (  0,  0   )    bool  ->  zero-ref   
-;* V04 loc1         [V04,T16] (  0,  0   )    bool  ->  zero-ref   
-;* V05 loc2         [V05,T17] (  0,  0   )    bool  ->  zero-ref   
+;  V00 arg0         [V00,T03] (  7,  9.94)    long  ->  rcx         single-def
+;  V01 arg1         [V01,T02] (  8, 10.94)    long  ->  rdx         single-def
+;  V02 arg2         [V02,T01] ( 11, 11.97)    long  ->   r8         single-def
+;* V03 loc0         [V03,T06] (  0,  0   )    bool  ->  zero-ref   
+;* V04 loc1         [V04,T07] (  0,  0   )    bool  ->  zero-ref   
+;* V05 loc2         [V05,T08] (  0,  0   )    bool  ->  zero-ref   
 ;* V06 loc3         [V06    ] (  0,  0   )    bool  ->  zero-ref   
-;* V07 loc4         [V07,T18] (  0,  0   )    bool  ->  zero-ref   
-;* V08 loc5         [V08,T19] (  0,  0   )    bool  ->  zero-ref   
-;* V09 loc6         [V09,T20] (  0,  0   )     int  ->  zero-ref   
-;  V10 loc7         [V10,T00] ( 26, 46.12)    long  ->  rax        
-;  V11 loc8         [V11,T22] (  8, 35.32)  simd16  ->  mm0        
-;* V12 loc9         [V12,T06] (  0,  0   )   ubyte  ->  zero-ref   
-;  V13 loc10        [V13,T23] (  3,  9.85)  simd16  ->  mm2        
-;  V14 loc11        [V14,T24] (  3,  9.85)  simd16  ->  mm3        
-;  V15 loc12        [V15,T25] (  3,  9.85)  simd16  ->  mm4        
+;* V07 loc4         [V07,T09] (  0,  0   )    bool  ->  zero-ref   
+;* V08 loc5         [V08,T10] (  0,  0   )    bool  ->  zero-ref   
+;* V09 loc6         [V09,T11] (  0,  0   )     int  ->  zero-ref   
+;  V10 loc7         [V10,T00] ( 27, 39.76)    long  ->  rax        
+;  V11 loc8         [V11,T22] (  8, 31.78)  simd16  ->  mm0        
+;* V12 loc9         [V12,T13] (  0,  0   )   ubyte  ->  zero-ref   
+;  V13 loc10        [V13,T23] (  3,  8.94)  simd16  ->  mm2        
+;  V14 loc11        [V14,T24] (  3,  8.94)  simd16  ->  mm3        
+;  V15 loc12        [V15,T25] (  3,  8.94)  simd16  ->  mm4        
 ;* V16 loc13        [V16    ] (  0,  0   )  simd16  ->  zero-ref   
 ;* V17 loc14        [V17    ] (  0,  0   )     int  ->  zero-ref   
 ;  V18 loc15        [V18,T27] (  7,  0   )    long  ->  r10        
@@ -2045,38 +2045,38 @@ RWD00  	dq	00FF00FF00FF00FFh, 00FF00FF00FF00FFh
 ;* V26 loc23        [V26    ] (  0,  0   )  simd16  ->  zero-ref   
 ;  V27 loc24        [V27,T29] (  6,  0   )     int  ->  r10        
 ;# V28 OutArgs      [V28    ] (  1,  1   )  struct ( 0) [rsp+00H]   do-not-enreg[XS] addr-exposed "OutgoingArgSpace"
-;* V29 tmp1         [V29,T21] (  0,  0   )     int  ->  zero-ref   
+;* V29 tmp1         [V29,T12] (  0,  0   )     int  ->  zero-ref   
 ;* V30 tmp2         [V30    ] (  0,  0   )     int  ->  zero-ref   
 ;  V31 tmp3         [V31,T30] (  2,  0   )     int  ->  r10        
 ;* V32 tmp4         [V32    ] (  0,  0   )    long  ->  zero-ref   
 ;  V33 tmp5         [V33,T31] (  2,  0   )    long  ->  r10        
-;  V34 tmp6         [V34,T04] (  2,  2.04)     int  ->  rax        
+;  V34 tmp6         [V34,T04] (  2,  1.99)     int  ->  rax        
 ;* V35 tmp7         [V35    ] (  0,  0   )    bool  ->  zero-ref    "Inline return value spill temp"
 ;* V36 tmp8         [V36    ] (  0,  0   )    bool  ->  zero-ref    "Inline return value spill temp"
 ;* V37 tmp9         [V37,T05] (  0,  0   )     int  ->  zero-ref    "Inlining Arg"
-;* V38 tmp10        [V38,T07] (  0,  0   )   ubyte  ->  zero-ref    ld-addr-op "Inline ldloca(s) first use temp"
+;* V38 tmp10        [V38,T14] (  0,  0   )   ubyte  ->  zero-ref    ld-addr-op "Inline ldloca(s) first use temp"
 ;* V39 tmp11        [V39    ] (  0,  0   )    bool  ->  zero-ref    "Inline return value spill temp"
 ;* V40 tmp12        [V40    ] (  0,  0   )    bool  ->  zero-ref    "Inline return value spill temp"
-;* V41 tmp13        [V41,T08] (  0,  0   )   ubyte  ->  zero-ref    "Inline stloc first use temp"
+;* V41 tmp13        [V41,T15] (  0,  0   )   ubyte  ->  zero-ref    "Inline stloc first use temp"
 ;* V42 tmp14        [V42    ] (  0,  0   )   ubyte  ->  zero-ref    ld-addr-op "Inline ldloca(s) first use temp"
 ;* V43 tmp15        [V43    ] (  0,  0   )    bool  ->  zero-ref    "Inline return value spill temp"
 ;* V44 tmp16        [V44    ] (  0,  0   )  ushort  ->  zero-ref    "Inline stloc first use temp"
 ;* V45 tmp17        [V45    ] (  0,  0   )    bool  ->  zero-ref    "Inline return value spill temp"
 ;* V46 tmp18        [V46    ] (  0,  0   )   ubyte  ->  zero-ref    "Inlining Arg"
-;* V47 tmp19        [V47,T09] (  0,  0   )   ubyte  ->  zero-ref    ld-addr-op "Inline ldloca(s) first use temp"
+;* V47 tmp19        [V47,T16] (  0,  0   )   ubyte  ->  zero-ref    ld-addr-op "Inline ldloca(s) first use temp"
 ;* V48 tmp20        [V48    ] (  0,  0   )    bool  ->  zero-ref    "Inline return value spill temp"
-;* V49 tmp21        [V49,T10] (  0,  0   )  ushort  ->  zero-ref    "Inline stloc first use temp"
+;* V49 tmp21        [V49,T17] (  0,  0   )  ushort  ->  zero-ref    "Inline stloc first use temp"
 ;* V50 tmp22        [V50    ] (  0,  0   )    bool  ->  zero-ref    "Inline return value spill temp"
 ;* V51 tmp23        [V51    ] (  0,  0   )   ubyte  ->  zero-ref    "Inlining Arg"
-;* V52 tmp24        [V52,T11] (  0,  0   )   ubyte  ->  zero-ref    ld-addr-op "Inline ldloca(s) first use temp"
+;* V52 tmp24        [V52,T18] (  0,  0   )   ubyte  ->  zero-ref    ld-addr-op "Inline ldloca(s) first use temp"
 ;* V53 tmp25        [V53    ] (  0,  0   )    bool  ->  zero-ref    "Inline return value spill temp"
 ;* V54 tmp26        [V54    ] (  0,  0   )    bool  ->  zero-ref    "Inline return value spill temp"
-;* V55 tmp27        [V55,T12] (  0,  0   )   ubyte  ->  zero-ref    "Inline stloc first use temp"
+;* V55 tmp27        [V55,T19] (  0,  0   )   ubyte  ->  zero-ref    "Inline stloc first use temp"
 ;* V56 tmp28        [V56    ] (  0,  0   )   ubyte  ->  zero-ref    "Inlining Arg"
-;* V57 tmp29        [V57,T13] (  0,  0   )   ubyte  ->  zero-ref    ld-addr-op "Inline ldloca(s) first use temp"
+;* V57 tmp29        [V57,T20] (  0,  0   )   ubyte  ->  zero-ref    ld-addr-op "Inline ldloca(s) first use temp"
 ;* V58 tmp30        [V58    ] (  0,  0   )    bool  ->  zero-ref    "Inline return value spill temp"
 ;* V59 tmp31        [V59    ] (  0,  0   )    bool  ->  zero-ref    "Inline return value spill temp"
-;* V60 tmp32        [V60,T14] (  0,  0   )   ubyte  ->  zero-ref    "Inline stloc first use temp"
+;* V60 tmp32        [V60,T21] (  0,  0   )   ubyte  ->  zero-ref    "Inline stloc first use temp"
 ;* V61 tmp33        [V61    ] (  0,  0   )  simd16  ->  zero-ref    "Inline return value spill temp"
 ;* V62 tmp34        [V62    ] (  0,  0   )  simd16  ->  zero-ref    "Inlining Arg"
 ;* V63 tmp35        [V63    ] (  0,  0   )    bool  ->  zero-ref    "Inline return value spill temp"
@@ -2134,7 +2134,7 @@ RWD00  	dq	00FF00FF00FF00FFh, 00FF00FF00FF00FFh
 ;* V115 tmp87       [V115    ] (  0,  0   )    bool  ->  zero-ref    "Inline return value spill temp"
 ;* V116 tmp88       [V116    ] (  0,  0   )     int  ->  zero-ref    "Inline stloc first use temp"
 ;* V117 tmp89       [V117    ] (  0,  0   )    bool  ->  zero-ref    "Inline return value spill temp"
-;  V118 cse0        [V118,T26] (  3,  9.83)  simd16  ->  mm1         "CSE - aggressive"
+;  V118 cse0        [V118,T26] (  3,  8.94)  simd16  ->  mm1         "CSE - aggressive"
 ;
 ; Lcl frame size = 0
 
@@ -2144,15 +2144,13 @@ G_M50565_IG01:
 G_M50565_IG02:
        xor      eax, eax
        cmp      r8, 16
-       jb       G_M50565_IG11
-						;; size=12 bbWeight=1.01 PerfScore 1.51
+       jb       G_M50565_IG08
+						;; size=12 bbWeight=1.01 PerfScore 1.52
 G_M50565_IG03:
        vmovups  xmm0, xmmword ptr [rcx]
        vmovups  xmm1, xmmword ptr [reloc @RWD00]
        vptest   xmm0, xmm1
-       jne      G_M50565_IG11
-						;; size=23 bbWeight=1.01 PerfScore 11.06
-G_M50565_IG04:
+       jne      G_M50565_IG08
        mov      eax, 225
        vmovd    xmm2, eax
        vpbroadcastb xmm2, xmm2
@@ -2168,89 +2166,60 @@ G_M50565_IG04:
        mov      r10d, 16
        sub      r10d, eax
        mov      eax, r10d
-       align    [0 bytes for IG05]
-						;; size=67 bbWeight=1.02 PerfScore 14.26
-G_M50565_IG05:
+       align    [0 bytes for IG04]
+						;; size=90 bbWeight=1.00 PerfScore 24.93
+G_M50565_IG04:
        mov      r10, r8
        sub      r10, rax
        cmp      r10, 16
-       jb       SHORT G_M50565_IG07
-						;; size=12 bbWeight=8.82 PerfScore 15.43
-G_M50565_IG06:
+       jb       SHORT G_M50565_IG06
+						;; size=12 bbWeight=7.93 PerfScore 13.88
+G_M50565_IG05:
        vmovups  xmm0, xmmword ptr [rcx+rax]
        vptest   xmm0, xmm1
-       jne      SHORT G_M50565_IG11
+       jne      SHORT G_M50565_IG08
        vpsubb   xmm5, xmm0, xmm2
        vpcmpgtb xmm5, xmm3, xmm5
        vpand    xmm5, xmm5, xmm4
        vpxor    xmm0, xmm0, xmm5
        vmovups  xmmword ptr [rdx+rax], xmm0
        add      rax, 16
-       jmp      SHORT G_M50565_IG05
-						;; size=39 bbWeight=7.82 PerfScore 107.48
+       jmp      SHORT G_M50565_IG04
+						;; size=39 bbWeight=6.95 PerfScore 95.52
+G_M50565_IG06:
+       cmp      rax, r8
+       jne      SHORT G_M50565_IG11
+						;; size=5 bbWeight=0.99 PerfScore 1.23
 G_M50565_IG07:
-       cmp      rax, r8
-       je       SHORT G_M50565_IG10
-						;; size=5 bbWeight=2.00 PerfScore 2.51
-G_M50565_IG08:
-       mov      rax, r8
-       sub      rax, 16
-       jmp      SHORT G_M50565_IG06
-						;; size=9 bbWeight=1.00 PerfScore 2.51
-G_M50565_IG09:
-       cmp      rax, r8
-       jb       SHORT G_M50565_IG14
-						;; size=5 bbWeight=0.00 PerfScore 0.00
-G_M50565_IG10:
        ret      
 						;; size=1 bbWeight=1 PerfScore 1.00
-G_M50565_IG11:
+G_M50565_IG08:
        mov      r10, r8
        sub      r10, rax
        cmp      r10, 8
-       jae      SHORT G_M50565_IG16
-						;; size=12 bbWeight=0.00 PerfScore 0.00
-G_M50565_IG12:
+       jae      SHORT G_M50565_IG12
+						;; size=12 bbWeight=0.01 PerfScore 0.03
+G_M50565_IG09:
        mov      r10, r8
        sub      r10, rax
        cmp      r10, 4
-       jb       SHORT G_M50565_IG09
-						;; size=12 bbWeight=0.00 PerfScore 0.00
-G_M50565_IG13:
-       mov      r10d, dword ptr [rcx+rax]
-       test     r10d, 0xD1FFAB1E
-       jne      SHORT G_M50565_IG09
-       lea      r9d, [r10+D1FFAB1EH]
-       lea      r11d, [r10+D1FFAB1EH]
-       xor      r9d, r11d
-       and      r9d, 0xD1FFAB1E
-       shr      r9d, 2
-       xor      r10d, r9d
-       mov      dword ptr [rdx+rax], r10d
-       add      rax, 4
+       jae      SHORT G_M50565_IG13
+						;; size=12 bbWeight=0.01 PerfScore 0.03
+G_M50565_IG10:
        cmp      rax, r8
-       jae      SHORT G_M50565_IG10
-						;; size=57 bbWeight=0 PerfScore 0.00
-G_M50565_IG14:
-       movzx    r10, byte  ptr [rcx+rax]
-       cmp      r10d, 127
-       ja       SHORT G_M50565_IG10
-       lea      r9d, [r10-61H]
-       cmp      r9d, 25
-       ja       SHORT G_M50565_IG15
-       add      r10d, -32
-						;; size=25 bbWeight=0 PerfScore 0.00
-G_M50565_IG15:
-       movzx    r10, r10b
-       mov      byte  ptr [rdx+rax], r10b
-       inc      rax
-       jmp      SHORT G_M50565_IG09
-						;; size=13 bbWeight=0 PerfScore 0.00
-G_M50565_IG16:
+       jb       G_M50565_IG14
+       jmp      SHORT G_M50565_IG07
+						;; size=11 bbWeight=0.01 PerfScore 0.05
+G_M50565_IG11:
+       mov      rax, r8
+       sub      rax, 16
+       jmp      SHORT G_M50565_IG05
+						;; size=9 bbWeight=0.00 PerfScore 0.00
+G_M50565_IG12:
        mov      r10, qword ptr [rcx+rax]
        mov      r9, 0xD1FFAB1E
        test     r10, r9
-       jne      SHORT G_M50565_IG12
+       jne      SHORT G_M50565_IG09
        mov      r9, 0xD1FFAB1E
        add      r9, r10
        mov      r11, 0xD1FFAB1E
@@ -2262,13 +2231,46 @@ G_M50565_IG16:
        xor      r10, r9
        mov      qword ptr [rdx+rax], r10
        add      rax, 8
-       jmp      G_M50565_IG12
-						;; size=81 bbWeight=0 PerfScore 0.00
+       mov      r10, r8
+       sub      r10, rax
+       cmp      r10, 4
+       jb       SHORT G_M50565_IG10
+						;; size=88 bbWeight=0 PerfScore 0.00
+G_M50565_IG13:
+       mov      r10d, dword ptr [rcx+rax]
+       test     r10d, 0xD1FFAB1E
+       jne      SHORT G_M50565_IG10
+       lea      r9d, [r10+D1FFAB1EH]
+       lea      r11d, [r10+D1FFAB1EH]
+       xor      r9d, r11d
+       and      r9d, 0xD1FFAB1E
+       shr      r9d, 2
+       xor      r10d, r9d
+       mov      dword ptr [rdx+rax], r10d
+       add      rax, 4
+       cmp      rax, r8
+       jae      G_M50565_IG07
+						;; size=61 bbWeight=0 PerfScore 0.00
+G_M50565_IG14:
+       movzx    r10, byte  ptr [rcx+rax]
+       cmp      r10d, 127
+       ja       G_M50565_IG07
+       lea      r9d, [r10-61H]
+       cmp      r9d, 25
+       ja       SHORT G_M50565_IG15
+       add      r10d, -32
+						;; size=29 bbWeight=0 PerfScore 0.00
+G_M50565_IG15:
+       movzx    r10, r10b
+       mov      byte  ptr [rdx+rax], r10b
+       inc      rax
+       jmp      G_M50565_IG10
+						;; size=16 bbWeight=0 PerfScore 0.00
 RWD00  	dq	8080808080808080h, 8080808080808080h
 RWD16  	dq	9A9A9A9A9A9A9A9Ah, 9A9A9A9A9A9A9A9Ah
 RWD32  	dq	2020202020202020h, 2020202020202020h
 
 
-; Total bytes of code 376, prolog size 3, PerfScore 194.36, instruction count 94, allocated bytes for code 376 (MethodHash=bf9e3a7a) for method System.Text.Ascii:ChangeCase[ubyte,ubyte,System.Text.Ascii+ToUpperConversion](ulong,ulong,ulong):ulong (Tier1)
+; Total bytes of code 400, prolog size 3, PerfScore 179.19, instruction count 98, allocated bytes for code 400 (MethodHash=bf9e3a7a) for method System.Text.Ascii:ChangeCase[ubyte,ubyte,System.Text.Ascii+ToUpperConversion](ulong,ulong,ulong):ulong (Tier1)
 ; ============================================================
 

System.Text.Perf_Ascii.ToLowerInPlace_Chars(Size: 128)

Hot functions:

  • (80.76%) Ascii.ChangeCase (Tier-1)
    • Has diffs
  • (14.32%) Perf_Ascii.ToLowerInPlace_Chars (Tier-1)
    • No diffs
Diffs

[System.Private.CoreLib]Ascii.ChangeCase(!!0*,!!1*,unsigned int)

 ; optimized using Dynamic PGO
 ; rsp based frame
 ; fully interruptible
-; with Dynamic PGO: edge weights are valid, and fgCalledCount is 1786368
+; with Dynamic PGO: edge weights are valid, and fgCalledCount is 2046208
 ; 44 inlinees with PGO data; 6 single block inlinees; 4 inlinees without PGO data
 ; Final local variable assignments
 ;
-;  V00 arg0         [V00,T03] (  7, 18.82)    long  ->  rcx         single-def
-;  V01 arg1         [V01,T02] (  8, 19.85)    long  ->  rdx         single-def
-;  V02 arg2         [V02,T01] ( 10, 22.82)    long  ->   r8         single-def
+;  V00 arg0         [V00,T03] (  7, 17.96)    long  ->  rcx         single-def
+;  V01 arg1         [V01,T02] (  8, 18.98)    long  ->  rdx         single-def
+;  V02 arg2         [V02,T01] ( 11, 19.97)    long  ->   r8         single-def
 ;* V03 loc0         [V03,T15] (  0,  0   )    bool  ->  zero-ref   
 ;* V04 loc1         [V04    ] (  0,  0   )    bool  ->  zero-ref   
 ;* V05 loc2         [V05,T16] (  0,  0   )    bool  ->  zero-ref   
@@ -2094,12 +2094,12 @@ RWD00  	dq	00FF00FF00FF00FFh, 00FF00FF00FF00FFh
 ;* V07 loc4         [V07,T17] (  0,  0   )    bool  ->  zero-ref   
 ;* V08 loc5         [V08,T18] (  0,  0   )    bool  ->  zero-ref   
 ;* V09 loc6         [V09,T19] (  0,  0   )     int  ->  zero-ref   
-;  V10 loc7         [V10,T00] ( 26, 86.11)    long  ->  rax        
-;  V11 loc8         [V11,T21] (  8, 67.31)  simd16  ->  mm0        
+;  V10 loc7         [V10,T00] ( 27, 79.81)    long  ->  rax        
+;  V11 loc8         [V11,T21] (  8, 63.85)  simd16  ->  mm0        
 ;* V12 loc9         [V12,T06] (  0,  0   )  ushort  ->  zero-ref   
-;  V13 loc10        [V13,T22] (  3, 17.85)  simd16  ->  mm2        
-;  V14 loc11        [V14,T23] (  3, 17.85)  simd16  ->  mm3        
-;  V15 loc12        [V15,T24] (  3, 17.85)  simd16  ->  mm4        
+;  V13 loc10        [V13,T22] (  3, 16.98)  simd16  ->  mm2        
+;  V14 loc11        [V14,T23] (  3, 16.98)  simd16  ->  mm3        
+;  V15 loc12        [V15,T24] (  3, 16.98)  simd16  ->  mm4        
 ;* V16 loc13        [V16    ] (  0,  0   )  simd16  ->  zero-ref   
 ;* V17 loc14        [V17    ] (  0,  0   )     int  ->  zero-ref   
 ;  V18 loc15        [V18,T26] (  7,  0   )    long  ->  r10        
@@ -2118,7 +2118,7 @@ RWD00  	dq	00FF00FF00FF00FFh, 00FF00FF00FF00FFh
 ;* V31 tmp3         [V31    ] (  0,  0   )     int  ->  zero-ref   
 ;  V32 tmp4         [V32,T30] (  2,  0   )    long  ->  r10        
 ;* V33 tmp5         [V33    ] (  0,  0   )    long  ->  zero-ref   
-;  V34 tmp6         [V34,T04] (  2,  2.03)     int  ->  rax        
+;  V34 tmp6         [V34,T04] (  2,  2.02)     int  ->  rax        
 ;* V35 tmp7         [V35    ] (  0,  0   )    bool  ->  zero-ref    "Inline return value spill temp"
 ;* V36 tmp8         [V36    ] (  0,  0   )    bool  ->  zero-ref    "Inline return value spill temp"
 ;* V37 tmp9         [V37    ] (  0,  0   )  simd16  ->  zero-ref    "Inline stloc first use temp"
@@ -2204,23 +2204,23 @@ RWD00  	dq	00FF00FF00FF00FFh, 00FF00FF00FF00FFh
 ;* V117 tmp89       [V117    ] (  0,  0   )    bool  ->  zero-ref    "Inline return value spill temp"
 ;* V118 tmp90       [V118    ] (  0,  0   )     int  ->  zero-ref    "Inline stloc first use temp"
 ;* V119 tmp91       [V119    ] (  0,  0   )    bool  ->  zero-ref    "Inline return value spill temp"
-;  V120 cse0        [V120,T25] (  3, 17.82)  simd16  ->  mm1         "CSE - aggressive"
+;  V120 cse0        [V120,T25] (  3, 16.96)  simd16  ->  mm1         "CSE - aggressive"
 ;
 ; Lcl frame size = 0
 
 G_M37956_IG01:
        vzeroupper 
-						;; size=3 bbWeight=1.00 PerfScore 1.00
+						;; size=3 bbWeight=1.01 PerfScore 1.01
 G_M37956_IG02:
        xor      eax, eax
        cmp      r8, 8
-       jb       G_M37956_IG12
-						;; size=12 bbWeight=1.00 PerfScore 1.50
+       jb       G_M37956_IG10
+						;; size=12 bbWeight=1.01 PerfScore 1.52
 G_M37956_IG03:
        vmovups  xmm0, xmmword ptr [rcx]
        vmovups  xmm1, xmmword ptr [reloc @RWD00]
        vptest   xmm0, xmm1
-       jne      G_M37956_IG12
+       jne      G_M37956_IG10
 						;; size=23 bbWeight=1.00 PerfScore 11.01
 G_M37956_IG04:
        mov      eax, 0x8041
@@ -2240,18 +2240,18 @@ G_M37956_IG04:
        sub      r10d, eax
        mov      eax, r10d
        align    [0 bytes for IG05]
-						;; size=69 bbWeight=1.02 PerfScore 14.72
+						;; size=69 bbWeight=1.01 PerfScore 14.68
 G_M37956_IG05:
        mov      r10, r8
        sub      r10, rax
        cmp      r10, 8
        jb       SHORT G_M37956_IG08
-						;; size=12 bbWeight=16.82 PerfScore 29.43
+						;; size=12 bbWeight=15.96 PerfScore 27.93
 G_M37956_IG06:
        vmovups  xmm0, xmmword ptr [rcx+2*rax]
        vptest   xmm0, xmm1
-       jne      SHORT G_M37956_IG12
-						;; size=12 bbWeight=15.82 PerfScore 126.55
+       jne      SHORT G_M37956_IG10
+						;; size=12 bbWeight=14.96 PerfScore 119.66
 G_M37956_IG07:
        vpsubw   xmm5, xmm0, xmm2
        vpcmpgtw xmm5, xmm3, xmm5
@@ -2260,70 +2260,43 @@ G_M37956_IG07:
        vmovups  xmmword ptr [rdx+2*rax], xmm0
        add      rax, 8
        jmp      SHORT G_M37956_IG05
-						;; size=27 bbWeight=15.82 PerfScore 90.96
+						;; size=27 bbWeight=14.96 PerfScore 86.00
 G_M37956_IG08:
        cmp      rax, r8
-       je       SHORT G_M37956_IG11
-						;; size=5 bbWeight=2.00 PerfScore 2.50
+       jne      SHORT G_M37956_IG14
+						;; size=5 bbWeight=1.00 PerfScore 1.25
 G_M37956_IG09:
-       mov      rax, r8
-       sub      rax, 8
-       jmp      SHORT G_M37956_IG06
-						;; size=9 bbWeight=1.00 PerfScore 2.49
-G_M37956_IG10:
-       cmp      rax, r8
-       jb       SHORT G_M37956_IG15
-						;; size=5 bbWeight=0.00 PerfScore 0.00
-G_M37956_IG11:
        ret      
 						;; size=1 bbWeight=1 PerfScore 1.00
-G_M37956_IG12:
+G_M37956_IG10:
        mov      r10, r8
        sub      r10, rax
        cmp      r10, 4
-       jae      SHORT G_M37956_IG17
+       jae      SHORT G_M37956_IG15
 						;; size=12 bbWeight=0.00 PerfScore 0.00
-G_M37956_IG13:
+G_M37956_IG11:
        mov      r10, r8
        sub      r10, rax
        cmp      r10, 2
-       jb       SHORT G_M37956_IG10
+       jae      SHORT G_M37956_IG16
 						;; size=12 bbWeight=0.00 PerfScore 0.00
-G_M37956_IG14:
-       mov      r10d, dword ptr [rcx+2*rax]
-       test     r10d, 0xD1FFAB1E
-       jne      SHORT G_M37956_IG10
-       lea      r9d, [r10+D1FFAB1EH]
-       lea      r11d, [r10+D1FFAB1EH]
-       xor      r9d, r11d
-       and      r9d, 0xD1FFAB1E
-       shr      r9d, 2
-       xor      r10d, r9d
-       mov      dword ptr [rdx+2*rax], r10d
-       add      rax, 2
+G_M37956_IG12:
        cmp      rax, r8
-       jae      SHORT G_M37956_IG11
-						;; size=57 bbWeight=0 PerfScore 0.00
+       jb       G_M37956_IG17
+						;; size=9 bbWeight=0.00 PerfScore 0.00
+G_M37956_IG13:
+       jmp      SHORT G_M37956_IG09
+						;; size=2 bbWeight=0.00 PerfScore 0.00
+G_M37956_IG14:
+       mov      rax, r8
+       sub      rax, 8
+       jmp      SHORT G_M37956_IG06
+						;; size=9 bbWeight=0.00 PerfScore 0.00
 G_M37956_IG15:
-       movzx    r10, word  ptr [rcx+2*rax]
-       cmp      r10d, 127
-       ja       SHORT G_M37956_IG11
-       lea      r9d, [r10-41H]
-       cmp      r9d, 25
-       ja       SHORT G_M37956_IG16
-       add      r10d, 32
-						;; size=25 bbWeight=0 PerfScore 0.00
-G_M37956_IG16:
-       movzx    r10, r10w
-       mov      word  ptr [rdx+2*rax], r10w
-       inc      rax
-       jmp      SHORT G_M37956_IG10
-						;; size=14 bbWeight=0 PerfScore 0.00
-G_M37956_IG17:
        mov      r10, qword ptr [rcx+2*rax]
        mov      r9, 0xD1FFAB1E
        test     r10, r9
-       jne      SHORT G_M37956_IG13
+       jne      SHORT G_M37956_IG11
        mov      r9, 0xD1FFAB1E
        add      r9, r10
        mov      r11, 0xD1FFAB1E
@@ -2335,13 +2308,46 @@ G_M37956_IG17:
        xor      r10, r9
        mov      qword ptr [rdx+2*rax], r10
        add      rax, 4
-       jmp      G_M37956_IG13
-						;; size=81 bbWeight=0 PerfScore 0.00
+       mov      r10, r8
+       sub      r10, rax
+       cmp      r10, 2
+       jb       SHORT G_M37956_IG12
+						;; size=88 bbWeight=0 PerfScore 0.00
+G_M37956_IG16:
+       mov      r10d, dword ptr [rcx+2*rax]
+       test     r10d, 0xD1FFAB1E
+       jne      SHORT G_M37956_IG12
+       lea      r9d, [r10+D1FFAB1EH]
+       lea      r11d, [r10+D1FFAB1EH]
+       xor      r9d, r11d
+       and      r9d, 0xD1FFAB1E
+       shr      r9d, 2
+       xor      r10d, r9d
+       mov      dword ptr [rdx+2*rax], r10d
+       add      rax, 2
+       cmp      rax, r8
+       jae      G_M37956_IG09
+						;; size=61 bbWeight=0 PerfScore 0.00
+G_M37956_IG17:
+       movzx    r10, word  ptr [rcx+2*rax]
+       cmp      r10d, 127
+       ja       G_M37956_IG09
+       lea      r9d, [r10-41H]
+       cmp      r9d, 25
+       ja       SHORT G_M37956_IG18
+       add      r10d, 32
+						;; size=29 bbWeight=0 PerfScore 0.00
+G_M37956_IG18:
+       movzx    r10, r10w
+       mov      word  ptr [rdx+2*rax], r10w
+       inc      rax
+       jmp      G_M37956_IG12
+						;; size=17 bbWeight=0 PerfScore 0.00
 RWD00  	dq	FF80FF80FF80FF80h, FF80FF80FF80FF80h
 RWD16  	dq	801A801A801A801Ah, 801A801A801A801Ah
 RWD32  	dq	0020002000200020h, 0020002000200020h
 
 
-; Total bytes of code 379, prolog size 3, PerfScore 319.08, instruction count 95, allocated bytes for code 379 (MethodHash=c6916bbb) for method System.Text.Ascii:ChangeCase[ushort,ushort,System.Text.Ascii+ToLowerConversion](ulong,ulong,ulong):ulong (Tier1)
+; Total bytes of code 403, prolog size 3, PerfScore 304.35, instruction count 99, allocated bytes for code 403 (MethodHash=c6916bbb) for method System.Text.Ascii:ChangeCase[ushort,ushort,System.Text.Ascii+ToLowerConversion](ulong,ulong,ulong):ulong (Tier1)
 ; ============================================================
 

System.Text.Perf_Ascii.ToUpperInPlace_Chars(Size: 128)

Hot functions:

  • (77.15%) Ascii.ChangeCase (Tier-1)
    • Has diffs
  • (16.84%) Perf_Ascii.ToUpperInPlace_Chars (Tier-1)
    • No diffs
  • (1.92%) Runnable_0.WorkloadActionUnroll (Tier-1)
    • No diffs
Diffs

[System.Private.CoreLib]Ascii.ChangeCase(!!0*,!!1*,unsigned int)

 ; optimized using Dynamic PGO
 ; rsp based frame
 ; fully interruptible
-; with Dynamic PGO: edge weights are valid, and fgCalledCount is 1448704
+; with Dynamic PGO: edge weights are valid, and fgCalledCount is 1804288
 ; 44 inlinees with PGO data; 6 single block inlinees; 4 inlinees without PGO data
 ; Final local variable assignments
 ;
-;  V00 arg0         [V00,T03] (  7, 18.78)    long  ->  rcx         single-def
-;  V01 arg1         [V01,T02] (  8, 19.78)    long  ->  rdx         single-def
-;  V02 arg2         [V02,T01] ( 10, 22.81)    long  ->   r8         single-def
-;* V03 loc0         [V03,T06] (  0,  0   )    bool  ->  zero-ref   
+;  V00 arg0         [V00,T03] (  7, 17.82)    long  ->  rcx         single-def
+;  V01 arg1         [V01,T02] (  8, 18.86)    long  ->  rdx         single-def
+;  V02 arg2         [V02,T01] ( 11, 19.82)    long  ->   r8         single-def
+;* V03 loc0         [V03,T15] (  0,  0   )    bool  ->  zero-ref   
 ;* V04 loc1         [V04    ] (  0,  0   )    bool  ->  zero-ref   
-;* V05 loc2         [V05,T07] (  0,  0   )    bool  ->  zero-ref   
+;* V05 loc2         [V05,T16] (  0,  0   )    bool  ->  zero-ref   
 ;* V06 loc3         [V06    ] (  0,  0   )    bool  ->  zero-ref   
-;* V07 loc4         [V07,T08] (  0,  0   )    bool  ->  zero-ref   
-;* V08 loc5         [V08,T09] (  0,  0   )    bool  ->  zero-ref   
-;* V09 loc6         [V09,T10] (  0,  0   )     int  ->  zero-ref   
-;  V10 loc7         [V10,T00] ( 26, 85.97)    long  ->  rax        
-;  V11 loc8         [V11,T21] (  8, 67.13)  simd16  ->  mm0        
-;* V12 loc9         [V12,T12] (  0,  0   )  ushort  ->  zero-ref   
-;  V13 loc10        [V13,T22] (  3, 17.78)  simd16  ->  mm2        
-;  V14 loc11        [V14,T23] (  3, 17.78)  simd16  ->  mm3        
-;  V15 loc12        [V15,T24] (  3, 17.78)  simd16  ->  mm4        
+;* V07 loc4         [V07,T17] (  0,  0   )    bool  ->  zero-ref   
+;* V08 loc5         [V08,T18] (  0,  0   )    bool  ->  zero-ref   
+;* V09 loc6         [V09,T19] (  0,  0   )     int  ->  zero-ref   
+;  V10 loc7         [V10,T00] ( 27, 79.10)    long  ->  rax        
+;  V11 loc8         [V11,T21] (  8, 63.31)  simd16  ->  mm0        
+;* V12 loc9         [V12,T06] (  0,  0   )  ushort  ->  zero-ref   
+;  V13 loc10        [V13,T22] (  3, 16.86)  simd16  ->  mm2        
+;  V14 loc11        [V14,T23] (  3, 16.86)  simd16  ->  mm3        
+;  V15 loc12        [V15,T24] (  3, 16.86)  simd16  ->  mm4        
 ;* V16 loc13        [V16    ] (  0,  0   )  simd16  ->  zero-ref   
 ;* V17 loc14        [V17    ] (  0,  0   )     int  ->  zero-ref   
 ;  V18 loc15        [V18,T26] (  7,  0   )    long  ->  r10        
@@ -1443,39 +1443,39 @@ RWD00  	dq	00FF00FF00FF00FFh, 00FF00FF00FF00FFh
 ;* V26 loc23        [V26    ] (  0,  0   )  simd16  ->  zero-ref   
 ;  V27 loc24        [V27,T28] (  6,  0   )     int  ->  r10        
 ;# V28 OutArgs      [V28    ] (  1,  1   )  struct ( 0) [rsp+00H]   do-not-enreg[XS] addr-exposed "OutgoingArgSpace"
-;* V29 tmp1         [V29,T11] (  0,  0   )     int  ->  zero-ref   
+;* V29 tmp1         [V29,T20] (  0,  0   )     int  ->  zero-ref   
 ;  V30 tmp2         [V30,T29] (  2,  0   )     int  ->  r10        
 ;* V31 tmp3         [V31    ] (  0,  0   )     int  ->  zero-ref   
 ;  V32 tmp4         [V32,T30] (  2,  0   )    long  ->  r10        
 ;* V33 tmp5         [V33    ] (  0,  0   )    long  ->  zero-ref   
-;  V34 tmp6         [V34,T04] (  2,  1.99)     int  ->  rax        
+;  V34 tmp6         [V34,T04] (  2,  2.04)     int  ->  rax        
 ;* V35 tmp7         [V35    ] (  0,  0   )    bool  ->  zero-ref    "Inline return value spill temp"
 ;* V36 tmp8         [V36    ] (  0,  0   )    bool  ->  zero-ref    "Inline return value spill temp"
 ;* V37 tmp9         [V37    ] (  0,  0   )  simd16  ->  zero-ref    "Inline stloc first use temp"
 ;* V38 tmp10        [V38,T05] (  0,  0   )     int  ->  zero-ref    "Inlining Arg"
-;* V39 tmp11        [V39,T13] (  0,  0   )  ushort  ->  zero-ref    ld-addr-op "Inline ldloca(s) first use temp"
+;* V39 tmp11        [V39,T07] (  0,  0   )  ushort  ->  zero-ref    ld-addr-op "Inline ldloca(s) first use temp"
 ;* V40 tmp12        [V40    ] (  0,  0   )    bool  ->  zero-ref    "Inline return value spill temp"
 ;* V41 tmp13        [V41    ] (  0,  0   )    bool  ->  zero-ref    "Inline return value spill temp"
-;* V42 tmp14        [V42,T14] (  0,  0   )  ushort  ->  zero-ref    "Inline stloc first use temp"
+;* V42 tmp14        [V42,T08] (  0,  0   )  ushort  ->  zero-ref    "Inline stloc first use temp"
 ;* V43 tmp15        [V43    ] (  0,  0   )  ushort  ->  zero-ref    ld-addr-op "Inline ldloca(s) first use temp"
 ;* V44 tmp16        [V44    ] (  0,  0   )    bool  ->  zero-ref    "Inline return value spill temp"
 ;* V45 tmp17        [V45    ] (  0,  0   )  ushort  ->  zero-ref    "Inline stloc first use temp"
 ;* V46 tmp18        [V46    ] (  0,  0   )    bool  ->  zero-ref    "Inline return value spill temp"
 ;* V47 tmp19        [V47    ] (  0,  0   )  ushort  ->  zero-ref    "Inlining Arg"
-;* V48 tmp20        [V48,T15] (  0,  0   )  ushort  ->  zero-ref    ld-addr-op "Inline ldloca(s) first use temp"
+;* V48 tmp20        [V48,T09] (  0,  0   )  ushort  ->  zero-ref    ld-addr-op "Inline ldloca(s) first use temp"
 ;* V49 tmp21        [V49    ] (  0,  0   )    bool  ->  zero-ref    "Inline return value spill temp"
-;* V50 tmp22        [V50,T16] (  0,  0   )  ushort  ->  zero-ref    "Inline stloc first use temp"
+;* V50 tmp22        [V50,T10] (  0,  0   )  ushort  ->  zero-ref    "Inline stloc first use temp"
 ;* V51 tmp23        [V51    ] (  0,  0   )    bool  ->  zero-ref    "Inline return value spill temp"
 ;* V52 tmp24        [V52    ] (  0,  0   )  ushort  ->  zero-ref    "Inlining Arg"
-;* V53 tmp25        [V53,T17] (  0,  0   )  ushort  ->  zero-ref    ld-addr-op "Inline ldloca(s) first use temp"
+;* V53 tmp25        [V53,T11] (  0,  0   )  ushort  ->  zero-ref    ld-addr-op "Inline ldloca(s) first use temp"
 ;* V54 tmp26        [V54    ] (  0,  0   )    bool  ->  zero-ref    "Inline return value spill temp"
 ;* V55 tmp27        [V55    ] (  0,  0   )    bool  ->  zero-ref    "Inline return value spill temp"
-;* V56 tmp28        [V56,T18] (  0,  0   )  ushort  ->  zero-ref    "Inline stloc first use temp"
+;* V56 tmp28        [V56,T12] (  0,  0   )  ushort  ->  zero-ref    "Inline stloc first use temp"
 ;* V57 tmp29        [V57    ] (  0,  0   )  ushort  ->  zero-ref    "Inlining Arg"
-;* V58 tmp30        [V58,T19] (  0,  0   )  ushort  ->  zero-ref    ld-addr-op "Inline ldloca(s) first use temp"
+;* V58 tmp30        [V58,T13] (  0,  0   )  ushort  ->  zero-ref    ld-addr-op "Inline ldloca(s) first use temp"
 ;* V59 tmp31        [V59    ] (  0,  0   )    bool  ->  zero-ref    "Inline return value spill temp"
 ;* V60 tmp32        [V60    ] (  0,  0   )    bool  ->  zero-ref    "Inline return value spill temp"
-;* V61 tmp33        [V61,T20] (  0,  0   )  ushort  ->  zero-ref    "Inline stloc first use temp"
+;* V61 tmp33        [V61,T14] (  0,  0   )  ushort  ->  zero-ref    "Inline stloc first use temp"
 ;* V62 tmp34        [V62    ] (  0,  0   )  simd16  ->  zero-ref    "Inline return value spill temp"
 ;* V63 tmp35        [V63    ] (  0,  0   )  simd16  ->  zero-ref    "Inlining Arg"
 ;* V64 tmp36        [V64    ] (  0,  0   )    bool  ->  zero-ref    "Inline return value spill temp"
@@ -1534,24 +1534,24 @@ RWD00  	dq	00FF00FF00FF00FFh, 00FF00FF00FF00FFh
 ;* V117 tmp89       [V117    ] (  0,  0   )    bool  ->  zero-ref    "Inline return value spill temp"
 ;* V118 tmp90       [V118    ] (  0,  0   )     int  ->  zero-ref    "Inline stloc first use temp"
 ;* V119 tmp91       [V119    ] (  0,  0   )    bool  ->  zero-ref    "Inline return value spill temp"
-;  V120 cse0        [V120,T25] (  3, 17.76)  simd16  ->  mm1         "CSE - aggressive"
+;  V120 cse0        [V120,T25] (  3, 16.82)  simd16  ->  mm1         "CSE - aggressive"
 ;
 ; Lcl frame size = 0
 
 G_M35621_IG01:
        vzeroupper 
-						;; size=3 bbWeight=1 PerfScore 1.00
+						;; size=3 bbWeight=1.00 PerfScore 1.00
 G_M35621_IG02:
        xor      eax, eax
        cmp      r8, 8
-       jb       G_M35621_IG12
-						;; size=12 bbWeight=1 PerfScore 1.50
+       jb       G_M35621_IG09
+						;; size=12 bbWeight=1.00 PerfScore 1.51
 G_M35621_IG03:
        vmovups  xmm0, xmmword ptr [rcx]
        vmovups  xmm1, xmmword ptr [reloc @RWD00]
        vptest   xmm0, xmm1
-       jne      G_M35621_IG12
-						;; size=23 bbWeight=0.99 PerfScore 10.84
+       jne      G_M35621_IG09
+						;; size=23 bbWeight=1.00 PerfScore 11.04
 G_M35621_IG04:
        mov      eax, 0x8061
        vmovd    xmm2, eax
@@ -1570,19 +1570,17 @@ G_M35621_IG04:
        sub      r10d, eax
        mov      eax, r10d
        align    [0 bytes for IG05]
-						;; size=69 bbWeight=1.00 PerfScore 14.45
+						;; size=69 bbWeight=1.02 PerfScore 14.80
 G_M35621_IG05:
        mov      r10, r8
        sub      r10, rax
        cmp      r10, 8
-       jb       SHORT G_M35621_IG08
-						;; size=12 bbWeight=16.78 PerfScore 29.36
+       jb       SHORT G_M35621_IG07
+						;; size=12 bbWeight=15.82 PerfScore 27.68
 G_M35621_IG06:
        vmovups  xmm0, xmmword ptr [rcx+2*rax]
        vptest   xmm0, xmm1
-       jne      SHORT G_M35621_IG12
-						;; size=12 bbWeight=15.79 PerfScore 126.33
-G_M35621_IG07:
+       jne      SHORT G_M35621_IG09
        vpsubw   xmm5, xmm0, xmm2
        vpcmpgtw xmm5, xmm3, xmm5
        vpand    xmm5, xmm5, xmm4
@@ -1590,70 +1588,43 @@ G_M35621_IG07:
        vmovups  xmmword ptr [rdx+2*rax], xmm0
        add      rax, 8
        jmp      SHORT G_M35621_IG05
-						;; size=27 bbWeight=15.79 PerfScore 90.80
+						;; size=39 bbWeight=14.81 PerfScore 203.71
+G_M35621_IG07:
+       cmp      rax, r8
+       jne      SHORT G_M35621_IG13
+						;; size=5 bbWeight=1.00 PerfScore 1.25
 G_M35621_IG08:
-       cmp      rax, r8
-       je       SHORT G_M35621_IG11
-						;; size=5 bbWeight=1.99 PerfScore 2.48
-G_M35621_IG09:
-       mov      rax, r8
-       sub      rax, 8
-       jmp      SHORT G_M35621_IG06
-						;; size=9 bbWeight=1.00 PerfScore 2.50
-G_M35621_IG10:
-       cmp      rax, r8
-       jb       SHORT G_M35621_IG15
-						;; size=5 bbWeight=0.01 PerfScore 0.02
-G_M35621_IG11:
        ret      
 						;; size=1 bbWeight=1 PerfScore 1.00
-G_M35621_IG12:
+G_M35621_IG09:
        mov      r10, r8
        sub      r10, rax
        cmp      r10, 4
-       jae      SHORT G_M35621_IG17
-						;; size=12 bbWeight=0.01 PerfScore 0.03
-G_M35621_IG13:
+       jae      SHORT G_M35621_IG14
+						;; size=12 bbWeight=0.00 PerfScore 0.00
+G_M35621_IG10:
        mov      r10, r8
        sub      r10, rax
        cmp      r10, 2
-       jb       SHORT G_M35621_IG10
-						;; size=12 bbWeight=0.01 PerfScore 0.03
-G_M35621_IG14:
-       mov      r10d, dword ptr [rcx+2*rax]
-       test     r10d, 0xD1FFAB1E
-       jne      SHORT G_M35621_IG10
-       lea      r9d, [r10+D1FFAB1EH]
-       lea      r11d, [r10+00050005H]
-       xor      r9d, r11d
-       and      r9d, 0xD1FFAB1E
-       shr      r9d, 2
-       xor      r10d, r9d
-       mov      dword ptr [rdx+2*rax], r10d
-       add      rax, 2
+       jae      SHORT G_M35621_IG15
+						;; size=12 bbWeight=0.00 PerfScore 0.00
+G_M35621_IG11:
        cmp      rax, r8
-       jae      SHORT G_M35621_IG11
-						;; size=57 bbWeight=0 PerfScore 0.00
-G_M35621_IG15:
-       movzx    r10, word  ptr [rcx+2*rax]
-       cmp      r10d, 127
-       ja       SHORT G_M35621_IG11
-       lea      r9d, [r10-61H]
-       cmp      r9d, 25
-       ja       SHORT G_M35621_IG16
-       add      r10d, -32
-						;; size=25 bbWeight=0 PerfScore 0.00
-G_M35621_IG16:
-       movzx    r10, r10w
-       mov      word  ptr [rdx+2*rax], r10w
-       inc      rax
-       jmp      SHORT G_M35621_IG10
-						;; size=14 bbWeight=0 PerfScore 0.00
-G_M35621_IG17:
+       jb       G_M35621_IG16
+						;; size=9 bbWeight=0.00 PerfScore 0.00
+G_M35621_IG12:
+       jmp      SHORT G_M35621_IG08
+						;; size=2 bbWeight=0.00 PerfScore 0.00
+G_M35621_IG13:
+       mov      rax, r8
+       sub      rax, 8
+       jmp      SHORT G_M35621_IG06
+						;; size=9 bbWeight=0.00 PerfScore 0.00
+G_M35621_IG14:
        mov      r10, qword ptr [rcx+2*rax]
        mov      r9, 0xD1FFAB1E
        test     r10, r9
-       jne      SHORT G_M35621_IG13
+       jne      SHORT G_M35621_IG10
        mov      r9, 0xD1FFAB1E
        add      r9, r10
        mov      r11, 0xD1FFAB1E
@@ -1665,13 +1636,46 @@ G_M35621_IG17:
        xor      r10, r9
        mov      qword ptr [rdx+2*rax], r10
        add      rax, 4
-       jmp      G_M35621_IG13
-						;; size=81 bbWeight=0 PerfScore 0.00
+       mov      r10, r8
+       sub      r10, rax
+       cmp      r10, 2
+       jb       SHORT G_M35621_IG11
+						;; size=88 bbWeight=0 PerfScore 0.00
+G_M35621_IG15:
+       mov      r10d, dword ptr [rcx+2*rax]
+       test     r10d, 0xD1FFAB1E
+       jne      SHORT G_M35621_IG11
+       lea      r9d, [r10+D1FFAB1EH]
+       lea      r11d, [r10+00050005H]
+       xor      r9d, r11d
+       and      r9d, 0xD1FFAB1E
+       shr      r9d, 2
+       xor      r10d, r9d
+       mov      dword ptr [rdx+2*rax], r10d
+       add      rax, 2
+       cmp      rax, r8
+       jae      G_M35621_IG08
+						;; size=61 bbWeight=0 PerfScore 0.00
+G_M35621_IG16:
+       movzx    r10, word  ptr [rcx+2*rax]
+       cmp      r10d, 127
+       ja       G_M35621_IG08
+       lea      r9d, [r10-61H]
+       cmp      r9d, 25
+       ja       SHORT G_M35621_IG17
+       add      r10d, -32
+						;; size=29 bbWeight=0 PerfScore 0.00
+G_M35621_IG17:
+       movzx    r10, r10w
+       mov      word  ptr [rdx+2*rax], r10w
+       inc      rax
+       jmp      G_M35621_IG11
+						;; size=17 bbWeight=0 PerfScore 0.00
 RWD00  	dq	FF80FF80FF80FF80h, FF80FF80FF80FF80h
 RWD16  	dq	801A801A801A801Ah, 801A801A801A801Ah
 RWD32  	dq	0020002000200020h, 0020002000200020h
 
 
-; Total bytes of code 379, prolog size 3, PerfScore 318.23, instruction count 95, allocated bytes for code 379 (MethodHash=e97274da) for method System.Text.Ascii:ChangeCase[ushort,ushort,System.Text.Ascii+ToUpperConversion](ulong,ulong,ulong):ulong (Tier1)
+; Total bytes of code 403, prolog size 3, PerfScore 302.30, instruction count 99, allocated bytes for code 403 (MethodHash=e97274da) for method System.Text.Ascii:ChangeCase[ushort,ushort,System.Text.Ascii+ToUpperConversion](ulong,ulong,ulong):ulong (Tier1)
 ; ============================================================
 

System.Text.Perf_Ascii.ToLowerInPlace_Bytes(Size: 128)

Hot functions:

  • (75.56%) Ascii.ChangeCase (Tier-1)
    • Has diffs
  • (19.36%) Perf_Ascii.ToLowerInPlace_Bytes (Tier-1)
    • No diffs
Diffs

[System.Private.CoreLib]Ascii.ChangeCase(!!0*,!!1*,unsigned int)

 ; optimized using Dynamic PGO
 ; rsp based frame
 ; fully interruptible
-; with Dynamic PGO: edge weights are valid, and fgCalledCount is 2019584
+; with Dynamic PGO: edge weights are valid, and fgCalledCount is 2378752
 ; 25 inlinees with PGO data; 9 single block inlinees; 20 inlinees without PGO data
 ; Final local variable assignments
 ;
-;  V00 arg0         [V00,T03] (  7, 10.96)    long  ->  rcx         single-def
-;  V01 arg1         [V01,T02] (  8, 11.96)    long  ->  rdx         single-def
-;  V02 arg2         [V02,T01] ( 10, 14.99)    long  ->   r8         single-def
+;  V00 arg0         [V00,T03] (  7,  9.83)    long  ->  rcx         single-def
+;  V01 arg1         [V01,T02] (  8, 10.81)    long  ->  rdx         single-def
+;  V02 arg2         [V02,T01] ( 11, 11.85)    long  ->   r8         single-def
 ;* V03 loc0         [V03,T06] (  0,  0   )    bool  ->  zero-ref   
 ;* V04 loc1         [V04,T07] (  0,  0   )    bool  ->  zero-ref   
 ;* V05 loc2         [V05,T08] (  0,  0   )    bool  ->  zero-ref   
@@ -2028,12 +2028,12 @@ RWD00  	dq	00FF00FF00FF00FFh, 00FF00FF00FF00FFh
 ;* V07 loc4         [V07,T09] (  0,  0   )    bool  ->  zero-ref   
 ;* V08 loc5         [V08,T10] (  0,  0   )    bool  ->  zero-ref   
 ;* V09 loc6         [V09,T11] (  0,  0   )     int  ->  zero-ref   
-;  V10 loc7         [V10,T00] ( 26, 46.85)    long  ->  rax        
-;  V11 loc8         [V11,T22] (  8, 35.85)  simd16  ->  mm0        
+;  V10 loc7         [V10,T00] ( 27, 39.20)    long  ->  rax        
+;  V11 loc8         [V11,T22] (  8, 31.31)  simd16  ->  mm0        
 ;* V12 loc9         [V12,T13] (  0,  0   )   ubyte  ->  zero-ref   
-;  V13 loc10        [V13,T23] (  3,  9.96)  simd16  ->  mm2        
-;  V14 loc11        [V14,T24] (  3,  9.96)  simd16  ->  mm3        
-;  V15 loc12        [V15,T25] (  3,  9.96)  simd16  ->  mm4        
+;  V13 loc10        [V13,T23] (  3,  8.81)  simd16  ->  mm2        
+;  V14 loc11        [V14,T24] (  3,  8.81)  simd16  ->  mm3        
+;  V15 loc12        [V15,T25] (  3,  8.81)  simd16  ->  mm4        
 ;* V16 loc13        [V16    ] (  0,  0   )  simd16  ->  zero-ref   
 ;* V17 loc14        [V17    ] (  0,  0   )     int  ->  zero-ref   
 ;  V18 loc15        [V18,T27] (  7,  0   )    long  ->  r10        
@@ -2052,7 +2052,7 @@ RWD00  	dq	00FF00FF00FF00FFh, 00FF00FF00FF00FFh
 ;  V31 tmp3         [V31,T30] (  2,  0   )     int  ->  r10        
 ;* V32 tmp4         [V32    ] (  0,  0   )    long  ->  zero-ref   
 ;  V33 tmp5         [V33,T31] (  2,  0   )    long  ->  r10        
-;  V34 tmp6         [V34,T04] (  2,  2.00)     int  ->  rax        
+;  V34 tmp6         [V34,T04] (  2,  1.97)     int  ->  rax        
 ;* V35 tmp7         [V35    ] (  0,  0   )    bool  ->  zero-ref    "Inline return value spill temp"
 ;* V36 tmp8         [V36    ] (  0,  0   )    bool  ->  zero-ref    "Inline return value spill temp"
 ;* V37 tmp9         [V37,T05] (  0,  0   )     int  ->  zero-ref    "Inlining Arg"
@@ -2136,7 +2136,7 @@ RWD00  	dq	00FF00FF00FF00FFh, 00FF00FF00FF00FFh
 ;* V115 tmp87       [V115    ] (  0,  0   )    bool  ->  zero-ref    "Inline return value spill temp"
 ;* V116 tmp88       [V116    ] (  0,  0   )     int  ->  zero-ref    "Inline stloc first use temp"
 ;* V117 tmp89       [V117    ] (  0,  0   )    bool  ->  zero-ref    "Inline return value spill temp"
-;  V118 cse0        [V118,T26] (  3,  9.96)  simd16  ->  mm1         "CSE - aggressive"
+;  V118 cse0        [V118,T26] (  3,  8.81)  simd16  ->  mm1         "CSE - aggressive"
 ;
 ; Lcl frame size = 0
 
@@ -2146,13 +2146,13 @@ G_M53156_IG01:
 G_M53156_IG02:
        xor      eax, eax
        cmp      r8, 16
-       jb       G_M53156_IG10
+       jb       G_M53156_IG08
 						;; size=12 bbWeight=1 PerfScore 1.50
 G_M53156_IG03:
        vmovups  xmm0, xmmword ptr [rcx]
        vmovups  xmm1, xmmword ptr [reloc @RWD00]
        vptest   xmm0, xmm1
-       jne      G_M53156_IG10
+       jne      G_M53156_IG08
        mov      eax, 193
        vmovd    xmm2, eax
        vpbroadcastb xmm2, xmm2
@@ -2169,17 +2169,17 @@ G_M53156_IG03:
        sub      r10d, eax
        mov      eax, r10d
        align    [0 bytes for IG04]
-						;; size=90 bbWeight=1.00 PerfScore 24.96
+						;; size=90 bbWeight=0.99 PerfScore 24.68
 G_M53156_IG04:
        mov      r10, r8
        sub      r10, rax
        cmp      r10, 16
        jb       SHORT G_M53156_IG06
-						;; size=12 bbWeight=8.96 PerfScore 15.68
+						;; size=12 bbWeight=7.83 PerfScore 13.70
 G_M53156_IG05:
        vmovups  xmm0, xmmword ptr [rcx+rax]
        vptest   xmm0, xmm1
-       jne      SHORT G_M53156_IG10
+       jne      SHORT G_M53156_IG08
        vpsubb   xmm5, xmm0, xmm2
        vpcmpgtb xmm5, xmm3, xmm5
        vpand    xmm5, xmm5, xmm4
@@ -2187,70 +2187,41 @@ G_M53156_IG05:
        vmovups  xmmword ptr [rdx+rax], xmm0
        add      rax, 16
        jmp      SHORT G_M53156_IG04
-						;; size=39 bbWeight=7.96 PerfScore 109.51
+						;; size=39 bbWeight=6.84 PerfScore 94.04
 G_M53156_IG06:
        cmp      rax, r8
-       je       SHORT G_M53156_IG09
-						;; size=5 bbWeight=2.01 PerfScore 2.51
+       jne      SHORT G_M53156_IG11
+						;; size=5 bbWeight=0.99 PerfScore 1.23
 G_M53156_IG07:
-       mov      rax, r8
-       sub      rax, 16
-       jmp      SHORT G_M53156_IG05
-						;; size=9 bbWeight=1.01 PerfScore 2.53
-G_M53156_IG08:
-       cmp      rax, r8
-       jb       SHORT G_M53156_IG13
-						;; size=5 bbWeight=0.00 PerfScore 0.00
-G_M53156_IG09:
        ret      
 						;; size=1 bbWeight=1 PerfScore 1.00
-G_M53156_IG10:
+G_M53156_IG08:
        mov      r10, r8
        sub      r10, rax
        cmp      r10, 8
-       jae      SHORT G_M53156_IG15
-						;; size=12 bbWeight=0.00 PerfScore 0.00
-G_M53156_IG11:
+       jae      SHORT G_M53156_IG12
+						;; size=12 bbWeight=0.01 PerfScore 0.02
+G_M53156_IG09:
        mov      r10, r8
        sub      r10, rax
        cmp      r10, 4
-       jb       SHORT G_M53156_IG08
-						;; size=12 bbWeight=0.00 PerfScore 0.00
-G_M53156_IG12:
-       mov      r10d, dword ptr [rcx+rax]
-       test     r10d, 0xD1FFAB1E
-       jne      SHORT G_M53156_IG08
-       lea      r9d, [r10+D1FFAB1EH]
-       lea      r11d, [r10+D1FFAB1EH]
-       xor      r9d, r11d
-       and      r9d, 0xD1FFAB1E
-       shr      r9d, 2
-       xor      r10d, r9d
-       mov      dword ptr [rdx+rax], r10d
-       add      rax, 4
+       jae      SHORT G_M53156_IG13
+						;; size=12 bbWeight=0.01 PerfScore 0.02
+G_M53156_IG10:
        cmp      rax, r8
-       jae      SHORT G_M53156_IG09
-						;; size=57 bbWeight=0 PerfScore 0.00
-G_M53156_IG13:
-       movzx    r10, byte  ptr [rcx+rax]
-       cmp      r10d, 127
-       ja       SHORT G_M53156_IG09
-       lea      r9d, [r10-41H]
-       cmp      r9d, 25
-       ja       SHORT G_M53156_IG14
-       add      r10d, 32
-						;; size=25 bbWeight=0 PerfScore 0.00
-G_M53156_IG14:
-       movzx    r10, r10b
-       mov      byte  ptr [rdx+rax], r10b
-       inc      rax
-       jmp      SHORT G_M53156_IG08
-						;; size=13 bbWeight=0 PerfScore 0.00
-G_M53156_IG15:
+       jb       G_M53156_IG14
+       jmp      SHORT G_M53156_IG07
+						;; size=11 bbWeight=0.01 PerfScore 0.04
+G_M53156_IG11:
+       mov      rax, r8
+       sub      rax, 16
+       jmp      SHORT G_M53156_IG05
+						;; size=9 bbWeight=0.00 PerfScore 0.00
+G_M53156_IG12:
        mov      r10, qword ptr [rcx+rax]
        mov      r9, 0xD1FFAB1E
        test     r10, r9
-       jne      SHORT G_M53156_IG11
+       jne      SHORT G_M53156_IG09
        mov      r9, 0xD1FFAB1E
        add      r9, r10
        mov      r11, 0xD1FFAB1E
@@ -2262,13 +2233,46 @@ G_M53156_IG15:
        xor      r10, r9
        mov      qword ptr [rdx+rax], r10
        add      rax, 8
-       jmp      G_M53156_IG11
-						;; size=81 bbWeight=0 PerfScore 0.00
+       mov      r10, r8
+       sub      r10, rax
+       cmp      r10, 4
+       jb       SHORT G_M53156_IG10
+						;; size=88 bbWeight=0 PerfScore 0.00
+G_M53156_IG13:
+       mov      r10d, dword ptr [rcx+rax]
+       test     r10d, 0xD1FFAB1E
+       jne      SHORT G_M53156_IG10
+       lea      r9d, [r10+D1FFAB1EH]
+       lea      r11d, [r10+D1FFAB1EH]
+       xor      r9d, r11d
+       and      r9d, 0xD1FFAB1E
+       shr      r9d, 2
+       xor      r10d, r9d
+       mov      dword ptr [rdx+rax], r10d
+       add      rax, 4
+       cmp      rax, r8
+       jae      G_M53156_IG07
+						;; size=61 bbWeight=0 PerfScore 0.00
+G_M53156_IG14:
+       movzx    r10, byte  ptr [rcx+rax]
+       cmp      r10d, 127
+       ja       G_M53156_IG07
+       lea      r9d, [r10-41H]
+       cmp      r9d, 25
+       ja       SHORT G_M53156_IG15
+       add      r10d, 32
+						;; size=29 bbWeight=0 PerfScore 0.00
+G_M53156_IG15:
+       movzx    r10, r10b
+       mov      byte  ptr [rdx+rax], r10b
+       inc      rax
+       jmp      G_M53156_IG10
+						;; size=16 bbWeight=0 PerfScore 0.00
 RWD00  	dq	8080808080808080h, 8080808080808080h
 RWD16  	dq	9A9A9A9A9A9A9A9Ah, 9A9A9A9A9A9A9A9Ah
 RWD32  	dq	2020202020202020h, 2020202020202020h
 
 
-; Total bytes of code 376, prolog size 3, PerfScore 196.30, instruction count 94, allocated bytes for code 376 (MethodHash=feea305b) for method System.Text.Ascii:ChangeCase[ubyte,ubyte,System.Text.Ascii+ToLowerConversion](ulong,ulong,ulong):ulong (Tier1)
+; Total bytes of code 400, prolog size 3, PerfScore 177.24, instruction count 98, allocated bytes for code 400 (MethodHash=feea305b) for method System.Text.Ascii:ChangeCase[ubyte,ubyte,System.Text.Ascii+ToLowerConversion](ulong,ulong,ulong):ulong (Tier1)
 ; ============================================================
 

System.Globalization.Tests.StringSearch.IsPrefix_FirstHalf(Options: (en-US, OrdinalIgnoreCase, False))

Hot functions:

  • (72.53%) Ordinal.EqualsIgnoreCase_Vector128 (Tier-1)
    • No diffs
  • (11.92%) StringSearch.IsPrefix_FirstHalf (Tier-1)
    • No diffs
  • (6.80%) CompareInfo.IsPrefix (Tier-1)
    • No diffs
  • (3.75%) CultureInfo.get_CompareInfo (Tier-1)
    • No diffs

System.Globalization.Tests.StringSearch.IsPrefix_DifferentFirstChar(Options: (en-US, OrdinalIgnoreCase, False))

Hot functions:

  • (34.25%) StringSearch.IsPrefix_DifferentFirstChar (Tier-1)
    • No diffs
  • (32.67%) Ordinal.EqualsIgnoreCase_Vector128 (Tier-1)
    • No diffs
  • (14.05%) CompareInfo.IsPrefix (Tier-1)
    • No diffs
  • (11.92%) CultureInfo.get_CompareInfo (Tier-1)
    • No diffs
  • (3.11%) Runnable_0.WorkloadActionUnroll (Tier-1)
    • No diffs

System.Tests.Perf_Enum.GetName_Generic_Flags

Hot functions:

  • (32.55%) SpanHelpers.NonPackedIndexOfValueType (Tier-1)
    • No diffs
  • (32.52%) Perf_Enum.GetName_Generic_Flags (Tier-1)
    • No diffs
  • (3.53%) Runnable_0.WorkloadActionUnroll (Tier-1)
    • No diffs

Benchstone.BenchI.TreeInsert.Test

Hot functions:

  • (98.49%) TreeInsert.BenchInner (Tier-1)
    • No diffs

jakobbotsch added a commit to jakobbotsch/runtime that referenced this issue Jul 4, 2023
…nversion

In dotnet#88376 (comment)
I noticed a spurious diff in the System.Tests.Perf_Int32.ToStringHex
benchmark that looked like this:

```diff
 G_M62987_IG13:
        and      edi, esi
        mov      ebx, dword ptr [rbp+88H]
-       mov      ecx, 1
        test     ebx, ebx
-       cmovle   ebx, ecx
+       jg       SHORT G_M62987_IG15
+						;; size=12 bbWeight=1.00 PerfScore 2.50
+G_M62987_IG14:
+       mov      ebx, 1
+						;; size=5 bbWeight=0.98 PerfScore 0.24
+G_M62987_IG15:
```

Investigating, it turns out to be caused by a check in if-conversion for
detecting loops, that is using a very sharp boundary. It turns out that
the integral block weights are exactly the same (in both the base and
diff), but the floating point calculation ended up with exactly 1 and
very close to 1 in the base/diff cases respectively.

So two changes to address it:
* Switch getBBWeight to multiply by BB_UNITY_WEIGHT after dividing
* Switch if-conversion to have a 5% tolerance so that losing just a
  single count in the wrong place will not cause a decision change. Note
  that the check here is used as a cheap "is inside loop" check.
jakobbotsch added a commit that referenced this issue Jul 5, 2023
…nversion (#88385)

In #88376 (comment)
I noticed a spurious diff in the System.Tests.Perf_Int32.ToStringHex
benchmark that looked like this:

```diff
 G_M62987_IG13:
        and      edi, esi
        mov      ebx, dword ptr [rbp+88H]
-       mov      ecx, 1
        test     ebx, ebx
-       cmovle   ebx, ecx
+       jg       SHORT G_M62987_IG15
+						;; size=12 bbWeight=1.00 PerfScore 2.50
+G_M62987_IG14:
+       mov      ebx, 1
+						;; size=5 bbWeight=0.98 PerfScore 0.24
+G_M62987_IG15:
```

Investigating, it turns out to be caused by a check in if-conversion for
detecting loops, that is using a very sharp boundary. It turns out that
the integral block weights are exactly the same (in both the base and
diff), but the floating point calculation ended up with exactly 1 and
very close to 1 in the base/diff cases respectively.

So two changes to address it:
* Switch getBBWeight to multiply by BB_UNITY_WEIGHT after dividing
* Switch if-conversion to have a 5% tolerance so that losing just a
  single count in the wrong place will not cause a decision change. Note
  that the check here is used as a cheap "is inside loop" check.
@stephentoub
Copy link
Member

I merged a fix for EmptyTakeSelectToArray

@ghost
Copy link

ghost commented Jul 7, 2023

Tagging subscribers to this area: @dotnet/area-system-linq
See info in area-owners.md if you want to be subscribed.

Issue Details

Run Information

Name Value
Architecture x64
OS Windows 10.0.19042
Queue OwlWindows
Baseline 1db4357891752cc028620710fe924425235b8f89
Compare 779d53611efd10526ca2bc3e94ce13ee18ad493a
Diff Diff
Configs CompilationMode:tiered, RunKind:micro

Regressions in System.Linq.Tests.Perf_Enumerable

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
EmptyTakeSelectToArray - Duration of single invocation 13.59 ns 23.69 ns 1.74 0.13 False
Contains_ElementNotFound - Duration of single invocation 10.39 ns 12.53 ns 1.21 0.10 False

graph
graph
Test Report

Repro

General Docs link: https://github.com/dotnet/performance/blob/main/docs/benchmarking-workflow-dotnet-runtime.md

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Linq.Tests.Perf_Enumerable*'

Payloads

Baseline
Compare

System.Linq.Tests.Perf_Enumerable.EmptyTakeSelectToArray

Histogram


Description of detection logic

IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 23.691572329848345 > 14.537807447822592.
IsChangePoint: Marked as a change because one of 5/19/2023 10:30:38 AM, 7/1/2023 6:36:20 PM, 7/3/2023 9:53:34 PM falls between 6/24/2023 6:56:43 PM and 7/3/2023 9:53:34 PM.
IsRegressionStdDev: Marked as regression because -34.470840139848164 (T) = (0 -23.99248747029873) / Math.Sqrt((0.0506736983993927 / (40)) + (0.35447750328125177 / (4))) is less than -2.0180817028167235 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (40) + (4) - 2, .025) and -0.7566908591085725 = (13.657774414829964 - 23.99248747029873) / 13.657774414829964 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

JIT Disasms

System.Linq.Tests.Perf_Enumerable.Contains_ElementNotFound(input: ICollection)

Histogram


Description of detection logic

IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 12.527155689557919 > 10.81055521742021.
IsChangePoint: Marked as a change because one of 4/10/2023 1:33:42 PM, 4/25/2023 3:46:39 AM, 5/26/2023 6:22:05 AM, 6/2/2023 6:53:36 PM, 6/30/2023 8:34:57 AM, 7/3/2023 9:53:34 PM falls between 6/24/2023 6:56:43 PM and 7/3/2023 9:53:34 PM.
IsRegressionStdDev: Marked as regression because -106.63333857763865 (T) = (0 -12.531498407064118) / Math.Sqrt((0.01317404310541409 / (35)) + (0.0002711042974289965 / (9))) is less than -2.0180817028167235 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (35) + (9) - 2, .025) and -0.20709782006992145 = (10.381510262638225 - 12.531498407064118) / 10.381510262638225 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

JIT Disasms

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository


Run Information

Name Value
Architecture x64
OS Windows 10.0.19042
Queue OwlWindows
Baseline 1db4357891752cc028620710fe924425235b8f89
Compare 779d53611efd10526ca2bc3e94ce13ee18ad493a
Diff Diff
Configs CompilationMode:tiered, RunKind:micro

Regressions in System.Tests.Perf_Int32

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
ToStringHex - Duration of single invocation 19.88 ns 33.76 ns 1.70 0.12 False
ToStringHex - Duration of single invocation 20.13 ns 31.72 ns 1.58 0.27 False

graph
graph
Test Report

Repro

General Docs link: https://github.com/dotnet/performance/blob/main/docs/benchmarking-workflow-dotnet-runtime.md

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Tests.Perf_Int32*'

Payloads

Baseline
Compare

System.Tests.Perf_Int32.ToStringHex(value: -2147483648)

Histogram


Description of detection logic

IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 33.75656895815466 > 21.202216950657487.
IsChangePoint: Marked as a change because one of 5/25/2023 6:27:07 PM, 6/22/2023 7:55:14 AM, 7/1/2023 6:36:20 PM, 7/3/2023 9:53:34 PM falls between 6/24/2023 6:56:43 PM and 7/3/2023 9:53:34 PM.
IsRegressionStdDev: Marked as regression because -58.34542926942731 (T) = (0 -33.921356757407224) / Math.Sqrt((1.733048536075712 / (40)) + (0.02187401944515169 / (4))) is less than -2.0180817028167235 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (40) + (4) - 2, .025) and -0.6127585626022941 = (21.03312767577116 - 33.921356757407224) / 21.03312767577116 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

JIT Disasms

System.Tests.Perf_Int32.ToStringHex(value: 2147483647)

Histogram


Description of detection logic

IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 31.715216334903133 > 21.330520466731336.
IsChangePoint: Marked as a change because one of 5/26/2023 9:55:14 AM, 6/3/2023 11:04:56 AM, 7/1/2023 6:36:20 PM, 7/3/2023 9:53:34 PM falls between 6/24/2023 6:56:43 PM and 7/3/2023 9:53:34 PM.
IsRegressionStdDev: Marked as regression because -33.58485450141158 (T) = (0 -30.866034245422558) / Math.Sqrt((0.579128423311183 / (40)) + (0.328134426999376 / (4))) is less than -2.0180817028167235 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (40) + (4) - 2, .025) and -0.5106382823088309 = (20.432445415223754 - 30.866034245422558) / 20.432445415223754 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

JIT Disasms

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository


Run Information

Name Value
Architecture x64
OS Windows 10.0.19042
Queue OwlWindows
Baseline 1db4357891752cc028620710fe924425235b8f89
Compare 779d53611efd10526ca2bc3e94ce13ee18ad493a
Diff Diff
Configs CompilationMode:tiered, RunKind:micro

Regressions in System.Text.Perf_Ascii

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
ToUpperInPlace_Bytes - Duration of single invocation 8.61 ns 16.95 ns 1.97 0.07 False
ToLowerInPlace_Chars - Duration of single invocation 15.16 ns 19.97 ns 1.32 0.09 False
ToUpperInPlace_Chars - Duration of single invocation 16.09 ns 20.83 ns 1.29 0.14 False
ToLowerInPlace_Bytes - Duration of single invocation 8.64 ns 16.93 ns 1.96 0.08 False
Equals_Bytes_Chars - Duration of single invocation 9.52 ns 10.80 ns 1.13 0.10 False

graph
graph
graph
graph
graph
Test Report

Repro

General Docs link: https://github.com/dotnet/performance/blob/main/docs/benchmarking-workflow-dotnet-runtime.md

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Text.Perf_Ascii*'

Payloads

Baseline
Compare

System.Text.Perf_Ascii.ToUpperInPlace_Bytes(Size: 128)

Histogram


Description of detection logic

IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 16.945757154730803 > 9.014277712862944.
IsChangePoint: Marked as a change because one of 6/5/2023 10:43:22 AM, 6/9/2023 2:21:24 AM, 7/1/2023 6:36:20 PM, 7/3/2023 9:53:34 PM falls between 6/24/2023 6:56:43 PM and 7/3/2023 9:53:34 PM.
IsRegressionStdDev: Marked as regression because -151.00879842497986 (T) = (0 -16.8930924125945) / Math.Sqrt((0.08129746091841983 / (40)) + (0.0032330291631983525 / (4))) is less than -2.0180817028167235 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (40) + (4) - 2, .025) and -0.909989121253438 = (8.844601377367185 - 16.8930924125945) / 8.844601377367185 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

JIT Disasms

System.Text.Perf_Ascii.ToLowerInPlace_Chars(Size: 128)

Histogram


Description of detection logic

IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 19.972740460327508 > 15.927634170939974.
IsChangePoint: Marked as a change because one of 6/5/2023 10:43:22 AM, 6/8/2023 8:20:44 PM, 7/1/2023 6:36:20 PM, 7/3/2023 9:53:34 PM falls between 6/24/2023 6:56:43 PM and 7/3/2023 9:53:34 PM.
IsRegressionStdDev: Marked as regression because -20.600311019009634 (T) = (0 -20.352641518797515) / Math.Sqrt((0.2610780571372627 / (40)) + (0.17970877092796447 / (4))) is less than -2.0180817028167235 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (40) + (4) - 2, .025) and -0.2980192405173004 = (15.679768745713172 - 20.352641518797515) / 15.679768745713172 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

JIT Disasms

System.Text.Perf_Ascii.ToUpperInPlace_Chars(Size: 128)

Histogram


Description of detection logic

IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 20.832599744015933 > 16.97548517446338.
IsChangePoint: Marked as a change because one of 6/6/2023 4:05:41 PM, 6/14/2023 10:30:12 PM, 7/1/2023 6:36:20 PM, 7/3/2023 9:53:34 PM falls between 6/24/2023 6:56:43 PM and 7/3/2023 9:53:34 PM.
IsRegressionStdDev: Marked as regression because -25.709632437153054 (T) = (0 -20.657727001670693) / Math.Sqrt((0.25947699057604795 / (40)) + (0.11759928911368989 / (4))) is less than -2.0180817028167235 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (40) + (4) - 2, .025) and -0.3084990140523442 = (15.787346249268413 - 20.657727001670693) / 15.787346249268413 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

JIT Disasms

System.Text.Perf_Ascii.ToLowerInPlace_Bytes(Size: 128)

Histogram


Description of detection logic

IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 16.934460378839493 > 9.059669783187108.
IsChangePoint: Marked as a change because one of 6/5/2023 10:43:22 AM, 6/8/2023 12:15:18 PM, 7/1/2023 6:36:20 PM, 7/3/2023 9:53:34 PM falls between 6/24/2023 6:56:43 PM and 7/3/2023 9:53:34 PM.
IsRegressionStdDev: Marked as regression because -63.72675863098483 (T) = (0 -16.783452023631064) / Math.Sqrt((0.07859240846920844 / (40)) + (0.05394467739193239 / (4))) is less than -2.0180817028167235 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (40) + (4) - 2, .025) and -0.8938479755739479 = (8.862090431807065 - 16.783452023631064) / 8.862090431807065 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

JIT Disasms

System.Text.Perf_Ascii.Equals_Bytes_Chars(Size: 128)

Histogram


Description of detection logic

IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 10.801042205841588 > 9.998102832079615.
IsChangePoint: Marked as a change because one of 5/11/2023 1:19:27 PM, 6/19/2023 6:37:24 PM, 6/26/2023 10:42:28 PM, 7/3/2023 9:53:34 PM falls between 6/24/2023 6:56:43 PM and 7/3/2023 9:53:34 PM.
IsRegressionStdDev: Marked as regression because -9.229224395278091 (T) = (0 -10.525148882049088) / Math.Sqrt((0.009524277872660743 / (19)) + (0.2640697965762095 / (25))) is less than -2.0180817028167235 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (19) + (25) - 2, .025) and -0.10160634694897282 = (9.554364779396664 - 10.525148882049088) / 9.554364779396664 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

JIT Disasms

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository


Run Information

Name Value
Architecture x64
OS Windows 10.0.19042
Queue OwlWindows
Baseline 1db4357891752cc028620710fe924425235b8f89
Compare 779d53611efd10526ca2bc3e94ce13ee18ad493a
Diff Diff
Configs CompilationMode:tiered, RunKind:micro

Regressions in System.Globalization.Tests.StringSearch

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
IsPrefix_FirstHalf - Duration of single invocation 27.34 ns 29.43 ns 1.08 0.05 False
IsPrefix_DifferentFirstChar - Duration of single invocation 8.57 ns 11.13 ns 1.30 0.04 False

graph
graph
Test Report

Repro

General Docs link: https://github.com/dotnet/performance/blob/main/docs/benchmarking-workflow-dotnet-runtime.md

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Globalization.Tests.StringSearch*'

Payloads

Baseline
Compare

System.Globalization.Tests.StringSearch.IsPrefix_FirstHalf(Options: (en-US, OrdinalIgnoreCase, False))

Histogram


Description of detection logic

IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 29.427564114470147 > 28.18491171324216.
IsChangePoint: Marked as a change because one of 5/18/2023 1:58:11 PM, 6/6/2023 4:05:41 PM, 6/9/2023 2:21:24 AM, 6/22/2023 1:44:15 PM, 7/1/2023 6:36:20 PM, 7/3/2023 9:53:34 PM falls between 6/24/2023 6:56:43 PM and 7/3/2023 9:53:34 PM.
IsRegressionStdDev: Marked as regression because -30.410940801948552 (T) = (0 -29.45580965552056) / Math.Sqrt((0.2744272679300626 / (40)) + (0.000558904779451763 / (4))) is less than -2.0180817028167235 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (40) + (4) - 2, .025) and -0.0945487218262464 = (26.911373672223345 - 29.45580965552056) / 26.911373672223345 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

JIT Disasms

System.Globalization.Tests.StringSearch.IsPrefix_DifferentFirstChar(Options: (en-US, OrdinalIgnoreCase, False))

Histogram


Description of detection logic

IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 11.133991963718673 > 8.996599145260538.
IsChangePoint: Marked as a change because one of 5/26/2023 9:55:14 AM, 6/5/2023 10:43:22 AM, 6/9/2023 2:21:24 AM, 6/22/2023 7:55:14 AM, 7/1/2023 6:36:20 PM, 7/3/2023 9:53:34 PM falls between 6/24/2023 6:56:43 PM and 7/3/2023 9:53:34 PM.
IsRegressionStdDev: Marked as regression because -55.34879058916811 (T) = (0 -11.079546820537718) / Math.Sqrt((0.059902227823027156 / (40)) + (0.0018931626068120124 / (4))) is less than -2.0180817028167235 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (40) + (4) - 2, .025) and -0.2849753692394309 = (8.622380697534798 - 11.079546820537718) / 8.622380697534798 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

JIT Disasms

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository


Run Information

Name Value
Architecture x64
OS Windows 10.0.19042
Queue OwlWindows
Baseline 1db4357891752cc028620710fe924425235b8f89
Compare 779d53611efd10526ca2bc3e94ce13ee18ad493a
Diff Diff
Configs CompilationMode:tiered, RunKind:micro

Regressions in System.Tests.Perf_Enum

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
GetName_Generic_Flags - Duration of single invocation 8.14 ns 9.63 ns 1.18 0.09 False

graph
Test Report

Repro

General Docs link: https://github.com/dotnet/performance/blob/main/docs/benchmarking-workflow-dotnet-runtime.md

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Tests.Perf_Enum*'

Payloads

Baseline
Compare

System.Tests.Perf_Enum.GetName_Generic_Flags

Histogram


Description of detection logic

IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 9.631895613905973 > 8.18644994290847.
IsChangePoint: Marked as a change because one of 4/25/2023 6:46:56 PM, 5/2/2023 3:18:41 PM, 5/19/2023 10:30:38 AM, 6/22/2023 7:55:14 AM, 6/29/2023 3:17:38 AM, 7/1/2023 6:36:20 PM, 7/3/2023 9:53:34 PM falls between 6/24/2023 6:56:43 PM and 7/3/2023 9:53:34 PM.
IsRegressionStdDev: Marked as regression because -14.428731424110174 (T) = (0 -9.487004001904204) / Math.Sqrt((0.6558188555040996 / (40)) + (0.026771985569492715 / (4))) is less than -2.0180817028167235 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (40) + (4) - 2, .025) and -0.3005562492753936 = (7.294574154089759 - 9.487004001904204) / 7.294574154089759 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

JIT Disasms

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository


Run Information

Name Value
Architecture x64
OS Windows 10.0.19042
Queue OwlWindows
Baseline 1db4357891752cc028620710fe924425235b8f89
Compare 779d53611efd10526ca2bc3e94ce13ee18ad493a
Diff Diff
Configs CompilationMode:tiered, RunKind:micro

Regressions in Benchstone.BenchI.TreeInsert

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
Test - Duration of single invocation 43.51 μs 48.65 μs 1.12 0.04 False

graph
Test Report

Repro

General Docs link: https://github.com/dotnet/performance/blob/main/docs/benchmarking-workflow-dotnet-runtime.md

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'Benchstone.BenchI.TreeInsert*'

Payloads

Baseline
Compare

Benchstone.BenchI.TreeInsert.Test

Histogram


Description of detection logic

IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsRegressionBase: Marked as regression because the compare was 5% greater than the baseline, and the value was not too small.
IsRegressionChecked: Marked as regression because the three check build points were 0.05 greater than the baseline.
IsRegressionWindowed: Marked as regression because 48.6515 > 45.69014879609668.
IsChangePoint: Marked as a change because one of 4/25/2023 6:46:56 PM, 5/1/2023 3:42:23 PM, 6/13/2023 11:57:38 AM, 6/22/2023 7:55:14 AM, 7/1/2023 6:36:20 PM, 7/3/2023 9:53:34 PM falls between 6/24/2023 6:56:43 PM and 7/3/2023 9:53:34 PM.
IsRegressionStdDev: Marked as regression because -18.54451797515939 (T) = (0 -48260.33791208791) / Math.Sqrt((1190351.7026885014 / (40)) + (72826.05635012857 / (4))) is less than -2.0180817028167235 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (40) + (4) - 2, .025) and -0.09188987074540791 = (44198.906139812156 - 48260.33791208791) / 44198.906139812156 is less than -0.05.
IsImprovementBase: Marked as not an improvement because the compare was not 5% less than the baseline, or the value was too small.
IsChangeEdgeDetector: Marked not as a regression because Edge Detector said so.

JIT Disasms

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository

Author: performanceautofiler[bot]
Assignees: -
Labels:

area-System.Linq, os-windows, arch-x64, untriaged, runtime-coreclr, needs-area-label

Milestone: -

@AndyAyersMS
Copy link
Member

I merged a fix for EmptyTakeSelectToArray

Looks like that worked nicely:

image

Do we think the others are just noise?

@AndyAyersMS
Copy link
Member

#88238 and #88130 also lie in this commit window (at least for the linux arm64 results).

@vcsjones vcsjones removed the needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners label Jul 11, 2023
@eiriktsarpalis eiriktsarpalis removed the untriaged New issue has not been triaged by the area owner label Jul 13, 2023
@eiriktsarpalis eiriktsarpalis added this to the 8.0.0 milestone Jul 13, 2023
@jakobbotsch
Copy link
Member

The ToStringHex benchmarks look fixed by #88385. The rest also look fixed or like they were just noise, so am going to close this.

@ghost ghost locked as resolved and limited conversation to collaborators Aug 18, 2023
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

8 participants