<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/84796>84796</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
LoopUnrollAndJam miscompiles loop with vector load/store
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
mveriksson
</td>
</tr>
</table>
<pre>
I think LoopUnrollAndJam does something wrong when it checks the dependency between vector loads and stores.
Reproducer:
opt input.ll -S -passes=loop-unroll-and-jam -enable-unroll-and-jam -allow-unroll-and-jam -unroll-and-jam-count=2
input.ll:
```
define void @badjam(ptr %A) {
entry:
br label %outer
outer:
%i = phi i16 [ 0, %entry ], [ %add.i, %outer2 ]
%add.i = add nuw nsw i16 %i, 1
br label %inner
inner:
%index = phi i16 [ 0, %outer ], [ %index.next, %inner ]
%offset.idx = or disjoint i16 %index, 1
%0 = getelementptr inbounds [10 x [10 x i16]], ptr %A, i16 0, i16 %i, i16 %offset.idx
%wide.load = load <2 x i16>, ptr %0, align 1
%1 = getelementptr inbounds [10 x [10 x i16]], ptr %A, i16 0, i16 %add.i, i16 %index
store <2 x i16> %wide.load, ptr %1, align 1
%index.next = add nuw i16 %index, 2
%2 = icmp eq i16 %index.next, 8
br i1 %2, label %outer2, label %inner
outer2:
%exitcond.not = icmp eq i16 %add.i, 9
br i1 %exitcond.not, label %exit, label %outer
exit:
ret void
}
```
Originally from C:
```
#pragma unroll_and_jam(2)
for (i = 0; i < 9; i++) { // unroll-and-jam miscompile
#pragma clang loop unroll(disable) vectorize_width(2)
for (j = 1; j < 9; j++) {
A[i + 1][j - 1] = A[i][j];
}
}
```
When this is unroll-and-jammed, results in row i=2 are copied from row i=1 too early.
[godbolt link](https://godbolt.org/z/MvzbTder7)
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0VluP8jYT_jXmZgSKHcLhgotl-ZC-qlWlHtTLlRMPZFjHTm1n2d1fX9nJAoF9e1eEEmcOzzz2jMeW3tPRIG5YsWXFbiK7UFu3ad7Q0av31kxKqz42_4dQk3mFn61t_zTOav1k1E-yAWXRg7cNRv0Rzs7GZ40GKEBVY_XqIdQICls0Ck31ASWGM6KBN6yCdaCtVB6kUeCDdehnLNux7Kl__oats6qr0LF8ENk2AJm2CzOtYfo7TFvpPXqW77S17bRL7KbSqOlJNjBFI0uND2KptT0_SMff08p2JrB8J_rIX1EvVNgiG_7pU-GBDMKbJQVsnpVSnWTDxKoNDpgonphYA1tue2M0wX1ckABKB1qWqKOl7QK622XoBVdjJgoClu-grQmIL4AVW8iYeI6ahAys2KXvYhtlUqkZDfoEJpLBFS4ZJEipFJjuDMafe2hRJE_-HVMyZsy0F4yZGoXvP2Sb2NyxTR4zg-9hMEqod4zt4eAxzEj12NaBIn-yZMKFdoQZUWeiyJL1EQNqbNCEmBwype2M8jE-z-D98ia-iEF7ctc0PqcI2dfga4WG8ZXYEJaJ4kwKZ7HSU_Rh8CyGEPn_bvATrNR0NCPe_D_hfamL0ZINUdN-HPMczeUGnH9P-prIUWnd50fcuIhkSVXTAv49srwUxOqmEoknpygeb5-x6KFOB5tRoeI7hcoaNTM2fMfisljrBwK3rqPAUfFI7pZJsrjycBhSBxlMlrtvW03__NXRkYzU-gMOzjbw_KPOxETeOnlsJPQd7kUa9dI3J8HEZToHG5O56vtAxvItxGGcbxwysU3_1MSAiT0Te7jroA35yjYtabwPXGlpjhBb9ODDxEqRj805QvaHAX3iy5lUqMfEBl6nxItHMqcrr9OI19dU4u-JFVsCJrbA027YnmCahgknaQd5fOU3vpdlh39PwF_xoAs1eSB_txQNpv3h0Hc6eCADzp6B4mkC0iFUtiVUfd6-NByCtYDS6Y_RKciK7dGq0uoAmsxr2terOoTWx4SnRAz6mXVHJvafTOx_efss_1DolkysJ2qTq3W-lhPc8CXP-HIxX_FJvalkuVgWB6nWWVnN-VIWosL5oeLicFjOs2JCG5GJeZZzzpcZF3zG86xAscoUopIC12yeYSNJz7R-a2L4CXnf4WY1X64Xk1T2Pl0uhDB4hqRkQsS7httEn2nZHT2bZ5p88FeUQEHj5uG-cS0w3xfTmUJ9e5VgYp_61qRzenO3RhTqrpxVtmFiHwMNr2nr7AmrwMQ-0fNM7BP9fwIAAP__Z3mjmQ">