447 lines · c
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 52// REQUIRES: aarch64-registered-target3// RUN: %clang_cc1 -triple aarch64 -target-feature +neon -emit-llvm -O2 -o - %s | FileCheck %s4#include <stdarg.h>5#include <arm_neon.h>6 7// natural alignment 16, adjusted alignment 168// expected alignment of copy on callee stack: 169struct non_packed_struct {10 uint16x8_t M0; // member alignment 1611};12 13// natural alignment 1, adjusted alignment 114// expected alignment of copy on callee stack: 815struct __attribute((packed)) packed_struct {16 uint16x8_t M0; // member alignment 1, because the field is packed when the struct is packed17};18 19// natural alignment 1, adjusted alignment 120// expected alignment of copy on callee stack: 821struct packed_member {22 uint16x8_t M0 __attribute((packed)); // member alignment 123};24 25// natural alignment 16, adjusted alignment 16, despite the 8-byte alignment specified by the attribute, because the natural alignment26// for the vector type is 16 and the attribute cannot decrease the minimum required alignment to be less.27// expected alignment of copy on callee stack: 1628struct __attribute((aligned (8))) aligned_struct_8 {29 uint16x8_t M0; // member alignment 1630};31 32// natural alignment 16, adjusted alignment 1633// expected alignment of copy on callee stack: 1634struct aligned_member_8 {35 uint16x8_t M0 __attribute((aligned (8))); // member alignment 16, despite the 8-byte alignment specified by the attribute,36 // because the natural alignment for the vector type is 16 and the attribute cannot decrease the minimum required alignment to be less.37};38 39// natural alignment 8, adjusted alignment 840// expected alignment of copy on callee stack: 841#pragma pack(8)42struct pragma_packed_struct_8 {43 uint16x8_t M0; // member alignment 8 because the struct is subject to packed(8)44};45 46// natural alignment 4, adjusted alignment 447// expected alignment of copy on callee stack: 848#pragma pack(4)49struct pragma_packed_struct_4 {50 uint16x8_t M0; // member alignment 4 because the struct is subject to packed(4)51};52 53double gd;54void init(int, ...);55 56struct non_packed_struct gs_non_packed_struct;57 58// CHECK-LABEL: define dso_local void @named_arg_non_packed_struct59// CHECK-SAME: (double [[D0:%.*]], double [[D1:%.*]], double [[D2:%.*]], double [[D3:%.*]], double [[D4:%.*]], double [[D5:%.*]], double [[D6:%.*]], double [[D7:%.*]], double noundef [[D8:%.*]], [1 x <8 x i16>] alignstack(16) [[S_NON_PACKED_STRUCT_COERCE:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {60// CHECK-NEXT: entry:61// CHECK-NEXT: [[S_NON_PACKED_STRUCT_COERCE_FCA_0_EXTRACT:%.*]] = extractvalue [1 x <8 x i16>] [[S_NON_PACKED_STRUCT_COERCE]], 062// CHECK-NEXT: store double [[D8]], ptr @gd, align 8, !tbaa [[TBAA6:![0-9]+]]63// CHECK-NEXT: store <8 x i16> [[S_NON_PACKED_STRUCT_COERCE_FCA_0_EXTRACT]], ptr @gs_non_packed_struct, align 16, !tbaa [[TBAA8:![0-9]+]]64// CHECK-NEXT: ret void65__attribute__((noinline)) void named_arg_non_packed_struct(double d0, double d1, double d2, double d3,66 double d4, double d5, double d6, double d7,67 double d8, struct non_packed_struct s_non_packed_struct) {68 gd = d8;69 gs_non_packed_struct = s_non_packed_struct;70}71 72// CHECK-LABEL: define dso_local void @variadic_non_packed_struct73// CHECK-SAME: (double [[D0:%.*]], double [[D1:%.*]], double [[D2:%.*]], double [[D3:%.*]], double [[D4:%.*]], double [[D5:%.*]], double [[D6:%.*]], double [[D7:%.*]], double [[D8:%.*]], ...) local_unnamed_addr #[[ATTR1:[0-9]+]] {74// CHECK-NEXT: entry:75// CHECK-NEXT: [[VL:%.*]] = alloca [[STRUCT___VA_LIST:%.*]], align 876// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr nonnull [[VL]]) #[[ATTR6:[0-9]+]]77// CHECK-NEXT: call void @llvm.va_start.p0(ptr nonnull [[VL]])78// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr nonnull [[VL]]) #[[ATTR6]]79// CHECK-NEXT: ret void80void variadic_non_packed_struct(double d0, double d1, double d2, double d3,81 double d4, double d5, double d6, double d7,82 double d8, ...) {83 va_list vl;84 va_start(vl, d8);85 struct non_packed_struct on_callee_stack;86 on_callee_stack = va_arg(vl, struct non_packed_struct);87}88 89// CHECK-LABEL: define dso_local void @test_non_packed_struct90// CHECK-SAME: () local_unnamed_addr #[[ATTR4:[0-9]+]] {91// CHECK-NEXT: entry:92// CHECK-NEXT: [[S_NON_PACKED_STRUCT:%.*]] = alloca [[STRUCT_NON_PACKED_STRUCT:%.*]], align 1693// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr nonnull [[S_NON_PACKED_STRUCT]]) #[[ATTR6]]94// CHECK-NEXT: call void (i32, ...) @init(i32 noundef 1, ptr noundef nonnull [[S_NON_PACKED_STRUCT]]) #[[ATTR6]]95// CHECK-NEXT: [[DOTFCA_0_LOAD:%.*]] = load <8 x i16>, ptr [[S_NON_PACKED_STRUCT]], align 1696// CHECK-NEXT: [[DOTFCA_0_INSERT:%.*]] = insertvalue [1 x <8 x i16>] poison, <8 x i16> [[DOTFCA_0_LOAD]], 097// CHECK-NEXT: call void @named_arg_non_packed_struct(double poison, double poison, double poison, double poison, double poison, double poison, double poison, double poison, double noundef 2.000000e+00, [1 x <8 x i16>] alignstack(16) [[DOTFCA_0_INSERT]])98// CHECK-NEXT: [[DOTFCA_0_LOAD3:%.*]] = load <8 x i16>, ptr [[S_NON_PACKED_STRUCT]], align 1699// CHECK-NEXT: [[DOTFCA_0_INSERT4:%.*]] = insertvalue [1 x <8 x i16>] poison, <8 x i16> [[DOTFCA_0_LOAD3]], 0100// CHECK-NEXT: call void (double, double, double, double, double, double, double, double, double, ...) @variadic_non_packed_struct(double poison, double poison, double poison, double poison, double poison, double poison, double poison, double poison, double poison, [1 x <8 x i16>] alignstack(16) [[DOTFCA_0_INSERT4]])101// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr nonnull [[S_NON_PACKED_STRUCT]]) #[[ATTR6]]102// CHECK-NEXT: ret void103void test_non_packed_struct() {104 struct non_packed_struct s_non_packed_struct;105 init(1, &s_non_packed_struct);106 107 named_arg_non_packed_struct(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, s_non_packed_struct);108 variadic_non_packed_struct(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, s_non_packed_struct);109}110 111struct packed_struct gs_packed_struct;112 113// CHECK-LABEL: define dso_local void @named_arg_packed_struct114// CHECK-SAME: (double [[D0:%.*]], double [[D1:%.*]], double [[D2:%.*]], double [[D3:%.*]], double [[D4:%.*]], double [[D5:%.*]], double [[D6:%.*]], double [[D7:%.*]], double noundef [[D8:%.*]], [1 x <8 x i16>] alignstack(8) [[S_PACKED_STRUCT_COERCE:%.*]]) local_unnamed_addr #[[ATTR0]] {115// CHECK-NEXT: entry:116// CHECK-NEXT: [[S_PACKED_STRUCT_COERCE_FCA_0_EXTRACT:%.*]] = extractvalue [1 x <8 x i16>] [[S_PACKED_STRUCT_COERCE]], 0117// CHECK-NEXT: store double [[D8]], ptr @gd, align 8, !tbaa [[TBAA6]]118// CHECK-NEXT: store <8 x i16> [[S_PACKED_STRUCT_COERCE_FCA_0_EXTRACT]], ptr @gs_packed_struct, align 1, !tbaa [[TBAA8]]119// CHECK-NEXT: ret void120__attribute__((noinline)) void named_arg_packed_struct(double d0, double d1, double d2, double d3,121 double d4, double d5, double d6, double d7,122 double d8, struct packed_struct s_packed_struct) {123 gd = d8;124 gs_packed_struct = s_packed_struct;125}126 127// CHECK-LABEL: define dso_local void @variadic_packed_struct128// CHECK-SAME: (double [[D0:%.*]], double [[D1:%.*]], double [[D2:%.*]], double [[D3:%.*]], double [[D4:%.*]], double [[D5:%.*]], double [[D6:%.*]], double [[D7:%.*]], double [[D8:%.*]], ...) local_unnamed_addr #[[ATTR1]] {129// CHECK-NEXT: entry:130// CHECK-NEXT: [[VL:%.*]] = alloca [[STRUCT___VA_LIST:%.*]], align 8131// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr nonnull [[VL]]) #[[ATTR6]]132// CHECK-NEXT: call void @llvm.va_start.p0(ptr nonnull [[VL]])133// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr nonnull [[VL]]) #[[ATTR6]]134// CHECK-NEXT: ret void135void variadic_packed_struct(double d0, double d1, double d2, double d3,136 double d4, double d5, double d6, double d7,137 double d8, ...) {138 va_list vl;139 va_start(vl, d8);140 struct packed_struct on_callee_stack;141 on_callee_stack = va_arg(vl, struct packed_struct);142}143 144// CHECK-LABEL: define dso_local void @test_packed_struct145// CHECK-SAME: () local_unnamed_addr #[[ATTR4]] {146// CHECK-NEXT: entry:147// CHECK-NEXT: [[S_PACKED_STRUCT:%.*]] = alloca [[STRUCT_PACKED_STRUCT:%.*]], align 16148// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr nonnull [[S_PACKED_STRUCT]]) #[[ATTR6]]149// CHECK-NEXT: call void (i32, ...) @init(i32 noundef 1, ptr noundef nonnull [[S_PACKED_STRUCT]]) #[[ATTR6]]150// CHECK-NEXT: [[DOTFCA_0_LOAD:%.*]] = load <8 x i16>, ptr [[S_PACKED_STRUCT]], align 16151// CHECK-NEXT: [[DOTFCA_0_INSERT:%.*]] = insertvalue [1 x <8 x i16>] poison, <8 x i16> [[DOTFCA_0_LOAD]], 0152// CHECK-NEXT: call void @named_arg_packed_struct(double poison, double poison, double poison, double poison, double poison, double poison, double poison, double poison, double noundef 2.000000e+00, [1 x <8 x i16>] alignstack(8) [[DOTFCA_0_INSERT]])153// CHECK-NEXT: [[DOTFCA_0_LOAD3:%.*]] = load <8 x i16>, ptr [[S_PACKED_STRUCT]], align 16154// CHECK-NEXT: [[DOTFCA_0_INSERT4:%.*]] = insertvalue [1 x <8 x i16>] poison, <8 x i16> [[DOTFCA_0_LOAD3]], 0155// CHECK-NEXT: call void (double, double, double, double, double, double, double, double, double, ...) @variadic_packed_struct(double poison, double poison, double poison, double poison, double poison, double poison, double poison, double poison, double poison, [1 x <8 x i16>] alignstack(8) [[DOTFCA_0_INSERT4]])156// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr nonnull [[S_PACKED_STRUCT]]) #[[ATTR6]]157// CHECK-NEXT: ret void158void test_packed_struct() {159 struct packed_struct s_packed_struct;160 init(1, &s_packed_struct);161 162 named_arg_packed_struct(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, s_packed_struct);163 variadic_packed_struct(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, s_packed_struct);164}165 166struct packed_member gs_packed_member;167 168// CHECK-LABEL: define dso_local void @named_arg_packed_member169// CHECK-SAME: (double [[D0:%.*]], double [[D1:%.*]], double [[D2:%.*]], double [[D3:%.*]], double [[D4:%.*]], double [[D5:%.*]], double [[D6:%.*]], double [[D7:%.*]], double noundef [[D8:%.*]], [1 x <8 x i16>] alignstack(8) [[S_PACKED_MEMBER_COERCE:%.*]]) local_unnamed_addr #[[ATTR0]] {170// CHECK-NEXT: entry:171// CHECK-NEXT: [[S_PACKED_MEMBER_COERCE_FCA_0_EXTRACT:%.*]] = extractvalue [1 x <8 x i16>] [[S_PACKED_MEMBER_COERCE]], 0172// CHECK-NEXT: store double [[D8]], ptr @gd, align 8, !tbaa [[TBAA6]]173// CHECK-NEXT: store <8 x i16> [[S_PACKED_MEMBER_COERCE_FCA_0_EXTRACT]], ptr @gs_packed_member, align 1, !tbaa [[TBAA8]]174// CHECK-NEXT: ret void175__attribute__((noinline)) void named_arg_packed_member(double d0, double d1, double d2, double d3,176 double d4, double d5, double d6, double d7,177 double d8, struct packed_member s_packed_member) {178 gd = d8;179 gs_packed_member = s_packed_member;180}181 182// CHECK-LABEL: define dso_local void @variadic_packed_member183// CHECK-SAME: (double [[D0:%.*]], double [[D1:%.*]], double [[D2:%.*]], double [[D3:%.*]], double [[D4:%.*]], double [[D5:%.*]], double [[D6:%.*]], double [[D7:%.*]], double [[D8:%.*]], ...) local_unnamed_addr #[[ATTR1]] {184// CHECK-NEXT: entry:185// CHECK-NEXT: [[VL:%.*]] = alloca [[STRUCT___VA_LIST:%.*]], align 8186// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr nonnull [[VL]]) #[[ATTR6]]187// CHECK-NEXT: call void @llvm.va_start.p0(ptr nonnull [[VL]])188// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr nonnull [[VL]]) #[[ATTR6]]189// CHECK-NEXT: ret void190void variadic_packed_member(double d0, double d1, double d2, double d3,191 double d4, double d5, double d6, double d7,192 double d8, ...) {193 va_list vl;194 va_start(vl, d8);195 struct packed_member on_callee_stack;196 on_callee_stack = va_arg(vl, struct packed_member);197}198 199// CHECK-LABEL: define dso_local void @test_packed_member200// CHECK-SAME: () local_unnamed_addr #[[ATTR4]] {201// CHECK-NEXT: entry:202// CHECK-NEXT: [[S_PACKED_MEMBER:%.*]] = alloca [[STRUCT_PACKED_MEMBER:%.*]], align 16203// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr nonnull [[S_PACKED_MEMBER]]) #[[ATTR6]]204// CHECK-NEXT: call void (i32, ...) @init(i32 noundef 1, ptr noundef nonnull [[S_PACKED_MEMBER]]) #[[ATTR6]]205// CHECK-NEXT: [[DOTFCA_0_LOAD:%.*]] = load <8 x i16>, ptr [[S_PACKED_MEMBER]], align 16206// CHECK-NEXT: [[DOTFCA_0_INSERT:%.*]] = insertvalue [1 x <8 x i16>] poison, <8 x i16> [[DOTFCA_0_LOAD]], 0207// CHECK-NEXT: call void @named_arg_packed_member(double poison, double poison, double poison, double poison, double poison, double poison, double poison, double poison, double noundef 2.000000e+00, [1 x <8 x i16>] alignstack(8) [[DOTFCA_0_INSERT]])208// CHECK-NEXT: [[DOTFCA_0_LOAD3:%.*]] = load <8 x i16>, ptr [[S_PACKED_MEMBER]], align 16209// CHECK-NEXT: [[DOTFCA_0_INSERT4:%.*]] = insertvalue [1 x <8 x i16>] poison, <8 x i16> [[DOTFCA_0_LOAD3]], 0210// CHECK-NEXT: call void (double, double, double, double, double, double, double, double, double, ...) @variadic_packed_member(double poison, double poison, double poison, double poison, double poison, double poison, double poison, double poison, double poison, [1 x <8 x i16>] alignstack(8) [[DOTFCA_0_INSERT4]])211// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr nonnull [[S_PACKED_MEMBER]]) #[[ATTR6]]212// CHECK-NEXT: ret void213void test_packed_member() {214 struct packed_member s_packed_member;215 init(1, &s_packed_member);216 217 named_arg_packed_member(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, s_packed_member);218 variadic_packed_member(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, s_packed_member);219}220 221struct aligned_struct_8 gs_aligned_struct_8;222 223// CHECK-LABEL: define dso_local void @named_arg_aligned_struct_8224// CHECK-SAME: (double [[D0:%.*]], double [[D1:%.*]], double [[D2:%.*]], double [[D3:%.*]], double [[D4:%.*]], double [[D5:%.*]], double [[D6:%.*]], double [[D7:%.*]], double noundef [[D8:%.*]], [1 x <8 x i16>] alignstack(16) [[S_ALIGNED_STRUCT_8_COERCE:%.*]]) local_unnamed_addr #[[ATTR0]] {225// CHECK-NEXT: entry:226// CHECK-NEXT: [[S_ALIGNED_STRUCT_8_COERCE_FCA_0_EXTRACT:%.*]] = extractvalue [1 x <8 x i16>] [[S_ALIGNED_STRUCT_8_COERCE]], 0227// CHECK-NEXT: store double [[D8]], ptr @gd, align 8, !tbaa [[TBAA6]]228// CHECK-NEXT: store <8 x i16> [[S_ALIGNED_STRUCT_8_COERCE_FCA_0_EXTRACT]], ptr @gs_aligned_struct_8, align 16, !tbaa [[TBAA8]]229// CHECK-NEXT: ret void230__attribute__((noinline)) void named_arg_aligned_struct_8(double d0, double d1, double d2, double d3,231 double d4, double d5, double d6, double d7,232 double d8, struct aligned_struct_8 s_aligned_struct_8) {233 gd = d8;234 gs_aligned_struct_8 = s_aligned_struct_8;235}236 237// CHECK-LABEL: define dso_local void @variadic_aligned_struct_8238// CHECK-SAME: (double [[D0:%.*]], double [[D1:%.*]], double [[D2:%.*]], double [[D3:%.*]], double [[D4:%.*]], double [[D5:%.*]], double [[D6:%.*]], double [[D7:%.*]], double [[D8:%.*]], ...) local_unnamed_addr #[[ATTR1]] {239// CHECK-NEXT: entry:240// CHECK-NEXT: [[VL:%.*]] = alloca [[STRUCT___VA_LIST:%.*]], align 8241// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr nonnull [[VL]]) #[[ATTR6]]242// CHECK-NEXT: call void @llvm.va_start.p0(ptr nonnull [[VL]])243// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr nonnull [[VL]]) #[[ATTR6]]244// CHECK-NEXT: ret void245void variadic_aligned_struct_8(double d0, double d1, double d2, double d3,246 double d4, double d5, double d6, double d7,247 double d8, ...) {248 va_list vl;249 va_start(vl, d8);250 struct aligned_struct_8 on_callee_stack;251 on_callee_stack = va_arg(vl, struct aligned_struct_8);252}253 254// CHECK-LABEL: define dso_local void @test_aligned_struct_8255// CHECK-SAME: () local_unnamed_addr #[[ATTR4]] {256// CHECK-NEXT: entry:257// CHECK-NEXT: [[S_ALIGNED_STRUCT_8:%.*]] = alloca [[STRUCT_ALIGNED_STRUCT_8:%.*]], align 16258// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr nonnull [[S_ALIGNED_STRUCT_8]]) #[[ATTR6]]259// CHECK-NEXT: call void (i32, ...) @init(i32 noundef 1, ptr noundef nonnull [[S_ALIGNED_STRUCT_8]]) #[[ATTR6]]260// CHECK-NEXT: [[DOTFCA_0_LOAD:%.*]] = load <8 x i16>, ptr [[S_ALIGNED_STRUCT_8]], align 16261// CHECK-NEXT: [[DOTFCA_0_INSERT:%.*]] = insertvalue [1 x <8 x i16>] poison, <8 x i16> [[DOTFCA_0_LOAD]], 0262// CHECK-NEXT: call void @named_arg_aligned_struct_8(double poison, double poison, double poison, double poison, double poison, double poison, double poison, double poison, double noundef 2.000000e+00, [1 x <8 x i16>] alignstack(16) [[DOTFCA_0_INSERT]])263// CHECK-NEXT: [[DOTFCA_0_LOAD3:%.*]] = load <8 x i16>, ptr [[S_ALIGNED_STRUCT_8]], align 16264// CHECK-NEXT: [[DOTFCA_0_INSERT4:%.*]] = insertvalue [1 x <8 x i16>] poison, <8 x i16> [[DOTFCA_0_LOAD3]], 0265// CHECK-NEXT: call void (double, double, double, double, double, double, double, double, double, ...) @variadic_aligned_struct_8(double poison, double poison, double poison, double poison, double poison, double poison, double poison, double poison, double poison, [1 x <8 x i16>] alignstack(16) [[DOTFCA_0_INSERT4]])266// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr nonnull [[S_ALIGNED_STRUCT_8]]) #[[ATTR6]]267// CHECK-NEXT: ret void268void test_aligned_struct_8() {269 struct aligned_struct_8 s_aligned_struct_8;270 init(1, &s_aligned_struct_8);271 272 named_arg_aligned_struct_8(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, s_aligned_struct_8);273 variadic_aligned_struct_8(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, s_aligned_struct_8);274}275 276struct aligned_member_8 gs_aligned_member_8;277 278// CHECK-LABEL: define dso_local void @named_arg_aligned_member_8279// CHECK-SAME: (double [[D0:%.*]], double [[D1:%.*]], double [[D2:%.*]], double [[D3:%.*]], double [[D4:%.*]], double [[D5:%.*]], double [[D6:%.*]], double [[D7:%.*]], double noundef [[D8:%.*]], [1 x <8 x i16>] alignstack(16) [[S_ALIGNED_MEMBER_8_COERCE:%.*]]) local_unnamed_addr #[[ATTR0]] {280// CHECK-NEXT: entry:281// CHECK-NEXT: [[S_ALIGNED_MEMBER_8_COERCE_FCA_0_EXTRACT:%.*]] = extractvalue [1 x <8 x i16>] [[S_ALIGNED_MEMBER_8_COERCE]], 0282// CHECK-NEXT: store double [[D8]], ptr @gd, align 8, !tbaa [[TBAA6]]283// CHECK-NEXT: store <8 x i16> [[S_ALIGNED_MEMBER_8_COERCE_FCA_0_EXTRACT]], ptr @gs_aligned_member_8, align 16, !tbaa [[TBAA8]]284// CHECK-NEXT: ret void285__attribute__((noinline)) void named_arg_aligned_member_8(double d0, double d1, double d2, double d3,286 double d4, double d5, double d6, double d7,287 double d8, struct aligned_member_8 s_aligned_member_8) {288 gd = d8;289 gs_aligned_member_8 = s_aligned_member_8;290}291 292// CHECK-LABEL: define dso_local void @variadic_aligned_member_8293// CHECK-SAME: (double [[D0:%.*]], double [[D1:%.*]], double [[D2:%.*]], double [[D3:%.*]], double [[D4:%.*]], double [[D5:%.*]], double [[D6:%.*]], double [[D7:%.*]], double [[D8:%.*]], ...) local_unnamed_addr #[[ATTR1]] {294// CHECK-NEXT: entry:295// CHECK-NEXT: [[VL:%.*]] = alloca [[STRUCT___VA_LIST:%.*]], align 8296// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr nonnull [[VL]]) #[[ATTR6]]297// CHECK-NEXT: call void @llvm.va_start.p0(ptr nonnull [[VL]])298// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr nonnull [[VL]]) #[[ATTR6]]299// CHECK-NEXT: ret void300void variadic_aligned_member_8(double d0, double d1, double d2, double d3,301 double d4, double d5, double d6, double d7,302 double d8, ...) {303 va_list vl;304 va_start(vl, d8);305 struct aligned_member_8 on_callee_stack;306 on_callee_stack = va_arg(vl, struct aligned_member_8);307}308 309// CHECK-LABEL: define dso_local void @test_aligned_member_8310// CHECK-SAME: () local_unnamed_addr #[[ATTR4]] {311// CHECK-NEXT: entry:312// CHECK-NEXT: [[S_ALIGNED_MEMBER_8:%.*]] = alloca [[STRUCT_ALIGNED_MEMBER_8:%.*]], align 16313// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr nonnull [[S_ALIGNED_MEMBER_8]]) #[[ATTR6]]314// CHECK-NEXT: call void (i32, ...) @init(i32 noundef 1, ptr noundef nonnull [[S_ALIGNED_MEMBER_8]]) #[[ATTR6]]315// CHECK-NEXT: [[DOTFCA_0_LOAD:%.*]] = load <8 x i16>, ptr [[S_ALIGNED_MEMBER_8]], align 16316// CHECK-NEXT: [[DOTFCA_0_INSERT:%.*]] = insertvalue [1 x <8 x i16>] poison, <8 x i16> [[DOTFCA_0_LOAD]], 0317// CHECK-NEXT: call void @named_arg_aligned_member_8(double poison, double poison, double poison, double poison, double poison, double poison, double poison, double poison, double noundef 2.000000e+00, [1 x <8 x i16>] alignstack(16) [[DOTFCA_0_INSERT]])318// CHECK-NEXT: [[DOTFCA_0_LOAD3:%.*]] = load <8 x i16>, ptr [[S_ALIGNED_MEMBER_8]], align 16319// CHECK-NEXT: [[DOTFCA_0_INSERT4:%.*]] = insertvalue [1 x <8 x i16>] poison, <8 x i16> [[DOTFCA_0_LOAD3]], 0320// CHECK-NEXT: call void (double, double, double, double, double, double, double, double, double, ...) @variadic_aligned_member_8(double poison, double poison, double poison, double poison, double poison, double poison, double poison, double poison, double poison, [1 x <8 x i16>] alignstack(16) [[DOTFCA_0_INSERT4]])321// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr nonnull [[S_ALIGNED_MEMBER_8]]) #[[ATTR6]]322// CHECK-NEXT: ret void323void test_aligned_member_8() {324 struct aligned_member_8 s_aligned_member_8;325 init(1, &s_aligned_member_8);326 327 named_arg_aligned_member_8(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, s_aligned_member_8);328 variadic_aligned_member_8(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, s_aligned_member_8);329}330 331struct pragma_packed_struct_8 gs_pragma_packed_struct_8;332 333// CHECK-LABEL: define dso_local void @named_arg_pragma_packed_struct_8334// CHECK-SAME: (double [[D0:%.*]], double [[D1:%.*]], double [[D2:%.*]], double [[D3:%.*]], double [[D4:%.*]], double [[D5:%.*]], double [[D6:%.*]], double [[D7:%.*]], double noundef [[D8:%.*]], [1 x <8 x i16>] alignstack(8) [[S_PRAGMA_PACKED_STRUCT_8_COERCE:%.*]]) local_unnamed_addr #[[ATTR0]] {335// CHECK-NEXT: entry:336// CHECK-NEXT: [[S_PRAGMA_PACKED_STRUCT_8_COERCE_FCA_0_EXTRACT:%.*]] = extractvalue [1 x <8 x i16>] [[S_PRAGMA_PACKED_STRUCT_8_COERCE]], 0337// CHECK-NEXT: store double [[D8]], ptr @gd, align 8, !tbaa [[TBAA6]]338// CHECK-NEXT: store <8 x i16> [[S_PRAGMA_PACKED_STRUCT_8_COERCE_FCA_0_EXTRACT]], ptr @gs_pragma_packed_struct_8, align 8, !tbaa [[TBAA8]]339// CHECK-NEXT: ret void340__attribute__((noinline)) void named_arg_pragma_packed_struct_8(double d0, double d1, double d2, double d3,341 double d4, double d5, double d6, double d7,342 double d8, struct pragma_packed_struct_8 s_pragma_packed_struct_8) {343 gd = d8;344 gs_pragma_packed_struct_8 = s_pragma_packed_struct_8;345}346 347// CHECK-LABEL: define dso_local void @variadic_pragma_packed_struct_8348// CHECK-SAME: (double [[D0:%.*]], double [[D1:%.*]], double [[D2:%.*]], double [[D3:%.*]], double [[D4:%.*]], double [[D5:%.*]], double [[D6:%.*]], double [[D7:%.*]], double [[D8:%.*]], ...) local_unnamed_addr #[[ATTR1]] {349// CHECK-NEXT: entry:350// CHECK-NEXT: [[VL:%.*]] = alloca [[STRUCT___VA_LIST:%.*]], align 8351// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr nonnull [[VL]]) #[[ATTR6]]352// CHECK-NEXT: call void @llvm.va_start.p0(ptr nonnull [[VL]])353// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr nonnull [[VL]]) #[[ATTR6]]354// CHECK-NEXT: ret void355void variadic_pragma_packed_struct_8(double d0, double d1, double d2, double d3,356 double d4, double d5, double d6, double d7,357 double d8, ...) {358 va_list vl;359 va_start(vl, d8);360 struct pragma_packed_struct_8 on_callee_stack;361 on_callee_stack = va_arg(vl, struct pragma_packed_struct_8);362}363 364// CHECK-LABEL: define dso_local void @test_pragma_packed_struct_8365// CHECK-SAME: () local_unnamed_addr #[[ATTR4]] {366// CHECK-NEXT: entry:367// CHECK-NEXT: [[S_PRAGMA_PACKED_STRUCT_8:%.*]] = alloca [[STRUCT_PRAGMA_PACKED_STRUCT_8:%.*]], align 16368// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr nonnull [[S_PRAGMA_PACKED_STRUCT_8]]) #[[ATTR6]]369// CHECK-NEXT: call void (i32, ...) @init(i32 noundef 1, ptr noundef nonnull [[S_PRAGMA_PACKED_STRUCT_8]]) #[[ATTR6]]370// CHECK-NEXT: [[DOTFCA_0_LOAD:%.*]] = load <8 x i16>, ptr [[S_PRAGMA_PACKED_STRUCT_8]], align 16371// CHECK-NEXT: [[DOTFCA_0_INSERT:%.*]] = insertvalue [1 x <8 x i16>] poison, <8 x i16> [[DOTFCA_0_LOAD]], 0372// CHECK-NEXT: call void @named_arg_pragma_packed_struct_8(double poison, double poison, double poison, double poison, double poison, double poison, double poison, double poison, double noundef 2.000000e+00, [1 x <8 x i16>] alignstack(8) [[DOTFCA_0_INSERT]])373// CHECK-NEXT: [[DOTFCA_0_LOAD3:%.*]] = load <8 x i16>, ptr [[S_PRAGMA_PACKED_STRUCT_8]], align 16374// CHECK-NEXT: [[DOTFCA_0_INSERT4:%.*]] = insertvalue [1 x <8 x i16>] poison, <8 x i16> [[DOTFCA_0_LOAD3]], 0375// CHECK-NEXT: call void (double, double, double, double, double, double, double, double, double, ...) @variadic_pragma_packed_struct_8(double poison, double poison, double poison, double poison, double poison, double poison, double poison, double poison, double poison, [1 x <8 x i16>] alignstack(8) [[DOTFCA_0_INSERT4]])376// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr nonnull [[S_PRAGMA_PACKED_STRUCT_8]]) #[[ATTR6]]377// CHECK-NEXT: ret void378void test_pragma_packed_struct_8() {379 struct pragma_packed_struct_8 s_pragma_packed_struct_8;380 init(1, &s_pragma_packed_struct_8);381 382 named_arg_pragma_packed_struct_8(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, s_pragma_packed_struct_8);383 variadic_pragma_packed_struct_8(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, s_pragma_packed_struct_8);384}385 386struct pragma_packed_struct_4 gs_pragma_packed_struct_4;387 388// CHECK-LABEL: define dso_local void @named_arg_pragma_packed_struct_4389// CHECK-SAME: (double [[D0:%.*]], double [[D1:%.*]], double [[D2:%.*]], double [[D3:%.*]], double [[D4:%.*]], double [[D5:%.*]], double [[D6:%.*]], double [[D7:%.*]], double noundef [[D8:%.*]], [1 x <8 x i16>] alignstack(8) [[S_PRAGMA_PACKED_STRUCT_4_COERCE:%.*]]) local_unnamed_addr #[[ATTR0]] {390// CHECK-NEXT: entry:391// CHECK-NEXT: [[S_PRAGMA_PACKED_STRUCT_4_COERCE_FCA_0_EXTRACT:%.*]] = extractvalue [1 x <8 x i16>] [[S_PRAGMA_PACKED_STRUCT_4_COERCE]], 0392// CHECK-NEXT: store double [[D8]], ptr @gd, align 8, !tbaa [[TBAA6]]393// CHECK-NEXT: store <8 x i16> [[S_PRAGMA_PACKED_STRUCT_4_COERCE_FCA_0_EXTRACT]], ptr @gs_pragma_packed_struct_4, align 4, !tbaa [[TBAA8]]394// CHECK-NEXT: ret void395__attribute__((noinline)) void named_arg_pragma_packed_struct_4(double d0, double d1, double d2, double d3,396 double d4, double d5, double d6, double d7,397 double d8, struct pragma_packed_struct_4 s_pragma_packed_struct_4) {398 gd = d8;399 gs_pragma_packed_struct_4 = s_pragma_packed_struct_4;400}401 402// CHECK-LABEL: define dso_local void @variadic_pragma_packed_struct_4403// CHECK-SAME: (double [[D0:%.*]], double [[D1:%.*]], double [[D2:%.*]], double [[D3:%.*]], double [[D4:%.*]], double [[D5:%.*]], double [[D6:%.*]], double [[D7:%.*]], double [[D8:%.*]], ...) local_unnamed_addr #[[ATTR1]] {404// CHECK-NEXT: entry:405// CHECK-NEXT: [[VL:%.*]] = alloca [[STRUCT___VA_LIST:%.*]], align 8406// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr nonnull [[VL]]) #[[ATTR6]]407// CHECK-NEXT: call void @llvm.va_start.p0(ptr nonnull [[VL]])408// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr nonnull [[VL]]) #[[ATTR6]]409// CHECK-NEXT: ret void410void variadic_pragma_packed_struct_4(double d0, double d1, double d2, double d3,411 double d4, double d5, double d6, double d7,412 double d8, ...) {413 va_list vl;414 va_start(vl, d8);415 struct pragma_packed_struct_4 on_callee_stack;416 on_callee_stack = va_arg(vl, struct pragma_packed_struct_4);417}418 419// CHECK-LABEL: define dso_local void @test_pragma_packed_struct_4420// CHECK-SAME: () local_unnamed_addr #[[ATTR4]] {421// CHECK-NEXT: entry:422// CHECK-NEXT: [[S_PRAGMA_PACKED_STRUCT_4:%.*]] = alloca [[STRUCT_PRAGMA_PACKED_STRUCT_4:%.*]], align 16423// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr nonnull [[S_PRAGMA_PACKED_STRUCT_4]]) #[[ATTR6]]424// CHECK-NEXT: call void (i32, ...) @init(i32 noundef 1, ptr noundef nonnull [[S_PRAGMA_PACKED_STRUCT_4]]) #[[ATTR6]]425// CHECK-NEXT: [[DOTFCA_0_LOAD:%.*]] = load <8 x i16>, ptr [[S_PRAGMA_PACKED_STRUCT_4]], align 16426// CHECK-NEXT: [[DOTFCA_0_INSERT:%.*]] = insertvalue [1 x <8 x i16>] poison, <8 x i16> [[DOTFCA_0_LOAD]], 0427// CHECK-NEXT: call void @named_arg_pragma_packed_struct_4(double poison, double poison, double poison, double poison, double poison, double poison, double poison, double poison, double noundef 2.000000e+00, [1 x <8 x i16>] alignstack(8) [[DOTFCA_0_INSERT]])428// CHECK-NEXT: [[DOTFCA_0_LOAD3:%.*]] = load <8 x i16>, ptr [[S_PRAGMA_PACKED_STRUCT_4]], align 16429// CHECK-NEXT: [[DOTFCA_0_INSERT4:%.*]] = insertvalue [1 x <8 x i16>] poison, <8 x i16> [[DOTFCA_0_LOAD3]], 0430// CHECK-NEXT: call void (double, double, double, double, double, double, double, double, double, ...) @variadic_pragma_packed_struct_4(double poison, double poison, double poison, double poison, double poison, double poison, double poison, double poison, double poison, [1 x <8 x i16>] alignstack(8) [[DOTFCA_0_INSERT4]])431// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr nonnull [[S_PRAGMA_PACKED_STRUCT_4]]) #[[ATTR6]]432// CHECK-NEXT: ret void433void test_pragma_packed_struct_4() {434 struct pragma_packed_struct_4 s_pragma_packed_struct_4;435 init(1, &s_pragma_packed_struct_4);436 437 named_arg_pragma_packed_struct_4(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, s_pragma_packed_struct_4);438 variadic_pragma_packed_struct_4(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, s_pragma_packed_struct_4);439}440//.441// CHECK: [[META4:![0-9]+]] = !{!"omnipotent char", [[META5:![0-9]+]], i64 0}442// CHECK: [[META5]] = !{!"Simple C/C++ TBAA"}443// CHECK: [[TBAA6]] = !{[[META7:![0-9]+]], [[META7]], i64 0}444// CHECK: [[META7]] = !{!"double", [[META4]], i64 0}445// CHECK: [[TBAA8]] = !{[[META4]], [[META4]], i64 0}446//.447