ADd support for TargetGlobalAddress nodes
authorChris Lattner <sabre@nondot.org>
Fri, 19 Aug 2005 22:31:34 +0000 (22:31 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 19 Aug 2005 22:31:34 +0000 (22:31 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@22939 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/SelectionDAG.h
include/llvm/CodeGen/SelectionDAGNodes.h

index b38648e303acc124866e54dd47c8c88a32d37057..b93dd124a1329999e33ace026afd5d26038e484d 100644 (file)
@@ -97,6 +97,7 @@ public:
   SDOperand getTargetConstant(uint64_t Val, MVT::ValueType VT);
   SDOperand getConstantFP(double Val, MVT::ValueType VT);
   SDOperand getGlobalAddress(const GlobalValue *GV, MVT::ValueType VT);
+  SDOperand getTargetGlobalAddress(const GlobalValue *GV, MVT::ValueType VT);
   SDOperand getFrameIndex(int FI, MVT::ValueType VT);
   SDOperand getConstantPool(unsigned CPIdx, MVT::ValueType VT);
   SDOperand getBasicBlock(MachineBasicBlock *MBB);
@@ -288,6 +289,7 @@ private:
            SDNode *> Loads;
 
   std::map<const GlobalValue*, SDNode*> GlobalValues;
+  std::map<const GlobalValue*, 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 b365d9d2d6f9132bdb725e68504e697252ffa718..56a279c77be8de59c661fad04f2670762b629c1e 100644 (file)
@@ -60,6 +60,11 @@ namespace ISD {
     // TargetConstant - Like Constant, but the DAG does not do any folding or
     // simplification of the constant.  This is used by the DAG->DAG selector.
     TargetConstant,
+    
+    // TargetGlobalAddress - Like GlobalAddress, but the DAG does no folding or
+    // anything else with this node, and this is valid in the target-specific
+    // dag, turning into a GlobalAddress operand.
+    TargetGlobalAddress,
 
     // CopyToReg - This node has three operands: a chain, a register number to
     // set to this value, and a value.  
@@ -775,8 +780,8 @@ class GlobalAddressSDNode : public SDNode {
   GlobalValue *TheGlobal;
 protected:
   friend class SelectionDAG;
-  GlobalAddressSDNode(const GlobalValue *GA, MVT::ValueType VT)
-    : SDNode(ISD::GlobalAddress, VT) {
+  GlobalAddressSDNode(bool isTarget, const GlobalValue *GA, MVT::ValueType VT)
+    : SDNode(isTarget ? ISD::TargetGlobalAddress : ISD::GlobalAddress, VT) {
     TheGlobal = const_cast<GlobalValue*>(GA);
   }
 public:
@@ -785,7 +790,8 @@ public:
 
   static bool classof(const GlobalAddressSDNode *) { return true; }
   static bool classof(const SDNode *N) {
-    return N->getOpcode() == ISD::GlobalAddress;
+    return N->getOpcode() == ISD::GlobalAddress ||
+           N->getOpcode() == ISD::TargetGlobalAddress;
   }
 };