2012-03-21 16 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/llvmf​​in/llvm-3.0.src/lib/VMCore/Value.cpp :287:void llvm :: Value :: replaceAllUsesWith(llvm :: Value *):アサーション `New-> getType()== getType()& &" replaceAllUsesの値を別の型の新しい値に置き換えてください! これは、mallocの呼び出しが、異なる署名を持つ関数に置き換えられているためですか?

+0

あなたのコメントをelobarateできますか?コールを負荷に置き換えることはどのように可能ですか?最初にcumemhostallocに呼び出しを挿入し、mallocのすべての使用をcumemhostallocに置き換えてから、mallocへの呼び出しを削除することは可能ですか?これにはどのような指示が必要ですか? – user1203259

答えて

2

ほぼ。 mallocの呼び出しは値を生成しますが、関数はそうではありません。だから、あなたはあなたのコードに見て、ではない。また別のコール

で、負荷とコールを交換する必要があります。

  • が直接instlistsで再生しないでください。 IRBuilder +イテレータを代わりに使用する
  • CallInstをチェックし、同時にvarを宣言できます。命令に追加キャストする必要はありません。