/// NumOperands/NumValues - The number of entries in the Operand/Value list.
unsigned short NumOperands, NumValues;
- /// UsesSize - The size of the uses list.
- unsigned UsesSize;
-
/// Uses - List of uses for this SDNode.
SDUse *Uses;
return NodeType - ISD::BUILTIN_OP_END;
}
- size_t use_size() const { return UsesSize; }
+ size_t use_size() const { return std::distance(use_begin(), use_end()); }
bool use_empty() const { return Uses == NULL; }
- bool hasOneUse() const { return use_size() == 1; }
+ bool hasOneUse() const {
+ return !use_empty() && next(use_begin()) == use_end();
+ }
/// getNodeId - Return the unique node id.
///
}
SDNode(unsigned Opc, SDVTList VTs, const SDOperand *Ops, unsigned NumOps)
- : NodeType(Opc), NodeId(-1), UsesSize(0), Uses(NULL) {
+ : NodeType(Opc), NodeId(-1), Uses(NULL) {
OperandsNeedDelete = true;
NumOperands = NumOps;
OperandList = NumOps ? new SDUse[NumOperands] : 0;
OperandList[i] = Ops[i];
OperandList[i].setUser(this);
Ops[i].Val->addUse(OperandList[i]);
- ++Ops[i].Val->UsesSize;
}
ValueList = VTs.VTs;
}
SDNode(unsigned Opc, SDVTList VTs, const SDUse *Ops, unsigned NumOps)
- : NodeType(Opc), NodeId(-1), UsesSize(0), Uses(NULL) {
+ : NodeType(Opc), NodeId(-1), Uses(NULL) {
OperandsNeedDelete = true;
NumOperands = NumOps;
OperandList = NumOps ? new SDUse[NumOperands] : 0;
OperandList[i] = Ops[i];
OperandList[i].setUser(this);
Ops[i].getSDOperand().Val->addUse(OperandList[i]);
- ++Ops[i].getSDOperand().Val->UsesSize;
}
ValueList = VTs.VTs;
}
SDNode(unsigned Opc, SDVTList VTs)
- : NodeType(Opc), NodeId(-1), UsesSize(0), Uses(NULL) {
+ : NodeType(Opc), NodeId(-1), Uses(NULL) {
OperandsNeedDelete = false; // Operands set with InitOperands.
NumOperands = 0;
OperandList = 0;
assert(OperandList == 0 && "Operands already set!");
NumOperands = NumOps;
OperandList = Ops;
- UsesSize = 0;
Uses = NULL;
for (unsigned i = 0; i != NumOps; ++i) {
OperandList[i].setUser(this);
Ops[i].getVal()->addUse(OperandList[i]);
- ++Ops[i].getVal()->UsesSize;
}
}
void addUser(unsigned i, SDNode *User) {
assert(User->OperandList[i].getUser() && "Node without parent");
addUse(User->OperandList[i]);
- ++UsesSize;
}
void removeUser(unsigned i, SDNode *User) {
assert(User->OperandList[i].getUser() && "Node without parent");
SDUse &Op = User->OperandList[i];
Op.removeFromList();
- --UsesSize;
}
};
OperandList[i].setUser(this);
SDNode *N = OperandList[i].getVal();
N->addUser(i, this);
- ++N->UsesSize;
DeadNodeSet.erase(N);
}
bool SDNode::hasNUsesOfValue(unsigned NUses, unsigned Value) const {
assert(Value < getNumValues() && "Bad value!");
- // If there is only one value, this is easy.
- if (getNumValues() == 1)
- return use_size() == NUses;
- if (use_size() < NUses) return false;
-
- SDOperand TheValue(const_cast<SDNode *>(this), Value);
-
// TODO: Only iterate over uses of a given value of the node
for (SDNode::use_iterator UI = use_begin(), E = use_end(); UI != E; ++UI) {
- if (*UI == TheValue) {
+ if (UI->getSDOperand().ResNo == Value) {
if (NUses == 0)
return false;
--NUses;
bool SDNode::hasAnyUseOfValue(unsigned Value) const {
assert(Value < getNumValues() && "Bad value!");
- if (use_empty()) return false;
-
- SDOperand TheValue(const_cast<SDNode *>(this), Value);
-
for (SDNode::use_iterator UI = use_begin(), E = use_end(); UI != E; ++UI)
- if (UI->getSDOperand() == TheValue)
+ if (UI->getSDOperand().ResNo == Value)
return true;
return false;