forked from OSchip/llvm-project
InstCombine: Fold away tautological masked compares
It is impossible for (x & INT_MAX) == 0 && x == INT_MAX to ever be true. While this sort of reasoning should normally live in InstSimplify, the machinery that derives this result is not trivial to split out. llvm-svn: 222230
This commit is contained in:
parent
1a3327bb62
commit
6fdb6b8fd4
|
@ -776,7 +776,7 @@ static Value *foldLogOpOfMaskedICmps(ICmpInst *LHS, ICmpInst *RHS, bool IsAnd,
|
||||||
// whole construct
|
// whole construct
|
||||||
if (((BCst->getValue() & DCst->getValue()) &
|
if (((BCst->getValue() & DCst->getValue()) &
|
||||||
(CCst->getValue() ^ ECst->getValue())) != 0)
|
(CCst->getValue() ^ ECst->getValue())) != 0)
|
||||||
return nullptr;
|
return ConstantInt::get(LHS->getType(), !IsAnd);
|
||||||
Value *newOr1 = Builder->CreateOr(B, D);
|
Value *newOr1 = Builder->CreateOr(B, D);
|
||||||
Value *newOr2 = ConstantExpr::getOr(CCst, ECst);
|
Value *newOr2 = ConstantExpr::getOr(CCst, ECst);
|
||||||
Value *newAnd = Builder->CreateAnd(A, newOr1);
|
Value *newAnd = Builder->CreateAnd(A, newOr1);
|
||||||
|
|
|
@ -150,3 +150,23 @@ define i1 @nomask_rhs(i32 %in) {
|
||||||
%val = or i1 %tst1, %tst2
|
%val = or i1 %tst1, %tst2
|
||||||
ret i1 %val
|
ret i1 %val
|
||||||
}
|
}
|
||||||
|
|
||||||
|
define i1 @fold_mask_cmps_to_false(i32 %x) {
|
||||||
|
; CHECK-LABEL: @fold_mask_cmps_to_false
|
||||||
|
; CHECK: ret i1 false
|
||||||
|
%1 = and i32 %x, 2147483647
|
||||||
|
%2 = icmp eq i32 %1, 0
|
||||||
|
%3 = icmp eq i32 %x, 2147483647
|
||||||
|
%4 = and i1 %3, %2
|
||||||
|
ret i1 %4
|
||||||
|
}
|
||||||
|
|
||||||
|
define i1 @fold_mask_cmps_to_true(i32 %x) {
|
||||||
|
; CHECK-LABEL: @fold_mask_cmps_to_true
|
||||||
|
; CHECK: ret i1 true
|
||||||
|
%1 = and i32 %x, 2147483647
|
||||||
|
%2 = icmp ne i32 %1, 0
|
||||||
|
%3 = icmp ne i32 %x, 2147483647
|
||||||
|
%4 = or i1 %3, %2
|
||||||
|
ret i1 %4
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue