/// Adapters for building if conditions using the builder and the location
/// stored in ScopedContext. 'thenBody' is mandatory, 'elseBody' can be omitted
/// if the condition should not have an 'else' part.
-ValueRange
-conditionBuilder(TypeRange results, Value condition,
- function_ref<scf::ValueVector()> thenBody,
- function_ref<scf::ValueVector()> elseBody = nullptr);
+/// When `ifOp` is specified, the scf::IfOp is captured. This is particularly
+/// convenient for 0-result conditions.
+ValueRange conditionBuilder(TypeRange results, Value condition,
+ function_ref<scf::ValueVector()> thenBody,
+ function_ref<scf::ValueVector()> elseBody = nullptr,
+ scf::IfOp *ifOp = nullptr);
ValueRange conditionBuilder(Value condition, function_ref<void()> thenBody,
- function_ref<void()> elseBody = nullptr);
+ function_ref<void()> elseBody = nullptr,
+ scf::IfOp *ifOp = nullptr);
} // namespace edsc
} // namespace mlir
ValueRange
mlir::edsc::conditionBuilder(TypeRange results, Value condition,
function_ref<scf::ValueVector()> thenBody,
- function_ref<scf::ValueVector()> elseBody) {
+ function_ref<scf::ValueVector()> elseBody,
+ scf::IfOp *ifOp) {
assert(ScopedContext::getContext() && "EDSC ScopedContext not set up");
assert(thenBody && "thenBody is mandatory");
- auto ifOp = ScopedContext::getBuilderRef().create<scf::IfOp>(
+ auto newOp = ScopedContext::getBuilderRef().create<scf::IfOp>(
ScopedContext::getLocation(), results, condition,
wrapIfBody(thenBody, results), wrapIfBody(elseBody, results));
- return ifOp.getResults();
+ if (ifOp)
+ *ifOp = newOp;
+ return newOp.getResults();
}
static std::function<void(OpBuilder &, Location)>
ValueRange mlir::edsc::conditionBuilder(Value condition,
function_ref<void()> thenBody,
- function_ref<void()> elseBody) {
+ function_ref<void()> elseBody,
+ scf::IfOp *ifOp) {
assert(ScopedContext::getContext() && "EDSC ScopedContext not set up");
assert(thenBody && "thenBody is mandatory");
- ScopedContext::getBuilderRef().create<scf::IfOp>(
+ auto newOp = ScopedContext::getBuilderRef().create<scf::IfOp>(
ScopedContext::getLocation(), condition, wrapZeroResultIfBody(thenBody),
elseBody ? llvm::function_ref<void(OpBuilder &, Location)>(
wrapZeroResultIfBody(elseBody))
: llvm::function_ref<void(OpBuilder &, Location)>(nullptr));
+ if (ifOp)
+ *ifOp = newOp;
return {};
}