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

    <tr>
        <th>Summary</th>
        <td>
            [LoopVectorizer] Miscompile due to IV's end incorrect replacement
        </td>
    </tr>

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

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

    <tr>
      <th>Reporter</th>
      <td>
          aleks-tmb
      </td>
    </tr>
</table>

<pre>
    Repro: https://godbolt.org/z/Tdz4feY57

Consider case:
```llvm
define i32 @test(i32 %addend, ptr %p) {
entry:
  br label %loop

loop:
  %iv0 = phi i32 [ 1, %entry ], [ %iv0.next, %loop ]
  %iv1 = phi i32 [ 0, %entry ], [ %iv1.next, %loop ]
  %iv2 = phi i32 [ 0, %entry ], [ %iv2.next, %loop ]
  %iv0.next = add nuw nsw i32 %iv0, 1
  %cmp = icmp ult i32 %iv0, 2
  %select = select i1 %cmp, i32 %addend, i32 0
  %iv1.next = add i32 %select, %iv1
  %iv2.next = add i32 %iv2, %iv1.next
  br i1 %cmp, label %loop, label %exit

exit:
  store atomic i32 %iv2.next, ptr %p unordered, align 8
  ret i32 %iv1.next
}
```
There are 2 iterations here with `%iv0` equal to 1 and 2. 
Let's compute the returning `%iv1.next` value:

- 1st iteration: `%iv1.next = 0 + %select` -> `%iv1.next = 0 + %addend`, because  `%cmp` is `true` on the 1st iteration and returns `%addend`
- 2nd iteration: `%iv1.next = %addend + %select` -> `%iv1.next = %addend + 0`, because  `%cmp` is `false` on the 2nd iteration and returns `0`

So this program returns `%addend`.

Now let's apply `LoopVectorizer` for the case: `$ bin/opt -passes=loop-vectorize,simplifycfg,instcombine`:
```llvm
define i32 @test(i32 %addend, ptr %p) {
  %ind.end = shl i32 %addend, 1
 %.splatinsert = insertelement <2 x i32> poison, i32 %addend, i64 0
 %.splat = shufflevector <2 x i32> %.splatinsert, <2 x i32> poison, <2 x i32> zeroinitializer
  %0 = mul nuw <2 x i32> %.splat, <i32 0, i32 1>
  %1 = insertelement <2 x i32> <i32 poison, i32 0>, i32 %addend, i64 0
  %2 = add <2 x i32> %1, %0
  %3 = call i32 @llvm.vector.reduce.add.v2i32(<2 x i32> %2)
  store atomic i32 %3, ptr %p unordered, align 8
  ret i32 %ind.end
}
```
It transforms the program to return `shl i32 %addend, 1` (i.e. doubled `%addend` value) rather than `%addend`.

The reason of the issue is that `LoopVectorizer` computes end value of `%iv1` multiplying `TripCount` by `Step`, but it doesn't work for the case, since on the last iteration `%iv1` was not incremented (due to `%select` returning `0`).


</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0Vt2O4jYUfhpzc0SUOCTABRc7sEgrbXvRHa3USyc-AXcdO7Ud2Jmnr2wHSJi_baVKI09szvnO_2cza8VBIW5I8UCK3Yz17qjNhkn8YeeurWaV5k-bP7AzmuSf4OhcZ0n-idA9ofuD5pWWLtHmQOj-mdD9I39eNPhnsSTpjqSf4rrVygqOBmpm0SvH38o0_kl5auMRx0YoBJFTIIvUoXWErsKOFoxzVJzQLXTO-IOO0DWQ5UNUReXM0xUboDIgWYXSS0qtu7E_YX8TJbQQpxRIvoPuKKL14gEyb4vQIiADKXZhXzwM8onCn24Q8YBBYoyYvUBM30XMPkSk_xKRfogYowiwjHNQ_RmUPcOQcnEK-NlIpW67IC38Ry_dnSgdiVqUWEfs4VNkA4QXfVFWf5BOMzj1btCIYENU4pRNU_SqijjRm3xMyq1NJl5Ne2Z8gD-FGzdR2N-ayDptEJjTrahHZq8VuDQt9EobjgZDzEyKg4LVBcTgKKFjR8lydzc0cft4RG_VIFAQDg1zQisL4fQs3BG8ZKxOmQL-3TMJTkMGTHGgCUSUr-gIXVqoddv1DsEd0bvSGyXU4Qox-FOmcGKyH81xWOeQWXfzwXPFVDHUJAVCH0ZFLFOYk_zzu6JDh5ShwSqsWW8RBg1ftTIFYf3emR79TqsQwcSfEHCMyQ66N9whAKr4hwFc9X49kKlK-guBNEzacSQTx-4juTVDXL9pcEdhoTP6YFj7VtDJWOd3fQY5NAHrOvnkpb9q3X3H2mkjntF4dxptgj8DjUfIBVRCEbrXnYN5x6xFS_KdH5_56aJN6NaKtpOieaqbA6FboayrdVsJ5eP8n66ESAmKJyH3noaO8iXtXPiD0CKxnWROKIsmli5-osQWlT_ZUvjpEXylOy2sVq8zWbm4MtkVdvCgbxqJMTF3gHcOBMJ6w-L0_BmNFko4wWSo1C34eKm1vQzM_oa5ATDS7xBORvLPI5zsw2wMANOkpB7lowT5X-iVsF_4eLmFx-J5EK-ZlJe-8P2SxKwmBnlfY8I4T07UA9HVC1RK6Po95s7_E2XHVnufsb84cIYp22jT2jBNl0F1ephVP1dvtGrpWXElEkyA676SyO_neiBnugbD3BH9wDL17vA_BrZnVivQTfBIWNv71eu616lguCos-NkKJr3ylf28SNtLJzr5NNwhj0Z0W92rwJVVYJhvDrsLHfaerIFrtIrQpYOzNj-mhEO3YIWq8cKKkk0IfmL7zCwo7UCo2oR29YmiK96jT3MUvTH35K6LBL2epGjGNzlf52s2w01WrpcZLRfFenbc1Ms8Z6uSVzlLWZPl9apZFXVT8ma5qFbL9UxsaErzLM1oVqZpsU4W5apKM55jldMmXWdkkWLLhExCC2tzmIXsb8rVOi1n4fVhw9ucUoXnWBpCqX-qm43XmVf9wfoRENbZG4oTToZH_V3tih38Jqwvn5AIQ0K-fA_U72spVK2N8a81g51kdcjerDdyc_f0F-7YV0mtW0L3ga7jv3ln9F_hfbYPvlpC9yGWfwIAAP__Ik-Thw">