mirror of
https://github.com/RPCSX/llvm.git
synced 2025-02-24 15:12:36 +00:00
[Analysis] Become aware of MSVC's new/delete functions
The compiler can take advantage of the allocation/deallocation function's properties. We knew how to do this for Itanium but had no support for MSVC-style functions. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@254656 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
bb300c5120
commit
68c9f5ec88
@ -27,6 +27,86 @@
|
|||||||
#define TLI_DEFINE_STRING_INTERNAL(string_repr) string_repr,
|
#define TLI_DEFINE_STRING_INTERNAL(string_repr) string_repr,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/// void *new(unsigned int);
|
||||||
|
TLI_DEFINE_ENUM_INTERNAL(msvc_new_int)
|
||||||
|
TLI_DEFINE_STRING_INTERNAL("??2@YAPAXI@Z")
|
||||||
|
|
||||||
|
/// void *new(unsigned int, nothrow);
|
||||||
|
TLI_DEFINE_ENUM_INTERNAL(msvc_new_int_nothrow)
|
||||||
|
TLI_DEFINE_STRING_INTERNAL("??2@YAPAXIABUnothrow_t@std@@@Z")
|
||||||
|
|
||||||
|
/// void *new(unsigned long long);
|
||||||
|
TLI_DEFINE_ENUM_INTERNAL(msvc_new_longlong)
|
||||||
|
TLI_DEFINE_STRING_INTERNAL("??2@YAPEAX_K@Z")
|
||||||
|
|
||||||
|
/// void *new(unsigned long long, nothrow);
|
||||||
|
TLI_DEFINE_ENUM_INTERNAL(msvc_new_longlong_nothrow)
|
||||||
|
TLI_DEFINE_STRING_INTERNAL("??2@YAPEAX_KAEBUnothrow_t@std@@@Z")
|
||||||
|
|
||||||
|
/// void operator delete(void*);
|
||||||
|
TLI_DEFINE_ENUM_INTERNAL(msvc_delete_ptr32)
|
||||||
|
TLI_DEFINE_STRING_INTERNAL("??3@YAXPAX@Z")
|
||||||
|
|
||||||
|
/// void operator delete(void*, nothrow);
|
||||||
|
TLI_DEFINE_ENUM_INTERNAL(msvc_delete_ptr32_nothrow)
|
||||||
|
TLI_DEFINE_STRING_INTERNAL("??3@YAXPAXABUnothrow_t@std@@@Z")
|
||||||
|
|
||||||
|
/// void operator delete(void*, unsigned int);
|
||||||
|
TLI_DEFINE_ENUM_INTERNAL(msvc_delete_ptr32_int)
|
||||||
|
TLI_DEFINE_STRING_INTERNAL("??3@YAXPAXI@Z")
|
||||||
|
|
||||||
|
/// void operator delete(void*);
|
||||||
|
TLI_DEFINE_ENUM_INTERNAL(msvc_delete_ptr64)
|
||||||
|
TLI_DEFINE_STRING_INTERNAL("??3@YAXPEAX@Z")
|
||||||
|
|
||||||
|
/// void operator delete(void*, nothrow);
|
||||||
|
TLI_DEFINE_ENUM_INTERNAL(msvc_delete_ptr64_nothrow)
|
||||||
|
TLI_DEFINE_STRING_INTERNAL("??3@YAXPEAXAEBUnothrow_t@std@@@Z")
|
||||||
|
|
||||||
|
/// void operator delete(void*, unsigned long long);
|
||||||
|
TLI_DEFINE_ENUM_INTERNAL(msvc_delete_ptr64_longlong)
|
||||||
|
TLI_DEFINE_STRING_INTERNAL("??3@YAXPEAX_K@Z")
|
||||||
|
|
||||||
|
/// void *new[](unsigned int);
|
||||||
|
TLI_DEFINE_ENUM_INTERNAL(msvc_new_array_int)
|
||||||
|
TLI_DEFINE_STRING_INTERNAL("??_U@YAPAXI@Z")
|
||||||
|
|
||||||
|
/// void *new[](unsigned int, nothrow);
|
||||||
|
TLI_DEFINE_ENUM_INTERNAL(msvc_new_array_int_nothrow)
|
||||||
|
TLI_DEFINE_STRING_INTERNAL("??_U@YAPAXIABUnothrow_t@std@@@Z")
|
||||||
|
|
||||||
|
/// void *new[](unsigned long long);
|
||||||
|
TLI_DEFINE_ENUM_INTERNAL(msvc_new_array_longlong)
|
||||||
|
TLI_DEFINE_STRING_INTERNAL("??_U@YAPEAX_K@Z")
|
||||||
|
|
||||||
|
/// void *new[](unsigned long long, nothrow);
|
||||||
|
TLI_DEFINE_ENUM_INTERNAL(msvc_new_array_longlong_nothrow)
|
||||||
|
TLI_DEFINE_STRING_INTERNAL("??_U@YAPEAX_KAEBUnothrow_t@std@@@Z")
|
||||||
|
|
||||||
|
/// void operator delete[](void*);
|
||||||
|
TLI_DEFINE_ENUM_INTERNAL(msvc_delete_array_ptr32)
|
||||||
|
TLI_DEFINE_STRING_INTERNAL("??_V@YAXPAX@Z")
|
||||||
|
|
||||||
|
/// void operator delete[](void*, nothrow);
|
||||||
|
TLI_DEFINE_ENUM_INTERNAL(msvc_delete_array_ptr32_nothrow)
|
||||||
|
TLI_DEFINE_STRING_INTERNAL("??_V@YAXPAXABUnothrow_t@std@@@Z")
|
||||||
|
|
||||||
|
/// void operator delete[](void*, unsigned int);
|
||||||
|
TLI_DEFINE_ENUM_INTERNAL(msvc_delete_array_ptr32_int)
|
||||||
|
TLI_DEFINE_STRING_INTERNAL("??_V@YAXPAXI@Z")
|
||||||
|
|
||||||
|
/// void operator delete[](void*);
|
||||||
|
TLI_DEFINE_ENUM_INTERNAL(msvc_delete_array_ptr64)
|
||||||
|
TLI_DEFINE_STRING_INTERNAL("??_V@YAXPEAX@Z")
|
||||||
|
|
||||||
|
/// void operator delete[](void*, nothrow);
|
||||||
|
TLI_DEFINE_ENUM_INTERNAL(msvc_delete_array_ptr64_nothrow)
|
||||||
|
TLI_DEFINE_STRING_INTERNAL("??_V@YAXPEAXAEBUnothrow_t@std@@@Z")
|
||||||
|
|
||||||
|
/// void operator delete[](void*, unsigned long long);
|
||||||
|
TLI_DEFINE_ENUM_INTERNAL(msvc_delete_array_ptr64_longlong)
|
||||||
|
TLI_DEFINE_STRING_INTERNAL("??_V@YAXPEAX_K@Z")
|
||||||
|
|
||||||
/// int _IO_getc(_IO_FILE * __fp);
|
/// int _IO_getc(_IO_FILE * __fp);
|
||||||
TLI_DEFINE_ENUM_INTERNAL(under_IO_getc)
|
TLI_DEFINE_ENUM_INTERNAL(under_IO_getc)
|
||||||
TLI_DEFINE_STRING_INTERNAL("_IO_getc")
|
TLI_DEFINE_STRING_INTERNAL("_IO_getc")
|
||||||
@ -673,6 +753,7 @@ TLI_DEFINE_STRING_INTERNAL("modff")
|
|||||||
/// long double modfl(long double value, long double *iptr);
|
/// long double modfl(long double value, long double *iptr);
|
||||||
TLI_DEFINE_ENUM_INTERNAL(modfl)
|
TLI_DEFINE_ENUM_INTERNAL(modfl)
|
||||||
TLI_DEFINE_STRING_INTERNAL("modfl")
|
TLI_DEFINE_STRING_INTERNAL("modfl")
|
||||||
|
|
||||||
/// double nearbyint(double x);
|
/// double nearbyint(double x);
|
||||||
TLI_DEFINE_ENUM_INTERNAL(nearbyint)
|
TLI_DEFINE_ENUM_INTERNAL(nearbyint)
|
||||||
TLI_DEFINE_STRING_INTERNAL("nearbyint")
|
TLI_DEFINE_STRING_INTERNAL("nearbyint")
|
||||||
|
@ -62,6 +62,14 @@ static const AllocFnsTy AllocationFnData[] = {
|
|||||||
{LibFunc::ZnajRKSt9nothrow_t, MallocLike, 2, 0, -1}, // new[](unsigned int, nothrow)
|
{LibFunc::ZnajRKSt9nothrow_t, MallocLike, 2, 0, -1}, // new[](unsigned int, nothrow)
|
||||||
{LibFunc::Znam, OpNewLike, 1, 0, -1}, // new[](unsigned long)
|
{LibFunc::Znam, OpNewLike, 1, 0, -1}, // new[](unsigned long)
|
||||||
{LibFunc::ZnamRKSt9nothrow_t, MallocLike, 2, 0, -1}, // new[](unsigned long, nothrow)
|
{LibFunc::ZnamRKSt9nothrow_t, MallocLike, 2, 0, -1}, // new[](unsigned long, nothrow)
|
||||||
|
{LibFunc::msvc_new_int, OpNewLike, 1, 0, -1}, // new(unsigned int)
|
||||||
|
{LibFunc::msvc_new_int_nothrow, MallocLike, 2, 0, -1}, // new(unsigned int, nothrow)
|
||||||
|
{LibFunc::msvc_new_longlong, OpNewLike, 1, 0, -1}, // new(unsigned long long)
|
||||||
|
{LibFunc::msvc_new_longlong_nothrow, MallocLike, 2, 0, -1}, // new(unsigned long long, nothrow)
|
||||||
|
{LibFunc::msvc_new_array_int, OpNewLike, 1, 0, -1}, // new[](unsigned int)
|
||||||
|
{LibFunc::msvc_new_array_int_nothrow, MallocLike, 2, 0, -1}, // new[](unsigned int, nothrow)
|
||||||
|
{LibFunc::msvc_new_array_longlong, OpNewLike, 1, 0, -1}, // new[](unsigned long long)
|
||||||
|
{LibFunc::msvc_new_array_longlong_nothrow, MallocLike, 2, 0, -1}, // new[](unsigned long long, nothrow)
|
||||||
{LibFunc::calloc, CallocLike, 2, 0, 1},
|
{LibFunc::calloc, CallocLike, 2, 0, 1},
|
||||||
{LibFunc::realloc, ReallocLike, 2, 1, -1},
|
{LibFunc::realloc, ReallocLike, 2, 1, -1},
|
||||||
{LibFunc::reallocf, ReallocLike, 2, 1, -1},
|
{LibFunc::reallocf, ReallocLike, 2, 1, -1},
|
||||||
@ -308,14 +316,26 @@ const CallInst *llvm::isFreeCall(const Value *I, const TargetLibraryInfo *TLI) {
|
|||||||
unsigned ExpectedNumParams;
|
unsigned ExpectedNumParams;
|
||||||
if (TLIFn == LibFunc::free ||
|
if (TLIFn == LibFunc::free ||
|
||||||
TLIFn == LibFunc::ZdlPv || // operator delete(void*)
|
TLIFn == LibFunc::ZdlPv || // operator delete(void*)
|
||||||
TLIFn == LibFunc::ZdaPv) // operator delete[](void*)
|
TLIFn == LibFunc::ZdaPv || // operator delete[](void*)
|
||||||
|
TLIFn == LibFunc::msvc_delete_ptr32 || // operator delete(void*)
|
||||||
|
TLIFn == LibFunc::msvc_delete_ptr64 || // operator delete(void*)
|
||||||
|
TLIFn == LibFunc::msvc_delete_array_ptr32 || // operator delete[](void*)
|
||||||
|
TLIFn == LibFunc::msvc_delete_array_ptr64) // operator delete[](void*)
|
||||||
ExpectedNumParams = 1;
|
ExpectedNumParams = 1;
|
||||||
else if (TLIFn == LibFunc::ZdlPvj || // delete(void*, uint)
|
else if (TLIFn == LibFunc::ZdlPvj || // delete(void*, uint)
|
||||||
TLIFn == LibFunc::ZdlPvm || // delete(void*, ulong)
|
TLIFn == LibFunc::ZdlPvm || // delete(void*, ulong)
|
||||||
TLIFn == LibFunc::ZdlPvRKSt9nothrow_t || // delete(void*, nothrow)
|
TLIFn == LibFunc::ZdlPvRKSt9nothrow_t || // delete(void*, nothrow)
|
||||||
TLIFn == LibFunc::ZdaPvj || // delete[](void*, uint)
|
TLIFn == LibFunc::ZdaPvj || // delete[](void*, uint)
|
||||||
TLIFn == LibFunc::ZdaPvm || // delete[](void*, ulong)
|
TLIFn == LibFunc::ZdaPvm || // delete[](void*, ulong)
|
||||||
TLIFn == LibFunc::ZdaPvRKSt9nothrow_t) // delete[](void*, nothrow)
|
TLIFn == LibFunc::ZdaPvRKSt9nothrow_t || // delete[](void*, nothrow)
|
||||||
|
TLIFn == LibFunc::msvc_delete_ptr32_int || // delete(void*, uint)
|
||||||
|
TLIFn == LibFunc::msvc_delete_ptr64_longlong || // delete(void*, ulonglong)
|
||||||
|
TLIFn == LibFunc::msvc_delete_ptr32_nothrow || // delete(void*, nothrow)
|
||||||
|
TLIFn == LibFunc::msvc_delete_ptr64_nothrow || // delete(void*, nothrow)
|
||||||
|
TLIFn == LibFunc::msvc_delete_array_ptr32_int || // delete[](void*, uint)
|
||||||
|
TLIFn == LibFunc::msvc_delete_array_ptr64_longlong || // delete[](void*, ulonglong)
|
||||||
|
TLIFn == LibFunc::msvc_delete_array_ptr32_nothrow || // delete[](void*, nothrow)
|
||||||
|
TLIFn == LibFunc::msvc_delete_array_ptr64_nothrow) // delete[](void*, nothrow)
|
||||||
ExpectedNumParams = 2;
|
ExpectedNumParams = 2;
|
||||||
else
|
else
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
@ -186,3 +186,14 @@ define void @test8() {
|
|||||||
call void @_ZdaPvj(i8* %naj, i32 32) builtin
|
call void @_ZdaPvj(i8* %naj, i32 32) builtin
|
||||||
ret void
|
ret void
|
||||||
}
|
}
|
||||||
|
|
||||||
|
declare noalias i8* @"\01??2@YAPEAX_K@Z"(i64) nobuiltin
|
||||||
|
declare void @"\01??3@YAXPEAX@Z"(i8*) nobuiltin
|
||||||
|
|
||||||
|
; CHECK-LABEL: @test9(
|
||||||
|
define void @test9() {
|
||||||
|
; CHECK-NOT: call
|
||||||
|
%new_long_long = call noalias i8* @"\01??2@YAPEAX_K@Z"(i64 32) builtin
|
||||||
|
call void @"\01??3@YAXPEAX@Z"(i8* %new_long_long) builtin
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user