最適化の方法

最適化の方法
•
•
•
•
中田育男著
コンパイラの構成と最適化
朝倉書店, 1999年
第11章
最適化の種類
• 実行速度を速いものにする。
– 命令の実行回数を減らす。
– より速い命令を使う。
– 並列度を上げる。
• 所要メモリを少なくする。
• 大域的最適化
• 局所的最適化
– のぞき穴式最適化
命令の実行回数を減らす
• 1度実行した結果を再利用する。
– 共通部分式の削除
• コンパイル時に実行してしまう。
– 定数の畳み込み
• 命令をより実行頻度の低いところに移す。
– 命令のループの外への移動
• プログラムの形を変換する。
– ループの変換
• 式の性質を利用して実行を省略する。
• 冗長な命令を取り除く。
– 無用命令の削除・複写の削除
• 特殊化する。
– 手続き呼出しの展開・判定の置換え
共通部分式の削除
a = b + c;
…
…
d = (b + c) * e;
(1)
(2)
(A) (1)と(2)の「b + c」は同じ形の式であること
フロー解析
(B) (2)の計算の前に必ず(1)の計算は行われていること
データフロー解析
(C) (1)の計算をしてから(2)の計算をするまでに
b, cの値が変わらないこと
定数の畳み込み
a = 3.5 * 2.0;
…
…
b = a + 16.5;
(3)
(4)
(3) ⇒ a = 7.0;
(4) ⇒ b = 23.5;
(A) (4)の計算の前に必ず(3)の計算は行われていること
(B) (3)の計算をしてから(4)の計算をするまでに
aの値が変わらないこと
命令のループの外への移動
do i = 1, 10
…
a = b*c
…
end do
b*c: ループ不変
相対定数
⇒
t = b*c
do i = 1, 10
…
a = t
…
end do
ループ変換
•
•
•
•
ループつぶし
ループ融合
ループ展開
ループif展開
式の性質の利用
• 論理式の部分的評価
• 算術式の演算順序変更
• 式の簡単化
x * 1
y + 0
無用命令の削除
a = a;
a = b + c;
その結果得られるaの値がどこでも使われない。
複写の削除
a = b;
(5)
…
c = a + d;
(6)
(5)を削除
(6) ⇒ c = b + d;
(A) (6)で使われるaの値を定義しているの(5)だけ。
(B) (5)を実行してから(6)を実行するまでの間に
bの定義はない。
(C) (5)で定義されたaを使うすべての文について
上記の(A), (B)が成り立つ。
手続き呼出しの特殊化
• 手続き呼び出しの展開
int p(int x)
{
if (x<10)
return x+2;
else
return x*2;
}
a = p(5); ⇒ a = 7;
• 手続きの複製
判定の置換え
i = i + 1;
if (i <= n)
goto loop;
のぞき穴式最適化
BrF
JUMP
L
M
BrT
M
L:
⇒
! Branch if False
より速い命令の利用
• レジスタ割付け
• 特殊な命令の利用
– ベクトル化
• メモリアクセス順序の最適化
• 演算の強さの軽減
– x**2 ⇒ x*x
– x*2 ⇒ x+x
– x/5.0 ⇒ x*0.2