Refactor common parts of MDNode::getFunction() and assertLocalFunction() into getFunc...
authorVictor Hernandez <vhernandez@apple.com>
Wed, 20 Jan 2010 04:45:57 +0000 (04:45 +0000)
committerVictor Hernandez <vhernandez@apple.com>
Wed, 20 Jan 2010 04:45:57 +0000 (04:45 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@93977 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Metadata.h
lib/VMCore/AsmWriter.cpp
lib/VMCore/Metadata.cpp

index f64978cab44a05fe156190f94c2dc577e3bce614..8766ea8003d455fb58448380da95066417dce2db 100644 (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();
index c0aeaf93c8845174e38c429e28985caf7f57275d..c9f3849c9253b154c6232f1095b482bca20774f6 100644 (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);
index 7d78395888243cc453cc5fe2adbea270bbeca4ff..822dbd9521d289d0ccbf8eb1384befffe6d7d682 100644 (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;
 }