レジスタ割り当て (RA) 後にも定数の伝播を行うことが推奨されないのはなぜでしょうか。いくつかの最適化パス (ポスト RA) の後、一定の伝播/デッドコードの除去などのピープホール最適化の余地があります。2 つの理由しか考えられません。
- これらの最適化は SSA フォームで簡単に実行できます。
- のぞき穴の選択。RA を投稿すると、コンパイル時間が長くなります。
他に理由はありますか?
のぞき穴を実行しても問題ない場合は、opt. ポスト RA では、データ構造/アルゴリズムはどうあるべきか (論文、参考文献などは役に立ちます)。
編集: 500 - 内部サーバー エラーのコメントへの応答。最適化が phi-elimination のようにパスした後 (たとえば、llvm-clang では、レジスタ割り当てとマージされます)、次のようなグローバル スケジューリング: 親基本ブロックへの命令のプルアップなど。
EDIT2:
図に示す例: レジスタ アロケータは、v1 と v2 が同じ値であることを認識し、同じレジスタ (r1) をそれらに割り当てます。レジスタ割り当て後、共通部分式削除パスはr2 = r1
基本ブロック #4 から削除できます。