第十二回: コード生成、最適化
2011 年 7 月 1 日
http://www.sw.it.aoyama.ac.jp/2011/Compiler/lecture12.html
© 2005-11 Martin J. Dürst 青山学院大学
諸事情により削除されました
if
・else
文のコード生成C のプログラム
if (a > b) c = a; else c = b;
参考: C のプログラムの変形
if (a <= b) goto else; c = a; goto end; else: c= b; end:
アッセンブリのプログラム
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:
複数の手法を繰り返し組み合わせて少しづつ最適化
5 * 7
→ 35
a = 3; b = a * 4;
→ a = 3; b = 3 * 4;
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
最適化なし (gcc -O0 -S code.c)
最適化済み (gcc -O3 -S code.c)
(アセンブリ言語は Intel PC 用 (CISC))