diff --git a/docs/LangRef.html b/docs/LangRef.html index e9b3c5601f1..8d2dc2f98a8 100644 --- a/docs/LangRef.html +++ b/docs/LangRef.html @@ -784,6 +784,9 @@ a power of 2.

sret
This indicates that the parameter specifies the address of a structure that is the return value of the function in the source program.
+
noalias
+
This indicates that the parameter not alias any other object or any + other "noalias" objects during the function call.
noreturn
This function attribute indicates that the function never returns. This indicates to LLVM that every call to this function should be treated as if diff --git a/include/llvm/ParameterAttributes.h b/include/llvm/ParameterAttributes.h index 35d347690da..dcfe0951411 100644 --- a/include/llvm/ParameterAttributes.h +++ b/include/llvm/ParameterAttributes.h @@ -35,7 +35,8 @@ enum Attributes { NoReturn = 1 << 2, ///< mark the function as not returning InReg = 1 << 3, ///< force argument to be passed in register StructRet = 1 << 4, ///< hidden pointer to structure to return - NoUnwind = 1 << 5 ///< Function doesn't unwind stack + NoUnwind = 1 << 5, ///< Function doesn't unwind stack + NoAlias = 1 << 6 ///< Considered to not alias after call. }; } diff --git a/lib/AsmParser/Lexer.l b/lib/AsmParser/Lexer.l index ca6ee2cf73d..6391d17a52e 100644 --- a/lib/AsmParser/Lexer.l +++ b/lib/AsmParser/Lexer.l @@ -229,6 +229,7 @@ inreg { return INREG; } sret { return SRET; } nounwind { return NOUNWIND; } noreturn { return NORETURN; } +noalias { return NOALIAS; } void { RET_TY(Type::VoidTy, VOID); } float { RET_TY(Type::FloatTy, FLOAT); } diff --git a/lib/AsmParser/llvmAsmParser.y b/lib/AsmParser/llvmAsmParser.y index 01d67ed9803..94aeecaf831 100644 --- a/lib/AsmParser/llvmAsmParser.y +++ b/lib/AsmParser/llvmAsmParser.y @@ -1101,7 +1101,7 @@ Module *llvm::RunVMAsmParser(const char * AsmString, Module * M) { %token EXTRACTELEMENT INSERTELEMENT SHUFFLEVECTOR // Function Attributes -%token NORETURN INREG SRET NOUNWIND +%token NORETURN INREG SRET NOUNWIND NOALIAS // Visibility Styles %token DEFAULT HIDDEN PROTECTED @@ -1224,10 +1224,11 @@ OptCallingConv : /*empty*/ { $$ = CallingConv::C; } | CHECK_FOR_ERROR }; -ParamAttr : ZEXT { $$ = ParamAttr::ZExt; } - | SEXT { $$ = ParamAttr::SExt; } - | INREG { $$ = ParamAttr::InReg; } - | SRET { $$ = ParamAttr::StructRet; } +ParamAttr : ZEXT { $$ = ParamAttr::ZExt; } + | SEXT { $$ = ParamAttr::SExt; } + | INREG { $$ = ParamAttr::InReg; } + | SRET { $$ = ParamAttr::StructRet; } + | NOALIAS { $$ = ParamAttr::NoAlias; } ; OptParamAttrs : /* empty */ { $$ = ParamAttr::None; } diff --git a/lib/VMCore/Function.cpp b/lib/VMCore/Function.cpp index 8b91c18ffff..54ed25c7b7f 100644 --- a/lib/VMCore/Function.cpp +++ b/lib/VMCore/Function.cpp @@ -99,6 +99,8 @@ ParamAttrsList::getParamAttrsText(uint16_t Attrs) { Result += "nounwind "; if (Attrs & ParamAttr::InReg) Result += "inreg "; + if (Attrs & ParamAttr::NoAlias) + Result += "noalias "; if (Attrs & ParamAttr::StructRet) Result += "sret "; return Result; diff --git a/test/Feature/paramattrs.ll b/test/Feature/paramattrs.ll index 84116781f9e..01dc2fa93a8 100644 --- a/test/Feature/paramattrs.ll +++ b/test/Feature/paramattrs.ll @@ -8,6 +8,8 @@ declare i16 @"test"(i16 sext %arg) sext declare i8 @"test2" (i16 zext %a2) zext +declare i32 @"test3"(i32* noalias %p) + declare void @exit(i32) noreturn nounwind define i32 @main(i32 %argc, i8 **%argv) nounwind inreg { diff --git a/tools/llvm2cpp/CppWriter.cpp b/tools/llvm2cpp/CppWriter.cpp index 58c67b716e3..86e266147c0 100644 --- a/tools/llvm2cpp/CppWriter.cpp +++ b/tools/llvm2cpp/CppWriter.cpp @@ -473,6 +473,8 @@ CppWriter::printTypeInternal(const Type* Ty) { Out << " | ParamAttr::SExt"; if (attrs & ParamAttr::ZExt) Out << " | ParamAttr::ZExt"; + if (attrs & ParamAttr::NoAlias) + Out << " | ParamAttr::NoAlias"; if (attrs & ParamAttr::StructRet) Out << " | ParamAttr::StructRet"; if (attrs & ParamAttr::InReg)