Я хочу заменить вызов malloc вызовом функции cumemhostalloc.Замена инструкций в LLVM
float *h_A=(float *)malloc(size);
should be replaced with
cuMemHostAlloc((void **)&h_A,size,2);
Я использую следующий код для этого,
*if (dyn_cast<CallInst> (j))
{
Ip=cast<Instruction>(j);
CastInst* ci_hp = new BitCastInst(ptr_h_A, PointerTy_23, "");
BB->getInstList().insert(Ip,ci_hp);
errs()<<"\n Cast instruction is inserted"<<*ci_hp;
li_size = new LoadInst(al_size, "", false);
li_size->setAlignment(4);
BB->getInstList().insert(Ip,li_size);
errs()<<"\n Load instruction is inserted"<<*li_size;
ConstantInt* const_int32_34 = ConstantInt::get(M->getContext(), APInt(32, StringRef("2"), 10));
std::vector<Value*> cumemhaparams;
cumemhaparams.push_back(ci_hp);
cumemhaparams.push_back(li_size);
cumemhaparams.push_back(const_int32_34);
CallInst* cumemha = CallInst::Create(func_cuMemHostAlloc, cumemhaparams, "");
cumemha->setCallingConv(CallingConv::C);
cumemha->setTailCall(false);
AttrListPtr cumemha_PAL;
cumemha->setAttributes(cumemha_PAL);
ReplaceInstWithInst(callinst->getParent()->getInstList(), j,cumemha);*
}
Но я получаю следующее сообщение об ошибке, /home/project/llvmfin/llvm-3.0.src/lib/VMCore/Value.cpp : 287: void llvm :: Value :: replaceAllUsesWith (llvm :: Value *): Assertion `New-> getType() == getType() & &« replaceAllUses значения новым значением разного типа! »'Не удалось. Это потому, что вызов malloc заменяется функцией, которая имеет другую подпись?
Не могли бы вы ответить нам прокомментировать? Как можно заменить вызов нагрузкой? Можно ли сначала вставить вызов в cumemhostalloc, заменить все использования malloc на cumemhostalloc, а затем удалить вызов в malloc? Какие инструкции следует использовать для этого? – user1203259