<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/59615>59615</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[IndVars] IndVarSimplify got pessimized by more precise symbolic exit count (?)
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
max-quazan
</td>
</tr>
</table>
<pre>
The problem is caused by my patch, though it's reason isn't clear and I don't think this is really causing it (maybe smth was exposed). I rather want to fix it than revert the patch because it made some good things.
Patch:
```
commit 07de5d18c90182f5d38fd9b9b3911375d045ff2a
Author: Max Kazantsev <mkazantsev@azul.com>
Date: Wed Dec 7 17:31:40 2022 +0700
[SCEV] Remember blocks for which we know symbolic exit count but not exact
The old code didn't bother to memoize blocks for which exact exit count is not
known. As result, in situation when exact isn't known but symbolic is known, this
info was lost. This patch fixes the situation: now we memoize when symbolic is
known (exact always implies symbolic, so this is a strict superset of what was before).
Differential Revision: https://reviews.llvm.org/D139515
Reviewed By: nikic
```
Test: `opt -passes=indvars -S` on
```
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128-ni:1-p2:32:8:8:32-ni:2"
target triple = "x86_64-unknown-linux-gnu"
define void @test() {
bb:
%tmp27 = load atomic i32, ptr addrspace(1) poison unordered, align 8, !range !5, !invariant.load !6, !noundef !6
%tmp28 = add nsw i32 %tmp27, -1
%tmp29 = icmp eq i32 %tmp27, 0
br i1 %tmp29, label %bb56, label %bb57
bb30: ; preds = %bb57, %bb49
%tmp31 = phi i32 [ %tmp53, %bb49 ], [ 0, %bb57 ]
%tmp32 = sub nsw i32 %tmp28, %tmp31
%tmp33 = icmp ult i32 %tmp32, %tmp27
br i1 %tmp33, label %bb37, label %bb34
bb34: ; preds = %bb30
ret void
bb37: ; preds = %bb30
%tmp44 = load atomic i32, ptr addrspace(1) poison unordered, align 8, !range !5, !invariant.load !6, !noundef !6
%tmp45 = icmp ult i32 %tmp31, %tmp44
br i1 %tmp45, label %bb49, label %bb46
bb46: ; preds = %bb37
ret void
bb49: ; preds = %bb37
%tmp51 = zext i32 %tmp31 to i64
%tmp52 = getelementptr inbounds i32, ptr addrspace(1) poison, i64 %tmp51
%tmp53 = add nuw nsw i32 %tmp31, 1
%tmp54 = icmp ult i32 %tmp53, %tmp27
br i1 %tmp54, label %bb30, label %bb55
bb55: ; preds = %bb49
unreachable
bb56: ; preds = %bb
ret void
bb57: ; preds = %bb
br label %bb30
}
!0 = !{i64 52}
!5 = !{i32 0, i32 2147483646}
!6 = !{}
```
Before my patch, output was
```
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128-ni:1-p2:32:8:8:32-ni:2"
target triple = "x86_64-unknown-linux-gnu"
define void @test() {
bb:
%tmp27 = load atomic i32, ptr addrspace(1) poison unordered, align 8, !range !0, !invariant.load !1, !noundef !1
%tmp29 = icmp eq i32 %tmp27, 0
br i1 %tmp29, label %bb56, label %bb57
bb30: ; preds = %bb57, %bb49
%indvars.iv = phi i64 [ 0, %bb57 ], [ %indvars.iv.next, %bb49 ]
br i1 true, label %bb37, label %bb34
bb34: ; preds = %bb30
ret void
bb37: ; preds = %bb30
%tmp44 = load atomic i32, ptr addrspace(1) poison unordered, align 8, !range !0, !invariant.load !1, !noundef !1
%0 = zext i32 %tmp44 to i64
%tmp45 = icmp ult i64 %indvars.iv, %0
br i1 %tmp45, label %bb49, label %bb46
bb46: ; preds = %bb37
ret void
bb49: ; preds = %bb37
%indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
%exitcond = icmp ne i64 %indvars.iv.next, %1
br i1 %exitcond, label %bb30, label %bb55
bb55: ; preds = %bb49
unreachable
bb56: ; preds = %bb
ret void
bb57: ; preds = %bb
%1 = zext i32 %tmp27 to i64
br label %bb30
}
!0 = !{i32 0, i32 2147483646}
!1 = !{}
```
Now, it is
```
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128-ni:1-p2:32:8:8:32-ni:2"
target triple = "x86_64-unknown-linux-gnu"
define void @test() {
bb:
%tmp27 = load atomic i32, ptr addrspace(1) poison unordered, align 8, !range !0, !invariant.load !1, !noundef !1
%tmp28 = add nsw i32 %tmp27, -1
%tmp29 = icmp eq i32 %tmp27, 0
br i1 %tmp29, label %bb56, label %bb57
bb30: ; preds = %bb57, %bb49
%indvars.iv = phi i64 [ 0, %bb57 ], [ %indvars.iv.next, %bb49 ]
%0 = sub nsw i64 %3, %indvars.iv
%1 = trunc i64 %0 to i32
%tmp33 = icmp ult i32 %1, %tmp27
br i1 %tmp33, label %bb37, label %bb34
bb34: ; preds = %bb30
ret void
bb37: ; preds = %bb30
%tmp44 = load atomic i32, ptr addrspace(1) poison unordered, align 8, !range !0, !invariant.load !1, !noundef !1
%2 = zext i32 %tmp44 to i64
%tmp45 = icmp ult i64 %indvars.iv, %2
br i1 %tmp45, label %bb49, label %bb46
bb46: ; preds = %bb37
ret void
bb49: ; preds = %bb37
%indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
%exitcond = icmp ne i64 %indvars.iv.next, %wide.trip.count
br i1 %exitcond, label %bb30, label %bb55
bb55: ; preds = %bb49
unreachable
bb56: ; preds = %bb
ret void
bb57: ; preds = %bb
%3 = sext i32 %tmp28 to i64
%wide.trip.count = zext i32 %tmp27 to i64
br label %bb30
}
!0 = !{i32 0, i32 2147483646}
!1 = !{}
```
So we haven't eliminated a branch that used to be eliminated. Need to investigate and fix.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWV2P27gV_TX0y4UNifqyHvwwjneAoOiiyATbx4ISry12JFJLUv6YX1-QkmVb49lM06TNogkShaJ4yXsPD-8hTWaM2EnEFUnWJNnMWGcrpVcNO85_79gLk7NC8dPqc4XQalXU2IAwULLOIIfiBM0JWmbLitAPYCvV7SoQltDMgEZmlARhJKGZhbJGpoFJDh-Bq77OVkI-u6dxnWpkdX3yfQu5A2GB0GXDTgWCaWwFB2YAj60yyAnNF_ARNLMVajgwacEq2Iqjs7IVk6Bxj9qVsfcPCvROuwYN4whGNQg7pbj3YmcWJNiQ4KF__s2HFA1vJA2Gv_61VE0jLAQZx4SHyzIPwiXdJjxabnle5EWUh2GUJTyIk-2Wst7oweNKogf4KzvCXxyy1uAeSPSheT6_kThgL129KFVDol96ww2z6MwA_o4cNlhCBmFGoocoJNFDHAANKAVC10EWBNcxAEnWTx9--Y0kG_iEDTYFaihqVT4b2CoNh0qUFRwQnqU6gDk1hapFCXgUFkrVSQtFZ0EqC3hkpb3pGgAcI1TNoVQcgQvez2ih_IxYBQ02Srzg6xF9b9fDCONGufTs_JELeHCMMF1tHbWEBCNsx6xQEg4VyqGbM7u8jXd4DESYvrZnpjCXAYTcKs-mWhm7gM-Ofz1JtuKIxpNmHM1h7wA64BiSH_9qnInrjra9d6w-sJMB0bS1QDOaOI-MGnnPwFgtSguma1EbtKC2cKiY9T4WuFUaHeFvZmAjtlvUKK1gNXzCvTCDr5W1rXHUpY-EPmrcCzyYRV3vm4XSO0IfN2GUJ2FycfqTb4Mc1icfrHgW5fVYE_p_RmNdO5IGqrUwb5kxaEi0EZLvmTYwfyJpAEretbZM79ACZ5bV7KQ6CyTaAKEU5w2JHnDe0ixw7Kb-4V7D21dXSmP_mItzYbt0RiFdzuXSFdKzTRrPn3y1cNXzlp4_LId_Ee2_UULpjYtWi7bGs3vHZfqPNJ530k_xvBayO853shut-ifHrZAIeyU4kDiwDiu6JDQHkq37JkUxJhYgNLFNSzM_Sq0YB2ZV40gVUceS1mpgnGvTshIJXYaup1YJl1g7qTRH7ZLhB2C12ElYuiKhoWZyh66QDBVC7pkWTNqFH4TQMB2-SNVJjtu-aqDE4NXSe8U4B2kOzqPRXWc7D29jyH1rUTYt4O-vWgfnvgsNIhxt3KeaFVi7mqJI0mlFdg1uUURBnwrf_4dEa2g1cjNMZN-pjz0piji_jTkKfbO2En0EyXr4kERXNkCSjX9N1hCM9Unm669BcV1EGzBdMYVwmKl-zIkP0QXJrrZXVj0nRljvIBpFEwCjbFoRTxCN_Vp-jVI0TplG6wk9Mcy-aNj7FMc_Irvj5E2UwwvK8YDWDchxMsE0nvI4Tm-xitO3sMr-GOQ4_6LhwM-euC94vA3FKbFLkreNe1ru0GKNDUrrJkLIwoFl3jE5XpDTeBx60nt0yRvdYUL8HtypRfzWXIzL7k3GJ_GU4ME0hyS3mCbJG5iOyaCTGllZsaLGiWn6DdLPH8948tayugr-NtrePNvcSDYNg8E0JNnaTVZCL21omFx_jWifxlyBhnEWL6M0Tq-bp1fNL_W3yt4_1367cnMsUJ1tO7-Z-bkj-J_vCII3c2b4OmdO1uk7Nf5bSPy_IdvDtnMh9hftdsnpnjgPon1jtZB4tFN1v8k0Vnf4dbr6H6aKP4EGfzWfgnuCFcd3BeuVWPfic5nDYfru7jJ_OLmeUO-1Wt6L7ho6d3YuleQXUCS-trrmdfgKmHMf3149vySf314SXYD32ESzCZu-Sju_rI7hO9TxV3Xwndjx94KfMvhnlcH_t4Px91TYUQnGQ3Kfx84b_6ssOF3tVneyPLcP_FKP6LvO0uH3Okf_1Ps3Fw79DnpPf-r9_VV2EBwXLk8v_E_s_0X1_6HPzi6v9MlmslFYvqbhBMIffX_RP58UHBAqtsf-WgRr0QjJLHJgUGgmywpsxSz46zuroMCrNgv4FftqIfdorNgxi_7KbiuOixlfRTyPcjbDVZhmYRLFeZrPqlWKSRLwEAMeB8twWbJtHmyXcZTwFCkro5lY0YDSkNIgDMM0yBd5QdOkyGKKeZAsWU7iABsm6vGaYiaM6XCV5GmYzDykxl9QUirxAP6j218km5leOZt50e0MiYNaGHu57JhZYWt_s_lR8t-YNiTZQF988ncy2xPslIUWjRGNeBluNJVGR6BSGLx7Leb2LdEjofms0_Xq9r5lJ2zVFf4Cjz46P4b_5q1W_8TSEvrovTeEPvro_hUAAP__qiENKw">