brintos

brintos / llvm-project-archived public Read only

0
0
Text · 48.7 KiB · f002c54 Raw
1361 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -verify-machineinstrs < %s -mtriple=armv7-apple-ios | FileCheck --check-prefix=CHECK-APPLE %s3; RUN: llc -verify-machineinstrs -O0 < %s -mtriple=armv7-apple-ios | FileCheck --check-prefix=CHECK-O0 %s4; RUN: llc -verify-machineinstrs < %s -mtriple=armv7-linux-androideabi | FileCheck --check-prefix=CHECK-ANDROID %s5 6declare ptr @malloc(i64)7declare void @free(ptr)8%swift_error = type { i64, i8 }9%struct.S = type { i32, i32, i32, i32, i32, i32 }10 11; This tests the basic usage of a swifterror parameter. "foo" is the function12; that takes a swifterror parameter and "caller" is the caller of "foo".13define float @foo(ptr swifterror %error_ptr_ref) {14; CHECK-APPLE-LABEL: foo:15; CHECK-APPLE:       @ %bb.0: @ %entry16; CHECK-APPLE-NEXT:    push {lr}17; CHECK-APPLE-NEXT:    mov r0, #1618; CHECK-APPLE-NEXT:    mov r1, #019; CHECK-APPLE-NEXT:    bl _malloc20; CHECK-APPLE-NEXT:    mov r8, r021; CHECK-APPLE-NEXT:    mov r0, #122; CHECK-APPLE-NEXT:    strb r0, [r8, #8]23; CHECK-APPLE-NEXT:    mov r0, #106535321624; CHECK-APPLE-NEXT:    pop {lr}25; CHECK-APPLE-NEXT:    bx lr26;27; CHECK-O0-LABEL: foo:28; CHECK-O0:       @ %bb.0: @ %entry29; CHECK-O0-NEXT:    push {r7, lr}30; CHECK-O0-NEXT:    mov r7, sp31; CHECK-O0-NEXT:    mov r0, #1632; CHECK-O0-NEXT:    mov r1, #033; CHECK-O0-NEXT:    bl _malloc34; CHECK-O0-NEXT:    mov r1, r035; CHECK-O0-NEXT:    mov r8, r136; CHECK-O0-NEXT:    mov r0, #137; CHECK-O0-NEXT:    strb r0, [r1, #8]38; CHECK-O0-NEXT:    mov r0, #106535321639; CHECK-O0-NEXT:    pop {r7, pc}40;41; CHECK-ANDROID-LABEL: foo:42; CHECK-ANDROID:       @ %bb.0: @ %entry43; CHECK-ANDROID-NEXT:    .save {r11, lr}44; CHECK-ANDROID-NEXT:    push {r11, lr}45; CHECK-ANDROID-NEXT:    mov r0, #1646; CHECK-ANDROID-NEXT:    mov r1, #047; CHECK-ANDROID-NEXT:    bl malloc48; CHECK-ANDROID-NEXT:    mov r8, r049; CHECK-ANDROID-NEXT:    mov r0, #150; CHECK-ANDROID-NEXT:    strb r0, [r8, #8]51; CHECK-ANDROID-NEXT:    mov r0, #106535321652; CHECK-ANDROID-NEXT:    pop {r11, pc}53 54entry:55  %call = call ptr @malloc(i64 16)56  store ptr %call, ptr %error_ptr_ref57  %tmp = getelementptr inbounds i8, ptr %call, i64 858  store i8 1, ptr %tmp59  ret float 1.060}61 62; "caller" calls "foo" that takes a swifterror parameter.63define float @caller(ptr %error_ref) {64; CHECK-APPLE-LABEL: caller:65; CHECK-APPLE:       @ %bb.0: @ %entry66; CHECK-APPLE-NEXT:    push {r4, r8, lr}67; CHECK-APPLE-NEXT:    sub sp, sp, #468; CHECK-APPLE-NEXT:    mov r8, #069; CHECK-APPLE-NEXT:    mov r4, r070; CHECK-APPLE-NEXT:    bl _foo71; CHECK-APPLE-NEXT:    mov r0, r872; CHECK-APPLE-NEXT:    cmp r8, #073; CHECK-APPLE-NEXT:    ldrbeq r1, [r0, #8]74; CHECK-APPLE-NEXT:    strbeq r1, [r4]75; CHECK-APPLE-NEXT:    bl _free76; CHECK-APPLE-NEXT:    mov r0, #106535321677; CHECK-APPLE-NEXT:    add sp, sp, #478; CHECK-APPLE-NEXT:    pop {r4, r8, pc}79;80; CHECK-O0-LABEL: caller:81; CHECK-O0:       @ %bb.0: @ %entry82; CHECK-O0-NEXT:    push	{r7, r8, lr}83; CHECK-O0-NEXT:    add	r7, sp, #484; CHECK-O0-NEXT:    sub	sp, sp, #1285; CHECK-O0-NEXT:    @ implicit-def: $r186; CHECK-O0-NEXT:    str	r0, [sp]                        @ 4-byte Spill87; CHECK-O0-NEXT:    mov	r8, #088; CHECK-O0-NEXT:    bl	_foo89; CHECK-O0-NEXT:    str	r8, [sp, #4]                    @ 4-byte Spill90; CHECK-O0-NEXT:    movw	r0, #091; CHECK-O0-NEXT:    cmp	r8, r092; CHECK-O0-NEXT:    bne	LBB1_293; CHECK-O0-NEXT:  @ %bb.1: @ %cont94; CHECK-O0-NEXT:    ldr r1, [sp] @ 4-byte Reload95; CHECK-O0-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload96; CHECK-O0-NEXT:    ldrb r0, [r0, #8]97; CHECK-O0-NEXT:    strb r0, [r1]98; CHECK-O0-NEXT:  LBB1_2: @ %handler99; CHECK-O0-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload100; CHECK-O0-NEXT:    bl _free101; CHECK-O0-NEXT:    mov r0, #1065353216102; CHECK-O0-NEXT:    sub sp, r7, #4103; CHECK-O0-NEXT:    pop	{r7, r8, pc}104;105; CHECK-ANDROID-LABEL: caller:106; CHECK-ANDROID:       @ %bb.0: @ %entry107; CHECK-ANDROID-NEXT:    .save {r4, r8, r11, lr}108; CHECK-ANDROID-NEXT:    push {r4, r8, r11, lr}109; CHECK-ANDROID-NEXT:    .pad #8110; CHECK-ANDROID-NEXT:    sub sp, sp, #8111; CHECK-ANDROID-NEXT:    mov r8, #0112; CHECK-ANDROID-NEXT:    mov r4, r0113; CHECK-ANDROID-NEXT:    bl foo114; CHECK-ANDROID-NEXT:    mov r0, r8115; CHECK-ANDROID-NEXT:    cmp r8, #0116; CHECK-ANDROID-NEXT:    ldrbeq r1, [r0, #8]117; CHECK-ANDROID-NEXT:    strbeq r1, [r4]118; CHECK-ANDROID-NEXT:    bl free119; CHECK-ANDROID-NEXT:    mov r0, #1065353216120; CHECK-ANDROID-NEXT:    add sp, sp, #8121; CHECK-ANDROID-NEXT:    pop {r4, r8, r11, pc}122; Access part of the error object and save it to error_ref123 124; spill r0125; reload r0126entry:127  %error_ptr_ref = alloca swifterror ptr128  store ptr null, ptr %error_ptr_ref129  %call = call float @foo(ptr swifterror %error_ptr_ref)130  %error_from_foo = load ptr, ptr %error_ptr_ref131  %had_error_from_foo = icmp ne ptr %error_from_foo, null132  br i1 %had_error_from_foo, label %handler, label %cont133cont:134  %v1 = getelementptr inbounds %swift_error, ptr %error_from_foo, i64 0, i32 1135  %t = load i8, ptr %v1136  store i8 %t, ptr %error_ref137  br label %handler138handler:139  call void @free(ptr %error_from_foo)140  ret float 1.0141}142 143; "caller2" is the caller of "foo", it calls "foo" inside a loop.144define float @caller2(ptr %error_ref) {145; CHECK-APPLE-LABEL: caller2:146; CHECK-APPLE:       @ %bb.0: @ %entry147; CHECK-APPLE-NEXT:    push {r4, r8, lr}148; CHECK-APPLE-NEXT:    vpush {d8}149; CHECK-APPLE-NEXT:    sub sp, sp, #4150; CHECK-APPLE-NEXT:    vmov.f32 s16, #1.000000e+00151; CHECK-APPLE-NEXT:    mov r4, r0152; CHECK-APPLE-NEXT:  LBB2_1: @ %bb_loop153; CHECK-APPLE-NEXT:    @ =>This Inner Loop Header: Depth=1154; CHECK-APPLE-NEXT:    mov r8, #0155; CHECK-APPLE-NEXT:    bl _foo156; CHECK-APPLE-NEXT:    cmp r8, #0157; CHECK-APPLE-NEXT:    bne LBB2_4158; CHECK-APPLE-NEXT:  @ %bb.2: @ %cont159; CHECK-APPLE-NEXT:    @ in Loop: Header=BB2_1 Depth=1160; CHECK-APPLE-NEXT:    vmov s0, r0161; CHECK-APPLE-NEXT:    vcmp.f32 s0, s16162; CHECK-APPLE-NEXT:    vmrs APSR_nzcv, fpscr163; CHECK-APPLE-NEXT:    ble LBB2_1164; CHECK-APPLE-NEXT:  @ %bb.3: @ %bb_end165; CHECK-APPLE-NEXT:    ldrb r0, [r8, #8]166; CHECK-APPLE-NEXT:    strb r0, [r4]167; CHECK-APPLE-NEXT:  LBB2_4: @ %handler168; CHECK-APPLE-NEXT:    mov r0, r8169; CHECK-APPLE-NEXT:    bl _free170; CHECK-APPLE-NEXT:    mov r0, #1065353216171; CHECK-APPLE-NEXT:    add sp, sp, #4172; CHECK-APPLE-NEXT:    vpop {d8}173; CHECK-APPLE-NEXT:    pop {r4, r8, pc}174;175; CHECK-O0-LABEL: caller2:176; CHECK-O0:       @ %bb.0: @ %entry177; CHECK-O0-NEXT:    push	{r7, r8, lr}178; CHECK-O0-NEXT:    add	r7, sp, #4179; CHECK-O0-NEXT:    sub	sp, sp, #16180; CHECK-O0-NEXT:    @ implicit-def: $r1181; CHECK-O0-NEXT:    str	r0, [sp, #8] @ 4-byte Spill182; CHECK-O0-NEXT:  LBB2_1: @ %bb_loop183; CHECK-O0-NEXT:    @ =>This Inner Loop Header: Depth=1184; CHECK-O0-NEXT:    mov r8, #0185; CHECK-O0-NEXT:    bl _foo186; CHECK-O0-NEXT:    vmov s0, r0187; CHECK-O0-NEXT:    vstr s0, [sp] @ 4-byte Spill188; CHECK-O0-NEXT:    str r8, [sp, #4] @ 4-byte Spill189; CHECK-O0-NEXT:    movw r0, #0190; CHECK-O0-NEXT:    cmp r8, r0191; CHECK-O0-NEXT:    bne LBB2_4192; CHECK-O0-NEXT:  @ %bb.2: @ %cont193; CHECK-O0-NEXT:    @ in Loop: Header=BB2_1 Depth=1194; CHECK-O0-NEXT:    vldr s0, [sp] @ 4-byte Reload195; CHECK-O0-NEXT:    vmov.f32 s2, #1.000000e+00196; CHECK-O0-NEXT:    vcmp.f32 s0, s2197; CHECK-O0-NEXT:    vmrs APSR_nzcv, fpscr198; CHECK-O0-NEXT:    ble LBB2_1199; CHECK-O0-NEXT:  @ %bb.3: @ %bb_end200; CHECK-O0-NEXT:    ldr r1, [sp, #8] @ 4-byte Reload201; CHECK-O0-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload202; CHECK-O0-NEXT:    ldrb r0, [r0, #8]203; CHECK-O0-NEXT:    strb r0, [r1]204; CHECK-O0-NEXT:  LBB2_4: @ %handler205; CHECK-O0-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload206; CHECK-O0-NEXT:    bl _free207; CHECK-O0-NEXT:    mov r0, #1065353216208; CHECK-O0-NEXT:    sub sp, r7, #4209; CHECK-O0-NEXT:    pop	{r7, r8, pc}210;211; CHECK-ANDROID-LABEL: caller2:212; CHECK-ANDROID:       @ %bb.0: @ %entry213; CHECK-ANDROID-NEXT:    .save {r4, r8, r11, lr}214; CHECK-ANDROID-NEXT:    push {r4, r8, r11, lr}215; CHECK-ANDROID-NEXT:    .vsave {d8}216; CHECK-ANDROID-NEXT:    vpush {d8}217; CHECK-ANDROID-NEXT:    .pad #8218; CHECK-ANDROID-NEXT:    sub sp, sp, #8219; CHECK-ANDROID-NEXT:    vmov.f32 s16, #1.000000e+00220; CHECK-ANDROID-NEXT:    mov r4, r0221; CHECK-ANDROID-NEXT:  .LBB2_1: @ %bb_loop222; CHECK-ANDROID-NEXT:    @ =>This Inner Loop Header: Depth=1223; CHECK-ANDROID-NEXT:    mov r8, #0224; CHECK-ANDROID-NEXT:    bl foo225; CHECK-ANDROID-NEXT:    cmp r8, #0226; CHECK-ANDROID-NEXT:    bne .LBB2_4227; CHECK-ANDROID-NEXT:  @ %bb.2: @ %cont228; CHECK-ANDROID-NEXT:    @ in Loop: Header=BB2_1 Depth=1229; CHECK-ANDROID-NEXT:    vmov s0, r0230; CHECK-ANDROID-NEXT:    vcmp.f32 s0, s16231; CHECK-ANDROID-NEXT:    vmrs APSR_nzcv, fpscr232; CHECK-ANDROID-NEXT:    ble .LBB2_1233; CHECK-ANDROID-NEXT:  @ %bb.3: @ %bb_end234; CHECK-ANDROID-NEXT:    ldrb r0, [r8, #8]235; CHECK-ANDROID-NEXT:    strb r0, [r4]236; CHECK-ANDROID-NEXT:  .LBB2_4: @ %handler237; CHECK-ANDROID-NEXT:    mov r0, r8238; CHECK-ANDROID-NEXT:    bl free239; CHECK-ANDROID-NEXT:    mov r0, #1065353216240; CHECK-ANDROID-NEXT:    add sp, sp, #8241; CHECK-ANDROID-NEXT:    vpop {d8}242; CHECK-ANDROID-NEXT:    pop {r4, r8, r11, pc}243; Access part of the error object and save it to error_ref244 245; spill r0246; reload r0247entry:248  %error_ptr_ref = alloca swifterror ptr249  br label %bb_loop250bb_loop:251  store ptr null, ptr %error_ptr_ref252  %call = call float @foo(ptr swifterror %error_ptr_ref)253  %error_from_foo = load ptr, ptr %error_ptr_ref254  %had_error_from_foo = icmp ne ptr %error_from_foo, null255  br i1 %had_error_from_foo, label %handler, label %cont256cont:257  %cmp = fcmp ogt float %call, 1.000000e+00258  br i1 %cmp, label %bb_end, label %bb_loop259bb_end:260  %v1 = getelementptr inbounds %swift_error, ptr %error_from_foo, i64 0, i32 1261  %t = load i8, ptr %v1262  store i8 %t, ptr %error_ref263  br label %handler264handler:265  call void @free(ptr %error_from_foo)266  ret float 1.0267}268 269; "foo_if" is a function that takes a swifterror parameter, it sets swifterror270; under a certain condition.271define float @foo_if(ptr swifterror %error_ptr_ref, i32 %cc) {272; CHECK-APPLE-LABEL: foo_if:273; CHECK-APPLE:       @ %bb.0: @ %entry274; CHECK-APPLE-NEXT:    cmp r0, #0275; CHECK-APPLE-NEXT:    vldreq s0, LCPI3_0276; CHECK-APPLE-NEXT:    vmoveq r0, s0277; CHECK-APPLE-NEXT:    bxeq lr278; CHECK-APPLE-NEXT:  LBB3_1: @ %gen_error279; CHECK-APPLE-NEXT:    push {lr}280; CHECK-APPLE-NEXT:    mov r0, #16281; CHECK-APPLE-NEXT:    mov r1, #0282; CHECK-APPLE-NEXT:    bl _malloc283; CHECK-APPLE-NEXT:    mov r8, r0284; CHECK-APPLE-NEXT:    mov r0, #1285; CHECK-APPLE-NEXT:    vmov.f32 s0, #1.000000e+00286; CHECK-APPLE-NEXT:    strb r0, [r8, #8]287; CHECK-APPLE-NEXT:    pop {lr}288; CHECK-APPLE-NEXT:    vmov r0, s0289; CHECK-APPLE-NEXT:    bx lr290; CHECK-APPLE-NEXT:    .p2align 2291; CHECK-APPLE-NEXT:  @ %bb.2:292; CHECK-APPLE-NEXT:    .data_region293; CHECK-APPLE-NEXT:  LCPI3_0:294; CHECK-APPLE-NEXT:    .long 0x00000000 @ float 0295; CHECK-APPLE-NEXT:    .end_data_region296;297; CHECK-O0-LABEL: foo_if:298; CHECK-O0:       @ %bb.0: @ %entry299; CHECK-O0-NEXT:    push {r7, lr}300; CHECK-O0-NEXT:    mov r7, sp301; CHECK-O0-NEXT:    sub sp, sp, #4302; CHECK-O0-NEXT:    str r8, [sp] @ 4-byte Spill303; CHECK-O0-NEXT:    cmp r0, #0304; CHECK-O0-NEXT:    beq LBB3_2305; CHECK-O0-NEXT:  @ %bb.1: @ %gen_error306; CHECK-O0-NEXT:    mov r0, #16307; CHECK-O0-NEXT:    mov r1, #0308; CHECK-O0-NEXT:    bl _malloc309; CHECK-O0-NEXT:    mov r1, r0310; CHECK-O0-NEXT:    mov r8, r1311; CHECK-O0-NEXT:    mov r0, #1312; CHECK-O0-NEXT:    strb r0, [r1, #8]313; CHECK-O0-NEXT:    mov r0, #1065353216314; CHECK-O0-NEXT:    mov sp, r7315; CHECK-O0-NEXT:    pop {r7, pc}316; CHECK-O0-NEXT:  LBB3_2: @ %normal317; CHECK-O0-NEXT:    ldr r8, [sp] @ 4-byte Reload318; CHECK-O0-NEXT:    mov r0, #0319; CHECK-O0-NEXT:    mov sp, r7320; CHECK-O0-NEXT:    pop {r7, pc}321;322; CHECK-ANDROID-LABEL: foo_if:323; CHECK-ANDROID:       @ %bb.0: @ %entry324; CHECK-ANDROID-NEXT:    cmp r0, #0325; CHECK-ANDROID-NEXT:    vldreq s0, .LCPI3_0326; CHECK-ANDROID-NEXT:    vmoveq r0, s0327; CHECK-ANDROID-NEXT:    bxeq lr328; CHECK-ANDROID-NEXT:  .LBB3_1: @ %gen_error329; CHECK-ANDROID-NEXT:    .save {r11, lr}330; CHECK-ANDROID-NEXT:    push {r11, lr}331; CHECK-ANDROID-NEXT:    mov r0, #16332; CHECK-ANDROID-NEXT:    mov r1, #0333; CHECK-ANDROID-NEXT:    bl malloc334; CHECK-ANDROID-NEXT:    mov r8, r0335; CHECK-ANDROID-NEXT:    mov r0, #1336; CHECK-ANDROID-NEXT:    vmov.f32 s0, #1.000000e+00337; CHECK-ANDROID-NEXT:    strb r0, [r8, #8]338; CHECK-ANDROID-NEXT:    pop {r11, lr}339; CHECK-ANDROID-NEXT:    vmov r0, s0340; CHECK-ANDROID-NEXT:    bx lr341; CHECK-ANDROID-NEXT:    .p2align 2342; CHECK-ANDROID-NEXT:  @ %bb.2:343; CHECK-ANDROID-NEXT:  .LCPI3_0:344; CHECK-ANDROID-NEXT:    .long 0x00000000 @ float 0345 346; spill to stack347; reload from stack348entry:349  %cond = icmp ne i32 %cc, 0350  br i1 %cond, label %gen_error, label %normal351 352gen_error:353  %call = call ptr @malloc(i64 16)354  store ptr %call, ptr %error_ptr_ref355  %tmp = getelementptr inbounds i8, ptr %call, i64 8356  store i8 1, ptr %tmp357  ret float 1.0358 359normal:360  ret float 0.0361}362 363; "foo_loop" is a function that takes a swifterror parameter, it sets swifterror364; under a certain condition inside a loop.365define float @foo_loop(ptr swifterror %error_ptr_ref, i32 %cc, float %cc2) {366; CHECK-APPLE-LABEL: foo_loop:367; CHECK-APPLE:       @ %bb.0: @ %entry368; CHECK-APPLE-NEXT:    push {r4, r5, lr}369; CHECK-APPLE-NEXT:    vpush {d8, d9}370; CHECK-APPLE-NEXT:    vmov.f32 s18, #1.000000e+00371; CHECK-APPLE-NEXT:    mov r4, r0372; CHECK-APPLE-NEXT:    vmov s16, r1373; CHECK-APPLE-NEXT:    mov r5, #1374; CHECK-APPLE-NEXT:    b LBB4_2375; CHECK-APPLE-NEXT:  LBB4_1: @ %bb_cont376; CHECK-APPLE-NEXT:    @ in Loop: Header=BB4_2 Depth=1377; CHECK-APPLE-NEXT:    vcmp.f32 s16, s18378; CHECK-APPLE-NEXT:    vmrs APSR_nzcv, fpscr379; CHECK-APPLE-NEXT:    bgt LBB4_4380; CHECK-APPLE-NEXT:  LBB4_2: @ %bb_loop381; CHECK-APPLE-NEXT:    @ =>This Inner Loop Header: Depth=1382; CHECK-APPLE-NEXT:    cmp r4, #0383; CHECK-APPLE-NEXT:    beq LBB4_1384; CHECK-APPLE-NEXT:  @ %bb.3: @ %gen_error385; CHECK-APPLE-NEXT:    @ in Loop: Header=BB4_2 Depth=1386; CHECK-APPLE-NEXT:    mov r0, #16387; CHECK-APPLE-NEXT:    mov r1, #0388; CHECK-APPLE-NEXT:    bl _malloc389; CHECK-APPLE-NEXT:    mov r8, r0390; CHECK-APPLE-NEXT:    strb r5, [r0, #8]391; CHECK-APPLE-NEXT:    b LBB4_1392; CHECK-APPLE-NEXT:  LBB4_4: @ %bb_end393; CHECK-APPLE-NEXT:    mov r0, #0394; CHECK-APPLE-NEXT:    vpop {d8, d9}395; CHECK-APPLE-NEXT:    pop {r4, r5, pc}396;397; CHECK-O0-LABEL: foo_loop:398; CHECK-O0:       @ %bb.0: @ %entry399; CHECK-O0-NEXT:    push {r7, lr}400; CHECK-O0-NEXT:    mov r7, sp401; CHECK-O0-NEXT:    sub sp, sp, #20402; CHECK-O0-NEXT:    str r0, [sp, #8] @ 4-byte Spill403; CHECK-O0-NEXT:    vmov s0, r1404; CHECK-O0-NEXT:    vstr s0, [r7, #-8] @ 4-byte Spill405; CHECK-O0-NEXT:    str r8, [r7, #-4] @ 4-byte Spill406; CHECK-O0-NEXT:    b LBB4_1407; CHECK-O0-NEXT:  LBB4_1: @ %bb_loop408; CHECK-O0-NEXT:    @ =>This Inner Loop Header: Depth=1409; CHECK-O0-NEXT:    ldr r1, [sp, #8] @ 4-byte Reload410; CHECK-O0-NEXT:    ldr r0, [r7, #-4] @ 4-byte Reload411; CHECK-O0-NEXT:    cmp r1, #0412; CHECK-O0-NEXT:    str r0, [sp, #4] @ 4-byte Spill413; CHECK-O0-NEXT:    beq LBB4_3414; CHECK-O0-NEXT:  @ %bb.2: @ %gen_error415; CHECK-O0-NEXT:    @ in Loop: Header=BB4_1 Depth=1416; CHECK-O0-NEXT:    mov r0, #16417; CHECK-O0-NEXT:    mov r1, #0418; CHECK-O0-NEXT:    bl _malloc419; CHECK-O0-NEXT:    mov r2, r0420; CHECK-O0-NEXT:    movw r1, #1421; CHECK-O0-NEXT:    strb r1, [r2, #8]422; CHECK-O0-NEXT:    str r0, [sp, #4] @ 4-byte Spill423; CHECK-O0-NEXT:  LBB4_3: @ %bb_cont424; CHECK-O0-NEXT:    @ in Loop: Header=BB4_1 Depth=1425; CHECK-O0-NEXT:    vldr s0, [r7, #-8] @ 4-byte Reload426; CHECK-O0-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload427; CHECK-O0-NEXT:    str r0, [sp] @ 4-byte Spill428; CHECK-O0-NEXT:    vmov.f32 s2, #1.000000e+00429; CHECK-O0-NEXT:    vcmp.f32 s0, s2430; CHECK-O0-NEXT:    vmrs APSR_nzcv, fpscr431; CHECK-O0-NEXT:    str r0, [r7, #-4] @ 4-byte Spill432; CHECK-O0-NEXT:    ble LBB4_1433; CHECK-O0-NEXT:  @ %bb.4: @ %bb_end434; CHECK-O0-NEXT:    ldr r8, [sp] @ 4-byte Reload435; CHECK-O0-NEXT:    mov r0, #0436; CHECK-O0-NEXT:    mov sp, r7437; CHECK-O0-NEXT:    pop {r7, pc}438;439; CHECK-ANDROID-LABEL: foo_loop:440; CHECK-ANDROID:       @ %bb.0: @ %entry441; CHECK-ANDROID-NEXT:    .save {r4, r5, r11, lr}442; CHECK-ANDROID-NEXT:    push {r4, r5, r11, lr}443; CHECK-ANDROID-NEXT:    .vsave {d8, d9}444; CHECK-ANDROID-NEXT:    vpush {d8, d9}445; CHECK-ANDROID-NEXT:    vmov.f32 s18, #1.000000e+00446; CHECK-ANDROID-NEXT:    mov r4, r0447; CHECK-ANDROID-NEXT:    vmov s16, r1448; CHECK-ANDROID-NEXT:    mov r5, #1449; CHECK-ANDROID-NEXT:    b .LBB4_2450; CHECK-ANDROID-NEXT:  .LBB4_1: @ %bb_cont451; CHECK-ANDROID-NEXT:    @ in Loop: Header=BB4_2 Depth=1452; CHECK-ANDROID-NEXT:    vcmp.f32 s16, s18453; CHECK-ANDROID-NEXT:    vmrs APSR_nzcv, fpscr454; CHECK-ANDROID-NEXT:    bgt .LBB4_4455; CHECK-ANDROID-NEXT:  .LBB4_2: @ %bb_loop456; CHECK-ANDROID-NEXT:    @ =>This Inner Loop Header: Depth=1457; CHECK-ANDROID-NEXT:    cmp r4, #0458; CHECK-ANDROID-NEXT:    beq .LBB4_1459; CHECK-ANDROID-NEXT:  @ %bb.3: @ %gen_error460; CHECK-ANDROID-NEXT:    @ in Loop: Header=BB4_2 Depth=1461; CHECK-ANDROID-NEXT:    mov r0, #16462; CHECK-ANDROID-NEXT:    mov r1, #0463; CHECK-ANDROID-NEXT:    bl malloc464; CHECK-ANDROID-NEXT:    mov r8, r0465; CHECK-ANDROID-NEXT:    strb r5, [r0, #8]466; CHECK-ANDROID-NEXT:    b .LBB4_1467; CHECK-ANDROID-NEXT:  .LBB4_4: @ %bb_end468; CHECK-ANDROID-NEXT:    mov r0, #0469; CHECK-ANDROID-NEXT:    vpop {d8, d9}470; CHECK-ANDROID-NEXT:    pop {r4, r5, r11, pc}471; swifterror is kept in a register472 473; spill r0474; reload from stack475entry:476  br label %bb_loop477 478bb_loop:479  %cond = icmp ne i32 %cc, 0480  br i1 %cond, label %gen_error, label %bb_cont481 482gen_error:483  %call = call ptr @malloc(i64 16)484  store ptr %call, ptr %error_ptr_ref485  %tmp = getelementptr inbounds i8, ptr %call, i64 8486  store i8 1, ptr %tmp487  br label %bb_cont488 489bb_cont:490  %cmp = fcmp ogt float %cc2, 1.000000e+00491  br i1 %cmp, label %bb_end, label %bb_loop492bb_end:493  ret float 0.0494}495 496; "foo_sret" is a function that takes a swifterror parameter, it also has a sret497; parameter.498define void @foo_sret(ptr sret(%struct.S) %agg.result, i32 %val1, ptr swifterror %error_ptr_ref) {499; CHECK-APPLE-LABEL: foo_sret:500; CHECK-APPLE:       @ %bb.0: @ %entry501; CHECK-APPLE-NEXT:    push {r4, r5, lr}502; CHECK-APPLE-NEXT:    mov r4, r1503; CHECK-APPLE-NEXT:    mov r5, r0504; CHECK-APPLE-NEXT:    mov r0, #16505; CHECK-APPLE-NEXT:    mov r1, #0506; CHECK-APPLE-NEXT:    bl _malloc507; CHECK-APPLE-NEXT:    mov r1, #1508; CHECK-APPLE-NEXT:    mov r8, r0509; CHECK-APPLE-NEXT:    strb r1, [r0, #8]510; CHECK-APPLE-NEXT:    str r4, [r5, #4]511; CHECK-APPLE-NEXT:    pop {r4, r5, pc}512;513; CHECK-O0-LABEL: foo_sret:514; CHECK-O0:       @ %bb.0: @ %entry515; CHECK-O0-NEXT:    push {r7, lr}516; CHECK-O0-NEXT:    mov r7, sp517; CHECK-O0-NEXT:    sub sp, sp, #8518; CHECK-O0-NEXT:    str r1, [sp] @ 4-byte Spill519; CHECK-O0-NEXT:    str r0, [sp, #4] @ 4-byte Spill520; CHECK-O0-NEXT:    mov r0, #16521; CHECK-O0-NEXT:    mov r1, #0522; CHECK-O0-NEXT:    bl _malloc523; CHECK-O0-NEXT:    ldr r1, [sp] @ 4-byte Reload524; CHECK-O0-NEXT:    mov r3, r0525; CHECK-O0-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload526; CHECK-O0-NEXT:    mov r8, r3527; CHECK-O0-NEXT:    mov r2, #1528; CHECK-O0-NEXT:    strb r2, [r3, #8]529; CHECK-O0-NEXT:    str r1, [r0, #4]530; CHECK-O0-NEXT:    mov sp, r7531; CHECK-O0-NEXT:    pop {r7, pc}532;533; CHECK-ANDROID-LABEL: foo_sret:534; CHECK-ANDROID:       @ %bb.0: @ %entry535; CHECK-ANDROID-NEXT:    .save {r4, r5, r11, lr}536; CHECK-ANDROID-NEXT:    push {r4, r5, r11, lr}537; CHECK-ANDROID-NEXT:    mov r4, r1538; CHECK-ANDROID-NEXT:    mov r5, r0539; CHECK-ANDROID-NEXT:    mov r0, #16540; CHECK-ANDROID-NEXT:    mov r1, #0541; CHECK-ANDROID-NEXT:    bl malloc542; CHECK-ANDROID-NEXT:    mov r1, #1543; CHECK-ANDROID-NEXT:    mov r8, r0544; CHECK-ANDROID-NEXT:    strb r1, [r0, #8]545; CHECK-ANDROID-NEXT:    str r4, [r5, #4]546; CHECK-ANDROID-NEXT:    pop {r4, r5, r11, pc}547 548; spill to stack: sret and val1549; reload from stack: sret and val1550entry:551  %call = call ptr @malloc(i64 16)552  store ptr %call, ptr %error_ptr_ref553  %tmp = getelementptr inbounds i8, ptr %call, i64 8554  store i8 1, ptr %tmp555  %v2 = getelementptr inbounds %struct.S, ptr %agg.result, i32 0, i32 1556  store i32 %val1, ptr %v2557  ret void558}559 560; "caller3" calls "foo_sret" that takes a swifterror parameter.561define float @caller3(ptr %error_ref) {562; CHECK-APPLE-LABEL: caller3:563; CHECK-APPLE:       @ %bb.0: @ %entry564; CHECK-APPLE-NEXT:    push {r4, r7, r8, lr}565; CHECK-APPLE-NEXT:    add r7, sp, #8566; CHECK-APPLE-NEXT:    sub sp, sp, #32567; CHECK-APPLE-NEXT:    bfc sp, #0, #3568; CHECK-APPLE-NEXT:    mov r4, r0569; CHECK-APPLE-NEXT:    add r0, sp, #8570; CHECK-APPLE-NEXT:    mov r1, #1571; CHECK-APPLE-NEXT:    mov r8, #0572; CHECK-APPLE-NEXT:    bl _foo_sret573; CHECK-APPLE-NEXT:    mov r0, r8574; CHECK-APPLE-NEXT:    cmp r8, #0575; CHECK-APPLE-NEXT:    ldrbeq r1, [r0, #8]576; CHECK-APPLE-NEXT:    strbeq r1, [r4]577; CHECK-APPLE-NEXT:    bl _free578; CHECK-APPLE-NEXT:    mov r0, #1065353216579; CHECK-APPLE-NEXT:    sub sp, r7, #8580; CHECK-APPLE-NEXT:    pop {r4, r7, r8, pc}581;582; CHECK-O0-LABEL: caller3:583; CHECK-O0:       @ %bb.0: @ %entry584; CHECK-O0-NEXT:    push	{r7, r8, lr}585; CHECK-O0-NEXT:    add	r7, sp, #4586; CHECK-O0-NEXT:    sub	sp, sp, #44587; CHECK-O0-NEXT:    bfc	sp, #0, #3588; CHECK-O0-NEXT:    @ implicit-def: $r1589; CHECK-O0-NEXT:    str	r0, [sp, #4] @ 4-byte Spill590; CHECK-O0-NEXT:    mov	r8, #0591; CHECK-O0-NEXT:    add	r0, sp, #16592; CHECK-O0-NEXT:    mov	r1, #1593; CHECK-O0-NEXT:    bl	_foo_sret594; CHECK-O0-NEXT:    str	r8, [sp, #8] @ 4-byte Spill595; CHECK-O0-NEXT:    movw	r0, #0596; CHECK-O0-NEXT:    cmp	r8, r0597; CHECK-O0-NEXT:    bne	LBB6_2598; CHECK-O0-NEXT:  @ %bb.1: @ %cont599; CHECK-O0-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload600; CHECK-O0-NEXT:    ldr r0, [sp, #8] @ 4-byte Reload601; CHECK-O0-NEXT:    ldrb r0, [r0, #8]602; CHECK-O0-NEXT:    strb r0, [r1]603; CHECK-O0-NEXT:  LBB6_2: @ %handler604; CHECK-O0-NEXT:    ldr r0, [sp, #8] @ 4-byte Reload605; CHECK-O0-NEXT:    bl _free606; CHECK-O0-NEXT:    mov r0, #1065353216607; CHECK-O0-NEXT:    sub sp, r7, #4608; CHECK-O0-NEXT:    pop	{r7, r8, pc}609;610; CHECK-ANDROID-LABEL: caller3:611; CHECK-ANDROID:       @ %bb.0: @ %entry612; CHECK-ANDROID-NEXT:    .save {r4, r8, r11, lr}613; CHECK-ANDROID-NEXT:    push {r4, r8, r11, lr}614; CHECK-ANDROID-NEXT:    .pad #32615; CHECK-ANDROID-NEXT:    sub sp, sp, #32616; CHECK-ANDROID-NEXT:    mov r4, r0617; CHECK-ANDROID-NEXT:    add r0, sp, #8618; CHECK-ANDROID-NEXT:    mov r1, #1619; CHECK-ANDROID-NEXT:    mov r8, #0620; CHECK-ANDROID-NEXT:    bl foo_sret621; CHECK-ANDROID-NEXT:    mov r0, r8622; CHECK-ANDROID-NEXT:    cmp r8, #0623; CHECK-ANDROID-NEXT:    ldrbeq r1, [r0, #8]624; CHECK-ANDROID-NEXT:    strbeq r1, [r4]625; CHECK-ANDROID-NEXT:    bl free626; CHECK-ANDROID-NEXT:    mov r0, #1065353216627; CHECK-ANDROID-NEXT:    add sp, sp, #32628; CHECK-ANDROID-NEXT:    pop {r4, r8, r11, pc}629; Access part of the error object and save it to error_ref630 631; Access part of the error object and save it to error_ref632entry:633  %s = alloca %struct.S, align 8634  %error_ptr_ref = alloca swifterror ptr635  store ptr null, ptr %error_ptr_ref636  call void @foo_sret(ptr sret(%struct.S) %s, i32 1, ptr swifterror %error_ptr_ref)637  %error_from_foo = load ptr, ptr %error_ptr_ref638  %had_error_from_foo = icmp ne ptr %error_from_foo, null639  br i1 %had_error_from_foo, label %handler, label %cont640cont:641  %v1 = getelementptr inbounds %swift_error, ptr %error_from_foo, i64 0, i32 1642  %t = load i8, ptr %v1643  store i8 %t, ptr %error_ref644  br label %handler645handler:646  call void @free(ptr %error_from_foo)647  ret float 1.0648}649 650; "foo_vararg" is a function that takes a swifterror parameter, it also has651; variable number of arguments.652declare void @llvm.va_start(ptr) nounwind653define float @foo_vararg(ptr swifterror %error_ptr_ref, ...) {654; CHECK-APPLE-LABEL: foo_vararg:655; CHECK-APPLE:       @ %bb.0: @ %entry656; CHECK-APPLE-NEXT:    sub sp, sp, #16657; CHECK-APPLE-NEXT:    push {r7, lr}658; CHECK-APPLE-NEXT:    mov r7, sp659; CHECK-APPLE-NEXT:    sub sp, sp, #24660; CHECK-APPLE-NEXT:    bfc sp, #0, #3661; CHECK-APPLE-NEXT:    add r8, r7, #8662; CHECK-APPLE-NEXT:    stm r8, {r0, r1, r2, r3}663; CHECK-APPLE-NEXT:    mov r0, #16664; CHECK-APPLE-NEXT:    mov r1, #0665; CHECK-APPLE-NEXT:    bl _malloc666; CHECK-APPLE-NEXT:    mov r8, r0667; CHECK-APPLE-NEXT:    mov r0, #1668; CHECK-APPLE-NEXT:    strb r0, [r8, #8]669; CHECK-APPLE-NEXT:    add r0, r7, #8670; CHECK-APPLE-NEXT:    add r0, r0, #4671; CHECK-APPLE-NEXT:    ldr r2, [r7, #8]672; CHECK-APPLE-NEXT:    ldr r1, [r0], #4673; CHECK-APPLE-NEXT:    ldr r3, [r0], #4674; CHECK-APPLE-NEXT:    str r0, [sp, #16]675; CHECK-APPLE-NEXT:    mov r0, #1065353216676; CHECK-APPLE-NEXT:    str r2, [sp, #12]677; CHECK-APPLE-NEXT:    str r1, [sp, #8]678; CHECK-APPLE-NEXT:    str r3, [sp, #4]679; CHECK-APPLE-NEXT:    mov sp, r7680; CHECK-APPLE-NEXT:    pop {r7, lr}681; CHECK-APPLE-NEXT:    add sp, sp, #16682; CHECK-APPLE-NEXT:    bx lr683;684; CHECK-O0-LABEL: foo_vararg:685; CHECK-O0:       @ %bb.0: @ %entry686; CHECK-O0-NEXT:    sub sp, sp, #16687; CHECK-O0-NEXT:    push {r7, lr}688; CHECK-O0-NEXT:    mov r7, sp689; CHECK-O0-NEXT:    sub sp, sp, #24690; CHECK-O0-NEXT:    bfc sp, #0, #3691; CHECK-O0-NEXT:    str r3, [r7, #20]692; CHECK-O0-NEXT:    str r2, [r7, #16]693; CHECK-O0-NEXT:    str r1, [r7, #12]694; CHECK-O0-NEXT:    str r0, [r7, #8]695; CHECK-O0-NEXT:    mov r0, #16696; CHECK-O0-NEXT:    mov r1, #0697; CHECK-O0-NEXT:    bl _malloc698; CHECK-O0-NEXT:    mov r1, r0699; CHECK-O0-NEXT:    mov r8, r1700; CHECK-O0-NEXT:    mov r0, #1701; CHECK-O0-NEXT:    strb r0, [r1, #8]702; CHECK-O0-NEXT:    add r0, r7, #8703; CHECK-O0-NEXT:    str r0, [sp, #16]704; CHECK-O0-NEXT:    ldr r0, [sp, #16]705; CHECK-O0-NEXT:    add r1, r0, #4706; CHECK-O0-NEXT:    str r1, [sp, #16]707; CHECK-O0-NEXT:    ldr r0, [r0]708; CHECK-O0-NEXT:    str r0, [sp, #12]709; CHECK-O0-NEXT:    ldr r0, [sp, #16]710; CHECK-O0-NEXT:    add r1, r0, #4711; CHECK-O0-NEXT:    str r1, [sp, #16]712; CHECK-O0-NEXT:    ldr r0, [r0]713; CHECK-O0-NEXT:    str r0, [sp, #8]714; CHECK-O0-NEXT:    ldr r0, [sp, #16]715; CHECK-O0-NEXT:    add r1, r0, #4716; CHECK-O0-NEXT:    str r1, [sp, #16]717; CHECK-O0-NEXT:    ldr r0, [r0]718; CHECK-O0-NEXT:    str r0, [sp, #4]719; CHECK-O0-NEXT:    mov r0, #1065353216720; CHECK-O0-NEXT:    mov sp, r7721; CHECK-O0-NEXT:    pop {r7, lr}722; CHECK-O0-NEXT:    add sp, sp, #16723; CHECK-O0-NEXT:    bx lr724;725; CHECK-ANDROID-LABEL: foo_vararg:726; CHECK-ANDROID:       @ %bb.0: @ %entry727; CHECK-ANDROID-NEXT:    .pad #16728; CHECK-ANDROID-NEXT:    sub sp, sp, #16729; CHECK-ANDROID-NEXT:    .save {r11, lr}730; CHECK-ANDROID-NEXT:    push {r11, lr}731; CHECK-ANDROID-NEXT:    .pad #24732; CHECK-ANDROID-NEXT:    sub sp, sp, #24733; CHECK-ANDROID-NEXT:    add r8, sp, #32734; CHECK-ANDROID-NEXT:    stm r8, {r0, r1, r2, r3}735; CHECK-ANDROID-NEXT:    mov r0, #16736; CHECK-ANDROID-NEXT:    mov r1, #0737; CHECK-ANDROID-NEXT:    bl malloc738; CHECK-ANDROID-NEXT:    mov r8, r0739; CHECK-ANDROID-NEXT:    mov r0, #1740; CHECK-ANDROID-NEXT:    strb r0, [r8, #8]741; CHECK-ANDROID-NEXT:    add r0, sp, #32742; CHECK-ANDROID-NEXT:    orr r0, r0, #4743; CHECK-ANDROID-NEXT:    ldr r2, [sp, #32]744; CHECK-ANDROID-NEXT:    ldr r1, [r0], #4745; CHECK-ANDROID-NEXT:    ldr r3, [r0], #4746; CHECK-ANDROID-NEXT:    str r0, [sp, #16]747; CHECK-ANDROID-NEXT:    mov r0, #1065353216748; CHECK-ANDROID-NEXT:    str r2, [sp, #12]749; CHECK-ANDROID-NEXT:    str r1, [sp, #8]750; CHECK-ANDROID-NEXT:    str r3, [sp, #4]751; CHECK-ANDROID-NEXT:    add sp, sp, #24752; CHECK-ANDROID-NEXT:    pop {r11, lr}753; CHECK-ANDROID-NEXT:    add sp, sp, #16754; CHECK-ANDROID-NEXT:    bx lr755 756entry:757  %call = call ptr @malloc(i64 16)758  store ptr %call, ptr %error_ptr_ref759  %tmp = getelementptr inbounds i8, ptr %call, i64 8760  store i8 1, ptr %tmp761 762  %args = alloca ptr, align 8763  %a10 = alloca i32, align 4764  %a11 = alloca i32, align 4765  %a12 = alloca i32, align 4766  call void @llvm.va_start(ptr %args)767  %v11 = va_arg ptr %args, i32768  store i32 %v11, ptr %a10, align 4769  %v12 = va_arg ptr %args, i32770  store i32 %v12, ptr %a11, align 4771  %v13 = va_arg ptr %args, i32772  store i32 %v13, ptr %a12, align 4773 774  ret float 1.0775}776 777; "caller4" calls "foo_vararg" that takes a swifterror parameter.778define float @caller4(ptr %error_ref) {779; CHECK-APPLE-LABEL: caller4:780; CHECK-APPLE:       @ %bb.0: @ %entry781; CHECK-APPLE-NEXT:    push {r4, r8, lr}782; CHECK-APPLE-NEXT:    sub sp, sp, #16783; CHECK-APPLE-NEXT:    mov r4, r0784; CHECK-APPLE-NEXT:    mov r0, #11785; CHECK-APPLE-NEXT:    str r0, [sp, #4]786; CHECK-APPLE-NEXT:    mov r0, #10787; CHECK-APPLE-NEXT:    str r0, [sp, #8]788; CHECK-APPLE-NEXT:    mov r0, #12789; CHECK-APPLE-NEXT:    str r0, [sp]790; CHECK-APPLE-NEXT:    mov r8, #0791; CHECK-APPLE-NEXT:    mov r0, #10792; CHECK-APPLE-NEXT:    mov r1, #11793; CHECK-APPLE-NEXT:    mov r2, #12794; CHECK-APPLE-NEXT:    bl _foo_vararg795; CHECK-APPLE-NEXT:    mov r0, r8796; CHECK-APPLE-NEXT:    cmp r8, #0797; CHECK-APPLE-NEXT:    ldrbeq r1, [r0, #8]798; CHECK-APPLE-NEXT:    strbeq r1, [r4]799; CHECK-APPLE-NEXT:    bl _free800; CHECK-APPLE-NEXT:    mov r0, #1065353216801; CHECK-APPLE-NEXT:    add sp, sp, #16802; CHECK-APPLE-NEXT:    pop {r4, r8, pc}803;804; CHECK-O0-LABEL: caller4:805; CHECK-O0:       @ %bb.0: @ %entry806; CHECK-O0-NEXT:    push	{r7, r8, lr}807; CHECK-O0-NEXT:    add	r7, sp, #4808; CHECK-O0-NEXT:    sub	sp, sp, #24809; CHECK-O0-NEXT:    @ implicit-def: $r1810; CHECK-O0-NEXT:    str	r0, [sp] @ 4-byte Spill811; CHECK-O0-NEXT:    mov	r8, #0812; CHECK-O0-NEXT:    mov	r0, #10813; CHECK-O0-NEXT:    str	r0, [r7, #-12]814; CHECK-O0-NEXT:    mov	r0, #11815; CHECK-O0-NEXT:    str	r0, [sp, #12]816; CHECK-O0-NEXT:    mov	r0, #12817; CHECK-O0-NEXT:    str	r0, [sp, #8]818; CHECK-O0-NEXT:    ldr	r0, [r7, #-12]819; CHECK-O0-NEXT:    ldr	r1, [sp, #12]820; CHECK-O0-NEXT:    ldr	r2, [sp, #8]821; CHECK-O0-NEXT:    bl	_foo_vararg822; CHECK-O0-NEXT:    str	r8, [sp, #4] @ 4-byte Spill823; CHECK-O0-NEXT:    movw	r0, #0824; CHECK-O0-NEXT:    cmp	r8, r0825; CHECK-O0-NEXT:    bne	LBB8_2826; CHECK-O0-NEXT:  @ %bb.1: @ %cont827; CHECK-O0-NEXT:    ldr r1, [sp] @ 4-byte Reload828; CHECK-O0-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload829; CHECK-O0-NEXT:    ldrb r0, [r0, #8]830; CHECK-O0-NEXT:    strb r0, [r1]831; CHECK-O0-NEXT:  LBB8_2: @ %handler832; CHECK-O0-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload833; CHECK-O0-NEXT:    bl _free834; CHECK-O0-NEXT:    mov r0, #1065353216835; CHECK-O0-NEXT:    sub sp, r7, #4836; CHECK-O0-NEXT:    pop	{r7, r8, pc}837;838; CHECK-ANDROID-LABEL: caller4:839; CHECK-ANDROID:       @ %bb.0: @ %entry840; CHECK-ANDROID-NEXT:    .save {r4, r8, r11, lr}841; CHECK-ANDROID-NEXT:    push {r4, r8, r11, lr}842; CHECK-ANDROID-NEXT:    .pad #16843; CHECK-ANDROID-NEXT:    sub sp, sp, #16844; CHECK-ANDROID-NEXT:    mov r4, r0845; CHECK-ANDROID-NEXT:    mov r0, #11846; CHECK-ANDROID-NEXT:    str r0, [sp, #4]847; CHECK-ANDROID-NEXT:    mov r0, #10848; CHECK-ANDROID-NEXT:    str r0, [sp, #8]849; CHECK-ANDROID-NEXT:    mov r0, #12850; CHECK-ANDROID-NEXT:    str r0, [sp]851; CHECK-ANDROID-NEXT:    mov r8, #0852; CHECK-ANDROID-NEXT:    mov r0, #10853; CHECK-ANDROID-NEXT:    mov r1, #11854; CHECK-ANDROID-NEXT:    mov r2, #12855; CHECK-ANDROID-NEXT:    bl foo_vararg856; CHECK-ANDROID-NEXT:    mov r0, r8857; CHECK-ANDROID-NEXT:    cmp r8, #0858; CHECK-ANDROID-NEXT:    ldrbeq r1, [r0, #8]859; CHECK-ANDROID-NEXT:    strbeq r1, [r4]860; CHECK-ANDROID-NEXT:    bl free861; CHECK-ANDROID-NEXT:    mov r0, #1065353216862; CHECK-ANDROID-NEXT:    add sp, sp, #16863; CHECK-ANDROID-NEXT:    pop {r4, r8, r11, pc}864; Access part of the error object and save it to error_ref865entry:866  %error_ptr_ref = alloca swifterror ptr867  store ptr null, ptr %error_ptr_ref868 869  %a10 = alloca i32, align 4870  %a11 = alloca i32, align 4871  %a12 = alloca i32, align 4872  store i32 10, ptr %a10, align 4873  store i32 11, ptr %a11, align 4874  store i32 12, ptr %a12, align 4875  %v10 = load i32, ptr %a10, align 4876  %v11 = load i32, ptr %a11, align 4877  %v12 = load i32, ptr %a12, align 4878 879  %call = call float (ptr, ...) @foo_vararg(ptr swifterror %error_ptr_ref, i32 %v10, i32 %v11, i32 %v12)880  %error_from_foo = load ptr, ptr %error_ptr_ref881  %had_error_from_foo = icmp ne ptr %error_from_foo, null882  br i1 %had_error_from_foo, label %handler, label %cont883 884cont:885  %v1 = getelementptr inbounds %swift_error, ptr %error_from_foo, i64 0, i32 1886  %t = load i8, ptr %v1887  store i8 %t, ptr %error_ref888  br label %handler889handler:890  call void @free(ptr %error_from_foo)891  ret float 1.0892}893 894; Check that we don't blow up on tail calling swifterror argument functions.895define float @tailcallswifterror(ptr swifterror %error_ptr_ref) {896; CHECK-APPLE-LABEL: tailcallswifterror:897; CHECK-APPLE:       @ %bb.0: @ %entry898; CHECK-APPLE-NEXT:    push {lr}899; CHECK-APPLE-NEXT:    bl _tailcallswifterror900; CHECK-APPLE-NEXT:    pop {lr}901; CHECK-APPLE-NEXT:    bx lr902;903; CHECK-O0-LABEL: tailcallswifterror:904; CHECK-O0:       @ %bb.0: @ %entry905; CHECK-O0-NEXT:    push {r7, lr}906; CHECK-O0-NEXT:    mov r7, sp907; CHECK-O0-NEXT:    bl _tailcallswifterror908; CHECK-O0-NEXT:    pop {r7, pc}909;910; CHECK-ANDROID-LABEL: tailcallswifterror:911; CHECK-ANDROID:       @ %bb.0: @ %entry912; CHECK-ANDROID-NEXT:    .save {r11, lr}913; CHECK-ANDROID-NEXT:    push {r11, lr}914; CHECK-ANDROID-NEXT:    bl tailcallswifterror915; CHECK-ANDROID-NEXT:    pop {r11, pc}916entry:917  %0 = tail call float @tailcallswifterror(ptr swifterror %error_ptr_ref)918  ret float %0919}920define swiftcc float @tailcallswifterror_swiftcc(ptr swifterror %error_ptr_ref) {921; CHECK-APPLE-LABEL: tailcallswifterror_swiftcc:922; CHECK-APPLE:       @ %bb.0: @ %entry923; CHECK-APPLE-NEXT:    push {lr}924; CHECK-APPLE-NEXT:    bl _tailcallswifterror_swiftcc925; CHECK-APPLE-NEXT:    pop {lr}926; CHECK-APPLE-NEXT:    bx lr927;928; CHECK-O0-LABEL: tailcallswifterror_swiftcc:929; CHECK-O0:       @ %bb.0: @ %entry930; CHECK-O0-NEXT:    push {r7, lr}931; CHECK-O0-NEXT:    mov r7, sp932; CHECK-O0-NEXT:    bl _tailcallswifterror_swiftcc933; CHECK-O0-NEXT:    pop {r7, pc}934;935; CHECK-ANDROID-LABEL: tailcallswifterror_swiftcc:936; CHECK-ANDROID:       @ %bb.0: @ %entry937; CHECK-ANDROID-NEXT:    .save {r11, lr}938; CHECK-ANDROID-NEXT:    push {r11, lr}939; CHECK-ANDROID-NEXT:    bl tailcallswifterror_swiftcc940; CHECK-ANDROID-NEXT:    pop {r11, pc}941entry:942  %0 = tail call swiftcc float @tailcallswifterror_swiftcc(ptr swifterror %error_ptr_ref)943  ret float %0944}945 946define swiftcc void @swifterror_clobber(ptr nocapture swifterror %err) {947; CHECK-APPLE-LABEL: swifterror_clobber:948; CHECK-APPLE:       @ %bb.0:949; CHECK-APPLE-NEXT:    mov r0, r8950; CHECK-APPLE-NEXT:    @ InlineAsm Start951; CHECK-APPLE-NEXT:    nop952; CHECK-APPLE-NEXT:    @ InlineAsm End953; CHECK-APPLE-NEXT:    mov r8, r0954; CHECK-APPLE-NEXT:    bx lr955;956; CHECK-O0-LABEL: swifterror_clobber:957; CHECK-O0:       @ %bb.0:958; CHECK-O0-NEXT:    sub sp, sp, #4959; CHECK-O0-NEXT:    str r8, [sp] @ 4-byte Spill960; CHECK-O0-NEXT:    @ InlineAsm Start961; CHECK-O0-NEXT:    nop962; CHECK-O0-NEXT:    @ InlineAsm End963; CHECK-O0-NEXT:    ldr r8, [sp] @ 4-byte Reload964; CHECK-O0-NEXT:    add sp, sp, #4965; CHECK-O0-NEXT:    bx lr966;967; CHECK-ANDROID-LABEL: swifterror_clobber:968; CHECK-ANDROID:       @ %bb.0:969; CHECK-ANDROID-NEXT:    mov r0, r8970; CHECK-ANDROID-NEXT:    @APP971; CHECK-ANDROID-NEXT:    nop972; CHECK-ANDROID-NEXT:    @NO_APP973; CHECK-ANDROID-NEXT:    mov r8, r0974; CHECK-ANDROID-NEXT:    bx lr975  call void asm sideeffect "nop", "~{r8}"()976  ret void977}978 979define swiftcc void @swifterror_reg_clobber(ptr nocapture %err) {980; CHECK-APPLE-LABEL: swifterror_reg_clobber:981; CHECK-APPLE:       @ %bb.0:982; CHECK-APPLE-NEXT:    push {r8, lr}983; CHECK-APPLE-NEXT:    @ InlineAsm Start984; CHECK-APPLE-NEXT:    nop985; CHECK-APPLE-NEXT:    @ InlineAsm End986; CHECK-APPLE-NEXT:    pop {r8, pc}987;988; CHECK-O0-LABEL: swifterror_reg_clobber:989; CHECK-O0:       @ %bb.0:990; CHECK-O0-NEXT:    push	{r7, r8, lr}991; CHECK-O0-NEXT:    add	r7, sp, #4992; CHECK-O0-NEXT:    @ InlineAsm Start993; CHECK-O0-NEXT:    nop994; CHECK-O0-NEXT:    @ InlineAsm End995; CHECK-O0-NEXT:    pop	{r7, r8, pc}996;997; CHECK-ANDROID-LABEL: swifterror_reg_clobber:998; CHECK-ANDROID:       @ %bb.0:999; CHECK-ANDROID-NEXT:    .save {r8, lr}1000; CHECK-ANDROID-NEXT:    push {r8, lr}1001; CHECK-ANDROID-NEXT:    @APP1002; CHECK-ANDROID-NEXT:    nop1003; CHECK-ANDROID-NEXT:    @NO_APP1004; CHECK-ANDROID-NEXT:    pop {r8, pc}1005  call void asm sideeffect "nop", "~{r8}"()1006  ret void1007}1008 1009define swiftcc void @params_in_reg(i32, i32, i32, i32, ptr swiftself, ptr nocapture swifterror %err) {1010; CHECK-APPLE-LABEL: params_in_reg:1011; CHECK-APPLE:       @ %bb.0:1012; CHECK-APPLE-NEXT:    push {r4, r5, r6, r7, r10, r11, lr}1013; CHECK-APPLE-NEXT:    add r7, sp, #201014; CHECK-APPLE-NEXT:    sub sp, sp, #121015; CHECK-APPLE-NEXT:    bfc sp, #0, #31016; CHECK-APPLE-NEXT:    str r8, [sp, #4] @ 4-byte Spill1017; CHECK-APPLE-NEXT:    mov r6, r31018; CHECK-APPLE-NEXT:    str r10, [sp] @ 4-byte Spill1019; CHECK-APPLE-NEXT:    mov r4, r21020; CHECK-APPLE-NEXT:    mov r11, r11021; CHECK-APPLE-NEXT:    mov r5, r01022; CHECK-APPLE-NEXT:    mov r0, #11023; CHECK-APPLE-NEXT:    mov r1, #21024; CHECK-APPLE-NEXT:    mov r2, #31025; CHECK-APPLE-NEXT:    mov r3, #41026; CHECK-APPLE-NEXT:    mov r10, #01027; CHECK-APPLE-NEXT:    mov r8, #01028; CHECK-APPLE-NEXT:    bl _params_in_reg21029; CHECK-APPLE-NEXT:    ldr r10, [sp] @ 4-byte Reload1030; CHECK-APPLE-NEXT:    mov r0, r51031; CHECK-APPLE-NEXT:    ldr r8, [sp, #4] @ 4-byte Reload1032; CHECK-APPLE-NEXT:    mov r1, r111033; CHECK-APPLE-NEXT:    mov r2, r41034; CHECK-APPLE-NEXT:    mov r3, r61035; CHECK-APPLE-NEXT:    bl _params_in_reg21036; CHECK-APPLE-NEXT:    sub sp, r7, #201037; CHECK-APPLE-NEXT:    pop {r4, r5, r6, r7, r10, r11, pc}1038;1039; CHECK-O0-LABEL: params_in_reg:1040; CHECK-O0:       @ %bb.0:1041; CHECK-O0-NEXT:    push	{r7, r10, lr}1042; CHECK-O0-NEXT:    add	r7, sp, #41043; CHECK-O0-NEXT:    sub	sp, sp, #281044; CHECK-O0-NEXT:    bfc	sp, #0, #31045; CHECK-O0-NEXT:    str	r8, [sp, #20] @ 4-byte Spill1046; CHECK-O0-NEXT:    str	r10, [sp] @ 4-byte Spill1047; CHECK-O0-NEXT:    str	r3, [sp, #16] @ 4-byte Spill1048; CHECK-O0-NEXT:    str	r2, [sp, #12] @ 4-byte Spill1049; CHECK-O0-NEXT:    str	r1, [sp, #8] @ 4-byte Spill1050; CHECK-O0-NEXT:    str	r0, [sp, #4] @ 4-byte Spill1051; CHECK-O0-NEXT:    @ implicit-def: $r01052; CHECK-O0-NEXT:    mov	r8, #01053; CHECK-O0-NEXT:    mov	r0, #11054; CHECK-O0-NEXT:    mov	r1, #21055; CHECK-O0-NEXT:    mov	r2, #31056; CHECK-O0-NEXT:    mov	r3, #41057; CHECK-O0-NEXT:    mov	r10, r81058; CHECK-O0-NEXT:    bl	_params_in_reg21059; CHECK-O0-NEXT:    ldr	r10, [sp] @ 4-byte Reload1060; CHECK-O0-NEXT:    ldr	r0, [sp, #4] @ 4-byte Reload1061; CHECK-O0-NEXT:    ldr	r1, [sp, #8] @ 4-byte Reload1062; CHECK-O0-NEXT:    ldr	r2, [sp, #12] @ 4-byte Reload1063; CHECK-O0-NEXT:    ldr	r3, [sp, #16] @ 4-byte Reload1064; CHECK-O0-NEXT:    mov	r9, r81065; CHECK-O0-NEXT:    ldr	r8, [sp, #20] @ 4-byte Reload1066; CHECK-O0-NEXT:    bl	_params_in_reg21067; CHECK-O0-NEXT:    sub	sp, r7, #41068; CHECK-O0-NEXT:    pop	{r7, r10, pc}1069;1070; CHECK-ANDROID-LABEL: params_in_reg:1071; CHECK-ANDROID:       @ %bb.0:1072; CHECK-ANDROID-NEXT:    .save {r4, r5, r6, r7, r9, r10, r11, lr}1073; CHECK-ANDROID-NEXT:    push {r4, r5, r6, r7, r9, r10, r11, lr}1074; CHECK-ANDROID-NEXT:    .pad #81075; CHECK-ANDROID-NEXT:    sub sp, sp, #81076; CHECK-ANDROID-NEXT:    mov r9, r81077; CHECK-ANDROID-NEXT:    mov r11, r101078; CHECK-ANDROID-NEXT:    mov r6, r31079; CHECK-ANDROID-NEXT:    mov r7, r21080; CHECK-ANDROID-NEXT:    mov r4, r11081; CHECK-ANDROID-NEXT:    mov r5, r01082; CHECK-ANDROID-NEXT:    mov r0, #11083; CHECK-ANDROID-NEXT:    mov r1, #21084; CHECK-ANDROID-NEXT:    mov r2, #31085; CHECK-ANDROID-NEXT:    mov r3, #41086; CHECK-ANDROID-NEXT:    mov r10, #01087; CHECK-ANDROID-NEXT:    mov r8, #01088; CHECK-ANDROID-NEXT:    bl params_in_reg21089; CHECK-ANDROID-NEXT:    mov r0, r51090; CHECK-ANDROID-NEXT:    mov r1, r41091; CHECK-ANDROID-NEXT:    mov r2, r71092; CHECK-ANDROID-NEXT:    mov r3, r61093; CHECK-ANDROID-NEXT:    mov r10, r111094; CHECK-ANDROID-NEXT:    mov r8, r91095; CHECK-ANDROID-NEXT:    bl params_in_reg21096; CHECK-ANDROID-NEXT:    add sp, sp, #81097; CHECK-ANDROID-NEXT:    pop {r4, r5, r6, r7, r9, r10, r11, pc}1098  %error_ptr_ref = alloca swifterror ptr, align 81099  store ptr null, ptr %error_ptr_ref1100  call swiftcc void @params_in_reg2(i32 1, i32 2, i32 3, i32 4, ptr swiftself null, ptr nocapture swifterror %error_ptr_ref)1101  call swiftcc void @params_in_reg2(i32 %0, i32 %1, i32 %2, i32 %3, ptr swiftself %4, ptr nocapture swifterror %err)1102  ret void1103}1104declare swiftcc void @params_in_reg2(i32, i32, i32, i32, ptr swiftself, ptr nocapture swifterror %err)1105 1106define swiftcc { i32, i32, i32, i32} @params_and_return_in_reg(i32, i32, i32, i32, ptr swiftself, ptr nocapture swifterror %err) {1107; CHECK-APPLE-LABEL: params_and_return_in_reg:1108; CHECK-APPLE:       @ %bb.0:1109; CHECK-APPLE-NEXT:    push {r4, r5, r6, r7, r10, r11, lr}1110; CHECK-APPLE-NEXT:    add r7, sp, #201111; CHECK-APPLE-NEXT:    sub sp, sp, #201112; CHECK-APPLE-NEXT:    bfc sp, #0, #31113; CHECK-APPLE-NEXT:    mov r6, r81114; CHECK-APPLE-NEXT:    str r10, [sp, #12] @ 4-byte Spill1115; CHECK-APPLE-NEXT:    str r3, [sp, #8] @ 4-byte Spill1116; CHECK-APPLE-NEXT:    mov r4, r21117; CHECK-APPLE-NEXT:    mov r11, r11118; CHECK-APPLE-NEXT:    mov r5, r01119; CHECK-APPLE-NEXT:    mov r0, #11120; CHECK-APPLE-NEXT:    mov r1, #21121; CHECK-APPLE-NEXT:    mov r2, #31122; CHECK-APPLE-NEXT:    mov r3, #41123; CHECK-APPLE-NEXT:    mov r10, #01124; CHECK-APPLE-NEXT:    mov r8, #01125; CHECK-APPLE-NEXT:    bl _params_in_reg21126; CHECK-APPLE-NEXT:    ldr r3, [sp, #8] @ 4-byte Reload1127; CHECK-APPLE-NEXT:    mov r0, r51128; CHECK-APPLE-NEXT:    ldr r10, [sp, #12] @ 4-byte Reload1129; CHECK-APPLE-NEXT:    mov r1, r111130; CHECK-APPLE-NEXT:    str r8, [sp, #4] @ 4-byte Spill1131; CHECK-APPLE-NEXT:    mov r2, r41132; CHECK-APPLE-NEXT:    mov r8, r61133; CHECK-APPLE-NEXT:    bl _params_and_return_in_reg21134; CHECK-APPLE-NEXT:    str r8, [sp, #12] @ 4-byte Spill1135; CHECK-APPLE-NEXT:    mov r4, r01136; CHECK-APPLE-NEXT:    ldr r8, [sp, #4] @ 4-byte Reload1137; CHECK-APPLE-NEXT:    mov r5, r11138; CHECK-APPLE-NEXT:    mov r6, r21139; CHECK-APPLE-NEXT:    mov r11, r31140; CHECK-APPLE-NEXT:    mov r0, #11141; CHECK-APPLE-NEXT:    mov r1, #21142; CHECK-APPLE-NEXT:    mov r2, #31143; CHECK-APPLE-NEXT:    mov r3, #41144; CHECK-APPLE-NEXT:    mov r10, #01145; CHECK-APPLE-NEXT:    bl _params_in_reg21146; CHECK-APPLE-NEXT:    mov r0, r41147; CHECK-APPLE-NEXT:    mov r1, r51148; CHECK-APPLE-NEXT:    mov r2, r61149; CHECK-APPLE-NEXT:    mov r3, r111150; CHECK-APPLE-NEXT:    ldr r8, [sp, #12] @ 4-byte Reload1151; CHECK-APPLE-NEXT:    sub sp, r7, #201152; CHECK-APPLE-NEXT:    pop {r4, r5, r6, r7, r10, r11, pc}1153;1154; CHECK-O0-LABEL: params_and_return_in_reg:1155; CHECK-O0:       @ %bb.0:1156; CHECK-O0-NEXT:    push	{r7, r10, lr}1157; CHECK-O0-NEXT:    add	r7, sp, #41158; CHECK-O0-NEXT:    sub	sp, sp, #761159; CHECK-O0-NEXT:    bfc	sp, #0, #31160; CHECK-O0-NEXT:    str	r8, [sp, #24] @ 4-byte Spill1161; CHECK-O0-NEXT:    str	r10, [sp, #4] @ 4-byte Spill1162; CHECK-O0-NEXT:    str	r3, [sp, #20] @ 4-byte Spill1163; CHECK-O0-NEXT:    str	r2, [sp, #16] @ 4-byte Spill1164; CHECK-O0-NEXT:    str	r1, [sp, #12] @ 4-byte Spill1165; CHECK-O0-NEXT:    str	r0, [sp, #8] @ 4-byte Spill1166; CHECK-O0-NEXT:    @ implicit-def: $r01167; CHECK-O0-NEXT:    mov	r8, #01168; CHECK-O0-NEXT:    str	r8, [sp, #28] @ 4-byte Spill1169; CHECK-O0-NEXT:    mov	r0, #11170; CHECK-O0-NEXT:    str	r0, [sp, #32] @ 4-byte Spill1171; CHECK-O0-NEXT:    mov	r1, #21172; CHECK-O0-NEXT:    str	r1, [sp, #36] @ 4-byte Spill1173; CHECK-O0-NEXT:    mov	r2, #31174; CHECK-O0-NEXT:    str	r2, [sp, #40] @ 4-byte Spill1175; CHECK-O0-NEXT:    mov	r3, #41176; CHECK-O0-NEXT:    str	r3, [sp, #44] @ 4-byte Spill1177; CHECK-O0-NEXT:    mov	r10, r81178; CHECK-O0-NEXT:    bl	_params_in_reg21179; CHECK-O0-NEXT:    ldr	r10, [sp, #4] @ 4-byte Reload1180; CHECK-O0-NEXT:    ldr	r0, [sp, #8] @ 4-byte Reload1181; CHECK-O0-NEXT:    ldr	r1, [sp, #12] @ 4-byte Reload1182; CHECK-O0-NEXT:    ldr	r2, [sp, #16] @ 4-byte Reload1183; CHECK-O0-NEXT:    ldr	r3, [sp, #20] @ 4-byte Reload1184; CHECK-O0-NEXT:    mov	r9, r81185; CHECK-O0-NEXT:    ldr	r8, [sp, #24] @ 4-byte Reload1186; CHECK-O0-NEXT:    str	r9, [sp, #48] @ 4-byte Spill1187; CHECK-O0-NEXT:    bl	_params_and_return_in_reg21188; CHECK-O0-NEXT:    ldr	r10, [sp, #28] @ 4-byte Reload1189; CHECK-O0-NEXT:    mov	r9, r01190; CHECK-O0-NEXT:    ldr	r0, [sp, #32] @ 4-byte Reload1191; CHECK-O0-NEXT:    str	r9, [sp, #52] @ 4-byte Spill1192; CHECK-O0-NEXT:    mov	r9, r11193; CHECK-O0-NEXT:    ldr	r1, [sp, #36] @ 4-byte Reload1194; CHECK-O0-NEXT:    str	r9, [sp, #56] @ 4-byte Spill1195; CHECK-O0-NEXT:    mov	r9, r21196; CHECK-O0-NEXT:    ldr	r2, [sp, #40] @ 4-byte Reload1197; CHECK-O0-NEXT:    str	r9, [sp, #60] @ 4-byte Spill1198; CHECK-O0-NEXT:    mov	r9, r31199; CHECK-O0-NEXT:    ldr	r3, [sp, #44] @ 4-byte Reload1200; CHECK-O0-NEXT:    str	r9, [sp, #64] @ 4-byte Spill1201; CHECK-O0-NEXT:    mov	r9, r81202; CHECK-O0-NEXT:    ldr	r8, [sp, #48] @ 4-byte Reload1203; CHECK-O0-NEXT:    str	r9, [sp, #68] @ 4-byte Spill1204; CHECK-O0-NEXT:    bl	_params_in_reg21205; CHECK-O0-NEXT:    ldr	r0, [sp, #52] @ 4-byte Reload1206; CHECK-O0-NEXT:    ldr	r1, [sp, #56] @ 4-byte Reload1207; CHECK-O0-NEXT:    ldr	r2, [sp, #60] @ 4-byte Reload1208; CHECK-O0-NEXT:    ldr	r3, [sp, #64] @ 4-byte Reload1209; CHECK-O0-NEXT:    mov	r9, r81210; CHECK-O0-NEXT:    ldr	r8, [sp, #68] @ 4-byte Reload1211; CHECK-O0-NEXT:    sub	sp, r7, #41212; CHECK-O0-NEXT:    pop	{r7, r10, pc}1213;1214; CHECK-ANDROID-LABEL: params_and_return_in_reg:1215; CHECK-ANDROID:       @ %bb.0:1216; CHECK-ANDROID-NEXT:    .save {r4, r5, r6, r7, r9, r10, r11, lr}1217; CHECK-ANDROID-NEXT:    push {r4, r5, r6, r7, r9, r10, r11, lr}1218; CHECK-ANDROID-NEXT:    .pad #161219; CHECK-ANDROID-NEXT:    sub sp, sp, #161220; CHECK-ANDROID-NEXT:    str r8, [sp, #4] @ 4-byte Spill1221; CHECK-ANDROID-NEXT:    mov r11, r101222; CHECK-ANDROID-NEXT:    mov r6, r31223; CHECK-ANDROID-NEXT:    mov r7, r21224; CHECK-ANDROID-NEXT:    mov r4, r11225; CHECK-ANDROID-NEXT:    mov r5, r01226; CHECK-ANDROID-NEXT:    mov r0, #11227; CHECK-ANDROID-NEXT:    mov r1, #21228; CHECK-ANDROID-NEXT:    mov r2, #31229; CHECK-ANDROID-NEXT:    mov r3, #41230; CHECK-ANDROID-NEXT:    mov r10, #01231; CHECK-ANDROID-NEXT:    mov r8, #01232; CHECK-ANDROID-NEXT:    bl params_in_reg21233; CHECK-ANDROID-NEXT:    mov r9, r81234; CHECK-ANDROID-NEXT:    ldr r8, [sp, #4] @ 4-byte Reload1235; CHECK-ANDROID-NEXT:    mov r0, r51236; CHECK-ANDROID-NEXT:    mov r1, r41237; CHECK-ANDROID-NEXT:    mov r2, r71238; CHECK-ANDROID-NEXT:    mov r3, r61239; CHECK-ANDROID-NEXT:    mov r10, r111240; CHECK-ANDROID-NEXT:    bl params_and_return_in_reg21241; CHECK-ANDROID-NEXT:    mov r4, r01242; CHECK-ANDROID-NEXT:    mov r5, r11243; CHECK-ANDROID-NEXT:    mov r6, r21244; CHECK-ANDROID-NEXT:    mov r7, r31245; CHECK-ANDROID-NEXT:    mov r11, r81246; CHECK-ANDROID-NEXT:    mov r0, #11247; CHECK-ANDROID-NEXT:    mov r1, #21248; CHECK-ANDROID-NEXT:    mov r2, #31249; CHECK-ANDROID-NEXT:    mov r3, #41250; CHECK-ANDROID-NEXT:    mov r10, #01251; CHECK-ANDROID-NEXT:    mov r8, r91252; CHECK-ANDROID-NEXT:    bl params_in_reg21253; CHECK-ANDROID-NEXT:    mov r0, r41254; CHECK-ANDROID-NEXT:    mov r1, r51255; CHECK-ANDROID-NEXT:    mov r2, r61256; CHECK-ANDROID-NEXT:    mov r3, r71257; CHECK-ANDROID-NEXT:    mov r8, r111258; CHECK-ANDROID-NEXT:    add sp, sp, #161259; CHECK-ANDROID-NEXT:    pop {r4, r5, r6, r7, r9, r10, r11, pc}1260  %error_ptr_ref = alloca swifterror ptr, align 81261  store ptr null, ptr %error_ptr_ref1262  call swiftcc void @params_in_reg2(i32 1, i32 2, i32 3, i32 4, ptr swiftself null, ptr nocapture swifterror %error_ptr_ref)1263  %val = call swiftcc  { i32, i32, i32, i32 } @params_and_return_in_reg2(i32 %0, i32 %1, i32 %2, i32 %3, ptr swiftself %4, ptr nocapture swifterror %err)1264  call swiftcc void @params_in_reg2(i32 1, i32 2, i32 3, i32 4, ptr swiftself null, ptr nocapture swifterror %error_ptr_ref)1265  ret { i32, i32, i32, i32 }%val1266}1267 1268declare swiftcc { i32, i32, i32, i32 } @params_and_return_in_reg2(i32, i32, i32, i32, ptr swiftself, ptr nocapture swifterror %err)1269 1270 1271declare void @acallee(ptr)1272 1273; Make sure we don't tail call if the caller returns a swifterror value. We1274; would have to move into the swifterror register before the tail call.1275define swiftcc void @tailcall_from_swifterror(ptr swifterror %error_ptr_ref) {1276; CHECK-APPLE-LABEL: tailcall_from_swifterror:1277; CHECK-APPLE:       @ %bb.0: @ %entry1278; CHECK-APPLE-NEXT:    push {r4, lr}1279; CHECK-APPLE-NEXT:    mov r0, #01280; CHECK-APPLE-NEXT:    mov r4, r81281; CHECK-APPLE-NEXT:    bl _acallee1282; CHECK-APPLE-NEXT:    mov r8, r41283; CHECK-APPLE-NEXT:    pop {r4, pc}1284;1285; CHECK-O0-LABEL: tailcall_from_swifterror:1286; CHECK-O0:       @ %bb.0: @ %entry1287; CHECK-O0-NEXT:    push {r7, lr}1288; CHECK-O0-NEXT:    mov r7, sp1289; CHECK-O0-NEXT:    sub sp, sp, #41290; CHECK-O0-NEXT:    str r8, [sp] @ 4-byte Spill1291; CHECK-O0-NEXT:    mov r0, #01292; CHECK-O0-NEXT:    bl _acallee1293; CHECK-O0-NEXT:    ldr r8, [sp] @ 4-byte Reload1294; CHECK-O0-NEXT:    mov sp, r71295; CHECK-O0-NEXT:    pop {r7, pc}1296;1297; CHECK-ANDROID-LABEL: tailcall_from_swifterror:1298; CHECK-ANDROID:       @ %bb.0: @ %entry1299; CHECK-ANDROID-NEXT:    .save {r4, lr}1300; CHECK-ANDROID-NEXT:    push {r4, lr}1301; CHECK-ANDROID-NEXT:    mov r0, #01302; CHECK-ANDROID-NEXT:    mov r4, r81303; CHECK-ANDROID-NEXT:    bl acallee1304; CHECK-ANDROID-NEXT:    mov r8, r41305; CHECK-ANDROID-NEXT:    pop {r4, pc}1306entry:1307  tail call void @acallee(ptr null)1308  ret void1309}1310 1311 1312declare swiftcc void @foo2(ptr swifterror)1313 1314; Make sure we properly assign registers during fast-isel.1315define swiftcc ptr @testAssign(ptr %error_ref) {1316; CHECK-APPLE-LABEL: testAssign:1317; CHECK-APPLE:       @ %bb.0: @ %entry1318; CHECK-APPLE-NEXT:    push {r8, lr}1319; CHECK-APPLE-NEXT:    sub sp, sp, #41320; CHECK-APPLE-NEXT:    mov r8, #01321; CHECK-APPLE-NEXT:    bl _foo21322; CHECK-APPLE-NEXT:    mov r0, r81323; CHECK-APPLE-NEXT:    add sp, sp, #41324; CHECK-APPLE-NEXT:    pop {r8, pc}1325;1326; CHECK-O0-LABEL: testAssign:1327; CHECK-O0:       @ %bb.0: @ %entry1328; CHECK-O0-NEXT:    push	{r7, r8, lr}1329; CHECK-O0-NEXT:    add	r7, sp, #41330; CHECK-O0-NEXT:    sub	sp, sp, #81331; CHECK-O0-NEXT:    @ implicit-def: $r11332; CHECK-O0-NEXT:    mov	r8, #01333; CHECK-O0-NEXT:    bl	_foo21334; CHECK-O0-NEXT:    str	r8, [sp] @ 4-byte Spill1335; CHECK-O0-NEXT:  @ %bb.1: @ %a1336; CHECK-O0-NEXT:    ldr r0, [sp] @ 4-byte Reload1337; CHECK-O0-NEXT:    sub sp, r7, #41338; CHECK-O0-NEXT:    pop	{r7, r8, pc}1339;1340; CHECK-ANDROID-LABEL: testAssign:1341; CHECK-ANDROID:       @ %bb.0: @ %entry1342; CHECK-ANDROID-NEXT:    .save {r8, lr}1343; CHECK-ANDROID-NEXT:    push {r8, lr}1344; CHECK-ANDROID-NEXT:    .pad #81345; CHECK-ANDROID-NEXT:    sub sp, sp, #81346; CHECK-ANDROID-NEXT:    mov r8, #01347; CHECK-ANDROID-NEXT:    bl foo21348; CHECK-ANDROID-NEXT:    mov r0, r81349; CHECK-ANDROID-NEXT:    add sp, sp, #81350; CHECK-ANDROID-NEXT:    pop {r8, pc}1351entry:1352  %error_ptr = alloca swifterror ptr1353  store ptr null, ptr %error_ptr1354  call swiftcc void @foo2(ptr swifterror %error_ptr)1355  br label %a1356 1357a:1358  %error = load ptr, ptr %error_ptr1359  ret ptr %error1360}1361