<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/63541>63541</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Inefficient compiled output for certain combination of double precision and quadruple precision
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
lvandeve
</td>
</tr>
</table>
<pre>
The following code:
```
struct F{
__float128 f128;
double f64;
bool has128;
bool has64;
double get64();
};
double F::get64() {
if(has64) return f64;
return (double)f128;
}
```
Compiles to the following (on godbolt, selecting x86-64 clang 16.0.0 with the flag -O3)
```
F::get64(): # @F::get64()
push rbx
mov rbx, rdi
movaps xmm0, xmmword ptr [rdi]
call __trunctfdf2@PLT
cmp byte ptr [rbx + 25], 0
je .LBB0_2
movsd xmm0, qword ptr [rbx + 16] # xmm0 = mem[0],zero
.LBB0_2:
pop rbx
ret
```
In the resulting assembly, it's always calling the function '__trunctfdf2', which is a quadruple precision floating point related function, even if "has64" is true. This also turns out to be much slower than alternatives.
You can put '[[likely]]' after the has64 'if' case to make the generated code much better, or alternatively put a side effect on the line after if(has64).
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJx8VcuO47gO_RplQ1Qgy88svOhUEKCBBu5d1GZWBdmmbXXLkluS85ivH9BOKnFXzQiBlIjkIXlEMtJ71RnEkqV7lh42cgq9daU-SdPgCTeVba7lW4_QWq3tWZkOatsgi78xfmD8vmf89pl_-uCmOsCR5fvlAt7fW21liEQBbSQKFt8F0Nip0ghtljxdVtZq6KVfq95vn1Vv5h2GLGGiYGL3IWP54fF93m_KR4o-_vZkA49IAUC1TBSLH7EDh2Fy5o8A4X7NRLGgMrFbZUbev-Jm2V_tMCqNHoKFsGKXicIa6GxTWR2YeAWPGutAokuRvWQJ1FqaDqJsy7cczir0C4KWHbz8LyYG_v1lPqfO4jmdrxcTMbCEf2G18DBOvp_JqC4PZmgN9gR3gXgF16hPcjl6gMswcFK4DMPZugbG4ICle9JPD2uTWmpN5_t7cJOpQ9u0giX8_z_e_tAbxvmsrgE_8KoLMLEHkRKseAW-tvmJy7n9sd_zd_EpVt_AI9bfq0hvyFHG0sODNNIFFh9gwIGle764_RudXbDvju5tdPc12hHWhDoM_1FH3838-A79pOcakd7jUOkrBaoCE7kHqc_y6mf-SGMuFiJQWSrffMWnyMnw3Ku6B-VBwu9JNm4aNcLosFaejOZWJqjRKhPAoZYBmw9QQsATGlAtMCFujSQIL7gJt_DWE7T2FqiFPNgpUB9UCMNU9-C1PaOD0EsDUgd0RgZ1Qr99TvwvO0EtDYxToCTm6bXX6hfqK3FNdOcg2zAD4TI1SJF6O4daeiSXg_yFs7xDg27OgqbbEkeFIaCjbKx7DkRfZ68SvGoQsG2xDmCXh9DK4M3taoqsYn_eN00ZN7t4JzdYRlmRF2nKRbTpyyRpiyxKW5lz2USVrGSWJqLYiTyN2iqrN6oUXMQ8Ezkv4pxH2zhP2xTzIiuKKo0qzhKOg1R6q_Vp2FrXbZT3E5ZZnCbRRssKtZ_HvhAGzzALmRD0L-BKsnmpps6zhGvlg3-gBBU0lt8Ntq2qFZoA9TLNGnpJoqa1Dmp0QSpDskoRcdaAbe_z-lFM0jRfFdlmcrrsQxg99Yg4MnHsVOinalvbgYkjRXM7XkZnf2IdmDjOOXgmjnOO_wQAAP__3tcBFw">