Skip to content

Commit b6047b9

Browse files
yugrlanza
authored andcommitted
[CIR][Lowering] Support endless loops (llvmgh-161).
1 parent 57bdb69 commit b6047b9

File tree

2 files changed

+37
-3
lines changed

2 files changed

+37
-3
lines changed

clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ class CIRLoopOpLowering : public mlir::OpConversionPattern<mlir::cir::LoopOp> {
339339
}
340340

341341
// Succeed only if both yields are found.
342-
if (!yieldToBody || !yieldToCont)
342+
if (!yieldToBody)
343343
return mlir::failure();
344344
return mlir::success();
345345
}
@@ -428,8 +428,10 @@ class CIRLoopOpLowering : public mlir::OpConversionPattern<mlir::cir::LoopOp> {
428428
rewriter.create<mlir::cir::BrOp>(loopOp.getLoc(), &entry);
429429

430430
// Set loop exit point to continue block.
431-
rewriter.setInsertionPoint(yieldToCont);
432-
rewriter.replaceOpWithNewOp<mlir::cir::BrOp>(yieldToCont, continueBlock);
431+
if (yieldToCont) {
432+
rewriter.setInsertionPoint(yieldToCont);
433+
rewriter.replaceOpWithNewOp<mlir::cir::BrOp>(yieldToCont, continueBlock);
434+
}
433435

434436
// Branch from condition to body.
435437
rewriter.setInsertionPoint(yieldToBody);

clang/test/CIR/Lowering/loop.cir

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,4 +185,36 @@ module {
185185
// MLIR-NEXT: ^bb6:
186186
// MLIR-NEXT: llvm.br ^bb7
187187

188+
// Test endless cir.loop lowering.
189+
cir.func @testEndless() {
190+
cir.scope {
191+
cir.loop for(cond : {
192+
cir.yield continue
193+
}, step : {
194+
cir.yield
195+
}) {
196+
cir.yield
197+
}
198+
}
199+
cir.return
200+
}
201+
202+
// MLIR: llvm.func @testEndless()
203+
// MLIR-NEXT: llvm.br ^bb1
204+
// MLIR-NEXT: ^bb1:
205+
// MLIR-NEXT: llvm.br ^bb2
206+
// ============= Condition block =============
207+
// MLIR-NEXT: ^bb2:
208+
// MLIR-NEXT: llvm.br ^bb3
209+
// ============= Body block =============
210+
// MLIR-NEXT: ^bb3:
211+
// MLIR-NEXT: llvm.br ^bb4
212+
// ============= Step block =============
213+
// MLIR-NEXT: ^bb4:
214+
// MLIR-NEXT: llvm.br ^bb2
215+
// ============= Exit block =============
216+
// MLIR-NEXT: ^bb5:
217+
// MLIR-NEXT: llvm.br ^bb6
218+
// MLIR-NEXT: ^bb6:
219+
// MLIR-NEXT: llvm.return
188220
}

0 commit comments

Comments
 (0)