-
Notifications
You must be signed in to change notification settings - Fork 4.8k
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
R2R fixes for [Equality]Comparer.Default in jit #75422
Conversation
Tagging subscribers to this area: @JulieLeeMSFT, @jakobbotsch Issue Detailsbool Foo(int a, int b) => EqualityComparer<int>.Default.Equals(a, b); Current R2R codegen: ; Method Foo(int,int):bool:this
G_M42273_IG01: ;; offset=0000H
57 push rdi
56 push rsi
4883EC28 sub rsp, 40
8BF2 mov esi, edx
418BF8 mov edi, r8d
G_M42273_IG02: ;; offset=000BH
FF1500000000 call [CORINFO_HELP_READYTORUN_STATIC_BASE]
488B00 mov rax, gword ptr [rax]
3800 cmp byte ptr [rax], al
33C0 xor eax, eax
3BF7 cmp esi, edi
0F94C0 sete al
G_M42273_IG03: ;; offset=001DH
4883C428 add rsp, 40
5E pop rsi
5F pop rdi
C3 ret
; Total bytes of code: 36 New R2R codegen: ; Method Foo(int,int):bool:this
G_M42273_IG01: ;; offset=0000H
G_M42273_IG02: ;; offset=0000H
33C0 xor eax, eax
413BD0 cmp edx, r8d
0F94C0 sete al
G_M42273_IG03: ;; offset=0008H
C3 ret
; Total bytes of code: 9
|
This comment was marked as resolved.
This comment was marked as resolved.
This comment was marked as resolved.
This comment was marked as resolved.
/azp run runtime-coreclr r2r, runtime-coreclr crossgen2 |
Azure Pipelines successfully started running 2 pipeline(s). |
This comment was marked as resolved.
This comment was marked as resolved.
This optimization worked for R2R at one time, eg runtime/src/coreclr/jit/fginline.cpp Lines 1616 to 1673 in b1edd42
What changed? Why did it break? |
So my PR does two things:
|
Ok. The initial work here (dotnet/coreclr#14125) was done in 2.1, before we enabled R2R in 3.0, so the support noted above was for fragile ngen. Can we remove that bit of logic or is it still needed for R2R? |
NamedIntrinsic ni = lookupNamedIntrinsic(thisAsCall->gtCallMethHnd); | ||
if ((ni == NI_System_Collections_Generic_EqualityComparer_get_Default) || | ||
(ni == NI_System_Collections_Generic_Comparer_get_Default)) | ||
{ |
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.
Would be nice to re-use the pattern in fgIsCurrentCallDceCandidate
here -- maybe generalize that to take a method handle?
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.
Technically this is a bit different logic, it's a quick check that we can skip a nullcheck, we can add here more intrinsics, potentially:
NI_System_Threading_Thread_get_CurrentThread
NI_System_Array_Clone
NI_System_Object_MemberwiseClone
NI_System_Object_GetType
all of these are not expected to return null afair
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.
Got it.
We should perhaps create a class similar to HelperCallProperties
where we can capture this sort of thing in one place; it may be useful to know elsewhere.
Something changed in Main and this no longer works, will re-open & address once have time |
Current R2R codegen:
New R2R codegen: