22#include "mlir/Dialect/Affine/Passes.h.inc"
25#include "llvm/Support/Debug.h"
29#define GEN_PASS_DEF_AFFINEPARALLELIZE
30#include "mlir/Dialect/Affine/Passes.h.inc"
34#define DEBUG_TYPE "affine-parallel"
41struct AffineParallelize
43 using AffineParallelizeBase<AffineParallelize>::AffineParallelizeBase;
45 void runOnOperation()
override;
49struct ParallelizationCandidate {
51 : loop(l), reductions(std::move(r)) {}
60void AffineParallelize::runOnOperation() {
61 func::FuncOp f = getOperation();
65 std::vector<ParallelizationCandidate> parallelizableLoops;
66 f.walk<WalkOrder::PreOrder>([&](AffineForOp loop) {
67 SmallVector<LoopReduction> reductions;
68 if (isLoopParallel(loop, parallelReductions ? &reductions :
nullptr))
69 parallelizableLoops.emplace_back(loop, std::move(reductions));
72 for (
const ParallelizationCandidate &candidate : parallelizableLoops) {
73 unsigned numParentParallelOps = 0;
74 AffineForOp loop = candidate.loop;
75 for (Operation *op = loop->getParentOp();
76 op !=
nullptr && !op->hasTrait<OpTrait::AffineScope>();
77 op = op->getParentOp()) {
78 if (isa<AffineParallelOp>(op))
79 ++numParentParallelOps;
82 if (numParentParallelOps < maxNested) {
84 LLVM_DEBUG(llvm::dbgs() <<
"[" DEBUG_TYPE "] failed to parallelize\n"
88 LLVM_DEBUG(llvm::dbgs() <<
"[" DEBUG_TYPE "] too many nested loops\n"
LogicalResult affineParallelize(AffineForOp forOp, ArrayRef< LoopReduction > parallelReductions={}, AffineParallelOp *resOp=nullptr)
Replaces a parallel affine.for op with a 1-d affine.parallel op.
Include the generated interface declarations.