[llvm] r228924 - [X86] Call frame optimization - allow stack-relative movs to be folded into a push

Michael Kuperstein michael.m.kuperstein at intel.com
Thu Feb 12 06:17:36 PST 2015


Author: mkuper
Date: Thu Feb 12 08:17:35 2015
New Revision: 228924

URL: http://llvm.org/viewvc/llvm-project?rev=228924&view=rev
Log:
[X86] Call frame optimization - allow stack-relative movs to be folded into a push

Since we track esp precisely, there's no reason not to allow this.

Modified:
    llvm/trunk/lib/Target/X86/X86CallFrameOptimization.cpp
    llvm/trunk/test/CodeGen/X86/movtopush.ll

Modified: llvm/trunk/lib/Target/X86/X86CallFrameOptimization.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86CallFrameOptimization.cpp?rev=228924&r1=228923&r2=228924&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86CallFrameOptimization.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86CallFrameOptimization.cpp Thu Feb 12 08:17:35 2015
@@ -469,12 +469,6 @@ MachineInstr *X86CallFrameOptimization::
       DefMI->getParent() != FrameSetup->getParent())
     return nullptr;
 
-  // Be careful with movs that load from a stack slot, since it may get
-  // resolved incorrectly.
-  // TODO: Again, we already have the infrastructure, so this should work.
-  if (!DefMI->getOperand(1).isReg())
-    return nullptr;
-
   // Now, make sure everything else up until the ADJCALLSTACK is a sequence
   // of MOVs. To be less conservative would require duplicating a lot of the
   // logic from PeepholeOptimizer.

Modified: llvm/trunk/test/CodeGen/X86/movtopush.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/movtopush.ll?rev=228924&r1=228923&r2=228924&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/movtopush.ll (original)
+++ llvm/trunk/test/CodeGen/X86/movtopush.ll Thu Feb 12 08:17:35 2015
@@ -103,7 +103,8 @@ entry:
 ; NORMAL-NEXT: addl $16, %esp
 define void @test3(i32 %k) optsize {
 entry:
-  call void @good(i32 %k, i32 2, i32 3, i32 4)
+  %f = add i32 %k, 1
+  call void @good(i32 %f, i32 2, i32 3, i32 4)
   ret void
 }
 
@@ -200,21 +201,20 @@ entry:
   ret void
 }
 
-; But we don't want to fold stack-relative loads into the push,
-; because the offset will be wrong
+; Fold stack-relative loads into the push, with correct offset
+; In particular, at the second push, %b was at 12(%esp) and
+; %a wast at 8(%esp), but the second push bumped %esp, so %a
+; is now it at 12(%esp)
 ; NORMAL-LABEL: test8:
-; NORMAL-NOT: subl {{.*}} %esp
-; NORMAL: movl 4(%esp), [[EAX:%e..]]
-; NORMAL-NEXT: pushl   $4
-; NORMAL-NEXT: pushl   [[EAX]]
-; NORMAL-NEXT: pushl   $2
+; NORMAL: pushl   $4
+; NORMAL-NEXT: pushl   12(%esp)
+; NORMAL-NEXT: pushl   12(%esp)
 ; NORMAL-NEXT: pushl   $1
 ; NORMAL-NEXT: call
 ; NORMAL-NEXT: addl $16, %esp
-define void @test8(i32* %ptr) optsize {
+define void @test8(i32 %a, i32 %b) optsize {
 entry:
-  %val = ptrtoint i32* %ptr to i32
-  call void @good(i32 1, i32 2, i32 %val, i32 4)
+  call void @good(i32 1, i32 %a, i32 %b, i32 4)
   ret void
 }
 





More information about the llvm-commits mailing list