teach X86InstrInfo::copyRegToReg how to copy into ST(0) from 
an RFP register class.

Teach ScheduleDAG how to handle CopyToReg with different src/dst 
reg classes.

This allows us to compile trivial inline asms that expect stuff
on the top of x87-fp stack.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@48107 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp b/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp
index 5a2b4ed..31a784e 100644
--- a/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp
+++ b/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp
@@ -844,23 +844,31 @@
     case ISD::SRCVALUE:
       break;
     case ISD::CopyToReg: {
-      unsigned InReg;
-      if (RegisterSDNode *R = dyn_cast<RegisterSDNode>(Node->getOperand(2)))
-        InReg = R->getReg();
+      unsigned SrcReg;
+      SDOperand SrcVal = Node->getOperand(2);
+      if (RegisterSDNode *R = dyn_cast<RegisterSDNode>(SrcVal))
+        SrcReg = R->getReg();
       else
-        InReg = getVR(Node->getOperand(2), VRBaseMap);
+        SrcReg = getVR(SrcVal, VRBaseMap);
+      
       unsigned DestReg = cast<RegisterSDNode>(Node->getOperand(1))->getReg();
-      if (InReg != DestReg)  {// Coalesced away the copy?
-        const TargetRegisterClass *TRC = 0;
-        // Get the target register class
-        if (TargetRegisterInfo::isVirtualRegister(InReg))
-          TRC = RegInfo.getRegClass(InReg);
-        else
-          TRC =
-            TRI->getPhysicalRegisterRegClass(Node->getOperand(2).getValueType(),
-                                            InReg);
-        TII->copyRegToReg(*BB, BB->end(), DestReg, InReg, TRC, TRC);
-      }
+      if (SrcReg == DestReg) // Coalesced away the copy? Ignore.
+        break;
+      
+      const TargetRegisterClass *SrcTRC = 0, *DstTRC = 0;
+      // Get the register classes of the src/dst.
+      if (TargetRegisterInfo::isVirtualRegister(SrcReg))
+        SrcTRC = RegInfo.getRegClass(SrcReg);
+      else
+        SrcTRC = TRI->getPhysicalRegisterRegClass(SrcVal.getValueType(),SrcReg);
+
+      if (TargetRegisterInfo::isVirtualRegister(DestReg))
+        DstTRC = RegInfo.getRegClass(DestReg);
+      else
+        DstTRC = TRI->getPhysicalRegisterRegClass(
+                                            Node->getOperand(1).getValueType(),
+                                                  DestReg);
+      TII->copyRegToReg(*BB, BB->end(), DestReg, SrcReg, DstTRC, SrcTRC);
       break;
     }
     case ISD::CopyFromReg: {