コンパイラ

上のコードに共通部分式の削除を行ったときの説明として正しいものはどれか。

x = (a + b) * c;
y = (a + b) * d;
  1. Aa + b を1回だけ計算して一時変数に入れ、2つの式で使い回す
  2. Bx と y は似た式なので、どちらか一方の計算を削除する
  3. C掛け算を足し算に置き換えて、計算を軽くする
答えと解説を見る

正解:A. a + b を1回だけ計算して一時変数に入れ、2つの式で使い回す

共通部分式の削除は、同じ値になる式を何度も計算している場合に、1回だけ計算して結果を再利用する最適化です。この例では、t = a + b を計算しておき、x = t * c、y = t * d とすれば足し算が1回減ります。ただし2つの式の間でaやbが書き換えられないことを確かめる必要があります。xとyは別の値なので、どちらかを削除することはできません。掛け算を軽い演算に置き換えるのは強度低減という別の最適化です。

  • A. 正しい。同じ式を1回だけ計算して使い回します。
  • B. xとyは値が違うので、どちらも必要です。
  • C. 重い演算を軽くするのは強度低減です。
この分野を解く 分野ページへ

コンパイラのほかの問題

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