@@ -827,6 +827,7 @@ LogicalResult ModuleTranslation::convertOneFunction(LLVMFuncOp func) {
827827 llvm::Argument &llvmArg = std::get<1 >(kvp);
828828 BlockArgument mlirArg = std::get<0 >(kvp);
829829
830+ /*
830831 if (auto attr = func.getArgAttrOfType<UnitAttr>(
831832 argIdx, LLVMDialect::getNoAliasAttrName())) {
832833 // NB: Attribute already verified to be boolean, so check if we can indeed
@@ -877,6 +878,7 @@ LogicalResult ModuleTranslation::convertOneFunction(LLVMFuncOp func) {
877878 llvmArg.addAttrs(llvm::AttrBuilder(llvmArg.getContext())
878879 .addAttribute(llvm::Attribute::Nest));
879880 }
881+ */
880882
881883 mapValue (mlirArg, &llvmArg);
882884 argIdx++;
@@ -937,6 +939,63 @@ LogicalResult ModuleTranslation::convertFunctionSignatures() {
937939 mapFunction (function.getName (), llvmFunc);
938940 addRuntimePreemptionSpecifier (function.getDsoLocal (), llvmFunc);
939941
942+ // Set any parameter attributes
943+ unsigned int argIdx = 0 ;
944+ for (auto kvp : llvm::zip (function.getFunctionType ().getParams (), llvmFunc->args ())) {
945+ Type argTy = std::get<0 >(kvp);
946+ llvm::Argument &llvmArg = std::get<1 >(kvp);
947+
948+ if (auto attr = function.getArgAttrOfType <UnitAttr>(
949+ argIdx, LLVMDialect::getNoAliasAttrName ())) {
950+ // NB: Attribute already verified to be boolean, so check if we can indeed
951+ // attach the attribute to this argument, based on its type.
952+ if (!argTy.isa <LLVM::LLVMPointerType>())
953+ return function.emitError (
954+ " llvm.noalias attribute attached to LLVM non-pointer argument" );
955+ llvmArg.addAttr (llvm::Attribute::AttrKind::NoAlias);
956+ }
957+
958+ if (auto attr = function.getArgAttrOfType <IntegerAttr>(
959+ argIdx, LLVMDialect::getAlignAttrName ())) {
960+ // NB: Attribute already verified to be int, so check if we can indeed
961+ // attach the attribute to this argument, based on its type.
962+ if (!argTy.isa <LLVM::LLVMPointerType>())
963+ return function.emitError (
964+ " llvm.align attribute attached to LLVM non-pointer argument" );
965+ llvmArg.addAttrs (llvm::AttrBuilder (llvmArg.getContext ())
966+ .addAlignmentAttr (llvm::Align (attr.getInt ())));
967+ }
968+
969+ if (auto attr = function.getArgAttrOfType <UnitAttr>(argIdx, " llvm.sret" )) {
970+ auto argPtrTy = argTy.dyn_cast <LLVM::LLVMPointerType>();
971+ if (!argPtrTy)
972+ return function.emitError (
973+ " llvm.sret attribute attached to LLVM non-pointer argument" );
974+ llvmArg.addAttrs (
975+ llvm::AttrBuilder (llvmArg.getContext ())
976+ .addStructRetAttr (convertType (argPtrTy.getElementType ())));
977+ }
978+
979+ if (auto attr = function.getArgAttrOfType <UnitAttr>(argIdx, " llvm.byval" )) {
980+ auto argPtrTy = argTy.dyn_cast <LLVM::LLVMPointerType>();
981+ if (!argPtrTy)
982+ return function.emitError (
983+ " llvm.byval attribute attached to LLVM non-pointer argument" );
984+ llvmArg.addAttrs (llvm::AttrBuilder (llvmArg.getContext ())
985+ .addByValAttr (convertType (argPtrTy.getElementType ())));
986+ }
987+
988+ if (auto attr = function.getArgAttrOfType <UnitAttr>(argIdx, " llvm.nest" )) {
989+ if (!argTy.isa <LLVM::LLVMPointerType>())
990+ return function.emitError (
991+ " llvm.nest attribute attached to LLVM non-pointer argument" );
992+ llvmArg.addAttrs (llvm::AttrBuilder (llvmArg.getContext ())
993+ .addAttribute (llvm::Attribute::Nest));
994+ }
995+
996+ argIdx++;
997+ }
998+
940999 // Forward the pass-through attributes to LLVM.
9411000 if (failed (forwardPassthroughAttributes (
9421001 function.getLoc (), function.getPassthrough (), llvmFunc)))
0 commit comments