30 lines · plain
1; Because some arguments are passed by reference (through stack),2; the compiler should not do tail-call optimization.3; RUN: llc -mtriple=aarch64 -mattr=+sve < %s | FileCheck %s4 5; CHECK-LABEL: caller:6; CHECK: addvl sp, sp, #-[[STACKSIZE:[0-9]+]]7; CHECK-NOT: addvl sp8; CHECK: bl callee9; CHECK: addvl sp, sp, #[[STACKSIZE]]10; CHECK: ret11define <vscale x 16 x i8> @caller(<vscale x 16 x i8> %v) {12 %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)13 ret <vscale x 16 x i8> %114}15 16declare <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>)17 18; CHECK-LABEL: caller_pred:19; CHECK: addvl sp, sp, #-[[STACKSIZE:[0-9]+]]20; CHECK-NOT: addvl sp21; CHECK: bl callee_pred22; CHECK: addvl sp, sp, #[[STACKSIZE]]23; CHECK: ret24define <vscale x 16 x i1> @caller_pred(<vscale x 16 x i1> %v) {25 %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)26 ret <vscale x 16 x i1> %127}28 29declare <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>)30