Skip to content

Commit eaa583c

Browse files
committed
[flang] Use assembly format for fir.dispatch
Remove custom parser/printer and make use of the assembly format for the fir.dispatch operation. Depends on D135358 Reviewed By: PeteSteinfeld, jeanPerier Differential Revision: https://reviews.llvm.org/D135363
1 parent 97aee59 commit eaa583c

File tree

5 files changed

+19
-57
lines changed

5 files changed

+19
-57
lines changed

flang/include/flang/Optimizer/Dialect/FIROps.td

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2336,7 +2336,7 @@ def fir_DispatchOp : fir_Op<"dispatch", []> {
23362336
%r = fir.dispatch "methodA"(%o) : (!fir.class<T>) -> i32
23372337

23382338
// fir.dispatch with the `pass_arg_pos` attribute.
2339-
%r = fir.dispatch "methodA"(%o, %o) : (!fir.class<T>, !fir.class<T>) -> i32 {pass_arg_pos = 0 : i32}
2339+
%r = fir.dispatch "methodA"(%o : !fir.class<T>) (%o : !fir.class<T>) -> i32 {pass_arg_pos = 0 : i32}
23402340
```
23412341
}];
23422342

@@ -2347,11 +2347,14 @@ def fir_DispatchOp : fir_Op<"dispatch", []> {
23472347
OptionalAttr<I32Attr>:$pass_arg_pos
23482348
);
23492349

2350-
let results = (outs Variadic<AnyType>);
2350+
let results = (outs Variadic<AnyType>:$results);
23512351

23522352
let hasVerifier = 1;
23532353

2354-
let hasCustomAssemblyFormat = 1;
2354+
let assemblyFormat = [{
2355+
$method `(` $object `:` qualified(type($object)) `)`
2356+
( `(` $args^ `:` type($args) `)` )? (`->` type($results)^)? attr-dict
2357+
}];
23552358

23562359
let extraClassDeclaration = [{
23572360
mlir::FunctionType getFunctionType();

flang/lib/Optimizer/Dialect/FIROps.cpp

Lines changed: 0 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1057,47 +1057,6 @@ mlir::FunctionType fir::DispatchOp::getFunctionType() {
10571057
getResultTypes());
10581058
}
10591059

1060-
mlir::ParseResult fir::DispatchOp::parse(mlir::OpAsmParser &parser,
1061-
mlir::OperationState &result) {
1062-
mlir::FunctionType calleeType;
1063-
llvm::SmallVector<mlir::OpAsmParser::UnresolvedOperand> operands;
1064-
auto calleeLoc = parser.getNameLoc();
1065-
llvm::StringRef calleeName;
1066-
if (failed(parser.parseOptionalKeyword(&calleeName))) {
1067-
mlir::StringAttr calleeAttr;
1068-
if (parser.parseAttribute(calleeAttr,
1069-
fir::DispatchOp::getMethodAttrNameStr(),
1070-
result.attributes))
1071-
return mlir::failure();
1072-
} else {
1073-
result.addAttribute(fir::DispatchOp::getMethodAttrNameStr(),
1074-
parser.getBuilder().getStringAttr(calleeName));
1075-
}
1076-
if (parser.parseOperandList(operands, mlir::OpAsmParser::Delimiter::Paren) ||
1077-
parser.parseColonType(calleeType) ||
1078-
parser.addTypesToList(calleeType.getResults(), result.types) ||
1079-
parser.resolveOperands(operands, calleeType.getInputs(), calleeLoc,
1080-
result.operands) ||
1081-
parser.parseOptionalAttrDict(result.attributes))
1082-
return mlir::failure();
1083-
return mlir::success();
1084-
}
1085-
1086-
void fir::DispatchOp::print(mlir::OpAsmPrinter &p) {
1087-
p << ' ' << getMethodAttr() << '(';
1088-
p.printOperand(getObject());
1089-
if (!getArgs().empty()) {
1090-
p << ", ";
1091-
p.printOperands(getArgs());
1092-
}
1093-
p << ") : ";
1094-
p.printFunctionalType(getOperation()->getOperandTypes(),
1095-
getOperation()->getResultTypes());
1096-
p.printOptionalAttrDict(getOperation()->getAttrs(),
1097-
{mlir::SymbolTable::getSymbolAttrName(),
1098-
fir::DispatchOp::getMethodAttrNameStr()});
1099-
}
1100-
11011060
//===----------------------------------------------------------------------===//
11021061
// DispatchTableOp
11031062
//===----------------------------------------------------------------------===//

flang/test/Fir/Todo/dispatch.fir

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,6 @@
55

66
func.func @dispatch(%arg0: !fir.class<!fir.type<derived3{f:f32}>>) {
77
// CHECK: not yet implemented: fir.class type conversion
8-
%0 = fir.dispatch "method"(%arg0) : (!fir.class<!fir.type<derived3{f:f32}>>) -> i32
8+
%0 = fir.dispatch "method"(%arg0 : !fir.class<!fir.type<derived3{f:f32}>>) -> i32
99
return
1010
}

flang/test/Fir/fir-ops.fir

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -115,13 +115,13 @@ func.func @instructions() {
115115
%26 = fir.len_param_index f, !fir.type<derived3{f:f32}>
116116

117117
// CHECK: [[VAL_31:%.*]] = fir.call @box3() : () -> !fir.class<!fir.type<derived3{f:f32}>>
118-
// CHECK: [[VAL_32:%.*]] = fir.dispatch "method"([[VAL_31]]) : (!fir.class<!fir.type<derived3{f:f32}>>) -> i32
118+
// CHECK: [[VAL_32:%.*]] = fir.dispatch "method"([[VAL_31]] : !fir.class<!fir.type<derived3{f:f32}>>) -> i32
119119
// CHECK: [[VAL_33:%.*]] = fir.convert [[VAL_32]] : (i32) -> i64
120120
// CHECK: [[VAL_34:%.*]] = fir.gentypedesc !fir.type<x>
121121
// CHECK: fir.call @user_tdesc([[VAL_34]]) : (!fir.tdesc<!fir.type<x>>) -> ()
122122
// CHECK: [[VAL_35:%.*]] = fir.no_reassoc [[VAL_33]] : i64
123123
%27 = fir.call @box3() : () -> !fir.class<!fir.type<derived3{f:f32}>>
124-
%28 = fir.dispatch "method"(%27) : (!fir.class<!fir.type<derived3{f:f32}>>) -> i32
124+
%28 = fir.dispatch "method"(%27 : !fir.class<!fir.type<derived3{f:f32}>>) -> i32
125125
%29 = fir.convert %28 : (i32) -> i64
126126
%30 = fir.gentypedesc !fir.type<x>
127127
fir.call @user_tdesc(%30) : (!fir.tdesc<!fir.type<x>>) -> ()
@@ -310,11 +310,11 @@ func.func @bar_select_rank(%arg : i32, %arg2 : i32) -> i32 {
310310
// CHECK: ^bb5:
311311
// CHECK: [[VAL_99:%.*]] = arith.constant 0 : i32
312312
// CHECK: [[VAL_100:%.*]] = fir.call @get_method_box() : () -> !fir.class<!fir.type<derived3{f:f32}>>
313-
// CHECK: fir.dispatch "method"([[VAL_100]]) : (!fir.class<!fir.type<derived3{f:f32}>>) -> ()
313+
// CHECK: fir.dispatch "method"([[VAL_100]] : !fir.class<!fir.type<derived3{f:f32}>>)
314314
^bb5 :
315315
%zero = arith.constant 0 : i32
316316
%7 = fir.call @get_method_box() : () -> !fir.class<!fir.type<derived3{f:f32}>>
317-
fir.dispatch method(%7) : (!fir.class<!fir.type<derived3{f:f32}>>) -> ()
317+
fir.dispatch "method"(%7 : !fir.class<!fir.type<derived3{f:f32}>>)
318318

319319
// CHECK: return [[VAL_99]] : i32
320320
// CHECK: }
@@ -809,13 +809,13 @@ func.func @array_amend_ops(%a : !fir.ref<!fir.array<?x?xf32>>) {
809809
func.func private @dispatch(%arg0: !fir.class<!fir.type<dispatch_derived1{a:i32,b:i32}>>, %arg1: i32) -> () {
810810
// CHECK-LABEL: func.func private @dispatch(
811811
// CHECK-SAME: %[[CLASS:.*]]: !fir.class<!fir.type<dispatch_derived1{a:i32,b:i32}>>, %[[INTARG:.*]]: i32)
812-
fir.dispatch "proc1"(%arg0, %arg0) : (!fir.class<!fir.type<dispatch_derived1{a:i32,b:i32}>>, !fir.class<!fir.type<dispatch_derived1{a:i32,b:i32}>>) -> () {pass_arg_pos = 0 : i32}
813-
// CHECK: fir.dispatch "proc1"(%[[CLASS]], %[[CLASS]]) : (!fir.class<!fir.type<dispatch_derived1{a:i32,b:i32}>>, !fir.class<!fir.type<dispatch_derived1{a:i32,b:i32}>>) -> () {pass_arg_pos = 0 : i32}
812+
fir.dispatch "proc1"(%arg0 : !fir.class<!fir.type<dispatch_derived1{a:i32,b:i32}>>) (%arg0 : !fir.class<!fir.type<dispatch_derived1{a:i32,b:i32}>>) {pass_arg_pos = 0 : i32}
813+
// CHECK: fir.dispatch "proc1"(%[[CLASS]] : !fir.class<!fir.type<dispatch_derived1{a:i32,b:i32}>>) (%[[CLASS]] : !fir.class<!fir.type<dispatch_derived1{a:i32,b:i32}>>) {pass_arg_pos = 0 : i32}
814814

815-
fir.dispatch "proc2"(%arg0) : (!fir.class<!fir.type<dispatch_derived1{a:i32,b:i32}>>) -> () {nopass}
816-
// CHECK: fir.dispatch "proc2"(%[[CLASS]]) : (!fir.class<!fir.type<dispatch_derived1{a:i32,b:i32}>>) -> () {nopass}
815+
fir.dispatch "proc2"(%arg0 : !fir.class<!fir.type<dispatch_derived1{a:i32,b:i32}>>)
816+
// CHECK: fir.dispatch "proc2"(%[[CLASS]] : !fir.class<!fir.type<dispatch_derived1{a:i32,b:i32}>>)
817817

818-
fir.dispatch "proc3"(%arg0, %arg1, %arg0) : (!fir.class<!fir.type<dispatch_derived1{a:i32,b:i32}>>, i32, !fir.class<!fir.type<dispatch_derived1{a:i32,b:i32}>>) -> () {pass_arg_pos = 1 : i32}
819-
// CHECK: fir.dispatch "proc3"(%[[CLASS]], %[[INTARG]], %[[CLASS]]) : (!fir.class<!fir.type<dispatch_derived1{a:i32,b:i32}>>, i32, !fir.class<!fir.type<dispatch_derived1{a:i32,b:i32}>>) -> () {pass_arg_pos = 1 : i32}
818+
fir.dispatch "proc3"(%arg0 : !fir.class<!fir.type<dispatch_derived1{a:i32,b:i32}>>) (%arg1, %arg0 : i32, !fir.class<!fir.type<dispatch_derived1{a:i32,b:i32}>>) {pass_arg_pos = 1 : i32}
819+
// CHECK: fir.dispatch "proc3"(%[[CLASS]] : !fir.class<!fir.type<dispatch_derived1{a:i32,b:i32}>>) (%[[INTARG]], %[[CLASS]] : i32, !fir.class<!fir.type<dispatch_derived1{a:i32,b:i32}>>) {pass_arg_pos = 1 : i32}
820820
return
821821
}

flang/test/Fir/invalid.fir

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -761,14 +761,14 @@ func.func private @ifoo(!fir.ref<f32>) -> i32
761761

762762
func.func private @dispatch(%arg0: !fir.class<!fir.type<derived{a:i32,b:i32}>>) -> () {
763763
// expected-error@+1 {{'fir.dispatch' op pass_arg_pos must be smaller than the number of operands}}
764-
fir.dispatch "proc1"(%arg0, %arg0) : (!fir.class<!fir.type<derived{a:i32,b:i32}>>, !fir.class<!fir.type<derived{a:i32,b:i32}>>) -> () {pass_arg_pos = 1 : i32}
764+
fir.dispatch "proc1"(%arg0 : !fir.class<!fir.type<derived{a:i32,b:i32}>>) (%arg0 : !fir.class<!fir.type<derived{a:i32,b:i32}>>) {pass_arg_pos = 1 : i32}
765765
return
766766
}
767767

768768
// -----
769769

770770
func.func private @dispatch(%arg0: !fir.class<!fir.type<derived{a:i32,b:i32}>>, %arg1: i32) -> () {
771771
// expected-error@+1 {{'fir.dispatch' op pass_arg_pos must be a polymorphic operand}}
772-
fir.dispatch "proc1"(%arg0, %arg0, %arg1) : (!fir.class<!fir.type<derived{a:i32,b:i32}>>, !fir.class<!fir.type<derived{a:i32,b:i32}>>, i32) -> () {pass_arg_pos = 1 : i32}
772+
fir.dispatch "proc1"(%arg0 : !fir.class<!fir.type<derived{a:i32,b:i32}>>) (%arg0, %arg1 : !fir.class<!fir.type<derived{a:i32,b:i32}>>, i32) {pass_arg_pos = 1 : i32}
773773
return
774774
}

0 commit comments

Comments
 (0)