<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/148228>148228</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[LoopInterchange] Incorrect handling of reductions
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
kasuga-fj
</td>
</tr>
</table>
<pre>
Consider the following code:
```c
#include <limits.h>
int A[2][2] = {
{ INT_MAX, INT_MAX },
{ INT_MIN, INT_MIN },
};
int f(void) {
int sum = 0;
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++)
sum += A[j][i];
return sum;
}
```
In the original code, `sum` is calculated as follows:
```
(i, j) | sum
-------|--------------------
(0, 0) | INT_MAX
(0, 1) | -1
(1, 0) | INT_MAX - 1
(1, 1) | -2
```
On the other hand, if they are interchanged, the calculation proceeds as shown below, resulting in signed integer overflow:
```
(i, j) | sum
-------|--------------------
(0, 0) | INT_MAX
(1, 0) | INT_MAX + INT_MAX
...
```
Currently, such an interchange can be applied in some cases.
godbolt: https://godbolt.org/z/oqYs14va9
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJy8VEGP8yYQ_TX4MkqEx04cH3xInEaK1G4vPbSnCgO2SQmkgLPa_voKnKzzdfdchARm3mOYN-Nh3qvBSNmQzYFsjhmbwmhd8xfz08BW_SXrrPhoWmu8EtJBGCX0Vmv7rswA3ApJij2haW7pPHn8wEIZrichgRStVlcV_HokxU8zVpkAe7I5INkcHwuQ4gikOhC6h7jC-e23P3_Z_06wfW6BVEeC7Y-I89sn4vy2IOKmOCzeeoK7u1WCYP3pJZ776Zo80xkN0FsHBHfRpj4tadsCpi3BQ5p1xL_ALwv8ssAvP8DTSD7xENFRhMssgorL4xFOhsmZCHwEUR1fFZ7DOpuUDuvUoAzTczawBbKlkbiloDxwpvmkWZACmH-kzn_NWUrZTkX6ZZaoTd7pfjUPUrWrb8bMo5FHn7xn4hZT_jSt8vk0_44AK8jhxb6w8Gvwvz6CD6N0MDIjIkP18fADmJMxudLxkZlBJltEP8VQ1sDNWS6l8FEWP9p3A53U9j1CnfSTDrHAlYH0e4h03SAd2Lt0fcT9fxJ-LxbBwwtsvV5_1aidnJMm6I94gZ_4CMy86gKcxaiB3W5apRjB22s89tLH-wYrOqsDKfYwhnBLdYMngqeHYW3dQPD0D8GT_fsPn5d3VmeiKURd1CyTTV5tEItiS-tsbLDKiz4v801ZYSWwq7stclF1dUlLpD3PVIMUN7TK8zwvCqzXXFCUctuVfb_hSAtSUnllSq-1vl-j70x5P8kmL3eIu0yzTmqfGhmike-QrARjd8lcE0mrbho8KalWPvjlmqCCTh3wZ2tv50Wg2JbOhlvnJA-pynSsCtuDk2LisY58Njnd_EcdFcapW3N7JXiKTh7L6ubsRfJA8JSe5gmeHm-_N_hvAAAA___FgIm5">