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

    <tr>
        <th>Summary</th>
        <td>
            [AArch64] Assertion failure when using preserve_all attribute
        </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
void a(int);

__attribute__((preserve_all)) 
void c(float d) {
 a(9);
  if (d > 0)
    a(7);
}
```

```
$ /work/llvm/build/bin/clang --target=aarch64-none-elf -c test.c -O1
clang: /work/llvm/llvm-project/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp:2720: void computeCalleeSaveRegisterPairs(llvm::MachineFunction&, llvm::ArrayRef<llvm::CalleeSavedInfo>, const llvm::TargetRegisterInfo*, llvm::SmallVectorImpl<{anonymous}::RegPairInfo>&, bool): Assertion `OffsetPre % Scale == 0' 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 'Prologue/Epilogue Insertion & Frame Finalization' on function '@c'
 #0 0x000055a7513d2970 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/work/llvm/build/bin/clang+0x4f6b970)
 #1 0x000055a7513cfd7f llvm::sys::RunSignalHandlers() (/work/llvm/build/bin/clang+0x4f68d7f)
 #2 0x000055a751314b28 CrashRecoverySignalHandler(int) CrashRecoveryContext.cpp:0:0
 #3 0x00007faca7442520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
 #4 0x00007faca7496a7c __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
 #5 0x00007faca7496a7c __pthread_kill_internal ./nptl/pthread_kill.c:78:10
 #6 0x00007faca7496a7c pthread_kill ./nptl/pthread_kill.c:89:10
 #7 0x00007faca7442476 gsignal ./signal/../sysdeps/posix/raise.c:27:6
 #8 0x00007faca74287f3 abort ./stdlib/abort.c:81:7
 #9 0x00007faca742871b _nl_load_domain ./intl/loadmsgcat.c:1177:9
#10 0x00007faca7439e96 (/lib/x86_64-linux-gnu/libc.so.6+0x39e96)
#11 0x000055a75009b8f4 computeCalleeSaveRegisterPairs(llvm::MachineFunction&, llvm::ArrayRef<llvm::CalleeSavedInfo>, llvm::TargetRegisterInfo const*, llvm::SmallVectorImpl<(anonymous namespace)::RegPairInfo>&, bool) AArch64FrameLowering.cpp:0:0
#12 0x000055a7500a369d llvm::AArch64FrameLowering::spillCalleeSavedRegisters(llvm::MachineBasicBlock&, llvm::MachineInstrBundleIterator<llvm::MachineInstr, false>, llvm::ArrayRef<llvm::CalleeSavedInfo>, llvm::TargetRegisterInfo const*) const AArch64FrameLowering.cpp:0:0
#13 0x000055a750b4f331 (anonymous namespace)::PEI::spillCalleeSavedRegs(llvm::MachineFunction&) PrologEpilogInserter.cpp:0:0
#14 0x000055a750b550f8 (anonymous namespace)::PEI::runOnMachineFunction(llvm::MachineFunction&) PrologEpilogInserter.cpp:0:0
#15 0x000055a750760da5 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (.part.0) MachineFunctionPass.cpp:0:0
#16 0x000055a750dbe55e llvm::FPPassManager::runOnFunction(llvm::Function&) (/work/llvm/build/bin/clang+0x495755e)
#17 0x000055a750dbe7a9 llvm::FPPassManager::runOnModule(llvm::Module&) (/work/llvm/build/bin/clang+0x49577a9)
#18 0x000055a750dbf0e5 llvm::legacy::PassManagerImpl::run(llvm::Module&) (/work/llvm/build/bin/clang+0x49580e5)
#19 0x000055a751cc19a8 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)
#20 0x000055a75220abca clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) CodeGenAction.cpp:0:0
#21 0x000055a753b62cb9 clang::ParseAST(clang::Sema&, bool, bool) (/work/llvm/build/bin/clang+0x76fbcb9)
#22 0x000055a752101ac9 clang::FrontendAction::Execute() (/work/llvm/build/bin/clang+0x5c9aac9)
#23 0x000055a75207aca5 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (/work/llvm/build/bin/clang+0x5c13ca5)
#24 0x000055a7521ded05 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (/work/llvm/build/bin/clang+0x5d77d05)
#25 0x000055a74f871b08 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (/work/llvm/build/bin/clang+0x340ab08)
#26 0x000055a74f869563 ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&, llvm::ToolContext const&) driver.cpp:0:0
#27 0x000055a751ec6f4d 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
#28 0x000055a751314ff0 llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) (/work/llvm/build/bin/clang+0x4eadff0)
#29 0x000055a751ec77ce 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
#30 0x000055a751e88e3a clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, clang::driver::Command const*&, bool) const (/work/llvm/build/bin/clang+0x5a21e3a)
#31 0x000055a751e8990d 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)
#32 0x000055a751e95144 clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&) (/work/llvm/build/bin/clang+0x5a2e144)
#33 0x000055a74f86eab0 clang_main(int, char**, llvm::ToolContext const&) (/work/llvm/build/bin/clang+0x3407ab0)
#34 0x000055a74f87e7f3 main (/work/llvm/build/bin/clang+0x34177f3)
#35 0x00007faca7429d90 __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:58:16
#36 0x00007faca7429e40 call_init ./csu/../csu/libc-start.c:128:20
#37 0x00007faca7429e40 __libc_start_main ./csu/../csu/libc-start.c:379:5
#38 0x000055a74f8681a5 _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-a4fd3a.c
clang: note: diagnostic msg: /tmp/test-a4fd3a.sh
clang: note: diagnostic msg: 

********************
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzkWl1T4zqT_jXiRpWULX9fcBECOcOpOQsFnN3LVFtuBy2K7JVkBvbXb0l2EjuEAeZM7XvxTjGQ2FL3o-7W0-2WwRixUYjnJLkgyeUZdPax0eeNsaAU6OqsbKrX84dHYShvKqQcOoOGgqJgDGorGkVrELLTSH88oqK82bZCYkXrRtPFQvPHNKZgKUhJm9aKrTDgZ0l8RmkovnBsLSVpMLsJSBqQaEGCSxLsfqdB_8P778-NqCgQlgtlCStIdDEevV6DtVqUncX1mrCcsLzVaFA_4xqkdBNYQUeSOGF5LRuwtPJ3skGcV1GMFVAqakpYXlESXdHA3RquUz84m6DJLo_gn1zT8JXFlLDVj0Y_EbaS8nlL2KrshKzcX6EIW3EJakNnMwt6g5ZElwDesDPVKJyhrOmMU4vGzjmd3YS9XD-JRIu3wt2fWaub_0ZuR1dFSdjqoVfBVoPvDp9WGrb4vfmBWqjNnLctiRYsY85jtDdms207i0uQEvEenvEON8JY1LcgtCEs94qiBYkWfwF_FApXneIuGAhLCVvSw_2F1vB6hzWJloeLB8HVtaobEl25SbxRxo6m9gvYqfYD2WIq_X4LUv4nctvo620rSbQk2QWoRr1um8445_lhd7hxyPe6PMayaXwcRQu62O8AkgY3dW3Q3mqkhCX0noNESqJLEl26YMn8JsFq3rvm9vvV4v6Kmq7cCkuBlt2Gamwbbalt6KO1rXEQ2Iqw1UbYx66c82b7rgOFMR0awlYUVEWF4rKrkNpHpFyDeaQl8CergaNbQKux1Q1HY7Cipul0f9nNBGMaLsBiRXWnqOFatHaAfG-BP9Gq27b7HRrM6a1uNhq2FPSm26Ky5mS8_YZgDufU_yPREpvabcEWtEHtqAVVRZua1kJiP5gNg5eOsTaoUHvK6W9Gw827TimhNrQFYyhh2S4W6a278Bco2KB2nmsU3TZV5_zJsh4XYdlglvgdabe6kc2mQ8JWV63wH-m12scLS6nfTnQlFEjxvz2-Xlm9A0JYRuLAKRuohrAooMFLEARBkkCWhFHFiiwYRbZ5Nf2HWy2U9T576B0_2nwafqwbYzXCdgjqnkypZ8yPfUfYRfAS12lZZCMeJCwKp-B4XWX1KXB3nboXGwXyG6hKoueGX9CfV1k90c-m-sO4ZDldui1wh7x5Rv06UbvPItMxy0ZZfLEDwwX-_15FNKjIauCQxTFLWDDg7vnzJU_XaTyTQnUvs43q-ht8bpp52gN3Uyaw46nMIoWM0_W6tY8aoVo_CSnXYttKdDusT55zwlaqtZKw1XjYnJNoEcckWmTpQX7yGfnKolYgfyo5y0m0CEfWSE9JHk_7qbi8OBKXHRs3zlK6Md5nXlL_kbDV3H97NRW2jvfaxogXwlYahEEvm2UkWoxskE9FszyrIwqlY1wvyla9-_ylHl3oVnyQULyREJZ0reRaNlCtq2YLoveLUH657vLWbDj04sIwc5CKXc6PwmAqMCqwSL8WSn7KPpSczMkODIKizOv4X5SXf5aR-6T9mbzM8n1epgq2aFrPZsXHGZr-pGwZbWpnNTa1GkRpUY0XfULQwGitkHK0_N0aTxr1AozgF7LhT2_MOoy4Vsbqi86R07V1SavRE0OPhzkBNUiDb8z9-31UDEXW5y0aTSxaxnUUhfQDZ95eXb9r1Y-jtKB9yu2zbZ9qUZ9GF0_RJUlQ559Gpzt1o94g-I3okgm6LA0qSN7Gyk68q1ZGwE4iOoJCWD5vQdu5S0P0hLzTuNIJrqrEJMERrtWtm7qrm76M6POJv0iyJMEJ7WXH0DIoPgHtL1_WTZ03XPolWBkUE1j5Eaw6wLEnJW6Avw7hdQDYU98A8reBywNMJuCKSbHEeVhATnfPjCRaXG2FvQD-hKq66WzbWcLy0e1LARvVGCu4uVIboXAgtdGQbwgV6nt05f1N69xtdqRyPNRV6n-g-mBUT1IfDPoOanNqyCjNWEdcjiGnJDxYd3EkcDDCYgjY8ZRrZXVnhMuo9VLZWzvl6-d62JorIfH-1VjcDsRrbNXf6ZT4nw7X7dFMV6K3P7SwuN4V6qNJFdbQSbuuUKLFDyZGV17n1wImyRMoIB8HDJs8ejAWQMnhhJ2WjTLddrfP-lL7QYMy0peufytxFEmL-4eh5B4iewiG3uAnuYhN6pyoTBkvizGWW_dwuLh_mGq6xy1MioRDsfAV42RpXfJystXZpIRgYRACnwBaabfEfRT1O-wFeWfxFx5-El4A8CmCScplQQYckukW84057aoHUBwnGHbBnb8P-eusk_Aw4jBhHRZP7VRhFUxQDngOYJ8bDm-xvVlMX6Z8CV2VZVUwRTdOvXHtKvwgp5yHa1fcT6h4VGTxR9CHYmloSk2usaVvkP0CyCgOoAym-zCdgkyLJI3ozm7L8MFHdP6zqvot4iOGdDKGPTni0IJWWjy_U7awSQ4Okad1XPV9wYPcXWtjrb3l_N0-_D1NuSEcpCyBP61r5ZAeXN7rHty_DJfNdguqOt5JJz20J87G5wWQE8o8pIOBKkdMu17zl5cw7L-UroB3tOrrf2_FyWB3YW01CGt2t4_EgZQunH1Zv7vvhiwOVHQot_sphGUStmUFhGUHU7FcNi5ECvpnU572R37cDKnrcafoVMvj0J2BGuXrxJw_d91X6xGEqq6DSVgXR_GTZRzpv7P_j-r09xx91BLEPMcI3jWc5014k4N21pyQ7NFEN-C9ousnQxdHj-X7tX2eqYGFGME4Wo5ajZgXRVB9ddF_NqV5f8V_NuV3Yex7NeQbUt07uQXh_Otbi5830hAJ_9xUrAiqiammXVEskjCO34N1Ofo8ScUncvB7Jv5_NNUXMz4wDON4YpzoKJkilEEPZJfzd-D8bl-86Vm9lyq_mOUzKCd0GMVHpQhmdUR9j_FrksMsq6OJ5KN2MCuqIqDrtRSlIzfQdu1y8Hrfz-Sme9txHXq6pybNH0m0SHyrOD1oTY-1YhxQP0coYY8V9R-d9JmX3rdQmRPKRtSXnRI6WcqpVZwUHmWFg32QnR9FRh5CQnupX3VuGI6q4P2xLGrtEsGiDzdaD-U25UO89yeG9IewjxRfhO0P4MModuo7g3T2TG1DDSIVozJ5rIY-ozaiUTTM58HcH1RshCVxMDpUjBYnDhXnG2Epq8OQY5JkRZnWWVUWaQBJmUGIKc9KVmZJxYuYH6rT4ew4WtDJkV6nnlTzQ81Q1sM4fxBAt02F0o3u2_f-li_opcTqUugPzxKn9lSNexZe0GrfmaBb0x-AD079Bz-j4_vh8Hbx8LBYfqMP367o6ub795v_uv6PP-jq-vvVPX248Zcv_v6D3l3d3tw97I9Mb08dvubGEca7B7D7ARqpLx-womD3Ij-zfray29b9RmNnENdVBHP-z6abx6-a_3c5Yff2xFl1HlVFVMAZnodpkbCwCPPw7PGcsZgnAcRJVkesSOoiDMsKa6iiui6rvD4T5yxgUVCwIIxDlqTzpAYeVFnIkrpGHgKJA9yCkHMXdPNGb878Eft5mhZBfiahRGn8GzOMlX3X43BMQBgjbEkY82fvs0bNnkG6hz9Gksszfe63WdltDIkDKYw1ByVWWOnfxNmJSi5HLxlMXrPpjD9tHr3cQvevvpx1Wp7_-ksEfpH_FwAA___Ud-J3">