diff --git a/lib/Bytecode/Reader/ConstantReader.cpp b/lib/Bytecode/Reader/ConstantReader.cpp
index 3fb2530..e71441e 100644
--- a/lib/Bytecode/Reader/ConstantReader.cpp
+++ b/lib/Bytecode/Reader/ConstantReader.cpp
@@ -202,28 +202,8 @@
                 << ArgValSlot << "\n");
       
       // Get the arg value from its slot if it exists, otherwise a placeholder
-      Value *Val = getValue(ArgTy, ArgValSlot, false);
-      Constant *C;
-      if (Val) {
-        if (!(C = dyn_cast<Constant>(Val))) return true;
-        BCR_TRACE(5, "Constant Found in ValueTable!\n");
-      } else {         // Nope... find or create a forward ref. for it
-        GlobalRefsType::iterator I =
-          GlobalRefs.find(make_pair(ArgTy, ArgValSlot));
-  
-        if (I != GlobalRefs.end()) {
-          BCR_TRACE(5, "Previous forward ref found!\n");
-          C = cast<Constant>(I->second);
-        } else {
-          // Create a placeholder for the constant reference and
-          // keep track of the fact that we have a forward ref to recycle it
-          BCR_TRACE(5, "Creating new forward ref to a constant!\n");
-          C = new ConstPHolder(ArgTy, ArgValSlot);
-
-          // Keep track of the fact that we have a forward ref to recycle it
-          GlobalRefs.insert(make_pair(make_pair(ArgTy, ArgValSlot), C));
-        }
-      }
+      Constant *C = getConstantValue(ArgTy, ArgValSlot);
+      if (C == 0) return true;
       ArgVec.push_back(C);
     }
     
@@ -310,9 +290,9 @@
     while (NumElements--) {   // Read all of the elements of the constant.
       unsigned Slot;
       if (read_vbr(Buf, EndBuf, Slot)) return true;
-      Value *V = getValue(AT->getElementType(), Slot, false);
-      if (!V || !isa<Constant>(V)) return true;
-      Elements.push_back(cast<Constant>(V));
+      Constant *C = getConstantValue(AT->getElementType(), Slot);
+      if (!C) return true;
+      Elements.push_back(C);
     }
     V = ConstantArray::get(AT, Elements);
     break;
@@ -326,10 +306,9 @@
     for (unsigned i = 0; i < ET.size(); ++i) {
       unsigned Slot;
       if (read_vbr(Buf, EndBuf, Slot)) return true;
-      Value *V = getValue(ET[i], Slot, false);
-      if (!V || !isa<Constant>(V))
-	return true;
-      Elements.push_back(cast<Constant>(V));      
+      Constant *C = getConstantValue(ET[i], Slot);
+      if (!C) return true;
+      Elements.push_back(C);
     }
 
     V = ConstantStruct::get(ST, Elements);
diff --git a/lib/Bytecode/Reader/Reader.cpp b/lib/Bytecode/Reader/Reader.cpp
index 9898af9..9aa5455 100644
--- a/lib/Bytecode/Reader/Reader.cpp
+++ b/lib/Bytecode/Reader/Reader.cpp
@@ -132,6 +132,34 @@
   return d;
 }
 
+/// getConstantValue - Just like getValue, except that it returns a null pointer
+/// only on error.  It always returns a constant (meaning that if the value is
+/// defined, but is not a constant, that is an error).  If the specified
+/// constant hasn't been parsed yet, a placeholder is defined and used.  Later,
+/// after the real value is parsed, the placeholder is eliminated.
+///
+Constant *BytecodeParser::getConstantValue(const Type *Ty, unsigned Slot) {
+  if (Value *V = getValue(Ty, Slot, false))
+    return dyn_cast<Constant>(V);      // If we already have the value parsed...
+
+  GlobalRefsType::iterator I = GlobalRefs.find(make_pair(Ty, Slot));
+  if (I != GlobalRefs.end()) {
+    BCR_TRACE(5, "Previous forward ref found!\n");
+    return cast<Constant>(I->second);
+  } else {
+    // Create a placeholder for the constant reference and
+    // keep track of the fact that we have a forward ref to recycle it
+    BCR_TRACE(5, "Creating new forward ref to a constant!\n");
+    Constant *C = new ConstPHolder(Ty, Slot);
+    
+    // Keep track of the fact that we have a forward ref to recycle it
+    GlobalRefs.insert(make_pair(make_pair(Ty, Slot), C));
+    return C;
+  }
+}
+
+
+
 bool BytecodeParser::postResolveValues(ValueTable &ValTab) {
   bool Error = false;
   for (unsigned ty = 0; ty < ValTab.size(); ++ty) {
diff --git a/lib/Bytecode/Reader/ReaderInternals.h b/lib/Bytecode/Reader/ReaderInternals.h
index c156f51..8f65677 100644
--- a/lib/Bytecode/Reader/ReaderInternals.h
+++ b/lib/Bytecode/Reader/ReaderInternals.h
@@ -108,6 +108,7 @@
 
   Value      *getValue(const Type *Ty, unsigned num, bool Create = true);
   const Type *getType(unsigned ID);
+  Constant   *getConstantValue(const Type *Ty, unsigned num);
 
   int insertValue(Value *D, std::vector<ValueList> &D);  // -1 = Failure
   bool postResolveValues(ValueTable &ValTab);
