diff --git a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp
index 6bf2712..9249c70 100644
--- a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp
+++ b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp
@@ -147,8 +147,6 @@
   Abbv = new BitCodeAbbrev();
   Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_FUNCTION));
   Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));  // isvararg
-  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
-                            Log2_32_Ceil(VE.getParamAttrs().size()+1)));
   Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
   Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
                             Log2_32_Ceil(VE.getTypes().size()+1)));
@@ -206,10 +204,9 @@
 
     case Type::FunctionTyID: {
       const FunctionType *FT = cast<FunctionType>(T);
-      // FUNCTION: [isvararg, attrid, retty, paramty x N]
+      // FUNCTION: [isvararg, retty, paramty x N]
       Code = bitc::TYPE_CODE_FUNCTION;
       TypeVals.push_back(FT->isVarArg());
-      TypeVals.push_back(VE.getParamAttrID(FT->getParamAttrs()));
       TypeVals.push_back(VE.getTypeID(FT->getReturnType()));
       for (unsigned i = 0, e = FT->getNumParams(); i != e; ++i)
         TypeVals.push_back(VE.getTypeID(FT->getParamType(i)));
@@ -383,18 +380,13 @@
 
   // Emit the function proto information.
   for (Module::const_iterator F = M->begin(), E = M->end(); F != E; ++F) {
-    // FUNCTION:  [type, callingconv, isproto, linkage, alignment, section,
-    //             visibility]
+    // FUNCTION:  [type, callingconv, isproto, paramattr,
+    //             linkage, alignment, section, visibility]
     Vals.push_back(VE.getTypeID(F->getType()));
     Vals.push_back(F->getCallingConv());
     Vals.push_back(F->isDeclaration());
     Vals.push_back(getEncodedLinkage(F));
-    
-    // Note: we emit the param attr ID number for the function type of this
-    // function.  In the future, we intend for attrs to be properties of
-    // functions, instead of on the type.  This is to support this future work.
-    Vals.push_back(VE.getParamAttrID(F->getFunctionType()->getParamAttrs()));
-    
+    Vals.push_back(VE.getParamAttrID(F->getParamAttrs()));
     Vals.push_back(Log2_32(F->getAlignment())+1);
     Vals.push_back(F->hasSection() ? SectionMap[F->getSection()] : 0);
     Vals.push_back(getEncodedVisibility(F));
@@ -760,12 +752,9 @@
     const FunctionType *FTy = cast<FunctionType>(PTy->getElementType());
     Code = bitc::FUNC_CODE_INST_INVOKE;
     
-    // Note: we emit the param attr ID number for the function type of this
-    // function.  In the future, we intend for attrs to be properties of
-    // functions, instead of on the type.  This is to support this future work.
-    Vals.push_back(VE.getParamAttrID(FTy->getParamAttrs()));
-    
-    Vals.push_back(cast<InvokeInst>(I).getCallingConv());
+    const InvokeInst *II = cast<InvokeInst>(&I);
+    Vals.push_back(VE.getParamAttrID(II->getParamAttrs()));
+    Vals.push_back(II->getCallingConv());
     Vals.push_back(VE.getValueID(I.getOperand(1)));      // normal dest
     Vals.push_back(VE.getValueID(I.getOperand(2)));      // unwind dest
     PushValueAndType(I.getOperand(0), InstID, Vals, VE); // callee
@@ -837,14 +826,10 @@
 
     Code = bitc::FUNC_CODE_INST_CALL;
     
-    // Note: we emit the param attr ID number for the function type of this
-    // function.  In the future, we intend for attrs to be properties of
-    // functions, instead of on the type.  This is to support this future work.
-    Vals.push_back(VE.getParamAttrID(FTy->getParamAttrs()));
-    
-    Vals.push_back((cast<CallInst>(I).getCallingConv() << 1) |
-                   unsigned(cast<CallInst>(I).isTailCall()));
-    PushValueAndType(I.getOperand(0), InstID, Vals, VE);  // Callee
+    const CallInst *CI = cast<CallInst>(&I);
+    Vals.push_back(VE.getParamAttrID(CI->getParamAttrs()));
+    Vals.push_back((CI->getCallingConv() << 1) | unsigned(CI->isTailCall()));
+    PushValueAndType(CI->getOperand(0), InstID, Vals, VE);  // Callee
     
     // Emit value #'s for the fixed parameters.
     for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i)
