aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/ValueTracking.cpp
diff options
context:
space:
mode:
authorChen Zheng <shchenz@cn.ibm.com>2018-07-16 02:23:00 +0000
committerChen Zheng <shchenz@cn.ibm.com>2018-07-16 02:23:00 +0000
commitccc84224644e267fce8b70e32833b887f4e12a61 (patch)
treeb0de6e3467e292939aa385041e10c8c2b751e1f7 /llvm/lib/Analysis/ValueTracking.cpp
parent734e3928b355aef644b6646741f87bc55fd2a27d (diff)
downloadllvm-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.cpp63
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))