summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/X86
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2008-03-31 23:19:51 +0000
committerEvan Cheng <evan.cheng@apple.com>2008-03-31 23:19:51 +0000
commite4f77c69ac8909f7272c5e25e4857c8f9305618e (patch)
treee5aa7654d7ee03ee264e6300db4c021c07d76e12 /llvm/lib/Target/X86
parent3bcfc6edc081df57ecb9f5fcd61b328630f2398b (diff)
downloadbcm5719-llvm-e4f77c69ac8909f7272c5e25e4857c8f9305618e.tar.gz
bcm5719-llvm-e4f77c69ac8909f7272c5e25e4857c8f9305618e.zip
It's not safe to fold a load from GV stub or constantpool into a two-address use.
llvm-svn: 49002
Diffstat (limited to 'llvm/lib/Target/X86')
-rw-r--r--llvm/lib/Target/X86/X86InstrInfo.cpp8
1 files changed, 8 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86InstrInfo.cpp b/llvm/lib/Target/X86/X86InstrInfo.cpp
index ffe20833228..8a5464567ff 100644
--- a/llvm/lib/Target/X86/X86InstrInfo.cpp
+++ b/llvm/lib/Target/X86/X86InstrInfo.cpp
@@ -1825,7 +1825,15 @@ X86InstrInfo::foldMemoryOperand(MachineInstr *MI, unsigned i,
MI->getOperand(0).getReg() == MI->getOperand(1).getReg()) {
OpcodeTablePtr = &RegOp2MemOpTable2Addr;
isTwoAddrFold = true;
+ // Can't write back to CPI or a GV stub.
+ if (MOs[3].isCPI() ||
+ (MOs[3].isGlobal() && isGVStub(MOs[3].getGlobal(), TM)))
+ return NULL;
} else if (i == 0) { // If operand 0
+ // Can't write back to CPI or a GV stub.
+ if (MOs[3].isCPI() ||
+ (MOs[3].isGlobal() && isGVStub(MOs[3].getGlobal(), TM)))
+ return NULL;
if (MI->getOpcode() == X86::MOV16r0)
NewMI = MakeM0Inst(*this, X86::MOV16mi, MOs, MI);
else if (MI->getOpcode() == X86::MOV32r0)
OpenPOWER on IntegriCloud