言語理論とコンパイラ

第十三回: コード生成、最適化

2012 年 7 月 13 日

http://www.sw.it.aoyama.ac.jp/2012/Compiler/lecture13.html

Martin J. Dürst

AGU

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

目次

これからの予定

bison の宿題の正解例

makefile, complex.h, complex.lex, complex.y, test.in.txt, test.check.txt

前回のまとめ

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 の最適化に関する設定項目: 英語日本語