@@ -259,86 +259,65 @@ inline match_combine_and<LTy, RTy> m_CombineAnd(const LTy &L, const RTy &R) {
259259  return  match_combine_and<LTy, RTy>(L, R);
260260}
261261
262- struct  apint_match  {
263-   const  APInt *&Res;
262+ template  <typename  APTy> struct  ap_match  {
263+   static_assert (std::is_same_v<APTy, APInt> || std::is_same_v<APTy, APFloat>);
264+   using  ConstantTy =
265+       std::conditional_t <std::is_same_v<APTy, APInt>, ConstantInt, ConstantFP>;
266+ 
267+   const  APTy *&Res;
264268  bool  AllowPoison;
265269
266-   apint_match (const  APInt  *&Res, bool  AllowPoison)
270+   ap_match (const  APTy  *&Res, bool  AllowPoison)
267271      : Res(Res), AllowPoison(AllowPoison) {}
268272
269273  template  <typename  ITy> bool  match (ITy *V) const  {
270-     if  (auto  *CI = dyn_cast<ConstantInt >(V)) {
274+     if  (auto  *CI = dyn_cast<ConstantTy >(V)) {
271275      Res = &CI->getValue ();
272276      return  true ;
273277    }
274278    if  (V->getType ()->isVectorTy ())
275279      if  (const  auto  *C = dyn_cast<Constant>(V))
276280        if  (auto  *CI =
277-                 dyn_cast_or_null<ConstantInt >(C->getSplatValue (AllowPoison))) {
281+                 dyn_cast_or_null<ConstantTy >(C->getSplatValue (AllowPoison))) {
278282          Res = &CI->getValue ();
279283          return  true ;
280284        }
281285    return  false ;
282286  }
283287};
284- //  Either constexpr if or renaming ConstantFP::getValueAPF to
285- //  ConstantFP::getValue is needed to do it via single template
286- //  function for both apint/apfloat.
287- struct  apfloat_match  {
288-   const  APFloat *&Res;
289-   bool  AllowPoison;
290- 
291-   apfloat_match (const  APFloat *&Res, bool  AllowPoison)
292-       : Res(Res), AllowPoison(AllowPoison) {}
293- 
294-   template  <typename  ITy> bool  match (ITy *V) const  {
295-     if  (auto  *CI = dyn_cast<ConstantFP>(V)) {
296-       Res = &CI->getValueAPF ();
297-       return  true ;
298-     }
299-     if  (V->getType ()->isVectorTy ())
300-       if  (const  auto  *C = dyn_cast<Constant>(V))
301-         if  (auto  *CI =
302-                 dyn_cast_or_null<ConstantFP>(C->getSplatValue (AllowPoison))) {
303-           Res = &CI->getValueAPF ();
304-           return  true ;
305-         }
306-     return  false ;
307-   }
308- };
309288
310289// / Match a ConstantInt or splatted ConstantVector, binding the
311290// / specified pointer to the contained APInt.
312- inline  apint_match  m_APInt (const  APInt *&Res) {
291+ inline  ap_match<APInt>  m_APInt (const  APInt *&Res) {
313292  //  Forbid poison by default to maintain previous behavior.
314-   return  apint_match (Res, /*  AllowPoison */ false );
293+   return  ap_match<APInt> (Res, /*  AllowPoison */ false );
315294}
316295
317296// / Match APInt while allowing poison in splat vector constants.
318- inline  apint_match  m_APIntAllowPoison (const  APInt *&Res) {
319-   return  apint_match (Res, /*  AllowPoison */ true );
297+ inline  ap_match<APInt>  m_APIntAllowPoison (const  APInt *&Res) {
298+   return  ap_match<APInt> (Res, /*  AllowPoison */ true );
320299}
321300
322301// / Match APInt while forbidding poison in splat vector constants.
323- inline  apint_match  m_APIntForbidPoison (const  APInt *&Res) {
324-   return  apint_match (Res, /*  AllowPoison */ false );
302+ inline  ap_match<APInt>  m_APIntForbidPoison (const  APInt *&Res) {
303+   return  ap_match<APInt> (Res, /*  AllowPoison */ false );
325304}
326305
327306// / Match a ConstantFP or splatted ConstantVector, binding the
328307// / specified pointer to the contained APFloat.
329- inline  apfloat_match  m_APFloat (const  APFloat *&Res) {
308+ inline  ap_match<APFloat>  m_APFloat (const  APFloat *&Res) {
330309  //  Forbid undefs by default to maintain previous behavior.
331-   return  apfloat_match (Res, /*  AllowPoison */ false );
310+   return  ap_match<APFloat> (Res, /*  AllowPoison */ false );
332311}
333312
334313// / Match APFloat while allowing poison in splat vector constants.
335- inline  apfloat_match  m_APFloatAllowPoison (const  APFloat *&Res) {
336-   return  apfloat_match (Res, /*  AllowPoison */ true );
314+ inline  ap_match<APFloat>  m_APFloatAllowPoison (const  APFloat *&Res) {
315+   return  ap_match<APFloat> (Res, /*  AllowPoison */ true );
337316}
338317
339318// / Match APFloat while forbidding poison in splat vector constants.
340- inline  apfloat_match  m_APFloatForbidPoison (const  APFloat *&Res) {
341-   return  apfloat_match (Res, /*  AllowPoison */ false );
319+ inline  ap_match<APFloat>  m_APFloatForbidPoison (const  APFloat *&Res) {
320+   return  ap_match<APFloat> (Res, /*  AllowPoison */ false );
342321}
343322
344323template  <int64_t  Val> struct  constantint_match  {
@@ -1027,7 +1006,7 @@ struct bind_const_intval_ty {
10271006
10281007  template  <typename  ITy> bool  match (ITy *V) const  {
10291008    const  APInt *ConstInt;
1030-     if  (!apint_match (ConstInt, /* AllowPoison=*/ false ).match (V))
1009+     if  (!ap_match<APInt> (ConstInt, /* AllowPoison=*/ false ).match (V))
10311010      return  false ;
10321011    if  (ConstInt->getActiveBits () > 64 )
10331012      return  false ;
0 commit comments