コンパイラ

上のコードに定数伝播と定数畳み込みを繰り返し行うと、最終的にどのようなコードになるか。

int n = 8;
int m = n * 2;
return m + 1;
  1. Areturn n * 2 + 1;
  2. Breturn 8 * 2 + m;
  3. Creturn 17;
答えと解説を見る

正解:C. return 17;

定数伝播では、nに8が入ったあと変更されないので、nを使う場所を8に置き換えて m = 8 * 2 とします。定数畳み込みで 8 * 2 を16に計算すると m = 16 になり、さらに伝播と畳み込みで m + 1 は 16 + 1 = 17 になります。nとmの代入は使われなくなるので不要コードとして削除され、return 17; だけが残ります。途中で止めた形や、置き換えを誤った形は最終の結果ではありません。

  • A. nがまだ残っており、伝播が終わっていません。
  • B. 置き換えを誤っており、計算も終わっていません。
  • C. 正しい。8 → 16 → 17と計算が進み、定数だけが残ります。
この分野を解く 分野ページへ

コンパイラのほかの問題

  1. 上のコードに共通部分式の削除を行ったときの説明として正しいものはどれか。
  2. 不要コードの削除(デッドコード除去)で取り除かれるものとして正しいものはどれか。
  3. 関数のインライン展開の利点と欠点の組み合わせとして正しいものはどれか。
  4. ループ展開(ループアンローリング)の主な効果として正しいものはどれか。
  5. 上のループで、ループ不変式の移動(ループの外への移動)の対象になる計算はどれか。(x、yはループ内で変更されないものとする)