[llvm-commits] [llvm] r93762 - /llvm/trunk/lib/VMCore/Metadata.cpp

Victor Hernandez vhernandez at apple.com
Mon Jan 18 12:36:55 PST 2010


Author: hernande
Date: Mon Jan 18 14:36:54 2010
New Revision: 93762

URL: http://llvm.org/viewvc/llvm-project?rev=93762&view=rev
Log:
Simplify MDNode::getFunction() and assertLocalFunction() by avoiding extra Function* variable and smallptrset since function-local metadata cannot be cyclic

Modified:
    llvm/trunk/lib/VMCore/Metadata.cpp

Modified: llvm/trunk/lib/VMCore/Metadata.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Metadata.cpp?rev=93762&r1=93761&r2=93762&view=diff

==============================================================================
--- llvm/trunk/lib/VMCore/Metadata.cpp (original)
+++ llvm/trunk/lib/VMCore/Metadata.cpp Mon Jan 18 14:36:54 2010
@@ -122,66 +122,59 @@
 }
 
 #ifndef NDEBUG
-static Function *assertLocalFunction(const MDNode *N,
-                                     SmallPtrSet<const MDNode *, 32> &Visited) {
-  Function *F = NULL;
-  // Only visit each MDNode once.
-  if (!Visited.insert(N)) return F;
-  
-  for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) {
-    Value *V = N->getOperand(i);
-    Function *NewF = NULL;
-    if (!V) continue;
-    if (Instruction *I = dyn_cast<Instruction>(V))
-      NewF = I->getParent()->getParent();
-    else if (BasicBlock *BB = dyn_cast<BasicBlock>(V))
-      NewF = BB->getParent();
-    else if (Argument *A = dyn_cast<Argument>(V))
-      NewF = A->getParent();
-    else if (MDNode *MD = dyn_cast<MDNode>(V))
-      if (MD->isFunctionLocal())
-        NewF = assertLocalFunction(MD, Visited);
-    if (F && NewF) assert(F == NewF && "inconsistent function-local metadata");
-    if (!F) F = NewF;
-  }
-  return F;
-}
-#endif
+static Function *assertLocalFunction(const MDNode *N) {
+  if (!N->isFunctionLocal()) return NULL;
 
-static Function *getFunctionHelper(const MDNode *N,
-                                   SmallPtrSet<const MDNode *, 32> &Visited) {
-  assert(N->isFunctionLocal() && "Should only be called on function-local MD");
-#ifndef NDEBUG
-  return assertLocalFunction(N, Visited);
-#endif
   Function *F = NULL;
-  // Only visit each MDNode once.
-  if (!Visited.insert(N)) return F;
-  
   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))
-      F = I->getParent()->getParent();
-    else if (BasicBlock *BB = dyn_cast<BasicBlock>(V))
-      F = BB->getParent();
-    else if (Argument *A = dyn_cast<Argument>(V))
-      F = A->getParent();
-    else if (MDNode *MD = dyn_cast<MDNode>(V))
-      if (MD->isFunctionLocal())
-        F = getFunctionHelper(MD, Visited);
-    if (F) break;
+    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;
+      }
+    }
   }
   return F;
 }
+#endif
 
 // getFunction - If this metadata is function-local and recursively has a
 // function-local operand, return the first such operand's parent function.
 // Otherwise, return null. 
 Function *MDNode::getFunction() const {
+#ifndef NDEBUG
+  return assertLocalFunction(this);
+#endif
+
   if (!isFunctionLocal()) return NULL;
-  SmallPtrSet<const MDNode *, 32> Visited;
-  return getFunctionHelper(this, Visited);
+
+  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;
+  }
+  return NULL;
 }
 
 // destroy - Delete this node.  Only when there are no uses.





More information about the llvm-commits mailing list