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,36 @@ } }; +/// 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(); + SmallVector steps; + SmallVector upperBound; + SmallVector lowerBound; + upperBound = *expandAffineMap(rewriter, loc, op.upperBoundsMap(), + op.getUpperBoundsOperands()); + lowerBound = *expandAffineMap(rewriter, loc, op.lowerBoundsMap(), + op.getLowerBoundsOperands()); + 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 +645,7 @@ AffineLoadLowering, AffineMinLowering, AffineMaxLowering, + AffineParallelLowering, AffinePrefetchLowering, AffineStoreLowering, AffineForLowering, diff --git a/mlir/test/Conversion/AffineToStandard/lower-affine.mlir b/mlir/test/Conversion/AffineToStandard/lower-affine.mlir --- a/mlir/test/Conversion/AffineToStandard/lower-affine.mlir +++ b/mlir/test/Conversion/AffineToStandard/lower-affine.mlir @@ -620,3 +620,19 @@ %0 = affine.max affine_map<(d0,d1) -> (d0 - d1, d1 - d0)>(%arg0, %arg1) return %0 : index } + +// CHECK-LABEL: func @dot( +// CHECK-SAME: %[[ARG0:.*]]: memref<100x100xf32>, %[[ARG1:.*]]: memref<100x100xf32>) { +func @dot(%o: memref<100x100xf32>, %a: memref<100x100xf32>) { + affine.parallel (%i, %j) = (0, 0) to (100, 100) { + } + return +} + +// CHECK-DAG: %[[C100:.*]] = constant 100 +// CHECK-DAG: %[[C100_1:.*]] = constant 100 +// CHECK-DAG: %[[C0:.*]] = constant 0 +// CHECK-DAG: %[[C0_1:.*]] = constant 0 +// CHECK-DAG: %[[C1:.*]] = constant 1 +// CHECK-DAG: %[[C1_1:.*]] = constant 1 +// CHECK-DAG: scf.parallel (%arg2, %arg3) = (%[[C0]], %[[C0_1]]) to (%[[C100]], %[[C100_1]]) step (%[[C1]], %[[C1_1]]) {