前回も前々回も、-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$
なんてことでしょう。こちらもインライン化されてしまいました。
謎は深まるばかり。
コメント