diff options
author | Pavel Chupin <pavel.v.chupin@intel.com> | 2014-08-20 11:59:22 +0000 |
---|---|---|
committer | Pavel Chupin <pavel.v.chupin@intel.com> | 2014-08-20 11:59:22 +0000 |
commit | 01a4e0a1ef710f8980ca459b9fe550f6e348d9b4 (patch) | |
tree | ce4cffdef9a4fe093dbddd18eb799c1f58d1a0b7 /llvm/lib/Target/X86/X86RegisterInfo.cpp | |
parent | c655f0c898ab43e8986ba1d47f66837c529e6c8a (diff) | |
download | bcm5719-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.cpp | 6 |
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); |