Reland r216439 215441, majnemer has a real fix for PR20771.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@216586 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Nico Weber
2014-08-27 20:06:19 +00:00
parent 1a7f705fba
commit 1c768816d7
3 changed files with 142 additions and 11 deletions
+23
View File
@@ -362,6 +362,29 @@ struct bind_const_intval_ty {
}
};
/// Match a specified integer value or vector of all elements of that value.
struct specific_intval {
uint64_t Val;
specific_intval(uint64_t V) : Val(V) {}
template<typename ITy>
bool match(ITy *V) {
ConstantInt *CI = dyn_cast<ConstantInt>(V);
if (!CI && V->getType()->isVectorTy())
if (const auto *C = dyn_cast<Constant>(V))
CI = dyn_cast_or_null<ConstantInt>(C->getSplatValue());
if (CI && CI->getBitWidth() <= 64)
return CI->getZExtValue() == Val;
return false;
}
};
/// Match a specific integer value or vector with all elements equal to the
/// value.
inline specific_intval m_SpecificInt(uint64_t V) { return specific_intval(V); }
/// m_ConstantInt - Match a ConstantInt and bind to its value. This does not
/// match ConstantInts wider than 64-bits.
inline bind_const_intval_ty m_ConstantInt(uint64_t &V) { return V; }