Replace llvm.frameallocate with llvm.frameescape
[oota-llvm.git] / test / CodeGen / X86 / frameescape.ll
1 ; RUN: llc -mtriple=x86_64-windows-msvc < %s | FileCheck %s
2
3 declare void @llvm.frameescape(...)
4 declare i8* @llvm.frameaddress(i32)
5 declare i8* @llvm.framerecover(i8*, i8*, i32)
6 declare i32 @printf(i8*, ...)
7
8 @str = internal constant [10 x i8] c"asdf: %d\0A\00"
9
10 define void @print_framealloc_from_fp(i8* %fp) {
11   %a.i8 = call i8* @llvm.framerecover(i8* bitcast (void()* @alloc_func to i8*), i8* %fp, i32 0)
12   %a = bitcast i8* %a.i8 to i32*
13   %a.val = load i32, i32* %a
14   call i32 (i8*, ...)* @printf(i8* getelementptr ([10 x i8]* @str, i32 0, i32 0), i32 %a.val)
15   %b.i8 = call i8* @llvm.framerecover(i8* bitcast (void()* @alloc_func to i8*), i8* %fp, i32 1)
16   %b = bitcast i8* %b.i8 to i32*
17   %b.val = load i32, i32* %b
18   call i32 (i8*, ...)* @printf(i8* getelementptr ([10 x i8]* @str, i32 0, i32 0), i32 %b.val)
19   ret void
20 }
21
22 ; CHECK-LABEL: print_framealloc_from_fp:
23 ; CHECK: movq %rcx, %[[parent_fp:[a-z]+]]
24 ; CHECK: movabsq $.Lalloc_func$frame_escape_0, %[[offs:[a-z]+]]
25 ; CHECK: movl (%[[parent_fp]],%[[offs]]), %edx
26 ; CHECK: leaq {{.*}}(%rip), %[[str:[a-z]+]]
27 ; CHECK: movq %[[str]], %rcx
28 ; CHECK: callq printf
29 ; CHECK: movabsq $.Lalloc_func$frame_escape_1, %[[offs:[a-z]+]]
30 ; CHECK: movl (%[[parent_fp]],%[[offs]]), %edx
31 ; CHECK: movq %[[str]], %rcx
32 ; CHECK: callq printf
33 ; CHECK: retq
34
35 define void @alloc_func() {
36   %a = alloca i32
37   %b = alloca i32
38   call void (...)* @llvm.frameescape(i32* %a, i32* %b)
39   store i32 42, i32* %a
40   store i32 13, i32* %b
41   %fp = call i8* @llvm.frameaddress(i32 0)
42   call void @print_framealloc_from_fp(i8* %fp)
43   ret void
44 }
45
46 ; CHECK-LABEL: alloc_func:
47 ; CHECK: subq    $48, %rsp
48 ; CHECK: .seh_stackalloc 48
49 ; CHECK: leaq    48(%rsp), %rbp
50 ; CHECK: .seh_setframe 5, 48
51 ; CHECK: .Lalloc_func$frame_escape_0 = 44
52 ; CHECK: .Lalloc_func$frame_escape_1 = 40
53 ; CHECK: movl $42, -4(%rbp)
54 ; CHECK: movl $13, -8(%rbp)
55 ; CHECK: leaq    -48(%rbp), %rcx
56 ; CHECK: callq print_framealloc_from_fp
57 ; CHECK: retq
58
59 ; Helper to make this a complete program so it can be compiled and tested.
60 define i32 @main() {
61   call void @alloc_func()
62   ret i32 0
63 }