@@ -2711,8 +2711,7 @@ legalizeUnresolvedMaterialization(RewriterBase &rewriter,
2711
2711
}
2712
2712
2713
2713
LogicalResult OperationConverter::convertOperations (ArrayRef<Operation *> ops) {
2714
- if (ops.empty ())
2715
- return success ();
2714
+ assert (!ops.empty () && " expected at least one operation" );
2716
2715
const ConversionTarget &target = opLegalizer.getTarget ();
2717
2716
2718
2717
// Compute the set of operations and blocks to convert.
@@ -3415,16 +3414,47 @@ void mlir::registerConversionPDLFunctions(RewritePatternSet &patterns) {
3415
3414
// Op Conversion Entry Points
3416
3415
// ===----------------------------------------------------------------------===//
3417
3416
3417
+ // / This is the type of Action that is dispatched when a conversion is applied.
3418
+ class ApplyConversionAction
3419
+ : public tracing::ActionImpl<ApplyConversionAction> {
3420
+ public:
3421
+ using Base = tracing::ActionImpl<ApplyConversionAction>;
3422
+ ApplyConversionAction (ArrayRef<IRUnit> irUnits) : Base(irUnits) {}
3423
+ static constexpr StringLiteral tag = " apply-conversion" ;
3424
+ static constexpr StringLiteral desc =
3425
+ " Encapsulate the application of a dialect conversion" ;
3426
+
3427
+ void print (raw_ostream &os) const override { os << tag; }
3428
+ };
3429
+
3430
+ static LogicalResult applyConversion (ArrayRef<Operation *> ops,
3431
+ const ConversionTarget &target,
3432
+ const FrozenRewritePatternSet &patterns,
3433
+ ConversionConfig config,
3434
+ OpConversionMode mode) {
3435
+ if (ops.empty ())
3436
+ return success ();
3437
+ MLIRContext *ctx = ops.front ()->getContext ();
3438
+ LogicalResult status = success ();
3439
+ SmallVector<IRUnit> irUnits (ops.begin (), ops.end ());
3440
+ ctx->executeAction <ApplyConversionAction>(
3441
+ [&] {
3442
+ OperationConverter opConverter (target, patterns, config, mode);
3443
+ status = opConverter.convertOperations (ops);
3444
+ },
3445
+ irUnits);
3446
+ return status;
3447
+ }
3448
+
3418
3449
// ===----------------------------------------------------------------------===//
3419
3450
// Partial Conversion
3420
3451
// ===----------------------------------------------------------------------===//
3421
3452
3422
3453
LogicalResult mlir::applyPartialConversion (
3423
3454
ArrayRef<Operation *> ops, const ConversionTarget &target,
3424
3455
const FrozenRewritePatternSet &patterns, ConversionConfig config) {
3425
- OperationConverter opConverter (target, patterns, config,
3426
- OpConversionMode::Partial);
3427
- return opConverter.convertOperations (ops);
3456
+ return applyConversion (ops, target, patterns, config,
3457
+ OpConversionMode::Partial);
3428
3458
}
3429
3459
LogicalResult
3430
3460
mlir::applyPartialConversion (Operation *op, const ConversionTarget &target,
@@ -3441,9 +3471,7 @@ LogicalResult mlir::applyFullConversion(ArrayRef<Operation *> ops,
3441
3471
const ConversionTarget &target,
3442
3472
const FrozenRewritePatternSet &patterns,
3443
3473
ConversionConfig config) {
3444
- OperationConverter opConverter (target, patterns, config,
3445
- OpConversionMode::Full);
3446
- return opConverter.convertOperations (ops);
3474
+ return applyConversion (ops, target, patterns, config, OpConversionMode::Full);
3447
3475
}
3448
3476
LogicalResult mlir::applyFullConversion (Operation *op,
3449
3477
const ConversionTarget &target,
@@ -3510,9 +3538,8 @@ LogicalResult mlir::applyAnalysisConversion(
3510
3538
// Convert the cloned operations. The original IR will remain unchanged.
3511
3539
SmallVector<Operation *> opsToConvert = llvm::map_to_vector (
3512
3540
ops, [&](Operation *op) { return mapping.lookup (op); });
3513
- OperationConverter opConverter (target, patterns, config,
3514
- OpConversionMode::Analysis);
3515
- LogicalResult status = opConverter.convertOperations (opsToConvert);
3541
+ LogicalResult status = applyConversion (opsToConvert, target, patterns, config,
3542
+ OpConversionMode::Analysis);
3516
3543
3517
3544
// Remap `legalizableOps`, so that they point to the original ops and not the
3518
3545
// cloned ops.
0 commit comments