Author: Eric Schweitz Date: 2021-01-07T12:52:14-08:00 New Revision: 70b841ac317765c5c504334f7a22ac085f14ac2d
URL: https://github.com/llvm/llvm-project/commit/70b841ac317765c5c504334f7a22ac085f14ac2d DIFF: https://github.com/llvm/llvm-project/commit/70b841ac317765c5c504334f7a22ac085f14ac2d.diff LOG: [mlir] Adds argument attributes for using LLVM's sret and byval attributes to the conversion of LLVM IR dialect. These attributes are used in FIR to support the lowering of Fortran using target-specific calling conventions. Add roundtrip tests. Add changes per review comments/concerns. Reviewed By: ftynse Differential Revision: https://reviews.llvm.org/D94052 Added: Modified: mlir/lib/Target/LLVMIR/ModuleTranslation.cpp mlir/test/Dialect/LLVMIR/func.mlir mlir/test/Target/llvmir-invalid.mlir Removed: ################################################################################ diff --git a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp index 7700867bb461..492025ba37b4 100644 --- a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp @@ -1102,6 +1102,22 @@ LogicalResult ModuleTranslation::convertOneFunction(LLVMFuncOp func) { llvm::AttrBuilder().addAlignmentAttr(llvm::Align(attr.getInt()))); } + if (auto attr = func.getArgAttrOfType<UnitAttr>(argIdx, "llvm.sret")) { + auto argTy = mlirArg.getType(); + if (!argTy.isa<LLVM::LLVMPointerType>()) + return func.emitError( + "llvm.sret attribute attached to LLVM non-pointer argument"); + llvmArg.addAttr(llvm::Attribute::AttrKind::StructRet); + } + + if (auto attr = func.getArgAttrOfType<UnitAttr>(argIdx, "llvm.byval")) { + auto argTy = mlirArg.getType(); + if (!argTy.isa<LLVM::LLVMPointerType>()) + return func.emitError( + "llvm.byval attribute attached to LLVM non-pointer argument"); + llvmArg.addAttr(llvm::Attribute::AttrKind::ByVal); + } + valueMapping[mlirArg] = &llvmArg; argIdx++; } diff --git a/mlir/test/Dialect/LLVMIR/func.mlir b/mlir/test/Dialect/LLVMIR/func.mlir index 72e117d57a91..d9d7e17a9b50 100644 --- a/mlir/test/Dialect/LLVMIR/func.mlir +++ b/mlir/test/Dialect/LLVMIR/func.mlir @@ -87,6 +87,16 @@ module { llvm.return } + // CHECK: llvm.func @byvalattr(%{{.*}}: !llvm.ptr<i32> {llvm.byval}) + llvm.func @byvalattr(%arg0: !llvm.ptr<i32> {llvm.byval}) { + llvm.return + } + + // CHECK: llvm.func @sretattr(%{{.*}}: !llvm.ptr<i32> {llvm.sret}) + llvm.func @sretattr(%arg0: !llvm.ptr<i32> {llvm.sret}) { + llvm.return + } + // CHECK: llvm.func @variadic(...) llvm.func @variadic(...) diff --git a/mlir/test/Target/llvmir-invalid.mlir b/mlir/test/Target/llvmir-invalid.mlir index 14117594e2f8..fcd98ef4b143 100644 --- a/mlir/test/Target/llvmir-invalid.mlir +++ b/mlir/test/Target/llvmir-invalid.mlir @@ -14,6 +14,19 @@ llvm.func @invalid_noalias(%arg0 : !llvm.float {llvm.noalias = true}) -> !llvm.f // ----- +// expected-error @+1 {{llvm.sret attribute attached to LLVM non-pointer argument}} +llvm.func @invalid_noalias(%arg0 : !llvm.float {llvm.sret}) -> !llvm.float { + llvm.return %arg0 : !llvm.float +} +// ----- + +// expected-error @+1 {{llvm.byval attribute attached to LLVM non-pointer argument}} +llvm.func @invalid_noalias(%arg0 : !llvm.float {llvm.byval}) -> !llvm.float { + llvm.return %arg0 : !llvm.float +} + +// ----- + // expected-error @+1 {{llvm.align attribute attached to LLVM non-pointer argument}} llvm.func @invalid_align(%arg0 : !llvm.float {llvm.align = 4}) -> !llvm.float { llvm.return %arg0 : !llvm.float _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits