1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 2; RUN: llc -mtriple=x86_64-windows-msvc %s -o - -verify-machineinstrs | FileCheck %s -check-prefix=WINDOWS 3; RUN: llc -mtriple=x86_64-linux-gnu %s -o - -verify-machineinstrs | FileCheck %s -check-prefix=LINUX 4 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, %rsp 11; WINDOWS-NEXT: .seh_stackalloc 56 12; WINDOWS-NEXT: .seh_endprologue 13; WINDOWS-NEXT: movq __security_cookie(%rip), %rax 14; WINDOWS-NEXT: xorq %rsp, %rax 15; WINDOWS-NEXT: movq %rax, {{[0-9]+}}(%rsp) 16; WINDOWS-NEXT: movq {{[0-9]+}}(%rsp), %rcx 17; WINDOWS-NEXT: xorq %rsp, %rcx 18; WINDOWS-NEXT: cmpq __security_cookie(%rip), %rcx 19; WINDOWS-NEXT: jne .LBB0_1 20; WINDOWS-NEXT: # %bb.2: 21; WINDOWS-NEXT: xorl %ecx, %ecx 22; WINDOWS-NEXT: xorl %edx, %edx 23; WINDOWS-NEXT: xorl %r8d, %r8d 24; WINDOWS-NEXT: addq $56, %rsp 25; WINDOWS-NEXT: jmp h # TAILCALL 26; WINDOWS-NEXT: .LBB0_1: 27; WINDOWS-NEXT: callq __security_check_cookie 28; WINDOWS-NEXT: int3 29; WINDOWS-NEXT: .seh_endproc 30; 31; LINUX-LABEL: tailcall_frame: 32; LINUX: # %bb.0: 33; LINUX-NEXT: subq $24, %rsp 34; LINUX-NEXT: .cfi_def_cfa_offset 32 35; LINUX-NEXT: movq %fs:40, %rax 36; LINUX-NEXT: movq %rax, {{[0-9]+}}(%rsp) 37; LINUX-NEXT: movq %fs:40, %rax 38; LINUX-NEXT: cmpq {{[0-9]+}}(%rsp), %rax 39; LINUX-NEXT: jne .LBB0_2 40; LINUX-NEXT: # %bb.1: # %SP_return 41; LINUX-NEXT: xorl %edi, %edi 42; LINUX-NEXT: xorl %esi, %esi 43; LINUX-NEXT: xorl %edx, %edx 44; LINUX-NEXT: addq $24, %rsp 45; LINUX-NEXT: .cfi_def_cfa_offset 8 46; LINUX-NEXT: jmp h@PLT # TAILCALL 47; LINUX-NEXT: .LBB0_2: # %CallStackCheckFailBlk 48; LINUX-NEXT: .cfi_def_cfa_offset 32 49; LINUX-NEXT: callq __stack_chk_fail@PLT 50 51 tail call tailcc void @h(ptr null, i64 0, ptr null) 52 ret void 53} 54 55declare void @bar() 56define void @tailcall_unrelated_frame() sspreq { 57; WINDOWS-LABEL: tailcall_unrelated_frame: 58; WINDOWS: # %bb.0: 59; WINDOWS-NEXT: subq $40, %rsp 60; WINDOWS-NEXT: .seh_stackalloc 40 61; WINDOWS-NEXT: .seh_endprologue 62; WINDOWS-NEXT: movq __security_cookie(%rip), %rax 63; WINDOWS-NEXT: xorq %rsp, %rax 64; WINDOWS-NEXT: movq %rax, {{[0-9]+}}(%rsp) 65; WINDOWS-NEXT: callq bar 66; WINDOWS-NEXT: movq {{[0-9]+}}(%rsp), %rcx 67; WINDOWS-NEXT: xorq %rsp, %rcx 68; WINDOWS-NEXT: cmpq __security_cookie(%rip), %rcx 69; WINDOWS-NEXT: jne .LBB1_1 70; WINDOWS-NEXT: # %bb.2: 71; WINDOWS-NEXT: addq $40, %rsp 72; WINDOWS-NEXT: jmp bar # TAILCALL 73; WINDOWS-NEXT: .LBB1_1: 74; WINDOWS-NEXT: callq __security_check_cookie 75; WINDOWS-NEXT: int3 76; WINDOWS-NEXT: .seh_endproc 77 78; LINUX-LABEL: tailcall_unrelated_frame: 79; LINUX: # %bb.0: 80; LINUX-NEXT: pushq %rax 81; LINUX-NEXT: .cfi_def_cfa_offset 16 82; LINUX-NEXT: movq %fs:40, %rax 83; LINUX-NEXT: movq %rax, (%rsp) 84; LINUX-NEXT: callq bar@PLT 85; LINUX-NEXT: movq %fs:40, %rax 86; LINUX-NEXT: cmpq (%rsp), %rax 87; LINUX-NEXT: jne .LBB1_2 88; LINUX-NEXT: # %bb.1: # %SP_return 89; LINUX-NEXT: popq %rax 90; LINUX-NEXT: .cfi_def_cfa_offset 8 91; LINUX-NEXT: jmp bar@PLT # TAILCALL 92; LINUX-NEXT: .LBB1_2: # %CallStackCheckFailBlk 93; LINUX-NEXT: .cfi_def_cfa_offset 16 94; LINUX-NEXT: callq __stack_chk_fail@PLT 95 96 call void @bar() 97 tail call void @bar() 98 ret void 99} 100