コンパイラ
レジスタ割り当てで「スピル」が起こると、生成されるコードはどうなるか。
- A値をスタックに退避・読み戻す命令が増え、遅くなりやすい
- Bレジスタの数が自動的に増え、すべての値をレジスタに置けるようになる
- C使われない値が削除されて、命令の数が少なくなる
答えと解説を見る
正解:A. 値をスタックに退避・読み戻す命令が増え、遅くなりやすい
スピルは、同時に生きている値がレジスタの数より多いときに、一部の値をメモリ(スタック)に置くことです。その値を使うたびに読み込み命令、書き換えるたびに書き込み命令が必要になり、命令が増えてメモリアクセスの分だけ遅くなりやすくなります。そのためコンパイラは、ループの中などよく使われる値をレジスタに残し、あまり使わない値を選んでスピルさせます。レジスタの数はCPUで決まっていて増えず、不要な値の削除とも別の話です。
- A. 正しい。退避と読み戻しの命令が増え、遅くなりやすくなります。
- B. レジスタの数はCPUで決まっていて増えません。
- C. 不要な値の削除は別の最適化です。