dotnet/runtime
View on GitHubJIT doesn't fold constant multiplication to single instruction
Open
#91,824 opened on Sep 8, 2023
Priority:3area-CodeGen-coreclrhelp wantedtenet-performance
Repository metrics
- Stars
- (17,886 stars)
- PR merge metrics
- (Avg merge 12d 11h) (661 merged PRs in 30d)
Description
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.