diff --git a/mlir/include/mlir/Conversion/AffineToStandard/AffineToStandard.h b/mlir/include/mlir/Conversion/AffineToStandard/AffineToStandard.h --- a/mlir/include/mlir/Conversion/AffineToStandard/AffineToStandard.h +++ b/mlir/include/mlir/Conversion/AffineToStandard/AffineToStandard.h @@ -15,6 +15,7 @@ class AffineExpr; class AffineForOp; class AffineMap; +class AffineParallelOp; class Location; struct LogicalResult; class MLIRContext; diff --git a/mlir/lib/Conversion/AffineToStandard/AffineToStandard.cpp b/mlir/lib/Conversion/AffineToStandard/AffineToStandard.cpp --- a/mlir/lib/Conversion/AffineToStandard/AffineToStandard.cpp +++ b/mlir/lib/Conversion/AffineToStandard/AffineToStandard.cpp @@ -357,6 +357,34 @@ } }; +/// Convert an "affine.parallel" (loop nest) operation into a "scf.parallel" +/// operation. +class AffineParallelLowering : public OpRewritePattern { +public: + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(AffineParallelOp op, + PatternRewriter &rewriter) const override { + Location loc = op.getLoc(); + ValueRange upperBound = *expandAffineMap(rewriter, loc, op.upperBoundsMap(), + op.getUpperBoundsOperands()); + ValueRange lowerBound = *expandAffineMap(rewriter, loc, op.lowerBoundsMap(), + op.getLowerBoundsOperands()); + SmallVector steps; + for (unsigned i = 0, e = op.steps().size(); i < e; ++i) { + steps.push_back(rewriter.create( + loc, op.steps()[i].cast().getInt())); + } + auto parallelOp = + rewriter.create(loc, lowerBound, upperBound, steps); + rewriter.eraseBlock(parallelOp.getBody()); + rewriter.inlineRegionBefore(op.region(), parallelOp.region(), + parallelOp.region().end()); + rewriter.eraseOp(op); + return success(); + } +}; + class AffineIfLowering : public OpRewritePattern { public: using OpRewritePattern::OpRewritePattern; @@ -615,6 +643,7 @@ AffineLoadLowering, AffineMinLowering, AffineMaxLowering, + AffineParallelLowering, AffinePrefetchLowering, AffineStoreLowering, AffineForLowering,