现在的编译器真是NB啊

复习编译原理,前年意云大神出了一个题,是这样的:
一段源程序:

1 void f(int a, int b, int c, int d, int x, int y, int z)
2 {
3 while(a < b)
4 {
5 if(c < d)
6 x = x + z;
7 else
8 x = y - z;
9 }
10 }

用gcc 3.3.5开最大优化编译出来结果是:

1 _f:
2 pushl %ebp
3 movl %esp, %ebp
4 movl 8(%ebp), %ecx
5 movl 12(%ebp), %edx
6 cmpl %edx, %ecx
7 jge L8
8 L9:
9 cmpl %edx, %ecx
10 jl L9
11 L8:
12 popl %ebp
13 ret
14

问用了哪些优化。
看到这个题目当场就石化了,现在编译器太NB了吧,那么大一个while循环给优化的只有这么一点...

1 L9:
2 cmpl %edx, %ecx
3 jl L9

于是真开gcc 3.4.4搞了一下,怎么结果反而差了一些: 

1 _f:
2 pushl %ebp
3 movl %esp, %ebp
4 movl 8(%ebp), %ecx
5 movl 12(%ebp), %edx
6 cmpl %edx, %ecx
7 jge L8
8 movl 20(%ebp), %eax
9 cmpl %eax, 16(%ebp)
10 jl L15
11 L9:
12 cmpl %edx, %ecx
13 jl L9
14 L8:
15 popl %ebp
16 ret
17 L15:
18 cmpl %edx, %ecx
19 jge L8
20 cmpl %edx, %ecx
21 jl L15
22 jmp L8
23

跳转结构搞得好诡异...而且优化得不干净,c < d还是比较了一下。那更高版本的gcc版本能做成什么样呢?开gcc 4.3.2 (20080827Beta)搞了一下,结果相当完美...进了while循环以后连条件判断都省了...直接jmp 囧

1 _f:
2 pushl %ebp
3 movl %esp, %ebp
4 movl 12(%ebp), %eax
5 cmpl %eax, 8(%ebp)
6 jl L5
7 popl %ebp
8 ret
9 L5:
10 jmp L5

于是想看看天天用的VS2008能搞成什么样,于是用cl 15.0,优化全开,结果如下:

1 _f PROC
2 mov eax, DWORD PTR _a$[esp-4]
3 cmp eax, DWORD PTR _b$[esp-4]
4 jge SHORT $LN3@f
5 npad 6
6 $LL4@f:
7 jmp SHORT $LL4@f
8 $LN3@f:
9 ret 0
10 _f ENDP

也是无比的猛啊~~~~~~关于里面出现的npad 6,上网查了一下是什么意思。原来是一个用来延时的宏:

1 npad macro size
2 if size eq 1
3 nop
4 else
5 if size eq 2
6 mov edi, edi
7 else
8 if size eq 3
9 ; lea ecx, [ecx+00]
10 DB 8DH, 49H, 00H
11 else
12 if size eq 4
13 ; lea esp, [esp+00]
14 DB 8DH, 64H, 24H, 00H
15 else
16 if size eq 5
17 add eax, DWORD PTR 0
18 else
19 if size eq 6
20 ; lea ebx, [ebx+00000000]
21 DB 8DH, 9BH, 00H, 00H, 00H, 00H
22 else
23 if size eq 7
24 ; lea esp, [esp+00000000]
25 DB 8DH, 0A4H, 24H, 00H, 00H, 00H, 00H
26 else
27 %out error: unsupported npad size
28 .err
29 endif
30 endif
31 endif
32 endif
33 endif
34 endif
35 endif
36 endm

至于为什么要用这个宏感觉难以理解...猜测可能和现今CPU的一些指令级并行化特性比如超标量,多发射有关...
还有如果另写一个main函数,只在里面调用一下f()就return,两个编译器都齐刷刷把该调用忽略了。被鄙视...泪...
最终结语:现在的编译器真是NB啊!!

P.S.感谢stephen同学的灵感启发和技术指导!

posted on 2010-01-25 22:29  grapeot  阅读(340)  评论(0编辑  收藏  举报

导航