[llvm] e9e9948 - [InstSimplify] rearrange matching for select-of-min/max folds; NFC
Sanjay Patel via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 26 12:07:17 PDT 2022
Author: Sanjay Patel
Date: 2022-09-26T15:02:40-04:00
New Revision: e9e994838aa07506e63cc06d86173d0efe00c48a
URL: https://github.com/llvm/llvm-project/commit/e9e994838aa07506e63cc06d86173d0efe00c48a
DIFF: https://github.com/llvm/llvm-project/commit/e9e994838aa07506e63cc06d86173d0efe00c48a.diff
LOG: [InstSimplify] rearrange matching for select-of-min/max folds; NFC
This makes the code a little shorter and should be easier to extend
for a pattern like in issue #42100.
Added:
Modified:
llvm/lib/Analysis/InstructionSimplify.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp
index 49f61086a395..40943d7c4530 100644
--- a/llvm/lib/Analysis/InstructionSimplify.cpp
+++ b/llvm/lib/Analysis/InstructionSimplify.cpp
@@ -4236,50 +4236,48 @@ static Value *simplifySelectBitTest(Value *TrueVal, Value *FalseVal, Value *X,
static Value *simplifyCmpSelOfMaxMin(Value *CmpLHS, Value *CmpRHS,
ICmpInst::Predicate Pred, Value *TVal,
Value *FVal) {
- // Canonicalize max/min as false value of select.
- if (match(TVal, m_c_MaxOrMin(m_Specific(FVal), m_Value()))) {
+ // Canonicalize common cmp+sel operand as CmpLHS.
+ if (CmpRHS == TVal || CmpRHS == FVal) {
+ std::swap(CmpLHS, CmpRHS);
+ Pred = ICmpInst::getSwappedPredicate(Pred);
+ }
+
+ // Canonicalize common cmp+sel operand as TVal.
+ if (CmpLHS == FVal) {
std::swap(TVal, FVal);
Pred = ICmpInst::getInversePredicate(Pred);
}
- // Cond ? X : max(X, Y)
- Value *X = TVal, *Y;
- if (!match(FVal, m_c_MaxOrMin(m_Specific(X), m_Value(Y))))
+ // (X pred Y) ? X : max/min(X, Y)
+ Value *X = CmpLHS, *Y = CmpRHS;
+ auto *MMI = dyn_cast<MinMaxIntrinsic>(FVal);
+ if (!MMI || TVal != X ||
+ !match(FVal, m_c_MaxOrMin(m_Specific(X), m_Specific(Y))))
return nullptr;
- // Canonicalize common select operand X as CmpLHS.
- if (CmpRHS == X) {
- std::swap(CmpLHS, CmpRHS);
- Pred = ICmpInst::getSwappedPredicate(Pred);
- }
+ // (X == Y) ? X : max/min(X, Y) --> max/min(X, Y)
+ if (Pred == CmpInst::ICMP_EQ)
+ return MMI;
- // (X Pred Y) ? X : max(X, Y)
- if (CmpLHS != X || CmpRHS != Y)
- return nullptr;
+ // (X != Y) ? X : max/min(X, Y) --> X
+ if (Pred == CmpInst::ICMP_NE)
+ return X;
- if (auto *MMI = dyn_cast<MinMaxIntrinsic>(FVal)) {
- ICmpInst::Predicate MMPred = MMI->getPredicate();
- // (X > Y) ? X : max(X, Y) --> max(X, Y)
- // (X >= Y) ? X : max(X, Y) --> max(X, Y)
- // (X == Y) ? X : max(X, Y) --> max(X, Y)
- // (X < Y) ? X : min(X, Y) --> min(X, Y)
- // (X <= Y) ? X : min(X, Y) --> min(X, Y)
- // (X == Y) ? X : min(X, Y) --> min(X, Y)
- if (MMPred == CmpInst::getStrictPredicate(Pred) ||
- Pred == ICmpInst::ICMP_EQ)
- return MMI;
-
- // (X < Y) ? X : max(X, Y) --> X
- // (X <= Y) ? X : max(X, Y) --> X
- // (X != Y) ? X : max(X, Y) --> X
- // (X > Y) ? X : min(X, Y) --> X
- // (X >= Y) ? X : min(X, Y) --> X
- // (X != Y) ? X : min(X, Y) --> X
- ICmpInst::Predicate InvPred = CmpInst::getInversePredicate(Pred);
- if (MMPred == CmpInst::getStrictPredicate(InvPred) ||
- Pred == ICmpInst::ICMP_NE)
- return X;
- }
+ // (X > Y) ? X : max(X, Y) --> max(X, Y)
+ // (X >= Y) ? X : max(X, Y) --> max(X, Y)
+ // (X < Y) ? X : min(X, Y) --> min(X, Y)
+ // (X <= Y) ? X : min(X, Y) --> min(X, Y)
+ ICmpInst::Predicate MMPred = MMI->getPredicate();
+ if (MMPred == CmpInst::getStrictPredicate(Pred))
+ return MMI;
+
+ // (X < Y) ? X : max(X, Y) --> X
+ // (X <= Y) ? X : max(X, Y) --> X
+ // (X > Y) ? X : min(X, Y) --> X
+ // (X >= Y) ? X : min(X, Y) --> X
+ ICmpInst::Predicate InvPred = CmpInst::getInversePredicate(Pred);
+ if (MMPred == CmpInst::getStrictPredicate(InvPred))
+ return X;
return nullptr;
}
More information about the llvm-commits
mailing list