diff options
Diffstat (limited to 'mlir/lib/Dialect/IRDL/IR/IRDLOps.cpp')
-rw-r--r-- | mlir/lib/Dialect/IRDL/IR/IRDLOps.cpp | 61 |
1 files changed, 50 insertions, 11 deletions
diff --git a/mlir/lib/Dialect/IRDL/IR/IRDLOps.cpp b/mlir/lib/Dialect/IRDL/IR/IRDLOps.cpp index a9956cc630cc..c0e839720200 100644 --- a/mlir/lib/Dialect/IRDL/IR/IRDLOps.cpp +++ b/mlir/lib/Dialect/IRDL/IR/IRDLOps.cpp @@ -12,16 +12,18 @@ using namespace mlir; using namespace mlir::irdl; std::unique_ptr<Constraint> Is::getVerifier( - SmallVector<Value> const &valueToConstr, - DenseMap<TypeOp, std::unique_ptr<DynamicTypeDefinition>> &types, - DenseMap<AttributeOp, std::unique_ptr<DynamicAttrDefinition>> &attrs) { + ArrayRef<Value> valueToConstr, + DenseMap<TypeOp, std::unique_ptr<DynamicTypeDefinition>> const &types, + DenseMap<AttributeOp, std::unique_ptr<DynamicAttrDefinition>> const + &attrs) { return std::make_unique<IsConstraint>(getExpectedAttr()); } std::unique_ptr<Constraint> Parametric::getVerifier( - SmallVector<Value> const &valueToConstr, - DenseMap<TypeOp, std::unique_ptr<DynamicTypeDefinition>> &types, - DenseMap<AttributeOp, std::unique_ptr<DynamicAttrDefinition>> &attrs) { + ArrayRef<Value> valueToConstr, + DenseMap<TypeOp, std::unique_ptr<DynamicTypeDefinition>> const &types, + DenseMap<AttributeOp, std::unique_ptr<DynamicAttrDefinition>> const + &attrs) { SmallVector<unsigned> constraints; for (Value arg : getArgs()) { for (auto [i, value] : enumerate(valueToConstr)) { @@ -42,20 +44,57 @@ std::unique_ptr<Constraint> Parametric::getVerifier( } if (auto typeOp = dyn_cast<TypeOp>(defOp)) - return std::make_unique<DynParametricTypeConstraint>(types[typeOp].get(), + return std::make_unique<DynParametricTypeConstraint>(types.at(typeOp).get(), constraints); if (auto attrOp = dyn_cast<AttributeOp>(defOp)) - return std::make_unique<DynParametricAttrConstraint>(attrs[attrOp].get(), + return std::make_unique<DynParametricAttrConstraint>(attrs.at(attrOp).get(), constraints); llvm_unreachable("verifier should ensure that the referenced operation is " "either a type or an attribute definition"); } +std::unique_ptr<Constraint> AnyOf::getVerifier( + ArrayRef<Value> valueToConstr, + DenseMap<TypeOp, std::unique_ptr<DynamicTypeDefinition>> const &types, + DenseMap<AttributeOp, std::unique_ptr<DynamicAttrDefinition>> const + &attrs) { + SmallVector<unsigned> constraints; + for (Value arg : getArgs()) { + for (auto [i, value] : enumerate(valueToConstr)) { + if (value == arg) { + constraints.push_back(i); + break; + } + } + } + + return std::make_unique<AnyOfConstraint>(constraints); +} + +std::unique_ptr<Constraint> AllOf::getVerifier( + ArrayRef<Value> valueToConstr, + DenseMap<TypeOp, std::unique_ptr<DynamicTypeDefinition>> const &types, + DenseMap<AttributeOp, std::unique_ptr<DynamicAttrDefinition>> const + &attrs) { + SmallVector<unsigned> constraints; + for (Value arg : getArgs()) { + for (auto [i, value] : enumerate(valueToConstr)) { + if (value == arg) { + constraints.push_back(i); + break; + } + } + } + + return std::make_unique<AllOfConstraint>(constraints); +} + std::unique_ptr<Constraint> Any::getVerifier( - SmallVector<Value> const &valueToConstr, - DenseMap<TypeOp, std::unique_ptr<DynamicTypeDefinition>> &types, - DenseMap<AttributeOp, std::unique_ptr<DynamicAttrDefinition>> &attrs) { + ArrayRef<Value> valueToConstr, + DenseMap<TypeOp, std::unique_ptr<DynamicTypeDefinition>> const &types, + DenseMap<AttributeOp, std::unique_ptr<DynamicAttrDefinition>> const + &attrs) { return std::make_unique<AnyAttributeConstraint>(); } |