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

    <tr>
        <th>Summary</th>
        <td>
            [IRCE] ScalarEvolution.cpp: bool ScalarEvolution::isLoopEntryGuardedByCond(): Assertion `isAvailableAtLoopEntry(LHS, L) && "LHS is not available at Loop Entry"' failed.
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            SCEV,
            crash
      </td>
    </tr>

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

    <tr>
      <th>Reporter</th>
      <td>
          d-makogon
      </td>
    </tr>
</table>

<pre>
    See https://godbolt.org/z/5xqn7TPzP.
The test case fails with an assert in ScalarEvolution while running IRCE pass.

Backtrace:
```cpp
opt: llvm/lib/Analysis/ScalarEvolution.cpp:11334: bool llvm::ScalarEvolution::isLoopEntryGuardedByCond(const llvm::Loop*, llvm::CmpInst::Predicate, const llvm::SCEV*, const llvm::SCEV*): Assertion `isAvailableAtLoopEntry(LHS, L) && "LHS 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: build/RA/bin/opt -S reduced.ll -passes=irce -o /dev/null
 #0 0x00007ff67b297c7c llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) llvm/lib/Support/Unix/Signals.inc:573:0
 #1 0x00007ff67b295a04 llvm::sys::RunSignalHandlers() llvm/lib/Support/Signals.cpp:104:0
 #2 0x00007ff67b296463 SignalHandler(int) llvm/lib/Support/Unix/Signals.inc:397:0
 #3 0x00007ff67a6f8630 __restore_rt sigaction.c:0:0
 #4 0x00007ff679aa0387 raise (/lib64/libc.so.6+0x36387)
 #5 0x00007ff679aa1a78 abort (/lib64/libc.so.6+0x37a78)
 #6 0x00007ff679a991a6 __assert_fail_base (/lib64/libc.so.6+0x2f1a6)
 #7 0x00007ff679a99252 (/lib64/libc.so.6+0x2f252)
 #8 0x00007ff67cc59eb9 (***)
 #9 0x00007ff67c4148d3 isSafeIncreasingBound llvm/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp:746:0
#10 0x00007ff67c4148d3 parseLoopStructure llvm/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp:939:0
#11 0x00007ff67c4148d3 (anonymous namespace)::InductiveRangeCheckElimination::run(llvm::Loop*, llvm::function_ref<void (llvm::Loop*, bool)>) llvm/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp:1934:0
#12 0x00007ff67c417e59 llvm::IRCEPass::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) llvm/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp:1816:0
#13 0x00007ff67d9477ad llvm::detail::PassModel<llvm::Function, llvm::IRCEPass, llvm::PreservedAnalyses, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) llvm/include/llvm/IR/PassManagerInternal.h:89:0
#14 0x00007ff67b444a5e void llvm::PassInstrumentation::runAfterPass<llvm::Function, llvm::detail::PassConcept<llvm::Function, llvm::AnalysisManager<llvm::Function>>>(llvm::detail::PassConcept<llvm::Function, llvm::AnalysisManager<llvm::Function>> const&, llvm::Function const&, llvm::PreservedAnalyses const&) const llvm/include/llvm/IR/PassInstrumentation.h:256:0
#15 0x00007ff67b444a5e llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) llvm/include/llvm/IR/PassManager.h:521:0
#16 0x00007ff67d94278d 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>&) llvm/include/llvm/IR/PassManagerInternal.h:89:0
#17 0x00007ff67b444619 void llvm::PassInstrumentation::runAfterPass<llvm::Function, llvm::detail::PassConcept<llvm::Function, llvm::AnalysisManager<llvm::Function>>>(llvm::detail::PassConcept<llvm::Function, llvm::AnalysisManager<llvm::Function>> const&, llvm::Function const&, llvm::PreservedAnalyses const&) const llvm/include/llvm/IR/PassInstrumentation.h:256:0
#18 0x00007ff67b444619 llvm::ModuleToFunctionPassAdaptor::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) llvm/lib/IR/PassManager.cpp:125:0
#19 0x00007ff67d946a6d llvm::detail::PassModel<llvm::Module, llvm::ModuleToFunctionPassAdaptor, llvm::PreservedAnalyses, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) llvm/include/llvm/IR/PassManagerInternal.h:89:0
#20 0x00007ff67b442efd void llvm::PassInstrumentation::runAfterPass<llvm::Module, llvm::detail::PassConcept<llvm::Module, llvm::AnalysisManager<llvm::Module>>>(llvm::detail::PassConcept<llvm::Module, llvm::AnalysisManager<llvm::Module>> const&, llvm::Module const&, llvm::PreservedAnalyses const&) const llvm/include/llvm/IR/PassInstrumentation.h:257:0
#21 0x00007ff67b442efd llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) llvm/include/llvm/IR/PassManager.h:521:0
#22 0x00000000004256c7 llvm::SmallPtrSetImplBase::~SmallPtrSetImplBase() llvm/include/llvm/ADT/SmallPtrSet.h:86:0
#23 0x00000000004256c7 llvm::SmallPtrSetImpl<llvm::AnalysisKey*>::~SmallPtrSetImpl() llvm/include/llvm/ADT/SmallPtrSet.h:349:0
#24 0x00000000004256c7 llvm::SmallPtrSet<llvm::AnalysisKey*, 2u>::~SmallPtrSet() llvm/include/llvm/ADT/SmallPtrSet.h:455:0
#25 0x00000000004256c7 llvm::PreservedAnalyses::~PreservedAnalyses() llvm/include/llvm/IR/PassManager.h:152:0
#26 0x00000000004256c7 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) llvm/tools/opt/NewPMDriver.cpp:506:0
#27 0x0000000000419862 main llvm/tools/opt/opt.cpp:807:0
#28 0x00007ff679a8c555 __libc_start_main (/lib64/libc.so.6+0x22555)
#29 0x0000000000419ad7 _start (build/RA/bin/opt+0x419ad7)
```

Seems like guilty change is 20d798bd47ec. Reverting it resolves the crash.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJztWVtz6rYW_jXwognj--WBB0LIaabZLRNy-srIljDqFpKPJLM3_fVdsiFg45Br2zltGWNje62lT-vySUiZJLvxglK0NqbUA38y8G7hKCTJJDcjqQq4-w2-4ff_ifhx_tt8NHBuBs7kcU2RodqgHGuKVphxjb4xs0ZYIKw1VQYxgRY55ljNtpJXhkmBvq0Zp0hVQjBRoLuH6QyVIL232Zyvcf7VKJxTi6Z5HjnNkZdl80SWBt4izrcbwMZZBueJwHynmYafnWZHVs-fuK7vB1Ytk5I3utCCP-lINw-ZvpeynAmjdv-psCKUXO-mUpCBl-RSQL-P-lZw4IHnpicPp5vyDsSam7mihOXYUCvTVV9MZ7_s1Z99lVrYk9qt1o3gCqYnW3A6zjidmCeogO7-h4U1dQ9KaOBFcMDFg6eIaSSkQfigh7BBVhPtVb2BF9eRpGQfkPn9bLKYIV1lGwaKKKsKpGgpIbhGdlMGgl9lo1zWEdkHBi5XpZK_0tzALdO6ojY-kCQE0iPnFYEsgkzKFdZrlB0iv29-YeABItWmfEoFZ4Tqz1zJQuENwqqoNlQYXce1YhwCdPtgIWVMwBkSBV0tADSpcugW5-jKJhyg8G-Yyim6kuCeW0K3cBYV500z8Mx3kPPdgU-8WkVx5qVxHucnsdE7fQguE6aG-lhnrZcchRT-tpTaKIo3dSym0GtjI9PK3EVVWp_Cr_8K9t0-YAUksx6Bi8BIGPtwdo7I3A6yEDtBH7KHSjSWfgB_c6rA9cmFxg-t7qvFCdqtep1WoyDyUcs-mH9H9_w0bjfknzaEo1USQSyWSwVsIxVdQvJpVuC8qexataUenKqnGDt-EiOFGdBU3X-LKgqaaz7ScgRxuXa--xHI2Up7MhR2DLk4ThDObPZfNBSDXMtQ1DaUpi6OoEMNTS5txS0z_AI8bwVKLatx16oXei-YAImWieTURJ6HKc3SxsTkcJxIpy3pwA0S4gOpLPCK3okcclwDqV_LCmq7FX8oC6FXUm2O1Aw_7gSUpGFb-oBFQadrmn-dcbZhAp9QdhxEx-DazHf6MJRYaWqZbGEU2KwU_TQAqZ-2Abh9AMBlWEix28gKOBZvqC5rJkibOrzc0p4pKtFijt5BZVWJOu2hFlYDf7qVjKDntOwgVyOYnRXkB_zhpn7QdojXcUhMw_QEsh3j55Dp_b283XdoT47HF4fB_AsWuABm8ac9SrZr0af2LnE7-dbiIpIGcYzJCUxCDVTvfhyAXn6RhPJ-sK3uPXml9RSmCcAIW0qa3lP9Pp_Y44939n74Pg72dw9wqp3QmLkThiqwPFqDmaRTRi2SzoIgwCFFdT6fuANs2TmUqkf4dq1MVmC8yasXnd0NEkzjcmonkC9qvsXjs5av_4w2m-niWTQPQs-8PkuyE7n0dAZ6KcSdsNQh9sJO7YR9MW6H92In_5-Tv_ZI6Lltj0QdNvHi5DPY5A_z5D-VneJu5kZu-i87_b3YKemL8REI1F7F6aM84LV2JwSX8BekP38bhTdl716lfxpzxij7KYoXtvuRdjglwtHbOOUAfPrK3n8WKRx7_xwlfJ5LP0QHntNJFY-uyMfpoM_vrynMPr3X-_ntRPCR9p6p8kbkz6eAuB1Xty-uLw-rHwvAX5zovRMT7_AnrvkEQJZ5fLoOucGcz41aUHO3Kfk11rR5MYhnfe9ay0xnkCY3j_af2VGvKbo2P3v-myC1fHPw2490Z_8MH7x-DvZdQP2gQw_Bq5FeQgmR96pnsL4LZxC2RwovvIzznMoPSHpI_iKe3pxzQ68NJ7oMB2rEmpizknIm2suqC6OYKB7oqo9WzsroEauCmi84X9d2Jn1v71mmsNrdiZVsEqMrJSX_uTJlZW4Z7zHyodfPdGeiFN491Cs9fbLd-XmveO1CXhVMnMnL0iyNXSSq7xp4PzK7w_G81C9UsRWj6iDXLDK99vqUMdagblbn4fwT_Tb_cqPY9mmSEzodMojbueKmSeShDWai3yKc95YSp8P5SXvVNMnDMETLpV0pXWqDlVnWZi-uo3qg87Qyao2mXXiYxKgxZy3170vUthrZo7HDTtfphtiC0o1GnH2lqABLZofytV3Eshs6nkPiNMlIENN8hB7o1u4QiQIxg6BoJd_C8Pm0wTIa0rEbReCTJHLiIRn7JPVTPDTMcDoehNd2WWoQ3nS37fa-bPbN3rpb9hdsXg0rxcfv350Kk9T1huux42b-ipCIkDR1KaWBZakgo4TiVRyQdAhAKNfWcdB-s1fnWfhwqf1tb8ObIRt7jue5ruvYrxOPaL6ieey7EU5dJ47IIHAoZB0fWUR2z3WoxjW4rCo0vORMG318CSXNCkHriFn7uDJrqcbkaoO_ykKKYd2Tcd2N3wF_qTFi">