gcc最適化(O2/O3)アセンブラ比較


アニメ『やがて君になる』

いきなり好きというよりも、過程があるから感情移入できます。

今回は、gcc -O3オプションのアセンブラを見てみたいと思います。
-O3オプションは、manではこのように説明されています。

       -O3    さらなる最適化を行います。これは  -O2 が行う全ての最適化手段に加
              えて -finline-functions も有効にします。

今回もこのソースです。

takk@deb9:~/tmp$ cat -n t.c
     1  int main()
     2  {
     3          int a=10;
     4          int b;
     5          if(a == 10)
     6                  b = 100;
     7          else
     8                  b = 200;
     9  }
takk@deb9:~/tmp$

-O2、-O3それぞれでビルドして、アセンブラの差分を見てみましょう。

takk@deb9:~/tmp$ gcc -o t-O2.s -S -O2 t.c
takk@deb9:~/tmp$ gcc -o t-O3.s -S -O3 t.c
takk@deb9:~/tmp$ diff t-O2.s t-O2.s
takk@deb9:~/tmp$

おかしいです。差分がありません。
もしかしたらmainから呼び出す関数がないから差分がないのかもしれません。
空関数を入れてみます。

takk@deb9:~/tmp$ cat -n t.c
     1  void func1()
     2  {
     3
     4  }
     5
     6  int main()
     7  {
     8          int a=10;
     9          int b;
    10          if(a == 10)
    11                  b = 100;
    12          else
    13                  b = 200;
    14  }
takk@deb9:~/tmp$
takk@deb9:~/tmp$ gcc -o t-O2.s -S -O2 t.c
takk@deb9:~/tmp$ gcc -o t-O3.s -S -O3 t.c
takk@deb9:~/tmp$ diff t-O2.s t-O3.s
takk@deb9:~/tmp$

だめですねえ。
差分ありません。
アセンブラみてみます。

takk@deb9:~/tmp$ cat -n t-O3.s
     1          .file   "t.c"
     2          .text
     3          .p2align 4,,15
     4          .globl  func1
     5          .type   func1, @function
     6  func1:
     7  .LFB0:
     8          .cfi_startproc
     9          rep ret
    10          .cfi_endproc
    11  .LFE0:
    12          .size   func1, .-func1
    13          .section        .text.startup,"ax",@progbits
    14          .p2align 4,,15
    15          .globl  main
    16          .type   main, @function
    17  main:
    18  .LFB1:
    19          .cfi_startproc
    20          xorl    %eax, %eax
    21          ret
    22          .cfi_endproc
    23  .LFE1:
    24          .size   main, .-main
    25          .ident  "GCC: (Debian 6.3.0-18+deb9u1) 6.3.0 20170516"
    26          .section        .note.GNU-stack,"",@progbits
takk@deb9:~/tmp$

関数func1はコールされてないですね。func1を実行したところで何も変わらないので最適化されているんですね。

つづく

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA