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.
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
Update the JIT to support rewriting more complex intrinsics as user calls #102702
Update the JIT to support rewriting more complex intrinsics as user calls #102702
Changes from all commits
ba591a3
45d9e23
39e424c
c41dfd2
a0cea27
a0a0749
File filter
Filter by extension
Conversations
Jump to
There are no files selected for viewing
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think I follow what gtInlineOperands is (and the logic inside SetMethodHandle does, can you explain?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
gtInlineOperands
is an existing field that allowsGenTreeMultiOp
to avoid allocating for the common case where there is 2 or less operands and instead allows us to carry the fields within the main allocation instead.In order to facilitate rewriting the hwintrinsic back to a call, however, we need to be able to track the
CORINFO_METHOD_HANDLE
and we don't have enough free space to do that. Adding the field directly ends up making the node larger thanTREE_NODE_SZ_LARGE
as well, so to avoid pessimizing the rest of the JIT I made this into a union.SetMethodHandle
will then force an allocation ifgtInlineOperands
was being used and set a flag that indicates thatgtMethodHandle
is set instead.It's worth noting the actual
gtInlineOperands
field isn't ever read directly either, it's address is just handed down toGenTreeMultiOp
as part of construction orResetOperandArray
call. So this ends up working fairly well and ensures that the allocation is "pay for play" and only used when actually necessary (we have an intrinsic with 1 or 2 operands that requires a constant and needs to be carried through to a later phase).There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
-- Notably the reason we don't have enough free space is primarily because of padding bytes caused by inheritance. There's a few places where nodes are wasting 4-7 bytes of space to maintain 8-byte alignment and that repeats several times.
We could avoid tricks like the one being employed here if we had a better mechanism for avoiding such wasted padding for derived node kinds. But that's a much more complex and independent work item.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ah I didn't notice it was a pre-existing field - I though you added it in this PR 🙂