Wasm funclet RA - #126445

Merged
AndyAyersMS merged 28 commits into
dotnet:mainfrom
AndyAyersMS:WasmFuncletRA
Apr 8, 2026
Merged

Wasm funclet RA#126445
AndyAyersMS merged 28 commits into
dotnet:mainfrom
AndyAyersMS:WasmFuncletRA

Conversation

@AndyAyersMS

Copy link
Copy Markdown
Member

Implement register allocation for funclets, along with some funclet codegen.

CopilotAI review requested due to automatic review settings April 2, 2026 02:03
@github-actionsgithub-actionsBot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Apr 2, 2026
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

FYI @dotnet/jit-contrib

Still a work in progress, but figured I'd ask for some feedback before getting too much further. Things I know of that are still to do:

  • We may need to handle case where an allocatable local is not live across a funclet boundary and ends up in different registers in different regions. Currently for STORE_LCL_VAR we always take the reg from the lcl var.
  • ABI classifier type support for funclet params?
  • Check if typeless catch won't actually get an ex obj from runtime (I suppose we can pass nullptr if necessary)
  • Codegen is still off -- there is a bogus block before funclet start, and no return
  • This won't validate (I'm pretty sure) until the jit host extracts the funclets into separate functions.

@SingleAccretion this may be more complex than what you had envisioned.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends the WASM JIT backend to support funclets by introducing per-funclet (region) register allocation state, per-funclet locals declarations, and basic funclet prolog codegen so EH regions can be code-generated with their own Wasm-local layouts.

Changes:

  • Add per-funclet RA state (SP/FP/EX + reference tracking) and resolve/register publish logic per region.
  • Teach codegen/emitter to use per-funclet SP/FP and emit per-funclet local declarations / funclet prologs.
  • Update internal-register tracking to be per-funclet on targets without a fixed register set (WASM).

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 10 comments.

Show a summary per file
FileDescription
src/coreclr/jit/regallocwasm.hIntroduces per-region RA state (SP/FP/EX + ref tracking) and new catch-arg collection hook.
src/coreclr/jit/regallocwasm.cppImplements per-funclet allocation, catch-arg rewriting, per-funclet internal-reg tables, and per-funclet locals decl generation/publishing.
src/coreclr/jit/lclvars.cppAdjusts frame-location dumping to use region-0 SP/FP on non-fixed-reg targets.
src/coreclr/jit/emitwasm.cppExtends wasm arg-count computation to support funclet signatures.
src/coreclr/jit/codegenwasm.cppUses per-funclet SP/FP accessors and implements funclet prolog local signature emission.
src/coreclr/jit/codegeninterface.hMakes SP/FP storage and internal-reg tracking per-funclet for non-fixed-reg targets; makes locals decls per-funclet.
src/coreclr/jit/codegencommon.cppImplements non-fixed-reg per-funclet NodeInternalRegisters tables and initializes per-funclet SP/FP/locals storage.

Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/emitwasm.cpp
Comment threadsrc/coreclr/jit/codegencommon.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.h Outdated
Comment threadsrc/coreclr/jit/codegeninterface.h Outdated

@SingleAccretionSingleAccretion left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks a lot like what I was thinking about too.

Left some high-level feedback.

Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/codegeninterface.h Outdated
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

@SingleAccretion90066eb should cover most of your feedback except internal regs.

@am11am11 added the arch-wasm WebAssembly architecture label Apr 2, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to 'arch-wasm': @lewing, @pavelsavara
See info in area-owners.md if you want to be subscribed.

@SingleAccretionSingleAccretion left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mostly small comments left from me. But we also need to be a bit more careful with lvRegNum mutations.

Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp
CopilotAI review requested due to automatic review settings April 2, 2026 20:53

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated 5 comments.

Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.h Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

Hopefully closer now...

@SingleAccretion in the future maybe just point out one instance of a recurring pattern? Otherwise stuff may get overlooked.

@AndyAyersMS

AndyAyersMS commented Apr 2, 2026

Copy link
Copy Markdown
MemberAuthor

There's still an issue where a node can be collected twice, eg if it both needs a register and also has internal registers, and double processing a collected node is not good.

We could have the collector mark nodes perhaps, use this to avoid a double collection, and unmark them when we process them later.

Also RequestInternalRegister can be called multiple times for the same node.

CopilotAI review requested due to automatic review settings April 2, 2026 23:15
CopilotAI review requested due to automatic review settings April 4, 2026 16:11
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

Ok, one more batch of updates:

  • rely on allocator's m_currentFunclet to track what assignments the lcl var dscs hold. If we think they're already correct, verify that they are, in debug.
  • remove need for LIR flag by remembering the last collected node
  • add node on why we don't need a debug live range update like LSRA has

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 11 out of 11 changed files in this pull request and generated 5 comments.

Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.h Outdated
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated

@SingleAccretionSingleAccretion left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looking pretty good, just a few comments!

There is also #126445 (comment) which looks valid but is pre-existing and can be addressed separately.

Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
@AndyAyersMS
AndyAyersMS marked this pull request as ready for review April 5, 2026 01:45
CopilotAI review requested due to automatic review settings April 5, 2026 01:45
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

@dotnet/jit-contrib PTAL

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 11 out of 11 changed files in this pull request and generated 2 comments.

Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/regallocwasm.cpp
@kg

kg commented Apr 8, 2026

Copy link
Copy Markdown
Contributor

LGTM but I don't understand all of it.

kg
kg approved these changes Apr 8, 2026
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

/ba-g infrastructure issues

@AndyAyersMS
AndyAyersMS merged commit 5781c28 into dotnet:mainApr 8, 2026
131 of 137 checks passed
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 9, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@AndyAyersMS@kg@SingleAccretion@am11
, '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

Wasm funclet RA - #126445

Merged
AndyAyersMS merged 28 commits into
dotnet:mainfrom
AndyAyersMS:WasmFuncletRA
Apr 8, 2026
Merged

Wasm funclet RA#126445
AndyAyersMS merged 28 commits into
dotnet:mainfrom
AndyAyersMS:WasmFuncletRA

Conversation

@AndyAyersMS

Copy link
Copy Markdown
Member

Implement register allocation for funclets, along with some funclet codegen.

CopilotAI review requested due to automatic review settings April 2, 2026 02:03
@github-actionsgithub-actionsBot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Apr 2, 2026
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

FYI @dotnet/jit-contrib

Still a work in progress, but figured I'd ask for some feedback before getting too much further. Things I know of that are still to do:

  • We may need to handle case where an allocatable local is not live across a funclet boundary and ends up in different registers in different regions. Currently for STORE_LCL_VAR we always take the reg from the lcl var.
  • ABI classifier type support for funclet params?
  • Check if typeless catch won't actually get an ex obj from runtime (I suppose we can pass nullptr if necessary)
  • Codegen is still off -- there is a bogus block before funclet start, and no return
  • This won't validate (I'm pretty sure) until the jit host extracts the funclets into separate functions.

@SingleAccretion this may be more complex than what you had envisioned.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends the WASM JIT backend to support funclets by introducing per-funclet (region) register allocation state, per-funclet locals declarations, and basic funclet prolog codegen so EH regions can be code-generated with their own Wasm-local layouts.

Changes:

  • Add per-funclet RA state (SP/FP/EX + reference tracking) and resolve/register publish logic per region.
  • Teach codegen/emitter to use per-funclet SP/FP and emit per-funclet local declarations / funclet prologs.
  • Update internal-register tracking to be per-funclet on targets without a fixed register set (WASM).

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 10 comments.

Show a summary per file
FileDescription
src/coreclr/jit/regallocwasm.hIntroduces per-region RA state (SP/FP/EX + ref tracking) and new catch-arg collection hook.
src/coreclr/jit/regallocwasm.cppImplements per-funclet allocation, catch-arg rewriting, per-funclet internal-reg tables, and per-funclet locals decl generation/publishing.
src/coreclr/jit/lclvars.cppAdjusts frame-location dumping to use region-0 SP/FP on non-fixed-reg targets.
src/coreclr/jit/emitwasm.cppExtends wasm arg-count computation to support funclet signatures.
src/coreclr/jit/codegenwasm.cppUses per-funclet SP/FP accessors and implements funclet prolog local signature emission.
src/coreclr/jit/codegeninterface.hMakes SP/FP storage and internal-reg tracking per-funclet for non-fixed-reg targets; makes locals decls per-funclet.
src/coreclr/jit/codegencommon.cppImplements non-fixed-reg per-funclet NodeInternalRegisters tables and initializes per-funclet SP/FP/locals storage.

Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/emitwasm.cpp
Comment threadsrc/coreclr/jit/codegencommon.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.h Outdated
Comment threadsrc/coreclr/jit/codegeninterface.h Outdated

@SingleAccretionSingleAccretion left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks a lot like what I was thinking about too.

Left some high-level feedback.

Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/codegeninterface.h Outdated
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

@SingleAccretion90066eb should cover most of your feedback except internal regs.

@am11am11 added the arch-wasm WebAssembly architecture label Apr 2, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to 'arch-wasm': @lewing, @pavelsavara
See info in area-owners.md if you want to be subscribed.

@SingleAccretionSingleAccretion left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mostly small comments left from me. But we also need to be a bit more careful with lvRegNum mutations.

Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp
CopilotAI review requested due to automatic review settings April 2, 2026 20:53

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated 5 comments.

Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.h Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

Hopefully closer now...

@SingleAccretion in the future maybe just point out one instance of a recurring pattern? Otherwise stuff may get overlooked.

@AndyAyersMS

AndyAyersMS commented Apr 2, 2026

Copy link
Copy Markdown
MemberAuthor

There's still an issue where a node can be collected twice, eg if it both needs a register and also has internal registers, and double processing a collected node is not good.

We could have the collector mark nodes perhaps, use this to avoid a double collection, and unmark them when we process them later.

Also RequestInternalRegister can be called multiple times for the same node.

CopilotAI review requested due to automatic review settings April 2, 2026 23:15
CopilotAI review requested due to automatic review settings April 4, 2026 16:11
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

Ok, one more batch of updates:

  • rely on allocator's m_currentFunclet to track what assignments the lcl var dscs hold. If we think they're already correct, verify that they are, in debug.
  • remove need for LIR flag by remembering the last collected node
  • add node on why we don't need a debug live range update like LSRA has

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 11 out of 11 changed files in this pull request and generated 5 comments.

Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.h Outdated
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated

@SingleAccretionSingleAccretion left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looking pretty good, just a few comments!

There is also #126445 (comment) which looks valid but is pre-existing and can be addressed separately.

Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
@AndyAyersMS
AndyAyersMS marked this pull request as ready for review April 5, 2026 01:45
CopilotAI review requested due to automatic review settings April 5, 2026 01:45
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

@dotnet/jit-contrib PTAL

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 11 out of 11 changed files in this pull request and generated 2 comments.

Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/regallocwasm.cpp
@kg

kg commented Apr 8, 2026

Copy link
Copy Markdown
Contributor

LGTM but I don't understand all of it.

kg
kg approved these changes Apr 8, 2026
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

/ba-g infrastructure issues

@AndyAyersMS
AndyAyersMS merged commit 5781c28 into dotnet:mainApr 8, 2026
131 of 137 checks passed
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 9, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@AndyAyersMS@kg@SingleAccretion@am11
, '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

Wasm funclet RA - #126445

Merged
AndyAyersMS merged 28 commits into
dotnet:mainfrom
AndyAyersMS:WasmFuncletRA
Apr 8, 2026
Merged

Wasm funclet RA#126445
AndyAyersMS merged 28 commits into
dotnet:mainfrom
AndyAyersMS:WasmFuncletRA

Conversation

@AndyAyersMS

Copy link
Copy Markdown
Member

Implement register allocation for funclets, along with some funclet codegen.

CopilotAI review requested due to automatic review settings April 2, 2026 02:03
@github-actionsgithub-actionsBot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Apr 2, 2026
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

FYI @dotnet/jit-contrib

Still a work in progress, but figured I'd ask for some feedback before getting too much further. Things I know of that are still to do:

  • We may need to handle case where an allocatable local is not live across a funclet boundary and ends up in different registers in different regions. Currently for STORE_LCL_VAR we always take the reg from the lcl var.
  • ABI classifier type support for funclet params?
  • Check if typeless catch won't actually get an ex obj from runtime (I suppose we can pass nullptr if necessary)
  • Codegen is still off -- there is a bogus block before funclet start, and no return
  • This won't validate (I'm pretty sure) until the jit host extracts the funclets into separate functions.

@SingleAccretion this may be more complex than what you had envisioned.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends the WASM JIT backend to support funclets by introducing per-funclet (region) register allocation state, per-funclet locals declarations, and basic funclet prolog codegen so EH regions can be code-generated with their own Wasm-local layouts.

Changes:

  • Add per-funclet RA state (SP/FP/EX + reference tracking) and resolve/register publish logic per region.
  • Teach codegen/emitter to use per-funclet SP/FP and emit per-funclet local declarations / funclet prologs.
  • Update internal-register tracking to be per-funclet on targets without a fixed register set (WASM).

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 10 comments.

Show a summary per file
FileDescription
src/coreclr/jit/regallocwasm.hIntroduces per-region RA state (SP/FP/EX + ref tracking) and new catch-arg collection hook.
src/coreclr/jit/regallocwasm.cppImplements per-funclet allocation, catch-arg rewriting, per-funclet internal-reg tables, and per-funclet locals decl generation/publishing.
src/coreclr/jit/lclvars.cppAdjusts frame-location dumping to use region-0 SP/FP on non-fixed-reg targets.
src/coreclr/jit/emitwasm.cppExtends wasm arg-count computation to support funclet signatures.
src/coreclr/jit/codegenwasm.cppUses per-funclet SP/FP accessors and implements funclet prolog local signature emission.
src/coreclr/jit/codegeninterface.hMakes SP/FP storage and internal-reg tracking per-funclet for non-fixed-reg targets; makes locals decls per-funclet.
src/coreclr/jit/codegencommon.cppImplements non-fixed-reg per-funclet NodeInternalRegisters tables and initializes per-funclet SP/FP/locals storage.

Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/emitwasm.cpp
Comment threadsrc/coreclr/jit/codegencommon.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.h Outdated
Comment threadsrc/coreclr/jit/codegeninterface.h Outdated

@SingleAccretionSingleAccretion left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks a lot like what I was thinking about too.

Left some high-level feedback.

Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/codegeninterface.h Outdated
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

@SingleAccretion90066eb should cover most of your feedback except internal regs.

@am11am11 added the arch-wasm WebAssembly architecture label Apr 2, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to 'arch-wasm': @lewing, @pavelsavara
See info in area-owners.md if you want to be subscribed.

@SingleAccretionSingleAccretion left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mostly small comments left from me. But we also need to be a bit more careful with lvRegNum mutations.

Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp
CopilotAI review requested due to automatic review settings April 2, 2026 20:53

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated 5 comments.

Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.h Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

Hopefully closer now...

@SingleAccretion in the future maybe just point out one instance of a recurring pattern? Otherwise stuff may get overlooked.

@AndyAyersMS

AndyAyersMS commented Apr 2, 2026

Copy link
Copy Markdown
MemberAuthor

There's still an issue where a node can be collected twice, eg if it both needs a register and also has internal registers, and double processing a collected node is not good.

We could have the collector mark nodes perhaps, use this to avoid a double collection, and unmark them when we process them later.

Also RequestInternalRegister can be called multiple times for the same node.

CopilotAI review requested due to automatic review settings April 2, 2026 23:15
CopilotAI review requested due to automatic review settings April 4, 2026 16:11
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

Ok, one more batch of updates:

  • rely on allocator's m_currentFunclet to track what assignments the lcl var dscs hold. If we think they're already correct, verify that they are, in debug.
  • remove need for LIR flag by remembering the last collected node
  • add node on why we don't need a debug live range update like LSRA has

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 11 out of 11 changed files in this pull request and generated 5 comments.

Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.h Outdated
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated

@SingleAccretionSingleAccretion left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looking pretty good, just a few comments!

There is also #126445 (comment) which looks valid but is pre-existing and can be addressed separately.

Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
@AndyAyersMS
AndyAyersMS marked this pull request as ready for review April 5, 2026 01:45
CopilotAI review requested due to automatic review settings April 5, 2026 01:45
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

@dotnet/jit-contrib PTAL

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 11 out of 11 changed files in this pull request and generated 2 comments.

Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/regallocwasm.cpp
@kg

kg commented Apr 8, 2026

Copy link
Copy Markdown
Contributor

LGTM but I don't understand all of it.

kg
kg approved these changes Apr 8, 2026
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

/ba-g infrastructure issues

@AndyAyersMS
AndyAyersMS merged commit 5781c28 into dotnet:mainApr 8, 2026
131 of 137 checks passed
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 9, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@AndyAyersMS@kg@SingleAccretion@am11
, '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

Wasm funclet RA - #126445

Merged
AndyAyersMS merged 28 commits into
dotnet:mainfrom
AndyAyersMS:WasmFuncletRA
Apr 8, 2026
Merged

Wasm funclet RA#126445
AndyAyersMS merged 28 commits into
dotnet:mainfrom
AndyAyersMS:WasmFuncletRA

Conversation

@AndyAyersMS

Copy link
Copy Markdown
Member

Implement register allocation for funclets, along with some funclet codegen.

CopilotAI review requested due to automatic review settings April 2, 2026 02:03
@github-actionsgithub-actionsBot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Apr 2, 2026
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

FYI @dotnet/jit-contrib

Still a work in progress, but figured I'd ask for some feedback before getting too much further. Things I know of that are still to do:

  • We may need to handle case where an allocatable local is not live across a funclet boundary and ends up in different registers in different regions. Currently for STORE_LCL_VAR we always take the reg from the lcl var.
  • ABI classifier type support for funclet params?
  • Check if typeless catch won't actually get an ex obj from runtime (I suppose we can pass nullptr if necessary)
  • Codegen is still off -- there is a bogus block before funclet start, and no return
  • This won't validate (I'm pretty sure) until the jit host extracts the funclets into separate functions.

@SingleAccretion this may be more complex than what you had envisioned.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends the WASM JIT backend to support funclets by introducing per-funclet (region) register allocation state, per-funclet locals declarations, and basic funclet prolog codegen so EH regions can be code-generated with their own Wasm-local layouts.

Changes:

  • Add per-funclet RA state (SP/FP/EX + reference tracking) and resolve/register publish logic per region.
  • Teach codegen/emitter to use per-funclet SP/FP and emit per-funclet local declarations / funclet prologs.
  • Update internal-register tracking to be per-funclet on targets without a fixed register set (WASM).

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 10 comments.

Show a summary per file
FileDescription
src/coreclr/jit/regallocwasm.hIntroduces per-region RA state (SP/FP/EX + ref tracking) and new catch-arg collection hook.
src/coreclr/jit/regallocwasm.cppImplements per-funclet allocation, catch-arg rewriting, per-funclet internal-reg tables, and per-funclet locals decl generation/publishing.
src/coreclr/jit/lclvars.cppAdjusts frame-location dumping to use region-0 SP/FP on non-fixed-reg targets.
src/coreclr/jit/emitwasm.cppExtends wasm arg-count computation to support funclet signatures.
src/coreclr/jit/codegenwasm.cppUses per-funclet SP/FP accessors and implements funclet prolog local signature emission.
src/coreclr/jit/codegeninterface.hMakes SP/FP storage and internal-reg tracking per-funclet for non-fixed-reg targets; makes locals decls per-funclet.
src/coreclr/jit/codegencommon.cppImplements non-fixed-reg per-funclet NodeInternalRegisters tables and initializes per-funclet SP/FP/locals storage.

Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/emitwasm.cpp
Comment threadsrc/coreclr/jit/codegencommon.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.h Outdated
Comment threadsrc/coreclr/jit/codegeninterface.h Outdated

@SingleAccretionSingleAccretion left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks a lot like what I was thinking about too.

Left some high-level feedback.

Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/codegeninterface.h Outdated
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

@SingleAccretion90066eb should cover most of your feedback except internal regs.

@am11am11 added the arch-wasm WebAssembly architecture label Apr 2, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to 'arch-wasm': @lewing, @pavelsavara
See info in area-owners.md if you want to be subscribed.

@SingleAccretionSingleAccretion left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mostly small comments left from me. But we also need to be a bit more careful with lvRegNum mutations.

Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp
CopilotAI review requested due to automatic review settings April 2, 2026 20:53

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated 5 comments.

Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.h Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

Hopefully closer now...

@SingleAccretion in the future maybe just point out one instance of a recurring pattern? Otherwise stuff may get overlooked.

@AndyAyersMS

AndyAyersMS commented Apr 2, 2026

Copy link
Copy Markdown
MemberAuthor

There's still an issue where a node can be collected twice, eg if it both needs a register and also has internal registers, and double processing a collected node is not good.

We could have the collector mark nodes perhaps, use this to avoid a double collection, and unmark them when we process them later.

Also RequestInternalRegister can be called multiple times for the same node.

CopilotAI review requested due to automatic review settings April 2, 2026 23:15
CopilotAI review requested due to automatic review settings April 4, 2026 16:11
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

Ok, one more batch of updates:

  • rely on allocator's m_currentFunclet to track what assignments the lcl var dscs hold. If we think they're already correct, verify that they are, in debug.
  • remove need for LIR flag by remembering the last collected node
  • add node on why we don't need a debug live range update like LSRA has

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 11 out of 11 changed files in this pull request and generated 5 comments.

Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.h Outdated
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated

@SingleAccretionSingleAccretion left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looking pretty good, just a few comments!

There is also #126445 (comment) which looks valid but is pre-existing and can be addressed separately.

Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
@AndyAyersMS
AndyAyersMS marked this pull request as ready for review April 5, 2026 01:45
CopilotAI review requested due to automatic review settings April 5, 2026 01:45
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

@dotnet/jit-contrib PTAL

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 11 out of 11 changed files in this pull request and generated 2 comments.

Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/regallocwasm.cpp
@kg

kg commented Apr 8, 2026

Copy link
Copy Markdown
Contributor

LGTM but I don't understand all of it.

kg
kg approved these changes Apr 8, 2026
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

/ba-g infrastructure issues

@AndyAyersMS
AndyAyersMS merged commit 5781c28 into dotnet:mainApr 8, 2026
131 of 137 checks passed
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 9, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@AndyAyersMS@kg@SingleAccretion@am11
, '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

Wasm funclet RA - #126445

Merged
AndyAyersMS merged 28 commits into
dotnet:mainfrom
AndyAyersMS:WasmFuncletRA
Apr 8, 2026
Merged

Wasm funclet RA#126445
AndyAyersMS merged 28 commits into
dotnet:mainfrom
AndyAyersMS:WasmFuncletRA

Conversation

@AndyAyersMS

Copy link
Copy Markdown
Member

Implement register allocation for funclets, along with some funclet codegen.

CopilotAI review requested due to automatic review settings April 2, 2026 02:03
@github-actionsgithub-actionsBot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Apr 2, 2026
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

FYI @dotnet/jit-contrib

Still a work in progress, but figured I'd ask for some feedback before getting too much further. Things I know of that are still to do:

  • We may need to handle case where an allocatable local is not live across a funclet boundary and ends up in different registers in different regions. Currently for STORE_LCL_VAR we always take the reg from the lcl var.
  • ABI classifier type support for funclet params?
  • Check if typeless catch won't actually get an ex obj from runtime (I suppose we can pass nullptr if necessary)
  • Codegen is still off -- there is a bogus block before funclet start, and no return
  • This won't validate (I'm pretty sure) until the jit host extracts the funclets into separate functions.

@SingleAccretion this may be more complex than what you had envisioned.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends the WASM JIT backend to support funclets by introducing per-funclet (region) register allocation state, per-funclet locals declarations, and basic funclet prolog codegen so EH regions can be code-generated with their own Wasm-local layouts.

Changes:

  • Add per-funclet RA state (SP/FP/EX + reference tracking) and resolve/register publish logic per region.
  • Teach codegen/emitter to use per-funclet SP/FP and emit per-funclet local declarations / funclet prologs.
  • Update internal-register tracking to be per-funclet on targets without a fixed register set (WASM).

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 10 comments.

Show a summary per file
FileDescription
src/coreclr/jit/regallocwasm.hIntroduces per-region RA state (SP/FP/EX + ref tracking) and new catch-arg collection hook.
src/coreclr/jit/regallocwasm.cppImplements per-funclet allocation, catch-arg rewriting, per-funclet internal-reg tables, and per-funclet locals decl generation/publishing.
src/coreclr/jit/lclvars.cppAdjusts frame-location dumping to use region-0 SP/FP on non-fixed-reg targets.
src/coreclr/jit/emitwasm.cppExtends wasm arg-count computation to support funclet signatures.
src/coreclr/jit/codegenwasm.cppUses per-funclet SP/FP accessors and implements funclet prolog local signature emission.
src/coreclr/jit/codegeninterface.hMakes SP/FP storage and internal-reg tracking per-funclet for non-fixed-reg targets; makes locals decls per-funclet.
src/coreclr/jit/codegencommon.cppImplements non-fixed-reg per-funclet NodeInternalRegisters tables and initializes per-funclet SP/FP/locals storage.

Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/emitwasm.cpp
Comment threadsrc/coreclr/jit/codegencommon.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.h Outdated
Comment threadsrc/coreclr/jit/codegeninterface.h Outdated

@SingleAccretionSingleAccretion left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks a lot like what I was thinking about too.

Left some high-level feedback.

Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/codegeninterface.h Outdated
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

@SingleAccretion90066eb should cover most of your feedback except internal regs.

@am11am11 added the arch-wasm WebAssembly architecture label Apr 2, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to 'arch-wasm': @lewing, @pavelsavara
See info in area-owners.md if you want to be subscribed.

@SingleAccretionSingleAccretion left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mostly small comments left from me. But we also need to be a bit more careful with lvRegNum mutations.

Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp
CopilotAI review requested due to automatic review settings April 2, 2026 20:53

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated 5 comments.

Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.h Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

Hopefully closer now...

@SingleAccretion in the future maybe just point out one instance of a recurring pattern? Otherwise stuff may get overlooked.

@AndyAyersMS

AndyAyersMS commented Apr 2, 2026

Copy link
Copy Markdown
MemberAuthor

There's still an issue where a node can be collected twice, eg if it both needs a register and also has internal registers, and double processing a collected node is not good.

We could have the collector mark nodes perhaps, use this to avoid a double collection, and unmark them when we process them later.

Also RequestInternalRegister can be called multiple times for the same node.

CopilotAI review requested due to automatic review settings April 2, 2026 23:15
CopilotAI review requested due to automatic review settings April 4, 2026 16:11
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

Ok, one more batch of updates:

  • rely on allocator's m_currentFunclet to track what assignments the lcl var dscs hold. If we think they're already correct, verify that they are, in debug.
  • remove need for LIR flag by remembering the last collected node
  • add node on why we don't need a debug live range update like LSRA has

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 11 out of 11 changed files in this pull request and generated 5 comments.

Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.h Outdated
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated

@SingleAccretionSingleAccretion left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looking pretty good, just a few comments!

There is also #126445 (comment) which looks valid but is pre-existing and can be addressed separately.

Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
@AndyAyersMS
AndyAyersMS marked this pull request as ready for review April 5, 2026 01:45
CopilotAI review requested due to automatic review settings April 5, 2026 01:45
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

@dotnet/jit-contrib PTAL

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 11 out of 11 changed files in this pull request and generated 2 comments.

Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/regallocwasm.cpp
@kg

kg commented Apr 8, 2026

Copy link
Copy Markdown
Contributor

LGTM but I don't understand all of it.

kg
kg approved these changes Apr 8, 2026
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

/ba-g infrastructure issues

@AndyAyersMS
AndyAyersMS merged commit 5781c28 into dotnet:mainApr 8, 2026
131 of 137 checks passed
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 9, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@AndyAyersMS@kg@SingleAccretion@am11
, '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

Wasm funclet RA - #126445

Merged
AndyAyersMS merged 28 commits into
dotnet:mainfrom
AndyAyersMS:WasmFuncletRA
Apr 8, 2026
Merged

Wasm funclet RA#126445
AndyAyersMS merged 28 commits into
dotnet:mainfrom
AndyAyersMS:WasmFuncletRA

Conversation

@AndyAyersMS

Copy link
Copy Markdown
Member

Implement register allocation for funclets, along with some funclet codegen.

CopilotAI review requested due to automatic review settings April 2, 2026 02:03
@github-actionsgithub-actionsBot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Apr 2, 2026
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

FYI @dotnet/jit-contrib

Still a work in progress, but figured I'd ask for some feedback before getting too much further. Things I know of that are still to do:

  • We may need to handle case where an allocatable local is not live across a funclet boundary and ends up in different registers in different regions. Currently for STORE_LCL_VAR we always take the reg from the lcl var.
  • ABI classifier type support for funclet params?
  • Check if typeless catch won't actually get an ex obj from runtime (I suppose we can pass nullptr if necessary)
  • Codegen is still off -- there is a bogus block before funclet start, and no return
  • This won't validate (I'm pretty sure) until the jit host extracts the funclets into separate functions.

@SingleAccretion this may be more complex than what you had envisioned.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends the WASM JIT backend to support funclets by introducing per-funclet (region) register allocation state, per-funclet locals declarations, and basic funclet prolog codegen so EH regions can be code-generated with their own Wasm-local layouts.

Changes:

  • Add per-funclet RA state (SP/FP/EX + reference tracking) and resolve/register publish logic per region.
  • Teach codegen/emitter to use per-funclet SP/FP and emit per-funclet local declarations / funclet prologs.
  • Update internal-register tracking to be per-funclet on targets without a fixed register set (WASM).

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 10 comments.

Show a summary per file
FileDescription
src/coreclr/jit/regallocwasm.hIntroduces per-region RA state (SP/FP/EX + ref tracking) and new catch-arg collection hook.
src/coreclr/jit/regallocwasm.cppImplements per-funclet allocation, catch-arg rewriting, per-funclet internal-reg tables, and per-funclet locals decl generation/publishing.
src/coreclr/jit/lclvars.cppAdjusts frame-location dumping to use region-0 SP/FP on non-fixed-reg targets.
src/coreclr/jit/emitwasm.cppExtends wasm arg-count computation to support funclet signatures.
src/coreclr/jit/codegenwasm.cppUses per-funclet SP/FP accessors and implements funclet prolog local signature emission.
src/coreclr/jit/codegeninterface.hMakes SP/FP storage and internal-reg tracking per-funclet for non-fixed-reg targets; makes locals decls per-funclet.
src/coreclr/jit/codegencommon.cppImplements non-fixed-reg per-funclet NodeInternalRegisters tables and initializes per-funclet SP/FP/locals storage.

Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/emitwasm.cpp
Comment threadsrc/coreclr/jit/codegencommon.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.h Outdated
Comment threadsrc/coreclr/jit/codegeninterface.h Outdated

@SingleAccretionSingleAccretion left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks a lot like what I was thinking about too.

Left some high-level feedback.

Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/codegeninterface.h Outdated
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

@SingleAccretion90066eb should cover most of your feedback except internal regs.

@am11am11 added the arch-wasm WebAssembly architecture label Apr 2, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to 'arch-wasm': @lewing, @pavelsavara
See info in area-owners.md if you want to be subscribed.

@SingleAccretionSingleAccretion left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mostly small comments left from me. But we also need to be a bit more careful with lvRegNum mutations.

Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp
CopilotAI review requested due to automatic review settings April 2, 2026 20:53

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated 5 comments.

Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.h Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

Hopefully closer now...

@SingleAccretion in the future maybe just point out one instance of a recurring pattern? Otherwise stuff may get overlooked.

@AndyAyersMS

AndyAyersMS commented Apr 2, 2026

Copy link
Copy Markdown
MemberAuthor

There's still an issue where a node can be collected twice, eg if it both needs a register and also has internal registers, and double processing a collected node is not good.

We could have the collector mark nodes perhaps, use this to avoid a double collection, and unmark them when we process them later.

Also RequestInternalRegister can be called multiple times for the same node.

CopilotAI review requested due to automatic review settings April 2, 2026 23:15
CopilotAI review requested due to automatic review settings April 4, 2026 16:11
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

Ok, one more batch of updates:

  • rely on allocator's m_currentFunclet to track what assignments the lcl var dscs hold. If we think they're already correct, verify that they are, in debug.
  • remove need for LIR flag by remembering the last collected node
  • add node on why we don't need a debug live range update like LSRA has

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 11 out of 11 changed files in this pull request and generated 5 comments.

Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.h Outdated
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated

@SingleAccretionSingleAccretion left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looking pretty good, just a few comments!

There is also #126445 (comment) which looks valid but is pre-existing and can be addressed separately.

Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
@AndyAyersMS
AndyAyersMS marked this pull request as ready for review April 5, 2026 01:45
CopilotAI review requested due to automatic review settings April 5, 2026 01:45
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

@dotnet/jit-contrib PTAL

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 11 out of 11 changed files in this pull request and generated 2 comments.

Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/regallocwasm.cpp
@kg

kg commented Apr 8, 2026

Copy link
Copy Markdown
Contributor

LGTM but I don't understand all of it.

kg
kg approved these changes Apr 8, 2026
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

/ba-g infrastructure issues

@AndyAyersMS
AndyAyersMS merged commit 5781c28 into dotnet:mainApr 8, 2026
131 of 137 checks passed
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 9, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@AndyAyersMS@kg@SingleAccretion@am11
, '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

Wasm funclet RA - #126445

Merged
AndyAyersMS merged 28 commits into
dotnet:mainfrom
AndyAyersMS:WasmFuncletRA
Apr 8, 2026
Merged

Wasm funclet RA#126445
AndyAyersMS merged 28 commits into
dotnet:mainfrom
AndyAyersMS:WasmFuncletRA

Conversation

@AndyAyersMS

Copy link
Copy Markdown
Member

Implement register allocation for funclets, along with some funclet codegen.

CopilotAI review requested due to automatic review settings April 2, 2026 02:03
@github-actionsgithub-actionsBot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Apr 2, 2026
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

FYI @dotnet/jit-contrib

Still a work in progress, but figured I'd ask for some feedback before getting too much further. Things I know of that are still to do:

  • We may need to handle case where an allocatable local is not live across a funclet boundary and ends up in different registers in different regions. Currently for STORE_LCL_VAR we always take the reg from the lcl var.
  • ABI classifier type support for funclet params?
  • Check if typeless catch won't actually get an ex obj from runtime (I suppose we can pass nullptr if necessary)
  • Codegen is still off -- there is a bogus block before funclet start, and no return
  • This won't validate (I'm pretty sure) until the jit host extracts the funclets into separate functions.

@SingleAccretion this may be more complex than what you had envisioned.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends the WASM JIT backend to support funclets by introducing per-funclet (region) register allocation state, per-funclet locals declarations, and basic funclet prolog codegen so EH regions can be code-generated with their own Wasm-local layouts.

Changes:

  • Add per-funclet RA state (SP/FP/EX + reference tracking) and resolve/register publish logic per region.
  • Teach codegen/emitter to use per-funclet SP/FP and emit per-funclet local declarations / funclet prologs.
  • Update internal-register tracking to be per-funclet on targets without a fixed register set (WASM).

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 10 comments.

Show a summary per file
FileDescription
src/coreclr/jit/regallocwasm.hIntroduces per-region RA state (SP/FP/EX + ref tracking) and new catch-arg collection hook.
src/coreclr/jit/regallocwasm.cppImplements per-funclet allocation, catch-arg rewriting, per-funclet internal-reg tables, and per-funclet locals decl generation/publishing.
src/coreclr/jit/lclvars.cppAdjusts frame-location dumping to use region-0 SP/FP on non-fixed-reg targets.
src/coreclr/jit/emitwasm.cppExtends wasm arg-count computation to support funclet signatures.
src/coreclr/jit/codegenwasm.cppUses per-funclet SP/FP accessors and implements funclet prolog local signature emission.
src/coreclr/jit/codegeninterface.hMakes SP/FP storage and internal-reg tracking per-funclet for non-fixed-reg targets; makes locals decls per-funclet.
src/coreclr/jit/codegencommon.cppImplements non-fixed-reg per-funclet NodeInternalRegisters tables and initializes per-funclet SP/FP/locals storage.

Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/emitwasm.cpp
Comment threadsrc/coreclr/jit/codegencommon.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.h Outdated
Comment threadsrc/coreclr/jit/codegeninterface.h Outdated

@SingleAccretionSingleAccretion left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks a lot like what I was thinking about too.

Left some high-level feedback.

Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/codegeninterface.h Outdated
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

@SingleAccretion90066eb should cover most of your feedback except internal regs.

@am11am11 added the arch-wasm WebAssembly architecture label Apr 2, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to 'arch-wasm': @lewing, @pavelsavara
See info in area-owners.md if you want to be subscribed.

@SingleAccretionSingleAccretion left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mostly small comments left from me. But we also need to be a bit more careful with lvRegNum mutations.

Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp
CopilotAI review requested due to automatic review settings April 2, 2026 20:53

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated 5 comments.

Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.h Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

Hopefully closer now...

@SingleAccretion in the future maybe just point out one instance of a recurring pattern? Otherwise stuff may get overlooked.

@AndyAyersMS

AndyAyersMS commented Apr 2, 2026

Copy link
Copy Markdown
MemberAuthor

There's still an issue where a node can be collected twice, eg if it both needs a register and also has internal registers, and double processing a collected node is not good.

We could have the collector mark nodes perhaps, use this to avoid a double collection, and unmark them when we process them later.

Also RequestInternalRegister can be called multiple times for the same node.

CopilotAI review requested due to automatic review settings April 2, 2026 23:15
CopilotAI review requested due to automatic review settings April 4, 2026 16:11
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

Ok, one more batch of updates:

  • rely on allocator's m_currentFunclet to track what assignments the lcl var dscs hold. If we think they're already correct, verify that they are, in debug.
  • remove need for LIR flag by remembering the last collected node
  • add node on why we don't need a debug live range update like LSRA has

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 11 out of 11 changed files in this pull request and generated 5 comments.

Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.h Outdated
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated

@SingleAccretionSingleAccretion left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looking pretty good, just a few comments!

There is also #126445 (comment) which looks valid but is pre-existing and can be addressed separately.

Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
@AndyAyersMS
AndyAyersMS marked this pull request as ready for review April 5, 2026 01:45
CopilotAI review requested due to automatic review settings April 5, 2026 01:45
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

@dotnet/jit-contrib PTAL

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 11 out of 11 changed files in this pull request and generated 2 comments.

Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/regallocwasm.cpp
@kg

kg commented Apr 8, 2026

Copy link
Copy Markdown
Contributor

LGTM but I don't understand all of it.

kg
kg approved these changes Apr 8, 2026
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

/ba-g infrastructure issues

@AndyAyersMS
AndyAyersMS merged commit 5781c28 into dotnet:mainApr 8, 2026
131 of 137 checks passed
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 9, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@AndyAyersMS@kg@SingleAccretion@am11
, '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

Wasm funclet RA - #126445

Merged
AndyAyersMS merged 28 commits into
dotnet:mainfrom
AndyAyersMS:WasmFuncletRA
Apr 8, 2026
Merged

Wasm funclet RA#126445
AndyAyersMS merged 28 commits into
dotnet:mainfrom
AndyAyersMS:WasmFuncletRA

Conversation

@AndyAyersMS

Copy link
Copy Markdown
Member

Implement register allocation for funclets, along with some funclet codegen.

CopilotAI review requested due to automatic review settings April 2, 2026 02:03
@github-actionsgithub-actionsBot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Apr 2, 2026
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

FYI @dotnet/jit-contrib

Still a work in progress, but figured I'd ask for some feedback before getting too much further. Things I know of that are still to do:

  • We may need to handle case where an allocatable local is not live across a funclet boundary and ends up in different registers in different regions. Currently for STORE_LCL_VAR we always take the reg from the lcl var.
  • ABI classifier type support for funclet params?
  • Check if typeless catch won't actually get an ex obj from runtime (I suppose we can pass nullptr if necessary)
  • Codegen is still off -- there is a bogus block before funclet start, and no return
  • This won't validate (I'm pretty sure) until the jit host extracts the funclets into separate functions.

@SingleAccretion this may be more complex than what you had envisioned.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends the WASM JIT backend to support funclets by introducing per-funclet (region) register allocation state, per-funclet locals declarations, and basic funclet prolog codegen so EH regions can be code-generated with their own Wasm-local layouts.

Changes:

  • Add per-funclet RA state (SP/FP/EX + reference tracking) and resolve/register publish logic per region.
  • Teach codegen/emitter to use per-funclet SP/FP and emit per-funclet local declarations / funclet prologs.
  • Update internal-register tracking to be per-funclet on targets without a fixed register set (WASM).

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 10 comments.

Show a summary per file
FileDescription
src/coreclr/jit/regallocwasm.hIntroduces per-region RA state (SP/FP/EX + ref tracking) and new catch-arg collection hook.
src/coreclr/jit/regallocwasm.cppImplements per-funclet allocation, catch-arg rewriting, per-funclet internal-reg tables, and per-funclet locals decl generation/publishing.
src/coreclr/jit/lclvars.cppAdjusts frame-location dumping to use region-0 SP/FP on non-fixed-reg targets.
src/coreclr/jit/emitwasm.cppExtends wasm arg-count computation to support funclet signatures.
src/coreclr/jit/codegenwasm.cppUses per-funclet SP/FP accessors and implements funclet prolog local signature emission.
src/coreclr/jit/codegeninterface.hMakes SP/FP storage and internal-reg tracking per-funclet for non-fixed-reg targets; makes locals decls per-funclet.
src/coreclr/jit/codegencommon.cppImplements non-fixed-reg per-funclet NodeInternalRegisters tables and initializes per-funclet SP/FP/locals storage.

Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/emitwasm.cpp
Comment threadsrc/coreclr/jit/codegencommon.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.h Outdated
Comment threadsrc/coreclr/jit/codegeninterface.h Outdated

@SingleAccretionSingleAccretion left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks a lot like what I was thinking about too.

Left some high-level feedback.

Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/codegeninterface.h Outdated
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

@SingleAccretion90066eb should cover most of your feedback except internal regs.

@am11am11 added the arch-wasm WebAssembly architecture label Apr 2, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to 'arch-wasm': @lewing, @pavelsavara
See info in area-owners.md if you want to be subscribed.

@SingleAccretionSingleAccretion left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mostly small comments left from me. But we also need to be a bit more careful with lvRegNum mutations.

Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp
CopilotAI review requested due to automatic review settings April 2, 2026 20:53

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated 5 comments.

Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.h Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

Hopefully closer now...

@SingleAccretion in the future maybe just point out one instance of a recurring pattern? Otherwise stuff may get overlooked.

@AndyAyersMS

AndyAyersMS commented Apr 2, 2026

Copy link
Copy Markdown
MemberAuthor

There's still an issue where a node can be collected twice, eg if it both needs a register and also has internal registers, and double processing a collected node is not good.

We could have the collector mark nodes perhaps, use this to avoid a double collection, and unmark them when we process them later.

Also RequestInternalRegister can be called multiple times for the same node.

CopilotAI review requested due to automatic review settings April 2, 2026 23:15
CopilotAI review requested due to automatic review settings April 4, 2026 16:11
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

Ok, one more batch of updates:

  • rely on allocator's m_currentFunclet to track what assignments the lcl var dscs hold. If we think they're already correct, verify that they are, in debug.
  • remove need for LIR flag by remembering the last collected node
  • add node on why we don't need a debug live range update like LSRA has

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 11 out of 11 changed files in this pull request and generated 5 comments.

Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.h Outdated
Comment threadsrc/coreclr/jit/codegenwasm.cpp Outdated

@SingleAccretionSingleAccretion left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looking pretty good, just a few comments!

There is also #126445 (comment) which looks valid but is pre-existing and can be addressed separately.

Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
Comment threadsrc/coreclr/jit/regallocwasm.cpp Outdated
@AndyAyersMS
AndyAyersMS marked this pull request as ready for review April 5, 2026 01:45
CopilotAI review requested due to automatic review settings April 5, 2026 01:45
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

@dotnet/jit-contrib PTAL

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 11 out of 11 changed files in this pull request and generated 2 comments.

Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/regallocwasm.cpp
Comment threadsrc/coreclr/jit/regallocwasm.cpp
@kg

kg commented Apr 8, 2026

Copy link
Copy Markdown
Contributor

LGTM but I don't understand all of it.

kg
kg approved these changes Apr 8, 2026
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

/ba-g infrastructure issues

@AndyAyersMS
AndyAyersMS merged commit 5781c28 into dotnet:mainApr 8, 2026
131 of 137 checks passed
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 9, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@AndyAyersMS@kg@SingleAccretion@am11