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


コメント