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.