This is an archive of the discontinued LLVM Phabricator instance.

[Sparc] Support user-specified stack object overalignment.
ClosedPublic

Authored by jyknight on Aug 20 2015, 1:05 PM.

Details

Summary

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...)

Diff Detail

Repository
rL LLVM

Event Timeline

jyknight updated this revision to Diff 32725.Aug 20 2015, 1:05 PM
jyknight retitled this revision from to [Sparc] Support user-specified stack object overalignment..
jyknight updated this object.
jyknight added a reviewer: chandlerc.
jyknight added subscribers: dougk, llvm-commits.
chandlerc added inline comments.Aug 20 2015, 1:28 PM
lib/Target/Sparc/SparcFrameLowering.cpp
99 ↗(On Diff #32725)

We usually mark these as 'FIXME'.

104 ↗(On Diff #32725)

I would keep this in a single comment block as otherwise it doesn't really make sense.

222–228 ↗(On Diff #32725)

You have two comment blocks here. The first one makes sense attached to the 'bool' variable. The second one would make much more sense attached to the if chain below.

lib/Target/Sparc/SparcRegisterInfo.cpp
181 ↗(On Diff #32725)

Not suer this comment is helpful. ;]

This revision was automatically updated to reflect the committed changes.

Oops, I accidentally pasted this review link into two commits. The actual relevant commit closing this review is rL245668.

rL245667 was supposed to be attached to D12164.