164 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -mtriple=x86_64-windows-msvc %s -o - -verify-machineinstrs | FileCheck %s -check-prefix=WINDOWS3; RUN: llc -mtriple=x86_64-linux-gnu %s -o - -verify-machineinstrs | FileCheck %s -check-prefix=LINUX4 5declare void @h(ptr, i64, ptr)6 7define tailcc void @tailcall_frame(ptr %0, i64 %1) sspreq {8; WINDOWS-LABEL: tailcall_frame:9; WINDOWS: # %bb.0:10; WINDOWS-NEXT: subq $56, %rsp11; WINDOWS-NEXT: .seh_stackalloc 5612; WINDOWS-NEXT: .seh_endprologue13; WINDOWS-NEXT: movq __security_cookie(%rip), %rax14; WINDOWS-NEXT: xorq %rsp, %rax15; WINDOWS-NEXT: movq %rax, {{[0-9]+}}(%rsp)16; WINDOWS-NEXT: movq {{[0-9]+}}(%rsp), %rax17; WINDOWS-NEXT: xorq %rsp, %rax18; WINDOWS-NEXT: movq __security_cookie(%rip), %rcx19; WINDOWS-NEXT: cmpq %rax, %rcx20; WINDOWS-NEXT: jne .LBB0_121; WINDOWS-NEXT: # %bb.2:22; WINDOWS-NEXT: xorl %ecx, %ecx23; WINDOWS-NEXT: xorl %edx, %edx24; WINDOWS-NEXT: xorl %r8d, %r8d25; WINDOWS-NEXT: .seh_startepilogue26; WINDOWS-NEXT: addq $56, %rsp27; WINDOWS-NEXT: .seh_endepilogue28; WINDOWS-NEXT: jmp h # TAILCALL29; WINDOWS-NEXT: .LBB0_1:30; WINDOWS-NEXT: movq {{[0-9]+}}(%rsp), %rcx31; WINDOWS-NEXT: xorq %rsp, %rcx32; WINDOWS-NEXT: callq __security_check_cookie33; WINDOWS-NEXT: int334; WINDOWS-NEXT: .seh_endproc35;36; LINUX-LABEL: tailcall_frame:37; LINUX: # %bb.0:38; LINUX-NEXT: subq $24, %rsp39; LINUX-NEXT: .cfi_def_cfa_offset 3240; LINUX-NEXT: movq %fs:40, %rax41; LINUX-NEXT: movq %rax, {{[0-9]+}}(%rsp)42; LINUX-NEXT: movq %fs:40, %rax43; LINUX-NEXT: cmpq {{[0-9]+}}(%rsp), %rax44; LINUX-NEXT: jne .LBB0_245; LINUX-NEXT: # %bb.1: # %SP_return46; LINUX-NEXT: xorl %edi, %edi47; LINUX-NEXT: xorl %esi, %esi48; LINUX-NEXT: xorl %edx, %edx49; LINUX-NEXT: addq $24, %rsp50; LINUX-NEXT: .cfi_def_cfa_offset 851; LINUX-NEXT: jmp h@PLT # TAILCALL52; LINUX-NEXT: .LBB0_2: # %CallStackCheckFailBlk53; LINUX-NEXT: .cfi_def_cfa_offset 3254; LINUX-NEXT: callq __stack_chk_fail@PLT55 tail call tailcc void @h(ptr null, i64 0, ptr null)56 ret void57}58 59declare void @bar()60define void @tailcall_unrelated_frame() sspreq {61; WINDOWS-LABEL: tailcall_unrelated_frame:62; WINDOWS: # %bb.0:63; WINDOWS-NEXT: subq $40, %rsp64; WINDOWS-NEXT: .seh_stackalloc 4065; WINDOWS-NEXT: .seh_endprologue66; WINDOWS-NEXT: movq __security_cookie(%rip), %rax67; WINDOWS-NEXT: xorq %rsp, %rax68; WINDOWS-NEXT: movq %rax, {{[0-9]+}}(%rsp)69; WINDOWS-NEXT: callq bar70; WINDOWS-NEXT: movq {{[0-9]+}}(%rsp), %rax71; WINDOWS-NEXT: xorq %rsp, %rax72; WINDOWS-NEXT: movq __security_cookie(%rip), %rcx73; WINDOWS-NEXT: cmpq %rax, %rcx74; WINDOWS-NEXT: jne .LBB1_175; WINDOWS-NEXT: # %bb.2:76; WINDOWS-NEXT: .seh_startepilogue77; WINDOWS-NEXT: addq $40, %rsp78; WINDOWS-NEXT: .seh_endepilogue79; WINDOWS-NEXT: jmp bar # TAILCALL80; WINDOWS-NEXT: .LBB1_1:81; WINDOWS-NEXT: movq {{[0-9]+}}(%rsp), %rcx82; WINDOWS-NEXT: xorq %rsp, %rcx83; WINDOWS-NEXT: callq __security_check_cookie84; WINDOWS-NEXT: int385; WINDOWS-NEXT: .seh_endproc86;87; LINUX-LABEL: tailcall_unrelated_frame:88; LINUX: # %bb.0:89; LINUX-NEXT: pushq %rax90; LINUX-NEXT: .cfi_def_cfa_offset 1691; LINUX-NEXT: movq %fs:40, %rax92; LINUX-NEXT: movq %rax, (%rsp)93; LINUX-NEXT: callq bar@PLT94; LINUX-NEXT: movq %fs:40, %rax95; LINUX-NEXT: cmpq (%rsp), %rax96; LINUX-NEXT: jne .LBB1_297; LINUX-NEXT: # %bb.1: # %SP_return98; LINUX-NEXT: popq %rax99; LINUX-NEXT: .cfi_def_cfa_offset 8100; LINUX-NEXT: jmp bar@PLT # TAILCALL101; LINUX-NEXT: .LBB1_2: # %CallStackCheckFailBlk102; LINUX-NEXT: .cfi_def_cfa_offset 16103; LINUX-NEXT: callq __stack_chk_fail@PLT104 105 106 call void @bar()107 tail call void @bar()108 ret void109}110 111declare void @callee()112define void @caller() sspreq {113; WINDOWS-LABEL: caller:114; WINDOWS: # %bb.0:115; WINDOWS-NEXT: subq $40, %rsp116; WINDOWS-NEXT: .seh_stackalloc 40117; WINDOWS-NEXT: .seh_endprologue118; WINDOWS-NEXT: movq __security_cookie(%rip), %rax119; WINDOWS-NEXT: xorq %rsp, %rax120; WINDOWS-NEXT: movq %rax, {{[0-9]+}}(%rsp)121; WINDOWS-NEXT: callq callee122; WINDOWS-NEXT: callq callee123; WINDOWS-NEXT: movq {{[0-9]+}}(%rsp), %rax124; WINDOWS-NEXT: xorq %rsp, %rax125; WINDOWS-NEXT: movq __security_cookie(%rip), %rcx126; WINDOWS-NEXT: cmpq %rax, %rcx127; WINDOWS-NEXT: jne .LBB2_2128; WINDOWS-NEXT: # %bb.1:129; WINDOWS-NEXT: .seh_startepilogue130; WINDOWS-NEXT: addq $40, %rsp131; WINDOWS-NEXT: .seh_endepilogue132; WINDOWS-NEXT: retq133; WINDOWS-NEXT: .LBB2_2:134; WINDOWS-NEXT: movq {{[0-9]+}}(%rsp), %rcx135; WINDOWS-NEXT: xorq %rsp, %rcx136; WINDOWS-NEXT: callq __security_check_cookie137; WINDOWS-NEXT: int3138; WINDOWS-NEXT: .seh_endproc139;140; LINUX-LABEL: caller:141; LINUX: # %bb.0:142; LINUX-NEXT: pushq %rax143; LINUX-NEXT: .cfi_def_cfa_offset 16144; LINUX-NEXT: movq %fs:40, %rax145; LINUX-NEXT: movq %rax, (%rsp)146; LINUX-NEXT: callq callee@PLT147; LINUX-NEXT: callq callee@PLT148; LINUX-NEXT: movq %fs:40, %rax149; LINUX-NEXT: cmpq (%rsp), %rax150; LINUX-NEXT: jne .LBB2_2151; LINUX-NEXT: # %bb.1: # %SP_return152; LINUX-NEXT: popq %rax153; LINUX-NEXT: .cfi_def_cfa_offset 8154; LINUX-NEXT: retq155; LINUX-NEXT: .LBB2_2: # %CallStackCheckFailBlk156; LINUX-NEXT: .cfi_def_cfa_offset 16157; LINUX-NEXT: callq __stack_chk_fail@PLT158 159 160 tail call void @callee()161 call void @callee()162 ret void163}164