Skip to content

Commit 14b90e1

Browse files
arm64: Fold negative variable eq/ne to 0 (dotnet#124332)
i.e. Fold: (-(x)) == 0 -> x == 0 arm64 asmdiffs Diffs are based on <span style="color:#1460aa">436,095</span> contexts (<span style="color:#1460aa">26,618</span> MinOpts, <span style="color:#1460aa">409,477</span> FullOpts). <details> <summary>Overall (<span style="color:green">-40</span> bytes)</summary> <div style="margin-left:1em"> |Collection|Base size (bytes)|Diff size (bytes)|PerfScore in Diffs |---|--:|--:|--:| |libraries_tests_no_tiered_compilation.run.linux.arm64.Release.mch|183,146,276|<span style="color:green">-40</span>|<span style="color:green">-0.09%</span>| |benchmarks.run.linux.arm64.checked.mch|21,285,888|+0|0.00%| |smoke_tests.nativeaot.linux.arm64.checked.mch|3,003,400|+0|0.00%| </div></details> <details> <summary>FullOpts (<span style="color:green">-40</span> bytes)</summary> <div style="margin-left:1em"> |Collection|Base size (bytes)|Diff size (bytes)|PerfScore in Diffs |---|--:|--:|--:| |libraries_tests_no_tiered_compilation.run.linux.arm64.Release.mch|168,630,412|<span style="color:green">-40</span>|<span style="color:green">-0.09%</span>| |benchmarks.run.linux.arm64.checked.mch|20,953,436|+0|0.00%| |smoke_tests.nativeaot.linux.arm64.checked.mch|3,001,776|+0|0.00%| </div></details> <details> <summary>Example diffs</summary> <div style="margin-left:1em"> <details> <summary>libraries_tests_no_tiered_compilation.run.linux.arm64.Release.mch</summary> <div style="margin-left:1em"> <details> <summary><span style="color:green">-4</span> (<span style="color:green">-1.27%</span>) : 142473.dasm - System.IO.Pipelines.Tests.BufferSegmentPoolTest:GetSegments(System.IO.Pipelines.ReadResult):System.Collections.Generic.List`1[System.Buffers.ReadOnlySequenceSegment`1[byte]] (FullOpts)</summary> <div style="margin-left:1em"> ```diff @@ -53,8 +53,7 @@ G_M13215_IG02: ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0001 {x0}, byre G_M13215_IG03: ; bbWeight=0.50, gcrefRegs=80002 {x1 x19}, byrefRegs=0000 {}, byref, isz asr w2, w2, dotnet#31 lsl w2, w2, #1 - add w0, w2, w0, ASR dotnet#31 - negs w0, w0 + adds w0, w2, w0, ASR dotnet#31 bne G_M13215_IG04 movz x0, #0xD1FFAB1E movk x0, #0xD1FFAB1E LSL dotnet#16 @@ -76,7 +75,7 @@ G_M13215_IG03: ; bbWeight=0.50, gcrefRegs=80002 {x1 x19}, byrefRegs=0000 mov x19, x0 ; gcrRegs +[x19] b G_M13215_IG05 - ;; size=68 bbWeight=0.50 PerfScore 6.00 + ;; size=64 bbWeight=0.50 PerfScore 5.75 G_M13215_IG04: ; bbWeight=0.50, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref ; gcrRegs -[x0 x19-x20] mov x20, xzr @@ -179,7 +178,7 @@ G_M13215_IG13: ; bbWeight=0, gcrefRegs=580000 {x19 x20 x22}, byrefRegs=00 b G_M13215_IG06 ;; size=12 bbWeight=0 PerfScore 0.00 -; Total bytes of code 316, prolog size 16, PerfScore 140.93, instruction count 79, allocated bytes for code 316 (MethodHash=c6bccc60) for method System.IO.Pipelines.Tests.BufferSegmentPoolTest:GetSegments(System.IO.Pipelines.ReadResult):System.Collections.Generic.List`1[System.Buffers.ReadOnlySequenceSegment`1[byte]] (FullOpts) +; Total bytes of code 312, prolog size 16, PerfScore 140.68, instruction count 78, allocated bytes for code 312 (MethodHash=c6bccc60) for method System.IO.Pipelines.Tests.BufferSegmentPoolTest:GetSegments(System.IO.Pipelines.ReadResult):System.Collections.Generic.List`1[System.Buffers.ReadOnlySequenceSegment`1[byte]] (FullOpts) ; ============================================================ Unwind Info: @@ -190,7 +189,7 @@ Unwind Info: E bit : 0 X bit : 0 Vers : 0 - Function Length : 79 (0x0004f) Actual length = 316 (0x00013c) + Function Length : 78 (0x0004e) Actual length = 312 (0x000138) ---- Epilog scopes ---- ---- Scope 0 Epilog Start Offset : 3523193630 (0xd1ffab1e) Actual offset = 3523193630 (0xd1ffab1e) Offset from main function begin = 3523193630 (0xd1ffab1e) ``` </div></details> <details> <summary><span style="color:green">-4</span> (<span style="color:green">-0.27%</span>) : 162917.dasm - System.Memory.Tests.ReadOnlySequenceTryGetTests:Ctor_Memory():this (FullOpts)</summary> <div style="margin-left:1em"> ```diff @@ -531,10 +531,9 @@ G_M17523_IG25: ; bbWeight=1, gcrefRegs=400002 {x1 x22}, byrefRegs=0000 {} G_M17523_IG26: ; bbWeight=0.50, gcrefRegs=80002 {x1 x19}, byrefRegs=0000 {}, byref, isz asr w0, w0, dotnet#31 lsl w0, w0, #1 - add w0, w0, w2, ASR dotnet#31 - negs w0, w0 + adds w0, w0, w2, ASR dotnet#31 beq G_M17523_IG29 - ;; size=20 bbWeight=0.50 PerfScore 2.25 + ;; size=16 bbWeight=0.50 PerfScore 2.00 G_M17523_IG27: ; bbWeight=0.50, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref ; gcrRegs -[x1 x19] mov w19, wzr @@ -733,7 +732,7 @@ G_M17523_IG43: ; bbWeight=0.00, gcrefRegs=0001 {x0}, byrefRegs=0000 {}, b brk #0 ;; size=32 bbWeight=0.00 PerfScore 0.00 -; Total bytes of code 1488, prolog size 36, PerfScore 200.96, instruction count 372, allocated bytes for code 1488 (MethodHash=abb9bb8c) for method System.Memory.Tests.ReadOnlySequenceTryGetTests:Ctor_Memory():this (FullOpts) +; Total bytes of code 1484, prolog size 36, PerfScore 200.71, instruction count 371, allocated bytes for code 1484 (MethodHash=abb9bb8c) for method System.Memory.Tests.ReadOnlySequenceTryGetTests:Ctor_Memory():this (FullOpts) ; ============================================================ Unwind Info: @@ -744,7 +743,7 @@ Unwind Info: E bit : 0 X bit : 0 Vers : 0 - Function Length : 372 (0x00174) Actual length = 1488 (0x0005d0) + Function Length : 371 (0x00173) Actual length = 1484 (0x0005cc) ---- Epilog scopes ---- ---- Scope 0 Epilog Start Offset : 3523193630 (0xd1ffab1e) Actual offset = 3523193630 (0xd1ffab1e) Offset from main function begin = 3523193630 (0xd1ffab1e) ``` </div></details> <details> <summary><span style="color:green">-4</span> (<span style="color:green">-0.26%</span>) : 162915.dasm - System.Memory.Tests.ReadOnlySequenceTryGetTests:Ctor_Memory_String():this (FullOpts)</summary> <div style="margin-left:1em"> ```diff @@ -208,7 +208,7 @@ ; V197 cse1 [V197,T40] ( 2, 1 ) ref -> x0 "CSE #7: moderate" ; V198 cse2 [V198,T44] ( 2, 1 ) int -> x23 "CSE #4: moderate" ; V199 cse3 [V199,T45] ( 2, 1 ) long -> x1 "CSE #5: moderate" -; V200 cse4 [V200,T33] ( 3, 1.50) int -> x1 "CSE dotnet#17: moderate" +; V200 cse4 [V200,T33] ( 3, 1.50) int -> x1 "CSE dotnet#16: moderate" ; V201 rat0 [V201,T01] ( 3, 5.62) byref -> x1 "fgMakeTemp is creating a new local variable" ; V202 rat1 [V202,T07] ( 5, 3.75) ref -> x0 "replacement local" ; V203 rat2 [V203,T37] ( 3, 1.25) long -> x2 "CSE for expectedClsNode" @@ -623,8 +623,7 @@ G_M55449_IG30: ; bbWeight=1, gcrefRegs=4180002 {x1 x19 x20 x26}, byrefReg G_M55449_IG31: ; bbWeight=0.50, gcrefRegs=180000 {x19 x20}, byrefRegs=0000 {}, byref, isz asr w1, w21, dotnet#31 lsl w1, w1, #1 - add w1, w1, w22, ASR dotnet#31 - negs w1, w1 + adds w1, w1, w22, ASR dotnet#31 bne G_M55449_IG32 mov x1, x19 ; gcrRegs +[x1] @@ -642,7 +641,7 @@ G_M55449_IG31: ; bbWeight=0.50, gcrefRegs=180000 {x19 x20}, byrefRegs=000 ; gcrRegs -[x1 x20] mov w20, #1 b G_M55449_IG33 - ;; size=68 bbWeight=0.50 PerfScore 6.00 + ;; size=64 bbWeight=0.50 PerfScore 5.75 G_M55449_IG32: ; bbWeight=0.50, gcrefRegs=80000 {x19}, byrefRegs=0000 {}, byref mov w20, wzr ;; size=4 bbWeight=0.50 PerfScore 0.25 @@ -776,7 +775,7 @@ G_M55449_IG46: ; bbWeight=0, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref brk #0 ;; size=40 bbWeight=0 PerfScore 0.00 -; Total bytes of code 1516, prolog size 48, PerfScore 174.78, instruction count 379, allocated bytes for code 1516 (MethodHash=a4562766) for method System.Memory.Tests.ReadOnlySequenceTryGetTests:Ctor_Memory_String():this (FullOpts) +; Total bytes of code 1512, prolog size 48, PerfScore 174.53, instruction count 378, allocated bytes for code 1512 (MethodHash=a4562766) for method System.Memory.Tests.ReadOnlySequenceTryGetTests:Ctor_Memory_String():this (FullOpts) ; ============================================================ Unwind Info: @@ -787,7 +786,7 @@ Unwind Info: E bit : 0 X bit : 0 Vers : 0 - Function Length : 379 (0x0017b) Actual length = 1516 (0x0005ec) + Function Length : 378 (0x0017a) Actual length = 1512 (0x0005e8) ---- Epilog scopes ---- ---- Scope 0 Epilog Start Offset : 3523193630 (0xd1ffab1e) Actual offset = 3523193630 (0xd1ffab1e) Offset from main function begin = 3523193630 (0xd1ffab1e) ``` </div></details> <details> <summary>+0 (0.00%) : 223365.dasm - System.Resources.Extensions.DeserializingResourceReader:CompareStringEqualsName(System.String):bool:this (FullOpts)</summary> <div style="margin-left:1em"> ```diff @@ -106,7 +106,7 @@ G_M52056_IG05: ; bbWeight=0.50, gcrefRegs=500000 {x20 x22}, byrefRegs=000 ldr x3, [x3] blr x3 ; gcrRegs -[x0-x1 x20 x22] - negs w0, w0 + cmp w0, #0 cset x0, eq ;; size=40 bbWeight=0.50 PerfScore 4.25 G_M52056_IG06: ; bbWeight=0.50, epilog, nogc, extend ``` </div></details> <details> <summary><span style="color:green">-4</span> (<span style="color:green">-0.02%</span>) : 106573.dasm - System.Data.Tests.DataTableTest2:Select_ByFilter():this (FullOpts)</summary> <div style="margin-left:1em"> ```diff @@ -3678,8 +3678,7 @@ G_M43941_IG97: ; bbWeight=1, gcVars=0000000000000000000000000000000000000 G_M43941_IG98: ; bbWeight=4, gcrefRegs=4780004 {x2 x19 x20 x21 x22 x26}, byrefRegs=0000 {}, byref, isz ldr w1, [x2, #0x08] ldr w0, [fp, #0xD1FFAB1E] // [V74 tmp49] - sub w1, w0, w1 - negs w1, w1 + subs w1, w0, w1 beq G_M43941_IG90 ldp w0, w1, [x22, #0x10] add w1, w1, #1 @@ -3688,7 +3687,7 @@ G_M43941_IG98: ; bbWeight=4, gcrefRegs=4780004 {x2 x19 x20 x21 x22 x26}, ldr w1, [x2, #0x08] cmp w1, w0 bls G_M43941_IG100 - ;; size=48 bbWeight=4 PerfScore 76.00 + ;; size=44 bbWeight=4 PerfScore 74.00 G_M43941_IG99: ; bbWeight=3.03, gcVars=00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002 {V06}, gcrefRegs=4780004 {x2 x19 x20 x21 x22 x26}, byrefRegs=0000 {}, gcvars, byref ; GC ptr vars -{V75} add w1, w0, #1 @@ -7803,7 +7802,7 @@ RWD00 dq 00740053002D0031h, 0067006E00690072h RWD16 dq 007200740053002Dh, 00310067006E0069h -; Total bytes of code 18184, prolog size 44, PerfScore 10435.99, instruction count 4546, allocated bytes for code 18184 (MethodHash=c958545a) for method System.Data.Tests.DataTableTest2:Select_ByFilter():this (FullOpts) +; Total bytes of code 18180, prolog size 44, PerfScore 10433.99, instruction count 4545, allocated bytes for code 18180 (MethodHash=c958545a) for method System.Data.Tests.DataTableTest2:Select_ByFilter():this (FullOpts) ; ============================================================ Unwind Info: @@ -7814,7 +7813,7 @@ Unwind Info: E bit : 0 X bit : 0 Vers : 0 - Function Length : 4130 (0x01022) Actual length = 16520 (0x004088) + Function Length : 4129 (0x01021) Actual length = 16516 (0x004084) ---- Epilog scopes ---- ---- Scope 0 Epilog Start Offset : 3523193630 (0xd1ffab1e) Actual offset = 3523193630 (0xd1ffab1e) Offset from main function begin = 3523193630 (0xd1ffab1e) ``` </div></details> <details> <summary><span style="color:green">-4</span> (<span style="color:green">-0.16%</span>) : 141855.dasm - System.IO.Pipelines.Tests.PipePoolTests:GetMemoryOverMaxPoolSizeAllocatesArray():this (FullOpts)</summary> <div style="margin-left:1em"> ```diff @@ -595,8 +595,7 @@ G_M36412_IG24: ; bbWeight=1, gcrefRegs=B80000 {x19 x20 x21 x23}, byrefReg G_M36412_IG25: ; bbWeight=0.50, gcrefRegs=B80000 {x19 x20 x21 x23}, byrefRegs=0000 {}, byref, isz asr w1, w24, dotnet#31 lsl w1, w1, #1 - add w1, w1, w25, ASR dotnet#31 - negs w1, w1 + adds w1, w1, w25, ASR dotnet#31 bne G_M36412_IG26 mov x1, x20 ; gcrRegs +[x1] @@ -618,7 +617,7 @@ G_M36412_IG25: ; bbWeight=0.50, gcrefRegs=B80000 {x19 x20 x21 x23}, byref ; gcrRegs -[x1] +[x0] ; gcr arg pop 0 b G_M36412_IG27 - ;; size=68 bbWeight=0.50 PerfScore 6.00 + ;; size=64 bbWeight=0.50 PerfScore 5.75 G_M36412_IG26: ; bbWeight=0.50, gcrefRegs=A80000 {x19 x21 x23}, byrefRegs=0000 {}, byref ; gcrRegs -[x0 x20] mov x20, xzr @@ -1232,7 +1231,7 @@ RWD16 dq <unknown method> dq G_M36412_IG51 -; Total bytes of code 2528, prolog size 48, PerfScore 347.37, instruction count 632, allocated bytes for code 2528 (MethodHash=f7d471c3) for method System.IO.Pipelines.Tests.PipePoolTests:GetMemoryOverMaxPoolSizeAllocatesArray():this (FullOpts) +; Total bytes of code 2524, prolog size 48, PerfScore 347.12, instruction count 631, allocated bytes for code 2524 (MethodHash=f7d471c3) for method System.IO.Pipelines.Tests.PipePoolTests:GetMemoryOverMaxPoolSizeAllocatesArray():this (FullOpts) ; ============================================================ Unwind Info: @@ -1243,7 +1242,7 @@ Unwind Info: E bit : 0 X bit : 0 Vers : 0 - Function Length : 591 (0x0024f) Actual length = 2364 (0x00093c) + Function Length : 590 (0x0024e) Actual length = 2360 (0x000938) ---- Epilog scopes ---- ---- Scope 0 Epilog Start Offset : 3523193630 (0xd1ffab1e) Actual offset = 3523193630 (0xd1ffab1e) Offset from main function begin = 3523193630 (0xd1ffab1e) ``` </div></details> </div></details> <details> <summary>benchmarks.run.linux.arm64.checked.mch</summary> <div style="margin-left:1em"> <details> <summary>+0 (0.00%) : 3177.dasm - System.Resources.ResourceReader:CompareStringEqualsName(System.String):bool:this (FullOpts)</summary> <div style="margin-left:1em"> ```diff @@ -106,7 +106,7 @@ G_M1070_IG05: ; bbWeight=0.50, gcrefRegs=500000 {x20 x22}, byrefRegs=0000 ldr x3, [x3] blr x3 ; gcrRegs -[x0-x1 x20 x22] - negs w0, w0 + cmp w0, #0 cset x0, eq ;; size=40 bbWeight=0.50 PerfScore 4.25 G_M1070_IG06: ; bbWeight=0.50, epilog, nogc, extend ``` </div></details> </div></details> <details> <summary>smoke_tests.nativeaot.linux.arm64.checked.mch</summary> <div style="margin-left:1em"> <details> <summary>+0 (0.00%) : 18583.dasm - Generics+TestAsyncGVMScenarios:RunAsync() (FullOpts)</summary> <div style="margin-left:1em"> No diffs found? </div></details> <details> <summary>+0 (0.00%) : 18730.dasm - Generics+TestAsyncGVMScenarios:AsyncGvm1[System.__Canon]():this (FullOpts)</summary> <div style="margin-left:1em"> No diffs found? </div></details> <details> <summary>+0 (0.00%) : 18865.dasm - Generics+TestAsyncGVMScenarios:AsyncGvm2[System.__Canon]():this (FullOpts)</summary> <div style="margin-left:1em"> No diffs found? </div></details> <details> <summary>+0 (0.00%) : 18873.dasm - System.Threading.Tasks.Task:get_CompletedTask() (FullOpts)</summary> <div style="margin-left:1em"> No diffs found? </div></details> </div></details> </div></details> <details> <summary>Details</summary> <div style="margin-left:1em"> #### Size improvements/regressions per collection |Collection|Contexts with diffs|Improvements|Regressions|Same size|Improvements (bytes)|Regressions (bytes)| |---|--:|--:|--:|--:|--:|--:| |libraries_tests_no_tiered_compilation.run.linux.arm64.Release.mch|11|<span style="color:green">10</span>|<span style="color:red">0</span>|<span style="color:blue">1</span>|<span style="color:green">-40</span>|<span style="color:red">+0</span>| |benchmarks.run.linux.arm64.checked.mch|1|<span style="color:green">0</span>|<span style="color:red">0</span>|<span style="color:blue">1</span>|<span style="color:green">-0</span>|<span style="color:red">+0</span>| |smoke_tests.nativeaot.linux.arm64.checked.mch|4|<span style="color:green">0</span>|<span style="color:red">0</span>|<span style="color:blue">4</span>|<span style="color:green">-0</span>|<span style="color:red">+0</span>| ||16|<span style="color:green">10</span>|<span style="color:red">0</span>|<span style="color:blue">6</span>|<span style="color:green">-40</span>|<span style="color:red">+0</span>| --- #### PerfScore improvements/regressions per collection |Collection|Contexts with diffs|Improvements|Regressions|Same PerfScore|Improvements (PerfScore)|Regressions (PerfScore)|PerfScore Overall in FullOpts| |---|--:|--:|--:|--:|--:|--:|--:| |libraries_tests_no_tiered_compilation.run.linux.arm64.Release.mch|11|<span style="color:green">10</span>|<span style="color:red">0</span>|<span style="color:blue">1</span>|<span style="color:green">-0.10%</span>|0.00%|<span style="color:green">-0.0000%</span>| |benchmarks.run.linux.arm64.checked.mch|1|<span style="color:green">0</span>|<span style="color:red">0</span>|<span style="color:blue">1</span>|0.00%|0.00%|0.0000%| |smoke_tests.nativeaot.linux.arm64.checked.mch|4|<span style="color:green">0</span>|<span style="color:red">0</span>|<span style="color:blue">4</span>|0.00%|0.00%|0.0000%| --- #### Context information |Collection|Diffed contexts|MinOpts|FullOpts|Missed, base|Missed, diff| |---|--:|--:|--:|--:|--:| |libraries_tests_no_tiered_compilation.run.linux.arm64.Release.mch|354,001|23,273|330,728|0 (0.00%)|0 (0.00%)| |benchmarks.run.linux.arm64.checked.mch|63,204|3,337|59,867|0 (0.00%)|0 (0.00%)| |smoke_tests.nativeaot.linux.arm64.checked.mch|18,890|8|18,882|0 (0.00%)|0 (0.00%)| ||436,095|26,618|409,477|0 (0.00%)|0 (0.00%)| --- #### jit-analyze output <details> <summary>libraries_tests_no_tiered_compilation.run.linux.arm64.Release.mch</summary> <div style="margin-left:1em"> ``` Summary of Code Size diffs: (Lower is better) Total bytes of base: 183146276 (overridden on cmd) Total bytes of diff: 183146236 (overridden on cmd) Total bytes of delta: -40 (-0.00 % of base) diff is an improvement. relative diff is an improvement. ``` <details> <summary>Detail diffs</summary> ``` Top file improvements (bytes): -4 : 162916.dasm (-0.242% of base) -4 : 141852.dasm (-0.162% of base) -4 : 141855.dasm (-0.158% of base) -4 : 141861.dasm (-0.201% of base) -4 : 162917.dasm (-0.269% of base) -4 : 142473.dasm (-1.266% of base) -4 : 142389.dasm (-0.182% of base) -4 : 162915.dasm (-0.264% of base) -4 : 162918.dasm (-0.185% of base) -4 : 106573.dasm (-0.022% of base) 10 total files with Code Size differences (10 improved, 0 regressed), 1 unchanged. Top method improvements (bytes): -4 (-0.022% of base) : 106573.dasm - System.Data.Tests.DataTableTest2:Select_ByFilter():this (FullOpts) -4 (-1.266% of base) : 142473.dasm - System.IO.Pipelines.Tests.BufferSegmentPoolTest:GetSegments(System.IO.Pipelines.ReadResult):System.Collections.Generic.List`1[System.Buffers.ReadOnlySequenceSegment`1[byte]] (FullOpts) -4 (-0.182% of base) : 142389.dasm - System.IO.Pipelines.Tests.PipelineReaderWriterFacts:ResetAfterCompleteReaderAndWriterWithoutAdvancingClearsEverything():this (FullOpts) -4 (-0.162% of base) : 141852.dasm - System.IO.Pipelines.Tests.PipePoolTests:GetMemoryAtMaxPoolSizeAllocatesFromPool():this (FullOpts) -4 (-0.158% of base) : 141855.dasm - System.IO.Pipelines.Tests.PipePoolTests:GetMemoryOverMaxPoolSizeAllocatesArray():this (FullOpts) -4 (-0.201% of base) : 141861.dasm - System.IO.Pipelines.Tests.PipePoolTests:WritesToArrayPoolByDefault():this (FullOpts) -4 (-0.242% of base) : 162916.dasm - System.Memory.Tests.ReadOnlySequenceTryGetTests:Ctor_IMemoryList_MultiBlock():this (FullOpts) -4 (-0.185% of base) : 162918.dasm - System.Memory.Tests.ReadOnlySequenceTryGetTests:Ctor_IMemoryList_SingleBlock():this (FullOpts) -4 (-0.264% of base) : 162915.dasm - System.Memory.Tests.ReadOnlySequenceTryGetTests:Ctor_Memory_String():this (FullOpts) -4 (-0.269% of base) : 162917.dasm - System.Memory.Tests.ReadOnlySequenceTryGetTests:Ctor_Memory():this (FullOpts) Top method improvements (percentages): -4 (-1.266% of base) : 142473.dasm - System.IO.Pipelines.Tests.BufferSegmentPoolTest:GetSegments(System.IO.Pipelines.ReadResult):System.Collections.Generic.List`1[System.Buffers.ReadOnlySequenceSegment`1[byte]] (FullOpts) -4 (-0.269% of base) : 162917.dasm - System.Memory.Tests.ReadOnlySequenceTryGetTests:Ctor_Memory():this (FullOpts) -4 (-0.264% of base) : 162915.dasm - System.Memory.Tests.ReadOnlySequenceTryGetTests:Ctor_Memory_String():this (FullOpts) -4 (-0.242% of base) : 162916.dasm - System.Memory.Tests.ReadOnlySequenceTryGetTests:Ctor_IMemoryList_MultiBlock():this (FullOpts) -4 (-0.201% of base) : 141861.dasm - System.IO.Pipelines.Tests.PipePoolTests:WritesToArrayPoolByDefault():this (FullOpts) -4 (-0.185% of base) : 162918.dasm - System.Memory.Tests.ReadOnlySequenceTryGetTests:Ctor_IMemoryList_SingleBlock():this (FullOpts) -4 (-0.182% of base) : 142389.dasm - System.IO.Pipelines.Tests.PipelineReaderWriterFacts:ResetAfterCompleteReaderAndWriterWithoutAdvancingClearsEverything():this (FullOpts) -4 (-0.162% of base) : 141852.dasm - System.IO.Pipelines.Tests.PipePoolTests:GetMemoryAtMaxPoolSizeAllocatesFromPool():this (FullOpts) -4 (-0.158% of base) : 141855.dasm - System.IO.Pipelines.Tests.PipePoolTests:GetMemoryOverMaxPoolSizeAllocatesArray():this (FullOpts) -4 (-0.022% of base) : 106573.dasm - System.Data.Tests.DataTableTest2:Select_ByFilter():this (FullOpts) 10 total methods with Code Size differences (10 improved, 0 regressed). ``` </details> -------------------------------------------------------------------------------- </div></details> <details> <summary>benchmarks.run.linux.arm64.checked.mch</summary> <div style="margin-left:1em"> ``` Summary of Code Size diffs: (Lower is better) Total bytes of base: 21285888 (overridden on cmd) Total bytes of diff: 21285888 (overridden on cmd) Total bytes of delta: 0 (0.00 % of base) ``` <details> <summary>Detail diffs</summary> ``` 0 total files with Code Size differences (0 improved, 0 regressed), 1 unchanged. 0 total methods with Code Size differences (0 improved, 0 regressed). ``` </details> -------------------------------------------------------------------------------- </div></details> </div></details> x64 asmdiffs Diffs are based on <span style="color:#1460aa">2,787,549</span> contexts (<span style="color:#1460aa">1,078,277</span> MinOpts, <span style="color:#1460aa">1,709,272</span> FullOpts). <details> <summary>Overall (<span style="color:green">-116</span> bytes)</summary> <div style="margin-left:1em"> |Collection|Base size (bytes)|Diff size (bytes)|PerfScore in Diffs |---|--:|--:|--:| |coreclr_tests.run.linux.x64.checked.mch|305,501,642|<span style="color:green">-110</span>|<span style="color:green">-14.87%</span>| |libraries_tests_no_tiered_compilation.run.linux.x64.Release.mch|157,729,192|<span style="color:green">-2</span>|<span style="color:green">-0.01%</span>| |libraries_tests.run.linux.x64.Release.mch|392,784,680|<span style="color:green">-4</span>|<span style="color:green">-0.01%</span>| </div></details> <details> <summary>MinOpts (<span style="color:green">-14</span> bytes)</summary> <div style="margin-left:1em"> |Collection|Base size (bytes)|Diff size (bytes)|PerfScore in Diffs |---|--:|--:|--:| |coreclr_tests.run.linux.x64.checked.mch|197,469,852|<span style="color:green">-10</span>|<span style="color:green">-1.28%</span>| |libraries_tests.run.linux.x64.Release.mch|215,792,030|<span style="color:green">-4</span>|<span style="color:green">-0.01%</span>| </div></details> <details> <summary>FullOpts (<span style="color:green">-102</span> bytes)</summary> <div style="margin-left:1em"> |Collection|Base size (bytes)|Diff size (bytes)|PerfScore in Diffs |---|--:|--:|--:| |coreclr_tests.run.linux.x64.checked.mch|108,031,790|<span style="color:green">-100</span>|<span style="color:green">-16.74%</span>| |libraries_tests_no_tiered_compilation.run.linux.x64.Release.mch|146,383,976|<span style="color:green">-2</span>|<span style="color:green">-0.01%</span>| </div></details> <details> <summary>Example diffs</summary> <div style="margin-left:1em"> <details> <summary>coreclr_tests.run.linux.x64.checked.mch</summary> <div style="margin-left:1em"> <details> <summary><span style="color:green">-8</span> (<span style="color:green">-29.63%</span>) : 199901.dasm - TestNeg.Program:NegsBinOpSingleLine(int,int):bool (FullOpts)</summary> <div style="margin-left:1em"> ```diff @@ -18,23 +18,19 @@ G_M18888_IG01: ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref, ;; size=0 bbWeight=1 PerfScore 0.00 G_M18888_IG02: ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref sar edi, 1 - mov eax, edi - neg eax setne al movzx rax, al - add esi, esi - mov ecx, esi - neg ecx + shl esi, 1 setne cl movzx rcx, cl or eax, ecx - ;; size=26 bbWeight=1 PerfScore 4.50 + ;; size=18 bbWeight=1 PerfScore 3.75 G_M18888_IG03: ; bbWeight=1, epilog, nogc, extend ret ;; size=1 bbWeight=1 PerfScore 1.00 ; END METHOD TestNeg.Program:NegsBinOpSingleLine(int,int):bool -; Total bytes of code 27, prolog size 0, PerfScore 5.50, instruction count 12, allocated bytes for code 27 (MethodHash=d08ab637) for method TestNeg.Program:NegsBinOpSingleLine(int,int):bool (FullOpts) +; Total bytes of code 19, prolog size 0, PerfScore 4.75, instruction count 8, allocated bytes for code 19 (MethodHash=d08ab637) for method TestNeg.Program:NegsBinOpSingleLine(int,int):bool (FullOpts) ; ============================================================ Unwind Info: ``` </div></details> <details> <summary><span style="color:green">-7</span> (<span style="color:green">-29.17%</span>) : 199894.dasm - TestNeg.Program:NegsLSR(uint):int (FullOpts)</summary> <div style="margin-left:1em"> ```diff @@ -16,20 +16,17 @@ G_M6300_IG01: ; bbWeight=0.50, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref, nogc <-- Prolog IG ;; size=0 bbWeight=0.50 PerfScore 0.00 G_M6300_IG02: ; bbWeight=0.50, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref + mov eax, -1 + mov ecx, 1 shr edi, 3 - mov eax, edi - mov ecx, -1 - mov edx, 1 - neg rax - mov eax, edx - cmove eax, ecx - ;; size=23 bbWeight=0.50 PerfScore 1.00 + cmovne eax, ecx + ;; size=16 bbWeight=0.50 PerfScore 0.62 G_M6300_IG03: ; bbWeight=0.50, epilog, nogc, extend ret ;; size=1 bbWeight=0.50 PerfScore 0.50 ; END METHOD TestNeg.Program:NegsLSR(uint):int -; Total bytes of code 24, prolog size 0, PerfScore 1.50, instruction count 8, allocated bytes for code 24 (MethodHash=2a8ee763) for method TestNeg.Program:NegsLSR(uint):int (FullOpts) +; Total bytes of code 17, prolog size 0, PerfScore 1.12, instruction count 5, allocated bytes for code 17 (MethodHash=2a8ee763) for method TestNeg.Program:NegsLSR(uint):int (FullOpts) ; ============================================================ Unwind Info: ``` </div></details> <details> <summary><span style="color:green">-7</span> (<span style="color:green">-29.17%</span>) : 199896.dasm - TestNeg.Program:NegsLargeShift(uint):int (FullOpts)</summary> <div style="margin-left:1em"> ```diff @@ -16,20 +16,17 @@ G_M11276_IG01: ; bbWeight=0.50, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref, nogc <-- Prolog IG ;; size=0 bbWeight=0.50 PerfScore 0.00 G_M11276_IG02: ; bbWeight=0.50, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref + mov eax, -1 + mov ecx, 1 shl edi, 4 - mov eax, edi - mov ecx, -1 - mov edx, 1 - neg rax - mov eax, edx - cmove eax, ecx - ;; size=23 bbWeight=0.50 PerfScore 1.00 + cmovne eax, ecx + ;; size=16 bbWeight=0.50 PerfScore 0.62 G_M11276_IG03: ; bbWeight=0.50, epilog, nogc, extend ret ;; size=1 bbWeight=0.50 PerfScore 0.50 ; END METHOD TestNeg.Program:NegsLargeShift(uint):int -; Total bytes of code 24, prolog size 0, PerfScore 1.50, instruction count 8, allocated bytes for code 24 (MethodHash=43eed3f3) for method TestNeg.Program:NegsLargeShift(uint):int (FullOpts) +; Total bytes of code 17, prolog size 0, PerfScore 1.12, instruction count 5, allocated bytes for code 17 (MethodHash=43eed3f3) for method TestNeg.Program:NegsLargeShift(uint):int (FullOpts) ; ============================================================ Unwind Info: ``` </div></details> <details> <summary><span style="color:green">-5</span> (<span style="color:green">-1.71%</span>) : 531325.dasm - ILGEN_CLASS:ILGEN_METHOD(bool,char,short,int):char (Tier0)</summary> <div style="margin-left:1em"> ```diff @@ -74,16 +74,14 @@ G_M28265_IG02: ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref, mov qword ptr [rbp-0x40], rdx mov rax, qword ptr [rbp-0x40] mov qword ptr [rbp-0x48], rax - mov eax, dword ptr [rbp-0x28] - neg rax - test rax, rax + cmp dword ptr [rbp-0x28], 0 jne SHORT G_M28265_IG03 mov eax, dword ptr [rbp-0x18] cmp eax, 255 ja SHORT G_M28265_IG06 mov eax, eax mov byte ptr [rbp-0x04], al - ;; size=182 bbWeight=1 PerfScore 117.08 + ;; size=177 bbWeight=1 PerfScore 117.58 G_M28265_IG03: ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref, isz mov eax, dword ptr [rbp-0x10] cmp rax, qword ptr [rbp-0x48] @@ -116,7 +114,7 @@ RWD16 dq 8000000000000000h ; -0 RWD24 dd 4F0BD98Fh ; 2.34629e+09 -; Total bytes of code 293, prolog size 31, PerfScore 147.42, instruction count 75, allocated bytes for code 293 (MethodHash=d26f9196) for method ILGEN_CLASS:ILGEN_METHOD(bool,char,short,int):char (Tier0) +; Total bytes of code 288, prolog size 31, PerfScore 147.92, instruction count 73, allocated bytes for code 288 (MethodHash=d26f9196) for method ILGEN_CLASS:ILGEN_METHOD(bool,char,short,int):char (Tier0) ; ============================================================ Unwind Info: ``` </div></details> <details> <summary><span style="color:green">-2</span> (<span style="color:green">-4.17%</span>) : 181410.dasm - ldc_neg_i4._neg:i4_3(int,int):int (MinOpts)</summary> <div style="margin-left:1em"> ```diff @@ -30,18 +30,17 @@ G_M1458_IG03: ; bbWeight=0.50, gcrefRegs=0000 {}, byrefRegs=0000 {}, byre ;; size=5 bbWeight=0.50 PerfScore 0.50 G_M1458_IG04: ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref xor eax, eax - neg eax test eax, eax sete al movzx rax, al - ;; size=12 bbWeight=1 PerfScore 2.00 + ;; size=10 bbWeight=1 PerfScore 1.75 G_M1458_IG05: ; bbWeight=1, epilog, nogc, extend add rsp, 16 pop rbp ret ;; size=6 bbWeight=1 PerfScore 1.75 -; Total bytes of code 48, prolog size 16, PerfScore 12.00, instruction count 16, allocated bytes for code 48 (MethodHash=0125fa4d) for method ldc_neg_i4._neg:i4_3(int,int):int (MinOpts) +; Total bytes of code 46, prolog size 16, PerfScore 11.75, instruction count 15, allocated bytes for code 46 (MethodHash=0125fa4d) for method ldc_neg_i4._neg:i4_3(int,int):int (MinOpts) ; ============================================================ Unwind Info: ``` </div></details> <details> <summary><span style="color:green">-3</span> (<span style="color:green">-5.77%</span>) : 181421.dasm - ldc_neg_i8._neg:i8_3(long,long):int (MinOpts)</summary> <div style="margin-left:1em"> ```diff @@ -30,18 +30,17 @@ G_M18290_IG03: ; bbWeight=0.50, gcrefRegs=0000 {}, byrefRegs=0000 {}, byr ;; size=5 bbWeight=0.50 PerfScore 0.50 G_M18290_IG04: ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref xor eax, eax - neg rax test rax, rax sete al movzx rax, al - ;; size=14 bbWeight=1 PerfScore 2.00 + ;; size=11 bbWeight=1 PerfScore 1.75 G_M18290_IG05: ; bbWeight=1, epilog, nogc, extend add rsp, 16 pop rbp ret ;; size=6 bbWeight=1 PerfScore 1.75 -; Total bytes of code 52, prolog size 18, PerfScore 12.00, instruction count 16, allocated bytes for code 52 (MethodHash=ff46b88d) for method ldc_neg_i8._neg:i8_3(long,long):int (MinOpts) +; Total bytes of code 49, prolog size 18, PerfScore 11.75, instruction count 15, allocated bytes for code 49 (MethodHash=ff46b88d) for method ldc_neg_i8._neg:i8_3(long,long):int (MinOpts) ; ============================================================ Unwind Info: ``` </div></details> </div></details> <details> <summary>libraries_tests_no_tiered_compilation.run.linux.x64.Release.mch</summary> <div style="margin-left:1em"> <details> <summary><span style="color:green">-2</span> (<span style="color:green">-0.01%</span>) : 124444.dasm - System.Data.Tests.DataTableTest2:Select_ByFilter():this (FullOpts)</summary> <div style="margin-left:1em"> ```diff @@ -3246,7 +3246,6 @@ G_M43941_IG102: ; bbWeight=1, gcVars=000000000000000000000000000000000000 G_M43941_IG103: ; bbWeight=4, gcrefRegs=F009 {rax rbx r12 r13 r14 r15}, byrefRegs=0000 {}, byref, isz mov esi, dword ptr [rbp-0x30] sub esi, dword ptr [rax+0x08] - neg esi je G_M43941_IG96 inc dword ptr [r13+0x14] mov rdi, gword ptr [r13+0x08] @@ -3254,7 +3253,7 @@ G_M43941_IG103: ; bbWeight=4, gcrefRegs=F009 {rax rbx r12 r13 r14 r15}, b mov esi, dword ptr [r13+0x10] cmp dword ptr [rdi+0x08], esi jbe SHORT G_M43941_IG106 - ;; size=31 bbWeight=4 PerfScore 65.00 + ;; size=29 bbWeight=4 PerfScore 64.00 G_M43941_IG104: ; bbWeight=3.05, gcVars=00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002 {V06}, gcrefRegs=F088 {rbx rdi r12 r13 r14 r15}, byrefRegs=0000 {}, gcvars, byref ; gcrRegs -[rax] ; GC ptr vars -{V75} @@ -6658,7 +6657,7 @@ RWD40 dq 4034000000000000h ; 20 RWD48 dq 4039000000000000h ; 25 -; Total bytes of code 14316, prolog size 28, PerfScore 7866.28, instruction count 3034, allocated bytes for code 14316 (MethodHash=c958545a) for method System.Data.Tests.DataTableTest2:Select_ByFilter():this (FullOpts) +; Total bytes of code 14314, prolog size 28, PerfScore 7865.28, instruction count 3033, allocated bytes for code 14314 (MethodHash=c958545a) for method System.Data.Tests.DataTableTest2:Select_ByFilter():this (FullOpts) ; ============================================================ Unwind Info: ``` </div></details> </div></details> <details> <summary>libraries_tests.run.linux.x64.Release.mch</summary> <div style="margin-left:1em"> <details> <summary><span style="color:green">-4</span> (<span style="color:green">-0.03%</span>) : 314396.dasm - System.Data.Tests.DataTableTest2:Select_ByFilter():this (Instrumented Tier0)</summary> <div style="margin-left:1em"> ```diff @@ -2199,13 +2199,11 @@ G_M43941_IG57: ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref ; gcr arg pop 0 mov ecx, dword ptr [rbp-0x240] sub ecx, dword ptr [rax] - mov eax, ecx - ; byrRegs -[rax] - neg eax - test eax, eax + test ecx, ecx je G_M43941_IG56 mov rdi, 0xD1FFAB1E call CORINFO_HELP_COUNTPROFILE32 + ; byrRegs -[rax] ; gcr arg pop 0 mov rdi, gword ptr [rbp-0x50] ; gcrRegs +[rdi] @@ -2215,7 +2213,7 @@ G_M43941_IG57: ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref call [<unknown method>] ; gcrRegs -[rsi rdi] ; gcr arg pop 0 - ;; size=309 bbWeight=1 PerfScore 58.00 + ;; size=305 bbWeight=1 PerfScore 57.50 G_M43941_IG58: ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref, isz mov eax, dword ptr [rbp-0x5E0] dec eax @@ -5412,7 +5410,7 @@ RWD08 dq 4034000000000000h ; 20 RWD16 dq 4039000000000000h ; 25 -; Total bytes of code 15982, prolog size 67, PerfScore 3425.70, instruction count 2755, allocated bytes for code 15982 (MethodHash=c958545a) for method System.Data.Tests.DataTableTest2:Select_ByFilter():this (Instrumented Tier0) +; Total bytes of code 15978, prolog size 67, PerfScore 3425.20, instruction count 2753, allocated bytes for code 15978 (MethodHash=c958545a) for method System.Data.Tests.DataTableTest2:Select_ByFilter():this (Instrumented Tier0) ; ============================================================ Unwind Info: ``` </div></details> </div></details> </div></details> <details> <summary>Details</summary> <div style="margin-left:1em"> #### Size improvements/regressions per collection |Collection|Contexts with diffs|Improvements|Regressions|Same size|Improvements (bytes)|Regressions (bytes)| |---|--:|--:|--:|--:|--:|--:| |benchmarks.run.linux.x64.checked.mch|0|<span style="color:green">0</span>|<span style="color:red">0</span>|<span style="color:blue">0</span>|<span style="color:green">-0</span>|<span style="color:red">+0</span>| |benchmarks.run_pgo.linux.x64.checked.mch|0|<span style="color:green">0</span>|<span style="color:red">0</span>|<span style="color:blue">0</span>|<span style="color:green">-0</span>|<span style="color:red">+0</span>| |benchmarks.run_pgo_optrepeat.linux.x64.checked.mch|0|<span style="color:green">0</span>|<span style="color:red">0</span>|<span style="color:blue">0</span>|<span style="color:green">-0</span>|<span style="color:red">+0</span>| |coreclr_tests.run.linux.x64.checked.mch|23|<span style="color:green">23</span>|<span style="color:red">0</span>|<span style="color:blue">0</span>|<span style="color:green">-110</span>|<span style="color:red">+0</span>| |libraries.crossgen2.linux.x64.checked.mch|0|<span style="color:green">0</span>|<span style="color:red">0</span>|<span style="color:blue">0</span>|<span style="color:green">-0</span>|<span style="color:red">+0</span>| |libraries.pmi.linux.x64.checked.mch|0|<span style="color:green">0</span>|<span style="color:red">0</span>|<span style="color:blue">0</span>|<span style="color:green">-0</span>|<span style="color:red">+0</span>| |libraries_tests_no_tiered_compilation.run.linux.x64.Release.mch|1|<span style="color:green">1</span>|<span style="color:red">0</span>|<span style="color:blue">0</span>|<span style="color:green">-2</span>|<span style="color:red">+0</span>| |libraries_tests.run.linux.x64.Release.mch|1|<span style="color:green">1</span>|<span style="color:red">0</span>|<span style="color:blue">0</span>|<span style="color:green">-4</span>|<span style="color:red">+0</span>| |realworld.run.linux.x64.checked.mch|0|<span style="color:green">0</span>|<span style="color:red">0</span>|<span style="color:blue">0</span>|<span style="color:green">-0</span>|<span style="color:red">+0</span>| |smoke_tests.nativeaot.linux.x64.checked.mch|0|<span style="color:green">0</span>|<span style="color:red">0</span>|<span style="color:blue">0</span>|<span style="color:green">-0</span>|<span style="color:red">+0</span>| ||25|<span style="color:green">25</span>|<span style="color:red">0</span>|<span style="color:blue">0</span>|<span style="color:green">-116</span>|<span style="color:red">+0</span>| --- #### PerfScore improvements/regressions per collection |Collection|Contexts with diffs|Improvements|Regressions|Same PerfScore|Improvements (PerfScore)|Regressions (PerfScore)|PerfScore Overall in FullOpts| |---|--:|--:|--:|--:|--:|--:|--:| |benchmarks.run.linux.x64.checked.mch|0|<span style="color:green">0</span>|<span style="color:red">0</span>|<span style="color:blue">0</span>|0.00%|0.00%|0.0000%| |benchmarks.run_pgo.linux.x64.checked.mch|0|<span style="color:green">0</span>|<span style="color:red">0</span>|<span style="color:blue">0</span>|0.00%|0.00%|0.0000%| |benchmarks.run_pgo_optrepeat.linux.x64.checked.mch|0|<span style="color:green">0</span>|<span style="color:red">0</span>|<span style="color:blue">0</span>|0.00%|0.00%|0.0000%| |coreclr_tests.run.linux.x64.checked.mch|23|<span style="color:green">22</span>|<span style="color:red">1</span>|<span style="color:blue">0</span>|<span style="color:green">-15.50%</span>|<span style="color:red">+0.34%</span>|<span style="color:green">-0.0017%</span>| |libraries.crossgen2.linux.x64.checked.mch|0|<span style="color:green">0</span>|<span style="color:red">0</span>|<span style="color:blue">0</span>|0.00%|0.00%|0.0000%| |libraries.pmi.linux.x64.checked.mch|0|<span style="color:green">0</span>|<span style="color:red">0</span>|<span style="color:blue">0</span>|0.00%|0.00%|0.0000%| |libraries_tests_no_tiered_compilation.run.linux.x64.Release.mch|1|<span style="color:green">1</span>|<span style="color:red">0</span>|<span style="color:blue">0</span>|<span style="color:green">-0.01%</span>|0.00%|<span style="color:green">-0.0000%</span>| |libraries_tests.run.linux.x64.Release.mch|1|<span style="color:green">1</span>|<span style="color:red">0</span>|<span style="color:blue">0</span>|<span style="color:green">-0.01%</span>|0.00%|0.0000%| |realworld.run.linux.x64.checked.mch|0|<span style="color:green">0</span>|<span style="color:red">0</span>|<span style="color:blue">0</span>|0.00%|0.00%|0.0000%| |smoke_tests.nativeaot.linux.x64.checked.mch|0|<span style="color:green">0</span>|<span style="color:red">0</span>|<span style="color:blue">0</span>|0.00%|0.00%|0.0000%| --- #### Context information |Collection|Diffed contexts|MinOpts|FullOpts|Missed, base|Missed, diff| |---|--:|--:|--:|--:|--:| |benchmarks.run.linux.x64.checked.mch|75,913|2,972|72,941|0 (0.00%)|0 (0.00%)| |benchmarks.run_pgo.linux.x64.checked.mch|122,785|86,206|36,579|0 (0.00%)|0 (0.00%)| |benchmarks.run_pgo_optrepeat.linux.x64.checked.mch|76,998|2,939|74,059|0 (0.00%)|0 (0.00%)| |coreclr_tests.run.linux.x64.checked.mch|577,098|358,595|218,503|0 (0.00%)|0 (0.00%)| |libraries.crossgen2.linux.x64.checked.mch|269,385|20|269,365|0 (0.00%)|0 (0.00%)| |libraries.pmi.linux.x64.checked.mch|354,706|8|354,698|0 (0.00%)|0 (0.00%)| |libraries_tests_no_tiered_compilation.run.linux.x64.Release.mch|387,764|23,607|364,157|0 (0.00%)|0 (0.00%)| |libraries_tests.run.linux.x64.Release.mch|862,114|603,896|258,218|0 (0.00%)|0 (0.00%)| |realworld.run.linux.x64.checked.mch|29,264|21|29,243|0 (0.00%)|0 (0.00%)| |smoke_tests.nativeaot.linux.x64.checked.mch|31,522|13|31,509|0 (0.00%)|0 (0.00%)| ||2,787,549|1,078,277|1,709,272|0 (0.00%)|0 (0.00%)| --- #### jit-analyze output </div></details>
1 parent 4a6399a commit 14b90e1

2 files changed

Lines changed: 1392 additions & 115 deletions

File tree

src/coreclr/jit/morph.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8760,6 +8760,38 @@ GenTree* Compiler::fgOptimizeEqualityComparisonWithConst(GenTreeOp* cmp)
87608760
GenTree* op1 = cmp->gtGetOp1();
87618761
GenTreeIntConCommon* op2 = cmp->gtGetOp2()->AsIntConCommon();
87628762

8763+
// Fold: (-(x)) == 0 -> x == 0 (avoid neg on compare-to-zero)
8764+
if (op1->OperIs(GT_NEG) && !op1->gtOverflowEx())
8765+
{
8766+
GenTree* negOp = op1->AsUnOp()->gtGetOp1();
8767+
8768+
if (op2->IsIntegralConst(0))
8769+
{
8770+
bool shouldFold = true;
8771+
8772+
#ifdef TARGET_ARM64
8773+
// On ARM64 negs with a shift can be more compact than shift; cmp #0.
8774+
// Avoid folding when the negated operand is a simple shift so we keep the single
8775+
// instruction form.
8776+
if (negOp->OperIsShift())
8777+
{
8778+
GenTree* shiftAmount = negOp->AsOp()->gtGetOp2();
8779+
if (shiftAmount->IsCnsIntOrI())
8780+
{
8781+
shouldFold = false;
8782+
}
8783+
}
8784+
#endif
8785+
8786+
if (shouldFold)
8787+
{
8788+
cmp->gtOp1 = negOp;
8789+
DEBUG_DESTROY_NODE(op1);
8790+
op1 = negOp;
8791+
}
8792+
}
8793+
}
8794+
87638795
// Check for "(expr +/- icon1) ==/!= (non-zero-icon2)".
87648796
if (op2->IsCnsIntOrI() && (op2->IconValue() != 0))
87658797
{

0 commit comments

Comments
 (0)