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