diff --git a/flang/include/flang/Optimizer/Dialect/FIROps.td b/flang/include/flang/Optimizer/Dialect/FIROps.td index becb6952ba3a3..0accb5defa3e3 100644 --- a/flang/include/flang/Optimizer/Dialect/FIROps.td +++ b/flang/include/flang/Optimizer/Dialect/FIROps.td @@ -2131,7 +2131,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 = [{ @@ -2248,7 +2250,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 bca6334b40acf..fa5cf3a97e703 100644 --- a/flang/lib/Optimizer/Dialect/FIROps.cpp +++ b/flang/lib/Optimizer/Dialect/FIROps.cpp @@ -1017,19 +1017,12 @@ static mlir::LogicalResult verify(fir::ResultOp op) { 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(); } @@ -1503,16 +1496,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");