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

    <tr>
        <th>Summary</th>
        <td>
            [LoopInterchange] Miscompilation when the inner loop exit condition is not a simple comparison
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            miscompilation,
            loopoptim
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
            kasuga-fj
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          kasuga-fj
      </td>
    </tr>
</table>

<pre>
    ```llvm
; for (i = 1; i < 5; i++)
;   for (j = 0; (j < i) & (j < 100); j++)
; A[j*5 + i] += 1;
;
@A = global [32 x i64] zeroinitializer

define void @f(ptr %A) {
entry:
  br label %outer.header

outer.header:
  %i = phi i64 [ 1, %entry ], [ %i.next, %outer.latch ]
  br label %inner.header

inner.header:
  %j = phi i64 [ 0, %outer.header ], [ %j.next, %inner.latch ]
  br label %body

body:
  %jx5 = mul nsw nuw i64 %j, 5
  %idx = add nsw nuw i64 %jx5, %i
  %gep = getelementptr inbounds i64, ptr %A, i64 %idx
  %old = load i64, ptr %gep
  %new = add i64 %old, 1
  store i64 %new, ptr %gep
  %j.next = add nuw nsw i64 %j, 1
  br label %inner.latch

inner.latch:
  %c1 = icmp slt i64 %j.next, %i
  %c2 = icmp slt i64 %j.next, 100
  %cond = and i1 %c1, %c2
  br i1 %cond, label %inner.header, label %inner.exit

inner.exit:
  br label %outer.latch

outer.latch:
  %i.next = add nuw nsw i64 %i, 1
  %cmp.i = icmp slt i64 %i.next, 5
  br i1 %cmp.i, label %outer.header, label %exit

exit:
  ret void
}

define i32 @main() {
entry:
  call void @f(ptr @A)
  br label %loop

loop:
  %k = phi i64 [ 0, %entry ], [ %k.next, %loop ]
  %acc = phi i64 [ 0, %entry ], [ %acc.next, %loop ]
  %g = getelementptr inbounds [32 x i64], ptr @A, i64 0, i64 %k
  %v = load i64, ptr %g
  %acc3 = mul i64 %acc, 3
  %acc.next = add i64 %acc3, %v
  %k.next = add i64 %k, 1
  %c = icmp slt i64 %k.next, 32
  br i1 %c, label %loop, label %done

done:
  %r = trunc i64 %acc.next to i32
  %r2 = and i32 %r, 255
  ret i32 %r2
}
```

```sh
$ lli repro.ll
$ echo $?
122
$ opt --passes=loop-interchange --loop-interchange-profitabilities=ignore repro.ll -S -o tmp.ll
$ lli tmp.ll
$ echo $?
64
```

Disclosure: The test case is generated by AI
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyUVtuO4ygQ_RryUkpkl00uD3nIRZFG2n3a_QFsE5s0BsvgTnq-fgW-p5NejRTN4OJw6lRRVQ0zRuSK8z2hR4L4wUyTs-X1RhAJPS9YYwtd7wfzItHZ156sg_Yn5WdJggOJjnDVNRDcCiDRGUJnccsTUL8kePS_XYeGHn_z-MDZuq-TQ--A4Hq0hEHgzkZHuD0zHQg93ggeKBB0jujZLXoRLcj9GwcH7yqXOmESCD1GCA8Q69gd-c1rLZSwgknxm9fuQHDI-FUoDp9aZEDi4EpwW1mnmh68wo0j5srWXyRyeICkBskSLh1GN5bXq4KzrOebWboTBGmbsqoQTowTBiHBk9vx3EDo2X_To0evFH_YDtAySmbTwsOeNQilnjTMLKOG2zcNwcxFe-BJym0qpSV-L8UVTivBryauH9Q7LxsJytxBNfdWBNKb46ZDnrKHB7Is-wZ80F5Gj8551d43t1zykivr7k6oRDcqM_7e8QTjfZ56LpE9eg4tM88hNcueTuS86lGK3wddHYeWmcOGHmKsrnm_o_j9NUubzDHA5u6DnGYifHO_PunT620NY4rT0POKtKzASDuQzu5vAOP_gF0z9lit2gwxlYEIW18dYYq93G5DK5-U18X5fYM_hJ0G5b_f9tkkB1PDpMt-zK8Y8-ukltVKvMzC2H30KTp3ZBbFrNunG2Ng05Bqbv2kcTub82wAiQjd_CmZUAS3b0ZPyqT8Pqri4NCOynnOpNZV68Kvxix9vJ0Dr2bRx7SAHNPQ-QQpS9M_ImNp-hNd_lM3z6f50GA--raxg0mHf_Scn2-7exJENEyn7jhLUweNJph5bY24qAvmc8jvS-THvPpeVt6Y6-i5sWbV5S90asi04l05udV417X3Y-tGpRPJrUCrXdUNSByb3NUiUl_RSOlQur0dx_rtHwmt8-HT-DbFGKQUUPOq1ispOxNPCw0EYxJdSHAIETu7riwslxUzhhsSnV2MS6Esr9OCqZzDcvlsWla1vgrLEiGFFf6UyJUbxL1LWP4DSw22rEb_TtLMMBe0jr_HdRYmldo0tUst_FtwsNxYSJnhIAzkXPGaWZ5B8gWHX4tsH2W7aMcWfB9utsGWrjc0WhR7TDhN2e6KESJPoijeBgnuwiAOsyymKV2IPQa4DtbBJtwipdGKsd12HadhHARRssEdiQNeMiFX7lG20nW-EMY03B1DDBa-Hkz3zCuFSXVZCcms0Mq99fBEEF0SdWVF2b3-6r3jWiZNbkgcSGGsGdmtsNI_G__Suvo1Zt49p_6e8cO94ApswcFPcvCt7WYfuL8JwkOEAaUtMDCirCQHd5zVwmi1aGq5L6ytjKtdvBC85MIWTbJKdUnw4t-g7X_u0m88tQQvPnZD8NKF_7nH_wIAAP__6R4Umg">