[Mlir-commits] [mlir] d2f1369 - [MLIR] Add return type inference to scf.if builder
Frederik Gossen
llvmlistbot at llvm.org
Tue Jan 17 11:10:09 PST 2023
Author: Frederik Gossen
Date: 2023-01-17T14:09:22-05:00
New Revision: d2f136920b9247a9e5874d4d3a00a880db6e2827
URL: https://github.com/llvm/llvm-project/commit/d2f136920b9247a9e5874d4d3a00a880db6e2827
DIFF: https://github.com/llvm/llvm-project/commit/d2f136920b9247a9e5874d4d3a00a880db6e2827.diff
LOG: [MLIR] Add return type inference to scf.if builder
Differential Revision: https://reviews.llvm.org/D141928
Added:
Modified:
mlir/include/mlir/Dialect/SCF/IR/SCFOps.td
mlir/lib/Dialect/SCF/IR/SCF.cpp
Removed:
################################################################################
diff --git a/mlir/include/mlir/Dialect/SCF/IR/SCFOps.td b/mlir/include/mlir/Dialect/SCF/IR/SCFOps.td
index a610562b281ae..9e1752b69174e 100644
--- a/mlir/include/mlir/Dialect/SCF/IR/SCFOps.td
+++ b/mlir/include/mlir/Dialect/SCF/IR/SCFOps.td
@@ -670,6 +670,8 @@ def IfOp : SCF_Op<"if",
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,
diff --git a/mlir/lib/Dialect/SCF/IR/SCF.cpp b/mlir/lib/Dialect/SCF/IR/SCF.cpp
index fc7ce764ea8f0..8699f1d7b162d 100644
--- a/mlir/lib/Dialect/SCF/IR/SCF.cpp
+++ b/mlir/lib/Dialect/SCF/IR/SCF.cpp
@@ -1490,19 +1490,19 @@ void IfOp::build(OpBuilder &builder, OperationState &result,
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);
}
@@ -1510,7 +1510,25 @@ void IfOp::build(OpBuilder &builder, OperationState &result,
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() {
More information about the Mlir-commits
mailing list