Fixed a bug introduced by my last commit: TargetGlobalValues should key on
authorEvan Cheng <evan.cheng@apple.com>
Wed, 30 Nov 2005 02:49:21 +0000 (02:49 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Wed, 30 Nov 2005 02:49:21 +0000 (02:49 +0000)
GlobalValue * and index pair. Update getGlobalAddress() for symmetry.

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

include/llvm/CodeGen/SelectionDAG.h
lib/CodeGen/SelectionDAG/SelectionDAG.cpp

index 2f9ffda633686121ad8d3388b3fa4e8b139ee838..da6bec8ab0c1af661bd1fc918db44d047d58c5f6 100644 (file)
@@ -109,9 +109,10 @@ public:
   SDOperand getConstant(uint64_t Val, MVT::ValueType VT);
   SDOperand getTargetConstant(uint64_t Val, MVT::ValueType VT);
   SDOperand getConstantFP(double Val, MVT::ValueType VT);
-  SDOperand getGlobalAddress(const GlobalValue *GV, MVT::ValueType VT);
+  SDOperand getGlobalAddress(const GlobalValue *GV, MVT::ValueType VT,
+                             int offset = 0);
   SDOperand getTargetGlobalAddress(const GlobalValue *GV, MVT::ValueType VT,
-                                   int offset=0);
+                                   int offset = 0);
   SDOperand getFrameIndex(int FI, MVT::ValueType VT);
   SDOperand getTargetFrameIndex(int FI, MVT::ValueType VT);
   SDOperand getConstantPool(Constant *C, MVT::ValueType VT);
@@ -399,8 +400,8 @@ private:
   std::map<std::pair<SDOperand, std::pair<SDOperand, MVT::ValueType> >,
            SDNode *> Loads;
 
-  std::map<const GlobalValue*, SDNode*> GlobalValues;
-  std::map<const GlobalValue*, SDNode*> TargetGlobalValues;
+  std::map<std::pair<const GlobalValue*, int>, SDNode*> GlobalValues;
+  std::map<std::pair<const GlobalValue*, int>, SDNode*> TargetGlobalValues;
   std::map<std::pair<uint64_t, MVT::ValueType>, SDNode*> Constants;
   std::map<std::pair<uint64_t, MVT::ValueType>, SDNode*> TargetConstants;
   std::map<std::pair<uint64_t, MVT::ValueType>, SDNode*> ConstantFPs;
index 606ed5234b47d271c96d8aec454b8efcf7591754..8aa2bc660a8b0b5b7949e31e9261c998d06409df 100644 (file)
@@ -283,12 +283,18 @@ void SelectionDAG::RemoveNodeFromCSEMaps(SDNode *N) {
     Erased = CondCodeNodes[cast<CondCodeSDNode>(N)->get()] != 0;
     CondCodeNodes[cast<CondCodeSDNode>(N)->get()] = 0;
     break;
-  case ISD::GlobalAddress:
-    Erased = GlobalValues.erase(cast<GlobalAddressSDNode>(N)->getGlobal());
+  case ISD::GlobalAddress: {
+    GlobalAddressSDNode *GN = cast<GlobalAddressSDNode>(N);
+    Erased = GlobalValues.erase(std::make_pair(GN->getGlobal(),
+                                               GN->getOffset()));
     break;
-  case ISD::TargetGlobalAddress:
-    Erased =TargetGlobalValues.erase(cast<GlobalAddressSDNode>(N)->getGlobal());
+  }
+  case ISD::TargetGlobalAddress: {
+    GlobalAddressSDNode *GN = cast<GlobalAddressSDNode>(N);
+    Erased =TargetGlobalValues.erase(std::make_pair(GN->getGlobal(),
+                                                    GN->getOffset()));
     break;
+  }
   case ISD::FrameIndex:
     Erased = FrameIndices.erase(cast<FrameIndexSDNode>(N)->getIndex());
     break;
@@ -491,8 +497,8 @@ SDOperand SelectionDAG::getConstantFP(double Val, MVT::ValueType VT) {
 
 
 SDOperand SelectionDAG::getGlobalAddress(const GlobalValue *GV,
-                                         MVT::ValueType VT) {
-  SDNode *&N = GlobalValues[GV];
+                                         MVT::ValueType VT, int offset) {
+  SDNode *&N = GlobalValues[std::make_pair(GV, offset)];
   if (N) return SDOperand(N, 0);
   N = new GlobalAddressSDNode(false, GV, VT);
   AllNodes.push_back(N);
@@ -501,7 +507,7 @@ SDOperand SelectionDAG::getGlobalAddress(const GlobalValue *GV,
 
 SDOperand SelectionDAG::getTargetGlobalAddress(const GlobalValue *GV,
                                                MVT::ValueType VT, int offset) {
-  SDNode *&N = TargetGlobalValues[GV];
+  SDNode *&N = TargetGlobalValues[std::make_pair(GV, offset)];
   if (N) return SDOperand(N, 0);
   N = new GlobalAddressSDNode(true, GV, VT, offset);
   AllNodes.push_back(N);