[InstCombine] Fixed crash when setting align attr for memalign
authorDávid Bolvanský <david.bolvansky@gmail.com>
Fri, 23 Apr 2021 12:03:49 +0000 (14:03 +0200)
committerDávid Bolvanský <david.bolvansky@gmail.com>
Fri, 23 Apr 2021 12:04:08 +0000 (14:04 +0200)
llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
llvm/test/Transforms/InstCombine/deref-alloc-fns.ll

index 3932446..954c853 100644 (file)
@@ -2077,10 +2077,12 @@ void InstCombinerImpl::annotateAnyAllocSite(CallBase &Call, const TargetLibraryI
     if (Op0C && Op0C->getValue().ult(llvm::Value::MaximumAlignment) &&
         isKnownNonZero(Call.getOperand(1), DL, 0, &AC, &Call, &DT)) {
       uint64_t AlignmentVal = Op0C->getZExtValue();
-      if (llvm::isPowerOf2_64(AlignmentVal))
+      if (llvm::isPowerOf2_64(AlignmentVal)) {
+        Call.removeAttribute(AttributeList::ReturnIndex, Attribute::Alignment);
         Call.addAttribute(AttributeList::ReturnIndex,
                           Attribute::getWithAlignment(Call.getContext(),
                                                       Align(AlignmentVal)));
+      }
     }
   } else if (isReallocLikeFn(&Call, TLI) && Op1C) {
     Call.addAttribute(AttributeList::ReturnIndex,
index b1901a1..a4b48f4 100644 (file)
@@ -10,7 +10,7 @@ declare noalias nonnull i8* @_Znam(i64) ; throwing version of 'new'
 declare noalias nonnull i8* @_Znwm(i64) ; throwing version of 'new'
 declare noalias i8* @strdup(i8*)
 declare noalias i8* @aligned_alloc(i64, i64)
-declare noalias i8* @memalign(i64, i64)
+declare noalias align 16 i8* @memalign(i64, i64)
 
 @.str = private unnamed_addr constant [6 x i8] c"hello\00", align 1