<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/144276>144276</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[SLPVectorizer][X86] Addition no longer vectorized
</td>
</tr>
<tr>
<th>Labels</th>
<td>
llvm:SLPVectorizer,
missed-optimization
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
nikic
</td>
</tr>
</table>
<pre>
From https://github.com/rust-lang/rust/issues/142519: The addition here was vectorized in LLVM 18, but is no longer vectorized in LLVM 20.
https://llvm.godbolt.org/z/nfPT9zsvv
```llvm
target triple = "x86_64-unknown-linux-gnu"
define void @test(ptr %p.prev, ptr %p, i64 %len) {
entry:
br label %loop
loop:
%prev4 = phi i8 [ %extract4, %loop ], [ 0, %entry ]
%prev3 = phi i8 [ %extract3, %loop ], [ 0, %entry ]
%prev2 = phi i8 [ %extract2, %loop ], [ 0, %entry ]
%prev1 = phi i8 [ %extract1, %loop ], [ 0, %entry ]
%iv = phi i64 [ %iv.next, %loop ], [ 0, %entry ]
%iv.next = add nuw nsw i64 %iv, 1
%shl = shl i64 %iv, 2
%gep1 = getelementptr inbounds i8, ptr %p, i64 %shl
%v1 = load i8, ptr %gep1, align 1
%gep2 = getelementptr inbounds i8, ptr %gep1, i64 1
%v2 = load i8, ptr %gep2, align 1
%gep3 = getelementptr inbounds i8, ptr %gep1, i64 2
%v3 = load i8, ptr %gep3, align 1
%gep4 = getelementptr inbounds i8, ptr %gep1, i64 3
%v4 = load i8, ptr %gep4, align 1
%sum4 = add i8 %v4, %prev4
%sum3 = add i8 %v3, %prev3
%sum2 = add i8 %v2, %prev2
%sum1 = add i8 %v1, %prev1
store i8 %sum1, ptr %gep1, align 1
store i8 %sum2, ptr %gep2, align 1
store i8 %sum3, ptr %gep3, align 1
store i8 %sum4, ptr %gep4, align 1
%prev.gep = getelementptr inbounds i8, ptr %p.prev, i64 %shl
%prev.load = load i32, ptr %prev.gep, align 1
%extract1 = trunc i32 %prev.load to i8
%lshr2 = lshr i32 %prev.load, 8
%extract2 = trunc i32 %lshr2 to i8
%lshr3 = lshr i32 %prev.load, 16
%extract3 = trunc i32 %lshr3 to i8
%lshr4 = lshr i32 %prev.load, 24
%extract4 = trunc nuw i32 %lshr4 to i8
%exit.cond = icmp eq i64 %iv.next, %len
br i1 %exit.cond, label %exit, label %loop
exit:
ret void
}
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJycls2OozgXhq_GbKwg8A8hCxapjrKqT2rpa7VmN4JwCjzt2IxtqHRd_cgOSSB_3V1SpID9-nmP8bF9SmtFowAKxF8Q30Rl71ptCiV-iF1U6fpnsTV6j1vnOovoGpEtIttGuLav4p3eI7I1vXULWapmfEZkK6ztwSKyTRnh6QrRNf7WAi7rWjihFW7BAH4vLR5g57QRH1BjofDr6_f_4TRH5AuueoeFxUpjqVUD5p6SJDFK1ihZz4OTctjHja4rLV2sjQ_rA5Gtevv6bfVhh8GPyZLjz2tRsnalacBhZ0QnASO6wYiQQ579nbFFr34o_a4WUqj-sGhUjwg52tbwJhTgQYsaI5Y48HPPO2cwIryLOwODn8qpwT-LjPlnCQqRFUbLF5SsQTnz00efrDGuDJZlBTKotO6OTuFpVHiUgYGFMLtWYJFjxF98OxycKXeOeadxPEZ8E175C07G9mAYOiY8-phHP8Mjj3nkM7z0MS_9U54YLjC_IEeaGGIFB_fnsDAsEMu6xqp_x8q-n5ZahBxIT2rbyqD0_zOFzyn_1kB3nGoDDiTsQTmfQEJVule1xSJ_kFO2lSeT8WNJXdZzvYf711KKRl2CaqAjv-15YnjbM2Fc7ruO5L4j_ZQjOTvSx470viP7lCM9O7LHjuyOo-337JwVPmk9YsyisIMnQnotpBMhnQjJtZBMhGQiTK-F6UR4jNE6bWDs9iOeJ8qVmvxika_k9PkKXanZr7-un0bcQPf7e-V8IN9umAALC3tZYTqd4cntKpDJGRRGOtOrnR86hzrtQxm9pG3NuFtsa27E3iGfs8kt-wi54dLn3DSbg-l9ML0Fs-dgwuZgNgH783ACZ3M4HISLd1odv7zY7TsM_15OxtmJDOp0RYp0NtYLzremb501XK7R0DVeowZcuLl9z3IzrQmiuqD1iq7KCIp0yZMkzZacRW1RVUm9rGnKM15DnbBVCXRZ5dWS5hRIRiNRkITwJEt5umKcsxiyJc_rMs3KLE_fqh1iCexLIeNQo2jTRKFSKlLGyDKLQsg2VGKEhNKErv__-vX7qfQxvvQgXxAhe2Et1AvdObEXH6Uvqnwf30Sm8AMXVd9YxBIprLMXNyecDJXenMo3iL_8lWeIb_D6VKPdK72i3sjiSSkYYj7-LTqj_4HdVTUYpjkU5L8AAAD__7_LCas">