@@ -116,17 +116,43 @@ void p2struct(struct S1 **ptr) {
116116 // COMMON-LABEL: define void @p2struct(
117117 // COMMON-SAME: ptr noundef [[PTR:%.+]])
118118 // 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]]
125135 // COMMON-NEXT: ret void
126136 //
127137 * ptr = 0 ;
128138}
129139
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+
130156// ENABLED: [[P2INT_0]] = !{[[P2INT:!.+]], [[P2INT]], i64 0}
131157// ENABLED: [[P2INT]] = !{!"p2 int", [[ANY_POINTER:!.+]], i64 0}
132158// DEFAULT: [[ANYPTR]] = !{[[ANY_POINTER:!.+]], [[ANY_POINTER]], i64 0}
@@ -145,3 +171,5 @@ void p2struct(struct S1 **ptr) {
145171// ENABLED: [[P2CHAR]] = !{!"p2 omnipotent char", [[ANY_POINTER]], i64 0}
146172// ENABLED: [[P1CHAR_0]] = !{[[P1CHAR:!.+]], [[P1CHAR]], i64 0}
147173// 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