Added an offset field to ConstantPoolSDNode.

llvm-svn: 26371
diff --git a/llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp
index 9bc168f..611abc3 100644
--- a/llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp
@@ -154,6 +154,7 @@
     MI->addFrameIndexOperand(FI->getIndex());
   } else if (ConstantPoolSDNode *CP = 
              dyn_cast<ConstantPoolSDNode>(Op)) {
+    int Offset = CP->getOffset();
     unsigned Align = CP->getAlignment();
     // MachineConstantPool wants an explicit alignment.
     if (Align == 0) {
@@ -165,7 +166,7 @@
     }
     
     unsigned Idx = ConstPool->getConstantPoolIndex(CP->get(), Align);
-    MI->addConstantPoolIndexOperand(Idx);
+    MI->addConstantPoolIndexOperand(Idx, Offset);
   } else if (ExternalSymbolSDNode *ES = 
              dyn_cast<ExternalSymbolSDNode>(Op)) {
     MI->addExternalSymbolOperand(ES->getSymbol(), false);
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 5944962..8b93094 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -302,12 +302,14 @@
   case ISD::ConstantPool:
     Erased = ConstantPoolIndices.
       erase(std::make_pair(cast<ConstantPoolSDNode>(N)->get(),
-                           cast<ConstantPoolSDNode>(N)->getAlignment()));
+                        std::make_pair(cast<ConstantPoolSDNode>(N)->getOffset(),
+                                 cast<ConstantPoolSDNode>(N)->getAlignment())));
     break;
   case ISD::TargetConstantPool:
     Erased = TargetConstantPoolIndices.
       erase(std::make_pair(cast<ConstantPoolSDNode>(N)->get(),
-                           cast<ConstantPoolSDNode>(N)->getAlignment()));
+                        std::make_pair(cast<ConstantPoolSDNode>(N)->getOffset(),
+                                 cast<ConstantPoolSDNode>(N)->getAlignment())));
     break;
   case ISD::BasicBlock:
     Erased = BBNodes.erase(cast<BasicBlockSDNode>(N)->getBasicBlock());
@@ -650,19 +652,21 @@
 }
 
 SDOperand SelectionDAG::getConstantPool(Constant *C, MVT::ValueType VT,
-                                        unsigned Alignment) {
-  SDNode *&N = ConstantPoolIndices[std::make_pair(C, Alignment)];
+                                        unsigned Alignment,  int Offset) {
+  SDNode *&N = ConstantPoolIndices[std::make_pair(C,
+                                            std::make_pair(Offset, Alignment))];
   if (N) return SDOperand(N, 0);
-  N = new ConstantPoolSDNode(C, VT, Alignment, false);
+  N = new ConstantPoolSDNode(false, C, VT, Offset, Alignment);
   AllNodes.push_back(N);
   return SDOperand(N, 0);
 }
 
 SDOperand SelectionDAG::getTargetConstantPool(Constant *C, MVT::ValueType VT,
-                                              unsigned Alignment) {
-  SDNode *&N = TargetConstantPoolIndices[std::make_pair(C, Alignment)];
+                                             unsigned Alignment,  int Offset) {
+  SDNode *&N = TargetConstantPoolIndices[std::make_pair(C,
+                                            std::make_pair(Offset, Alignment))];
   if (N) return SDOperand(N, 0);
-  N = new ConstantPoolSDNode(C, VT, Alignment, true);
+  N = new ConstantPoolSDNode(true, C, VT, Offset, Alignment);
   AllNodes.push_back(N);
   return SDOperand(N, 0);
 }