<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/96197>96197</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[GlobalOpt] Crash when optimizing global alias to ifunc.
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
labrinea
</td>
</tr>
</table>
<pre>
We found a crash when compiling a trivial examle of Function Multiversioning on AArch64:
```
__attribute__((target_version("simd"))) void helper(void);
__attribute__((target_version("default"))) void helper(void);
int main() { helper(); }
```
clang -O3 --target=aarch64-linux-gnu -rtlib=compiler-rt -c test.c
```
llvm/include/llvm/ADT/ilist_iterator.h:138: llvm::ilist_iterator<OptionsT, IsReverse, IsConst>::reference llvm::ilist_iterator<OptionsT, IsReverse, IsConst>::operator*() const [with OptionsT = llvm::ilist_detail::node_options<llvm::BasicBlock, true, false, void, false>; bool IsReverse = false; bool IsConst = false; reference = llvm::BasicBlock&]: Assertion `!NodePtr->isKnownSentinel()' failed.
PLEASE submit a bug report to https://bugs.llvm.org/ and include the crash backtrace, preprocessed source, and associated run script.
Stack dump:
0. Program arguments: ../opensource/build_rel_assert/bin/clang -O3 -march=armv8-a tu2.c -rtlib=compiler-rt -c
1. <eof> parser at end of file
2. Optimizer
#0 0x0000af4708f68b80 PrintStackTraceSignalHandler(void*) Signals.cpp:0:0
#1 0x0000af4708f66230 llvm::sys::RunSignalHandlers() (../opensource/build_rel_assert/bin/clang+0x3d36230)
#2 0x0000af4708ebcda4 CrashRecoverySignalHandler(int) CrashRecoveryContext.cpp:0:0
#3 0x0000eb2cad92c9d0 (linux-vdso.so.1+0x9d0)
#4 0x0000eb2cac6ef200 __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
#5 0x0000eb2cac6aa67c gsignal ./signal/../sysdeps/posix/raise.c:27:6
#6 0x0000eb2cac697130 abort ./stdlib/abort.c:81:7
#7 0x0000eb2cac6a3fd0 __assert_fail_base ./assert/assert.c:89:7
#8 0x0000eb2cac6a4040 __assert_perror_fail ./assert/assert-perr.c:31:1
#9 0x0000af470889f4d4 llvm::DomTreeBuilder::SemiNCAInfo<llvm::DominatorTreeBase<llvm::BasicBlock, false>>::CalculateFromScratch(llvm::DominatorTreeBase<llvm::BasicBlock, false>&, llvm::DomTreeBuilder::SemiNCAInfo<llvm::DominatorTreeBase<llvm::BasicBlock, false>>::BatchUpdateInfo*) (../opensource/build_rel_assert/bin/clang+0x366f4d4)
#10 0x0000af470889f57c llvm::DominatorTreeAnalysis::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (../opensource/build_rel_assert/bin/clang+0x366f57c)
#11 0x0000af470a1ea728 llvm::detail::AnalysisPassModel<llvm::Function, llvm::DominatorTreeAnalysis, llvm::AnalysisManager<llvm::Function>::Invalidator>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (../opensource/build_rel_assert/bin/clang+0x4fba728)
#12 0x0000af4708984e88 llvm::AnalysisManager<llvm::Function>::getResultImpl(llvm::AnalysisKey*, llvm::Function&) (../opensource/build_rel_assert/bin/clang+0x3754e88)
#13 0x0000af4708e42800 llvm::SROAPass::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (../opensource/build_rel_assert/bin/clang+0x3c12800)
#14 0x0000af470a16bf7c llvm::detail::PassModel<llvm::Function, llvm::SROAPass, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (../opensource/build_rel_assert/bin/clang+0x4f3bf7c)
#15 0x0000af4706808310 llvm::detail::PassModel<llvm::Function, llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (../opensource/build_rel_assert/bin/clang+0x15d8310)
#16 0x0000af4707f12758 llvm::CGSCCToFunctionPassAdaptor::run(llvm::LazyCallGraph::SCC&, llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>&, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&) (../opensource/build_rel_assert/bin/clang+0x2ce2758)
#17 0x0000af47067d2bdc llvm::detail::PassModel<llvm::LazyCallGraph::SCC, llvm::CGSCCToFunctionPassAdaptor, llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&>::run(llvm::LazyCallGraph::SCC&, llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>&, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&) (../opensource/build_rel_assert/bin/clang+0x15a2bdc)
#18 0x0000af4707f0cc58 llvm::PassManager<llvm::LazyCallGraph::SCC, llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&>::run(llvm::LazyCallGraph::SCC&, llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>&, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&) (../opensource/build_rel_assert/bin/clang+0x2cdcc58)
#19 0x0000af470a16be4c llvm::detail::PassModel<llvm::LazyCallGraph::SCC, llvm::PassManager<llvm::LazyCallGraph::SCC, llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&>, llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&>::run(llvm::LazyCallGraph::SCC&, llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>&, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&) (../opensource/build_rel_assert/bin/clang+0x4f3be4c)
#20 0x0000af4707f13338 llvm::DevirtSCCRepeatedPass::run(llvm::LazyCallGraph::SCC&, llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>&, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&) (../opensource/build_rel_assert/bin/clang+0x2ce3338)
```
Looks like we are trying to run an analysis on a function declaration or something like that. Digging more I found that the probelm comes from GlobalOpt. Here is the minimal reproducer:
```
target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32"
target triple = "aarch64-unknown-linux-gnu"
$helper.resolver = comdat any
@helper.ifunc = weak_odr dso_local alias void (), ptr @helper
@helper = weak_odr dso_local ifunc void (), ptr @helper.resolver
declare void @helper._Msimd()
define weak_odr ptr @helper.resolver() comdat {
resolver_entry:
ret ptr @helper._Msimd
}
```
opt -passes=globalopt -S test.ll -debug
```
Args: ./bin/opt -passes=globalopt -S ../llvm-project/test.ll -debug
@helper.ifunc = weak_odr dso_local alias void (), ptr @helper
@helper.ifunc = weak_odr dso_local alias void (), ptr @helper._Msimd
Alias must point to a definition
ptr @helper.ifunc
LLVM ERROR: Broken module found, compilation aborted!
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWltv27gS_jXMC2FDJmVbesiDYse7xbbbIuk559GgyLHNE4oUSCpp9tcfkJQv8jrFptnF6V4At7DI4Tcz31ykaMyck1sNcI2mN2i6vGKd3xl7rVhtpQZ2VRvxfP0fwBvTaYEZ5pa5HX7agcbcNK1UUm8xw97KR8kUhi-sUYDNBq86zb00Gn_olJePYJ00OggbjavK8t0sR7RC2RJlFZpl_SdertfMeyvrzsN6jUiBSOGZ3YJf9zBxjTjZCEQIImX64EcjBd6BasEiUoSrsEFveiWvwRawYZ3yr4aX2uOGyYRSYjS_OZ5I0hjNlxe95orpLR59pHg0SiYhumQsMjVSUndfRlvd4ZH1StaILhP9YEfW4xHHHpwf84vISj02iKyk5qoTgMiqX6iWn8Oyks6vpQfLvLHjHaLVhBaIVjiK0QrRaiiD6OJjG2LrPiOywO_cHQTyIF0sjHYe0dt00sIGLGgOvwuaafszpOoZ5mEfo-nNk_Q7vAfCiC5_pVCAZ1KlFW0ErE2SRnRxFL1hTvIbZfhD0O9tF-3YMJUMSlHfLwSzbnBtjDqaHVX324e9RbLydOdIzNDWUwNmaLoMgaicAxuLKcSUTH42Aj55O0L0VrqftHnS96C91KD6NCNzvGFSgRinDPj0_ra6v8WuqxvpMcN1t8UWWmM99gbvvG9d0E5WiKzqbuvGwZ6xsVtEVphpgfvcwX4HfQuoGX_wlvFIS2uhtYaDcyCwM51Ny-Ekc85wyTwIbDuNHbey9b1Z957xByy6pj20gmyMsvKTNVvLGszstmtA-2AcHo8RWZkW9B5_VXdSibUFtWaRoLAUSm91UkpNKKBQSLZ5LEYM-46M-UtFlEyYBBMQXYDZIHqLW2YdWMw8Bi1CZ9tIBUmSBMmQc438BWxaw4jQDGdfsizL2CafZ8VmVtRFhj9ZqX30-HOg7V5uNVM_Mi3UST-pQk6nLTfmbeAli_8O2JMz7FlQd0wf9-zSl7tOD1S4fUsixWuZROQm-0IFDapCdh1sIQNboOaC5XgR0uMOuHkE-3zupdQ-GDGQWRjt4Yu_7C7tVUBNOBMl4aXIgg-pIT4KZ8bOjCfRxFIMzctPz_IZbEiW4fW69TsLTKwfpFJr2bQKQo6xWF-BGd16hcjqVGzMEa3ycMOaz4740yE-Y7M5x1sXXY5I6Ssiq8i4e3YCWhegjZNfEFlZJh1EbDJHtDqBng2hy_mEZpjVoWAjlBchf8kqLkWEYhKsOyLMz4yjGxGcT_Fdh-6wrpmDCHcIevqS8MohXnGGl2f5CV4L1hobYS8hjsJ-hKXBzMkRthykUFFucpGfpPPSNJ8twE3IT7Bp7R4a-fOieqc3ZtC6l6aROtwd4gkW2uyLjf3Yv_s7y4Ip3inmYWVNc88t83wX0uxt6GQWLv8P7twE-__VCuYhAqfG8s21P5uFuByKK7Sh7Dxw0znHL1hfaaaenew7k-30gNn9k-Kv2Nof-8A02wa6FhcO9Sy_zbnpnA-cGzRZNgE2J8WJYadPEnsjPzHnPhgB6rKZ52lwgZxv8j0uvNOPTEmRnqZuv0uW800dSBywPLx9lEUORfGtFGzB34HrlH_XtGrg-B7mJ3iOZXDq-4CUN6TQfBpsHzhHh_fGnBTZ6X36_u5jFVLmuwwW5ZNg7sCffFgSs3ozqPfTknhNKRx4-Lbs_16TnQZ6BvxNT_mbFVkRWujb-YuyX3PmW3n9K8VjMhWB7kE8ZqfxmG8mZD49bT6LH-4Xi89mb0OguRKsjR32kofv2S_PC6bUD5a1uz61F4tX-fsSxOn5oQyZXXrI-JXMYDc6lp4MUsN8I7eEQ6BuwO18kOtzQWrxul7xW6j4SoT-eMrfyPdLdfK3zaLJlIUkGWRRMazQjPNBhb7U-X4LAf_kxJ8gJwgXIeSDnCjPn0Ig__07y18ws_4MNv6T_efPkJAPOiLJzp5ZKKWnHXEJj9L6-8XiDlpgHsTLf2D8bWklHAJrR1qHo5L3xjw4rOQD4CfAzAL29lnqLfYmvr5m4ZM4wUZjhjf7MZcArphNbxGNxc404HfhZATzO-bHeCm327DUGAv4XT9TC1vxvXprTQ2qwdw04PDGmgb_oEzN1MfWj_GPYAFLFyUbqWXDFI5v3UXH06ukS_6kQRIWzDPFnk2XhhCIEBgFgmEkC0Sr8I-SkZzMEK3if-EqDuhm-UhOSBCYkGKkKUlr9-FqFS4JGWjyVrYK9lr246tOP2jzpI9jrMOxfXLnaUw2tuCMegQbEbhpBPOY6eeBcJ71wjKwHyWfgD2sjbBYOLNWhjOFmZLMpaHdfiqywK23-HD-IuhLcEnX1-AOtp_iprSA_uBBdP0hTS9PErEX30gNR_0vKNjPviI9aN6PIPfba9DePh9SAmML_gyp1580vzCQNK3HozZUkkN0uY2pGNfu07BRKTwSUHfbi6cru01jm0MRfgUvlnIo-lFrzX-Bh8od6sB_TOx_L7gBoVUUbzrncWukjjM2hmNoZfyDNkoNz0f9fQ96_-8P-Pbu7uNd4O_GmgfQuDGiU_0YPmhPg6vUbuIQAAQik7NIXIlrKkpasiu4nswnRVHSsqRXu-uZIEUJWU5yyueszmGalWVOWD4hRSYyfiWvSUbybEaySU7pJBtvaCkEnVNgOZ9tWI7yDBom1WFSeCWd6-C6nE3K-ZViNSgXf1NAiIYnHDdD0U-XV_Y6Rrrutg7lmZLOH-eNV156FX-McGh9aLpM86L0qwOTxm2hjaYU6qPjTSrR8VVn1fVwpLmVftfVY26a4_D7LNuigQ6RVXLg8Zr8LwAA__-53zpQ">