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