2012-02-23 10 views
1

ゼロ拡張命令と乗算命令を基本ブロックに挿入したいとします。入力は、私はLLVM C++ APIを使用してそれを行うにはどのように基本ブロックにゼロ拡張命令を挿入する

define void @DriverInit() { 
     EntryBlock: 
      %abc = call i32 @cuInit(i32 0) 
      %2 = zext i32 1 to i64 
    %3 = mul i64 %2, ptrtoint (i1** getelementptr (i1** null, i32 1) to i64) 
      ret void 
     } 

、それを変換したい、

define void @DriverInit() { 
    EntryBlock: 
     %abc = call i32 @cuInit(i32 0) 
     ret void 
    } 

のですか?私はゼロ拡張命令を作成するために、以下のコードを使用しますが、私はそれを行うことができません。

IRBuilder<> builder(BB); 
Value *One = builder.getInt32(1); 

Value *zer=builder.CreateZExt(One, IntegerType::getInt64Ty(M.getContext()),"1"); 

CreateZExtの第2引数は、ゼロ拡張したい宛先タイプです。間違っていると私を修正します。

私はLLVMの初心者であり、パスで使用する機能についての情報を得ることは困難です。ソースコードのdoxygenドキュメントを除き、どのようなリソースが利用できますか?

+0

私はあなたの質問を理解していません - あなたは明確にすることができますか?あなたが持っているIRの入力は何ですか?作成したい出力は何ですか? 'mul'がやっている第二引数の中で、そのポインタの呪文は何ですか? –

+0

入力機能に「EntryBlock」がある場合は、なぜ基本ブロックを作成していますか? – CAFxX

+0

さらに、実際にあなたが達成しようとしていることを説明してから、あなたがやっている(間違った)方法を示す前に、それはおそらく助けになるでしょう。 – CAFxX

答えて

1

LLVMの経験があれば、コードをどこで調べるべきか分かります。 まで、その経験を積んだら、C++バックエンドを使って、指定されたIRと同等のAPI呼び出しを生成することができます。

IRをllcでコンパイルするには、C++バックエンドを使用します。例えば、私はこの単純化IR取る:z.llという名前のファイルに保存

define void @DriverInit() { 
EntryBlock: 
    %0 = zext i32 1 to i64 
    %1 = mul i64 %0, ptrtoint (i1** getelementptr (i1** null, i32 1) to i64) 
    ret void 
} 

をして実行します。

llc -march=cpp -O0 -cppgen=program z.ll 

あなたはLLVMをインストールまたはllcへのアクセス権を持ってどこかに内蔵されている必要があります。 z.cppが生成され、モジュール全体を作成するC++ API呼び出しがあります。 EntryBlock基本ブロックに関連する部分がある:あなたがIRを生成するために、正しくzExtInstrコンストラクタ以降BinaryOperator::Createコールを使用する方法を見て

// Function: DriverInit (func_DriverInit) 
{ 

    BasicBlock* label_EntryBlock = BasicBlock::Create(mod->getContext(), "EntryBlock",func_DriverInit,0); 

    // Block EntryBlock (label_EntryBlock) 
    CastInst* int64_6 = new ZExtInst(const_int32_1, IntegerType::get(mod->getContext(), 64), "", label_EntryBlock); 
    BinaryOperator* int64_7 = BinaryOperator::Create(Instruction::Mul, int64_6, const_int64_2, "", label_EntryBlock); 
    ReturnInst::Create(mod->getContext(), label_EntryBlock); 
} 

します。

関連する問題