diff options
author | Chen Zheng <shchenz@cn.ibm.com> | 2018-07-16 02:23:00 +0000 |
---|---|---|
committer | Chen Zheng <shchenz@cn.ibm.com> | 2018-07-16 02:23:00 +0000 |
commit | ccc84224644e267fce8b70e32833b887f4e12a61 (patch) | |
tree | b0de6e3467e292939aa385041e10c8c2b751e1f7 /llvm/lib/Analysis/ValueTracking.cpp | |
parent | 734e3928b355aef644b6646741f87bc55fd2a27d (diff) | |
download | llvm-ccc84224644e267fce8b70e32833b887f4e12a61.zip llvm-ccc84224644e267fce8b70e32833b887f4e12a61.tar.gz llvm-ccc84224644e267fce8b70e32833b887f4e12a61.tar.bz2 |
[InstCombine] add more SPFofSPF folding
Differential Revision: https://reviews.llvm.org/D49238
llvm-svn: 337143
Diffstat (limited to 'llvm/lib/Analysis/ValueTracking.cpp')
-rw-r--r-- | llvm/lib/Analysis/ValueTracking.cpp | 63 |
1 files changed, 39 insertions, 24 deletions
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index 42bf427..054f981 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -4626,35 +4626,50 @@ static SelectPatternResult matchSelectPattern(CmpInst::Predicate Pred, case FCmpInst::FCMP_OLE: return {SPF_FMINNUM, NaNBehavior, Ordered}; } } - - // Sign-extending LHS does not change its sign, so TrueVal/FalseVal can - // match against either LHS or sext(LHS). - auto MaybeSExtLHS = m_CombineOr(m_Specific(CmpLHS), - m_SExt(m_Specific(CmpLHS))); - if ((match(TrueVal, MaybeSExtLHS) && - match(FalseVal, m_Neg(m_Specific(TrueVal)))) || - (match(FalseVal, MaybeSExtLHS) && - match(TrueVal, m_Neg(m_Specific(FalseVal))))) { - // Set LHS and RHS so that RHS is the negated operand of the select - if (match(TrueVal, MaybeSExtLHS)) { + + if (isKnownNegation(TrueVal, FalseVal)) { + // Sign-extending LHS does not change its sign, so TrueVal/FalseVal can + // match against either LHS or sext(LHS). + auto MaybeSExtCmpLHS = + m_CombineOr(m_Specific(CmpLHS), m_SExt(m_Specific(CmpLHS))); + auto ZeroOrAllOnes = m_CombineOr(m_ZeroInt(), m_AllOnes()); + auto ZeroOrOne = m_CombineOr(m_ZeroInt(), m_One()); + if (match(TrueVal, MaybeSExtCmpLHS)) { + // Set the return values. If the compare uses the negated value (-X >s 0), + // swap the return values because the negated value is always 'RHS'. LHS = TrueVal; RHS = FalseVal; - } else { + if (match(CmpLHS, m_Neg(m_Specific(FalseVal)))) + std::swap(LHS, RHS); + + // (X >s 0) ? X : -X or (X >s -1) ? X : -X --> ABS(X) + // (-X >s 0) ? -X : X or (-X >s -1) ? -X : X --> ABS(X) + if (Pred == ICmpInst::ICMP_SGT && match(CmpRHS, ZeroOrAllOnes)) + return {SPF_ABS, SPNB_NA, false}; + + // (X <s 0) ? X : -X or (X <s 1) ? X : -X --> NABS(X) + // (-X <s 0) ? -X : X or (-X <s 1) ? -X : X --> NABS(X) + if (Pred == ICmpInst::ICMP_SLT && match(CmpRHS, ZeroOrOne)) + return {SPF_NABS, SPNB_NA, false}; + } + else if (match(FalseVal, MaybeSExtCmpLHS)) { + // Set the return values. If the compare uses the negated value (-X >s 0), + // swap the return values because the negated value is always 'RHS'. LHS = FalseVal; RHS = TrueVal; + if (match(CmpLHS, m_Neg(m_Specific(TrueVal)))) + std::swap(LHS, RHS); + + // (X >s 0) ? -X : X or (X >s -1) ? -X : X --> NABS(X) + // (-X >s 0) ? X : -X or (-X >s -1) ? X : -X --> NABS(X) + if (Pred == ICmpInst::ICMP_SGT && match(CmpRHS, ZeroOrAllOnes)) + return {SPF_NABS, SPNB_NA, false}; + + // (X <s 0) ? -X : X or (X <s 1) ? -X : X --> ABS(X) + // (-X <s 0) ? X : -X or (-X <s 1) ? X : -X --> ABS(X) + if (Pred == ICmpInst::ICMP_SLT && match(CmpRHS, ZeroOrOne)) + return {SPF_ABS, SPNB_NA, false}; } - - // (X >s 0) ? X : -X or (X >s -1) ? X : -X --> ABS(X) - // (X >s 0) ? -X : X or (X >s -1) ? -X : X --> NABS(X) - if (Pred == ICmpInst::ICMP_SGT && - match(CmpRHS, m_CombineOr(m_ZeroInt(), m_AllOnes()))) - return {(LHS == TrueVal) ? SPF_ABS : SPF_NABS, SPNB_NA, false}; - - // (X <s 0) ? -X : X or (X <s 1) ? -X : X --> ABS(X) - // (X <s 0) ? X : -X or (X <s 1) ? X : -X --> NABS(X) - if (Pred == ICmpInst::ICMP_SLT && - match(CmpRHS, m_CombineOr(m_ZeroInt(), m_One()))) - return {(LHS == FalseVal) ? SPF_ABS : SPF_NABS, SPNB_NA, false}; } if (CmpInst::isIntPredicate(Pred)) |