diff --git a/llvm/include/llvm/CodeGen/SelectionDAG.h b/llvm/include/llvm/CodeGen/SelectionDAG.h index 2f9ffda63368..da6bec8ab0c1 100644 --- a/llvm/include/llvm/CodeGen/SelectionDAG.h +++ b/llvm/include/llvm/CodeGen/SelectionDAG.h @@ -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 >, SDNode *> Loads; - std::map GlobalValues; - std::map TargetGlobalValues; + std::map, SDNode*> GlobalValues; + std::map, SDNode*> TargetGlobalValues; std::map, SDNode*> Constants; std::map, SDNode*> TargetConstants; std::map, SDNode*> ConstantFPs; diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index 606ed5234b47..8aa2bc660a8b 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -283,12 +283,18 @@ void SelectionDAG::RemoveNodeFromCSEMaps(SDNode *N) { Erased = CondCodeNodes[cast(N)->get()] != 0; CondCodeNodes[cast(N)->get()] = 0; break; - case ISD::GlobalAddress: - Erased = GlobalValues.erase(cast(N)->getGlobal()); + case ISD::GlobalAddress: { + GlobalAddressSDNode *GN = cast(N); + Erased = GlobalValues.erase(std::make_pair(GN->getGlobal(), + GN->getOffset())); break; - case ISD::TargetGlobalAddress: - Erased =TargetGlobalValues.erase(cast(N)->getGlobal()); + } + case ISD::TargetGlobalAddress: { + GlobalAddressSDNode *GN = cast(N); + Erased =TargetGlobalValues.erase(std::make_pair(GN->getGlobal(), + GN->getOffset())); break; + } case ISD::FrameIndex: Erased = FrameIndices.erase(cast(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);