2014 年 7 月 11日
http://www.sw.it.aoyama.ac.jp/2014/Compiler/lecture14.html
© 2005-14 Martin J. Dürst 青山学院大学
if
文、for
文などがなく⇒条件付き jump
を使用jump
の条件 は 0 との比較jump
は goto
で表現可能C 言語の断片:
if (a<5 && b>10) c = d;
入れ子の if 文に変換:
if (a<5) if (b>10) c = d;
[都合により削除]
for
文のコード生成(発展問題)
C 言語の断片:
for (i=0; i<15; i++) a += b;
準備: while
文に変換:
i = 0; while (i<15) { a += b; i++; }
[都合により削除]
複数の手法を繰り返し組み合わせて少しづつ最適化
24 * 60 * 60
→ 86400
a = 3; b = a * 4;
→ a = 3; b = 3 * 4;
x*2
→ x+x
もしくは
x<<1
)STORE a, R1 LOAD R1, a⇒
STORE a, R1
コードの量が増加しても、実行を加速
double square(double x) { return x*x; } square(a);⇒
a*a
for (i=0; i<5; i++) a+=b;
for (i=0; i<20; i++) a+=b;
for (i=0; i<20; i+=5) a = a+b+b+b+b+b;
機械に強く依存
式: 5 * a
最適化前:
CONST R1, 5
LOAD R2, a ; LOAD は時間がかかる
MUL R3, R1, R2
最適化後:
LOAD R2, a
CONST R1, 5 ; LOAD の間、CONST も実行可能
MUL R3, R1, R2
最適化なし (gcc -O0 -S code.c)
最適化済み (gcc -O1 -S code.c)
(アセンブリ言語は Intel PC 用 (CISC))
お願い: 自由記述に必ず良かった点、問題点を具体的に書きましょう
(悪い例: 発音が分かりにくい; 良い例: さ行が濁っているかどうか分かりにくい)