xref: /llvm-project/llvm/test/CodeGen/X86/GlobalISel/stacksave-stackrestore.ll (revision 1ca0808db2c6393f4a79dcb57b89627eeefffffc)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2; RUN: llc -global-isel=1 -mtriple=x86_64-linux-gnu -o - %s | FileCheck %s
3
4declare void @use_addr(ptr)
5declare ptr @llvm.stacksave.p0()
6declare void @llvm.stackrestore.p0(ptr)
7
8define void @test_scoped_alloca(i64 %n) {
9; CHECK-LABEL: test_scoped_alloca:
10; CHECK:       # %bb.0:
11; CHECK-NEXT:    pushq %rbp
12; CHECK-NEXT:    .cfi_def_cfa_offset 16
13; CHECK-NEXT:    .cfi_offset %rbp, -16
14; CHECK-NEXT:    movq %rsp, %rbp
15; CHECK-NEXT:    .cfi_def_cfa_register %rbp
16; CHECK-NEXT:    pushq %rbx
17; CHECK-NEXT:    pushq %rax
18; CHECK-NEXT:    .cfi_offset %rbx, -24
19; CHECK-NEXT:    movq %rsp, %rbx
20; CHECK-NEXT:    movq %rsp, %rax
21; CHECK-NEXT:    imulq $1, %rdi, %rcx
22; CHECK-NEXT:    addq $15, %rcx
23; CHECK-NEXT:    andq $-16, %rcx
24; CHECK-NEXT:    subq %rcx, %rax
25; CHECK-NEXT:    movq %rax, %rsp
26; CHECK-NEXT:    movq %rax, %rdi
27; CHECK-NEXT:    callq use_addr
28; CHECK-NEXT:    movq %rbx, %rsp
29; CHECK-NEXT:    leaq -8(%rbp), %rsp
30; CHECK-NEXT:    popq %rbx
31; CHECK-NEXT:    popq %rbp
32; CHECK-NEXT:    .cfi_def_cfa %rsp, 8
33; CHECK-NEXT:    retq
34  %sp = call ptr @llvm.stacksave.p0()
35  %addr = alloca i8, i64 %n
36  call void @use_addr(ptr %addr)
37  call void @llvm.stackrestore.p0(ptr %sp)
38  ret void
39}
40