Index: lib/CodeGen/CodeGenTBAA.cpp =================================================================== --- lib/CodeGen/CodeGenTBAA.cpp +++ lib/CodeGen/CodeGenTBAA.cpp @@ -101,6 +101,10 @@ if (TypeHasMayAlias(QTy)) return getChar(); + // Vector types should alias with their element types. + if (auto *VT = QTy->getAs()) + QTy = VT->getElementType(); + const Type *Ty = Context.getCanonicalType(QTy).getTypePtr(); if (llvm::MDNode *N = MetadataCache[Ty]) Index: test/CodeGen/tbaa-vector.cpp =================================================================== --- /dev/null +++ test/CodeGen/tbaa-vector.cpp @@ -0,0 +1,17 @@ +// RUN: %clang_cc1 -triple x86_64-apple-darwin -O1 -no-struct-path-tbaa -disable-llvm-passes %s -emit-llvm -o - | FileCheck %s + +typedef double __m256d __attribute__((__vector_size__(32))); +__m256d foo(double *x, __m256d *y) { + *x = 0.0; + return *y; + +// CHECK-LABEL: define <4 x double> @_Z3fooPdPDv4_d +// CHECK: store double 0.000000e+00, double* %{{.*}}, align 8, !tbaa [[TAG_double:!.*]] +// CHECK: load <4 x double>, <4 x double>* %{{.*}}, align {{.*}}, !tbaa [[TAG_double]] +} + +// CHECK: [[TYPE_char:!.*]] = !{!"omnipotent char", [[TAG_cxx_tbaa:!.*]], +// CHECK: [[TAG_cxx_tbaa]] = !{!"Simple C++ TBAA"} +// CHECK: [[TAG_double]] = !{[[TYPE_double:!.*]], [[TYPE_double]], i64 0} +// CHECK: [[TYPE_double]] = !{!"double", [[TYPE_char]], +