diff options
-rw-r--r-- | include/llvm/CodeGen/SelectionDAG.h | 9 | ||||
-rw-r--r-- | include/llvm/CodeGen/SelectionDAGNodes.h | 12 |
2 files changed, 20 insertions, 1 deletions
diff --git a/include/llvm/CodeGen/SelectionDAG.h b/include/llvm/CodeGen/SelectionDAG.h index ce5deecf38..e6f89e9ec5 100644 --- a/include/llvm/CodeGen/SelectionDAG.h +++ b/include/llvm/CodeGen/SelectionDAG.h @@ -93,6 +93,12 @@ public: /// the graph. void Legalize(TargetLowering &TLI); + /// RemoveDeadNodes - This method deletes all unreachable nodes in the + /// SelectionDAG, including nodes (like loads) that have uses of their token + /// chain but no other uses and no side effect. If a node is passed in as an + /// argument, it is used as the seed for node deletion. + void RemoveDeadNodes(SDNode *N = 0); + SDOperand getConstant(uint64_t Val, MVT::ValueType VT); SDOperand getConstantFP(double Val, MVT::ValueType VT); SDOperand getGlobalAddress(const GlobalValue *GV, MVT::ValueType VT); @@ -150,6 +156,9 @@ public: } void dump() const; + +private: + void DeleteNodeIfDead(SDNode *N, void *NodeSet); }; } diff --git a/include/llvm/CodeGen/SelectionDAGNodes.h b/include/llvm/CodeGen/SelectionDAGNodes.h index 96575fea41..eea1942f06 100644 --- a/include/llvm/CodeGen/SelectionDAGNodes.h +++ b/include/llvm/CodeGen/SelectionDAGNodes.h @@ -409,6 +409,17 @@ protected: void setValueTypes(std::vector<MVT::ValueType> &VTs) { std::swap(Values, VTs); } + + void removeUser(SDNode *User) { + // Remove this user from the operand's use list. + for (unsigned i = Uses.size(); ; --i) { + assert(i != 0 && "Didn't find user!"); + if (Uses[i-1] == User) { + Uses.erase(Uses.begin()+i-1); + break; + } + } + } }; @@ -498,7 +509,6 @@ protected: GlobalAddressSDNode(const GlobalValue *GA, MVT::ValueType VT) : SDNode(ISD::GlobalAddress, VT) { TheGlobal = const_cast<GlobalValue*>(GA); - } public: |