[InstCombine] Fixed handling of isOpNewLike (PR11748)
authorDavid Bolvansky <david.bolvansky@gmail.com>
Wed, 11 Sep 2019 10:37:03 +0000 (10:37 +0000)
committerDavid Bolvansky <david.bolvansky@gmail.com>
Wed, 11 Sep 2019 10:37:03 +0000 (10:37 +0000)
llvm-svn: 371602

llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
llvm/test/Transforms/InstCombine/deref-alloc-fns.ll

index 3863e5f..1cef8d9 100644 (file)
@@ -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(
index 794d811..f188510 100644 (file)
@@ -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)