<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/58170>58170</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Loop Interchange bug due to loop guards not being interchanged
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
alexgatea
</td>
</tr>
</table>
<pre>
Right now loop guards are not interchanged which leads to incorrect control flow after the interchange.
For example, consider the following code before the interchange.
```
if(n > 0)
for(int i=0; i != n; i++)
if(m > 0)
for(int j=0; j != m; j++)
A[j][i] += B[j][i] + 1;
```
IR: [before.ll](https://github.com/llvm/llvm-project/files/9717558/before.ll.txt)
After interchange:
```
if(n > 0)
for(int j=0; j != m; j++)
for(int i=0; i != n; i++) {
if(m > 0)
A[j][i] += B[j][i] + 1;
else break;
}
```
IR: [after.ll.txt](https://github.com/llvm/llvm-project/files/9717613/after.ll.txt)
If m is -1 at run-time then the original code only executes the outer for-i loop whereas the resulting code is an infinite loop (since `j != m` always evaluates to false).
Possible solutions under consideration:
- See if running simple loop unswitch or LICM prior to loop interchange fixes the issue. I tried this and it doesn't seem to help; loop unswitch does nothing and LICM hoists the computation of the condition m > 0 out of the for-i loop but the branch remains in place (inside the for-i loop). Still, this might be able to be tweaked to work, I'm not sure.
- View non-user generated loop guards (checked via `isGuarded()` for example) as part of anatomy of a loop.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJylVV9v2zgM_zTKCxHDdhInfvBDs94OAXbAYQPuXbZpW50sBZLctN_-SDnJ3FsxoLvAiCRS_Psjqdq2r9VX1Q8BjL2AtvYM_SRd60E6JFoAZQK6ZpCmxxYug2oG0CjpQrDEa6xz2ARorAnOaug0qZEdiUAYcCmciPRRpA-frQN8keNZo8g_sZxX7fV2ZzWJK9MTuUWosbPkxPt6RJFev3hUncgPBsTmD0hFXs5EII2O6CQNSmweU7E5ggKRZ3QAE08iP8bvLgIQdY0_6eLfD31PN31PN31jPL2jL_4exO74JHaPtChagC-R0PFnMpC247tBnr6KzQPQ1TkzidYsmR-GEM6eWCL_TF-vwjDVSWNHOmj9fFvWZ2efCCs6dkqjp7XcZ_vd7kC7u8YkvIS79_P_Q4RzAQGb-i0QPpC0DyAHYn9cZvsX-P0uELMoak9V6VB-f8MQ-8dfwxX74Zbb_49YkW1o90bpW8BOHYygPKwzkAHcZNZBjbGRTOwm61SvjNRzm1mjX6klsZkC-pk_MeCEwFrNI-EyIEU9Mx36SYd7k5IZaag4OmVUwPk6BehpNCBQKhZIFylIfZGvHvBZ6klGcxY6SWmlCJJlCH9b71WtEbzVU1A0JWAyPCduA0My8V6Ia_iG5EvHwRr2zSueMLM7k_EXFWhu0ej5cvr0F5ydoi2ZjuxFYUOnXq45UN5PmMAJglM0-MIQA21BBWgteiPyfQCPOLKeAfWZa_KtOb7HI3Rgh1g2Gh-s8mG2QYCfpxAjAdtdSaZVkXAtYAbjxlwgUhOVSbWThkw5HKWiHCkDZy0589w7nKj_CHKe4VtQNDpo-saoxjj-awTJ-aZoaBsuVOQctoWLdd_57okiHuOL4Cd3m8Jr-EfhhahmPXlCp0fD0JDk8ikhZ5oBG1b4rCRXhfJ_MgtbYnHxUml0y4ehBKq2s3QxdGlksONr3Ea9yQqrrCi2ZZnl22zVVpu23JRyFVTQWH1hy6cFqPXUQzvhHfCrVxxKjYzN8olbTU5XH27PWC3cn7tDtk9XQ1VnZYflVmKR1Zmst2lWHpq6q7GR9X6ftystaxonFU0HkeeGchhV0J4GxEpVeZrnWZrusv1mm6ZJcSjqLC1amUlZbBHFNmXEdcJ-JNb1K1dFlyhWT0zNNfaDKamZeoMYzZF-OYXBukpqfOkJLbmKxqvo_L-OTnlG">