124 lines · plain
1; RUN: llc -mtriple x86_64-unknown-windows-msvc %s -o - | FileCheck %s -check-prefix CHECK642; RUN: llc -mtriple i686-windows-msvc %s -o - | FileCheck %s -check-prefix CHECK323 4define void @simple(ptr swiftasync %context) "frame-pointer"="all" {5 ret void6}7 8; CHECK64-LABEL: simple:9; CHECK64: pushq %rbp10; CHECK64: pushq %rax11; CHECK64: movq %rsp, %rbp12; CHECK64: movq %r14, (%rbp)13; CHECK64: addq $8, %rsp14; CHECK64: popq %rbp15; CHECK64: retq16 17; CHECK32-LABEL: simple:18; CHECK32: movl 8(%ebp), [[TMP:%.*]]19; CHECK32: movl [[TMP]], {{.*}}(%ebp)20 21define void @more_csrs(ptr swiftasync %context) "frame-pointer"="all" {22 call void asm sideeffect "", "~{r15}"()23 ret void24}25 26; CHECK64-LABEL: more_csrs:27; CHECK64: pushq %rbp28; CHECK64: .seh_pushreg %rbp29; CHECK64: pushq %r1530; CHECK64: .seh_pushreg %r1531; CHECK64: pushq %rax32; CHECK64: .seh_stackalloc 833; CHECK64: movq %rsp, %rbp34; CHECK64: .seh_setframe %rbp, 035; CHECK64: .seh_endprologue36; CHECK64: movq %r14, (%rbp)37; [...]38; CHECK64: .seh_startepilogue39; CHECK64: addq $8, %rsp40; CHECK64: popq %r1541; CHECK64: popq %rbp42; CHECK64: .seh_endepilogue43; CHECK64: retq44 45declare void @f(ptr)46 47define void @locals(ptr swiftasync %context) "frame-pointer"="all" {48 %var = alloca i32, i32 1049 call void @f(ptr %var)50 ret void51}52 53; CHECK64-LABEL: locals:54; CHECK64: pushq %rbp55; CHECK64: .seh_pushreg %rbp56; CHECK64: subq $80, %rsp57; CHECK64: movq %r14, -8(%rbp)58 59; CHECK64: leaq -48(%rbp), %rcx60; CHECK64: callq f61 62; CHECK64: addq $80, %rsp63; CHECK64: popq %rbp64; CHECK64: retq65 66define void @use_input_context(ptr swiftasync %context, ptr %ptr) "frame-pointer"="all" {67 store ptr %context, ptr %ptr68 ret void69}70 71; CHECK64-LABEL: use_input_context:72; CHECK64: movq %r14, (%rcx)73 74declare ptr @llvm.swift.async.context.addr()75 76define ptr @context_in_func() "frmae-pointer"="non-leaf" {77 %ptr = call ptr @llvm.swift.async.context.addr()78 ret ptr %ptr79}80 81; CHECK64-LABEL: context_in_func:82; CHECK64: movq %rsp, %rax83 84; CHECK32-LABEL: context_in_func:85; CHECK32: movl %esp, %eax86 87define void @write_frame_context(ptr swiftasync %context, ptr %new_context) "frame-pointer"="non-leaf" {88 %ptr = call ptr @llvm.swift.async.context.addr()89 store ptr %new_context, ptr %ptr90 ret void91}92 93; CHECK64-LABEL: write_frame_context:94; CHECK64: movq %rcx, (%rsp)95 96define void @simple_fp_elim(ptr swiftasync %context) "frame-pointer"="non-leaf" {97 ret void98}99 100; CHECK64-LABEL: simple_fp_elim:101; CHECK64-NOT: btsq102 103define void @manylocals_and_overwritten_context(ptr swiftasync %context, ptr %new_context) "frame-pointer"="all" {104 %ptr = call ptr @llvm.swift.async.context.addr()105 store ptr %new_context, ptr %ptr106 %var1 = alloca i64, i64 1107 call void @f(ptr %var1)108 %var2 = alloca i64, i64 16109 call void @f(ptr %var2)110 %ptr2 = call ptr @llvm.swift.async.context.addr()111 store ptr %new_context, ptr %ptr2112 ret void113}114 115; CHECK64-LABEL: manylocals_and_overwritten_context:116; CHECK64: pushq %rbp117; CHECK64: subq $184, %rsp118; CHECK64: leaq 128(%rsp), %rbp119; CHECK64: movq %rcx, %rsi120; CHECK64: movq %rcx, 48(%rbp)121; CHECK64: callq f122; CHECK64: callq f123; CHECK64: movq %rsi, 48(%rbp)124