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