2013 年 7 月 19 日
http://www.sw.it.aoyama.ac.jp/2013/Compiler/lecture14.html
© 2005-13 Martin J. Dürst 青山学院大学
(紙にて配布)
if 文、for
文などがなく、条件付き jump を使用jump の条件 は 0 との比較jump は C 言語で goto で表現可能(提出不要)
[ 削除 ]
if (a>10 && b < 3)
c = 5;
コードの変更:
if (a>10)
if (b < 3)
c = 5;
LOAD R1, a
CONST R2, 10
SUB R1, R1, R2 ; a-10 > 0
JUMP<= R1, end
LOAD R1, b
CONST R2, 3
SUB R1, R1, R2 ; b-3 < 0
JUMP>= R1, end
CONST R1, 5
STORE c, R1
end:
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:
複数の手法を繰り返し組み合わせて少しづつ最適化
24 * 60 * 60 → 86400a = 3; b = a * 4; → a = 3; b = 3 * 4;x*2 → x+x もしくは
x<<1)STORE a, R1 ↵LOAD R1, a → STORE a,
R1) コードの量が増加しても、実行が加速
機械に強く依存
式: 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))