mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-28 14:10:41 +00:00
[NVPTX] Infer __nvvm_reflect as nounwind, readnone
This patch simply mirrors the attributes we give to @llvm.nvvm.reflect to the __nvvm_reflect libdevice call. This shaves about 30% of the code in libdevice away because of CSE opportunities. It's also helps us figure out that libdevice implementations of transcendental functions don't have side-effects. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@265060 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c7e42230b0
commit
54136ef7b3
@ -195,6 +195,11 @@ TLI_DEFINE_STRING_INTERNAL("__memmove_chk")
|
||||
/// void *__memset_chk(void *s, char v, size_t n, size_t s1size);
|
||||
TLI_DEFINE_ENUM_INTERNAL(memset_chk)
|
||||
TLI_DEFINE_STRING_INTERNAL("__memset_chk")
|
||||
|
||||
// int __nvvm_reflect(const char *)
|
||||
TLI_DEFINE_ENUM_INTERNAL(nvvm_reflect)
|
||||
TLI_DEFINE_STRING_INTERNAL("__nvvm_reflect")
|
||||
|
||||
/// double __sincospi_stret(double x);
|
||||
TLI_DEFINE_ENUM_INTERNAL(sincospi_stret)
|
||||
TLI_DEFINE_STRING_INTERNAL("__sincospi_stret")
|
||||
|
@ -396,8 +396,12 @@ static void initialize(TargetLibraryInfoImpl &TLI, const Triple &T,
|
||||
//
|
||||
// FIXME: Having no standard library prevents e.g. many fastmath
|
||||
// optimizations, so this situation should be fixed.
|
||||
if (T.isNVPTX())
|
||||
if (T.isNVPTX()) {
|
||||
TLI.disableAllFunctions();
|
||||
TLI.setAvailable(LibFunc::nvvm_reflect);
|
||||
} else {
|
||||
TLI.setUnavailable(LibFunc::nvvm_reflect);
|
||||
}
|
||||
|
||||
TLI.addVectorizableFunctionsFromVecLib(ClVectorLibrary);
|
||||
}
|
||||
|
@ -924,6 +924,15 @@ static bool inferPrototypeAttributes(Function &F,
|
||||
Changed |= setOnlyReadsMemory(F, 2);
|
||||
return Changed;
|
||||
|
||||
// int __nvvm_reflect(const char *)
|
||||
case LibFunc::nvvm_reflect:
|
||||
if (FTy->getNumParams() != 1 || !isa<PointerType>(FTy->getParamType(0)))
|
||||
return false;
|
||||
|
||||
Changed |= setDoesNotAccessMemory(F);
|
||||
Changed |= setDoesNotThrow(F);
|
||||
return Changed;
|
||||
|
||||
default:
|
||||
// FIXME: It'd be really nice to cover all the library functions we're
|
||||
// aware of here.
|
||||
|
@ -1,6 +1,7 @@
|
||||
; RUN: opt < %s -inferattrs -S | FileCheck %s
|
||||
; RUN: opt < %s -passes=inferattrs -S | FileCheck %s
|
||||
; RUN: opt < %s -mtriple=x86_64-apple-macosx10.8.0 -inferattrs -S | FileCheck -check-prefix=CHECK-POSIX %s
|
||||
; RUN: opt < %s -mtriple=nvptx -inferattrs -S | FileCheck -check-prefix=CHECK-NVPTX %s
|
||||
|
||||
declare i8* @fopen(i8*, i8*)
|
||||
; CHECK: declare noalias i8* @fopen(i8* nocapture readonly, i8* nocapture readonly) [[G0:#[0-9]]]
|
||||
@ -33,3 +34,7 @@ declare i32 @gettimeofday(i8*, i8*)
|
||||
; CHECK: attributes [[G1]] = { nounwind readonly }
|
||||
; CHECK-POSIX: attributes [[G0]] = { nounwind }
|
||||
; CHECK-POSIX: attributes [[G2]] = { argmemonly }
|
||||
|
||||
declare i32 @__nvvm_reflect(i8*)
|
||||
; CHECK-NVPTX: declare i32 @__nvvm_reflect(i8*) [[G0:#[0-9]+]]
|
||||
; CHECK-NVPTX: attributes [[G0]] = { nounwind readnone }
|
||||
|
Loading…
Reference in New Issue
Block a user