[llvm-commits] [llvm] r170961 - in /llvm/trunk: lib/Target/X86/X86FrameLowering.cpp lib/Target/X86/X86InstrInfo.cpp test/CodeGen/X86/clobber-fi0.ll

Craig Topper craig.topper at gmail.com
Fri Dec 21 16:52:38 PST 2012


On Fri, Dec 21, 2012 at 3:48 PM, Nadav Rotem <nrotem at apple.com> wrote:

> Author: nadav
> Date: Fri Dec 21 17:48:49 2012
> New Revision: 170961
>
> URL: http://llvm.org/viewvc/llvm-project?rev=170961&view=rev
> Log:
> In some cases, due to scheduling constraints we copy the EFLAGS.
> The only way to read the eflags is using push and pop. If we don't
> adjust the stack then we run over the first frame index. This is
> not something that we want to do, so we have to make sure that
> our machine function does not copy the flags. If it does then
> we have to emit the prolog that adjusts the stack.
>
> rdar://12896831
>
>
> Added:
>     llvm/trunk/test/CodeGen/X86/clobber-fi0.ll
> Modified:
>     llvm/trunk/lib/Target/X86/X86FrameLowering.cpp
>     llvm/trunk/lib/Target/X86/X86InstrInfo.cpp
>
> Modified: llvm/trunk/lib/Target/X86/X86FrameLowering.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86FrameLowering.cpp?rev=170961&r1=170960&r2=170961&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/X86FrameLowering.cpp (original)
> +++ llvm/trunk/lib/Target/X86/X86FrameLowering.cpp Fri Dec 21 17:48:49 2012
> @@ -625,6 +625,22 @@
>    return CompactUnwindEncoding;
>  }
>
> +/// colobbersTheStack - This function checks if any of the users of EFLAGS
> +/// copies the EFLAGS. We know that the code that lowers COPY of EFLAGS
> has
> +/// to use the stack, and if we don't adjust the stack we clobber the
> first
> +/// frame index.
> +/// See  X86InstrInfo::copyPhysReg.
> +static bool colobbersTheStack(MachineFunction &MF) {
>

colobbers?


> +  MachineRegisterInfo &MRI = MF.getRegInfo();
> +
> +  for (MachineRegisterInfo::reg_iterator ri = MRI.reg_begin(X86::EFLAGS),
> +       re = MRI.reg_end(); ri != re; ++ri)
> +    if (ri->isCopy())
> +      return true;
> +
> +  return false;
> +}
> +
>  /// emitPrologue - Push callee-saved registers onto the stack, which
>  /// automatically adjust the stack pointer. Adjust the stack pointer to
> allocate
>  /// space for local variables. Also emit labels used by the exception
> handler to
> @@ -673,12 +689,14 @@
>    // If this is x86-64 and the Red Zone is not disabled, if we are a leaf
>    // function, and use up to 128 bytes of stack space, don't have a frame
>    // pointer, calls, or dynamic alloca then we do not need to adjust the
> -  // stack pointer (we fit in the Red Zone).
> +  // stack pointer (we fit in the Red Zone). We also check that we don't
> +  // push and pop from the stack.
>    if (Is64Bit &&
> !Fn->getFnAttributes().hasAttribute(Attribute::NoRedZone) &&
>        !RegInfo->needsStackRealignment(MF) &&
>        !MFI->hasVarSizedObjects() &&                     // No dynamic
> alloca.
>        !MFI->adjustsStack() &&                           // No calls.
>        !IsWin64 &&                                       // Win64 has no
> Red Zone
> +      !colobbersTheStack(MF) &&                         // Don't push and
> pop.
>        !MF.getTarget().Options.EnableSegmentedStacks) {  // Regular stack
>      uint64_t MinSize = X86FI->getCalleeSavedFrameSize();
>      if (HasFP) MinSize += SlotSize;
>
> Modified: llvm/trunk/lib/Target/X86/X86InstrInfo.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrInfo.cpp?rev=170961&r1=170960&r2=170961&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/X86InstrInfo.cpp (original)
> +++ llvm/trunk/lib/Target/X86/X86InstrInfo.cpp Fri Dec 21 17:48:49 2012
> @@ -2892,6 +2892,8 @@
>    }
>
>    // Moving EFLAGS to / from another register requires a push and a pop.
> +  // Notice that we have to adjust the stack if we don't want to clobber
> the
> +  // first frame index. See X86FrameLowering.cpp - colobbersTheStack.
>    if (SrcReg == X86::EFLAGS) {
>      if (X86::GR64RegClass.contains(DestReg)) {
>        BuildMI(MBB, MI, DL, get(X86::PUSHF64));
>
> Added: llvm/trunk/test/CodeGen/X86/clobber-fi0.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/clobber-fi0.ll?rev=170961&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/X86/clobber-fi0.ll (added)
> +++ llvm/trunk/test/CodeGen/X86/clobber-fi0.ll Fri Dec 21 17:48:49 2012
> @@ -0,0 +1,37 @@
> +; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux | FileCheck %s
> +
> +target datalayout =
> "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
> +target triple = "x86_64-apple-macosx10.7.0"
> +
> +; In the code below we need to copy the EFLAGS because of scheduling
> constraints.
> +; When copying the EFLAGS we need to write to the stack with push/pop.
> This forces
> +; us to emit the prolog.
> +
> +; CHECK: main
> +; CHECK: subq{{.*}}rsp
> +; CHECK: ret
> +define i32 @main(i32 %arg, i8** %arg1) nounwind {
> +bb:
> +  %tmp = alloca i32, align 4                      ; [#uses=3 type=i32*]
> +  %tmp2 = alloca i32, align 4                     ; [#uses=3 type=i32*]
> +  %tmp3 = alloca i32                              ; [#uses=1 type=i32*]
> +  store i32 1, i32* %tmp, align 4
> +  store i32 1, i32* %tmp2, align 4
> +  br label %bb4
> +
> +bb4:                                              ; preds = %bb4, %bb
> +  %tmp6 = load i32* %tmp2, align 4                ; [#uses=1 type=i32]
> +  %tmp7 = add i32 %tmp6, -1                       ; [#uses=2 type=i32]
> +  store i32 %tmp7, i32* %tmp2, align 4
> +  %tmp8 = icmp eq i32 %tmp7, 0                    ; [#uses=1 type=i1]
> +  %tmp9 = load i32* %tmp                          ; [#uses=1 type=i32]
> +  %tmp10 = add i32 %tmp9, -1              ; [#uses=1 type=i32]
> +  store i32 %tmp10, i32* %tmp3
> +  br i1 %tmp8, label %bb11, label %bb4
> +
> +bb11:                                             ; preds = %bb4
> +  %tmp12 = load i32* %tmp, align 4                ; [#uses=1 type=i32]
> +  ret i32 %tmp12
> +}
> +
> +
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>



-- 
~Craig
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20121221/54227e07/attachment.html>


More information about the llvm-commits mailing list