43 ConversionPatternRewriter &rewriter)
const override {
44 auto affineParallelSteps = affineParallelOp.getSteps();
45 if (std::any_of(affineParallelSteps.begin(), affineParallelSteps.end(),
46 [](
int step) { return step > 1; }) ||
47 !affineParallelOp->getAttr(
"calyx.unroll"))
48 return rewriter.notifyMatchFailure(
50 "Please run the MLIR canonical '-lower-affine' pass.");
52 if (!affineParallelOp.getResults().empty())
53 return rewriter.notifyMatchFailure(
54 affineParallelOp,
"Currently doesn't support parallel reduction.");
56 Location loc = affineParallelOp.getLoc();
57 SmallVector<Value, 8> steps;
58 for (int64_t step : affineParallelSteps)
59 steps.push_back(rewriter.create<arith::ConstantIndexOp>(loc, step));
61 auto upperBoundTuple = mlir::affine::expandAffineMap(
62 rewriter, loc, affineParallelOp.getUpperBoundsMap(),
63 affineParallelOp.getUpperBoundsOperands());
65 auto lowerBoundTuple = mlir::affine::expandAffineMap(
66 rewriter, loc, affineParallelOp.getLowerBoundsMap(),
67 affineParallelOp.getLowerBoundsOperands());
69 auto affineParallelTerminator = cast<affine::AffineYieldOp>(
70 affineParallelOp.getBody()->getTerminator());
72 scf::ParallelOp scfParallelOp = rewriter.create<scf::ParallelOp>(
73 loc, *lowerBoundTuple, *upperBoundTuple, steps,
75 scfParallelOp->setAttr(
"calyx.unroll",
76 affineParallelOp->getAttr(
"calyx.unroll"));
77 rewriter.eraseBlock(scfParallelOp.getBody());
78 rewriter.inlineRegionBefore(affineParallelOp.getRegion(),
79 scfParallelOp.getRegion(),
80 scfParallelOp.getRegion().end());
81 rewriter.replaceOp(affineParallelOp, scfParallelOp);
82 rewriter.setInsertionPoint(affineParallelTerminator);
83 rewriter.replaceOpWithNewOp<scf::ReduceOp>(affineParallelTerminator);