<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">