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

    <tr>
        <th>Summary</th>
        <td>
            [LoopVectorize] Missing noalias metadata on store
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            vectorizers,
            missed-optimization
      </td>
    </tr>

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

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

<pre>
    https://llvm.godbolt.org/z/jeT9a97P7
```llvm
; RUN: opt -S -passes=loop-vectorize -mtriple=x86_64-unknown-linux-gnu
define void @test(ptr %base, i64 %len, ptr %scale.ptr) {
start:
  %len.idx = shl nuw nsw i64 %len, 3
  %end = getelementptr inbounds nuw i8, ptr %base, i64 %len.idx
  %_228 = icmp eq i64 %len, 0
  br i1 %_228, label %bb2, label %bb3.lr.ph

bb3.lr.ph:
  br label %bb3

bb3:
  %iter.sroa.0.09 = phi ptr [ %base, %bb3.lr.ph ], [ %_32, %bb3 ]
  %_32 = getelementptr inbounds nuw i8, ptr %iter.sroa.0.09, i64 8
  %_8 = load float, ptr %scale.ptr , align 4
  %2 = load float, ptr %iter.sroa.0.09, align 4
  %3 = fmul float %_8, %2
  store float %3, ptr %iter.sroa.0.09, align 4
  %_9 = load float, ptr %scale.ptr , align 4
  %4 = getelementptr inbounds nuw i8, ptr %iter.sroa.0.09, i64 4
  %5 = load float, ptr %4, align 4
  %6 = fmul float %_9, %5
  store float %6, ptr %4, align 4
  %_22 = icmp eq ptr %_32, %end
 br i1 %_22, label %bb2.loopexit, label %bb3

bb2.loopexit:
  br label %bb2

bb2:
  ret void
}
```
Generates a runtime check and this vector body:
```llvm
vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %offset.idx = mul i64 %index, 8
  %next.gep = getelementptr i8, ptr %base, i64 %offset.idx
  %9 = load float, ptr %scale.ptr, align 4, !alias.scope !0
  %broadcast.splatinsert = insertelement <2 x float> poison, float %9, i64 0
  %broadcast.splat = shufflevector <2 x float> %broadcast.splatinsert, <2 x float> poison, <2 x i32> zeroinitializer
  %wide.vec = load <4 x float>, ptr %next.gep, align 4
  %strided.vec = shufflevector <4 x float> %wide.vec, <4 x float> poison, <2 x i32> <i32 0, i32 2>
  %strided.vec2 = shufflevector <4 x float> %wide.vec, <4 x float> poison, <2 x i32> <i32 1, i32 3>
  %10 = fmul <2 x float> %broadcast.splat, %strided.vec
  %11 = load float, ptr %scale.ptr, align 4, !alias.scope !0
  %broadcast.splatinsert3 = insertelement <2 x float> poison, float %11, i64 0
  %broadcast.splat4 = shufflevector <2 x float> %broadcast.splatinsert3, <2 x float> poison, <2 x i32> zeroinitializer
  %12 = fmul <2 x float> %broadcast.splat4, %strided.vec2
 %13 = shufflevector <2 x float> %10, <2 x float> %12, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
  %interleaved.vec = shufflevector <4 x float> %13, <4 x float> poison, <4 x i32> <i32 0, i32 2, i32 1, i32 3>
  store <4 x float> %interleaved.vec, ptr %next.gep, align 4
  %index.next = add nuw i64 %index, 2
  %14 = icmp eq i64 %index.next, %n.vec
  br i1 %14, label %middle.block, label %vector.body, !llvm.loop !3
```
Note that there is `!noalias` metadata on the `store`, which means that the loads of the scaling factor cannot be LICMed.

The metadata *is* present if the initial loop only stores one value: https://llvm.godbolt.org/z/3Yrhna9je
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJy0V1tv4ygU_jXkBcWywc7lIQ9ps12tNDNa7c6utE8VNicxUwxewG2mv34FvsRx0mk7O1NVioHDd75zBZi14qAANii7QdluxhpXarNR4kEUs1zzr5vSudoiukXkDpE7KR-r6KB5rqWLtDkgcveMyN0X-Lxm6-XvSxRv0SJu_72sH9Mb_MdfnxDdYl07PP8Tz2tmLVhEd1Lrev4IhdNGPAOeV86IWgKiu-Nqcb9I5416UPpJzaVQzXF-UA2Ktxz2QgF-1IJjlMYOrENkVTuDEclyZgGRWywWqR9KUH7ULdqCSYhqZxBZY7S8QfHWOmacNy_e4m5DJPgRI7rDtpRYNU9Y2acJHu3FQfEgegAHEipQzqsSKteN4jbsFqsRg0t6XluPdk_IKsCJoqox_DvRGge53GCR9NJ-WrIcZADPyWRMI2miuvRRiLenYWdubs5kB6mRO4QDE1mjWRRH8Tpwq0vRWpPdjC0a68Mo24W5VuSekpNEWOvtpeRd3jtn0_txNcC1zpOacbyXmrlrocd-kklxUDjtN5KX912qnOylYe--amS7tyXS2UuClHXawGmVvgf-fv2dNqU_wLMDWPYyifSK7sU1n6w7n2TXfLJ4BfGekLPC6ERPmQWKe9lxcUxrI_LdBo7CTYukT_yRxNUKIYNgv27AhT7kF5a7cfND8fZXUGCYA4sZNo1yogJclFA8YKY4dqWwuG192DfaFnLaPFuBqBPAb_rzDbc2wG3wGCLZGKT1VjcTOkNb54rDcSjv0HayGxxPxSeFHXZFCo7uXNBrGte53u8tuKGv-rzoOltA8JuHIvZo0QHqa-n7jU56UtEDvaVwxpkWLEiYFMxGttA1-GHco-VGM14w6yJbS-aEsmBcm5Lhs6OJEb0l-NhppL_gWgurQ_cecn0or5fAu8On2e8ldBkyhX2JUbDiRQrdiqDEzz-D0UIJJ5gUz2B6Mk-CQ_QIxcl9iN6mI8CRI_tgXalY64zgwAekC3vSiT293o5o-hYTEL0VlLR56j_85BUC5KczSHoGdMQgiU998PUAdiU0oj3gJD8_len35XKSvJbM6f_IZvoD0jkh7wlCehmFcIZ7IPo2S5L4GuvAZJRYLyRwcsrkKwkllAMjgT2-p64S-mo-f4MQuWA2EGqP8CsaJzTf1i9OZ0kwi3He3lIm5wQZ4ppeuylfnEhqKKThapCkZxeASnAuIcqlLh7OFi6OzSS8fvwdwQ_o5Lj_pB1gVzKHXQkGsLDYL5BE6VCJaBHjChzjzDGslZfyAsGLQfAWP5WiKHEFTNkBKZS9xXofBr7chTrgPQvhLphS2uEc8Iffbj8Cj9obyucSTqoQ2QqLyNbfCawva9FCdbWCgz1aya9tQC3W_nHFZAP-xvGm5x_9x5SKrb_AjG8oX9M1m8EmWWbpOlnTJZmVG7rM8oSnyz1ZpaslLZKMZKs0yVeMpctVlszEhsQki1dJklC6SEgEHPbrOFukMdmzmKxQGkPFhIwCB20OM2FtA5sko3G8mIWo2fCMJWR4URqLwj0QEVIJa4HPde1EJZ6ZEz77iX_zmo2HnOfNwaI0lsI6e1LihJPhdfxB6_rvHhdlO_xRWOtD0YX3LLbBk7PGyMnz-SBc2eRRoavOmd3PvDb6CxQOkbtglUXkrjPscUP-CwAA__9RTp7c">