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