92 return std::make_unique<AffineDataCopyGeneration>(
94 fastMemCapacityBytes);
96std::unique_ptr<OperationPass<func::FuncOp>>
98 return std::make_unique<AffineDataCopyGeneration>();
105void AffineDataCopyGeneration::runOnBlock(
Block *block,
110 uint64_t fastMemCapacityBytes =
116 fastMemCapacityBytes};
127 auto curBegin = llvm::find_if(*block, [&](
Operation &op) {
128 return isa<AffineLoadOp, AffineStoreOp, AffineForOp>(op) &&
129 copyNests.count(&op) == 0;
134 while (it != block->
end()) {
137 if ((forOp = dyn_cast<AffineForOp>(&*it)) && copyNests.count(forOp) == 0) {
139 (
void)affineDataCopyGenerate(curBegin, it, copyOptions,
140 std::nullopt, copyNests);
143 auto exceedsCapacity = [&](AffineForOp forOp) {
144 std::optional<int64_t> footprint =
147 return (footprint.has_value() &&
148 static_cast<uint64_t
>(*footprint) > fastMemCapacityBytes);
158 : exceedsCapacity(forOp);
162 runOnBlock(forOp.getBody(), copyNests);
172 (
void)affineDataCopyGenerate(it, std::next(it),
174 std::nullopt, copyNests);
177 curBegin = std::find_if(std::next(it), block->
end(), [&](
Operation &op) {
178 return isa<AffineLoadOp, AffineStoreOp, AffineForOp>(op) &&
179 copyNests.count(&op) == 0;
183 assert(copyNests.count(&*it) == 0 &&
184 "all copy nests generated should have been skipped above");
191 if (curBegin != block->
end()) {
194 "can't be a terminator");
196 (
void)affineDataCopyGenerate(curBegin,
197 std::prev(block->
end()), copyOptions,
198 std::nullopt, copyNests);
202void AffineDataCopyGeneration::runOnOperation() {
203 func::FuncOp f = getOperation();
214 for (
auto &block : f)
215 runOnBlock(&block, copyNests);
224 if (
auto forOp = dyn_cast<AffineForOp>(op))
226 else if (isa<AffineLoadOp, AffineStoreOp>(op))
227 copyOps.push_back(op);
238 copyOps, frozenPatterns,