dotnet / perf-autofiling-issues

A landing place for auto-filed performance issues before they receive triage
MIT License
9 stars 4 forks source link

[Perf] Windows/x86: 11 Regressions on 1/13/2023 4:37:08 PM #11754

Open performanceautofiler[bot] opened 1 year ago

performanceautofiler[bot] commented 1 year ago

Run Information

Architecture x86
OS Windows 10.0.18362
Baseline 414018530f0788c418d92ff817bb5fd6932324f6
Compare 32cb6bb23d58c00975a2d80d62fe90998e780772
Diff Diff

Regressions in System.IO.Tests.Perf_FileStream

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
[WriteAsync_NoBuffering - Duration of single invocation](<https://pvscmdupload.z22.web.core.windows.net/reports/allTestHistory/refs/heads/main_x86_Windows 10.0.18362/System.IO.Tests.Perf_FileStream.WriteAsync_NoBuffering(fileSize%3a%201048576%2c%20userBufferSize%3a%2016384%2c%20options%3a%200).html>) 752.62 μs 1.08 ms 1.43 0.64 False

graph Test Report

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.IO.Tests.Perf_FileStream*'
### Payloads [Baseline]() [Compare]() ### Histogram #### System.IO.Tests.Perf_FileStream.WriteAsync_NoBuffering(fileSize: 1048576, userBufferSize: 16384, options: 0) ```log ``` ### 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 1.0750257790858724 > 783.2294414271391. IsChangePoint: Marked as a change because one of 1/13/2023 11:01:49 AM, 1/17/2023 6:49:05 AM falls between 1/8/2023 8:00:22 AM and 1/17/2023 6:49:05 AM. IsRegressionStdDev: Marked as regression because -3.7892275461742306 (T) = (0 -961158.7289736615) / Math.Sqrt((5155926427.505952 / (36)) + (40843478997.44924 / (20))) is less than -2.0048792881871513 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (36) + (20) - 2, .025) and -0.2259377985733901 = (784019.16483214 - 961158.7289736615) / 784019.16483214 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. ``` ### Docs [Profiling workflow for dotnet/runtime repository](https://github.com/dotnet/performance/blob/master/docs/profiling-workflow-dotnet-runtime.md) [Benchmarking workflow for dotnet/runtime repository](https://github.com/dotnet/performance/blob/master/docs/benchmarking-workflow-dotnet-runtime.md)

Run Information

Architecture x86
OS Windows 10.0.18362
Baseline 414018530f0788c418d92ff817bb5fd6932324f6
Compare 32cb6bb23d58c00975a2d80d62fe90998e780772
Diff Diff

Regressions in System.Globalization.Tests.StringEquality

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
[Compare_Same - Duration of single invocation](<https://pvscmdupload.z22.web.core.windows.net/reports/allTestHistory/refs/heads/main_x86_Windows 10.0.18362/System.Globalization.Tests.StringEquality.Compare_Same(Count%3a%201024%2c%20Options%3a%20(en-US%2c%20Ordinal)).html>) 55.70 ns 61.86 ns 1.11 0.08 False 692.4369483966206 723.4369571156146 1.0447694317739347 Trace Trace
[Compare_DifferentFirstChar - Duration of single invocation](<https://pvscmdupload.z22.web.core.windows.net/reports/allTestHistory/refs/heads/main_x86_Windows 10.0.18362/System.Globalization.Tests.StringEquality.Compare_DifferentFirstChar(Count%3a%201024%2c%20Options%3a%20(en-US%2c%20OrdinalIgnoreCase)).html>) 11.77 ns 17.56 ns 1.49 0.03 False Trace Trace
[Compare_Same_Upper - Duration of single invocation](<https://pvscmdupload.z22.web.core.windows.net/reports/allTestHistory/refs/heads/main_x86_Windows 10.0.18362/System.Globalization.Tests.StringEquality.Compare_Same_Upper(Count%3a%201024%2c%20Options%3a%20(en-US%2c%20Ordinal)).html>) 16.40 ns 20.13 ns 1.23 0.19 False Trace Trace

graph graph graph Test Report

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Globalization.Tests.StringEquality*'
### Payloads [Baseline]() [Compare]() ### Histogram #### System.Globalization.Tests.StringEquality.Compare_Same(Count: 1024, Options: (en-US, Ordinal)) ```log ``` ### 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 61.85614767653383 > 57.6559121128219. IsChangePoint: Marked as a change because one of 1/13/2023 11:01:49 AM, 1/17/2023 6:49:05 AM falls between 1/8/2023 8:00:22 AM and 1/17/2023 6:49:05 AM. IsRegressionStdDev: Marked as regression because -14.47504807376352 (T) = (0 -60.918917546902286) / Math.Sqrt((2.2212367450217267 / (36)) + (2.219842266480239 / (20))) is less than -2.0048792881871513 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (36) + (20) - 2, .025) and -0.10956115904693944 = (54.90361396502808 - 60.918917546902286) / 54.90361396502808 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. ```### Baseline Jit Disasm ```assembly ; System.Globalization.Tests.StringEquality.Compare_Same() push ebp mov ebp,esp push esi mov esi,ecx mov ecx,[esi+18] mov eax,[ecx] mov eax,[eax+2C] call dword ptr [eax+18] mov ecx,eax mov edx,[esi+4] push dword ptr [esi+8] push dword ptr [esi+1C] cmp [ecx],ecx call dword ptr ds:[9059780]; System.Globalization.CompareInfo.Compare(System.String, System.String, System.Globalization.CompareOptions) pop esi pop ebp ret ; Total bytes of code 39 ``` ```assembly ; System.Globalization.CompareInfo.Compare(System.String, System.String, System.Globalization.CompareOptions) push ebp mov ebp,esp push edi push esi mov eax,[ebp+0C] test edx,edx je short M01_L02 test eax,eax je short M01_L05 lea esi,[edx+8] mov edx,[edx+4] lea edi,[eax+8] mov eax,[eax+4] push edx push esi push eax push edi mov edx,[ebp+8] call dword ptr ds:[9059810]; System.Globalization.CompareInfo.Compare(System.ReadOnlySpan`1, System.ReadOnlySpan`1, System.Globalization.CompareOptions) pop esi pop edi pop ebp ret 8 M01_L00: mov edx,[ebp+8] test edx,0DFFFFFE0 je short M01_L01 cmp edx,40000000 je short M01_L01 cmp edx,10000000 je short M01_L01 mov ecx,edx call dword ptr ds:[9059840] int 3 M01_L01: pop esi pop edi pop ebp ret 8 M01_L02: test eax,eax je short M01_L03 mov eax,0FFFFFFFF jmp short M01_L04 M01_L03: xor eax,eax M01_L04: jmp short M01_L00 M01_L05: mov eax,1 jmp short M01_L00 ; Total bytes of code 111 ``` ### Compare Jit Disasm ```assembly ; System.Globalization.Tests.StringEquality.Compare_Same() push ebp mov ebp,esp push esi mov esi,ecx mov ecx,[esi+18] mov eax,[ecx] mov eax,[eax+2C] call dword ptr [eax+18] mov ecx,eax mov edx,[esi+4] push dword ptr [esi+8] push dword ptr [esi+1C] cmp [ecx],ecx call dword ptr ds:[850D198]; System.Globalization.CompareInfo.Compare(System.String, System.String, System.Globalization.CompareOptions) pop esi pop ebp ret ; Total bytes of code 39 ``` ```assembly ; System.Globalization.CompareInfo.Compare(System.String, System.String, System.Globalization.CompareOptions) push ebp mov ebp,esp push edi push esi mov eax,[ebp+0C] test edx,edx je short M01_L02 test eax,eax je short M01_L05 lea esi,[edx+8] mov edx,[edx+4] lea edi,[eax+8] mov eax,[eax+4] push edx push esi push eax push edi mov edx,[ebp+8] call dword ptr ds:[850D228]; System.Globalization.CompareInfo.Compare(System.ReadOnlySpan`1, System.ReadOnlySpan`1, System.Globalization.CompareOptions) pop esi pop edi pop ebp ret 8 M01_L00: mov edx,[ebp+8] test edx,0DFFFFFE0 je short M01_L01 cmp edx,40000000 je short M01_L01 cmp edx,10000000 je short M01_L01 mov ecx,edx call dword ptr ds:[850D258] int 3 M01_L01: pop esi pop edi pop ebp ret 8 M01_L02: test eax,eax je short M01_L03 mov eax,0FFFFFFFF jmp short M01_L04 M01_L03: xor eax,eax M01_L04: jmp short M01_L00 M01_L05: mov eax,1 jmp short M01_L00 ; Total bytes of code 111 ``` #### System.Globalization.Tests.StringEquality.Compare_DifferentFirstChar(Count: 1024, Options: (en-US, OrdinalIgnoreCase)) ```log ``` ### 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 17.564406758801034 > 12.309010791590982. IsChangePoint: Marked as a change because one of 1/13/2023 4:18:46 AM, 1/17/2023 6:49:05 AM falls between 1/8/2023 8:00:22 AM and 1/17/2023 6:49:05 AM. IsRegressionStdDev: Marked as regression because -141.67259260070477 (T) = (0 -17.599830615575954) / Math.Sqrt((0.02755470898034191 / (35)) + (0.018670612474665595 / (21))) is less than -2.0048792881871513 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (35) + (21) - 2, .025) and -0.4916012583517598 = (11.799286516440736 - 17.599830615575954) / 11.799286516440736 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. ```### Baseline Jit Disasm ```assembly ; System.Globalization.Tests.StringEquality.Compare_DifferentFirstChar() push ebp mov ebp,esp push esi mov esi,ecx mov ecx,[esi+18] mov eax,[ecx] mov eax,[eax+2C] call dword ptr [eax+18] mov ecx,eax mov edx,[esi+4] push dword ptr [esi+10] push dword ptr [esi+1C] cmp [ecx],ecx call dword ptr ds:[8609780]; System.Globalization.CompareInfo.Compare(System.String, System.String, System.Globalization.CompareOptions) pop esi pop ebp ret ; Total bytes of code 39 ``` ```assembly ; System.Globalization.CompareInfo.Compare(System.String, System.String, System.Globalization.CompareOptions) push ebp mov ebp,esp push edi push esi mov eax,[ebp+0C] test edx,edx je short M01_L02 test eax,eax je short M01_L05 lea esi,[edx+8] mov edx,[edx+4] lea edi,[eax+8] mov eax,[eax+4] push edx push esi push eax push edi mov edx,[ebp+8] call dword ptr ds:[8609810]; System.Globalization.CompareInfo.Compare(System.ReadOnlySpan`1, System.ReadOnlySpan`1, System.Globalization.CompareOptions) pop esi pop edi pop ebp ret 8 M01_L00: mov edx,[ebp+8] test edx,0DFFFFFE0 je short M01_L01 cmp edx,40000000 je short M01_L01 cmp edx,10000000 je short M01_L01 mov ecx,edx call dword ptr ds:[8609840] int 3 M01_L01: pop esi pop edi pop ebp ret 8 M01_L02: test eax,eax je short M01_L03 mov eax,0FFFFFFFF jmp short M01_L04 M01_L03: xor eax,eax M01_L04: jmp short M01_L00 M01_L05: mov eax,1 jmp short M01_L00 ; Total bytes of code 111 ``` ### Compare Jit Disasm ```assembly ; System.Globalization.Tests.StringEquality.Compare_DifferentFirstChar() push ebp mov ebp,esp push esi mov esi,ecx mov ecx,[esi+18] mov eax,[ecx] mov eax,[eax+2C] call dword ptr [eax+18] mov ecx,eax mov edx,[esi+4] push dword ptr [esi+10] push dword ptr [esi+1C] cmp [ecx],ecx call dword ptr ds:[872D198]; System.Globalization.CompareInfo.Compare(System.String, System.String, System.Globalization.CompareOptions) pop esi pop ebp ret ; Total bytes of code 39 ``` ```assembly ; System.Globalization.CompareInfo.Compare(System.String, System.String, System.Globalization.CompareOptions) push ebp mov ebp,esp push edi push esi mov eax,[ebp+0C] test edx,edx je short M01_L02 test eax,eax je short M01_L05 lea esi,[edx+8] mov edx,[edx+4] lea edi,[eax+8] mov eax,[eax+4] push edx push esi push eax push edi mov edx,[ebp+8] call dword ptr ds:[872D228]; System.Globalization.CompareInfo.Compare(System.ReadOnlySpan`1, System.ReadOnlySpan`1, System.Globalization.CompareOptions) pop esi pop edi pop ebp ret 8 M01_L00: mov edx,[ebp+8] test edx,0DFFFFFE0 je short M01_L01 cmp edx,40000000 je short M01_L01 cmp edx,10000000 je short M01_L01 mov ecx,edx call dword ptr ds:[872D258] int 3 M01_L01: pop esi pop edi pop ebp ret 8 M01_L02: test eax,eax je short M01_L03 mov eax,0FFFFFFFF jmp short M01_L04 M01_L03: xor eax,eax M01_L04: jmp short M01_L00 M01_L05: mov eax,1 jmp short M01_L00 ; Total bytes of code 111 ``` #### System.Globalization.Tests.StringEquality.Compare_Same_Upper(Count: 1024, Options: (en-US, Ordinal)) ```log ``` ### 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.13223087110751 > 17.236765963860314. IsChangePoint: Marked as a change because one of 1/12/2023 10:41:19 PM, 1/17/2023 6:49:05 AM falls between 1/8/2023 8:00:22 AM and 1/17/2023 6:49:05 AM. IsRegressionStdDev: Marked as regression because -8.62422026969513 (T) = (0 -21.065510884360666) / Math.Sqrt((1.656370157262888 / (34)) + (4.14647398909268 / (22))) is less than -2.0048792881871513 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (34) + (22) - 2, .025) and -0.24904421779161973 = (16.865304353760727 - 21.065510884360666) / 16.865304353760727 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. ```### Baseline Jit Disasm ```assembly ; System.Globalization.Tests.StringEquality.Compare_Same_Upper() push ebp mov ebp,esp push esi mov esi,ecx mov ecx,[esi+18] mov eax,[ecx] mov eax,[eax+2C] call dword ptr [eax+18] mov ecx,eax mov edx,[esi+4] push dword ptr [esi+0C] push dword ptr [esi+1C] cmp [ecx],ecx call dword ptr ds:[8569780]; System.Globalization.CompareInfo.Compare(System.String, System.String, System.Globalization.CompareOptions) pop esi pop ebp ret ; Total bytes of code 39 ``` ```assembly ; System.Globalization.CompareInfo.Compare(System.String, System.String, System.Globalization.CompareOptions) push ebp mov ebp,esp push edi push esi mov eax,[ebp+0C] test edx,edx je short M01_L02 test eax,eax je short M01_L05 lea esi,[edx+8] mov edx,[edx+4] lea edi,[eax+8] mov eax,[eax+4] push edx push esi push eax push edi mov edx,[ebp+8] call dword ptr ds:[8569810]; System.Globalization.CompareInfo.Compare(System.ReadOnlySpan`1, System.ReadOnlySpan`1, System.Globalization.CompareOptions) pop esi pop edi pop ebp ret 8 M01_L00: mov edx,[ebp+8] test edx,0DFFFFFE0 je short M01_L01 cmp edx,40000000 je short M01_L01 cmp edx,10000000 je short M01_L01 mov ecx,edx call dword ptr ds:[8569840] int 3 M01_L01: pop esi pop edi pop ebp ret 8 M01_L02: test eax,eax je short M01_L03 mov eax,0FFFFFFFF jmp short M01_L04 M01_L03: xor eax,eax M01_L04: jmp short M01_L00 M01_L05: mov eax,1 jmp short M01_L00 ; Total bytes of code 111 ``` ### Compare Jit Disasm ```assembly ; System.Globalization.Tests.StringEquality.Compare_Same_Upper() push ebp mov ebp,esp push esi mov esi,ecx mov ecx,[esi+18] mov eax,[ecx] mov eax,[eax+2C] call dword ptr [eax+18] mov ecx,eax mov edx,[esi+4] push dword ptr [esi+0C] push dword ptr [esi+1C] cmp [ecx],ecx call dword ptr ds:[88CD198]; System.Globalization.CompareInfo.Compare(System.String, System.String, System.Globalization.CompareOptions) pop esi pop ebp ret ; Total bytes of code 39 ``` ```assembly ; System.Globalization.CompareInfo.Compare(System.String, System.String, System.Globalization.CompareOptions) push ebp mov ebp,esp push edi push esi mov eax,[ebp+0C] test edx,edx je short M01_L02 test eax,eax je short M01_L05 lea esi,[edx+8] mov edx,[edx+4] lea edi,[eax+8] mov eax,[eax+4] push edx push esi push eax push edi mov edx,[ebp+8] call dword ptr ds:[88CD228]; System.Globalization.CompareInfo.Compare(System.ReadOnlySpan`1, System.ReadOnlySpan`1, System.Globalization.CompareOptions) pop esi pop edi pop ebp ret 8 M01_L00: mov edx,[ebp+8] test edx,0DFFFFFE0 je short M01_L01 cmp edx,40000000 je short M01_L01 cmp edx,10000000 je short M01_L01 mov ecx,edx call dword ptr ds:[88CD258] int 3 M01_L01: pop esi pop edi pop ebp ret 8 M01_L02: test eax,eax je short M01_L03 mov eax,0FFFFFFFF jmp short M01_L04 M01_L03: xor eax,eax M01_L04: jmp short M01_L00 M01_L05: mov eax,1 jmp short M01_L00 ; Total bytes of code 111 ``` ### Docs [Profiling workflow for dotnet/runtime repository](https://github.com/dotnet/performance/blob/master/docs/profiling-workflow-dotnet-runtime.md) [Benchmarking workflow for dotnet/runtime repository](https://github.com/dotnet/performance/blob/master/docs/benchmarking-workflow-dotnet-runtime.md)

Run Information

Architecture x86
OS Windows 10.0.18362
Baseline 414018530f0788c418d92ff817bb5fd6932324f6
Compare 32cb6bb23d58c00975a2d80d62fe90998e780772
Diff Diff

Regressions in System.Drawing.Tests.Perf_Color

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
[GetHue - Duration of single invocation](<https://pvscmdupload.z22.web.core.windows.net/reports/allTestHistory/refs/heads/main_x86_Windows 10.0.18362/System.Drawing.Tests.Perf_Color.GetHue.html>) 1.04 μs 1.21 μs 1.16 0.03 False 11753.903571240173 11260.103095363213 0.9579883846345986 Trace Trace
[GetBrightness - Duration of single invocation](<https://pvscmdupload.z22.web.core.windows.net/reports/allTestHistory/refs/heads/main_x86_Windows 10.0.18362/System.Drawing.Tests.Perf_Color.GetBrightness.html>) 831.19 ns 910.69 ns 1.10 0.02 False 9130.600936275914 8662.700516384912 0.9487546960866472 Trace Trace

graph graph Test Report

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Drawing.Tests.Perf_Color*'
### Payloads [Baseline]() [Compare]() ### Histogram #### System.Drawing.Tests.Perf_Color.GetHue ```log ``` ### 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 1.2053895486325314 > 1.0830139583527059. IsChangePoint: Marked as a change because one of 11/18/2022 7:31:41 AM, 12/14/2022 5:20:21 PM, 12/20/2022 1:34:12 PM, 1/5/2023 11:35:29 PM, 1/13/2023 11:01:49 AM, 1/17/2023 6:49:05 AM falls between 1/8/2023 8:00:22 AM and 1/17/2023 6:49:05 AM. IsRegressionStdDev: Marked as regression because -19.088277157096176 (T) = (0 -1205.016291396221) / Math.Sqrt((2363.732657563055 / (36)) + (27.96318707949588 / (20))) is less than -2.0048792881871513 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (36) + (20) - 2, .025) and -0.1490516228861211 = (1048.705095050065 - 1205.016291396221) / 1048.705095050065 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. ```### Baseline Jit Disasm ```assembly ; System.Drawing.Tests.Perf_Color.GetHue() push ebp mov ebp,esp push edi push esi push ebx sub esp,8 vzeroupper vxorps xmm0,xmm0,xmm0 vmovss dword ptr [ebp-10],xmm0 mov esi,ds:[74F4580] xor edi,edi mov ebx,[esi+4] test ebx,ebx jle short M00_L03 M00_L00: mov ecx,edi shl ecx,4 lea ecx,[esi+ecx+8] call dword ptr ds:[0AE7D9A8]; System.Drawing.Color.GetHue() fstp dword ptr [ebp-14] vmovss xmm0,dword ptr [ebp-14] vaddss xmm0,xmm0,dword ptr [ebp-10] inc edi cmp ebx,edi jg short M00_L02 M00_L01: vmovss dword ptr [ebp-10],xmm0 fld dword ptr [ebp-10] lea esp,[ebp-0C] pop ebx pop esi pop edi pop ebp ret M00_L02: vmovss dword ptr [ebp-10],xmm0 jmp short M00_L00 M00_L03: vmovss xmm0,dword ptr [ebp-10] jmp short M00_L01 ; Total bytes of code 99 ``` ```assembly ; System.Drawing.Color.GetHue() push ebp mov ebp,esp push edi push esi push ebx push eax vzeroupper movsx eax,word ptr [ecx+0E] test al,2 je short M01_L00 mov esi,[ecx] mov ebx,esi jmp short M01_L02 M01_L00: test al,1 je short M01_L01 movsx ecx,word ptr [ecx+0C] call dword ptr ds:[0B8E7030]; System.Drawing.KnownColorTable.KnownColorToArgb(System.Drawing.KnownColor) mov ebx,eax jmp short M01_L02 M01_L01: xor ebx,ebx M01_L02: mov eax,ebx and eax,0FF0000 sar eax,10 mov edx,ebx and edx,0FF00 sar edx,8 movzx ecx,bl cmp eax,edx jne short M01_L03 cmp edx,ecx jne short M01_L03 vxorps xmm0,xmm0,xmm0 vmovss dword ptr [ebp-10],xmm0 fld dword ptr [ebp-10] pop ecx pop ebx pop esi pop edi pop ebp ret M01_L03: mov esi,eax mov edi,edx cmp esi,edi jle short M01_L04 mov esi,eax mov edi,edx jmp short M01_L05 M01_L04: mov esi,edx mov edi,eax M01_L05: cmp ecx,esi jle short M01_L06 mov esi,ecx jmp short M01_L07 M01_L06: cmp ecx,edi jge short M01_L07 mov edi,ecx M01_L07: mov ebx,esi sub ebx,edi vxorps xmm0,xmm0,xmm0 vcvtsi2ss xmm0,xmm0,ebx cmp eax,esi jne short M01_L08 sub edx,ecx vxorps xmm1,xmm1,xmm1 vcvtsi2ss xmm1,xmm1,edx vdivss xmm1,xmm1,xmm0 jmp short M01_L10 M01_L08: cmp edx,esi jne short M01_L09 sub ecx,eax vxorps xmm1,xmm1,xmm1 vcvtsi2ss xmm1,xmm1,ecx vdivss xmm0,xmm1,xmm0 vaddss xmm1,xmm0,dword ptr ds:[0B8C75F0] jmp short M01_L10 M01_L09: sub eax,edx vxorps xmm1,xmm1,xmm1 vcvtsi2ss xmm1,xmm1,eax vdivss xmm0,xmm1,xmm0 vaddss xmm1,xmm0,dword ptr ds:[0B8C75F4] M01_L10: vmulss xmm1,xmm1,dword ptr ds:[0B8C75F8] vxorps xmm0,xmm0,xmm0 vucomiss xmm0,xmm1 jbe short M01_L11 vaddss xmm1,xmm1,dword ptr ds:[0B8C75FC] M01_L11: vmovss dword ptr [ebp-10],xmm1 fld dword ptr [ebp-10] pop ecx pop ebx pop esi pop edi pop ebp ret ; Total bytes of code 248 ``` ### Compare Jit Disasm ```assembly ; System.Drawing.Tests.Perf_Color.GetHue() push ebp mov ebp,esp push edi push esi push ebx sub esp,8 vzeroupper vxorps xmm0,xmm0,xmm0 vmovss dword ptr [ebp-10],xmm0 mov esi,ds:[740458C] xor edi,edi mov ebx,[esi+4] test ebx,ebx jle short M00_L03 M00_L00: mov ecx,edi shl ecx,4 lea ecx,[esi+ecx+8] call dword ptr ds:[0AF519A8]; System.Drawing.Color.GetHue() fstp dword ptr [ebp-14] vmovss xmm0,dword ptr [ebp-14] vaddss xmm0,xmm0,dword ptr [ebp-10] inc edi cmp ebx,edi jg short M00_L02 M00_L01: vmovss dword ptr [ebp-10],xmm0 fld dword ptr [ebp-10] lea esp,[ebp-0C] pop ebx pop esi pop edi pop ebp ret M00_L02: vmovss dword ptr [ebp-10],xmm0 jmp short M00_L00 M00_L03: vmovss xmm0,dword ptr [ebp-10] jmp short M00_L01 ; Total bytes of code 99 ``` ```assembly ; System.Drawing.Color.GetHue() push ebp mov ebp,esp push edi push esi push ebx push eax vzeroupper movsx eax,word ptr [ecx+0E] test al,2 je short M01_L00 mov esi,[ecx] mov ebx,esi jmp short M01_L02 M01_L00: test al,1 je short M01_L01 movsx ecx,word ptr [ecx+0C] call dword ptr ds:[0B87B6C0]; System.Drawing.KnownColorTable.KnownColorToArgb(System.Drawing.KnownColor) mov ebx,eax jmp short M01_L02 M01_L01: xor ebx,ebx M01_L02: mov eax,ebx and eax,0FF0000 sar eax,10 mov edx,ebx and edx,0FF00 sar edx,8 movzx ecx,bl cmp eax,edx jne short M01_L03 cmp edx,ecx jne short M01_L03 vxorps xmm0,xmm0,xmm0 vmovss dword ptr [ebp-10],xmm0 fld dword ptr [ebp-10] pop ecx pop ebx pop esi pop edi pop ebp ret M01_L03: mov esi,eax mov edi,edx cmp esi,edi jle short M01_L04 mov esi,eax mov edi,edx jmp short M01_L05 M01_L04: mov esi,edx mov edi,eax M01_L05: cmp ecx,esi jle short M01_L06 mov esi,ecx jmp short M01_L07 M01_L06: cmp ecx,edi jge short M01_L07 mov edi,ecx M01_L07: mov ebx,esi sub ebx,edi vxorps xmm0,xmm0,xmm0 vcvtsi2ss xmm0,xmm0,ebx cmp eax,esi jne short M01_L08 sub edx,ecx vxorps xmm1,xmm1,xmm1 vcvtsi2ss xmm1,xmm1,edx vdivss xmm1,xmm1,xmm0 jmp short M01_L10 M01_L08: cmp edx,esi jne short M01_L09 sub ecx,eax vxorps xmm1,xmm1,xmm1 vcvtsi2ss xmm1,xmm1,ecx vdivss xmm0,xmm1,xmm0 vaddss xmm1,xmm0,dword ptr ds:[0B8472A8] jmp short M01_L10 M01_L09: sub eax,edx vxorps xmm1,xmm1,xmm1 vcvtsi2ss xmm1,xmm1,eax vdivss xmm0,xmm1,xmm0 vaddss xmm1,xmm0,dword ptr ds:[0B8472AC] M01_L10: vmulss xmm1,xmm1,dword ptr ds:[0B8472B0] vxorps xmm0,xmm0,xmm0 vucomiss xmm0,xmm1 jbe short M01_L11 vaddss xmm1,xmm1,dword ptr ds:[0B8472B4] M01_L11: vmovss dword ptr [ebp-10],xmm1 fld dword ptr [ebp-10] pop ecx pop ebx pop esi pop edi pop ebp ret ; Total bytes of code 248 ``` #### System.Drawing.Tests.Perf_Color.GetBrightness ```log ``` ### 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 910.6906988333235 > 873.9142902164135. IsChangePoint: Marked as a change because one of 11/18/2022 7:31:41 AM, 12/6/2022 2:12:43 AM, 12/14/2022 12:26:48 AM, 1/13/2023 4:37:08 PM, 1/17/2023 6:49:05 AM falls between 1/8/2023 8:00:22 AM and 1/17/2023 6:49:05 AM. IsRegressionStdDev: Marked as regression because -39.20243291521854 (T) = (0 -909.2105397948152) / Math.Sqrt((95.48151183525748 / (37)) + (13.045701049764835 / (19))) is less than -2.0048792881871513 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (37) + (19) - 2, .025) and -0.08452302099353026 = (838.350613306381 - 909.2105397948152) / 838.350613306381 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. ```### Baseline Jit Disasm ```assembly ; System.Drawing.Tests.Perf_Color.GetBrightness() push ebp mov ebp,esp push edi push esi push ebx sub esp,8 vzeroupper vxorps xmm0,xmm0,xmm0 vmovss dword ptr [ebp-10],xmm0 mov esi,ds:[7114580] xor edi,edi mov ebx,[esi+4] test ebx,ebx jle short M00_L03 M00_L00: mov ecx,edi shl ecx,4 lea ecx,[esi+ecx+8] call dword ptr ds:[0AB0D990]; System.Drawing.Color.GetBrightness() fstp dword ptr [ebp-14] vmovss xmm0,dword ptr [ebp-14] vaddss xmm0,xmm0,dword ptr [ebp-10] inc edi cmp ebx,edi jg short M00_L02 M00_L01: vmovss dword ptr [ebp-10],xmm0 fld dword ptr [ebp-10] lea esp,[ebp-0C] pop ebx pop esi pop edi pop ebp ret M00_L02: vmovss dword ptr [ebp-10],xmm0 jmp short M00_L00 M00_L03: vmovss xmm0,dword ptr [ebp-10] jmp short M00_L01 ; Total bytes of code 99 ``` ```assembly ; System.Drawing.Color.GetBrightness() push ebp mov ebp,esp push esi push ebx push eax vzeroupper movsx eax,word ptr [ecx+0E] test al,2 je short M01_L00 mov esi,[ecx] mov ebx,esi jmp short M01_L02 M01_L00: test al,1 je short M01_L01 movsx ecx,word ptr [ecx+0C] call dword ptr ds:[0B577030]; System.Drawing.KnownColorTable.KnownColorToArgb(System.Drawing.KnownColor) mov ebx,eax jmp short M01_L02 M01_L01: xor ebx,ebx M01_L02: mov eax,ebx and eax,0FF0000 sar eax,10 mov edx,ebx and edx,0FF00 sar edx,8 movzx ecx,bl cmp eax,edx jle short M01_L03 jmp short M01_L04 M01_L03: xchg eax,edx M01_L04: cmp ecx,eax jle short M01_L05 mov eax,ecx jmp short M01_L06 M01_L05: cmp ecx,edx jge short M01_L06 mov edx,ecx M01_L06: add eax,edx vxorps xmm0,xmm0,xmm0 vcvtsi2ss xmm0,xmm0,eax vdivss xmm0,xmm0,ds:[0B5574B0] vmovss dword ptr [ebp-0C],xmm0 fld dword ptr [ebp-0C] pop ecx pop ebx pop esi pop ebp ret ; Total bytes of code 120 ``` ### Compare Jit Disasm ```assembly ; System.Drawing.Tests.Perf_Color.GetBrightness() push ebp mov ebp,esp push edi push esi push ebx sub esp,8 vzeroupper vxorps xmm0,xmm0,xmm0 vmovss dword ptr [ebp-10],xmm0 mov esi,ds:[6C6458C] xor edi,edi mov ebx,[esi+4] test ebx,ebx jle short M00_L03 M00_L00: mov ecx,edi shl ecx,4 lea ecx,[esi+ecx+8] call dword ptr ds:[0A771990]; System.Drawing.Color.GetBrightness() fstp dword ptr [ebp-14] vmovss xmm0,dword ptr [ebp-14] vaddss xmm0,xmm0,dword ptr [ebp-10] inc edi cmp ebx,edi jg short M00_L02 M00_L01: vmovss dword ptr [ebp-10],xmm0 fld dword ptr [ebp-10] lea esp,[ebp-0C] pop ebx pop esi pop edi pop ebp ret M00_L02: vmovss dword ptr [ebp-10],xmm0 jmp short M00_L00 M00_L03: vmovss xmm0,dword ptr [ebp-10] jmp short M00_L01 ; Total bytes of code 99 ``` ```assembly ; System.Drawing.Color.GetBrightness() push ebp mov ebp,esp push esi push ebx push eax vzeroupper movsx eax,word ptr [ecx+0E] test al,2 je short M01_L00 mov esi,[ecx] mov ebx,esi jmp short M01_L02 M01_L00: test al,1 je short M01_L01 movsx ecx,word ptr [ecx+0C] call dword ptr ds:[0B09B6C0]; System.Drawing.KnownColorTable.KnownColorToArgb(System.Drawing.KnownColor) mov ebx,eax jmp short M01_L02 M01_L01: xor ebx,ebx M01_L02: mov eax,ebx and eax,0FF0000 sar eax,10 mov edx,ebx and edx,0FF00 sar edx,8 movzx ecx,bl cmp eax,edx jle short M01_L03 jmp short M01_L04 M01_L03: xchg eax,edx M01_L04: cmp ecx,eax jle short M01_L05 mov eax,ecx jmp short M01_L06 M01_L05: cmp ecx,edx jge short M01_L06 mov edx,ecx M01_L06: add eax,edx vxorps xmm0,xmm0,xmm0 vcvtsi2ss xmm0,xmm0,eax vdivss xmm0,xmm0,ds:[0B0671B0] vmovss dword ptr [ebp-0C],xmm0 fld dword ptr [ebp-0C] pop ecx pop ebx pop esi pop ebp ret ; Total bytes of code 120 ``` ### Docs [Profiling workflow for dotnet/runtime repository](https://github.com/dotnet/performance/blob/master/docs/profiling-workflow-dotnet-runtime.md) [Benchmarking workflow for dotnet/runtime repository](https://github.com/dotnet/performance/blob/master/docs/benchmarking-workflow-dotnet-runtime.md)

Run Information

Architecture x86
OS Windows 10.0.18362
Baseline 414018530f0788c418d92ff817bb5fd6932324f6
Compare 32cb6bb23d58c00975a2d80d62fe90998e780772
Diff Diff

Regressions in System.Collections.Tests.Perf_SortedSet

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
[Min - Duration of single invocation](<https://pvscmdupload.z22.web.core.windows.net/reports/allTestHistory/refs/heads/main_x86_Windows 10.0.18362/System.Collections.Tests.Perf_SortedSet.Min.html>) 12.77 ns 20.31 ns 1.59 0.08 False Trace Trace

graph Test Report

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Collections.Tests.Perf_SortedSet*'
### Payloads [Baseline]() [Compare]() ### Histogram #### System.Collections.Tests.Perf_SortedSet.Min ```log ``` ### 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.314431073629866 > 13.337332561411625. IsChangePoint: Marked as a change because one of 1/13/2023 11:01:49 AM, 1/17/2023 6:49:05 AM falls between 1/8/2023 8:00:22 AM and 1/17/2023 6:49:05 AM. IsRegressionStdDev: Marked as regression because -58.390677600546944 (T) = (0 -20.520814079417924) / Math.Sqrt((0.03565763288326498 / (36)) + (0.3471065846009189 / (20))) is less than -2.0048792881871513 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (36) + (20) - 2, .025) and -0.6270880798803915 = (12.611987226239421 - 20.520814079417924) / 12.611987226239421 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. ```### Baseline Jit Disasm ```assembly ; System.Collections.Tests.Perf_SortedSet.Min() push ebp mov ebp,esp mov ecx,[ecx+4] mov eax,[ecx] mov eax,[eax+38] call dword ptr [eax+14] pop ebp ret ; Total bytes of code 16 ``` ### Compare Jit Disasm ```assembly ; System.Collections.Tests.Perf_SortedSet.Min() push ebp mov ebp,esp mov ecx,[ecx+4] mov eax,[ecx] mov eax,[eax+38] call dword ptr [eax+14] pop ebp ret ; Total bytes of code 16 ``` ### Docs [Profiling workflow for dotnet/runtime repository](https://github.com/dotnet/performance/blob/master/docs/profiling-workflow-dotnet-runtime.md) [Benchmarking workflow for dotnet/runtime repository](https://github.com/dotnet/performance/blob/master/docs/benchmarking-workflow-dotnet-runtime.md)
performanceautofiler[bot] commented 1 year ago

Run Information

Architecture x86
OS Windows 10.0.18362
Baseline 414018530f0788c418d92ff817bb5fd6932324f6
Compare 32cb6bb23d58c00975a2d80d62fe90998e780772
Diff Diff

Regressions in System.Tests.Perf_Decimal

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
[Add - Duration of single invocation](<https://pvscmdupload.z22.web.core.windows.net/reports/allTestHistory/refs/heads/main_x86_Windows 10.0.18362/System.Tests.Perf_Decimal.Add.html>) 9.93 ns 11.15 ns 1.12 0.26 False 74.09304418625794 87.6695529082553 1.183235941660977 Trace Trace

graph Test Report

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Tests.Perf_Decimal*'
### Payloads [Baseline]() [Compare]() ### Histogram #### System.Tests.Perf_Decimal.Add ```log ``` ### 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.154470594074313 > 10.585718273883831. IsChangePoint: Marked as a change because one of 1/13/2023 11:01:49 AM, 1/17/2023 6:49:05 AM falls between 1/8/2023 8:00:22 AM and 1/17/2023 6:49:05 AM. IsRegressionStdDev: Marked as regression because -17.35802171740636 (T) = (0 -11.21475671468843) / Math.Sqrt((0.09051179326411189 / (36)) + (0.01744541533994889 / (20))) is less than -2.0048792881871513 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (36) + (20) - 2, .025) and -0.09898687118261228 = (10.20463211050038 - 11.21475671468843) / 10.20463211050038 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. ```### Baseline Jit Disasm ```assembly ; System.Tests.Perf_Decimal.Add() push esi sub esp,20 vzeroupper mov esi,edx vmovupd xmm0,[ecx+4] vmovupd [esp+10],xmm0 vmovupd xmm0,[ecx+14] vmovupd [esp],xmm0 push 0 lea ecx,[esp+14] lea edx,[esp+4] call dword ptr ds:[0B943318]; System.Decimal+DecCalc.DecAddSub(DecCalc ByRef, DecCalc ByRef, Boolean) vmovupd xmm0,[esp+10] vmovupd [esi],xmm0 add esp,20 pop esi ret ; Total bytes of code 61 ``` ```assembly ; System.Decimal+DecCalc.DecAddSub(DecCalc ByRef, DecCalc ByRef, Boolean) push ebp mov ebp,esp push edi push esi push ebx sub esp,0CC vzeroupper mov esi,ecx mov edi,edx lea ecx,[esi+8] mov eax,[ecx] mov edx,[ecx+4] mov ecx,[esi+4] mov ebx,[esi] mov [ebp-0C8],edi mov edi,[edi] mov [ebp-20],edi mov [ebp-1C],ebx xor edi,ebx movzx ebx,byte ptr [ebp+8] mov [ebp-0D4],ebx xor ebx,ebx test edi,80000000 setne bl xor ebx,[ebp-0D4] mov [ebp+8],bl test edi,0FF0000 je near ptr M01_L02 mov edi,[ebp-1C] mov [ebp-24],edi mov ebx,[ebp-20] and ebx,0FF0000 and edi,80000000 or edi,ebx mov [ebp-1C],edi mov ebx,[ebp-24] sub edi,ebx sar edi,10 js near ptr M01_L04 M01_L00: mov [ebp-18],ecx test ecx,ecx jne near ptr M01_L11 cmp edx,1 jae near ptr M01_L09 mov [ebp-70],eax test eax,eax je near ptr M01_L06 M01_L01: cmp edi,9 jg near ptr M01_L08 mov ecx,3A14DB8 mov edx,7C call CORINFO_HELP_GETSHARED_NONGCSTATIC_BASE mov eax,ds:[75E1050] cmp edi,[eax+4] jae near ptr M01_L39 mov eax,[eax+edi*4+8] mov edi,[ebp-70] mul edi mov edi,eax mov ebx,edx mov eax,edi mov edx,ebx mov ecx,[ebp-18] M01_L02: mov [ebp-8C],edx mov [ebp-6C],ecx cmp byte ptr [ebp+8],0 jne near ptr M01_L36 mov edi,[ebp-0C8] lea ebx,[edi+8] mov edi,[ebx] mov ebx,[ebx+4] add edi,eax adc ebx,edx mov edx,[ebp-0C8] add ecx,[edx+4] cmp edi,eax mov edx,ebx sbb edx,[ebp-8C] jb near ptr M01_L38 cmp ecx,[ebp-6C] jb near ptr M01_L33 M01_L03: mov edx,[ebp-1C] mov [esi],edx mov [esi+4],ecx add esi,8 mov [esi],edi mov [esi+4],ebx lea esp,[ebp-0C] pop ebx pop esi pop edi pop ebp ret 4 M01_L04: neg edi mov [ebp-28],edi mov edx,ebx cmp byte ptr [ebp+8],0 je short M01_L05 xor edx,80000000 M01_L05: mov eax,[ebp-0C8] lea ecx,[eax+8] mov [ebp-0CC],ecx mov ecx,[ecx] mov [ebp-0D4],ecx mov ecx,[ebp-0CC] mov ecx,[ecx+4] mov [ebp-0D8],ecx mov ecx,[ebp-0D4] mov ebx,[ebp-0D8] mov [ebp-0C8],eax mov eax,[eax+4] vmovupd xmm0,[esi] mov edi,[ebp-0C8] vmovupd [edi],xmm0 mov [ebp-0C8],edi mov [ebp-1C],edx mov edx,ebx xchg eax,ecx mov edi,[ebp-28] jmp near ptr M01_L00 M01_L06: mov edx,[ebp-1C] mov ecx,edx and ecx,80000000 cmp byte ptr [ebp+8],0 je short M01_L07 xor ecx,80000000 M01_L07: mov edi,[ebp-0C8] vmovupd xmm0,[edi] vmovupd [esi],xmm0 mov eax,[edi] and eax,0FF0000 or eax,ecx mov [esi],eax lea esp,[ebp-0C] pop ebx pop esi pop edi pop ebp ret 4 M01_L08: add edi,0FFFFFFF7 mov ebx,3B9ACA00 mov eax,[ebp-70] mul ebx mov [ebp-70],eax mov eax,edx mov [ebp-74],eax cmp eax,1 mov edx,[ebp-74] jb near ptr M01_L01 mov eax,[ebp-70] M01_L09: mov ebx,3B9ACA00 cmp edi,9 mov [ebp-74],edx jge short M01_L10 mov [ebp-70],eax mov ecx,3A14DB8 mov edx,7C call CORINFO_HELP_GETSHARED_NONGCSTATIC_BASE mov eax,ds:[75E1050] cmp edi,[eax+4] jae near ptr M01_L39 mov ebx,[eax+edi*4+8] mov eax,[ebp-70] M01_L10: mul ebx mov ecx,eax mov [ebp-84],edx mov edx,[ebp-74] mov eax,edx mul ebx mov ebx,[ebp-84] add ebx,eax mov eax,edx adc eax,0 add ecx,0 mov edx,ebx adc edx,0 mov [ebp-70],ecx mov [ebp-74],edx mov ecx,eax add edi,0FFFFFFF7 test edi,edi mov eax,[ebp-70] mov edx,[ebp-74] jle near ptr M01_L02 mov [ebp-18],ecx test ecx,ecx je short M01_L09 M01_L11: mov ebx,3B9ACA00 cmp edi,9 mov [ebp-74],edx jge short M01_L12 mov [ebp-70],eax mov ecx,3A14DB8 mov edx,7C call CORINFO_HELP_GETSHARED_NONGCSTATIC_BASE mov eax,ds:[75E1050] cmp edi,[eax+4] jae near ptr M01_L39 mov ebx,[eax+edi*4+8] mov eax,[ebp-70] M01_L12: mul ebx mov [ebp-80],eax mov [ebp-84],edx mov eax,[ebp-74] mov [ebp-2C],ebx mul ebx mov ebx,[ebp-84] add ebx,eax mov eax,edx adc eax,0 mov [ebp-7C],eax mov edx,ebx mov ebx,[ebp-80] add ebx,0 adc edx,0 mov [ebp-74],edx xor eax,eax mov [ebp-0D8],eax mov eax,[ebp-7C] mov [ebp-78],eax mov eax,[ebp-0D8] mov [ebp-7C],eax mov ecx,[ebp-18] mov eax,[ebp-2C] mul ecx mov ecx,[ebp-78] add eax,ecx mov ecx,[ebp-7C] adc edx,ecx mov ecx,edx add edi,0FFFFFFF7 cmp ecx,1 jae short M01_L13 mov edx,eax test edi,edi mov [ebp-18],edx mov eax,ebx mov edx,[ebp-74] jg near ptr M01_L11 mov ecx,[ebp-18] jmp near ptr M01_L02 M01_L13: mov [ebp-4C],ebx mov edx,[ebp-74] mov [ebp-48],edx mov [ebp-44],eax mov [ebp-40],ecx mov dword ptr [ebp-50],3 test edi,edi jle near ptr M01_L18 M01_L14: mov eax,3B9ACA00 cmp edi,9 jge short M01_L15 mov ecx,3A14DB8 mov edx,7C call CORINFO_HELP_GETSHARED_NONGCSTATIC_BASE mov eax,ds:[75E1050] cmp edi,[eax+4] jae near ptr M01_L39 mov eax,[eax+edi*4+8] mov [ebp-2C],eax M01_L15: xor edx,edx xor ecx,ecx mov [ebp-78],edx mov [ebp-7C],ecx lea ecx,[ebp-4C] xor edx,edx mov [ebp-2C],eax M01_L16: mov [ebp-54],edx mov eax,[ecx+edx*4] mov ebx,[ebp-2C] mul ebx mov ebx,[ebp-78] add eax,ebx mov ebx,[ebp-7C] adc edx,ebx mov ebx,eax mov eax,[ebp-54] mov [ecx+eax*4],ebx inc eax xor ebx,ebx cmp eax,[ebp-50] mov [ebp-78],edx mov [ebp-7C],ebx jbe short M01_L19 mov edx,[ebp-78] test edx,edx je short M01_L17 mov ebx,[ebp-50] inc ebx mov [ebp-50],ebx mov [ecx+ebx*4],edx M01_L17: add edi,0FFFFFFF7 test edi,edi jg near ptr M01_L14 M01_L18: mov edx,[ebp-4C] mov ecx,[ebp-48] mov [ebp-7C],ecx mov edi,[ebp-0C8] lea eax,[edi+8] mov ebx,[eax] mov eax,[eax+4] mov ecx,[ebp-44] mov edi,[edi+4] cmp byte ptr [ebp+8],0 je near ptr M01_L24 mov [ebp-78],edx sub edx,ebx mov ebx,[ebp-7C] sbb ebx,eax mov eax,ebx mov ebx,ecx sub ebx,edi mov edi,ebx cmp [ebp-78],edx mov ebx,[ebp-7C] sbb ebx,eax jae short M01_L20 dec edi cmp edi,ecx jae short M01_L21 jmp near ptr M01_L30 M01_L19: mov edx,eax jmp near ptr M01_L16 M01_L20: cmp edi,ecx jbe near ptr M01_L30 M01_L21: lea ecx,[ebp-4C] mov [ebp-58],ecx mov ebx,3 M01_L22: lea ecx,[ebx+1] mov [ebp-5C],ecx mov ecx,[ebp-58] lea ebx,[ecx+ebx*4] mov ecx,[ebx] mov [ebp-60],ecx dec ecx mov [ebx],ecx cmp dword ptr [ebp-60],0 mov ebx,[ebp-5C] je short M01_L22 mov ecx,[ebp-58] mov ebx,[ebp-50] cmp dword ptr [ecx+ebx*4],0 jne short M01_L23 dec ebx cmp ebx,2 mov [ebp-50],ebx ja near ptr M01_L30 mov ecx,edi mov ebx,eax mov edi,edx jmp near ptr M01_L03 M01_L23: mov [ebp-50],ebx jmp short M01_L30 M01_L24: mov [ebp-78],edx add ebx,edx mov edx,[ebp-7C] adc eax,edx add edi,ecx mov edx,[ebp-78] cmp ebx,edx mov edx,eax sbb edx,[ebp-7C] jae short M01_L25 inc edi cmp edi,ecx jbe short M01_L26 mov edx,ebx jmp short M01_L30 M01_L25: cmp edi,ecx jae short M01_L27 M01_L26: lea ecx,[ebp-4C] mov [ebp-64],ecx mov edx,3 jmp short M01_L29 M01_L27: mov edx,ebx jmp short M01_L30 M01_L28: mov edx,[ebp-50] mov ecx,[ebp-68] cmp edx,ecx mov [ebp-50],edx mov edx,ecx jae short M01_L29 mov ecx,[ebp-64] mov dword ptr [ecx+edx*4],1 mov [ebp-50],edx mov edx,ebx jmp short M01_L30 M01_L29: lea ecx,[edx+1] mov [ebp-68],ecx mov ecx,[ebp-64] lea edx,[ecx+edx*4] mov ecx,[edx] inc ecx mov [edx],ecx test ecx,ecx je short M01_L28 mov edx,ebx M01_L30: mov [ebp-4C],edx mov [ebp-48],eax mov [ebp-44],edi mov ebx,[ebp-1C] mov ecx,ebx shr ecx,10 movzx ecx,cl push ecx lea ecx,[ebp-4C] mov edx,[ebp-50] call dword ptr ds:[0B9432A0] mov edi,eax and ebx,0FF00FFFF mov ecx,edi shl ecx,10 or ebx,ecx mov edx,[ebp-4C] mov eax,[ebp-48] mov edi,edx mov ecx,[ebp-44] mov edx,ecx mov [ebp-1C],ebx mov ecx,edx mov ebx,eax jmp near ptr M01_L03 M01_L31: mov eax,[ebp-1C] xor eax,80000000 not ecx neg edi mov edx,ebx adc edx,0 mov ebx,edx neg ebx mov edx,edi or edx,ebx mov [ebp-1C],eax jne near ptr M01_L03 M01_L32: inc ecx jmp near ptr M01_L03 M01_L33: mov eax,[ebp-1C] test eax,0FF0000 jne short M01_L34 mov ecx,0F call dword ptr ds:[8E4D360] int 3 M01_L34: add eax,0FFFF0000 mov [ebp-1C],eax xor edx,edx add ecx,0 adc edx,1 push edx mov [ebp-88],ecx push ecx push 0 push 0A call CORINFO_HELP_ULDIV mov ecx,eax mov [ebp-18],eax lea edx,[eax+eax*4] add edx,edx mov ecx,[ebp-88] sub ecx,edx mov edx,ebx add edx,0 adc ecx,0 mov ebx,edx mov edx,ecx push edx push ebx push 0 push 0A call CORINFO_HELP_ULDIV lea edx,[eax+eax*4] add edx,edx mov ecx,ebx sub ecx,edx mov ebx,edi add ebx,0 mov edx,ecx adc edx,0 mov edi,eax xor edi,edi mov [ebp-74],eax push edx push ebx push 0 push 0A call CORINFO_HELP_ULDIV add edi,eax mov edx,[ebp-74] adc edx,0 lea eax,[eax+eax*4] add eax,eax mov ecx,ebx sub ecx,eax mov eax,ecx cmp eax,5 mov ebx,edx mov ecx,[ebp-18] jb near ptr M01_L03 cmp eax,5 ja short M01_L35 test edi,1 je near ptr M01_L03 M01_L35: add edi,1 adc ebx,0 mov eax,edi or eax,ebx jne near ptr M01_L03 jmp near ptr M01_L32 M01_L36: mov edi,[ebp-0C8] lea ebx,[edi+8] mov [ebp-0D0],ebx mov ebx,[ebx] mov [ebp-0D8],ebx mov ebx,[ebp-0D0] mov ebx,[ebx+4] mov [ebp-0D4],ebx mov ebx,[ebp-0D8] mov ecx,eax sub ecx,ebx mov [ebp-0D8],ecx mov ebx,[ebp-0D4] mov ecx,edx sbb ecx,ebx mov ebx,[ebp-0D8] mov edx,[ebp-6C] sub edx,[edi+4] mov edi,edx cmp eax,ebx mov edx,[ebp-8C] sbb edx,ecx jae short M01_L37 dec edi cmp edi,[ebp-6C] xchg ecx,edi xchg ebx,edi jb near ptr M01_L03 jmp near ptr M01_L31 M01_L37: cmp edi,[ebp-6C] xchg ecx,edi xchg ebx,edi jbe near ptr M01_L03 jmp near ptr M01_L31 M01_L38: inc ecx cmp ecx,[ebp-6C] ja near ptr M01_L03 jmp near ptr M01_L33 M01_L39: call CORINFO_HELP_RNGCHKFAIL int 3 ; Total bytes of code 1735 ``` ### Compare Jit Disasm ```assembly ; System.Tests.Perf_Decimal.Add() push esi sub esp,20 vzeroupper mov esi,edx vmovups xmm0,[ecx+4] vmovups [esp+10],xmm0 vmovups xmm0,[ecx+14] vmovups [esp],xmm0 push 0 lea ecx,[esp+14] lea edx,[esp+4] call dword ptr ds:[0ADE7930]; System.Decimal+DecCalc.DecAddSub(DecCalc ByRef, DecCalc ByRef, Boolean) vmovups xmm0,[esp+10] vmovups [esi],xmm0 add esp,20 pop esi ret ; Total bytes of code 61 ``` ```assembly ; System.Decimal+DecCalc.DecAddSub(DecCalc ByRef, DecCalc ByRef, Boolean) push ebp mov ebp,esp push edi push esi push ebx sub esp,0C4 vzeroupper mov edi,ecx mov esi,edx lea eax,[edi+8] mov ebx,[eax] mov eax,[eax+4] mov edx,[edi+4] mov [ebp-0C4],edi mov ecx,[edi] mov edi,[esi] mov [ebp-20],edi mov [ebp-1C],ecx xor edi,ecx movzx ecx,byte ptr [ebp+8] mov [ebp-0CC],ecx xor ecx,ecx test edi,80000000 setne cl xor ecx,[ebp-0CC] mov [ebp+8],cl test edi,0FF0000 je near ptr M01_L04 mov edi,[ebp-1C] mov [ebp-24],edi mov edi,[ebp-20] and edi,0FF0000 mov [ebp-0CC],edi mov edi,[ebp-24] and edi,80000000 or edi,[ebp-0CC] mov ecx,edi sub ecx,[ebp-24] sar ecx,10 jns short M01_L01 neg ecx mov edi,[ebp-24] cmp byte ptr [ebp+8],0 je short M01_L00 xor edi,80000000 M01_L00: lea eax,[esi+8] mov ebx,[eax] mov eax,[eax+4] mov [ebp-0C8],esi mov edx,[esi+4] mov esi,[ebp-0C4] vmovups xmm0,[esi] mov esi,[ebp-0C8] vmovups [esi],xmm0 M01_L01: mov [ebp-18],edx test edx,edx jne short M01_L03 cmp eax,1 mov [ebp-74],eax jae near ptr M01_L07 test ebx,ebx jne short M01_L05 mov ecx,edi and ecx,80000000 cmp byte ptr [ebp+8],0 je short M01_L02 xor ecx,80000000 M01_L02: vmovups xmm0,[esi] mov edi,[ebp-0C4] vmovups [edi],xmm0 mov eax,[esi] and eax,0FF0000 or eax,ecx mov [edi],eax lea esp,[ebp-0C] pop ebx pop esi pop edi pop ebp ret 4 M01_L03: mov [ebp-0C8],esi mov esi,eax jmp near ptr M01_L09 M01_L04: mov [ebp-0C8],esi mov esi,eax mov eax,edx mov edi,[ebp-1C] jmp near ptr M01_L40 M01_L05: cmp ecx,9 jg short M01_L06 cmp ecx,0A jae near ptr M01_L49 mov eax,[ecx*4+6BEBD380] mul ebx mov ebx,eax mov eax,edx mov [ebp-0C8],esi mov esi,eax mov eax,[ebp-18] jmp near ptr M01_L40 M01_L06: add ecx,0FFFFFFF7 mov eax,3B9ACA00 mul ebx mov ebx,eax mov eax,edx mov [ebp-74],eax cmp eax,1 jb short M01_L05 M01_L07: mov edx,3B9ACA00 cmp ecx,9 jge near ptr M01_L13 cmp ecx,0A jae near ptr M01_L49 mov edx,[ecx*4+6BEBD380] mov [ebp-0C8],esi M01_L08: mov [ebp-2C],edx mov eax,ebx mul edx mov ebx,eax mov [ebp-80],edx mov edx,[ebp-74] mov esi,[ebp-2C] mov eax,edx mul esi mov esi,[ebp-80] add esi,eax mov eax,edx adc eax,0 mov edx,eax add ebx,0 adc esi,0 mov eax,edx add ecx,0FFFFFFF7 test ecx,ecx jle near ptr M01_L40 mov [ebp-18],eax test eax,eax je short M01_L12 M01_L09: mov edx,3B9ACA00 cmp ecx,9 jge short M01_L11 cmp ecx,0A jae near ptr M01_L49 mov edx,[ecx*4+6BEBD380] mov [ebp-1C],edi M01_L10: mov [ebp-2C],edx mov eax,ebx mul edx mov ebx,eax mov [ebp-80],edx mov eax,[ebp-2C] mul esi mov esi,[ebp-80] add esi,eax adc edx,0 mov [ebp-7C],edx add ebx,0 adc esi,0 mov edx,[ebp-18] mov edi,[ebp-2C] mov eax,edx mul edi mov edi,[ebp-7C] add eax,edi mov edi,edx adc edi,0 add ecx,0FFFFFFF7 cmp edi,1 jae short M01_L14 mov edi,eax test ecx,ecx mov [ebp-18],edi mov edi,[ebp-1C] jg short M01_L09 mov eax,[ebp-18] jmp near ptr M01_L40 M01_L11: mov [ebp-1C],edi jmp short M01_L10 M01_L12: mov [ebp-74],esi mov esi,[ebp-0C8] jmp near ptr M01_L07 M01_L13: mov [ebp-0C8],esi jmp near ptr M01_L08 M01_L14: mov [ebp-4C],ebx mov [ebp-48],esi mov [ebp-44],eax mov [ebp-40],edi mov dword ptr [ebp-50],3 test ecx,ecx jle near ptr M01_L19 M01_L15: mov edi,3B9ACA00 cmp ecx,9 jge short M01_L16 cmp ecx,0A jae near ptr M01_L49 mov [ebp-28],ecx mov edi,[ecx*4+6BEBD380] mov [ebp-2C],edi mov ecx,[ebp-28] mov edi,[ebp-2C] M01_L16: xor eax,eax xor edx,edx mov [ebp-78],eax mov [ebp-7C],edx lea esi,[ebp-4C] mov [ebp-58],esi xor ebx,ebx mov [ebp-28],ecx mov [ebp-2C],edi M01_L17: mov edi,ebx mov esi,[esi+edi*4] mov ecx,[ebp-2C] mov eax,esi mul ecx mov esi,[ebp-78] add eax,esi mov esi,[ebp-7C] adc edx,esi mov esi,eax mov eax,edx mov edx,[ebp-58] mov [edx+edi*4],esi inc ebx xor edi,edi mov esi,eax xor eax,eax mov edi,[ebp-50] cmp ebx,edi mov [ebp-78],esi mov [ebp-7C],eax mov [ebp-2C],ecx mov [ebp-50],edi mov esi,edx jbe short M01_L17 mov ecx,[ebp-28] mov eax,[ebp-78] test eax,eax je short M01_L18 mov edi,[ebp-50] inc edi mov [esi+edi*4],eax mov [ebp-50],edi M01_L18: add ecx,0FFFFFFF7 test ecx,ecx jg near ptr M01_L15 M01_L19: mov eax,[ebp-4C] mov ecx,[ebp-48] mov esi,[ebp-0C8] lea edx,[esi+8] mov ebx,[edx] mov edx,[edx+4] mov esi,[ebp-44] mov [ebp-54],esi mov esi,[ebp-0C8] mov esi,[esi+4] mov [ebp-18],esi cmp byte ptr [ebp+8],0 je near ptr M01_L24 mov esi,eax sub esi,ebx mov ebx,ecx sbb ebx,edx mov edx,ebx mov ebx,[ebp-54] sub ebx,[ebp-18] cmp eax,esi mov eax,ecx sbb eax,edx jae short M01_L20 dec ebx cmp ebx,[ebp-54] jae short M01_L21 mov edi,[ebp-50] jmp near ptr M01_L31 nop nop nop nop nop nop nop nop nop nop nop nop nop M01_L20: cmp ebx,[ebp-54] jbe short M01_L23 M01_L21: lea ecx,[ebp-4C] mov [ebp-5C],ecx mov eax,3 M01_L22: lea ecx,[eax+1] mov [ebp-60],ecx mov ecx,[ebp-5C] lea eax,[ecx+eax*4] mov ecx,[eax] mov [ebp-64],ecx dec ecx mov [eax],ecx cmp dword ptr [ebp-64],0 mov eax,[ebp-60] je short M01_L22 mov ecx,[ebp-5C] mov edi,[ebp-50] cmp dword ptr [ecx+edi*4],0 jne near ptr M01_L31 dec edi cmp edi,2 ja short M01_L31 jmp near ptr M01_L47 M01_L23: mov edi,[ebp-50] jmp short M01_L31 M01_L24: add ebx,eax adc edx,ecx mov esi,[ebp-18] add esi,[ebp-54] cmp ebx,eax mov eax,edx sbb eax,ecx jae short M01_L25 inc esi cmp esi,[ebp-54] jbe short M01_L26 xchg ebx,esi mov edi,[ebp-50] jmp short M01_L31 M01_L25: cmp esi,[ebp-54] jae short M01_L27 M01_L26: lea ecx,[ebp-4C] mov [ebp-68],ecx mov eax,3 jmp short M01_L29 M01_L27: xchg ebx,esi mov edi,[ebp-50] jmp short M01_L31 M01_L28: mov edi,[ebp-50] mov ecx,[ebp-6C] cmp edi,ecx mov [ebp-50],edi mov eax,ecx jb short M01_L30 M01_L29: lea ecx,[eax+1] mov [ebp-6C],ecx mov ecx,[ebp-68] lea eax,[ecx+eax*4] mov ecx,[eax] inc ecx mov [eax],ecx test ecx,ecx je short M01_L28 xchg ebx,esi mov edi,[ebp-50] jmp short M01_L31 M01_L30: mov ecx,[ebp-68] mov dword ptr [ecx+eax*4],1 mov edi,eax xchg ebx,esi M01_L31: mov [ebp-4C],esi mov [ebp-48],edx mov [ebp-44],ebx mov ebx,[ebp-1C] mov ecx,ebx shr ecx,10 movzx ecx,cl push ecx lea ecx,[ebp-4C] mov edx,edi call dword ptr ds:[0ADE78B8] shl eax,10 and ebx,0FF00FFFF or ebx,eax mov esi,[ebp-4C] mov edx,[ebp-48] mov edi,edx mov eax,[ebp-44] mov [ebp-1C],ebx mov edx,edi mov ebx,eax jmp near ptr M01_L47 M01_L32: xor edi,80000000 not esi neg ebx adc ecx,0 neg ecx mov edx,ecx mov eax,ebx or eax,edx jne short M01_L34 M01_L33: inc esi mov [ebp-1C],edi xchg ebx,esi jmp near ptr M01_L47 M01_L34: mov [ebp-1C],edi xchg ebx,esi jmp near ptr M01_L47 M01_L35: test edi,0FF0000 je near ptr M01_L48 add edi,0FFFF0000 xor eax,eax add esi,0 adc eax,1 push eax push esi push 0 push 0A call CORINFO_HELP_ULDIV mov [ebp-18],eax lea edx,[eax+eax*4] add edx,edx sub esi,edx mov edx,ebx add edx,0 adc esi,0 mov ebx,edx push esi push ebx push 0 push 0A call CORINFO_HELP_ULDIV lea edx,[eax+eax*4] add edx,edx mov esi,ebx sub esi,edx mov ebx,[ebp-70] add ebx,0 adc esi,0 xor edx,edx mov [ebp-70],edx mov [ebp-74],eax push esi push ebx push 0 push 0A call CORINFO_HELP_ULDIV mov edx,eax add edx,[ebp-70] mov esi,[ebp-74] adc esi,0 mov ecx,edx lea eax,[eax+eax*4] add eax,eax mov edx,ebx sub edx,eax mov eax,edx cmp eax,5 jb short M01_L39 cmp eax,5 ja short M01_L36 test cl,1 je short M01_L38 M01_L36: add ecx,1 adc esi,0 mov ebx,ecx or ecx,esi jne short M01_L37 mov edx,esi mov esi,[ebp-18] jmp near ptr M01_L33 M01_L37: mov [ebp-1C],edi mov edx,esi mov esi,ebx mov ebx,[ebp-18] jmp near ptr M01_L47 M01_L38: mov [ebp-1C],edi mov edx,esi mov esi,ecx mov ebx,[ebp-18] jmp near ptr M01_L47 M01_L39: mov [ebp-1C],edi mov edx,esi mov esi,ecx mov ebx,[ebp-18] jmp near ptr M01_L47 M01_L40: mov edx,ebx mov [ebp-84],edx mov [ebp-88],esi cmp byte ptr [ebp+8],0 je short M01_L44 mov esi,[ebp-0C8] lea ebx,[esi+8] mov ecx,[ebx] mov ebx,[ebx+4] mov [ebp-0CC],ebx mov ebx,edx sub ebx,ecx mov [ebp-0D0],ebx mov ecx,[ebp-88] mov ebx,[ebp-0CC] sbb ecx,ebx mov ebx,[ebp-0D0] mov edx,eax sub edx,[esi+4] mov esi,edx cmp [ebp-84],ebx mov edx,[ebp-88] sbb edx,ecx jae short M01_L42 dec esi cmp esi,eax jb short M01_L41 jmp near ptr M01_L32 M01_L41: mov [ebp-1C],edi mov edx,ecx xchg ebx,esi jmp short M01_L47 M01_L42: cmp esi,eax jbe short M01_L43 jmp near ptr M01_L32 M01_L43: mov [ebp-1C],edi mov edx,ecx xchg ebx,esi jmp short M01_L47 M01_L44: mov esi,[ebp-0C8] lea ebx,[esi+8] mov edx,[ebx] mov ebx,[ebx+4] add edx,[ebp-84] adc ebx,[ebp-88] mov ecx,eax add ecx,[esi+4] mov esi,ecx mov [ebp-70],edx mov ecx,[ebp-84] cmp edx,ecx mov ecx,ebx sbb ecx,[ebp-88] jae short M01_L46 inc esi cmp esi,eax ja short M01_L45 jmp near ptr M01_L35 M01_L45: mov [ebp-1C],edi mov edx,ebx mov ebx,esi mov esi,[ebp-70] jmp short M01_L47 M01_L46: cmp esi,eax jb near ptr M01_L35 mov [ebp-1C],edi mov edx,ebx mov ebx,esi mov esi,[ebp-70] M01_L47: mov ecx,[ebp-0C4] mov edi,[ebp-1C] mov [ecx],edi mov [ecx+4],ebx add ecx,8 mov [ecx],esi mov [ecx+4],edx lea esp,[ebp-0C] pop ebx pop esi pop edi pop ebp ret 4 M01_L48: mov ecx,0F call dword ptr ds:[830D378] int 3 M01_L49: call CORINFO_HELP_RNGCHKFAIL int 3 ; Total bytes of code 1665 ``` ### Docs [Profiling workflow for dotnet/runtime repository](https://github.com/dotnet/performance/blob/master/docs/profiling-workflow-dotnet-runtime.md) [Benchmarking workflow for dotnet/runtime repository](https://github.com/dotnet/performance/blob/master/docs/benchmarking-workflow-dotnet-runtime.md)
performanceautofiler[bot] commented 1 year ago

Run Information

Architecture x86
OS Windows 10.0.18362
Baseline 414018530f0788c418d92ff817bb5fd6932324f6
Compare 32cb6bb23d58c00975a2d80d62fe90998e780772
Diff Diff

Regressions in LinqBenchmarks

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio Baseline ETL Compare ETL
[Order00LinqQueryX - Duration of single invocation](<https://pvscmdupload.z22.web.core.windows.net/reports/allTestHistory/refs/heads/main_x86_Windows 10.0.18362/LinqBenchmarks.Order00LinqQueryX.html>) 105.85 ms 116.18 ms 1.10 0.00 False 960100000 992500000 1.0337464847411728 Trace Trace
[Order00ManualX - Duration of single invocation](<https://pvscmdupload.z22.web.core.windows.net/reports/allTestHistory/refs/heads/main_x86_Windows 10.0.18362/LinqBenchmarks.Order00ManualX.html>) 163.36 ms 182.17 ms 1.12 0.01 False 1430966666.6666667 1492666666.6666667 1.0431177059796408 Trace Trace
[Order00LinqMethodX - Duration of single invocation](<https://pvscmdupload.z22.web.core.windows.net/reports/allTestHistory/refs/heads/main_x86_Windows 10.0.18362/LinqBenchmarks.Order00LinqMethodX.html>) 105.54 ms 116.93 ms 1.11 0.00 False 959933333.3333334 992266666.6666666 1.0336828946454615 Trace Trace

graph graph graph Test Report

Repro

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'LinqBenchmarks*'
### Payloads [Baseline]() [Compare]() ### Histogram #### LinqBenchmarks.Order00LinqQueryX ```log ``` ### 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 116.17767666666667 > 111.0688705. IsChangePoint: Marked as a change because one of 1/13/2023 11:01:49 AM, 1/17/2023 6:49:05 AM falls between 1/8/2023 8:00:22 AM and 1/17/2023 6:49:05 AM. IsRegressionStdDev: Marked as regression because -71.76614424196168 (T) = (0 -116224700.42399266) / Math.Sqrt((335799629209.61786 / (36)) + (216486877072.3524 / (20))) is less than -2.0048792881871513 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (36) + (20) - 2, .025) and -0.09607774828872451 = (106036912.62362641 - 116224700.42399266) / 106036912.62362641 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. ```### Baseline Jit Disasm ```assembly ; BenchmarkDotNet.Autogenerated.Runnable_0.__ForDisassemblyDiagnoser__() push ebp mov ebp,esp push eax mov [ebp-4],ecx mov ecx,[ebp-4] cmp dword ptr [ecx+20],0B jne short M00_L00 mov ecx,[ebp-4] call dword ptr ds:[0A3BB4F8] mov esp,ebp pop ebp ret M00_L00: xor eax,eax mov esp,ebp pop ebp ret ; Total bytes of code 35 ``` ### Compare Jit Disasm ```assembly ; LinqBenchmarks.Order00LinqQueryX() push ebp mov ebp,esp push edi push esi push ebx push eax call dword ptr ds:[0ACB9768]; Product.GetProductList() mov esi,eax xor edi,edi mov ecx,0A3D6380 mov edx,29E call CORINFO_HELP_GETSHARED_NONGCSTATIC_BASE M00_L00: mov ebx,ds:[6824788] test ebx,ebx jne short M00_L01 mov ecx,offset MT_System.Func`2[[Product, MicroBenchmarks],[System.Decimal, System.Private.CoreLib]] call CORINFO_HELP_NEWSFAST mov ebx,eax mov ecx,ds:[6824768] test ecx,ecx je near ptr M00_L02 lea edx,[ebx+4] call CORINFO_HELP_ASSIGN_REF_ECX mov dword ptr [ebx+0C],0ACB8888 mov edx,6824788 call CORINFO_HELP_ASSIGN_REF_EBX M00_L01: mov ecx,offset MT_System.Linq.OrderedEnumerable`2[[Product, MicroBenchmarks],[System.Decimal, System.Private.CoreLib]] call CORINFO_HELP_NEWSFAST mov [ebp-10],eax lea edx,[eax+4] call CORINFO_HELP_ASSIGN_REF_ESI test esi,esi je near ptr M00_L03 test ebx,ebx je near ptr M00_L04 xor edx,edx mov [eax+8],edx lea edx,[eax+0C] call CORINFO_HELP_ASSIGN_REF_EBX mov ecx,2D34E08 mov edx,32 call CORINFO_HELP_CLASSINIT_SHARED_DYNAMICCLASS mov ecx,ds:[6821F54] mov ebx,[ebp-10] lea edx,[ebx+10] call CORINFO_HELP_ASSIGN_REF_ECX mov byte ptr [ebx+14],1 mov ecx,ebx mov edx,offset MD_System.Linq.Enumerable.Count[[Product, MicroBenchmarks]](System.Collections.Generic.IEnumerable`1) call dword ptr ds:[0ACB9900]; System.Linq.Enumerable.Count[[System.__Canon, System.Private.CoreLib]](System.Collections.Generic.IEnumerable`1) mov edx,eax shr edx,1F add edx,eax sar edx,1 push offset MD_System.Linq.Enumerable.ElementAt[[Product, MicroBenchmarks]](System.Collections.Generic.IEnumerable`1, Int32) mov ecx,ebx call dword ptr ds:[0ACB9930]; System.Linq.Enumerable.ElementAt[[System.__Canon, System.Private.CoreLib]](System.Collections.Generic.IEnumerable`1, Int32) inc edi cmp edi,61A8 jl near ptr M00_L00 cmp dword ptr [eax+0C],39 sete al movzx eax,al pop ecx pop ebx pop esi pop edi pop ebp ret M00_L02: call dword ptr ds:[7B5B630] int 3 M00_L03: mov ecx,10 call dword ptr ds:[0A2A5798] int 3 M00_L04: mov ecx,9 call dword ptr ds:[0A2A5798] int 3 ; Total bytes of code 274 ``` ```assembly ; Product.GetProductList() cmp dword ptr ds:[68240E8],0 jne short M01_L00 call dword ptr ds:[0ACB9780] M01_L00: mov eax,ds:[68240E8] ret ; Total bytes of code 21 ``` ```assembly ; System.Linq.Enumerable.Count[[System.__Canon, System.Private.CoreLib]](System.Collections.Generic.IEnumerable`1) push ebp mov ebp,esp push edi push esi push ebx sub esp,30 xor eax,eax mov [ebp-18],eax mov [ebp-10],edx mov edi,ecx mov esi,edx test edi,edi je near ptr M02_L20 mov ebx,[esi+0C] cmp dword ptr [ebx+8],0 je short M02_L00 mov ecx,[ebx+8] jmp short M02_L01 M02_L00: mov ecx,esi mov edx,0ACA6234 call CORINFO_HELP_RUNTIMEHANDLE_METHOD mov ecx,eax M02_L01: mov edx,edi call dword ptr ds:[7B5B810]; System.Runtime.CompilerServices.CastHelpers.IsInstanceOfInterface(Void*, System.Object) mov [ebp-34],eax test eax,eax je short M02_L05 mov eax,[ebp-34] mov ecx,[esi+0C] cmp dword ptr [ecx+4],18 jle short M02_L03 mov ecx,[ecx+18] test ecx,ecx je short M02_L02 mov [ebp-30],ecx jmp short M02_L04 M02_L02: jmp short M02_L03 M02_L03: mov ecx,esi mov edx,0ACA63EC call CORINFO_HELP_RUNTIMEHANDLE_METHOD mov [ebp-30],eax mov eax,[ebp-34] M02_L04: mov ecx,eax mov eax,[ebp-30] nop nop nop call dword ptr [eax] lea esp,[ebp-0C] pop ebx pop esi pop edi pop ebp ret M02_L05: mov ecx,[ebx+0C] test ecx,ecx je short M02_L06 jmp short M02_L07 M02_L06: mov ecx,esi mov edx,0ACA631C call CORINFO_HELP_RUNTIMEHANDLE_METHOD mov ecx,eax M02_L07: mov edx,edi call dword ptr ds:[7B5B810]; System.Runtime.CompilerServices.CastHelpers.IsInstanceOfInterface(Void*, System.Object) mov [ebp-38],eax test eax,eax je short M02_L10 mov eax,[ebp-38] mov ecx,[ebx+14] test ecx,ecx je short M02_L08 mov [ebp-2C],ecx jmp short M02_L09 M02_L08: mov ecx,esi mov edx,0ACA6398 call CORINFO_HELP_RUNTIMEHANDLE_METHOD mov [ebp-2C],eax mov eax,[ebp-38] M02_L09: mov ecx,eax xor edx,edx mov eax,[ebp-2C] nop nop nop call dword ptr [eax] lea esp,[ebp-0C] pop ebx pop esi pop edi pop ebp ret M02_L10: mov edx,edi mov ecx,offset MT_System.Collections.ICollection call dword ptr ds:[7B5B810]; System.Runtime.CompilerServices.CastHelpers.IsInstanceOfInterface(Void*, System.Object) test eax,eax je short M02_L11 mov ecx,eax call dword ptr ds:[265029C] lea esp,[ebp-0C] pop ebx pop esi pop edi pop ebp ret M02_L11: xor eax,eax mov [ebp-24],eax mov ecx,[ebx+10] test ecx,ecx je short M02_L12 mov [ebp-28],ecx jmp short M02_L13 M02_L12: mov ecx,esi mov edx,0ACA6388 call CORINFO_HELP_RUNTIMEHANDLE_METHOD mov [ebp-28],eax M02_L13: mov ecx,edi mov eax,[ebp-28] nop nop nop call dword ptr [eax] mov ecx,eax mov [ebp-3C],ecx M02_L14: call dword ptr ds:[2650294] test eax,eax jne short M02_L16 mov esi,[ebp-24] jmp short M02_L17 M02_L15: call CORINFO_HELP_OVERFLOW M02_L16: mov esi,[ebp-24] add esi,1 jo short M02_L15 mov [ebp-24],esi mov ecx,[ebp-3C] jmp short M02_L14 M02_L17: mov ecx,[ebp-3C] call dword ptr ds:[2650298] jmp short M02_L19 cmp dword ptr [ebp-3C],0 je short M02_L18 mov ecx,[ebp-3C] call dword ptr ds:[2650298] M02_L18: pop eax jmp eax M02_L19: mov eax,esi lea esp,[ebp-0C] pop ebx pop esi pop edi pop ebp ret M02_L20: mov ecx,10 call dword ptr ds:[0A2A5798] int 3 ; Total bytes of code 392 ``` ```assembly ; System.Linq.Enumerable.ElementAt[[System.__Canon, System.Private.CoreLib]](System.Collections.Generic.IEnumerable`1, Int32) push ebp mov ebp,esp push edi push esi push ebx sub esp,20 xor eax,eax mov [ebp-18],eax mov eax,[ebp+8] mov [ebp-10],eax mov esi,ecx mov edi,edx mov ebx,[ebp+8] test esi,esi je near ptr M03_L14 mov eax,[ebx+0C] mov [ebp-24],eax cmp dword ptr [eax+8],0 je short M03_L00 mov ecx,[eax+8] jmp short M03_L01 M03_L00: mov ecx,ebx mov edx,0ACA6690 call CORINFO_HELP_RUNTIMEHANDLE_METHOD mov ecx,eax M03_L01: mov edx,esi call dword ptr ds:[7B5B810]; System.Runtime.CompilerServices.CastHelpers.IsInstanceOfInterface(Void*, System.Object) mov [ebp-28],eax test eax,eax je short M03_L05 mov eax,[ebp-28] mov ecx,[ebx+0C] cmp dword ptr [ecx+4],18 jle short M03_L03 mov ecx,[ecx+18] test ecx,ecx je short M03_L02 mov [ebp-20],ecx jmp short M03_L04 M03_L02: jmp short M03_L03 M03_L03: mov ecx,ebx mov edx,0ACA6924 call CORINFO_HELP_RUNTIMEHANDLE_METHOD mov [ebp-20],eax mov eax,[ebp-28] M03_L04: lea edx,[ebp-14] push edx mov ecx,eax mov edx,edi mov eax,[ebp-20] nop nop nop call dword ptr [eax] cmp byte ptr [ebp-14],0 je near ptr M03_L13 lea esp,[ebp-0C] pop ebx pop esi pop edi pop ebp ret 4 M03_L05: mov eax,[ebp-24] mov ecx,[eax+0C] test ecx,ecx je short M03_L06 jmp short M03_L07 M03_L06: mov ecx,ebx mov edx,0ACA67D8 call CORINFO_HELP_RUNTIMEHANDLE_METHOD mov ecx,eax M03_L07: mov edx,esi call dword ptr ds:[7B5B810]; System.Runtime.CompilerServices.CastHelpers.IsInstanceOfInterface(Void*, System.Object) mov [ebp-2C],eax test eax,eax je short M03_L10 mov eax,[ebp-2C] mov esi,[ebp-24] mov ecx,[esi+14] test ecx,ecx je short M03_L08 mov [ebp-1C],ecx jmp short M03_L09 M03_L08: mov ecx,ebx mov edx,0ACA68D0 call CORINFO_HELP_RUNTIMEHANDLE_METHOD mov [ebp-1C],eax mov eax,[ebp-2C] M03_L09: mov ecx,eax mov edx,edi mov eax,[ebp-1C] nop nop nop call dword ptr [eax] lea esp,[ebp-0C] pop ebx pop esi pop edi pop ebp ret 4 M03_L10: mov ecx,[ebp-24] mov eax,[ecx+10] test eax,eax je short M03_L11 jmp short M03_L12 M03_L11: mov ecx,ebx mov edx,0ACA68BC call CORINFO_HELP_RUNTIMEHANDLE_METHOD M03_L12: lea ecx,[ebp-18] push ecx push eax mov ecx,esi mov edx,edi call dword ptr ds:[0ACB9CD8] test eax,eax je short M03_L13 mov eax,[ebp-18] lea esp,[ebp-0C] pop ebx pop esi pop edi pop ebp ret 4 M03_L13: mov ecx,6 call dword ptr ds:[0A2A57B0] int 3 M03_L14: mov ecx,10 call dword ptr ds:[0A2A5798] int 3 ; Total bytes of code 340 ``` #### LinqBenchmarks.Order00ManualX ```log ``` ### 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 182.1740357142857 > 171.53889199999998. IsChangePoint: Marked as a change because one of 1/13/2023 11:01:49 AM, 1/17/2023 6:49:05 AM falls between 1/8/2023 8:00:22 AM and 1/17/2023 6:49:05 AM. IsRegressionStdDev: Marked as regression because -57.661419567402795 (T) = (0 -183288517.1666667) / Math.Sqrt((2310529494376.14 / (36)) + (1021979294347.3154 / (20))) is less than -2.0048792881871513 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (36) + (20) - 2, .025) and -0.11958748455788575 = (163710759.27045178 - 183288517.1666667) / 163710759.27045178 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. ```### Baseline Jit Disasm ```assembly ; BenchmarkDotNet.Autogenerated.Runnable_0.__ForDisassemblyDiagnoser__() push ebp mov ebp,esp push eax mov [ebp-4],ecx mov ecx,[ebp-4] cmp dword ptr [ecx+20],0B jne short M00_L00 mov ecx,[ebp-4] call dword ptr ds:[0A3FB528] mov esp,ebp pop ebp ret M00_L00: xor eax,eax mov esp,ebp pop ebp ret ; Total bytes of code 35 ``` ### Compare Jit Disasm ```assembly ; LinqBenchmarks.Order00ManualX() push ebp mov ebp,esp push edi push esi push ebx call dword ptr ds:[0B929768] mov esi,eax xor edi,edi M00_L00: mov ecx,esi mov edx,offset MD_System.Linq.Enumerable.ToArray[[Product, MicroBenchmarks]](System.Collections.Generic.IEnumerable`1) call dword ptr ds:[0B47F420] mov ebx,eax mov ecx,0B046380 mov edx,29E call CORINFO_HELP_GETSHARED_NONGCSTATIC_BASE mov ecx,ds:[7524790] test ecx,ecx jne short M00_L01 mov ecx,offset MT_System.Comparison`1[[Product, MicroBenchmarks]] call CORINFO_HELP_NEWSFAST mov ecx,eax mov eax,ds:[7524768] test eax,eax je short M00_L02 lea edx,[ecx+4] call CORINFO_HELP_ASSIGN_REF_EAX mov dword ptr [ecx+0C],0B9288D0 mov edx,7524790 call CORINFO_HELP_ASSIGN_REF_ECX M00_L01: test ebx,ebx je short M00_L03 test ecx,ecx je short M00_L04 lea edx,[ebx+8] mov eax,[ebx+4] push eax push edx mov edx,offset MT_System.Collections.Generic.ArraySortHelper`1[[Product, MicroBenchmarks]] call dword ptr ds:[900F738] mov ecx,ebx mov edx,0B90C078 call dword ptr ds:[0B929918] mov edx,eax shr edx,1F add eax,edx sar eax,1 cmp eax,[ebx+4] jae short M00_L05 mov eax,[ebx+eax*4+8] inc edi cmp edi,61A8 jl near ptr M00_L00 cmp dword ptr [eax+0C],39 sete al movzx eax,al pop ebx pop esi pop edi pop ebp ret M00_L02: call dword ptr ds:[87CB630] int 3 M00_L03: mov ecx,2 call dword ptr ds:[8E95378] int 3 M00_L04: mov ecx,1D call dword ptr ds:[8E95378] int 3 M00_L05: call CORINFO_HELP_RNGCHKFAIL int 3 ; Total bytes of code 225 ``` #### LinqBenchmarks.Order00LinqMethodX ```log ``` ### 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 116.93486 > 110.86677350000001. IsChangePoint: Marked as a change because one of 1/13/2023 11:01:49 AM, 1/17/2023 6:49:05 AM falls between 1/8/2023 8:00:22 AM and 1/17/2023 6:49:05 AM. IsRegressionStdDev: Marked as regression because -64.62669058085149 (T) = (0 -116358130.18040295) / Math.Sqrt((401258043831.445 / (36)) + (307153343835.0459 / (20))) is less than -2.0048792881871513 = MathNet.Numerics.Distributions.StudentT.InvCDF(0, 1, (36) + (20) - 2, .025) and -0.09940955766205876 = (105836927.98509362 - 116358130.18040295) / 105836927.98509362 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. ```### Baseline Jit Disasm ```assembly ; BenchmarkDotNet.Autogenerated.Runnable_0.__ForDisassemblyDiagnoser__() push ebp mov ebp,esp push eax mov [ebp-4],ecx mov ecx,[ebp-4] cmp dword ptr [ecx+20],0B jne short M00_L00 mov ecx,[ebp-4] call dword ptr ds:[0AF2B510] mov esp,ebp pop ebp ret M00_L00: xor eax,eax mov esp,ebp pop ebp ret ; Total bytes of code 35 ``` ### Compare Jit Disasm ```assembly ; BenchmarkDotNet.Autogenerated.Runnable_0.__ForDisassemblyDiagnoser__() push ebp mov ebp,esp push eax mov [ebp-4],ecx mov ecx,[ebp-4] cmp dword ptr [ecx+20],0B jne short M00_L00 mov ecx,[ebp-4] call dword ptr ds:[0A6AF510] mov esp,ebp pop ebp ret M00_L00: xor eax,eax mov esp,ebp pop ebp ret ; Total bytes of code 35 ``` ### Docs [Profiling workflow for dotnet/runtime repository](https://github.com/dotnet/performance/blob/master/docs/profiling-workflow-dotnet-runtime.md) [Benchmarking workflow for dotnet/runtime repository](https://github.com/dotnet/performance/blob/master/docs/benchmarking-workflow-dotnet-runtime.md)