diff --git a/mlir/include/mlir/Dialect/Transform/IR/TransformDialect.td b/mlir/include/mlir/Dialect/Transform/IR/TransformDialect.td --- a/mlir/include/mlir/Dialect/Transform/IR/TransformDialect.td +++ b/mlir/include/mlir/Dialect/Transform/IR/TransformDialect.td @@ -242,11 +242,29 @@ getPDLConstraintHooks() const; private: + template + void addOperationIfNotRegistered() { + Optional opName = + RegisteredOperationName::lookup(OpTy::getOperationName(), + getContext()); + if (!opName) + return addOperations(); + + if (opName->getTypeID() == TypeID::get()) + return; + + llvm::errs() << "error: extensible dialect operation '" + << OpTy::getOperationName() + << "' is already registered with a mismatching TypeID"; + abort(); + } + /// Registers operations specified as template parameters with this /// dialect. Checks that they implement the required interfaces. template void addOperationsChecked() { - addOperations(); + (void)std::initializer_list{(addOperationIfNotRegistered(), + 0)...}; #ifndef NDEBUG (void)std::initializer_list{