Skip to content

Commit f94460d

Browse files
committedAug 14, 2019
[SLC] Dereferenceable annonation - handle valid null pointers
Reviewers: jdoerfert, reames Reviewed By: jdoerfert Subscribers: llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D66161 llvm-svn: 368884
1 parent 92541e3 commit f94460d

File tree

3 files changed

+34
-5
lines changed

3 files changed

+34
-5
lines changed
 

Diff for: ‎llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp

+11-4
Original file line numberDiff line numberDiff line change
@@ -189,15 +189,22 @@ static bool canTransformToMemCmp(CallInst *CI, Value *Str, uint64_t Len,
189189
static void annotateDereferenceableBytes(CallInst *CI,
190190
ArrayRef<unsigned> ArgNos,
191191
uint64_t DereferenceableBytes) {
192+
const Function *F = CI->getFunction();
193+
if (!F)
194+
return;
192195
for (unsigned ArgNo : ArgNos) {
193-
uint64_t DerefBytes = std::max(
194-
CI->getDereferenceableOrNullBytes(ArgNo + AttributeList::FirstArgIndex),
195-
DereferenceableBytes);
196+
uint64_t DerefBytes = DereferenceableBytes;
197+
unsigned AS = CI->getArgOperand(ArgNo)->getType()->getPointerAddressSpace();
198+
if (!llvm::NullPointerIsDefined(F, AS))
199+
DerefBytes = std::max(CI->getDereferenceableOrNullBytes(
200+
ArgNo + AttributeList::FirstArgIndex),
201+
DereferenceableBytes);
196202

197203
if (CI->getDereferenceableBytes(ArgNo + AttributeList::FirstArgIndex) <
198204
DerefBytes) {
199205
CI->removeParamAttr(ArgNo, Attribute::Dereferenceable);
200-
CI->removeParamAttr(ArgNo, Attribute::DereferenceableOrNull);
206+
if (!llvm::NullPointerIsDefined(F, AS))
207+
CI->removeParamAttr(ArgNo, Attribute::DereferenceableOrNull);
201208
CI->addParamAttr(ArgNo, Attribute::getWithDereferenceableBytes(
202209
CI->getContext(), DerefBytes));
203210
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt -instcombine -S < %s | FileCheck %s
3+
4+
declare i32 @memcmp(i8 addrspace(1)* nocapture, i8* nocapture, i64)
5+
6+
define i32 @memcmp_const_size_update_deref8(i8 addrspace(1)* nocapture readonly %d, i8* nocapture readonly %s) {
7+
; CHECK-LABEL: @memcmp_const_size_update_deref8(
8+
; CHECK-NEXT: [[CALL:%.*]] = tail call i32 @memcmp(i8 addrspace(1)* dereferenceable(16) dereferenceable_or_null(40) [[D:%.*]], i8* dereferenceable(16) [[S:%.*]], i64 16)
9+
; CHECK-NEXT: ret i32 [[CALL]]
10+
;
11+
%call = tail call i32 @memcmp(i8 addrspace(1)* dereferenceable_or_null(40) %d, i8* %s, i64 16)
12+
ret i32 %call
13+
}

Diff for: ‎llvm/test/Transforms/InstCombine/mem-deref-bytes.ll

+10-1
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ define i32 @memcmp_const_size_update_deref4(i8* nocapture readonly %d, i8* nocap
5555
ret i32 %call
5656
}
5757

58-
define i32 @memcmp_const_size_update_deref5(i8* nocapture readonly %d, i8* nocapture readonly %s) {
58+
define i32 @memcmp_const_size_update_deref5(i8* nocapture readonly %d, i8* nocapture readonly %s) "null-pointer-is-valid"="false" {
5959
; CHECK-LABEL: @memcmp_const_size_update_deref5(
6060
; CHECK-NEXT: [[CALL:%.*]] = tail call i32 @memcmp(i8* dereferenceable(40) [[D:%.*]], i8* dereferenceable(16) [[S:%.*]], i64 16)
6161
; CHECK-NEXT: ret i32 [[CALL]]
@@ -64,6 +64,15 @@ define i32 @memcmp_const_size_update_deref5(i8* nocapture readonly %d, i8* nocap
6464
ret i32 %call
6565
}
6666

67+
define i32 @memcmp_const_size_update_deref6(i8* nocapture readonly %d, i8* nocapture readonly %s) "null-pointer-is-valid"="true" {
68+
; CHECK-LABEL: @memcmp_const_size_update_deref6(
69+
; CHECK-NEXT: [[CALL:%.*]] = tail call i32 @memcmp(i8* dereferenceable(16) dereferenceable_or_null(40) [[D:%.*]], i8* dereferenceable(16) [[S:%.*]], i64 16)
70+
; CHECK-NEXT: ret i32 [[CALL]]
71+
;
72+
%call = tail call i32 @memcmp(i8* dereferenceable_or_null(40) %d, i8* %s, i64 16)
73+
ret i32 %call
74+
}
75+
6776
define i32 @memcmp_const_size_no_update_deref(i8* nocapture readonly %d, i8* nocapture readonly %s) {
6877
; CHECK-LABEL: @memcmp_const_size_no_update_deref(
6978
; CHECK-NEXT: [[CALL:%.*]] = tail call i32 @memcmp(i8* dereferenceable(40) [[D:%.*]], i8* dereferenceable(20) [[S:%.*]], i64 16)

0 commit comments

Comments
 (0)
Please sign in to comment.