2012 年 7 月 13 日
http://www.sw.it.aoyama.ac.jp/2012/Compiler/lecture13.html
© 2005-12 Martin J. Dürst 青山学院大学
makefile, complex.h, complex.lex, complex.y, test.in.txt, test.check.txt
if
文、for
文などがなく、条件付き jump
を使用jump
の条件 は 0 との比較jump
は C 言語で goto
で表現可能while
文のコード生成C 言語
while (a < 20) a += 3;
制限された C 言語
next: if (a-20 >= 0) goto break; a += 3; goto next; break:
while
文のコード生成の結果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:
for
文のコード生成C 言語
for (i=0; i<20; i++) sum += i;
制限された C 言語
i = 0; next: if (i-20 >= 0) goto break; sum += i; cont: i++; goto next; break:
for
文のコード生成の結果CONST R1, 0 STORE i, R1 next: LOAD R1, i CONST R2, 20 SUB R1, R1, R2 JUMP>= R1, break LOAD R1, sum LOAD R2, i ADD R1, R1, R2 STORE sum, R1 cont: LOAD R1, i CONST R2, 1 ADD R1, R1, R2 STORE i, 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 -O1 -S code.c)
(アセンブリ言語は Intel PC 用 (CISC))