aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2006-02-23 00:13:58 +0000
committerEvan Cheng <evan.cheng@apple.com>2006-02-23 00:13:58 +0000
commit224ec39cab5298cfd196c0b5d2ac4825f8e2ab12 (patch)
tree635104ae92cd410d5670ad16c81b7e2c727d6db3
parent4ba9cd53bae1d989bf1f620e301eae0c7b497791 (diff)
X86 codegen tweak to use lea in another case:
Suppose base == %eax and it has multiple uses, then instead of movl %eax, %ecx addl $8, %ecx use leal 8(%eax), %ecx. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@26323 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Target/X86/X86ISelDAGToDAG.cpp21
1 files changed, 12 insertions, 9 deletions
diff --git a/lib/Target/X86/X86ISelDAGToDAG.cpp b/lib/Target/X86/X86ISelDAGToDAG.cpp
index 4b1e9d2faa..bea35ec3c8 100644
--- a/lib/Target/X86/X86ISelDAGToDAG.cpp
+++ b/lib/Target/X86/X86ISelDAGToDAG.cpp
@@ -457,23 +457,19 @@ bool X86DAGToDAGISel::SelectLEAAddr(SDOperand N, SDOperand &Base,
SDOperand &Index, SDOperand &Disp) {
X86ISelAddressMode AM;
if (!MatchAddress(N, AM)) {
- bool SelectBase = false;
bool SelectIndex = false;
bool Check = false;
if (AM.BaseType == X86ISelAddressMode::RegBase) {
- if (AM.Base.Reg.Val) {
- Check = true;
- SelectBase = true;
- } else {
+ if (AM.Base.Reg.Val)
+ Check = true;
+ else
AM.Base.Reg = CurDAG->getRegister(0, MVT::i32);
- }
}
- if (AM.IndexReg.Val) {
+ if (AM.IndexReg.Val)
SelectIndex = true;
- } else {
+ else
AM.IndexReg = CurDAG->getRegister(0, MVT::i32);
- }
if (Check) {
unsigned Complexity = 0;
@@ -485,6 +481,13 @@ bool X86DAGToDAGISel::SelectLEAAddr(SDOperand N, SDOperand &Base,
Complexity++;
else if (AM.Disp > 1)
Complexity++;
+ // Suppose base == %eax and it has multiple uses, then instead of
+ // movl %eax, %ecx
+ // addl $8, %ecx
+ // use
+ // leal 8(%eax), %ecx.
+ if (AM.Base.Reg.Val->use_size() > 1)
+ Complexity++;
if (Complexity <= 1)
return false;
}