diff --git a/mlir/include/mlir/IR/Unit.h b/mlir/include/mlir/IR/Unit.h index 63117a7664a7d..0e99f8e25f326 100644 --- a/mlir/include/mlir/IR/Unit.h +++ b/mlir/include/mlir/IR/Unit.h @@ -22,7 +22,7 @@ class Region; class Block; class Value; -/// IRUnit is a union of the different types of IR objects that consistute the +/// IRUnit is a union of the different types of IR objects that constitute the /// IR structure (other than Type and Attribute), that is Operation, Region, and /// Block. class IRUnit : public PointerUnion { diff --git a/mlir/lib/Transforms/Utils/DialectConversion.cpp b/mlir/lib/Transforms/Utils/DialectConversion.cpp index 60b72fadf30ab..d118fe422f2f2 100644 --- a/mlir/lib/Transforms/Utils/DialectConversion.cpp +++ b/mlir/lib/Transforms/Utils/DialectConversion.cpp @@ -2711,8 +2711,7 @@ legalizeUnresolvedMaterialization(RewriterBase &rewriter, } LogicalResult OperationConverter::convertOperations(ArrayRef ops) { - if (ops.empty()) - return success(); + assert(!ops.empty() && "expected at least one operation"); const ConversionTarget &target = opLegalizer.getTarget(); // Compute the set of operations and blocks to convert. @@ -3415,6 +3414,38 @@ void mlir::registerConversionPDLFunctions(RewritePatternSet &patterns) { // Op Conversion Entry Points //===----------------------------------------------------------------------===// +/// This is the type of Action that is dispatched when a conversion is applied. +class ApplyConversionAction + : public tracing::ActionImpl { +public: + using Base = tracing::ActionImpl; + ApplyConversionAction(ArrayRef irUnits) : Base(irUnits) {} + static constexpr StringLiteral tag = "apply-conversion"; + static constexpr StringLiteral desc = + "Encapsulate the application of a dialect conversion"; + + void print(raw_ostream &os) const override { os << tag; } +}; + +static LogicalResult applyConversion(ArrayRef ops, + const ConversionTarget &target, + const FrozenRewritePatternSet &patterns, + ConversionConfig config, + OpConversionMode mode) { + if (ops.empty()) + return success(); + MLIRContext *ctx = ops.front()->getContext(); + LogicalResult status = success(); + SmallVector irUnits(ops.begin(), ops.end()); + ctx->executeAction( + [&] { + OperationConverter opConverter(target, patterns, config, mode); + status = opConverter.convertOperations(ops); + }, + irUnits); + return status; +} + //===----------------------------------------------------------------------===// // Partial Conversion //===----------------------------------------------------------------------===// @@ -3422,9 +3453,8 @@ void mlir::registerConversionPDLFunctions(RewritePatternSet &patterns) { LogicalResult mlir::applyPartialConversion( ArrayRef ops, const ConversionTarget &target, const FrozenRewritePatternSet &patterns, ConversionConfig config) { - OperationConverter opConverter(target, patterns, config, - OpConversionMode::Partial); - return opConverter.convertOperations(ops); + return applyConversion(ops, target, patterns, config, + OpConversionMode::Partial); } LogicalResult mlir::applyPartialConversion(Operation *op, const ConversionTarget &target, @@ -3441,9 +3471,7 @@ LogicalResult mlir::applyFullConversion(ArrayRef ops, const ConversionTarget &target, const FrozenRewritePatternSet &patterns, ConversionConfig config) { - OperationConverter opConverter(target, patterns, config, - OpConversionMode::Full); - return opConverter.convertOperations(ops); + return applyConversion(ops, target, patterns, config, OpConversionMode::Full); } LogicalResult mlir::applyFullConversion(Operation *op, const ConversionTarget &target, @@ -3510,9 +3538,8 @@ LogicalResult mlir::applyAnalysisConversion( // Convert the cloned operations. The original IR will remain unchanged. SmallVector opsToConvert = llvm::map_to_vector( ops, [&](Operation *op) { return mapping.lookup(op); }); - OperationConverter opConverter(target, patterns, config, - OpConversionMode::Analysis); - LogicalResult status = opConverter.convertOperations(opsToConvert); + LogicalResult status = applyConversion(opsToConvert, target, patterns, config, + OpConversionMode::Analysis); // Remap `legalizableOps`, so that they point to the original ops and not the // cloned ops. diff --git a/mlir/test/Transforms/test-legalizer.mlir b/mlir/test/Transforms/test-legalizer.mlir index 79518b04e7158..07ad5507610c0 100644 --- a/mlir/test/Transforms/test-legalizer.mlir +++ b/mlir/test/Transforms/test-legalizer.mlir @@ -1,10 +1,18 @@ -// RUN: mlir-opt -allow-unregistered-dialect -split-input-file -test-legalize-patterns -verify-diagnostics %s | FileCheck %s - +// RUN: mlir-opt -allow-unregistered-dialect -split-input-file -test-legalize-patterns -verify-diagnostics -profile-actions-to=- %s | FileCheck %s + +// CHECK: "name": "pass-execution", "cat": "PERF", "ph": "B" +// CHECK: "name": "apply-conversion", "cat": "PERF", "ph": "B" +// CHECK: "name": "apply-pattern", "cat": "PERF", "ph": "B" +// CHECK: "name": "apply-pattern", "cat": "PERF", "ph": "E" +// Note: Listener notifications appear after the pattern application because +// the conversion driver sends all notifications at the end of the conversion +// in bulk. // CHECK: notifyOperationInserted: test.legal_op_a, was unlinked // CHECK-NEXT: notifyOperationReplaced: test.illegal_op_a // CHECK-NEXT: notifyOperationModified: func.return // CHECK-NEXT: notifyOperationErased: test.illegal_op_a - +// CHECK: "name": "apply-conversion", "cat": "PERF", "ph": "E" +// CHECK: "name": "pass-execution", "cat": "PERF", "ph": "E" // CHECK-LABEL: verifyDirectPattern func.func @verifyDirectPattern() -> i32 { // CHECK-NEXT: "test.legal_op_a"() <{status = "Success"}