<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/59897>59897</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            apparent infinite loop in InstCombine
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            llvm:instcombine
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          regehr
      </td>
    </tr>
</table>

<pre>
    apologies for the unreduced module but it's not easy to make minimal triggers for this kind of bug. the function below, optimized at -O2, appears to hang us up indefinitely. all of the cases triggering this have contained a bitreverse intrinsic so I suspect that's part of the problem.

I attached a profiler to the process and here's what's up at the top:

```
Samples: 479K of event 'cycles', Event count (approx.): 561733173365
Overhead  Command  Shared Object                   Symbol
   3.69%  opt      libLLVMAnalysis.so.16git        [.] programUndefinedIfUndefOrPoison                   ▒
   3.60%  opt      libLLVMAnalysis.so.16git        [.] computeKnownBits                                  ◆
   2.82%  opt      libLLVMAnalysis.so.16git        [.] llvm::DataLayout::getTypeSizeInBits               ▒
   2.54%  opt      libLLVMCore.so.16git            [.] llvm::Type::getPrimitiveSizeInBits                ▒
   2.54%  opt      libLLVMAnalysis.so.16git        [.] llvm::mustTriggerUB                               ▒
   2.38%  opt      libLLVMAnalysis.so.16git        [.] computeKnownBitsFromOperator                      ▒
   1.86%  opt      libLLVMInstCombine.so.16git     [.] llvm::InstCombinerImpl::run                       ▒
   1.78%  opt      libLLVMAnalysis.so.16git        [.] llvm::getGuaranteedWellDefinedOps                 ▒
   1.72%  opt      libLLVMInstCombine.so.16git     [.] llvm::InstCombinerImpl::SimplifyDemandedUseBits   ▒
   1.29%  opt      libLLVMCore.so.16git            [.] llvm::Value::setValueName                         ▒
   1.22%  opt      libLLVMAnalysis.so.16git        [.] computeKnownBitsFromAssume                        ▒
   1.19%  opt      libLLVMCore.so.16git            [.] llvm::Type::getScalarSizeInBits                   ▒
   1.18%  opt      libLLVMAnalysis.so.16git        [.] llvm::isGuaranteedToTransferExecutionToSuccessor  ▒
```

trigger this by running `opt -O2` on this code:

```
source_filename = "M2"
target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
target triple = "aarch64-linux-gnu"

define i64 @f-tgt(i64 %0, i64 %1) {
f:
  %X0_1 = freeze i64 %0
  %X0_2 = trunc i64 %X0_1 to i1
  %X0_3 = zext i1 %X0_2 to i32
  %X0_4 = zext i32 %X0_3 to i64
  %X1_1 = freeze i64 %1
  %X1_2 = trunc i64 %X1_1 to i1
  %X1_3 = zext i1 %X1_2 to i32
  %X1_4 = zext i32 %X1_3 to i64
  %X2_3 = or i64 poison, 0
  %X2_4 = freeze i64 %X2_3
  %X3_3 = or i64 poison, 0
  %X3_4 = freeze i64 %X3_3
  %X4_3 = or i64 poison, 0
  %X4_4 = freeze i64 %X4_3
  %X5_3 = or i64 poison, 0
  %X5_4 = freeze i64 %X5_3
  %X6_3 = or i64 poison, 0
  %X6_4 = freeze i64 %X6_3
  %X7_3 = or i64 poison, 0
  %X7_4 = freeze i64 %X7_3
  %X8_3 = or i64 poison, 0
  %X8_4 = freeze i64 %X8_3
  %X9_3 = or i64 poison, 0
  %X9_4 = freeze i64 %X9_3
  %X10_3 = or i64 poison, 0
  %X10_4 = freeze i64 %X10_3
  %X11_3 = or i64 poison, 0
  %X11_4 = freeze i64 %X11_3
  %X12_3 = or i64 poison, 0
  %X12_4 = freeze i64 %X12_3
  %X13_3 = or i64 poison, 0
  %X13_4 = freeze i64 %X13_3
  %X14_3 = or i64 poison, 0
  %X14_4 = freeze i64 %X14_3
  %X15_3 = or i64 poison, 0
  %X15_4 = freeze i64 %X15_3
  %X16_3 = or i64 poison, 0
  %X16_4 = freeze i64 %X16_3
  %X17_3 = or i64 poison, 0
  %X17_4 = freeze i64 %X17_3
  %Q0_3 = or i128 poison, 0
  %Q0_4 = freeze i128 %Q0_3
  %Q1_3 = or i128 poison, 0
  %Q1_4 = freeze i128 %Q1_3
  %Q2_3 = or i128 poison, 0
  %Q2_4 = freeze i128 %Q2_3
  %Q3_3 = or i128 poison, 0
  %Q3_4 = freeze i128 %Q3_3
  %X8_3x1x2x0 = trunc i64 %X1_4 to i32
  %X8_3x2x2x0 = call i32 @llvm.bitreverse.i32(i32 %X8_3x1x2x0)
  %X8_3x3x2x0 = zext i32 %X8_3x2x2x0 to i64
  %X8_4x1x3x0 = trunc i64 %X8_3x3x2x0 to i32
  %X8_4x2x3x0 = xor i32 %X8_4x1x3x0, -1
  %X8_4x3x3x0 = or i32 0, %X8_4x2x3x0
  %X8_4x4x3x0 = zext i32 %X8_4x3x3x0 to i64
  %X0_3x1x4x0 = trunc i64 %X8_4x4x3x0 to i32
  %X0_3x2x4x0 = lshr i32 %X0_3x1x4x0, 31
  %X0_3x3x4x0 = trunc i64 %X0_4 to i32
  %X0_3x4x4x0 = and i32 %X0_3x3x4x0, %X0_3x2x4x0
  %X0_3x5x4x0 = zext i32 %X0_3x4x4x0 to i64
  %X0_3x1x5x0 = trunc i64 %X0_3x5x4x0 to i32
  %X0_3x2x5x0 = zext i32 %X0_3x1x5x0 to i64
  ret i64 %X0_3x2x5x0
}

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i32 @llvm.bitreverse.i32(i32) #0

attributes #0 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysmN9zm7gWx_8a-UVjDxK_H_zg1M2dzHZvtpN0733rCDjG2gqJkURi96-_I7CJIXCXtttpSIBzPuerIx10gBnDSwmwReEdCvcr1tij0lsNJRz1KlPFectqJVTJweCD0tgeATdSQ9HkUOBKFY0AnDUWc4tobLBUFgMzZ2wVrtg3wBWXvGICW83LEvSVwg3-xmWB1QFnTblpuYdG5pYriTMQ6hXRD1jVllf8OxSYWbx-pO4aq2tg2rgARyZL3Bjc1JjLAg5ccgvivMFMCEd20JwZMNfoXJZd7CN7AZwraRmXjo4zbjW8gDaAubSaS8NzbBR-wKYxNeQW2yPrhlgzba_0WqtMQLVB3h55u-74gJm1LD-23FqrAxegndyLQw7GYCYLfAQNLfH1im5qN1BnZ1WN_N0tFkXe5X97-sSqWoBB_g4HcfqbEwQvIC1GNM7PubtFY5evj-3VXDXtvYTVtVanDaKpcw0jEvu--4nCjvv4AvoIrMD4g6oqJxM_HZmGAj9mf7k8vP_3dK4yJTp3jLG_iVJEQ-xmrzMQPPv06c_fd5KJs-FmY9SGRCXvWSi826Bw75JTalZ96eYSiodD--ej_kNxo-REaPSRojRCKb2N7v1c9FxVdWPhN6le5R23ZiLcVPQYJVEfnW4S-nPRhXip3Iz7uz2z7BM7q8Z25yXY53MNT_w7PEwJe58DugmDSRUflIZ3CqZVuJB9_D80r7jlL_MifkTFD-Siaox97mr3y92S2Rgp8JN_Zi3ca1U91qCZVXppdLJJosnoD9LYD6rKuBxNxvvx35jqh6oW3VXdTNXCnIr4J3PwpqIE-6-GaSYtQPEfEGLf1edj_b5IJhVM18Qv5-GJV7Xgh_Me3IMKii8GLktzSgWdfir9QE38yURzKQoDtj37N6vgB1Yk2dCffD5MrcidMc18-Kno5JdzMHguPOVMMD3_UJhT8csrkpu3BfmsnjWT5gD64wnyxnUQz-qpyd0-66p1pGC0j3bHS3_QNQfZGetGStcsoMhzKl3rEXlYyc4gVwX8_93ZqEbn8NVt_dKtEOTvMaL0d4roRYZlugSLC2aZaB_2VxtYuzHCmifI37kfn645iZC_aw_uLAqQv4uCNSfUGRCarKVPu2tP7tooiNW8Fr0IxnR-jIK14LI5rUvZ9Obdsdt8MY8CjALvsLalRTRpT2nouZbi8jdBNMUovuvcDn1GsLv5X-8raSMeNMB3wL3_wIS2JlY3Mr9atI5WYU6Gpn5r-h1OFnPSuztDnw4tgxtLn_buzjQKbk3JpEQyNJmSSKYkkgmJZFIimZJIJiXSC1TpNnjdNkJuDryhVTAxEOd8a-UvYvnTLH_IChaxgmlWMGSFi1jhNCscsqJFrGiaFQ1Z8SJWPM2Kh6xkESuZZiVDVrqIlU6z0iGLeItgxJumOfeBHVmGIzM4MsItW_5kZv2TUQGQZRVAZkqAjGqALCsCMlMFZFQGZFkdkJlCIKNKIMtKgczUAhkVA1lWDWSmHMiwHj7fLjtCkxnc5_Gyc6YX91szsow2XnVX2nDVfabLaONFd6UNF91nfxltvOauNP_dc-RETvTkTe5KwcRm4zxo75EzIbotJ_BcO7V5-_CxcY40ue5HfSRE0zHP73mDLewt1PuNLPkanMjJnxT-hpySH5xo73dyWeyjXYgul2sydvJ7p4tPazdAjl2C3mU0rCvt_bC8NkvBzLCuyKkuxQ346ifMUd_2Kh3S6fXHXdDJn4nmTc6-8wh6DyaLQRj_GmYgaewf9v7jnuqCnktLOCP0ipxLSzgXrkMOw2mwA3Trfuln4_2gR_fv8P31G-POWt1-PZPK1UTG8m9YKld9WCpzljmWqpGvXBbY1JA3glmWCcCvXAgNttESV1ApfUY0kUpCXyUF5IJp-Nsia5tn6g9eQ5i1mmeNBdPe6jr2-O4f1IjfcnJ9Y1kVW79I_ZStYEui2KdxksTp6rjNIYy8IPCyIo6SND9EYZpCEkVFDHkR-umKb6lHfY94KQkDQtJNlvpeFKRhQGkY-gdAgQcV42LTZkHpcsWNaWAbpkkarwTLQJj20zOll3c7Lo3Nuxd991oS7ld6626ts6Y0Lp3cWPOGs9wK2LK6ZhqkxVx234CxUKrGXOKb7warRovt0drazTqi94jel9wem2yTqwrR-1ZA92tda_UX5BbR-1avQfS-lfy_AAAA__95WlWe">