OpBuilder<(ins "Value":$cond, "bool":$withElseRegion)>,
OpBuilder<(ins "TypeRange":$resultTypes, "Value":$cond,
"bool":$withElseRegion)>,
+ // TODO: Remove builder when it is no longer used to create invalid `if` ops
+ // (with a type mispatch between the op and it's inner `yield` op).
OpBuilder<(ins "TypeRange":$resultTypes, "Value":$cond,
CArg<"function_ref<void(OpBuilder &, Location)>",
"buildTerminatedBody">:$thenBuilder,
function_ref<void(OpBuilder &, Location)> thenBuilder,
function_ref<void(OpBuilder &, Location)> elseBuilder) {
assert(thenBuilder && "the builder callback for 'then' must be present");
-
result.addOperands(cond);
result.addTypes(resultTypes);
+ // Build then region.
OpBuilder::InsertionGuard guard(builder);
Region *thenRegion = result.addRegion();
builder.createBlock(thenRegion);
thenBuilder(builder, result.location);
+ // Build else region.
Region *elseRegion = result.addRegion();
if (!elseBuilder)
return;
-
builder.createBlock(elseRegion);
elseBuilder(builder, result.location);
}
void IfOp::build(OpBuilder &builder, OperationState &result, Value cond,
function_ref<void(OpBuilder &, Location)> thenBuilder,
function_ref<void(OpBuilder &, Location)> elseBuilder) {
- build(builder, result, TypeRange(), cond, thenBuilder, elseBuilder);
+ assert(thenBuilder && "the builder callback for 'then' must be present");
+ result.addOperands(cond);
+
+ // Build then region.
+ OpBuilder::InsertionGuard guard(builder);
+ Region *thenRegion = result.addRegion();
+ Block *thenBlock = builder.createBlock(thenRegion);
+ thenBuilder(builder, result.location);
+
+ // Infer types if there are any.
+ if (auto yieldOp = llvm::dyn_cast<YieldOp>(thenBlock->getTerminator()))
+ result.addTypes(yieldOp.getOperandTypes());
+
+ // Build else region.
+ Region *elseRegion = result.addRegion();
+ if (!elseBuilder)
+ return;
+ builder.createBlock(elseRegion);
+ elseBuilder(builder, result.location);
}
LogicalResult IfOp::verify() {