diff options
author | Nikolai Bozhenov <nikolai.bozhenov@intel.com> | 2017-06-30 10:39:09 +0000 |
---|---|---|
committer | Nikolai Bozhenov <nikolai.bozhenov@intel.com> | 2017-06-30 10:39:09 +0000 |
commit | bde9b14c6f0811a0af0b3e7272ed5a4fcce39fef (patch) | |
tree | d1dc53bab2280c074359fef216d46aaf7e330111 /llvm/lib | |
parent | 892c6c86ea25dc97668ff1f1b7bf1108e85fa5ec (diff) | |
download | bcm5719-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.cpp | 69 | ||||
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp | 13 |
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; |