Refactor common parts of MDNode::getFunction() and assertLocalFunction() into getFunctionForValue()

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@93977 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Victor Hernandez
2010-01-20 04:45:57 +00:00
parent 42aafd7e57
commit 8fffff5371
3 changed files with 25 additions and 35 deletions

View File

@@ -156,7 +156,7 @@ public:
// function-local operand, return the first such operand's parent function. // function-local operand, return the first such operand's parent function.
// Otherwise, return null. getFunction() should not be used for performance- // Otherwise, return null. getFunction() should not be used for performance-
// critical code because it recursively visits all the MDNode's operands. // critical code because it recursively visits all the MDNode's operands.
Function *getFunction() const; const Function *getFunction() const;
// destroy - Delete this node. Only when there are no uses. // destroy - Delete this node. Only when there are no uses.
void destroy(); void destroy();

View File

@@ -2062,7 +2062,7 @@ void Value::print(raw_ostream &ROS, AssemblyAnnotationWriter *AAW) const {
else else
W.printAlias(cast<GlobalAlias>(GV)); W.printAlias(cast<GlobalAlias>(GV));
} else if (const MDNode *N = dyn_cast<MDNode>(this)) { } else if (const MDNode *N = dyn_cast<MDNode>(this)) {
Function *F = N->getFunction(); const Function *F = N->getFunction();
SlotTracker SlotTable(F); SlotTracker SlotTable(F);
AssemblyWriter W(OS, SlotTable, F ? getModuleFromVal(F) : 0, AAW); AssemblyWriter W(OS, SlotTable, F ? getModuleFromVal(F) : 0, AAW);
W.printMDNodeBody(N); W.printMDNodeBody(N);

View File

@@ -121,32 +121,27 @@ MDNode::~MDNode() {
Op->~MDNodeOperand(); Op->~MDNodeOperand();
} }
static const Function *getFunctionForValue(Value *V) {
if (!V) return NULL;
if (Instruction *I = dyn_cast<Instruction>(V))
return I->getParent()->getParent();
if (BasicBlock *BB = dyn_cast<BasicBlock>(V)) return BB->getParent();
if (Argument *A = dyn_cast<Argument>(V)) return A->getParent();
return NULL;
}
#ifndef NDEBUG #ifndef NDEBUG
static Function *assertLocalFunction(const MDNode *N) { static const Function *assertLocalFunction(const MDNode *N) {
if (!N->isFunctionLocal()) return NULL; if (!N->isFunctionLocal()) return NULL;
Function *F = NULL; const Function *F = NULL, *NewF = NULL;
for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) { for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) {
Value *V = N->getOperand(i); if (Value *V = N->getOperand(i)) {
if (!V) continue; if (MDNode *MD = dyn_cast<MDNode>(V)) NewF = assertLocalFunction(MD);
if (Instruction *I = dyn_cast<Instruction>(V)) { else NewF = getFunctionForValue(V);
if (F) assert(F == I->getParent()->getParent() &&
"inconsistent function-local metadata");
else F = I->getParent()->getParent();
} else if (BasicBlock *BB = dyn_cast<BasicBlock>(V)) {
if (F) assert(F == BB->getParent() &&
"inconsistent function-local metadata");
else F = BB->getParent();
} else if (Argument *A = dyn_cast<Argument>(V)) {
if (F) assert(F == A->getParent() &&
"inconsistent function-local metadata");
else F = A->getParent();
} else if (MDNode *MD = dyn_cast<MDNode>(V)) {
if (Function *NewF = assertLocalFunction(MD)) {
if (F) assert(F == NewF && "inconsistent function-local metadata");
else F = NewF;
}
} }
if (F && NewF) assert(F == NewF && "inconsistent function-local metadata");
else if (!F) F = NewF;
} }
return F; return F;
} }
@@ -156,24 +151,19 @@ static Function *assertLocalFunction(const MDNode *N) {
// function-local operand, return the first such operand's parent function. // function-local operand, return the first such operand's parent function.
// Otherwise, return null. getFunction() should not be used for performance- // Otherwise, return null. getFunction() should not be used for performance-
// critical code because it recursively visits all the MDNode's operands. // critical code because it recursively visits all the MDNode's operands.
Function *MDNode::getFunction() const { const Function *MDNode::getFunction() const {
#ifndef NDEBUG #ifndef NDEBUG
return assertLocalFunction(this); return assertLocalFunction(this);
#endif #endif
if (!isFunctionLocal()) return NULL; if (!isFunctionLocal()) return NULL;
for (unsigned i = 0, e = getNumOperands(); i != e; ++i) { for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
Value *V = getOperand(i); if (Value *V = getOperand(i)) {
if (!V) continue;
if (Instruction *I = dyn_cast<Instruction>(V))
return I->getParent()->getParent();
if (BasicBlock *BB = dyn_cast<BasicBlock>(V))
return BB->getParent();
if (Argument *A = dyn_cast<Argument>(V))
return A->getParent();
if (MDNode *MD = dyn_cast<MDNode>(V)) if (MDNode *MD = dyn_cast<MDNode>(V))
if (Function *F = MD->getFunction()) return F; if (const Function *F = MD->getFunction()) return F;
else
return getFunctionForValue(V);
}
} }
return NULL; return NULL;
} }