デッドコード削除

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

デッドコード削除(デッドコードさくじょ、: dead code elimination)は、コンパイラ最適化技法の一種で、プログラムの結果に影響しないコードを削除することでプログラムのサイズを削減することを指す。デッドコードとしては、全く実行されないコード、参照されない変数(そのプログラムでは不要な変数)を更新するだけのコードなどが含まれる。

[編集]

次のC言語のコード例を見てみよう。

int foo()
{
  int a = 24;
  int b = 25; /* 参照されない変数への代入 */
  int c;
  c = a << 2;
  return c;
  b = 24; /* 実行されないコード */
}

変数 b には return 文の後に値が代入されているが、これは実行されない。すなわち、コードの実行は逐次的であり、return 文が何らかの条件で囲まれているわけでもないので、return 文の後のコードは実行不可能である。ただし、例えば return 文の後にラベルがあって、どこかから分岐して飛んでくる場合は、その限りではない。

さらに、この代入文を削除すると、b という変数が初期値を代入したとき以外では全く使われないことがわかる。オプティマイザがどこまで積極的に最適化するかにもよるが、変数 b は生成されるコードから完全に削除される可能性もある。

関数内で何らかの計算が行われたとしても、その結果がこの関数のスコープ外からアクセス可能な位置に格納されなければ、その計算は無意味である。さらにこの関数は常に同じ値 (96) を返すので、単にその値を返す関数として単純化される可能性もある。

最近のコンパイラはデッドコード削除を行うか否かをオプションで指定でき、場合によってはそのレベルを指定できるものもある。低いレベルでは、実行されないコードのみを削除するだろう。もう少し高いレベルでは、使われない変数のための領域を確保しないことになる。さらに高いレベルでは、意味のないコードや関数を特定して、それらを削除する。

デッドコード削除の典型的な利用例として、プリプロセッサによるオプションコードの代替としての使い方がある。次のコードを見てみよう。

int main() {
  int a = 5;
  int b = 6;
  int c;
  c = a * (b >> 1);
  if (0) {   /* DEBUG */
    printf("%d\n", c);
  }
  return c;
}

if文の条件式が 0 ということは、常に偽であることを意味し、このif文の中のコードは実行されない。従って、デッドコード削除を行った最適化されたプログラムでは、その部分のコードは削除される。これはデバッグ用のコードを念のために置いておく際の典型的なテクニックであり、最終的な製品では最適化が行われてデバッグ用コードが削除されると同時に、プリプロセッサの処理を軽減することでコンパイル時間の短縮にもなる。