diff --git a/mlir/include/mlir/Dialect/SCF/IR/SCFOps.td b/mlir/include/mlir/Dialect/SCF/IR/SCFOps.td --- a/mlir/include/mlir/Dialect/SCF/IR/SCFOps.td +++ b/mlir/include/mlir/Dialect/SCF/IR/SCFOps.td @@ -773,6 +773,8 @@ let skipDefaultBuilders = 1; let builders = [ OpBuilder<(ins "TypeRange":$resultTypes, "Value":$cond)>, + OpBuilder<(ins "TypeRange":$resultTypes, "Value":$cond, + "bool":$addThenBlock, "bool":$addElseBlock)>, OpBuilder<(ins "Value":$cond, "bool":$withElseRegion)>, OpBuilder<(ins "TypeRange":$resultTypes, "Value":$cond, "bool":$withElseRegion)>, diff --git a/mlir/lib/Dialect/SCF/IR/SCF.cpp b/mlir/lib/Dialect/SCF/IR/SCF.cpp --- a/mlir/lib/Dialect/SCF/IR/SCF.cpp +++ b/mlir/lib/Dialect/SCF/IR/SCF.cpp @@ -1593,13 +1593,26 @@ void IfOp::build(OpBuilder &builder, OperationState &result, TypeRange resultTypes, Value cond) { + return build(builder, result, resultTypes, cond, /*addThenBlock=*/false, + /*addElseBlock=*/false); +} + +void IfOp::build(OpBuilder &builder, OperationState &result, + TypeRange resultTypes, Value cond, bool addThenBlock, + bool addElseBlock) { + assert((!addElseBlock || addThenBlock) && + "must not create else block w/o then block"); result.addTypes(resultTypes); result.addOperands(cond); - // Build regions. + // Add regions and blocks. OpBuilder::InsertionGuard guard(builder); - result.addRegion(); - result.addRegion(); + Region *thenRegion = result.addRegion(); + if (addThenBlock) + builder.createBlock(thenRegion); + Region *elseRegion = result.addRegion(); + if (addElseBlock) + builder.createBlock(elseRegion); } void IfOp::build(OpBuilder &builder, OperationState &result, Value cond,