2016-12-13 5 views
2

死んだ命令を取り除くために活性解析を実装しようとしています。私はisInstructionTriviallyDead()が存在することを知っていますが、def-use(またはuse-def)チェーンを使ってコードを削除する方法を学びたいと思います。LLVM - 死活コードを取り除くLiveness分析

私が現在やっているやり方は、(inst_iteratorを使って)ブロック内のすべての命令を繰り返し実行していて、すべての命令をループしています。最終的には、命令が、私はそれが死んで検討し、何の使用を持っていない場合は、そのためeraseFromParent()

を使用して削除することができますこれは、次のようになります。

for (inst_iterator I = inst_begin(F), E = inst_end(F); I != E; ++I) { 
    bool deadInst = true; 
    Instruction *inst = &*I; 


    for (User* pUser : inst->users()) { 
     // If we enter this loop, we have at least one use, so instruction isn't dead 
     deadInst = false; 
    } 

    // deadInst is true if we didn't enter the loop, so has no uses 
    if (deadInst) { 
     inst->eraseFromParent(); 
    } 
} 

問題が復帰命令がでassosciated何の用途を持っていない、ありますそれは(と私は確信していない他の定義がない)。しかし、意味的に間違ったコードにつながるので、リターン命令を削除すべきではありません。

ライブセンス解析で命令を削除する一般的な方法は大丈夫ですか?返品などの指示が削除されないようにするにはどうすればよいですか?

任意のポインタがはるかに高く評価されている:)

答えて

0

も命令があなたがllvm::isInstructionTriviallyDead述べたターミネータ命令(inst->isTerminator()

+0

こんにちは。返信いただきありがとうございます。あなたはこれについてより多くの洞察を提供できますか? 'if(deadInst &&!inst-> isTerminator())'のような意味ですか?ターミネータ機能とは何ですか? – user3186023

1

であるかどうかをチェックし、それを除去することができるかについて、いくつかの洞察を得るための良いスタートです、何ができないのか。

あなたは既にターミネーターの指示を削除できないことに気付きました。

また、使用しないで副作用のある命令を削除したくない場合。それは、例えば、stdoutに書き込むか、いくつかのグローバル変数を変更することができ、ので、あなたは、それが何の用途を持っていない場合でも、call命令を削除したくない

define void @bar()() { 
    call void @foo()() 
    ret void 
} 

:これを考えてみましょう。同じことがstoreのものになります。完全なリストについては、Instruction::mayHaveSideEffectsを確認してください。

あなたの生存性分析があまりにも積極的である:なし用途は必要ありませんが、死んで考慮すべき命令のは十分ではない条件。

あなたが学習の目的のためにisInstructionTriviallyDeadを使用しない場合、私は他の方法で回避を開始することをお勧めいたします:命令は確かに死んでいる時に考慮する(例えば、allocaのでadd命令がない、何の用途が存在しないとき死んでいます。 ..)し、次に一般化する。

さらに、すべての命令をループするだけで、死んだ命令を削除するだけでは不十分です。たとえば、次のように

%2 = add i32 3, %1 
%3 = add i32 3, %2 
あなたが最初の出会い %2が、それは %3での使用を持っている

、そう死んでいません。しかし、あなたが%3を死んでしまうと、%2も死んでしまいます。この問題は、新しい死んだ命令が見つからなくなるまで(効果的ではなく単純です)、または再帰的な手順によって繰り返されます。

+0

こんにちは。返信いただきありがとうございます。ライブラリー分析の積極性を打ち消すために、 'if(deadInst)'条件で 'isTerminator()'や 'mayHaveSideEffects()'などの条件を使用できませんか?私。変数に用途がなく、ターミネータ命令ではなく、副作用がない場合は、削除するのと同じことができます。それともまだこれはあまりにも積極的ですか? – user3186023

+1

@ user3186023、[ランディングパッド](http://llvm.org/docs/LangRef.html#landingpad-instruction)をリストに追加すると、それだけで十分だと思うが、 'llvm'も保存しようとするデバッグ情報を含む指示。あなたも残したいと思うかもしれません。 – deniss

+0

ああ着陸パッド - 私はほとんど理解している事!私は 'IsInstructionTriviallyDead()'のソースコードでこれを見てきましたが、それが何をしたのか理解できず、ドキュメントも見つけられませんでした。ランディングパッドとは何かを説明するLLVMのドキュメントはありますか? – user3186023

関連する問題