[Wasm RyuJit]: don't skip top-level catchrets when marking try resumption - #129205

Merged
AndyAyersMS merged 2 commits into
dotnet:mainfrom
AndyAyersMS:fix-wasm-try-catch
Jun 11, 2026
Merged

[Wasm RyuJit]: don't skip top-level catchrets when marking try resumption#129205
AndyAyersMS merged 2 commits into
dotnet:mainfrom
AndyAyersMS:fix-wasm-try-catch

Conversation

@AndyAyersMS

@AndyAyersMSAndyAyersMS commented Jun 10, 2026

Copy link
Copy Markdown
Member

In FlowGraphTryRegions::Build, the BBJ_EHCATCHRET check sat below the early bailout on hasTryIndex, so the catchret of an outer catch was never marking its try region as requiring runtime resumption.

Also: ensure loops that partially contain trys have their wasm-interval lengths extended to encompass any throw helpers associated with the try.

Also: fix some random extra argument added to a the overflow helper in some cases. This is all platform and has been in the code forever. On native it is somewhat harmless to pass unexpected extra args (especially if register args). On Wasm it is not.

Reminder that for Wasm control flow we can always move the end of a Wasm loop later; the extent just delineates where you can branch back to the loop head, not the actual extent of the loop. Likewise we can always move the start of a block earlier.

In FlowGraphTryRegions::Build, the BBJ_EHCATCHRET check sat below the
early bailout on hasTryIndex, so the catchret of an outer catch was
never marking its try region as requiring runtime resumption.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 10, 2026 01:50
@github-actionsgithub-actionsBot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Jun 10, 2026
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

@dotnet/jit-contrib PTAL
@davidwrighton @dotnet/wasm-contrib FYI

Fixes a dumb logic bug.

With this and #129197 I'm able to resume after catch in simple R2R methods. Haven't tested more widely yet.

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

Adjusts FlowGraphTryRegions::Build so BBJ_EHCATCHRET blocks always mark their associated “dispatching try” region as requiring runtime resumption, even when the catchret block itself has no TryIndex (e.g., outermost catch).

Changes:

  • Move the BBJ_EHCATCHRET handling before the early !block->hasTryIndex() bailout.
  • Preserve existing behavior for try-region membership/entry-edge discovery while ensuring top-level catchrets are no longer skipped.

Comment threadsrc/coreclr/jit/flowgraph.cpp
kg
kg approved these changes Jun 10, 2026
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

SPC is not crossgenning cleanly with this fix. Failure is clearly related.

throw helpers associated with the try.
Remove an unneded arg on a folded overflow throw helper call. This is
harmless on native targets but causes a sig mismatch issue for Wasm.
@JulieLeeMSFTJulieLeeMSFT added the arch-wasm WebAssembly architecture label Jun 10, 2026

@JulieLeeMSFTJulieLeeMSFT left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM. The fix extends loop intervals to the right to fully enclose try region's throw helper blocks (prevents loop/try straddle).

@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

/ba-g unrelated legs timing out

@AndyAyersMS
AndyAyersMS merged commit 7d42228 into dotnet:mainJun 11, 2026
122 of 148 checks passed
BoyBaykiller pushed a commit to BoyBaykiller/runtime that referenced this pull request Jun 11, 2026
…tion (dotnet#129205)
In FlowGraphTryRegions::Build, the BBJ_EHCATCHRET check sat below the
early bailout on hasTryIndex, so the catchret of an outer catch was
never marking its try region as requiring runtime resumption.
Also: ensure loops that partially contain trys have their wasm-interval
lengths extended to encompass any throw helpers associated with the try.
Also: fix some random extra argument added to a the overflow helper in
some cases. This is all platform and has been in the code forever. On
native it is somewhat harmless to pass unexpected extra args (especially
if register args). On Wasm it is not.
Reminder that for Wasm control flow we can always move the end of a Wasm
loop later; the extent just delineates where you can branch back to the
loop head, not the actual extent of the loop. Likewise we can always
move the start of a block earlier.
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 17, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
…tion (#129205)
In FlowGraphTryRegions::Build, the BBJ_EHCATCHRET check sat below the
early bailout on hasTryIndex, so the catchret of an outer catch was
never marking its try region as requiring runtime resumption.
Also: ensure loops that partially contain trys have their wasm-interval
lengths extended to encompass any throw helpers associated with the try.
Also: fix some random extra argument added to a the overflow helper in
some cases. This is all platform and has been in the code forever. On
native it is somewhat harmless to pass unexpected extra args (especially
if register args). On Wasm it is not.
Reminder that for Wasm control flow we can always move the end of a Wasm
loop later; the extent just delineates where you can branch back to the
loop head, not the actual extent of the loop. Likewise we can always
move the start of a block earlier.
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 18, 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.

4 participants

@AndyAyersMS@kg@JulieLeeMSFT
, '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 RyuJit]: don't skip top-level catchrets when marking try resumption - #129205

Merged
AndyAyersMS merged 2 commits into
dotnet:mainfrom
AndyAyersMS:fix-wasm-try-catch
Jun 11, 2026
Merged

[Wasm RyuJit]: don't skip top-level catchrets when marking try resumption#129205
AndyAyersMS merged 2 commits into
dotnet:mainfrom
AndyAyersMS:fix-wasm-try-catch

Conversation

@AndyAyersMS

@AndyAyersMSAndyAyersMS commented Jun 10, 2026

Copy link
Copy Markdown
Member

In FlowGraphTryRegions::Build, the BBJ_EHCATCHRET check sat below the early bailout on hasTryIndex, so the catchret of an outer catch was never marking its try region as requiring runtime resumption.

Also: ensure loops that partially contain trys have their wasm-interval lengths extended to encompass any throw helpers associated with the try.

Also: fix some random extra argument added to a the overflow helper in some cases. This is all platform and has been in the code forever. On native it is somewhat harmless to pass unexpected extra args (especially if register args). On Wasm it is not.

Reminder that for Wasm control flow we can always move the end of a Wasm loop later; the extent just delineates where you can branch back to the loop head, not the actual extent of the loop. Likewise we can always move the start of a block earlier.

In FlowGraphTryRegions::Build, the BBJ_EHCATCHRET check sat below the
early bailout on hasTryIndex, so the catchret of an outer catch was
never marking its try region as requiring runtime resumption.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 10, 2026 01:50
@github-actionsgithub-actionsBot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Jun 10, 2026
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

@dotnet/jit-contrib PTAL
@davidwrighton @dotnet/wasm-contrib FYI

Fixes a dumb logic bug.

With this and #129197 I'm able to resume after catch in simple R2R methods. Haven't tested more widely yet.

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

Adjusts FlowGraphTryRegions::Build so BBJ_EHCATCHRET blocks always mark their associated “dispatching try” region as requiring runtime resumption, even when the catchret block itself has no TryIndex (e.g., outermost catch).

Changes:

  • Move the BBJ_EHCATCHRET handling before the early !block->hasTryIndex() bailout.
  • Preserve existing behavior for try-region membership/entry-edge discovery while ensuring top-level catchrets are no longer skipped.

Comment threadsrc/coreclr/jit/flowgraph.cpp
kg
kg approved these changes Jun 10, 2026
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

SPC is not crossgenning cleanly with this fix. Failure is clearly related.

throw helpers associated with the try.
Remove an unneded arg on a folded overflow throw helper call. This is
harmless on native targets but causes a sig mismatch issue for Wasm.
@JulieLeeMSFTJulieLeeMSFT added the arch-wasm WebAssembly architecture label Jun 10, 2026

@JulieLeeMSFTJulieLeeMSFT left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM. The fix extends loop intervals to the right to fully enclose try region's throw helper blocks (prevents loop/try straddle).

@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

/ba-g unrelated legs timing out

@AndyAyersMS
AndyAyersMS merged commit 7d42228 into dotnet:mainJun 11, 2026
122 of 148 checks passed
BoyBaykiller pushed a commit to BoyBaykiller/runtime that referenced this pull request Jun 11, 2026
…tion (dotnet#129205)
In FlowGraphTryRegions::Build, the BBJ_EHCATCHRET check sat below the
early bailout on hasTryIndex, so the catchret of an outer catch was
never marking its try region as requiring runtime resumption.
Also: ensure loops that partially contain trys have their wasm-interval
lengths extended to encompass any throw helpers associated with the try.
Also: fix some random extra argument added to a the overflow helper in
some cases. This is all platform and has been in the code forever. On
native it is somewhat harmless to pass unexpected extra args (especially
if register args). On Wasm it is not.
Reminder that for Wasm control flow we can always move the end of a Wasm
loop later; the extent just delineates where you can branch back to the
loop head, not the actual extent of the loop. Likewise we can always
move the start of a block earlier.
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 17, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
…tion (#129205)
In FlowGraphTryRegions::Build, the BBJ_EHCATCHRET check sat below the
early bailout on hasTryIndex, so the catchret of an outer catch was
never marking its try region as requiring runtime resumption.
Also: ensure loops that partially contain trys have their wasm-interval
lengths extended to encompass any throw helpers associated with the try.
Also: fix some random extra argument added to a the overflow helper in
some cases. This is all platform and has been in the code forever. On
native it is somewhat harmless to pass unexpected extra args (especially
if register args). On Wasm it is not.
Reminder that for Wasm control flow we can always move the end of a Wasm
loop later; the extent just delineates where you can branch back to the
loop head, not the actual extent of the loop. Likewise we can always
move the start of a block earlier.
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 18, 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.

4 participants

@AndyAyersMS@kg@JulieLeeMSFT
, '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 RyuJit]: don't skip top-level catchrets when marking try resumption - #129205

Merged
AndyAyersMS merged 2 commits into
dotnet:mainfrom
AndyAyersMS:fix-wasm-try-catch
Jun 11, 2026
Merged

[Wasm RyuJit]: don't skip top-level catchrets when marking try resumption#129205
AndyAyersMS merged 2 commits into
dotnet:mainfrom
AndyAyersMS:fix-wasm-try-catch

Conversation

@AndyAyersMS

@AndyAyersMSAndyAyersMS commented Jun 10, 2026

Copy link
Copy Markdown
Member

In FlowGraphTryRegions::Build, the BBJ_EHCATCHRET check sat below the early bailout on hasTryIndex, so the catchret of an outer catch was never marking its try region as requiring runtime resumption.

Also: ensure loops that partially contain trys have their wasm-interval lengths extended to encompass any throw helpers associated with the try.

Also: fix some random extra argument added to a the overflow helper in some cases. This is all platform and has been in the code forever. On native it is somewhat harmless to pass unexpected extra args (especially if register args). On Wasm it is not.

Reminder that for Wasm control flow we can always move the end of a Wasm loop later; the extent just delineates where you can branch back to the loop head, not the actual extent of the loop. Likewise we can always move the start of a block earlier.

In FlowGraphTryRegions::Build, the BBJ_EHCATCHRET check sat below the
early bailout on hasTryIndex, so the catchret of an outer catch was
never marking its try region as requiring runtime resumption.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 10, 2026 01:50
@github-actionsgithub-actionsBot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Jun 10, 2026
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

@dotnet/jit-contrib PTAL
@davidwrighton @dotnet/wasm-contrib FYI

Fixes a dumb logic bug.

With this and #129197 I'm able to resume after catch in simple R2R methods. Haven't tested more widely yet.

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

Adjusts FlowGraphTryRegions::Build so BBJ_EHCATCHRET blocks always mark their associated “dispatching try” region as requiring runtime resumption, even when the catchret block itself has no TryIndex (e.g., outermost catch).

Changes:

  • Move the BBJ_EHCATCHRET handling before the early !block->hasTryIndex() bailout.
  • Preserve existing behavior for try-region membership/entry-edge discovery while ensuring top-level catchrets are no longer skipped.

Comment threadsrc/coreclr/jit/flowgraph.cpp
kg
kg approved these changes Jun 10, 2026
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

SPC is not crossgenning cleanly with this fix. Failure is clearly related.

throw helpers associated with the try.
Remove an unneded arg on a folded overflow throw helper call. This is
harmless on native targets but causes a sig mismatch issue for Wasm.
@JulieLeeMSFTJulieLeeMSFT added the arch-wasm WebAssembly architecture label Jun 10, 2026

@JulieLeeMSFTJulieLeeMSFT left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM. The fix extends loop intervals to the right to fully enclose try region's throw helper blocks (prevents loop/try straddle).

@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

/ba-g unrelated legs timing out

@AndyAyersMS
AndyAyersMS merged commit 7d42228 into dotnet:mainJun 11, 2026
122 of 148 checks passed
BoyBaykiller pushed a commit to BoyBaykiller/runtime that referenced this pull request Jun 11, 2026
…tion (dotnet#129205)
In FlowGraphTryRegions::Build, the BBJ_EHCATCHRET check sat below the
early bailout on hasTryIndex, so the catchret of an outer catch was
never marking its try region as requiring runtime resumption.
Also: ensure loops that partially contain trys have their wasm-interval
lengths extended to encompass any throw helpers associated with the try.
Also: fix some random extra argument added to a the overflow helper in
some cases. This is all platform and has been in the code forever. On
native it is somewhat harmless to pass unexpected extra args (especially
if register args). On Wasm it is not.
Reminder that for Wasm control flow we can always move the end of a Wasm
loop later; the extent just delineates where you can branch back to the
loop head, not the actual extent of the loop. Likewise we can always
move the start of a block earlier.
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 17, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
…tion (#129205)
In FlowGraphTryRegions::Build, the BBJ_EHCATCHRET check sat below the
early bailout on hasTryIndex, so the catchret of an outer catch was
never marking its try region as requiring runtime resumption.
Also: ensure loops that partially contain trys have their wasm-interval
lengths extended to encompass any throw helpers associated with the try.
Also: fix some random extra argument added to a the overflow helper in
some cases. This is all platform and has been in the code forever. On
native it is somewhat harmless to pass unexpected extra args (especially
if register args). On Wasm it is not.
Reminder that for Wasm control flow we can always move the end of a Wasm
loop later; the extent just delineates where you can branch back to the
loop head, not the actual extent of the loop. Likewise we can always
move the start of a block earlier.
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 18, 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.

4 participants

@AndyAyersMS@kg@JulieLeeMSFT
, '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 RyuJit]: don't skip top-level catchrets when marking try resumption - #129205

Merged
AndyAyersMS merged 2 commits into
dotnet:mainfrom
AndyAyersMS:fix-wasm-try-catch
Jun 11, 2026
Merged

[Wasm RyuJit]: don't skip top-level catchrets when marking try resumption#129205
AndyAyersMS merged 2 commits into
dotnet:mainfrom
AndyAyersMS:fix-wasm-try-catch

Conversation

@AndyAyersMS

@AndyAyersMSAndyAyersMS commented Jun 10, 2026

Copy link
Copy Markdown
Member

In FlowGraphTryRegions::Build, the BBJ_EHCATCHRET check sat below the early bailout on hasTryIndex, so the catchret of an outer catch was never marking its try region as requiring runtime resumption.

Also: ensure loops that partially contain trys have their wasm-interval lengths extended to encompass any throw helpers associated with the try.

Also: fix some random extra argument added to a the overflow helper in some cases. This is all platform and has been in the code forever. On native it is somewhat harmless to pass unexpected extra args (especially if register args). On Wasm it is not.

Reminder that for Wasm control flow we can always move the end of a Wasm loop later; the extent just delineates where you can branch back to the loop head, not the actual extent of the loop. Likewise we can always move the start of a block earlier.

In FlowGraphTryRegions::Build, the BBJ_EHCATCHRET check sat below the
early bailout on hasTryIndex, so the catchret of an outer catch was
never marking its try region as requiring runtime resumption.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 10, 2026 01:50
@github-actionsgithub-actionsBot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Jun 10, 2026
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

@dotnet/jit-contrib PTAL
@davidwrighton @dotnet/wasm-contrib FYI

Fixes a dumb logic bug.

With this and #129197 I'm able to resume after catch in simple R2R methods. Haven't tested more widely yet.

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

Adjusts FlowGraphTryRegions::Build so BBJ_EHCATCHRET blocks always mark their associated “dispatching try” region as requiring runtime resumption, even when the catchret block itself has no TryIndex (e.g., outermost catch).

Changes:

  • Move the BBJ_EHCATCHRET handling before the early !block->hasTryIndex() bailout.
  • Preserve existing behavior for try-region membership/entry-edge discovery while ensuring top-level catchrets are no longer skipped.

Comment threadsrc/coreclr/jit/flowgraph.cpp
kg
kg approved these changes Jun 10, 2026
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

SPC is not crossgenning cleanly with this fix. Failure is clearly related.

throw helpers associated with the try.
Remove an unneded arg on a folded overflow throw helper call. This is
harmless on native targets but causes a sig mismatch issue for Wasm.
@JulieLeeMSFTJulieLeeMSFT added the arch-wasm WebAssembly architecture label Jun 10, 2026

@JulieLeeMSFTJulieLeeMSFT left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM. The fix extends loop intervals to the right to fully enclose try region's throw helper blocks (prevents loop/try straddle).

@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

/ba-g unrelated legs timing out

@AndyAyersMS
AndyAyersMS merged commit 7d42228 into dotnet:mainJun 11, 2026
122 of 148 checks passed
BoyBaykiller pushed a commit to BoyBaykiller/runtime that referenced this pull request Jun 11, 2026
…tion (dotnet#129205)
In FlowGraphTryRegions::Build, the BBJ_EHCATCHRET check sat below the
early bailout on hasTryIndex, so the catchret of an outer catch was
never marking its try region as requiring runtime resumption.
Also: ensure loops that partially contain trys have their wasm-interval
lengths extended to encompass any throw helpers associated with the try.
Also: fix some random extra argument added to a the overflow helper in
some cases. This is all platform and has been in the code forever. On
native it is somewhat harmless to pass unexpected extra args (especially
if register args). On Wasm it is not.
Reminder that for Wasm control flow we can always move the end of a Wasm
loop later; the extent just delineates where you can branch back to the
loop head, not the actual extent of the loop. Likewise we can always
move the start of a block earlier.
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 17, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
…tion (#129205)
In FlowGraphTryRegions::Build, the BBJ_EHCATCHRET check sat below the
early bailout on hasTryIndex, so the catchret of an outer catch was
never marking its try region as requiring runtime resumption.
Also: ensure loops that partially contain trys have their wasm-interval
lengths extended to encompass any throw helpers associated with the try.
Also: fix some random extra argument added to a the overflow helper in
some cases. This is all platform and has been in the code forever. On
native it is somewhat harmless to pass unexpected extra args (especially
if register args). On Wasm it is not.
Reminder that for Wasm control flow we can always move the end of a Wasm
loop later; the extent just delineates where you can branch back to the
loop head, not the actual extent of the loop. Likewise we can always
move the start of a block earlier.
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 18, 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.

4 participants

@AndyAyersMS@kg@JulieLeeMSFT
, '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 RyuJit]: don't skip top-level catchrets when marking try resumption - #129205

Merged
AndyAyersMS merged 2 commits into
dotnet:mainfrom
AndyAyersMS:fix-wasm-try-catch
Jun 11, 2026
Merged

[Wasm RyuJit]: don't skip top-level catchrets when marking try resumption#129205
AndyAyersMS merged 2 commits into
dotnet:mainfrom
AndyAyersMS:fix-wasm-try-catch

Conversation

@AndyAyersMS

@AndyAyersMSAndyAyersMS commented Jun 10, 2026

Copy link
Copy Markdown
Member

In FlowGraphTryRegions::Build, the BBJ_EHCATCHRET check sat below the early bailout on hasTryIndex, so the catchret of an outer catch was never marking its try region as requiring runtime resumption.

Also: ensure loops that partially contain trys have their wasm-interval lengths extended to encompass any throw helpers associated with the try.

Also: fix some random extra argument added to a the overflow helper in some cases. This is all platform and has been in the code forever. On native it is somewhat harmless to pass unexpected extra args (especially if register args). On Wasm it is not.

Reminder that for Wasm control flow we can always move the end of a Wasm loop later; the extent just delineates where you can branch back to the loop head, not the actual extent of the loop. Likewise we can always move the start of a block earlier.

In FlowGraphTryRegions::Build, the BBJ_EHCATCHRET check sat below the
early bailout on hasTryIndex, so the catchret of an outer catch was
never marking its try region as requiring runtime resumption.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 10, 2026 01:50
@github-actionsgithub-actionsBot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Jun 10, 2026
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

@dotnet/jit-contrib PTAL
@davidwrighton @dotnet/wasm-contrib FYI

Fixes a dumb logic bug.

With this and #129197 I'm able to resume after catch in simple R2R methods. Haven't tested more widely yet.

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

Adjusts FlowGraphTryRegions::Build so BBJ_EHCATCHRET blocks always mark their associated “dispatching try” region as requiring runtime resumption, even when the catchret block itself has no TryIndex (e.g., outermost catch).

Changes:

  • Move the BBJ_EHCATCHRET handling before the early !block->hasTryIndex() bailout.
  • Preserve existing behavior for try-region membership/entry-edge discovery while ensuring top-level catchrets are no longer skipped.

Comment threadsrc/coreclr/jit/flowgraph.cpp
kg
kg approved these changes Jun 10, 2026
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

SPC is not crossgenning cleanly with this fix. Failure is clearly related.

throw helpers associated with the try.
Remove an unneded arg on a folded overflow throw helper call. This is
harmless on native targets but causes a sig mismatch issue for Wasm.
@JulieLeeMSFTJulieLeeMSFT added the arch-wasm WebAssembly architecture label Jun 10, 2026

@JulieLeeMSFTJulieLeeMSFT left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM. The fix extends loop intervals to the right to fully enclose try region's throw helper blocks (prevents loop/try straddle).

@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

/ba-g unrelated legs timing out

@AndyAyersMS
AndyAyersMS merged commit 7d42228 into dotnet:mainJun 11, 2026
122 of 148 checks passed
BoyBaykiller pushed a commit to BoyBaykiller/runtime that referenced this pull request Jun 11, 2026
…tion (dotnet#129205)
In FlowGraphTryRegions::Build, the BBJ_EHCATCHRET check sat below the
early bailout on hasTryIndex, so the catchret of an outer catch was
never marking its try region as requiring runtime resumption.
Also: ensure loops that partially contain trys have their wasm-interval
lengths extended to encompass any throw helpers associated with the try.
Also: fix some random extra argument added to a the overflow helper in
some cases. This is all platform and has been in the code forever. On
native it is somewhat harmless to pass unexpected extra args (especially
if register args). On Wasm it is not.
Reminder that for Wasm control flow we can always move the end of a Wasm
loop later; the extent just delineates where you can branch back to the
loop head, not the actual extent of the loop. Likewise we can always
move the start of a block earlier.
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 17, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
…tion (#129205)
In FlowGraphTryRegions::Build, the BBJ_EHCATCHRET check sat below the
early bailout on hasTryIndex, so the catchret of an outer catch was
never marking its try region as requiring runtime resumption.
Also: ensure loops that partially contain trys have their wasm-interval
lengths extended to encompass any throw helpers associated with the try.
Also: fix some random extra argument added to a the overflow helper in
some cases. This is all platform and has been in the code forever. On
native it is somewhat harmless to pass unexpected extra args (especially
if register args). On Wasm it is not.
Reminder that for Wasm control flow we can always move the end of a Wasm
loop later; the extent just delineates where you can branch back to the
loop head, not the actual extent of the loop. Likewise we can always
move the start of a block earlier.
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 18, 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.

4 participants

@AndyAyersMS@kg@JulieLeeMSFT
, '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 RyuJit]: don't skip top-level catchrets when marking try resumption - #129205

Merged
AndyAyersMS merged 2 commits into
dotnet:mainfrom
AndyAyersMS:fix-wasm-try-catch
Jun 11, 2026
Merged

[Wasm RyuJit]: don't skip top-level catchrets when marking try resumption#129205
AndyAyersMS merged 2 commits into
dotnet:mainfrom
AndyAyersMS:fix-wasm-try-catch

Conversation

@AndyAyersMS

@AndyAyersMSAndyAyersMS commented Jun 10, 2026

Copy link
Copy Markdown
Member

In FlowGraphTryRegions::Build, the BBJ_EHCATCHRET check sat below the early bailout on hasTryIndex, so the catchret of an outer catch was never marking its try region as requiring runtime resumption.

Also: ensure loops that partially contain trys have their wasm-interval lengths extended to encompass any throw helpers associated with the try.

Also: fix some random extra argument added to a the overflow helper in some cases. This is all platform and has been in the code forever. On native it is somewhat harmless to pass unexpected extra args (especially if register args). On Wasm it is not.

Reminder that for Wasm control flow we can always move the end of a Wasm loop later; the extent just delineates where you can branch back to the loop head, not the actual extent of the loop. Likewise we can always move the start of a block earlier.

In FlowGraphTryRegions::Build, the BBJ_EHCATCHRET check sat below the
early bailout on hasTryIndex, so the catchret of an outer catch was
never marking its try region as requiring runtime resumption.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 10, 2026 01:50
@github-actionsgithub-actionsBot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Jun 10, 2026
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

@dotnet/jit-contrib PTAL
@davidwrighton @dotnet/wasm-contrib FYI

Fixes a dumb logic bug.

With this and #129197 I'm able to resume after catch in simple R2R methods. Haven't tested more widely yet.

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

Adjusts FlowGraphTryRegions::Build so BBJ_EHCATCHRET blocks always mark their associated “dispatching try” region as requiring runtime resumption, even when the catchret block itself has no TryIndex (e.g., outermost catch).

Changes:

  • Move the BBJ_EHCATCHRET handling before the early !block->hasTryIndex() bailout.
  • Preserve existing behavior for try-region membership/entry-edge discovery while ensuring top-level catchrets are no longer skipped.

Comment threadsrc/coreclr/jit/flowgraph.cpp
kg
kg approved these changes Jun 10, 2026
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

SPC is not crossgenning cleanly with this fix. Failure is clearly related.

throw helpers associated with the try.
Remove an unneded arg on a folded overflow throw helper call. This is
harmless on native targets but causes a sig mismatch issue for Wasm.
@JulieLeeMSFTJulieLeeMSFT added the arch-wasm WebAssembly architecture label Jun 10, 2026

@JulieLeeMSFTJulieLeeMSFT left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM. The fix extends loop intervals to the right to fully enclose try region's throw helper blocks (prevents loop/try straddle).

@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

/ba-g unrelated legs timing out

@AndyAyersMS
AndyAyersMS merged commit 7d42228 into dotnet:mainJun 11, 2026
122 of 148 checks passed
BoyBaykiller pushed a commit to BoyBaykiller/runtime that referenced this pull request Jun 11, 2026
…tion (dotnet#129205)
In FlowGraphTryRegions::Build, the BBJ_EHCATCHRET check sat below the
early bailout on hasTryIndex, so the catchret of an outer catch was
never marking its try region as requiring runtime resumption.
Also: ensure loops that partially contain trys have their wasm-interval
lengths extended to encompass any throw helpers associated with the try.
Also: fix some random extra argument added to a the overflow helper in
some cases. This is all platform and has been in the code forever. On
native it is somewhat harmless to pass unexpected extra args (especially
if register args). On Wasm it is not.
Reminder that for Wasm control flow we can always move the end of a Wasm
loop later; the extent just delineates where you can branch back to the
loop head, not the actual extent of the loop. Likewise we can always
move the start of a block earlier.
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 17, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
…tion (#129205)
In FlowGraphTryRegions::Build, the BBJ_EHCATCHRET check sat below the
early bailout on hasTryIndex, so the catchret of an outer catch was
never marking its try region as requiring runtime resumption.
Also: ensure loops that partially contain trys have their wasm-interval
lengths extended to encompass any throw helpers associated with the try.
Also: fix some random extra argument added to a the overflow helper in
some cases. This is all platform and has been in the code forever. On
native it is somewhat harmless to pass unexpected extra args (especially
if register args). On Wasm it is not.
Reminder that for Wasm control flow we can always move the end of a Wasm
loop later; the extent just delineates where you can branch back to the
loop head, not the actual extent of the loop. Likewise we can always
move the start of a block earlier.
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 18, 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.

4 participants

@AndyAyersMS@kg@JulieLeeMSFT
, '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 RyuJit]: don't skip top-level catchrets when marking try resumption - #129205

Merged
AndyAyersMS merged 2 commits into
dotnet:mainfrom
AndyAyersMS:fix-wasm-try-catch
Jun 11, 2026
Merged

[Wasm RyuJit]: don't skip top-level catchrets when marking try resumption#129205
AndyAyersMS merged 2 commits into
dotnet:mainfrom
AndyAyersMS:fix-wasm-try-catch

Conversation

@AndyAyersMS

@AndyAyersMSAndyAyersMS commented Jun 10, 2026

Copy link
Copy Markdown
Member

In FlowGraphTryRegions::Build, the BBJ_EHCATCHRET check sat below the early bailout on hasTryIndex, so the catchret of an outer catch was never marking its try region as requiring runtime resumption.

Also: ensure loops that partially contain trys have their wasm-interval lengths extended to encompass any throw helpers associated with the try.

Also: fix some random extra argument added to a the overflow helper in some cases. This is all platform and has been in the code forever. On native it is somewhat harmless to pass unexpected extra args (especially if register args). On Wasm it is not.

Reminder that for Wasm control flow we can always move the end of a Wasm loop later; the extent just delineates where you can branch back to the loop head, not the actual extent of the loop. Likewise we can always move the start of a block earlier.

In FlowGraphTryRegions::Build, the BBJ_EHCATCHRET check sat below the
early bailout on hasTryIndex, so the catchret of an outer catch was
never marking its try region as requiring runtime resumption.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 10, 2026 01:50
@github-actionsgithub-actionsBot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Jun 10, 2026
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

@dotnet/jit-contrib PTAL
@davidwrighton @dotnet/wasm-contrib FYI

Fixes a dumb logic bug.

With this and #129197 I'm able to resume after catch in simple R2R methods. Haven't tested more widely yet.

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

Adjusts FlowGraphTryRegions::Build so BBJ_EHCATCHRET blocks always mark their associated “dispatching try” region as requiring runtime resumption, even when the catchret block itself has no TryIndex (e.g., outermost catch).

Changes:

  • Move the BBJ_EHCATCHRET handling before the early !block->hasTryIndex() bailout.
  • Preserve existing behavior for try-region membership/entry-edge discovery while ensuring top-level catchrets are no longer skipped.

Comment threadsrc/coreclr/jit/flowgraph.cpp
kg
kg approved these changes Jun 10, 2026
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

SPC is not crossgenning cleanly with this fix. Failure is clearly related.

throw helpers associated with the try.
Remove an unneded arg on a folded overflow throw helper call. This is
harmless on native targets but causes a sig mismatch issue for Wasm.
@JulieLeeMSFTJulieLeeMSFT added the arch-wasm WebAssembly architecture label Jun 10, 2026

@JulieLeeMSFTJulieLeeMSFT left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM. The fix extends loop intervals to the right to fully enclose try region's throw helper blocks (prevents loop/try straddle).

@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

/ba-g unrelated legs timing out

@AndyAyersMS
AndyAyersMS merged commit 7d42228 into dotnet:mainJun 11, 2026
122 of 148 checks passed
BoyBaykiller pushed a commit to BoyBaykiller/runtime that referenced this pull request Jun 11, 2026
…tion (dotnet#129205)
In FlowGraphTryRegions::Build, the BBJ_EHCATCHRET check sat below the
early bailout on hasTryIndex, so the catchret of an outer catch was
never marking its try region as requiring runtime resumption.
Also: ensure loops that partially contain trys have their wasm-interval
lengths extended to encompass any throw helpers associated with the try.
Also: fix some random extra argument added to a the overflow helper in
some cases. This is all platform and has been in the code forever. On
native it is somewhat harmless to pass unexpected extra args (especially
if register args). On Wasm it is not.
Reminder that for Wasm control flow we can always move the end of a Wasm
loop later; the extent just delineates where you can branch back to the
loop head, not the actual extent of the loop. Likewise we can always
move the start of a block earlier.
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 17, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
…tion (#129205)
In FlowGraphTryRegions::Build, the BBJ_EHCATCHRET check sat below the
early bailout on hasTryIndex, so the catchret of an outer catch was
never marking its try region as requiring runtime resumption.
Also: ensure loops that partially contain trys have their wasm-interval
lengths extended to encompass any throw helpers associated with the try.
Also: fix some random extra argument added to a the overflow helper in
some cases. This is all platform and has been in the code forever. On
native it is somewhat harmless to pass unexpected extra args (especially
if register args). On Wasm it is not.
Reminder that for Wasm control flow we can always move the end of a Wasm
loop later; the extent just delineates where you can branch back to the
loop head, not the actual extent of the loop. Likewise we can always
move the start of a block earlier.
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 18, 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.

4 participants

@AndyAyersMS@kg@JulieLeeMSFT
, '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 RyuJit]: don't skip top-level catchrets when marking try resumption - #129205

Merged
AndyAyersMS merged 2 commits into
dotnet:mainfrom
AndyAyersMS:fix-wasm-try-catch
Jun 11, 2026
Merged

[Wasm RyuJit]: don't skip top-level catchrets when marking try resumption#129205
AndyAyersMS merged 2 commits into
dotnet:mainfrom
AndyAyersMS:fix-wasm-try-catch

Conversation

@AndyAyersMS

@AndyAyersMSAndyAyersMS commented Jun 10, 2026

Copy link
Copy Markdown
Member

In FlowGraphTryRegions::Build, the BBJ_EHCATCHRET check sat below the early bailout on hasTryIndex, so the catchret of an outer catch was never marking its try region as requiring runtime resumption.

Also: ensure loops that partially contain trys have their wasm-interval lengths extended to encompass any throw helpers associated with the try.

Also: fix some random extra argument added to a the overflow helper in some cases. This is all platform and has been in the code forever. On native it is somewhat harmless to pass unexpected extra args (especially if register args). On Wasm it is not.

Reminder that for Wasm control flow we can always move the end of a Wasm loop later; the extent just delineates where you can branch back to the loop head, not the actual extent of the loop. Likewise we can always move the start of a block earlier.

In FlowGraphTryRegions::Build, the BBJ_EHCATCHRET check sat below the
early bailout on hasTryIndex, so the catchret of an outer catch was
never marking its try region as requiring runtime resumption.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 10, 2026 01:50
@github-actionsgithub-actionsBot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Jun 10, 2026
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

@dotnet/jit-contrib PTAL
@davidwrighton @dotnet/wasm-contrib FYI

Fixes a dumb logic bug.

With this and #129197 I'm able to resume after catch in simple R2R methods. Haven't tested more widely yet.

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

Adjusts FlowGraphTryRegions::Build so BBJ_EHCATCHRET blocks always mark their associated “dispatching try” region as requiring runtime resumption, even when the catchret block itself has no TryIndex (e.g., outermost catch).

Changes:

  • Move the BBJ_EHCATCHRET handling before the early !block->hasTryIndex() bailout.
  • Preserve existing behavior for try-region membership/entry-edge discovery while ensuring top-level catchrets are no longer skipped.

Comment threadsrc/coreclr/jit/flowgraph.cpp
kg
kg approved these changes Jun 10, 2026
@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

SPC is not crossgenning cleanly with this fix. Failure is clearly related.

throw helpers associated with the try.
Remove an unneded arg on a folded overflow throw helper call. This is
harmless on native targets but causes a sig mismatch issue for Wasm.
@JulieLeeMSFTJulieLeeMSFT added the arch-wasm WebAssembly architecture label Jun 10, 2026

@JulieLeeMSFTJulieLeeMSFT left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM. The fix extends loop intervals to the right to fully enclose try region's throw helper blocks (prevents loop/try straddle).

@AndyAyersMS

Copy link
Copy Markdown
MemberAuthor

/ba-g unrelated legs timing out

@AndyAyersMS
AndyAyersMS merged commit 7d42228 into dotnet:mainJun 11, 2026
122 of 148 checks passed
BoyBaykiller pushed a commit to BoyBaykiller/runtime that referenced this pull request Jun 11, 2026
…tion (dotnet#129205)
In FlowGraphTryRegions::Build, the BBJ_EHCATCHRET check sat below the
early bailout on hasTryIndex, so the catchret of an outer catch was
never marking its try region as requiring runtime resumption.
Also: ensure loops that partially contain trys have their wasm-interval
lengths extended to encompass any throw helpers associated with the try.
Also: fix some random extra argument added to a the overflow helper in
some cases. This is all platform and has been in the code forever. On
native it is somewhat harmless to pass unexpected extra args (especially
if register args). On Wasm it is not.
Reminder that for Wasm control flow we can always move the end of a Wasm
loop later; the extent just delineates where you can branch back to the
loop head, not the actual extent of the loop. Likewise we can always
move the start of a block earlier.
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 17, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
…tion (#129205)
In FlowGraphTryRegions::Build, the BBJ_EHCATCHRET check sat below the
early bailout on hasTryIndex, so the catchret of an outer catch was
never marking its try region as requiring runtime resumption.
Also: ensure loops that partially contain trys have their wasm-interval
lengths extended to encompass any throw helpers associated with the try.
Also: fix some random extra argument added to a the overflow helper in
some cases. This is all platform and has been in the code forever. On
native it is somewhat harmless to pass unexpected extra args (especially
if register args). On Wasm it is not.
Reminder that for Wasm control flow we can always move the end of a Wasm
loop later; the extent just delineates where you can branch back to the
loop head, not the actual extent of the loop. Likewise we can always
move the start of a block earlier.
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 18, 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.

4 participants

@AndyAyersMS@kg@JulieLeeMSFT