言語理論とコンパイラ

第十四回: 最適化

2013 年 7 月 19 日

http://www.sw.it.aoyama.ac.jp/2013/Compiler/lecture14.html

Martin J. Dürst

AGU

© 2005-13 Martin J. Dürst 青山学院大学

目次

これからの予定

bison の宿題の正解例

(紙にて配布)

前回のまとめ

前回の宿題

(提出不要)

    [ 削除 ]

論理積のコード生成

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:

 

最適化の目的

最適化の手法

 

最適化の手段 (1)

複数の手法を繰り返し組み合わせて少しづつ最適化

 

最適化の手段 (2)

コードの量が増加しても、実行が加速

最適化の手段 (3)

機械に強く依存

命令の順番の変更の応用例

式: 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))

gcc の最適化に関する設定項目: 英語日本語