Index: include/llvm/Function.h
===================================================================
--- include/llvm/Function.h	(revision 3710)
+++ include/llvm/Function.h	(working copy)
@@ -93,6 +93,8 @@
   // The Calling Convention is stored in Value::SubclassData.
   /*CallingConv::ID CallingConvention;*/
 
+  unsigned intrinsicID;                   ///< ID of intrinsic, 0 otherwise
+
   friend class SymbolTableListTraits<Function, Module>;
 
   void setParent(Module *parent);
@@ -109,6 +111,8 @@
       BuildLazyArguments();
   }
   void BuildLazyArguments() const;
+
+  unsigned initIntrinsicID() const;
   
   Function(const Function&); // DO NOT IMPLEMENT
   void operator=(const Function&); // DO NOT IMPLEMENT
@@ -146,8 +150,8 @@
   /// The particular intrinsic functions which correspond to this value are
   /// defined in llvm/Intrinsics.h.
   ///
-  unsigned getIntrinsicID() const LLVM_ATTRIBUTE_READONLY;
-  bool isIntrinsic() const { return getIntrinsicID() != 0; }
+  unsigned getIntrinsicID() const { return intrinsicID; }
+  bool isIntrinsic() const { return intrinsicID != 0; }
 
   /// getCallingConv()/setCallingConv(CC) - These method get and set the
   /// calling convention of this function.  The enum values for the known
Index: lib/VMCore/Function.cpp
===================================================================
--- lib/VMCore/Function.cpp	(revision 3710)
+++ lib/VMCore/Function.cpp	(working copy)
@@ -178,9 +178,9 @@
     ParentModule->getFunctionList().push_back(this);
 
   // Ensure intrinsics have the right parameter attributes.
-  if (unsigned IID = getIntrinsicID())
-    setAttributes(Intrinsic::getAttributes(Intrinsic::ID(IID)));
-
+  intrinsicID = initIntrinsicID();
+  if (intrinsicID)
+    setAttributes(Intrinsic::getAttributes(Intrinsic::ID(intrinsicID)));
 }
 
 Function::~Function() {
@@ -310,14 +310,14 @@
     clearGC();
 }
 
-/// getIntrinsicID - This method returns the ID number of the specified
+/// initIntrinsicID - This method returns the ID number of the specified
 /// function, or Intrinsic::not_intrinsic if the function is not an
 /// intrinsic, or if the pointer is null.  This value is always defined to be
 /// zero to allow easy checking for whether a function is intrinsic or not.  The
 /// particular intrinsic functions which correspond to this value are defined in
 /// llvm/Intrinsics.h.
 ///
-unsigned Function::getIntrinsicID() const {
+unsigned Function::initIntrinsicID() const {
   const ValueName *ValName = this->getValueName();
   if (!ValName)
     return 0;