<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=http://email.email.llvm.org/c/eJzNVsGS4yYQ_Rr50mUXAlsjHXSYnclW5ZDKJXcXkpBFgoQXkD27X58GJI9m19pyai_RMAiK103zunlypZuv5V-dgFo3vuvPUokGrtJ1kGRk-yfFHrSJE-YnreInm9AXGK0cTlArPpy2KdsR_5eQ14Q8T31GphanlMmhViPuk7CX2rpGDi5hv91b5eqkDcbQv6-HPm55EbVE1CugA0aPDo5H7pyR1ejE8ZjQHBtinDZHK78JnKVZQoupsU9Lj7OLnr9dopkEjjBIniYc4GOEG80AGHPCnrEhGsHfTXly-ESSw6vnxo_TMC789A6SRqQfshm4CO7p9T6JoX-JebLg9F3UdBg8G1ITmcDpft4jHGnlSehnbJDsyc-d3KjxT68v4X3N_WEvZGfn43-AtRPumqaBFLLipVh4oT94ucFSssCxH3B1f4bFbhjbx2Ur1HvMUx-hyq14KiKIrHi6LftX8VNP-YS572jhISK_94P1uHLH0KITRoB0YDs9qgaqxb2-1cv_oWqsx_r3nMe9XakXcq9cVjkI_e8DnnpwhlvnjR1K3Fu2h4rX_4ihwYDzoHHb3lrhowNpgVdKIEVwFqbVpofaaGsB9S0yyI20eojaaLuxbf0N3IITdTfIL6OI-3AH15l3fuFSBa9yAG76Sw7cwlUodQvAC2sVxOwi3tyXo2U0CIRXBvpCoyYAjwgkbImoptV1-_QRe8_cnJvYPw8aCTNQcyugk6dO4b_z0ut57CVy1kBMrvTDJTvT2R__EPTcdTeZvwl8GyJulea_JO-V1gpT28pBorERbbRtH9D42eqDsqMNzd5t1sA36X8AS_8Ddv5SPPaZuHay9qWqrxYpNV99V2lMKccE9liWZspcUAb_NRVqi0s0yog3xlsh-7MSvcDFxpcxwrlSQu02TcmaghV8w0fXaVOOmFTBbb8ZjSo7587WnyEowwlLfax2uBtOlLrMr-3Z6L8xlTjFohoF_q74fKB5lm268lDk-ywlNU9pwdL6QA8FObDmidRFwXgrNnizhLIl0pJQOogrBBc4RpI2vx6BLCmhaUrpnuSM0Kdd2mR5Q6uUNqTN25yi2okeL_jO-9lpc9qYMrisRvyBtCdKWmffF5F0eRqECAFjhE46Jco_4mVC_uQ31CuusA6bsXYS79IsGpsQWRnC-hc8RrLC>52866</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Missed horizontal reduction in armv8
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    The code compiled with `-O2` or `-O3` flags, using clang-13.0.0.0

```
#include <cstdint>
#include <algorithm>

using veci = int32_t __attribute__((vector_size(16)));

int32_t maxv(veci a) {
    return std::max(std::max(a[0], a[1]), std::max(a[2],a[3]));
}
```

Compiles to
```
maxv(int __vector(4)):                           // @maxv(int __vector(4))
        mov     w8, v0.s[1]
        fmov    w11, s0
        mov     w9, v0.s[2]
        mov     w10, v0.s[3]
        cmp     w11, w8
        csel    w8, w8, w11, lt
        cmp     w9, w10
        csel    w9, w10, w9, lt
        cmp     w8, w9
        csel    w0, w9, w8, lt
        ret
```
, where it should be compiled to

```
maxv(int __vector(4)):                           // @maxv(int __vector(4))
        smaxv   s0, v0.4s
        fmov    w0, s0
        ret
```

In contrast, the x64 backend (with -msse4) is able to perform cross lane comparison with shuffles - technique, that would be available in armv8 as well (with  `b = vextq_s32(a,a,2); a = vmaxq_s32(a,b); b = vextq_s32(a,a,1); a = vmaxq_s32(a,b);`)

Another case highlighting the missed vectorised comparison would be

```
#include <cmath>
using vecf = float __attribute__((vector_size(16)));

bool isfinite_ref(vecf a) {
    return std::isfinite(a[0]) &
    std::isfinite(a[1])&
    std::isfinite(a[2])&
    std::isfinite(a[3]);
}
```

which shows very verbose assembler compared to intel-sse2, which is implemented in parallel.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzNVsGOmzAQ_RpysRIZkxA4cNjutlIPVS-9RwaG4Nbg1DbJtl_fsQ1ZdhuqVL2U9RqP_GY8fh4_Uqr6R_GlBVKp2nXdSUioyUXYlkQpXX9m2BOlg5E4o5H8aCL2SAYj-iOpJO-P6zjZUPcX0aeIPox9SscWTJaIvpIDrhMlj5WxtehtlLy_NcvlUWnMoXuZ931Y8gyVQNQTwQAJO1hyOHBrtSgHC4dDxDJsiLFKH4z4CWjFacTysSXv5hGnEB1_Pgc3QTjCSLQfcQQfDXbQPcGco-QBG6IR_Mbk0e4djXZPjhs3jv04d-YNJAtIN0wm4Cy5_dNtEn3_GM7JEKtuosbN4N6QmsAEmttpDb-lhSdiH7CRaEv_HORKjXs6dfbvS-Y2e6YbM23_FawZcZc49qTQhSj5LAr7LcoVFtMZLvkNV3UnMlsNc3s9bUC-5Dz2ASrtQqQ8gOhCpOu0e-V_jJSNmNuBZhEC8m0crMeFO4YeLWggwhLTqkHWpJzd62u9_A9VYxzWvadz3JqFeqG3ymWRA99_7HHXvdXcWOdsUeKe0y0pefUN-hoTzrzGrTtjwGVHhCG8lIAUkRPoRumOVFoZQ1DfAoNcC6P6oI2mHZrG3cA1sVC1vfg-QFiHW3KZeOdnLqSPKnrCdXfOCDfkAlJeE3DCWnoxO8Oz_X4wCfMC4ZSBPbKgCYQHBBI2R5Tj7LJ_fI-_Y246m9A_9AoJ06TiBkgrjq3Ef-uk1_HYCeSsJuFwhRvO2Rn3fv-HoOO2vcr8VeAbn3EjFf8neS-Vkni0jegFOmtogm9zh8ZPXq-UHX1Y-uKzBL5K_x1Y9hfY6Utx32fi0orKlaq6GKRU_3BdqfBIOR5gh2Wpx5PzyuC-piDXOMWCjDhnvBWiO0noACdrV8YI51KC3KzqIqnzJOcrK6yE4lMoixZr4ifePC6R0XqorMCqmMp_NWhZtNaejNueF40j3oKh3GAiaEh5nl7rk1Zf8ZTRxMAD4E-ODzuWpemqLSpI93vIdzuWMBzmfJdU6b6pgec7qHm9wksH0hTIWMRYDxfiQ-AY-VuJglEWx4xtaZZQtt_EdZrVrIxZTZusyRjKGHR4czcuj43Sx5UufErlgL98tlQKY83LJLIpjj2AXw7j88EiCcWANQ7cdCu_duFz_wVuop5_">