; Because some arguments are passed by reference (through stack), ; the compiler should not do tail-call optimization. ; RUN: llc -mtriple=aarch64 -mattr=+sve < %s | FileCheck %s ; CHECK-LABEL: caller: ; CHECK: addvl sp, sp, #-[[STACKSIZE:[0-9]+]] ; CHECK-NOT: addvl sp ; CHECK: bl callee ; CHECK: addvl sp, sp, #[[STACKSIZE]] ; CHECK: ret define <vscale x 16 x i8> @caller(<vscale x 16 x i8> %v) { %1 = tail call <vscale x 16 x i8> @callee(<vscale x 16 x i8> %v, <vscale x 16 x i8> %v, <vscale x 16 x i8> %v, <vscale x 16 x i8> %v, <vscale x 16 x i8> %v, <vscale x 16 x i8> %v, <vscale x 16 x i8> %v, <vscale x 16 x i8> %v, <vscale x 16 x i8> %v) ret <vscale x 16 x i8> %1 } declare <vscale x 16 x i8> @callee(<vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>) ; CHECK-LABEL: caller_pred: ; CHECK: addvl sp, sp, #-[[STACKSIZE:[0-9]+]] ; CHECK-NOT: addvl sp ; CHECK: bl callee_pred ; CHECK: addvl sp, sp, #[[STACKSIZE]] ; CHECK: ret define <vscale x 16 x i1> @caller_pred(<vscale x 16 x i1> %v) { %1 = tail call <vscale x 16 x i1> @callee_pred(<vscale x 16 x i1> %v, <vscale x 16 x i1> %v, <vscale x 16 x i1> %v, <vscale x 16 x i1> %v, <vscale x 16 x i1> %v) ret <vscale x 16 x i1> %1 } declare <vscale x 16 x i1> @callee_pred(<vscale x 16 x i1>, <vscale x 16 x i1>, <vscale x 16 x i1>, <vscale x 16 x i1>, <vscale x 16 x i1>)