<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/102597>102597</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[SCEV] WRONG code
</td>
</tr>
<tr>
<th>Labels</th>
<td>
miscompilation
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
nikic
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
JonPsson1
</td>
</tr>
</table>
<pre>
```
int printf(const char *, ...);
__int128 a = 3, c;
char b;
int main() {
c = 3;
for (; c >= 0; c--) {
b = 0;
for (; b <= 3; b++) {
if (c)
break;
a = 0;
}
}
printf("%d\n", (int)a);
}
```
clang -march=z15 -O1 wrong0.i -o a.out
This program should print '0' as 'a' is set to zero inside the loop. It now prints '3' instead. A bisect leads to a recent commit: 79af689 " [SCEV] Handle more adds in computeConstantDifference() (#101339)".
Seems like IndVarSimplify has gone wrong with an i128:
GOOD <> BROKEN
```
; *** IR Dump After IndVarSimplifyPass on loo ; *** IR Dump After IndVarSimplifyPass on loo
; Preheader: ; Preheader:
entry: entry:
br label %for.cond1.preheader br label %for.cond1.preheader
; Loop: ; Loop:
for.cond1.preheader: for.cond1.preheader:
%storemerge11 = phi i128 [ 3, %entry ], [ % %storemerge11 = phi i128 [ 3, %entry ], [ %
%tobool = icmp ne i128 %storemerge11, 0 | br i1 true, label %for.inc5, label %if.end.
br i1 %tobool, label %for.inc5, label %if.e <
if.end.lr.ph: if.end.lr.ph:
store i128 0, ptr @a, align 8, !tbaa !4 store i128 0, ptr @a, align 8, !tbaa !4
br label %if.end br label %if.end
if.end: if.end:
%storemerge89 = phi i8 [ 0, %if.end.lr.ph ] %storemerge89 = phi i8 [ 0, %if.end.lr.ph ]
%inc = add nuw nsw i8 %storemerge89, 1 %inc = add nuw nsw i8 %storemerge89, 1
%cmp2 = icmp ugt i8 %storemerge89, 2 %cmp2 = icmp ugt i8 %storemerge89, 2
%or.cond = or i1 %tobool, %cmp2 | %or.cond = or i1 true, %cmp2
br i1 %or.cond, label %for.inc5.loopexit, l br i1 %or.cond, label %for.inc5.loopexit, l
for.inc5: for.inc5:
%storemerge8.lcssa = phi i8 [ 0, %for.cond1 %storemerge8.lcssa = phi i8 [ 0, %for.cond1
%dec = add nsw i128 %storemerge11, -1 %dec = add nsw i128 %storemerge11, -1
%cmp = icmp ugt i128 %storemerge11, 0 %cmp = icmp ugt i128 %storemerge11, 0
br i1 %cmp, label %for.cond1.preheader, lab br i1 %cmp, label %for.cond1.preheader, lab
for.inc5.loopexit: for.inc5.loopexit:
%inc.lcssa = phi i8 [ %inc, %if.end ] %inc.lcssa = phi i8 [ %inc, %if.end ]
br label %for.inc5 br label %for.inc5
; Exit blocks ; Exit blocks
for.end6: for.end6:
%storemerge8.lcssa.lcssa = phi i8 [ %storem %storemerge8.lcssa.lcssa = phi i8 [ %storem
store i128 -1, ptr @c, align 8, !tbaa !4 store i128 -1, ptr @c, align 8, !tbaa !4
store i8 %storemerge8.lcssa.lcssa, ptr @b, store i8 %storemerge8.lcssa.lcssa, ptr @b,
%0 = load i128, ptr @a, align 8, !tbaa !4 %0 = load i128, ptr @a, align 8, !tbaa !4
%conv7 = trunc i128 %0 to i32 %conv7 = trunc i128 %0 to i32
%call = call signext i32 (ptr, ...) @printf %call = call signext i32 (ptr, ...) @printf
ret i32 0 ret i32 0
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJykWN2S2yoSfhp802WVBNbYvvDF2J7JZncrk0q2spcpBMjijAQqwJkkT38K9GPJlieeOSqX1QK-7qb5uhGi1sqDEmKD0i3CWMlnyRDGKN3P6NEV2mz-rdVna7VKZpnmvzboLm5_8R7F91I5qI1ULkd4xbSyDlhBDSB8j_AOoihCeI3Ithn9_btULsEroIDIHogfwvreAMz6R6-6olIhvEJ4DWjZtgOwFk36llx7kytEtqHzwffH4Wk-PwMDZNB1n9oGCnz3rjMAGcLb8DtTAiBzj2B-foNWgMwI-jxSDu18xybRct89nMQ-ln4RcMpRulNB3HljUjmE13QY0h7a_o-Xpw1sSdUB5hU1rEBk_ztJYf6UwIvR6hBHEuYaaKSPboj5XyEt1EYfDK3AFvpY8sY5QHgZI7wEar1IvSgtWOHAafgtjAaprOQCXCGg1LqO4KMDpV8afECRgFLWCcojuIdMWsEclIJy69VQMIIJ5YDpqpIOkXtYrml-t1oDwhhQuv26e_iG0j38iypeCqi0EUA5tyCVB9VHJ3aejlS5vcxzYYRioqOSv5EkTghZ-1hiHA2n_lWIykIpnwV8VPwbNV9lVZcy_wUFtXDQSjShgxfpCqAKZOKZ06I_PD3tGwY9wPbL038ePk2vDNk2SeJ_8PEL7I9VDfe5E-bM6mdqLWjlQ-lZ8x7ciCFkC5-NKATlwvjAnjc0w4Ry5pfv7oSOq5mBkmaiBITTXJuIacWTqO4UwOX1B8S5c__Vuu78auWmcwpL7uFK87WrzzmcWqeNqIQ5iCQJCVoXMiymJ1hTnRBOQwAApfvwnPrwp42mf6Jh4IbTmdZlgEtW1aBEq2Ks34PjxvBy14RVJuDMUfieUYSlYumoUeaRUDwarKFMTqZvwwdSD9aq1VmaqC5eC_jpOkd07oRZNnOOvdnaGUCLmHqZlvKgYNVEMnEZpf6-eA9misGNSxNNlzP1Hp-km65Jrvka1jGl4Unc8mQYH0-XS5bdjh2YlqrZMCnnoI4voOxLQI8Vez3JwPU34QbWWFXjE5ePB3cFg0eBegNuYKvN_ADTl5zutYZ8mRzfpU879CJBWsRkhkR-cxM_pQu9Xal7K25ItD73biUYDBHTbItKZi29Rpu-eL4PNTDJxYAtnilXStg8Ga_77bgxyc648mrBHJLsRtwFE1hVX6zm-bbT9I-ZcDtuigknrrQ73UXjTdVHKja9ok3fqIb0lWdYCN6Evvaq4H1_nc5TiPP3g4ef0kFWavZsb0iQM8QpukLxuy6onXyLvmZuU9lyNUbNyC6ab8VN7JLzZLDlsde2yfZ6D_bM7nkxHvo-0Jh5eWjzLbgBY-MQj1JT3rxe3_ha0HP2ffjT6jKtfiyDDmeOivWFIvbHE0nwFDX-jBqWMFo273xBCKfwny5oRnhVO3M6Pnunm3Nhb-Yd2M60Ec3I-CRNHiBnfEP4mqzpTGySJSY4Tsh6MSs2hPBFvlrEZBHzu4UgmOd5ju8yzNc8X9B4Jjc4xot4Fa-TJCbJImI4JStKOEkXJCdJghaxqKgso7L8UUXaHGbS2qPYJDFO18tZqAC2_SJRSeuPc7KkTmrVfpowG4-cZ8eDRYu4lNbZky4nXRm-Z3RHxP9_efr0AZjmAmZHU24K52rrTxX4EeHHg3TFMYuYrhB-9Era27w2-i_BHMKPwTuL8GPr4I8N_jsAAP__oxaznA">