Repository navigation
Conversation
|
Azure Pipelines: Successfully started running 5 pipeline(s). 11 pipeline(s) were filtered out due to trigger conditions. There may be pipelines that require an authorized user to comment /azp run to run. |
Contributor
|
Tagging subscribers to this area: @JulieLeeMSFT, @jakobbotsch |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Physical promotion can split a whole struct assignment into partial stores before runtime-async liveness runs. That loses the full-definition kill and can capture a struct from the previous loop iteration even though it is overwritten before its next use.
Preserve eligible whole-local copies and initialization as
STORE_LCL_VAR(FIELD_LIST(...))through async liveness, including sparse and empty lists. Expand them during lowering after every operand has been evaluated, preserving snapshot, exception, and overlapping-remainder ordering. Keep sparse lists out of forward substitution into unrelated destinations, and recognize all-zero lists during async default-value analysis.The change applies to true whole-local definitions; indirect/full-block copies, regularly promoted destinations, implicit-byref parameters, and x86 varargs-cookie parameters keep their existing handling.
Tests
The regression exercises held suspensions, compacting GC, whole copies, initialization, partial writes, exception paths, overlapping remainders, empty definitions, and live zero values. It also includes an optimizing-x64 lifetime check: a weakly tracked object from an overwritten struct must be collectible while the next continuation is held. This check is skipped under MinOpts/JIT stress, Debug VMs, and interpreter execution; the semantic test continues to run.
Fresh validation after applying to
cfe8a6c46009:6f1d9331b9b4(upstream JIT sources are unchanged between these base commits).jitformat.pyconfiguration matrix passed.Earlier validation of the product patch against
6f1d9331b9b4passed the 147-entry async suite on Linux x64 and all eight Windows x64/WOW64 x86 baseline/fixed × Release/Checked JIT cells. The x86 whole-copy control already uses 28 bytes and is unchanged; the empty-definition case shrinks from 72 to 40 bytes on x64 and from 60 to 28 bytes on x86. The newly added lifetime check was validated on Windows x64.BenchmarkDotNet
Retained same-input measurements versus unmodified
6f1d9331b9b4: Windows build 26200, AMD Ryzen AI 9 HX 370, x64, .NET 11, BDN 0.16.0 nightly. Baseline/fixed Release JITs ran on the same Release VM/CoreLib and byte-identical managed benchmark input, with ReadyToRun, tiered compilation, and tiered PGO disabled. The forward run used two launches, six warmups, and fifteen 250 ms measurement iterations per case; a separate reverse-order run was also checked.For
CopyDecomposedSuspending, an operation includes the entire loop:The saving is 24 bytes per complete suspended operation, on the initial capture rather than each resume. Linux x64 reproduced the same allocation reduction. Completed-await allocations (136/304/1,648 bytes) and the full-block suspending control (272/440/1,784 bytes) were unchanged. Timing was noisy across the runs and does not establish a general throughput improvement. These BDN results were retained from the supplied product-patch evidence; they were not rerun during this PR preparation.
Earlier SuperPMI replays had 164,972 comparable successful Linux compilations and 91,692 on Windows, with six/eight assembly differences and net native code-size changes of -149/-147 bytes. Matching missing-data contexts were excluded from these coverage counts; individual code-size increases remain in a few contexts.
Resolves #133415
Note
This pull request description was generated with assistance from OpenAI Codex.