[clang] [CIR] Upstream support for while and do..while loops (PR #133157)

Henrich Lauko via cfe-commits cfe-commits at lists.llvm.org
Thu Mar 27 02:59:38 PDT 2025


================
@@ -539,9 +539,29 @@ Block *cir::BrCondOp::getSuccessorForOperands(ArrayRef<Attribute> operands) {
 }
 
 //===----------------------------------------------------------------------===//
-// ForOp
+// LoopOpInterface Methods
 //===----------------------------------------------------------------------===//
 
+void cir::DoWhileOp::getSuccessorRegions(
+    mlir::RegionBranchPoint point,
+    llvm::SmallVectorImpl<mlir::RegionSuccessor> &regions) {
+  LoopOpInterface::getLoopOpSuccessorRegions(*this, point, regions);
+}
+
+llvm::SmallVector<Region *> cir::DoWhileOp::getLoopRegions() {
+  return {&getBody()};
+}
+
+void cir::WhileOp::getSuccessorRegions(
+    mlir::RegionBranchPoint point,
+    llvm::SmallVectorImpl<mlir::RegionSuccessor> &regions) {
+  LoopOpInterface::getLoopOpSuccessorRegions(*this, point, regions);
+}
+
+llvm::SmallVector<Region *> cir::WhileOp::getLoopRegions() {
+  return {&getBody()};
+}
----------------
xlauko wrote:

Can be deduplicated as extraClassDefinition in `WhileOpBase` as:

```
let extraClassDefinition = [{
void $cppClass::getSuccessorRegions(
    mlir::RegionBranchPoint point,
    llvm::SmallVectorImpl<mlir::RegionSuccessor> &regions) {
  LoopOpInterface::getLoopOpSuccessorRegions(*this, point, regions);
}
llvm::SmallVector<Region *> $cppClass::getLoopRegions() {
  return {&getBody()};
}
}];
```

https://github.com/llvm/llvm-project/pull/133157


More information about the cfe-commits mailing list