diff --git a/mlir/docs/DialectConversion.md b/mlir/docs/DialectConversion.md --- a/mlir/docs/DialectConversion.md +++ b/mlir/docs/DialectConversion.md @@ -67,9 +67,6 @@ - This action signals that only some instances of a given operation are legal. This allows for defining fine-tune constraints, e.g. saying that `addi` is only legal when operating on 32-bit integers. - - If a specific handler is not provided when setting the action, the - target must override the `isDynamicallyLegal` hook provided by - `ConversionTarget`. * Illegal @@ -97,10 +94,7 @@ /// Mark all operations within Affine dialect have dynamic legality /// constraints. - addDynamicallyLegalDialect(); - - /// Mark `std.return` as dynamically legal. - addDynamicallyLegalOp(); + addDynamicallyLegalDialect([](Operation *op) { ... }); /// Mark `std.return` as dynamically legal, but provide a specific legality /// callback. @@ -108,7 +102,6 @@ /// Treat unknown operations, i.e. those without a legalization action /// directly set, as dynamically legal. - markUnknownOpDynamicallyLegal(); markUnknownOpDynamicallyLegal([](Operation *op) { ... }); //-------------------------------------------------------------------------- diff --git a/mlir/include/mlir/Transforms/DialectConversion.h b/mlir/include/mlir/Transforms/DialectConversion.h --- a/mlir/include/mlir/Transforms/DialectConversion.h +++ b/mlir/include/mlir/Transforms/DialectConversion.h @@ -622,7 +622,6 @@ using DynamicLegalityCallbackFn = std::function; ConversionTarget(MLIRContext &ctx) : ctx(ctx) {} - virtual ~ConversionTarget() = default; //===--------------------------------------------------------------------===// // Legality Registration @@ -646,18 +645,6 @@ addLegalOp(); } - /// Register the given operation as dynamically legal, i.e. requiring custom - /// handling by the target via 'isDynamicallyLegal'. - template - void addDynamicallyLegalOp() { - setOpAction(LegalizationAction::Dynamic); - } - template - void addDynamicallyLegalOp() { - addDynamicallyLegalOp(); - addDynamicallyLegalOp(); - } - /// Register the given operation as dynamically legal and set the dynamic /// legalization callback to the one provided. template @@ -731,31 +718,26 @@ } /// Register the operations of the given dialects as dynamically legal, i.e. - /// requiring custom handling by the target via 'isDynamicallyLegal'. + /// requiring custom handling by the callback. template - void addDynamicallyLegalDialect(StringRef name, Names... names) { + void addDynamicallyLegalDialect(DynamicLegalityCallbackFn callback, + StringRef name, Names... names) { SmallVector dialectNames({name, names...}); setDialectAction(dialectNames, LegalizationAction::Dynamic); + setLegalityCallback(dialectNames, std::move(callback)); } template - void addDynamicallyLegalDialect(DynamicLegalityCallbackFn callback = {}) { - SmallVector dialectNames({Args::getDialectNamespace()...}); - setDialectAction(dialectNames, LegalizationAction::Dynamic); - if (callback) - setLegalityCallback(dialectNames, callback); + void addDynamicallyLegalDialect(DynamicLegalityCallbackFn callback) { + addDynamicallyLegalDialect(std::move(callback), + Args::getDialectNamespace()...); } /// Register unknown operations as dynamically legal. For operations(and /// dialects) that do not have a set legalization action, treat them as - /// dynamically legal and invoke the given callback if valid or - /// 'isDynamicallyLegal'. + /// dynamically legal and invoke the given callback. void markUnknownOpDynamicallyLegal(const DynamicLegalityCallbackFn &fn) { setLegalityCallback(fn); } - void markUnknownOpDynamicallyLegal() { - setLegalityCallback( - [this](Operation *op) { return isDynamicallyLegal(op); }); - } /// Register the operations of the given dialects as illegal, i.e. /// operations of this dialect are not supported by the target. @@ -782,14 +764,6 @@ /// legal, None is returned. Optional isLegal(Operation *op) const; -protected: - /// Runs a custom legalization query for the given operation. This should - /// return true if the given operation is legal, otherwise false. - virtual bool isDynamicallyLegal(Operation *op) const { - llvm_unreachable( - "targets with custom legalization must override 'isDynamicallyLegal'"); - } - private: /// Set the dynamic legality callback for the given operation. void setLegalityCallback(OperationName name, diff --git a/mlir/lib/Transforms/Utils/DialectConversion.cpp b/mlir/lib/Transforms/Utils/DialectConversion.cpp --- a/mlir/lib/Transforms/Utils/DialectConversion.cpp +++ b/mlir/lib/Transforms/Utils/DialectConversion.cpp @@ -2700,10 +2700,9 @@ // Returns true if this operation instance is known to be legal. auto isOpLegal = [&] { - // Handle dynamic legality either with the provided legality function, or - // the default hook on the derived instance. + // Handle dynamic legality either with the provided legality function. if (info->action == LegalizationAction::Dynamic) - return info->legalityFn ? info->legalityFn(op) : isDynamicallyLegal(op); + return info->legalityFn(op); // Otherwise, the operation is only legal if it was marked 'Legal'. return info->action == LegalizationAction::Legal;