X86: Use 'mov' instead of 'lea' in Win64 SEH prologues when possible
authorDavid Majnemer <david.majnemer@gmail.com>
Mon, 23 Feb 2015 21:50:27 +0000 (21:50 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Mon, 23 Feb 2015 21:50:27 +0000 (21:50 +0000)
'mov' and 'lea' are equivalent when the displacement applied with 'lea'
is zero.  However, 'mov' should encode smaller.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@230269 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86FrameLowering.cpp
test/CodeGen/X86/frameaddr.ll
test/CodeGen/X86/win64_frame.ll

index 5657def8ce9449bfa69dfca1e282f754c0de9d48..75fd4fdb434f6727bb3eac51292680e983186417 100644 (file)
@@ -863,8 +863,11 @@ void X86FrameLowering::emitPrologue(MachineFunction &MF) const {
   int SEHFrameOffset = 0;
   if (IsWinEH && HasFP) {
     SEHFrameOffset = calculateSetFPREG(NumBytes);
-    addRegOffset(BuildMI(MBB, MBBI, DL, TII.get(X86::LEA64r), FramePtr),
-                 StackPtr, false, SEHFrameOffset);
+    if (SEHFrameOffset)
+      addRegOffset(BuildMI(MBB, MBBI, DL, TII.get(X86::LEA64r), FramePtr),
+                   StackPtr, false, SEHFrameOffset);
+    else
+      BuildMI(MBB, MBBI, DL, TII.get(X86::MOV64rr), FramePtr).addReg(StackPtr);
 
     if (NeedsWinEH)
       BuildMI(MBB, MBBI, DL, TII.get(X86::SEH_SetFrame))
index 27eac634078abcc5a65119a79d5bcc37bc329438..5646196a586b40c6b38cd8821565d42fa3f6be1d 100644 (file)
@@ -18,7 +18,7 @@ entry:
 ; CHECK-32-NEXT:  ret
 ; CHECK-W64-LABEL: test1
 ; CHECK-W64:       push
-; CHECK-W64-NEXT:  leaq (%rsp), %rbp
+; CHECK-W64-NEXT:  movq %rsp, %rbp
 ; CHECK-W64-NEXT:  leaq (%rbp), %rax
 ; CHECK-W64-NEXT:  pop
 ; CHECK-W64-NEXT:  ret
@@ -53,7 +53,7 @@ entry:
 ; CHECK-32-NEXT:  ret
 ; CHECK-W64-LABEL: test2
 ; CHECK-W64:       push
-; CHECK-W64-NEXT:  leaq (%rsp), %rbp
+; CHECK-W64-NEXT:  movq %rsp, %rbp
 ; CHECK-W64-NEXT:  leaq (%rbp), %rax
 ; CHECK-W64-NEXT:  pop
 ; CHECK-W64-NEXT:  ret
index 535f8b4b0597879c9f0a86bb834f9c5679871f9a..ddba716d691c26d7be4fece9bce6c8cb0341f4ae 100644 (file)
@@ -9,7 +9,7 @@ define i32 @f1(i32 %p1, i32 %p2, i32 %p3, i32 %p4, i32 %p5) "no-frame-pointer-el
 define void @f2(i32 %p, ...) "no-frame-pointer-elim"="true" {
   ; CHECK-LABEL: f2:
   ; CHECK:      .seh_stackalloc 8
-  ; CHECK:      leaq    (%rsp), %rbp
+  ; CHECK:      movq    %rsp, %rbp
   ; CHECK:      .seh_setframe 5, 0
   ; CHECK:      movq    %rdx, 32(%rbp)
   ; CHECK:      leaq    32(%rbp), %rax
@@ -20,7 +20,7 @@ define void @f2(i32 %p, ...) "no-frame-pointer-elim"="true" {
 
 define i8* @f3() "no-frame-pointer-elim"="true" {
   ; CHECK-LABEL: f3:
-  ; CHECK:      leaq    (%rsp), %rbp
+  ; CHECK:      movq    %rsp, %rbp
   ; CHECK:      .seh_setframe 5, 0
   ; CHECK:      movq    8(%rbp), %rax
   %ra = call i8* @llvm.returnaddress(i32 0)