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

    <tr>
        <th>Summary</th>
        <td>
            [LoopUnroll] Assertion `isAvailableAtLoopEntry(OrigRHS, L) && "Must be!"' failed.
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

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

    <tr>
      <th>Reporter</th>
      <td>
          max-quazan
      </td>
    </tr>
</table>

<pre>
    Godbolt link: https://godbolt.org/z/e3WMj6Tjh

Run `opt -passes='loop(indvars,loop-deletion),loop-unroll'`

on the following test:
```

define void @test() {
bb:
  br label %bb5

bb4:                                              ; preds = %bb19
  ret void

bb5:                                              ; preds = %bb19, %bb
  %tmp = phi i32 [ 0, %bb ], [ %tmp21, %bb19 ]
  %tmp6 = icmp ult i32 %tmp, 400
  call void (i1, ...) @llvm.experimental.guard(i1 %tmp6, i32 12) #3 [ "deopt"() ]
  br i1 poison, label %bb7, label %bb17

bb7:                                              ; preds = %bb5
  br label %bb8

bb8:                                              ; preds = %bb8, %bb7
  %tmp9 = phi i32 [ poison, %bb7 ], [ %tmp12, %bb8 ]
  %tmp10 = phi i32 [ 1, %bb7 ], [ %tmp13, %bb8 ]
  %tmp11 = add i32 %tmp9, 30586
  call void @wibble(i32 %tmp11)
  %tmp12 = ashr i32 0, 3
  %tmp13 = add nuw nsw i32 %tmp10, 1
  %tmp14 = add i32 %tmp12, 407
  %tmp15 = icmp slt i32 %tmp13, %tmp14
  br i1 %tmp15, label %bb8, label %bb16

bb16:                                             ; preds = %bb8
  br label %bb19

bb17:                                             ; preds = %bb5
  br label %bb22

bb18:                                             ; preds = %bb22
  br label %bb19

bb19:                                             ; preds = %bb18, %bb16
  %tmp20 = phi i32 [ 0, %bb18 ], [ %tmp12, %bb16 ]
  %tmp21 = add i32 %tmp, 1
  br i1 poison, label %bb4, label %bb5

bb22:                                             ; preds = %bb22, %bb17
  br i1 poison, label %bb22, label %bb18
}

declare void @wibble(i32) #0

; Function Attrs: nocallback nofree nosync willreturn
declare void @llvm.experimental.guard(i1, ...) #2
```

Output:
```
opt: /root/llvm-project/llvm/lib/Analysis/ScalarEvolution.cpp:12704: llvm::ScalarEvolution::ExitLimit llvm::ScalarEvolution::howManyLessThans(const llvm::SCEV*, const llvm::SCEV*, const llvm::Loop*, bool, bool, bool): Assertion `isAvailableAtLoopEntry(OrigRHS, L) && "Must be!"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.      Program arguments: /opt/compiler-explorer/clang-assertions-trunk/bin/opt -o /app/output.s -S -passes=loop(indvars,loop-deletion),loop-unroll <source>
 #0 0x00005583750f8354 PrintStackTraceSignalHandler(void*) Signals.cpp:0:0
 #1 0x00005583750f5b14 SignalHandler(int) Signals.cpp:0:0
 #2 0x00007f5685e51420 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x14420)
 #3 0x00007f568591e00b raise (/lib/x86_64-linux-gnu/libc.so.6+0x4300b)
 #4 0x00007f56858fd859 abort (/lib/x86_64-linux-gnu/libc.so.6+0x22859)
 #5 0x00007f56858fd729 (/lib/x86_64-linux-gnu/libc.so.6+0x22729)
 #6 0x00007f568590efd6 (/lib/x86_64-linux-gnu/libc.so.6+0x33fd6)
 #7 0x0000558373f76d0a llvm::ScalarEvolution::howManyLessThans(llvm::SCEV const*, llvm::SCEV const*, llvm::Loop const*, bool, bool, bool) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x2750d0a)
 #8 0x0000558373f770c3 llvm::ScalarEvolution::computeExitLimitFromICmp(llvm::Loop const*, llvm::CmpInst::Predicate, llvm::SCEV const*, llvm::SCEV const*, bool, bool) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x27510c3)
 #9 0x0000558373f77708 llvm::ScalarEvolution::computeExitLimitFromICmp(llvm::Loop const*, llvm::ICmpInst*, bool, bool, bool) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x2751708)
#10 0x0000558373f77a82 llvm::ScalarEvolution::computeExitLimitFromCondImpl(llvm::ScalarEvolution::ExitLimitCache&, llvm::Loop const*, llvm::Value*, bool, bool, bool) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x2751a82)
#11 0x0000558373f77f73 llvm::ScalarEvolution::computeExitLimitFromCondCached(llvm::ScalarEvolution::ExitLimitCache&, llvm::Loop const*, llvm::Value*, bool, bool, bool) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x2751f73)
#12 0x0000558373f780ad llvm::ScalarEvolution::computeExitLimitFromCond(llvm::Loop const*, llvm::Value*, bool, bool, bool) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x27520ad)
#13 0x0000558373f44718 llvm::ScalarEvolution::computeExitLimit(llvm::Loop const*, llvm::BasicBlock*, bool) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x271e718)
#14 0x0000558373f44db1 llvm::ScalarEvolution::computeBackedgeTakenCount(llvm::Loop const*, bool) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x271edb1)
#15 0x0000558373f45978 llvm::ScalarEvolution::getBackedgeTakenInfo(llvm::Loop const*) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x271f978)
#16 0x0000558373f46364 llvm::ScalarEvolution::getSmallConstantTripCount(llvm::Loop const*, llvm::BasicBlock const*) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x2720364)
#17 0x0000558374e828d8 tryToUnrollLoop(llvm::Loop*, llvm::DominatorTree&, llvm::LoopInfo*, llvm::ScalarEvolution&, llvm::TargetTransformInfo const&, llvm::AssumptionCache&, llvm::OptimizationRemarkEmitter&, llvm::BlockFrequencyInfo*, llvm::ProfileSummaryInfo*, bool, int, bool, bool, llvm::Optional<unsigned int>, llvm::Optional<unsigned int>, llvm::Optional<bool>, llvm::Optional<bool>, llvm::Optional<bool>, llvm::Optional<bool>, llvm::Optional<bool>, llvm::Optional<unsigned int>) LoopUnrollPass.cpp:0:0
#18 0x0000558374e85f9f llvm::LoopUnrollPass::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x365ff9f)
#19 0x0000558375465986 llvm::detail::PassModel<llvm::Function, llvm::LoopUnrollPass, llvm::PreservedAnalyses, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x3c3f986)
#20 0x00005583728c14c4 llvm::detail::PassModel<llvm::Function, llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>, llvm::PreservedAnalyses, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x109b4c4)
#21 0x000055837480329f llvm::ModuleToFunctionPassAdaptor::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x2fdd29f)
#22 0x00005583728a7ea6 llvm::detail::PassModel<llvm::Module, llvm::ModuleToFunctionPassAdaptor, llvm::PreservedAnalyses, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x1081ea6)
#23 0x00005583748013fa llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x2fdb3fa)
#24 0x0000558372470918 llvm::runPassPipeline(llvm::StringRef, llvm::Module&, llvm::TargetMachine*, llvm::TargetLibraryInfoImpl*, llvm::ToolOutputFile*, llvm::ToolOutputFile*, llvm::ToolOutputFile*, llvm::StringRef, llvm::ArrayRef<llvm::StringRef>, llvm::ArrayRef<llvm::PassPlugin>, llvm::opt_tool::OutputKind, llvm::opt_tool::VerifierKind, bool, bool, bool, bool, bool, bool) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0xc4a918)
#25 0x0000558372393d4a main (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0xb6dd4a)
#26 0x00007f56858ff083 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x24083)
#27 0x00005583724639fe _start (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0xc3d9fe)
Compiler returned: 139
```
Looks like another variation around https://github.com/llvm/llvm-project/issues/56282 https://github.com/llvm/llvm-project/issues/56286 https://github.com/llvm/llvm-project/issues/56044

@fhahn might be interesting to you. :)
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzlWltT4zoS_jXhRZWULfn6wEMIsGdqmRpqYGcfKdmWEw2O5CPbXObXn5YcJ5FjIIEwdfYsFUhsSV93f90tdcckMns-_ZfMElnUqODifkSmaFHXZQUfRvgSXvN2dCLVHK5-wS8j__36M7j9uRg55yNn2v793gg0ChxZ1mhc0qpigHA-wmEhZTnCERfZA1XVCM_0jXHGClZzKUY47m41QsmigBWAsg0sBaoXDOUwKB-5mKOaVbXWrp0Dk9vX1pKM5Vww9CB5hkaeYxbgCGShUXjWTkmSNQRCiUIFTViBRthPEn8bKkk8TclBPyNyhkrFsgo-nbeYbtzJUqw2itlC_CMJwbP2YycNLuplaaaUC444wWjknyFnPREuz80F3G0nY3c96MZm2MIKDBhPAbWBmDGIZkCv8hynm53Solh5ALxvMCeTifGB5xTFw3LCnkqm-JKJmhaTeUNVZmZ2cvQKje5iswgTslISZwyiDN47n25UBEcCQCl5pUNrtu3VsHfthrYHwmN4wB-OqMgWFR1DVLT2Umg7KN7x9oaPdv6uzzXHq9Fo1-WuswPpvopGXkVzDRrNsq3gMZFLHD8KBuLHcx55khRMh8d6hevqvcNGxi1ytVAG2kQ56c0ha-mieUSietzSwjUr3N4Kb0DfljDP6XHv-pvsqKzsWHNiEO147db2IjTqR2xghxFcHxhHg2E0GLHdfrWWdXB67J8dkMi2rIPzY0BWB_qmYfERhLmbZHQDOyLwbu5sNl83ejUV3WA3e_BQ9lhR-8oe6PWueycdcHYU4tf6h3vo1M7f9lC3W4bn9pmeFlSxwS1hdUBYNYBW7bIRqa4y0LSula5okJB6X0loeg8fc8UYvFXPIkWPvCjgaG6UGBb32om1fbZh0kXzUGHyranL5sXiRZ9qoCNUWEpKOOAutdBxqeRPlnaX-o0n8HcqaPFccaioLm_AJqouHmTRaGsnaVkCjotDx9QuZhmIJNPexPbmxROvr_iS129NXMjHr1Q8X7Gqul1QAZKjVIrKWje7-DHCU03IAUNXpkQ0Q4mUxe67ydEp1JTKeBMI49X0gXKImoJNa73-QtTqGTT6pvj8-x83eu1V6xAoJAJdNXxtQGgCEeOa0iFEOQCwbNJyf311Mb25QFWTaCYoSpo5lGqlVDWqZb8i5vWiSSapXG45xXYVr6qGad8gKiBTRVo0GTN1bKrgfEI6AmtFU7YSf1PrkMyaZbkODgeG4msl54ouEVXzRsddtQoQUwBdggYl2KDGEJiFVEzpewUV8zHtyKrGtWqgrMeXCRftQjSWGoJClMC1ichJhcY3W3X7gUU7ZP-sko1K2YhcrHJe5yNynhz48f2IhL6TR8T30LXiojbm3mr7b_gcAvkPYKnQ6kemNNaxEKN2qFqFs2N-19huD9tP4Jzug4GkN4HwCijM_SDyme96sGXf3SnoGYDRO_C_KTNXWfcUBXeBN4ZOqXkaz0XTDpT1QjGaTSo5gc39zHlyPUDZ1CemeN0WE7vMcRKkKK_YHvipRg4MskdgoYXsWchRngE8ooncS_MtZIxhoYXs95FDk1AHYYbYxgxsHhyWZ8FhmITAEgsz3I4FkodB5tB3bGb2XtXuUqttaa8hvQ1ZQy9sZitzP5LCLbkQ92CpRUXUoyJ0UvIWFVqFpmbrcwBOn-WXma4qoleM2wzB1C-ibcnJ9BqqAZ7Smu1N287Q59HlAhsWXXGfrtCJPpuuLx1fvytIXDBqbbXeOp2-1TTC77F6JkX2ZVkWdu68WmPMaLpg5kx-NXM2Qz9o0bDfRxUwYVHl9qnKw3flk6bK2J79g8gCLiyycI-syKHZe8naN5t-r8kYLLJMJrbJnhe6B28g-5p6RiuenhUyvbfsPaJ9Lgtde6vw-vZlibunfWdQ4rFszm7pPRMz2Yg3DP0Ea0BZyxq_Z40fh296a85qy5IvIpevGXJMA3LQzzIg6BkQkMDbw4CbJTS9M60iFfWt4uUe7hiKu88xEztghWWmVdB5LMJRFiHo727lf0y_0TaMPe139D6XSy4oVPG30OcPbqOtL_v1SI_E_sJb6MUYsAhFYy7VUmN0vPRmQscKDZ0GGd7Jv8HYkv-iesZ3tqTq_gK2g1qz15tp2L9U7M-GifR5UG3oFHNwwU2zBKDtKd1uaJqh3U3SVkdCowTNXCMq6JlYZhZBS_fReUbY33h8x44Y6fhoo-0aYni3d9RxGvXi1M_jvBdiG4j2HuSAFbndV1S7wbP6fge6FDqHkCCzgUVa1eCIyUgCPwcbrGS0amTfC_w4Crb0zFhNebGKQRDwVWasGNZ2J_-2yOnFMgNFH1jWksCq91GjX_8DnKckB0q3OcdWhY6j1PVS7wicm7mv2fZemv9_vec6cQLOsbxnNQ1e5BBsbQvgraZgt7LTSXtlmtESTqphi9sFB9m7WnJsa3GeZdjeHzC2Y5WGjB62P3Tmzfbk6FjBtuHopVD7-xDvOpELvFrEk16YuSSneyT7EN3_FJogPhNgwaLJamGwFzqx1aIBjmbqmpes4ILZ7XmtuJh_Z_lQcL5QGH6FUs_gTIdGr3iiVuVZ-81JfxYUKu1DokteDIB8aPgFc6ZK0Wd9d9tBm7n97X1wuqGwaOZc7MwH39zVpv4yRZdR799cd_gvz_rBFM85U9284c7-0zv-1KOx3RBjq4XEJCaZR9GScnEsmUmQAaQlM-h9D587EUF3d_pr8Tto6VR9t6XAvt_MewBiSQntPAlInDPU4h-NT5IB6FrqbIWE2gevLAPPI5d0OtkPR6FevK9Qwe8ZokLWC1j2QBU3zROiChra7AOP6fwAR_iD64MPrXc8z3p87Tn5gi4EWvL5Qj-31K0J00-lzL_ASfQsmwkysuITduoGAQlMaX6SnQLLJKYnNa8Ldjryzzal9sg__7TnqCeNKk4_wEAIYXeyOHU9hh0vpMynWZZB6-8msY-DNKCplwbEOTH_KlBpu8CaE36KHYydGDvwG-Bg4uZOyoIg8vKcJCQkQCS01ryYmCf4Us1P1KnRIWnmlX6wz6u62gxCDOtOkHX4tKkXUp0u6dP4z4b-ouLEaHxq1P0LzWMzxA">