[llvm] 0bc3e23 - [InstCombine] Remove SPF factorizeMinMaxTree() (NFC)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Mon Feb 28 01:22:13 PST 2022
Author: Nikita Popov
Date: 2022-02-28T10:22:05+01:00
New Revision: 0bc3e233d74bfe2f6df47719cccb1662becc5c29
URL: https://github.com/llvm/llvm-project/commit/0bc3e233d74bfe2f6df47719cccb1662becc5c29
DIFF: https://github.com/llvm/llvm-project/commit/0bc3e233d74bfe2f6df47719cccb1662becc5c29.diff
LOG: [InstCombine] Remove SPF factorizeMinMaxTree() (NFC)
SPF integer min/max is canonicalized to min/max intrinsics before
this code is reached, so this should be entirely NFC.
Added:
Modified:
llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
index 808cdc08f50ea..47bc45c101345 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
@@ -2317,63 +2317,6 @@ Instruction *InstCombinerImpl::matchSAddSubSat(Instruction &MinMax1) {
return CastInst::Create(Instruction::SExt, Sat, Ty);
}
-/// Reduce a sequence of min/max with a common operand.
-static Instruction *factorizeMinMaxTree(SelectPatternFlavor SPF, Value *LHS,
- Value *RHS,
- InstCombiner::BuilderTy &Builder) {
- assert(SelectPatternResult::isMinOrMax(SPF) && "Expected a min/max");
- // TODO: Allow FP min/max with nnan/nsz.
- if (!LHS->getType()->isIntOrIntVectorTy())
- return nullptr;
-
- // Match 3 of the same min/max ops. Example: umin(umin(), umin()).
- Value *A, *B, *C, *D;
- SelectPatternResult L = matchSelectPattern(LHS, A, B);
- SelectPatternResult R = matchSelectPattern(RHS, C, D);
- if (SPF != L.Flavor || L.Flavor != R.Flavor)
- return nullptr;
-
- // Look for a common operand. The use checks are
diff erent than usual because
- // a min/max pattern typically has 2 uses of each op: 1 by the cmp and 1 by
- // the select.
- Value *MinMaxOp = nullptr;
- Value *ThirdOp = nullptr;
- if (!LHS->hasNUsesOrMore(3) && RHS->hasNUsesOrMore(3)) {
- // If the LHS is only used in this chain and the RHS is used outside of it,
- // reuse the RHS min/max because that will eliminate the LHS.
- if (D == A || C == A) {
- // min(min(a, b), min(c, a)) --> min(min(c, a), b)
- // min(min(a, b), min(a, d)) --> min(min(a, d), b)
- MinMaxOp = RHS;
- ThirdOp = B;
- } else if (D == B || C == B) {
- // min(min(a, b), min(c, b)) --> min(min(c, b), a)
- // min(min(a, b), min(b, d)) --> min(min(b, d), a)
- MinMaxOp = RHS;
- ThirdOp = A;
- }
- } else if (!RHS->hasNUsesOrMore(3)) {
- // Reuse the LHS. This will eliminate the RHS.
- if (D == A || D == B) {
- // min(min(a, b), min(c, a)) --> min(min(a, b), c)
- // min(min(a, b), min(c, b)) --> min(min(a, b), c)
- MinMaxOp = LHS;
- ThirdOp = C;
- } else if (C == A || C == B) {
- // min(min(a, b), min(b, d)) --> min(min(a, b), d)
- // min(min(a, b), min(c, b)) --> min(min(a, b), d)
- MinMaxOp = LHS;
- ThirdOp = D;
- }
- }
- if (!MinMaxOp || !ThirdOp)
- return nullptr;
-
- CmpInst::Predicate P = getMinMaxPred(SPF);
- Value *CmpABC = Builder.CreateICmp(P, MinMaxOp, ThirdOp);
- return SelectInst::Create(CmpABC, MinMaxOp, ThirdOp);
-}
-
/// Try to reduce a funnel/rotate pattern that includes a compare and select
/// into a funnel shift intrinsic. Example:
/// rotl32(a, b) --> (b == 0 ? a : ((a >> (32 - b)) | (a << b)))
@@ -3117,8 +3060,6 @@ Instruction *InstCombinerImpl::visitSelectInst(SelectInst &SI) {
if (Instruction *I = moveAddAfterMinMax(SPF, LHS, RHS, Builder))
return I;
- if (Instruction *I = factorizeMinMaxTree(SPF, LHS, RHS, Builder))
- return I;
if (Instruction *I = matchSAddSubSat(SI))
return I;
}
More information about the llvm-commits
mailing list