2017-01-12 12 views
0

llvmの各命令の後継のリストを取得したいとします。私が正しく理解していれば、枝(br)以外のすべての命令について、後続命令は次の命令です。しかし、分岐命令の方が少し難解です。例えばLLVMでの命令の後継のリストの検索

、私は次のCコードがある場合:

define i32 @main() #0 { 
%1 = mul nsw i32 7, 2 
%2 = icmp slt i32 7, 3 
br i1 %2, label %3, label %5 

; <label>:3:          ; preds = %0 
%4 = add nsw i32 10, %1 
br label %7 

; <label>:5:          ; preds = %0 
%6 = add nsw i32 20, 7 
br label %7 

; <label>:7:          ; preds = %5, %3 
ret i32 %1 
} 

ので、指示

BR:

int main() { 
    int a = 7; 
    int b = a * 2; 

    int x; 
    if (a < 3) { 
    x = 10 + b; 
    } else { 
    x = 20 + a; 
    } 
    return b; 

}

を、私は、次のバイトコードを取得i1%2、ラベル%3、ラベル%5

2つの後継有する:

はどのようにアクセスできる

{%4 = 7、%6 = 20 NSW I32を追加し、新しいI32 10%1を追加します}命令の後継者?

注:私が実際にやろうとしているのは、デッドコードの除去です。私は、llvmには、ライブ解析ライブラリのIsInstructionTriviallyDead()などのメソッドがいくつかあることがわかります。練習目的のために、私はそれらを使用する予定はありません。

答えて

1

getSuccessor(unsigned) & getNumSuccessors() methods on BranchInstを使用して命令が分岐できる基本ブロックを得ることができます。 BasicBlock *BBが与えられた場合、BB->front()から最初の命令にアクセスできます。

+0

ありがとうございました:)はい、動作します。好奇心のために、イテレータを使ってこれを行う方法はありますか?だから、すべてのBasicBlocksの命令をベクトルに入れ、それらを反復するといいでしょうか? – Babak

関連する問題