[llvm-commits] [llvm] r96686 - in /llvm/trunk: lib/CodeGen/MachineFunction.cpp lib/Target/X86/X86RegisterInfo.cpp test/CodeGen/X86/stack-align.ll
Chris Lattner
clattner at apple.com
Fri Feb 19 13:58:34 PST 2010
On Feb 19, 2010, at 10:17 AM, Charles Davis wrote:
> Author: cdavis
> Date: Fri Feb 19 12:17:13 2010
> New Revision: 96686
>
> URL: http://llvm.org/viewvc/llvm-project?rev=96686&view=rev
> Log:
> Add support for the 'alignstack' attribute to the x86 backend. Fixes PR5254.
>
> Also, FileCheck'ize a test.
Hi Charles,
Random question, do we really need 5 bits to store the alignment of the stack? Stored in log2 form, this supports stack alignment up to 2147483648 bytes. I think that supporting up to (say) 256 or 4096 bytes is plenty, and it would be good to not use the space in the Attributes word.
-Chris
>
> Modified:
> llvm/trunk/lib/CodeGen/MachineFunction.cpp
> llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp
> llvm/trunk/test/CodeGen/X86/stack-align.ll
>
> Modified: llvm/trunk/lib/CodeGen/MachineFunction.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineFunction.cpp?rev=96686&r1=96685&r2=96686&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/MachineFunction.cpp (original)
> +++ llvm/trunk/lib/CodeGen/MachineFunction.cpp Fri Feb 19 12:17:13 2010
> @@ -95,6 +95,9 @@
> MFInfo = 0;
> FrameInfo = new (Allocator.Allocate<MachineFrameInfo>())
> MachineFrameInfo(*TM.getFrameInfo());
> + if (Fn->hasFnAttr(Attribute::StackAlignment))
> + FrameInfo->setMaxAlignment(Attribute::getStackAlignmentFromAttrs(
> + Fn->getAttributes().getFnAttributes()));
> ConstantPool = new (Allocator.Allocate<MachineConstantPool>())
> MachineConstantPool(TM.getTargetData());
> Alignment = TM.getTargetLowering()->getFunctionAlignment(F);
>
> Modified: llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp?rev=96686&r1=96685&r2=96686&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp (original)
> +++ llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp Fri Feb 19 12:17:13 2010
> @@ -446,8 +446,10 @@
>
> bool X86RegisterInfo::needsStackRealignment(const MachineFunction &MF) const {
> const MachineFrameInfo *MFI = MF.getFrameInfo();
> + const Function *F = MF.getFunction();
> bool requiresRealignment =
> - RealignStack && (MFI->getMaxAlignment() > StackAlign);
> + RealignStack && ((MFI->getMaxAlignment() > StackAlign) ||
> + F->hasFnAttr(Attribute::StackAlignment));
>
> // FIXME: Currently we don't support stack realignment for functions with
> // variable-sized allocas.
>
> Modified: llvm/trunk/test/CodeGen/X86/stack-align.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/stack-align.ll?rev=96686&r1=96685&r2=96686&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/X86/stack-align.ll (original)
> +++ llvm/trunk/test/CodeGen/X86/stack-align.ll Fri Feb 19 12:17:13 2010
> @@ -1,4 +1,4 @@
> -; RUN: llc < %s -relocation-model=static -mcpu=yonah | grep {andpd.*4(%esp), %xmm}
> +; RUN: llc < %s -relocation-model=static -realign-stack=1 -mcpu=yonah | FileCheck %s
>
> ; The double argument is at 4(esp) which is 16-byte aligned, allowing us to
> ; fold the load into the andpd.
> @@ -12,6 +12,7 @@
> %tmp = getelementptr { double, double }* %z, i32 0, i32 0 ; <double*> [#uses=1]
> %tmp1 = load double* %tmp, align 8 ; <double> [#uses=1]
> %tmp2 = tail call double @fabs( double %tmp1 ) ; <double> [#uses=1]
> + ; CHECK: andpd{{.*}}4(%esp), %xmm
> %tmp3 = load double* @G, align 16 ; <double> [#uses=1]
> %tmp4 = tail call double @fabs( double %tmp3 ) ; <double> [#uses=1]
> %tmp6 = fadd double %tmp4, %tmp2 ; <double> [#uses=1]
> @@ -19,4 +20,20 @@
> ret void
> }
>
> +define void @test2() alignstack(16) {
> +entry:
> + ; CHECK: andl{{.*}}$-16, %esp
> + ret void
> +}
> +
> +; Use a call to force a spill.
> +define <2 x double> @test3(<2 x double> %x, <2 x double> %y) alignstack(32) {
> +entry:
> + ; CHECK: andl{{.*}}$-32, %esp
> + call void @test2()
> + %A = mul <2 x double> %x, %y
> + ret <2 x double> %A
> +}
> +
> declare double @fabs(double)
> +
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list