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 7define fastcc void @func_stack0() { 8; CHECK: func_stack0: 9; CHECK: sub sp, sp, #48 10 11; CHECK-TAIL: 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 47define fastcc void @func_stack8([8 x i32], i32 %stacked) { 48; CHECK: func_stack8: 49; CHECK: sub sp, sp, #48 50 51; CHECK-TAIL: 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 86define fastcc void @func_stack32([8 x i32], i128 %stacked0, i128 %stacked1) { 87; CHECK: func_stack32: 88; CHECK: sub sp, sp, #48 89 90; CHECK-TAIL: 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