| ; 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>) |