[AArch64][GlobalISel] Choose CCAssignFns per-argument for tail call lowering
authorJessica Paquette <jpaquette@apple.com>
Wed, 25 Sep 2019 16:45:35 +0000 (16:45 +0000)
committerJessica Paquette <jpaquette@apple.com>
Wed, 25 Sep 2019 16:45:35 +0000 (16:45 +0000)
commit8535a8672e16a553f83eb2c21b1f9823d9293117
tree8192b6b3c91b78994dd927b17bc716871f969ee9
parente3f89a989a23b9bfcb9f9d01172cebb63db627e1
[AArch64][GlobalISel] Choose CCAssignFns per-argument for tail call lowering

When checking for tail call eligibility, we should use the correct CCAssignFn
for each argument, rather than just checking if the caller/callee is varargs or
not.

This is important for tail call lowering with varargs. If we don't check it,
then basically any varargs callee with parameters cannot be tail called on
Darwin, for one thing. If the parameters are all guaranteed to be in registers,
this should be entirely safe.

On top of that, not checking for this could potentially make it so that we have
the wrong stack offsets when checking for tail call eligibility.

Also refactor some of the stuff for CCAssignFnForCall and pull it out into a
helper function.

Update call-translator-tail-call.ll to show that we can now correctly tail call
on Darwin. Also add two extra tail call checks. The first verifies that we still
respect the caller's stack size, and the second verifies that we still don't
tail call when a varargs function has a memory argument.

Differential Revision: https://reviews.llvm.org/D67939

llvm-svn: 372897
llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h
llvm/lib/CodeGen/GlobalISel/CallLowering.cpp
llvm/lib/Target/AArch64/AArch64CallLowering.cpp
llvm/test/CodeGen/AArch64/GlobalISel/call-translator-tail-call.ll