CopyToReg source operand can be a physical register.
authorLauro Ramos Venancio <lauro.venancio@gmail.com>
Tue, 20 Mar 2007 16:46:44 +0000 (16:46 +0000)
committerLauro Ramos Venancio <lauro.venancio@gmail.com>
Tue, 20 Mar 2007 16:46:44 +0000 (16:46 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@35213 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/ScheduleDAG.cpp

index ca256deeaf7a96a3a18d56aa1a41e8cb10e71cbe..10a85868d552130d82b943cfa98bc23bc8a57864 100644 (file)
@@ -475,9 +475,25 @@ void ScheduleDAG::EmitNode(SDNode *Node,
       else
         InReg = getVR(Node->getOperand(2), VRBaseMap);
       unsigned DestReg = cast<RegisterSDNode>(Node->getOperand(1))->getReg();
-      if (InReg != DestReg)   // Coalesced away the copy?
-        MRI->copyRegToReg(*BB, BB->end(), DestReg, InReg,
-                          RegMap->getRegClass(InReg));
+      if (InReg != DestReg)  {// Coalesced away the copy?
+        const TargetRegisterClass *TRC = 0;
+        // Get the target register class
+        if (MRegisterInfo::isVirtualRegister(InReg)) {
+          TRC = RegMap->getRegClass(InReg);
+        } else {
+          // Pick the register class of the right type that contains this
+          // physreg.
+          for (MRegisterInfo::regclass_iterator I = MRI->regclass_begin(),
+                 E = MRI->regclass_end(); I != E; ++I)
+            if ((*I)->hasType(Node->getOperand(2).getValueType()) &&
+                (*I)->contains(InReg)) {
+              TRC = *I;
+              break;
+            }
+          assert(TRC && "Couldn't find register class for reg copy!");
+        }
+        MRI->copyRegToReg(*BB, BB->end(), DestReg, InReg, TRC);
+      }
       break;
     }
     case ISD::CopyFromReg: {