@@ -34,6 +34,40 @@ void test(S &s) {
34
34
s.b = 0 ;
35
35
s.c .x = 0 ;
36
36
}
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
+ }
37
71
// .
38
72
// CHECK: [[TBAA2]] = !{[[META3:![0-9]+]], [[META3]], i64 0}
39
73
// CHECK: [[META3]] = !{!"p1 _ZTS1S", [[META4:![0-9]+]], i64 0}
@@ -56,4 +90,9 @@ void test(S &s) {
56
90
// CHECK: [[META20]] = !{i64 32}
57
91
// CHECK: [[TBAA21]] = !{[[META22:![0-9]+]], [[META18]], i64 0}
58
92
// 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}
59
98
// .
0 commit comments