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

    <tr>
        <th>Summary</th>
        <td>
            [LoopUnroll] Assertion `isAvailableAtLoopEntry(RHS, L) && "RHS is not available at Loop Entry"' 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>
    https://godbolt.org/z/48Kdo9EY1

Run opt -passes='loop-unroll<runtime>' -S on test:
```
target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-ni:1-p2:32:8:8:32-ni:2"
target triple = "aarch64-none-linux-gnu"

declare void @llvm.experimental.deoptimize.isVoid(...)

define void @hoge() {
bb:
  br label %bb1

bb1:                                              ; preds = %bb25, %bb
  %tmp = phi i64 [ %tmp26, %bb25 ], [ 4, %bb ]
  br label %bb2

bb2:                                              ; preds = %bb9, %bb1
  %tmp3 = phi i64 [ 1, %bb1 ], [ %tmp4, %bb9 ]
  %tmp4 = add nuw nsw i64 %tmp3, 1
  %tmp5 = freeze i32 undef
  %tmp6 = icmp ule i64 %tmp, undef
  %tmp7 = icmp ugt i32 %tmp5, 2
  %tmp8 = and i1 %tmp7, %tmp6
  br i1 %tmp8, label %bb9, label %bb27

bb9:                                              ; preds = %bb2
  %tmp10 = icmp ult i64 %tmp4, %tmp
  br i1 %tmp10, label %bb2, label %bb11

bb11:                                             ; preds = %bb9
  %tmp12 = icmp ugt i32 %tmp5, 27
  br i1 %tmp12, label %bb14, label %bb13

bb13:                                             ; preds = %bb11
  unreachable

bb14:                                             ; preds = %bb11
  %tmp15 = sub i32 %tmp5, undef
  %tmp16 = mul nuw nsw i32 undef, %tmp15
  %tmp17 = call i32 @llvm.umin.i32(i32 %tmp16, i32 76)
  %tmp18 = call i32 @llvm.umax.i32(i32 %tmp17, i32 3)
  %tmp19 = add nsw i32 %tmp18, -1
  br label %bb28

bb20:                                             ; preds = %bb33, %bb20
  %tmp21 = phi i64 [ undef, %bb33 ], [ %tmp22, %bb20 ]
  %tmp22 = add nsw i64 %tmp21, -1
  %tmp23 = trunc i64 %tmp22 to i32
  %tmp24 = icmp ult i32 %tmp23, 3
  br i1 %tmp24, label %bb25, label %bb20

bb25:                                             ; preds = %bb20
  %tmp26 = add nuw nsw i64 %tmp, 1
  br label %bb1

bb27:                                             ; preds = %bb2
  call void (...) @llvm.experimental.deoptimize.isVoid(i32 12) [ "deopt"() ]
  ret void

bb28:                                             ; preds = %bb28, %bb14
  %tmp29 = phi i64 [ %tmp30, %bb28 ], [ 75, %bb14 ]
  %tmp30 = add nsw i64 %tmp29, -1
  %tmp31 = trunc i64 %tmp30 to i32
  %tmp32 = icmp ult i32 %tmp19, %tmp31
  br i1 %tmp32, label %bb28, label %bb33

bb33:                                             ; preds = %bb28
  br label %bb20
}

; Function Attrs: nocallback nofree nosync nounwind readnone speculatable willreturn
declare i32 @llvm.umin.i32(i32, i32) #2

; Function Attrs: nocallback nofree nosync nounwind readnone speculatable willreturn
declare i32 @llvm.umax.i32(i32, i32) #2

```

Failure:
```
opt: /root/llvm-project/llvm/lib/Analysis/ScalarEvolution.cpp:11043: bool llvm::ScalarEvolution::isLoopEntryGuardedByCond(const llvm::Loop*, llvm::CmpInst::Predicate, const llvm::SCEV*, const llvm::SCEV*): Assertion `isAvailableAtLoopEntry(RHS, L) && "RHS is not available at Loop Entry"' 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-unroll<runtime> -S <source>
 #0 0x000055db9657bccf PrintStackTraceSignalHandler(void*) Signals.cpp:0:0
 #1 0x000055db965796fc SignalHandler(int) Signals.cpp:0:0
 #2 0x00007fd5ba9133c0 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x143c0)
 #3 0x00007fd5ba3e003b raise (/lib/x86_64-linux-gnu/libc.so.6+0x4303b)
 #4 0x00007fd5ba3bf859 abort (/lib/x86_64-linux-gnu/libc.so.6+0x22859)
 #5 0x00007fd5ba3bf729 (/lib/x86_64-linux-gnu/libc.so.6+0x22729)
 #6 0x00007fd5ba3d1006 (/lib/x86_64-linux-gnu/libc.so.6+0x34006)
 #7 0x000055db954c147a llvm::ScalarEvolution::isLoopEntryGuardedByCond(llvm::Loop const*, llvm::CmpInst::Predicate, llvm::SCEV const*, llvm::SCEV const*) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x24c147a)
 #8 0x000055db954e0649 llvm::ScalarEvolution::howManyGreaterThans(llvm::SCEV const*, llvm::SCEV const*, llvm::Loop const*, bool, bool, bool) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x24e0649)
 #9 0x000055db954b3234 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+0x24b3234)
#10 0x000055db954d8cef llvm::ScalarEvolution::computeExitLimitFromICmp(llvm::Loop const*, llvm::ICmpInst*, bool, bool, bool) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x24d8cef)
#11 0x000055db954b374f llvm::ScalarEvolution::computeExitLimitFromCondImpl(llvm::ScalarEvolution::ExitLimitCache&, llvm::Loop const*, llvm::Value*, bool, bool, bool) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x24b374f)
#12 0x000055db954b3a23 llvm::ScalarEvolution::computeExitLimitFromCondCached(llvm::ScalarEvolution::ExitLimitCache&, llvm::Loop const*, llvm::Value*, bool, bool, bool) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x24b3a23)
#13 0x000055db954b3b79 llvm::ScalarEvolution::computeExitLimitFromCond(llvm::Loop const*, llvm::Value*, bool, bool, bool) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x24b3b79)
#14 0x000055db954b3ed5 llvm::ScalarEvolution::computeExitLimit(llvm::Loop const*, llvm::BasicBlock*, bool) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x24b3ed5)
#15 0x000055db954b42d4 llvm::ScalarEvolution::computeBackedgeTakenCount(llvm::Loop const*, bool) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x24b42d4)
#16 0x000055db954b4c03 llvm::ScalarEvolution::getBackedgeTakenInfo(llvm::Loop const*) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x24b4c03)
#17 0x000055db954b51ec llvm::ScalarEvolution::getSmallConstantTripCount(llvm::Loop const*, llvm::BasicBlock const*) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x24b51ec)
#18 0x000055db96342f97 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
#19 0x000055db9634579c llvm::LoopUnrollPass::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x334579c)
#20 0x000055db968a3b41 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+0x38a3b41)
#21 0x000055db95cf782a llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x2cf782a)
#22 0x000055db94077881 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+0x1077881)
#23 0x000055db95cf723a llvm::ModuleToFunctionPassAdaptor::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x2cf723a)
#24 0x000055db940781e1 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+0x10781e1)
#25 0x000055db95cf5b64 llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x2cf5b64)
#26 0x000055db93cb2ada 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) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0xcb2ada)
#27 0x000055db93bef973 main (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0xbef973)
#28 0x00007fd5ba3c10b3 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x240b3)
#29 0x000055db93ca61fa _start (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0xca61fa)
Compiler returned: 139
```
Our triage points at the following guilty patch:
```
commit 20d798bd47ec5191de1b2a8a031da06a04e612e1
Author: Florian Hahn <flo@fhahn.com>
Date: Thu Jun 9 15:20:10 2022 +0100

Recommit "[SCEV] Look through single value PHIs." (take 3)

This reverts commit 1fbdbb559569641f6d509b569966901c8fb02b63.

All known issues surfaced by this patch should have been fixed now.

The fixes included fixing issues with SCEV expansion in LV and DA's
reliance on LCSSA phis.
```
Looks like the problem reported in https://github.com/llvm/llvm-project/issues/56044 wasn't fixed completely.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzlW19z4ygS_zTOC2WXBJIsPeTBcZKducvWpia5qbqnFJKwzQVLWoTyZz79NSDbQpYTZ8czu7c3lTgWNE33r5umGzRpmb-er5Sq6hGZjfA1_CzLPC2FmpRyCU_f4DeI_5mXydW__ZF3OfJm9vNLU6CyUmhc0bpmMPxyhKeiLKtxU8hSiBGZy6ZQfM1G5Aq60PgOlQVSrFZ6Kssp8tof86ioXDKFcqqooK9loxBwRSOM2XgNY9iYx_BH_xI85n4EX8yHfooC-BIF0Iw1AXyOC4Jt25154rp5XGEzoOXT8jJ9GCZy5FCSV4JtZKBUZitgVpQFGwteNC_jZdFsx9jPnGWCSoaeSp6jUeAJ8bSesJeKScChALUmOQPQ-Jp_YxNefwWyEY4nk8kIJy6fBS92bFblkgEdEKHR9MKSpOkWRoRSiQRNmQBBwzR17KQfCZB85N-IXKBKsrxulQeeOBzhuf26mRQe1LoyJNWKIzABGoUXbTOOtvQ4hPZL8wjdwbbdtA4qgF0F8CkUSLbz-q4CZE8Df0faldyS7-RPugq0nYYXzXNUNM-oqJ8tTzuPHtibOzT0C8nYN4Y4wagpwPQuTWRoeAZQN-COO4aa3wD9tEO_VIZrO5kegF3i2Apc5Ij7m_Gtgnrqjnm2_bHu7xgr6T3jqWu95CTu54rte11QVAeUYCf9kPC-15e29-z3F8-HV8-g77nS47dNNB2UfE_SoN9AeqKTE4jubz0Wwjqj2YqmgvXmCU46T6uuXRp1k_bhGXB5366RdSN26267mLb-4Ie9UXalZFQIO0cbr5s1LybQABF3N7Vv4pl-nkbbYL3lFB_iRF_2OU03nMg-o2QXQFolNjPoQWP_QLyMewHTO4FFCNlFcM8VE_t7MbOLtR67Hzgx7vDbD50Yu6pvVzT2XdXbVhu2FeQYWZcYI1Vq3HrUQS9ebIHFRksytOJwf4HZPbDb4PVwD0-A-x7Y0RubirOnvJkFQFQ5gWybqYyr2_Rkk78cn-9o9HU4S1rvwIZIp1JtjrPzDQl5mJ6mp0t8Cl3i3TYf9CBPDmQ1xNv5cNx18WnYYbbv3MQ75NzJkHMTf9C5gcuQcxN8yLn9ZBf9iD_k46S_q-D-9k56uwo5xa6yCVh7gWyzoKaX3Vk1h2vAQnGoIGZKSV2toKLUXpjS7BG-6hwK_tSvgFhRNsUzh5wGNqxc5-uorljWCKgrYPNCz1wI8KtGFm7SfngPaAO28U1M8J8tWndTeUs0t7qyn9eUi0ayQyWYXocgPxR9sixhSV7rKceVLP_Dss2j_sNT-JwVVLzWvIavd6AvlVdPpWg0EpOsqnS55XuBcZe0LAUyY2FeMutR20Ze30D1eFUo-fpLQ2XO8ovXeVnogJGVRa064zXhCM-Mp24b5-vqc2GLSzK7BX_jGVVM0_SH382vvrbDD3aZrHUGla00lgWAeD17AvC0nWZqKypI9-XTnWZ1Y20A2UGkYxq0Il6DwRWim3GIKqRHonYo1nXxAjpZPrH4395cze6udNqz5jAQpc0SXKUqpdJLv1eoc7Vq0klWrjuGcc3F67ph2j42xS8y0eQMqRVDmaT1CmkPVZJmrJ3-TmmXzZt1tXUQD7qSW1kuJV0jKIwbHdjr1klM2L4GCSrQQY4h8otSMqnbBC2WY7oBsB7rYPYIHSkv7EA0LjULCp4Cz42qGjWp9SnB7kTh0HGCpoKGumxkZo4XbDCBBeAh78WDf2GYp0kUTtMsW6BbyQtlVLvXut7xJTjuJ0BEaFFjs78YmyPbVbfu65nfLW-_xzuJFhnqM4OZ3mWEW0bTRR6mNPEJyTz08CBZrQC9B7C12QjbVfYSRw9R0D1y0B2VWukQMqnLCexJF96LHwCXXUIJ0xBnGsI8j6RIUl6zI_hnmnNkOAcEBjqcA5dzuojDBNG0PEryDmeMYaDDOexznppF9SGeU-zyjFyeue950cd4kgCGODynXV8Ig8wPpvQ7Apwb2mxU-kCAc-PXgeG9rg2s37OELeBWewee2IWHeVGQvAfPqnz-lRavv4BbKybvV7SoHWSOV22O3sBTb0X7f0-IhlHWQSNx0UiJXkHvoKFFaBS7euHqBtJnBfvx-vNcJ_x_hrP8QLgMGrvjTwizngtXHmds8aPh-rzB6yc5iVHK0drvO8k0-ENa64jyeV0Jd-0Mjd4Om9NsxUb2xPYotL5S0bCfBZVBwoEK96GimPxRqIzu-d8ILIqJAxbpg5VO3w3Fh8A6djX9ZJVBI0floK8yy8OPqnysqhe05tmFKLNHR9-T6gfiO_qFPf0CnB-7n1xAEszyJbunj6yYQzH6jqKn10YL62gT9bXJvHdX85IpR5PPxaJ8S5GTKgDyOQr0csE09Fl2hAJ3ayrEXItIC3UveXWEOYb87gepqbVw1HRyuogEeJFMEeSy9-W_TIVmi_Ke9HtyX5ZrXlCoc-4lGw6j1pb9fKQHYn_gvbmyhfKuqBelXGseG1x6lFDTQ3mrmQxH8t_scSXVFF_YmsrHKwgHSqPXozToX0v2e8OK7HVQbKibF2CCu2YNjLokm2hoysX9IOmKU0IpCeVuU9RQVbLcDNJ36t9JZyb7C_fv6ZGYwxPrbbfgw_vVtfbTpOenUKhnPRfbsbBtsAYcz90c6O07T3viBYUKXYJLkPnAIC1qdMLFSKwO3cWI3XOOGCrlwO_ImTNFuWh9ECb4tcyZGJZ2b_11wOn5MgNBn1huQWD1H4NG__wPYG4hdTB3M_RsMY1xt-Y3OL8l498YLmzRcOBysvTAm07j-BQu-sNg_v91dt8ax7Ee6Ts7Jl1nB2s1gt2XG5m0VWY5rWBjH9bYDviQvu2QH-GroIyjbdDz1dhnH_PVjXrzIzE6lbPtMDrkan8d4H2LqwN82HOzMI2CIxb7ENx_F5iwRcGByamRSJZimndXI_DRSN3yigleMPc0Q0leLL_YlzPe1dfm0b9CZmz4zIZ6b3gq22zWHjT1qSCv-83c51xzMcDku7oPqDOTkr7q1q6BdrT98D5IbiAUzZIXe_Rgmwdl0lWToxrx_sn1gchhqq9M8gVnckM3fBDyww5GrJM4XuQUqiRlUMARtKa8ONWclqUzZ-xevmS-lxL08KDvVx6g8pXqoSPAsVc8ATBxZknc9UEjf0GR5X8yPA3T7azzlhOy1_UsB4sjn2xkcm_Vf2ukfpsYIgiqSqhman0RrG9hF5Bpl8_gpGjZcKFeUUVVttL-M8QGpNe3wtjLp0mc5sGUZaGf-DnzwdYx9YifUy-iXsAiH7P2fY9Zo1ZmU0bXoDGnBfpEV4W-Pl2IchR4ixU8mkvkzT3qpb4oAPr7VYP-0RQoQb5-r8m8VOZ7ML1-VQsg8T3nzYIvrJVP32uHF-YmPbzUJdsj6CrLZrlCNagqGHrS54Po9tPnejIyzGJFH1nnfTj7eb_iNeD7BIapUcvcX6R5moZhEkZJFPiLKA-9JIWHJIoSz8_iRerhNCKTLqOZEOixKJ8LZC_EUd3IBc2gtExfQTaYxeCO6lXZiByt6BNDKWMFWvAXIIKRE1cuZnrqzY16rh-1FVv2z1ytkLlCAT-jUMaWMHOBbr6aa_hLcNlpbVlJCNi0yJh-Nf5mfnc30y8d1ZNB82skayT4o73Br2SZCrZuXw8wZfJ3vCAQRl4QoGdag89PVau4Xi6CKSZeJ2f5OckTktAzxZVg52DhXbGo7fwz35U4a6To_6-FD-mKY3y2OveDPAbv8X2apRA8iD_1vTzBNEtClnthcGbeTKq1rqDhGT_Xru9FOPESArFmEi9g6cHgLMaY5RBsA49BNBMTPbH-_xNn8tzIkDbLWr--w2tV7zoh5OjzDbbhT81KPV_Tl_HvDf1GizMj8bkR97-P9KnV">