Files
gps/tools/local/circt/include/mlir/Dialect/UB/IR/UBMatchers.h
T
2026-07-12 11:01:51 +03:00

53 lines
1.7 KiB
C++

//===- UBMatchers.h - UB Dialect matchers -----------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This file provides matchers for the UB dialect, in particular for matching
// poison values and attributes.
//
//===----------------------------------------------------------------------===//
#ifndef MLIR_DIALECT_UB_IR_UBMATCHERS_H
#define MLIR_DIALECT_UB_IR_UBMATCHERS_H
#include "mlir/Dialect/UB/IR/UBOps.h"
#include "mlir/IR/Matchers.h"
namespace mlir::ub {
namespace detail {
/// Matches a poison attribute (any attribute implementing PoisonAttrInterface).
/// Supports matching against both Attribute and Operation* (via constant
/// folding).
struct poison_attr_matcher {
bool match(Attribute attr) { return isa<PoisonAttrInterface>(attr); }
bool match(Operation *op) {
Attribute attr;
if (!::mlir::detail::constant_op_binder<Attribute>(&attr).match(op))
return false;
return match(attr);
}
};
} // namespace detail
/// Matches a poison constant (any attribute implementing PoisonAttrInterface).
/// Works with `matchPattern` on Value, Operation*, and Attribute.
///
/// Examples:
/// matchPattern(value, ub::m_Poison()) // Matches ub.poison op via Value.
/// matchPattern(op, ub::m_Poison()) // Matches ub.poison op directly.
/// matchPattern(attr, ub::m_Poison()) // Matches PoisonAttr(Interface).
inline detail::poison_attr_matcher m_Poison() {
return detail::poison_attr_matcher();
}
} // namespace mlir::ub
#endif // MLIR_DIALECT_UB_IR_UBMATCHERS_H