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