[Mlir-commits] [mlir] [mlir][emitc] Add 'emitc.while' and 'emitc.do' ops to the dialect (PR #143008)

Gil Rapaport llvmlistbot at llvm.org
Thu Aug 14 08:37:11 PDT 2025


================
@@ -1440,6 +1442,129 @@ LogicalResult GetFieldOp::verifySymbolUses(SymbolTableCollection &symbolTable) {
   return success();
 }
 
+//===----------------------------------------------------------------------===//
+// Common functions for WhileOp and DoOp
+//===----------------------------------------------------------------------===//
+
+static Operation *getRootOpFromLoopCondition(Region &condRegion) {
+  auto yieldOp = cast<emitc::YieldOp>(condRegion.front().getTerminator());
+  return yieldOp.getResult().getDefiningOp();
+}
+
+static LogicalResult verifyLoopRegions(Operation &op, Region &condition,
+                                       Region &body) {
+  Block &condBlock = condition.front();
+
+  if (condBlock.getOperations().size() != 2)
+    return op.emitOpError(
+               "condition region must contain exactly two operations: "
+               "'emitc.expression' followed by 'emitc.yield', but found ")
+           << condBlock.getOperations().size() << " operations";
+
+  Operation &first = condBlock.front();
+  auto exprOp = dyn_cast<emitc::ExpressionOp>(first);
+  if (!exprOp)
+    return op.emitOpError("expected first op in condition region to be "
+                          "'emitc.expression', "
+                          "but got ")
+           << first.getName();
+
+  if (!exprOp.getResult().getType().isInteger(1))
+    return op.emitOpError("emitc.expression in condition region must return "
+                          "'i1', but returns ")
+           << exprOp.getResult().getType();
+
+  Operation &last = *std::next(condBlock.begin());
----------------
aniragil wrote:

```suggestion
  Operation &last = condBlock.back();
```

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


More information about the Mlir-commits mailing list