llvm / llvm-project

The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.
http://llvm.org
Other
28.22k stars 11.65k forks source link

Clang-19 crashed: Assertion `Reg >= X86::FP0 && Reg <= X86::FP6 && "Expected FP register!"' failed. with vectorcall attribute #98663

Open iamanonymouscs opened 2 months ago

iamanonymouscs commented 2 months ago

Clang-19 with attribute vectorcall enabled.

Compiler explorer(assertion trunck): https://godbolt.org/z/Y5MexoG68

$cat mutant.c
__attribute__((vectorcall)) void a(char, long double) {}

$clang-19 mutant.c
mutant.c:1:40: warning: omitting the parameter name in a function definition is a C23 extension [-Wc23-extensions]
    1 | __attribute__((vectorcall)) void a(char, long double) {}
      |                                        ^
mutant.c:1:53: warning: omitting the parameter name in a function definition is a C23 extension [-Wc23-extensions]
    1 | __attribute__((vectorcall)) void a(char, long double) {}
      |                                                     ^
clang-19: /root/llvm-project/llvm/lib/Target/X86/X86FloatingPoint.cpp:317: unsigned int getFPReg(const llvm::MachineOperand&): Assertion `Reg >= X86::FP0 && Reg <= X86::FP6 && "Expected FP register!"' 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: /usr/lib/llvm-19/bin/clang -cc1 -triple x86_64-pc-linux-gnu -emit-obj -dumpdir a- -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name mutant.c -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/home/code/reduce -fcoverage-compilation-dir=/home/code/reduce -resource-dir /usr/lib/llvm-19/lib/clang/19 -internal-isystem /usr/lib/llvm-19/lib/clang/19/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/11/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -ferror-limit 19 -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -fcolor-diagnostics -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /tmp/mutant-d50567.o -x c mutant.c
1.      <eof> parser at end of file
2.      Code generation
3.      Running pass 'Function Pass Manager' on module 'mutant.c'.
4.      Running pass 'X86 FP Stackifier' on function '@a'
 #0 0x00007f39e1884e86 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/usr/lib/llvm-19/bin/../lib/libLLVM.so.19.0+0xe9ee86)
 #1 0x00007f39e1882a60 llvm::sys::RunSignalHandlers() (/usr/lib/llvm-19/bin/../lib/libLLVM.so.19.0+0xe9ca60)
 #2 0x00007f39e188554b (/usr/lib/llvm-19/bin/../lib/libLLVM.so.19.0+0xe9f54b)
 #3 0x00007f39e04c6520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
 #4 0x00007f39e46d7e63 (/usr/lib/llvm-19/bin/../lib/libLLVM.so.19.0+0x3cf1e63)
 #5 0x00007f39e46d681c (/usr/lib/llvm-19/bin/../lib/libLLVM.so.19.0+0x3cf081c)
 #6 0x00007f39e1c60be8 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (/usr/lib/llvm-19/bin/../lib/libLLVM.so.19.0+0x127abe8)
 #7 0x00007f39e19d24f4 llvm::FPPassManager::runOnFunction(llvm::Function&) (/usr/lib/llvm-19/bin/../lib/libLLVM.so.19.0+0xfec4f4)
 #8 0x00007f39e19d7d73 llvm::FPPassManager::runOnModule(llvm::Module&) (/usr/lib/llvm-19/bin/../lib/libLLVM.so.19.0+0xff1d73)
 #9 0x00007f39e19d2c4e llvm::legacy::PassManagerImpl::run(llvm::Module&) (/usr/lib/llvm-19/bin/../lib/libLLVM.so.19.0+0xfecc4e)
#10 0x00007f39ea2866de 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>>, clang::BackendConsumer*) (/usr/lib/llvm-19/bin/../lib/libclang-cpp.so.19.0+0x1ddf6de)
#11 0x00007f39ea622ae2 clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) (/usr/lib/llvm-19/bin/../lib/libclang-cpp.so.19.0+0x217bae2)
#12 0x00007f39e90c5929 clang::ParseAST(clang::Sema&, bool, bool) (/usr/lib/llvm-19/bin/../lib/libclang-cpp.so.19.0+0xc1e929)
#13 0x00007f39eb115995 clang::FrontendAction::Execute() (/usr/lib/llvm-19/bin/../lib/libclang-cpp.so.19.0+0x2c6e995)
#14 0x00007f39eb086424 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (/usr/lib/llvm-19/bin/../lib/libclang-cpp.so.19.0+0x2bdf424)
#15 0x00007f39eb19213e clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (/usr/lib/llvm-19/bin/../lib/libclang-cpp.so.19.0+0x2ceb13e)
#16 0x00005640e4191ee3 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (/usr/lib/llvm-19/bin/clang+0x11ee3)
#17 0x00005640e418ef05 (/usr/lib/llvm-19/bin/clang+0xef05)
#18 0x00005640e418e0cb clang_main(int, char**, llvm::ToolContext const&) (/usr/lib/llvm-19/bin/clang+0xe0cb)
#19 0x00005640e419c366 main (/usr/lib/llvm-19/bin/clang+0x1c366)
#20 0x00007f39e04add90 (/lib/x86_64-linux-gnu/libc.so.6+0x29d90)
#21 0x00007f39e04ade40 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x29e40)
#22 0x00005640e418cb95 _start (/usr/lib/llvm-19/bin/clang+0xcb95)
clang: error: unable to execute command: Segmentation fault (core dumped)
clang: error: clang frontend command failed due to signal (use -v to see invocation)
Ubuntu clang version 19.0.0 (++20240709031326+e42f760b6551-1~exp1~20240709151424.1795)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/lib/llvm-19/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/mutant-e45fc0.c
clang: note: diagnostic msg: /tmp/mutant-e45fc0.sh
clang: note: diagnostic msg: 

********************
llvmbot commented 2 months ago

@llvm/issue-subscribers-backend-x86

Author: Anonymous (iamanonymouscs)

Clang-19 with attribute `vectorcall` enabled. Compiler explorer(assertion trunck): https://godbolt.org/z/Y5MexoG68 ``` $cat mutant.c __attribute__((vectorcall)) void a(char, long double) {} $clang-19 mutant.c mutant.c:1:40: warning: omitting the parameter name in a function definition is a C23 extension [-Wc23-extensions] 1 | __attribute__((vectorcall)) void a(char, long double) {} | ^ mutant.c:1:53: warning: omitting the parameter name in a function definition is a C23 extension [-Wc23-extensions] 1 | __attribute__((vectorcall)) void a(char, long double) {} | ^ clang-19: /root/llvm-project/llvm/lib/Target/X86/X86FloatingPoint.cpp:317: unsigned int getFPReg(const llvm::MachineOperand&): Assertion `Reg >= X86::FP0 && Reg <= X86::FP6 && "Expected FP register!"' 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: /usr/lib/llvm-19/bin/clang -cc1 -triple x86_64-pc-linux-gnu -emit-obj -dumpdir a- -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name mutant.c -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/home/code/reduce -fcoverage-compilation-dir=/home/code/reduce -resource-dir /usr/lib/llvm-19/lib/clang/19 -internal-isystem /usr/lib/llvm-19/lib/clang/19/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/11/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -ferror-limit 19 -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -fcolor-diagnostics -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /tmp/mutant-d50567.o -x c mutant.c 1. <eof> parser at end of file 2. Code generation 3. Running pass 'Function Pass Manager' on module 'mutant.c'. 4. Running pass 'X86 FP Stackifier' on function '@a' #0 0x00007f39e1884e86 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/usr/lib/llvm-19/bin/../lib/libLLVM.so.19.0+0xe9ee86) #1 0x00007f39e1882a60 llvm::sys::RunSignalHandlers() (/usr/lib/llvm-19/bin/../lib/libLLVM.so.19.0+0xe9ca60) #2 0x00007f39e188554b (/usr/lib/llvm-19/bin/../lib/libLLVM.so.19.0+0xe9f54b) #3 0x00007f39e04c6520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520) #4 0x00007f39e46d7e63 (/usr/lib/llvm-19/bin/../lib/libLLVM.so.19.0+0x3cf1e63) #5 0x00007f39e46d681c (/usr/lib/llvm-19/bin/../lib/libLLVM.so.19.0+0x3cf081c) #6 0x00007f39e1c60be8 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (/usr/lib/llvm-19/bin/../lib/libLLVM.so.19.0+0x127abe8) #7 0x00007f39e19d24f4 llvm::FPPassManager::runOnFunction(llvm::Function&) (/usr/lib/llvm-19/bin/../lib/libLLVM.so.19.0+0xfec4f4) #8 0x00007f39e19d7d73 llvm::FPPassManager::runOnModule(llvm::Module&) (/usr/lib/llvm-19/bin/../lib/libLLVM.so.19.0+0xff1d73) #9 0x00007f39e19d2c4e llvm::legacy::PassManagerImpl::run(llvm::Module&) (/usr/lib/llvm-19/bin/../lib/libLLVM.so.19.0+0xfecc4e) #10 0x00007f39ea2866de 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>>, clang::BackendConsumer*) (/usr/lib/llvm-19/bin/../lib/libclang-cpp.so.19.0+0x1ddf6de) #11 0x00007f39ea622ae2 clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) (/usr/lib/llvm-19/bin/../lib/libclang-cpp.so.19.0+0x217bae2) #12 0x00007f39e90c5929 clang::ParseAST(clang::Sema&, bool, bool) (/usr/lib/llvm-19/bin/../lib/libclang-cpp.so.19.0+0xc1e929) #13 0x00007f39eb115995 clang::FrontendAction::Execute() (/usr/lib/llvm-19/bin/../lib/libclang-cpp.so.19.0+0x2c6e995) #14 0x00007f39eb086424 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (/usr/lib/llvm-19/bin/../lib/libclang-cpp.so.19.0+0x2bdf424) #15 0x00007f39eb19213e clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (/usr/lib/llvm-19/bin/../lib/libclang-cpp.so.19.0+0x2ceb13e) #16 0x00005640e4191ee3 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (/usr/lib/llvm-19/bin/clang+0x11ee3) #17 0x00005640e418ef05 (/usr/lib/llvm-19/bin/clang+0xef05) #18 0x00005640e418e0cb clang_main(int, char**, llvm::ToolContext const&) (/usr/lib/llvm-19/bin/clang+0xe0cb) #19 0x00005640e419c366 main (/usr/lib/llvm-19/bin/clang+0x1c366) #20 0x00007f39e04add90 (/lib/x86_64-linux-gnu/libc.so.6+0x29d90) #21 0x00007f39e04ade40 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x29e40) #22 0x00005640e418cb95 _start (/usr/lib/llvm-19/bin/clang+0xcb95) clang: error: unable to execute command: Segmentation fault (core dumped) clang: error: clang frontend command failed due to signal (use -v to see invocation) Ubuntu clang version 19.0.0 (++20240709031326+e42f760b6551-1~exp1~20240709151424.1795) Target: x86_64-pc-linux-gnu Thread model: posix InstalledDir: /usr/lib/llvm-19/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/mutant-e45fc0.c clang: note: diagnostic msg: /tmp/mutant-e45fc0.sh clang: note: diagnostic msg: ******************** ```
phoebewang commented 2 months ago

The vectorcall is a calling conversion defined by MSVC, while on Windows long double is the same as double. That says, there's no defination how FP80 type being passed/returned with vectorcall. I think we should add a FE check to error out it when using long double without -mlong-double-64.