diff --git a/include/llvm/Metadata.h b/include/llvm/Metadata.h
index f64978c..8766ea8 100644
--- a/include/llvm/Metadata.h
+++ b/include/llvm/Metadata.h
@@ -156,7 +156,7 @@
   // 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();
diff --git a/lib/VMCore/AsmWriter.cpp b/lib/VMCore/AsmWriter.cpp
index c0aeaf9..c9f3849 100644
--- a/lib/VMCore/AsmWriter.cpp
+++ b/lib/VMCore/AsmWriter.cpp
@@ -2062,7 +2062,7 @@
     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);
diff --git a/lib/VMCore/Metadata.cpp b/lib/VMCore/Metadata.cpp
index 7d78395..822dbd9 100644
--- a/lib/VMCore/Metadata.cpp
+++ b/lib/VMCore/Metadata.cpp
@@ -121,32 +121,27 @@
     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 @@
 // 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;
 }
