[flang-commits] [flang] 2e046be - [flang] Adopt NoRegionArguments (WhereOp) and ParentOneOf (ResultOp) traits
Rahul Joshi via flang-commits
flang-commits at lists.llvm.org
Thu Jul 16 08:35:44 PDT 2020
Author: Rahul Joshi
Date: 2020-07-16T08:35:22-07:00
New Revision: 2e046be90e51df4978a72fb1665493ed3f57882e
URL: https://github.com/llvm/llvm-project/commit/2e046be90e51df4978a72fb1665493ed3f57882e
DIFF: https://github.com/llvm/llvm-project/commit/2e046be90e51df4978a72fb1665493ed3f57882e.diff
LOG: [flang] Adopt NoRegionArguments (WhereOp) and ParentOneOf (ResultOp) traits
Differential Revision: https://reviews.llvm.org/D83522
Added:
Modified:
flang/include/flang/Optimizer/Dialect/FIROps.td
flang/lib/Optimizer/Dialect/FIROps.cpp
Removed:
################################################################################
diff --git a/flang/include/flang/Optimizer/Dialect/FIROps.td b/flang/include/flang/Optimizer/Dialect/FIROps.td
index 58bf38aa8a4b..0bc543882a26 100644
--- a/flang/include/flang/Optimizer/Dialect/FIROps.td
+++ b/flang/include/flang/Optimizer/Dialect/FIROps.td
@@ -1853,7 +1853,9 @@ def fir_LenParamIndexOp : fir_OneResultOp<"len_param_index", [NoSideEffect]> {
// Fortran loops
//===----------------------------------------------------------------------===//
-def fir_ResultOp : fir_Op<"result", [NoSideEffect, ReturnLike, Terminator]> {
+def fir_ResultOp : fir_Op<"result",
+ [NoSideEffect, ReturnLike, Terminator,
+ ParentOneOf<["WhereOp", "LoopOp", "IterWhileOp"]>]> {
let summary = "special terminator for use in fir region operations";
let description = [{
@@ -1970,7 +1972,7 @@ def fir_LoopOp : region_Op<"do_loop",
}];
}
-def fir_WhereOp : region_Op<"if"> {
+def fir_WhereOp : region_Op<"if", [NoRegionArguments]> {
let summary = "if-then-else conditional operation";
let description = [{
Used to conditionally execute operations. This operation is the FIR
diff --git a/flang/lib/Optimizer/Dialect/FIROps.cpp b/flang/lib/Optimizer/Dialect/FIROps.cpp
index 44310d6e0691..36334167184d 100644
--- a/flang/lib/Optimizer/Dialect/FIROps.cpp
+++ b/flang/lib/Optimizer/Dialect/FIROps.cpp
@@ -968,19 +968,12 @@ static mlir::LogicalResult verify(fir::ResultOp op) {
auto results = parentOp->getResults();
auto operands = op.getOperands();
- if (isa<fir::WhereOp>(parentOp) || isa<fir::LoopOp>(parentOp) ||
- isa<fir::IterWhileOp>(parentOp)) {
- if (parentOp->getNumResults() != op.getNumOperands())
- return op.emitOpError() << "parent of result must have same arity";
- for (auto e : llvm::zip(results, operands)) {
- if (std::get<0>(e).getType() != std::get<1>(e).getType())
- return op.emitOpError()
- << "types mismatch between result op and its parent";
- }
- } else {
- return op.emitOpError()
- << "result only terminates if, do_loop, or iterate_while regions";
- }
+ if (parentOp->getNumResults() != op.getNumOperands())
+ return op.emitOpError() << "parent of result must have same arity";
+ for (auto e : llvm::zip(results, operands))
+ if (std::get<0>(e).getType() != std::get<1>(e).getType())
+ return op.emitOpError()
+ << "types mismatch between result op and its parent";
return success();
}
@@ -1452,16 +1445,6 @@ static mlir::ParseResult parseWhereOp(OpAsmParser &parser,
}
static LogicalResult verify(fir::WhereOp op) {
- // Verify that the entry of each child region does not have arguments.
- for (auto ®ion : op.getOperation()->getRegions()) {
- if (region.empty())
- continue;
-
- for (auto &b : region)
- if (b.getNumArguments() != 0)
- return op.emitOpError(
- "requires that child entry blocks have no arguments");
- }
if (op.getNumResults() != 0 && op.otherRegion().empty())
return op.emitOpError("must have an else block if defining values");
More information about the flang-commits
mailing list