From 375df34a2986cb17d3b38b83cea1e806a087c7bf Mon Sep 17 00:00:00 2001 From: Tomas Matheson Date: Mon, 24 Aug 2026 11:07:35 +0100 Subject: [PATCH] [Transforms] Infer attributes for posix_memalign --- llvm/lib/Transforms/Utils/BuildLibCalls.cpp | 8 ++++++++ llvm/test/Transforms/InferFunctionAttrs/annotate.ll | 3 ++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Transforms/Utils/BuildLibCalls.cpp b/llvm/lib/Transforms/Utils/BuildLibCalls.cpp index e9ef993e71ec1..c41a1a53ab57e 100644 --- a/llvm/lib/Transforms/Utils/BuildLibCalls.cpp +++ b/llvm/lib/Transforms/Utils/BuildLibCalls.cpp @@ -534,6 +534,14 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F, Changed |= setDoesNotCapture(F, 0); Changed |= setOnlyReadsMemory(F, 0); break; + case LibFunc_posix_memalign: + Changed |= setRetAndArgsNoUndef(F); + Changed |= setDoesNotThrow(F); + Changed |= setWillReturn(F); + Changed |= setOnlyAccessesInaccessibleMemOrArgMem(F); + Changed |= setDoesNotCapture(F, 0); + Changed |= setOnlyWritesMemory(F, 0); + break; case LibFunc_aligned_alloc: Changed |= setAlignedAllocParam(F, 0); Changed |= setAllocSize(F, 1, std::nullopt); diff --git a/llvm/test/Transforms/InferFunctionAttrs/annotate.ll b/llvm/test/Transforms/InferFunctionAttrs/annotate.ll index 44b76640cf97f..d9ebc1e210dc5 100644 --- a/llvm/test/Transforms/InferFunctionAttrs/annotate.ll +++ b/llvm/test/Transforms/InferFunctionAttrs/annotate.ll @@ -817,7 +817,7 @@ declare void @perror(ptr) ; CHECK: declare noalias noundef ptr @popen(ptr noundef readonly captures(none), ptr noundef readonly captures(none)) [[NOFREE_NOUNWIND]] declare ptr @popen(ptr, ptr) -; CHECK: declare i32 @posix_memalign(ptr, i64, i64) [[NOFREE]] +; CHECK: declare noundef i32 @posix_memalign(ptr noundef writeonly captures(none), i64 noundef, i64 noundef) [[INACCESSIBLEMEMORARGMEMONLY_NOFREE_NOUNWIND_WILLRETURN:#[0-9]+]] declare i32 @posix_memalign(ptr, i64, i64) ; CHECK: declare double @pow(double, double) [[ERRNOMEMONLY_NOFREE_NOSYNC_NOUNWIND_WILLRETURN]] @@ -1250,6 +1250,7 @@ declare void @memset_pattern16(ptr, ptr, i64) ; CHECK-DAG: attributes [[INACCESSIBLEMEMORARGMEMORERRNOMEMONLY_NOUNWIND_WILLRETURN_ALLOCKIND_REALLOC_ALLOCSIZE1_FAMILY_MALLOC]] = { mustprogress nounwind willreturn allockind("realloc") allocsize(1) memory(argmem: readwrite, inaccessiblemem: readwrite, errnomem: write) "alloc-family"="malloc" } ; CHECK-DAG: attributes [[INACCESSIBLEMEMORARGMEMORERRNOMEMONLY_NOUNWIND_WILLRETURN_ALLOCKIND_REALLOC_ALLOCSIZE12_FAMILY_MALLOC]] = { mustprogress nounwind willreturn allockind("realloc") allocsize(1,2) memory(argmem: readwrite, inaccessiblemem: readwrite, errnomem: write) "alloc-family"="malloc" } ; CHECK-DAG: attributes [[INACCESSIBLEMEMORARGMEMORERRNOMEMONLY_NOFREE_NOUNWIND_WILLRETURN_FAMILY_MALLOC]] = { mustprogress nofree nounwind willreturn memory(argmem: readwrite, inaccessiblemem: readwrite, errnomem: write) "alloc-family"="malloc" } +; CHECK-DAG: attributes [[INACCESSIBLEMEMORARGMEMONLY_NOFREE_NOUNWIND_WILLRETURN]] = { mustprogress nofree nounwind willreturn memory(argmem: readwrite, inaccessiblemem: readwrite) } ; CHECK-DAG: attributes [[NOFREE_COLD_NORETURN_NOUNWIND]] = { cold nofree noreturn nounwind } ; CHECK-DAG: attributes [[NOFREE_COLD_NORETURN]] = { cold nofree noreturn } ; CHECK-DAG: attributes [[COLD_NORETURN]] = { cold noreturn }