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: mov x29, sp
     10 ; CHECK-NEXT: sub sp, sp, #32
     11 
     12 ; CHECK-TAIL-LABEL: func_stack0:
     13 ; CHECK-TAIL: stp x29, x30, [sp, #-16]!
     14 ; CHECK-TAIL-NEXT: mov x29, sp
     15 ; CHECK-TAIL-NEXT: sub sp, sp, #32
     16 
     17 
     18   call fastcc void @func_stack8([8 x i32] undef, i32 42)
     19 ; CHECK:  bl func_stack8
     20 ; CHECK-NOT: sub sp, sp,
     21 
     22 ; CHECK-TAIL: bl func_stack8
     23 ; CHECK-TAIL: sub sp, sp, #16
     24 
     25 
     26   call fastcc void @func_stack32([8 x i32] undef, i128 0, i128 9)
     27 ; CHECK: bl func_stack32
     28 ; CHECK-NOT: sub sp, sp,
     29 
     30 
     31 ; CHECK-TAIL: bl func_stack32
     32 ; CHECK-TAIL: sub sp, sp, #32
     33 
     34 
     35   call fastcc void @func_stack0()
     36 ; CHECK: bl func_stack0
     37 ; CHECK-NOT: sub sp, sp
     38 
     39 
     40 ; CHECK-TAIL: bl func_stack0
     41 ; CHECK-TAIL-NOT: sub sp, sp
     42 
     43   ret void
     44 ; CHECK: mov sp, x29
     45 ; CHECK-NEXT: ldp     x29, x30, [sp], #16
     46 ; CHECK-NEXT: ret
     47 
     48 
     49 ; CHECK-TAIL: mov sp, x29
     50 ; CHECK-TAIL-NEXT: ldp     x29, x30, [sp], #16
     51 ; CHECK-TAIL-NEXT: ret
     52 }
     53 
     54 define fastcc void @func_stack8([8 x i32], i32 %stacked) {
     55 ; CHECK-LABEL: func_stack8:
     56 ; CHECK: stp x29, x30, [sp, #-16]!
     57 ; CHECK: mov x29, sp
     58 ; CHECK: sub sp, sp, #32
     59 
     60 
     61 ; CHECK-TAIL-LABEL: func_stack8:
     62 ; CHECK-TAIL: stp x29, x30, [sp, #-16]!
     63 ; CHECK-TAIL: mov x29, sp
     64 ; CHECK-TAIL: sub sp, sp, #32
     65 
     66 
     67   call fastcc void @func_stack8([8 x i32] undef, i32 42)
     68 ; CHECK:  bl func_stack8
     69 ; CHECK-NOT: sub sp, sp,
     70 
     71 
     72 ; CHECK-TAIL: bl func_stack8
     73 ; CHECK-TAIL: sub sp, sp, #16
     74 
     75 
     76   call fastcc void @func_stack32([8 x i32] undef, i128 0, i128 9)
     77 ; CHECK: bl func_stack32
     78 ; CHECK-NOT: sub sp, sp,
     79 
     80 
     81 ; CHECK-TAIL: bl func_stack32
     82 ; CHECK-TAIL: sub sp, sp, #32
     83 
     84 
     85   call fastcc void @func_stack0()
     86 ; CHECK: bl func_stack0
     87 ; CHECK-NOT: sub sp, sp
     88 
     89 ; CHECK-TAIL: bl func_stack0
     90 ; CHECK-TAIL-NOT: sub sp, sp
     91 
     92   ret void
     93 ; CHECK: mov sp, x29
     94 ; CHECK-NEXT: ldp     x29, x30, [sp], #16
     95 ; CHECK-NEXT: ret
     96 
     97 
     98 ; CHECK-TAIL: mov sp, x29
     99 ; CHECK-TAIL-NEXT: ldp     x29, x30, [sp], #16
    100 ; CHECK-TAIL-NEXT: ret
    101 }
    102 
    103 define fastcc void @func_stack32([8 x i32], i128 %stacked0, i128 %stacked1) {
    104 ; CHECK-LABEL: func_stack32:
    105 ; CHECK: mov x29, sp
    106 
    107 ; CHECK-TAIL-LABEL: func_stack32:
    108 ; CHECK-TAIL: mov x29, sp
    109 
    110 
    111   call fastcc void @func_stack8([8 x i32] undef, i32 42)
    112 ; CHECK:  bl func_stack8
    113 ; CHECK-NOT: sub sp, sp,
    114 
    115 ; CHECK-TAIL: bl func_stack8
    116 ; CHECK-TAIL: sub sp, sp, #16
    117 
    118 
    119   call fastcc void @func_stack32([8 x i32] undef, i128 0, i128 9)
    120 ; CHECK: bl func_stack32
    121 ; CHECK-NOT: sub sp, sp,
    122 
    123 
    124 ; CHECK-TAIL: bl func_stack32
    125 ; CHECK-TAIL: sub sp, sp, #32
    126 
    127 
    128   call fastcc void @func_stack0()
    129 ; CHECK: bl func_stack0
    130 ; CHECK-NOT: sub sp, sp
    131 
    132 
    133 ; CHECK-TAIL: bl func_stack0
    134 ; CHECK-TAIL-NOT: sub sp, sp
    135 
    136   ret void
    137 ; CHECK: mov sp, x29
    138 ; CHECK-NEXT: ldp     x29, x30, [sp], #16
    139 ; CHECK-NEXT: ret
    140 
    141 ; CHECK-TAIL: mov sp, x29
    142 ; CHECK-TAIL-NEXT: ldp     x29, x30, [sp], #16
    143 ; CHECK-TAIL-NEXT: ret
    144 }
    145