@@ -571,3 +571,50 @@ struct SSpp_align16 {
571571//
572572void TSpp_align16 (SSpp_align16 s) { *s.a .x = 1 ; }
573573
574+
575+ struct Sempty {
576+ };
577+ // CHECK-A64-LABEL: define dso_local void @_Z6Tempty6Sempty(
578+ // CHECK-A64-SAME: i8 [[S_COERCE:%.*]]) #[[ATTR0]] {
579+ // CHECK-A64-NEXT: [[ENTRY:.*:]]
580+ // CHECK-A64-NEXT: [[S:%.*]] = alloca [[STRUCT_SEMPTY:%.*]], align 1
581+ // CHECK-A64-NEXT: [[COERCE_DIVE:%.*]] = getelementptr inbounds nuw [[STRUCT_SEMPTY]], ptr [[S]], i32 0, i32 0
582+ // CHECK-A64-NEXT: store i8 [[S_COERCE]], ptr [[COERCE_DIVE]], align 1
583+ // CHECK-A64-NEXT: ret void
584+ //
585+ // CHECK-A64_32-LABEL: define void @_Z6Tempty6Sempty(
586+ // CHECK-A64_32-SAME: i8 [[S_COERCE:%.*]]) #[[ATTR0]] {
587+ // CHECK-A64_32-NEXT: [[ENTRY:.*:]]
588+ // CHECK-A64_32-NEXT: [[S:%.*]] = alloca [[STRUCT_SEMPTY:%.*]], align 1
589+ // CHECK-A64_32-NEXT: [[COERCE_DIVE:%.*]] = getelementptr inbounds nuw [[STRUCT_SEMPTY]], ptr [[S]], i32 0, i32 0
590+ // CHECK-A64_32-NEXT: store i8 [[S_COERCE]], ptr [[COERCE_DIVE]], align 1
591+ // CHECK-A64_32-NEXT: ret void
592+ //
593+ void Tempty (Sempty s) { }
594+
595+
596+ struct SpSempty {
597+ Sempty y;
598+ int *x;
599+ };
600+ // CHECK-A64-LABEL: define dso_local void @_Z8TpSempty8SpSempty(
601+ // CHECK-A64-SAME: [2 x i64] [[S_COERCE:%.*]]) #[[ATTR0]] {
602+ // CHECK-A64-NEXT: [[ENTRY:.*:]]
603+ // CHECK-A64-NEXT: [[S:%.*]] = alloca [[STRUCT_SPSEMPTY:%.*]], align 8
604+ // CHECK-A64-NEXT: store [2 x i64] [[S_COERCE]], ptr [[S]], align 8
605+ // CHECK-A64-NEXT: [[X:%.*]] = getelementptr inbounds nuw [[STRUCT_SPSEMPTY]], ptr [[S]], i32 0, i32 1
606+ // CHECK-A64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X]], align 8
607+ // CHECK-A64-NEXT: store i32 1, ptr [[TMP0]], align 4
608+ // CHECK-A64-NEXT: ret void
609+ //
610+ // CHECK-A64_32-LABEL: define void @_Z8TpSempty8SpSempty(
611+ // CHECK-A64_32-SAME: i64 [[S_COERCE:%.*]]) #[[ATTR0]] {
612+ // CHECK-A64_32-NEXT: [[ENTRY:.*:]]
613+ // CHECK-A64_32-NEXT: [[S:%.*]] = alloca [[STRUCT_SPSEMPTY:%.*]], align 4
614+ // CHECK-A64_32-NEXT: store i64 [[S_COERCE]], ptr [[S]], align 4
615+ // CHECK-A64_32-NEXT: [[X:%.*]] = getelementptr inbounds nuw [[STRUCT_SPSEMPTY]], ptr [[S]], i32 0, i32 1
616+ // CHECK-A64_32-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X]], align 4
617+ // CHECK-A64_32-NEXT: store i32 1, ptr [[TMP0]], align 4
618+ // CHECK-A64_32-NEXT: ret void
619+ //
620+ void TpSempty (SpSempty s) { *s.x = 1 ; }
0 commit comments