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