brintos

brintos / llvm-project-archived public Read only

0
0
Text · 78.3 KiB · 5699c44 Raw
2086 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --no_x86_scrub_sp2; RUN: llc -verify-machineinstrs < %s -mtriple=x86_64-apple-darwin -disable-block-placement | FileCheck --check-prefix=CHECK-APPLE %s3; RUN: llc -verify-machineinstrs -O0 < %s -mtriple=x86_64-apple-darwin -disable-block-placement | FileCheck --check-prefix=CHECK-O0 %s4; RUN: llc -verify-machineinstrs < %s -mtriple=i386-apple-darwin -disable-block-placement | FileCheck --check-prefix=CHECK-i386 %s5 6declare ptr @malloc(i64)7declare void @free(ptr)8%swift_error = type {i64, i8}9 10; This tests the basic usage of a swifterror parameter. "foo" is the function11; that takes a swifterror parameter and "caller" is the caller of "foo".12define float @foo(ptr swifterror %error_ptr_ref) {13; CHECK-APPLE-LABEL: foo:14; CHECK-APPLE:       ## %bb.0: ## %entry15; CHECK-APPLE-NEXT:    pushq %rax16; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 1617; CHECK-APPLE-NEXT:    movl $16, %edi18; CHECK-APPLE-NEXT:    callq _malloc19; CHECK-APPLE-NEXT:    movb $1, 8(%rax)20; CHECK-APPLE-NEXT:    movss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]21; CHECK-APPLE-NEXT:    movq %rax, %r1222; CHECK-APPLE-NEXT:    popq %rax23; CHECK-APPLE-NEXT:    retq24;25; CHECK-O0-LABEL: foo:26; CHECK-O0:       ## %bb.0: ## %entry27; CHECK-O0-NEXT:    pushq %rax28; CHECK-O0-NEXT:    .cfi_def_cfa_offset 1629; CHECK-O0-NEXT:    movl $16, %edi30; CHECK-O0-NEXT:    callq _malloc31; CHECK-O0-NEXT:    movq %rax, %r1232; CHECK-O0-NEXT:    movb $1, 8(%rax)33; CHECK-O0-NEXT:    movss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]34; CHECK-O0-NEXT:    popq %rax35; CHECK-O0-NEXT:    retq36;37; CHECK-i386-LABEL: foo:38; CHECK-i386:       ## %bb.0: ## %entry39; CHECK-i386-NEXT:    pushl %esi40; CHECK-i386-NEXT:    .cfi_def_cfa_offset 841; CHECK-i386-NEXT:    subl $8, %esp42; CHECK-i386-NEXT:    .cfi_def_cfa_offset 1643; CHECK-i386-NEXT:    .cfi_offset %esi, -844; CHECK-i386-NEXT:    movl 16(%esp), %esi45; CHECK-i386-NEXT:    movl $0, 4(%esp)46; CHECK-i386-NEXT:    movl $16, (%esp)47; CHECK-i386-NEXT:    calll _malloc48; CHECK-i386-NEXT:    movl %eax, (%esi)49; CHECK-i386-NEXT:    movb $1, 8(%eax)50; CHECK-i386-NEXT:    fld151; CHECK-i386-NEXT:    addl $8, %esp52; CHECK-i386-NEXT:    popl %esi53; CHECK-i386-NEXT:    retl54 55entry:56  %call = call ptr @malloc(i64 16)57  store ptr %call, ptr %error_ptr_ref58  %tmp = getelementptr inbounds i8, ptr %call, i64 859  store i8 1, ptr %tmp60  ret float 1.061}62 63; "caller" calls "foo" that takes a swifterror parameter.64define float @caller(ptr %error_ref) {65; CHECK-APPLE-LABEL: caller:66; CHECK-APPLE:       ## %bb.0: ## %entry67; CHECK-APPLE-NEXT:    pushq %r1268; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 1669; CHECK-APPLE-NEXT:    pushq %rbx70; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 2471; CHECK-APPLE-NEXT:    pushq %rax72; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 3273; CHECK-APPLE-NEXT:    .cfi_offset %rbx, -2474; CHECK-APPLE-NEXT:    .cfi_offset %r12, -1675; CHECK-APPLE-NEXT:    movq %rdi, %rbx76; CHECK-APPLE-NEXT:    xorl %r12d, %r12d77; CHECK-APPLE-NEXT:    callq _foo78; CHECK-APPLE-NEXT:    movq %r12, %rdi79; CHECK-APPLE-NEXT:    testq %r12, %r1280; CHECK-APPLE-NEXT:    jne LBB1_281; CHECK-APPLE-NEXT:  ## %bb.1: ## %cont82; CHECK-APPLE-NEXT:    movzbl 8(%rdi), %eax83; CHECK-APPLE-NEXT:    movb %al, (%rbx)84; CHECK-APPLE-NEXT:  LBB1_2: ## %handler85; CHECK-APPLE-NEXT:    callq _free86; CHECK-APPLE-NEXT:    movss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]87; CHECK-APPLE-NEXT:    addq $8, %rsp88; CHECK-APPLE-NEXT:    popq %rbx89; CHECK-APPLE-NEXT:    popq %r1290; CHECK-APPLE-NEXT:    retq91;92; CHECK-O0-LABEL: caller:93; CHECK-O0:       ## %bb.0: ## %entry94; CHECK-O0-NEXT:    pushq %r1295; CHECK-O0-NEXT:    .cfi_def_cfa_offset 1696; CHECK-O0-NEXT:    subq $32, %rsp97; CHECK-O0-NEXT:    .cfi_def_cfa_offset 4898; CHECK-O0-NEXT:    .cfi_offset %r12, -1699; CHECK-O0-NEXT:    ## implicit-def: $rax100; CHECK-O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill101; CHECK-O0-NEXT:    xorl %eax, %eax102; CHECK-O0-NEXT:    movl %eax, %r12d103; CHECK-O0-NEXT:    callq _foo104; CHECK-O0-NEXT:    movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill105; CHECK-O0-NEXT:    cmpq $0, %r12106; CHECK-O0-NEXT:    jne LBB1_2107; CHECK-O0-NEXT:  ## %bb.1: ## %cont108; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax ## 8-byte Reload109; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx ## 8-byte Reload110; CHECK-O0-NEXT:    movb 8(%rcx), %cl111; CHECK-O0-NEXT:    movb %cl, (%rax)112; CHECK-O0-NEXT:  LBB1_2: ## %handler113; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdi ## 8-byte Reload114; CHECK-O0-NEXT:    callq _free115; CHECK-O0-NEXT:    movss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]116; CHECK-O0-NEXT:    addq $32, %rsp117; CHECK-O0-NEXT:    popq %r12118; CHECK-O0-NEXT:    retq119;120; CHECK-i386-LABEL: caller:121; CHECK-i386:       ## %bb.0: ## %entry122; CHECK-i386-NEXT:    subl $12, %esp123; CHECK-i386-NEXT:    .cfi_def_cfa_offset 16124; CHECK-i386-NEXT:    movl $0, 8(%esp)125; CHECK-i386-NEXT:    leal 8(%esp), %eax126; CHECK-i386-NEXT:    movl %eax, (%esp)127; CHECK-i386-NEXT:    calll _foo128; CHECK-i386-NEXT:    fstp %st(0)129; CHECK-i386-NEXT:    movl 8(%esp), %eax130; CHECK-i386-NEXT:    testl %eax, %eax131; CHECK-i386-NEXT:    jne LBB1_2132; CHECK-i386-NEXT:  ## %bb.1: ## %cont133; CHECK-i386-NEXT:    movl 16(%esp), %ecx134; CHECK-i386-NEXT:    movzbl 8(%eax), %edx135; CHECK-i386-NEXT:    movb %dl, (%ecx)136; CHECK-i386-NEXT:  LBB1_2: ## %handler137; CHECK-i386-NEXT:    movl %eax, (%esp)138; CHECK-i386-NEXT:    calll _free139; CHECK-i386-NEXT:    fld1140; CHECK-i386-NEXT:    addl $12, %esp141; CHECK-i386-NEXT:    retl142; Access part of the error object and save it to error_ref143 144entry:145  %error_ptr_ref = alloca swifterror ptr146  store ptr null, ptr %error_ptr_ref147  %call = call float @foo(ptr swifterror %error_ptr_ref)148  %error_from_foo = load ptr, ptr %error_ptr_ref149  %had_error_from_foo = icmp ne ptr %error_from_foo, null150  br i1 %had_error_from_foo, label %handler, label %cont151cont:152  %v1 = getelementptr inbounds %swift_error, ptr %error_from_foo, i64 0, i32 1153  %t = load i8, ptr %v1154  store i8 %t, ptr %error_ref155  br label %handler156handler:157  call void @free(ptr %error_from_foo)158  ret float 1.0159}160 161; "caller2" is the caller of "foo", it calls "foo" inside a loop.162define float @caller2(ptr %error_ref) {163; CHECK-APPLE-LABEL: caller2:164; CHECK-APPLE:       ## %bb.0: ## %entry165; CHECK-APPLE-NEXT:    pushq %r12166; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 16167; CHECK-APPLE-NEXT:    pushq %rbx168; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 24169; CHECK-APPLE-NEXT:    pushq %rax170; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 32171; CHECK-APPLE-NEXT:    .cfi_offset %rbx, -24172; CHECK-APPLE-NEXT:    .cfi_offset %r12, -16173; CHECK-APPLE-NEXT:    movq %rdi, %rbx174; CHECK-APPLE-NEXT:  LBB2_1: ## %bb_loop175; CHECK-APPLE-NEXT:    ## =>This Inner Loop Header: Depth=1176; CHECK-APPLE-NEXT:    xorl %r12d, %r12d177; CHECK-APPLE-NEXT:    callq _foo178; CHECK-APPLE-NEXT:    testq %r12, %r12179; CHECK-APPLE-NEXT:    jne LBB2_4180; CHECK-APPLE-NEXT:  ## %bb.2: ## %cont181; CHECK-APPLE-NEXT:    ## in Loop: Header=BB2_1 Depth=1182; CHECK-APPLE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0183; CHECK-APPLE-NEXT:    jbe LBB2_1184; CHECK-APPLE-NEXT:  ## %bb.3: ## %bb_end185; CHECK-APPLE-NEXT:    movzbl 8(%r12), %eax186; CHECK-APPLE-NEXT:    movb %al, (%rbx)187; CHECK-APPLE-NEXT:  LBB2_4: ## %handler188; CHECK-APPLE-NEXT:    movq %r12, %rdi189; CHECK-APPLE-NEXT:    callq _free190; CHECK-APPLE-NEXT:    movss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]191; CHECK-APPLE-NEXT:    addq $8, %rsp192; CHECK-APPLE-NEXT:    popq %rbx193; CHECK-APPLE-NEXT:    popq %r12194; CHECK-APPLE-NEXT:    retq195;196; CHECK-O0-LABEL: caller2:197; CHECK-O0:       ## %bb.0: ## %entry198; CHECK-O0-NEXT:    pushq %r12199; CHECK-O0-NEXT:    .cfi_def_cfa_offset 16200; CHECK-O0-NEXT:    subq $32, %rsp201; CHECK-O0-NEXT:    .cfi_def_cfa_offset 48202; CHECK-O0-NEXT:    .cfi_offset %r12, -16203; CHECK-O0-NEXT:    ## implicit-def: $rax204; CHECK-O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill205; CHECK-O0-NEXT:  LBB2_1: ## %bb_loop206; CHECK-O0-NEXT:    ## =>This Inner Loop Header: Depth=1207; CHECK-O0-NEXT:    xorl %eax, %eax208; CHECK-O0-NEXT:    movl %eax, %r12d209; CHECK-O0-NEXT:    callq _foo210; CHECK-O0-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 4-byte Spill211; CHECK-O0-NEXT:    movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill212; CHECK-O0-NEXT:    cmpq $0, %r12213; CHECK-O0-NEXT:    jne LBB2_4214; CHECK-O0-NEXT:  ## %bb.2: ## %cont215; CHECK-O0-NEXT:    ## in Loop: Header=BB2_1 Depth=1216; CHECK-O0-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 4-byte Reload217; CHECK-O0-NEXT:    ## xmm0 = mem[0],zero,zero,zero218; CHECK-O0-NEXT:    movss {{.*#+}} xmm1 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]219; CHECK-O0-NEXT:    ucomiss %xmm1, %xmm0220; CHECK-O0-NEXT:    jbe LBB2_1221; CHECK-O0-NEXT:  ## %bb.3: ## %bb_end222; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax ## 8-byte Reload223; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx ## 8-byte Reload224; CHECK-O0-NEXT:    movb 8(%rcx), %cl225; CHECK-O0-NEXT:    movb %cl, (%rax)226; CHECK-O0-NEXT:  LBB2_4: ## %handler227; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdi ## 8-byte Reload228; CHECK-O0-NEXT:    callq _free229; CHECK-O0-NEXT:    movss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]230; CHECK-O0-NEXT:    addq $32, %rsp231; CHECK-O0-NEXT:    popq %r12232; CHECK-O0-NEXT:    retq233;234; CHECK-i386-LABEL: caller2:235; CHECK-i386:       ## %bb.0: ## %entry236; CHECK-i386-NEXT:    pushl %edi237; CHECK-i386-NEXT:    .cfi_def_cfa_offset 8238; CHECK-i386-NEXT:    pushl %esi239; CHECK-i386-NEXT:    .cfi_def_cfa_offset 12240; CHECK-i386-NEXT:    subl $20, %esp241; CHECK-i386-NEXT:    .cfi_def_cfa_offset 32242; CHECK-i386-NEXT:    .cfi_offset %esi, -12243; CHECK-i386-NEXT:    .cfi_offset %edi, -8244; CHECK-i386-NEXT:    movl 32(%esp), %esi245; CHECK-i386-NEXT:    leal 16(%esp), %edi246; CHECK-i386-NEXT:  LBB2_1: ## %bb_loop247; CHECK-i386-NEXT:    ## =>This Inner Loop Header: Depth=1248; CHECK-i386-NEXT:    movl $0, 16(%esp)249; CHECK-i386-NEXT:    movl %edi, (%esp)250; CHECK-i386-NEXT:    calll _foo251; CHECK-i386-NEXT:    movl 16(%esp), %ecx252; CHECK-i386-NEXT:    testl %ecx, %ecx253; CHECK-i386-NEXT:    jne LBB2_4254; CHECK-i386-NEXT:  ## %bb.2: ## %cont255; CHECK-i386-NEXT:    ## in Loop: Header=BB2_1 Depth=1256; CHECK-i386-NEXT:    fld1257; CHECK-i386-NEXT:    fxch %st(1)258; CHECK-i386-NEXT:    fucompp259; CHECK-i386-NEXT:    fnstsw %ax260; CHECK-i386-NEXT:    ## kill: def $ah killed $ah killed $ax261; CHECK-i386-NEXT:    sahf262; CHECK-i386-NEXT:    jbe LBB2_1263; CHECK-i386-NEXT:  ## %bb.3: ## %bb_end264; CHECK-i386-NEXT:    movzbl 8(%ecx), %eax265; CHECK-i386-NEXT:    movb %al, (%esi)266; CHECK-i386-NEXT:    fldz267; CHECK-i386-NEXT:  LBB2_4: ## %handler268; CHECK-i386-NEXT:    fstp %st(0)269; CHECK-i386-NEXT:    movl %ecx, (%esp)270; CHECK-i386-NEXT:    calll _free271; CHECK-i386-NEXT:    fld1272; CHECK-i386-NEXT:    addl $20, %esp273; CHECK-i386-NEXT:    popl %esi274; CHECK-i386-NEXT:    popl %edi275; CHECK-i386-NEXT:    retl276; Access part of the error object and save it to error_ref277 278entry:279  %error_ptr_ref = alloca swifterror ptr280  br label %bb_loop281bb_loop:282  store ptr null, ptr %error_ptr_ref283  %call = call float @foo(ptr swifterror %error_ptr_ref)284  %error_from_foo = load ptr, ptr %error_ptr_ref285  %had_error_from_foo = icmp ne ptr %error_from_foo, null286  br i1 %had_error_from_foo, label %handler, label %cont287cont:288  %cmp = fcmp ogt float %call, 1.000000e+00289  br i1 %cmp, label %bb_end, label %bb_loop290bb_end:291  %v1 = getelementptr inbounds %swift_error, ptr %error_from_foo, i64 0, i32 1292  %t = load i8, ptr %v1293  store i8 %t, ptr %error_ref294  br label %handler295handler:296  call void @free(ptr %error_from_foo)297  ret float 1.0298}299 300; "foo_if" is a function that takes a swifterror parameter, it sets swifterror301; under a certain condition.302define float @foo_if(ptr swifterror %error_ptr_ref, i32 %cc) {303; CHECK-APPLE-LABEL: foo_if:304; CHECK-APPLE:       ## %bb.0: ## %entry305; CHECK-APPLE-NEXT:    testl %edi, %edi306; CHECK-APPLE-NEXT:    je LBB3_2307; CHECK-APPLE-NEXT:  ## %bb.1: ## %gen_error308; CHECK-APPLE-NEXT:    pushq %rax309; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 16310; CHECK-APPLE-NEXT:    movl $16, %edi311; CHECK-APPLE-NEXT:    callq _malloc312; CHECK-APPLE-NEXT:    movb $1, 8(%rax)313; CHECK-APPLE-NEXT:    movss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]314; CHECK-APPLE-NEXT:    movq %rax, %r12315; CHECK-APPLE-NEXT:    popq %rax316; CHECK-APPLE-NEXT:    retq317; CHECK-APPLE-NEXT:  LBB3_2: ## %normal318; CHECK-APPLE-NEXT:    xorps %xmm0, %xmm0319; CHECK-APPLE-NEXT:    retq320;321; CHECK-O0-LABEL: foo_if:322; CHECK-O0:       ## %bb.0: ## %entry323; CHECK-O0-NEXT:    pushq %rax324; CHECK-O0-NEXT:    .cfi_def_cfa_offset 16325; CHECK-O0-NEXT:    movq %r12, (%rsp) ## 8-byte Spill326; CHECK-O0-NEXT:    cmpl $0, %edi327; CHECK-O0-NEXT:    je LBB3_2328; CHECK-O0-NEXT:  ## %bb.1: ## %gen_error329; CHECK-O0-NEXT:    movl $16, %edi330; CHECK-O0-NEXT:    callq _malloc331; CHECK-O0-NEXT:    movq %rax, %r12332; CHECK-O0-NEXT:    movb $1, 8(%rax)333; CHECK-O0-NEXT:    movss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]334; CHECK-O0-NEXT:    popq %rax335; CHECK-O0-NEXT:    retq336; CHECK-O0-NEXT:  LBB3_2: ## %normal337; CHECK-O0-NEXT:    movq (%rsp), %r12 ## 8-byte Reload338; CHECK-O0-NEXT:    xorps %xmm0, %xmm0339; CHECK-O0-NEXT:    popq %rax340; CHECK-O0-NEXT:    retq341;342; CHECK-i386-LABEL: foo_if:343; CHECK-i386:       ## %bb.0: ## %entry344; CHECK-i386-NEXT:    pushl %esi345; CHECK-i386-NEXT:    .cfi_def_cfa_offset 8346; CHECK-i386-NEXT:    subl $8, %esp347; CHECK-i386-NEXT:    .cfi_def_cfa_offset 16348; CHECK-i386-NEXT:    .cfi_offset %esi, -8349; CHECK-i386-NEXT:    cmpl $0, 20(%esp)350; CHECK-i386-NEXT:    je LBB3_2351; CHECK-i386-NEXT:  ## %bb.1: ## %gen_error352; CHECK-i386-NEXT:    movl 16(%esp), %esi353; CHECK-i386-NEXT:    movl $0, 4(%esp)354; CHECK-i386-NEXT:    movl $16, (%esp)355; CHECK-i386-NEXT:    calll _malloc356; CHECK-i386-NEXT:    movl %eax, (%esi)357; CHECK-i386-NEXT:    movb $1, 8(%eax)358; CHECK-i386-NEXT:    fld1359; CHECK-i386-NEXT:    jmp LBB3_3360; CHECK-i386-NEXT:  LBB3_2: ## %normal361; CHECK-i386-NEXT:    fldz362; CHECK-i386-NEXT:  LBB3_3: ## %normal363; CHECK-i386-NEXT:    addl $8, %esp364; CHECK-i386-NEXT:    popl %esi365; CHECK-i386-NEXT:    retl366 367; spill to stack368; reload from stack369entry:370  %cond = icmp ne i32 %cc, 0371  br i1 %cond, label %gen_error, label %normal372 373gen_error:374  %call = call ptr @malloc(i64 16)375  store ptr %call, ptr %error_ptr_ref376  %tmp = getelementptr inbounds i8, ptr %call, i64 8377  store i8 1, ptr %tmp378  ret float 1.0379 380normal:381  ret float 0.0382}383 384; "foo_loop" is a function that takes a swifterror parameter, it sets swifterror385; under a certain condition inside a loop.386define float @foo_loop(ptr swifterror %error_ptr_ref, i32 %cc, float %cc2) {387; CHECK-APPLE-LABEL: foo_loop:388; CHECK-APPLE:       ## %bb.0: ## %entry389; CHECK-APPLE-NEXT:    pushq %rbx390; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 16391; CHECK-APPLE-NEXT:    subq $16, %rsp392; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 32393; CHECK-APPLE-NEXT:    .cfi_offset %rbx, -16394; CHECK-APPLE-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 4-byte Spill395; CHECK-APPLE-NEXT:    movl %edi, %ebx396; CHECK-APPLE-NEXT:    movq %r12, %rax397; CHECK-APPLE-NEXT:  LBB4_1: ## %bb_loop398; CHECK-APPLE-NEXT:    ## =>This Inner Loop Header: Depth=1399; CHECK-APPLE-NEXT:    testl %ebx, %ebx400; CHECK-APPLE-NEXT:    je LBB4_3401; CHECK-APPLE-NEXT:  ## %bb.2: ## %gen_error402; CHECK-APPLE-NEXT:    ## in Loop: Header=BB4_1 Depth=1403; CHECK-APPLE-NEXT:    movl $16, %edi404; CHECK-APPLE-NEXT:    callq _malloc405; CHECK-APPLE-NEXT:    movb $1, 8(%rax)406; CHECK-APPLE-NEXT:  LBB4_3: ## %bb_cont407; CHECK-APPLE-NEXT:    ## in Loop: Header=BB4_1 Depth=1408; CHECK-APPLE-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 4-byte Reload409; CHECK-APPLE-NEXT:    ## xmm0 = mem[0],zero,zero,zero410; CHECK-APPLE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0411; CHECK-APPLE-NEXT:    jbe LBB4_1412; CHECK-APPLE-NEXT:  ## %bb.4: ## %bb_end413; CHECK-APPLE-NEXT:    xorps %xmm0, %xmm0414; CHECK-APPLE-NEXT:    movq %rax, %r12415; CHECK-APPLE-NEXT:    addq $16, %rsp416; CHECK-APPLE-NEXT:    popq %rbx417; CHECK-APPLE-NEXT:    retq418;419; CHECK-O0-LABEL: foo_loop:420; CHECK-O0:       ## %bb.0: ## %entry421; CHECK-O0-NEXT:    subq $40, %rsp422; CHECK-O0-NEXT:    .cfi_def_cfa_offset 48423; CHECK-O0-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 4-byte Spill424; CHECK-O0-NEXT:    movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) ## 4-byte Spill425; CHECK-O0-NEXT:    movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill426; CHECK-O0-NEXT:    jmp LBB4_1427; CHECK-O0-NEXT:  LBB4_1: ## %bb_loop428; CHECK-O0-NEXT:    ## =>This Inner Loop Header: Depth=1429; CHECK-O0-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %ecx ## 4-byte Reload430; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax ## 8-byte Reload431; CHECK-O0-NEXT:    cmpl $0, %ecx432; CHECK-O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill433; CHECK-O0-NEXT:    je LBB4_3434; CHECK-O0-NEXT:  ## %bb.2: ## %gen_error435; CHECK-O0-NEXT:    ## in Loop: Header=BB4_1 Depth=1436; CHECK-O0-NEXT:    movl $16, %edi437; CHECK-O0-NEXT:    callq _malloc438; CHECK-O0-NEXT:    movq %rax, %rcx439; CHECK-O0-NEXT:    movb $1, 8(%rcx)440; CHECK-O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill441; CHECK-O0-NEXT:  LBB4_3: ## %bb_cont442; CHECK-O0-NEXT:    ## in Loop: Header=BB4_1 Depth=1443; CHECK-O0-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 4-byte Reload444; CHECK-O0-NEXT:    ## xmm0 = mem[0],zero,zero,zero445; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax ## 8-byte Reload446; CHECK-O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill447; CHECK-O0-NEXT:    movss {{.*#+}} xmm1 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]448; CHECK-O0-NEXT:    ucomiss %xmm1, %xmm0449; CHECK-O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill450; CHECK-O0-NEXT:    jbe LBB4_1451; CHECK-O0-NEXT:  ## %bb.4: ## %bb_end452; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r12 ## 8-byte Reload453; CHECK-O0-NEXT:    xorps %xmm0, %xmm0454; CHECK-O0-NEXT:    addq $40, %rsp455; CHECK-O0-NEXT:    retq456;457; CHECK-i386-LABEL: foo_loop:458; CHECK-i386:       ## %bb.0: ## %entry459; CHECK-i386-NEXT:    pushl %edi460; CHECK-i386-NEXT:    .cfi_def_cfa_offset 8461; CHECK-i386-NEXT:    pushl %esi462; CHECK-i386-NEXT:    .cfi_def_cfa_offset 12463; CHECK-i386-NEXT:    subl $20, %esp464; CHECK-i386-NEXT:    .cfi_def_cfa_offset 32465; CHECK-i386-NEXT:    .cfi_offset %esi, -12466; CHECK-i386-NEXT:    .cfi_offset %edi, -8467; CHECK-i386-NEXT:    flds 40(%esp)468; CHECK-i386-NEXT:    fstps {{[-0-9]+}}(%e{{[sb]}}p) ## 4-byte Folded Spill469; CHECK-i386-NEXT:    movl 36(%esp), %esi470; CHECK-i386-NEXT:    movl 32(%esp), %edi471; CHECK-i386-NEXT:  LBB4_1: ## %bb_loop472; CHECK-i386-NEXT:    ## =>This Inner Loop Header: Depth=1473; CHECK-i386-NEXT:    testl %esi, %esi474; CHECK-i386-NEXT:    je LBB4_3475; CHECK-i386-NEXT:  ## %bb.2: ## %gen_error476; CHECK-i386-NEXT:    ## in Loop: Header=BB4_1 Depth=1477; CHECK-i386-NEXT:    movl $0, 4(%esp)478; CHECK-i386-NEXT:    movl $16, (%esp)479; CHECK-i386-NEXT:    calll _malloc480; CHECK-i386-NEXT:    movl %eax, (%edi)481; CHECK-i386-NEXT:    movb $1, 8(%eax)482; CHECK-i386-NEXT:  LBB4_3: ## %bb_cont483; CHECK-i386-NEXT:    ## in Loop: Header=BB4_1 Depth=1484; CHECK-i386-NEXT:    flds {{[-0-9]+}}(%e{{[sb]}}p) ## 4-byte Folded Reload485; CHECK-i386-NEXT:    fld1486; CHECK-i386-NEXT:    fxch %st(1)487; CHECK-i386-NEXT:    fucompp488; CHECK-i386-NEXT:    fnstsw %ax489; CHECK-i386-NEXT:    ## kill: def $ah killed $ah killed $ax490; CHECK-i386-NEXT:    sahf491; CHECK-i386-NEXT:    jbe LBB4_1492; CHECK-i386-NEXT:  ## %bb.4: ## %bb_end493; CHECK-i386-NEXT:    fldz494; CHECK-i386-NEXT:    addl $20, %esp495; CHECK-i386-NEXT:    popl %esi496; CHECK-i386-NEXT:    popl %edi497; CHECK-i386-NEXT:    retl498 499; spill to stack500; reload from stack501entry:502  br label %bb_loop503 504bb_loop:505  %cond = icmp ne i32 %cc, 0506  br i1 %cond, label %gen_error, label %bb_cont507 508gen_error:509  %call = call ptr @malloc(i64 16)510  store ptr %call, ptr %error_ptr_ref511  %tmp = getelementptr inbounds i8, ptr %call, i64 8512  store i8 1, ptr %tmp513  br label %bb_cont514 515bb_cont:516  %cmp = fcmp ogt float %cc2, 1.000000e+00517  br i1 %cmp, label %bb_end, label %bb_loop518bb_end:519  ret float 0.0520}521 522%struct.S = type { i32, i32, i32, i32, i32, i32 }523 524; "foo_sret" is a function that takes a swifterror parameter, it also has a sret525; parameter.526define void @foo_sret(ptr sret(%struct.S) %agg.result, i32 %val1, ptr swifterror %error_ptr_ref) {527; CHECK-APPLE-LABEL: foo_sret:528; CHECK-APPLE:       ## %bb.0: ## %entry529; CHECK-APPLE-NEXT:    pushq %r14530; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 16531; CHECK-APPLE-NEXT:    pushq %rbx532; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 24533; CHECK-APPLE-NEXT:    pushq %rax534; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 32535; CHECK-APPLE-NEXT:    .cfi_offset %rbx, -24536; CHECK-APPLE-NEXT:    .cfi_offset %r14, -16537; CHECK-APPLE-NEXT:    movl %esi, %ebx538; CHECK-APPLE-NEXT:    movq %rdi, %r14539; CHECK-APPLE-NEXT:    movl $16, %edi540; CHECK-APPLE-NEXT:    callq _malloc541; CHECK-APPLE-NEXT:    movb $1, 8(%rax)542; CHECK-APPLE-NEXT:    movl %ebx, 4(%r14)543; CHECK-APPLE-NEXT:    movq %rax, %r12544; CHECK-APPLE-NEXT:    movq %r14, %rax545; CHECK-APPLE-NEXT:    addq $8, %rsp546; CHECK-APPLE-NEXT:    popq %rbx547; CHECK-APPLE-NEXT:    popq %r14548; CHECK-APPLE-NEXT:    retq549;550; CHECK-O0-LABEL: foo_sret:551; CHECK-O0:       ## %bb.0: ## %entry552; CHECK-O0-NEXT:    subq $24, %rsp553; CHECK-O0-NEXT:    .cfi_def_cfa_offset 32554; CHECK-O0-NEXT:    movl %esi, {{[-0-9]+}}(%r{{[sb]}}p) ## 4-byte Spill555; CHECK-O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill556; CHECK-O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill557; CHECK-O0-NEXT:    movl $16, %edi558; CHECK-O0-NEXT:    callq _malloc559; CHECK-O0-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %esi ## 4-byte Reload560; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdi ## 8-byte Reload561; CHECK-O0-NEXT:    movq %rax, %rcx562; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax ## 8-byte Reload563; CHECK-O0-NEXT:    movq %rcx, %r12564; CHECK-O0-NEXT:    movb $1, 8(%rcx)565; CHECK-O0-NEXT:    movl %esi, 4(%rdi)566; CHECK-O0-NEXT:    addq $24, %rsp567; CHECK-O0-NEXT:    retq568;569; CHECK-i386-LABEL: foo_sret:570; CHECK-i386:       ## %bb.0: ## %entry571; CHECK-i386-NEXT:    pushl %ebx572; CHECK-i386-NEXT:    .cfi_def_cfa_offset 8573; CHECK-i386-NEXT:    pushl %edi574; CHECK-i386-NEXT:    .cfi_def_cfa_offset 12575; CHECK-i386-NEXT:    pushl %esi576; CHECK-i386-NEXT:    .cfi_def_cfa_offset 16577; CHECK-i386-NEXT:    subl $16, %esp578; CHECK-i386-NEXT:    .cfi_def_cfa_offset 32579; CHECK-i386-NEXT:    .cfi_offset %esi, -16580; CHECK-i386-NEXT:    .cfi_offset %edi, -12581; CHECK-i386-NEXT:    .cfi_offset %ebx, -8582; CHECK-i386-NEXT:    movl 32(%esp), %esi583; CHECK-i386-NEXT:    movl 36(%esp), %edi584; CHECK-i386-NEXT:    movl 40(%esp), %ebx585; CHECK-i386-NEXT:    movl $0, 4(%esp)586; CHECK-i386-NEXT:    movl $16, (%esp)587; CHECK-i386-NEXT:    calll _malloc588; CHECK-i386-NEXT:    movl %eax, (%ebx)589; CHECK-i386-NEXT:    movb $1, 8(%eax)590; CHECK-i386-NEXT:    movl %edi, 4(%esi)591; CHECK-i386-NEXT:    movl %esi, %eax592; CHECK-i386-NEXT:    addl $16, %esp593; CHECK-i386-NEXT:    popl %esi594; CHECK-i386-NEXT:    popl %edi595; CHECK-i386-NEXT:    popl %ebx596; CHECK-i386-NEXT:    retl $4597 598; spill sret to stack599; reload sret from stack600entry:601  %call = call ptr @malloc(i64 16)602  store ptr %call, ptr %error_ptr_ref603  %tmp = getelementptr inbounds i8, ptr %call, i64 8604  store i8 1, ptr %tmp605  %v2 = getelementptr inbounds %struct.S, ptr %agg.result, i32 0, i32 1606  store i32 %val1, ptr %v2607  ret void608}609 610; "caller3" calls "foo_sret" that takes a swifterror parameter.611define float @caller3(ptr %error_ref) {612; CHECK-APPLE-LABEL: caller3:613; CHECK-APPLE:       ## %bb.0: ## %entry614; CHECK-APPLE-NEXT:    pushq %r12615; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 16616; CHECK-APPLE-NEXT:    pushq %rbx617; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 24618; CHECK-APPLE-NEXT:    subq $40, %rsp619; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 64620; CHECK-APPLE-NEXT:    .cfi_offset %rbx, -24621; CHECK-APPLE-NEXT:    .cfi_offset %r12, -16622; CHECK-APPLE-NEXT:    movq %rdi, %rbx623; CHECK-APPLE-NEXT:    leaq 8(%rsp), %rdi624; CHECK-APPLE-NEXT:    movl $1, %esi625; CHECK-APPLE-NEXT:    xorl %r12d, %r12d626; CHECK-APPLE-NEXT:    callq _foo_sret627; CHECK-APPLE-NEXT:    movq %r12, %rdi628; CHECK-APPLE-NEXT:    testq %r12, %r12629; CHECK-APPLE-NEXT:    jne LBB6_2630; CHECK-APPLE-NEXT:  ## %bb.1: ## %cont631; CHECK-APPLE-NEXT:    movzbl 8(%rdi), %eax632; CHECK-APPLE-NEXT:    movb %al, (%rbx)633; CHECK-APPLE-NEXT:  LBB6_2: ## %handler634; CHECK-APPLE-NEXT:    callq _free635; CHECK-APPLE-NEXT:    movss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]636; CHECK-APPLE-NEXT:    addq $40, %rsp637; CHECK-APPLE-NEXT:    popq %rbx638; CHECK-APPLE-NEXT:    popq %r12639; CHECK-APPLE-NEXT:    retq640;641; CHECK-O0-LABEL: caller3:642; CHECK-O0:       ## %bb.0: ## %entry643; CHECK-O0-NEXT:    pushq %r12644; CHECK-O0-NEXT:    .cfi_def_cfa_offset 16645; CHECK-O0-NEXT:    subq $48, %rsp646; CHECK-O0-NEXT:    .cfi_def_cfa_offset 64647; CHECK-O0-NEXT:    .cfi_offset %r12, -16648; CHECK-O0-NEXT:    ## implicit-def: $rax649; CHECK-O0-NEXT:    movq %rdi, (%rsp) ## 8-byte Spill650; CHECK-O0-NEXT:    xorl %eax, %eax651; CHECK-O0-NEXT:    movl %eax, %r12d652; CHECK-O0-NEXT:    leaq 24(%rsp), %rdi653; CHECK-O0-NEXT:    movl $1, %esi654; CHECK-O0-NEXT:    callq _foo_sret655; CHECK-O0-NEXT:    movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill656; CHECK-O0-NEXT:    cmpq $0, %r12657; CHECK-O0-NEXT:    jne LBB6_2658; CHECK-O0-NEXT:  ## %bb.1: ## %cont659; CHECK-O0-NEXT:    movq (%rsp), %rax ## 8-byte Reload660; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx ## 8-byte Reload661; CHECK-O0-NEXT:    movb 8(%rcx), %cl662; CHECK-O0-NEXT:    movb %cl, (%rax)663; CHECK-O0-NEXT:  LBB6_2: ## %handler664; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdi ## 8-byte Reload665; CHECK-O0-NEXT:    callq _free666; CHECK-O0-NEXT:    movss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]667; CHECK-O0-NEXT:    addq $48, %rsp668; CHECK-O0-NEXT:    popq %r12669; CHECK-O0-NEXT:    retq670;671; CHECK-i386-LABEL: caller3:672; CHECK-i386:       ## %bb.0: ## %entry673; CHECK-i386-NEXT:    subl $44, %esp674; CHECK-i386-NEXT:    .cfi_def_cfa_offset 48675; CHECK-i386-NEXT:    movl $0, 12(%esp)676; CHECK-i386-NEXT:    leal 12(%esp), %eax677; CHECK-i386-NEXT:    movl %eax, 8(%esp)678; CHECK-i386-NEXT:    leal 16(%esp), %eax679; CHECK-i386-NEXT:    movl %eax, (%esp)680; CHECK-i386-NEXT:    movl $1, 4(%esp)681; CHECK-i386-NEXT:    calll _foo_sret682; CHECK-i386-NEXT:    subl $4, %esp683; CHECK-i386-NEXT:    movl 12(%esp), %eax684; CHECK-i386-NEXT:    testl %eax, %eax685; CHECK-i386-NEXT:    jne LBB6_2686; CHECK-i386-NEXT:  ## %bb.1: ## %cont687; CHECK-i386-NEXT:    movl 48(%esp), %ecx688; CHECK-i386-NEXT:    movzbl 8(%eax), %edx689; CHECK-i386-NEXT:    movb %dl, (%ecx)690; CHECK-i386-NEXT:  LBB6_2: ## %handler691; CHECK-i386-NEXT:    movl %eax, (%esp)692; CHECK-i386-NEXT:    calll _free693; CHECK-i386-NEXT:    fld1694; CHECK-i386-NEXT:    addl $44, %esp695; CHECK-i386-NEXT:    retl696; Access part of the error object and save it to error_ref697 698; Access part of the error object and save it to error_ref699; reload from stack700entry:701  %s = alloca %struct.S, align 8702  %error_ptr_ref = alloca swifterror ptr703  store ptr null, ptr %error_ptr_ref704  call void @foo_sret(ptr sret(%struct.S) %s, i32 1, ptr swifterror %error_ptr_ref)705  %error_from_foo = load ptr, ptr %error_ptr_ref706  %had_error_from_foo = icmp ne ptr %error_from_foo, null707  br i1 %had_error_from_foo, label %handler, label %cont708cont:709  %v1 = getelementptr inbounds %swift_error, ptr %error_from_foo, i64 0, i32 1710  %t = load i8, ptr %v1711  store i8 %t, ptr %error_ref712  br label %handler713handler:714  call void @free(ptr %error_from_foo)715  ret float 1.0716}717 718; This is a caller with multiple swifterror values, it calls "foo" twice, each719; time with a different swifterror value, from "alloca swifterror".720define float @caller_with_multiple_swifterror_values(ptr %error_ref, ptr %error_ref2) {721; CHECK-APPLE-LABEL: caller_with_multiple_swifterror_values:722; CHECK-APPLE:       ## %bb.0: ## %entry723; CHECK-APPLE-NEXT:    pushq %rbp724; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 16725; CHECK-APPLE-NEXT:    .cfi_offset %rbp, -16726; CHECK-APPLE-NEXT:    movq %rsp, %rbp727; CHECK-APPLE-NEXT:    .cfi_def_cfa_register %rbp728; CHECK-APPLE-NEXT:    pushq %r14729; CHECK-APPLE-NEXT:    pushq %r12730; CHECK-APPLE-NEXT:    pushq %rbx731; CHECK-APPLE-NEXT:    pushq %rax732; CHECK-APPLE-NEXT:    .cfi_offset %rbx, -40733; CHECK-APPLE-NEXT:    .cfi_offset %r12, -32734; CHECK-APPLE-NEXT:    .cfi_offset %r14, -24735; CHECK-APPLE-NEXT:    movq %rsi, %rbx736; CHECK-APPLE-NEXT:    movq %rdi, %r14737; CHECK-APPLE-NEXT:    xorl %r12d, %r12d738; CHECK-APPLE-NEXT:    callq _foo739; CHECK-APPLE-NEXT:    movq %r12, %rdi740; CHECK-APPLE-NEXT:    testq %r12, %r12741; CHECK-APPLE-NEXT:    jne LBB7_2742; CHECK-APPLE-NEXT:  ## %bb.1: ## %cont743; CHECK-APPLE-NEXT:    movzbl 8(%rdi), %eax744; CHECK-APPLE-NEXT:    movb %al, (%r14)745; CHECK-APPLE-NEXT:  LBB7_2: ## %handler746; CHECK-APPLE-NEXT:    callq _free747; CHECK-APPLE-NEXT:    movq %rsp, %rax748; CHECK-APPLE-NEXT:    addq $-16, %rax749; CHECK-APPLE-NEXT:    movq %rax, %rsp750; CHECK-APPLE-NEXT:    xorl %r12d, %r12d751; CHECK-APPLE-NEXT:    callq _foo752; CHECK-APPLE-NEXT:    movq %r12, %rdi753; CHECK-APPLE-NEXT:    testq %r12, %r12754; CHECK-APPLE-NEXT:    jne LBB7_4755; CHECK-APPLE-NEXT:  ## %bb.3: ## %cont2756; CHECK-APPLE-NEXT:    movzbl 8(%rdi), %eax757; CHECK-APPLE-NEXT:    movb %al, (%rbx)758; CHECK-APPLE-NEXT:  LBB7_4: ## %handler2759; CHECK-APPLE-NEXT:    callq _free760; CHECK-APPLE-NEXT:    movss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]761; CHECK-APPLE-NEXT:    leaq -24(%rbp), %rsp762; CHECK-APPLE-NEXT:    popq %rbx763; CHECK-APPLE-NEXT:    popq %r12764; CHECK-APPLE-NEXT:    popq %r14765; CHECK-APPLE-NEXT:    popq %rbp766; CHECK-APPLE-NEXT:    retq767;768; CHECK-O0-LABEL: caller_with_multiple_swifterror_values:769; CHECK-O0:       ## %bb.0: ## %entry770; CHECK-O0-NEXT:    pushq %rbp771; CHECK-O0-NEXT:    .cfi_def_cfa_offset 16772; CHECK-O0-NEXT:    .cfi_offset %rbp, -16773; CHECK-O0-NEXT:    movq %rsp, %rbp774; CHECK-O0-NEXT:    .cfi_def_cfa_register %rbp775; CHECK-O0-NEXT:    pushq %r12776; CHECK-O0-NEXT:    subq $40, %rsp777; CHECK-O0-NEXT:    .cfi_offset %r12, -24778; CHECK-O0-NEXT:    ## implicit-def: $rax779; CHECK-O0-NEXT:    ## implicit-def: $rax780; CHECK-O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill781; CHECK-O0-NEXT:    movq %rsi, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill782; CHECK-O0-NEXT:    xorl %eax, %eax783; CHECK-O0-NEXT:    movl %eax, %r12d784; CHECK-O0-NEXT:    callq _foo785; CHECK-O0-NEXT:    movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill786; CHECK-O0-NEXT:    cmpq $0, %r12787; CHECK-O0-NEXT:    jne LBB7_2788; CHECK-O0-NEXT:  ## %bb.1: ## %cont789; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax ## 8-byte Reload790; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx ## 8-byte Reload791; CHECK-O0-NEXT:    movb 8(%rcx), %cl792; CHECK-O0-NEXT:    movb %cl, (%rax)793; CHECK-O0-NEXT:  LBB7_2: ## %handler794; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdi ## 8-byte Reload795; CHECK-O0-NEXT:    callq _free796; CHECK-O0-NEXT:    movq %rsp, %rax797; CHECK-O0-NEXT:    addq $-16, %rax798; CHECK-O0-NEXT:    movq %rax, %rsp799; CHECK-O0-NEXT:    xorl %eax, %eax800; CHECK-O0-NEXT:    movl %eax, %r12d801; CHECK-O0-NEXT:    callq _foo802; CHECK-O0-NEXT:    movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill803; CHECK-O0-NEXT:    cmpq $0, %r12804; CHECK-O0-NEXT:    jne LBB7_4805; CHECK-O0-NEXT:  ## %bb.3: ## %cont2806; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax ## 8-byte Reload807; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx ## 8-byte Reload808; CHECK-O0-NEXT:    movb 8(%rcx), %cl809; CHECK-O0-NEXT:    movb %cl, (%rax)810; CHECK-O0-NEXT:  LBB7_4: ## %handler2811; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdi ## 8-byte Reload812; CHECK-O0-NEXT:    callq _free813; CHECK-O0-NEXT:    movss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]814; CHECK-O0-NEXT:    leaq -8(%rbp), %rsp815; CHECK-O0-NEXT:    popq %r12816; CHECK-O0-NEXT:    popq %rbp817; CHECK-O0-NEXT:    retq818;819; CHECK-i386-LABEL: caller_with_multiple_swifterror_values:820; CHECK-i386:       ## %bb.0: ## %entry821; CHECK-i386-NEXT:    pushl %ebp822; CHECK-i386-NEXT:    .cfi_def_cfa_offset 8823; CHECK-i386-NEXT:    .cfi_offset %ebp, -8824; CHECK-i386-NEXT:    movl %esp, %ebp825; CHECK-i386-NEXT:    .cfi_def_cfa_register %ebp826; CHECK-i386-NEXT:    pushl %esi827; CHECK-i386-NEXT:    pushl %eax828; CHECK-i386-NEXT:    .cfi_offset %esi, -12829; CHECK-i386-NEXT:    movl $0, -8(%ebp)830; CHECK-i386-NEXT:    subl $12, %esp831; CHECK-i386-NEXT:    leal -8(%ebp), %eax832; CHECK-i386-NEXT:    pushl %eax833; CHECK-i386-NEXT:    calll _foo834; CHECK-i386-NEXT:    fstp %st(0)835; CHECK-i386-NEXT:    addl $16, %esp836; CHECK-i386-NEXT:    movl -8(%ebp), %eax837; CHECK-i386-NEXT:    testl %eax, %eax838; CHECK-i386-NEXT:    jne LBB7_2839; CHECK-i386-NEXT:  ## %bb.1: ## %cont840; CHECK-i386-NEXT:    movl 8(%ebp), %ecx841; CHECK-i386-NEXT:    movzbl 8(%eax), %edx842; CHECK-i386-NEXT:    movb %dl, (%ecx)843; CHECK-i386-NEXT:  LBB7_2: ## %handler844; CHECK-i386-NEXT:    subl $12, %esp845; CHECK-i386-NEXT:    pushl %eax846; CHECK-i386-NEXT:    calll _free847; CHECK-i386-NEXT:    addl $16, %esp848; CHECK-i386-NEXT:    movl %esp, %esi849; CHECK-i386-NEXT:    leal -16(%esi), %eax850; CHECK-i386-NEXT:    movl %eax, %esp851; CHECK-i386-NEXT:    movl $0, -16(%esi)852; CHECK-i386-NEXT:    subl $12, %esp853; CHECK-i386-NEXT:    pushl %eax854; CHECK-i386-NEXT:    calll _foo855; CHECK-i386-NEXT:    fstp %st(0)856; CHECK-i386-NEXT:    addl $16, %esp857; CHECK-i386-NEXT:    movl -16(%esi), %eax858; CHECK-i386-NEXT:    testl %eax, %eax859; CHECK-i386-NEXT:    jne LBB7_4860; CHECK-i386-NEXT:  ## %bb.3: ## %cont2861; CHECK-i386-NEXT:    movl 12(%ebp), %ecx862; CHECK-i386-NEXT:    movzbl 8(%eax), %edx863; CHECK-i386-NEXT:    movb %dl, (%ecx)864; CHECK-i386-NEXT:  LBB7_4: ## %handler2865; CHECK-i386-NEXT:    subl $12, %esp866; CHECK-i386-NEXT:    pushl %eax867; CHECK-i386-NEXT:    calll _free868; CHECK-i386-NEXT:    addl $16, %esp869; CHECK-i386-NEXT:    fld1870; CHECK-i386-NEXT:    leal -4(%ebp), %esp871; CHECK-i386-NEXT:    popl %esi872; CHECK-i386-NEXT:    popl %ebp873; CHECK-i386-NEXT:    retl874 875; The first swifterror value:876; Access part of the error object and save it to error_ref877 878; The second swifterror value:879; Access part of the error object and save it to error_ref880 881 882; The first swifterror value:883 884; The second swifterror value:885entry:886  %error_ptr_ref = alloca swifterror ptr887  store ptr null, ptr %error_ptr_ref888  %call = call float @foo(ptr swifterror %error_ptr_ref)889  %error_from_foo = load ptr, ptr %error_ptr_ref890  %had_error_from_foo = icmp ne ptr %error_from_foo, null891  br i1 %had_error_from_foo, label %handler, label %cont892cont:893  %v1 = getelementptr inbounds %swift_error, ptr %error_from_foo, i64 0, i32 1894  %t = load i8, ptr %v1895  store i8 %t, ptr %error_ref896  br label %handler897handler:898  call void @free(ptr %error_from_foo)899 900  %error_ptr_ref2 = alloca swifterror ptr901  store ptr null, ptr %error_ptr_ref2902  %call2 = call float @foo(ptr swifterror %error_ptr_ref2)903  %error_from_foo2 = load ptr, ptr %error_ptr_ref2904  %had_error_from_foo2 = icmp ne ptr %error_from_foo2, null905  br i1 %had_error_from_foo2, label %handler2, label %cont2906cont2:907  %v2 = getelementptr inbounds %swift_error, ptr %error_from_foo2, i64 0, i32 1908  %t2 = load i8, ptr %v2909  store i8 %t2, ptr %error_ref2910  br label %handler2911handler2:912  call void @free(ptr %error_from_foo2)913 914  ret float 1.0915}916 917%swift.refcounted = type opaque918 919; This test checks that we don't create bad phi nodes as part of swifterror920; isel. We used to fail machine ir verification.921; CHECK-APPLE: _swifterror_isel922; CHECK-O0: _swifterror_isel923define void @swifterror_isel(ptr) {924; CHECK-APPLE-LABEL: swifterror_isel:925; CHECK-APPLE:       ## %bb.0: ## %entry926; CHECK-APPLE-NEXT:    pushq %r13927; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 16928; CHECK-APPLE-NEXT:    pushq %r12929; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 24930; CHECK-APPLE-NEXT:    pushq %rax931; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 32932; CHECK-APPLE-NEXT:    .cfi_offset %r12, -24933; CHECK-APPLE-NEXT:    .cfi_offset %r13, -16934; CHECK-APPLE-NEXT:    testb %al, %al935; CHECK-APPLE-NEXT:    jne LBB8_3936; CHECK-APPLE-NEXT:  ## %bb.1: ## %.preheader937; CHECK-APPLE-NEXT:    movq %rdi, %r13938; CHECK-APPLE-NEXT:    ## implicit-def: $di939; CHECK-APPLE-NEXT:    ## implicit-def: $r12940; CHECK-APPLE-NEXT:  LBB8_2: ## =>This Inner Loop Header: Depth=1941; CHECK-APPLE-NEXT:    callq *%rax942; CHECK-APPLE-NEXT:    movzwl (%rax), %edi943; CHECK-APPLE-NEXT:    jmp LBB8_2944; CHECK-APPLE-NEXT:  LBB8_3:945; CHECK-APPLE-NEXT:    addq $8, %rsp946; CHECK-APPLE-NEXT:    popq %r12947; CHECK-APPLE-NEXT:    popq %r13948; CHECK-APPLE-NEXT:    retq949;950; CHECK-O0-LABEL: swifterror_isel:951; CHECK-O0:       ## %bb.0: ## %entry952; CHECK-O0-NEXT:    pushq %r13953; CHECK-O0-NEXT:    .cfi_def_cfa_offset 16954; CHECK-O0-NEXT:    pushq %r12955; CHECK-O0-NEXT:    .cfi_def_cfa_offset 24956; CHECK-O0-NEXT:    subq $40, %rsp957; CHECK-O0-NEXT:    .cfi_def_cfa_offset 64958; CHECK-O0-NEXT:    .cfi_offset %r12, -24959; CHECK-O0-NEXT:    .cfi_offset %r13, -16960; CHECK-O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill961; CHECK-O0-NEXT:    ## implicit-def: $al962; CHECK-O0-NEXT:    testb $1, %al963; CHECK-O0-NEXT:    ## implicit-def: $ax964; CHECK-O0-NEXT:    ## implicit-def: $r12965; CHECK-O0-NEXT:    jne LBB8_2966; CHECK-O0-NEXT:  LBB8_1: ## =>This Inner Loop Header: Depth=1967; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r12 ## 8-byte Reload968; CHECK-O0-NEXT:    movw {{[-0-9]+}}(%r{{[sb]}}p), %ax ## 2-byte Reload969; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 ## 8-byte Reload970; CHECK-O0-NEXT:    ## implicit-def: $edi971; CHECK-O0-NEXT:    movw %ax, %di972; CHECK-O0-NEXT:    ## implicit-def: $rax973; CHECK-O0-NEXT:    callq *%rax974; CHECK-O0-NEXT:    ## implicit-def: $rax975; CHECK-O0-NEXT:    movw (%rax), %ax976; CHECK-O0-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill977; CHECK-O0-NEXT:    movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill978; CHECK-O0-NEXT:    jmp LBB8_1979; CHECK-O0-NEXT:  LBB8_2:980; CHECK-O0-NEXT:    addq $40, %rsp981; CHECK-O0-NEXT:    popq %r12982; CHECK-O0-NEXT:    popq %r13983; CHECK-O0-NEXT:    retq984;985; CHECK-i386-LABEL: swifterror_isel:986; CHECK-i386:       ## %bb.0: ## %entry987; CHECK-i386-NEXT:    pushl %edi988; CHECK-i386-NEXT:    .cfi_def_cfa_offset 8989; CHECK-i386-NEXT:    pushl %esi990; CHECK-i386-NEXT:    .cfi_def_cfa_offset 12991; CHECK-i386-NEXT:    subl $20, %esp992; CHECK-i386-NEXT:    .cfi_def_cfa_offset 32993; CHECK-i386-NEXT:    .cfi_offset %esi, -12994; CHECK-i386-NEXT:    .cfi_offset %edi, -8995; CHECK-i386-NEXT:    testb %al, %al996; CHECK-i386-NEXT:    jne LBB8_3997; CHECK-i386-NEXT:  ## %bb.1: ## %.preheader998; CHECK-i386-NEXT:    movl 32(%esp), %esi999; CHECK-i386-NEXT:    leal 16(%esp), %edi1000; CHECK-i386-NEXT:    ## implicit-def: $ax1001; CHECK-i386-NEXT:  LBB8_2: ## =>This Inner Loop Header: Depth=11002; CHECK-i386-NEXT:    movl %edi, 8(%esp)1003; CHECK-i386-NEXT:    movl %esi, 4(%esp)1004; CHECK-i386-NEXT:    movl %eax, (%esp)1005; CHECK-i386-NEXT:    calll *%eax1006; CHECK-i386-NEXT:    movzwl (%eax), %eax1007; CHECK-i386-NEXT:    jmp LBB8_21008; CHECK-i386-NEXT:  LBB8_3:1009; CHECK-i386-NEXT:    addl $20, %esp1010; CHECK-i386-NEXT:    popl %esi1011; CHECK-i386-NEXT:    popl %edi1012; CHECK-i386-NEXT:    retl1013entry:1014  %swifterror = alloca swifterror ptr, align 81015  br i1 poison, label %5, label %11016 1017  %2 = phi i16 [ %4, %1 ], [ undef, %entry ]1018  %3 = call i1 undef(i16 %2, ptr swiftself %0, ptr nocapture swifterror %swifterror)1019  %4 = load i16, ptr undef, align 21020  br label %11021 1022  ret void1023}1024 1025; This tests the basic usage of a swifterror parameter with swiftcc.1026define swiftcc float @foo_swiftcc(ptr swifterror %error_ptr_ref) {1027; CHECK-APPLE-LABEL: foo_swiftcc:1028; CHECK-APPLE:       ## %bb.0: ## %entry1029; CHECK-APPLE-NEXT:    pushq %rax1030; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 161031; CHECK-APPLE-NEXT:    movl $16, %edi1032; CHECK-APPLE-NEXT:    callq _malloc1033; CHECK-APPLE-NEXT:    movb $1, 8(%rax)1034; CHECK-APPLE-NEXT:    movss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]1035; CHECK-APPLE-NEXT:    movq %rax, %r121036; CHECK-APPLE-NEXT:    popq %rax1037; CHECK-APPLE-NEXT:    retq1038;1039; CHECK-O0-LABEL: foo_swiftcc:1040; CHECK-O0:       ## %bb.0: ## %entry1041; CHECK-O0-NEXT:    pushq %rax1042; CHECK-O0-NEXT:    .cfi_def_cfa_offset 161043; CHECK-O0-NEXT:    movl $16, %edi1044; CHECK-O0-NEXT:    callq _malloc1045; CHECK-O0-NEXT:    movq %rax, %r121046; CHECK-O0-NEXT:    movb $1, 8(%rax)1047; CHECK-O0-NEXT:    movss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]1048; CHECK-O0-NEXT:    popq %rax1049; CHECK-O0-NEXT:    retq1050;1051; CHECK-i386-LABEL: foo_swiftcc:1052; CHECK-i386:       ## %bb.0: ## %entry1053; CHECK-i386-NEXT:    pushl %esi1054; CHECK-i386-NEXT:    .cfi_def_cfa_offset 81055; CHECK-i386-NEXT:    subl $8, %esp1056; CHECK-i386-NEXT:    .cfi_def_cfa_offset 161057; CHECK-i386-NEXT:    .cfi_offset %esi, -81058; CHECK-i386-NEXT:    movl 16(%esp), %esi1059; CHECK-i386-NEXT:    movl $0, 4(%esp)1060; CHECK-i386-NEXT:    movl $16, (%esp)1061; CHECK-i386-NEXT:    calll _malloc1062; CHECK-i386-NEXT:    movl %eax, (%esi)1063; CHECK-i386-NEXT:    movb $1, 8(%eax)1064; CHECK-i386-NEXT:    fld11065; CHECK-i386-NEXT:    addl $8, %esp1066; CHECK-i386-NEXT:    popl %esi1067; CHECK-i386-NEXT:    retl1068 1069 1070entry:1071  %call = call ptr @malloc(i64 16)1072  store ptr %call, ptr %error_ptr_ref1073  %tmp = getelementptr inbounds i8, ptr %call, i64 81074  store i8 1, ptr %tmp1075  ret float 1.01076}1077 1078declare swiftcc float @moo(ptr swifterror)1079 1080; Test parameter forwarding.1081define swiftcc float @forward_swifterror(ptr swifterror %error_ptr_ref) {1082; CHECK-APPLE-LABEL: forward_swifterror:1083; CHECK-APPLE:       ## %bb.0: ## %entry1084; CHECK-APPLE-NEXT:    pushq %rax1085; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 161086; CHECK-APPLE-NEXT:    callq _moo1087; CHECK-APPLE-NEXT:    popq %rax1088; CHECK-APPLE-NEXT:    retq1089;1090; CHECK-O0-LABEL: forward_swifterror:1091; CHECK-O0:       ## %bb.0: ## %entry1092; CHECK-O0-NEXT:    pushq %rax1093; CHECK-O0-NEXT:    .cfi_def_cfa_offset 161094; CHECK-O0-NEXT:    callq _moo1095; CHECK-O0-NEXT:    popq %rax1096; CHECK-O0-NEXT:    retq1097;1098; CHECK-i386-LABEL: forward_swifterror:1099; CHECK-i386:       ## %bb.0: ## %entry1100; CHECK-i386-NEXT:    subl $12, %esp1101; CHECK-i386-NEXT:    .cfi_def_cfa_offset 161102; CHECK-i386-NEXT:    movl 16(%esp), %eax1103; CHECK-i386-NEXT:    movl %eax, (%esp)1104; CHECK-i386-NEXT:    calll _moo1105; CHECK-i386-NEXT:    addl $12, %esp1106; CHECK-i386-NEXT:    retl1107 1108 1109entry:1110  %call = call swiftcc float @moo(ptr swifterror %error_ptr_ref)1111  ret float %call1112}1113 1114define swiftcc float @conditionally_forward_swifterror(ptr swifterror %error_ptr_ref, i32 %cc) {1115; CHECK-APPLE-LABEL: conditionally_forward_swifterror:1116; CHECK-APPLE:       ## %bb.0: ## %entry1117; CHECK-APPLE-NEXT:    testl %edi, %edi1118; CHECK-APPLE-NEXT:    je LBB11_21119; CHECK-APPLE-NEXT:  ## %bb.1: ## %gen_error1120; CHECK-APPLE-NEXT:    pushq %rax1121; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 161122; CHECK-APPLE-NEXT:    callq _moo1123; CHECK-APPLE-NEXT:    popq %rax1124; CHECK-APPLE-NEXT:    retq1125; CHECK-APPLE-NEXT:  LBB11_2: ## %normal1126; CHECK-APPLE-NEXT:    xorps %xmm0, %xmm01127; CHECK-APPLE-NEXT:    retq1128;1129; CHECK-O0-LABEL: conditionally_forward_swifterror:1130; CHECK-O0:       ## %bb.0: ## %entry1131; CHECK-O0-NEXT:    pushq %rax1132; CHECK-O0-NEXT:    .cfi_def_cfa_offset 161133; CHECK-O0-NEXT:    movq %r12, (%rsp) ## 8-byte Spill1134; CHECK-O0-NEXT:    cmpl $0, %edi1135; CHECK-O0-NEXT:    je LBB11_21136; CHECK-O0-NEXT:  ## %bb.1: ## %gen_error1137; CHECK-O0-NEXT:    movq (%rsp), %r12 ## 8-byte Reload1138; CHECK-O0-NEXT:    callq _moo1139; CHECK-O0-NEXT:    popq %rax1140; CHECK-O0-NEXT:    retq1141; CHECK-O0-NEXT:  LBB11_2: ## %normal1142; CHECK-O0-NEXT:    movq (%rsp), %r12 ## 8-byte Reload1143; CHECK-O0-NEXT:    xorps %xmm0, %xmm01144; CHECK-O0-NEXT:    popq %rax1145; CHECK-O0-NEXT:    retq1146;1147; CHECK-i386-LABEL: conditionally_forward_swifterror:1148; CHECK-i386:       ## %bb.0: ## %entry1149; CHECK-i386-NEXT:    subl $12, %esp1150; CHECK-i386-NEXT:    .cfi_def_cfa_offset 161151; CHECK-i386-NEXT:    cmpl $0, 20(%esp)1152; CHECK-i386-NEXT:    je LBB11_21153; CHECK-i386-NEXT:  ## %bb.1: ## %gen_error1154; CHECK-i386-NEXT:    movl 16(%esp), %eax1155; CHECK-i386-NEXT:    movl %eax, (%esp)1156; CHECK-i386-NEXT:    calll _moo1157; CHECK-i386-NEXT:    addl $12, %esp1158; CHECK-i386-NEXT:    retl1159; CHECK-i386-NEXT:  LBB11_2: ## %normal1160; CHECK-i386-NEXT:    fldz1161; CHECK-i386-NEXT:    addl $12, %esp1162; CHECK-i386-NEXT:    retl1163 1164 1165 1166 1167 1168entry:1169  %cond = icmp ne i32 %cc, 01170  br i1 %cond, label %gen_error, label %normal1171 1172gen_error:1173  %call = call swiftcc float @moo(ptr swifterror %error_ptr_ref)1174  ret float %call1175 1176normal:1177  ret float 0.01178}1179 1180; Check that we don't blow up on tail calling swifterror argument functions.1181define float @tailcallswifterror(ptr swifterror %error_ptr_ref) {1182; CHECK-APPLE-LABEL: tailcallswifterror:1183; CHECK-APPLE:       ## %bb.0: ## %entry1184; CHECK-APPLE-NEXT:    pushq %rax1185; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 161186; CHECK-APPLE-NEXT:    callq _tailcallswifterror1187; CHECK-APPLE-NEXT:    popq %rax1188; CHECK-APPLE-NEXT:    retq1189;1190; CHECK-O0-LABEL: tailcallswifterror:1191; CHECK-O0:       ## %bb.0: ## %entry1192; CHECK-O0-NEXT:    pushq %rax1193; CHECK-O0-NEXT:    .cfi_def_cfa_offset 161194; CHECK-O0-NEXT:    callq _tailcallswifterror1195; CHECK-O0-NEXT:    popq %rax1196; CHECK-O0-NEXT:    retq1197;1198; CHECK-i386-LABEL: tailcallswifterror:1199; CHECK-i386:       ## %bb.0: ## %entry1200; CHECK-i386-NEXT:    jmp _tailcallswifterror ## TAILCALL1201entry:1202  %0 = tail call float @tailcallswifterror(ptr swifterror %error_ptr_ref)1203  ret float %01204}1205define swiftcc float @tailcallswifterror_swiftcc(ptr swifterror %error_ptr_ref) {1206; CHECK-APPLE-LABEL: tailcallswifterror_swiftcc:1207; CHECK-APPLE:       ## %bb.0: ## %entry1208; CHECK-APPLE-NEXT:    pushq %rax1209; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 161210; CHECK-APPLE-NEXT:    callq _tailcallswifterror_swiftcc1211; CHECK-APPLE-NEXT:    popq %rax1212; CHECK-APPLE-NEXT:    retq1213;1214; CHECK-O0-LABEL: tailcallswifterror_swiftcc:1215; CHECK-O0:       ## %bb.0: ## %entry1216; CHECK-O0-NEXT:    pushq %rax1217; CHECK-O0-NEXT:    .cfi_def_cfa_offset 161218; CHECK-O0-NEXT:    callq _tailcallswifterror_swiftcc1219; CHECK-O0-NEXT:    popq %rax1220; CHECK-O0-NEXT:    retq1221;1222; CHECK-i386-LABEL: tailcallswifterror_swiftcc:1223; CHECK-i386:       ## %bb.0: ## %entry1224; CHECK-i386-NEXT:    jmp _tailcallswifterror_swiftcc ## TAILCALL1225entry:1226  %0 = tail call swiftcc float @tailcallswifterror_swiftcc(ptr swifterror %error_ptr_ref)1227  ret float %01228}1229 1230; Check that we can handle an empty function with swifterror argument.1231define swiftcc {i32, i32, i32} @empty_swiftcc({i32, i32, i32} , ptr swifterror %error_ptr_ref) {1232; CHECK-APPLE-LABEL: empty_swiftcc:1233; CHECK-APPLE:       ## %bb.0: ## %entry1234; CHECK-APPLE-NEXT:    movl %edx, %ecx1235; CHECK-APPLE-NEXT:    movl %esi, %edx1236; CHECK-APPLE-NEXT:    movl %edi, %eax1237; CHECK-APPLE-NEXT:    retq1238;1239; CHECK-O0-LABEL: empty_swiftcc:1240; CHECK-O0:       ## %bb.0: ## %entry1241; CHECK-O0-NEXT:    movl %edx, %ecx1242; CHECK-O0-NEXT:    movl %esi, %edx1243; CHECK-O0-NEXT:    movl %edi, %eax1244; CHECK-O0-NEXT:    retq1245;1246; CHECK-i386-LABEL: empty_swiftcc:1247; CHECK-i386:       ## %bb.0: ## %entry1248; CHECK-i386-NEXT:    movl 4(%esp), %eax1249; CHECK-i386-NEXT:    movl 8(%esp), %edx1250; CHECK-i386-NEXT:    movl 12(%esp), %ecx1251; CHECK-i386-NEXT:    retl1252entry:1253  ret {i32, i32, i32} %01254}1255 1256; Make sure we can handle the case when isel generates new machine basic blocks.1257define swiftcc void @dont_crash_on_new_isel_blocks(ptr nocapture swifterror, i1, ptr) {1258; CHECK-APPLE-LABEL: dont_crash_on_new_isel_blocks:1259; CHECK-APPLE:       ## %bb.0: ## %entry1260; CHECK-APPLE-NEXT:    testb $1, %dil1261; CHECK-APPLE-NEXT:    pushq %rax1262; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 161263; CHECK-APPLE-NEXT:    callq *%rax1264; CHECK-APPLE-NEXT:    popq %rax1265; CHECK-APPLE-NEXT:    retq1266;1267; CHECK-O0-LABEL: dont_crash_on_new_isel_blocks:1268; CHECK-O0:       ## %bb.0: ## %entry1269; CHECK-O0-NEXT:    pushq %rax1270; CHECK-O0-NEXT:    .cfi_def_cfa_offset 161271; CHECK-O0-NEXT:    movq %r12, (%rsp) ## 8-byte Spill1272; CHECK-O0-NEXT:    movb %dil, %al1273; CHECK-O0-NEXT:    orb $0, %al1274; CHECK-O0-NEXT:    testb $1, %al1275; CHECK-O0-NEXT:    jne LBB15_21276; CHECK-O0-NEXT:  ## %bb.1: ## %falsebb1277; CHECK-O0-NEXT:  LBB15_2: ## %cont1278; CHECK-O0-NEXT:    movq (%rsp), %r12 ## 8-byte Reload1279; CHECK-O0-NEXT:    ## implicit-def: $rax1280; CHECK-O0-NEXT:    callq *%rax1281; CHECK-O0-NEXT:    popq %rax1282; CHECK-O0-NEXT:    retq1283;1284; CHECK-i386-LABEL: dont_crash_on_new_isel_blocks:1285; CHECK-i386:       ## %bb.0: ## %entry1286; CHECK-i386-NEXT:    testb $1, 8(%esp)1287; CHECK-i386-NEXT:    jmpl *%eax ## TAILCALL1288entry:1289  %3 = or i1 false, %11290  br i1 %3, label %cont, label %falsebb1291 1292falsebb:1293  %4 = load ptr, ptr %2, align 81294  br label %cont1295 1296cont:1297  tail call swiftcc void undef(ptr nocapture swifterror %0)1298  ret void1299}1300 1301define swiftcc void @swifterror_clobber(ptr nocapture swifterror %err) {1302; CHECK-APPLE-LABEL: swifterror_clobber:1303; CHECK-APPLE:       ## %bb.0:1304; CHECK-APPLE-NEXT:    movq %r12, %rax1305; CHECK-APPLE-NEXT:    ## InlineAsm Start1306; CHECK-APPLE-NEXT:    nop1307; CHECK-APPLE-NEXT:    ## InlineAsm End1308; CHECK-APPLE-NEXT:    movq %rax, %r121309; CHECK-APPLE-NEXT:    retq1310;1311; CHECK-O0-LABEL: swifterror_clobber:1312; CHECK-O0:       ## %bb.0:1313; CHECK-O0-NEXT:    movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill1314; CHECK-O0-NEXT:    ## InlineAsm Start1315; CHECK-O0-NEXT:    nop1316; CHECK-O0-NEXT:    ## InlineAsm End1317; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r12 ## 8-byte Reload1318; CHECK-O0-NEXT:    retq1319;1320; CHECK-i386-LABEL: swifterror_clobber:1321; CHECK-i386:       ## %bb.0:1322; CHECK-i386-NEXT:    ## InlineAsm Start1323; CHECK-i386-NEXT:    nop1324; CHECK-i386-NEXT:    ## InlineAsm End1325; CHECK-i386-NEXT:    retl1326  call void asm sideeffect "nop", "~{r12}"()1327  ret void1328}1329 1330define swiftcc void @swifterror_reg_clobber(ptr nocapture %err) {1331; CHECK-APPLE-LABEL: swifterror_reg_clobber:1332; CHECK-APPLE:       ## %bb.0:1333; CHECK-APPLE-NEXT:    pushq %r121334; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 161335; CHECK-APPLE-NEXT:    .cfi_offset %r12, -161336; CHECK-APPLE-NEXT:    ## InlineAsm Start1337; CHECK-APPLE-NEXT:    nop1338; CHECK-APPLE-NEXT:    ## InlineAsm End1339; CHECK-APPLE-NEXT:    popq %r121340; CHECK-APPLE-NEXT:    retq1341;1342; CHECK-O0-LABEL: swifterror_reg_clobber:1343; CHECK-O0:       ## %bb.0:1344; CHECK-O0-NEXT:    pushq %r121345; CHECK-O0-NEXT:    .cfi_def_cfa_offset 161346; CHECK-O0-NEXT:    .cfi_offset %r12, -161347; CHECK-O0-NEXT:    ## InlineAsm Start1348; CHECK-O0-NEXT:    nop1349; CHECK-O0-NEXT:    ## InlineAsm End1350; CHECK-O0-NEXT:    popq %r121351; CHECK-O0-NEXT:    retq1352;1353; CHECK-i386-LABEL: swifterror_reg_clobber:1354; CHECK-i386:       ## %bb.0:1355; CHECK-i386-NEXT:    ## InlineAsm Start1356; CHECK-i386-NEXT:    nop1357; CHECK-i386-NEXT:    ## InlineAsm End1358; CHECK-i386-NEXT:    retl1359  call void asm sideeffect "nop", "~{r12}"()1360  ret void1361}1362 1363define swiftcc void @params_in_reg(i64, i64, i64, i64, i64, i64, ptr swiftself, ptr nocapture swifterror %err) {1364; CHECK-APPLE-LABEL: params_in_reg:1365; CHECK-APPLE:       ## %bb.0:1366; CHECK-APPLE-NEXT:    pushq %rbp1367; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 161368; CHECK-APPLE-NEXT:    pushq %r151369; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 241370; CHECK-APPLE-NEXT:    pushq %r141371; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 321372; CHECK-APPLE-NEXT:    pushq %r131373; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 401374; CHECK-APPLE-NEXT:    pushq %rbx1375; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 481376; CHECK-APPLE-NEXT:    subq $48, %rsp1377; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 961378; CHECK-APPLE-NEXT:    .cfi_offset %rbx, -481379; CHECK-APPLE-NEXT:    .cfi_offset %r13, -401380; CHECK-APPLE-NEXT:    .cfi_offset %r14, -321381; CHECK-APPLE-NEXT:    .cfi_offset %r15, -241382; CHECK-APPLE-NEXT:    .cfi_offset %rbp, -161383; CHECK-APPLE-NEXT:    movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill1384; CHECK-APPLE-NEXT:    movq %r13, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill1385; CHECK-APPLE-NEXT:    movq %r9, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill1386; CHECK-APPLE-NEXT:    movq %r8, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill1387; CHECK-APPLE-NEXT:    movq %rcx, %rbx1388; CHECK-APPLE-NEXT:    movq %rdx, %r141389; CHECK-APPLE-NEXT:    movq %rsi, %r151390; CHECK-APPLE-NEXT:    movq %rdi, %rbp1391; CHECK-APPLE-NEXT:    movl $1, %edi1392; CHECK-APPLE-NEXT:    movl $2, %esi1393; CHECK-APPLE-NEXT:    movl $3, %edx1394; CHECK-APPLE-NEXT:    movl $4, %ecx1395; CHECK-APPLE-NEXT:    movl $5, %r8d1396; CHECK-APPLE-NEXT:    movl $6, %r9d1397; CHECK-APPLE-NEXT:    xorl %r13d, %r13d1398; CHECK-APPLE-NEXT:    xorl %r12d, %r12d1399; CHECK-APPLE-NEXT:    callq _params_in_reg21400; CHECK-APPLE-NEXT:    movq %rbp, %rdi1401; CHECK-APPLE-NEXT:    movq %r15, %rsi1402; CHECK-APPLE-NEXT:    movq %r14, %rdx1403; CHECK-APPLE-NEXT:    movq %rbx, %rcx1404; CHECK-APPLE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 ## 8-byte Reload1405; CHECK-APPLE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r9 ## 8-byte Reload1406; CHECK-APPLE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 ## 8-byte Reload1407; CHECK-APPLE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r12 ## 8-byte Reload1408; CHECK-APPLE-NEXT:    callq _params_in_reg21409; CHECK-APPLE-NEXT:    addq $48, %rsp1410; CHECK-APPLE-NEXT:    popq %rbx1411; CHECK-APPLE-NEXT:    popq %r131412; CHECK-APPLE-NEXT:    popq %r141413; CHECK-APPLE-NEXT:    popq %r151414; CHECK-APPLE-NEXT:    popq %rbp1415; CHECK-APPLE-NEXT:    retq1416;1417; CHECK-O0-LABEL: params_in_reg:1418; CHECK-O0:       ## %bb.0:1419; CHECK-O0-NEXT:    pushq %r131420; CHECK-O0-NEXT:    .cfi_def_cfa_offset 161421; CHECK-O0-NEXT:    subq $80, %rsp1422; CHECK-O0-NEXT:    .cfi_def_cfa_offset 961423; CHECK-O0-NEXT:    .cfi_offset %r13, -161424; CHECK-O0-NEXT:    movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill1425; CHECK-O0-NEXT:    movq %r13, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill1426; CHECK-O0-NEXT:    movq %r9, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill1427; CHECK-O0-NEXT:    movq %r8, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill1428; CHECK-O0-NEXT:    movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill1429; CHECK-O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill1430; CHECK-O0-NEXT:    movq %rsi, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill1431; CHECK-O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill1432; CHECK-O0-NEXT:    ## implicit-def: $rax1433; CHECK-O0-NEXT:    xorl %eax, %eax1434; CHECK-O0-NEXT:    movl %eax, %r12d1435; CHECK-O0-NEXT:    movl $1, %edi1436; CHECK-O0-NEXT:    movl $2, %esi1437; CHECK-O0-NEXT:    movl $3, %edx1438; CHECK-O0-NEXT:    movl $4, %ecx1439; CHECK-O0-NEXT:    movl $5, %r8d1440; CHECK-O0-NEXT:    movl $6, %r9d1441; CHECK-O0-NEXT:    movq %r12, %r131442; CHECK-O0-NEXT:    callq _params_in_reg21443; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 ## 8-byte Reload1444; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdi ## 8-byte Reload1445; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi ## 8-byte Reload1446; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx ## 8-byte Reload1447; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx ## 8-byte Reload1448; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 ## 8-byte Reload1449; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r9 ## 8-byte Reload1450; CHECK-O0-NEXT:    movq %r12, %rax1451; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r12 ## 8-byte Reload1452; CHECK-O0-NEXT:    callq _params_in_reg21453; CHECK-O0-NEXT:    addq $80, %rsp1454; CHECK-O0-NEXT:    popq %r131455; CHECK-O0-NEXT:    retq1456;1457; CHECK-i386-LABEL: params_in_reg:1458; CHECK-i386:       ## %bb.0:1459; CHECK-i386-NEXT:    pushl %ebp1460; CHECK-i386-NEXT:    .cfi_def_cfa_offset 81461; CHECK-i386-NEXT:    pushl %ebx1462; CHECK-i386-NEXT:    .cfi_def_cfa_offset 121463; CHECK-i386-NEXT:    pushl %edi1464; CHECK-i386-NEXT:    .cfi_def_cfa_offset 161465; CHECK-i386-NEXT:    pushl %esi1466; CHECK-i386-NEXT:    .cfi_def_cfa_offset 201467; CHECK-i386-NEXT:    subl $60, %esp1468; CHECK-i386-NEXT:    .cfi_def_cfa_offset 801469; CHECK-i386-NEXT:    .cfi_offset %esi, -201470; CHECK-i386-NEXT:    .cfi_offset %edi, -161471; CHECK-i386-NEXT:    .cfi_offset %ebx, -121472; CHECK-i386-NEXT:    .cfi_offset %ebp, -81473; CHECK-i386-NEXT:    movl $0, 56(%esp)1474; CHECK-i386-NEXT:    movl 120(%esp), %ebx1475; CHECK-i386-NEXT:    movl 124(%esp), %ebp1476; CHECK-i386-NEXT:    movl 128(%esp), %esi1477; CHECK-i386-NEXT:    movl 132(%esp), %edi1478; CHECK-i386-NEXT:    leal 56(%esp), %eax1479; CHECK-i386-NEXT:    movl %eax, 52(%esp)1480; CHECK-i386-NEXT:    movl $0, 48(%esp)1481; CHECK-i386-NEXT:    movl $0, 44(%esp)1482; CHECK-i386-NEXT:    movl $6, 40(%esp)1483; CHECK-i386-NEXT:    movl $0, 36(%esp)1484; CHECK-i386-NEXT:    movl $5, 32(%esp)1485; CHECK-i386-NEXT:    movl $0, 28(%esp)1486; CHECK-i386-NEXT:    movl $4, 24(%esp)1487; CHECK-i386-NEXT:    movl $0, 20(%esp)1488; CHECK-i386-NEXT:    movl $3, 16(%esp)1489; CHECK-i386-NEXT:    movl $0, 12(%esp)1490; CHECK-i386-NEXT:    movl $2, 8(%esp)1491; CHECK-i386-NEXT:    movl $0, 4(%esp)1492; CHECK-i386-NEXT:    movl $1, (%esp)1493; CHECK-i386-NEXT:    calll _params_in_reg21494; CHECK-i386-NEXT:    movl %edi, 52(%esp)1495; CHECK-i386-NEXT:    movl %esi, 48(%esp)1496; CHECK-i386-NEXT:    movl %ebp, 44(%esp)1497; CHECK-i386-NEXT:    movl %ebx, 40(%esp)1498; CHECK-i386-NEXT:    movl 116(%esp), %eax1499; CHECK-i386-NEXT:    movl %eax, 36(%esp)1500; CHECK-i386-NEXT:    movl 112(%esp), %eax1501; CHECK-i386-NEXT:    movl %eax, 32(%esp)1502; CHECK-i386-NEXT:    movl 108(%esp), %eax1503; CHECK-i386-NEXT:    movl %eax, 28(%esp)1504; CHECK-i386-NEXT:    movl 104(%esp), %eax1505; CHECK-i386-NEXT:    movl %eax, 24(%esp)1506; CHECK-i386-NEXT:    movl 100(%esp), %eax1507; CHECK-i386-NEXT:    movl %eax, 20(%esp)1508; CHECK-i386-NEXT:    movl 96(%esp), %eax1509; CHECK-i386-NEXT:    movl %eax, 16(%esp)1510; CHECK-i386-NEXT:    movl 92(%esp), %eax1511; CHECK-i386-NEXT:    movl %eax, 12(%esp)1512; CHECK-i386-NEXT:    movl 88(%esp), %eax1513; CHECK-i386-NEXT:    movl %eax, 8(%esp)1514; CHECK-i386-NEXT:    movl 84(%esp), %eax1515; CHECK-i386-NEXT:    movl %eax, 4(%esp)1516; CHECK-i386-NEXT:    movl 80(%esp), %eax1517; CHECK-i386-NEXT:    movl %eax, (%esp)1518; CHECK-i386-NEXT:    calll _params_in_reg21519; CHECK-i386-NEXT:    addl $60, %esp1520; CHECK-i386-NEXT:    popl %esi1521; CHECK-i386-NEXT:    popl %edi1522; CHECK-i386-NEXT:    popl %ebx1523; CHECK-i386-NEXT:    popl %ebp1524; CHECK-i386-NEXT:    retl1525  %error_ptr_ref = alloca swifterror ptr, align 81526  store ptr null, ptr %error_ptr_ref1527  call swiftcc void @params_in_reg2(i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, ptr swiftself null, ptr nocapture swifterror %error_ptr_ref)1528  call swiftcc void @params_in_reg2(i64 %0, i64 %1, i64 %2, i64 %3, i64 %4, i64 %5, ptr swiftself %6, ptr nocapture swifterror %err)1529  ret void1530}1531declare swiftcc void @params_in_reg2(i64, i64, i64, i64, i64, i64, ptr swiftself, ptr nocapture swifterror %err)1532 1533define swiftcc { i64, i64, i64, i64} @params_and_return_in_reg(i64, i64, i64, i64, i64, i64, ptr swiftself, ptr nocapture swifterror %err) {1534; CHECK-APPLE-LABEL: params_and_return_in_reg:1535; CHECK-APPLE:       ## %bb.0:1536; CHECK-APPLE-NEXT:    pushq %rbp1537; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 161538; CHECK-APPLE-NEXT:    pushq %r151539; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 241540; CHECK-APPLE-NEXT:    pushq %r141541; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 321542; CHECK-APPLE-NEXT:    pushq %r131543; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 401544; CHECK-APPLE-NEXT:    pushq %rbx1545; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 481546; CHECK-APPLE-NEXT:    subq $48, %rsp1547; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 961548; CHECK-APPLE-NEXT:    .cfi_offset %rbx, -481549; CHECK-APPLE-NEXT:    .cfi_offset %r13, -401550; CHECK-APPLE-NEXT:    .cfi_offset %r14, -321551; CHECK-APPLE-NEXT:    .cfi_offset %r15, -241552; CHECK-APPLE-NEXT:    .cfi_offset %rbp, -161553; CHECK-APPLE-NEXT:    movq %r12, (%rsp) ## 8-byte Spill1554; CHECK-APPLE-NEXT:    movq %r13, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill1555; CHECK-APPLE-NEXT:    movq %r9, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill1556; CHECK-APPLE-NEXT:    movq %r8, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill1557; CHECK-APPLE-NEXT:    movq %rcx, %rbx1558; CHECK-APPLE-NEXT:    movq %rdx, %r141559; CHECK-APPLE-NEXT:    movq %rsi, %r151560; CHECK-APPLE-NEXT:    movq %rdi, %rbp1561; CHECK-APPLE-NEXT:    movl $1, %edi1562; CHECK-APPLE-NEXT:    movl $2, %esi1563; CHECK-APPLE-NEXT:    movl $3, %edx1564; CHECK-APPLE-NEXT:    movl $4, %ecx1565; CHECK-APPLE-NEXT:    movl $5, %r8d1566; CHECK-APPLE-NEXT:    movl $6, %r9d1567; CHECK-APPLE-NEXT:    xorl %r13d, %r13d1568; CHECK-APPLE-NEXT:    xorl %r12d, %r12d1569; CHECK-APPLE-NEXT:    callq _params_in_reg21570; CHECK-APPLE-NEXT:    movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill1571; CHECK-APPLE-NEXT:    movq %rbp, %rdi1572; CHECK-APPLE-NEXT:    movq %r15, %rsi1573; CHECK-APPLE-NEXT:    movq %r14, %rdx1574; CHECK-APPLE-NEXT:    movq %rbx, %rcx1575; CHECK-APPLE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 ## 8-byte Reload1576; CHECK-APPLE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r9 ## 8-byte Reload1577; CHECK-APPLE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 ## 8-byte Reload1578; CHECK-APPLE-NEXT:    movq (%rsp), %r12 ## 8-byte Reload1579; CHECK-APPLE-NEXT:    callq _params_and_return_in_reg21580; CHECK-APPLE-NEXT:    movq %rax, %rbx1581; CHECK-APPLE-NEXT:    movq %rdx, %r141582; CHECK-APPLE-NEXT:    movq %rcx, %r151583; CHECK-APPLE-NEXT:    movq %r8, %rbp1584; CHECK-APPLE-NEXT:    movq %r12, (%rsp) ## 8-byte Spill1585; CHECK-APPLE-NEXT:    movl $1, %edi1586; CHECK-APPLE-NEXT:    movl $2, %esi1587; CHECK-APPLE-NEXT:    movl $3, %edx1588; CHECK-APPLE-NEXT:    movl $4, %ecx1589; CHECK-APPLE-NEXT:    movl $5, %r8d1590; CHECK-APPLE-NEXT:    movl $6, %r9d1591; CHECK-APPLE-NEXT:    xorl %r13d, %r13d1592; CHECK-APPLE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r12 ## 8-byte Reload1593; CHECK-APPLE-NEXT:    callq _params_in_reg21594; CHECK-APPLE-NEXT:    movq %rbx, %rax1595; CHECK-APPLE-NEXT:    movq %r14, %rdx1596; CHECK-APPLE-NEXT:    movq %r15, %rcx1597; CHECK-APPLE-NEXT:    movq %rbp, %r81598; CHECK-APPLE-NEXT:    movq (%rsp), %r12 ## 8-byte Reload1599; CHECK-APPLE-NEXT:    addq $48, %rsp1600; CHECK-APPLE-NEXT:    popq %rbx1601; CHECK-APPLE-NEXT:    popq %r131602; CHECK-APPLE-NEXT:    popq %r141603; CHECK-APPLE-NEXT:    popq %r151604; CHECK-APPLE-NEXT:    popq %rbp1605; CHECK-APPLE-NEXT:    retq1606;1607; CHECK-O0-LABEL: params_and_return_in_reg:1608; CHECK-O0:       ## %bb.0:1609; CHECK-O0-NEXT:    pushq %r131610; CHECK-O0-NEXT:    .cfi_def_cfa_offset 161611; CHECK-O0-NEXT:    subq $176, %rsp1612; CHECK-O0-NEXT:    .cfi_def_cfa_offset 1921613; CHECK-O0-NEXT:    .cfi_offset %r13, -161614; CHECK-O0-NEXT:    movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill1615; CHECK-O0-NEXT:    movq %r13, (%rsp) ## 8-byte Spill1616; CHECK-O0-NEXT:    movq %r9, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill1617; CHECK-O0-NEXT:    movq %r8, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill1618; CHECK-O0-NEXT:    movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill1619; CHECK-O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill1620; CHECK-O0-NEXT:    movq %rsi, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill1621; CHECK-O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill1622; CHECK-O0-NEXT:    ## implicit-def: $rax1623; CHECK-O0-NEXT:    xorl %eax, %eax1624; CHECK-O0-NEXT:    movl %eax, %r12d1625; CHECK-O0-NEXT:    movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill1626; CHECK-O0-NEXT:    movl $1, %edi1627; CHECK-O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill1628; CHECK-O0-NEXT:    movl $2, %esi1629; CHECK-O0-NEXT:    movq %rsi, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill1630; CHECK-O0-NEXT:    movl $3, %edx1631; CHECK-O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill1632; CHECK-O0-NEXT:    movl $4, %ecx1633; CHECK-O0-NEXT:    movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill1634; CHECK-O0-NEXT:    movl $5, %r8d1635; CHECK-O0-NEXT:    movq %r8, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill1636; CHECK-O0-NEXT:    movl $6, %r9d1637; CHECK-O0-NEXT:    movq %r9, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill1638; CHECK-O0-NEXT:    movq %r12, %r131639; CHECK-O0-NEXT:    callq _params_in_reg21640; CHECK-O0-NEXT:    movq (%rsp), %r13 ## 8-byte Reload1641; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdi ## 8-byte Reload1642; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi ## 8-byte Reload1643; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx ## 8-byte Reload1644; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx ## 8-byte Reload1645; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 ## 8-byte Reload1646; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r9 ## 8-byte Reload1647; CHECK-O0-NEXT:    movq %r12, %rax1648; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r12 ## 8-byte Reload1649; CHECK-O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill1650; CHECK-O0-NEXT:    callq _params_and_return_in_reg21651; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 ## 8-byte Reload1652; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdi ## 8-byte Reload1653; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi ## 8-byte Reload1654; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r9 ## 8-byte Reload1655; CHECK-O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill1656; CHECK-O0-NEXT:    movq %rdx, %rax1657; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx ## 8-byte Reload1658; CHECK-O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill1659; CHECK-O0-NEXT:    movq %rcx, %rax1660; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx ## 8-byte Reload1661; CHECK-O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill1662; CHECK-O0-NEXT:    movq %r8, %rax1663; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 ## 8-byte Reload1664; CHECK-O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill1665; CHECK-O0-NEXT:    movq %r12, %rax1666; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r12 ## 8-byte Reload1667; CHECK-O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill1668; CHECK-O0-NEXT:    callq _params_in_reg21669; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax ## 8-byte Reload1670; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx ## 8-byte Reload1671; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx ## 8-byte Reload1672; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 ## 8-byte Reload1673; CHECK-O0-NEXT:    movq %r12, %rsi1674; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r12 ## 8-byte Reload1675; CHECK-O0-NEXT:    addq $176, %rsp1676; CHECK-O0-NEXT:    popq %r131677; CHECK-O0-NEXT:    retq1678;1679; CHECK-i386-LABEL: params_and_return_in_reg:1680; CHECK-i386:       ## %bb.0:1681; CHECK-i386-NEXT:    pushl %ebp1682; CHECK-i386-NEXT:    .cfi_def_cfa_offset 81683; CHECK-i386-NEXT:    pushl %ebx1684; CHECK-i386-NEXT:    .cfi_def_cfa_offset 121685; CHECK-i386-NEXT:    pushl %edi1686; CHECK-i386-NEXT:    .cfi_def_cfa_offset 161687; CHECK-i386-NEXT:    pushl %esi1688; CHECK-i386-NEXT:    .cfi_def_cfa_offset 201689; CHECK-i386-NEXT:    subl $124, %esp1690; CHECK-i386-NEXT:    .cfi_def_cfa_offset 1441691; CHECK-i386-NEXT:    .cfi_offset %esi, -201692; CHECK-i386-NEXT:    .cfi_offset %edi, -161693; CHECK-i386-NEXT:    .cfi_offset %ebx, -121694; CHECK-i386-NEXT:    .cfi_offset %ebp, -81695; CHECK-i386-NEXT:    movl 148(%esp), %esi1696; CHECK-i386-NEXT:    movl $0, 64(%esp)1697; CHECK-i386-NEXT:    movl 192(%esp), %ebx1698; CHECK-i386-NEXT:    movl 196(%esp), %ebp1699; CHECK-i386-NEXT:    movl 200(%esp), %edi1700; CHECK-i386-NEXT:    leal 64(%esp), %eax1701; CHECK-i386-NEXT:    movl %eax, 52(%esp)1702; CHECK-i386-NEXT:    movl $0, 48(%esp)1703; CHECK-i386-NEXT:    movl $0, 44(%esp)1704; CHECK-i386-NEXT:    movl $6, 40(%esp)1705; CHECK-i386-NEXT:    movl $0, 36(%esp)1706; CHECK-i386-NEXT:    movl $5, 32(%esp)1707; CHECK-i386-NEXT:    movl $0, 28(%esp)1708; CHECK-i386-NEXT:    movl $4, 24(%esp)1709; CHECK-i386-NEXT:    movl $0, 20(%esp)1710; CHECK-i386-NEXT:    movl $3, 16(%esp)1711; CHECK-i386-NEXT:    movl $0, 12(%esp)1712; CHECK-i386-NEXT:    movl $2, 8(%esp)1713; CHECK-i386-NEXT:    movl $0, 4(%esp)1714; CHECK-i386-NEXT:    movl $1, (%esp)1715; CHECK-i386-NEXT:    calll _params_in_reg21716; CHECK-i386-NEXT:    movl %edi, 56(%esp)1717; CHECK-i386-NEXT:    movl %ebp, 52(%esp)1718; CHECK-i386-NEXT:    movl %ebx, 48(%esp)1719; CHECK-i386-NEXT:    movl 188(%esp), %eax1720; CHECK-i386-NEXT:    movl %eax, 44(%esp)1721; CHECK-i386-NEXT:    movl 184(%esp), %eax1722; CHECK-i386-NEXT:    movl %eax, 40(%esp)1723; CHECK-i386-NEXT:    movl 180(%esp), %eax1724; CHECK-i386-NEXT:    movl %eax, 36(%esp)1725; CHECK-i386-NEXT:    movl 176(%esp), %eax1726; CHECK-i386-NEXT:    movl %eax, 32(%esp)1727; CHECK-i386-NEXT:    movl 172(%esp), %eax1728; CHECK-i386-NEXT:    movl %eax, 28(%esp)1729; CHECK-i386-NEXT:    movl 168(%esp), %eax1730; CHECK-i386-NEXT:    movl %eax, 24(%esp)1731; CHECK-i386-NEXT:    movl 164(%esp), %eax1732; CHECK-i386-NEXT:    movl %eax, 20(%esp)1733; CHECK-i386-NEXT:    movl 160(%esp), %eax1734; CHECK-i386-NEXT:    movl %eax, 16(%esp)1735; CHECK-i386-NEXT:    movl 156(%esp), %eax1736; CHECK-i386-NEXT:    movl %eax, 12(%esp)1737; CHECK-i386-NEXT:    movl 152(%esp), %eax1738; CHECK-i386-NEXT:    movl %eax, 8(%esp)1739; CHECK-i386-NEXT:    movl %esi, 4(%esp)1740; CHECK-i386-NEXT:    leal 88(%esp), %eax1741; CHECK-i386-NEXT:    movl %eax, (%esp)1742; CHECK-i386-NEXT:    calll _params_and_return_in_reg21743; CHECK-i386-NEXT:    subl $4, %esp1744; CHECK-i386-NEXT:    movl 88(%esp), %eax1745; CHECK-i386-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) ## 4-byte Spill1746; CHECK-i386-NEXT:    movl 92(%esp), %eax1747; CHECK-i386-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) ## 4-byte Spill1748; CHECK-i386-NEXT:    movl 96(%esp), %eax1749; CHECK-i386-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) ## 4-byte Spill1750; CHECK-i386-NEXT:    movl 100(%esp), %eax1751; CHECK-i386-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) ## 4-byte Spill1752; CHECK-i386-NEXT:    movl 104(%esp), %ebp1753; CHECK-i386-NEXT:    movl 108(%esp), %edi1754; CHECK-i386-NEXT:    movl 112(%esp), %esi1755; CHECK-i386-NEXT:    movl 116(%esp), %ebx1756; CHECK-i386-NEXT:    leal 64(%esp), %eax1757; CHECK-i386-NEXT:    movl %eax, 52(%esp)1758; CHECK-i386-NEXT:    movl $0, 48(%esp)1759; CHECK-i386-NEXT:    movl $0, 44(%esp)1760; CHECK-i386-NEXT:    movl $6, 40(%esp)1761; CHECK-i386-NEXT:    movl $0, 36(%esp)1762; CHECK-i386-NEXT:    movl $5, 32(%esp)1763; CHECK-i386-NEXT:    movl $0, 28(%esp)1764; CHECK-i386-NEXT:    movl $4, 24(%esp)1765; CHECK-i386-NEXT:    movl $0, 20(%esp)1766; CHECK-i386-NEXT:    movl $3, 16(%esp)1767; CHECK-i386-NEXT:    movl $0, 12(%esp)1768; CHECK-i386-NEXT:    movl $2, 8(%esp)1769; CHECK-i386-NEXT:    movl $0, 4(%esp)1770; CHECK-i386-NEXT:    movl $1, (%esp)1771; CHECK-i386-NEXT:    calll _params_in_reg21772; CHECK-i386-NEXT:    movl 144(%esp), %eax1773; CHECK-i386-NEXT:    movl %ebx, 28(%eax)1774; CHECK-i386-NEXT:    movl %esi, 24(%eax)1775; CHECK-i386-NEXT:    movl %edi, 20(%eax)1776; CHECK-i386-NEXT:    movl %ebp, 16(%eax)1777; CHECK-i386-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx ## 4-byte Reload1778; CHECK-i386-NEXT:    movl %ecx, 12(%eax)1779; CHECK-i386-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx ## 4-byte Reload1780; CHECK-i386-NEXT:    movl %ecx, 8(%eax)1781; CHECK-i386-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx ## 4-byte Reload1782; CHECK-i386-NEXT:    movl %ecx, 4(%eax)1783; CHECK-i386-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx ## 4-byte Reload1784; CHECK-i386-NEXT:    movl %ecx, (%eax)1785; CHECK-i386-NEXT:    addl $124, %esp1786; CHECK-i386-NEXT:    popl %esi1787; CHECK-i386-NEXT:    popl %edi1788; CHECK-i386-NEXT:    popl %ebx1789; CHECK-i386-NEXT:    popl %ebp1790; CHECK-i386-NEXT:    retl $41791  %error_ptr_ref = alloca swifterror ptr, align 81792  store ptr null, ptr %error_ptr_ref1793  call swiftcc void @params_in_reg2(i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, ptr swiftself null, ptr nocapture swifterror %error_ptr_ref)1794  %val = call swiftcc  { i64, i64, i64, i64 } @params_and_return_in_reg2(i64 %0, i64 %1, i64 %2, i64 %3, i64 %4, i64 %5, ptr swiftself %6, ptr nocapture swifterror %err)1795  call swiftcc void @params_in_reg2(i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, ptr swiftself null, ptr nocapture swifterror %error_ptr_ref)1796  ret { i64, i64, i64, i64 }%val1797}1798 1799declare swiftcc { i64, i64, i64, i64 } @params_and_return_in_reg2(i64, i64, i64, i64, i64, i64, ptr swiftself, ptr nocapture swifterror %err)1800 1801 1802declare void @acallee(ptr)1803 1804; Make sure we don't tail call if the caller returns a swifterror value. We1805; would have to move into the swifterror register before the tail call.1806define swiftcc void @tailcall_from_swifterror(ptr swifterror %error_ptr_ref) {1807; CHECK-APPLE-LABEL: tailcall_from_swifterror:1808; CHECK-APPLE:       ## %bb.0: ## %entry1809; CHECK-APPLE-NEXT:    pushq %rbx1810; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 161811; CHECK-APPLE-NEXT:    .cfi_offset %rbx, -161812; CHECK-APPLE-NEXT:    movq %r12, %rbx1813; CHECK-APPLE-NEXT:    xorl %edi, %edi1814; CHECK-APPLE-NEXT:    callq _acallee1815; CHECK-APPLE-NEXT:    movq %rbx, %r121816; CHECK-APPLE-NEXT:    popq %rbx1817; CHECK-APPLE-NEXT:    retq1818;1819; CHECK-O0-LABEL: tailcall_from_swifterror:1820; CHECK-O0:       ## %bb.0: ## %entry1821; CHECK-O0-NEXT:    pushq %rax1822; CHECK-O0-NEXT:    .cfi_def_cfa_offset 161823; CHECK-O0-NEXT:    movq %r12, (%rsp) ## 8-byte Spill1824; CHECK-O0-NEXT:    xorl %eax, %eax1825; CHECK-O0-NEXT:    movl %eax, %edi1826; CHECK-O0-NEXT:    callq _acallee1827; CHECK-O0-NEXT:    movq (%rsp), %r12 ## 8-byte Reload1828; CHECK-O0-NEXT:    popq %rax1829; CHECK-O0-NEXT:    retq1830;1831; CHECK-i386-LABEL: tailcall_from_swifterror:1832; CHECK-i386:       ## %bb.0: ## %entry1833; CHECK-i386-NEXT:    subl $12, %esp1834; CHECK-i386-NEXT:    .cfi_def_cfa_offset 161835; CHECK-i386-NEXT:    movl $0, (%esp)1836; CHECK-i386-NEXT:    calll _acallee1837; CHECK-i386-NEXT:    addl $12, %esp1838; CHECK-i386-NEXT:    retl1839entry:1840  tail call void @acallee(ptr null)1841  ret void1842}1843 1844; Make sure we don't crash on this function during -O0.1845; We used to crash because we would insert an IMPLICIT_DEF for the swifterror at1846; beginning of the machine basic block but did not inform FastISel of the1847; inserted instruction. When computing the InsertPoint in the entry block1848; FastISel would choose an insertion point before the IMPLICIT_DEF causing a1849; crash later on.1850declare hidden swiftcc ptr @testFunA()1851 1852%TSb = type <{ i1 }>1853 1854define swiftcc void @dontCrash()  {1855; CHECK-APPLE-LABEL: dontCrash:1856; CHECK-APPLE:       ## %bb.0: ## %entry1857; CHECK-APPLE-NEXT:    pushq %rax1858; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 161859; CHECK-APPLE-NEXT:    callq _testFunA1860; CHECK-APPLE-NEXT:    cmpb $1, (%rax)1861; CHECK-APPLE-NEXT:    popq %rax1862; CHECK-APPLE-NEXT:    retq1863;1864; CHECK-O0-LABEL: dontCrash:1865; CHECK-O0:       ## %bb.0: ## %entry1866; CHECK-O0-NEXT:    pushq %rax1867; CHECK-O0-NEXT:    .cfi_def_cfa_offset 161868; CHECK-O0-NEXT:    ## implicit-def: $rax1869; CHECK-O0-NEXT:    xorl %eax, %eax1870; CHECK-O0-NEXT:    ## kill: def $rax killed $eax1871; CHECK-O0-NEXT:    callq _testFunA1872; CHECK-O0-NEXT:    testb $1, (%rax)1873; CHECK-O0-NEXT:    jne LBB21_11874; CHECK-O0-NEXT:    jmp LBB21_21875; CHECK-O0-NEXT:  LBB21_1: ## %trueBB1876; CHECK-O0-NEXT:    popq %rax1877; CHECK-O0-NEXT:    retq1878; CHECK-O0-NEXT:  LBB21_2: ## %falseBB1879; CHECK-O0-NEXT:    popq %rax1880; CHECK-O0-NEXT:    retq1881;1882; CHECK-i386-LABEL: dontCrash:1883; CHECK-i386:       ## %bb.0: ## %entry1884; CHECK-i386-NEXT:    subl $12, %esp1885; CHECK-i386-NEXT:    .cfi_def_cfa_offset 161886; CHECK-i386-NEXT:    movl $0, 8(%esp)1887; CHECK-i386-NEXT:    calll _testFunA1888; CHECK-i386-NEXT:    cmpb $1, (%eax)1889; CHECK-i386-NEXT:    addl $12, %esp1890; CHECK-i386-NEXT:    retl1891entry:1892  %swifterror = alloca swifterror ptr, align 81893  store ptr null, ptr %swifterror, align 81894  %a = call ptr @testFunA()1895  %c = load i1, ptr %a, align 11896  br i1 %c, label %trueBB, label %falseBB1897 1898trueBB:1899  ret void1900 1901falseBB:1902  ret void1903}1904 1905 1906declare swiftcc void @foo2(ptr swifterror)1907 1908; Make sure we properly assign registers during fast-isel.1909define swiftcc ptr @testAssign(ptr %error_ref) {1910; CHECK-APPLE-LABEL: testAssign:1911; CHECK-APPLE:       ## %bb.0: ## %entry1912; CHECK-APPLE-NEXT:    pushq %r121913; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 161914; CHECK-APPLE-NEXT:    subq $16, %rsp1915; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 321916; CHECK-APPLE-NEXT:    .cfi_offset %r12, -161917; CHECK-APPLE-NEXT:    xorl %r12d, %r12d1918; CHECK-APPLE-NEXT:    callq _foo21919; CHECK-APPLE-NEXT:    movq %r12, %rax1920; CHECK-APPLE-NEXT:    addq $16, %rsp1921; CHECK-APPLE-NEXT:    popq %r121922; CHECK-APPLE-NEXT:    retq1923;1924; CHECK-O0-LABEL: testAssign:1925; CHECK-O0:       ## %bb.0: ## %entry1926; CHECK-O0-NEXT:    pushq %r121927; CHECK-O0-NEXT:    .cfi_def_cfa_offset 161928; CHECK-O0-NEXT:    subq $16, %rsp1929; CHECK-O0-NEXT:    .cfi_def_cfa_offset 321930; CHECK-O0-NEXT:    .cfi_offset %r12, -161931; CHECK-O0-NEXT:    ## implicit-def: $rax1932; CHECK-O0-NEXT:    xorl %eax, %eax1933; CHECK-O0-NEXT:    movl %eax, %r12d1934; CHECK-O0-NEXT:    callq _foo21935; CHECK-O0-NEXT:    movq %r12, (%rsp) ## 8-byte Spill1936; CHECK-O0-NEXT:  ## %bb.1: ## %a1937; CHECK-O0-NEXT:    movq (%rsp), %rax ## 8-byte Reload1938; CHECK-O0-NEXT:    addq $16, %rsp1939; CHECK-O0-NEXT:    popq %r121940; CHECK-O0-NEXT:    retq1941;1942; CHECK-i386-LABEL: testAssign:1943; CHECK-i386:       ## %bb.0: ## %entry1944; CHECK-i386-NEXT:    subl $12, %esp1945; CHECK-i386-NEXT:    .cfi_def_cfa_offset 161946; CHECK-i386-NEXT:    movl $0, 8(%esp)1947; CHECK-i386-NEXT:    leal 8(%esp), %eax1948; CHECK-i386-NEXT:    movl %eax, (%esp)1949; CHECK-i386-NEXT:    calll _foo21950; CHECK-i386-NEXT:    movl 8(%esp), %eax1951; CHECK-i386-NEXT:    addl $12, %esp1952; CHECK-i386-NEXT:    retl1953entry:1954  %error_ptr = alloca swifterror ptr1955  store ptr null, ptr %error_ptr1956  call swiftcc void @foo2(ptr swifterror %error_ptr)1957  br label %a1958 1959a:1960  %error = load ptr, ptr %error_ptr1961  ret ptr %error1962}1963 1964define swiftcc ptr @testAssign2(ptr %error_ref, ptr swifterror %err) {1965; CHECK-APPLE-LABEL: testAssign2:1966; CHECK-APPLE:       ## %bb.0: ## %entry1967; CHECK-APPLE-NEXT:    movq %r12, %rax1968; CHECK-APPLE-NEXT:    retq1969;1970; CHECK-O0-LABEL: testAssign2:1971; CHECK-O0:       ## %bb.0: ## %entry1972; CHECK-O0-NEXT:    movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill1973; CHECK-O0-NEXT:    jmp LBB23_11974; CHECK-O0-NEXT:  LBB23_1: ## %a1975; CHECK-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r12 ## 8-byte Reload1976; CHECK-O0-NEXT:    movq %r12, %rax1977; CHECK-O0-NEXT:    retq1978;1979; CHECK-i386-LABEL: testAssign2:1980; CHECK-i386:       ## %bb.0: ## %entry1981; CHECK-i386-NEXT:    movl 8(%esp), %eax1982; CHECK-i386-NEXT:    movl (%eax), %eax1983; CHECK-i386-NEXT:    retl1984entry:1985  br label %a1986 1987a:1988  %error = load ptr, ptr %err1989  ret ptr %error1990}1991 1992define swiftcc ptr @testAssign3(ptr %error_ref, ptr swifterror %err) {1993; CHECK-APPLE-LABEL: testAssign3:1994; CHECK-APPLE:       ## %bb.0: ## %entry1995; CHECK-APPLE-NEXT:    pushq %rax1996; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 161997; CHECK-APPLE-NEXT:    callq _foo21998; CHECK-APPLE-NEXT:    movq %r12, %rax1999; CHECK-APPLE-NEXT:    popq %rcx2000; CHECK-APPLE-NEXT:    retq2001;2002; CHECK-O0-LABEL: testAssign3:2003; CHECK-O0:       ## %bb.0: ## %entry2004; CHECK-O0-NEXT:    pushq %rax2005; CHECK-O0-NEXT:    .cfi_def_cfa_offset 162006; CHECK-O0-NEXT:    callq _foo22007; CHECK-O0-NEXT:    movq %r12, (%rsp) ## 8-byte Spill2008; CHECK-O0-NEXT:  ## %bb.1: ## %a2009; CHECK-O0-NEXT:    movq (%rsp), %r12 ## 8-byte Reload2010; CHECK-O0-NEXT:    movq %r12, %rax2011; CHECK-O0-NEXT:    popq %rcx2012; CHECK-O0-NEXT:    retq2013;2014; CHECK-i386-LABEL: testAssign3:2015; CHECK-i386:       ## %bb.0: ## %entry2016; CHECK-i386-NEXT:    pushl %esi2017; CHECK-i386-NEXT:    .cfi_def_cfa_offset 82018; CHECK-i386-NEXT:    subl $8, %esp2019; CHECK-i386-NEXT:    .cfi_def_cfa_offset 162020; CHECK-i386-NEXT:    .cfi_offset %esi, -82021; CHECK-i386-NEXT:    movl 20(%esp), %esi2022; CHECK-i386-NEXT:    movl %esi, (%esp)2023; CHECK-i386-NEXT:    calll _foo22024; CHECK-i386-NEXT:    movl (%esi), %eax2025; CHECK-i386-NEXT:    addl $8, %esp2026; CHECK-i386-NEXT:    popl %esi2027; CHECK-i386-NEXT:    retl2028entry:2029  call swiftcc void @foo2(ptr swifterror %err)2030  br label %a2031 2032a:2033  %error = load ptr, ptr %err2034  ret ptr %error2035}2036 2037define swiftcc ptr @testAssign4(ptr %error_ref, ptr swifterror %err) {2038; CHECK-APPLE-LABEL: testAssign4:2039; CHECK-APPLE:       ## %bb.0: ## %entry2040; CHECK-APPLE-NEXT:    pushq %rax2041; CHECK-APPLE-NEXT:    .cfi_def_cfa_offset 162042; CHECK-APPLE-NEXT:    callq _foo22043; CHECK-APPLE-NEXT:    xorl %eax, %eax2044; CHECK-APPLE-NEXT:    xorl %r12d, %r12d2045; CHECK-APPLE-NEXT:    popq %rcx2046; CHECK-APPLE-NEXT:    retq2047;2048; CHECK-O0-LABEL: testAssign4:2049; CHECK-O0:       ## %bb.0: ## %entry2050; CHECK-O0-NEXT:    pushq %rax2051; CHECK-O0-NEXT:    .cfi_def_cfa_offset 162052; CHECK-O0-NEXT:    callq _foo22053; CHECK-O0-NEXT:    xorl %eax, %eax2054; CHECK-O0-NEXT:    ## kill: def $rax killed $eax2055; CHECK-O0-NEXT:    movq %rax, (%rsp) ## 8-byte Spill2056; CHECK-O0-NEXT:  ## %bb.1: ## %a2057; CHECK-O0-NEXT:    movq (%rsp), %r12 ## 8-byte Reload2058; CHECK-O0-NEXT:    movq %r12, %rax2059; CHECK-O0-NEXT:    popq %rcx2060; CHECK-O0-NEXT:    retq2061;2062; CHECK-i386-LABEL: testAssign4:2063; CHECK-i386:       ## %bb.0: ## %entry2064; CHECK-i386-NEXT:    pushl %esi2065; CHECK-i386-NEXT:    .cfi_def_cfa_offset 82066; CHECK-i386-NEXT:    subl $8, %esp2067; CHECK-i386-NEXT:    .cfi_def_cfa_offset 162068; CHECK-i386-NEXT:    .cfi_offset %esi, -82069; CHECK-i386-NEXT:    movl 20(%esp), %esi2070; CHECK-i386-NEXT:    movl %esi, (%esp)2071; CHECK-i386-NEXT:    calll _foo22072; CHECK-i386-NEXT:    movl $0, (%esi)2073; CHECK-i386-NEXT:    movl (%esi), %eax2074; CHECK-i386-NEXT:    addl $8, %esp2075; CHECK-i386-NEXT:    popl %esi2076; CHECK-i386-NEXT:    retl2077entry:2078  call swiftcc void @foo2(ptr swifterror %err)2079  store ptr null, ptr %err2080  br label %a2081 2082a:2083  %error = load ptr, ptr %err2084  ret ptr %error2085}2086