@@ -34,6 +34,40 @@ void test(S &s) {
3434 s.b = 0 ;
3535 s.c .x = 0 ;
3636}
37+
38+ struct A { alignas (32 ) char x[32 ]; };
39+ struct B : virtual A { long long b; char c; };
40+ extern B& b;
41+ extern B (&bb)[2];
42+ // CHECK-LABEL: define dso_local void @_Z13test_externalv(
43+ // CHECK-SAME: ) #[[ATTR0]] {
44+ // CHECK-NEXT: [[ENTRY:.*:]]
45+ // CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr @b, align 8, !tbaa [[TBAA23:![0-9]+]], !nonnull [[META7]], !align [[META8]]
46+ // CHECK-NEXT: [[C:%.*]] = getelementptr inbounds nuw [[STRUCT_B:%.*]], ptr [[TMP0]], i32 0, i32 2
47+ // CHECK-NEXT: store i8 0, ptr [[C]], align 8, !tbaa [[TBAA25:![0-9]+]]
48+ // CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr @bb, align 8, !tbaa [[TBAA23]], !nonnull [[META7]], !align [[META20]]
49+ // CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [2 x %struct.B], ptr [[TMP1]], i64 0, i64 0
50+ // CHECK-NEXT: [[C1:%.*]] = getelementptr inbounds nuw [[STRUCT_B]], ptr [[ARRAYIDX]], i32 0, i32 2
51+ // CHECK-NEXT: store i8 0, ptr [[C1]], align 16, !tbaa [[TBAA25]]
52+ // CHECK-NEXT: ret void
53+ //
54+ void test_external () {
55+ b.c = 0 ; // align 8
56+ bb[0 ].c = 0 ; // align 32
57+ }
58+
59+ // CHECK-LABEL: define dso_local noundef ptr @_Z15test_deref_onlyR1B(
60+ // CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(17) [[S:%.*]]) #[[ATTR0]] {
61+ // CHECK-NEXT: [[ENTRY:.*:]]
62+ // CHECK-NEXT: [[S_ADDR:%.*]] = alloca ptr, align 8
63+ // CHECK-NEXT: store ptr [[S]], ptr [[S_ADDR]], align 8, !tbaa [[TBAA23]]
64+ // CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[S_ADDR]], align 8, !tbaa [[TBAA23]], !nonnull [[META7]], !align [[META8]]
65+ // CHECK-NEXT: [[C:%.*]] = getelementptr inbounds nuw [[STRUCT_B:%.*]], ptr [[TMP0]], i32 0, i32 2
66+ // CHECK-NEXT: ret ptr [[C]]
67+ //
68+ char * test_deref_only (B &s) {
69+ return &s.c ;
70+ }
3771// .
3872// CHECK: [[TBAA2]] = !{[[META3:![0-9]+]], [[META3]], i64 0}
3973// CHECK: [[META3]] = !{!"p1 _ZTS1S", [[META4:![0-9]+]], i64 0}
@@ -56,4 +90,9 @@ void test(S &s) {
5690// CHECK: [[META20]] = !{i64 32}
5791// CHECK: [[TBAA21]] = !{[[META22:![0-9]+]], [[META18]], i64 0}
5892// CHECK: [[META22]] = !{!"_ZTS1F", [[META18]], i64 0}
93+ // CHECK: [[TBAA23]] = !{[[META24:![0-9]+]], [[META24]], i64 0}
94+ // CHECK: [[META24]] = !{!"p1 _ZTS1B", [[META4]], i64 0}
95+ // CHECK: [[TBAA25]] = !{[[META26:![0-9]+]], [[META5]], i64 16}
96+ // CHECK: [[META26]] = !{!"_ZTS1B", [[META27:![0-9]+]], i64 8, [[META5]], i64 16}
97+ // CHECK: [[META27]] = !{!"long long", [[META5]], i64 0}
5998// .
0 commit comments