-
Notifications
You must be signed in to change notification settings - Fork 15.4k
Open
Labels
bugzillaIssues migrated from bugzillaIssues migrated from bugzillallvm:instcombineCovers the InstCombine, InstSimplify and AggressiveInstCombine passesCovers the InstCombine, InstSimplify and AggressiveInstCombine passes
Description
| Bugzilla Link | 52094 |
| Version | trunk |
| OS | All |
| CC | @RKSimon |
Extended Description
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
Metadata
Metadata
Assignees
Labels
bugzillaIssues migrated from bugzillaIssues migrated from bugzillallvm:instcombineCovers the InstCombine, InstSimplify and AggressiveInstCombine passesCovers the InstCombine, InstSimplify and AggressiveInstCombine passes