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

前回も前々回も、-O2と-O3の違いを確認しようとしましたが、アセンブラコードに差が出ませんでした。そもそもソースが-O3で最適化できるようになっていないのでしょう。
前回の最後は、こんなソースになってましたね。

takk@deb9:~/tmp$ cat -n t.c
     1  int b;
     2  void func1(void)
     3  {
     4          b = b + 50;
     5  }
     6
     7  int main()
     8  {
     9          int a=10;
    10          if(a == 10)
    11                  b = 100;
    12          else
    13                  b = 200;
    14
    15          func1();
    16
    17          return b;
    18  }
takk@deb9:~/tmp$

-O2と-O3のオプションの差は、-finline-functionsですので、ソースコードの方に、inlineキーワードを追加してみます。

takk@deb9:~/tmp$ cat -n t.c
     1  int b;
     2  inline void func1(void)
     3  {
     4          b = b + 50;
     5  }
     6
     7  int main()
     8  {
     9          int a=10;
    10          if(a == 10)
    11                  b = 100;
    12          else
    13                  b = 200;
    14
    15          func1();
    16
    17          return b;
    18  }
takk@deb9:~/tmp$

これでどうでしょうか。

takk@deb9:~/tmp$ gcc -O3 -S t.c
takk@deb9:~/tmp$ cat -n t.s
     1          .file   "t.c"
     2          .section        .text.startup,"ax",@progbits
     3          .p2align 4,,15
     4          .globl  main
     5          .type   main, @function
     6  main:
     7  .LFB1:
     8          .cfi_startproc
     9          movl    $150, b(%rip)
    10          movl    $150, %eax
    11          ret
    12          .cfi_endproc
    13  .LFE1:
    14          .size   main, .-main
    15          .comm   b,4,4
    16          .ident  "GCC: (Debian 6.3.0-18+deb9u1) 6.3.0 20170516"
    17          .section        .note.GNU-stack,"",@progbits
takk@deb9:~/tmp$

func1のタグがないですね。ようやくfunc1がインライン化されました。

ん、まてよ、このソースを-O2でコンパイルするとどうでしょう。

takk@deb9:~/tmp$ gcc -O2 -S t.c
takk@deb9:~/tmp$ cat -n t.s
     1          .file   "t.c"
     2          .section        .text.startup,"ax",@progbits
     3          .p2align 4,,15
     4          .globl  main
     5          .type   main, @function
     6  main:
     7  .LFB1:
     8          .cfi_startproc
     9          movl    $150, b(%rip)
    10          movl    $150, %eax
    11          ret
    12          .cfi_endproc
    13  .LFE1:
    14          .size   main, .-main
    15          .comm   b,4,4
    16          .ident  "GCC: (Debian 6.3.0-18+deb9u1) 6.3.0 20170516"
    17          .section        .note.GNU-stack,"",@progbits
takk@deb9:~/tmp$

なんてことでしょう。こちらもインライン化されてしまいました。
謎は深まるばかり。

Leave a Reply

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

CAPTCHA