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

llvm-svn: 93977
This commit is contained in:
Victor Hernandez 2010-01-20 04:45:57 +00:00
parent 5b6d9265ba
commit e5f2af7594
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.
// Otherwise, return null. getFunction() should not be used for performance-
// 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.
void destroy();

View File

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

View File

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