From 5fe51cc2c46afca64638597cdef3bdafa6cd0a8c Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 12 Feb 2004 17:01:09 +0000 Subject: [PATCH] Implement the llvm.memcpy intrinsic git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11349 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/IntrinsicLowering.cpp | 16 +++++++++++++++- lib/VMCore/Function.cpp | 3 +++ lib/VMCore/IntrinsicLowering.cpp | 16 +++++++++++++++- lib/VMCore/Verifier.cpp | 2 ++ 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/lib/CodeGen/IntrinsicLowering.cpp b/lib/CodeGen/IntrinsicLowering.cpp index 026150f78b5..48ae01540bb 100644 --- a/lib/CodeGen/IntrinsicLowering.cpp +++ b/lib/CodeGen/IntrinsicLowering.cpp @@ -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(CFT->param_begin(), CFT->param_end()-1), + false); + Function *MemCpy = M->getOrInsertFunction("memcpy", FT); + new CallInst(MemCpy, std::vector(CI->op_begin()+1, CI->op_end()-1), + CI->getName(), CI); + break; + } } assert(CI->use_empty() && diff --git a/lib/VMCore/Function.cpp b/lib/VMCore/Function.cpp index f98a7c71656..a4bc4eab2a8 100644 --- a/lib/VMCore/Function.cpp +++ b/lib/VMCore/Function.cpp @@ -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; diff --git a/lib/VMCore/IntrinsicLowering.cpp b/lib/VMCore/IntrinsicLowering.cpp index 026150f78b5..48ae01540bb 100644 --- a/lib/VMCore/IntrinsicLowering.cpp +++ b/lib/VMCore/IntrinsicLowering.cpp @@ -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(CFT->param_begin(), CFT->param_end()-1), + false); + Function *MemCpy = M->getOrInsertFunction("memcpy", FT); + new CallInst(MemCpy, std::vector(CI->op_begin()+1, CI->op_end()-1), + CI->getName(), CI); + break; + } } assert(CI->use_empty() && diff --git a/lib/VMCore/Verifier.cpp b/lib/VMCore/Verifier.cpp index 1a66a9f9656..71ea54e58b2 100644 --- a/lib/VMCore/Verifier.cpp +++ b/lib/VMCore/Verifier.cpp @@ -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; -- 2.34.1