Index: lib/CodeGen/CodeGenTBAA.cpp =================================================================== --- lib/CodeGen/CodeGenTBAA.cpp +++ lib/CodeGen/CodeGenTBAA.cpp @@ -161,6 +161,10 @@ if (Ty->isPointerType() || Ty->isReferenceType()) return createScalarTypeNode("any pointer", getChar(), Size); + // Accesses to arrays are accesses to objects of their element types. + if (CodeGenOpts.NewStructPathTBAA && Ty->isArrayType()) + return getTypeInfo(cast(Ty)->getElementType()); + // Enum types are distinct types. In C++ they have "underlying types", // however they aren't related for TBAA. if (const EnumType *ETy = dyn_cast(Ty)) { Index: test/CodeGen/tbaa-array.cpp =================================================================== --- test/CodeGen/tbaa-array.cpp +++ test/CodeGen/tbaa-array.cpp @@ -1,18 +1,28 @@ // RUN: %clang_cc1 -triple x86_64-linux -O1 -disable-llvm-passes %s \ -// RUN: -emit-llvm -o - | FileCheck %s -// -// Check that we generate correct TBAA information for accesses to array -// elements. +// RUN: -new-struct-path-tbaa -emit-llvm -o - | FileCheck %s struct A { int i; }; struct B { A a[1]; }; +struct C { int i; int x[3]; }; +// Check that we generate correct TBAA information for accesses to array +// elements. int foo(B *b) { // CHECK-LABEL: _Z3fooP1B // CHECK: load i32, {{.*}}, !tbaa [[TAG_A_i:!.*]] return b->a->i; } -// CHECK-DAG: [[TAG_A_i]] = !{[[TYPE_A:!.*]], [[TYPE_int:!.*]], i64 0} -// CHECK-DAG: [[TYPE_A]] = !{!"_ZTS1A", !{{.*}}, i64 0} -// CHECK-DAG: [[TYPE_int]] = !{!"int", !{{.*}}, i64 0} +// Check that members of array types are represented correctly. +int bar(C *c) { +// CHECK-LABEL: _Z3barP1C +// CHECK: load i32, {{.*}}, !tbaa [[TAG_C_i:!.*]] + return c->i; +} + +// CHECK-DAG: [[TAG_A_i]] = !{[[TYPE_A:!.*]], [[TYPE_int:!.*]], i64 0, i64 4} +// CHECK-DAG: [[TAG_C_i]] = !{[[TYPE_C:!.*]], [[TYPE_int:!.*]], i64 0, i64 16} +// CHECK-DAG: [[TYPE_A]] = !{[[TYPE_char:!.*]], i64 4, !"_ZTS1A", [[TYPE_int]], i64 0, i64 4} +// CHECK-DAG: [[TYPE_C]] = !{[[TYPE_char]], i64 16, !"_ZTS1C", [[TYPE_int]], i64 0, i64 4, [[TYPE_int]], i64 4, i64 12} +// CHECK-DAG: [[TYPE_int]] = !{[[TYPE_char]], i64 4, !"int"} +// CHECK-DAG: [[TYPE_char]] = !{{{!.*}}, i64 1, !"omnipotent char"}