Skip to content

Commit 37e12b2

Browse files
committed
Fix insertion of KrnlRegionOp.
Signed-off-by: Haruki Imai <[email protected]>
1 parent 44396c4 commit 37e12b2

File tree

2 files changed

+14
-13
lines changed

2 files changed

+14
-13
lines changed

src/Conversion/KrnlToAffine/ConvertKrnlToAffine.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -319,8 +319,6 @@ static void markLoopBodyAsMovable(
319319

320320
// Delimeter ops are delimeter of a movable chunk of code.
321321
llvm::SmallVector<Operation *> delimeterOps(block.getOps<KrnlIterateOp>());
322-
for (auto op : block.getOps<scf::IfOp>())
323-
delimeterOps.push_back(op);
324322
delimeterOps.push_back(block.getTerminator());
325323
Operation *movableBeginOp = &block.front();
326324
for (Operation *delimeterOp : delimeterOps) {

src/Conversion/ONNXToKrnl/Additional/Parallel.cpp

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -247,21 +247,24 @@ struct ONNXParallelOpLowering : public OpConversionPattern<ONNXParallelOp> {
247247
Value eq = create.math.eq(forkId, indices[0]);
248248
scf::IfOp ifOp = rewriter.create<scf::IfOp>(loc, eq, /*else=*/false);
249249
Block &ifBlock = ifOp.getThenRegion().back();
250-
// Insert KrnlRegionOp within scf::IfOp
251250
rewriter.setInsertionPointToStart(&ifBlock);
252-
KrnlRegionOp regionOp = rewriter.create<KrnlRegionOp>(loc);
253-
Block &regionBlock = regionOp.getBodyRegion().front();
254-
rewriter.setInsertionPointToStart(&regionBlock);
255-
// Insert KrnlNoneOp. This op is used for inserting forkBlock into
256-
// regionBlock. This op is deleted after doing it.
257-
KrnlNoneOp noneOp = rewriter.create<KrnlNoneOp>(loc);
258-
// Delete terminator of forkRegion.
251+
// Insert KrnlRegionOp in every KrnlIterateOps. This needs to avoid errors
252+
// in convertKrnlToAffinePass.
259253
Block &forkBlock = forkOp.getRegion().back();
254+
for (auto kop : forkBlock.getOps<KrnlIterateOp>()) {
255+
KrnlRegionOp regionOp = rewriter.create<KrnlRegionOp>(loc);
256+
Block &regionBlock = regionOp.getBodyRegion().front();
257+
Block &iterateBlock = kop.getBodyRegion().back();
258+
rewriter.eraseOp(iterateBlock.getTerminator());
259+
regionBlock.getOperations().splice(
260+
regionBlock.end(), iterateBlock.getOperations());
261+
rewriter.setInsertionPointToStart(&iterateBlock);
262+
KrnlYieldOp krnlYieldOp = rewriter.create<KrnlYieldOp>(loc);
263+
rewriter.moveOpBefore(regionOp, krnlYieldOp);
264+
}
260265
Operation *forkYieldOp = forkBlock.getTerminator();
261266
rewriter.eraseOp(forkYieldOp);
262-
// Insert forkBlock into regionBlock
263-
rewriter.inlineBlockBefore(&forkOp.getRegion().back(), noneOp);
264-
rewriter.eraseOp(noneOp);
267+
rewriter.inlineBlockBefore(&forkBlock, ifBlock.getTerminator());
265268
rewriter.eraseOp(forkOp);
266269
id++;
267270
}

0 commit comments

Comments
 (0)