言語理論とコンパイラ

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

2011 年 7 月 1 日

http://www.sw.it.aoyama.ac.jp/2011/Compiler/lecture12.html

Martin J. Dürst

AGU

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

目次

これからの予定

bison の宿題の正解例

諸事情により削除されました

前回のまとめ

ifelse 文のコード生成

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:

最適化の目的

最適化の手法

最適化の手段 (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 -O3 -S code.c)

(アセンブリ言語は Intel PC 用 (CISC))

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