[MOAB-dev] Discussion on return type of MOAB routines

Jed Brown jed at jedbrown.org
Fri Jan 24 12:16:25 CST 2014


"Wu, Danqing" <wuda at mcs.anl.gov> writes:

> Even with C style struct, without explicitly defined constructors, there is still noticeable difference.
>
> Used g++ -O3 to build.
> For returning plain enum type, the result on my laptop is
> real	0m0.003s
> user	0m0.000s
> sys	0m0.000s

Haha, do you really believe that your computer does (10^5)^2 function
calls in a couple milliseconds?  GCC unwinds the tail recursion and
eliminates it:

00000000004004d0 <test_return_0> xor    eax,eax
00000000004004d2 <test_return_0+0x2> ret    
00000000004004d3 <test_return_0+0x3> data32 data32 data32 nop WORD PTR cs:[rax+rax*1+0x0]

> For returning struct, the result is
> real	0m4.114s
> user	0m4.112s
> sys	0m0.000s

GCC doesn't unwind this version, but Clang does.

The -O3 gcc assembly shows that it predicts the branch is not taken and
unrolls by 3 (so it only does a third of the cases).

00000000004005a0 <_Z13test_return_1l> xor    eax,eax
00000000004005a2 <_Z13test_return_1l+0x2> test   rdi,rdi
00000000004005a5 <_Z13test_return_1l+0x5> jg     00000000004005b0 <_Z13test_return_1l+0x10>
00000000004005a7 <_Z13test_return_1l+0x7> ret    
00000000004005a8 <_Z13test_return_1l+0x8> nop    DWORD PTR [rax+rax*1+0x0]
00000000004005b0 <_Z13test_return_1l+0x10> cmp    rdi,0x1
00000000004005b4 <_Z13test_return_1l+0x14> je     00000000004005a7 <_Z13test_return_1l+0x7>
00000000004005b6 <_Z13test_return_1l+0x16> cmp    rdi,0x2
00000000004005ba <_Z13test_return_1l+0x1a> je     00000000004005a7 <_Z13test_return_1l+0x7>
00000000004005bc <_Z13test_return_1l+0x1c> sub    rsp,0x8
00000000004005c0 <_Z13test_return_1l+0x20> sub    rdi,0x3
00000000004005c4 <_Z13test_return_1l+0x24> call   00000000004005a0 <_Z13test_return_1l>
00000000004005c9 <_Z13test_return_1l+0x29> add    rsp,0x8
00000000004005cd <_Z13test_return_1l+0x2d> ret    
00000000004005ce <_Z13test_return_1l+0x2e> xchg   ax,ax

The unrolling is skipped at -O2.

00000000004005a0 <_Z13test_return_1l> xor    eax,eax
00000000004005a2 <_Z13test_return_1l+0x2> test   rdi,rdi
00000000004005a5 <_Z13test_return_1l+0x5> jg     00000000004005b0 <_Z13test_return_1l+0x10>
00000000004005a7 <_Z13test_return_1l+0x7> ret    
00000000004005a8 <_Z13test_return_1l+0x8> nop    DWORD PTR [rax+rax*1+0x0]
00000000004005b0 <_Z13test_return_1l+0x10> sub    rsp,0x8
00000000004005b4 <_Z13test_return_1l+0x14> sub    rdi,0x1
00000000004005b8 <_Z13test_return_1l+0x18> call   00000000004005a0 <_Z13test_return_1l>
00000000004005bd <_Z13test_return_1l+0x1d> add    rsp,0x8
00000000004005c1 <_Z13test_return_1l+0x21> ret    
00000000004005c2 <_Z13test_return_1l+0x22> nop    WORD PTR cs:[rax+rax*1+0x0]
00000000004005cc <_Z13test_return_1l+0x2c> nop    DWORD PTR [rax+0x0]
11:07 jedbatura9 master * ~/lang/cxx$ g++ -Os returntype.cc 

or -Os where it predicts the nontrivial branch will be taken (better
performance because that's what actually happens in this test; not in
reality).

0000000000400590 <_Z13test_return_1l> xor    eax,eax
0000000000400592 <_Z13test_return_1l+0x2> test   rdi,rdi
0000000000400595 <_Z13test_return_1l+0x5> jle    00000000004005a1 <_Z13test_return_1l+0x11>
0000000000400597 <_Z13test_return_1l+0x7> push   rax
0000000000400598 <_Z13test_return_1l+0x8> dec    rdi
000000000040059b <_Z13test_return_1l+0xb> call   0000000000400590 <_Z13test_return_1l>
00000000004005a0 <_Z13test_return_1l+0x10> pop    rdx
00000000004005a1 <_Z13test_return_1l+0x11> ret    
00000000004005a2 <_Z13test_return_1l+0x12> nop    WORD PTR cs:[rax+rax*1+0x0]
00000000004005ac <_Z13test_return_1l+0x1c> nop    DWORD PTR [rax+0x0]
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 835 bytes
Desc: not available
URL: <http://lists.mcs.anl.gov/pipermail/moab-dev/attachments/20140124/701d0f7d/attachment.pgp>


More information about the moab-dev mailing list