142 lines · plain
1; RUN: llc -mtriple=x86_64-windows-msvc < %s | FileCheck %s --check-prefix=X642; RUN: llc -mtriple=i686-windows-msvc < %s | FileCheck %s --check-prefix=X863 4declare ptr @llvm.frameaddress(i32)5declare void @llvm.localescape(...)6declare ptr @llvm.localaddress()7declare ptr @llvm.localrecover(ptr, ptr, i32)8declare i32 @printf(ptr, ...)9 10@str = internal constant [10 x i8] c"asdf: %d\0A\00"11 12define void @print_framealloc_from_fp(ptr %fp) {13 %a.i8 = call ptr @llvm.localrecover(ptr @alloc_func, ptr %fp, i32 0)14 %a.val = load i32, ptr %a.i815 call i32 (ptr, ...) @printf(ptr @str, i32 %a.val)16 %b.i8 = call ptr @llvm.localrecover(ptr @alloc_func, ptr %fp, i32 1)17 %b.val = load i32, ptr %b.i818 call i32 (ptr, ...) @printf(ptr @str, i32 %b.val)19 store i32 42, ptr %b.i820 %b2 = getelementptr i32, ptr %b.i8, i32 121 %b2.val = load i32, ptr %b222 call i32 (ptr, ...) @printf(ptr @str, i32 %b2.val)23 ret void24}25 26; X64-LABEL: print_framealloc_from_fp:27; X64: movq %rcx, %[[parent_fp:[a-z]+]]28; X64: movl .Lalloc_func$frame_escape_0(%rcx), %edx29; X64: leaq {{.*}}(%rip), %[[str:[a-z]+]]30; X64: movq %[[str]], %rcx31; X64: callq printf32; X64: movl .Lalloc_func$frame_escape_1(%[[parent_fp]]), %edx33; X64: movq %[[str]], %rcx34; X64: callq printf35; X64: movl $42, .Lalloc_func$frame_escape_1(%[[parent_fp]])36; X64: retq37 38; X86-LABEL: print_framealloc_from_fp:39; X86: pushl %esi40; X86: movl 8(%esp), %esi41; X86: pushl Lalloc_func$frame_escape_0(%esi)42; X86: pushl $_str43; X86: calll _printf44; X86: addl $8, %esp45; X86: pushl Lalloc_func$frame_escape_1(%esi)46; X86: pushl $_str47; X86: calll _printf48; X86: addl $8, %esp49; X86: movl $42, Lalloc_func$frame_escape_1(%esi)50; X86: movl $4, %eax51; X86: pushl Lalloc_func$frame_escape_1(%esi,%eax)52; X86: pushl $_str53; X86: calll _printf54; X86: addl $8, %esp55; X86: popl %esi56; X86: retl57 58define void @alloc_func(i32 %n) {59 %a = alloca i3260 %b = alloca i32, i32 261 call void (...) @llvm.localescape(ptr %a, ptr %b)62 store i32 42, ptr %a63 store i32 13, ptr %b64 65 ; Force usage of EBP with a dynamic alloca.66 alloca i8, i32 %n67 68 %lp = call ptr @llvm.localaddress()69 call void @print_framealloc_from_fp(ptr %lp)70 ret void71}72 73; X64-LABEL: alloc_func:74; X64: pushq %rbp75; X64: subq $16, %rsp76; X64: .seh_stackalloc 1677; X64: leaq 16(%rsp), %rbp78; X64: .seh_setframe %rbp, 1679; X64: .Lalloc_func$frame_escape_0 = -480; X64: .Lalloc_func$frame_escape_1 = -1281; X64: movl $42, -4(%rbp)82; X64: movl $13, -12(%rbp)83; X64: movq %rbp, %rcx84; X64: callq print_framealloc_from_fp85; X64: retq86 87; X86-LABEL: alloc_func:88; X86: pushl %ebp89; X86: movl %esp, %ebp90; X86: subl $12, %esp91; X86: Lalloc_func$frame_escape_0 = -492; X86: Lalloc_func$frame_escape_1 = -1293; X86: movl $42, -4(%ebp)94; X86: movl $13, -12(%ebp)95; X86: pushl %ebp96; X86: calll _print_framealloc_from_fp97; X86: movl %ebp, %esp98; X86: popl %ebp99; X86: retl100 101; Helper to make this a complete program so it can be compiled and tested.102define i32 @main() {103 call void @alloc_func(i32 3)104 ret i32 0105}106 107define void @alloc_func_no_frameaddr() {108 %a = alloca i32109 %b = alloca i32110 call void (...) @llvm.localescape(ptr %a, ptr %b)111 store i32 42, ptr %a112 store i32 13, ptr %b113 call void @print_framealloc_from_fp(ptr null)114 ret void115}116 117; X64-LABEL: alloc_func_no_frameaddr:118; X64: subq $40, %rsp119; X64: .seh_stackalloc 40120; X64: .seh_endprologue121; X64: .Lalloc_func_no_frameaddr$frame_escape_0 = 36122; X64: .Lalloc_func_no_frameaddr$frame_escape_1 = 32123; X64: movl $42, 36(%rsp)124; X64: movl $13, 32(%rsp)125; X64: xorl %ecx, %ecx126; X64: callq print_framealloc_from_fp127; X64: .seh_startepilogue128; X64: addq $40, %rsp129; X64: .seh_endepilogue130; X64: retq131 132; X86-LABEL: alloc_func_no_frameaddr:133; X86: subl $8, %esp134; X86: Lalloc_func_no_frameaddr$frame_escape_0 = 4135; X86: Lalloc_func_no_frameaddr$frame_escape_1 = 0136; X86: movl $42, 4(%esp)137; X86: movl $13, (%esp)138; X86: pushl $0139; X86: calll _print_framealloc_from_fp140; X86: addl $12, %esp141; X86: retl142