Compiler projects using llvm
; 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>)