// of the respective allocator declaration with generic attributes.
bool Changed = false;
- if (isAllocationFn(&Call, TLI)) {
- uint64_t Size;
- ObjectSizeOpts Opts;
- if (getObjectSize(&Call, Size, DL, TLI, Opts) && Size > 0) {
- // TODO: We really should just emit deref_or_null here and then
- // let the generic inference code combine that with nonnull.
- if (Call.hasRetAttr(Attribute::NonNull)) {
- Changed = !Call.hasRetAttr(Attribute::Dereferenceable);
- Call.addRetAttr(
- Attribute::getWithDereferenceableBytes(Call.getContext(), Size));
- } else {
- Changed = !Call.hasRetAttr(Attribute::DereferenceableOrNull);
- Call.addRetAttr(Attribute::getWithDereferenceableOrNullBytes(
- Call.getContext(), Size));
- }
+ if (!Call.getType()->isPointerTy())
+ return Changed;
+
+ Optional<APInt> Size = getAllocSize(&Call, TLI);
+ if (Size && *Size != 0) {
+ // TODO: We really should just emit deref_or_null here and then
+ // let the generic inference code combine that with nonnull.
+ if (Call.hasRetAttr(Attribute::NonNull)) {
+ Changed = !Call.hasRetAttr(Attribute::Dereferenceable);
+ Call.addRetAttr(Attribute::getWithDereferenceableBytes(
+ Call.getContext(), Size->getLimitedValue()));
+ } else {
+ Changed = !Call.hasRetAttr(Attribute::DereferenceableOrNull);
+ Call.addRetAttr(Attribute::getWithDereferenceableOrNullBytes(
+ Call.getContext(), Size->getLimitedValue()));
}
}
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
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
+}