[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp

Lauro Ramos Venancio lauro.venancio at gmail.com
Tue Mar 20 09:47:04 PDT 2007



Changes in directory llvm/lib/CodeGen/SelectionDAG:

ScheduleDAG.cpp updated: 1.122 -> 1.123
---
Log message:

CopyToReg source operand can be a physical register.


---
Diffs of the changes:  (+19 -3)

 ScheduleDAG.cpp |   22 +++++++++++++++++++---
 1 files changed, 19 insertions(+), 3 deletions(-)


Index: llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp:1.122 llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp:1.123
--- llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp:1.122	Sat Feb 17 00:38:37 2007
+++ llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp	Tue Mar 20 11:46:44 2007
@@ -475,9 +475,25 @@
       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: {






More information about the llvm-commits mailing list