dotnet/runtime
在 GitHub 查看JIT doesn't fold constant multiplication to single instruction
Open
#91,824 建立於 2023年9月8日
Priority:3area-CodeGen-coreclrhelp wantedtenet-performance
倉庫指標
- Star
- (17,886 star)
- PR 合併指標
- (平均合併 12天 11小時) (30 天內合併 661 個 PR)
描述
Description
Consider the following code:
int A(int i)
{
return i * 4 * 8;
}
int B(int i)
{
return i * (4 * 8);
}
These two functions should result in identical results.
But the JIT output slightly different code for each:
Program.<<Main>$>g__A|0_0(Int32)
L0000: mov eax, ecx
L0002: shl eax, 2
L0005: shl eax, 3
L0008: ret
Program.<<Main>$>g__B|0_1(Int32)
L0000: mov eax, ecx
L0002: shl eax, 5
L0005: ret
This is on: ; Core CLR 7.0.823.31807 on x64
Analysis
Given that multiplication is communicative, and that this is a power of two operation, I would expect the JIT to fold them to the 2nd version, without the parenthesis.
The first version takes two instructions instead of 1.