Home | History | Annotate | Download | only in X86
      1 ; RUN: llc < %s -mtriple=x86_64-pc-win32 | FileCheck %s
      2 
      3 define i32 @f1(i32 %p1, i32 %p2, i32 %p3, i32 %p4, i32 %p5) "no-frame-pointer-elim"="true" {
      4   ; CHECK-LABEL: f1:
      5   ; CHECK:       movl    48(%rbp), %eax
      6   ret i32 %p5
      7 }
      8 
      9 define void @f2(i32 %p, ...) "no-frame-pointer-elim"="true" {
     10   ; CHECK-LABEL: f2:
     11   ; CHECK:      .seh_stackalloc 8
     12   ; CHECK:      movq    %rsp, %rbp
     13   ; CHECK:      .seh_setframe 5, 0
     14   ; CHECK:      movq    %rdx, 32(%rbp)
     15   ; CHECK:      leaq    32(%rbp), %rax
     16   %ap = alloca i8, align 8
     17   call void @llvm.va_start(i8* %ap)
     18   ret void
     19 }
     20 
     21 define i8* @f3() "no-frame-pointer-elim"="true" {
     22   ; CHECK-LABEL: f3:
     23   ; CHECK:      movq    %rsp, %rbp
     24   ; CHECK:      .seh_setframe 5, 0
     25   ; CHECK:      movq    8(%rbp), %rax
     26   %ra = call i8* @llvm.returnaddress(i32 0)
     27   ret i8* %ra
     28 }
     29 
     30 define i8* @f4() "no-frame-pointer-elim"="true" {
     31   ; CHECK-LABEL: f4:
     32   ; CHECK:      pushq   %rbp
     33   ; CHECK:      .seh_pushreg 5
     34   ; CHECK:      subq    $304, %rsp
     35   ; CHECK:      .seh_stackalloc 304
     36   ; CHECK:      leaq    128(%rsp), %rbp
     37   ; CHECK:      .seh_setframe 5, 128
     38   ; CHECK:      .seh_endprologue
     39   ; CHECK:      movq    184(%rbp), %rax
     40   alloca [300 x i8]
     41   %ra = call i8* @llvm.returnaddress(i32 0)
     42   ret i8* %ra
     43 }
     44 
     45 declare void @external(i8*)
     46 
     47 define void @f5() "no-frame-pointer-elim"="true" {
     48   ; CHECK-LABEL: f5:
     49   ; CHECK:      subq    $336, %rsp
     50   ; CHECK:      .seh_stackalloc 336
     51   ; CHECK:      leaq    128(%rsp), %rbp
     52   ; CHECK:      .seh_setframe 5, 128
     53   ; CHECK:      leaq    -92(%rbp), %rcx
     54   ; CHECK:      callq   external
     55   %a = alloca [300 x i8]
     56   %gep = getelementptr [300 x i8], [300 x i8]* %a, i32 0, i32 0
     57   call void @external(i8* %gep)
     58   ret void
     59 }
     60 
     61 define void @f6(i32 %p, ...) "no-frame-pointer-elim"="true" {
     62   ; CHECK-LABEL: f6:
     63   ; CHECK:      subq    $336, %rsp
     64   ; CHECK:      .seh_stackalloc 336
     65   ; CHECK:      leaq    128(%rsp), %rbp
     66   ; CHECK:      .seh_setframe 5, 128
     67   ; CHECK:      leaq    -92(%rbp), %rcx
     68   ; CHECK:      callq   external
     69   %a = alloca [300 x i8]
     70   %gep = getelementptr [300 x i8], [300 x i8]* %a, i32 0, i32 0
     71   call void @external(i8* %gep)
     72   ret void
     73 }
     74 
     75 define i32 @f7(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) "no-frame-pointer-elim"="true" {
     76   ; CHECK-LABEL: f7:
     77   ; CHECK:      pushq   %rbp
     78   ; CHECK:      .seh_pushreg 5
     79   ; CHECK:      subq    $304, %rsp
     80   ; CHECK:      .seh_stackalloc 304
     81   ; CHECK:      leaq    128(%rsp), %rbp
     82   ; CHECK:      .seh_setframe 5, 128
     83   ; CHECK:      andq    $-64, %rsp
     84   ; CHECK:      movl    224(%rbp), %eax
     85   ; CHECK:      leaq    176(%rbp), %rsp
     86   alloca [300 x i8], align 64
     87   ret i32 %e
     88 }
     89 
     90 define i32 @f8(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) "no-frame-pointer-elim"="true" {
     91   ; CHECK-LABEL: f8:
     92   ; CHECK:        subq    $352, %rsp
     93   ; CHECK:        .seh_stackalloc 352
     94   ; CHECK:        leaq    128(%rsp), %rbp
     95   ; CHECK:        .seh_setframe 5, 128
     96 
     97   %alloca = alloca [300 x i8], align 64
     98   ; CHECK:        andq    $-64, %rsp
     99   ; CHECK:        movq    %rsp, %rbx
    100 
    101   alloca i32, i32 %a
    102   ; CHECK:        movl    %ecx, %eax
    103   ; CHECK:        leaq    15(,%rax,4), %rax
    104   ; CHECK:        andq    $-16, %rax
    105   ; CHECK:        callq   __chkstk
    106   ; CHECK:        subq    %rax, %rsp
    107 
    108   %gep = getelementptr [300 x i8], [300 x i8]* %alloca, i32 0, i32 0
    109   call void @external(i8* %gep)
    110   ; CHECK:        subq    $32, %rsp
    111   ; CHECK:        leaq    (%rbx), %rcx
    112   ; CHECK:        callq   external
    113   ; CHECK:        addq    $32, %rsp
    114 
    115   ret i32 %e
    116   ; CHECK:        movl    %esi, %eax
    117   ; CHECK:        leaq    224(%rbp), %rsp
    118 }
    119 
    120 declare i8* @llvm.returnaddress(i32) nounwind readnone
    121 
    122 declare void @llvm.va_start(i8*) nounwind
    123