Have mono handle the vector as APIs that grow or shrink the vector type - #104445

Closed
tannergooding wants to merge 12 commits into
dotnet:mainfrom
tannergooding:mono-vectoras-3
Closed

Have mono handle the vector as APIs that grow or shrink the vector type#104445
tannergooding wants to merge 12 commits into
dotnet:mainfrom
tannergooding:mono-vectoras-3

Conversation

@tannergooding

Copy link
Copy Markdown
Member

No description provided.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @lambdageek
See info in area-owners.md if you want to be subscribed.

@tannergooding
tannergoodingforce-pushed the mono-vectoras-3 branch 4 times, most recently from 72c830d to 7b3f132CompareJuly 4, 2024 18:25
@kg

kg commented Jul 7, 2024

Copy link
Copy Markdown
Contributor

I don't know a lot about the minijit side of things, but I can try to look into the interp stuff next week.

@tannergooding
tannergoodingforce-pushed the mono-vectoras-3 branch 3 times, most recently from e29efbc to 8ef0ee9CompareJuly 8, 2024 22:01
Comment threadsrc/mono/mono/mini/interp/interp-simd.c
Comment threadsrc/mono/mono/mini/interp/transform-simd.c
@kg

kg commented Jul 9, 2024

Copy link
Copy Markdown
Contributor

I'll try to reproduce the wasm interp failures locally and see if I can figure them out. The minijit one is way beyond my knowledge, but if you're stuck and no one else can help, you can tag me in for that too.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

I'll try to reproduce the wasm interp failures locally and see if I can figure them out. The minijit one is way beyond my knowledge, but if you're stuck and no one else can help, you can tag me in for that too.

Thanks much!

For the minijit one I'm pretty sure I understand the basic problem but I'd like to at least get the larger interp failures addressed first 😅

@kg

kg commented Jul 10, 2024

Copy link
Copy Markdown
Contributor

I haven't been able to run this locally because wasm builds are still broken for me by the libz stuff, which also seems to have broken codespaces. I'll see if I can get a successful build on my windows device and troubleshoot there.

@kg

kg commented Jul 12, 2024

Copy link
Copy Markdown
Contributor

This one:

[01:25:45] warn: [MONO] Encountered infinite recursion while looking up resource 'InvalidProgram_Default' in System.Private.CoreLib. Verify the installation of .NET is complete and does not need repairing, and that the state of the process has not become corrupted.

Appears to be an InvalidProgramException in transform.c's handling of CEE_RET, which looks like this:

if (td->sp>td->stack) {
mono_error_set_generic_error (error, "System", "InvalidProgramException", "stack overflow in CEE_RET");
goto exit;
}

This suggests that something in this PR is unbalancing the interpreter stack.

EDIT: Specifically in Ascii.HasMatch

@kg

kg commented Jul 12, 2024

Copy link
Copy Markdown
Contributor

It looks like somehow the ceq operation after the callvirt is being eaten, which leaves garbage on the stack and causes the interp to reject the code as malformed. Compare the source IL and the trace afterward:

 Method System.Text.Ascii:HasMatch<System.Runtime.Intrinsics.Vector128`1<byte>> (System.Runtime.Intrinsics.Vector128`1<byte>), optimized 0, original code:
IL_0000: ldarg.0 IL_0001: ldc.i4 128
IL_0006: constrained.0x1b000024
IL_000c: call 0x0a000e3a
IL_0011: constrained.0x1b000024
IL_0017: call 0x0a000099
IL_001c: stloc.0 IL_001d: ldloca.s 0
IL_001f: constrained.0x1b000024
IL_0025: call 0x0a000e3b
IL_002a: constrained.0x1b000024
IL_0030: callvirt 0x0a0006d9
IL_0035: ldc.i4.0 IL_0036: ceq IL_0038: ret IL_0000 ldarg.0 , sp 0, IL_0001 ldc.i4 , sp 1, VT Vector128`1 IL_0006 prefix1 , sp 2, I4 IL_000c call , sp 2, I4 IL_0011 prefix1 , sp 2, VT Vector128`1 IL_0017 call , sp 2, VT Vector128`1 IL_001c stloc.0 , sp 1, VT Vector128`1 IL_001d ldloca.s , sp 0, IL_001f prefix1 , sp 1, MP IL_0025 call , sp 1, MP IL_002a prefix1 , sp 2, VT Vector128`1 IL_0030 callvirt , sp 2, VT Vector128`1 Vector128<T>.Equals produced intrinsic 16
IL_0035 ldc.i4.0 , sp 2, I4 IL_0038 ret , sp 2, I4 Ascii.HasMatch: stack overflow in CEE_RET (td->sp 0x55fc188f3f88 > td->stack 0x55fc188f3f70)
Process terminated.

EDIT: It looks like maybe this is an optimization baked into the decoder for LDC_I4_0:
image

@kg

kg commented Jul 12, 2024

Copy link
Copy Markdown
Contributor

OK, the missing ceq is a red herring, disabling the optimization responsible for that doesn't fix it.

EDIT: I think emit_common_simd_epilogue is missing support for csignature->hasthis.

@kg

kg commented Jul 12, 2024

Copy link
Copy Markdown
Contributor

Changing emit_common_simd_epilogue like so fixes the crash:

emit_common_simd_epilogue (TransformData *td, MonoClass *vector_klass, MonoMethodSignature *csignature, int vector_size, gboolean allow_void)
{
+	if (csignature->hasthis)+ td->sp--;
td->sp -= csignature->param_count;

I'm not sure that's quite right though.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

Thanks so much for the help here! I believe the new commit should correctly handle instance methods more generally speaking now.

I'll still want to fix the jiterpreter to handle these new cases as well and ensure the MonoJIT/AOT path is passing, but I think I should be unblocked now!

@tannergooding

Copy link
Copy Markdown
MemberAuthor

Now that the same size bitcasts are well handled and showing the expected perf improvements, I plan on cleaning this up next week, but I expect it won't land for .NET 9 before the Preview 7 snap

@tannergooding

Copy link
Copy Markdown
MemberAuthor

Going to close this one. There's some other changes that are needed for mono-wasm before it can be done there (namely support for WithElement), so I'll try to get those up independently first.

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 22, 2024
@tannergooding
tannergooding deleted the mono-vectoras-3 branch July 1, 2025 14:41
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@tannergooding@kg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Have mono handle the vector as APIs that grow or shrink the vector type - #104445

Closed
tannergooding wants to merge 12 commits into
dotnet:mainfrom
tannergooding:mono-vectoras-3
Closed

Have mono handle the vector as APIs that grow or shrink the vector type#104445
tannergooding wants to merge 12 commits into
dotnet:mainfrom
tannergooding:mono-vectoras-3

Conversation

@tannergooding

Copy link
Copy Markdown
Member

No description provided.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @lambdageek
See info in area-owners.md if you want to be subscribed.

@tannergooding
tannergoodingforce-pushed the mono-vectoras-3 branch 4 times, most recently from 72c830d to 7b3f132CompareJuly 4, 2024 18:25
@kg

kg commented Jul 7, 2024

Copy link
Copy Markdown
Contributor

I don't know a lot about the minijit side of things, but I can try to look into the interp stuff next week.

@tannergooding
tannergoodingforce-pushed the mono-vectoras-3 branch 3 times, most recently from e29efbc to 8ef0ee9CompareJuly 8, 2024 22:01
Comment threadsrc/mono/mono/mini/interp/interp-simd.c
Comment threadsrc/mono/mono/mini/interp/transform-simd.c
@kg

kg commented Jul 9, 2024

Copy link
Copy Markdown
Contributor

I'll try to reproduce the wasm interp failures locally and see if I can figure them out. The minijit one is way beyond my knowledge, but if you're stuck and no one else can help, you can tag me in for that too.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

I'll try to reproduce the wasm interp failures locally and see if I can figure them out. The minijit one is way beyond my knowledge, but if you're stuck and no one else can help, you can tag me in for that too.

Thanks much!

For the minijit one I'm pretty sure I understand the basic problem but I'd like to at least get the larger interp failures addressed first 😅

@kg

kg commented Jul 10, 2024

Copy link
Copy Markdown
Contributor

I haven't been able to run this locally because wasm builds are still broken for me by the libz stuff, which also seems to have broken codespaces. I'll see if I can get a successful build on my windows device and troubleshoot there.

@kg

kg commented Jul 12, 2024

Copy link
Copy Markdown
Contributor

This one:

[01:25:45] warn: [MONO] Encountered infinite recursion while looking up resource 'InvalidProgram_Default' in System.Private.CoreLib. Verify the installation of .NET is complete and does not need repairing, and that the state of the process has not become corrupted.

Appears to be an InvalidProgramException in transform.c's handling of CEE_RET, which looks like this:

if (td->sp>td->stack) {
mono_error_set_generic_error (error, "System", "InvalidProgramException", "stack overflow in CEE_RET");
goto exit;
}

This suggests that something in this PR is unbalancing the interpreter stack.

EDIT: Specifically in Ascii.HasMatch

@kg

kg commented Jul 12, 2024

Copy link
Copy Markdown
Contributor

It looks like somehow the ceq operation after the callvirt is being eaten, which leaves garbage on the stack and causes the interp to reject the code as malformed. Compare the source IL and the trace afterward:

 Method System.Text.Ascii:HasMatch<System.Runtime.Intrinsics.Vector128`1<byte>> (System.Runtime.Intrinsics.Vector128`1<byte>), optimized 0, original code:
IL_0000: ldarg.0 IL_0001: ldc.i4 128
IL_0006: constrained.0x1b000024
IL_000c: call 0x0a000e3a
IL_0011: constrained.0x1b000024
IL_0017: call 0x0a000099
IL_001c: stloc.0 IL_001d: ldloca.s 0
IL_001f: constrained.0x1b000024
IL_0025: call 0x0a000e3b
IL_002a: constrained.0x1b000024
IL_0030: callvirt 0x0a0006d9
IL_0035: ldc.i4.0 IL_0036: ceq IL_0038: ret IL_0000 ldarg.0 , sp 0, IL_0001 ldc.i4 , sp 1, VT Vector128`1 IL_0006 prefix1 , sp 2, I4 IL_000c call , sp 2, I4 IL_0011 prefix1 , sp 2, VT Vector128`1 IL_0017 call , sp 2, VT Vector128`1 IL_001c stloc.0 , sp 1, VT Vector128`1 IL_001d ldloca.s , sp 0, IL_001f prefix1 , sp 1, MP IL_0025 call , sp 1, MP IL_002a prefix1 , sp 2, VT Vector128`1 IL_0030 callvirt , sp 2, VT Vector128`1 Vector128<T>.Equals produced intrinsic 16
IL_0035 ldc.i4.0 , sp 2, I4 IL_0038 ret , sp 2, I4 Ascii.HasMatch: stack overflow in CEE_RET (td->sp 0x55fc188f3f88 > td->stack 0x55fc188f3f70)
Process terminated.

EDIT: It looks like maybe this is an optimization baked into the decoder for LDC_I4_0:
image

@kg

kg commented Jul 12, 2024

Copy link
Copy Markdown
Contributor

OK, the missing ceq is a red herring, disabling the optimization responsible for that doesn't fix it.

EDIT: I think emit_common_simd_epilogue is missing support for csignature->hasthis.

@kg

kg commented Jul 12, 2024

Copy link
Copy Markdown
Contributor

Changing emit_common_simd_epilogue like so fixes the crash:

emit_common_simd_epilogue (TransformData *td, MonoClass *vector_klass, MonoMethodSignature *csignature, int vector_size, gboolean allow_void)
{
+	if (csignature->hasthis)+ td->sp--;
td->sp -= csignature->param_count;

I'm not sure that's quite right though.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

Thanks so much for the help here! I believe the new commit should correctly handle instance methods more generally speaking now.

I'll still want to fix the jiterpreter to handle these new cases as well and ensure the MonoJIT/AOT path is passing, but I think I should be unblocked now!

@tannergooding

Copy link
Copy Markdown
MemberAuthor

Now that the same size bitcasts are well handled and showing the expected perf improvements, I plan on cleaning this up next week, but I expect it won't land for .NET 9 before the Preview 7 snap

@tannergooding

Copy link
Copy Markdown
MemberAuthor

Going to close this one. There's some other changes that are needed for mono-wasm before it can be done there (namely support for WithElement), so I'll try to get those up independently first.

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 22, 2024
@tannergooding
tannergooding deleted the mono-vectoras-3 branch July 1, 2025 14:41
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@tannergooding@kg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Have mono handle the vector as APIs that grow or shrink the vector type - #104445

Closed
tannergooding wants to merge 12 commits into
dotnet:mainfrom
tannergooding:mono-vectoras-3
Closed

Have mono handle the vector as APIs that grow or shrink the vector type#104445
tannergooding wants to merge 12 commits into
dotnet:mainfrom
tannergooding:mono-vectoras-3

Conversation

@tannergooding

Copy link
Copy Markdown
Member

No description provided.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @lambdageek
See info in area-owners.md if you want to be subscribed.

@tannergooding
tannergoodingforce-pushed the mono-vectoras-3 branch 4 times, most recently from 72c830d to 7b3f132CompareJuly 4, 2024 18:25
@kg

kg commented Jul 7, 2024

Copy link
Copy Markdown
Contributor

I don't know a lot about the minijit side of things, but I can try to look into the interp stuff next week.

@tannergooding
tannergoodingforce-pushed the mono-vectoras-3 branch 3 times, most recently from e29efbc to 8ef0ee9CompareJuly 8, 2024 22:01
Comment threadsrc/mono/mono/mini/interp/interp-simd.c
Comment threadsrc/mono/mono/mini/interp/transform-simd.c
@kg

kg commented Jul 9, 2024

Copy link
Copy Markdown
Contributor

I'll try to reproduce the wasm interp failures locally and see if I can figure them out. The minijit one is way beyond my knowledge, but if you're stuck and no one else can help, you can tag me in for that too.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

I'll try to reproduce the wasm interp failures locally and see if I can figure them out. The minijit one is way beyond my knowledge, but if you're stuck and no one else can help, you can tag me in for that too.

Thanks much!

For the minijit one I'm pretty sure I understand the basic problem but I'd like to at least get the larger interp failures addressed first 😅

@kg

kg commented Jul 10, 2024

Copy link
Copy Markdown
Contributor

I haven't been able to run this locally because wasm builds are still broken for me by the libz stuff, which also seems to have broken codespaces. I'll see if I can get a successful build on my windows device and troubleshoot there.

@kg

kg commented Jul 12, 2024

Copy link
Copy Markdown
Contributor

This one:

[01:25:45] warn: [MONO] Encountered infinite recursion while looking up resource 'InvalidProgram_Default' in System.Private.CoreLib. Verify the installation of .NET is complete and does not need repairing, and that the state of the process has not become corrupted.

Appears to be an InvalidProgramException in transform.c's handling of CEE_RET, which looks like this:

if (td->sp>td->stack) {
mono_error_set_generic_error (error, "System", "InvalidProgramException", "stack overflow in CEE_RET");
goto exit;
}

This suggests that something in this PR is unbalancing the interpreter stack.

EDIT: Specifically in Ascii.HasMatch

@kg

kg commented Jul 12, 2024

Copy link
Copy Markdown
Contributor

It looks like somehow the ceq operation after the callvirt is being eaten, which leaves garbage on the stack and causes the interp to reject the code as malformed. Compare the source IL and the trace afterward:

 Method System.Text.Ascii:HasMatch<System.Runtime.Intrinsics.Vector128`1<byte>> (System.Runtime.Intrinsics.Vector128`1<byte>), optimized 0, original code:
IL_0000: ldarg.0 IL_0001: ldc.i4 128
IL_0006: constrained.0x1b000024
IL_000c: call 0x0a000e3a
IL_0011: constrained.0x1b000024
IL_0017: call 0x0a000099
IL_001c: stloc.0 IL_001d: ldloca.s 0
IL_001f: constrained.0x1b000024
IL_0025: call 0x0a000e3b
IL_002a: constrained.0x1b000024
IL_0030: callvirt 0x0a0006d9
IL_0035: ldc.i4.0 IL_0036: ceq IL_0038: ret IL_0000 ldarg.0 , sp 0, IL_0001 ldc.i4 , sp 1, VT Vector128`1 IL_0006 prefix1 , sp 2, I4 IL_000c call , sp 2, I4 IL_0011 prefix1 , sp 2, VT Vector128`1 IL_0017 call , sp 2, VT Vector128`1 IL_001c stloc.0 , sp 1, VT Vector128`1 IL_001d ldloca.s , sp 0, IL_001f prefix1 , sp 1, MP IL_0025 call , sp 1, MP IL_002a prefix1 , sp 2, VT Vector128`1 IL_0030 callvirt , sp 2, VT Vector128`1 Vector128<T>.Equals produced intrinsic 16
IL_0035 ldc.i4.0 , sp 2, I4 IL_0038 ret , sp 2, I4 Ascii.HasMatch: stack overflow in CEE_RET (td->sp 0x55fc188f3f88 > td->stack 0x55fc188f3f70)
Process terminated.

EDIT: It looks like maybe this is an optimization baked into the decoder for LDC_I4_0:
image

@kg

kg commented Jul 12, 2024

Copy link
Copy Markdown
Contributor

OK, the missing ceq is a red herring, disabling the optimization responsible for that doesn't fix it.

EDIT: I think emit_common_simd_epilogue is missing support for csignature->hasthis.

@kg

kg commented Jul 12, 2024

Copy link
Copy Markdown
Contributor

Changing emit_common_simd_epilogue like so fixes the crash:

emit_common_simd_epilogue (TransformData *td, MonoClass *vector_klass, MonoMethodSignature *csignature, int vector_size, gboolean allow_void)
{
+	if (csignature->hasthis)+ td->sp--;
td->sp -= csignature->param_count;

I'm not sure that's quite right though.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

Thanks so much for the help here! I believe the new commit should correctly handle instance methods more generally speaking now.

I'll still want to fix the jiterpreter to handle these new cases as well and ensure the MonoJIT/AOT path is passing, but I think I should be unblocked now!

@tannergooding

Copy link
Copy Markdown
MemberAuthor

Now that the same size bitcasts are well handled and showing the expected perf improvements, I plan on cleaning this up next week, but I expect it won't land for .NET 9 before the Preview 7 snap

@tannergooding

Copy link
Copy Markdown
MemberAuthor

Going to close this one. There's some other changes that are needed for mono-wasm before it can be done there (namely support for WithElement), so I'll try to get those up independently first.

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 22, 2024
@tannergooding
tannergooding deleted the mono-vectoras-3 branch July 1, 2025 14:41
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@tannergooding@kg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Have mono handle the vector as APIs that grow or shrink the vector type - #104445

Closed
tannergooding wants to merge 12 commits into
dotnet:mainfrom
tannergooding:mono-vectoras-3
Closed

Have mono handle the vector as APIs that grow or shrink the vector type#104445
tannergooding wants to merge 12 commits into
dotnet:mainfrom
tannergooding:mono-vectoras-3

Conversation

@tannergooding

Copy link
Copy Markdown
Member

No description provided.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @lambdageek
See info in area-owners.md if you want to be subscribed.

@tannergooding
tannergoodingforce-pushed the mono-vectoras-3 branch 4 times, most recently from 72c830d to 7b3f132CompareJuly 4, 2024 18:25
@kg

kg commented Jul 7, 2024

Copy link
Copy Markdown
Contributor

I don't know a lot about the minijit side of things, but I can try to look into the interp stuff next week.

@tannergooding
tannergoodingforce-pushed the mono-vectoras-3 branch 3 times, most recently from e29efbc to 8ef0ee9CompareJuly 8, 2024 22:01
Comment threadsrc/mono/mono/mini/interp/interp-simd.c
Comment threadsrc/mono/mono/mini/interp/transform-simd.c
@kg

kg commented Jul 9, 2024

Copy link
Copy Markdown
Contributor

I'll try to reproduce the wasm interp failures locally and see if I can figure them out. The minijit one is way beyond my knowledge, but if you're stuck and no one else can help, you can tag me in for that too.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

I'll try to reproduce the wasm interp failures locally and see if I can figure them out. The minijit one is way beyond my knowledge, but if you're stuck and no one else can help, you can tag me in for that too.

Thanks much!

For the minijit one I'm pretty sure I understand the basic problem but I'd like to at least get the larger interp failures addressed first 😅

@kg

kg commented Jul 10, 2024

Copy link
Copy Markdown
Contributor

I haven't been able to run this locally because wasm builds are still broken for me by the libz stuff, which also seems to have broken codespaces. I'll see if I can get a successful build on my windows device and troubleshoot there.

@kg

kg commented Jul 12, 2024

Copy link
Copy Markdown
Contributor

This one:

[01:25:45] warn: [MONO] Encountered infinite recursion while looking up resource 'InvalidProgram_Default' in System.Private.CoreLib. Verify the installation of .NET is complete and does not need repairing, and that the state of the process has not become corrupted.

Appears to be an InvalidProgramException in transform.c's handling of CEE_RET, which looks like this:

if (td->sp>td->stack) {
mono_error_set_generic_error (error, "System", "InvalidProgramException", "stack overflow in CEE_RET");
goto exit;
}

This suggests that something in this PR is unbalancing the interpreter stack.

EDIT: Specifically in Ascii.HasMatch

@kg

kg commented Jul 12, 2024

Copy link
Copy Markdown
Contributor

It looks like somehow the ceq operation after the callvirt is being eaten, which leaves garbage on the stack and causes the interp to reject the code as malformed. Compare the source IL and the trace afterward:

 Method System.Text.Ascii:HasMatch<System.Runtime.Intrinsics.Vector128`1<byte>> (System.Runtime.Intrinsics.Vector128`1<byte>), optimized 0, original code:
IL_0000: ldarg.0 IL_0001: ldc.i4 128
IL_0006: constrained.0x1b000024
IL_000c: call 0x0a000e3a
IL_0011: constrained.0x1b000024
IL_0017: call 0x0a000099
IL_001c: stloc.0 IL_001d: ldloca.s 0
IL_001f: constrained.0x1b000024
IL_0025: call 0x0a000e3b
IL_002a: constrained.0x1b000024
IL_0030: callvirt 0x0a0006d9
IL_0035: ldc.i4.0 IL_0036: ceq IL_0038: ret IL_0000 ldarg.0 , sp 0, IL_0001 ldc.i4 , sp 1, VT Vector128`1 IL_0006 prefix1 , sp 2, I4 IL_000c call , sp 2, I4 IL_0011 prefix1 , sp 2, VT Vector128`1 IL_0017 call , sp 2, VT Vector128`1 IL_001c stloc.0 , sp 1, VT Vector128`1 IL_001d ldloca.s , sp 0, IL_001f prefix1 , sp 1, MP IL_0025 call , sp 1, MP IL_002a prefix1 , sp 2, VT Vector128`1 IL_0030 callvirt , sp 2, VT Vector128`1 Vector128<T>.Equals produced intrinsic 16
IL_0035 ldc.i4.0 , sp 2, I4 IL_0038 ret , sp 2, I4 Ascii.HasMatch: stack overflow in CEE_RET (td->sp 0x55fc188f3f88 > td->stack 0x55fc188f3f70)
Process terminated.

EDIT: It looks like maybe this is an optimization baked into the decoder for LDC_I4_0:
image

@kg

kg commented Jul 12, 2024

Copy link
Copy Markdown
Contributor

OK, the missing ceq is a red herring, disabling the optimization responsible for that doesn't fix it.

EDIT: I think emit_common_simd_epilogue is missing support for csignature->hasthis.

@kg

kg commented Jul 12, 2024

Copy link
Copy Markdown
Contributor

Changing emit_common_simd_epilogue like so fixes the crash:

emit_common_simd_epilogue (TransformData *td, MonoClass *vector_klass, MonoMethodSignature *csignature, int vector_size, gboolean allow_void)
{
+	if (csignature->hasthis)+ td->sp--;
td->sp -= csignature->param_count;

I'm not sure that's quite right though.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

Thanks so much for the help here! I believe the new commit should correctly handle instance methods more generally speaking now.

I'll still want to fix the jiterpreter to handle these new cases as well and ensure the MonoJIT/AOT path is passing, but I think I should be unblocked now!

@tannergooding

Copy link
Copy Markdown
MemberAuthor

Now that the same size bitcasts are well handled and showing the expected perf improvements, I plan on cleaning this up next week, but I expect it won't land for .NET 9 before the Preview 7 snap

@tannergooding

Copy link
Copy Markdown
MemberAuthor

Going to close this one. There's some other changes that are needed for mono-wasm before it can be done there (namely support for WithElement), so I'll try to get those up independently first.

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 22, 2024
@tannergooding
tannergooding deleted the mono-vectoras-3 branch July 1, 2025 14:41
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@tannergooding@kg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Have mono handle the vector as APIs that grow or shrink the vector type - #104445

Closed
tannergooding wants to merge 12 commits into
dotnet:mainfrom
tannergooding:mono-vectoras-3
Closed

Have mono handle the vector as APIs that grow or shrink the vector type#104445
tannergooding wants to merge 12 commits into
dotnet:mainfrom
tannergooding:mono-vectoras-3

Conversation

@tannergooding

Copy link
Copy Markdown
Member

No description provided.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @lambdageek
See info in area-owners.md if you want to be subscribed.

@tannergooding
tannergoodingforce-pushed the mono-vectoras-3 branch 4 times, most recently from 72c830d to 7b3f132CompareJuly 4, 2024 18:25
@kg

kg commented Jul 7, 2024

Copy link
Copy Markdown
Contributor

I don't know a lot about the minijit side of things, but I can try to look into the interp stuff next week.

@tannergooding
tannergoodingforce-pushed the mono-vectoras-3 branch 3 times, most recently from e29efbc to 8ef0ee9CompareJuly 8, 2024 22:01
Comment threadsrc/mono/mono/mini/interp/interp-simd.c
Comment threadsrc/mono/mono/mini/interp/transform-simd.c
@kg

kg commented Jul 9, 2024

Copy link
Copy Markdown
Contributor

I'll try to reproduce the wasm interp failures locally and see if I can figure them out. The minijit one is way beyond my knowledge, but if you're stuck and no one else can help, you can tag me in for that too.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

I'll try to reproduce the wasm interp failures locally and see if I can figure them out. The minijit one is way beyond my knowledge, but if you're stuck and no one else can help, you can tag me in for that too.

Thanks much!

For the minijit one I'm pretty sure I understand the basic problem but I'd like to at least get the larger interp failures addressed first 😅

@kg

kg commented Jul 10, 2024

Copy link
Copy Markdown
Contributor

I haven't been able to run this locally because wasm builds are still broken for me by the libz stuff, which also seems to have broken codespaces. I'll see if I can get a successful build on my windows device and troubleshoot there.

@kg

kg commented Jul 12, 2024

Copy link
Copy Markdown
Contributor

This one:

[01:25:45] warn: [MONO] Encountered infinite recursion while looking up resource 'InvalidProgram_Default' in System.Private.CoreLib. Verify the installation of .NET is complete and does not need repairing, and that the state of the process has not become corrupted.

Appears to be an InvalidProgramException in transform.c's handling of CEE_RET, which looks like this:

if (td->sp>td->stack) {
mono_error_set_generic_error (error, "System", "InvalidProgramException", "stack overflow in CEE_RET");
goto exit;
}

This suggests that something in this PR is unbalancing the interpreter stack.

EDIT: Specifically in Ascii.HasMatch

@kg

kg commented Jul 12, 2024

Copy link
Copy Markdown
Contributor

It looks like somehow the ceq operation after the callvirt is being eaten, which leaves garbage on the stack and causes the interp to reject the code as malformed. Compare the source IL and the trace afterward:

 Method System.Text.Ascii:HasMatch<System.Runtime.Intrinsics.Vector128`1<byte>> (System.Runtime.Intrinsics.Vector128`1<byte>), optimized 0, original code:
IL_0000: ldarg.0 IL_0001: ldc.i4 128
IL_0006: constrained.0x1b000024
IL_000c: call 0x0a000e3a
IL_0011: constrained.0x1b000024
IL_0017: call 0x0a000099
IL_001c: stloc.0 IL_001d: ldloca.s 0
IL_001f: constrained.0x1b000024
IL_0025: call 0x0a000e3b
IL_002a: constrained.0x1b000024
IL_0030: callvirt 0x0a0006d9
IL_0035: ldc.i4.0 IL_0036: ceq IL_0038: ret IL_0000 ldarg.0 , sp 0, IL_0001 ldc.i4 , sp 1, VT Vector128`1 IL_0006 prefix1 , sp 2, I4 IL_000c call , sp 2, I4 IL_0011 prefix1 , sp 2, VT Vector128`1 IL_0017 call , sp 2, VT Vector128`1 IL_001c stloc.0 , sp 1, VT Vector128`1 IL_001d ldloca.s , sp 0, IL_001f prefix1 , sp 1, MP IL_0025 call , sp 1, MP IL_002a prefix1 , sp 2, VT Vector128`1 IL_0030 callvirt , sp 2, VT Vector128`1 Vector128<T>.Equals produced intrinsic 16
IL_0035 ldc.i4.0 , sp 2, I4 IL_0038 ret , sp 2, I4 Ascii.HasMatch: stack overflow in CEE_RET (td->sp 0x55fc188f3f88 > td->stack 0x55fc188f3f70)
Process terminated.

EDIT: It looks like maybe this is an optimization baked into the decoder for LDC_I4_0:
image

@kg

kg commented Jul 12, 2024

Copy link
Copy Markdown
Contributor

OK, the missing ceq is a red herring, disabling the optimization responsible for that doesn't fix it.

EDIT: I think emit_common_simd_epilogue is missing support for csignature->hasthis.

@kg

kg commented Jul 12, 2024

Copy link
Copy Markdown
Contributor

Changing emit_common_simd_epilogue like so fixes the crash:

emit_common_simd_epilogue (TransformData *td, MonoClass *vector_klass, MonoMethodSignature *csignature, int vector_size, gboolean allow_void)
{
+	if (csignature->hasthis)+ td->sp--;
td->sp -= csignature->param_count;

I'm not sure that's quite right though.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

Thanks so much for the help here! I believe the new commit should correctly handle instance methods more generally speaking now.

I'll still want to fix the jiterpreter to handle these new cases as well and ensure the MonoJIT/AOT path is passing, but I think I should be unblocked now!

@tannergooding

Copy link
Copy Markdown
MemberAuthor

Now that the same size bitcasts are well handled and showing the expected perf improvements, I plan on cleaning this up next week, but I expect it won't land for .NET 9 before the Preview 7 snap

@tannergooding

Copy link
Copy Markdown
MemberAuthor

Going to close this one. There's some other changes that are needed for mono-wasm before it can be done there (namely support for WithElement), so I'll try to get those up independently first.

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 22, 2024
@tannergooding
tannergooding deleted the mono-vectoras-3 branch July 1, 2025 14:41
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@tannergooding@kg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Have mono handle the vector as APIs that grow or shrink the vector type - #104445

Closed
tannergooding wants to merge 12 commits into
dotnet:mainfrom
tannergooding:mono-vectoras-3
Closed

Have mono handle the vector as APIs that grow or shrink the vector type#104445
tannergooding wants to merge 12 commits into
dotnet:mainfrom
tannergooding:mono-vectoras-3

Conversation

@tannergooding

Copy link
Copy Markdown
Member

No description provided.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @lambdageek
See info in area-owners.md if you want to be subscribed.

@tannergooding
tannergoodingforce-pushed the mono-vectoras-3 branch 4 times, most recently from 72c830d to 7b3f132CompareJuly 4, 2024 18:25
@kg

kg commented Jul 7, 2024

Copy link
Copy Markdown
Contributor

I don't know a lot about the minijit side of things, but I can try to look into the interp stuff next week.

@tannergooding
tannergoodingforce-pushed the mono-vectoras-3 branch 3 times, most recently from e29efbc to 8ef0ee9CompareJuly 8, 2024 22:01
Comment threadsrc/mono/mono/mini/interp/interp-simd.c
Comment threadsrc/mono/mono/mini/interp/transform-simd.c
@kg

kg commented Jul 9, 2024

Copy link
Copy Markdown
Contributor

I'll try to reproduce the wasm interp failures locally and see if I can figure them out. The minijit one is way beyond my knowledge, but if you're stuck and no one else can help, you can tag me in for that too.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

I'll try to reproduce the wasm interp failures locally and see if I can figure them out. The minijit one is way beyond my knowledge, but if you're stuck and no one else can help, you can tag me in for that too.

Thanks much!

For the minijit one I'm pretty sure I understand the basic problem but I'd like to at least get the larger interp failures addressed first 😅

@kg

kg commented Jul 10, 2024

Copy link
Copy Markdown
Contributor

I haven't been able to run this locally because wasm builds are still broken for me by the libz stuff, which also seems to have broken codespaces. I'll see if I can get a successful build on my windows device and troubleshoot there.

@kg

kg commented Jul 12, 2024

Copy link
Copy Markdown
Contributor

This one:

[01:25:45] warn: [MONO] Encountered infinite recursion while looking up resource 'InvalidProgram_Default' in System.Private.CoreLib. Verify the installation of .NET is complete and does not need repairing, and that the state of the process has not become corrupted.

Appears to be an InvalidProgramException in transform.c's handling of CEE_RET, which looks like this:

if (td->sp>td->stack) {
mono_error_set_generic_error (error, "System", "InvalidProgramException", "stack overflow in CEE_RET");
goto exit;
}

This suggests that something in this PR is unbalancing the interpreter stack.

EDIT: Specifically in Ascii.HasMatch

@kg

kg commented Jul 12, 2024

Copy link
Copy Markdown
Contributor

It looks like somehow the ceq operation after the callvirt is being eaten, which leaves garbage on the stack and causes the interp to reject the code as malformed. Compare the source IL and the trace afterward:

 Method System.Text.Ascii:HasMatch<System.Runtime.Intrinsics.Vector128`1<byte>> (System.Runtime.Intrinsics.Vector128`1<byte>), optimized 0, original code:
IL_0000: ldarg.0 IL_0001: ldc.i4 128
IL_0006: constrained.0x1b000024
IL_000c: call 0x0a000e3a
IL_0011: constrained.0x1b000024
IL_0017: call 0x0a000099
IL_001c: stloc.0 IL_001d: ldloca.s 0
IL_001f: constrained.0x1b000024
IL_0025: call 0x0a000e3b
IL_002a: constrained.0x1b000024
IL_0030: callvirt 0x0a0006d9
IL_0035: ldc.i4.0 IL_0036: ceq IL_0038: ret IL_0000 ldarg.0 , sp 0, IL_0001 ldc.i4 , sp 1, VT Vector128`1 IL_0006 prefix1 , sp 2, I4 IL_000c call , sp 2, I4 IL_0011 prefix1 , sp 2, VT Vector128`1 IL_0017 call , sp 2, VT Vector128`1 IL_001c stloc.0 , sp 1, VT Vector128`1 IL_001d ldloca.s , sp 0, IL_001f prefix1 , sp 1, MP IL_0025 call , sp 1, MP IL_002a prefix1 , sp 2, VT Vector128`1 IL_0030 callvirt , sp 2, VT Vector128`1 Vector128<T>.Equals produced intrinsic 16
IL_0035 ldc.i4.0 , sp 2, I4 IL_0038 ret , sp 2, I4 Ascii.HasMatch: stack overflow in CEE_RET (td->sp 0x55fc188f3f88 > td->stack 0x55fc188f3f70)
Process terminated.

EDIT: It looks like maybe this is an optimization baked into the decoder for LDC_I4_0:
image

@kg

kg commented Jul 12, 2024

Copy link
Copy Markdown
Contributor

OK, the missing ceq is a red herring, disabling the optimization responsible for that doesn't fix it.

EDIT: I think emit_common_simd_epilogue is missing support for csignature->hasthis.

@kg

kg commented Jul 12, 2024

Copy link
Copy Markdown
Contributor

Changing emit_common_simd_epilogue like so fixes the crash:

emit_common_simd_epilogue (TransformData *td, MonoClass *vector_klass, MonoMethodSignature *csignature, int vector_size, gboolean allow_void)
{
+	if (csignature->hasthis)+ td->sp--;
td->sp -= csignature->param_count;

I'm not sure that's quite right though.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

Thanks so much for the help here! I believe the new commit should correctly handle instance methods more generally speaking now.

I'll still want to fix the jiterpreter to handle these new cases as well and ensure the MonoJIT/AOT path is passing, but I think I should be unblocked now!

@tannergooding

Copy link
Copy Markdown
MemberAuthor

Now that the same size bitcasts are well handled and showing the expected perf improvements, I plan on cleaning this up next week, but I expect it won't land for .NET 9 before the Preview 7 snap

@tannergooding

Copy link
Copy Markdown
MemberAuthor

Going to close this one. There's some other changes that are needed for mono-wasm before it can be done there (namely support for WithElement), so I'll try to get those up independently first.

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 22, 2024
@tannergooding
tannergooding deleted the mono-vectoras-3 branch July 1, 2025 14:41
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@tannergooding@kg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Have mono handle the vector as APIs that grow or shrink the vector type - #104445

Closed
tannergooding wants to merge 12 commits into
dotnet:mainfrom
tannergooding:mono-vectoras-3
Closed

Have mono handle the vector as APIs that grow or shrink the vector type#104445
tannergooding wants to merge 12 commits into
dotnet:mainfrom
tannergooding:mono-vectoras-3

Conversation

@tannergooding

Copy link
Copy Markdown
Member

No description provided.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @lambdageek
See info in area-owners.md if you want to be subscribed.

@tannergooding
tannergoodingforce-pushed the mono-vectoras-3 branch 4 times, most recently from 72c830d to 7b3f132CompareJuly 4, 2024 18:25
@kg

kg commented Jul 7, 2024

Copy link
Copy Markdown
Contributor

I don't know a lot about the minijit side of things, but I can try to look into the interp stuff next week.

@tannergooding
tannergoodingforce-pushed the mono-vectoras-3 branch 3 times, most recently from e29efbc to 8ef0ee9CompareJuly 8, 2024 22:01
Comment threadsrc/mono/mono/mini/interp/interp-simd.c
Comment threadsrc/mono/mono/mini/interp/transform-simd.c
@kg

kg commented Jul 9, 2024

Copy link
Copy Markdown
Contributor

I'll try to reproduce the wasm interp failures locally and see if I can figure them out. The minijit one is way beyond my knowledge, but if you're stuck and no one else can help, you can tag me in for that too.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

I'll try to reproduce the wasm interp failures locally and see if I can figure them out. The minijit one is way beyond my knowledge, but if you're stuck and no one else can help, you can tag me in for that too.

Thanks much!

For the minijit one I'm pretty sure I understand the basic problem but I'd like to at least get the larger interp failures addressed first 😅

@kg

kg commented Jul 10, 2024

Copy link
Copy Markdown
Contributor

I haven't been able to run this locally because wasm builds are still broken for me by the libz stuff, which also seems to have broken codespaces. I'll see if I can get a successful build on my windows device and troubleshoot there.

@kg

kg commented Jul 12, 2024

Copy link
Copy Markdown
Contributor

This one:

[01:25:45] warn: [MONO] Encountered infinite recursion while looking up resource 'InvalidProgram_Default' in System.Private.CoreLib. Verify the installation of .NET is complete and does not need repairing, and that the state of the process has not become corrupted.

Appears to be an InvalidProgramException in transform.c's handling of CEE_RET, which looks like this:

if (td->sp>td->stack) {
mono_error_set_generic_error (error, "System", "InvalidProgramException", "stack overflow in CEE_RET");
goto exit;
}

This suggests that something in this PR is unbalancing the interpreter stack.

EDIT: Specifically in Ascii.HasMatch

@kg

kg commented Jul 12, 2024

Copy link
Copy Markdown
Contributor

It looks like somehow the ceq operation after the callvirt is being eaten, which leaves garbage on the stack and causes the interp to reject the code as malformed. Compare the source IL and the trace afterward:

 Method System.Text.Ascii:HasMatch<System.Runtime.Intrinsics.Vector128`1<byte>> (System.Runtime.Intrinsics.Vector128`1<byte>), optimized 0, original code:
IL_0000: ldarg.0 IL_0001: ldc.i4 128
IL_0006: constrained.0x1b000024
IL_000c: call 0x0a000e3a
IL_0011: constrained.0x1b000024
IL_0017: call 0x0a000099
IL_001c: stloc.0 IL_001d: ldloca.s 0
IL_001f: constrained.0x1b000024
IL_0025: call 0x0a000e3b
IL_002a: constrained.0x1b000024
IL_0030: callvirt 0x0a0006d9
IL_0035: ldc.i4.0 IL_0036: ceq IL_0038: ret IL_0000 ldarg.0 , sp 0, IL_0001 ldc.i4 , sp 1, VT Vector128`1 IL_0006 prefix1 , sp 2, I4 IL_000c call , sp 2, I4 IL_0011 prefix1 , sp 2, VT Vector128`1 IL_0017 call , sp 2, VT Vector128`1 IL_001c stloc.0 , sp 1, VT Vector128`1 IL_001d ldloca.s , sp 0, IL_001f prefix1 , sp 1, MP IL_0025 call , sp 1, MP IL_002a prefix1 , sp 2, VT Vector128`1 IL_0030 callvirt , sp 2, VT Vector128`1 Vector128<T>.Equals produced intrinsic 16
IL_0035 ldc.i4.0 , sp 2, I4 IL_0038 ret , sp 2, I4 Ascii.HasMatch: stack overflow in CEE_RET (td->sp 0x55fc188f3f88 > td->stack 0x55fc188f3f70)
Process terminated.

EDIT: It looks like maybe this is an optimization baked into the decoder for LDC_I4_0:
image

@kg

kg commented Jul 12, 2024

Copy link
Copy Markdown
Contributor

OK, the missing ceq is a red herring, disabling the optimization responsible for that doesn't fix it.

EDIT: I think emit_common_simd_epilogue is missing support for csignature->hasthis.

@kg

kg commented Jul 12, 2024

Copy link
Copy Markdown
Contributor

Changing emit_common_simd_epilogue like so fixes the crash:

emit_common_simd_epilogue (TransformData *td, MonoClass *vector_klass, MonoMethodSignature *csignature, int vector_size, gboolean allow_void)
{
+	if (csignature->hasthis)+ td->sp--;
td->sp -= csignature->param_count;

I'm not sure that's quite right though.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

Thanks so much for the help here! I believe the new commit should correctly handle instance methods more generally speaking now.

I'll still want to fix the jiterpreter to handle these new cases as well and ensure the MonoJIT/AOT path is passing, but I think I should be unblocked now!

@tannergooding

Copy link
Copy Markdown
MemberAuthor

Now that the same size bitcasts are well handled and showing the expected perf improvements, I plan on cleaning this up next week, but I expect it won't land for .NET 9 before the Preview 7 snap

@tannergooding

Copy link
Copy Markdown
MemberAuthor

Going to close this one. There's some other changes that are needed for mono-wasm before it can be done there (namely support for WithElement), so I'll try to get those up independently first.

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 22, 2024
@tannergooding
tannergooding deleted the mono-vectoras-3 branch July 1, 2025 14:41
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@tannergooding@kg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Have mono handle the vector as APIs that grow or shrink the vector type - #104445

Closed
tannergooding wants to merge 12 commits into
dotnet:mainfrom
tannergooding:mono-vectoras-3
Closed

Have mono handle the vector as APIs that grow or shrink the vector type#104445
tannergooding wants to merge 12 commits into
dotnet:mainfrom
tannergooding:mono-vectoras-3

Conversation

@tannergooding

Copy link
Copy Markdown
Member

No description provided.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @lambdageek
See info in area-owners.md if you want to be subscribed.

@tannergooding
tannergoodingforce-pushed the mono-vectoras-3 branch 4 times, most recently from 72c830d to 7b3f132CompareJuly 4, 2024 18:25
@kg

kg commented Jul 7, 2024

Copy link
Copy Markdown
Contributor

I don't know a lot about the minijit side of things, but I can try to look into the interp stuff next week.

@tannergooding
tannergoodingforce-pushed the mono-vectoras-3 branch 3 times, most recently from e29efbc to 8ef0ee9CompareJuly 8, 2024 22:01
Comment threadsrc/mono/mono/mini/interp/interp-simd.c
Comment threadsrc/mono/mono/mini/interp/transform-simd.c
@kg

kg commented Jul 9, 2024

Copy link
Copy Markdown
Contributor

I'll try to reproduce the wasm interp failures locally and see if I can figure them out. The minijit one is way beyond my knowledge, but if you're stuck and no one else can help, you can tag me in for that too.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

I'll try to reproduce the wasm interp failures locally and see if I can figure them out. The minijit one is way beyond my knowledge, but if you're stuck and no one else can help, you can tag me in for that too.

Thanks much!

For the minijit one I'm pretty sure I understand the basic problem but I'd like to at least get the larger interp failures addressed first 😅

@kg

kg commented Jul 10, 2024

Copy link
Copy Markdown
Contributor

I haven't been able to run this locally because wasm builds are still broken for me by the libz stuff, which also seems to have broken codespaces. I'll see if I can get a successful build on my windows device and troubleshoot there.

@kg

kg commented Jul 12, 2024

Copy link
Copy Markdown
Contributor

This one:

[01:25:45] warn: [MONO] Encountered infinite recursion while looking up resource 'InvalidProgram_Default' in System.Private.CoreLib. Verify the installation of .NET is complete and does not need repairing, and that the state of the process has not become corrupted.

Appears to be an InvalidProgramException in transform.c's handling of CEE_RET, which looks like this:

if (td->sp>td->stack) {
mono_error_set_generic_error (error, "System", "InvalidProgramException", "stack overflow in CEE_RET");
goto exit;
}

This suggests that something in this PR is unbalancing the interpreter stack.

EDIT: Specifically in Ascii.HasMatch

@kg

kg commented Jul 12, 2024

Copy link
Copy Markdown
Contributor

It looks like somehow the ceq operation after the callvirt is being eaten, which leaves garbage on the stack and causes the interp to reject the code as malformed. Compare the source IL and the trace afterward:

 Method System.Text.Ascii:HasMatch<System.Runtime.Intrinsics.Vector128`1<byte>> (System.Runtime.Intrinsics.Vector128`1<byte>), optimized 0, original code:
IL_0000: ldarg.0 IL_0001: ldc.i4 128
IL_0006: constrained.0x1b000024
IL_000c: call 0x0a000e3a
IL_0011: constrained.0x1b000024
IL_0017: call 0x0a000099
IL_001c: stloc.0 IL_001d: ldloca.s 0
IL_001f: constrained.0x1b000024
IL_0025: call 0x0a000e3b
IL_002a: constrained.0x1b000024
IL_0030: callvirt 0x0a0006d9
IL_0035: ldc.i4.0 IL_0036: ceq IL_0038: ret IL_0000 ldarg.0 , sp 0, IL_0001 ldc.i4 , sp 1, VT Vector128`1 IL_0006 prefix1 , sp 2, I4 IL_000c call , sp 2, I4 IL_0011 prefix1 , sp 2, VT Vector128`1 IL_0017 call , sp 2, VT Vector128`1 IL_001c stloc.0 , sp 1, VT Vector128`1 IL_001d ldloca.s , sp 0, IL_001f prefix1 , sp 1, MP IL_0025 call , sp 1, MP IL_002a prefix1 , sp 2, VT Vector128`1 IL_0030 callvirt , sp 2, VT Vector128`1 Vector128<T>.Equals produced intrinsic 16
IL_0035 ldc.i4.0 , sp 2, I4 IL_0038 ret , sp 2, I4 Ascii.HasMatch: stack overflow in CEE_RET (td->sp 0x55fc188f3f88 > td->stack 0x55fc188f3f70)
Process terminated.

EDIT: It looks like maybe this is an optimization baked into the decoder for LDC_I4_0:
image

@kg

kg commented Jul 12, 2024

Copy link
Copy Markdown
Contributor

OK, the missing ceq is a red herring, disabling the optimization responsible for that doesn't fix it.

EDIT: I think emit_common_simd_epilogue is missing support for csignature->hasthis.

@kg

kg commented Jul 12, 2024

Copy link
Copy Markdown
Contributor

Changing emit_common_simd_epilogue like so fixes the crash:

emit_common_simd_epilogue (TransformData *td, MonoClass *vector_klass, MonoMethodSignature *csignature, int vector_size, gboolean allow_void)
{
+	if (csignature->hasthis)+ td->sp--;
td->sp -= csignature->param_count;

I'm not sure that's quite right though.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

Thanks so much for the help here! I believe the new commit should correctly handle instance methods more generally speaking now.

I'll still want to fix the jiterpreter to handle these new cases as well and ensure the MonoJIT/AOT path is passing, but I think I should be unblocked now!

@tannergooding

Copy link
Copy Markdown
MemberAuthor

Now that the same size bitcasts are well handled and showing the expected perf improvements, I plan on cleaning this up next week, but I expect it won't land for .NET 9 before the Preview 7 snap

@tannergooding

Copy link
Copy Markdown
MemberAuthor

Going to close this one. There's some other changes that are needed for mono-wasm before it can be done there (namely support for WithElement), so I'll try to get those up independently first.

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 22, 2024
@tannergooding
tannergooding deleted the mono-vectoras-3 branch July 1, 2025 14:41
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@tannergooding@kg