Index: include/clang/Basic/TargetInfo.h =================================================================== --- include/clang/Basic/TargetInfo.h +++ include/clang/Basic/TargetInfo.h @@ -72,7 +72,7 @@ unsigned char LargeArrayMinWidth, LargeArrayAlign; unsigned char LongWidth, LongAlign; unsigned char LongLongWidth, LongLongAlign; - unsigned char SuitableAlign; + unsigned short SuitableAlign; unsigned char DefaultAlignForAttributeAligned; unsigned char MinGlobalAlign; unsigned char MaxAtomicPromoteWidth, MaxAtomicInlineWidth; Index: lib/Basic/Targets/X86.h =================================================================== --- lib/Basic/Targets/X86.h +++ lib/Basic/Targets/X86.h @@ -279,6 +279,7 @@ X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &) : TargetInfo(Triple) { LongDoubleFormat = &llvm::APFloat::x87DoubleExtended(); + SuitableAlign = 128; } unsigned getFloatEvalMethod() const override { @@ -454,7 +455,6 @@ DoubleAlign = LongLongAlign = 32; LongDoubleWidth = 96; LongDoubleAlign = 32; - SuitableAlign = 128; resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128"); SizeType = UnsignedInt; PtrDiffType = SignedInt; @@ -543,7 +543,6 @@ : DarwinTargetInfo(Triple, Opts) { LongDoubleWidth = 128; LongDoubleAlign = 128; - SuitableAlign = 128; MaxVectorAlign = 256; // The watchOS simulator uses the builtin bool type for Objective-C. llvm::Triple T = llvm::Triple(Triple); @@ -722,7 +721,6 @@ LongDoubleAlign = 128; LargeArrayMinWidth = 128; LargeArrayAlign = 128; - SuitableAlign = 128; SizeType = IsX32 ? UnsignedInt : UnsignedLong; PtrDiffType = IsX32 ? SignedInt : SignedLong; IntPtrType = IsX32 ? SignedInt : SignedLong; @@ -973,7 +971,6 @@ public: AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) : LinuxTargetInfo(Triple, Opts) { - SuitableAlign = 32; LongDoubleWidth = 64; LongDoubleFormat = &llvm::APFloat::IEEEdouble(); } Index: lib/Basic/Targets/X86.cpp =================================================================== --- lib/Basic/Targets/X86.cpp +++ lib/Basic/Targets/X86.cpp @@ -748,6 +748,13 @@ return false; } + if (hasFeature("avx512f")) + SuitableAlign = std::max(SuitableAlign, (unsigned short)512); + else if (hasFeature("avx")) + SuitableAlign = std::max(SuitableAlign, (unsigned short)256); + else if (hasFeature("sse")) + SuitableAlign = std::max(SuitableAlign, (unsigned short)128); + SimdDefaultAlign = hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128; return true; Index: test/CodeGen/builtins-alloca.c =================================================================== --- /dev/null +++ test/CodeGen/builtins-alloca.c @@ -0,0 +1,58 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s | \ +// RUN: FileCheck %s -check-prefix=CHECK_X86_64 +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s -target-feature +avx | \ +// RUN: FileCheck %s -check-prefix=CHECK_X86_64_AVX +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s -target-feature +avx512f | \ +// RUN: FileCheck %s -check-prefix=CHECK_X86_64_AVX512 +// RUN: %clang_cc1 -triple i386-unknown-linux-android -emit-llvm -o - %s | \ +// RUN: FileCheck %s -check-prefix=CHECK_ANDROID_X86_32 +// RUN: %clang_cc1 -triple i386-unknown-linux-android -emit-llvm -o - %s -target-feature +sse | \ +// RUN: FileCheck %s -check-prefix=CHECK_ANDROID_X86_32_SSE +// RUN: %clang_cc1 -triple i386-unknown-linux-android -emit-llvm -o - %s -target-feature +avx | \ +// RUN: FileCheck %s -check-prefix=CHECK_ANDROID_X86_32_AVX +// RUN: %clang_cc1 -triple i386-unknown-linux-android -emit-llvm -o - %s -target-feature +avx512f | \ +// RUN: FileCheck %s -check-prefix=CHECK_ANDROID_X86_32_AVX512 +// RUN: %clang_cc1 -triple x86_64-unknown-linux-android -emit-llvm -o - %s | \ +// RUN: FileCheck %s -check-prefix=CHECK_ANDROID_X86_64 +// RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm -o - %s | \ +// RUN: FileCheck %s -check-prefix=CHECK_I386 +// RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm -o - %s -target-feature +avx | \ +// RUN: FileCheck %s -check-prefix=CHECK_I386_AVX +// RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm -o - %s -target-feature +avx512f | \ +// RUN: FileCheck %s -check-prefix=CHECK_I386_AVX512 +// RUN: %clang_cc1 -triple i386-apple-darwin -emit-llvm -o - %s | \ +// RUN: FileCheck %s -check-prefix=CHECK_I386_APPLE +// RUN: %clang_cc1 -triple x86_64-apple-darwin -emit-llvm -o - %s | \ +// RUN: FileCheck %s -check-prefix=CHECK_X86_64_APPLE +// RUN: %clang_cc1 -triple i386-pc-win32 -emit-llvm -o - %s | \ +// RUN: FileCheck %s -check-prefix=CHECK_I386_WIN +// RUN: %clang_cc1 -triple x86_64-unknown-windows -emit-llvm -o - %s | \ +// RUN: FileCheck %s -check-prefix=CHECK_X86_64_WIN +// RUN: %clang_cc1 -triple i386-unknown-cygwin -emit-llvm -o - %s | \ +// RUN: FileCheck %s -check-prefix=CHECK_I386_CYGWIN +// RUN: %clang_cc1 -triple x86_64-unknown-cygwin -emit-llvm -o - %s | \ +// RUN: FileCheck %s -check-prefix=CHECK_X86_64_CYGWIN + + + +char *c1; +// CHECK_X86_64: %1 = alloca i8, i64 1, align 16 +// CHECK_X86_64_AVX: %1 = alloca i8, i64 1, align 32 +// CHECK_X86_64_AVX512: %1 = alloca i8, i64 1, align 64 +// CHECK_ANDROID_X86_32: %1 = alloca i8, align 16 +// CHECK_ANDROID_X86_32_SSE: %1 = alloca i8, align 16 +// CHECK_ANDROID_X86_32_AVX: %1 = alloca i8, align 32 +// CHECK_ANDROID_X86_32_AVX512: %1 = alloca i8, align 64 +// CHECK_ANDROID_X86_64: alloca i8, i64 1, align 16 +// CHECK_I386: %1 = alloca i8, align 16 +// CHECK_I386_AVX: %1 = alloca i8, align 32 +// CHECK_I386_AVX512: %1 = alloca i8, align 64 +// CHECK_I386_APPLE: %1 = alloca i8, align 16 +// CHECK_X86_64_APPLE: %1 = alloca i8, i64 1, align 16 +// CHECK_I386_WIN: %1 = alloca i8, align 16 +// CHECK_X86_64_WIN: %1 = alloca i8, i64 1, align 16 +// CHECK_I386_CYGWIN: %1 = alloca i8, align 16 +// CHECK_X86_64_CYGWIN: %1 = alloca i8, i64 1, align 16 +void f1() { + c1 = __builtin_alloca(1); +}