Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

JIT: Support FIELD_LIST for returns #112308

Merged
merged 23 commits into from
Feb 18, 2025
Merged

Conversation

jakobbotsch
Copy link
Member

@jakobbotsch jakobbotsch commented Feb 8, 2025

  • Add support for returned FIELD_LIST nodes in the backend. Until lowering these are supported with arbitrary fields; unlike call arguments the fields are not required to map cleanly to registers. After lowering the fields must map cleanly to the return registers. Lowering is responsible for ensuring this property.
  • Teach physical promotion to produce FIELD_LIST nodes for returned promoted struct locals.

Currently lowering ensures the property simply by spilling when the fields do not already map cleanly to registers. In the future it can be taught more efficient ways to recombine the fields to the returned registers.

Another step towards supporting the same cases as old promotion with physical promotion.

* Add support for returned `FIELD_LIST` nodes in the backend. Until
  lowering these are supported with arbitrary fields; unlike call
  arguments the fields are not required to map cleanly to registers.
  After lowering the fields must map cleanly to the return registers.
  Lowering is responsible for ensuring this property.

* Teach physical promotion to produce `FIELD_LIST` nodes for returned
  promoted struct locals.

Currently lowering ensures the property simply by spilling when the
fields do not already map cleanly to registers. In the future it can be
taught more efficient ways to recombine the fields to the returned
registers.

Another step towards supporting the same cases as old promotion with
physical promotion.
@dotnet-issue-labeler dotnet-issue-labeler bot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Feb 8, 2025
Copy link
Contributor

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

@jakobbotsch
Copy link
Member Author

/azp run runtime-coreclr jitstress, runtime-coreclr libraries-jitstress, runtime-jit-experimental

Copy link

Azure Pipelines successfully started running 3 pipeline(s).

@jakobbotsch
Copy link
Member Author

/azp run runtime-coreclr jitstress, runtime-coreclr libraries-jitstress, runtime-jit-experimental

Copy link

Azure Pipelines successfully started running 3 pipeline(s).

@jakobbotsch
Copy link
Member Author

/azp run runtime-jit-experimental

Copy link

Azure Pipelines successfully started running 1 pipeline(s).

@jakobbotsch jakobbotsch marked this pull request as ready for review February 12, 2025 15:14
@jakobbotsch
Copy link
Member Author

cc @dotnet/jit-contrib PTAL @kunalspathak

I'll take a closer look at the test failure, but I think it's unlikely to be related as this has almost no diffs on win-x64 and it was green yesterday. In the meantime I think it's ready to be reviewed.

Diffs, diffs without old promotion.

In the future I expect to enhance lowering's support so that registers can be reconstructed from multiple fields via bitwise instructions. That would e.g. allow a struct like struct S { int A, B; } to be returned as something like (A << 32) | B instead of spilling and reloading from stack.

@jakobbotsch
Copy link
Member Author

ping @kunalspathak

Copy link
Member

@kunalspathak kunalspathak left a comment

Choose a reason for hiding this comment

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

LGTM

@jakobbotsch jakobbotsch merged commit 3511af8 into dotnet:main Feb 18, 2025
111 of 114 checks passed
@jakobbotsch jakobbotsch deleted the return-field-list branch February 18, 2025 19:06
grendello added a commit to grendello/runtime that referenced this pull request Feb 19, 2025
* main: (27 commits)
  Fold null checks against known non-null values (dotnet#109164)
  JIT: Always track the context for late devirt (dotnet#112396)
  JIT: array allocation fixes (dotnet#112676)
  [H/3] Fix test closing connection too fast (dotnet#112691)
  Fix LINQ handling of iterator.Take(...).Last(...) (dotnet#112680)
  [browser][MT] move wasm MT CI legs to extra-platforms (dotnet#112690)
  JIT: Don't use `Compiler::compFloatingPointUsed` to check if FP kills are needed (dotnet#112668)
  [LoongArch64] Fix a typo within PR#112166. (dotnet#112672)
  Fix new EH hang on DebugBreak (dotnet#112640)
  Use encode callback instead of renting a buffer to write to in DSAKeyFormatHelper
  Move some links to other doc (dotnet#112574)
  Reflection-based XmlSerializer - Deserialize empty collections and allow for sub-types in collection items. (dotnet#111723)
  JIT: Use `fgCalledCount` for OSR method entry weight (dotnet#112662)
  Use Avx10.2 Instructions in Floating Point Conversions (dotnet#111775)
  Expose StressLog via CDAC and port StressLogAnalyzer to managed code (dotnet#104999)
  JIT: Use linear block order for MinOpts in LSRA (dotnet#108147)
  Update dependencies from https://github.com/dotnet/arcade build 20250213.2 (dotnet#112625)
  JIT: Clean up and optimize call arg lowering (dotnet#112639)
  Update dependencies from https://github.com/dotnet/emsdk build 20250217.1 (dotnet#112645)
  JIT: Support `FIELD_LIST` for returns (dotnet#112308)
  ...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area-CodeGen-coreclr CLR 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.

2 participants