<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">