[PATCH] D12208: [Sparc] Support user-specified stack object overalignment.

James Y Knight via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 20 13:05:47 PDT 2015


jyknight created this revision.
jyknight added a reviewer: chandlerc.
jyknight added subscribers: dougk, llvm-commits.

Note: I do not implement a base pointer, so it's still impossible to
have dynamic realignment AND dynamic alloca in the same function.

Now, stack realignment for sparc is actually a silly thing to support,
because the Sparc ABI has no need for it -- unlike the situation on
x86, the stack is ALWAYS aligned to the required alignment for the CPU
instructions: 8 bytes on sparcv8, and 16 bytes on sparcv9.

However, LLVM unfortunately implements user-specified overalignment
using stack realignment support, so for now, I'm going to go along
with that tradition. GCC instead treats objects which have alignment
specification greater than the maximum CPU-required alignment for the
target as a separate block of stack memory, with their own virtual
base pointer (which gets aligned). Doing it that way avoids needing to
implement per-target support for stack realignment, except for the
targets which *actually* have an ABI-specified stack alignment which
is too small for the CPU's requirements.

Further unfortunately in LLVM, the default canRealignStack for all
targets effectively returns true, despite that implementing that is
something a target needs to do specifically. So, the previous behavior
on Sparc was to silently ignore the user's specified stack
alignment. Ugh.

Yet MORE unfortunate, if a target actually does return false from
canRealignStack, that also causes the user-specified alignment to be
*silently ignored*, rather than emitting an error.

(I started looking into fixing that last, but it broke a bunch of
tests, because LLVM actually *depends* on having it silently ignored:
some architectures (e.g. non-linux i386) have smaller stack alignment
than spilled-register alignment. But, the fact that a register needs
spilling is not known until within the register allocator. And by that
point, the decision to not reserve the frame pointer has been frozen
in place. And without a frame pointer, stack realignment is not
possible. So, canRealignStack() returns false, and
needsStackRealignment() then returns false, assuming everyone can just
go on their merry way assuming the alignment requirements were
probably just suggestions after-all. Sigh...)

http://reviews.llvm.org/D12208

Files:
  lib/Target/Sparc/SparcFrameLowering.cpp
  lib/Target/Sparc/SparcFrameLowering.h
  lib/Target/Sparc/SparcRegisterInfo.cpp
  lib/Target/Sparc/SparcRegisterInfo.h
  test/CodeGen/SPARC/fp128.ll
  test/CodeGen/SPARC/stack-align.ll

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D12208.32725.patch
Type: text/x-patch
Size: 12064 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150820/aa9a7f62/attachment.bin>


More information about the llvm-commits mailing list