<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=http://email.email.llvm.org/c/eJylVUtvozAQ_jXkYhWBHUhy4JAm20sPK-0eqj1FBk8Sb42htknT_vodOzRpXmpWReDB9jevj_FQNuKtWDvX2ohNI_qA96oRZaNc3JgVzt7xeXn6k6X85VFEyTxKpv2YJ_29m1ImdaU6ASRis-04l9oZqeN1xH5cQlQ1d5_2wrhY1CkdC9K2ER1_TLYRnZBodL-DELwMuM5ocsCcIfxlnfApsWnbvCJ0G2X3SZTNIzojOSqg_BKfXsNHo3nEen_-_RIhleJ6RcjdT4bDcsmtu_MpExxNhZnP3_UGDL2oK2ApdaCJki0RTVcqQK5INEwCN-cbNEtOWMAlihbmBLbO8MqBghq0u2A06M6IzIck-aTNgrbjUpGKK0V8Cr2aD0SpTR0jVzJe5sNYMopxfeyi62CR0R13B6PDYFRqC-Z6RJ1GAryBgz12KcLsv_NLP2nn38kvu5Lf6Jb8PA_H6eVnAWKRX1QcnVSdACw0AzcF3se8j3g3horq1ReLDVSuMbgSYHiz6fE52dSdsoKQbV2n3iDKZC-PkS2YWqpW9PMjJMqUHC5sDmE90BcA_vjRWTiy1_wnX_g_IGmPSPfyGpLdbDM9sUlvjpOdIDvdVs8XedozfI2n9NDWetbOGcNSuthlngBrHqvfNWT31eU7ELcG4osnnAnv3YDtlJPYy6QOuyWvnkELgo9f7VryKrGvWVTghix92ojjjth10ylB1nyDSgCaaFmBejs4E_FAFExM2IQPeOfWjSl-Pf6WdaMHnVGnvyV00pVx1dQ48TXei7vWNH_RIk6ltR1YfMnYeDwarItsVGUw4ktAwWFIkxxKKLlYphQm1WgyULwEZQukLaL0Iy7uZKNx7rNHEXyxadM6Wfeb1u9m88H3Y5QFTSjeaZ6Oscvl8XicTdJqyLM0FSkTFR5oqPErxeFY4z95YIpgsuxW1p92aZ09bHJr5UoDhJQwQiedguIBDXTYJI6-NGxbjo1WkKOGMQgBFiG6fzelTyw>53887</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Failure to vectorize expanded llvm.powi.f64
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            vectorization,
            llvm:optimizations
      </td>
    </tr>

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

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

<pre>
    https://godbolt.org/z/qWY51aqKd

```
#include <x86intrin.h>
#include <cmath>

__m128d pp(__m128d x) {
    return (__m128d) {
        std::pow(x[0], 6),
        std::pow(x[1], 6),
    };
}
```
clang  -O3  -ffast-math -march=znver2
```
define <2 x double> @pp(<2 x double> %0) {
  %2 = extractelement <2 x double> %0, i64 0
  %3 = tail call fast double @llvm.powi.f64.i32(double %2, i32 6)
  %4 = insertelement <2 x double> undef, double %3, i64 0
  %5 = extractelement <2 x double> %0, i64 1
  %6 = tail call fast double @llvm.powi.f64.i32(double %5, i32 6)
  %7 = insertelement <2 x double> %4, double %6, i64 1
  ret <2 x double> %7
}
declare double @llvm.powi.f64.i32(double, i32)

pp(double __vector(2)):
        vmulsd  xmm1, xmm0, xmm0
        vpermilpd       xmm0, xmm0, 1           # xmm0 = xmm0[1,0]
        vmulsd  xmm0, xmm0, xmm0
        vmulsd  xmm2, xmm1, xmm1
        vmulsd  xmm3, xmm0, xmm0
        vmulsd  xmm1, xmm1, xmm2
        vmulsd  xmm0, xmm0, xmm3
        vunpcklpd       xmm0, xmm1, xmm0        # xmm0 = xmm1[0],xmm0[0]
        ret
```
We fail to vectorize the powi call, resulting in the backend ending up with scalar fmuls that should have been nicely vectorized.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJylVU1z2yAQ_TXyhYlGgPXhgw5O3F5y6Ex76PSUQWJt0yKkAHLd_PouWIljx56kUw1mBbxd3j4vqOnln3rr_eASvkzYZ2ybXja99mlvNzh6wt_j9x85FY_3MslWSbac-iKb2mHIuDKtHiWQhN_tq0IZb5VJtwn_dAnRdsK_Wov9w0NHWSXJMCSseh7sE7YgSXl7gBB8LPjRGnLEvEGEx3kZUuLLof-N0H2S32ZJvkrYHSnQAe27eHoNn5SrhE_7hfdLgrRamA0hN184duu1cP4mpEywty1mvnoyO7Dsoq-EtTJRJkb2RPZjowG1Isk8i9q8XWB5dqYCTjGMsCKw91a0HjR0YPyFoNH3jqhiTrJX3jx6e6E0aYXWJKQwuQUiWu-6FLVS6bqYp4oz5PW8ilvHiJwdtDsGncegyjiw1xmNBgUIAY7x-CWG-T_nR195F_-TX34lv_Ij-QUdTtMr3hDEIr_oWJ5VnQQsNAsfIj5xfmF86GNFTe4PDztofW9xJsKw8eXpOdl1o3aSkH3X0RAQbfZiT5ED2E7pQU7jEyRaSo4PXg5xPsoXAeH4sbt4ZK_tn72z_xHJJgR9sdeQ_MMx6VlM9mGe_Aw5mqH9dVGnF4Wv6USP19qk2lvFsJQu3jLfAWseq9_35PCvqycgfgskFE88E2F3C27UXuFdpkxcbUT7C4wk-Auz40B-K7zXHDoIS9YhbcQJT9y2H7UkW7FDJwBDjGpB_zluJtOZrLlc8IWYeeU11J-Rz4jVfEIJ9oPAG0GSk8qejVaff7mQx9ikbd_hIIAnczPY_ieGw6FybgSHLzmvqnK2rTNgTOQAFW2ysszaZs7nBZT5oqSMl0zOtGhAuxqVTRh7JiW86g2Og0Bo4l582Q9eddOiC6v5aqZqljFstKAVXmNFWlX5grZzkVMqKZctnljoMO00Zocf3ZmtI-lm3LhwnJXz7rgonFMbAxAJYXwx-m1v66_331TXm1nMr47J_QU3hDfy">