We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
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
https://alive2.llvm.org/ce/z/c2tUxf
define i32 @src(i32 %0) { %2 = and i32 %0, 15 %3 = tail call i32 @llvm.ctpop.i32(i32 %2) %4 = and i32 %3, 5 %5 = icmp eq i32 %4, 1 %6 = zext i1 %5 to i32 ret i32 %6 } define i32 @tgt(i32 %0) { %2 = and i32 %0, 15 %3 = tail call i32 @llvm.ctpop.i32(i32 %2) %4 = and i32 %3, 1 ret i32 %4 } declare i32 @llvm.ctpop.i32(i32) #2
We fail to recognize this as a parity check which could lead to far worse codegen (especially for a target that does not have a popcount instruction):
IR corresponds to source like this:
int xor4_popcount(int num) { int masknum = num & 0xf; int pop = __builtin_popcount(masknum); return pop == 1 || pop == 3; }
This example is derived from the post-commit discussion in: https://reviews.llvm.org/D110170
The text was updated successfully, but these errors were encountered:
When compiling from source currently, we do have the optimal range metadata:
%0 = tail call i32 @llvm.ctpop.i32(i32 %and), !range !6
!6 = !{i32 0, i32 5}
And that is added by instcombine via foldCtpop(), so that part of the problem is working correctly already.
Sorry, something went wrong.
No branches or pull requests
Extended Description
https://alive2.llvm.org/ce/z/c2tUxf
We fail to recognize this as a parity check which could lead to far worse codegen (especially for a target that does not have a popcount instruction):
IR corresponds to source like this:
This example is derived from the post-commit discussion in:
https://reviews.llvm.org/D110170
The text was updated successfully, but these errors were encountered: