forked from OSchip/llvm-project
[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
This commit is contained in:
parent
97aee595bf
commit
eaa583c330
|
@ -2336,7 +2336,7 @@ def fir_DispatchOp : fir_Op<"dispatch", []> {
|
|||
%r = fir.dispatch "methodA"(%o) : (!fir.class<T>) -> i32
|
||||
|
||||
// fir.dispatch with the `pass_arg_pos` attribute.
|
||||
%r = fir.dispatch "methodA"(%o, %o) : (!fir.class<T>, !fir.class<T>) -> i32 {pass_arg_pos = 0 : i32}
|
||||
%r = fir.dispatch "methodA"(%o : !fir.class<T>) (%o : !fir.class<T>) -> i32 {pass_arg_pos = 0 : i32}
|
||||
```
|
||||
}];
|
||||
|
||||
|
@ -2347,11 +2347,14 @@ def fir_DispatchOp : fir_Op<"dispatch", []> {
|
|||
OptionalAttr<I32Attr>:$pass_arg_pos
|
||||
);
|
||||
|
||||
let results = (outs Variadic<AnyType>);
|
||||
let results = (outs Variadic<AnyType>:$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();
|
||||
|
|
|
@ -1057,47 +1057,6 @@ mlir::FunctionType fir::DispatchOp::getFunctionType() {
|
|||
getResultTypes());
|
||||
}
|
||||
|
||||
mlir::ParseResult fir::DispatchOp::parse(mlir::OpAsmParser &parser,
|
||||
mlir::OperationState &result) {
|
||||
mlir::FunctionType calleeType;
|
||||
llvm::SmallVector<mlir::OpAsmParser::UnresolvedOperand> 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
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
|
|
@ -5,6 +5,6 @@
|
|||
|
||||
func.func @dispatch(%arg0: !fir.class<!fir.type<derived3{f:f32}>>) {
|
||||
// CHECK: not yet implemented: fir.class type conversion
|
||||
%0 = fir.dispatch "method"(%arg0) : (!fir.class<!fir.type<derived3{f:f32}>>) -> i32
|
||||
%0 = fir.dispatch "method"(%arg0 : !fir.class<!fir.type<derived3{f:f32}>>) -> i32
|
||||
return
|
||||
}
|
||||
|
|
|
@ -115,13 +115,13 @@ func.func @instructions() {
|
|||
%26 = fir.len_param_index f, !fir.type<derived3{f:f32}>
|
||||
|
||||
// CHECK: [[VAL_31:%.*]] = fir.call @box3() : () -> !fir.class<!fir.type<derived3{f:f32}>>
|
||||
// CHECK: [[VAL_32:%.*]] = fir.dispatch "method"([[VAL_31]]) : (!fir.class<!fir.type<derived3{f:f32}>>) -> i32
|
||||
// CHECK: [[VAL_32:%.*]] = fir.dispatch "method"([[VAL_31]] : !fir.class<!fir.type<derived3{f:f32}>>) -> i32
|
||||
// CHECK: [[VAL_33:%.*]] = fir.convert [[VAL_32]] : (i32) -> i64
|
||||
// CHECK: [[VAL_34:%.*]] = fir.gentypedesc !fir.type<x>
|
||||
// CHECK: fir.call @user_tdesc([[VAL_34]]) : (!fir.tdesc<!fir.type<x>>) -> ()
|
||||
// CHECK: [[VAL_35:%.*]] = fir.no_reassoc [[VAL_33]] : i64
|
||||
%27 = fir.call @box3() : () -> !fir.class<!fir.type<derived3{f:f32}>>
|
||||
%28 = fir.dispatch "method"(%27) : (!fir.class<!fir.type<derived3{f:f32}>>) -> i32
|
||||
%28 = fir.dispatch "method"(%27 : !fir.class<!fir.type<derived3{f:f32}>>) -> i32
|
||||
%29 = fir.convert %28 : (i32) -> i64
|
||||
%30 = fir.gentypedesc !fir.type<x>
|
||||
fir.call @user_tdesc(%30) : (!fir.tdesc<!fir.type<x>>) -> ()
|
||||
|
@ -310,11 +310,11 @@ func.func @bar_select_rank(%arg : i32, %arg2 : i32) -> i32 {
|
|||
// CHECK: ^bb5:
|
||||
// CHECK: [[VAL_99:%.*]] = arith.constant 0 : i32
|
||||
// CHECK: [[VAL_100:%.*]] = fir.call @get_method_box() : () -> !fir.class<!fir.type<derived3{f:f32}>>
|
||||
// CHECK: fir.dispatch "method"([[VAL_100]]) : (!fir.class<!fir.type<derived3{f:f32}>>) -> ()
|
||||
// CHECK: fir.dispatch "method"([[VAL_100]] : !fir.class<!fir.type<derived3{f:f32}>>)
|
||||
^bb5 :
|
||||
%zero = arith.constant 0 : i32
|
||||
%7 = fir.call @get_method_box() : () -> !fir.class<!fir.type<derived3{f:f32}>>
|
||||
fir.dispatch method(%7) : (!fir.class<!fir.type<derived3{f:f32}>>) -> ()
|
||||
fir.dispatch "method"(%7 : !fir.class<!fir.type<derived3{f:f32}>>)
|
||||
|
||||
// CHECK: return [[VAL_99]] : i32
|
||||
// CHECK: }
|
||||
|
@ -809,13 +809,13 @@ func.func @array_amend_ops(%a : !fir.ref<!fir.array<?x?xf32>>) {
|
|||
func.func private @dispatch(%arg0: !fir.class<!fir.type<dispatch_derived1{a:i32,b:i32}>>, %arg1: i32) -> () {
|
||||
// CHECK-LABEL: func.func private @dispatch(
|
||||
// CHECK-SAME: %[[CLASS:.*]]: !fir.class<!fir.type<dispatch_derived1{a:i32,b:i32}>>, %[[INTARG:.*]]: i32)
|
||||
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}
|
||||
// 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}
|
||||
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}
|
||||
// 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}
|
||||
|
||||
fir.dispatch "proc2"(%arg0) : (!fir.class<!fir.type<dispatch_derived1{a:i32,b:i32}>>) -> () {nopass}
|
||||
// CHECK: fir.dispatch "proc2"(%[[CLASS]]) : (!fir.class<!fir.type<dispatch_derived1{a:i32,b:i32}>>) -> () {nopass}
|
||||
fir.dispatch "proc2"(%arg0 : !fir.class<!fir.type<dispatch_derived1{a:i32,b:i32}>>)
|
||||
// CHECK: fir.dispatch "proc2"(%[[CLASS]] : !fir.class<!fir.type<dispatch_derived1{a:i32,b:i32}>>)
|
||||
|
||||
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}
|
||||
// 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}
|
||||
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}
|
||||
// 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}
|
||||
return
|
||||
}
|
||||
|
|
|
@ -761,7 +761,7 @@ func.func private @ifoo(!fir.ref<f32>) -> i32
|
|||
|
||||
func.func private @dispatch(%arg0: !fir.class<!fir.type<derived{a:i32,b:i32}>>) -> () {
|
||||
// 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.type<derived{a:i32,b:i32}>>, !fir.class<!fir.type<derived{a:i32,b:i32}>>) -> () {pass_arg_pos = 1 : i32}
|
||||
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}
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -769,6 +769,6 @@ func.func private @dispatch(%arg0: !fir.class<!fir.type<derived{a:i32,b:i32}>>)
|
|||
|
||||
func.func private @dispatch(%arg0: !fir.class<!fir.type<derived{a:i32,b:i32}>>, %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.type<derived{a:i32,b:i32}>>, !fir.class<!fir.type<derived{a:i32,b:i32}>>, i32) -> () {pass_arg_pos = 1 : i32}
|
||||
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}
|
||||
return
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue