[llvm] [PatternMatching] Add generic API for matching constants using custom conditions (PR #85676)

via llvm-commits llvm-commits at lists.llvm.org
Sat Mar 30 18:56:10 PDT 2024


================
@@ -452,30 +470,93 @@ template <typename Predicate> struct apf_pred_ty : public Predicate {
 //
 ///////////////////////////////////////////////////////////////////////////////
 
+template <typename APTy> struct custom_checkfn {
+  function_ref<bool(const APTy &)> CheckFn;
+  bool isValue(const APTy &C) { return CheckFn(C); }
+};
+
+// Match and integer or vector where CheckFn(ele) for each element is true.
+// For vectors, undefined elements are assumed NOT to match.
+inline cst_pred_ty<custom_checkfn<APInt>, false>
+m_CheckedInt(function_ref<bool(const APInt &)> CheckFn) {
+  return cst_pred_ty<custom_checkfn<APInt>, false>{CheckFn};
+}
+
+inline api_pred_ty<custom_checkfn<APInt>, false>
+m_CheckedInt(const APInt *&V, function_ref<bool(const APInt &)> CheckFn) {
+  api_pred_ty<custom_checkfn<APInt>, false> P(V);
+  P.CheckFn = CheckFn;
+  return P;
+}
+
+// Match and integer or vector where CheckFn(ele) for each element is true.
+// For vectors, undefined elements are assumed to match.
+inline cst_or_undef_pred_ty<custom_checkfn<APInt>>
+m_CheckedIntAllowUndef(function_ref<bool(const APInt &)> CheckFn) {
+  return cst_or_undef_pred_ty<custom_checkfn<APInt>>{CheckFn};
+}
+
+inline api_or_undef_pred_ty<custom_checkfn<APInt>>
+m_CheckedIntAllowUndef(const APInt *&V,
+                       function_ref<bool(const APInt &)> CheckFn) {
+  api_or_undef_pred_ty<custom_checkfn<APInt>> P(V);
----------------
goldsteinn wrote:

Maybe there is a syntax for it, but don't know the syntax for constructing fields in inherited + base type.

https://github.com/llvm/llvm-project/pull/85676


More information about the llvm-commits mailing list