aboutsummaryrefslogtreecommitdiffstats
path: root/lib
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
commit427f4c106ac14dcf323dc1bbaf1b8040da03c3c7 (patch)
treedc250526b9a0b0024e77ee0067df56f6a4ea1623 /lib
parent82b53cd2baaa2de3bffc65e115de44fe856c218b (diff)
downloadexternal_llvm-427f4c106ac14dcf323dc1bbaf1b8040da03c3c7.tar.gz
external_llvm-427f4c106ac14dcf323dc1bbaf1b8040da03c3c7.tar.bz2
external_llvm-427f4c106ac14dcf323dc1bbaf1b8040da03c3c7.zip
It's not safe to fold a load from GV stub or constantpool into a two-address use.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@49002 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/CodeGen/LiveIntervalAnalysis.cpp5
-rw-r--r--lib/Target/X86/X86InstrInfo.cpp8
2 files changed, 11 insertions, 2 deletions
diff --git a/lib/CodeGen/LiveIntervalAnalysis.cpp b/lib/CodeGen/LiveIntervalAnalysis.cpp
index 621c83df7a..f29b61b59f 100644
--- a/lib/CodeGen/LiveIntervalAnalysis.cpp
+++ b/lib/CodeGen/LiveIntervalAnalysis.cpp
@@ -757,8 +757,9 @@ bool LiveIntervals::tryFoldMemoryOperand(MachineInstr* &MI,
if (FilterFoldedOps(MI, Ops, MRInfo, FoldOps))
return false;
- // Can't fold a load from fixed stack slot into a two address instruction.
- if (isSS && DefMI && (MRInfo & VirtRegMap::isMod))
+ // The only time it's safe to fold into a two address instruction is when
+ // it's folding reload and spill from / into a spill stack slot.
+ if (DefMI && (MRInfo & VirtRegMap::isMod))
return false;
MachineInstr *fmi = isSS ? tii_->foldMemoryOperand(*mf_, MI, FoldOps, Slot)
diff --git a/lib/Target/X86/X86InstrInfo.cpp b/lib/Target/X86/X86InstrInfo.cpp
index ffe2083322..8a5464567f 100644
--- a/lib/Target/X86/X86InstrInfo.cpp
+++ b/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)