<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">