[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