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