summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/X86/X86RegisterInfo.cpp
diff options
context:
space:
mode:
authorPavel Chupin <pavel.v.chupin@intel.com>2014-08-20 11:59:22 +0000
committerPavel Chupin <pavel.v.chupin@intel.com>2014-08-20 11:59:22 +0000
commit01a4e0a1ef710f8980ca459b9fe550f6e348d9b4 (patch)
treece4cffdef9a4fe093dbddd18eb799c1f58d1a0b7 /llvm/lib/Target/X86/X86RegisterInfo.cpp
parentc655f0c898ab43e8986ba1d47f66837c529e6c8a (diff)
downloadbcm5719-llvm-01a4e0a1ef710f8980ca459b9fe550f6e348d9b4.tar.gz
bcm5719-llvm-01a4e0a1ef710f8980ca459b9fe550f6e348d9b4.zip
[x32] Fix FrameIndex check in SelectLEA64_32Addr
Summary: Fixes http://llvm.org/bugs/show_bug.cgi?id=20016 reproducible on new lea-5.ll case. Also use RSP/RBP for x32 lea to save 1 byte used for 0x67 prefix in ESP/EBP case. Test Plan: lea tests modified to include x32/nacl and new test added Reviewers: nadav, dschuff, t.p.northover Subscribers: llvm-commits, zinovy.nis Differential Revision: http://reviews.llvm.org/D4929 llvm-svn: 216065
Diffstat (limited to 'llvm/lib/Target/X86/X86RegisterInfo.cpp')
-rw-r--r--llvm/lib/Target/X86/X86RegisterInfo.cpp6
1 files changed, 6 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86RegisterInfo.cpp b/llvm/lib/Target/X86/X86RegisterInfo.cpp
index 97f86e2760d..40796546a2a 100644
--- a/llvm/lib/Target/X86/X86RegisterInfo.cpp
+++ b/llvm/lib/Target/X86/X86RegisterInfo.cpp
@@ -489,6 +489,12 @@ X86RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
else
BasePtr = (TFI->hasFP(MF) ? FramePtr : StackPtr);
+ // For LEA64_32r when BasePtr is 32-bits (X32) we can use full-size 64-bit
+ // register as source operand, semantic is the same and destination is
+ // 32-bits. It saves one byte per lea in code since 0x67 prefix is avoided.
+ if (Opc == X86::LEA64_32r && X86::GR32RegClass.contains(BasePtr))
+ BasePtr = getX86SubSuperRegister(BasePtr, MVT::i64, false);
+
// This must be part of a four operand memory reference. Replace the
// FrameIndex with base register with EBP. Add an offset to the offset.
MI.getOperand(FIOperandNum).ChangeToRegister(BasePtr, false);
OpenPOWER on IntegriCloud