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 @@ -2334,10 +2334,10 @@ ```mlir // fir.dispatch with the `nopass` attribute. - %r = fir.dispatch "methodA"(%o) : (!fir.class) -> i32 {nopass} + %r = fir.dispatch "methodA"(%o : !fir.class) -> i32 {nopass} // fir.dispatch with the `pass_arg_pos` attribute. - %r = fir.dispatch "methodA"(%o, %o) : (!fir.class, !fir.class) -> i32 {pass_arg_pos = 0 : i32} + %r = fir.dispatch "methodA"(%o : !fir.class) (%o : !fir.class) -> i32 {pass_arg_pos = 0 : i32} ``` }]; @@ -2349,11 +2349,14 @@ OptionalAttr:$pass_arg_pos ); - let results = (outs Variadic); + let results = (outs Variadic:$results); let hasVerifier = 1; - let hasCustomAssemblyFormat = 1; + let assemblyFormat = [{ + $method `(` $object `:` qualified(type($object)) `)` + ( `(` $args^ `:` type($args) `)` )? (`->` type($results)^)? attr-dict + }]; let extraClassDeclaration = [{ mlir::FunctionType getFunctionType(); 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 @@ -1062,47 +1062,6 @@ getResultTypes()); } -mlir::ParseResult fir::DispatchOp::parse(mlir::OpAsmParser &parser, - mlir::OperationState &result) { - mlir::FunctionType calleeType; - llvm::SmallVector operands; - auto calleeLoc = parser.getNameLoc(); - llvm::StringRef calleeName; - if (failed(parser.parseOptionalKeyword(&calleeName))) { - mlir::StringAttr calleeAttr; - if (parser.parseAttribute(calleeAttr, - fir::DispatchOp::getMethodAttrNameStr(), - result.attributes)) - return mlir::failure(); - } else { - result.addAttribute(fir::DispatchOp::getMethodAttrNameStr(), - parser.getBuilder().getStringAttr(calleeName)); - } - if (parser.parseOperandList(operands, mlir::OpAsmParser::Delimiter::Paren) || - parser.parseColonType(calleeType) || - parser.addTypesToList(calleeType.getResults(), result.types) || - parser.resolveOperands(operands, calleeType.getInputs(), calleeLoc, - result.operands) || - parser.parseOptionalAttrDict(result.attributes)) - return mlir::failure(); - return mlir::success(); -} - -void fir::DispatchOp::print(mlir::OpAsmPrinter &p) { - p << ' ' << getMethodAttr() << '('; - p.printOperand(getObject()); - if (!getArgs().empty()) { - p << ", "; - p.printOperands(getArgs()); - } - p << ") : "; - p.printFunctionalType(getOperation()->getOperandTypes(), - getOperation()->getResultTypes()); - p.printOptionalAttrDict(getOperation()->getAttrs(), - {mlir::SymbolTable::getSymbolAttrName(), - fir::DispatchOp::getMethodAttrNameStr()}); -} - //===----------------------------------------------------------------------===// // DispatchTableOp //===----------------------------------------------------------------------===// diff --git a/flang/test/Fir/Todo/dispatch.fir b/flang/test/Fir/Todo/dispatch.fir --- a/flang/test/Fir/Todo/dispatch.fir +++ b/flang/test/Fir/Todo/dispatch.fir @@ -5,6 +5,6 @@ func.func @dispatch(%arg0: !fir.class>) { // CHECK: not yet implemented: fir.class type conversion - %0 = fir.dispatch "method"(%arg0) : (!fir.class>) -> i32 + %0 = fir.dispatch "method"(%arg0 : !fir.class>) -> i32 return } diff --git a/flang/test/Fir/fir-ops.fir b/flang/test/Fir/fir-ops.fir --- a/flang/test/Fir/fir-ops.fir +++ b/flang/test/Fir/fir-ops.fir @@ -115,13 +115,13 @@ %26 = fir.len_param_index f, !fir.type // CHECK: [[VAL_31:%.*]] = fir.call @box3() : () -> !fir.class> -// CHECK: [[VAL_32:%.*]] = fir.dispatch "method"([[VAL_31]]) : (!fir.class>) -> i32 +// CHECK: [[VAL_32:%.*]] = fir.dispatch "method"([[VAL_31]] : !fir.class>) -> i32 // CHECK: [[VAL_33:%.*]] = fir.convert [[VAL_32]] : (i32) -> i64 // CHECK: [[VAL_34:%.*]] = fir.gentypedesc !fir.type // CHECK: fir.call @user_tdesc([[VAL_34]]) : (!fir.tdesc>) -> () // CHECK: [[VAL_35:%.*]] = fir.no_reassoc [[VAL_33]] : i64 %27 = fir.call @box3() : () -> !fir.class> - %28 = fir.dispatch "method"(%27) : (!fir.class>) -> i32 + %28 = fir.dispatch "method"(%27 : !fir.class>) -> i32 %29 = fir.convert %28 : (i32) -> i64 %30 = fir.gentypedesc !fir.type fir.call @user_tdesc(%30) : (!fir.tdesc>) -> () @@ -310,11 +310,11 @@ // CHECK: ^bb5: // CHECK: [[VAL_99:%.*]] = arith.constant 0 : i32 // CHECK: [[VAL_100:%.*]] = fir.call @get_method_box() : () -> !fir.class> -// CHECK: fir.dispatch "method"([[VAL_100]]) : (!fir.class>) -> () +// CHECK: fir.dispatch "method"([[VAL_100]] : !fir.class>) ^bb5 : %zero = arith.constant 0 : i32 %7 = fir.call @get_method_box() : () -> !fir.class> - fir.dispatch method(%7) : (!fir.class>) -> () + fir.dispatch "method"(%7 : !fir.class>) // CHECK: return [[VAL_99]] : i32 // CHECK: } @@ -809,13 +809,13 @@ func.func private @dispatch(%arg0: !fir.class>, %arg1: i32) -> () { // CHECK-LABEL: func.func private @dispatch( // CHECK-SAME: %[[CLASS:.*]]: !fir.class>, %[[INTARG:.*]]: i32) - fir.dispatch "proc1"(%arg0, %arg0) : (!fir.class>, !fir.class>) -> () {pass_arg_pos = 0 : i32} - // CHECK: fir.dispatch "proc1"(%[[CLASS]], %[[CLASS]]) : (!fir.class>, !fir.class>) -> () {pass_arg_pos = 0 : i32} + fir.dispatch "proc1"(%arg0 : !fir.class>) (%arg0 : !fir.class>) {pass_arg_pos = 0 : i32} + // CHECK: fir.dispatch "proc1"(%[[CLASS]] : !fir.class>) (%[[CLASS]] : !fir.class>) {pass_arg_pos = 0 : i32} - fir.dispatch "proc2"(%arg0) : (!fir.class>) -> () {nopass} - // CHECK: fir.dispatch "proc2"(%[[CLASS]]) : (!fir.class>) -> () {nopass} + fir.dispatch "proc2"(%arg0 : !fir.class>) + // CHECK: fir.dispatch "proc2"(%[[CLASS]] : !fir.class>) - fir.dispatch "proc3"(%arg0, %arg1, %arg0) : (!fir.class>, i32, !fir.class>) -> () {pass_arg_pos = 1 : i32} - // CHECK: fir.dispatch "proc3"(%[[CLASS]], %[[INTARG]], %[[CLASS]]) : (!fir.class>, i32, !fir.class>) -> () {pass_arg_pos = 1 : i32} + fir.dispatch "proc3"(%arg0 : !fir.class>) (%arg1, %arg0 : i32, !fir.class>) {pass_arg_pos = 1 : i32} + // CHECK: fir.dispatch "proc3"(%[[CLASS]] : !fir.class>) (%[[INTARG]], %[[CLASS]] : i32, !fir.class>) {pass_arg_pos = 1 : i32} return } diff --git a/flang/test/Fir/invalid.fir b/flang/test/Fir/invalid.fir --- a/flang/test/Fir/invalid.fir +++ b/flang/test/Fir/invalid.fir @@ -761,7 +761,7 @@ func.func private @dispatch(%arg0: !fir.class>) -> () { // expected-error@+1 {{'fir.dispatch' op nopass and pass_arg_idx are mutually exclusive}} - fir.dispatch "proc1"(%arg0, %arg0) : (!fir.class>, !fir.class>) -> () {nopass, pass_arg_pos = 0 : i32} + fir.dispatch "proc1"(%arg0 : !fir.class>) (%arg0 : !fir.class>) {nopass, pass_arg_pos = 0 : i32} return } @@ -769,7 +769,7 @@ func.func private @dispatch(%arg0: !fir.class>) -> () { // expected-error@+1 {{'fir.dispatch' op pass_arg_pos must be smaller than the number of operands}} - fir.dispatch "proc1"(%arg0, %arg0) : (!fir.class>, !fir.class>) -> () {pass_arg_pos = 1 : i32} + fir.dispatch "proc1"(%arg0 : !fir.class>) (%arg0 : !fir.class>) {pass_arg_pos = 1 : i32} return } @@ -777,6 +777,6 @@ func.func private @dispatch(%arg0: !fir.class>, %arg1: i32) -> () { // expected-error@+1 {{'fir.dispatch' op pass_arg_pos must be a polymorphic operand}} - fir.dispatch "proc1"(%arg0, %arg0, %arg1) : (!fir.class>, !fir.class>, i32) -> () {pass_arg_pos = 1 : i32} + fir.dispatch "proc1"(%arg0 : !fir.class>) (%arg0, %arg1 : !fir.class>, i32) {pass_arg_pos = 1 : i32} return }