[flang] Adopt NoRegionArguments (WhereOp) and ParentOneOf (ResultOp) traits

Differential Revision: https://reviews.llvm.org/D83522
This commit is contained in:
Rahul Joshi 2020-07-16 07:35:46 -07:00
parent 0160ad802e
commit 2e046be90e
2 changed files with 10 additions and 25 deletions

View File

@ -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

View File

@ -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 &region : 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");