From: Craig Topper Date: Fri, 7 Jul 2017 19:56:20 +0000 (+0000) Subject: [PatternMatch] Implement m_One and m_AllOnes using Constant::isOneValue/isAllOnesValu... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=caa219e9a883606c37f8e75ef025e5b1e24a3259;p=llvm [PatternMatch] Implement m_One and m_AllOnes using Constant::isOneValue/isAllOnesValue instead of doing our own splat detection and checking the resulting APInt. Should result in less compiled code. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@307431 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/IR/PatternMatch.h b/include/llvm/IR/PatternMatch.h index 5b69e7855cc..3d15f9d0bb0 100644 --- a/include/llvm/IR/PatternMatch.h +++ b/include/llvm/IR/PatternMatch.h @@ -176,6 +176,28 @@ struct match_nan { /// Match an arbitrary NaN constant. This includes quiet and signalling nans. inline match_nan m_NaN() { return match_nan(); } +struct match_one { + template bool match(ITy *V) { + if (const auto *C = dyn_cast(V)) + return C->isOneValue(); + return false; + } +}; + +/// \brief Match an integer 1 or a vector with all elements equal to 1. +inline match_one m_One() { return match_one(); } + +struct match_all_ones { + template bool match(ITy *V) { + if (const auto *C = dyn_cast(V)) + return C->isAllOnesValue(); + return false; + } +}; + +/// \brief Match an integer 1 or a vector with all elements equal to 1. +inline match_all_ones m_AllOnes() { return match_all_ones(); } + struct apint_match { const APInt *&Res; @@ -259,24 +281,6 @@ template struct api_pred_ty : public Predicate { } }; -struct is_one { - bool isValue(const APInt &C) { return C.isOneValue(); } -}; - -/// \brief Match an integer 1 or a vector with all elements equal to 1. -inline cst_pred_ty m_One() { return cst_pred_ty(); } -inline api_pred_ty m_One(const APInt *&V) { return V; } - -struct is_all_ones { - bool isValue(const APInt &C) { return C.isAllOnesValue(); } -}; - -/// \brief Match an integer or vector with all bits set to true. -inline cst_pred_ty m_AllOnes() { - return cst_pred_ty(); -} -inline api_pred_ty m_AllOnes(const APInt *&V) { return V; } - struct is_sign_mask { bool isValue(const APInt &C) { return C.isSignMask(); } };