diff options
Diffstat (limited to 'llvm/test')
-rw-r--r-- | llvm/test/CodeGen/X86/frameaddr.ll | 4 | ||||
-rw-r--r-- | llvm/test/CodeGen/X86/gcc_except_table.ll | 2 | ||||
-rw-r--r-- | llvm/test/CodeGen/X86/win64_alloca_dynalloca.ll | 14 | ||||
-rw-r--r-- | llvm/test/CodeGen/X86/win64_alloca_dynalloca.s | 29 | ||||
-rw-r--r-- | llvm/test/CodeGen/X86/win64_eh.ll | 14 | ||||
-rw-r--r-- | llvm/test/CodeGen/X86/win64_eh.s | 50 | ||||
-rw-r--r-- | llvm/test/CodeGen/X86/win64_frame.ll | 121 |
7 files changed, 216 insertions, 18 deletions
diff --git a/llvm/test/CodeGen/X86/frameaddr.ll b/llvm/test/CodeGen/X86/frameaddr.ll index 3e0f8bc34d6..d795c5749a0 100644 --- a/llvm/test/CodeGen/X86/frameaddr.ll +++ b/llvm/test/CodeGen/X86/frameaddr.ll @@ -1,7 +1,7 @@ ; RUN: llc < %s -march=x86 | FileCheck %s --check-prefix=CHECK-32 ; RUN: llc < %s -march=x86 -fast-isel -fast-isel-abort | FileCheck %s --check-prefix=CHECK-32 -; RUN: llc < %s -march=x86-64 | FileCheck %s --check-prefix=CHECK-64 -; RUN: llc < %s -march=x86-64 -fast-isel -fast-isel-abort | FileCheck %s --check-prefix=CHECK-64 +; RUN: llc < %s -mtriple=x86_64-unknown | FileCheck %s --check-prefix=CHECK-64 +; RUN: llc < %s -mtriple=x86_64-unknown -fast-isel -fast-isel-abort | FileCheck %s --check-prefix=CHECK-64 ; RUN: llc < %s -mtriple=x86_64-gnux32 | FileCheck %s --check-prefix=CHECK-X32ABI ; RUN: llc < %s -mtriple=x86_64-gnux32 -fast-isel -fast-isel-abort | FileCheck %s --check-prefix=CHECK-X32ABI ; RUN: llc < %s -mtriple=x86_64-nacl | FileCheck %s --check-prefix=CHECK-NACL64 diff --git a/llvm/test/CodeGen/X86/gcc_except_table.ll b/llvm/test/CodeGen/X86/gcc_except_table.ll index a732eb1efbd..abce13002db 100644 --- a/llvm/test/CodeGen/X86/gcc_except_table.ll +++ b/llvm/test/CodeGen/X86/gcc_except_table.ll @@ -15,7 +15,7 @@ define i32 @main() uwtable optsize ssp { ; MINGW64: .seh_proc ; MINGW64: .seh_handler __gxx_personality_v0 -; MINGW64: .seh_setframe 5, 0 +; MINGW64: .seh_setframe 5, 32 ; MINGW64: callq _Unwind_Resume ; MINGW64: .seh_handlerdata ; MINGW64: GCC_except_table0: diff --git a/llvm/test/CodeGen/X86/win64_alloca_dynalloca.ll b/llvm/test/CodeGen/X86/win64_alloca_dynalloca.ll index aab2eea7ce4..810b23593fd 100644 --- a/llvm/test/CodeGen/X86/win64_alloca_dynalloca.ll +++ b/llvm/test/CodeGen/X86/win64_alloca_dynalloca.ll @@ -14,26 +14,24 @@ entry: %buf0 = alloca i8, i64 4096, align 1 ; ___chkstk_ms does not adjust %rsp. -; M64: movq %rsp, %rbp ; M64: $4096, %rax ; M64: callq ___chkstk_ms ; M64: subq %rax, %rsp +; M64: leaq 128(%rsp), %rbp ; __chkstk does not adjust %rsp. -; W64: movq %rsp, %rbp ; W64: $4096, %rax ; W64: callq __chkstk ; W64: subq %rax, %rsp +; W64: leaq 128(%rsp), %rbp ; Use %r11 for the large model. -; L64: movq %rsp, %rbp ; L64: $4096, %rax ; L64: movabsq $__chkstk, %r11 ; L64: callq *%r11 ; L64: subq %rax, %rsp ; Freestanding -; EFI: movq %rsp, %rbp ; EFI: $[[B0OFS:4096|4104]], %rsp ; EFI-NOT: call @@ -68,12 +66,12 @@ entry: ; M64: subq $48, %rsp ; M64: movq %rax, 32(%rsp) -; M64: leaq -4096(%rbp), %r9 +; M64: leaq -128(%rbp), %r9 ; M64: callq bar ; W64: subq $48, %rsp ; W64: movq %rax, 32(%rsp) -; W64: leaq -4096(%rbp), %r9 +; W64: leaq -128(%rbp), %r9 ; W64: callq bar ; EFI: subq $48, %rsp @@ -83,9 +81,9 @@ entry: ret i64 %r -; M64: movq %rbp, %rsp +; M64: leaq 3968(%rbp), %rsp -; W64: movq %rbp, %rsp +; W64: leaq 3968(%rbp), %rsp } diff --git a/llvm/test/CodeGen/X86/win64_alloca_dynalloca.s b/llvm/test/CodeGen/X86/win64_alloca_dynalloca.s new file mode 100644 index 00000000000..d2c6af211f3 --- /dev/null +++ b/llvm/test/CodeGen/X86/win64_alloca_dynalloca.s @@ -0,0 +1,29 @@ + .text + .def unaligned; + .scl 2; + .type 32; + .endef + .globl unaligned + .align 16, 0x90 +unaligned: # @unaligned +# BB#0: # %entry + pushq %rbp + movabsq $4096, %rax # imm = 0x1000 + callq __chkstk + subq %rax, %rsp + leaq 128(%rsp), %rbp + leaq 15(%rcx), %rax + andq $-16, %rax + callq __chkstk + subq %rax, %rsp + movq %rsp, %rax + subq $48, %rsp + movq %rax, 32(%rsp) + leaq -128(%rbp), %r9 + movq %rcx, %r8 + callq bar + leaq 4016(%rbp), %rsp + popq %rbp + retq + + diff --git a/llvm/test/CodeGen/X86/win64_eh.ll b/llvm/test/CodeGen/X86/win64_eh.ll index 65b06176755..ed3a6e19ef1 100644 --- a/llvm/test/CodeGen/X86/win64_eh.ll +++ b/llvm/test/CodeGen/X86/win64_eh.ll @@ -146,23 +146,23 @@ entry: ; WIN64: .seh_proc foo5 ; WIN64: pushq %rbp ; WIN64: .seh_pushreg 5 -; WIN64: movq %rsp, %rbp ; WIN64: pushq %rdi ; WIN64: .seh_pushreg 7 ; WIN64: pushq %rbx ; WIN64: .seh_pushreg 3 -; WIN64: andq $-64, %rsp ; WIN64: subq $128, %rsp -; WIN64: .seh_stackalloc 48 -; WIN64: .seh_setframe 5, 64 +; WIN64: .seh_stackalloc 128 +; WIN64: leaq 128(%rsp), %rbp +; WIN64: .seh_setframe 5, 128 ; WIN64: movaps %xmm7, -32(%rbp) # 16-byte Spill ; WIN64: movaps %xmm6, -48(%rbp) # 16-byte Spill -; WIN64: .seh_savexmm 6, 16 -; WIN64: .seh_savexmm 7, 32 +; WIN64: .seh_savexmm 6, 80 +; WIN64: .seh_savexmm 7, 96 ; WIN64: .seh_endprologue +; WIN64: andq $-64, %rsp ; WIN64: movaps -48(%rbp), %xmm6 # 16-byte Reload ; WIN64: movaps -32(%rbp), %xmm7 # 16-byte Reload -; WIN64: leaq -16(%rbp), %rsp +; WIN64: leaq (%rbp), %rsp ; WIN64: popq %rbx ; WIN64: popq %rdi ; WIN64: popq %rbp diff --git a/llvm/test/CodeGen/X86/win64_eh.s b/llvm/test/CodeGen/X86/win64_eh.s new file mode 100644 index 00000000000..5e7ea3d9735 --- /dev/null +++ b/llvm/test/CodeGen/X86/win64_eh.s @@ -0,0 +1,50 @@ + .text + .def foo5; + .scl 2; + .type 32; + .endef + .globl foo5 + .align 16, 0x90 +foo5: # @foo5 +.Ltmp0: +.seh_proc foo5 +# BB#0: # %entry + pushq %rbp +.Ltmp1: + .seh_pushreg 5 + pushq %rdi +.Ltmp2: + .seh_pushreg 7 + pushq %rbx +.Ltmp3: + .seh_pushreg 3 + subq $384, %rsp # imm = 0x180 +.Ltmp4: + .seh_stackalloc 384 + leaq 128(%rsp), %rbp +.Ltmp5: + .seh_setframe 5, 128 + movaps %xmm7, -32(%rbp) # 16-byte Spill + movaps %xmm6, -48(%rbp) # 16-byte Spill +.Ltmp6: + .seh_savexmm 6, 80 +.Ltmp7: + .seh_savexmm 7, 96 +.Ltmp8: + .seh_endprologue + andq $-64, %rsp + #APP + #NO_APP + movl $42, (%rsp) + movaps -48(%rbp), %xmm6 # 16-byte Reload + movaps -32(%rbp), %xmm7 # 16-byte Reload + leaq 256(%rbp), %rsp + popq %rbx + popq %rdi + popq %rbp + retq +.Leh_func_end0: +.Ltmp9: + .seh_endproc + + diff --git a/llvm/test/CodeGen/X86/win64_frame.ll b/llvm/test/CodeGen/X86/win64_frame.ll new file mode 100644 index 00000000000..a450a83f56f --- /dev/null +++ b/llvm/test/CodeGen/X86/win64_frame.ll @@ -0,0 +1,121 @@ +; RUN: llc < %s -mtriple=x86_64-pc-win32 | FileCheck %s + +define i32 @f1(i32 %p1, i32 %p2, i32 %p3, i32 %p4, i32 %p5) "no-frame-pointer-elim"="true" { + ; CHECK-LABEL: f1: + ; CHECK: movl 48(%rbp), %eax + ret i32 %p5 +} + +define void @f2(i32 %p, ...) "no-frame-pointer-elim"="true" { + ; CHECK-LABEL: f2: + ; CHECK: .seh_stackalloc 8 + ; CHECK: leaq 16(%rsp), %rbp + ; CHECK: .seh_setframe 5, 16 + ; CHECK: movq %rdx, 16(%rbp) + ; CHECK: leaq 16(%rbp), %rax + %ap = alloca i8, align 8 + call void @llvm.va_start(i8* %ap) + ret void +} + +define i8* @f3() "no-frame-pointer-elim"="true" { + ; CHECK-LABEL: f3: + ; CHECK: leaq (%rsp), %rbp + ; CHECK: .seh_setframe 5, 0 + ; CHECK: movq 8(%rbp), %rax + %ra = call i8* @llvm.returnaddress(i32 0) + ret i8* %ra +} + +define i8* @f4() "no-frame-pointer-elim"="true" { + ; CHECK-LABEL: f4: + ; CHECK: pushq %rbp + ; CHECK: .seh_pushreg 5 + ; CHECK: subq $304, %rsp + ; CHECK: .seh_stackalloc 304 + ; CHECK: leaq 128(%rsp), %rbp + ; CHECK: .seh_setframe 5, 128 + ; CHECK: .seh_endprologue + ; CHECK: movq 184(%rbp), %rax + alloca [300 x i8] + %ra = call i8* @llvm.returnaddress(i32 0) + ret i8* %ra +} + +declare void @external(i8*) + +define void @f5() "no-frame-pointer-elim"="true" { + ; CHECK-LABEL: f5: + ; CHECK: subq $336, %rsp + ; CHECK: .seh_stackalloc 336 + ; CHECK: leaq 128(%rsp), %rbp + ; CHECK: .seh_setframe 5, 128 + ; CHECK: leaq -92(%rbp), %rcx + ; CHECK: callq external + %a = alloca [300 x i8] + %gep = getelementptr [300 x i8]* %a, i32 0, i32 0 + call void @external(i8* %gep) + ret void +} + +define void @f6(i32 %p, ...) "no-frame-pointer-elim"="true" { + ; CHECK-LABEL: f6: + ; CHECK: subq $336, %rsp + ; CHECK: .seh_stackalloc 336 + ; CHECK: leaq 128(%rsp), %rbp + ; CHECK: .seh_setframe 5, 128 + ; CHECK: leaq -92(%rbp), %rcx + ; CHECK: callq external + %a = alloca [300 x i8] + %gep = getelementptr [300 x i8]* %a, i32 0, i32 0 + call void @external(i8* %gep) + ret void +} + +define i32 @f7(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) "no-frame-pointer-elim"="true" { + ; CHECK-LABEL: f7: + ; CHECK: pushq %rbp + ; CHECK: .seh_pushreg 5 + ; CHECK: subq $320, %rsp + ; CHECK: .seh_stackalloc 320 + ; CHECK: leaq 128(%rsp), %rbp + ; CHECK: .seh_setframe 5, 128 + ; CHECK: movl 240(%rbp), %eax + ; CHECK: leaq 192(%rbp), %rsp + alloca [300 x i8], align 64 + ret i32 %e +} + +define i32 @f8(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) "no-frame-pointer-elim"="true" { + ; CHECK-LABEL: f8: + ; CHECK: subq $384, %rsp + ; CHECK: .seh_stackalloc 384 + ; CHECK: leaq 128(%rsp), %rbp + ; CHECK: .seh_setframe 5, 128 + + %alloca = alloca [300 x i8], align 64 + ; CHECK: andq $-64, %rsp + ; CHECK: movq %rsp, %rbx + + alloca i32, i32 %a + ; CHECK: movl %ecx, %eax + ; CHECK: leaq 15(,%rax,4), %rax + ; CHECK: andq $-16, %rax + ; CHECK: callq __chkstk + ; CHECK: subq %rax, %rsp + + %gep = getelementptr [300 x i8]* %alloca, i32 0, i32 0 + call void @external(i8* %gep) + ; CHECK: subq $32, %rsp + ; CHECK: leaq (%rbx), %rcx + ; CHECK: callq external + ; CHECK: addq $32, %rsp + + ret i32 %e + ; CHECK: movl %esi, %eax + ; CHECK: leaq 256(%rbp), %rsp +} + +declare i8* @llvm.returnaddress(i32) nounwind readnone + +declare void @llvm.va_start(i8*) nounwind |