diff --git a/flang/include/flang/Optimizer/Dialect/FIROps.td b/flang/include/flang/Optimizer/Dialect/FIROps.td --- a/flang/include/flang/Optimizer/Dialect/FIROps.td +++ b/flang/include/flang/Optimizer/Dialect/FIROps.td @@ -1853,7 +1853,9 @@ // 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_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 --- a/flang/lib/Optimizer/Dialect/FIROps.cpp +++ b/flang/lib/Optimizer/Dialect/FIROps.cpp @@ -968,19 +968,12 @@ auto results = parentOp->getResults(); auto operands = op.getOperands(); - if (isa(parentOp) || isa(parentOp) || - isa(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 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");