aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/llvm/CodeGen/SelectionDAG.h9
-rw-r--r--include/llvm/CodeGen/SelectionDAGNodes.h12
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: