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()などのメソッドがいくつかあることがわかります。練習目的のために、私はそれらを使用する予定はありません。
ありがとうございました:)はい、動作します。好奇心のために、イテレータを使ってこれを行う方法はありますか?だから、すべてのBasicBlocksの命令をベクトルに入れ、それらを反復するといいでしょうか? – Babak