Expand Up
@@ -270,9 +270,6 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
bool Changed = false ;
if (!isLibFreeFunction (&F, TheLibFunc) && !isReallocLikeFn (&F, &TLI))
Changed |= setDoesNotFreeMemory (F);
if (F.getParent () != nullptr && F.getParent ()->getRtLibUseGOT ())
Changed |= setNonLazyBind (F);
Expand All
@@ -285,14 +282,14 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
Changed |= setOnlyAccessesArgMemory (F);
Changed |= setWillReturn (F);
Changed |= setDoesNotCapture (F, 0 );
return Changed ;
break ;
case LibFunc_strchr:
case LibFunc_strrchr:
Changed |= setOnlyAccessesArgMemory (F);
Changed |= setOnlyReadsMemory (F);
Changed |= setDoesNotThrow (F);
Changed |= setWillReturn (F);
return Changed ;
break ;
case LibFunc_strtol:
case LibFunc_strtod:
case LibFunc_strtof:
Expand All
@@ -304,7 +301,7 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
Changed |= setWillReturn (F);
Changed |= setDoesNotCapture (F, 1 );
Changed |= setOnlyReadsMemory (F, 0 );
return Changed ;
break ;
case LibFunc_strcat:
case LibFunc_strncat:
Changed |= setOnlyAccessesArgMemory (F);
Expand All
@@ -315,7 +312,7 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
Changed |= setOnlyReadsMemory (F, 1 );
Changed |= setDoesNotAlias (F, 0 );
Changed |= setDoesNotAlias (F, 1 );
return Changed ;
break ;
case LibFunc_strcpy:
case LibFunc_strncpy:
Changed |= setReturnedArg (F, 0 );
Expand All
@@ -330,14 +327,14 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
Changed |= setOnlyReadsMemory (F, 1 );
Changed |= setDoesNotAlias (F, 0 );
Changed |= setDoesNotAlias (F, 1 );
return Changed ;
break ;
case LibFunc_strxfrm:
Changed |= setDoesNotThrow (F);
Changed |= setWillReturn (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setDoesNotCapture (F, 1 );
Changed |= setOnlyReadsMemory (F, 1 );
return Changed ;
break ;
case LibFunc_strcmp: // 0,1
case LibFunc_strspn: // 0,1
case LibFunc_strncmp: // 0,1
Expand All
@@ -348,7 +345,7 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
Changed |= setOnlyReadsMemory (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setDoesNotCapture (F, 1 );
return Changed ;
break ;
case LibFunc_strcoll:
case LibFunc_strcasecmp: // 0,1
case LibFunc_strncasecmp: //
Expand All
@@ -359,34 +356,34 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
Changed |= setWillReturn (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setDoesNotCapture (F, 1 );
return Changed ;
break ;
case LibFunc_strstr:
case LibFunc_strpbrk:
Changed |= setOnlyAccessesArgMemory (F);
Changed |= setOnlyReadsMemory (F);
Changed |= setDoesNotThrow (F);
Changed |= setWillReturn (F);
Changed |= setDoesNotCapture (F, 1 );
return Changed ;
break ;
case LibFunc_strtok:
case LibFunc_strtok_r:
Changed |= setDoesNotThrow (F);
Changed |= setWillReturn (F);
Changed |= setDoesNotCapture (F, 1 );
Changed |= setOnlyReadsMemory (F, 1 );
return Changed ;
break ;
case LibFunc_scanf:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setOnlyReadsMemory (F, 0 );
return Changed ;
break ;
case LibFunc_setbuf:
case LibFunc_setvbuf:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
return Changed ;
break ;
case LibFunc_strndup:
Changed |= setArgNoUndef (F, 1 );
LLVM_FALLTHROUGH;
Expand All
@@ -398,23 +395,23 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
Changed |= setWillReturn (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setOnlyReadsMemory (F, 0 );
return Changed ;
break ;
case LibFunc_stat:
case LibFunc_statvfs:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setDoesNotCapture (F, 1 );
Changed |= setOnlyReadsMemory (F, 0 );
return Changed ;
break ;
case LibFunc_sscanf:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setDoesNotCapture (F, 1 );
Changed |= setOnlyReadsMemory (F, 0 );
Changed |= setOnlyReadsMemory (F, 1 );
return Changed ;
break ;
case LibFunc_sprintf:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Expand All
@@ -423,7 +420,7 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
Changed |= setOnlyWritesMemory (F, 0 );
Changed |= setDoesNotCapture (F, 1 );
Changed |= setOnlyReadsMemory (F, 1 );
return Changed ;
break ;
case LibFunc_snprintf:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Expand All
@@ -432,21 +429,21 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
Changed |= setOnlyWritesMemory (F, 0 );
Changed |= setDoesNotCapture (F, 2 );
Changed |= setOnlyReadsMemory (F, 2 );
return Changed ;
break ;
case LibFunc_setitimer:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setWillReturn (F);
Changed |= setDoesNotCapture (F, 1 );
Changed |= setDoesNotCapture (F, 2 );
Changed |= setOnlyReadsMemory (F, 1 );
return Changed ;
break ;
case LibFunc_system:
// May throw; "system" is a valid pthread cancellation point.
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setOnlyReadsMemory (F, 0 );
return Changed ;
break ;
case LibFunc_aligned_alloc:
Changed |= setAlignedAllocParam (F, 0 );
Changed |= setAllocSize (F, 1 , None);
Expand All
@@ -464,29 +461,29 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
Changed |= setDoesNotThrow (F);
Changed |= setRetDoesNotAlias (F);
Changed |= setWillReturn (F);
return Changed ;
break ;
case LibFunc_memcmp:
Changed |= setOnlyAccessesArgMemory (F);
Changed |= setOnlyReadsMemory (F);
Changed |= setDoesNotThrow (F);
Changed |= setWillReturn (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setDoesNotCapture (F, 1 );
return Changed ;
break ;
case LibFunc_memchr:
case LibFunc_memrchr:
Changed |= setDoesNotThrow (F);
Changed |= setOnlyAccessesArgMemory (F);
Changed |= setOnlyReadsMemory (F);
Changed |= setWillReturn (F);
return Changed ;
break ;
case LibFunc_modf:
case LibFunc_modff:
case LibFunc_modfl:
Changed |= setDoesNotThrow (F);
Changed |= setWillReturn (F);
Changed |= setDoesNotCapture (F, 1 );
return Changed ;
break ;
case LibFunc_memcpy:
Changed |= setDoesNotThrow (F);
Changed |= setOnlyAccessesArgMemory (F);
Expand All
@@ -497,7 +494,7 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
Changed |= setDoesNotAlias (F, 1 );
Changed |= setDoesNotCapture (F, 1 );
Changed |= setOnlyReadsMemory (F, 1 );
return Changed ;
break ;
case LibFunc_memmove:
Changed |= setDoesNotThrow (F);
Changed |= setOnlyAccessesArgMemory (F);
Expand All
@@ -506,7 +503,7 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
Changed |= setOnlyWritesMemory (F, 0 );
Changed |= setDoesNotCapture (F, 1 );
Changed |= setOnlyReadsMemory (F, 1 );
return Changed ;
break ;
case LibFunc_mempcpy:
case LibFunc_memccpy:
Changed |= setWillReturn (F);
Expand All
@@ -519,7 +516,7 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
Changed |= setDoesNotAlias (F, 1 );
Changed |= setDoesNotCapture (F, 1 );
Changed |= setOnlyReadsMemory (F, 1 );
return Changed ;
break ;
case LibFunc_memalign:
Changed |= setAllocFamily (F, " malloc" );
Changed |= setAllocKind (F, AllocFnKind::Alloc | AllocFnKind::Aligned |
Expand All
@@ -531,19 +528,19 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
Changed |= setDoesNotThrow (F);
Changed |= setRetDoesNotAlias (F);
Changed |= setWillReturn (F);
return Changed ;
break ;
case LibFunc_mkdir:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setOnlyReadsMemory (F, 0 );
return Changed ;
break ;
case LibFunc_mktime:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setWillReturn (F);
Changed |= setDoesNotCapture (F, 0 );
return Changed ;
break ;
case LibFunc_realloc:
case LibFunc_reallocf:
case LibFunc_vec_realloc:
Expand All
@@ -559,46 +556,46 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
Changed |= setWillReturn (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setArgNoUndef (F, 1 );
return Changed ;
break ;
case LibFunc_read:
// May throw; "read" is a valid pthread cancellation point.
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotCapture (F, 1 );
return Changed ;
break ;
case LibFunc_rewind:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
return Changed ;
break ;
case LibFunc_rmdir:
case LibFunc_remove:
case LibFunc_realpath:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setOnlyReadsMemory (F, 0 );
return Changed ;
break ;
case LibFunc_rename:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setDoesNotCapture (F, 1 );
Changed |= setOnlyReadsMemory (F, 0 );
Changed |= setOnlyReadsMemory (F, 1 );
return Changed ;
break ;
case LibFunc_readlink:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setDoesNotCapture (F, 1 );
Changed |= setOnlyReadsMemory (F, 0 );
return Changed ;
break ;
case LibFunc_write:
// May throw; "write" is a valid pthread cancellation point.
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotCapture (F, 1 );
Changed |= setOnlyReadsMemory (F, 1 );
return Changed ;
break ;
case LibFunc_bcopy:
Changed |= setDoesNotThrow (F);
Changed |= setOnlyAccessesArgMemory (F);
Expand All
@@ -607,22 +604,22 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
Changed |= setOnlyReadsMemory (F, 0 );
Changed |= setOnlyWritesMemory (F, 1 );
Changed |= setDoesNotCapture (F, 1 );
return Changed ;
break ;
case LibFunc_bcmp:
Changed |= setDoesNotThrow (F);
Changed |= setOnlyAccessesArgMemory (F);
Changed |= setOnlyReadsMemory (F);
Changed |= setWillReturn (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setDoesNotCapture (F, 1 );
return Changed ;
break ;
case LibFunc_bzero:
Changed |= setDoesNotThrow (F);
Changed |= setOnlyAccessesArgMemory (F);
Changed |= setWillReturn (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setOnlyWritesMemory (F, 0 );
return Changed ;
break ;
case LibFunc_calloc:
case LibFunc_vec_calloc:
Changed |= setAllocFamily (F, TheLibFunc == LibFunc_vec_calloc ? " vec_malloc"
Expand All
@@ -634,21 +631,21 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
Changed |= setDoesNotThrow (F);
Changed |= setRetDoesNotAlias (F);
Changed |= setWillReturn (F);
return Changed ;
break ;
case LibFunc_chmod:
case LibFunc_chown:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setOnlyReadsMemory (F, 0 );
return Changed ;
break ;
case LibFunc_ctermid:
case LibFunc_clearerr:
case LibFunc_closedir:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
return Changed ;
break ;
case LibFunc_atoi:
case LibFunc_atol:
case LibFunc_atof:
Expand All
@@ -657,13 +654,13 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
Changed |= setOnlyReadsMemory (F);
Changed |= setWillReturn (F);
Changed |= setDoesNotCapture (F, 0 );
return Changed ;
break ;
case LibFunc_access:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setOnlyReadsMemory (F, 0 );
return Changed ;
break ;
case LibFunc_fopen:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Expand All
@@ -672,19 +669,19 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
Changed |= setDoesNotCapture (F, 1 );
Changed |= setOnlyReadsMemory (F, 0 );
Changed |= setOnlyReadsMemory (F, 1 );
return Changed ;
break ;
case LibFunc_fdopen:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setRetDoesNotAlias (F);
Changed |= setDoesNotCapture (F, 1 );
Changed |= setOnlyReadsMemory (F, 1 );
return Changed ;
break ;
case LibFunc_feof:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
return Changed ;
break ;
case LibFunc_free:
case LibFunc_vec_free:
Changed |= setAllocFamily (F, TheLibFunc == LibFunc_vec_free ? " vec_malloc"
Expand All
@@ -696,7 +693,7 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
Changed |= setDoesNotThrow (F);
Changed |= setWillReturn (F);
Changed |= setDoesNotCapture (F, 0 );
return Changed ;
break ;
case LibFunc_fseek:
case LibFunc_ftell:
case LibFunc_fgetc:
Expand All
@@ -713,135 +710,135 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
return Changed ;
break ;
case LibFunc_ferror:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setOnlyReadsMemory (F);
return Changed ;
break ;
case LibFunc_fputc:
case LibFunc_fputc_unlocked:
case LibFunc_fstat:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 1 );
return Changed ;
break ;
case LibFunc_frexp:
case LibFunc_frexpf:
case LibFunc_frexpl:
Changed |= setDoesNotThrow (F);
Changed |= setWillReturn (F);
Changed |= setDoesNotCapture (F, 1 );
return Changed ;
break ;
case LibFunc_fstatvfs:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 1 );
return Changed ;
break ;
case LibFunc_fgets:
case LibFunc_fgets_unlocked:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 2 );
return Changed ;
break ;
case LibFunc_fread:
case LibFunc_fread_unlocked:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setDoesNotCapture (F, 3 );
return Changed ;
break ;
case LibFunc_fwrite:
case LibFunc_fwrite_unlocked:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setDoesNotCapture (F, 3 );
// FIXME: readonly #1?
return Changed ;
break ;
case LibFunc_fputs:
case LibFunc_fputs_unlocked:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setDoesNotCapture (F, 1 );
Changed |= setOnlyReadsMemory (F, 0 );
return Changed ;
break ;
case LibFunc_fscanf:
case LibFunc_fprintf:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setDoesNotCapture (F, 1 );
Changed |= setOnlyReadsMemory (F, 1 );
return Changed ;
break ;
case LibFunc_fgetpos:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setDoesNotCapture (F, 1 );
return Changed ;
break ;
case LibFunc_getc:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
return Changed ;
break ;
case LibFunc_getlogin_r:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
return Changed ;
break ;
case LibFunc_getc_unlocked:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
return Changed ;
break ;
case LibFunc_getenv:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setOnlyReadsMemory (F);
Changed |= setDoesNotCapture (F, 0 );
return Changed ;
break ;
case LibFunc_gets:
case LibFunc_getchar:
case LibFunc_getchar_unlocked:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
return Changed ;
break ;
case LibFunc_getitimer:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 1 );
return Changed ;
break ;
case LibFunc_getpwnam:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setOnlyReadsMemory (F, 0 );
return Changed ;
break ;
case LibFunc_ungetc:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 1 );
return Changed ;
break ;
case LibFunc_uname:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
return Changed ;
break ;
case LibFunc_unlink:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setOnlyReadsMemory (F, 0 );
return Changed ;
break ;
case LibFunc_unsetenv:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setOnlyReadsMemory (F, 0 );
return Changed ;
break ;
case LibFunc_utime:
case LibFunc_utimes:
Changed |= setRetAndArgsNoUndef (F);
Expand All
@@ -850,37 +847,37 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
Changed |= setDoesNotCapture (F, 1 );
Changed |= setOnlyReadsMemory (F, 0 );
Changed |= setOnlyReadsMemory (F, 1 );
return Changed ;
break ;
case LibFunc_putc:
case LibFunc_putc_unlocked:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 1 );
return Changed ;
break ;
case LibFunc_puts:
case LibFunc_printf:
case LibFunc_perror:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setOnlyReadsMemory (F, 0 );
return Changed ;
break ;
case LibFunc_pread:
// May throw; "pread" is a valid pthread cancellation point.
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotCapture (F, 1 );
return Changed ;
break ;
case LibFunc_pwrite:
// May throw; "pwrite" is a valid pthread cancellation point.
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotCapture (F, 1 );
Changed |= setOnlyReadsMemory (F, 1 );
return Changed ;
break ;
case LibFunc_putchar:
case LibFunc_putchar_unlocked:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
return Changed ;
break ;
case LibFunc_popen:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Expand All
@@ -889,103 +886,103 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
Changed |= setDoesNotCapture (F, 1 );
Changed |= setOnlyReadsMemory (F, 0 );
Changed |= setOnlyReadsMemory (F, 1 );
return Changed ;
break ;
case LibFunc_pclose:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
return Changed ;
break ;
case LibFunc_vscanf:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setOnlyReadsMemory (F, 0 );
return Changed ;
break ;
case LibFunc_vsscanf:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setDoesNotCapture (F, 1 );
Changed |= setOnlyReadsMemory (F, 0 );
Changed |= setOnlyReadsMemory (F, 1 );
return Changed ;
break ;
case LibFunc_vfscanf:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setDoesNotCapture (F, 1 );
Changed |= setOnlyReadsMemory (F, 1 );
return Changed ;
break ;
case LibFunc_vprintf:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setOnlyReadsMemory (F, 0 );
return Changed ;
break ;
case LibFunc_vfprintf:
case LibFunc_vsprintf:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setDoesNotCapture (F, 1 );
Changed |= setOnlyReadsMemory (F, 1 );
return Changed ;
break ;
case LibFunc_vsnprintf:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setDoesNotCapture (F, 2 );
Changed |= setOnlyReadsMemory (F, 2 );
return Changed ;
break ;
case LibFunc_open:
// May throw; "open" is a valid pthread cancellation point.
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setOnlyReadsMemory (F, 0 );
return Changed ;
break ;
case LibFunc_opendir:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setRetDoesNotAlias (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setOnlyReadsMemory (F, 0 );
return Changed ;
break ;
case LibFunc_tmpfile:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setRetDoesNotAlias (F);
return Changed ;
break ;
case LibFunc_times:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
return Changed ;
break ;
case LibFunc_htonl:
case LibFunc_htons:
case LibFunc_ntohl:
case LibFunc_ntohs:
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotAccessMemory (F);
return Changed ;
break ;
case LibFunc_lstat:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setDoesNotCapture (F, 1 );
Changed |= setOnlyReadsMemory (F, 0 );
return Changed ;
break ;
case LibFunc_lchown:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setOnlyReadsMemory (F, 0 );
return Changed ;
break ;
case LibFunc_qsort:
// May throw; places call through function pointer.
// Cannot give undef pointer/size
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotCapture (F, 3 );
return Changed ;
break ;
case LibFunc_dunder_strndup:
Changed |= setArgNoUndef (F, 1 );
LLVM_FALLTHROUGH;
Expand All
@@ -995,28 +992,28 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
Changed |= setWillReturn (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setOnlyReadsMemory (F, 0 );
return Changed ;
break ;
case LibFunc_dunder_strtok_r:
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 1 );
Changed |= setOnlyReadsMemory (F, 1 );
return Changed ;
break ;
case LibFunc_under_IO_getc:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
return Changed ;
break ;
case LibFunc_under_IO_putc:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 1 );
return Changed ;
break ;
case LibFunc_dunder_isoc99_scanf:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setOnlyReadsMemory (F, 0 );
return Changed ;
break ;
case LibFunc_stat64:
case LibFunc_lstat64:
case LibFunc_statvfs64:
Expand All
@@ -1025,15 +1022,15 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
Changed |= setDoesNotCapture (F, 0 );
Changed |= setDoesNotCapture (F, 1 );
Changed |= setOnlyReadsMemory (F, 0 );
return Changed ;
break ;
case LibFunc_dunder_isoc99_sscanf:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setDoesNotCapture (F, 1 );
Changed |= setOnlyReadsMemory (F, 0 );
Changed |= setOnlyReadsMemory (F, 1 );
return Changed ;
break ;
case LibFunc_fopen64:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Expand All
@@ -1042,30 +1039,30 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
Changed |= setDoesNotCapture (F, 1 );
Changed |= setOnlyReadsMemory (F, 0 );
Changed |= setOnlyReadsMemory (F, 1 );
return Changed ;
break ;
case LibFunc_fseeko64:
case LibFunc_ftello64:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
return Changed ;
break ;
case LibFunc_tmpfile64:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setRetDoesNotAlias (F);
return Changed ;
break ;
case LibFunc_fstat64:
case LibFunc_fstatvfs64:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 1 );
return Changed ;
break ;
case LibFunc_open64:
// May throw; "open" is a valid pthread cancellation point.
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setOnlyReadsMemory (F, 0 );
return Changed ;
break ;
case LibFunc_gettimeofday:
// Currently some platforms have the restrict keyword on the arguments to
// gettimeofday. To be conservative, do not add noalias to gettimeofday's
Expand All
@@ -1074,7 +1071,7 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
Changed |= setDoesNotThrow (F);
Changed |= setDoesNotCapture (F, 0 );
Changed |= setDoesNotCapture (F, 1 );
return Changed ;
break ;
case LibFunc_memset_pattern4:
case LibFunc_memset_pattern8:
case LibFunc_memset_pattern16:
Expand All
@@ -1089,18 +1086,18 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
Changed |= setOnlyAccessesArgMemory (F);
Changed |= setOnlyWritesMemory (F, 0 );
Changed |= setDoesNotThrow (F);
return Changed ;
break ;
// int __nvvm_reflect(const char *)
case LibFunc_nvvm_reflect:
Changed |= setRetAndArgsNoUndef (F);
Changed |= setDoesNotAccessMemory (F);
Changed |= setDoesNotThrow (F);
return Changed ;
break ;
case LibFunc_ldexp:
case LibFunc_ldexpf:
case LibFunc_ldexpl:
Changed |= setWillReturn (F);
return Changed ;
break ;
case LibFunc_abs:
case LibFunc_acos:
case LibFunc_acosf:
Expand Down
Expand Up
@@ -1227,12 +1224,17 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
Changed |= setDoesNotFreeMemory (F);
Changed |= setOnlyWritesMemory (F);
Changed |= setWillReturn (F);
return Changed ;
break ;
default :
// FIXME: It'd be really nice to cover all the library functions we're
// aware of here.
return false ;
break ;
}
// We have to do this step after AllocKind has been inferred on functions so
// we can reliably identify free-like and realloc-like functions.
if (!isLibFreeFunction (&F, TheLibFunc) && !isReallocLikeFn (&F, &TLI))
Changed |= setDoesNotFreeMemory (F);
return Changed;
}
static void setArgExtAttr (Function &F, unsigned ArgNo,
Expand Down