コンパイラ

上のコードをSSA形式にすると、if文の後で「x3 = φ(x1, x2)」のような式が入る。このφ関数の働きとして正しいものはどれか。

if (c) x = 1;
else   x = 2;
y = x + 3;
  1. Ax1とx2のうち、大きい方の値を選んで返す
  2. Bx1とx2を足した値を計算して返す
  3. C通ってきた道に応じて、x1かx2を選ぶ
答えと解説を見る

正解:C. 通ってきた道に応じて、x1かx2を選ぶ

SSA形式では、then側の代入をx1、else側の代入をx2と別の名前にするので、合流したあとのyの計算でどちらのxを使えばよいかを表す必要があります。φ関数は、直前にthen側から来たならx1、else側から来たならx2を選ぶという、合流点での値の選択を表す記号です。実際の機械語にはφ関数の命令はなく、最後にレジスタのコピーなどに置き換えます。値の大小や和とは関係ありません。

  • A. 値の大小で選ぶわけではありません。
  • B. 値を足すわけではありません。
  • C. 正しい。通ってきた道に応じて値を選びます。
この分野を解く 分野ページへ

コンパイラのほかの問題

  1. コンパイラの定数畳み込みの例として正しいものはどれか。
  2. 上のコードに定数伝播と定数畳み込みを繰り返し行うと、最終的にどのようなコードになるか。
  3. 上のコードに共通部分式の削除を行ったときの説明として正しいものはどれか。
  4. 不要コードの削除(デッドコード除去)で取り除かれるものとして正しいものはどれか。
  5. 関数のインライン展開の利点と欠点の組み合わせとして正しいものはどれか。