JIT: Write up general runtime async inlining details - #127800

Closed
jakobbotsch wants to merge 3 commits into
dotnet:mainfrom
jakobbotsch:runtime-async-inlining-writeup
Closed

JIT: Write up general runtime async inlining details#127800
jakobbotsch wants to merge 3 commits into
dotnet:mainfrom
jakobbotsch:runtime-async-inlining-writeup

Conversation

@jakobbotsch

@jakobbotschjakobbotsch commented May 5, 2026

Copy link
Copy Markdown
Member

I expect to work on general inlining for runtime async over the next few weeks. This document writes down my thoughts around what needs to happen in the inlined code.

Mostly this is low level details for my own sake, but still cc @agocke@AndyAyersMS@VSadov@stephentoub.

Contributes to #127865

CopilotAI review requested due to automatic review settings May 5, 2026 15:10
@github-actionsgithub-actionsBot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label May 5, 2026

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

Adds a new JIT design document that captures the proposed semantics for general runtime-async inlining. The doc is meant to guide future implementation work by spelling out how suspension, resumption, context flow, and exception handling would need to behave when async callees are inlined.

Changes:

  • Introduces a new design note for preserving ExecutionContext and continuation-context behavior across inlined runtime-async calls.
  • Describes a proposed resumed_* model and post-inline IR needed to reconstruct logical async returns.
  • Adds worked examples covering synchronization-context and AsyncLocal behavior.

Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md
Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md Outdated
Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md Outdated
Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md Outdated
@github-actions

github-actionsBot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Workflow state for the Holistic Review Orchestrator.

{
"version": 5,
"last_dispatched_commit": "e64be6c86e4555a9b9df369f212414e61af1a2a1",
"last_dispatched_base_ref": "main",
"last_dispatched_base_sha": "004c358f4376950ead5ef31b95bf4f91a725b42a",
"last_reviewed_commit": "e64be6c86e4555a9b9df369f212414e61af1a2a1",
"last_reviewed_base_ref": "main",
"last_reviewed_base_sha": "004c358f4376950ead5ef31b95bf4f91a725b42a",
"last_recorded_worker_run_id": "29675329919",
"review_attempt_commit": "",
"review_attempt_base_ref": "",
"review_attempt_count": 0,
"max_review_attempts": 5,
"review_history_format": "holistic-review-disclosure-v1",
"review_history": [
{
"commit": "e64be6c86e4555a9b9df369f212414e61af1a2a1",
"review_id": 4730522467
}
]
}

@github-actionsgithub-actionsBot 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.

Holistic Review

Motivation: The author (jakobbotsch) is about to implement general inlining of runtime async calls in the JIT and wants to write down the design challenges and intended approach. This is a documentation-only PR adding docs/design/coreclr/jit/runtime-async-inlining.md; it contributes to #127865 and serves as a design record for reviewers (cc'd) and the author.

Approach: A single 342-line Markdown design doc. It establishes background (await/call-site vs. callee behaviors, the context save/restore contract, and the relevant AsyncHelpers/getAsyncInfo helpers), then works through the hard cases of inlining: suspending inside an inlinee, resuming inside an inlinee, synchronous context save/restore, computing per-frame resumed_F flags, representing post-inline IR (introducing a GT_CONTINUATION_FIELD_OFFSET node whose offset is filled in during the async transformation), exception handling in the post-inline IR, and initial scope restrictions (only inline callees that provably never suspend; skip suspend-capable calls in try clauses). Two worked examples illustrate SynchronizationContext switching and AsyncLocal/ExecutionContext restoration.

Summary: As a design document this is clear, internally consistent, and appropriately scoped. It correctly captures the subtle invariants (e.g. resumed_C implies resumed_B implies resumed_A, single-continuation reuse enabling the else branches to keep prior captures, and the reliance on constant propagation to eliminate cruft for non-suspending inlinees). There is no code or test impact, so there is nothing to build or run. I found only two minor, non-blocking documentation issues, filed inline: (1) the trailing prose in the final example is trapped inside a csharp code fence and will render as code rather than text, and (2) a small typo ("progesses"). Neither affects the technical content. LGTM as a design note.

Detailed Findings

Both findings are inline and minor/non-blocking:

  • Unclosed/mis-scoped code fence around the final example's explanatory text (docs/design/coreclr/jit/runtime-async-inlining.md, lines 317-342) causes narrative prose to render as C#.
  • Typo "progesses" -> "progresses" (line 150).

Additional non-actionable observation (not filed inline): line 240 has a minor grammatical slip ("the async infrastructures catches"), which the author may wish to tidy but does not affect meaning.

Note

This review was generated by this repository's Holistic Review agentic workflow to complement the built-in Copilot review.

Generated by Holistic Review · 53.6 AIC · ⌖ 10.5 AIC · ⊞ 10K

Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md
Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md Outdated
CopilotAI review requested due to automatic review settings July 27, 2026 11:38
@jakobbotsch

Copy link
Copy Markdown
MemberAuthor

@davidwrighton I know you gave this some thought yourself. Do you have any feedback or thoughts on the design here?

@dotnet/jit-contrib I would similarly appreciate any feedback or thoughts.

Would like to get this merged. Alternatively I can also wait and merge it together with the actual implementation.

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 1 out of 1 changed files in this pull request and generated 5 comments.

Rather, the existing `B` continuation would be linked to the newly created `C` continuation by async infrastructure.
It would maintain its values from the time we suspended in `C` with `!resumed_C`.

The take away is that the suspension for the inlined `Task.Yield()` needs to roughly accomplish the following, in addition to storing its normal state:
### Exceptions

Inlined functions can finish by throwing exceptions too.
Under normal circumstances the async infrastructures catches the exception and looks for the next continuation that may handle the exception.
It would maintain its values from the time we suspended in `C` with `!resumed_C`.

The take away is that the suspension for the inlined `Task.Yield()` needs to roughly accomplish the following, in addition to storing its normal state:
```csharp

Correct handling requires catching the possible exception and then rethrowing it in the post-inline IR.
The expansion for calls in try clauses would look roughly like:
```csharp

- `Foo()` runs in the ambient synchronization context but switches its own synchronization context before awaiting `Bar()`. Its continuation captures `_syncContext1` as the continuation context.
- `Bar()` also switches its own synchronization context before awaiting `Baz()`. Its continuation captures `_syncContext2` as the continuation context.
- `Baz()` always suspends, switching onto a thread pool thread. No continuation context is captured for custom awaitables.
@jakobbotschjakobbotsch added this to the 11.0.0 milestone Jul 30, 2026
@JulieLeeMSFTJulieLeeMSFT added the Priority:1 Work that is critical for the release, but we could probably ship without label Jul 30, 2026
@jakobbotsch

Copy link
Copy Markdown
MemberAuthor

Let's do this as part of #131538

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMIPriority:1Work that is critical for the release, but we could probably ship without

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jakobbotsch@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

JIT: Write up general runtime async inlining details - #127800

Closed
jakobbotsch wants to merge 3 commits into
dotnet:mainfrom
jakobbotsch:runtime-async-inlining-writeup
Closed

JIT: Write up general runtime async inlining details#127800
jakobbotsch wants to merge 3 commits into
dotnet:mainfrom
jakobbotsch:runtime-async-inlining-writeup

Conversation

@jakobbotsch

@jakobbotschjakobbotsch commented May 5, 2026

Copy link
Copy Markdown
Member

I expect to work on general inlining for runtime async over the next few weeks. This document writes down my thoughts around what needs to happen in the inlined code.

Mostly this is low level details for my own sake, but still cc @agocke@AndyAyersMS@VSadov@stephentoub.

Contributes to #127865

CopilotAI review requested due to automatic review settings May 5, 2026 15:10
@github-actionsgithub-actionsBot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label May 5, 2026

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

Adds a new JIT design document that captures the proposed semantics for general runtime-async inlining. The doc is meant to guide future implementation work by spelling out how suspension, resumption, context flow, and exception handling would need to behave when async callees are inlined.

Changes:

  • Introduces a new design note for preserving ExecutionContext and continuation-context behavior across inlined runtime-async calls.
  • Describes a proposed resumed_* model and post-inline IR needed to reconstruct logical async returns.
  • Adds worked examples covering synchronization-context and AsyncLocal behavior.

Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md
Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md Outdated
Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md Outdated
Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md Outdated
@github-actions

github-actionsBot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Workflow state for the Holistic Review Orchestrator.

{
"version": 5,
"last_dispatched_commit": "e64be6c86e4555a9b9df369f212414e61af1a2a1",
"last_dispatched_base_ref": "main",
"last_dispatched_base_sha": "004c358f4376950ead5ef31b95bf4f91a725b42a",
"last_reviewed_commit": "e64be6c86e4555a9b9df369f212414e61af1a2a1",
"last_reviewed_base_ref": "main",
"last_reviewed_base_sha": "004c358f4376950ead5ef31b95bf4f91a725b42a",
"last_recorded_worker_run_id": "29675329919",
"review_attempt_commit": "",
"review_attempt_base_ref": "",
"review_attempt_count": 0,
"max_review_attempts": 5,
"review_history_format": "holistic-review-disclosure-v1",
"review_history": [
{
"commit": "e64be6c86e4555a9b9df369f212414e61af1a2a1",
"review_id": 4730522467
}
]
}

@github-actionsgithub-actionsBot 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.

Holistic Review

Motivation: The author (jakobbotsch) is about to implement general inlining of runtime async calls in the JIT and wants to write down the design challenges and intended approach. This is a documentation-only PR adding docs/design/coreclr/jit/runtime-async-inlining.md; it contributes to #127865 and serves as a design record for reviewers (cc'd) and the author.

Approach: A single 342-line Markdown design doc. It establishes background (await/call-site vs. callee behaviors, the context save/restore contract, and the relevant AsyncHelpers/getAsyncInfo helpers), then works through the hard cases of inlining: suspending inside an inlinee, resuming inside an inlinee, synchronous context save/restore, computing per-frame resumed_F flags, representing post-inline IR (introducing a GT_CONTINUATION_FIELD_OFFSET node whose offset is filled in during the async transformation), exception handling in the post-inline IR, and initial scope restrictions (only inline callees that provably never suspend; skip suspend-capable calls in try clauses). Two worked examples illustrate SynchronizationContext switching and AsyncLocal/ExecutionContext restoration.

Summary: As a design document this is clear, internally consistent, and appropriately scoped. It correctly captures the subtle invariants (e.g. resumed_C implies resumed_B implies resumed_A, single-continuation reuse enabling the else branches to keep prior captures, and the reliance on constant propagation to eliminate cruft for non-suspending inlinees). There is no code or test impact, so there is nothing to build or run. I found only two minor, non-blocking documentation issues, filed inline: (1) the trailing prose in the final example is trapped inside a csharp code fence and will render as code rather than text, and (2) a small typo ("progesses"). Neither affects the technical content. LGTM as a design note.

Detailed Findings

Both findings are inline and minor/non-blocking:

  • Unclosed/mis-scoped code fence around the final example's explanatory text (docs/design/coreclr/jit/runtime-async-inlining.md, lines 317-342) causes narrative prose to render as C#.
  • Typo "progesses" -> "progresses" (line 150).

Additional non-actionable observation (not filed inline): line 240 has a minor grammatical slip ("the async infrastructures catches"), which the author may wish to tidy but does not affect meaning.

Note

This review was generated by this repository's Holistic Review agentic workflow to complement the built-in Copilot review.

Generated by Holistic Review · 53.6 AIC · ⌖ 10.5 AIC · ⊞ 10K

Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md
Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md Outdated
CopilotAI review requested due to automatic review settings July 27, 2026 11:38
@jakobbotsch

Copy link
Copy Markdown
MemberAuthor

@davidwrighton I know you gave this some thought yourself. Do you have any feedback or thoughts on the design here?

@dotnet/jit-contrib I would similarly appreciate any feedback or thoughts.

Would like to get this merged. Alternatively I can also wait and merge it together with the actual implementation.

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 1 out of 1 changed files in this pull request and generated 5 comments.

Rather, the existing `B` continuation would be linked to the newly created `C` continuation by async infrastructure.
It would maintain its values from the time we suspended in `C` with `!resumed_C`.

The take away is that the suspension for the inlined `Task.Yield()` needs to roughly accomplish the following, in addition to storing its normal state:
### Exceptions

Inlined functions can finish by throwing exceptions too.
Under normal circumstances the async infrastructures catches the exception and looks for the next continuation that may handle the exception.
It would maintain its values from the time we suspended in `C` with `!resumed_C`.

The take away is that the suspension for the inlined `Task.Yield()` needs to roughly accomplish the following, in addition to storing its normal state:
```csharp

Correct handling requires catching the possible exception and then rethrowing it in the post-inline IR.
The expansion for calls in try clauses would look roughly like:
```csharp

- `Foo()` runs in the ambient synchronization context but switches its own synchronization context before awaiting `Bar()`. Its continuation captures `_syncContext1` as the continuation context.
- `Bar()` also switches its own synchronization context before awaiting `Baz()`. Its continuation captures `_syncContext2` as the continuation context.
- `Baz()` always suspends, switching onto a thread pool thread. No continuation context is captured for custom awaitables.
@jakobbotschjakobbotsch added this to the 11.0.0 milestone Jul 30, 2026
@JulieLeeMSFTJulieLeeMSFT added the Priority:1 Work that is critical for the release, but we could probably ship without label Jul 30, 2026
@jakobbotsch

Copy link
Copy Markdown
MemberAuthor

Let's do this as part of #131538

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMIPriority:1Work that is critical for the release, but we could probably ship without

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jakobbotsch@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

JIT: Write up general runtime async inlining details - #127800

Closed
jakobbotsch wants to merge 3 commits into
dotnet:mainfrom
jakobbotsch:runtime-async-inlining-writeup
Closed

JIT: Write up general runtime async inlining details#127800
jakobbotsch wants to merge 3 commits into
dotnet:mainfrom
jakobbotsch:runtime-async-inlining-writeup

Conversation

@jakobbotsch

@jakobbotschjakobbotsch commented May 5, 2026

Copy link
Copy Markdown
Member

I expect to work on general inlining for runtime async over the next few weeks. This document writes down my thoughts around what needs to happen in the inlined code.

Mostly this is low level details for my own sake, but still cc @agocke@AndyAyersMS@VSadov@stephentoub.

Contributes to #127865

CopilotAI review requested due to automatic review settings May 5, 2026 15:10
@github-actionsgithub-actionsBot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label May 5, 2026

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

Adds a new JIT design document that captures the proposed semantics for general runtime-async inlining. The doc is meant to guide future implementation work by spelling out how suspension, resumption, context flow, and exception handling would need to behave when async callees are inlined.

Changes:

  • Introduces a new design note for preserving ExecutionContext and continuation-context behavior across inlined runtime-async calls.
  • Describes a proposed resumed_* model and post-inline IR needed to reconstruct logical async returns.
  • Adds worked examples covering synchronization-context and AsyncLocal behavior.

Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md
Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md Outdated
Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md Outdated
Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md Outdated
@github-actions

github-actionsBot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Workflow state for the Holistic Review Orchestrator.

{
"version": 5,
"last_dispatched_commit": "e64be6c86e4555a9b9df369f212414e61af1a2a1",
"last_dispatched_base_ref": "main",
"last_dispatched_base_sha": "004c358f4376950ead5ef31b95bf4f91a725b42a",
"last_reviewed_commit": "e64be6c86e4555a9b9df369f212414e61af1a2a1",
"last_reviewed_base_ref": "main",
"last_reviewed_base_sha": "004c358f4376950ead5ef31b95bf4f91a725b42a",
"last_recorded_worker_run_id": "29675329919",
"review_attempt_commit": "",
"review_attempt_base_ref": "",
"review_attempt_count": 0,
"max_review_attempts": 5,
"review_history_format": "holistic-review-disclosure-v1",
"review_history": [
{
"commit": "e64be6c86e4555a9b9df369f212414e61af1a2a1",
"review_id": 4730522467
}
]
}

@github-actionsgithub-actionsBot 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.

Holistic Review

Motivation: The author (jakobbotsch) is about to implement general inlining of runtime async calls in the JIT and wants to write down the design challenges and intended approach. This is a documentation-only PR adding docs/design/coreclr/jit/runtime-async-inlining.md; it contributes to #127865 and serves as a design record for reviewers (cc'd) and the author.

Approach: A single 342-line Markdown design doc. It establishes background (await/call-site vs. callee behaviors, the context save/restore contract, and the relevant AsyncHelpers/getAsyncInfo helpers), then works through the hard cases of inlining: suspending inside an inlinee, resuming inside an inlinee, synchronous context save/restore, computing per-frame resumed_F flags, representing post-inline IR (introducing a GT_CONTINUATION_FIELD_OFFSET node whose offset is filled in during the async transformation), exception handling in the post-inline IR, and initial scope restrictions (only inline callees that provably never suspend; skip suspend-capable calls in try clauses). Two worked examples illustrate SynchronizationContext switching and AsyncLocal/ExecutionContext restoration.

Summary: As a design document this is clear, internally consistent, and appropriately scoped. It correctly captures the subtle invariants (e.g. resumed_C implies resumed_B implies resumed_A, single-continuation reuse enabling the else branches to keep prior captures, and the reliance on constant propagation to eliminate cruft for non-suspending inlinees). There is no code or test impact, so there is nothing to build or run. I found only two minor, non-blocking documentation issues, filed inline: (1) the trailing prose in the final example is trapped inside a csharp code fence and will render as code rather than text, and (2) a small typo ("progesses"). Neither affects the technical content. LGTM as a design note.

Detailed Findings

Both findings are inline and minor/non-blocking:

  • Unclosed/mis-scoped code fence around the final example's explanatory text (docs/design/coreclr/jit/runtime-async-inlining.md, lines 317-342) causes narrative prose to render as C#.
  • Typo "progesses" -> "progresses" (line 150).

Additional non-actionable observation (not filed inline): line 240 has a minor grammatical slip ("the async infrastructures catches"), which the author may wish to tidy but does not affect meaning.

Note

This review was generated by this repository's Holistic Review agentic workflow to complement the built-in Copilot review.

Generated by Holistic Review · 53.6 AIC · ⌖ 10.5 AIC · ⊞ 10K

Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md
Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md Outdated
CopilotAI review requested due to automatic review settings July 27, 2026 11:38
@jakobbotsch

Copy link
Copy Markdown
MemberAuthor

@davidwrighton I know you gave this some thought yourself. Do you have any feedback or thoughts on the design here?

@dotnet/jit-contrib I would similarly appreciate any feedback or thoughts.

Would like to get this merged. Alternatively I can also wait and merge it together with the actual implementation.

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 1 out of 1 changed files in this pull request and generated 5 comments.

Rather, the existing `B` continuation would be linked to the newly created `C` continuation by async infrastructure.
It would maintain its values from the time we suspended in `C` with `!resumed_C`.

The take away is that the suspension for the inlined `Task.Yield()` needs to roughly accomplish the following, in addition to storing its normal state:
### Exceptions

Inlined functions can finish by throwing exceptions too.
Under normal circumstances the async infrastructures catches the exception and looks for the next continuation that may handle the exception.
It would maintain its values from the time we suspended in `C` with `!resumed_C`.

The take away is that the suspension for the inlined `Task.Yield()` needs to roughly accomplish the following, in addition to storing its normal state:
```csharp

Correct handling requires catching the possible exception and then rethrowing it in the post-inline IR.
The expansion for calls in try clauses would look roughly like:
```csharp

- `Foo()` runs in the ambient synchronization context but switches its own synchronization context before awaiting `Bar()`. Its continuation captures `_syncContext1` as the continuation context.
- `Bar()` also switches its own synchronization context before awaiting `Baz()`. Its continuation captures `_syncContext2` as the continuation context.
- `Baz()` always suspends, switching onto a thread pool thread. No continuation context is captured for custom awaitables.
@jakobbotschjakobbotsch added this to the 11.0.0 milestone Jul 30, 2026
@JulieLeeMSFTJulieLeeMSFT added the Priority:1 Work that is critical for the release, but we could probably ship without label Jul 30, 2026
@jakobbotsch

Copy link
Copy Markdown
MemberAuthor

Let's do this as part of #131538

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMIPriority:1Work that is critical for the release, but we could probably ship without

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jakobbotsch@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

JIT: Write up general runtime async inlining details - #127800

Closed
jakobbotsch wants to merge 3 commits into
dotnet:mainfrom
jakobbotsch:runtime-async-inlining-writeup
Closed

JIT: Write up general runtime async inlining details#127800
jakobbotsch wants to merge 3 commits into
dotnet:mainfrom
jakobbotsch:runtime-async-inlining-writeup

Conversation

@jakobbotsch

@jakobbotschjakobbotsch commented May 5, 2026

Copy link
Copy Markdown
Member

I expect to work on general inlining for runtime async over the next few weeks. This document writes down my thoughts around what needs to happen in the inlined code.

Mostly this is low level details for my own sake, but still cc @agocke@AndyAyersMS@VSadov@stephentoub.

Contributes to #127865

CopilotAI review requested due to automatic review settings May 5, 2026 15:10
@github-actionsgithub-actionsBot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label May 5, 2026

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

Adds a new JIT design document that captures the proposed semantics for general runtime-async inlining. The doc is meant to guide future implementation work by spelling out how suspension, resumption, context flow, and exception handling would need to behave when async callees are inlined.

Changes:

  • Introduces a new design note for preserving ExecutionContext and continuation-context behavior across inlined runtime-async calls.
  • Describes a proposed resumed_* model and post-inline IR needed to reconstruct logical async returns.
  • Adds worked examples covering synchronization-context and AsyncLocal behavior.

Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md
Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md Outdated
Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md Outdated
Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md Outdated
@github-actions

github-actionsBot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Workflow state for the Holistic Review Orchestrator.

{
"version": 5,
"last_dispatched_commit": "e64be6c86e4555a9b9df369f212414e61af1a2a1",
"last_dispatched_base_ref": "main",
"last_dispatched_base_sha": "004c358f4376950ead5ef31b95bf4f91a725b42a",
"last_reviewed_commit": "e64be6c86e4555a9b9df369f212414e61af1a2a1",
"last_reviewed_base_ref": "main",
"last_reviewed_base_sha": "004c358f4376950ead5ef31b95bf4f91a725b42a",
"last_recorded_worker_run_id": "29675329919",
"review_attempt_commit": "",
"review_attempt_base_ref": "",
"review_attempt_count": 0,
"max_review_attempts": 5,
"review_history_format": "holistic-review-disclosure-v1",
"review_history": [
{
"commit": "e64be6c86e4555a9b9df369f212414e61af1a2a1",
"review_id": 4730522467
}
]
}

@github-actionsgithub-actionsBot 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.

Holistic Review

Motivation: The author (jakobbotsch) is about to implement general inlining of runtime async calls in the JIT and wants to write down the design challenges and intended approach. This is a documentation-only PR adding docs/design/coreclr/jit/runtime-async-inlining.md; it contributes to #127865 and serves as a design record for reviewers (cc'd) and the author.

Approach: A single 342-line Markdown design doc. It establishes background (await/call-site vs. callee behaviors, the context save/restore contract, and the relevant AsyncHelpers/getAsyncInfo helpers), then works through the hard cases of inlining: suspending inside an inlinee, resuming inside an inlinee, synchronous context save/restore, computing per-frame resumed_F flags, representing post-inline IR (introducing a GT_CONTINUATION_FIELD_OFFSET node whose offset is filled in during the async transformation), exception handling in the post-inline IR, and initial scope restrictions (only inline callees that provably never suspend; skip suspend-capable calls in try clauses). Two worked examples illustrate SynchronizationContext switching and AsyncLocal/ExecutionContext restoration.

Summary: As a design document this is clear, internally consistent, and appropriately scoped. It correctly captures the subtle invariants (e.g. resumed_C implies resumed_B implies resumed_A, single-continuation reuse enabling the else branches to keep prior captures, and the reliance on constant propagation to eliminate cruft for non-suspending inlinees). There is no code or test impact, so there is nothing to build or run. I found only two minor, non-blocking documentation issues, filed inline: (1) the trailing prose in the final example is trapped inside a csharp code fence and will render as code rather than text, and (2) a small typo ("progesses"). Neither affects the technical content. LGTM as a design note.

Detailed Findings

Both findings are inline and minor/non-blocking:

  • Unclosed/mis-scoped code fence around the final example's explanatory text (docs/design/coreclr/jit/runtime-async-inlining.md, lines 317-342) causes narrative prose to render as C#.
  • Typo "progesses" -> "progresses" (line 150).

Additional non-actionable observation (not filed inline): line 240 has a minor grammatical slip ("the async infrastructures catches"), which the author may wish to tidy but does not affect meaning.

Note

This review was generated by this repository's Holistic Review agentic workflow to complement the built-in Copilot review.

Generated by Holistic Review · 53.6 AIC · ⌖ 10.5 AIC · ⊞ 10K

Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md
Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md Outdated
CopilotAI review requested due to automatic review settings July 27, 2026 11:38
@jakobbotsch

Copy link
Copy Markdown
MemberAuthor

@davidwrighton I know you gave this some thought yourself. Do you have any feedback or thoughts on the design here?

@dotnet/jit-contrib I would similarly appreciate any feedback or thoughts.

Would like to get this merged. Alternatively I can also wait and merge it together with the actual implementation.

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 1 out of 1 changed files in this pull request and generated 5 comments.

Rather, the existing `B` continuation would be linked to the newly created `C` continuation by async infrastructure.
It would maintain its values from the time we suspended in `C` with `!resumed_C`.

The take away is that the suspension for the inlined `Task.Yield()` needs to roughly accomplish the following, in addition to storing its normal state:
### Exceptions

Inlined functions can finish by throwing exceptions too.
Under normal circumstances the async infrastructures catches the exception and looks for the next continuation that may handle the exception.
It would maintain its values from the time we suspended in `C` with `!resumed_C`.

The take away is that the suspension for the inlined `Task.Yield()` needs to roughly accomplish the following, in addition to storing its normal state:
```csharp

Correct handling requires catching the possible exception and then rethrowing it in the post-inline IR.
The expansion for calls in try clauses would look roughly like:
```csharp

- `Foo()` runs in the ambient synchronization context but switches its own synchronization context before awaiting `Bar()`. Its continuation captures `_syncContext1` as the continuation context.
- `Bar()` also switches its own synchronization context before awaiting `Baz()`. Its continuation captures `_syncContext2` as the continuation context.
- `Baz()` always suspends, switching onto a thread pool thread. No continuation context is captured for custom awaitables.
@jakobbotschjakobbotsch added this to the 11.0.0 milestone Jul 30, 2026
@JulieLeeMSFTJulieLeeMSFT added the Priority:1 Work that is critical for the release, but we could probably ship without label Jul 30, 2026
@jakobbotsch

Copy link
Copy Markdown
MemberAuthor

Let's do this as part of #131538

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMIPriority:1Work that is critical for the release, but we could probably ship without

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jakobbotsch@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

JIT: Write up general runtime async inlining details - #127800

Closed
jakobbotsch wants to merge 3 commits into
dotnet:mainfrom
jakobbotsch:runtime-async-inlining-writeup
Closed

JIT: Write up general runtime async inlining details#127800
jakobbotsch wants to merge 3 commits into
dotnet:mainfrom
jakobbotsch:runtime-async-inlining-writeup

Conversation

@jakobbotsch

@jakobbotschjakobbotsch commented May 5, 2026

Copy link
Copy Markdown
Member

I expect to work on general inlining for runtime async over the next few weeks. This document writes down my thoughts around what needs to happen in the inlined code.

Mostly this is low level details for my own sake, but still cc @agocke@AndyAyersMS@VSadov@stephentoub.

Contributes to #127865

CopilotAI review requested due to automatic review settings May 5, 2026 15:10
@github-actionsgithub-actionsBot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label May 5, 2026

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

Adds a new JIT design document that captures the proposed semantics for general runtime-async inlining. The doc is meant to guide future implementation work by spelling out how suspension, resumption, context flow, and exception handling would need to behave when async callees are inlined.

Changes:

  • Introduces a new design note for preserving ExecutionContext and continuation-context behavior across inlined runtime-async calls.
  • Describes a proposed resumed_* model and post-inline IR needed to reconstruct logical async returns.
  • Adds worked examples covering synchronization-context and AsyncLocal behavior.

Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md
Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md Outdated
Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md Outdated
Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md Outdated
@github-actions

github-actionsBot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Workflow state for the Holistic Review Orchestrator.

{
"version": 5,
"last_dispatched_commit": "e64be6c86e4555a9b9df369f212414e61af1a2a1",
"last_dispatched_base_ref": "main",
"last_dispatched_base_sha": "004c358f4376950ead5ef31b95bf4f91a725b42a",
"last_reviewed_commit": "e64be6c86e4555a9b9df369f212414e61af1a2a1",
"last_reviewed_base_ref": "main",
"last_reviewed_base_sha": "004c358f4376950ead5ef31b95bf4f91a725b42a",
"last_recorded_worker_run_id": "29675329919",
"review_attempt_commit": "",
"review_attempt_base_ref": "",
"review_attempt_count": 0,
"max_review_attempts": 5,
"review_history_format": "holistic-review-disclosure-v1",
"review_history": [
{
"commit": "e64be6c86e4555a9b9df369f212414e61af1a2a1",
"review_id": 4730522467
}
]
}

@github-actionsgithub-actionsBot 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.

Holistic Review

Motivation: The author (jakobbotsch) is about to implement general inlining of runtime async calls in the JIT and wants to write down the design challenges and intended approach. This is a documentation-only PR adding docs/design/coreclr/jit/runtime-async-inlining.md; it contributes to #127865 and serves as a design record for reviewers (cc'd) and the author.

Approach: A single 342-line Markdown design doc. It establishes background (await/call-site vs. callee behaviors, the context save/restore contract, and the relevant AsyncHelpers/getAsyncInfo helpers), then works through the hard cases of inlining: suspending inside an inlinee, resuming inside an inlinee, synchronous context save/restore, computing per-frame resumed_F flags, representing post-inline IR (introducing a GT_CONTINUATION_FIELD_OFFSET node whose offset is filled in during the async transformation), exception handling in the post-inline IR, and initial scope restrictions (only inline callees that provably never suspend; skip suspend-capable calls in try clauses). Two worked examples illustrate SynchronizationContext switching and AsyncLocal/ExecutionContext restoration.

Summary: As a design document this is clear, internally consistent, and appropriately scoped. It correctly captures the subtle invariants (e.g. resumed_C implies resumed_B implies resumed_A, single-continuation reuse enabling the else branches to keep prior captures, and the reliance on constant propagation to eliminate cruft for non-suspending inlinees). There is no code or test impact, so there is nothing to build or run. I found only two minor, non-blocking documentation issues, filed inline: (1) the trailing prose in the final example is trapped inside a csharp code fence and will render as code rather than text, and (2) a small typo ("progesses"). Neither affects the technical content. LGTM as a design note.

Detailed Findings

Both findings are inline and minor/non-blocking:

  • Unclosed/mis-scoped code fence around the final example's explanatory text (docs/design/coreclr/jit/runtime-async-inlining.md, lines 317-342) causes narrative prose to render as C#.
  • Typo "progesses" -> "progresses" (line 150).

Additional non-actionable observation (not filed inline): line 240 has a minor grammatical slip ("the async infrastructures catches"), which the author may wish to tidy but does not affect meaning.

Note

This review was generated by this repository's Holistic Review agentic workflow to complement the built-in Copilot review.

Generated by Holistic Review · 53.6 AIC · ⌖ 10.5 AIC · ⊞ 10K

Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md
Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md Outdated
CopilotAI review requested due to automatic review settings July 27, 2026 11:38
@jakobbotsch

Copy link
Copy Markdown
MemberAuthor

@davidwrighton I know you gave this some thought yourself. Do you have any feedback or thoughts on the design here?

@dotnet/jit-contrib I would similarly appreciate any feedback or thoughts.

Would like to get this merged. Alternatively I can also wait and merge it together with the actual implementation.

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 1 out of 1 changed files in this pull request and generated 5 comments.

Rather, the existing `B` continuation would be linked to the newly created `C` continuation by async infrastructure.
It would maintain its values from the time we suspended in `C` with `!resumed_C`.

The take away is that the suspension for the inlined `Task.Yield()` needs to roughly accomplish the following, in addition to storing its normal state:
### Exceptions

Inlined functions can finish by throwing exceptions too.
Under normal circumstances the async infrastructures catches the exception and looks for the next continuation that may handle the exception.
It would maintain its values from the time we suspended in `C` with `!resumed_C`.

The take away is that the suspension for the inlined `Task.Yield()` needs to roughly accomplish the following, in addition to storing its normal state:
```csharp

Correct handling requires catching the possible exception and then rethrowing it in the post-inline IR.
The expansion for calls in try clauses would look roughly like:
```csharp

- `Foo()` runs in the ambient synchronization context but switches its own synchronization context before awaiting `Bar()`. Its continuation captures `_syncContext1` as the continuation context.
- `Bar()` also switches its own synchronization context before awaiting `Baz()`. Its continuation captures `_syncContext2` as the continuation context.
- `Baz()` always suspends, switching onto a thread pool thread. No continuation context is captured for custom awaitables.
@jakobbotschjakobbotsch added this to the 11.0.0 milestone Jul 30, 2026
@JulieLeeMSFTJulieLeeMSFT added the Priority:1 Work that is critical for the release, but we could probably ship without label Jul 30, 2026
@jakobbotsch

Copy link
Copy Markdown
MemberAuthor

Let's do this as part of #131538

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMIPriority:1Work that is critical for the release, but we could probably ship without

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jakobbotsch@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

JIT: Write up general runtime async inlining details - #127800

Closed
jakobbotsch wants to merge 3 commits into
dotnet:mainfrom
jakobbotsch:runtime-async-inlining-writeup
Closed

JIT: Write up general runtime async inlining details#127800
jakobbotsch wants to merge 3 commits into
dotnet:mainfrom
jakobbotsch:runtime-async-inlining-writeup

Conversation

@jakobbotsch

@jakobbotschjakobbotsch commented May 5, 2026

Copy link
Copy Markdown
Member

I expect to work on general inlining for runtime async over the next few weeks. This document writes down my thoughts around what needs to happen in the inlined code.

Mostly this is low level details for my own sake, but still cc @agocke@AndyAyersMS@VSadov@stephentoub.

Contributes to #127865

CopilotAI review requested due to automatic review settings May 5, 2026 15:10
@github-actionsgithub-actionsBot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label May 5, 2026

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

Adds a new JIT design document that captures the proposed semantics for general runtime-async inlining. The doc is meant to guide future implementation work by spelling out how suspension, resumption, context flow, and exception handling would need to behave when async callees are inlined.

Changes:

  • Introduces a new design note for preserving ExecutionContext and continuation-context behavior across inlined runtime-async calls.
  • Describes a proposed resumed_* model and post-inline IR needed to reconstruct logical async returns.
  • Adds worked examples covering synchronization-context and AsyncLocal behavior.

Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md
Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md Outdated
Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md Outdated
Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md Outdated
@github-actions

github-actionsBot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Workflow state for the Holistic Review Orchestrator.

{
"version": 5,
"last_dispatched_commit": "e64be6c86e4555a9b9df369f212414e61af1a2a1",
"last_dispatched_base_ref": "main",
"last_dispatched_base_sha": "004c358f4376950ead5ef31b95bf4f91a725b42a",
"last_reviewed_commit": "e64be6c86e4555a9b9df369f212414e61af1a2a1",
"last_reviewed_base_ref": "main",
"last_reviewed_base_sha": "004c358f4376950ead5ef31b95bf4f91a725b42a",
"last_recorded_worker_run_id": "29675329919",
"review_attempt_commit": "",
"review_attempt_base_ref": "",
"review_attempt_count": 0,
"max_review_attempts": 5,
"review_history_format": "holistic-review-disclosure-v1",
"review_history": [
{
"commit": "e64be6c86e4555a9b9df369f212414e61af1a2a1",
"review_id": 4730522467
}
]
}

@github-actionsgithub-actionsBot 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.

Holistic Review

Motivation: The author (jakobbotsch) is about to implement general inlining of runtime async calls in the JIT and wants to write down the design challenges and intended approach. This is a documentation-only PR adding docs/design/coreclr/jit/runtime-async-inlining.md; it contributes to #127865 and serves as a design record for reviewers (cc'd) and the author.

Approach: A single 342-line Markdown design doc. It establishes background (await/call-site vs. callee behaviors, the context save/restore contract, and the relevant AsyncHelpers/getAsyncInfo helpers), then works through the hard cases of inlining: suspending inside an inlinee, resuming inside an inlinee, synchronous context save/restore, computing per-frame resumed_F flags, representing post-inline IR (introducing a GT_CONTINUATION_FIELD_OFFSET node whose offset is filled in during the async transformation), exception handling in the post-inline IR, and initial scope restrictions (only inline callees that provably never suspend; skip suspend-capable calls in try clauses). Two worked examples illustrate SynchronizationContext switching and AsyncLocal/ExecutionContext restoration.

Summary: As a design document this is clear, internally consistent, and appropriately scoped. It correctly captures the subtle invariants (e.g. resumed_C implies resumed_B implies resumed_A, single-continuation reuse enabling the else branches to keep prior captures, and the reliance on constant propagation to eliminate cruft for non-suspending inlinees). There is no code or test impact, so there is nothing to build or run. I found only two minor, non-blocking documentation issues, filed inline: (1) the trailing prose in the final example is trapped inside a csharp code fence and will render as code rather than text, and (2) a small typo ("progesses"). Neither affects the technical content. LGTM as a design note.

Detailed Findings

Both findings are inline and minor/non-blocking:

  • Unclosed/mis-scoped code fence around the final example's explanatory text (docs/design/coreclr/jit/runtime-async-inlining.md, lines 317-342) causes narrative prose to render as C#.
  • Typo "progesses" -> "progresses" (line 150).

Additional non-actionable observation (not filed inline): line 240 has a minor grammatical slip ("the async infrastructures catches"), which the author may wish to tidy but does not affect meaning.

Note

This review was generated by this repository's Holistic Review agentic workflow to complement the built-in Copilot review.

Generated by Holistic Review · 53.6 AIC · ⌖ 10.5 AIC · ⊞ 10K

Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md
Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md Outdated
CopilotAI review requested due to automatic review settings July 27, 2026 11:38
@jakobbotsch

Copy link
Copy Markdown
MemberAuthor

@davidwrighton I know you gave this some thought yourself. Do you have any feedback or thoughts on the design here?

@dotnet/jit-contrib I would similarly appreciate any feedback or thoughts.

Would like to get this merged. Alternatively I can also wait and merge it together with the actual implementation.

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 1 out of 1 changed files in this pull request and generated 5 comments.

Rather, the existing `B` continuation would be linked to the newly created `C` continuation by async infrastructure.
It would maintain its values from the time we suspended in `C` with `!resumed_C`.

The take away is that the suspension for the inlined `Task.Yield()` needs to roughly accomplish the following, in addition to storing its normal state:
### Exceptions

Inlined functions can finish by throwing exceptions too.
Under normal circumstances the async infrastructures catches the exception and looks for the next continuation that may handle the exception.
It would maintain its values from the time we suspended in `C` with `!resumed_C`.

The take away is that the suspension for the inlined `Task.Yield()` needs to roughly accomplish the following, in addition to storing its normal state:
```csharp

Correct handling requires catching the possible exception and then rethrowing it in the post-inline IR.
The expansion for calls in try clauses would look roughly like:
```csharp

- `Foo()` runs in the ambient synchronization context but switches its own synchronization context before awaiting `Bar()`. Its continuation captures `_syncContext1` as the continuation context.
- `Bar()` also switches its own synchronization context before awaiting `Baz()`. Its continuation captures `_syncContext2` as the continuation context.
- `Baz()` always suspends, switching onto a thread pool thread. No continuation context is captured for custom awaitables.
@jakobbotschjakobbotsch added this to the 11.0.0 milestone Jul 30, 2026
@JulieLeeMSFTJulieLeeMSFT added the Priority:1 Work that is critical for the release, but we could probably ship without label Jul 30, 2026
@jakobbotsch

Copy link
Copy Markdown
MemberAuthor

Let's do this as part of #131538

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMIPriority:1Work that is critical for the release, but we could probably ship without

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jakobbotsch@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

JIT: Write up general runtime async inlining details - #127800

Closed
jakobbotsch wants to merge 3 commits into
dotnet:mainfrom
jakobbotsch:runtime-async-inlining-writeup
Closed

JIT: Write up general runtime async inlining details#127800
jakobbotsch wants to merge 3 commits into
dotnet:mainfrom
jakobbotsch:runtime-async-inlining-writeup

Conversation

@jakobbotsch

@jakobbotschjakobbotsch commented May 5, 2026

Copy link
Copy Markdown
Member

I expect to work on general inlining for runtime async over the next few weeks. This document writes down my thoughts around what needs to happen in the inlined code.

Mostly this is low level details for my own sake, but still cc @agocke@AndyAyersMS@VSadov@stephentoub.

Contributes to #127865

CopilotAI review requested due to automatic review settings May 5, 2026 15:10
@github-actionsgithub-actionsBot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label May 5, 2026

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

Adds a new JIT design document that captures the proposed semantics for general runtime-async inlining. The doc is meant to guide future implementation work by spelling out how suspension, resumption, context flow, and exception handling would need to behave when async callees are inlined.

Changes:

  • Introduces a new design note for preserving ExecutionContext and continuation-context behavior across inlined runtime-async calls.
  • Describes a proposed resumed_* model and post-inline IR needed to reconstruct logical async returns.
  • Adds worked examples covering synchronization-context and AsyncLocal behavior.

Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md
Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md Outdated
Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md Outdated
Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md Outdated
@github-actions

github-actionsBot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Workflow state for the Holistic Review Orchestrator.

{
"version": 5,
"last_dispatched_commit": "e64be6c86e4555a9b9df369f212414e61af1a2a1",
"last_dispatched_base_ref": "main",
"last_dispatched_base_sha": "004c358f4376950ead5ef31b95bf4f91a725b42a",
"last_reviewed_commit": "e64be6c86e4555a9b9df369f212414e61af1a2a1",
"last_reviewed_base_ref": "main",
"last_reviewed_base_sha": "004c358f4376950ead5ef31b95bf4f91a725b42a",
"last_recorded_worker_run_id": "29675329919",
"review_attempt_commit": "",
"review_attempt_base_ref": "",
"review_attempt_count": 0,
"max_review_attempts": 5,
"review_history_format": "holistic-review-disclosure-v1",
"review_history": [
{
"commit": "e64be6c86e4555a9b9df369f212414e61af1a2a1",
"review_id": 4730522467
}
]
}

@github-actionsgithub-actionsBot 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.

Holistic Review

Motivation: The author (jakobbotsch) is about to implement general inlining of runtime async calls in the JIT and wants to write down the design challenges and intended approach. This is a documentation-only PR adding docs/design/coreclr/jit/runtime-async-inlining.md; it contributes to #127865 and serves as a design record for reviewers (cc'd) and the author.

Approach: A single 342-line Markdown design doc. It establishes background (await/call-site vs. callee behaviors, the context save/restore contract, and the relevant AsyncHelpers/getAsyncInfo helpers), then works through the hard cases of inlining: suspending inside an inlinee, resuming inside an inlinee, synchronous context save/restore, computing per-frame resumed_F flags, representing post-inline IR (introducing a GT_CONTINUATION_FIELD_OFFSET node whose offset is filled in during the async transformation), exception handling in the post-inline IR, and initial scope restrictions (only inline callees that provably never suspend; skip suspend-capable calls in try clauses). Two worked examples illustrate SynchronizationContext switching and AsyncLocal/ExecutionContext restoration.

Summary: As a design document this is clear, internally consistent, and appropriately scoped. It correctly captures the subtle invariants (e.g. resumed_C implies resumed_B implies resumed_A, single-continuation reuse enabling the else branches to keep prior captures, and the reliance on constant propagation to eliminate cruft for non-suspending inlinees). There is no code or test impact, so there is nothing to build or run. I found only two minor, non-blocking documentation issues, filed inline: (1) the trailing prose in the final example is trapped inside a csharp code fence and will render as code rather than text, and (2) a small typo ("progesses"). Neither affects the technical content. LGTM as a design note.

Detailed Findings

Both findings are inline and minor/non-blocking:

  • Unclosed/mis-scoped code fence around the final example's explanatory text (docs/design/coreclr/jit/runtime-async-inlining.md, lines 317-342) causes narrative prose to render as C#.
  • Typo "progesses" -> "progresses" (line 150).

Additional non-actionable observation (not filed inline): line 240 has a minor grammatical slip ("the async infrastructures catches"), which the author may wish to tidy but does not affect meaning.

Note

This review was generated by this repository's Holistic Review agentic workflow to complement the built-in Copilot review.

Generated by Holistic Review · 53.6 AIC · ⌖ 10.5 AIC · ⊞ 10K

Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md
Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md Outdated
CopilotAI review requested due to automatic review settings July 27, 2026 11:38
@jakobbotsch

Copy link
Copy Markdown
MemberAuthor

@davidwrighton I know you gave this some thought yourself. Do you have any feedback or thoughts on the design here?

@dotnet/jit-contrib I would similarly appreciate any feedback or thoughts.

Would like to get this merged. Alternatively I can also wait and merge it together with the actual implementation.

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 1 out of 1 changed files in this pull request and generated 5 comments.

Rather, the existing `B` continuation would be linked to the newly created `C` continuation by async infrastructure.
It would maintain its values from the time we suspended in `C` with `!resumed_C`.

The take away is that the suspension for the inlined `Task.Yield()` needs to roughly accomplish the following, in addition to storing its normal state:
### Exceptions

Inlined functions can finish by throwing exceptions too.
Under normal circumstances the async infrastructures catches the exception and looks for the next continuation that may handle the exception.
It would maintain its values from the time we suspended in `C` with `!resumed_C`.

The take away is that the suspension for the inlined `Task.Yield()` needs to roughly accomplish the following, in addition to storing its normal state:
```csharp

Correct handling requires catching the possible exception and then rethrowing it in the post-inline IR.
The expansion for calls in try clauses would look roughly like:
```csharp

- `Foo()` runs in the ambient synchronization context but switches its own synchronization context before awaiting `Bar()`. Its continuation captures `_syncContext1` as the continuation context.
- `Bar()` also switches its own synchronization context before awaiting `Baz()`. Its continuation captures `_syncContext2` as the continuation context.
- `Baz()` always suspends, switching onto a thread pool thread. No continuation context is captured for custom awaitables.
@jakobbotschjakobbotsch added this to the 11.0.0 milestone Jul 30, 2026
@JulieLeeMSFTJulieLeeMSFT added the Priority:1 Work that is critical for the release, but we could probably ship without label Jul 30, 2026
@jakobbotsch

Copy link
Copy Markdown
MemberAuthor

Let's do this as part of #131538

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMIPriority:1Work that is critical for the release, but we could probably ship without

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jakobbotsch@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

JIT: Write up general runtime async inlining details - #127800

Closed
jakobbotsch wants to merge 3 commits into
dotnet:mainfrom
jakobbotsch:runtime-async-inlining-writeup
Closed

JIT: Write up general runtime async inlining details#127800
jakobbotsch wants to merge 3 commits into
dotnet:mainfrom
jakobbotsch:runtime-async-inlining-writeup

Conversation

@jakobbotsch

@jakobbotschjakobbotsch commented May 5, 2026

Copy link
Copy Markdown
Member

I expect to work on general inlining for runtime async over the next few weeks. This document writes down my thoughts around what needs to happen in the inlined code.

Mostly this is low level details for my own sake, but still cc @agocke@AndyAyersMS@VSadov@stephentoub.

Contributes to #127865

CopilotAI review requested due to automatic review settings May 5, 2026 15:10
@github-actionsgithub-actionsBot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label May 5, 2026

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

Adds a new JIT design document that captures the proposed semantics for general runtime-async inlining. The doc is meant to guide future implementation work by spelling out how suspension, resumption, context flow, and exception handling would need to behave when async callees are inlined.

Changes:

  • Introduces a new design note for preserving ExecutionContext and continuation-context behavior across inlined runtime-async calls.
  • Describes a proposed resumed_* model and post-inline IR needed to reconstruct logical async returns.
  • Adds worked examples covering synchronization-context and AsyncLocal behavior.

Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md
Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md Outdated
Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md Outdated
Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md Outdated
@github-actions

github-actionsBot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Workflow state for the Holistic Review Orchestrator.

{
"version": 5,
"last_dispatched_commit": "e64be6c86e4555a9b9df369f212414e61af1a2a1",
"last_dispatched_base_ref": "main",
"last_dispatched_base_sha": "004c358f4376950ead5ef31b95bf4f91a725b42a",
"last_reviewed_commit": "e64be6c86e4555a9b9df369f212414e61af1a2a1",
"last_reviewed_base_ref": "main",
"last_reviewed_base_sha": "004c358f4376950ead5ef31b95bf4f91a725b42a",
"last_recorded_worker_run_id": "29675329919",
"review_attempt_commit": "",
"review_attempt_base_ref": "",
"review_attempt_count": 0,
"max_review_attempts": 5,
"review_history_format": "holistic-review-disclosure-v1",
"review_history": [
{
"commit": "e64be6c86e4555a9b9df369f212414e61af1a2a1",
"review_id": 4730522467
}
]
}

@github-actionsgithub-actionsBot 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.

Holistic Review

Motivation: The author (jakobbotsch) is about to implement general inlining of runtime async calls in the JIT and wants to write down the design challenges and intended approach. This is a documentation-only PR adding docs/design/coreclr/jit/runtime-async-inlining.md; it contributes to #127865 and serves as a design record for reviewers (cc'd) and the author.

Approach: A single 342-line Markdown design doc. It establishes background (await/call-site vs. callee behaviors, the context save/restore contract, and the relevant AsyncHelpers/getAsyncInfo helpers), then works through the hard cases of inlining: suspending inside an inlinee, resuming inside an inlinee, synchronous context save/restore, computing per-frame resumed_F flags, representing post-inline IR (introducing a GT_CONTINUATION_FIELD_OFFSET node whose offset is filled in during the async transformation), exception handling in the post-inline IR, and initial scope restrictions (only inline callees that provably never suspend; skip suspend-capable calls in try clauses). Two worked examples illustrate SynchronizationContext switching and AsyncLocal/ExecutionContext restoration.

Summary: As a design document this is clear, internally consistent, and appropriately scoped. It correctly captures the subtle invariants (e.g. resumed_C implies resumed_B implies resumed_A, single-continuation reuse enabling the else branches to keep prior captures, and the reliance on constant propagation to eliminate cruft for non-suspending inlinees). There is no code or test impact, so there is nothing to build or run. I found only two minor, non-blocking documentation issues, filed inline: (1) the trailing prose in the final example is trapped inside a csharp code fence and will render as code rather than text, and (2) a small typo ("progesses"). Neither affects the technical content. LGTM as a design note.

Detailed Findings

Both findings are inline and minor/non-blocking:

  • Unclosed/mis-scoped code fence around the final example's explanatory text (docs/design/coreclr/jit/runtime-async-inlining.md, lines 317-342) causes narrative prose to render as C#.
  • Typo "progesses" -> "progresses" (line 150).

Additional non-actionable observation (not filed inline): line 240 has a minor grammatical slip ("the async infrastructures catches"), which the author may wish to tidy but does not affect meaning.

Note

This review was generated by this repository's Holistic Review agentic workflow to complement the built-in Copilot review.

Generated by Holistic Review · 53.6 AIC · ⌖ 10.5 AIC · ⊞ 10K

Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md
Comment threaddocs/design/coreclr/jit/runtime-async-inlining.md Outdated
CopilotAI review requested due to automatic review settings July 27, 2026 11:38
@jakobbotsch

Copy link
Copy Markdown
MemberAuthor

@davidwrighton I know you gave this some thought yourself. Do you have any feedback or thoughts on the design here?

@dotnet/jit-contrib I would similarly appreciate any feedback or thoughts.

Would like to get this merged. Alternatively I can also wait and merge it together with the actual implementation.

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 1 out of 1 changed files in this pull request and generated 5 comments.

Rather, the existing `B` continuation would be linked to the newly created `C` continuation by async infrastructure.
It would maintain its values from the time we suspended in `C` with `!resumed_C`.

The take away is that the suspension for the inlined `Task.Yield()` needs to roughly accomplish the following, in addition to storing its normal state:
### Exceptions

Inlined functions can finish by throwing exceptions too.
Under normal circumstances the async infrastructures catches the exception and looks for the next continuation that may handle the exception.
It would maintain its values from the time we suspended in `C` with `!resumed_C`.

The take away is that the suspension for the inlined `Task.Yield()` needs to roughly accomplish the following, in addition to storing its normal state:
```csharp

Correct handling requires catching the possible exception and then rethrowing it in the post-inline IR.
The expansion for calls in try clauses would look roughly like:
```csharp

- `Foo()` runs in the ambient synchronization context but switches its own synchronization context before awaiting `Bar()`. Its continuation captures `_syncContext1` as the continuation context.
- `Bar()` also switches its own synchronization context before awaiting `Baz()`. Its continuation captures `_syncContext2` as the continuation context.
- `Baz()` always suspends, switching onto a thread pool thread. No continuation context is captured for custom awaitables.
@jakobbotschjakobbotsch added this to the 11.0.0 milestone Jul 30, 2026
@JulieLeeMSFTJulieLeeMSFT added the Priority:1 Work that is critical for the release, but we could probably ship without label Jul 30, 2026
@jakobbotsch

Copy link
Copy Markdown
MemberAuthor

Let's do this as part of #131538

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMIPriority:1Work that is critical for the release, but we could probably ship without

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jakobbotsch@JulieLeeMSFT