diff options
author | David Bolvansky <david.bolvansky@gmail.com> | 2019-09-11 10:37:03 +0000 |
---|---|---|
committer | David Bolvansky <david.bolvansky@gmail.com> | 2019-09-11 10:37:03 +0000 |
commit | 4dae283cd3e74f0ccacac14b3080a321cee740b3 (patch) | |
tree | 51e86c3a362288b55664164c8a51c104d322a434 | |
parent | e79381c3f7a6da15dc632ecf02ab38805bf2761a (diff) | |
download | bcm5719-llvm-4dae283cd3e74f0ccacac14b3080a321cee740b3.tar.gz bcm5719-llvm-4dae283cd3e74f0ccacac14b3080a321cee740b3.zip |
[InstCombine] Fixed handling of isOpNewLike (PR11748)
llvm-svn: 371602
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp | 15 | ||||
-rw-r--r-- | llvm/test/Transforms/InstCombine/deref-alloc-fns.ll | 12 |
2 files changed, 19 insertions, 8 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp index 3863e5fcb8f..1cef8d956b7 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -4190,13 +4190,14 @@ static void annotateAnyAllocSite(CallBase &Call, const TargetLibraryInfo *TLI) { return; if (isMallocLikeFn(&Call, TLI) && Op0C) { - Call.addAttribute(AttributeList::ReturnIndex, - Attribute::getWithDereferenceableOrNullBytes( - Call.getContext(), Op0C->getZExtValue())); - } else if (isOpNewLikeFn(&Call, TLI) && Op0C) { - Call.addAttribute(AttributeList::ReturnIndex, - Attribute::getWithDereferenceableBytes( - Call.getContext(), Op0C->getZExtValue())); + if (isOpNewLikeFn(&Call, TLI)) + Call.addAttribute(AttributeList::ReturnIndex, + Attribute::getWithDereferenceableBytes( + Call.getContext(), Op0C->getZExtValue())); + else + Call.addAttribute(AttributeList::ReturnIndex, + Attribute::getWithDereferenceableOrNullBytes( + Call.getContext(), Op0C->getZExtValue())); } else if (isReallocLikeFn(&Call, TLI) && Op1C) { Call.addAttribute(AttributeList::ReturnIndex, Attribute::getWithDereferenceableOrNullBytes( diff --git a/llvm/test/Transforms/InstCombine/deref-alloc-fns.ll b/llvm/test/Transforms/InstCombine/deref-alloc-fns.ll index 794d811cdca..f188510dfdf 100644 --- a/llvm/test/Transforms/InstCombine/deref-alloc-fns.ll +++ b/llvm/test/Transforms/InstCombine/deref-alloc-fns.ll @@ -5,6 +5,7 @@ declare noalias i8* @malloc(i64) declare noalias i8* @calloc(i64, i64) declare noalias i8* @realloc(i8* nocapture, i64) declare noalias nonnull i8* @_Znam(i64) ; throwing version of 'new' +declare noalias nonnull i8* @_Znwm(i64) ; throwing version of 'new' define noalias i8* @malloc_nonconstant_size(i64 %n) { ; CHECK-LABEL: @malloc_nonconstant_size( @@ -181,13 +182,22 @@ define noalias i8* @op_new_nonconstant_size(i64 %n) { define noalias i8* @op_new_constant_size() { ; CHECK-LABEL: @op_new_constant_size( -; CHECK-NEXT: [[CALL:%.*]] = tail call dereferenceable_or_null(40) i8* @_Znam(i64 40) +; CHECK-NEXT: [[CALL:%.*]] = tail call dereferenceable(40) i8* @_Znam(i64 40) ; CHECK-NEXT: ret i8* [[CALL]] ; %call = tail call i8* @_Znam(i64 40) ret i8* %call } +define noalias i8* @op_new_constant_size2() { +; CHECK-LABEL: @op_new_constant_size2( +; CHECK-NEXT: [[CALL:%.*]] = tail call dereferenceable(40) i8* @_Znwm(i64 40) +; CHECK-NEXT: ret i8* [[CALL]] +; + %call = tail call i8* @_Znwm(i64 40) + ret i8* %call +} + define noalias i8* @op_new_constant_zero_size() { ; CHECK-LABEL: @op_new_constant_zero_size( ; CHECK-NEXT: [[CALL:%.*]] = tail call i8* @_Znam(i64 0) |