[wasm] Bump chrome for testing - linux: 118.0.5993.70, windows: 118.0.5993.70 - #7
Open
github-actions[bot] wants to merge 1 commit into
Open
github-actions[bot] wants to merge 1 commit into
github-actions[bot] wants to merge 1 commit into
Conversation
eduardo-vp
pushed a commit
that referenced
this pull request
Sep 25, 2024
* bug #1: don't allow for values out of the SerializationRecordType enum range * bug #2: throw SerializationException rather than KeyNotFoundException when the referenced record is missing or it points to a record of different type * bug #3: throw SerializationException rather than FormatException when it's being thrown by BinaryReader (or sth else that we use) * bug #4: document the fact that IOException can be thrown * bug #5: throw SerializationException rather than OverflowException when parsing the decimal fails * bug #6: 0 and 17 are illegal values for PrimitiveType enum * bug #7: throw SerializationException when a surrogate character is read (so far an ArgumentException was thrown)
eduardo-vp
pushed a commit
that referenced
this pull request
Mar 26, 2026
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 #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 #17: moderate"
+; V200 cse4 [V200,T33] ( 3, 1.50) int -> x1 "CSE #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>
eduardo-vp
pushed a commit
that referenced
this pull request
Apr 20, 2026
* intial FieldDefinition support * fb
eduardo-vp
pushed a commit
that referenced
this pull request
Jun 9, 2026
…form (dotnet#128842) ## Description Adds a hard pre-emit gate to Branch A of `ci-failure-scan.md`: before calling `create_issue`, the agent scans the proposed body for the literal `<!-- ci-scan-match-count: <N> hits in failure.log -->` marker that KBE-verification check #7 already requires. If absent or `N == 0`, do not emit; record `skipped: KBE body missing positive match-count marker` and stop. ## Motivation Check #7 in `shared/create-kbe.instructions.md` says the marker is mandatory, but the scanner has emitted KBEs without it. Two recent examples that BA cannot match and that sit at `0 / 0 / 0` indefinitely: - dotnet#128544 (closed, never matched) - dotnet#128827 (open, will not match either) Both have the same JSON shape: ```json { "ErrorMessage": "Assertion failed '(op3Reg != targetReg) || (op1Reg == targetReg)' in 'System.Runtime.Intrinsics.X86.Avx512F:FusedMultiplyAddNegated", "ErrorPattern": "", ... } ``` That substring lives in the corerun.exe stdout dump on a JIT assert, which is not in the set of logs BA indexes for KBE matching. Without the match-count marker (which check #7 requires the agent to verify against the actual failure log it has access to), there is no pre-flight check that the signature is even findable. The body looks plausible and gets filed; BA never matches it; the scanner re-files it next scan as a "recurrence". The gate is small (one paragraph) and references existing rules rather than introducing new policy. The body of the change also documents the native-assert case explicitly so the agent stops reaching for `ErrorPattern` as a fix. Regex vs substring does not change which logs BA reads; the array form (xunit anchor + assert anchor) is the lever, and check #7 already prescribes it. ## Out of scope - Backfilling dotnet#128544 / dotnet#128827 with a working signature (separate manual edit or a one-off cleanup PR). - Changing what logs BA indexes (out of dotnet/runtime's control). cc @kg > [!NOTE] > This PR was authored with assistance from GitHub Copilot CLI. --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
eduardo-vp
pushed a commit
that referenced
this pull request
Aug 6, 2026
…rs (dotnet#129688) See discussion at dotnet#121981 (comment) # SuperPMI ASM diffs: ExtractMostSignificantBits Base JIT: `artifacts/asmdiff/builds/59979e64/core_root/libclrjit.so` Diff JIT: `artifacts/tests/coreclr/linux.arm64.Checked/Tests/Core_Root/libclrjit.so` MCH: `/tmp/ExtractMostSignificantBits_final.mch` Base commit: `59979e6401a` (`origin/main`) Diff commit: `e37c3840564` ## Short summary Diffs are based on <span style="color:#1460aa">39</span> contexts (<span style="color:#1460aa">0</span> MinOpts, <span style="color:#1460aa">39</span> FullOpts). <details> <summary>Overall (<span style="color:green">-480</span> bytes)</summary> <div style="margin-left:1em"> |Collection|Base size (bytes)|Diff size (bytes)|PerfScore in Diffs |---|--:|--:|--:| |ExtractMostSignificantBits_final.mch|8,492|<span style="color:green">-480</span>|<span style="color:green">-28.40%</span>| </div></details> <details> <summary>FullOpts (<span style="color:green">-480</span> bytes)</summary> <div style="margin-left:1em"> |Collection|Base size (bytes)|Diff size (bytes)|PerfScore in Diffs |---|--:|--:|--:| |ExtractMostSignificantBits_final.mch|8,492|<span style="color:green">-480</span>|<span style="color:green">-28.40%</span>| </div></details> ## SuperPMI summary Diffs are based on <span style="color:#1460aa">39</span> contexts (<span style="color:#1460aa">0</span> MinOpts, <span style="color:#1460aa">39</span> FullOpts). <details> <summary>Overall (<span style="color:green">-480</span> bytes)</summary> <div style="margin-left:1em"> |Collection|Base size (bytes)|Diff size (bytes)|PerfScore in Diffs |---|--:|--:|--:| |ExtractMostSignificantBits_final.mch|8,492|<span style="color:green">-480</span>|<span style="color:green">-28.40%</span>| </div></details> <details> <summary>FullOpts (<span style="color:green">-480</span> bytes)</summary> <div style="margin-left:1em"> |Collection|Base size (bytes)|Diff size (bytes)|PerfScore in Diffs |---|--:|--:|--:| |ExtractMostSignificantBits_final.mch|8,492|<span style="color:green">-480</span>|<span style="color:green">-28.40%</span>| </div></details> <details> <summary>Example diffs</summary> <div style="margin-left:1em"> <details> <summary>ExtractMostSignificantBits_final.mch</summary> <div style="margin-left:1em"> <details> <summary><span style="color:green">-44</span> (<span style="color:green">-52.38%</span>) : 17.dasm - TestExtractMostSignificantBits.Program:CountGreaterThanOrEqualByte(System.Runtime.Intrinsics.Vector128`1[byte],byte):int (FullOpts)</summary> <div style="margin-left:1em"> ```diff @@ -7,10 +7,9 @@ ; No matching PGO data ; Final local variable assignments ; -; V00 arg0 [V00,T02] ( 3, 3 ) simd16 -> d0 single-def <System.Runtime.Intrinsics.Vector128`1[byte]> +; V00 arg0 [V00,T01] ( 3, 3 ) simd16 -> d0 single-def <System.Runtime.Intrinsics.Vector128`1[byte]> ; V01 arg1 [V01,T00] ( 3, 3 ) ubyte -> x0 single-def ;# V02 OutArgs [V02 ] ( 1, 1 ) struct ( 0) [sp+0x00] do-not-enreg[XS] addr-exposed "OutgoingArgSpace" <Empty> -; V03 rat0 [V03,T01] ( 3, 6 ) simd16 -> d16 "ReplaceWithLclVar is creating a new local variable" ; ; Lcl frame size = 0 @@ -18,33 +17,20 @@ G_M10966_IG01: ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref, stp fp, lr, [sp, #-0x10]! mov fp, sp ;; size=8 bbWeight=1 PerfScore 1.50 -G_M10966_IG02: ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref, isz +G_M10966_IG02: ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref uxtb w0, w0 dup v16.16b, w0 cmhs v16.16b, v0.16b, v16.16b - movi v17.16b, #0x80 - and v16.16b, v16.16b, v17.16b - ldr q17, [@rwd00] - ushl v16.16b, v16.16b, v17.16b - uxtl2 v17.8h, v16.16b - shl v17.8h, v17.8h, #8 - uaddw v16.8h, v17.8h, v16.8b - addv h16, v16.8h - umov w0, v16.h[0] - movi v16.8b, #0 - ins v16.s[0], w0 - cnt v16.8b, v16.8b - addv b16, v16.8b - umov w0, v16.s[0] - ;; size=68 bbWeight=1 PerfScore 20.00 + ushr v16.16b, v16.16b, #7 + addv b16, v16.16b + umov w0, v16.b[0] + ;; size=24 bbWeight=1 PerfScore 7.50 G_M10966_IG03: ; bbWeight=1, epilog, nogc, extend ldp fp, lr, [sp], #0x10 ret lr ;; size=8 bbWeight=1 PerfScore 2.00 -RWD00 dq 00FFFEFDFCFBFAF9h, 00FFFEFDFCFBFAF9h - -; Total bytes of code 84, prolog size 8, PerfScore 23.50, instruction count 21, allocated bytes for code 84 (MethodHash=3eafd529) for method TestExtractMostSignificantBits.Program:CountGreaterThanOrEqualByte(System.Runtime.Intrinsics.Vector128`1[byte],byte):int (FullOpts) +; Total bytes of code 40, prolog size 8, PerfScore 11.00, instruction count 10, allocated bytes for code 40 (MethodHash=3eafd529) for method TestExtractMostSignificantBits.Program:CountGreaterThanOrEqualByte(System.Runtime.Intrinsics.Vector128`1[byte],byte):int (FullOpts) ; ============================================================ Unwind Info: @@ -55,7 +41,7 @@ Unwind Info: E bit : 0 X bit : 0 Vers : 0 - Function Length : 21 (0x00015) Actual length = 84 (0x000054) + Function Length : 10 (0x0000a) Actual length = 40 (0x000028) ---- 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">-32</span> (<span style="color:green">-47.06%</span>) : 12.dasm - TestExtractMostSignificantBits.Program:CountLessThanInt32(System.Runtime.Intrinsics.Vector128`1[int],int):int (FullOpts)</summary> <div style="margin-left:1em"> ```diff @@ -17,29 +17,19 @@ G_M46948_IG01: ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref, stp fp, lr, [sp, #-0x10]! mov fp, sp ;; size=8 bbWeight=1 PerfScore 1.50 -G_M46948_IG02: ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref, isz +G_M46948_IG02: ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref dup v16.4s, w0 cmgt v16.4s, v16.4s, v0.4s - movi v17.4s, #0x80, LSL #24 - and v16.4s, v16.4s, v17.4s - ldr q17, [@rwd00] - ushl v16.4s, v16.4s, v17.4s + ushr v16.4s, v16.4s, dotnet#31 addv s16, v16.4s - smov x0, v16.s[0] - movi v16.8b, #0 - ins v16.s[0], w0 - cnt v16.8b, v16.8b - addv b16, v16.8b umov w0, v16.s[0] - ;; size=52 bbWeight=1 PerfScore 15.50 + ;; size=20 bbWeight=1 PerfScore 7.00 G_M46948_IG03: ; bbWeight=1, epilog, nogc, extend ldp fp, lr, [sp], #0x10 ret lr ;; size=8 bbWeight=1 PerfScore 2.00 -RWD00 dq FFFFFFE2FFFFFFE1h, FFFFFFE4FFFFFFE3h - -; Total bytes of code 68, prolog size 8, PerfScore 19.00, instruction count 17, allocated bytes for code 68 (MethodHash=d8b1489b) for method TestExtractMostSignificantBits.Program:CountLessThanInt32(System.Runtime.Intrinsics.Vector128`1[int],int):int (FullOpts) +; Total bytes of code 36, prolog size 8, PerfScore 10.50, instruction count 9, allocated bytes for code 36 (MethodHash=d8b1489b) for method TestExtractMostSignificantBits.Program:CountLessThanInt32(System.Runtime.Intrinsics.Vector128`1[int],int):int (FullOpts) ; ============================================================ Unwind Info: @@ -50,7 +40,7 @@ Unwind Info: E bit : 0 X bit : 0 Vers : 0 - Function Length : 17 (0x00011) Actual length = 68 (0x000044) + Function Length : 9 (0x00009) Actual length = 36 (0x000024) ---- 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">-32</span> (<span style="color:green">-47.06%</span>) : 27.dasm - TestExtractMostSignificantBits.Program:CountLessThanInt3264(System.Runtime.Intrinsics.Vector64`1[int],int):int (FullOpts)</summary> <div style="margin-left:1em"> ```diff @@ -18,29 +18,19 @@ G_M44223_IG01: ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref, stp fp, lr, [sp, #-0x10]! mov fp, sp ;; size=8 bbWeight=1 PerfScore 1.50 -G_M44223_IG02: ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref, isz +G_M44223_IG02: ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref dup v16.2s, w0 cmgt v16.2s, v16.2s, v0.2s - movi v17.2s, #0x80, LSL #24 - and v16.2s, v16.2s, v17.2s - ldr d17, [@rwd00] - ushl v16.2s, v16.2s, v17.2s + ushr v16.2s, v16.2s, dotnet#31 addp v16.2s, v16.2s, v16.2s - smov x0, v16.s[0] - movi v16.8b, #0 - ins v16.s[0], w0 - cnt v16.8b, v16.8b - addv b16, v16.8b umov w0, v16.s[0] - ;; size=52 bbWeight=1 PerfScore 15.50 + ;; size=20 bbWeight=1 PerfScore 7.00 G_M44223_IG03: ; bbWeight=1, epilog, nogc, extend ldp fp, lr, [sp], #0x10 ret lr ;; size=8 bbWeight=1 PerfScore 2.00 -RWD00 dq FFFFFFE2FFFFFFE1h - -; Total bytes of code 68, prolog size 8, PerfScore 19.00, instruction count 17, allocated bytes for code 68 (MethodHash=6ccd5340) for method TestExtractMostSignificantBits.Program:CountLessThanInt3264(System.Runtime.Intrinsics.Vector64`1[int],int):int (FullOpts) +; Total bytes of code 36, prolog size 8, PerfScore 10.50, instruction count 9, allocated bytes for code 36 (MethodHash=6ccd5340) for method TestExtractMostSignificantBits.Program:CountLessThanInt3264(System.Runtime.Intrinsics.Vector64`1[int],int):int (FullOpts) ; ============================================================ Unwind Info: @@ -51,7 +41,7 @@ Unwind Info: E bit : 0 X bit : 0 Vers : 0 - Function Length : 17 (0x00011) Actual length = 68 (0x000044) + Function Length : 9 (0x00009) Actual length = 36 (0x000024) ---- 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">-8</span> (<span style="color:green">-13.33%</span>) : 33.dasm - TestExtractMostSignificantBits.Program:IndexOfFirstGreaterThanOrEqualByte64(System.Runtime.Intrinsics.Vector64`1[byte],byte):int (FullOpts)</summary> <div style="margin-left:1em"> ```diff @@ -21,23 +21,21 @@ G_M59363_IG02: ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref, uxtb w0, w0 dup v16.8b, w0 cmhs v16.8b, v0.8b, v16.8b - movi v17.8b, #0x80 - and v16.8b, v16.8b, v17.8b ldr d17, [@rwd00] - ushl v16.8b, v16.8b, v17.8b - addv b16, v16.8b + movi v18.8b, #0x21 + bsl v16.8b, v17.8b, v18.8b + uminv b16, v16.8b umov w0, v16.b[0] - rbit w0, w0 - clz w0, w0 - ;; size=44 bbWeight=1 PerfScore 12.00 + sub w0, w0, #1 + ;; size=36 bbWeight=1 PerfScore 11.00 G_M59363_IG03: ; bbWeight=1, epilog, nogc, extend ldp fp, lr, [sp], #0x10 ret lr ;; size=8 bbWeight=1 PerfScore 2.00 -RWD00 dq 00FFFEFDFCFBFAF9h +RWD00 dq 0807060504030201h -; Total bytes of code 60, prolog size 8, PerfScore 15.50, instruction count 15, allocated bytes for code 60 (MethodHash=312b181c) for method TestExtractMostSignificantBits.Program:IndexOfFirstGreaterThanOrEqualByte64(System.Runtime.Intrinsics.Vector64`1[byte],byte):int (FullOpts) +; Total bytes of code 52, prolog size 8, PerfScore 14.50, instruction count 13, allocated bytes for code 52 (MethodHash=312b181c) for method TestExtractMostSignificantBits.Program:IndexOfFirstGreaterThanOrEqualByte64(System.Runtime.Intrinsics.Vector64`1[byte],byte):int (FullOpts) ; ============================================================ Unwind Info: @@ -48,7 +46,7 @@ Unwind Info: E bit : 0 X bit : 0 Vers : 0 - Function Length : 15 (0x0000f) Actual length = 60 (0x00003c) + Function Length : 13 (0x0000d) Actual length = 52 (0x000034) ---- 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">-8</span> (<span style="color:green">-13.33%</span>) : 23.dasm - TestExtractMostSignificantBits.Program:IndexOfFirstGreaterThanOrEqualUInt1664(System.Runtime.Intrinsics.Vector64`1[ushort],ushort):int (FullOpts)</summary> <div style="margin-left:1em"> ```diff @@ -21,23 +21,21 @@ G_M61416_IG02: ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref, uxth w0, w0 dup v16.4h, w0 cmhs v16.4h, v0.4h, v16.4h - movi v17.4h, #0x80, LSL #8 - and v16.4h, v16.4h, v17.4h ldr d17, [@rwd00] - ushl v16.4h, v16.4h, v17.4h - addv h16, v16.4h + movi v18.4h, #0x21 + bsl v16.4h, v17.4h, v18.4h + uminv h16, v16.4h umov w0, v16.h[0] - rbit w0, w0 - clz w0, w0 - ;; size=44 bbWeight=1 PerfScore 12.00 + sub w0, w0, #1 + ;; size=36 bbWeight=1 PerfScore 11.00 G_M61416_IG03: ; bbWeight=1, epilog, nogc, extend ldp fp, lr, [sp], #0x10 ret lr ;; size=8 bbWeight=1 PerfScore 2.00 -RWD00 dq FFF4FFF3FFF2FFF1h +RWD00 dq 0004000300020001h -; Total bytes of code 60, prolog size 8, PerfScore 15.50, instruction count 15, allocated bytes for code 60 (MethodHash=ba031017) for method TestExtractMostSignificantBits.Program:IndexOfFirstGreaterThanOrEqualUInt1664(System.Runtime.Intrinsics.Vector64`1[ushort],ushort):int (FullOpts) +; Total bytes of code 52, prolog size 8, PerfScore 14.50, instruction count 13, allocated bytes for code 52 (MethodHash=ba031017) for method TestExtractMostSignificantBits.Program:IndexOfFirstGreaterThanOrEqualUInt1664(System.Runtime.Intrinsics.Vector64`1[ushort],ushort):int (FullOpts) ; ============================================================ Unwind Info: @@ -48,7 +46,7 @@ Unwind Info: E bit : 0 X bit : 0 Vers : 0 - Function Length : 15 (0x0000f) Actual length = 60 (0x00003c) + Function Length : 13 (0x0000d) Actual length = 52 (0x000034) ---- 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">-8</span> (<span style="color:green">-13.33%</span>) : 8.dasm - TestExtractMostSignificantBits.Program:IndexOfFirstGreaterThanOrEqualUInt16(System.Runtime.Intrinsics.Vector128`1[ushort],ushort):int (FullOpts)</summary> <div style="margin-left:1em"> ```diff @@ -21,23 +21,21 @@ G_M44819_IG02: ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref, uxth w0, w0 dup v16.8h, w0 cmhs v16.8h, v0.8h, v16.8h - movi v17.8h, #0x80, LSL #8 - and v16.8h, v16.8h, v17.8h ldr q17, [@rwd00] - ushl v16.8h, v16.8h, v17.8h - addv h16, v16.8h + movi v18.8h, #0x21 + bsl v16.8h, v17.8h, v18.8h + uminv h16, v16.8h umov w0, v16.h[0] - rbit w0, w0 - clz w0, w0 - ;; size=44 bbWeight=1 PerfScore 12.00 + sub w0, w0, #1 + ;; size=36 bbWeight=1 PerfScore 11.00 G_M44819_IG03: ; bbWeight=1, epilog, nogc, extend ldp fp, lr, [sp], #0x10 ret lr ;; size=8 bbWeight=1 PerfScore 2.00 -RWD00 dq FFF4FFF3FFF2FFF1h, FFF8FFF7FFF6FFF5h +RWD00 dq 0004000300020001h, 0008000700060005h -; Total bytes of code 60, prolog size 8, PerfScore 15.50, instruction count 15, allocated bytes for code 60 (MethodHash=016950ec) for method TestExtractMostSignificantBits.Program:IndexOfFirstGreaterThanOrEqualUInt16(System.Runtime.Intrinsics.Vector128`1[ushort],ushort):int (FullOpts) +; Total bytes of code 52, prolog size 8, PerfScore 14.50, instruction count 13, allocated bytes for code 52 (MethodHash=016950ec) for method TestExtractMostSignificantBits.Program:IndexOfFirstGreaterThanOrEqualUInt16(System.Runtime.Intrinsics.Vector128`1[ushort],ushort):int (FullOpts) ; ============================================================ Unwind Info: @@ -48,7 +46,7 @@ Unwind Info: E bit : 0 X bit : 0 Vers : 0 - Function Length : 15 (0x0000f) Actual length = 60 (0x00003c) + Function Length : 13 (0x0000d) Actual length = 52 (0x000034) ---- Epilog scopes ---- ---- Scope 0 Epilog Start Offset : 3523193630 (0xd1ffab1e) Actual offset = 3523193630 (0xd1ffab1e) Offset from main function begin = 3523193630 (0xd1ffab1e) ``` </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)| |---|--:|--:|--:|--:|--:|--:| |ExtractMostSignificantBits_final.mch|24|<span style="color:green">24</span>|<span style="color:red">0</span>|<span style="color:blue">0</span>|<span style="color:green">-480</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| |---|--:|--:|--:|--:|--:|--:|--:| |ExtractMostSignificantBits_final.mch|24|<span style="color:green">24</span>|<span style="color:red">0</span>|<span style="color:blue">0</span>|<span style="color:green">-28.40%</span>|0.00%|<span style="color:green">-18.5844%</span>| --- #### Context information |Collection|Diffed contexts|MinOpts|FullOpts|Missed, base|Missed, diff| |---|--:|--:|--:|--:|--:| |ExtractMostSignificantBits_final.mch|39|0|39|0 (0.00%)|0 (0.00%)| --- #### jit-analyze output <details> <summary>ExtractMostSignificantBits_final.mch</summary> <div style="margin-left:1em"> ``` Summary of Code Size diffs: (Lower is better) Total bytes of base: 8492 (overridden on cmd) Total bytes of diff: 8012 (overridden on cmd) Total bytes of delta: -480 (-5.65 % of base) diff is an improvement. relative diff is an improvement. ``` <details> <summary>Detail diffs</summary> ``` Top file improvements (bytes): -44 : 17.dasm (-52.38 % of base) -32 : 22.dasm (-44.44 % of base) -32 : 7.dasm (-44.44 % of base) -32 : 32.dasm (-44.44 % of base) -32 : 27.dasm (-47.06 % of base) -32 : 12.dasm (-47.06 % of base) -28 : 16.dasm (-38.89 % of base) -28 : 15.dasm (-38.89 % of base) -20 : 18.dasm (-27.78 % of base) -16 : 30.dasm (-26.67 % of base) -16 : 6.dasm (-26.67 % of base) -16 : 5.dasm (-26.67 % of base) -16 : 10.dasm (-28.57 % of base) -16 : 26.dasm (-28.57 % of base) -16 : 25.dasm (-28.57 % of base) -16 : 21.dasm (-26.67 % of base) -16 : 11.dasm (-28.57 % of base) -16 : 31.dasm (-26.67 % of base) -16 : 20.dasm (-26.67 % of base) -8 : 33.dasm (-13.33 % of base) 24 total files with Code Size differences (24 improved, 0 regressed), 0 unchanged. Top method improvements (bytes): -44 (-52.38 % of base) : 17.dasm - TestExtractMostSignificantBits.Program:CountGreaterThanOrEqualByte(System.Runtime.Intrinsics.Vector128`1[byte],byte):int (FullOpts) -32 (-44.44 % of base) : 32.dasm - TestExtractMostSignificantBits.Program:CountGreaterThanOrEqualByte64(System.Runtime.Intrinsics.Vector64`1[byte],byte):int (FullOpts) -32 (-44.44 % of base) : 7.dasm - TestExtractMostSignificantBits.Program:CountGreaterThanOrEqualUInt16(System.Runtime.Intrinsics.Vector128`1[ushort],ushort):int (FullOpts) -32 (-44.44 % of base) : 22.dasm - TestExtractMostSignificantBits.Program:CountGreaterThanOrEqualUInt1664(System.Runtime.Intrinsics.Vector64`1[ushort],ushort):int (FullOpts) -32 (-47.06 % of base) : 12.dasm - TestExtractMostSignificantBits.Program:CountLessThanInt32(System.Runtime.Intrinsics.Vector128`1[int],int):int (FullOpts) -32 (-47.06 % of base) : 27.dasm - TestExtractMostSignificantBits.Program:CountLessThanInt3264(System.Runtime.Intrinsics.Vector64`1[int],int):int (FullOpts) -28 (-38.89 % of base) : 15.dasm - TestExtractMostSignificantBits.Program:AnyGreaterThanOrEqualByte(System.Runtime.Intrinsics.Vector128`1[byte],byte):bool (FullOpts) -28 (-38.89 % of base) : 16.dasm - TestExtractMostSignificantBits.Program:NoneGreaterThanOrEqualByte(System.Runtime.Intrinsics.Vector128`1[byte],byte):bool (FullOpts) -20 (-27.78 % of base) : 18.dasm - TestExtractMostSignificantBits.Program:IndexOfFirstGreaterThanOrEqualByte(System.Runtime.Intrinsics.Vector128`1[byte],byte):int (FullOpts) -16 (-26.67 % of base) : 30.dasm - TestExtractMostSignificantBits.Program:AnyGreaterThanOrEqualByte64(System.Runtime.Intrinsics.Vector64`1[byte],byte):bool (FullOpts) -16 (-28.57 % of base) : 10.dasm - TestExtractMostSignificantBits.Program:AnyLessThanInt32(System.Runtime.Intrinsics.Vector128`1[int],int):bool (FullOpts) -16 (-28.57 % of base) : 25.dasm - TestExtractMostSignificantBits.Program:AnyLessThanInt3264(System.Runtime.Intrinsics.Vector64`1[int],int):bool (FullOpts) -16 (-26.67 % of base) : 5.dasm - TestExtractMostSignificantBits.Program:AnyLessThanUInt16(System.Runtime.Intrinsics.Vector128`1[ushort],ushort):bool (FullOpts) -16 (-26.67 % of base) : 20.dasm - TestExtractMostSignificantBits.Program:AnyLessThanUInt1664(System.Runtime.Intrinsics.Vector64`1[ushort],ushort):bool (FullOpts) -16 (-26.67 % of base) : 31.dasm - TestExtractMostSignificantBits.Program:NoneGreaterThanOrEqualByte64(System.Runtime.Intrinsics.Vector64`1[byte],byte):bool (FullOpts) -16 (-28.57 % of base) : 11.dasm - TestExtractMostSignificantBits.Program:NoneLessThanInt32(System.Runtime.Intrinsics.Vector128`1[int],int):bool (FullOpts) -16 (-28.57 % of base) : 26.dasm - TestExtractMostSignificantBits.Program:NoneLessThanInt3264(System.Runtime.Intrinsics.Vector64`1[int],int):bool (FullOpts) -16 (-26.67 % of base) : 6.dasm - TestExtractMostSignificantBits.Program:NoneLessThanUInt16(System.Runtime.Intrinsics.Vector128`1[ushort],ushort):bool (FullOpts) -16 (-26.67 % of base) : 21.dasm - TestExtractMostSignificantBits.Program:NoneLessThanUInt1664(System.Runtime.Intrinsics.Vector64`1[ushort],ushort):bool (FullOpts) -8 (-13.33 % of base) : 33.dasm - TestExtractMostSignificantBits.Program:IndexOfFirstGreaterThanOrEqualByte64(System.Runtime.Intrinsics.Vector64`1[byte],byte):int (FullOpts) Top method improvements (percentages): -44 (-52.38 % of base) : 17.dasm - TestExtractMostSignificantBits.Program:CountGreaterThanOrEqualByte(System.Runtime.Intrinsics.Vector128`1[byte],byte):int (FullOpts) -32 (-47.06 % of base) : 12.dasm - TestExtractMostSignificantBits.Program:CountLessThanInt32(System.Runtime.Intrinsics.Vector128`1[int],int):int (FullOpts) -32 (-47.06 % of base) : 27.dasm - TestExtractMostSignificantBits.Program:CountLessThanInt3264(System.Runtime.Intrinsics.Vector64`1[int],int):int (FullOpts) -32 (-44.44 % of base) : 32.dasm - TestExtractMostSignificantBits.Program:CountGreaterThanOrEqualByte64(System.Runtime.Intrinsics.Vector64`1[byte],byte):int (FullOpts) -32 (-44.44 % of base) : 7.dasm - TestExtractMostSignificantBits.Program:CountGreaterThanOrEqualUInt16(System.Runtime.Intrinsics.Vector128`1[ushort],ushort):int (FullOpts) -32 (-44.44 % of base) : 22.dasm - TestExtractMostSignificantBits.Program:CountGreaterThanOrEqualUInt1664(System.Runtime.Intrinsics.Vector64`1[ushort],ushort):int (FullOpts) -28 (-38.89 % of base) : 15.dasm - TestExtractMostSignificantBits.Program:AnyGreaterThanOrEqualByte(System.Runtime.Intrinsics.Vector128`1[byte],byte):bool (FullOpts) -28 (-38.89 % of base) : 16.dasm - TestExtractMostSignificantBits.Program:NoneGreaterThanOrEqualByte(System.Runtime.Intrinsics.Vector128`1[byte],byte):bool (FullOpts) -16 (-28.57 % of base) : 10.dasm - TestExtractMostSignificantBits.Program:AnyLessThanInt32(System.Runtime.Intrinsics.Vector128`1[int],int):bool (FullOpts) -16 (-28.57 % of base) : 25.dasm - TestExtractMostSignificantBits.Program:AnyLessThanInt3264(System.Runtime.Intrinsics.Vector64`1[int],int):bool (FullOpts) -16 (-28.57 % of base) : 11.dasm - TestExtractMostSignificantBits.Program:NoneLessThanInt32(System.Runtime.Intrinsics.Vector128`1[int],int):bool (FullOpts) -16 (-28.57 % of base) : 26.dasm - TestExtractMostSignificantBits.Program:NoneLessThanInt3264(System.Runtime.Intrinsics.Vector64`1[int],int):bool (FullOpts) -20 (-27.78 % of base) : 18.dasm - TestExtractMostSignificantBits.Program:IndexOfFirstGreaterThanOrEqualByte(System.Runtime.Intrinsics.Vector128`1[byte],byte):int (FullOpts) -16 (-26.67 % of base) : 30.dasm - TestExtractMostSignificantBits.Program:AnyGreaterThanOrEqualByte64(System.Runtime.Intrinsics.Vector64`1[byte],byte):bool (FullOpts) -16 (-26.67 % of base) : 5.dasm - TestExtractMostSignificantBits.Program:AnyLessThanUInt16(System.Runtime.Intrinsics.Vector128`1[ushort],ushort):bool (FullOpts) -16 (-26.67 % of base) : 20.dasm - TestExtractMostSignificantBits.Program:AnyLessThanUInt1664(System.Runtime.Intrinsics.Vector64`1[ushort],ushort):bool (FullOpts) -16 (-26.67 % of base) : 31.dasm - TestExtractMostSignificantBits.Program:NoneGreaterThanOrEqualByte64(System.Runtime.Intrinsics.Vector64`1[byte],byte):bool (FullOpts) -16 (-26.67 % of base) : 6.dasm - TestExtractMostSignificantBits.Program:NoneLessThanUInt16(System.Runtime.Intrinsics.Vector128`1[ushort],ushort):bool (FullOpts) -16 (-26.67 % of base) : 21.dasm - TestExtractMostSignificantBits.Program:NoneLessThanUInt1664(System.Runtime.Intrinsics.Vector64`1[ushort],ushort):bool (FullOpts) -8 (-14.29 % of base) : 13.dasm - TestExtractMostSignificantBits.Program:IndexOfFirstLessThanInt32(System.Runtime.Intrinsics.Vector128`1[int],int):int (FullOpts) 24 total methods with Code Size differences (24 improved, 0 regressed). ``` </details> -------------------------------------------------------------------------------- </div></details> </div></details> ## Jit-analyze summary ``` Summary of Code Size diffs: (Lower is better) Total bytes of base: 8492 (overridden on cmd) Total bytes of diff: 8012 (overridden on cmd) Total bytes of delta: -480 (-5.65 % of base) diff is an improvement. relative diff is an improvement. ``` <details> <summary>Detail diffs</summary> ``` Top file improvements (bytes): -44 : 17.dasm (-52.38 % of base) -32 : 22.dasm (-44.44 % of base) -32 : 7.dasm (-44.44 % of base) -32 : 32.dasm (-44.44 % of base) -32 : 27.dasm (-47.06 % of base) -32 : 12.dasm (-47.06 % of base) -28 : 16.dasm (-38.89 % of base) -28 : 15.dasm (-38.89 % of base) -20 : 18.dasm (-27.78 % of base) -16 : 30.dasm (-26.67 % of base) -16 : 6.dasm (-26.67 % of base) -16 : 5.dasm (-26.67 % of base) -16 : 10.dasm (-28.57 % of base) -16 : 26.dasm (-28.57 % of base) -16 : 25.dasm (-28.57 % of base) -16 : 21.dasm (-26.67 % of base) -16 : 11.dasm (-28.57 % of base) -16 : 31.dasm (-26.67 % of base) -16 : 20.dasm (-26.67 % of base) -8 : 33.dasm (-13.33 % of base) 24 total files with Code Size differences (24 improved, 0 regressed), 0 unchanged. Top method improvements (bytes): -44 (-52.38 % of base) : 17.dasm - TestExtractMostSignificantBits.Program:CountGreaterThanOrEqualByte(System.Runtime.Intrinsics.Vector128`1[byte],byte):int (FullOpts) -32 (-44.44 % of base) : 32.dasm - TestExtractMostSignificantBits.Program:CountGreaterThanOrEqualByte64(System.Runtime.Intrinsics.Vector64`1[byte],byte):int (FullOpts) -32 (-44.44 % of base) : 7.dasm - TestExtractMostSignificantBits.Program:CountGreaterThanOrEqualUInt16(System.Runtime.Intrinsics.Vector128`1[ushort],ushort):int (FullOpts) -32 (-44.44 % of base) : 22.dasm - TestExtractMostSignificantBits.Program:CountGreaterThanOrEqualUInt1664(System.Runtime.Intrinsics.Vector64`1[ushort],ushort):int (FullOpts) -32 (-47.06 % of base) : 12.dasm - TestExtractMostSignificantBits.Program:CountLessThanInt32(System.Runtime.Intrinsics.Vector128`1[int],int):int (FullOpts) -32 (-47.06 % of base) : 27.dasm - TestExtractMostSignificantBits.Program:CountLessThanInt3264(System.Runtime.Intrinsics.Vector64`1[int],int):int (FullOpts) -28 (-38.89 % of base) : 15.dasm - TestExtractMostSignificantBits.Program:AnyGreaterThanOrEqualByte(System.Runtime.Intrinsics.Vector128`1[byte],byte):bool (FullOpts) -28 (-38.89 % of base) : 16.dasm - TestExtractMostSignificantBits.Program:NoneGreaterThanOrEqualByte(System.Runtime.Intrinsics.Vector128`1[byte],byte):bool (FullOpts) -20 (-27.78 % of base) : 18.dasm - TestExtractMostSignificantBits.Program:IndexOfFirstGreaterThanOrEqualByte(System.Runtime.Intrinsics.Vector128`1[byte],byte):int (FullOpts) -16 (-26.67 % of base) : 30.dasm - TestExtractMostSignificantBits.Program:AnyGreaterThanOrEqualByte64(System.Runtime.Intrinsics.Vector64`1[byte],byte):bool (FullOpts) -16 (-28.57 % of base) : 10.dasm - TestExtractMostSignificantBits.Program:AnyLessThanInt32(System.Runtime.Intrinsics.Vector128`1[int],int):bool (FullOpts) -16 (-28.57 % of base) : 25.dasm - TestExtractMostSignificantBits.Program:AnyLessThanInt3264(System.Runtime.Intrinsics.Vector64`1[int],int):bool (FullOpts) -16 (-26.67 % of base) : 5.dasm - TestExtractMostSignificantBits.Program:AnyLessThanUInt16(System.Runtime.Intrinsics.Vector128`1[ushort],ushort):bool (FullOpts) -16 (-26.67 % of base) : 20.dasm - TestExtractMostSignificantBits.Program:AnyLessThanUInt1664(System.Runtime.Intrinsics.Vector64`1[ushort],ushort):bool (FullOpts) -16 (-26.67 % of base) : 31.dasm - TestExtractMostSignificantBits.Program:NoneGreaterThanOrEqualByte64(System.Runtime.Intrinsics.Vector64`1[byte],byte):bool (FullOpts) -16 (-28.57 % of base) : 11.dasm - TestExtractMostSignificantBits.Program:NoneLessThanInt32(System.Runtime.Intrinsics.Vector128`1[int],int):bool (FullOpts) -16 (-28.57 % of base) : 26.dasm - TestExtractMostSignificantBits.Program:NoneLessThanInt3264(System.Runtime.Intrinsics.Vector64`1[int],int):bool (FullOpts) -16 (-26.67 % of base) : 6.dasm - TestExtractMostSignificantBits.Program:NoneLessThanUInt16(System.Runtime.Intrinsics.Vector128`1[ushort],ushort):bool (FullOpts) -16 (-26.67 % of base) : 21.dasm - TestExtractMostSignificantBits.Program:NoneLessThanUInt1664(System.Runtime.Intrinsics.Vector64`1[ushort],ushort):bool (FullOpts) -8 (-13.33 % of base) : 33.dasm - TestExtractMostSignificantBits.Program:IndexOfFirstGreaterThanOrEqualByte64(System.Runtime.Intrinsics.Vector64`1[byte],byte):int (FullOpts) Top method improvements (percentages): -44 (-52.38 % of base) : 17.dasm - TestExtractMostSignificantBits.Program:CountGreaterThanOrEqualByte(System.Runtime.Intrinsics.Vector128`1[byte],byte):int (FullOpts) -32 (-47.06 % of base) : 12.dasm - TestExtractMostSignificantBits.Program:CountLessThanInt32(System.Runtime.Intrinsics.Vector128`1[int],int):int (FullOpts) -32 (-47.06 % of base) : 27.dasm - TestExtractMostSignificantBits.Program:CountLessThanInt3264(System.Runtime.Intrinsics.Vector64`1[int],int):int (FullOpts) -32 (-44.44 % of base) : 32.dasm - TestExtractMostSignificantBits.Program:CountGreaterThanOrEqualByte64(System.Runtime.Intrinsics.Vector64`1[byte],byte):int (FullOpts) -32 (-44.44 % of base) : 7.dasm - TestExtractMostSignificantBits.Program:CountGreaterThanOrEqualUInt16(System.Runtime.Intrinsics.Vector128`1[ushort],ushort):int (FullOpts) -32 (-44.44 % of base) : 22.dasm - TestExtractMostSignificantBits.Program:CountGreaterThanOrEqualUInt1664(System.Runtime.Intrinsics.Vector64`1[ushort],ushort):int (FullOpts) -28 (-38.89 % of base) : 15.dasm - TestExtractMostSignificantBits.Program:AnyGreaterThanOrEqualByte(System.Runtime.Intrinsics.Vector128`1[byte],byte):bool (FullOpts) -28 (-38.89 % of base) : 16.dasm - TestExtractMostSignificantBits.Program:NoneGreaterThanOrEqualByte(System.Runtime.Intrinsics.Vector128`1[byte],byte):bool (FullOpts) -16 (-28.57 % of base) : 10.dasm - TestExtractMostSignificantBits.Program:AnyLessThanInt32(System.Runtime.Intrinsics.Vector128`1[int],int):bool (FullOpts) -16 (-28.57 % of base) : 25.dasm - TestExtractMostSignificantBits.Program:AnyLessThanInt3264(System.Runtime.Intrinsics.Vector64`1[int],int):bool (FullOpts) -16 (-28.57 % of base) : 11.dasm - TestExtractMostSignificantBits.Program:NoneLessThanInt32(System.Runtime.Intrinsics.Vector128`1[int],int):bool (FullOpts) -16 (-28.57 % of base) : 26.dasm - TestExtractMostSignificantBits.Program:NoneLessThanInt3264(System.Runtime.Intrinsics.Vector64`1[int],int):bool (FullOpts) -20 (-27.78 % of base) : 18.dasm - TestExtractMostSignificantBits.Program:IndexOfFirstGreaterThanOrEqualByte(System.Runtime.Intrinsics.Vector128`1[byte],byte):int (FullOpts) -16 (-26.67 % of base) : 30.dasm - TestExtractMostSignificantBits.Program:AnyGreaterThanOrEqualByte64(System.Runtime.Intrinsics.Vector64`1[byte],byte):bool (FullOpts) -16 (-26.67 % of base) : 5.dasm - TestExtractMostSignificantBits.Program:AnyLessThanUInt16(System.Runtime.Intrinsics.Vector128`1[ushort],ushort):bool (FullOpts) -16 (-26.67 % of base) : 20.dasm - TestExtractMostSignificantBits.Program:AnyLessThanUInt1664(System.Runtime.Intrinsics.Vector64`1[ushort],ushort):bool (FullOpts) -16 (-26.67 % of base) : 31.dasm - TestExtractMostSignificantBits.Program:NoneGreaterThanOrEqualByte64(System.Runtime.Intrinsics.Vector64`1[byte],byte):bool (FullOpts) -16 (-26.67 % of base) : 6.dasm - TestExtractMostSignificantBits.Program:NoneLessThanUInt16(System.Runtime.Intrinsics.Vector128`1[ushort],ushort):bool (FullOpts) -16 (-26.67 % of base) : 21.dasm - TestExtractMostSignificantBits.Program:NoneLessThanUInt1664(System.Runtime.Intrinsics.Vector64`1[ushort],ushort):bool (FullOpts) -8 (-14.29 % of base) : 13.dasm - TestExtractMostSignificantBits.Program:IndexOfFirstLessThanInt32(System.Runtime.Intrinsics.Vector128`1[int],int):int (FullOpts) 24 total methods with Code Size differences (24 improved, 0 regressed). ``` </details> -------------------------------------------------------------------------------- ## Generated artifacts - SuperPMI log: `artifacts/spmi/superpmi.27.log` - Short summary: `artifacts/spmi/diff_short_summary.11.md` - Full summary: `artifacts/spmi/diff_summary.11.md` - Jit-analyze summary: `artifacts/spmi/asm.ExtractMostSignificantBits_final/summary.md` - Base asm: `artifacts/spmi/asm.ExtractMostSignificantBits_final/base/` - Diff asm: `artifacts/spmi/asm.ExtractMostSignificantBits_final/diff/` --------- Co-authored-by: Egor Bogatov <egorbo@gmail.com>
eduardo-vp
pushed a commit
that referenced
this pull request
Sep 15, 2026
…stem (dotnet#131877) Replaces the hardcoded struct-size table in the CoreCLR wasm P/Invoke generator with crossgen2's real field-layout engine. ## The problem `ManagedToNativeGenerator` computed wasm ABI signature strings from `System.Reflection.MetadataLoadContext`, which has no field-layout engine. Struct sizes came from a 7-entry hardcoded table, and anything outside it was a hard build error: ``` error WASM0067: SignatureMapper: unknown multi-field struct 'X' (fields: N) - add its size to s_knownStructSizes in SignatureMapper.cs ``` Size matters because the CoreCLR interpreter lays struct arguments out inline across 8-byte slots — `TokenToSlotCount` returns `max((size + 7) / 8, 1)` for an `S<N>` token. A wrong `N` misaligns the interpreter frame. Mono's generator needs none of this: its alphabet has no `S`, and it encodes every struct as a pointer. ## The change crossgen2 gains `--generate-portable-callhelpers <dir>`, which writes the three C++ call-helper files directly. It sets up its type system as for a real wasm compilation, scans the input assemblies and emits — no JIT, no R2R image. The option requires `--targetarch wasm` with `--targetos browser|wasi`. The CoreCLR half of the MSBuild task is deleted rather than adapted: `ManagedToNativeGenerator`, `PInvokeCollector`, `PInvokeTableGenerator`, `SignatureMapper`, `InternalCallSignatureCollector`, `InterpToNativeGenerator`. `_CoreCLRGenerateManagedToNative` keeps its name and position in the target graph; its final step changes from `<UsingTask>` to `<Exec>`. The regeneration scripts move next to their output under `src/coreclr/vm/wasm/` and drive `generate-coreclr-helpers.proj`. Mono's generator is untouched. **−2269 lines under `src/tasks`, +1541 under `ILCompiler.ReadyToRun/PortableCallHelpers`.** A move, not an addition: the second implementation of wasm ABI lowering is gone, and the one that remains is the one the JIT interface itself calls. Sizes are computed, not enumerated. The only change to `WasmLowering` is widening `WasmValueTypeToSigChar` from `private` to `internal`. ### Naming Portable entry points exist for any platform that cannot generate code at run time; wasm is the only one today. Per [review feedback](dotnet#131877) nothing in this functionality is named after wasm. Symbols shared by the runtime and the generated tables were renamed on both sides at once: | before | after | |---|---| | `StringToWasmSigThunk` | `StringToPortableSigThunk` | | `g_wasmThunks[Count]` | `g_portableCallHelperThunks[Count]` | | `wasm_ret_S<n>` | `portable_callhelper_ret_S<n>` | What keeps wasm in its name is what is genuinely about wasm: the ABI in `WasmLowering`, the `--targetos browser|wasi` requirement, and the wasm-specific corerun the runtime tests link. ### Finding crossgen2 Three paths, tried in order: - **Override** — `$(PortableCallHelpersGeneratorPath)`, which must name a crossgen2 executable. - **In repo** — `$(Crossgen2InBuildDir)`; crossgen2 is built unconditionally by the `clr` subset. - **Out of repo** — the `wasm-tools` workload declares the existing `Microsoft.NETCore.App.Crossgen2.<host-rid>` pack, whose `Sdk/Sdk.props` defines `$(Crossgen2ToolPath)`. ~12.5 MB. The SDK resolves this pack only when `PublishReadyToRun` is set, which wasm CoreCLR apps never set — hence the workload. dotnet/sdk#56119 proposes acquiring it directly instead, which would let the workload entry go. If none of the three resolve, the targets error rather than passing an empty path down. The pack is named for the machine that *runs* crossgen2, not the target: generation never loads the JIT, so a host-targeting crossgen2 answers wasm ABI questions correctly. The workload-testing legs do not set `$(BuildHostTools)`, so nothing produced a crossgen2 pack for their local package feed. (The perf browser-wasm leg does produce one, but only because it opts in — dotnet#133143.) `Microsoft.NETCore.App.Crossgen2.Host.sfxproj` pins the RID to the build host, and is now built by the CoreCLR browser-wasm leg behind `$(BuildCrossgen2HostPackForWorkloadTesting)`, guarded on `$(BuildHostTools)` being unset so the two paths can never emit the same package id twice. The official build is untouched — it already publishes this pack from the host platform legs. ## Behaviour changes **`WASM0066` is removed.** The old task warned for every `DllImport` whose module did not resolve to a linked-in native library — a CoreCLR-only divergence that fires on ordinary cross-platform code never executed on wasm (dotnet#131874 reports ten from SkiaSharp alone on a shipped Preview 7 SDK). In-tree it had already accumulated two `NoWarn` suppressions and a `WarnOnUnresolvedPInvokeModules=false`; all three go, along with the `--no-warn-unresolved-directpinvoke` opt-out that existed only to silence it. An unresolved module is not knowably wrong at build time: `callhelpers_pinvoke_override` returns `nullptr` on a miss, so a call that actually happens throws `DllNotFoundException` naming the module, as on every other platform. Dropping a warning is strictly loosening. **`WASM0065` is added, as a message.** Per module, when it declares P/Invokes without `[assembly: DisableRuntimeMarshalling]`, since the generated helpers assume signatures cross unmarshalled. A message rather than a warning: it reports something the app author often cannot fix, and as a warning it would fail `-warnaserror` builds. Four fire across the 181 framework assemblies. **Exported callbacks with an ambiguous name are rejected.** An export wrapper resolves its `MethodDesc` through `LookupUnmanagedCallersOnlyMethodByName`, which takes the first `[UnmanagedCallersOnly]` method of matching name and compares no signature — so two exported overloads resolve to the same method and one wrapper calls it with the wrong arguments. Everything the generator controls carries the arity, so the existing duplicate-key and duplicate-symbol checks both pass. Generation now fails instead, naming both signatures. Only exports: a non-exported callback is found by the arity-aware key and never reaches the name lookup. ## Known limitations - **wasi has no out-of-repo acquisition path.** `wasi-experimental` extends `microsoft-net-runtime-mono-tooling`, not `wasm-tools`, so it picks up no crossgen2 pack; the targets error explicitly there. Browser is the shipping wasm/CoreCLR target. - **Reverse thunks allocate one `int64_t` slot per managed parameter**, while a by-value struct argument occupies `ceil(size/8)` interpreter slots. No `[UnmanagedCallersOnly]` callback in CoreLib or the libraries takes a by-value struct, so nothing exercises this. The old generator rejected such callbacks with `WASM0067`; this one accepts them, so user code would get a bad thunk rather than a diagnostic. - **`'V'` (v128) has no case in the C++ emission helpers.** Pre-existing; fails loudly. - **Multi-slot types (`Int128`, `Vector256`, …) are rejected at the thunk emitter** rather than at the interop boundary, so the diagnostic differs from the old `WASM0068`. Still a clean `crossgen2 : error :` with exit 1. No such P/Invoke exists today. - Does not re-enable the tests disabled in dotnet#131811 (dotnet#133187), and does not address gaps #3–#7 there. ## Verification - **Regeneration reproduces the committed helpers byte for byte**, apart from the rename above, with zero `WASM0001`/`WASM0060`/`WASM0061`/`WASM0062` warnings across a full CoreLib+libraries scan. (The checked-in P/Invoke table is already slightly stale against `main` independently of this PR; that drift is left alone.) - `WasmArgumentLayoutTests` goes from 17 to 22 test methods. The two covering the rejection above were checked against a disabled check, so they test it rather than agree with it. - `clr+libs` builds clean for `browser` and `wasi`; `WasmAppBuilder` still builds for both `net11.0` and `net472`. - Both flavors build end to end from the in-tree samples, with per-architecture native payloads, a non-PE file and duplicate-culture satellites injected into the bundle. - The renamed runtime contract was checked by building: `libcoreclr_static.a` exports `g_portableCallHelperThunks` and no `g_wasmThunks`, and the browser sample links its generated tables against it. Contributes to dotnet#131811, closing blocking gap #1 and the struct half of gap #2: a 3-int and a 5-double struct in `[UnmanagedFunctionPointer]` signatures now resolve to `vS12` / `S12i` / `vS40i`, where all three previously threw `NotSupportedException`. > [!NOTE] > This pull request description was drafted with the help of GitHub Copilot. --------- Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Co-authored-by: Jan Kotas <jkotas@microsoft.com> Copilot-Session: f6d6e5a4-5b25-4198-b42d-d5b2dc781f47
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.