<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/54921>54921</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Floating point exception in clang14.0.0 with -mavx2
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          KierenP
      </td>
    </tr>
</table>

<pre>
    Hi, I'm hoping someone can look at this and tell me if I've found a legitimate compiler bug.

I am compiling the following the small following test program:

```
#include <cfenv>
#include <iostream>

bool driver(unsigned int value, double lower, double upper) 
{
    return lower <= value && value <= upper;
}

int main() 

    feenableexcept(FE_INVALID);
    volatile int x = 62;
    volatile double lower = 31;
    volatile double upper = 62;
    volatile int y = driver(x, lower, upper);
}
```

I compile with the command: 
```
clang++ test_file.cpp -mavx2 -O3 -g
```

and when I run, I get: 
```
Floating point exception (core dumped)
```

----------------------

Compiler information: 
```
clang version 14.0.0
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /home/kieren.pearson/.conan/data/clang/14.0.0/_/_/package/2201725ed6c2736f243c00af939498ce6c18440d/bin
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.8
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.8.5
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/6
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/6.4.0
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/7
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/7.3.0
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/8
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/8.0.1
Selected GCC installation: /usr/lib/gcc/x86_64-linux-gnu/7.3.0
Candidate multilib: .;@m64
Candidate multilib: 32;@m32
Candidate multilib: x32;@mx32
Selected multilib: .;@m64
```

---------------------

I have explored this code in godbolt and compared the assembly difference between clang13.0.1 and clang14.0.0:

https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1DIApACYAQuYukl9ZATwDKjdAGFUtAK4sGIM6SuADJ4DJgAcj4ARpjEEgBspAAOqAqETgwe3r56KWmOAiFhkSwxcVy2mPYFDEIETMQEWT5%2BAXaYDhl1DQRFEdGxCbb1jc05FQojvaH9pYNcAJS2qF7EyOwc5gDMocjeWADUJltuyFSMAG7H2CYaAILbu/uYRydOk8SYrNe3D/dRqE8B3QxDwF1iEC8DDSwDC6AOoQIBwuYi8mFIwJWUXoB1oqAA7rEMegsTivEkkrEFkd7iYAOxWe4HZkHT4EVYMXEE2KvNzHAAiyNRL3M8VFQu8IpOAoO5MpxGOjIedP5v1%2BiIOLCYoQg1LVDJpdxZB3OjCY2MwmFU6ySBAgADFsAB9ACS4QAancgi7%2BQtFb9jRdPExHDiNapXoL4mZ/UyWUGDKGXiSvBauYTiJGDlsuLGjfHg0nMamyRSeTLo3nA4W6C8NQBPLMgsEQ1QYvEZjFyql5%2Bn8jhLWicACsvD8HC0pFQnD5lmsBwUKzWIrMOd4BE0A6WAGsQJIuAA6MwATgAHGZ4sOzJJjxozBo6fpOJIx5up5xeAoQBpSBuJwPSDgWAYEQFBUBYJJazICgIDQCCoJQAwjC4LYNAqGhaAIWIvwgKI3yiUIGnrTgeFIOC2EEAB5BhaGI/9SCwLUjHEej8E%2BTpwS/eirQ6LwsJI3hESqN9aDwKJiCIjwsAE39QRYASlioAxgAUd08EwfFKMpcdSP4QQRDEdgpBkQRFBUdR6N0CokOMaxrH0MSv1gZg2BAKgWAIUhwTiAhiChbcFiWVBbQyLiAFpKK2A4wq1C5VE/KoOhqFwGHcTwWj0YIZhKMpclSdIBDGPwKjyAqGD6HL5kqaouimIq9HaToBG6RoKoGcphh6eqJimNq5nKJZF1WdY9F8y0FKfDhR1IcdJ2nDhVFPeIwviSQDj2QxgAOFCDw0A8uAOCBZysSwMVwQgSCOVcKgODx4PoTNtkWddN0C0hd0kOkDzpU871W086WHY9hyB09JpfUh5OHH9Zt4ebP2/X9XsAkCICQODIIe8hKAxhCNuQyQNB/DCsOIHC8PogjmGIOjSPIxgCGo2i30YzaWMnNikpbLjJx45A%2BI2UihKHejRPEySMEF9c5ImpSmBUtSNK0xgZL04RRHEYy1bMtQ310AIbJQOzTrFpyoBc9h3M87yQF8/y3uCmpwsi6LYvi6quecCBXHq69AlSvrctQ5J8pqX3pFKmpA8GYPGpqFqmnSnI/bj2qemjuJY7qpPWmkSZ0%2By9qQFQwalxGioxqlwcR1fej5sW5bVvWmztskXbdsO477IOc6iEe66MTuzHy1XMwFhe/83oQL4sDiXVwd4KGYbfeHbERv8tDe3dh1Pb60LpLZPuh486WPLZJq2Wu5o/JHJ%2BrjgzCvuGb43rcvOwjI9yAA%3D%3D

When looking into the clang14.0.0 code:

```
        vcvtsi2sd       xmm0, xmm0, rax
        vmovsd  xmm1, qword ptr [rsp + 24]      # xmm1 = mem[0],zero
        vmovsd  xmm2, qword ptr [rsp + 16]      # xmm2 = mem[0],zero
        vcmplepd        xmm2, xmm0, xmm2
        vcmplepd        xmm0, xmm1, xmm0
        vandpd  xmm0, xmm0, xmm2
        vmovd   eax, xmm0
        and     eax, 1
```

we can see that the integer is first converted into a double in the lower 64 bits of the `xmm0` register. The lower and upper bounds are put into the `xmm1` and `xmm2` registers. Then `vcmplepd` compares each double in the respective registers. Then a logical and is done and we finally extract the very lowest bit. 

I believe clang is going wrong here because it doesn't believe it needs to zero the `xmm0` register. `vcvtsi2sd` leaves the upper 64 bits unchanged and we later discard all but the lowest bit, so this would normally be fine except `vcmplepd` will raise a signal if either of the operands is a `NAN` which I believe is the case here. For whatever reason the register on my computer starts off with a `NAN` in the higher 64 bits.

Clang13.0.1 on the other hand, generates: 

```
        vcvtsi2sd       xmm0, xmm0, rax
        vucomisd        xmm0, qword ptr [rsp + 24]
        vmovsd  xmm1, qword ptr [rsp + 16]      # xmm1 = mem[0],zero
        setae   al
        vucomisd        xmm1, xmm0
        setae   cl
        and     cl, al
```

notably, it uses a different comparison function `vucomisd`, and this comparison function only compares the lowest 32 or 64 bits of the register depending on the operands. This is safe because the unchanged higher bits in xmm0 after `vcvtsi2sd` are not compared. 

It seems the clang14 generated code is wrong.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy1WFlz4roS_jWZF9dQ3jDwkAd5A7ObJYS8THkRtsC2jBds8utvy4YkM5PJOXXrTIoYZLU-9a5uudS_Po7Ig6hx1oPYi7mQpiQJuJzGmCaY85yEiyg9cU7BFSHJOSfxuQJHERdjjhyaRRfMHWgJ7x0uwgEpSOwUsJLGKYlwxrll0Hng9QcetU-Lc-LbLNupCNnyKKLVfZTHDuB_eIfzgkszGmRO_CChj1gPCn_7tENRIokXlT7mHiTNO-Dk8iAZn80RmhcZZnjGRzyX0ojzM3LB2YPYL5OcBAn2OZIU3MWJSsz05NPSjTBopWJEb-MyTdl4wN3wemr7g4O_DBdllrRL2O4Pkt7icQ-iAp_7oJ1pkST1DqR_5JCxEjskAfZ-2ox73-2AceIAS7j2cFoAoWn8sOZPaGrpsOQNmJFeaOQUYKVGwppjuyvi5xQfxW4IJeFLwkaKLxHZnteG4k3jNVPom2bvKv1EF7_Y_eZYN5_jKlKEjSvBixg8FryG-3ShFzlJ8CCq8Gnc7McBlne8NOW-x86lFrnvC4n7HnyxKYuHKsQJZ3FZmTRxxAW4-OOOZkRBevDqlDL5WxsRmoAn9D2agfrKOMU-k_rPm37_9O8jhXaPPpIcaAYBCVt8rQUOLJAzRgS5w3duMxsnuwlT95Ufivy9TE4JrZLvELpl_T1IyhtdCMHkczH1ccSoU5qT-maVJC8gnrGvk6zhQDRDSC7wdSI4w0knxU6WA3ei2fFo4rAfvlM48HWzjnnjSDR_3P5Txzs5AcMQRV7oiV3sK57Yk5SDKEsezzuHgTSQB30PK57Ql2Ue9Gm6EDStCZpkBZnNJz7LVENNAzU1XL7rSTTLHHzPjIgLz8Dz4HnTwbvsoil3-n8FtNP972GVvwDZke-u8l_C9v4CZEf6G5z-Bev3wdmFFnaNI-wVcAD9R5JrbwzGZQQ5GBYCUIflV5mPFfkrKkm8kcGPL8jqN7r6TvgmxVeb_vs893PKDx0oP3CdRpA7_bZE8SALgba4gPoujYqmZGEng9NSYM7Jcxy70ZXzyeHAcpCHORcXFZybXJNzBInZoF3YjNsE9HPtERZFmrN3osnU327WoVnQvJBeYWqxnwYhMtWz37W1Gu2r5V6dabG68tUpMgVb85CzNDQ0e63UYoZ6yK7MYmarV7QKBpPC3hvomhOXt5-RVvdVFU2ommwQ2qJRWqHZBZn7zboYB4JuoRRpe2SX-_IUDV7QptInRx8NzW2BJnI-tGbKukT6WNbHAfKOMlqlR8MI1DxFaHFGZ2MTVFjKuspkFy8QMcPTuqq9p6sYL_embljGZmYbu033QeyKKnp29noYCbq9Mg1_WGuuKxw9vmva9HhxRoN0P_fQeC2ezZ5xXVReN9Bn1DviHdK346gor-Z6hoa9kajtHWRNXeal5X519Ren_nqfzbGks0NgdTb6qmTXemUKxND6ur6udE1BC2pbalXuST82rWq82z5TVaBnhHqZMcNBviEX43TKDPPk98geLeodlkcvp9FGNp72s2fDECeX-esIIXKdr6bSrP9k2mXfSheILrqztB4ujhb2l92L0EhLrMVU21M7EKZP-jj16xdVWhy1vTirYnOrXNcqCpBu5kgdIG0t21ASeAHpNWvtwnQHx5W_NOqRTuZO-kyncvwC0m2vu-1QnwyfyfqiOuV-Q8ZDPcrL6fB4GAV8MnPi62qNN1MqJUjeKVp_bqvL6SzIDVuw9xfj5Whez1FrkKR_DKc74iEtv-j9kcanpp3o3SjO1Wo7ed1Z2Wzhy6rBI2WHhrk9tkqElFmFNgEaDV_kfPE6Hh9r-qpS5ZAuxlbdLdNujRG11XStluNqudaDHdobtqlu1f147LxaWmDptqbRsY2qoyZP93N0HoZg0J11qYKJJV3J1hom2SbAprXQRMNAalcNnSH0DOZgrVXT7XFk4GPfaGTYpNUaJjDJbGVa5WNLCo31eT5w9GoyJpp1rHJkSAN7tUfriFBUB2jr832jOpiTWer566Vs2yvd8INUPYFjqlt_pcx5jZ4WM6fORvxsfRGClwDcdwKiWNuw2hAUEi10PZPsnlTXvk4JMtPJRERydRa07hNwZk7oIjyb1XDkbardkd9bLyHbL1r7lqoPl9XkeAW5dWU07Z7ODi1JbJ0HI2dD1aGyohM69NIwVPB5TOL5uZtMxi-msPP3A7N_5c3JQQ9XguX5YzHRwydzia3qQta2fhRtEHBhanrFo36JFpr6cs3X1eypsoO1tnjyJsFCr-Ul3cyL0873QVI-9PnT4qS_ptt-T9jxfWU32g_Cq8oPxulhG3YXo9HgpZCxuxRBsOfBc45OmqXZC92ycD-coDrU5qV9tedQEJu6li-skdZf0uAYD63Fcb206kAbUpFI_P7V2c2SOTml7vQ4ruUuaoxoiVsSTkb4uFoa1_XMMAde14rTdaxui_V8wtfBy5SXV6uRsb8K7qywJQGSuDu2F6-bzEyvVPUGIURk72rD0SqaV6nU4rTKiTLdX4hyLrGnqc-jszJA0fqSeYXdHffT87OUmpM4Rf3hfjlMz-Y5TtYJczP3KJ5xfCzH-945Xe7i0_qFbxi9Ds62aVdOVA8Jrc9R5a2EAz52813Xfbrs4tciPz27fr6Qez1r4SnEwIoy25Svo6vwPKvMkBWffYnaUznXyfNT5cuT4d494JFrrC79QseSHwpLV-Gn6fRlWYYyWGM5fRmfxV3ZpbB4PBo3nGTH4FW7lENXljLvsqiO1uCKmDZZEmSPD0fOjjUarB1nDQS0D7Rtct6PqObs-7pH5m5_F-9S5ETM_du4jmOetS_378ypf1kQ0wujBgKBEZwrmvlcWkCT11WzPOVYEyXKD129pYczsKFtOrwYx0DFwyQsfcUZ_SO2-EdsQfkVW_xX2F6cRji9y_m2xweBxX9ccacU3lb-vAJKhdT_XYmfYIOkDBg79edQrOjg3gmEL8qjqr2fyTEGP2guaJqmGges78u5A8nyAjwigc6uaG8xKOfc-3MokBh9288rMueSIufooXkJ-zSMKTyX4YDkBc463OaNmrHYtvcuq3tzDiorLi2Ld5dsAQQGwIjbofgRL28AEzZ1VzebvtVpOYjvhb-wCq9TKCTJBf-G4gBnAfGcqNkOZPfZ5VXTm2PQQwJ18xWqxCJzvFZNoJJrIw1oCCTvcD9XlS6OCL7cQovhBZSFXJVReIZQMgKF55Q58FbAXjiHrrVXvC2DlwnGoBhQB3PIPyu1Ef8WiGwmwlDP5g19q-G7ZcrEC4EXMONNKmgEYNonuedAqLAbM7cs3kzaisUcKKdtVVzRMvK5hF0GMGW4jV7w7QLiVzNUBPAyh4CADscuwUCz5MBhAvjZ3Uso8Ocw87NrQYYwR_NmcUjAdu9KJK08ngNoTHcdzqQZUIEAYAZQhgPt_83CrV44GMfXxhlKNoTGJ2u889Be7Xzc7eYcIQnCd3X9dOGofSjpbxvRRo6QXQ2BigKcgCQFzj_ckPy3qbMEUUj-W0L5cwr9P1Lv7-nxX6XeHBcOZnkn-kee_5D87ghe9Hkmg_ew7o7_aSZLaOFAQ8boIHYgrphH3buz4pYVCHOTAwRCe18GHntjkYGxHZK3BvB3cppE1_fs8iFMJJGjvyXAN0f0cYqhzYWov3vOzelZ4iGN6-fO4T0dNIH7Fqo3p2yQwU-Z6jjnwHB_jXuWQUEJb33qLwmpYEk-zj8e929e698a3rxNT51v_qPkD6SB860gRYQf_3jjSJKfSocmstprz29lFj3-0t_CbOl2gD924xBd7l_f04weISvDkOR5CTEkml15IArfwsfu4OD3erILtZAg-_xBkfnuAbu8LIiu4DvOt8iBHJE_gnuCd34jjyIvijDb5QVZ5qVO_4C7feXgyxL2REfmH2Qexw6JOmxj1ml_yx4bHtwyyGEyApvl75PQ5rPre3zHd8oipNnjpLl2XH5r2H1seP0fLt2_XQ">