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

    <tr>
        <th>Summary</th>
        <td>
            Improve SLP vectorization after loads are hoisted
        </td>
    </tr>

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

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

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

<pre>
    Following the change in https://reviews.llvm.org/D133192, where additional loads are being hoisted, we noticed a regression in a benchmark. This appears due to the code inside the loop no longer getting vectorized.

Reproduces on [licm_hoist_load.ll.txt](https://github.com/llvm/llvm-project/files/10396011/licm_hoist_load.ll.txt) (remove .txt extension) with `opt -O3 hoist_load.ll` (comparing at 301f3da51624 vs 88419a30a02d).
The minimum required sequence of passes I saw so far are licm, sroa and slp-vectorizer, but I haven't reduced the pipeline.
The above reproducer is just before the first LICM where outputs start to differ due to load hoisting.

A sample before/after in the IR:

Before:
```
for.body98: ; preds = %for.body98.lr.ph, %for.body98
  %j.12 = phi i64 [ %j.0.lcssa, %for.body98.lr.ph ], [ %inc, %for.body98 ]
  %22 = phi <2 x float> [ %20, %for.body98.lr.ph ], [ %66, %for.body98 ]                
  %23 = phi <2 x float> [ %16, %for.body98.lr.ph ], [ %79, %for.body98 ]                
 %24 = phi <2 x float> [ %12, %for.body98.lr.ph ], [ %92, %for.body98 ] 
  %arrayidx.i = getelementptr inbounds %"class.std::__u::complex", ptr %21, i64 %j.12
  %add.i = add nsw i64 %j.12, %mul.i
  %arrayidx.i195 = getelementptr inbounds %"class.std::__u::complex", ptr %lhs.sroa.0.0.copyload, i64 %add.i
  %25 = load float, ptr %arrayidx.i195, align 4
  %__im_.i.i.i467 = getelementptr inbounds %"class.std::__u::complex", ptr %lhs.sroa.0.0.copyload, i64 %add.i, i32 1
  %26 = load float, ptr %__im_.i.i.i467, align 4
  %27 = load <2 x float>, ptr %arrayidx.i, align 4
  %28 = insertelement <2 x float> poison, float %26, i64 0
  %29 = shufflevector <2 x float> %28, <2 x float> poison, <2 x i32> zeroinitializer
  %30 = fmul <2 x float> %27, %29
  %31 = shufflevector <2 x float> %30, <2 x float> poison, <2 x i32> <i32 1, i32 0>
  %32 = insertelement <2 x float> poison, float %25, i64 0
  %33 = shufflevector <2 x float> %32, <2 x float> poison, <2 x i32> zeroinitializer
  %34 = fmul <2 x float> %27, %33
  %35 = fsub <2 x float> %34, %31
  %36 = fadd <2 x float> %34, %31
  %37 = shufflevector <2 x float> %35, <2 x float> %36, <2 x i32> <i32 0, i32 3>
  %38 = load <2 x float>, ptr %cc0, align 8
  %39 = fadd <2 x float> %38, %37
  store <2 x float> %39, ptr %cc0, align 8
```

After:
```
for.body98: ; preds = %for.body98.lr.ph, %for.body98
  %add3.i56826 = phi float [ %11, %for.body98.lr.ph ], [ %add3.i568, %for.body98 ]
 %add3.i55425 = phi float [ %14, %for.body98.lr.ph ], [ %add3.i554, %for.body98 ]
  %add3.i54024 = phi float [ %17, %for.body98.lr.ph ], [ %add3.i540, %for.body98 ]
  %add3.i52623 = phi float [ %20, %for.body98.lr.ph ], [ %add3.i526, %for.body98 ]
  %add3.i51222 = phi float [ %23, %for.body98.lr.ph ], [ %add3.i512, %for.body98 ]
 %add3.i49821 = phi float [ %26, %for.body98.lr.ph ], [ %add3.i498, %for.body98 ]
  %add3.i48420 = phi float [ %29, %for.body98.lr.ph ], [ %add3.i484, %for.body98 ]
  %add3.i19 = phi float [ %32, %for.body98.lr.ph ], [ %add3.i, %for.body98 ]
  %j.118 = phi i64 [ %j.0.lcssa, %for.body98.lr.ph ], [ %inc, %for.body98 ]
  %add.i469117 = phi float [ %34, %for.body98.lr.ph ], [ %add.i469, %for.body98 ]
  %add.i481216 = phi float [ %36, %for.body98.lr.ph ], [ %add.i481, %for.body98 ]
 %add.i495315 = phi float [ %38, %for.body98.lr.ph ], [ %add.i495, %for.body98 ]
  %add.i509414 = phi float [ %40, %for.body98.lr.ph ], [ %add.i509, %for.body98 ]
  %add.i523513 = phi float [ %42, %for.body98.lr.ph ], [ %add.i523, %for.body98 ]
  %add.i537612 = phi float [ %44, %for.body98.lr.ph ], [ %add.i537, %for.body98 ]
  %add.i551711 = phi float [ %46, %for.body98.lr.ph ], [ %add.i551, %for.body98 ]
  %add.i565810 = phi float [ %48, %for.body98.lr.ph ], [ %add.i565, %for.body98 ]
 %arrayidx.i = getelementptr inbounds %"class.std::__u::complex", ptr %49, i64 %j.118
  %add.i = add nsw i64 %j.118, %mul.i
  %arrayidx.i195 = getelementptr inbounds %"class.std::__u::complex", ptr %lhs.sroa.0.0.copyload, i64 %add.i
  %50 = load <2 x float>, ptr %arrayidx.i, align 4
  %51 = load <2 x float>, ptr %arrayidx.i195, align 4
  %52 = fmul <2 x float> %50, %51
  %shift = shufflevector <2 x float> %52, <2 x float> poison, <2 x i32> <i32 1, i32 undef>
  %53 = fsub <2 x float> %52, %shift
  %sub.i.i = extractelement <2 x float> %53, i64 0
  %shift109 = shufflevector <2 x float> %51, <2 x float> poison, <2 x i32> <i32 1, i32 undef>
  %54 = fmul <2 x float> %50, %shift109
 %mul7.i.i = extractelement <2 x float> %54, i64 0
  %55 = extractelement <2 x float> %50, i64 1
  %56 = extractelement <2 x float> %51, i64 0
 %mul10.i.i = fmul float %55, %56
  %add.i.i468 = fadd float %mul10.i.i, %mul7.i.i
  %add.i469 = fadd float %add.i469117, %sub.i.i
  store float %add.i469, ptr %cc0, align 8
  %add3.i = fadd float %add.i.i468, %add3.i19
  store float %add3.i, ptr %__im_.i470, align 4
```

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzUWVtvuzgW_zTkxfojXzCXhzz0spEqzWpXs_NeOWCCuwYztmn7n0-_soGEJJCSVXdW01ZtMT7nd-4-J2bGiEPD-TagjwF93rDOVkpvmRQNM5u9Kn5ud0pK9SGaA7AVB3nFmgMHogGVta0JyEOAdwHeaf4u-IcJpXyvQ6UPAd49I0JQhgP8BD4qrjlgRSGsUA2TQCpWGMA0B3vuWFdKGMsLv5eDRlmR8wIwoPlBc2OEahwkA3ve5FXN9L9D8FslDGBty5k2oOg4sKqXUBVOPiMK7p-lUi1oFJCqOXANDtxah_jOc6u0-IMXYQCfA_jQ__6Vt1oVXc4NUA0I6KMUef3qxXt1QodShvbTBvQ5wOm5CQ7CVt0-zFUd4J2zw_DnR6vVG89tgHelkNwEeIcgyWKIkNsxzx9nIMCp5rV658CtAP5peeMs4d59CFuBIIaqteDHPwg4YxDE0BHnqm6ZdroyCwhEJSkYRTGOwLsBaRqhjBHIIC4CnA02-K3ioBaNqLsaaP57JzQvgOG_d7zJOVAlaJkx3IAXYNgHMAqUTHsvOi2c84xWDLCmAEa2P44m1u7VvrPgBVTsnTcBTizQ3Jm58D5qRculaPhEDLZ3muvRHRoIA946Y8Gel0r3ri2FNhb88vL09yHCVGfbzhpgLNPWBUQhypLrMTycfXpTieZw5vYHYFjdSj5wD_COldaBNh7o5Vfn5cn-x37bcTGGw49_LJUOXe5kaUAeQEAeQat5YUBAnkGA6el1KHXYVs46Z8s9F-AW30KEPV1bCSDiyIVkvw5DmRvDroh7nsBH6NO4XTT51Ua_5YSETzgBecLgE5RSMRuQv41MMFwHFsezWODia4pNvsJG1zxnsZPsHmwHHX0JjddBZ9f7PPRET6Y1-ymKz1B40AO3XPKaN7a1Ltb2qmtcmGAaYJxLZkxobOGijDy8vnb9Py6tJf8MsIdzhE4L5B58fPQxMwUtigGPFQVozMfZvl7kupOhmBUUZfSbZZWVCV2dCGEIw1y1P11aTsT38k6DoxfAJ2_vmxOvMzndOpPi0IBoQv76KurXULjvKE7-L7q4Z4IBmioVLyt1LvG8Vjg50V_E7ax5FriknotoDNejSa7SoFXCuFPnqV_qpR91hFNumedmqq4sJe-r_3VSOVQfdYswwxtBsFv_g2slGmEFk_4oOeER6PHKupOzMMkQ3DibEqF1QhJ4j5ABeeo9PLgaOj9MQPF_aWc6Z2dCVqqAv8nO0To7EzIl6rO2NN1-VrZoJJpmBemzonSFaj1RstIcdM4cHnXRoXB0KLlwaLom_fIcnvJueqqT7Lae6ahnMhIZ65qeub3ZF4AXvcnQ77ju5k9oX1hRkFDQOB3qnTtmh-geDle07nA9MrrVxpz20Wg4Na4Bo7sA6fX2i75p2BjBSSdxjpjchRhdd1nziDietE1niGsbtSOjlYgIT5rEc0RyF-JMSzXnxihLMVoAXNkPHhmtUzFKIwwXEK87y1uI6crAQdk8HFnZdfZcvsJ6CxFK_5w5wrc8UZwhlCxotj4DPaN1gCnCaKHGkPWx4hl9HZsuoihBCyWGXAfbDby-b_1SQQqzCC1UmJmSsQxI4TqLUkwoWigw0frg9IzWAZIkRgv1JbonZtyxuQqQogQt1Jfonpih9GbMnPbFNEUL5SW6J2hofDNo_peTZpSdT5ooXTlqovQvMGtS-B1jFUX3cVmcXSm-2XnTMe_ptB82lSjtupaY3jUhXA45XVPw8rwvpuRm10_HuuFlnMrc7d2464n5p9UsXxyTPMrcWOR5IrhyCB1S9htVvz0lHX01innK1bqTyT3aR3PaU7qWHI7k06Ch8VpydInea4DgUQVvguMMS8dSRePLSuGO9_Q0CR1JjuxOFcMbaKbLmKGeNCCjyfvoOp-lrvavGdz6bmsJ1OszYI7d3TLo0Ladf-gTJfCqFFyMZ5tiS4qMZGzDtyhOSJTEEONNtYUJySkjMIEMJgkveJrnebJPWczKAhXpRmwxxAQi5Br5BOKQwhJDlmdpjNO0iLIggrxmQh6vcTbCmI5vaZZRtJFsz6XxV0UYN_wD-Jeu4NLnjd76u459dzBBBKUw9nQZtLHCSr59qVut3jn41y__PF6_MCtUA_oP20-XQsN10KbTcnv3JYuXygR456X-TwAAAP__giV0tA">