Home | History | Annotate | Download | only in AArch64
      1 ; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu -tailcallopt | FileCheck %s -check-prefix CHECK-TAIL
      2 ; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s
      3 
      4 ; Without tailcallopt fastcc still means the caller cleans up the
      5 ; stack, so try to make sure this is respected.
      6 
      7 define fastcc void @func_stack0() {
      8 ; CHECK-LABEL: func_stack0:
      9 ; CHECK: sub sp, sp, #48
     10 
     11 ; CHECK-TAIL-LABEL: func_stack0:
     12 ; CHECK-TAIL: sub sp, sp, #48
     13 
     14 
     15   call fastcc void @func_stack8([8 x i32] undef, i32 42)
     16 ; CHECK:  bl func_stack8
     17 ; CHECK-NOT: sub sp, sp,
     18 
     19 ; CHECK-TAIL: bl func_stack8
     20 ; CHECK-TAIL: sub sp, sp, #16
     21 
     22 
     23   call fastcc void @func_stack32([8 x i32] undef, i128 0, i128 9)
     24 ; CHECK: bl func_stack32
     25 ; CHECK-NOT: sub sp, sp,
     26 
     27 ; CHECK-TAIL: bl func_stack32
     28 ; CHECK-TAIL: sub sp, sp, #32
     29 
     30 
     31   call fastcc void @func_stack0()
     32 ; CHECK: bl func_stack0
     33 ; CHECK-NOT: sub sp, sp
     34 
     35 ; CHECK-TAIL: bl func_stack0
     36 ; CHECK-TAIL-NOT: sub sp, sp
     37 
     38   ret void
     39 ; CHECK: add sp, sp, #48
     40 ; CHECK-NEXT: ret
     41 
     42 ; CHECK-TAIL: add sp, sp, #48
     43 ; CHECK-TAIL-NEXT: ret
     44 
     45 }
     46 
     47 define fastcc void @func_stack8([8 x i32], i32 %stacked) {
     48 ; CHECK-LABEL: func_stack8:
     49 ; CHECK: sub sp, sp, #48
     50 
     51 ; CHECK-TAIL-LABEL: func_stack8:
     52 ; CHECK-TAIL: sub sp, sp, #48
     53 
     54 
     55   call fastcc void @func_stack8([8 x i32] undef, i32 42)
     56 ; CHECK:  bl func_stack8
     57 ; CHECK-NOT: sub sp, sp,
     58 
     59 ; CHECK-TAIL: bl func_stack8
     60 ; CHECK-TAIL: sub sp, sp, #16
     61 
     62 
     63   call fastcc void @func_stack32([8 x i32] undef, i128 0, i128 9)
     64 ; CHECK: bl func_stack32
     65 ; CHECK-NOT: sub sp, sp,
     66 
     67 ; CHECK-TAIL: bl func_stack32
     68 ; CHECK-TAIL: sub sp, sp, #32
     69 
     70 
     71   call fastcc void @func_stack0()
     72 ; CHECK: bl func_stack0
     73 ; CHECK-NOT: sub sp, sp
     74 
     75 ; CHECK-TAIL: bl func_stack0
     76 ; CHECK-TAIL-NOT: sub sp, sp
     77 
     78   ret void
     79 ; CHECK: add sp, sp, #48
     80 ; CHECK-NEXT: ret
     81 
     82 ; CHECK-TAIL: add sp, sp, #64
     83 ; CHECK-TAIL-NEXT: ret
     84 }
     85 
     86 define fastcc void @func_stack32([8 x i32], i128 %stacked0, i128 %stacked1) {
     87 ; CHECK-LABEL: func_stack32:
     88 ; CHECK: sub sp, sp, #48
     89 
     90 ; CHECK-TAIL-LABEL: func_stack32:
     91 ; CHECK-TAIL: sub sp, sp, #48
     92 
     93 
     94   call fastcc void @func_stack8([8 x i32] undef, i32 42)
     95 ; CHECK:  bl func_stack8
     96 ; CHECK-NOT: sub sp, sp,
     97 
     98 ; CHECK-TAIL: bl func_stack8
     99 ; CHECK-TAIL: sub sp, sp, #16
    100 
    101 
    102   call fastcc void @func_stack32([8 x i32] undef, i128 0, i128 9)
    103 ; CHECK: bl func_stack32
    104 ; CHECK-NOT: sub sp, sp,
    105 
    106 ; CHECK-TAIL: bl func_stack32
    107 ; CHECK-TAIL: sub sp, sp, #32
    108 
    109 
    110   call fastcc void @func_stack0()
    111 ; CHECK: bl func_stack0
    112 ; CHECK-NOT: sub sp, sp
    113 
    114 ; CHECK-TAIL: bl func_stack0
    115 ; CHECK-TAIL-NOT: sub sp, sp
    116 
    117   ret void
    118 ; CHECK: add sp, sp, #48
    119 ; CHECK-NEXT: ret
    120 
    121 ; CHECK-TAIL: add sp, sp, #80
    122 ; CHECK-TAIL-NEXT: ret
    123 }
    124