[AArch64] Don't combine callee-save and local stack adjustment when optimizing for...
commit40c2ef733ef89d43bfedf3dcd665e00478a82507
authorDavid Green <david.green@arm.com>
Fri, 18 Oct 2019 10:35:46 +0000 (18 10:35 +0000)
committerDavid Green <david.green@arm.com>
Fri, 18 Oct 2019 10:35:46 +0000 (18 10:35 +0000)
tree59a9f707736b419a196eff22156b04b32d602ee0
parentf1a723063c148be1542c0a1fc00606c82774436b
[AArch64] Don't combine callee-save and local stack adjustment when optimizing for size

For arm64, D18619 introduced the ability to combine bumping the stack pointer
upfront in case it needs to be bumped for both the callee-save area as well as
the local stack area.

That diff already remarks that "This change can cause an increase in
instructions", but argues that even when that happens, it should be still be a
performance benefit because the number of micro-ops is reduced.

We have observed that this code-size increase can be significant in practice.
This diff disables combining stack bumping for methods that are marked as
optimize-for-size.

Example of a prologue with the behavior before this diff (combining stack bumping when possible):
  sub        sp, sp, #0x40
  stp        d9, d8, [sp, #0x10]
  stp        x20, x19, [sp, #0x20]
  stp        x29, x30, [sp, #0x30]
  add        x29, sp, #0x30
  [... compute x8 somehow ...]
  stp        x0, x8, [sp]

And after this  diff, if the method is marked as optimize-for-size:
  stp        d9, d8, [sp, #-0x30]!
  stp        x20, x19, [sp, #0x10]
  stp        x29, x30, [sp, #0x20]
  add        x29, sp, #0x20
  [... compute x8 somehow ...]
  stp        x0, x8, [sp, #-0x10]!

Note that without combining the stack bump there are two auto-decrements,
nicely folded into the stp instructions, whereas otherwise there is a single
sub sp, ... instruction, but not folded.

Patch by Nikolai Tillmann!

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@375217 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Target/AArch64/AArch64FrameLowering.cpp
test/CodeGen/AArch64/arm64-never-combine-csr-local-stack-bump-for-size.ll [new file with mode: 0644]