Adjust to CopyFromReg changes, implement deletion of truncating/extending
authorChris Lattner <sabre@nondot.org>
Fri, 14 Jan 2005 22:38:01 +0000 (22:38 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 14 Jan 2005 22:38:01 +0000 (22:38 +0000)
stores/loads.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@19562 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
lib/CodeGen/SelectionDAG/SelectionDAG.cpp
lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp

index e47bb59772c34323e12dbe38927e7590eff1590b..4f7c0a89882b96a36bd361cf446514fccfa122de 100644 (file)
@@ -239,11 +239,16 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) {
   case ISD::FrameIndex:
   case ISD::GlobalAddress:
   case ISD::ExternalSymbol:
-  case ISD::ConstantPool:
-  case ISD::CopyFromReg:            // Nothing to do.
+  case ISD::ConstantPool:           // Nothing to do.
     assert(getTypeAction(Node->getValueType(0)) == Legal &&
            "This must be legal!");
     break;
+  case ISD::CopyFromReg:
+    Tmp1 = LegalizeOp(Node->getOperand(0));
+    if (Tmp1 != Node->getOperand(0))
+      Result = DAG.getCopyFromReg(cast<RegSDNode>(Node)->getReg(),
+                                  Node->getValueType(0), Tmp1);
+    break;
   case ISD::ImplicitDef:
     Tmp1 = LegalizeOp(Node->getOperand(0));
     if (Tmp1 != Node->getOperand(0))
@@ -752,8 +757,12 @@ void SelectionDAGLegalize::ExpandOp(SDOperand Op, SDOperand &Lo, SDOperand &Hi){
   case ISD::CopyFromReg: {
     unsigned Reg = cast<RegSDNode>(Node)->getReg();
     // Aggregate register values are always in consequtive pairs.
-    Lo = DAG.getCopyFromReg(Reg, NVT);
-    Hi = DAG.getCopyFromReg(Reg+1, NVT);
+    Lo = DAG.getCopyFromReg(Reg, NVT, Node->getOperand(0));
+    Hi = DAG.getCopyFromReg(Reg+1, NVT, Lo.getValue(1));
+    
+    // Remember that we legalized the chain.
+    AddLegalizedOperand(Op.getValue(1), Hi.getValue(1));
+
     assert(isTypeLegal(NVT) && "Cannot expand this multiple times yet!");
     break;
   }
index 86a0120686f1e74ebe2f58a3a6c68fe70835a7ce..e1b52019e965ddf19bb9aedee46b39ca8cbf4b72 100644 (file)
@@ -220,6 +220,29 @@ void SelectionDAG::DeleteNodeIfDead(SDNode *N, void *NodeSet) {
                                                N->getOperand(1)),
                                 cast<SetCCSDNode>(N)->getCondition()));
     break;
+  case ISD::TRUNCSTORE: {
+    EVTStruct NN;
+    NN.Opcode = ISD::TRUNCSTORE;
+    NN.VT = N->getValueType(0);
+    NN.EVT = cast<MVTSDNode>(N)->getExtraValueType();
+    NN.Ops.push_back(N->getOperand(0));
+    NN.Ops.push_back(N->getOperand(1));
+    NN.Ops.push_back(N->getOperand(2));
+    MVTSDNodes.erase(NN);
+    break;
+  }
+  case ISD::EXTLOAD:
+  case ISD::SEXTLOAD:
+  case ISD::ZEXTLOAD: {
+    EVTStruct NN;
+    NN.Opcode = N->getOpcode();
+    NN.VT = N->getValueType(0);
+    NN.EVT = cast<MVTSDNode>(N)->getExtraValueType();
+    NN.Ops.push_back(N->getOperand(0));
+    NN.Ops.push_back(N->getOperand(1));
+    MVTSDNodes.erase(NN);
+    break;
+  }
   default:
     if (N->getNumOperands() == 1)
       UnaryOps.erase(std::make_pair(N->getOpcode(),
@@ -861,7 +884,7 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT,SDOperand N1,
 
   SDNode *&N = MVTSDNodes[NN];
   if (N) return SDOperand(N, 0);
-  N = new MVTSDNode(Opcode, VT, N1, N2, EVT);
+  N = new MVTSDNode(Opcode, VT, MVT::Other, N1, N2, EVT);
   AllNodes.push_back(N);
   return SDOperand(N, 0);
 }
index ed363e111c4b821e581bc0e1b558b997fbe0227c..2d264c0ed2f35a1350182416ec8dca710bb1b9eb 100644 (file)
@@ -254,7 +254,7 @@ public:
     std::map<const Value*, unsigned>::const_iterator VMI =
       FuncInfo.ValueMap.find(V);
     assert(VMI != FuncInfo.ValueMap.end() && "Value not in map!");
-    return N = DAG.getCopyFromReg(VMI->second, VT);
+    return N = DAG.getCopyFromReg(VMI->second, VT, DAG.getEntryNode());
   }
 
   const SDOperand &setValue(const Value *V, SDOperand NewN) {