aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2005-08-16 21:55:35 +0000
committerChris Lattner <sabre@nondot.org>2005-08-16 21:55:35 +0000
commitd5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649d (patch)
tree411d221bc8fb4a0221daeac5a4e5574c43b13078 /lib/CodeGen/SelectionDAG/SelectionDAG.cpp
parent7cbd525ba85ebe440d15fa359ec940e404d14906 (diff)
Eliminate the RegSDNode class, which 3 nodes (CopyFromReg/CopyToReg/ImplicitDef)
used to tack a register number onto the node. Instead of doing this, make a new node, RegisterSDNode, which is a leaf containing a register number. These three operations just become normal DAG nodes now, instead of requiring special handling. Note that with this change, it is no longer correct to make illegal CopyFromReg/CopyToReg nodes. The legalizer will not touch them, and this is bad, so don't do it. :) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@22806 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/SelectionDAG/SelectionDAG.cpp')
-rw-r--r--lib/CodeGen/SelectionDAG/SelectionDAG.cpp22
1 files changed, 20 insertions, 2 deletions
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 7a790c8df9..dae19b9768 100644
--- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -250,6 +250,9 @@ void SelectionDAG::RemoveNodeFromCSEMaps(SDNode *N) {
case ISD::VALUETYPE:
ValueTypeNodes[cast<VTSDNode>(N)->getVT()] = 0;
break;
+ case ISD::Register:
+ RegNodes[cast<RegisterSDNode>(N)->getReg()] = 0;
+ break;
case ISD::SRCVALUE: {
SrcValueSDNode *SVN = cast<SrcValueSDNode>(N);
ValueNodes.erase(std::make_pair(SVN->getValue(), SVN->getOffset()));
@@ -398,6 +401,20 @@ SDOperand SelectionDAG::getCondCode(ISD::CondCode Cond) {
return SDOperand(CondCodeNodes[Cond], 0);
}
+SDOperand SelectionDAG::getRegister(unsigned Reg, MVT::ValueType VT) {
+ if (Reg >= RegNodes.size())
+ RegNodes.resize(Reg+1);
+ RegisterSDNode *&Result = RegNodes[Reg];
+ if (Result) {
+ assert(Result->getValueType(0) == VT &&
+ "Inconsistent value types for machine registers");
+ } else {
+ Result = new RegisterSDNode(Reg, VT);
+ AllNodes.push_back(Result);
+ }
+ return SDOperand(Result, 0);
+}
+
SDOperand SelectionDAG::SimplifySetCC(MVT::ValueType VT, SDOperand N1,
SDOperand N2, ISD::CondCode Cond) {
// These setcc operations always fold.
@@ -1779,6 +1796,7 @@ const char *SDNode::getOperationName(const SelectionDAG *G) const {
case ISD::GlobalAddress: return "GlobalAddress";
case ISD::FrameIndex: return "FrameIndex";
case ISD::BasicBlock: return "BasicBlock";
+ case ISD::Register: return "Register";
case ISD::ExternalSymbol: return "ExternalSymbol";
case ISD::ConstantPool: return "ConstantPoolIndex";
case ISD::CopyToReg: return "CopyToReg";
@@ -1939,8 +1957,8 @@ void SDNode::dump(const SelectionDAG *G) const {
if (LBB)
std::cerr << LBB->getName() << " ";
std::cerr << (const void*)BBDN->getBasicBlock() << ">";
- } else if (const RegSDNode *C2V = dyn_cast<RegSDNode>(this)) {
- std::cerr << "<reg #" << C2V->getReg() << ">";
+ } else if (const RegisterSDNode *C2V = dyn_cast<RegisterSDNode>(this)) {
+ std::cerr << " #" << C2V->getReg();
} else if (const ExternalSymbolSDNode *ES =
dyn_cast<ExternalSymbolSDNode>(this)) {
std::cerr << "'" << ES->getSymbol() << "'";