2012-03-21 2 views
3

Я хочу заменить вызов 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 заменяется функцией, которая имеет другую подпись?

+0

Не могли бы вы ответить нам прокомментировать? Как можно заменить вызов нагрузкой? Можно ли сначала вставить вызов в cumemhostalloc, заменить все использования malloc на cumemhostalloc, а затем удалить вызов в malloc? Какие инструкции следует использовать для этого? – user1203259

ответ

2

Практически. Звонок в malloc выдает значение, ваша функция - нет. Таким образом, вы должны заменить вызов с нагрузкой, а не с другим абонентом

Кроме того, глядя в код:

  • Не играйте с instlists напрямую. Вместо этого используйте итераторы IRBuilder +.
  • Вы можете проверить CallInst и объявить var в одно и то же время, нет необходимости добавлять в команду инструкцию.
Смежные вопросы