Hi @jrtc27 , sorry for the delayed reply
I simplified my C Builtin to not take arguments. Therefore, I no longer need to worry about the a0-a3 registers. When the intrinsic calls, the following instruction is executed:
accelerator.add
void __builtin_riscv_accelerator_add();
The changes I made are somewhat extensive. You can view them as a git diff in the following file on my Google Drive:
(Sorry, I have to share the changes this way.)
(This changes include adding C Builtin and adding new assembly instruction accelerator.add, which I want to execute using C Builtin)
I can build LLVM without any errors.
However, when I compile a program using the __builtin_riscv_accelerator_add() Builtin, I encounter an error. As I am new to LLVM, I don’t understand much. My guess is that something is wrong with my SelectionDAG part, how I handle intrinsic in the back-end
The error message appears as follows:
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: riscv64-unknown-linux-gnu-clang -v -O0 -S -o vadd_cpu_builtins.s vadd_mproc.c -DMPROC
1. <eof> parser at end of file
2. Code generation
3. Running pass 'Function Pass Manager' on module 'vadd_mproc.c'.
4. Running pass 'RISC-V DAG->DAG Pattern Instruction Selection' on function '@accelerator_vadd'
#0 0x000055aa4f7571a0 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/home/omega/Work/Office/riscv-llvm/bin/clang-17+0x1a951a0)
#1 0x000055aa4f755064 llvm::sys::CleanupOnSignal(unsigned long) (/home/omega/Work/Office/=riscv-llvm/bin/clang-17+0x1a93064)
#2 0x000055aa4f6a3cf8 CrashRecoverySignalHandler(int) CrashRecoveryContext.cpp:0:0
#3 0x00007fcd22b2f420 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x14420)
#4 0x000055aa506e91b6 llvm::SelectionDAG::getNode(unsigned int, llvm::SDLoc const&, llvm::SDVTList, llvm::ArrayRef<llvm::SDValue>, llvm::SDNodeFlags) (/home/omega/Work/Office/riscv-llvm/bin/clang-17+0x2a271b6)
#5 0x000055aa5067754f llvm::SelectionDAGBuilder::visitTargetIntrinsic(llvm::CallInst const&, unsigned int) (/home/omega/Work/Office/riscv-llvm/bin/clang-17+0x29b554f)
#6 0x000055aa50655fa4 llvm::SelectionDAGBuilder::visitIntrinsicCall(llvm::CallInst const&, unsigned int) (/home/omega/Work/Office/riscv-llvm/bin/clang-17+0x2993fa4)
#7 0x000055aa50697c10 llvm::SelectionDAGBuilder::visit(llvm::Instruction const&) (/home/omega/Work/Office/riscv-llvm/bin/clang-17+0x29d5c10)
#8 0x000055aa50706686 llvm::SelectionDAGISel::SelectBasicBlock(llvm::ilist_iterator<llvm::ilist_detail::node_options<llvm::Instruction, false, false, void>, false, true>, llvm::ilist_iterator<llvm::ilist_detail::node_options<llvm::Instruction, false, false, void>, false, true>, bool&) (/home/omega/Work/Office/riscv-llvm/bin/clang-17+0x2a44686)
#9 0x000055aa50707b8c llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) (/home/omega/Work/Office/riscv-llvm/bin/clang-17+0x2a45b8c)
#10 0x000055aa50709e8e llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) (.part.0) SelectionDAGISel.cpp:0:0
#11 0x000055aa4eca9bb4 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (.part.0) MachineFunctionPass.cpp:0:0
#12 0x000055aa4f2067ca llvm::FPPassManager::runOnFunction(llvm::Function&) (/home/omega/Work/Office/riscv-llvm/bin/clang-17+0x15447ca)
#13 0x000055aa4f206954 llvm::FPPassManager::runOnModule(llvm::Module&) (/home/omega/Work/Office/riscv-llvm/bin/clang-17+0x1544954)
#14 0x000055aa4f207354 llvm::legacy::PassManagerImpl::run(llvm::Module&) (/home/omega/Work/Office/riscv-llvm/bin/clang-17+0x1545354)
#15 0x000055aa4f998410 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>>) (/home/omega/Work/Office/riscv-llvm/bin/clang-17+0x1cd6410)
#16 0x000055aa50869c54 clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) (/home/omega/Work/Office/riscv-llvm/bin/clang-17+0x2ba7c54)
#17 0x000055aa5175fa79 clang::ParseAST(clang::Sema&, bool, bool) (/home/omega/Work/Office/riscv-llvm/bin/clang-17+0x3a9da79)
#18 0x000055aa501a09e9 clang::FrontendAction::Execute() (/home/omega/Work/Office/riscv-llvm/bin/clang-17+0x24de9e9)
#19 0x000055aa50129121 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (/home/omega/Work/Office/riscv-llvm/bin/clang-17+0x2467121)
#20 0x000055aa50264443 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (/home/omega/Work/Office/riscv-llvm/bin/clang-17+0x25a2443)
#21 0x000055aa4e815b6b cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (/home/omega/Work/Office/riscv-llvm/bin/clang-17+0xb53b6b)
#22 0x000055aa4e80eced ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&, llvm::ToolContext const&) driver.cpp:0:0
#23 0x000055aa4ff6842d 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
#24 0x000055aa4f6a41c7 llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) (/home/omega/Work/Office/riscv-llvm/bin/clang-17+0x19e21c7)
#25 0x000055aa4ff687c7 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
#26 0x000055aa4ff31351 clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, clang::driver::Command const*&, bool) const (/home/omega/Work/Office/riscv-llvm/bin/clang-17+0x226f351)
#27 0x000055aa4ff31e0d clang::driver::Compilation::ExecuteJobs(clang::driver::JobList const&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&, bool) const (/home/omega/Work/Office/riscv-llvm/bin/clang-17+0x226fe0d)
#28 0x000055aa4ff4324c clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&) (/home/omega/Work/Office/riscv-llvm/bin/clang-17+0x228124c)
#29 0x000055aa4e81379f clang_main(int, char**, llvm::ToolContext const&) (/home/omega/Work/Office/riscv-llvm/bin/clang-17+0xb5179f)
#30 0x000055aa4e763ac3 main (/home/omega/Work/Office/riscv-llvm/bin/clang-17+0xaa1ac3)
#31 0x00007fcd22517083 __libc_start_main /build/glibc-e2p3jK/glibc-2.31/csu/../csu/libc-start.c:342:3
#32 0x000055aa4e80e16e _start (/home/omega/Work/Office/riscv-llvm/bin/clang-17+0xb4c16e)
riscv64-unknown-linux-gnu-clang: error: clang frontend command failed with exit code 139 (use -v to see invocation)
clang version 17.0.2 (https://github.com/llvm/llvm-project.git b2417f51dbbd7435eb3aaf203de24de6754da50e)
Target: riscv64-unknown-linux-gnu
Thread model: posix
InstalledDir: /home/omega/Work/Office/riscv-llvm/bin
riscv64-unknown-linux-gnu-clang: note: diagnostic msg:
********************
PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
riscv64-unknown-linux-gnu-clang: note: diagnostic msg: /tmp/vadd_mproc-8d5b66.c
riscv64-unknown-linux-gnu-clang: note: diagnostic msg: /tmp/vadd_mproc-8d5b66.sh
riscv64-unknown-linux-gnu-clang: note: diagnostic msg:
********************