[InstCombine] Don't check for alloc fn before fetching object size

This code is just interested in the allocsize, not any other
allocator properties.
This commit is contained in:
Nikita Popov 2022-07-21 10:05:48 +02:00
parent 708084ec37
commit c72c22c04d
2 changed files with 20 additions and 1 deletions

View File

@ -2885,7 +2885,7 @@ bool InstCombinerImpl::annotateAnyAllocSite(CallBase &Call,
// of the respective allocator declaration with generic attributes.
bool Changed = false;
if (isAllocationFn(&Call, TLI)) {
if (Call.getType()->isPointerTy()) {
uint64_t Size;
ObjectSizeOpts Opts;
if (getObjectSize(&Call, Size, DL, TLI, Opts) && Size > 0) {

View File

@ -13,6 +13,8 @@ declare noalias i8* @aligned_alloc(i64, i64)
declare noalias align 16 i8* @memalign(i64, i64)
; new[](unsigned int, align_val_t)
declare noalias i8* @_ZnajSt11align_val_t(i64 %size, i64 %align)
declare i8* @my_malloc(i64) allocsize(0)
declare i8* @my_calloc(i64, i64) allocsize(0, 1)
@.str = private unnamed_addr constant [6 x i8] c"hello\00", align 1
@ -354,3 +356,20 @@ define noalias i8* @op_new_align() {
ret i8* %call
}
define i8* @my_malloc_constant_size() {
; CHECK-LABEL: @my_malloc_constant_size(
; CHECK-NEXT: [[CALL:%.*]] = call dereferenceable_or_null(32) i8* @my_malloc(i64 32)
; CHECK-NEXT: ret i8* [[CALL]]
;
%call = call i8* @my_malloc(i64 32)
ret i8* %call
}
define i8* @my_calloc_constant_size() {
; CHECK-LABEL: @my_calloc_constant_size(
; CHECK-NEXT: [[CALL:%.*]] = call dereferenceable_or_null(128) i8* @my_calloc(i64 32, i64 4)
; CHECK-NEXT: ret i8* [[CALL]]
;
%call = call i8* @my_calloc(i64 32, i64 4)
ret i8* %call
}