コンパイラ最適化
以下の最適化は、プログラムを静的単一代入(SSA)と呼ばれる形式に変換した上で行われる。SSA では各変数への代入が一箇所だけで行われる。場合によってはSSAに変換しないで最適化を施すこともあるが、ここに挙げる最適化技法はSSAと共に用いることで最も効果を発揮する。他の節に挙げた最適化技法でも、SSA に適用可能であるものが多い。
最も頻繁に使われる変数はレジスタに割り当てて、高速にアクセスできるようにする。どの変数をレジスタに置くべきかを決定するために、干渉グラフ(英: interference-graph)を作成する。各変数をノードで表し、同時に使われる2変数の間を線で結ぶ。このグラフにチャイティンのアルゴリズムなどを適用して色をつけ、同じ色数となった変数をレジスタに割り当てる。色付けが失敗して、同じ色数の変数の一部がレジスタに割り当てられなくなった場合、色付けを再試行する。
なるべく制御構造を単純化する。分岐は命令のプリフェッチを乱すため、性能低下の原因となる。
プログラマは、アプリケーション開発の最中に頻繁にコンパイルを行うため、コンパイルは高速でなければならない。このため、最適化の大部分はデバッグ中には実施されない。また、デバッグ中のコードはデバッガでステップ実行されたりするので、命令を並べ替えるような最適化を行うと、デバッグが困難になる(ある命令がソースコードのどの部分に相当するかわかりにくくなる)。もっとも、コンパイラ最適化を行うことで発生する障害もまれにあり、その場合は最適化されたコードで何とかデバッグするしかない。
分岐先に到達できる最短の分岐ディスプレースメント を選択する。
多くの高級言語の構文要素や抽象化は共通である。分岐 (if, switch, case)、ループ (for, while, repeat...until, do...while)、カプセル化(構造体、オブジェクト)などがある。この特徴を利用して言語に依存しない最適化技法を利用できる。しかし、言語によってはある種の最適化が容易だったり、逆に難しかったりする。例えば、C言語やC++はポインタがあるため、配列アクセスの最適化が困難である。逆に、一部の言語では関数が副作用を持つことができない。このため、同じ引数で同じ関数を何度も呼び出す場合、コンパイラはこれを最適化して一回だけその関数を呼び出して、後はその結果を再利用することができる。
GCCの持つ最適化技法。条件分岐の条件が同じものや正反対のものを検出した場合、2番目の分岐先に繋ぎ合わせる。
入力プログラムに近い表現。インライン展開など高水準の最適化を適用する場合に利用する。