[Mlir-commits] [mlir] d0a7bb9 - [mlir][SCF] Disallow multiple blocks in scf.if "else" region
Matthias Springer
llvmlistbot at llvm.org
Sat Feb 4 06:50:09 PST 2023
Author: Matthias Springer
Date: 2023-02-04T15:45:28+01:00
New Revision: d0a7bb9b1ad768dfd9b08f66a0e744584b49181f
URL: https://github.com/llvm/llvm-project/commit/d0a7bb9b1ad768dfd9b08f66a0e744584b49181f
DIFF: https://github.com/llvm/llvm-project/commit/d0a7bb9b1ad768dfd9b08f66a0e744584b49181f.diff
LOG: [mlir][SCF] Disallow multiple blocks in scf.if "else" region
The "then" region allows only a single block. The same should be the case for the "else" region.
Differential Revision: https://reviews.llvm.org/D143253
Added:
Modified:
mlir/include/mlir/Dialect/SCF/IR/SCFOps.td
mlir/include/mlir/IR/OpBase.td
Removed:
################################################################################
diff --git a/mlir/include/mlir/Dialect/SCF/IR/SCFOps.td b/mlir/include/mlir/Dialect/SCF/IR/SCFOps.td
index b3b88250c3247..7e2d337f7e00c 100644
--- a/mlir/include/mlir/Dialect/SCF/IR/SCFOps.td
+++ b/mlir/include/mlir/Dialect/SCF/IR/SCFOps.td
@@ -630,8 +630,8 @@ def IfOp : SCF_Op<"if", [DeclareOpInterfaceMethods<RegionBranchOpInterface, [
}
```
- `scf.if` may also return results that are defined in its regions. The
- values defined are determined by which execution path is taken.
+ `scf.if` may also produce results. Which values are returned depends on
+ which execution path is taken.
Example:
@@ -647,11 +647,13 @@ def IfOp : SCF_Op<"if", [DeclareOpInterfaceMethods<RegionBranchOpInterface, [
}
```
- `scf.if` regions are always terminated with "scf.yield". If "scf.if"
- defines no values, the "scf.yield" can be left out, and will be inserted
- implicitly. Otherwise, it must be explicit.
- Also, if "scf.if" defines one or more values, the 'else' block cannot be
- omitted.
+ The "then" region has exactly 1 block. The "else" region may have 0 or 1
+ block. In case the `scf.if` produces results, the "else" region must also
+ have exactly 1 block.
+
+ The blocks are always terminated with `scf.yield`. If `scf.if` defines no
+ values, the `scf.yield` can be left out, and will be inserted implicitly.
+ Otherwise, it must be explicit.
Example:
@@ -660,10 +662,14 @@ def IfOp : SCF_Op<"if", [DeclareOpInterfaceMethods<RegionBranchOpInterface, [
...
}
```
+
+ The types of the yielded values must match the result types of the
+ `scf.if`.
}];
let arguments = (ins I1:$condition);
let results = (outs Variadic<AnyType>:$results);
- let regions = (region SizedRegion<1>:$thenRegion, AnyRegion:$elseRegion);
+ let regions = (region SizedRegion<1>:$thenRegion,
+ MaxSizedRegion<1>:$elseRegion);
let skipDefaultBuilders = 1;
let builders = [
diff --git a/mlir/include/mlir/IR/OpBase.td b/mlir/include/mlir/IR/OpBase.td
index d307bebecbe00..7ef6268423e83 100644
--- a/mlir/include/mlir/IR/OpBase.td
+++ b/mlir/include/mlir/IR/OpBase.td
@@ -1762,6 +1762,11 @@ class MinSizedRegion<int numBlocks> : Region<
CPred<"::llvm::hasNItemsOrMore($_self, " # numBlocks # ")">,
"region with at least " # numBlocks # " blocks">;
+// A region with at most the given number of blocks.
+class MaxSizedRegion<int numBlocks> : Region<
+ CPred<"::llvm::hasNItemsOrLess($_self, " # numBlocks # ")">,
+ "region with at most " # numBlocks # " blocks">;
+
// A variadic region constraint. It expands to zero or more of the base region.
class VariadicRegion<Region region>
: Region<region.predicate, region.summary>;
More information about the Mlir-commits
mailing list