summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorNikolai Bozhenov <nikolai.bozhenov@intel.com>2017-06-30 10:39:09 +0000
committerNikolai Bozhenov <nikolai.bozhenov@intel.com>2017-06-30 10:39:09 +0000
commitbde9b14c6f0811a0af0b3e7272ed5a4fcce39fef (patch)
treed1dc53bab2280c074359fef216d46aaf7e330111 /llvm/lib
parent892c6c86ea25dc97668ff1f1b7bf1108e85fa5ec (diff)
downloadbcm5719-llvm-bde9b14c6f0811a0af0b3e7272ed5a4fcce39fef.tar.gz
bcm5719-llvm-bde9b14c6f0811a0af0b3e7272ed5a4fcce39fef.zip
Revert of r306525: "Canonicalize clamp of float types to minmax"
llvm-svn: 306815
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Analysis/ValueTracking.cpp69
-rw-r--r--llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp13
2 files changed, 4 insertions, 78 deletions
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index fd519e2ad5c..fd6e3a643bf 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -3933,62 +3933,6 @@ static bool isKnownNonZero(const Value *V) {
return false;
}
-/// Match clamp pattern for float types without care about NaNs or signed zeros.
-/// Given non-min/max outer cmp/select from the clamp pattern this
-/// function recognizes if it can be substitued by a "canonical" min/max
-/// pattern.
-static SelectPatternResult matchFastFloatClamp(CmpInst::Predicate Pred,
- Value *CmpLHS, Value *CmpRHS,
- Value *TrueVal, Value *FalseVal,
- Value *&LHS, Value *&RHS) {
- // Try to match
- // X < C1 ? C1 : Min(X, C2) --> Max(C1, Min(X, C2))
- // X > C1 ? C1 : Max(X, C2) --> Min(C1, Max(X, C2))
- // and return description of the outer Max/Min.
-
- // First, check if select has inverse order:
- if (CmpRHS == FalseVal) {
- std::swap(TrueVal, FalseVal);
- Pred = CmpInst::getInversePredicate(Pred);
- }
-
- // Assume success now. If there's no match, callers should not use these anyway.
- LHS = TrueVal;
- RHS = FalseVal;
-
- const APFloat *FC1;
- if (CmpRHS != TrueVal || !match(CmpRHS, m_APFloat(FC1)) || !FC1->isFinite())
- return {SPF_UNKNOWN, SPNB_NA, false};
-
- const APFloat *FC2;
- switch (Pred) {
- case CmpInst::FCMP_OLT:
- case CmpInst::FCMP_OLE:
- case CmpInst::FCMP_ULT:
- case CmpInst::FCMP_ULE:
- if (match(FalseVal,
- m_CombineOr(m_OrdFMin(m_Specific(CmpLHS), m_APFloat(FC2)),
- m_UnordFMin(m_Specific(CmpLHS), m_APFloat(FC2)))) &&
- FC1->compare(*FC2) == APFloat::cmpResult::cmpLessThan)
- return {SPF_FMAXNUM, SPNB_RETURNS_ANY, false};
- break;
- case CmpInst::FCMP_OGT:
- case CmpInst::FCMP_OGE:
- case CmpInst::FCMP_UGT:
- case CmpInst::FCMP_UGE:
- if (match(FalseVal,
- m_CombineOr(m_OrdFMax(m_Specific(CmpLHS), m_APFloat(FC2)),
- m_UnordFMax(m_Specific(CmpLHS), m_APFloat(FC2)))) &&
- FC1->compare(*FC2) == APFloat::cmpResult::cmpGreaterThan)
- return {SPF_FMINNUM, SPNB_RETURNS_ANY, false};
- break;
- default:
- break;
- }
-
- return {SPF_UNKNOWN, SPNB_NA, false};
-}
-
/// Match non-obvious integer minimum and maximum sequences.
static SelectPatternResult matchMinMax(CmpInst::Predicate Pred,
Value *CmpLHS, Value *CmpRHS,
@@ -4196,18 +4140,7 @@ static SelectPatternResult matchSelectPattern(CmpInst::Predicate Pred,
}
}
- if (CmpInst::isIntPredicate(Pred))
- return matchMinMax(Pred, CmpLHS, CmpRHS, TrueVal, FalseVal, LHS, RHS);
-
- // According to (IEEE 754-2008 5.3.1), minNum(0.0, -0.0) and similar
- // may return either -0.0 or 0.0, so fcmp/select pair has stricter
- // semantics than minNum. Be conservative in such case.
- if (NaNBehavior != SPNB_RETURNS_ANY ||
- (!FMF.noSignedZeros() && !isKnownNonZero(CmpLHS) &&
- !isKnownNonZero(CmpRHS)))
- return {SPF_UNKNOWN, SPNB_NA, false};
-
- return matchFastFloatClamp(Pred, CmpLHS, CmpRHS, TrueVal, FalseVal, LHS, RHS);
+ return matchMinMax(Pred, CmpLHS, CmpRHS, TrueVal, FalseVal, LHS, RHS);
}
static Value *lookThroughCast(CmpInst *CmpI, Value *V1, Value *V2,
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
index c15fd35e47c..80c6595904e 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
@@ -1374,16 +1374,9 @@ Instruction *InstCombiner::visitSelectInst(SelectInst &SI) {
auto SPF = SPR.Flavor;
if (SelectPatternResult::isMinOrMax(SPF)) {
- // Canonicalize so that
- // - type casts are outside select patterns.
- // - float clamp is transformed to min/max pattern
- Value *CmpLHS = cast<CmpInst>(CondVal)->getOperand(0);
- Value *CmpRHS = cast<CmpInst>(CondVal)->getOperand(1);
- if ((LHS->getType()->getPrimitiveSizeInBits() !=
- SelType->getPrimitiveSizeInBits()) ||
- (LHS->getType()->isFPOrFPVectorTy() &&
- ((CmpLHS != LHS && CmpLHS != RHS) ||
- (CmpRHS != LHS && CmpRHS != RHS)))) {
+ // Canonicalize so that type casts are outside select patterns.
+ if (LHS->getType()->getPrimitiveSizeInBits() !=
+ SelType->getPrimitiveSizeInBits()) {
CmpInst::Predicate Pred = getCmpPredicateForMinMax(SPF, SPR.Ordered);
Value *Cmp;
OpenPOWER on IntegriCloud