[llvm] be7f09f - [IR] create and use helper functions that test the signbit; NFCI
Sanjay Patel via llvm-commits
llvm-commits at lists.llvm.org
Mon May 16 08:26:28 PDT 2022
Author: Sanjay Patel
Date: 2022-05-16T11:26:23-04:00
New Revision: be7f09f7b2e83ca4aebb3bdbb83ad1d19662b993
URL: https://github.com/llvm/llvm-project/commit/be7f09f7b2e83ca4aebb3bdbb83ad1d19662b993
DIFF: https://github.com/llvm/llvm-project/commit/be7f09f7b2e83ca4aebb3bdbb83ad1d19662b993.diff
LOG: [IR] create and use helper functions that test the signbit; NFCI
Added:
Modified:
llvm/include/llvm/IR/IRBuilder.h
llvm/lib/Target/X86/X86InstCombineIntrinsic.cpp
llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp
llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/IR/IRBuilder.h b/llvm/include/llvm/IR/IRBuilder.h
index b8fb30362a059..58d664e03a75f 100644
--- a/llvm/include/llvm/IR/IRBuilder.h
+++ b/llvm/include/llvm/IR/IRBuilder.h
@@ -2363,16 +2363,25 @@ class IRBuilderBase {
// Utility creation methods
//===--------------------------------------------------------------------===//
- /// Return an i1 value testing if \p Arg is null.
+ /// Return a boolean value testing if \p Arg == 0.
Value *CreateIsNull(Value *Arg, const Twine &Name = "") {
- return CreateICmpEQ(Arg, Constant::getNullValue(Arg->getType()),
- Name);
+ return CreateICmpEQ(Arg, ConstantInt::getNullValue(Arg->getType()), Name);
}
- /// Return an i1 value testing if \p Arg is not null.
+ /// Return a boolean value testing if \p Arg != 0.
Value *CreateIsNotNull(Value *Arg, const Twine &Name = "") {
- return CreateICmpNE(Arg, Constant::getNullValue(Arg->getType()),
- Name);
+ return CreateICmpNE(Arg, ConstantInt::getNullValue(Arg->getType()), Name);
+ }
+
+ /// Return a boolean value testing if \p Arg < 0.
+ Value *CreateIsNeg(Value *Arg, const Twine &Name = "") {
+ return CreateICmpSLT(Arg, ConstantInt::getNullValue(Arg->getType()), Name);
+ }
+
+ /// Return a boolean value testing if \p Arg > -1.
+ Value *CreateIsNotNeg(Value *Arg, const Twine &Name = "") {
+ return CreateICmpSGT(Arg, ConstantInt::getAllOnesValue(Arg->getType()),
+ Name);
}
/// Return the i64
diff erence between two pointer values, dividing out
diff --git a/llvm/lib/Target/X86/X86InstCombineIntrinsic.cpp b/llvm/lib/Target/X86/X86InstCombineIntrinsic.cpp
index 4f5fe2bf2c34f..c098122685bef 100644
--- a/llvm/lib/Target/X86/X86InstCombineIntrinsic.cpp
+++ b/llvm/lib/Target/X86/X86InstCombineIntrinsic.cpp
@@ -520,11 +520,10 @@ static Value *simplifyX86movmsk(const IntrinsicInst &II,
// %int = bitcast <16 x i1> %cmp to i16
// %res = zext i16 %int to i32
unsigned NumElts = ArgTy->getNumElements();
- Type *IntegerVecTy = VectorType::getInteger(ArgTy);
Type *IntegerTy = Builder.getIntNTy(NumElts);
- Value *Res = Builder.CreateBitCast(Arg, IntegerVecTy);
- Res = Builder.CreateICmpSLT(Res, Constant::getNullValue(IntegerVecTy));
+ Value *Res = Builder.CreateBitCast(Arg, VectorType::getInteger(ArgTy));
+ Res = Builder.CreateIsNeg(Res);
Res = Builder.CreateBitCast(Res, IntegerTy);
Res = Builder.CreateZExtOrTrunc(Res, ResTy);
return Res;
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp
index d7c4f72399a88..09d2e1726b72f 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp
@@ -2151,11 +2151,11 @@ Instruction *InstCombinerImpl::visitSub(BinaryOperator &I) {
// B = ashr i32 A, 31 ; smear the sign bit
// sub (xor A, B), B ; flip bits if negative and subtract -1 (add 1)
// --> (A < 0) ? -A : A
- Value *Cmp = Builder.CreateICmpSLT(A, ConstantInt::getNullValue(Ty));
+ Value *IsNeg = Builder.CreateIsNeg(A);
// Copy the nuw/nsw flags from the sub to the negate.
- Value *Neg = Builder.CreateNeg(A, "", I.hasNoUnsignedWrap(),
- I.hasNoSignedWrap());
- return SelectInst::Create(Cmp, Neg, A);
+ Value *NegA = Builder.CreateNeg(A, "", I.hasNoUnsignedWrap(),
+ I.hasNoSignedWrap());
+ return SelectInst::Create(IsNeg, NegA, A);
}
// If we are subtracting a low-bit masked subset of some value from an add
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
index 905e1f98fd007..8e3956dd05fdc 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
@@ -2037,18 +2037,16 @@ Instruction *InstCombinerImpl::visitAnd(BinaryOperator &I) {
unsigned FullShift = Ty->getScalarSizeInBits() - 1;
if (match(&I, m_c_And(m_OneUse(m_AShr(m_Value(X), m_SpecificInt(FullShift))),
m_Value(Y)))) {
- Constant *Zero = ConstantInt::getNullValue(Ty);
- Value *Cmp = Builder.CreateICmpSLT(X, Zero, "isneg");
- return SelectInst::Create(Cmp, Y, Zero);
+ Value *IsNeg = Builder.CreateIsNeg(X, "isneg");
+ return SelectInst::Create(IsNeg, Y, ConstantInt::getNullValue(Ty));
}
// If there's a 'not' of the shifted value, swap the select operands:
// ~(iN X s>> (N-1)) & Y --> (X s< 0) ? 0 : Y
if (match(&I, m_c_And(m_OneUse(m_Not(
m_AShr(m_Value(X), m_SpecificInt(FullShift)))),
m_Value(Y)))) {
- Constant *Zero = ConstantInt::getNullValue(Ty);
- Value *Cmp = Builder.CreateICmpSLT(X, Zero, "isneg");
- return SelectInst::Create(Cmp, Zero, Y);
+ Value *IsNeg = Builder.CreateIsNeg(X, "isneg");
+ return SelectInst::Create(IsNeg, ConstantInt::getNullValue(Ty), Y);
}
// (~x) & y --> ~(x | (~y)) iff that gets rid of inversions
@@ -3021,19 +3019,17 @@ Value *InstCombinerImpl::foldXorOfICmps(ICmpInst *LHS, ICmpInst *RHS,
if ((PredL == CmpInst::ICMP_SGT && match(LHS1, m_AllOnes()) &&
PredR == CmpInst::ICMP_SGT && match(RHS1, m_AllOnes())) ||
(PredL == CmpInst::ICMP_SLT && match(LHS1, m_Zero()) &&
- PredR == CmpInst::ICMP_SLT && match(RHS1, m_Zero()))) {
- Value *Zero = ConstantInt::getNullValue(LHS0->getType());
- return Builder.CreateICmpSLT(Builder.CreateXor(LHS0, RHS0), Zero);
- }
+ PredR == CmpInst::ICMP_SLT && match(RHS1, m_Zero())))
+ return Builder.CreateIsNeg(Builder.CreateXor(LHS0, RHS0));
+
// (X > -1) ^ (Y < 0) --> (X ^ Y) > -1
// (X < 0) ^ (Y > -1) --> (X ^ Y) > -1
if ((PredL == CmpInst::ICMP_SGT && match(LHS1, m_AllOnes()) &&
PredR == CmpInst::ICMP_SLT && match(RHS1, m_Zero())) ||
(PredL == CmpInst::ICMP_SLT && match(LHS1, m_Zero()) &&
- PredR == CmpInst::ICMP_SGT && match(RHS1, m_AllOnes()))) {
- Value *MinusOne = ConstantInt::getAllOnesValue(LHS0->getType());
- return Builder.CreateICmpSGT(Builder.CreateXor(LHS0, RHS0), MinusOne);
- }
+ PredR == CmpInst::ICMP_SGT && match(RHS1, m_AllOnes())))
+ return Builder.CreateIsNotNeg(Builder.CreateXor(LHS0, RHS0));
+
}
// Instead of trying to imitate the folds for and/or, decompose this 'xor'
@@ -3181,12 +3177,12 @@ static Instruction *canonicalizeAbs(BinaryOperator &Xor,
// Op1 = ashr i32 A, 31 ; smear the sign bit
// xor (add A, Op1), Op1 ; add -1 and flip bits if negative
// --> (A < 0) ? -A : A
- Value *Cmp = Builder.CreateICmpSLT(A, ConstantInt::getNullValue(Ty));
+ Value *IsNeg = Builder.CreateIsNeg(A);
// Copy the nuw/nsw flags from the add to the negate.
auto *Add = cast<BinaryOperator>(Op0);
- Value *Neg = Builder.CreateNeg(A, "", Add->hasNoUnsignedWrap(),
+ Value *NegA = Builder.CreateNeg(A, "", Add->hasNoUnsignedWrap(),
Add->hasNoSignedWrap());
- return SelectInst::Create(Cmp, Neg, A);
+ return SelectInst::Create(IsNeg, NegA, A);
}
return nullptr;
}
@@ -3494,9 +3490,8 @@ Instruction *InstCombinerImpl::visitXor(BinaryOperator &I) {
*CA == X->getType()->getScalarSizeInBits() - 1 &&
!match(C1, m_AllOnes())) {
assert(!C1->isZeroValue() && "Unexpected xor with 0");
- Value *ICmp =
- Builder.CreateICmpSGT(X, Constant::getAllOnesValue(X->getType()));
- return SelectInst::Create(ICmp, Op1, Builder.CreateNot(Op1));
+ Value *IsNotNeg = Builder.CreateIsNotNeg(X);
+ return SelectInst::Create(IsNotNeg, Op1, Builder.CreateNot(Op1));
}
}
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
index 044f12bd7af9a..f0ed930bdb11c 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
@@ -1154,9 +1154,9 @@ Instruction *InstCombinerImpl::visitSDiv(BinaryOperator &I) {
if (match(&I, m_c_BinOp(
m_OneUse(m_Intrinsic<Intrinsic::abs>(m_Value(X), m_One())),
m_Deferred(X)))) {
- Constant *NegOne = ConstantInt::getAllOnesValue(Ty);
- Value *Cond = Builder.CreateICmpSGT(X, NegOne);
- return SelectInst::Create(Cond, ConstantInt::get(Ty, 1), NegOne);
+ Value *Cond = Builder.CreateIsNotNeg(X);
+ return SelectInst::Create(Cond, ConstantInt::get(Ty, 1),
+ ConstantInt::getAllOnesValue(Ty));
}
// If the sign bits of both operands are zero (i.e. we can prove they are
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
index fce9a73d17e7a..e79a7b47119f2 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
@@ -1619,8 +1619,7 @@ Instruction *InstCombinerImpl::foldSelectInstWithICmp(SelectInst &SI,
ICI->hasOneUse()) {
InstCombiner::BuilderTy::InsertPointGuard Guard(Builder);
Builder.SetInsertPoint(&SI);
- Value *IsNeg = Builder.CreateICmpSLT(
- CmpLHS, ConstantInt::getNullValue(CmpLHS->getType()), ICI->getName());
+ Value *IsNeg = Builder.CreateIsNeg(CmpLHS, ICI->getName());
replaceOperand(SI, 0, IsNeg);
SI.swapValues();
SI.swapProfMetadata();
diff --git a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
index 0710511149150..f33a63556c828 100644
--- a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
+++ b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
@@ -2398,7 +2398,7 @@ Value *LibCallSimplifier::optimizeAbs(CallInst *CI, IRBuilderBase &B) {
// abs(x) -> x <s 0 ? -x : x
// The negation has 'nsw' because abs of INT_MIN is undefined.
Value *X = CI->getArgOperand(0);
- Value *IsNeg = B.CreateICmpSLT(X, Constant::getNullValue(X->getType()));
+ Value *IsNeg = B.CreateIsNeg(X);
Value *NegX = B.CreateNSWNeg(X, "neg");
return B.CreateSelect(IsNeg, NegX, X);
}
More information about the llvm-commits
mailing list