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

    <tr>
        <th>Summary</th>
        <td>
            [AArch64] Assertion failure when using preserve_most attribute on variadic function
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            backend:AArch64,
            crash-on-valid
      </td>
    </tr>

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

    <tr>
      <th>Reporter</th>
      <td>
          ostannard
      </td>
    </tr>
</table>

<pre>
    This code causes an assertion failure when compiled for AArch64 at all optimisation levels except `-O0`:

```c
__attribute__((preserve_most))
void a(int, ...);
void b() { a(0); }
```

```
$ /work/llvm/build/bin/clang --target=aarch64-none-elf -c test.c -O1
clang: /work/llvm/llvm-project/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp:7094: bool llvm::AArch64TargetLowering::isEligibleForTailCallOptimization(const llvm::TargetLowering::CallLoweringInfo&) const: Assertion `(!IsVarArg || CalleeCC == CallingConv::C) && "Unexpected variadic calling convention"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace, preprocessed source, and associated run script.
Stack dump:
0. Program arguments: /work/llvm/build/bin/clang --target=aarch64-none-elf -c test.c -O1
1.      <eof> parser at end of file
2.      Code generation
3.      Running pass 'Function Pass Manager' on module 'test.c'.
4.      Running pass 'AArch64 Instruction Selection' on function '@b'
 #0 0x0000557fa8de3970 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/work/llvm/build/bin/clang+0x4f6b970)
 #1 0x0000557fa8de0d7f llvm::sys::RunSignalHandlers() (/work/llvm/build/bin/clang+0x4f68d7f)
 #2 0x0000557fa8d25b28 CrashRecoverySignalHandler(int) CrashRecoveryContext.cpp:0:0
 #3 0x00007f7d65c42520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
 #4 0x00007f7d65c96a7c __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
 #5 0x00007f7d65c96a7c __pthread_kill_internal ./nptl/pthread_kill.c:78:10
 #6 0x00007f7d65c96a7c pthread_kill ./nptl/pthread_kill.c:89:10
 #7 0x00007f7d65c42476 gsignal ./signal/../sysdeps/posix/raise.c:27:6
 #8 0x00007f7d65c287f3 abort ./stdlib/abort.c:81:7
 #9 0x00007f7d65c2871b _nl_load_domain ./intl/loadmsgcat.c:1177:9
#10 0x00007f7d65c39e96 (/lib/x86_64-linux-gnu/libc.so.6+0x39e96)
#11 0x0000557fa7a45707 llvm::AArch64TargetLowering::isEligibleForTailCallOptimization(llvm::TargetLowering::CallLoweringInfo const&) const AArch64ISelLowering.cpp:0:0
#12 0x0000557fa7a45b15 llvm::AArch64TargetLowering::LowerCall(llvm::TargetLowering::CallLoweringInfo&, llvm::SmallVectorImpl<llvm::SDValue>&) const AArch64ISelLowering.cpp:0:0
#13 0x0000557faa0daea6 llvm::TargetLowering::LowerCallTo(llvm::TargetLowering::CallLoweringInfo&) const (/work/llvm/build/bin/clang+0x6262ea6)
#14 0x0000557faa0e7396 llvm::SelectionDAGBuilder::lowerInvokable(llvm::TargetLowering::CallLoweringInfo&, llvm::BasicBlock const*) (/work/llvm/build/bin/clang+0x626f396)
#15 0x0000557faa10765e llvm::SelectionDAGBuilder::LowerCallTo(llvm::CallBase const&, llvm::SDValue, bool, bool, llvm::BasicBlock const*) (/work/llvm/build/bin/clang+0x628f65e)
#16 0x0000557faa0f469d llvm::SelectionDAGBuilder::visitCall(llvm::CallInst const&) (/work/llvm/build/bin/clang+0x627c69d)
#17 0x0000557faa12825e llvm::SelectionDAGBuilder::visit(llvm::Instruction const&) (/work/llvm/build/bin/clang+0x62b025e)
#18 0x0000557faa1b2108 llvm::SelectionDAGISel::SelectBasicBlock(llvm::ilist_iterator<llvm::ilist_detail::node_options<llvm::Instruction, true, false, void>, false, true>, llvm::ilist_iterator<llvm::ilist_detail::node_options<llvm::Instruction, true, false, void>, false, true>, bool&) (/work/llvm/build/bin/clang+0x633a108)
#19 0x0000557faa1b2df8 llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) (/work/llvm/build/bin/clang+0x633adf8)
#20 0x0000557faa1b4c64 llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) (.part.0) SelectionDAGISel.cpp:0:0
#21 0x0000557fa8171da5 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (.part.0) MachineFunctionPass.cpp:0:0
#22 0x0000557fa87cf55e llvm::FPPassManager::runOnFunction(llvm::Function&) (/work/llvm/build/bin/clang+0x495755e)
#23 0x0000557fa87cf7a9 llvm::FPPassManager::runOnModule(llvm::Module&) (/work/llvm/build/bin/clang+0x49577a9)
#24 0x0000557fa87d00e5 llvm::legacy::PassManagerImpl::run(llvm::Module&) (/work/llvm/build/bin/clang+0x49580e5)
#25 0x0000557fa96d29a8 clang::EmitBackendOutput(clang::DiagnosticsEngine&, clang::HeaderSearchOptions const&, clang::CodeGenOptions const&, clang::TargetOptions const&, clang::LangOptions const&, llvm::StringRef, llvm::Module*, clang::BackendAction, llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>, std::unique_ptr<llvm::raw_pwrite_stream, std::default_delete<llvm::raw_pwrite_stream>>) (/work/llvm/build/bin/clang+0x585a9a8)
#26 0x0000557fa9c1bbca clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) CodeGenAction.cpp:0:0
#27 0x0000557fab573cb9 clang::ParseAST(clang::Sema&, bool, bool) (/work/llvm/build/bin/clang+0x76fbcb9)
#28 0x0000557fa9b12ac9 clang::FrontendAction::Execute() (/work/llvm/build/bin/clang+0x5c9aac9)
#29 0x0000557fa9a8bca5 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (/work/llvm/build/bin/clang+0x5c13ca5)
#30 0x0000557fa9befd05 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (/work/llvm/build/bin/clang+0x5d77d05)
#31 0x0000557fa7282b08 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (/work/llvm/build/bin/clang+0x340ab08)
#32 0x0000557fa727a563 ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&, llvm::ToolContext const&) driver.cpp:0:0
#33 0x0000557fa98d7f4d void llvm::function_ref<void ()>::callback_fn<clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const::'lambda'()>(long) Job.cpp:0:0
#34 0x0000557fa8d25ff0 llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) (/work/llvm/build/bin/clang+0x4eadff0)
#35 0x0000557fa98d87ce clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const (.part.0) Job.cpp:0:0
#36 0x0000557fa9899e3a clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, clang::driver::Command const*&, bool) const (/work/llvm/build/bin/clang+0x5a21e3a)
#37 0x0000557fa989a90d clang::driver::Compilation::ExecuteJobs(clang::driver::JobList const&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&, bool) const (/work/llvm/build/bin/clang+0x5a2290d)
#38 0x0000557fa98a6144 clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&) (/work/llvm/build/bin/clang+0x5a2e144)
#39 0x0000557fa727fab0 clang_main(int, char**, llvm::ToolContext const&) (/work/llvm/build/bin/clang+0x3407ab0)
#40 0x0000557fa728f7f3 main (/work/llvm/build/bin/clang+0x34177f3)
#41 0x00007f7d65c29d90 __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:58:16
#42 0x00007f7d65c29e40 call_init ./csu/../csu/libc-start.c:128:20
#43 0x00007f7d65c29e40 __libc_start_main ./csu/../csu/libc-start.c:379:5
#44 0x0000557fa72791a5 _start (/work/llvm/build/bin/clang+0x34011a5)
clang: error: clang frontend command failed with exit code 134 (use -v to see invocation)
clang version 18.0.0 (git@github.com:llvm/llvm-project.git 2f11ce5579b6f7db960a5b7a1e6c7b2b75dc94c8)
Target: aarch64-none-unknown-elf
Thread model: posix
InstalledDir: /work/llvm/build/bin
clang: note: diagnostic msg: 
********************

PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
clang: note: diagnostic msg: /tmp/test-c03249.c
clang: note: diagnostic msg: /tmp/test-c03249.sh
clang: note: diagnostic msg: 

********************
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzkWltv47iS_jXKCxFDou4PeVCceKYHPZugk5l9NEpUyeaGprwk5U7vr1-Qkm3RcbrjnsbBAc4g07Z5KX51YVWRLNCaryTiTZDeBundFfRm3ambThuQElRzVXfNt5vnNdeEdQ0SBr1GTUAS0BqV4Z0kLXDRKyRf1ygJ6zZbLrAhbadIVSm2zhIChoAQpNsavuEa3CyBOxSa4CvDrSFBFl4_hEEWBnEVhHdBuP83C4c_NvxeLsEYxeve4HIZ0CKgxVahRrXD5abTJqCl_XNjdx1vCAS04NIEdE5ms5nti28n3bWjUZIgv3VDw2EECfK7EwBnUY0_aUICuvjaqZeALoTYbQK6qHsuGvvJZUAXTIBcketrA2qFJojvAJxormUn8RpFS64ZMajNjJHrh2ig6yYFcfWWuP243qruf5CZSSuvA7p4Hpagi1H6x2-fnlB87r6i4nI1Y9ttEFd5WCZ2hbrrBHFk4iqIq3HCQGo_Zeji-l7wFa8FLjr1DFzMQYgHp9n_c5oNaME6qc2E3Dk6dtq-5ZNsu4BmVhFuqkVUHezLytlqKfqk_wZVqRUJ8nmQz4klgTifkyC-C-I795vL1byTu3ENp1pLOCMBpX9JfN0iM9iQHSgODWeEDXPsujuUA34a0NxZNTazQROPn--rp3ui-3rDDQFS9yuicNspQ0xH1sZstV2RLgK6WHGz7usZ6zbv6otr3aMO6IKAbAiXTPQNErNGwhToNamBvRgFDK3ZbhVuVcdQa2yI7no1NNuZoHXHOFiGVC-JZopvzQj5yQB7IU2_2R62VDgjj6pbKdgQUKt-g9Los-b1C2w3mhH3XxDPsWuD-J5sQWlU1hegbEjXkpYLHAbTcfDcupgVSlSDJbnOeOz80ktpNbUFrUlA80UvmbOPR9vwJ0hYobKa6yTZdE0v0I4acAU0H8WSvENt76o-SW1UPxB-QoFsMAlHtd2vGNA8SMLafjiiJKBxSMLXMAzDNM1bKBqMyzycbAH9TQ9fHhWXxinnedBwcRyk4Ouy00YhbJzVzolzXdaGi48oKaC34WvSZnWZhwc3aMFFJ-DCJm_PgfvSyye-kiB-B9kIVHrvHi9bv2jy1luf-uvTtKYFmVtb_4Ks26H65i2799mlP2beSYOvZnRdofv_sEQ8LpG3eZOlLKEpDUfcg198LbJlllwLLvvX65Xshw42090sG4DbKR7sxKdZZpAzslxuzVohNMsXLsSSb7YC7VYawtosoAu5NSKgi-mwGQviKrGuNs-O9NOP0JcGlQTxXcp5EcRVNJFGdo7ydNp3yRXlCbn8VLhJnpGVdjpzlIavAV3M3K9vusGtdXDbTvPXgC4UcI2ONs2DuJrIoPBJ0yJvYwK1da2OlGkG9bmmAV1kOT5SKN9QiGqylGIpOmiWTbcBPuiFS8eubd7oFYOBXBTlFlK5j-VxFPoE4xLL7DJTclMOpmRpejswhyTNw_zXBdzLQu0YZCcBl7yfIUy2meWDnvJRR-nH-HC_LJSL8Y6-8DjpaQNC_I3MdOrTZiuCeD7pu_sbRI9BfP9zDMZTBiFsACH7QSpz4Oy5-zne9iAvcbMZzSiCb2SJjx3zuJxiP8Szu-q3W0sW1dAhLKBPcte9QC3wn-vnFjRnt6JjL3tTqy6NIhnN2vhkD6Uee1GYZyl-hL339GObbkHjZD94VjZaEp279Hj6-YtZLdosRY_VzNdkm2Rl8xFWd1xz82aT2Qab2Hgb_zKIOcvKxoOY-9qgBf2YNhxED9405_p5hHVIT4RY-AhrGoXFOwitX5i2HtXqIeWCa7PkxiaonfL8ztDVoAE-UpJdg0t75u2k9oZO-LXGZNRgZC0I7b7Yk6nzX5M2N2ho-zeDM-yJyxUWxxCFhaew8lRhTftRhVVuK486057SDgeFn7atOIam9aDS8ARqwrLkh1BVLx_kn8DWXOIelQf1Td8e62wLysxsdkpOSZ8NY9TP-KM8amAap08WskeoCcSz2L4L6gy987j8k0DO2tTzGotHO3V_mLsY0ccPKWWap767oPEptBzKD0D70501fTWOTT8FK4fSg5X4sJowxKkmBa6AfRvPlkeAQ140gvxl4IoQUw-cF5LLrKElFGR_bxXE1f2Gm1tgLyibh95se-v4J913HFay04YzfS9XXOIYhCdDfkdoUD0hKLZ-GLyXF68nQ-ddg7-h_MGoIaP5waDPIFfnhkx2uLHpzxds_ea9dKsTgqMQqoObnfpfo3rNd_gF27k0j8b35Lt23JoLLvDpmza4GT2vNs3Q00v-vz0utyczFXxdbr8qbnC5v1SYTGqwhV7YGCHQ4A8mxvduzcsMJi1SKMH3m15iU7KorhmckdO8k7rf7PfZcC3wrEBq4Y48f0l-YknV0_N4PTBa9mgMg8DP-yIvg6nTPGZ1OcXyCEpj9fTsr_SEGxitwU8LLxNOnrU1q_2t7iUsZR1RYB6ghbIsHqxo2GGvyHqDP3FRk7ISgPkIvAhcQlEzSP0t5q73lc0ZQDL0MOyNu3gf8uVeJ2VRzMDzOv5dW1lj24QeyhHPEeyuY_AW2xtmLs_d0ybPm9BH5x_1aUHrsCCMRcsNcN8VV0rBN-tC4jlbgzqeIIb97bftM7HLQcZJCLWfavk3cjnNIc1ispfbPHp2Fl1878j9FvGJh7Q0xj3ppV6N4jtUZ7dk7MXgsmjyNmkc2xO6-2vYpXKSc72D-Ts3ZYcwEKIG9rJspUV6VPmw9qj-eTTvNhuQzelOOquhg-Mccmg4uXY4hIPRVU487XLJXl-jaPhR2yzVulV3nHZS9AbbhqVRwI3ed5-QAyGsObuEf99vh1RHV1RNn1Lcy0QuYFM3END8KCpaiM6aSEn-6Orz-khOL27bdnqrfe569niTDC2Kb544v6-6S_MRhKZtQ8-s0xP7KXKG5D9Z_yd5-ruK9uNyUZYYw7uCc34T3sSgvTQ9J3sy0Q54L-n6ztDKi7g_c1-WAo0wBs9a8hOmoQybS5n-o6v1-xz_0dWfuXfx8v17zIOSt8Ctfsen648KabSEfy4qWobebU_spyYFZFGSvAfrbvLdC8VnYvB7Iv4XiurCiA8UoyTxhFOeBNMW6nAAso_5e3But1fjXv1xqLwwyudQe-4wCU9SkTZvY-LeQy6jHOV5G3uUo5NHl7IpQ7JcCl5b5wbKLG0MXh7eXpju374Oje9P5ybN1kFcpe5ZKzuuSk9XxSR0T_hLLrk5XWj4aqlfO-rDcw-1ROnR9SXxOaIeK-e4OEs8zksL-0g7ObGMMoKUDFQvVW4UTbLgQ2kIKmUDQTWYG2nHdJuw0d6HMgbylZs1wVduhjKeKE7s8r1Gcr0jpiMakfBJmjxdhuxQad5JEhWzcOYeVVfcBEk4qXSIqzOVDrMVN4S2UcQwTfOyztq8qcsshLTOIcKM5TWt87RhZcKO2elYvxJXxKsz6OWL7L7KaxTtOM49WpJN17jrNTI8Nboul9ALgc0dVz8scPDlKTt7Fq5Ic7iZIBs9FOGMSv0Hf5MSorGipHp-rua_k-ff78ni4fPnh__-9F-_kcWnz_dP5PnBNd_-9Rv5cv_48OU52NdxPJ6rCCm0dRjvVoUcBigkLn3AhoA5kPwI_3RhNlv7L2pzzcKYJuWM_bPpen2p-H-VEvYVXFfNTdyUcQlXeBNlZUppFIf51fompWGb5AA5TdKooU1T1ECzOC8ZYtzG8RW_oSGNw5KGUZIUNJ-FRVvndZhikUcR0jZIQtwAFzNrdLNOra5c3c9NlpVRfCWgRqFd3R2l9XDrcXxAdUVI84BSVxB03cnrHQh7-KNBenelbtw2q_uVDpJQcG30cRHDjXD1fHtS6d2kmMor1uu1K4GZFtCRQ30d6eSxTGqfuF_1Stz8fL2TY_3_AwAA__9YEjfK">