--- b/include/clang/Basic/TargetInfo.h +++ a/include/clang/Basic/TargetInfo.h @@ -612,8 +612,8 @@ } /// Return the largest alignment for which a suitably-sized allocation with + /// '::operator new(size_t)' is guaranteed to produce a correctly-aligned + /// pointer. - /// '::operator new(size_t)' or 'malloc' is guaranteed to produce a - /// correctly-aligned pointer. unsigned getNewAlign() const { return NewAlign ? NewAlign : std::max(LongDoubleAlign, LongLongAlign); } --- b/lib/CodeGen/CGCall.cpp +++ a/lib/CodeGen/CGCall.cpp @@ -2048,24 +2048,6 @@ // allows it to work on indirect virtual function calls. if (AttrOnCallSite && TargetDecl->hasAttr()) FuncAttrs.addAttribute(llvm::Attribute::NoMerge); - - // Add known guaranteed alignment for allocation functions. - if (unsigned BuiltinID = Fn->getBuiltinID()) { - switch (BuiltinID) { - case Builtin::BIaligned_alloc: - case Builtin::BIcalloc: - case Builtin::BImalloc: - case Builtin::BImemalign: - case Builtin::BIrealloc: - case Builtin::BIstrdup: - case Builtin::BIstrndup: - RetAttrs.addAlignmentAttr(Context.getTargetInfo().getNewAlign() / - Context.getTargetInfo().getCharWidth()); - break; - default: - break; - } - } } // 'const', 'pure' and 'noalias' attributed functions are also nounwind. --- b/test/CodeGen/alloc-fns-alignment.c +++ /dev/null @@ -1,35 +0,0 @@ -// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm < %s | FileCheck %s --check-prefix=ALIGN16 -// RUN: %clang_cc1 -triple x86_64-windows-msvc -emit-llvm < %s | FileCheck %s --check-prefix=ALIGN16 -// RUN: %clang_cc1 -triple i386-apple-darwin -emit-llvm < %s | FileCheck %s --check-prefix=ALIGN16 -// RUN: %clang_cc1 -triple i386-unknown-linux-gnu -emit-llvm < %s | FileCheck %s --check-prefix=ALIGN8 -// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fno-builtin-malloc -emit-llvm < %s | FileCheck %s --check-prefix=NOBUILTIN-MALLOC -// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fno-builtin-calloc -emit-llvm < %s | FileCheck %s --check-prefix=NOBUILTIN-CALLOC -// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fno-builtin-realloc -emit-llvm < %s | FileCheck %s --check-prefix=NOBUILTIN-REALLOC - -typedef __SIZE_TYPE__ size_t; - -void *malloc(size_t); -void *calloc(size_t, size_t); -void *realloc(void *, size_t); - -void *malloc_test(size_t n) { - return malloc(n); -} - -void *calloc_test(size_t n) { - return calloc(1, n); -} - -void *raalloc_test(void *p, size_t n) { - return realloc(p, n); -} - -// ALIGN16: align 16 i8* @malloc -// ALIGN16: align 16 i8* @calloc -// ALIGN16: align 16 i8* @realloc -// ALIGN8: align 8 i8* @malloc -// ALIGN8: align 8 i8* @calloc -// ALIGN8: align 8 i8* @realloc -// NOBUILTIN-MALLOC: declare i8* @malloc -// NOBUILTIN-CALLOC: declare i8* @calloc -// NOBUILTIN-REALLOC: declare i8* @realloc