diff --git a/examples/BrainF/BrainF.cpp b/examples/BrainF/BrainF.cpp
index b2959f2..3717ee7 100644
--- a/examples/BrainF/BrainF.cpp
+++ b/examples/BrainF/BrainF.cpp
@@ -25,6 +25,7 @@
 
 #include "BrainF.h"
 #include "llvm/Constants.h"
+#include "llvm/Intrinsics.h"
 #include "llvm/ADT/STLExtras.h"
 
 using namespace llvm;
@@ -52,11 +53,7 @@
   //Function prototypes
 
   //declare void @llvm.memset.i32(i8 *, i8, i32, i32)
-  Function *memset_func = cast<Function>(module->
-    getOrInsertFunction("llvm.memset.i32", Type::VoidTy,
-                        PointerType::getUnqual(IntegerType::Int8Ty),
-                        IntegerType::Int8Ty, IntegerType::Int32Ty,
-                        IntegerType::Int32Ty, NULL));
+  Function *memset_func = Intrinsic::getDeclaration(module, Intrinsic::memset_i32);
 
   //declare i32 @getchar()
   getchar_func = cast<Function>(module->
diff --git a/lib/Transforms/IPO/SimplifyLibCalls.cpp b/lib/Transforms/IPO/SimplifyLibCalls.cpp
index bbfd1d2..ed32daa 100644
--- a/lib/Transforms/IPO/SimplifyLibCalls.cpp
+++ b/lib/Transforms/IPO/SimplifyLibCalls.cpp
@@ -21,6 +21,7 @@
 #include "llvm/Constants.h"
 #include "llvm/DerivedTypes.h"
 #include "llvm/Instructions.h"
+#include "llvm/Intrinsics.h"
 #include "llvm/Module.h"
 #include "llvm/Pass.h"
 #include "llvm/ADT/StringMap.h"
@@ -320,12 +321,9 @@
   /// @brief Return a Function* for the memcpy libcall
   Constant *get_memcpy() {
     if (!memcpy_func) {
-      const Type *SBP = PointerType::getUnqual(Type::Int8Ty);
-      const char *N = TD->getIntPtrType() == Type::Int32Ty ?
-                            "llvm.memcpy.i32" : "llvm.memcpy.i64";
-      memcpy_func = M->getOrInsertFunction(N, Type::VoidTy, SBP, SBP,
-                                           TD->getIntPtrType(), Type::Int32Ty,
-                                           NULL);
+      Intrinsic::ID IID = (TD->getIntPtrType() == Type::Int32Ty) ?
+        Intrinsic::memcpy_i32 : Intrinsic::memcpy_i64;
+      memcpy_func = Intrinsic::getDeclaration(M, IID);
     }
     return memcpy_func;
   }
@@ -1696,23 +1694,11 @@
     // ffsl(x)  -> x == 0 ? 0 : llvm.cttz(x)+1
     // ffsll(x) -> x == 0 ? 0 : llvm.cttz(x)+1
     const Type *ArgType = TheCall->getOperand(1)->getType();
-    const char *CTTZName;
     assert(ArgType->getTypeID() == Type::IntegerTyID &&
            "llvm.cttz argument is not an integer?");
-    unsigned BitWidth = cast<IntegerType>(ArgType)->getBitWidth();
-    if (BitWidth == 8)
-      CTTZName = "llvm.cttz.i8";
-    else if (BitWidth == 16)
-      CTTZName = "llvm.cttz.i16"; 
-    else if (BitWidth == 32)
-      CTTZName = "llvm.cttz.i32";
-    else {
-      assert(BitWidth == 64 && "Unknown bitwidth");
-      CTTZName = "llvm.cttz.i64";
-    }
-    
-    Constant *F = SLC.getModule()->getOrInsertFunction(CTTZName, ArgType,
-                                                       ArgType, NULL);
+    Constant *F = Intrinsic::getDeclaration(SLC.getModule(),
+                                            Intrinsic::cttz, &ArgType, 1);
+
     Value *V = CastInst::createIntegerCast(TheCall->getOperand(1), ArgType, 
                                            false/*ZExt*/, "tmp", TheCall);
     Value *V2 = CallInst::Create(F, V, "tmp", TheCall);
diff --git a/lib/Transforms/Instrumentation/RSProfiling.cpp b/lib/Transforms/Instrumentation/RSProfiling.cpp
index e7e8efe..15249c2 100644
--- a/lib/Transforms/Instrumentation/RSProfiling.cpp
+++ b/lib/Transforms/Instrumentation/RSProfiling.cpp
@@ -37,6 +37,7 @@
 #include "llvm/Instructions.h"
 #include "llvm/Constants.h"
 #include "llvm/DerivedTypes.h"
+#include "llvm/Intrinsics.h"
 #include "llvm/Transforms/Scalar.h"
 #include "llvm/Transforms/Utils/BasicBlockUtils.h"
 #include "llvm/Support/CommandLine.h"
@@ -301,7 +302,7 @@
 
 
 CycleCounter::CycleCounter(Module& m, uint64_t resetmask) : rm(resetmask) {
-  F = m.getOrInsertFunction("llvm.readcyclecounter", Type::Int64Ty, NULL);
+  F = Intrinsic::getDeclaration(&m, Intrinsic::readcyclecounter);
 }
 
 CycleCounter::~CycleCounter() {}
diff --git a/tools/llvm-upgrade/UpgradeParser.y b/tools/llvm-upgrade/UpgradeParser.y
index 39172c3..3eb0061 100644
--- a/tools/llvm-upgrade/UpgradeParser.y
+++ b/tools/llvm-upgrade/UpgradeParser.y
@@ -1593,8 +1593,7 @@
       const Type* RetTy = Type::getPrimitiveType(Type::VoidTyID);
       const Type* ArgTy = F->getFunctionType()->getReturnType();
       const Type* ArgTyPtr = PointerType::getUnqual(ArgTy);
-      Function* NF = cast<Function>(Result->getOrInsertFunction(
-        "llvm.va_start", RetTy, ArgTyPtr, (Type *)0));
+      Function* NF = Intrinsic::getDeclaration(Result, Intrinsic::va_start);
 
       while (!F->use_empty()) {
         CallInst* CI = cast<CallInst>(F->use_back());
@@ -1620,8 +1619,7 @@
       const Type* RetTy = Type::getPrimitiveType(Type::VoidTyID);
       const Type* ArgTy = F->getFunctionType()->getParamType(0);
       const Type* ArgTyPtr = PointerType::getUnqual(ArgTy);
-      Function* NF = cast<Function>(Result->getOrInsertFunction(
-        "llvm.va_end", RetTy, ArgTyPtr, (Type *)0));
+      Function* NF = Intrinsic::getDeclaration(Result, Intrinsic::va_end);
 
       while (!F->use_empty()) {
         CallInst* CI = cast<CallInst>(F->use_back());
@@ -1649,8 +1647,7 @@
       const Type* RetTy = Type::getPrimitiveType(Type::VoidTyID);
       const Type* ArgTy = F->getFunctionType()->getReturnType();
       const Type* ArgTyPtr = PointerType::getUnqual(ArgTy);
-      Function* NF = cast<Function>(Result->getOrInsertFunction(
-        "llvm.va_copy", RetTy, ArgTyPtr, ArgTyPtr, (Type *)0));
+      Function* NF = Intrinsic::getDeclaration(Result, Intrinsic::va_copy);
 
       while (!F->use_empty()) {
         CallInst* CI = cast<CallInst>(F->use_back());
@@ -3551,8 +3548,8 @@
     const Type* ArgTy = $2.V->getType();
     const Type* DstTy = $4.PAT->get();
     ObsoleteVarArgs = true;
-    Function* NF = cast<Function>(CurModule.CurrentModule->
-      getOrInsertFunction("llvm.va_copy", ArgTy, ArgTy, (Type *)0));
+    Function* NF = Intrinsic::getDeclaration(CurModule.CurrentModule,
+                                             Intrinsic::va_copy);
 
     //b = vaarg a, t -> 
     //foo = alloca 1 of t
@@ -3572,8 +3569,8 @@
     const Type* ArgTy = $2.V->getType();
     const Type* DstTy = $4.PAT->get();
     ObsoleteVarArgs = true;
-    Function* NF = cast<Function>(CurModule.CurrentModule->
-      getOrInsertFunction("llvm.va_copy", ArgTy, ArgTy, (Type *)0));
+    Function* NF = Intrinsic::getDeclaration(CurModule.CurrentModule,
+                                             Intrinsic::va_copy);
 
     //b = vanext a, t ->
     //foo = alloca 1 of t
