]> granicus.if.org Git - llvm/commit
Merging r360099:
authorTom Stellard <tstellar@redhat.com>
Wed, 15 May 2019 18:59:16 +0000 (18:59 +0000)
committerTom Stellard <tstellar@redhat.com>
Wed, 15 May 2019 18:59:16 +0000 (18:59 +0000)
commit04629a4311a08fc9281db8effbfd19530b8dd11e
tree8755e4a737d996239e60e14f7a7cc493569bc91c
parent352b154f1912df8e1afa2e2c79eb318a084abaf2
Merging r360099:

------------------------------------------------------------------------
r360099 | efriedma | 2019-05-06 16:21:59 -0700 (Mon, 06 May 2019) | 26 lines

[ARM] Glue register copies to tail calls.

This generally follows what other targets do. I don't completely
understand why the special case for tail calls existed in the first
place; even when the code was committed in r105413, call lowering didn't
work in the way described in the comments.

Stack protector lowering breaks if the register copies are not glued to
a tail call: we have to insert the stack protector check before the tail
call, and we choose the location based on the assumption that all
physical register dependencies of a tail call are adjacent to the tail
call. (See FindSplitPointForStackProtector.) This is sort of fragile,
but I don't see any reason to break that assumption.

I'm guessing nobody has seen this before just because it's hard to
convince the scheduler to actually schedule the code in a way that
breaks; even without the glue, the only computation that could actually
be scheduled after the register copies is the computation of the call
address, and the scheduler usually prefers to schedule that before the
copies anyway.

Fixes https://bugs.llvm.org/show_bug.cgi?id=41417

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

------------------------------------------------------------------------

git-svn-id: https://llvm.org/svn/llvm-project/llvm/branches/release_80@360793 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Target/ARM/ARMISelLowering.cpp
test/CodeGen/ARM/tail-call-scheduling.ll [new file with mode: 0644]