forked from OSchip/llvm-project
[flang] Adopt NoRegionArguments (WhereOp) and ParentOneOf (ResultOp) traits
Differential Revision: https://reviews.llvm.org/D83522
This commit is contained in:
parent
0160ad802e
commit
2e046be90e
|
@ -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
|
||||
|
|
|
@ -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");
|
||||
|
||||
|
|
Loading…
Reference in New Issue