summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Analysis/CmpInstAnalysis.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Analysis/CmpInstAnalysis.cpp')
-rw-r--r--llvm/lib/Analysis/CmpInstAnalysis.cpp13
1 files changed, 10 insertions, 3 deletions
diff --git a/llvm/lib/Analysis/CmpInstAnalysis.cpp b/llvm/lib/Analysis/CmpInstAnalysis.cpp
index c879b8729dc..159c1a2d135 100644
--- a/llvm/lib/Analysis/CmpInstAnalysis.cpp
+++ b/llvm/lib/Analysis/CmpInstAnalysis.cpp
@@ -66,9 +66,11 @@ bool llvm::PredicatesFoldable(ICmpInst::Predicate p1, ICmpInst::Predicate p2) {
bool llvm::decomposeBitTestICmp(Value *LHS, Value *RHS,
CmpInst::Predicate &Pred,
- Value *&X, APInt &Mask) {
+ Value *&X, APInt &Mask, bool LookThruTrunc) {
+ using namespace PatternMatch;
+
const APInt *C;
- if (!match(RHS, PatternMatch::m_APInt(C)))
+ if (!match(RHS, m_APInt(C)))
return false;
switch (Pred) {
@@ -132,6 +134,11 @@ bool llvm::decomposeBitTestICmp(Value *LHS, Value *RHS,
break;
}
- X = LHS;
+ if (LookThruTrunc && match(LHS, m_Trunc(m_Value(X)))) {
+ Mask = Mask.zext(X->getType()->getScalarSizeInBits());
+ } else {
+ X = LHS;
+ }
+
return true;
}
OpenPOWER on IntegriCloud