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