@@ -116,17 +116,43 @@ void p2struct(struct S1 **ptr) {
116
116
// COMMON-LABEL: define void @p2struct(
117
117
// COMMON-SAME: ptr noundef [[PTR:%.+]])
118
118
// COMMON: [[PTR_ADDR:%.+]] = alloca ptr, align 8
119
- // ENABLED-NEXT: store ptr [[PTR]], ptr [[PTR_ADDR]], align 8, !tbaa [[P2S1_0:!.+]]
120
- // ENABLED-NEXT: [[BASE:%.+]] = load ptr, ptr [[PTR_ADDR]], align 8, !tbaa [[P2S1_0]]
121
- // ENABLED-NEXT: store ptr null, ptr [[BASE]], align 8, !tbaa [[P1S1_:!.+]]
122
- // DEFAULT-NEXT: store ptr [[PTR]], ptr [[PTR_ADDR]], align 8, !tbaa [[ANYPTR]]
123
- // DEFAULT-NEXT: [[BASE:%.+]] = load ptr, ptr [[PTR_ADDR]], align 8, !tbaa [[ANYPTR]]
124
- // DEFAULT-NEXT: store ptr null, ptr [[BASE]], align 8, !tbaa [[ANYPTR]]
119
+ // ENABLED-NEXT: store ptr [[PTR]], ptr [[PTR_ADDR]], align 8, !tbaa [[ANYPTR:!.+]]
120
+ // DEFAULT-NEXT: store ptr [[PTR]], ptr [[PTR_ADDR]], align 8, !tbaa [[ANYPTR]]
121
+ // COMMON-NEXT: [[BASE:%.+]] = load ptr, ptr [[PTR_ADDR]], align 8, !tbaa [[ANYPTR]]
122
+ // COMMON-NEXT: store ptr null, ptr [[BASE]], align 8, !tbaa [[ANYPTR]]
123
+ // COMMON-NEXT: ret void
124
+ //
125
+ * ptr = 0 ;
126
+ }
127
+
128
+ void p2struct_const (struct S1 const * * ptr ) {
129
+ // COMMON-LABEL: define void @p2struct_const(
130
+ // COMMON-SAME: ptr noundef [[PTR:%.+]])
131
+ // COMMON: [[PTR_ADDR:%.+]] = alloca ptr, align 8
132
+ // COMMON-NEXT: store ptr [[PTR]], ptr [[PTR_ADDR]], align 8, !tbaa [[ANYPTR]]
133
+ // COMMON-NEXT: [[BASE:%.+]] = load ptr, ptr [[PTR_ADDR]], align 8, !tbaa [[ANYPTR]]
134
+ // COMMON-NEXT: store ptr null, ptr [[BASE]], align 8, !tbaa [[ANYPTR]]
125
135
// COMMON-NEXT: ret void
126
136
//
127
137
* ptr = 0 ;
128
138
}
129
139
140
+ struct S2 {
141
+ struct S1 * s ;
142
+ };
143
+
144
+ void p2struct2 (struct S2 * ptr ) {
145
+ // COMMON-LABEL: define void @p2struct2(
146
+ // COMMON-SAME: ptr noundef [[PTR:%.+]])
147
+ // COMMON: [[PTR_ADDR:%.+]] = alloca ptr, align 8
148
+ // COMMON-NEXT: store ptr [[PTR]], ptr [[PTR_ADDR]], align 8, !tbaa [[ANYPTR]]
149
+ // COMMON-NEXT: [[BASE:%.+]] = load ptr, ptr [[PTR_ADDR]], align 8, !tbaa [[ANYPTR]]
150
+ // COMMON-NEXT: [[S:%.+]] = getelementptr inbounds nuw %struct.S2, ptr [[BASE]], i32 0, i32 0
151
+ // COMMON-NEXT: store ptr null, ptr [[S]], align 8, !tbaa [[S2_S_TAG:!.+]]
152
+ // COMMON-NEXT: ret void
153
+ ptr -> s = 0 ;
154
+ }
155
+
130
156
// ENABLED: [[P2INT_0]] = !{[[P2INT:!.+]], [[P2INT]], i64 0}
131
157
// ENABLED: [[P2INT]] = !{!"p2 int", [[ANY_POINTER:!.+]], i64 0}
132
158
// DEFAULT: [[ANYPTR]] = !{[[ANY_POINTER:!.+]], [[ANY_POINTER]], i64 0}
@@ -145,3 +171,5 @@ void p2struct(struct S1 **ptr) {
145
171
// ENABLED: [[P2CHAR]] = !{!"p2 omnipotent char", [[ANY_POINTER]], i64 0}
146
172
// ENABLED: [[P1CHAR_0]] = !{[[P1CHAR:!.+]], [[P1CHAR]], i64 0}
147
173
// ENABLED: [[P1CHAR]] = !{!"p1 omnipotent char", [[ANY_POINTER]], i64 0}
174
+ // COMMON: [[S2_S_TAG]] = !{[[S2_TY:!.+]], [[ANY_POINTER]], i64 0}
175
+ // COMMON: [[S2_TY]] = !{!"S2", [[ANY_POINTER]], i64 0}
0 commit comments