1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-20 03:23:01 +02:00

[PatternMatch] Implemenet m_SignMask using Constant::isMinSignedValue instead of doing splat detection and analyzing the resulting APInt.

llvm-svn: 307433
This commit is contained in:
Craig Topper 2017-07-07 19:56:23 +00:00
parent 9f5201ba3f
commit df1b021333

View File

@ -204,6 +204,17 @@ struct match_all_ones {
/// \brief Match an integer or vector with all bits set to true.
inline match_all_ones m_AllOnes() { return match_all_ones(); }
struct match_sign_mask {
template <typename ITy> bool match(ITy *V) {
if (const auto *C = dyn_cast<Constant>(V))
return C->isMinSignedValue();
return false;
}
};
/// \brief Match an integer or vector with only the sign bit(s) set.
inline match_sign_mask m_SignMask() { return match_sign_mask(); }
struct apint_match {
const APInt *&Res;
@ -287,16 +298,6 @@ template <typename Predicate> struct api_pred_ty : public Predicate {
}
};
struct is_sign_mask {
bool isValue(const APInt &C) { return C.isSignMask(); }
};
/// \brief Match an integer or vector with only the sign bit(s) set.
inline cst_pred_ty<is_sign_mask> m_SignMask() {
return cst_pred_ty<is_sign_mask>();
}
inline api_pred_ty<is_sign_mask> m_SignMask(const APInt *&V) { return V; }
struct is_power2 {
bool isValue(const APInt &C) { return C.isPowerOf2(); }
};