On Tue, Oct 23, 2012 at 12:56 PM, Eric Christopher <echristo at
gmail.com>wrote:
> > Thanks for replying so quickly. Would you elaborate on this further?
> >
> > It seems costly to change the default stack alignment on the platform,
> since
> > that would require recompiling all of the system and user libraries to
> also
> > adhere to 32-byte stack alignment. Depending on an alignment not
> specified
> > by the ABI would also limit our compiler's interoperability with
other
> > compilers installed on the system.
> >
> > I suppose that the stack could be aligned dynamically at main(...) and
> other
> > visible entry points, but that too seems costly compared to the
current
> > M.O..
> >
> > Maybe I do not fully understand all the issues involved, but I suppose
I
> > should be able to dynamically align the stack only when AVX registers
are
> > spilled in a function, right? Seems reasonable with my limited
> knowledge. Do
> > you have any intuition built? It could be possible that the
> > prologue/epilogue emitters run prior to the spilling decisions. I am
not
> so
> > sure of the ordering here.
> >
> > Also, and this might be asking a lot, but do you have any insight into
> why
> > this behaviour changed sometime around the LLVM 3.0 release? I have
not
> been
> > able to find much history.
> >
>
> It should only be happening if there is either a variable stored or
> saved on the stack. Functions without AVX shouldn't cause a 32-byte
> aligned stack or a realignment unless they are using callee saved
> registers that are clobbered, etc. Basically any stack traffic with an
> AVX register should cause a dynamic realignment and otherwise we
> should use the default abi alignment. Arguably a bug if anything else
> is happening.
>
Yes, I believe that this is happening if any AVX register is used in a
function; an AVX variable does not necessarily need to be placed on the
stack.
Maybe I am misunderstanding this piece of code though...
> // Be over-conservative: scan over all vreg defs and find whether
vector> // registers are used. If yes, there is a possibility that vector
register> // will be spilled and thus require dynamic stack realignment.
> for (unsigned i = 0, e = RI.getNumVirtRegs(); i != e; ++i) {
> unsigned Reg = TargetRegisterInfo::index2VirtReg(i);
> if (RI.getRegClass(Reg)->getAlignment() > StackAlignment) {
> FuncInfo->setForceFramePointer(true); // <= Forces Frame
Pointer
for any AVX reg use!!!> return true;
> }
> }
Just to be pedantic, at one time this did work properly for AVX without
adding the unnecessary frame pointer. It is a proper regression.
-Cameron
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20121023/175b4685/attachment.html>