summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2015-02-23 21:50:27 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2015-02-23 21:50:27 +0000
commit31d868b6189a48e9ee398b15d91ccc1ec53f2b83 (patch)
tree0a2fec8e8a442f4c347d6e75d0f04853dbddfd96
parentb85e023b8b2358145f39c3a7bc9a5c0e644e8d6d (diff)
downloadbcm5719-llvm-31d868b6189a48e9ee398b15d91ccc1ec53f2b83.tar.gz
bcm5719-llvm-31d868b6189a48e9ee398b15d91ccc1ec53f2b83.zip
X86: Use 'mov' instead of 'lea' in Win64 SEH prologues when possible
'mov' and 'lea' are equivalent when the displacement applied with 'lea' is zero. However, 'mov' should encode smaller. llvm-svn: 230269
-rw-r--r--llvm/lib/Target/X86/X86FrameLowering.cpp7
-rw-r--r--llvm/test/CodeGen/X86/frameaddr.ll4
-rw-r--r--llvm/test/CodeGen/X86/win64_frame.ll4
3 files changed, 9 insertions, 6 deletions
diff --git a/llvm/lib/Target/X86/X86FrameLowering.cpp b/llvm/lib/Target/X86/X86FrameLowering.cpp
index 5657def8ce9..75fd4fdb434 100644
--- a/llvm/lib/Target/X86/X86FrameLowering.cpp
+++ b/llvm/lib/Target/X86/X86FrameLowering.cpp
@@ -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))
diff --git a/llvm/test/CodeGen/X86/frameaddr.ll b/llvm/test/CodeGen/X86/frameaddr.ll
index 27eac634078..5646196a586 100644
--- a/llvm/test/CodeGen/X86/frameaddr.ll
+++ b/llvm/test/CodeGen/X86/frameaddr.ll
@@ -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
diff --git a/llvm/test/CodeGen/X86/win64_frame.ll b/llvm/test/CodeGen/X86/win64_frame.ll
index 535f8b4b059..ddba716d691 100644
--- a/llvm/test/CodeGen/X86/win64_frame.ll
+++ b/llvm/test/CodeGen/X86/win64_frame.ll
@@ -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)
OpenPOWER on IntegriCloud