Skip to content

Commit 12e5148

Browse files
authored
[MLIR][LLVM] Fix CallOp asm parser for attr-dict (#74372)
Currently the parser & printer of `CallOp` do not match when both varargs and attr-dict are present (round tripping is broken). This fixes the parser so that it conforms to the written asm format in the comments.
1 parent 1e3af94 commit 12e5148

File tree

3 files changed

+17
-7
lines changed

3 files changed

+17
-7
lines changed

mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1219,8 +1219,7 @@ ParseResult CallOp::parse(OpAsmParser &parser, OperationState &result) {
12191219
return failure();
12201220

12211221
// Parse the function arguments.
1222-
if (parser.parseOperandList(operands, OpAsmParser::Delimiter::Paren) ||
1223-
parser.parseOptionalAttrDict(result.attributes))
1222+
if (parser.parseOperandList(operands, OpAsmParser::Delimiter::Paren))
12241223
return failure();
12251224

12261225
bool isVarArg = parser.parseOptionalKeyword("vararg").succeeded();
@@ -1232,6 +1231,9 @@ ParseResult CallOp::parse(OpAsmParser &parser, OperationState &result) {
12321231
return failure();
12331232
}
12341233

1234+
if (parser.parseOptionalAttrDict(result.attributes))
1235+
return failure();
1236+
12351237
// Parse the trailing type list and resolve the operands.
12361238
return parseCallTypeAndResolveOperands(parser, result, isDirect, operands);
12371239
}

mlir/test/Dialect/LLVMIR/roundtrip.mlir

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,15 @@ func.func @ops(%arg0: i32, %arg1: f32,
7373

7474
// Variadic calls
7575
// CHECK: llvm.call @vararg_func(%arg0, %arg0) vararg(!llvm.func<void (i32, ...)>) : (i32, i32) -> ()
76+
// CHECK: llvm.call @vararg_func(%arg0, %arg0) vararg(!llvm.func<void (i32, ...)>) {fastmathFlags = #llvm.fastmath<fast>} : (i32, i32) -> ()
7677
// CHECK: %[[VARIADIC_FUNC:.*]] = llvm.mlir.addressof @vararg_func : !llvm.ptr
7778
// CHECK: llvm.call %[[VARIADIC_FUNC]](%[[I32]], %[[I32]]) vararg(!llvm.func<void (i32, ...)>) : !llvm.ptr, (i32, i32) -> ()
79+
// CHECK: llvm.call %[[VARIADIC_FUNC]](%[[I32]], %[[I32]]) vararg(!llvm.func<void (i32, ...)>) {fastmathFlags = #llvm.fastmath<fast>} : !llvm.ptr, (i32, i32) -> ()
7880
llvm.call @vararg_func(%arg0, %arg0) vararg(!llvm.func<void (i32, ...)>) : (i32, i32) -> ()
81+
llvm.call @vararg_func(%arg0, %arg0) vararg(!llvm.func<void (i32, ...)>) {fastmathFlags = #llvm.fastmath<fast>} : (i32, i32) -> ()
7982
%variadic_func = llvm.mlir.addressof @vararg_func : !llvm.ptr
8083
llvm.call %variadic_func(%arg0, %arg0) vararg(!llvm.func<void (i32, ...)>) : !llvm.ptr, (i32, i32) -> ()
84+
llvm.call %variadic_func(%arg0, %arg0) vararg(!llvm.func<void (i32, ...)>) {fastmathFlags = #llvm.fastmath<fast>} : !llvm.ptr, (i32, i32) -> ()
8185

8286
// Terminator operations and their successors.
8387
//

mlir/test/Target/LLVMIR/llvmir.mlir

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1223,19 +1223,23 @@ llvm.func @dereferenceableornullattr_ret_decl() -> (!llvm.ptr {llvm.dereferencea
12231223
llvm.func @inregattr_ret_decl() -> (!llvm.ptr {llvm.inreg})
12241224

12251225
// CHECK-LABEL: @varargs(...)
1226-
llvm.func @varargs(...)
1226+
llvm.func @varargs(...) -> f32
12271227

12281228
// CHECK-LABEL: define void @varargs_call
12291229
llvm.func @varargs_call(%arg0 : i32) {
1230-
// CHECK: call void (...) @varargs(i32 %{{.*}})
1231-
llvm.call @varargs(%arg0) vararg(!llvm.func<void (...)>) : (i32) -> ()
1230+
// CHECK: call float (...) @varargs(i32 %{{.*}})
1231+
// CHECK: call nnan float (...) @varargs(i32 %{{.*}})
1232+
llvm.call @varargs(%arg0) vararg(!llvm.func<f32 (...)>) : (i32) -> (f32)
1233+
llvm.call @varargs(%arg0) vararg(!llvm.func<f32 (...)>) {fastmathFlags = #llvm.fastmath<nnan>} : (i32) -> (f32)
12321234
llvm.return
12331235
}
12341236

12351237
// CHECK-LABEL: define void @indirect_varargs_call(ptr %0, i32 %1)
12361238
llvm.func @indirect_varargs_call(%arg0 : !llvm.ptr, %arg1 : i32) {
1237-
// CHECK: call void (...) %0(i32 %1)
1238-
llvm.call %arg0(%arg1) vararg(!llvm.func<void (...)>) : !llvm.ptr, (i32) -> ()
1239+
// CHECK: call float (...) %0(i32 %1)
1240+
// CHECK: call nnan float (...) %0(i32 %1)
1241+
llvm.call %arg0(%arg1) vararg(!llvm.func<f32 (...)>) : !llvm.ptr, (i32) -> (f32)
1242+
llvm.call %arg0(%arg1) vararg(!llvm.func<f32 (...)>) {fastmathFlags = #llvm.fastmath<nnan>} : !llvm.ptr, (i32) -> (f32)
12391243
llvm.return
12401244
}
12411245

0 commit comments

Comments
 (0)