-
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
[arm64] JIT: X % 2 == 0 -> X & 1 == 0 #62399
Conversation
Tagging subscribers to this area: @JulieLeeMSFT Issue DetailsOn arm64 we transfrom The same transformation in LLVM looks way smaller 🙂 https://github.com/llvm/llvm-project/blob/main/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp#L1372-L1381 void Test(int x)
{
if (x % 2 == 0)
Console.WriteLine("x is even");
} ; Method Program:Test(int):this
G_M52364_IG01:
stp fp, lr, [sp,#-16]!
mov fp, sp
;; bbWeight=1 PerfScore 1.50
G_M52364_IG02:
- lsr w0, w1, #31
- add w0, w0, w1
- asr w0, w0, #1
- lsl w0, w0, #1
- subs w0, w1, w0
- bne G_M52364_IG05
+ tbnz w1, #0, G_M52364_IG05
;; bbWeight=1 PerfScore 1.00
G_M52364_IG03:
movz x0, #0xd1ffab1e
movk x0, #0xd1ffab1e LSL #16
movk x0, #0xd1ffab1e LSL #32
ldr x0, [x0]
;; bbWeight=0.50 PerfScore 2.25
G_M52364_IG04:
ldp fp, lr, [sp],#16
b System.Console:WriteLine(System.String)
;; bbWeight=0.50 PerfScore 1.00
G_M52364_IG05:
ldp fp, lr, [sp],#16
ret lr
;; bbWeight=0.50 PerfScore 1.00
G_M52364_IG06:
bl CORINFO_HELP_OVERFLOW
;; bbWeight=0 PerfScore 0.00
G_M52364_IG07:
bl CORINFO_HELP_THROWDIVZERO
brk_windows #0
;; bbWeight=0 PerfScore 0.00
-; Total bytes of code: 76
+; Total bytes of code: 56
|
No diffs on x64. |
According to this link: https://stackoverflow.com/questions/3072665/bitwise-and-in-place-of-modulus-operator It seems like this can be expanded to other forms of modulus as well. |
the current algorithm handles any power-of-two number, the title is slightly misleading yes |
Move
X % 2 == 0 -> X & 1 == 0
transformation to pre-order in morph - it helps ARM64 back-end to recognize it too before it gets rid of GT_MOD (thanks @SingleAccretion for the idea).benchmarks.run.windows.arm64.checked.mch:
Detail diffs
coreclr_tests.pmi.windows.arm64.checked.mch:
Detail diffs
libraries.crossgen2.windows.arm64.checked.mch:
Detail diffs
libraries.pmi.windows.arm64.checked.mch:
Detail diffs
libraries_tests.pmi.windows.arm64.checked.mch:
Detail diffs