第十二回: 最適化
2007 年 7月 6日
http://www.sw.it.aoyama.ac.jp/2007/Compiler/lecture12.html
© 2005-7 Martin J. Dürst 青山学院大学
最終の授業: 7月13日 (金曜日)
期末試験: 7月20日 (金曜日) 2限 (11:10-12:35)
(先週と若干修正)
| 命令 | 被演算子 | 説明 (コメント) |
| LOAD | R1, a | メモリの変数 a の値をレジスタ R1 に代入 |
| STORE | a, R1 | レジスタ R1 の値をメモリの変数 a に代入 |
| CONST | R1, 5 | レジスタ R1 に 5 の定数を代入 |
| JUMP | label | 無条件の label へジャンプ |
| JUMP< | R1, label | レジスタ R1 が 0 より小さい時 label へジャンプ (同様に JUMP<=, JUMP==, JUMP!=, JUMP>= とJUMP> がある。) |
| ADD | R1, R2, R3 | R2 と R3 を足して R1 に代入。同じレジスタを何回使ってもよい。同様に SUB、MUL、DIV がある。 |
式: b = a * 3 + c
生成されるコード:
LOAD R1, a
CONST R2, 3
MUL R3, R1, R2
LOAD R4, c
ADD R5, R3, R4
STORE b, R5
if (a>b) → a-b; jump<if 文のコード生成の例文: if (a>10) { b = 15; }
生成されるコード:
LOAD R1, a
CONST R2, 10
SUB R3, R1, R2 ; R3 = a-10
JUMP<= R3, else1 ; jump to else part if a-10<=0
CONST R4, 15
STORE b, R4
else1:
if・else 文のコード生成if (a > b)
c = a;
else
c = b;
LOAD R1, a
LOAD R2, b
SUB R1, R1, R2 ; a-b > 0
JUMP<= R1, else
LOAD R1, a
STORE c, R1
JUMP end
else: LOAD R1, b
STORE c, R1
end:
if (a>10 || b < 3)
c = 5;
コードの変更:
if (a>10)
c = 5;
else if (b < 3)
c = 5;
LOAD R1, a
CONST R2, 10
SUB R1, R1, R2 ; a-10 > 0
JUMP<= R1, else
CONST R1, 5
STORE c, R1
JUMP end
else: LOAD R1, b
CONST R2, 3
SUB R1, R1, R2 ; b-3 < 0
JUMP>= R1, end
CONST R1, 5
STORE c, R1
end:
while 文のコード生成while (a < 20)
a += 3;
next: LOAD R1, a
CONST R2, 20
SUB R1, R1, R2
JUMP>= R1, break
LOAD R1, a
CONST R2, 3
ADD R1, R1, R2
STORE a, R1
JUMP next
break:
複数の手法を繰り返し組み合わせて少しづつ最適化
x*2 → x+x
もしくは x<<1)この最適化はコードの量を増やすが、速くする
この手段は機械に強く依存する
式: 5 * a
最適化前:
CONST R1, 5 LOAD R2, a ; LOAD は時間がかかる MUL R3, R1, R2
最適化後:
LOAD R1, a CONST R2, 5 ; LOAD の間、CONST も実行可能 MUL R3, R1, R2
(アセンブリ言語は Intel PC 用 (CISC))