Implement the llvm.memcpy intrinsic
authorChris Lattner <sabre@nondot.org>
Thu, 12 Feb 2004 17:01:09 +0000 (17:01 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 12 Feb 2004 17:01:09 +0000 (17:01 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11349 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/IntrinsicLowering.cpp
lib/VMCore/Function.cpp
lib/VMCore/IntrinsicLowering.cpp
lib/VMCore/Verifier.cpp

index 026150f78b51368e34deaef63557f570add471be..48ae01540bbf6bce994c84320a45e304511995c1 100644 (file)
@@ -13,8 +13,8 @@
 
 #include "llvm/IntrinsicLowering.h"
 #include "llvm/Constant.h"
+#include "llvm/DerivedTypes.h"
 #include "llvm/Module.h"
-#include "llvm/Type.h"
 #include "llvm/iOther.h"
 using namespace llvm;
 
@@ -57,6 +57,20 @@ void DefaultIntrinsicLowering::LowerIntrinsicCall(CallInst *CI) {
     if (CI->getType() != Type::VoidTy)
       CI->replaceAllUsesWith(Constant::getNullValue(CI->getType()));
     break;    // Simply strip out debugging intrinsics
+
+  case Intrinsic::memcpy: {
+    // The memcpy intrinsic take an extra alignment argument that the memcpy
+    // libc function does not.
+    const FunctionType *CFT = Callee->getFunctionType();
+    FunctionType *FT =
+      FunctionType::get(*CFT->param_begin(), 
+           std::vector<const Type*>(CFT->param_begin(), CFT->param_end()-1),
+                        false);
+    Function *MemCpy = M->getOrInsertFunction("memcpy", FT);
+    new CallInst(MemCpy, std::vector<Value*>(CI->op_begin()+1, CI->op_end()-1),
+                 CI->getName(), CI);
+    break;
+  }
   }
 
   assert(CI->use_empty() &&
index f98a7c71656bab9a624014c853bff50cca1247af..a4bc4eab2a86f8e78d875193b3b3b3af7a4076cc 100644 (file)
@@ -217,6 +217,9 @@ unsigned Function::getIntrinsicID() const {
   case 'l':
     if (getName() == "llvm.longjmp")  return Intrinsic::longjmp;
     break;
+  case 'm':
+    if (getName() == "llvm.memcpy")  return Intrinsic::memcpy;
+    break;
   case 's':
     if (getName() == "llvm.setjmp")     return Intrinsic::setjmp;
     if (getName() == "llvm.sigsetjmp")  return Intrinsic::sigsetjmp;
index 026150f78b51368e34deaef63557f570add471be..48ae01540bbf6bce994c84320a45e304511995c1 100644 (file)
@@ -13,8 +13,8 @@
 
 #include "llvm/IntrinsicLowering.h"
 #include "llvm/Constant.h"
+#include "llvm/DerivedTypes.h"
 #include "llvm/Module.h"
-#include "llvm/Type.h"
 #include "llvm/iOther.h"
 using namespace llvm;
 
@@ -57,6 +57,20 @@ void DefaultIntrinsicLowering::LowerIntrinsicCall(CallInst *CI) {
     if (CI->getType() != Type::VoidTy)
       CI->replaceAllUsesWith(Constant::getNullValue(CI->getType()));
     break;    // Simply strip out debugging intrinsics
+
+  case Intrinsic::memcpy: {
+    // The memcpy intrinsic take an extra alignment argument that the memcpy
+    // libc function does not.
+    const FunctionType *CFT = Callee->getFunctionType();
+    FunctionType *FT =
+      FunctionType::get(*CFT->param_begin(), 
+           std::vector<const Type*>(CFT->param_begin(), CFT->param_end()-1),
+                        false);
+    Function *MemCpy = M->getOrInsertFunction("memcpy", FT);
+    new CallInst(MemCpy, std::vector<Value*>(CI->op_begin()+1, CI->op_end()-1),
+                 CI->getName(), CI);
+    break;
+  }
   }
 
   assert(CI->use_empty() &&
index 1a66a9f9656da868bbd42a90bc0f2f984bc125aa..71ea54e58b2d7970c55a4c6b54acd04fc58b2975 100644 (file)
@@ -561,6 +561,8 @@ void Verifier::visitIntrinsicFunctionCall(Intrinsic::ID ID, CallInst &CI) {
   case Intrinsic::dbg_region_end:  NumArgs = 1; break;
   case Intrinsic::dbg_func_start:  NumArgs = 1; break;
   case Intrinsic::dbg_declare:     NumArgs = 1; break;
+
+  case Intrinsic::memcpy:          NumArgs = 4; break;
  
   case Intrinsic::alpha_ctlz:      NumArgs = 1; break;
   case Intrinsic::alpha_cttz:      NumArgs = 1; break;