brintos

brintos / llvm-project-archived public Read only

0
0
Text · 29.8 KiB · d88a338 Raw
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