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

    <tr>
        <th>Summary</th>
        <td>
            A bug about stores with same distance
        </td>
    </tr>

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

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

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

<pre>
    I find a bug while studying the code of SLPVectorizerPass,
it's in the definition of FillStoresSet in vectorizeStores.
I'm trying to file a PR to commit the fix, it's my first contribution,
so the PR is not ready yet, still troubleshooting how to upstream.

The bug is in the code below, in the case of stores with same distance.
`     
      SmallVector<int> Dists(Idx - StartIdx, 0);
      for (const std::pair<unsigned, int> &Pair : reverse(PrevSet)) {
        // Do not try to vectorize sequences, we already tried.
 if (Pair.first <= It->first ||
 VectorizedStores.contains(Stores[Pair.first]))
          break;
 unsigned BI = Pair.first - StartIdx;
        UsedStores.set(BI);
 Dists[BI] = Pair.second - It->second;
      }
`
For pair of StoreIndexToDistSet, first is index of the store into
Stores array, second is store location distances relative to the
base address.
Pairs are ordered by distance, not index. In PrevSet, the position of index
is random. So it could not get the expected result.

The fix is to change break to continue

And I've worked out a testcase for it, which I put it in the file
llvm/test/Transforms/SLPVectorizer/RISCV/load-store.ll

With the fix, it can get vectorization, otherwise, it cannot.

`
define void @store_i32_same_distance(ptr %dest) {
; CHECK-LABEL: @store_i32_same_distance(
; CHECK-NEXT:  entry:
; CHECK-NEXT: [[INC3:%.*]] = getelementptr inbounds i32, ptr [[DEST:%.*]], i64 3
; CHECK-NEXT:    store <4 x i32> <i32 1, i32 1, i32 1, i32 1>, ptr [[DEST]], align 4
; CHECK-NEXT:    store i32 2, ptr [[DEST]], align 2
; CHECK-NEXT:    store i32 1, ptr [[INC3]], align 2
; CHECK-NEXT:    ret void
;
; DEFAULT-LABEL: @store_i32_same_distance(
; DEFAULT-NEXT: entry:
; DEFAULT-NEXT:    [[INC3:%.*]] = getelementptr inbounds i32, ptr [[DEST:%.*]], i64 3
; DEFAULT-NEXT:    store <4 x i32> <i32 1, i32 1, i32 1, i32 1>, ptr [[DEST]], align 4
; DEFAULT-NEXT:    store i32 2, ptr [[DEST]], align 2
; DEFAULT-NEXT:    store i32 1, ptr [[INC3]], align 2
; DEFAULT-NEXT:    ret void
;
entry:
  %inc3 = getelementptr inbounds i32, ptr %dest, i64 3
  store i32 1, ptr %inc3, align 2

 store i32 1, ptr %dest, align 4
  %inc1 = getelementptr inbounds i32, ptr %dest, i64 1
  store i32 1, ptr %inc1, align 2
  %inc2 = getelementptr inbounds i32, ptr %dest, i64 2
  store i32 1, ptr %inc2, align 2
 store i32 2, ptr %dest, align 2
  store i32 1, ptr %inc3, align 2
  ret void
}
`
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy8V19vGrsT_TTmZRS062UDPPDAX_3QL6qikvbet8q7HljfGpvaXgj301-NdyEhIU3Th0ZRBBvPmeMzZ4ZBeK82BnHE8gnLZx1Rh8q6kf-ha2E6hZXH0RLWykgQUNQbOFRKI_hQy6MyGwgVQmklgl3D6u7-K5bBOvUvunvhPeNTlsxYMlaB8b4HZeJ5iWtlVFDWUNRCab0K1qFfYaAj-xNG87TbQCwZ728huCarhTXREHD_md6UdrtVIYKv1SPjU2gzbo-wVs4HKK0JThU1ZT3T8jaG3H8G5cHYAA6FPMIRA0H4oLSG4GxdaPSVtYFSV_ZAGeudDw7FtmXX_H2oMGqkzleN0hSo7SGSah8KH_Xy8X5wUKECL7YIUvkgTIkn0NsE6Kd5F1_Caiu0blRm2VSZwLI5zJQPnvHBUj7CDayCcGEpowwJ40OWTZ4jrK0DxgelNT6AD5JlY5aNd0IRYG2iG2TDNoIzfnsvlAOWjcHhHp1Hxgf3Dvcr0mnI-BBY_yIFAOMLxhcws1HW4I6k2bmw4PFHjaZEcggcEIRulA9OoWxvD2pNPCl3t6khy6Ysm8Ey3LBs3j7qT-m3CTibT7bOoaILZUia5gnLJ094LJ819C-pAxQOxfcn1U6awGQJlP8Zo2diZy8U-OLPNDzpNJgsL2rR1CyfTJYsnz3heiytkXDT3rJ5-wKc9WdngzQvFtYBVTB2ISVdGomPD5aSrBo3N4SjMyU-0kGyYrQgVdo2QA1jEM6JY-yBho7y7UltSxEb92RVDw61CGqPVOFQYYNTkMWFlA79qYHpeoSMYJ1EhxKK4xmGcpFTIrkuLA2cDTaNRHfWnydGPNQOFg9OGGm3XVhZUNTntZYRaoPNQMDHHZYBJTj0tQ6vGnatHul-NEUqYTbYlL-ZKiYoU-PziLGRQKNoj3Cw7jtKsHUAAQF9iH1N7aUi7UOlygqWsKsDMWubn-ZWA6X1fsv4giIZXzw4Yfzauq1nfHExSRlffF6upl8ZX2gr5E2sRFfr57T-ohlyMf6gFCZqcOo60Y4-sKFCd1Aenw4ae6nL2VhxVCPsrZLAeklM_U1l_BvNq29P1RvsAk2VXMbLPBsILJvA9H_z6f9v7saT-R0NkZ_ivIz6NP_7gYIATXBHmlVvHIgfX5Plp2lGh3jeZXxMHd421wYDatyiCcRUmcLWRnpQGScVIvsIMJuvHl4CRJ1ue5C9SQ7a9mDZtAePEZUmZzZVGYc0xr_xIptfyX_OKrTaGOi9m5ewrl3kBRD_JaD0EihK-gEgR56zSp6PPJ2dzRfjL3cPH7bCKe6U5bUXXp6gKflHDXGFwB-yxJuZP26Kn0J9zBZXoN4wxmUxaXXIlSmzXy3SaeZcVOQ67wb4Nd0m5HrECfxC9hPJ9PdIpu-STF-RPKXkv5eSv5uSv055zUYvFXkf-LXgr6zwbJ_pyFEmh9lQdHCU9rNkwJNer9-pRsOU83Rwe5sNRYmD9bBc97FMsEh5T4oskx014gnvpWmSpznv834350U5GOS3vWFWYMIT1ktwK5Tu0gdv17pNR3lf4yhN8yQZdLQoUPv4NYhzgweI_2Wc07ciN6Kgm6LeeNZLNO1uTzBBBY2jcVz9RUH7wJubfad2elSFsPNxptCSvFGhqotuaWkZaHeCmGzn7D9Y0m4QmdBe0FLdj_h_AQAA___MUguQ">