Do not substitute if the new register isn't in the register class of the operand...
authorEvan Cheng <evan.cheng@apple.com>
Tue, 5 May 2009 00:46:16 +0000 (00:46 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Tue, 5 May 2009 00:46:16 +0000 (00:46 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@70953 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/StackSlotColoring.cpp

index bc8353a3182553a35fe7761a646369f2a3342a5d..0d9b85af8e7e7624758cc2669378e698fc24fef0 100644 (file)
@@ -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);