[llvm] 1f53932 - [InstCombine] Remove foldAndOrOfEqualityCmpsWithConstants() fold
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Fri Apr 29 03:23:09 PDT 2022
Author: Nikita Popov
Date: 2022-04-29T12:23:00+02:00
New Revision: 1f53932a95f16f53980af40d092901ff3480e00c
URL: https://github.com/llvm/llvm-project/commit/1f53932a95f16f53980af40d092901ff3480e00c
DIFF: https://github.com/llvm/llvm-project/commit/1f53932a95f16f53980af40d092901ff3480e00c.diff
LOG: [InstCombine] Remove foldAndOrOfEqualityCmpsWithConstants() fold
This fold handles a special subset of foldAndOrOfICmpsUsingRanges(),
use the more generic implementation instead.
The result can differ if a representation using a range comparison
is possible, in which case that is preferred over masking. There is
a canonicalization opportunity here.
Added:
Modified:
llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
llvm/test/Transforms/InstCombine/and-or-icmps.ll
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
index 9963c692a5c7..6dfac9ec421d 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
@@ -706,47 +706,6 @@ Value *InstCombinerImpl::simplifyRangeCheck(ICmpInst *Cmp0, ICmpInst *Cmp1,
return Builder.CreateICmp(NewPred, Input, RangeEnd);
}
-static Value *
-foldAndOrOfEqualityCmpsWithConstants(ICmpInst *LHS, ICmpInst *RHS,
- bool JoinedByAnd,
- InstCombiner::BuilderTy &Builder) {
- Value *X = LHS->getOperand(0);
- if (X != RHS->getOperand(0))
- return nullptr;
-
- const APInt *C1, *C2;
- if (!match(LHS->getOperand(1), m_APInt(C1)) ||
- !match(RHS->getOperand(1), m_APInt(C2)))
- return nullptr;
-
- // We only handle (X != C1 && X != C2) and (X == C1 || X == C2).
- ICmpInst::Predicate Pred = LHS->getPredicate();
- if (Pred != RHS->getPredicate())
- return nullptr;
- if (JoinedByAnd && Pred != ICmpInst::ICMP_NE)
- return nullptr;
- if (!JoinedByAnd && Pred != ICmpInst::ICMP_EQ)
- return nullptr;
-
- // The larger unsigned constant goes on the right.
- if (C1->ugt(*C2))
- std::swap(C1, C2);
-
- APInt Xor = *C1 ^ *C2;
- if (Xor.isPowerOf2()) {
- // If LHSC and RHSC
diff er by only one bit, then set that bit in X and
- // compare against the larger constant:
- // (X == C1 || X == C2) --> (X | (C1 ^ C2)) == C2
- // (X != C1 && X != C2) --> (X | (C1 ^ C2)) != C2
- // We choose an 'or' with a Pow2 constant rather than the inverse mask with
- // 'and' because that may lead to smaller codegen from a smaller constant.
- Value *Or = Builder.CreateOr(X, ConstantInt::get(X->getType(), Xor));
- return Builder.CreateICmp(Pred, Or, ConstantInt::get(X->getType(), *C2));
- }
-
- return nullptr;
-}
-
// Fold (iszero(A & K1) | iszero(A & K2)) -> (A & (K1 | K2)) != (K1 | K2)
// Fold (!iszero(A & K1) & !iszero(A & K2)) -> (A & (K1 | K2)) == (K1 | K2)
Value *InstCombinerImpl::foldAndOrOfICmpsOfAndWithPow2(ICmpInst *LHS,
@@ -2482,9 +2441,6 @@ Value *InstCombinerImpl::foldAndOrOfICmps(ICmpInst *LHS, ICmpInst *RHS,
if (Value *V = simplifyRangeCheck(RHS, LHS, /*Inverted=*/!IsAnd))
return V;
- if (Value *V = foldAndOrOfEqualityCmpsWithConstants(LHS, RHS, IsAnd, Builder))
- return V;
-
if (IsAnd)
if (Value *V = foldSignedTruncationCheck(LHS, RHS, BO, Builder))
return V;
diff --git a/llvm/test/Transforms/InstCombine/and-or-icmps.ll b/llvm/test/Transforms/InstCombine/and-or-icmps.ll
index c85446c5e5f3..5c319f0dbc50 100644
--- a/llvm/test/Transforms/InstCombine/and-or-icmps.ll
+++ b/llvm/test/Transforms/InstCombine/and-or-icmps.ll
@@ -104,8 +104,8 @@ define i1 @or_eq_with_one_bit_
diff _constants1_logical(i32 %x) {
define i1 @and_ne_with_one_bit_
diff _constants1(i32 %x) {
; CHECK-LABEL: @and_ne_with_one_bit_
diff _constants1(
-; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[X:%.*]], -2
-; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 50
+; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[X:%.*]], -52
+; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i32 [[TMP1]], -2
; CHECK-NEXT: ret i1 [[TMP2]]
;
%cmp1 = icmp ne i32 %x, 51
@@ -116,8 +116,8 @@ define i1 @and_ne_with_one_bit_
diff _constants1(i32 %x) {
define i1 @and_ne_with_one_bit_
diff _constants1_logical(i32 %x) {
; CHECK-LABEL: @and_ne_with_one_bit_
diff _constants1_logical(
-; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[X:%.*]], -2
-; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 50
+; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[X:%.*]], -52
+; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i32 [[TMP1]], -2
; CHECK-NEXT: ret i1 [[TMP2]]
;
%cmp1 = icmp ne i32 %x, 51
More information about the llvm-commits
mailing list