summaryrefslogtreecommitdiff
path: root/lib/CodeGen/StackSlotColoring.cpp
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2009-05-05 00:46:16 +0000
committerEvan Cheng <evan.cheng@apple.com>2009-05-05 00:46:16 +0000
commitbef60d38045dbde1971f3721e0787eaa5f1d511f (patch)
tree45539df03c9c2f86af4ea2eb478707467e4a433a /lib/CodeGen/StackSlotColoring.cpp
parentd923fc621ff5b5e500977edf9236c9e34e8d7ebc (diff)
downloadllvm-bef60d38045dbde1971f3721e0787eaa5f1d511f.tar.gz
llvm-bef60d38045dbde1971f3721e0787eaa5f1d511f.tar.bz2
llvm-bef60d38045dbde1971f3721e0787eaa5f1d511f.tar.xz
Do not substitute if the new register isn't in the register class of the operand being updated.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@70953 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/StackSlotColoring.cpp')
-rw-r--r--lib/CodeGen/StackSlotColoring.cpp14
1 files changed, 14 insertions, 0 deletions
diff --git a/lib/CodeGen/StackSlotColoring.cpp b/lib/CodeGen/StackSlotColoring.cpp
index bc8353a318..0d9b85af8e 100644
--- a/lib/CodeGen/StackSlotColoring.cpp
+++ b/lib/CodeGen/StackSlotColoring.cpp
@@ -477,6 +477,7 @@ bool StackSlotColoring::PropagateBackward(MachineBasicBlock::iterator MII,
bool FoundDef = false; // Not counting 2address def.
bool FoundUse = false;
bool FoundKill = false;
+ const TargetInstrDesc &TID = MII->getDesc();
for (unsigned i = 0, e = MII->getNumOperands(); i != e; ++i) {
MachineOperand &MO = MII->getOperand(i);
if (!MO.isReg())
@@ -485,6 +486,10 @@ bool StackSlotColoring::PropagateBackward(MachineBasicBlock::iterator MII,
if (Reg == 0)
continue;
if (Reg == OldReg) {
+ const TargetRegisterClass *RC = getInstrOperandRegClass(TRI, TID, i);
+ if (RC && !RC->contains(NewReg))
+ return false;
+
if (MO.isUse()) {
FoundUse = true;
if (MO.isKill())
@@ -521,6 +526,7 @@ bool StackSlotColoring::PropagateForward(MachineBasicBlock::iterator MII,
while (++MII != MBB->end()) {
bool FoundUse = false;
bool FoundKill = false;
+ const TargetInstrDesc &TID = MII->getDesc();
for (unsigned i = 0, e = MII->getNumOperands(); i != e; ++i) {
MachineOperand &MO = MII->getOperand(i);
if (!MO.isReg())
@@ -531,6 +537,10 @@ bool StackSlotColoring::PropagateForward(MachineBasicBlock::iterator MII,
if (Reg == OldReg) {
if (MO.isDef())
return false;
+
+ const TargetRegisterClass *RC = getInstrOperandRegClass(TRI, TID, i);
+ if (RC && !RC->contains(NewReg))
+ return false;
FoundUse = true;
if (MO.isKill())
FoundKill = true;
@@ -558,6 +568,8 @@ void StackSlotColoring::UnfoldAndRewriteInstruction(MachineInstr *MI, int OldFI,
MachineBasicBlock *MBB = MI->getParent();
if (unsigned DstReg = TII->isLoadFromStackSlot(MI, OldFI)) {
if (PropagateForward(MI, MBB, DstReg, Reg)) {
+ DOUT << "Eliminated load: ";
+ DEBUG(MI->dump());
++NumLoadElim;
} else {
TII->copyRegToReg(*MBB, MI, DstReg, Reg, RC, RC);
@@ -565,6 +577,8 @@ void StackSlotColoring::UnfoldAndRewriteInstruction(MachineInstr *MI, int OldFI,
}
} else if (unsigned SrcReg = TII->isStoreToStackSlot(MI, OldFI)) {
if (MI->killsRegister(SrcReg) && PropagateBackward(MI, MBB, SrcReg, Reg)) {
+ DOUT << "Eliminated store: ";
+ DEBUG(MI->dump());
++NumStoreElim;
} else {
TII->copyRegToReg(*MBB, MI, Reg, SrcReg, RC, RC);