[AArch64][SVE] Disable tail calls if callee does not preserve SVE regs.
authorSander de Smalen <sander.desmalen@arm.com>
Wed, 5 Aug 2020 08:17:57 +0000 (09:17 +0100)
committerSander de Smalen <sander.desmalen@arm.com>
Wed, 5 Aug 2020 08:38:54 +0000 (09:38 +0100)
commitf2916636f83dfeb4808a16045db0025783743471
treebfbdf75e6a824c75f59abc167dacc679d467f5a4
parent159806704b05f2b562ea93e622f8dbb1976e24f0
[AArch64][SVE] Disable tail calls if callee does not preserve SVE regs.

This fixes an issue triggered by the following code, where emitEpilogue
got confused when trying to restore the SVE registers after the call,
whereas the call to bar() is implemented as a TCReturn:

  int non_sve();
  int sve(svint32_t x) { return non_sve(); }

Reviewed By: efriedma

Differential Revision: https://reviews.llvm.org/D84869
llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
llvm/lib/Target/AArch64/AArch64RegisterInfo.cpp
llvm/lib/Target/AArch64/AArch64RegisterInfo.h
llvm/test/CodeGen/AArch64/sve-tailcall.ll [new file with mode: 0644]