forked from OSchip/llvm-project
[LibCalls] Infer same attrs for reallocf() as realloc()
reallocf() is the same as realloc() but frees the input pointer on failure as well. We can infer the same attributes. Also combine some cases that infer the same attributes and are logically related.
This commit is contained in:
parent
38efa68b08
commit
348bc76e35
|
@ -415,6 +415,8 @@ bool llvm::inferLibFuncAttributes(Function &F, const TargetLibraryInfo &TLI) {
|
|||
Changed |= setDoesNotCapture(F, 0);
|
||||
Changed |= setOnlyReadsMemory(F, 0);
|
||||
return Changed;
|
||||
case LibFunc_aligned_alloc:
|
||||
case LibFunc_valloc:
|
||||
case LibFunc_malloc:
|
||||
case LibFunc_vec_malloc:
|
||||
Changed |= setOnlyAccessesInaccessibleMemory(F);
|
||||
|
@ -499,6 +501,7 @@ bool llvm::inferLibFuncAttributes(Function &F, const TargetLibraryInfo &TLI) {
|
|||
return Changed;
|
||||
case LibFunc_realloc:
|
||||
case LibFunc_vec_realloc:
|
||||
case LibFunc_reallocf:
|
||||
Changed |= setOnlyAccessesInaccessibleMemOrArgMem(F);
|
||||
Changed |= setRetNoUndef(F);
|
||||
Changed |= setDoesNotThrow(F);
|
||||
|
@ -507,11 +510,6 @@ bool llvm::inferLibFuncAttributes(Function &F, const TargetLibraryInfo &TLI) {
|
|||
Changed |= setDoesNotCapture(F, 0);
|
||||
Changed |= setArgNoUndef(F, 1);
|
||||
return Changed;
|
||||
case LibFunc_reallocf:
|
||||
Changed |= setRetNoUndef(F);
|
||||
Changed |= setWillReturn(F);
|
||||
Changed |= setArgNoUndef(F, 1);
|
||||
return Changed;
|
||||
case LibFunc_read:
|
||||
// May throw; "read" is a valid pthread cancellation point.
|
||||
Changed |= setRetAndArgsNoUndef(F);
|
||||
|
@ -551,13 +549,6 @@ bool llvm::inferLibFuncAttributes(Function &F, const TargetLibraryInfo &TLI) {
|
|||
Changed |= setDoesNotCapture(F, 1);
|
||||
Changed |= setOnlyReadsMemory(F, 1);
|
||||
return Changed;
|
||||
case LibFunc_aligned_alloc:
|
||||
Changed |= setOnlyAccessesInaccessibleMemory(F);
|
||||
Changed |= setRetAndArgsNoUndef(F);
|
||||
Changed |= setDoesNotThrow(F);
|
||||
Changed |= setRetDoesNotAlias(F);
|
||||
Changed |= setWillReturn(F);
|
||||
return Changed;
|
||||
case LibFunc_bcopy:
|
||||
Changed |= setDoesNotThrow(F);
|
||||
Changed |= setOnlyAccessesArgMemory(F);
|
||||
|
@ -866,13 +857,6 @@ bool llvm::inferLibFuncAttributes(Function &F, const TargetLibraryInfo &TLI) {
|
|||
Changed |= setDoesNotCapture(F, 1);
|
||||
Changed |= setOnlyReadsMemory(F, 1);
|
||||
return Changed;
|
||||
case LibFunc_valloc:
|
||||
Changed |= setOnlyAccessesInaccessibleMemory(F);
|
||||
Changed |= setRetAndArgsNoUndef(F);
|
||||
Changed |= setDoesNotThrow(F);
|
||||
Changed |= setRetDoesNotAlias(F);
|
||||
Changed |= setWillReturn(F);
|
||||
return Changed;
|
||||
case LibFunc_vprintf:
|
||||
Changed |= setRetAndArgsNoUndef(F);
|
||||
Changed |= setDoesNotThrow(F);
|
||||
|
|
|
@ -777,7 +777,7 @@ declare i64 @readlink(i8*, i8*, i64)
|
|||
; CHECK: declare noalias noundef i8* @realloc(i8* nocapture, i64 noundef) [[INACCESSIBLEMEMORARGMEMONLY_NOUNWIND_WILLRETURN]]
|
||||
declare i8* @realloc(i8*, i64)
|
||||
|
||||
; CHECK: declare noundef i8* @reallocf(i8*, i64 noundef) [[WILLRETURN:#[0-9]+]]
|
||||
; CHECK: declare noalias noundef i8* @reallocf(i8* nocapture, i64 noundef) [[INACCESSIBLEMEMORARGMEMONLY_NOUNWIND_WILLRETURN]]
|
||||
declare i8* @reallocf(i8*, i64)
|
||||
|
||||
; CHECK: declare noundef i8* @realpath(i8* nocapture noundef readonly, i8* noundef) [[NOFREE_NOUNWIND]]
|
||||
|
@ -1074,7 +1074,6 @@ declare void @memset_pattern16(i8*, i8*, i64)
|
|||
; CHECK-DAG: attributes [[NOFREE_WILLRETURN]] = { mustprogress nofree willreturn }
|
||||
; CHECK-DAG: attributes [[ARGMEMONLY_NOFREE_NOUNWIND_READONLY_WILLRETURN]] = { argmemonly mustprogress nofree nounwind readonly willreturn }
|
||||
; CHECK-DAG: attributes [[NOFREE]] = { nofree }
|
||||
; CHECK-DAG: attributes [[WILLRETURN]] = { mustprogress willreturn }
|
||||
; CHECK-DAG: attributes [[INACCESSIBLEMEMORARGONLY_NOFREE_NOUNWIND_WILLRETURN]] = { inaccessiblemem_or_argmemonly mustprogress nofree nounwind willreturn }
|
||||
; CHECK-DAG: attributes [[ARGMEMONLY_NOFREE_NOUNWIND]] = { argmemonly nofree nounwind }
|
||||
|
||||
|
|
Loading…
Reference in New Issue