The intent of this patch is to make upper halves of SPE SuperRegs(s0,..,s31)
as artificial regs, similar to how X86 has done it.
And emit store /reload instructions for the required halves.
Details
Diff Detail
- Repository
- rG LLVM Github Monorepo
Event Timeline
I love the goal of this, but it looks incomplete. I only noted on one, but it's probably the same for the other tests, that the change will end up clobbering the top half of registers without saving and restoring them.
| llvm/test/CodeGen/PowerPC/fp-strict.ll | ||
|---|---|---|
| 1609 | This is wrong, because below it's evmergeloing into these registers, which clobbers the top half. | |
https://github.com/llvm/llvm-project/commit/c42f0a6e6476971974cb3f52c1138dbd8f9cca1f
The CI was failing because part of this wasn't clang-format-ed, but we don't signal that well so I don't blame you for missing it. See https://llvm.org/docs/Contributing.html#how-to-submit-a-patch for how to run it locally in future. For now I just ran it for you and updated the committed version.
Thanks for your contribution! If you are going to do more, consider getting commit access: https://llvm.org/docs/DeveloperPolicy.html#obtaining-commit-access
| llvm/lib/Target/PowerPC/PPCFrameLowering.cpp | ||
|---|---|---|
| 2348–2349 | Doesn't this invalidate the (implicit) iterators the for () loop above uses? Can we just do CSI[Idx] = CalleeSavedInfo(Lower); instead? This seems to fail on CodeGen/PowerPC/spe.ll on builds with libc++'s consistency checks enabled, https://github.com/llvm/llvm-project/issues/68594. ******************** TEST 'LLVM :: CodeGen/PowerPC/spe.ll' FAILED ********************
Exit Code: 1
Command Output (stderr):
--
RUN: at line 2: /home/kosarev/labs/llvm-project/build/debug+expensive_checks/bin/llc -verify-machineinstrs < /home/kosarev/labs/llvm-project/llvm/test/CodeGen/PowerPC/spe.ll -mtriple=powerpc-unknown-linux-gnu -mattr=+spe | /home/kosarev/labs/llvm-project/build/debug+expensive_checks/bin/FileCheck /home/kosarev/labs/llvm-project/llvm/test/CodeGen/PowerPC/spe.ll -check-prefixes=CHECK,SPE
+ /home/kosarev/labs/llvm-project/build/debug+expensive_checks/bin/llc -verify-machineinstrs -mtriple=powerpc-unknown-linux-gnu -mattr=+spe
+ /home/kosarev/labs/llvm-project/build/debug+expensive_checks/bin/FileCheck /home/kosarev/labs/llvm-project/llvm/test/CodeGen/PowerPC/spe.ll -check-prefixes=CHECK,SPE
/usr/include/c++/11/debug/safe_iterator.h:330:
In function:
gnu_debug::_Safe_iterator<_Iterator, _Sequence, _Category>&
gnu_debug::_Safe_iterator<_Iterator, _Sequence, _Category>::operator++()
[with _Iterator = gnu_cxx::normal_iterator<llvm::CalleeSavedInfo*, std::
vector<llvm::CalleeSavedInfo, std::allocator<llvm::CalleeSavedInfo> > >;
_Sequence = std::debug::vector<llvm::CalleeSavedInfo>; _Category =
std::forward_iterator_tag]
Error: attempt to increment a singular iterator.
Objects involved in the operation:
iterator "this" @ 0x7ffec8d10870 {
state = singular;
references sequence @ 0x7ffec8d10b80
}
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0. Program arguments: /home/kosarev/labs/llvm-project/build/debug+expensive_checks/bin/llc -verify-machineinstrs -mtriple=powerpc-unknown-linux-gnu -mattr=+spe
1. Running pass 'Function Pass Manager' on module '<stdin>'.
2. Running pass 'Prologue/Epilogue Insertion & Frame Finalization' on function '@test_fma'
#0 0x00007f4576a916c8 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /home/kosarev/labs/llvm-project/llvm/lib/Support/Unix/Signals.inc:723:22
#1 0x00007f4576a91ae4 PrintStackTraceSignalHandler(void*) /home/kosarev/labs/llvm-project/llvm/lib/Support/Unix/Signals.inc:798:1
#2 0x00007f4576a8ef29 llvm::sys::RunSignalHandlers() /home/kosarev/labs/llvm-project/llvm/lib/Support/Signals.cpp:105:20
#3 0x00007f4576a90f60 SignalHandler(int) /home/kosarev/labs/llvm-project/llvm/lib/Support/Unix/Signals.inc:413:1
#4 0x00007f4576316520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
#5 0x00007f457636a9fc __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
#6 0x00007f457636a9fc __pthread_kill_internal ./nptl/pthread_kill.c:78:10
#7 0x00007f457636a9fc pthread_kill ./nptl/pthread_kill.c:89:10
#8 0x00007f4576316476 gsignal ./signal/../sysdeps/posix/raise.c:27:6
#9 0x00007f45762fc7f3 abort ./stdlib/abort.c:81:7
#10 0x00007f45765a11fb std::__throw_bad_exception() (/lib/x86_64-linux-gnu/libstdc++.so.6+0xa51fb)
#11 0x00007f4580e2d6c3 __gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<llvm::CalleeSavedInfo*, std::__cxx1998::vector<llvm::CalleeSavedInfo, std::allocator<llvm::CalleeSavedInfo>>>, std::__debug::vector<llvm::CalleeSavedInfo, std::allocator<llvm::CalleeSavedInfo>>, std::forward_iterator_tag>::operator++() /usr/include/c++/11/debug/safe_iterator.h:333:49
#12 0x00007f4580e2b8da __gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<llvm::CalleeSavedInfo*, std::__cxx1998::vector<llvm::CalleeSavedInfo, std::allocator<llvm::CalleeSavedInfo>>>, std::__debug::vector<llvm::CalleeSavedInfo, std::allocator<llvm::CalleeSavedInfo>>, std::bidirectional_iterator_tag>::operator++() /usr/include/c++/11/debug/safe_iterator.h:588:10
#13 0x00007f4580e29b7e __gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<llvm::CalleeSavedInfo*, std::__cxx1998::vector<llvm::CalleeSavedInfo, std::allocator<llvm::CalleeSavedInfo>>>, std::__debug::vector<llvm::CalleeSavedInfo, std::allocator<llvm::CalleeSavedInfo>>, std::random_access_iterator_tag>::operator++() /usr/include/c++/11/debug/safe_iterator.h:743:10
#14 0x00007f4580e240d9 llvm::PPCFrameLowering::assignCalleeSavedSpillSlots(llvm::MachineFunction&, llvm::TargetRegisterInfo const*, std::__debug::vector<llvm::CalleeSavedInfo, std::allocator<llvm::CalleeSavedInfo>>&) const /home/kosarev/labs/llvm-project/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp:2338:32
#15 0x00007f4580e2751c llvm::TargetFrameLowering::assignCalleeSavedSpillSlots(llvm::MachineFunction&, llvm::TargetRegisterInfo const*, std::__debug::vector<llvm::CalleeSavedInfo, std::allocator<llvm::CalleeSavedInfo>>&, unsigned int&, unsigned int&) const /home/kosarev/labs/llvm-project/llvm/include/llvm/CodeGen/TargetFrameLowering.h:164:3
#16 0x00007f457ae1d03a assignCalleeSavedSpillSlots(llvm::MachineFunction&, llvm::BitVector const&, unsigned int&, unsigned int&) /home/kosarev/labs/llvm-project/llvm/lib/CodeGen/PrologEpilogInserter.cpp:474:7
#17 0x00007f457ae1e434 (anonymous namespace)::PEI::spillCalleeSavedRegs(llvm::MachineFunction&) /home/kosarev/labs/llvm-project/llvm/lib/CodeGen/PrologEpilogInserter.cpp:686:24
#18 0x00007f457ae1bc5c (anonymous namespace)::PEI::runOnMachineFunction(llvm::MachineFunction&) /home/kosarev/labs/llvm-project/llvm/lib/CodeGen/PrologEpilogInserter.cpp:251:43
#19 0x00007f457ab2553c llvm::MachineFunctionPass::runOnFunction(llvm::Function&) /home/kosarev/labs/llvm-project/llvm/lib/CodeGen/MachineFunctionPass.cpp:93:33
#20 0x00007f45771dd0e6 llvm::FPPassManager::runOnFunction(llvm::Function&) /home/kosarev/labs/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1435:20
#21 0x00007f45771dd496 llvm::FPPassManager::runOnModule(llvm::Module&) /home/kosarev/labs/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1481:13
#22 0x00007f45771dd917 (anonymous namespace)::MPPassManager::runOnModule(llvm::Module&) /home/kosarev/labs/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1550:20
#23 0x00007f45771d836e llvm::legacy::PassManagerImpl::run(llvm::Module&) /home/kosarev/labs/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:535:13
#24 0x00007f45771de261 llvm::legacy::PassManager::run(llvm::Module&) /home/kosarev/labs/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1678:1
#25 0x0000555a168b68c8 compileModule(char**, llvm::LLVMContext&) /home/kosarev/labs/llvm-project/llvm/tools/llc/llc.cpp:757:66
#26 0x0000555a168b4117 main /home/kosarev/labs/llvm-project/llvm/tools/llc/llc.cpp:416:35
#27 0x00007f45762fdd90 __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:58:16
#28 0x00007f45762fde40 call_init ./csu/../csu/libc-start.c:128:20
#29 0x00007f45762fde40 __libc_start_main ./csu/../csu/libc-start.c:379:5
#30 0x0000555a168b2d65 _start (/home/kosarev/labs/llvm-project/build/debug+expensive_checks/bin/llc+0xfd65) | |
| llvm/lib/Target/PowerPC/PPCFrameLowering.cpp | ||
|---|---|---|
| 2348–2349 | https://github.com/llvm/llvm-project/pull/73940 to fix this. | |
This looks like you're working around inaccurate CSR regmasks. You should try adjusting those instead