From 5c884562279927757cbe0ae718ab18af730ddb35 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Wed, 12 Jan 2005 18:37:47 +0000 Subject: [PATCH] New method git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@19517 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 33 +++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index 1996880e4ba..3f598fd8b32 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -833,6 +833,39 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT, } } +/// hasNUsesOfValue - Return true if there are exactly NUSES uses of the +/// indicated value. This method ignores uses of other values defined by this +/// operation. +bool SDNode::hasNUsesOfValue(unsigned NUses, unsigned Value) { + assert(Value < getNumValues() && "Bad value!"); + + // If there is only one value, this is easy. + if (getNumValues() == 1) + return use_size() == NUses; + if (Uses.size() < NUses) return false; + + SDOperand TheValue(this, Value); + + std::set UsersHandled; + + for (std::vector::iterator UI = Uses.begin(), E = Uses.end(); + UI != E; ++UI) { + SDNode *User = *UI; + if (User->getNumOperands() == 1 || + UsersHandled.insert(User).second) // First time we've seen this? + for (unsigned i = 0, e = User->getNumOperands(); i != e; ++i) + if (User->getOperand(i) == TheValue) { + if (NUses == 0) + return false; // too many uses + --NUses; + } + } + + // Found exactly the right number of uses? + return NUses == 0; +} + + const char *SDNode::getOperationName() const { switch (getOpcode()) { default: return "<>"; -- 2.34.1