TVアニメ『やがて君になる』 PV 第1弾
アニメ『やがて君になる』
いきなり好きというよりも、過程があるから感情移入できます。
今回は、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を実行したところで何も変わらないので最適化されているんですね。
つづく


コメント