[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