<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/60850>60850</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[opt/Vectorize] Crash when bootstrapping compiler-rt with assertion enabled on llvm main
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
koachan
</td>
</tr>
</table>
<pre>
When bootstrapping compiler-rt of LLVM main, I stumbled into what appears to be an optimizer-related crash.
Reduced LLVM IR reproducer code from bugpoint:
```
; ModuleID = 'bugpoint-reduced-simplified.bc'
source_filename = "/home/k/llvm-debug/src/llvm-project/compiler-rt/lib/xray/xray_init.cpp"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
define hidden void @__xray_init() #0 {
entry:
br label %for.body
for.body: ; preds = %for.body, %entry
%I.035 = phi i64 [ %inc18, %for.body ], [ 0, %entry ]
%LastFnAddr.034 = phi i64 [ %add.i, %for.body ], [ 0, %entry ]
%add.i = add i64 poison, poison
%inc18 = add nuw i64 %I.035, 1
%exitcond.not = icmp eq i64 %inc18, poison
br i1 %exitcond.not, label %if.end19.loopexit, label %for.body
if.end19.loopexit: ; preds = %for.body
unreachable
}
attributes #0 = { "tune-cpu"="generic" }
!llvm.ident = !{!0}
!0 = !{!"clang version 17.0.0 (ssh://git@github.com/llvm/llvm-project e49b93ef29a6559b5c2c9d51b5bcd299ca7cb91e)"}
```
When optimized with `opt reproduce.ll -p=loop-vectorize -disable-output` it crashes with the following message:
```
/usr/include/c++/12.2.1/bits/stl_algo.h:4851:
In function:
void std::sort(_RAIter, _RAIter, _Compare) [with _RAIter =
llvm::VPRecipeBase**; _Compare =
sinkRecurrenceUsersAfterPrevious(llvm::VPFirstOrderRecurrencePHIRecipe*,
llvm::VPRecipeBase*, llvm::VPDominatorTree&)::<lambda(const
llvm::VPRecipeBase*, const llvm::VPRecipeBase*)>]
Error: comparison doesn't meet irreflexive requirements, assert(!(a < a)).
Objects involved in the operation:
instance "functor" @ 0x7fff9d173758 {
}
iterator::value_type "ordered type" {
}
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0. Program arguments: /home/k/llvm-debug/src/llvm-project/out/bin/opt bugpoint-reduced-simplified.ll -p=loop-vectorize -disable-output
#0 0x00007effedda3247 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /home/k/llvm-debug/src/llvm-project/llvm/lib/Support/Unix/Signals.inc:567:22
#1 0x00007effedda356a PrintStackTraceSignalHandler(void*) /home/k/llvm-debug/src/llvm-project/llvm/lib/Support/Unix/Signals.inc:641:1
#2 0x00007effedda2117 llvm::sys::RunSignalHandlers() /home/k/llvm-debug/src/llvm-project/llvm/lib/Support/Signals.cpp:104:20
#3 0x00007effedda25e1 SignalHandler(int) /home/k/llvm-debug/src/llvm-project/llvm/lib/Support/Unix/Signals.inc:402:31
#4 0x00007effed651f50 (/usr/lib/libc.so.6+0x38f50)
#5 0x00007effed6a08ec (/usr/lib/libc.so.6+0x878ec)
#6 0x00007effed651ea8 raise (/usr/lib/libc.so.6+0x38ea8)
#7 0x00007effed63b53d abort (/usr/lib/libc.so.6+0x2253d)
#8 0x00007effed89d260 std::__throw_bad_exception() /usr/src/debug/gcc/gcc/libstdc++-v3/src/c++11/functexcept.cc:50:3
#9 0x00007efff17c00e6 void llvm::sort<llvm::VPRecipeBase**, sinkRecurrenceUsersAfterPrevious(llvm::VPFirstOrderRecurrencePHIRecipe*, llvm::VPRecipeBase*, llvm::DominatorTreeBase<llvm::VPBlockBase, false>&)::'lambda0'(llvm::VPRecipeBase const*, llvm::VPRecipeBase const*)>(llvm::VPRecipeBase**, llvm::VPRecipeBase**, sinkRecurrenceUsersAfterPrevious(llvm::VPFirstOrderRecurrencePHIRecipe*, llvm::VPRecipeBase*, llvm::DominatorTreeBase<llvm::VPBlockBase, false>&)::'lambda0'(llvm::VPRecipeBase const*, llvm::VPRecipeBase const*)) /home/k/llvm-debug/src/llvm-project/llvm/include/llvm/ADT/STLExtras.h:1701:13
#10 0x00007efff17c0106 void llvm::sort<llvm::VPRecipeBase**, sinkRecurrenceUsersAfterPrevious(llvm::VPFirstOrderRecurrencePHIRecipe*, llvm::VPRecipeBase*, llvm::DominatorTreeBase<llvm::VPBlockBase, false>&)::'lambda0'(llvm::VPRecipeBase const*, llvm::VPRecipeBase const*)>(llvm::VPRecipeBase**, llvm::VPRecipeBase**, sinkRecurrenceUsersAfterPrevious(llvm::VPFirstOrderRecurrencePHIRecipe*, llvm::VPRecipeBase*, llvm::DominatorTreeBase<llvm::VPBlockBase, false>&)::'lambda0'(llvm::VPRecipeBase const*, llvm::VPRecipeBase const*)) /home/k/llvm-debug/src/llvm-project/llvm/include/llvm/ADT/STLExtras.h:1706:1
#11 0x00007efff17c0133 void llvm::sort<llvm::SmallVector<llvm::VPRecipeBase*, 6u>&, sinkRecurrenceUsersAfterPrevious(llvm::VPFirstOrderRecurrencePHIRecipe*, llvm::VPRecipeBase*, llvm::DominatorTreeBase<llvm::VPBlockBase, false>&)::'lambda0'(llvm::VPRecipeBase const*, llvm::VPRecipeBase const*)>(llvm::SmallVector<llvm::VPRecipeBase*, 6u>&, sinkRecurrenceUsersAfterPrevious(llvm::VPFirstOrderRecurrencePHIRecipe*, llvm::VPRecipeBase*, llvm::DominatorTreeBase<llvm::VPBlockBase, false>&)::'lambda0'(llvm::VPRecipeBase const*, llvm::VPRecipeBase const*)) /home/k/llvm-debug/src/llvm-project/llvm/include/llvm/ADT/STLExtras.h:1711:1
#12 0x00007efff17c138f llvm::SmallVectorTemplateCommon<llvm::VPRecipeBase*, void>::begin() /home/k/llvm-debug/src/llvm-project/llvm/include/llvm/ADT/SmallVector.h:270:45
#13 0x00007efff17c138f sinkRecurrenceUsersAfterPrevious(llvm::VPFirstOrderRecurrencePHIRecipe*, llvm::VPRecipeBase*, llvm::DominatorTreeBase<llvm::VPBlockBase, false>&) /home/k/llvm-debug/src/llvm-project/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp:619:38
#14 0x00007efff17c16bc llvm::VPRecipeBase::getParent() /home/k/llvm-debug/src/llvm-project/llvm/lib/Transforms/Vectorize/VPlan.h:683:38
#15 0x00007efff17c16bc llvm::VPlanTransforms::adjustFixedOrderRecurrences(llvm::VPlan&, llvm::VPBuilder&) /home/k/llvm-debug/src/llvm-project/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp:702:52
#16 0x00007efff16a666c llvm::LoopVectorizationPlanner::buildVPlanWithVPRecipes(llvm::VFRange&, llvm::SmallPtrSetImpl<llvm::Instruction*>&) /home/k/llvm-debug/src/llvm-project/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp:9056:25
#17 0x00007efff16a6bd4 llvm::LoopVectorizationPlanner::buildVPlansWithVPRecipes(llvm::ElementCount, llvm::ElementCount) /home/k/llvm-debug/src/llvm-project/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp:8761:21
#18 0x00007efff16a7384 llvm::LoopVectorizationPlanner::plan(llvm::ElementCount, unsigned int) /home/k/llvm-debug/src/llvm-project/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp:7599:27
#19 0x00007efff16b07cf llvm::LoopVectorizePass::processLoop(llvm::Loop*) /home/k/llvm-debug/src/llvm-project/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp:10275:57
#20 0x00007efff16b1d29 llvm::LoopVectorizePass::runImpl(llvm::Function&, llvm::ScalarEvolution&, llvm::LoopInfo&, llvm::TargetTransformInfo&, llvm::DominatorTree&, llvm::BlockFrequencyInfo&, llvm::TargetLibraryInfo*, llvm::DemandedBits&, llvm::AssumptionCache&, llvm::LoopAccessInfoManager&, llvm::OptimizationRemarkEmitter&, llvm::ProfileSummaryInfo*) /home/k/llvm-debug/src/llvm-project/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp:10589:27
#21 0x00007efff16b1ed9 llvm::LoopVectorizePass::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) /home/k/llvm-debug/src/llvm-project/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp:10620:16
#22 0x00007efff22b2c79 llvm::detail::PassModel<llvm::Function, llvm::LoopVectorizePass, llvm::PreservedAnalyses, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) /home/k/llvm-debug/src/llvm-project/llvm/include/llvm/IR/PassManagerInternal.h:90:3
#23 0x00007effee2cea9c llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) /home/k/llvm-debug/src/llvm-project/llvm/include/llvm/IR/PassManager.h:521:32
#24 0x00007efff6ad96bb 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>&) /home/k/llvm-debug/src/llvm-project/llvm/include/llvm/IR/PassManagerInternal.h:90:3
#25 0x00007effee2c05bc llvm::ModuleToFunctionPassAdaptor::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) /home/k/llvm-debug/src/llvm-project/llvm/lib/IR/PassManager.cpp:125:22
#26 0x00007efff6ad9e59 llvm::detail::PassModel<llvm::Module, llvm::ModuleToFunctionPassAdaptor, llvm::PreservedAnalyses, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) /home/k/llvm-debug/src/llvm-project/llvm/include/llvm/IR/PassManagerInternal.h:90:3
#27 0x00007effee2cd9fc llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) /home/k/llvm-debug/src/llvm-project/llvm/include/llvm/IR/PassManager.h:521:32
#28 0x000055c438f611bb llvm::SmallPtrSetImpl<llvm::AnalysisKey*>::~SmallPtrSetImpl() /home/k/llvm-debug/src/llvm-project/llvm/include/llvm/ADT/SmallPtrSet.h:344:7
#29 0x000055c438f611bb llvm::SmallPtrSet<llvm::AnalysisKey*, 2u>::~SmallPtrSet() /home/k/llvm-debug/src/llvm-project/llvm/include/llvm/ADT/SmallPtrSet.h:450:7
#30 0x000055c438f611bb llvm::PreservedAnalyses::~PreservedAnalyses() /home/k/llvm-debug/src/llvm-project/llvm/include/llvm/IR/PassManager.h:152:7
#31 0x000055c438f611bb llvm::runPassPipeline(llvm::StringRef, llvm::Module&, llvm::TargetMachine*, llvm::TargetLibraryInfoImpl*, llvm::ToolOutputFile*, llvm::ToolOutputFile*, llvm::ToolOutputFile*, llvm::StringRef, llvm::ArrayRef<llvm::PassPlugin>, llvm::opt_tool::OutputKind, llvm::opt_tool::VerifierKind, bool, bool, bool, bool, bool, bool) /home/k/llvm-debug/src/llvm-project/llvm/tools/opt/NewPMDriver.cpp:522:10
#32 0x000055c438f72d8a main /home/k/llvm-debug/src/llvm-project/llvm/tools/opt/opt.cpp:725:16
#33 0x00007effed63c790 (/usr/lib/libc.so.6+0x23790)
#34 0x00007effed63c84a __libc_start_main (/usr/lib/libc.so.6+0x2384a)
#35 0x000055c438f5bec5 _start (/home/k/llvm-debug/src/llvm-project/out/bin/opt+0x1cec5)
```
As far as I can tell, seems like this is because the sort in [VPlanTransforms.cpp:L615](https://github.com/llvm/llvm-project/blob/a8831631c7ec74f91c12963e45b062c3366dd10d/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp#L615) uses the `properlyDominate` function as the comparator, which returns true when `A == B`, which then trips up the assert in STL?
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsW1lz4yzW_jXkhrJLQtZ2kQvHiWtSk_7eVJLpuXQhOLKZSKAXUJa5-H77FEhepDhLd6d7luqulFsW8HDOcxYOEqbGiLUEOEXxGYrPT2hrN0qf3ivKNlSeFIo_n_59AxIXSlljNW0aIdeYqboRFeiJtliV-Orq6xdcUyERWeBLbGxbFxVwLKRV-HFDLaZNA1QbbBUuAFOJVWNFLf7pIKCiFjhmmprNFAXnKJh3nzfAWwa8g7-8wRoardwtjZnigEutaly060YJaVHUj0JJ0P91X6Mz_EXxtoLLc4yic4xIuh0z0d0MEyPqphKlAD4tGCJpN9SoVjNYlaICSWvoRxNElhtVAyLLe0SWVfVQTzgU7RqRpdFse6vR6h_ALCLLA7JcoygQWT5p-tz_txJS2ClrGgft57VUr8FiTi2t6LNq7XZmmNQomsOkIWmAonlE_If7Gg6_uqtk5j8mYntRZm5QSLKJzNxFsh2TzCa3IcnG81stmmqn9VOWrJLZpJX3Uj3KSSVk-zRZy3Y3qvvkUAoJeCM4B4kflOAYzYLVaqcpchPlGJEowCg960aBtPp5Z0GMC40rWkCFEYlLpafODw9n2d2L5tgZuNHATS_pfgBZuK8ddg-MSHw5DaLY9202AotkhlF85hqEZGHWD9piYBSf-1vxGQ4OAX3DHvSKGruUc871NIhmx9Ap51Pxneh-rAelnHvQRgmjfLj1V13nrRa7vrJ97ITo9XYjwgNkeBKWKcmnUnVeJljdYPhzO2jHyWAaZx8Rjse7bjuriXIKkof5tFKqcb0Grcds-nJENMfv_Hvd9r2grdTgUllRQT9Xen44KbVWi6K1YHqPdDCpMxixrYQJa7yDR-eIkDVI0IIhQvAIBZHQxfxUcJDbYA2dc5MweNk1GPZAhLCKyjV-AG2EkjhMp8E0wIhkxmxcUJAlIsu1sGgWrIXdtMWUqbrPM6N0g2GWF3kEJclpEsd5ETPCch6HRVwwTvKc0ZQVeQiI5E6xnXCjpOk_feLfJmqOH4XdYJQEqrH7VDytKjxpUHTurDZ5AGaVFv8EPOHCONYnqrVNa1ESYGG7HA-mg7IbwKWqKvXolpQajKFr2Kfxo3KRZWs0IkshWdVyl4MZImf-bxmSKZmGiCwLYY1LxrZa0Wqtpo7EWRaHO-xLictWMiuUPEg6uEtXxnJ3M5ob5RJ2trqZX1rQzn8PLxeqbqgGn8viM69Q39yZdwfqreQBv17fABMNnFEDiMzdX3S2QzocZoS8vwHWag2Swd8MaDMvLehrDQ9CtQaR7BB2KbSxf2gOej_o-i-X3Wx-psUW-Q1pFoPGc1ULSa3SdxoAkcQ5jG9C0aKidcEpIhlT0tgPQXc93-iSo-hil_W6zwutlXZZgHmGXALCXIGRiKQW1wAWC62hrOBJPADW8GcrNNQgnfkXmBoDultvQkQyilG0wNQ7fj6oM_4oXOgYLOSDqh583eKdUzWg6QsnEdJYKhm4HOG9SGmfEmYBDp7SsixzHqZRGmf75W2fLzyAdbBeMxTNH2jVwso-Nx5QOSMCx-67Qz3AcOluC3N9dTG_vcCmLWphMXVFkAtJpa2rsDbWNuYwcbyZMlw0GdOCCxlMpdPex5anwAcsLii7t5oy6Gm7tZTdY97WzY6ZYIqC_FqrtaY1pnrddmZw6_M3lkuqtT6GpbtuLH6rWPtg8tkujpEzURAEQQplCZzTiMzSA6c0z6a7uNZCWq_lnVN7EG6aPq6UsRpo7cNi4crcrqT5NkW3tvAF4W3bND7fLP8mxZO7IdaSVmYqJEPRPE5SFM23pZZTJRyrEicUj-TuMP5CJa9c1spcfuuC7acKm8xcqg33spKRrCQMj9J-08qByGZXLH6KsFspXa0dzcPA1cUk2IsZjcWMIcRjDn-BsWeBr-QPCJwNJEvisIx9gbBbDzvcShRsatQ0QeQseIqyMg5cutvBxEMYGmTA3oXJ0gzYACYZSwM0w5oKAx-QCWg2AEuHYFERRxzTwqWy98AIiSM-AMsGYFnOSRLsF_TVym60elwVlK_giUHjc_vOxbqJOuttbblmbPdZicJY3tcbk4do17m_Fbraw68IHfiU-cj1O7W9iPmBiGWYsiCApCs8DgLCOUe0eLNyIIufUSV8sDwYFAe-x1Das0qx-27kApe0ch0uBkUESbsiInC77aGc-3m7quFN0Q66-AriNag9a79Z_UZWvz_b7av0_sb8_M5lu7uriyerqfGVeZgGfrmItiV-FAbjGAmD3zHyO0b-g1n9-TGS7EsqFyLhixCJondD5LamVfXVl8lvh84CJ-2Wt9_Wfi-GftP6XxJEYTgMIjIKojDKSnzUrndQNxW1sFB1reR7Vvb7rOiiay9gLeSPbWReU28vn1eweyswi_cKRscU_K_0ux_bcN1pKk2pdG0QWX7dPidw19cVlfvWfmuYhM7Po2xP5GxMZFKw17T2d9Zgr6kGaT9jC_u2-N72SRaNRI7fE3mgeXeT8n-0xi7FE_CRxcdeUVHZp7GBAVtRcbdN_uUmS_2eOSZ7_ZOB_glNkuRQ_yulmi2sf8jnYCX0T-UKp4if6e_CbrbmHZGwvKFyDS9o8GF5bfUt2Mu6qQY-fimN1W335JnMf7Z3H-oIPVF5ELtSghxkiXTMVMFn38GUeZ2qi8o_ll2oVtohWcOWX0lEliZuOSAH60E2IiKNso8T0fiQeEPpVvp37fxTnhd-k6ppnOd-fdirOnwMkRRByspXVIVravr80GjFwBjXOlC1u_HjDxa_SaswIGnsgn6vFglGaoWc5O-rpVvpI_VQpeX2BdGL8Ga0ovriQVXt0XY3x6Us1YuGO_9afafi0T4v37octvr1canhzxYke35jkitRaKr7HuNFGGoqOfAz_5ZsNHxuTFv752ILyjYvJXDKzZnzAYf9hUq67tP9Ya8_uneGPkZuoKb6_qIW1h7pea1VKSq4bev6UN5f60ZxNooOEo7dCPjH3OhjLjSXtHo2wmz5O1whdoP-DWtDGCQk6I6G7KgY1MiEFISlh1RwsFRUvTGpMV8Uh-q4Qi8caUjhyC_AgH4A3lEF5vsI3Nbg_1mWeVHOX94gsvTsddNeSgta0spXdvnBA2RnkMFbCiAMaH5Y1xzAfMAM_-NEegJj0p-O2lE4qOYTyvOkKD7Bp38a9b9D42OhEY9CI4gHW57uGOCd2krrYOecNrt38WMuugHfxEQ_5HOS9wt37tM0iQ9eBjvFk7FDQ_xtSXqr6eKDdH2WR-7pes0f_302-DFfTEe-yPPyI2n6mCH-Zwl8JT1vt2FxzGZRViZhOEjPb-2vt1r9FZ77_bW__f_jMT_tcVw3h1csms3c3muvV_5hvd7SiSwwaY9q9ku0mvkX2nutdmdqXtHqZXLo5D6SND5V-qO-FsZkKHz4tvC69VnvWjRQCTk8B3RrtZDrGyiPZc1X9mVfKNt4nPk7u7bOSce9lKr-8CealqI6AvJDza-oM9eaPru7hx7pOanatZAvqhPV2JVVql9suvn-KiR_q9dX0KIUoLf9Ctfy4f-_22WcAKY7ZIbI8v_g8frLuRYPu2U2JsTvifbeQobekhKeUf-7h88RQTV2-8DGr_AH27DR2aQkYmn-_gkgEqX5_gSQg5mNYbIZxauVG7Yylmq76tV5Dzib0QFwPKQmLoDFuIPs0X7kEKCfNGTA4v2kx04szw0uqcbU4EvMqMQWKu8pBqA2uBL3gO1GGCwMLoDR1nSnHI3SFju147PjT5evkjD2Z_Wzbz5bWVTK8UezLAqTKGQpsHRW5iELSZ5EMIuLICEsipKE8zDgP_QYnEReUJLj1oDxqqEkaLRqQFfP_bMlQEmwO_7sqPLnPP0JW9qXdo8bwTZYg221NNjqFvDjBqQDm2MUnaPoHJ856nd9rWu2WjQGt41H7E7fOlZv765QtDzhpxHPo5yewGmYpElKsiycnWxOkzCBpCjKJC0yFmYx8ALyLEnyAtK4nEUn4pQEJApImIWzIAhn0ySLyhmnNIrzkhZkhmYB1FRUU8fcVOn1iT_QepoEWRyc-B8dGP8DJ0IkPGLfiAhB8fmJPvXmKtq1QbOgEsaaPYoVtvK_jOrCc89-fI4X_mDs49s_jfKnwjsiHNcgqf9ZlJI-FfrMcdLq6vT7D-x6Ff8VAAD__8uXqXE">