Home | History | Annotate | Download | only in CodeGen
      1 // RUN: %clang_cc1 -triple arm64-apple-ios7 -target-feature +neon -target-abi darwinpcs -ffreestanding -emit-llvm -w -o - %s | FileCheck %s
      2 
      3 // CHECK: define signext i8 @f0()
      4 char f0(void) {
      5   return 0;
      6 }
      7 
      8 // Struct as return type. Aggregates <= 16 bytes are passed directly and round
      9 // up to multiple of 8 bytes.
     10 // CHECK: define i64 @f1()
     11 struct s1 { char f0; };
     12 struct s1 f1(void) {}
     13 
     14 // CHECK: define i64 @f2()
     15 struct s2 { short f0; };
     16 struct s2 f2(void) {}
     17 
     18 // CHECK: define i64 @f3()
     19 struct s3 { int f0; };
     20 struct s3 f3(void) {}
     21 
     22 // CHECK: define i64 @f4()
     23 struct s4 { struct s4_0 { int f0; } f0; };
     24 struct s4 f4(void) {}
     25 
     26 // CHECK: define i64 @f5()
     27 struct s5 { struct { } f0; int f1; };
     28 struct s5 f5(void) {}
     29 
     30 // CHECK: define i64 @f6()
     31 struct s6 { int f0[1]; };
     32 struct s6 f6(void) {}
     33 
     34 // CHECK: define void @f7()
     35 struct s7 { struct { int : 0; } f0; };
     36 struct s7 f7(void) {}
     37 
     38 // CHECK: define void @f8()
     39 struct s8 { struct { int : 0; } f0[1]; };
     40 struct s8 f8(void) {}
     41 
     42 // CHECK: define i64 @f9()
     43 struct s9 { int f0; int : 0; };
     44 struct s9 f9(void) {}
     45 
     46 // CHECK: define i64 @f10()
     47 struct s10 { int f0; int : 0; int : 0; };
     48 struct s10 f10(void) {}
     49 
     50 // CHECK: define i64 @f11()
     51 struct s11 { int : 0; int f0; };
     52 struct s11 f11(void) {}
     53 
     54 // CHECK: define i64 @f12()
     55 union u12 { char f0; short f1; int f2; };
     56 union u12 f12(void) {}
     57 
     58 // Homogeneous Aggregate as return type will be passed directly.
     59 // CHECK: define %struct.s13 @f13()
     60 struct s13 { float f0; };
     61 struct s13 f13(void) {}
     62 // CHECK: define %union.u14 @f14()
     63 union u14 { float f0; };
     64 union u14 f14(void) {}
     65 
     66 // CHECK: define void @f15()
     67 void f15(struct s7 a0) {}
     68 
     69 // CHECK: define void @f16()
     70 void f16(struct s8 a0) {}
     71 
     72 // CHECK: define i64 @f17()
     73 struct s17 { short f0 : 13; char f1 : 4; };
     74 struct s17 f17(void) {}
     75 
     76 // CHECK: define i64 @f18()
     77 struct s18 { short f0; char f1 : 4; };
     78 struct s18 f18(void) {}
     79 
     80 // CHECK: define i64 @f19()
     81 struct s19 { int f0; struct s8 f1; };
     82 struct s19 f19(void) {}
     83 
     84 // CHECK: define i64 @f20()
     85 struct s20 { struct s8 f1; int f0; };
     86 struct s20 f20(void) {}
     87 
     88 // CHECK: define i64 @f21()
     89 struct s21 { struct {} f1; int f0 : 4; };
     90 struct s21 f21(void) {}
     91 
     92 // CHECK: define i64 @f22()
     93 // CHECK: define i64 @f23()
     94 // CHECK: define i64 @f24()
     95 // CHECK: define [2 x i64] @f25()
     96 // CHECK: define { float, float } @f26()
     97 // CHECK: define { double, double } @f27()
     98 _Complex char       f22(void) {}
     99 _Complex short      f23(void) {}
    100 _Complex int        f24(void) {}
    101 _Complex long long  f25(void) {}
    102 _Complex float      f26(void) {}
    103 _Complex double     f27(void) {}
    104 
    105 // CHECK: define i64 @f28()
    106 struct s28 { _Complex char f0; };
    107 struct s28 f28() {}
    108 
    109 // CHECK: define i64 @f29()
    110 struct s29 { _Complex short f0; };
    111 struct s29 f29() {}
    112 
    113 // CHECK: define i64 @f30()
    114 struct s30 { _Complex int f0; };
    115 struct s30 f30() {}
    116 
    117 struct s31 { char x; };
    118 void f31(struct s31 s) { }
    119 // CHECK: define void @f31(i64 %s.coerce)
    120 // CHECK: %s = alloca %struct.s31, align 1
    121 // CHECK: trunc i64 %s.coerce to i8
    122 // CHECK: store i8 %{{.*}},
    123 
    124 struct s32 { double x; };
    125 void f32(struct s32 s) { }
    126 // CHECK: @f32([1 x double] %{{.*}})
    127 
    128 // A composite type larger than 16 bytes should be passed indirectly.
    129 struct s33 { char buf[32*32]; };
    130 void f33(struct s33 s) { }
    131 // CHECK: define void @f33(%struct.s33* %s)
    132 
    133 struct s34 { char c; };
    134 void f34(struct s34 s);
    135 void g34(struct s34 *s) { f34(*s); }
    136 // CHECK: @g34(%struct.s34* %s)
    137 // CHECK: %[[a:.*]] = load i8, i8* %{{.*}}
    138 // CHECK: zext i8 %[[a]] to i64
    139 // CHECK: call void @f34(i64 %{{.*}})
    140 
    141 /*
    142  * Check that va_arg accesses stack according to ABI alignment
    143  */
    144 long long t1(int i, ...) {
    145     // CHECK: t1
    146     __builtin_va_list ap;
    147     __builtin_va_start(ap, i);
    148     // CHECK-NOT: add i32 %{{.*}} 7
    149     // CHECK-NOT: and i32 %{{.*}} -8
    150     long long ll = __builtin_va_arg(ap, long long);
    151     __builtin_va_end(ap);
    152     return ll;
    153 }
    154 double t2(int i, ...) {
    155     // CHECK: t2
    156     __builtin_va_list ap;
    157     __builtin_va_start(ap, i);
    158     // CHECK-NOT: add i32 %{{.*}} 7
    159     // CHECK-NOT: and i32 %{{.*}} -8
    160     double ll = __builtin_va_arg(ap, double);
    161     __builtin_va_end(ap);
    162     return ll;
    163 }
    164 
    165 #include <arm_neon.h>
    166 
    167 // Homogeneous Vector Aggregate as return type and argument type.
    168 // CHECK: define %struct.int8x16x2_t @f0_0(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})
    169 int8x16x2_t f0_0(int8x16_t a0, int8x16_t a1) {
    170   return vzipq_s8(a0, a1);
    171 }
    172 
    173 // Test direct vector passing.
    174 typedef float T_float32x2 __attribute__ ((__vector_size__ (8)));
    175 typedef float T_float32x4 __attribute__ ((__vector_size__ (16)));
    176 typedef float T_float32x8 __attribute__ ((__vector_size__ (32)));
    177 typedef float T_float32x16 __attribute__ ((__vector_size__ (64)));
    178 
    179 // CHECK: define <2 x float> @f1_0(<2 x float> %{{.*}})
    180 T_float32x2 f1_0(T_float32x2 a0) { return a0; }
    181 // CHECK: define <4 x float> @f1_1(<4 x float> %{{.*}})
    182 T_float32x4 f1_1(T_float32x4 a0) { return a0; }
    183 // Vector with length bigger than 16-byte is illegal and is passed indirectly.
    184 // CHECK: define void @f1_2(<8 x float>* noalias sret  %{{.*}}, <8 x float>*)
    185 T_float32x8 f1_2(T_float32x8 a0) { return a0; }
    186 // CHECK: define void @f1_3(<16 x float>* noalias sret %{{.*}}, <16 x float>*)
    187 T_float32x16 f1_3(T_float32x16 a0) { return a0; }
    188 
    189 // Testing alignment with aggregates: HFA, aggregates with size <= 16 bytes and
    190 // aggregates with size > 16 bytes.
    191 struct s35
    192 {
    193    float v[4]; //Testing HFA.
    194 } __attribute__((aligned(16)));
    195 typedef struct s35 s35_with_align;
    196 
    197 typedef __attribute__((neon_vector_type(4))) float float32x4_t;
    198 float32x4_t f35(int i, s35_with_align s1, s35_with_align s2) {
    199 // CHECK: define <4 x float> @f35(i32 %i, [4 x float] %s1.coerce, [4 x float] %s2.coerce)
    200 // CHECK: %s1 = alloca %struct.s35, align 16
    201 // CHECK: %s2 = alloca %struct.s35, align 16
    202 // CHECK: %[[a:.*]] = bitcast %struct.s35* %s1 to <4 x float>*
    203 // CHECK: load <4 x float>, <4 x float>* %[[a]], align 16
    204 // CHECK: %[[b:.*]] = bitcast %struct.s35* %s2 to <4 x float>*
    205 // CHECK: load <4 x float>, <4 x float>* %[[b]], align 16
    206   float32x4_t v = vaddq_f32(*(float32x4_t *)&s1,
    207                             *(float32x4_t *)&s2);
    208   return v;
    209 }
    210 
    211 struct s36
    212 {
    213    int v[4]; //Testing 16-byte aggregate.
    214 } __attribute__((aligned(16)));
    215 typedef struct s36 s36_with_align;
    216 
    217 typedef __attribute__((neon_vector_type(4))) int int32x4_t;
    218 int32x4_t f36(int i, s36_with_align s1, s36_with_align s2) {
    219 // CHECK: define <4 x i32> @f36(i32 %i, i128 %s1.coerce, i128 %s2.coerce)
    220 // CHECK: %s1 = alloca %struct.s36, align 16
    221 // CHECK: %s2 = alloca %struct.s36, align 16
    222 // CHECK: store i128 %s1.coerce, i128* %{{.*}}, align 16
    223 // CHECK: store i128 %s2.coerce, i128* %{{.*}}, align 16
    224 // CHECK: %[[a:.*]] = bitcast %struct.s36* %s1 to <4 x i32>*
    225 // CHECK: load <4 x i32>, <4 x i32>* %[[a]], align 16
    226 // CHECK: %[[b:.*]] = bitcast %struct.s36* %s2 to <4 x i32>*
    227 // CHECK: load <4 x i32>, <4 x i32>* %[[b]], align 16
    228   int32x4_t v = vaddq_s32(*(int32x4_t *)&s1,
    229                           *(int32x4_t *)&s2);
    230   return v;
    231 }
    232 
    233 struct s37
    234 {
    235    int v[18]; //Testing large aggregate.
    236 } __attribute__((aligned(16)));
    237 typedef struct s37 s37_with_align;
    238 
    239 int32x4_t f37(int i, s37_with_align s1, s37_with_align s2) {
    240 // CHECK: define <4 x i32> @f37(i32 %i, %struct.s37* %s1, %struct.s37* %s2)
    241 // CHECK: %[[a:.*]] = bitcast %struct.s37* %s1 to <4 x i32>*
    242 // CHECK: load <4 x i32>, <4 x i32>* %[[a]], align 16
    243 // CHECK: %[[b:.*]] = bitcast %struct.s37* %s2 to <4 x i32>*
    244 // CHECK: load <4 x i32>, <4 x i32>* %[[b]], align 16
    245   int32x4_t v = vaddq_s32(*(int32x4_t *)&s1,
    246                           *(int32x4_t *)&s2);
    247   return v;
    248 }
    249 s37_with_align g37;
    250 int32x4_t caller37() {
    251 // CHECK: caller37
    252 // CHECK: %[[a:.*]] = alloca %struct.s37, align 16
    253 // CHECK: %[[b:.*]] = alloca %struct.s37, align 16
    254 // CHECK: call void @llvm.memcpy
    255 // CHECK: call void @llvm.memcpy
    256 // CHECK: call <4 x i32> @f37(i32 3, %struct.s37* %[[a]], %struct.s37* %[[b]])
    257   return f37(3, g37, g37);
    258 }
    259 
    260 // rdar://problem/12648441
    261 // Test passing structs with size < 8, < 16 and > 16
    262 // with alignment of 16 and without
    263 
    264 // structs with size <= 8 bytes, without alignment attribute
    265 // passed as i64 regardless of the align attribute
    266 struct s38
    267 {
    268   int i;
    269   short s;
    270 };
    271 typedef struct s38 s38_no_align;
    272 // passing structs in registers
    273 __attribute__ ((noinline))
    274 int f38(int i, s38_no_align s1, s38_no_align s2) {
    275 // CHECK: define i32 @f38(i32 %i, i64 %s1.coerce, i64 %s2.coerce)
    276 // CHECK: %s1 = alloca %struct.s38, align 4
    277 // CHECK: %s2 = alloca %struct.s38, align 4
    278 // CHECK: store i64 %s1.coerce, i64* %{{.*}}, align 4
    279 // CHECK: store i64 %s2.coerce, i64* %{{.*}}, align 4
    280 // CHECK: getelementptr inbounds %struct.s38, %struct.s38* %s1, i32 0, i32 0
    281 // CHECK: getelementptr inbounds %struct.s38, %struct.s38* %s2, i32 0, i32 0
    282 // CHECK: getelementptr inbounds %struct.s38, %struct.s38* %s1, i32 0, i32 1
    283 // CHECK: getelementptr inbounds %struct.s38, %struct.s38* %s2, i32 0, i32 1
    284   return s1.i + s2.i + i + s1.s + s2.s;
    285 }
    286 s38_no_align g38;
    287 s38_no_align g38_2;
    288 int caller38() {
    289 // CHECK: define i32 @caller38()
    290 // CHECK: %[[a:.*]] = load i64, i64* bitcast (%struct.s38* @g38 to i64*), align 4
    291 // CHECK: %[[b:.*]] = load i64, i64* bitcast (%struct.s38* @g38_2 to i64*), align 4
    292 // CHECK: call i32 @f38(i32 3, i64 %[[a]], i64 %[[b]])
    293   return f38(3, g38, g38_2);
    294 }
    295 // passing structs on stack
    296 __attribute__ ((noinline))
    297 int f38_stack(int i, int i2, int i3, int i4, int i5, int i6, int i7, int i8,
    298               int i9, s38_no_align s1, s38_no_align s2) {
    299 // CHECK: define i32 @f38_stack(i32 %i, i32 %i2, i32 %i3, i32 %i4, i32 %i5, i32 %i6, i32 %i7, i32 %i8, i32 %i9, i64 %s1.coerce, i64 %s2.coerce)
    300 // CHECK: %s1 = alloca %struct.s38, align 4
    301 // CHECK: %s2 = alloca %struct.s38, align 4
    302 // CHECK: store i64 %s1.coerce, i64* %{{.*}}, align 4
    303 // CHECK: store i64 %s2.coerce, i64* %{{.*}}, align 4
    304 // CHECK: getelementptr inbounds %struct.s38, %struct.s38* %s1, i32 0, i32 0
    305 // CHECK: getelementptr inbounds %struct.s38, %struct.s38* %s2, i32 0, i32 0
    306 // CHECK: getelementptr inbounds %struct.s38, %struct.s38* %s1, i32 0, i32 1
    307 // CHECK: getelementptr inbounds %struct.s38, %struct.s38* %s2, i32 0, i32 1
    308   return s1.i + s2.i + i + i2 + i3 + i4 + i5 + i6 + i7 + i8 + i9 + s1.s + s2.s;
    309 }
    310 int caller38_stack() {
    311 // CHECK: define i32 @caller38_stack()
    312 // CHECK: %[[a:.*]] = load i64, i64* bitcast (%struct.s38* @g38 to i64*), align 4
    313 // CHECK: %[[b:.*]] = load i64, i64* bitcast (%struct.s38* @g38_2 to i64*), align 4
    314 // CHECK: call i32 @f38_stack(i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i64 %[[a]], i64 %[[b]])
    315   return f38_stack(1, 2, 3, 4, 5, 6, 7, 8, 9, g38, g38_2);
    316 }
    317 
    318 // structs with size <= 8 bytes, with alignment attribute
    319 struct s39
    320 {
    321   int i;
    322   short s;
    323 } __attribute__((aligned(16)));
    324 typedef struct s39 s39_with_align;
    325 // passing aligned structs in registers
    326 __attribute__ ((noinline))
    327 int f39(int i, s39_with_align s1, s39_with_align s2) {
    328 // CHECK: define i32 @f39(i32 %i, i128 %s1.coerce, i128 %s2.coerce)
    329 // CHECK: %s1 = alloca %struct.s39, align 16
    330 // CHECK: %s2 = alloca %struct.s39, align 16
    331 // CHECK: store i128 %s1.coerce, i128* %{{.*}}, align 16
    332 // CHECK: store i128 %s2.coerce, i128* %{{.*}}, align 16
    333 // CHECK: getelementptr inbounds %struct.s39, %struct.s39* %s1, i32 0, i32 0
    334 // CHECK: getelementptr inbounds %struct.s39, %struct.s39* %s2, i32 0, i32 0
    335 // CHECK: getelementptr inbounds %struct.s39, %struct.s39* %s1, i32 0, i32 1
    336 // CHECK: getelementptr inbounds %struct.s39, %struct.s39* %s2, i32 0, i32 1
    337   return s1.i + s2.i + i + s1.s + s2.s;
    338 }
    339 s39_with_align g39;
    340 s39_with_align g39_2;
    341 int caller39() {
    342 // CHECK: define i32 @caller39()
    343 // CHECK: %[[a:.*]] = load i128, i128* bitcast (%struct.s39* @g39 to i128*), align 16
    344 // CHECK: %[[b:.*]] = load i128, i128* bitcast (%struct.s39* @g39_2 to i128*), align 16
    345 // CHECK: call i32 @f39(i32 3, i128 %[[a]], i128 %[[b]])
    346   return f39(3, g39, g39_2);
    347 }
    348 // passing aligned structs on stack
    349 __attribute__ ((noinline))
    350 int f39_stack(int i, int i2, int i3, int i4, int i5, int i6, int i7, int i8,
    351               int i9, s39_with_align s1, s39_with_align s2) {
    352 // CHECK: define i32 @f39_stack(i32 %i, i32 %i2, i32 %i3, i32 %i4, i32 %i5, i32 %i6, i32 %i7, i32 %i8, i32 %i9, i128 %s1.coerce, i128 %s2.coerce)
    353 // CHECK: %s1 = alloca %struct.s39, align 16
    354 // CHECK: %s2 = alloca %struct.s39, align 16
    355 // CHECK: store i128 %s1.coerce, i128* %{{.*}}, align 16
    356 // CHECK: store i128 %s2.coerce, i128* %{{.*}}, align 16
    357 // CHECK: getelementptr inbounds %struct.s39, %struct.s39* %s1, i32 0, i32 0
    358 // CHECK: getelementptr inbounds %struct.s39, %struct.s39* %s2, i32 0, i32 0
    359 // CHECK: getelementptr inbounds %struct.s39, %struct.s39* %s1, i32 0, i32 1
    360 // CHECK: getelementptr inbounds %struct.s39, %struct.s39* %s2, i32 0, i32 1
    361   return s1.i + s2.i + i + i2 + i3 + i4 + i5 + i6 + i7 + i8 + i9 + s1.s + s2.s;
    362 }
    363 int caller39_stack() {
    364 // CHECK: define i32 @caller39_stack()
    365 // CHECK: %[[a:.*]] = load i128, i128* bitcast (%struct.s39* @g39 to i128*), align 16
    366 // CHECK: %[[b:.*]] = load i128, i128* bitcast (%struct.s39* @g39_2 to i128*), align 16
    367 // CHECK: call i32 @f39_stack(i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i128 %[[a]], i128 %[[b]])
    368   return f39_stack(1, 2, 3, 4, 5, 6, 7, 8, 9, g39, g39_2);
    369 }
    370 
    371 // structs with size <= 16 bytes, without alignment attribute
    372 struct s40
    373 {
    374   int i;
    375   short s;
    376   int i2;
    377   short s2;
    378 };
    379 typedef struct s40 s40_no_align;
    380 // passing structs in registers
    381 __attribute__ ((noinline))
    382 int f40(int i, s40_no_align s1, s40_no_align s2) {
    383 // CHECK: define i32 @f40(i32 %i, [2 x i64] %s1.coerce, [2 x i64] %s2.coerce)
    384 // CHECK: %s1 = alloca %struct.s40, align 4
    385 // CHECK: %s2 = alloca %struct.s40, align 4
    386 // CHECK: store [2 x i64] %s1.coerce, [2 x i64]* %{{.*}}, align 4
    387 // CHECK: store [2 x i64] %s2.coerce, [2 x i64]* %{{.*}}, align 4
    388 // CHECK: getelementptr inbounds %struct.s40, %struct.s40* %s1, i32 0, i32 0
    389 // CHECK: getelementptr inbounds %struct.s40, %struct.s40* %s2, i32 0, i32 0
    390 // CHECK: getelementptr inbounds %struct.s40, %struct.s40* %s1, i32 0, i32 1
    391 // CHECK: getelementptr inbounds %struct.s40, %struct.s40* %s2, i32 0, i32 1
    392   return s1.i + s2.i + i + s1.s + s2.s;
    393 }
    394 s40_no_align g40;
    395 s40_no_align g40_2;
    396 int caller40() {
    397 // CHECK: define i32 @caller40()
    398 // CHECK: %[[a:.*]] = load [2 x i64], [2 x i64]* bitcast (%struct.s40* @g40 to [2 x i64]*), align 4
    399 // CHECK: %[[b:.*]] = load [2 x i64], [2 x i64]* bitcast (%struct.s40* @g40_2 to [2 x i64]*), align 4
    400 // CHECK: call i32 @f40(i32 3, [2 x i64] %[[a]], [2 x i64] %[[b]])
    401   return f40(3, g40, g40_2);
    402 }
    403 // passing structs on stack
    404 __attribute__ ((noinline))
    405 int f40_stack(int i, int i2, int i3, int i4, int i5, int i6, int i7, int i8,
    406               int i9, s40_no_align s1, s40_no_align s2) {
    407 // CHECK: define i32 @f40_stack(i32 %i, i32 %i2, i32 %i3, i32 %i4, i32 %i5, i32 %i6, i32 %i7, i32 %i8, i32 %i9, [2 x i64] %s1.coerce, [2 x i64] %s2.coerce)
    408 // CHECK: %s1 = alloca %struct.s40, align 4
    409 // CHECK: %s2 = alloca %struct.s40, align 4
    410 // CHECK: store [2 x i64] %s1.coerce, [2 x i64]* %{{.*}}, align 4
    411 // CHECK: store [2 x i64] %s2.coerce, [2 x i64]* %{{.*}}, align 4
    412 // CHECK: getelementptr inbounds %struct.s40, %struct.s40* %s1, i32 0, i32 0
    413 // CHECK: getelementptr inbounds %struct.s40, %struct.s40* %s2, i32 0, i32 0
    414 // CHECK: getelementptr inbounds %struct.s40, %struct.s40* %s1, i32 0, i32 1
    415 // CHECK: getelementptr inbounds %struct.s40, %struct.s40* %s2, i32 0, i32 1
    416   return s1.i + s2.i + i + i2 + i3 + i4 + i5 + i6 + i7 + i8 + i9 + s1.s + s2.s;
    417 }
    418 int caller40_stack() {
    419 // CHECK: define i32 @caller40_stack()
    420 // CHECK: %[[a:.*]] = load [2 x i64], [2 x i64]* bitcast (%struct.s40* @g40 to [2 x i64]*), align 4
    421 // CHECK: %[[b:.*]] = load [2 x i64], [2 x i64]* bitcast (%struct.s40* @g40_2 to [2 x i64]*), align 4
    422 // CHECK: call i32 @f40_stack(i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, [2 x i64] %[[a]], [2 x i64] %[[b]])
    423   return f40_stack(1, 2, 3, 4, 5, 6, 7, 8, 9, g40, g40_2);
    424 }
    425 
    426 // structs with size <= 16 bytes, with alignment attribute
    427 struct s41
    428 {
    429   int i;
    430   short s;
    431   int i2;
    432   short s2;
    433 } __attribute__((aligned(16)));
    434 typedef struct s41 s41_with_align;
    435 // passing aligned structs in registers
    436 __attribute__ ((noinline))
    437 int f41(int i, s41_with_align s1, s41_with_align s2) {
    438 // CHECK: define i32 @f41(i32 %i, i128 %s1.coerce, i128 %s2.coerce)
    439 // CHECK: %s1 = alloca %struct.s41, align 16
    440 // CHECK: %s2 = alloca %struct.s41, align 16
    441 // CHECK: store i128 %s1.coerce, i128* %{{.*}}, align 16
    442 // CHECK: store i128 %s2.coerce, i128* %{{.*}}, align 16
    443 // CHECK: getelementptr inbounds %struct.s41, %struct.s41* %s1, i32 0, i32 0
    444 // CHECK: getelementptr inbounds %struct.s41, %struct.s41* %s2, i32 0, i32 0
    445 // CHECK: getelementptr inbounds %struct.s41, %struct.s41* %s1, i32 0, i32 1
    446 // CHECK: getelementptr inbounds %struct.s41, %struct.s41* %s2, i32 0, i32 1
    447   return s1.i + s2.i + i + s1.s + s2.s;
    448 }
    449 s41_with_align g41;
    450 s41_with_align g41_2;
    451 int caller41() {
    452 // CHECK: define i32 @caller41()
    453 // CHECK: %[[a:.*]] = load i128, i128* bitcast (%struct.s41* @g41 to i128*), align 16
    454 // CHECK: %[[b:.*]] = load i128, i128* bitcast (%struct.s41* @g41_2 to i128*), align 16
    455 // CHECK: call i32 @f41(i32 3, i128 %[[a]], i128 %[[b]])
    456   return f41(3, g41, g41_2);
    457 }
    458 // passing aligned structs on stack
    459 __attribute__ ((noinline))
    460 int f41_stack(int i, int i2, int i3, int i4, int i5, int i6, int i7, int i8,
    461               int i9, s41_with_align s1, s41_with_align s2) {
    462 // CHECK: define i32 @f41_stack(i32 %i, i32 %i2, i32 %i3, i32 %i4, i32 %i5, i32 %i6, i32 %i7, i32 %i8, i32 %i9, i128 %s1.coerce, i128 %s2.coerce)
    463 // CHECK: %s1 = alloca %struct.s41, align 16
    464 // CHECK: %s2 = alloca %struct.s41, align 16
    465 // CHECK: store i128 %s1.coerce, i128* %{{.*}}, align 16
    466 // CHECK: store i128 %s2.coerce, i128* %{{.*}}, align 16
    467 // CHECK: getelementptr inbounds %struct.s41, %struct.s41* %s1, i32 0, i32 0
    468 // CHECK: getelementptr inbounds %struct.s41, %struct.s41* %s2, i32 0, i32 0
    469 // CHECK: getelementptr inbounds %struct.s41, %struct.s41* %s1, i32 0, i32 1
    470 // CHECK: getelementptr inbounds %struct.s41, %struct.s41* %s2, i32 0, i32 1
    471   return s1.i + s2.i + i + i2 + i3 + i4 + i5 + i6 + i7 + i8 + i9 + s1.s + s2.s;
    472 }
    473 int caller41_stack() {
    474 // CHECK: define i32 @caller41_stack()
    475 // CHECK: %[[a:.*]] = load i128, i128* bitcast (%struct.s41* @g41 to i128*), align 16
    476 // CHECK: %[[b:.*]] = load i128, i128* bitcast (%struct.s41* @g41_2 to i128*), align 16
    477 // CHECK: call i32 @f41_stack(i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i128 %[[a]], i128 %[[b]])
    478   return f41_stack(1, 2, 3, 4, 5, 6, 7, 8, 9, g41, g41_2);
    479 }
    480 
    481 // structs with size > 16 bytes, without alignment attribute
    482 struct s42
    483 {
    484   int i;
    485   short s;
    486   int i2;
    487   short s2;
    488   int i3;
    489   short s3;
    490 };
    491 typedef struct s42 s42_no_align;
    492 // passing structs in registers
    493 __attribute__ ((noinline))
    494 int f42(int i, s42_no_align s1, s42_no_align s2) {
    495 // CHECK: define i32 @f42(i32 %i, %struct.s42* %s1, %struct.s42* %s2)
    496 // CHECK: getelementptr inbounds %struct.s42, %struct.s42* %s1, i32 0, i32 0
    497 // CHECK: getelementptr inbounds %struct.s42, %struct.s42* %s2, i32 0, i32 0
    498 // CHECK: getelementptr inbounds %struct.s42, %struct.s42* %s1, i32 0, i32 1
    499 // CHECK: getelementptr inbounds %struct.s42, %struct.s42* %s2, i32 0, i32 1
    500   return s1.i + s2.i + i + s1.s + s2.s;
    501 }
    502 s42_no_align g42;
    503 s42_no_align g42_2;
    504 int caller42() {
    505 // CHECK: define i32 @caller42()
    506 // CHECK: %[[a:.*]] = alloca %struct.s42, align 4
    507 // CHECK: %[[b:.*]] = alloca %struct.s42, align 4
    508 // CHECK: %[[c:.*]] = bitcast %struct.s42* %[[a]] to i8*
    509 // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
    510 // CHECK: %[[d:.*]] = bitcast %struct.s42* %[[b]] to i8*
    511 // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
    512 // CHECK: call i32 @f42(i32 3, %struct.s42* %[[a]], %struct.s42* %[[b]])
    513   return f42(3, g42, g42_2);
    514 }
    515 // passing structs on stack
    516 __attribute__ ((noinline))
    517 int f42_stack(int i, int i2, int i3, int i4, int i5, int i6, int i7, int i8,
    518               int i9, s42_no_align s1, s42_no_align s2) {
    519 // CHECK: define i32 @f42_stack(i32 %i, i32 %i2, i32 %i3, i32 %i4, i32 %i5, i32 %i6, i32 %i7, i32 %i8, i32 %i9, %struct.s42* %s1, %struct.s42* %s2)
    520 // CHECK: getelementptr inbounds %struct.s42, %struct.s42* %s1, i32 0, i32 0
    521 // CHECK: getelementptr inbounds %struct.s42, %struct.s42* %s2, i32 0, i32 0
    522 // CHECK: getelementptr inbounds %struct.s42, %struct.s42* %s1, i32 0, i32 1
    523 // CHECK: getelementptr inbounds %struct.s42, %struct.s42* %s2, i32 0, i32 1
    524   return s1.i + s2.i + i + i2 + i3 + i4 + i5 + i6 + i7 + i8 + i9 + s1.s + s2.s;
    525 }
    526 int caller42_stack() {
    527 // CHECK: define i32 @caller42_stack()
    528 // CHECK: %[[a:.*]] = alloca %struct.s42, align 4
    529 // CHECK: %[[b:.*]] = alloca %struct.s42, align 4
    530 // CHECK: %[[c:.*]] = bitcast %struct.s42* %[[a]] to i8*
    531 // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
    532 // CHECK: %[[d:.*]] = bitcast %struct.s42* %[[b]] to i8*
    533 // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
    534 // CHECK: call i32 @f42_stack(i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, %struct.s42* %[[a]], %struct.s42* %[[b]])
    535   return f42_stack(1, 2, 3, 4, 5, 6, 7, 8, 9, g42, g42_2);
    536 }
    537 
    538 // structs with size > 16 bytes, with alignment attribute
    539 struct s43
    540 {
    541   int i;
    542   short s;
    543   int i2;
    544   short s2;
    545   int i3;
    546   short s3;
    547 } __attribute__((aligned(16)));
    548 typedef struct s43 s43_with_align;
    549 // passing aligned structs in registers
    550 __attribute__ ((noinline))
    551 int f43(int i, s43_with_align s1, s43_with_align s2) {
    552 // CHECK: define i32 @f43(i32 %i, %struct.s43* %s1, %struct.s43* %s2)
    553 // CHECK: getelementptr inbounds %struct.s43, %struct.s43* %s1, i32 0, i32 0
    554 // CHECK: getelementptr inbounds %struct.s43, %struct.s43* %s2, i32 0, i32 0
    555 // CHECK: getelementptr inbounds %struct.s43, %struct.s43* %s1, i32 0, i32 1
    556 // CHECK: getelementptr inbounds %struct.s43, %struct.s43* %s2, i32 0, i32 1
    557   return s1.i + s2.i + i + s1.s + s2.s;
    558 }
    559 s43_with_align g43;
    560 s43_with_align g43_2;
    561 int caller43() {
    562 // CHECK: define i32 @caller43()
    563 // CHECK: %[[a:.*]] = alloca %struct.s43, align 16
    564 // CHECK: %[[b:.*]] = alloca %struct.s43, align 16
    565 // CHECK: %[[c:.*]] = bitcast %struct.s43* %[[a]] to i8*
    566 // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
    567 // CHECK: %[[d:.*]] = bitcast %struct.s43* %[[b]] to i8*
    568 // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
    569 // CHECK: call i32 @f43(i32 3, %struct.s43* %[[a]], %struct.s43* %[[b]])
    570   return f43(3, g43, g43_2);
    571 }
    572 // passing aligned structs on stack
    573 __attribute__ ((noinline))
    574 int f43_stack(int i, int i2, int i3, int i4, int i5, int i6, int i7, int i8,
    575               int i9, s43_with_align s1, s43_with_align s2) {
    576 // CHECK: define i32 @f43_stack(i32 %i, i32 %i2, i32 %i3, i32 %i4, i32 %i5, i32 %i6, i32 %i7, i32 %i8, i32 %i9, %struct.s43* %s1, %struct.s43* %s2)
    577 // CHECK: getelementptr inbounds %struct.s43, %struct.s43* %s1, i32 0, i32 0
    578 // CHECK: getelementptr inbounds %struct.s43, %struct.s43* %s2, i32 0, i32 0
    579 // CHECK: getelementptr inbounds %struct.s43, %struct.s43* %s1, i32 0, i32 1
    580 // CHECK: getelementptr inbounds %struct.s43, %struct.s43* %s2, i32 0, i32 1
    581   return s1.i + s2.i + i + i2 + i3 + i4 + i5 + i6 + i7 + i8 + i9 + s1.s + s2.s;
    582 }
    583 int caller43_stack() {
    584 // CHECK: define i32 @caller43_stack()
    585 // CHECK: %[[a:.*]] = alloca %struct.s43, align 16
    586 // CHECK: %[[b:.*]] = alloca %struct.s43, align 16
    587 // CHECK: %[[c:.*]] = bitcast %struct.s43* %[[a]] to i8*
    588 // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
    589 // CHECK: %[[d:.*]] = bitcast %struct.s43* %[[b]] to i8*
    590 // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
    591 // CHECK: call i32 @f43_stack(i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, %struct.s43* %[[a]], %struct.s43* %[[b]])
    592   return f43_stack(1, 2, 3, 4, 5, 6, 7, 8, 9, g43, g43_2);
    593 }
    594 
    595 // rdar://13668927
    596 // We should not split argument s1 between registers and stack.
    597 __attribute__ ((noinline))
    598 int f40_split(int i, int i2, int i3, int i4, int i5, int i6, int i7,
    599               s40_no_align s1, s40_no_align s2) {
    600 // CHECK: define i32 @f40_split(i32 %i, i32 %i2, i32 %i3, i32 %i4, i32 %i5, i32 %i6, i32 %i7, [2 x i64] %s1.coerce, [2 x i64] %s2.coerce)
    601   return s1.i + s2.i + i + i2 + i3 + i4 + i5 + i6 + i7 + s1.s + s2.s;
    602 }
    603 int caller40_split() {
    604 // CHECK: define i32 @caller40_split()
    605 // CHECK: call i32 @f40_split(i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, [2 x i64] %{{.*}} [2 x i64] %{{.*}})
    606   return f40_split(1, 2, 3, 4, 5, 6, 7, g40, g40_2);
    607 }
    608 
    609 __attribute__ ((noinline))
    610 int f41_split(int i, int i2, int i3, int i4, int i5, int i6, int i7,
    611               s41_with_align s1, s41_with_align s2) {
    612 // CHECK: define i32 @f41_split(i32 %i, i32 %i2, i32 %i3, i32 %i4, i32 %i5, i32 %i6, i32 %i7, i128 %s1.coerce, i128 %s2.coerce)
    613   return s1.i + s2.i + i + i2 + i3 + i4 + i5 + i6 + i7 + s1.s + s2.s;
    614 }
    615 int caller41_split() {
    616 // CHECK: define i32 @caller41_split()
    617 // CHECK: call i32 @f41_split(i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i128 %{{.*}}, i128 %{{.*}})
    618   return f41_split(1, 2, 3, 4, 5, 6, 7, g41, g41_2);
    619 }
    620 
    621 // Handle homogeneous aggregates properly in variadic functions.
    622 struct HFA {
    623   float a, b, c, d;
    624 };
    625 
    626 float test_hfa(int n, ...) {
    627 // CHECK-LABEL: define float @test_hfa(i32 %n, ...)
    628 // CHECK: [[THELIST:%.*]] = alloca i8*
    629 // CHECK: [[CURLIST:%.*]] = load i8*, i8** [[THELIST]]
    630 
    631   // HFA is not indirect, so occupies its full 16 bytes on the stack.
    632 // CHECK: [[NEXTLIST:%.*]] = getelementptr inbounds i8, i8* [[CURLIST]], i64 16
    633 // CHECK: store i8* [[NEXTLIST]], i8** [[THELIST]]
    634 
    635 // CHECK: bitcast i8* [[CURLIST]] to %struct.HFA*
    636   __builtin_va_list thelist;
    637   __builtin_va_start(thelist, n);
    638   struct HFA h = __builtin_va_arg(thelist, struct HFA);
    639   return h.d;
    640 }
    641 
    642 float test_hfa_call(struct HFA *a) {
    643 // CHECK-LABEL: define float @test_hfa_call(%struct.HFA* %a)
    644 // CHECK: call float (i32, ...) @test_hfa(i32 1, [4 x float] {{.*}})
    645   test_hfa(1, *a);
    646 }
    647 
    648 struct TooBigHFA {
    649   float a, b, c, d, e;
    650 };
    651 
    652 float test_toobig_hfa(int n, ...) {
    653 // CHECK-LABEL: define float @test_toobig_hfa(i32 %n, ...)
    654 // CHECK: [[THELIST:%.*]] = alloca i8*
    655 // CHECK: [[CURLIST:%.*]] = load i8*, i8** [[THELIST]]
    656 
    657   // TooBigHFA is not actually an HFA, so gets passed indirectly. Only 8 bytes
    658   // of stack consumed.
    659 // CHECK: [[NEXTLIST:%.*]] = getelementptr inbounds i8, i8* [[CURLIST]], i64 8
    660 // CHECK: store i8* [[NEXTLIST]], i8** [[THELIST]]
    661 
    662 // CHECK: [[HFAPTRPTR:%.*]] = bitcast i8* [[CURLIST]] to %struct.TooBigHFA**
    663 // CHECK: [[HFAPTR:%.*]] = load %struct.TooBigHFA*, %struct.TooBigHFA** [[HFAPTRPTR]]
    664   __builtin_va_list thelist;
    665   __builtin_va_start(thelist, n);
    666   struct TooBigHFA h = __builtin_va_arg(thelist, struct TooBigHFA);
    667   return h.d;
    668 }
    669 
    670 struct HVA {
    671   int32x4_t a, b;
    672 };
    673 
    674 int32x4_t test_hva(int n, ...) {
    675 // CHECK-LABEL: define <4 x i32> @test_hva(i32 %n, ...)
    676 // CHECK: [[THELIST:%.*]] = alloca i8*
    677 // CHECK: [[CURLIST:%.*]] = load i8*, i8** [[THELIST]]
    678 
    679   // HVA is not indirect, so occupies its full 16 bytes on the stack. but it
    680   // must be properly aligned.
    681 // CHECK: [[ALIGN0:%.*]] = ptrtoint i8* [[CURLIST]] to i64
    682 // CHECK: [[ALIGN1:%.*]] = add i64 [[ALIGN0]], 15
    683 // CHECK: [[ALIGN2:%.*]] = and i64 [[ALIGN1]], -16
    684 // CHECK: [[ALIGNED_LIST:%.*]] = inttoptr i64 [[ALIGN2]] to i8*
    685 
    686 // CHECK: [[NEXTLIST:%.*]] = getelementptr inbounds i8, i8* [[ALIGNED_LIST]], i64 32
    687 // CHECK: store i8* [[NEXTLIST]], i8** [[THELIST]]
    688 
    689 // CHECK: bitcast i8* [[ALIGNED_LIST]] to %struct.HVA*
    690   __builtin_va_list thelist;
    691   __builtin_va_start(thelist, n);
    692   struct HVA h = __builtin_va_arg(thelist, struct HVA);
    693   return h.b;
    694 }
    695 
    696 struct TooBigHVA {
    697   int32x4_t a, b, c, d, e;
    698 };
    699 
    700 int32x4_t test_toobig_hva(int n, ...) {
    701 // CHECK-LABEL: define <4 x i32> @test_toobig_hva(i32 %n, ...)
    702 // CHECK: [[THELIST:%.*]] = alloca i8*
    703 // CHECK: [[CURLIST:%.*]] = load i8*, i8** [[THELIST]]
    704 
    705   // TooBigHVA is not actually an HVA, so gets passed indirectly. Only 8 bytes
    706   // of stack consumed.
    707 // CHECK: [[NEXTLIST:%.*]] = getelementptr inbounds i8, i8* [[CURLIST]], i64 8
    708 // CHECK: store i8* [[NEXTLIST]], i8** [[THELIST]]
    709 
    710 // CHECK: [[HVAPTRPTR:%.*]] = bitcast i8* [[CURLIST]] to %struct.TooBigHVA**
    711 // CHECK: [[HVAPTR:%.*]] = load %struct.TooBigHVA*, %struct.TooBigHVA** [[HVAPTRPTR]]
    712   __builtin_va_list thelist;
    713   __builtin_va_start(thelist, n);
    714   struct TooBigHVA h = __builtin_va_arg(thelist, struct TooBigHVA);
    715   return h.d;
    716 }
    717