<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/88688>88688</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Clang generates slower executables than GCC on simple recursive code
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
i-LOVE-cplusplus
</td>
</tr>
</table>
<pre>
#### C++ Code
```C++
#include <iostream>
using namespace std;
int fib(int n) {
if (n <= 2) return 1;
return fib(n - 1) + fib(n - 2);
}
int main() {
cout << fib(45) << endl;
}
```
#### compiler version
```
Ubuntu clang version 18.1.3 (++20240322073153+ef6d1ec07c69-1~exp1~20240322193300.86)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/11
Selected GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/11
Candidate multilib: .;@m64
Selected multilib: .;@m64
```
```
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/11/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 11.4.0-1ubuntu1~22.04' --with-bugurl=file:///usr/share/doc/gcc-11/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,m2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-11 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --enable-libphobos-checking=release --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --enable-cet --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-11-XeT9lY/gcc-11-11.4.0/debian/tmp-nvptx/usr,amdgcn-amdhsa=/build/gcc-11-XeT9lY/gcc-11-11.4.0/debian/tmp-gcn/usr --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --with-build-config=bootstrap-lto-lean --enable-link-serialization=2
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04)
```
#### executables generated by clang++ is about 60% slower than g++
```
g++ -Ofast untitled.cpp && time ./a.out
1134903170
real 0m0.971s
user 0m0.971s
sys 0m0.000s
```
```
clang++-18 -Ofast untitled.cpp && time ./a.out
1134903170
real 0m1.619s
user 0m1.607s
sys 0m0.000s
```
#### the following code is extracted from : clang++-18 -S -Ofast
```
_Z3fibi: # @_Z3fibi
.cfi_startproc
# %bb.0:
pushq %rbp
.cfi_def_cfa_offset 16
pushq %rbx
.cfi_def_cfa_offset 24
pushq %rax
.cfi_def_cfa_offset 32
.cfi_offset %rbx, -24
.cfi_offset %rbp, -16
movl $1, %ebp
cmpl $3, %edi
jl .LBB0_4
# %bb.1:
movl %edi, %ebx
addl $2, %ebx
xorl %ebp, %ebp
.p2align 4, 0x90
.LBB0_2: # =>This Inner Loop Header: Depth=1
leal -3(%rbx), %edi
callq _Z3fibi
addl %eax, %ebp
addl $-2, %ebx
cmpl $4, %ebx
ja .LBB0_2
# %bb.3:
addl $1, %ebp
.LBB0_4:
movl %ebp, %eax
addq $8, %rsp
.cfi_def_cfa_offset 24
popq %rbx
.cfi_def_cfa_offset 16
popq %rbp
.cfi_def_cfa_offset 8
retq
```
#### the following code is extracted from : g++ -S -Ofast
```
_Z3fibi:
.LFB0:
.cfi_startproc
endbr64
pushq %r15
.cfi_def_cfa_offset 16
.cfi_offset 15, -16
movl $1, %eax
pushq %r14
.cfi_def_cfa_offset 24
.cfi_offset 14, -24
pushq %r13
.cfi_def_cfa_offset 32
.cfi_offset 13, -32
pushq %r12
.cfi_def_cfa_offset 40
.cfi_offset 12, -40
pushq %rbp
.cfi_def_cfa_offset 48
.cfi_offset 6, -48
pushq %rbx
.cfi_def_cfa_offset 56
.cfi_offset 3, -56
subq $56, %rsp
.cfi_def_cfa_offset 112
movl %edi, 4(%rsp)
movl $0, 8(%rsp)
cmpl $2, %edi
jle .L1
.L2:
movl 4(%rsp), %eax
movl $0, 12(%rsp)
subl $1, %eax
movl %eax, (%rsp)
cmpl $2, %eax
je .L56
.L3:
movl (%rsp), %eax
movl $0, 16(%rsp)
leal -1(%rax), %r9d
cmpl $2, %r9d
je .L57
.L5:
leal -1(%r9), %esi
xorl %r8d, %r8d
cmpl $2, %esi
je .L58
.L7:
leal -1(%rsi), %ebp
xorl %ecx, %ecx
cmpl $2, %ebp
je .L59
.L9:
leal -1(%rbp), %ebx
xorl %r14d, %r14d
movl %ebx, %r10d
cmpl $2, %ebx
je .L60
.L11:
leal -1(%r10), %edx
xorl %ebx, %ebx
cmpl $2, %edx
je .L61
.L13:
leal -1(%rdx), %r12d
xorl %r15d, %r15d
movl %ebx, %r11d
cmpl $2, %r12d
je .L62
.L15:
leal -1(%r12), %r13d
xorl %ebx, %ebx
cmpl $2, %r13d
je .L63
.L17:
leal -1(%r13), %edi
movl %edx, 44(%rsp)
subl $2, %r13d
movl %r10d, 40(%rsp)
movl %r11d, 36(%rsp)
movl %ecx, 32(%rsp)
movl %r8d, 28(%rsp)
movl %esi, 24(%rsp)
movl %r9d, 20(%rsp)
call _Z3fibi
movl 20(%rsp), %r9d
movl 24(%rsp), %esi
addl %eax, %ebx
cmpl $2, %r13d
movl 28(%rsp), %r8d
movl 32(%rsp), %ecx
movl 36(%rsp), %r11d
movl 40(%rsp), %r10d
movl 44(%rsp), %edx
jg .L17
addl $1, %ebx
.L19:
subl $2, %r12d
addl %ebx, %r15d
cmpl $2, %r12d
jg .L15
movl %r11d, %ebx
addl $1, %r15d
.L18:
subl $2, %edx
addl %r15d, %ebx
cmpl $2, %edx
jg .L13
addl $1, %ebx
.L16:
subl $2, %r10d
addl %ebx, %r14d
cmpl $2, %r10d
jg .L11
addl $1, %r14d
.L14:
subl $2, %ebp
addl %r14d, %ecx
cmpl $2, %ebp
jg .L9
addl $1, %ecx
.L12:
subl $2, %esi
addl %ecx, %r8d
cmpl $2, %esi
jg .L7
addl $1, %r8d
.L10:
subl $2, %r9d
addl %r8d, 16(%rsp)
cmpl $2, %r9d
jg .L5
movl 16(%rsp), %eax
addl $1, %eax
.L8:
subl $2, (%rsp)
movl (%rsp), %edi
addl %eax, 12(%rsp)
cmpl $2, %edi
jg .L3
movl 12(%rsp), %eax
addl $1, %eax
.L6:
subl $2, 4(%rsp)
movl 4(%rsp), %edi
addl %eax, 8(%rsp)
cmpl $2, %edi
jg .L2
movl 8(%rsp), %eax
addl $1, %eax
.L1:
addq $56, %rsp
.cfi_remember_state
.cfi_def_cfa_offset 56
popq %rbx
.cfi_def_cfa_offset 48
popq %rbp
.cfi_def_cfa_offset 40
popq %r12
.cfi_def_cfa_offset 32
popq %r13
.cfi_def_cfa_offset 24
popq %r14
.cfi_def_cfa_offset 16
popq %r15
.cfi_def_cfa_offset 8
ret
.L61:
.cfi_restore_state
movl $1, %ebx
jmp .L16
.p2align 4,,10
.p2align 3
.L62:
movl $1, %r15d
jmp .L18
.p2align 4,,10
.p2align 3
.L63:
movl $1, %ebx
jmp .L19
.L60:
movl $1, %r14d
jmp .L14
.L59:
movl $1, %ecx
jmp .L12
.L58:
movl $1, %r8d
jmp .L10
.L57:
movl $1, %eax
jmp .L8
.L56:
movl $1, %eax
jmp .L6
.cfi_endproc
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysWktz47ay_jXwBgUWAT5ELrywJWtuqpTr1Ixz7zln4wJJiILDVwDQI2eR334KfEIShpKnMuXxg43u_rrRL4CiUvK8YuweBI8g2NzRVh1qcc_R7vn_nlDaFK3U_--SOvu4B8SbvuAakEdAHuG6zhhwN8B9AKHbfw2k4SnxeJUWbcYg8Na8lkowWgLvqSe3klc5rGjJZENTBqXKgDeyGt95peCeJ4BE-rcKkBiC1bAOQsj3EJCo0iqAt4FE0wVTraggnuRBOD7rJVUQQdxJIo_GI808Y1htzmGUlFeAROcQ0rpVvf71IMwPujX9I1ZlhUXq6LMTi00_p3XZ8IIJ-M6E5HVl5fs9aSvVwrSgVT4uhDhysOPBDqreD-IS3_UIcVceDjxAHtk-zDBL3VUaxgj_zY4N_ntchGPPc10nCrUzOh0vVORMAe8BHqPwNfRRk6KCV-0R5VU7LDkIRjNY1hkr9MKmlvzYk36ppKJFwbINF5oEyLaVApBtwgeTtnVbZTClVcYzqhj8sl5D3nNRpQ0_5yJbxwFkW2hfb_M0BWQ7IJthkS3GvfhvrGCpYtk_LXc9AS7bQnHN5T1AR2-175ahf6Z9adF5MJztcZcpScsLhXgFZcNS6QwYnne7p_XL65e1jn4N-eTx7uX59f-_Pvz229NX4G0mW68bSLaFqtF3QZuGiV7m83a7e37YvL48fP3y9PL6vw-_Pn0D3qZ6b9QRVXXFgPdAyyxPK0TL7CCplW3ztH34ffcCvA3-QXCdRda6rvY8bwXL4HeuDp339CZJodGnIxWid4iQXoGaP_IxY7TNqyFFMHZ8x0W47f7EfxPiuD4gq5EtafNWFMDb7HmhbQFk23_1PpMHKhgg26xOe9-hzk1fnx42vz45j20uIUKsoknBkE7GluZMAm-TArKmGQVknQ7FkazzGpB1IngOyDoDZL2vhRK0AmRdJ29p_wPNy0sCEWoE2_PjtIsjag2kpG-1QIPNqK6Kj259nQtaItnuez6EsfF4EnfudTSb0ZmcGWbx6g8mkA7EDHFNKHjCjizNdGafhNcAr251xHY9IEM5U4od1SxPdUVDO6krF708q6yBoSoMJyd1raQStJkfpUWdUr15m7xqTdyJVFl6PKKMJW1uIyhearYPJkfHZmxP20IZa2jCdbyz77MA7a-24n-2DNXJG0u1cRmXHe1d9T-Y4PuPmaUp2pxX89-jnoazUbX8kIqV6K8T2wueNIc6qSVKDyz9g1c58DaCFYzKiVF1uWTyA29DW1XPYnSAoTy9eN5VJyrSg2HBdyZELQz3MjVq0iuRR4C34WEUTk87D5WhPz4Yax4quFSa5BEdz6Gvvx89cqZ_Dhyk2qrbR1YxwVMD_35f1DQbTJVnBUjHTReeU4qif7GXuPj3_HdfBnQis4TrnNuqskGdkDHo1qdl7Oel5ml1kq06HdI2oygT_J2ZnrVtaa_yMkMhQoe6c6eFooZyaqMNZU5nb183gbeZsgjpgl8wWp3mO5JMcFrwv4aOuSFXG_63tmlqoVve7uW5m2IEk91cQou8FlwdSqlZuvj-S499HVuepvMA07lTDzDLxTuGtw5Tuky1XUZK2AUV1QCTj35yGiZaLiFN9DAXuoAEUBb1dyagOtAK5ieT7am6kR0976lUsK0UVwXLnLRpICAhICHU9QXqtkWdulU9G8aeH7seXp2gFowWwI3d0nXiFZbjrKy78NlD-SGHZ67rylsGCcNWhKN_GC92Qhyf48VO6K4-gdfcMnVgcF8XRf1djz9pnTG9QeyoBO0Gqr2oS6gD6dysb4NlVhWv__H2XNcpPbkv_tMYgO-ODIPNsZPu-atUVKhG1OmEGwISJInj6slhXNq08vAncGNAApE0pxIytn9N9_S13u8lUxCHdq7jIhfxrVx0mcsjp-Th8aCPrCEy5F6saLoVBt6yfi86xT7WJEACZhibls1A9UZqNjvzTdOc3eOj--qfuxKbrpyUdOyjmtlOmmWDGmKhHmsxcvf4z0A6DaEFzyvgxro1QfcYD-HSYyP9UcGDuhl4Ty8HLuEvVcUE3NV1A_-H0Yx1h5sNa_SMOg63wI2LPj-Q153Geg_HFk-ktCj0_p2H22RYwOjRAn02HNksn93vW6hvdHI_OXe_Z7p_1nKxx-Pu2Tdrdjc92aw-VP1ooAq5nB5moNfNjdlh5pTBtKwpmqiCqT__wSo1dYkby9Po3e3jSU2xlh83ZlWWiNBeDnBwq5vMZMfBDYlubOqJRv_W3TzR6J8XnxOZ3s8UNdxVHWRQT2SSRZm-a5fZJRoyqJ8o9H5klRn2IqOf6QKBfQN7yw2ibJMh7YLwxrzDhocuSrA_lDTZTFdFJ1Hi6kWRddFcloi1K7CuLuExB4ilupxqv4zHMxx60yxAZJssxLRh8lh8bzPGkPHW2zLug7PzrKXyU7aEVhxjq8EDlRqtRsTZAl6TOuJdjXgDE--5jtgALLml4YooG5VESxBM7hFCNEJYLUGQ3MBgZJ_R9NOpc6a21kgs3COGeMQQL2FIzI2zDh4C-5Mj9K-2XnmcFriLrkouoiucxhWMl3Bi15w-7APScXGMIBbuEcSUr9hbApGZcYlJZvVWMHsruOYtvBjbpoYRKZmQLkY3JiZSz4b0Vn-dsI8wvAnGYoTrJmabGc2K3KHw7SV5LnJWNLOYLvC0HHe5tPc-J2vo2SuRAaxPPc9efQ2BfZkg9nZhyJNd6yFXek9X0fQ6uyF62LbM2gP7GdNliRzXWVuQvDa73xwlo5rIBie6WHfm48uCN64LbfLMJBo7rNUPZm0aF1odYRaIvO_nq8UDxXHKhpNaa4teI6UNJxslIbi9JAzYgoUw_-FhE18odHY4WkZvOmYGb1S8TxTeAbt3o1_Da351r_nVX_are-lXvOg2f3abf8VttkOv2VY_0dt7aPGS19LZa-QKMHvGTzPHJ-aeHtdSlkzCnB12r-xmbNvModD-YIS8Mhr2-C4yBdsqytmB_0dTtrNbTpelKm-pOQvF9wcngCtHkd5k78Jka7G91eSlPFzsbPZCu2D0Tx2_epsvTn62PnSzyfjsOunqSVSwkpUJE69SUcVOaT8-AN9-O2SetW--HTLP_DPTlWsE8_LBYFq-z7DfeF25WLHfeF25_zm58ZoiFF9cOgkmVS3Y2X7Ybn-NBlU2fRcwriiGu1Yd6GtA1ti9JE1zcWg7-Vv7rqks-kll9pP5smHT-TB0r0H1LVD9kT2IryhPLcqnY0wQXVEeWXRPZ8ZgdUU3vdQ9nc2D8PPMZxdWrMqMy8zxQvQuu_ey2IvpHbvHK-zh0A9W5O5wv8-Ix5gb42SfeXs3CwhlrhuEmGarLHOjO37ffZjJx4G7cklAnBWL0mSPsziKY4qjPfBdVlJeOEXxXjq1yO-4lC27j6Iwiu4KmrBCdh-MI2R4uURAsLkT93o9StpcAt8tuFRyltC9RLtfdx_EGt8wyvEdovn6sXuf-GW9hnUFJS-bgkHB0lZI_s66C-S7VhT3B6UaOX0MJefq0CZOWpeAbLXK4QdqRP3GUgXItrNAArLtjPhvAAAA___Y2L_M">