Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Clang-18 crash: error in backend: Cannot pop empty stack! #75019

Open
iamanonymouscs opened this issue Dec 11, 2023 · 3 comments
Open

Clang-18 crash: error in backend: Cannot pop empty stack! #75019

iamanonymouscs opened this issue Dec 11, 2023 · 3 comments
Labels
backend:X86 crash Prefer [crash-on-valid] or [crash-on-invalid] inline-asm

Comments

@iamanonymouscs
Copy link

Clang-18 crashes on the test case.
Compiler explorer: https://godbolt.org/z/8bTYeKP7G

$cat mutant.c
#define X2(n) X1(n##0) X1(n##1)
#define X4(n) X2(n##0) X2(n##1)
#define X8(n) X4(n##0) X4(n##1)

#ifndef __SPE__
#define FLOAT_REG_CONSTRAINT "f"
#else
#define FLOAT_REG_CONSTRAINT "r"
#endif

#ifndef __NO_FPRS__
__attribute__((noinline)) void
f (void)
{
  int mem;
#undef X1
#define X1(n) int gpr##n = 0;
  X8(a) X8(b) X8(c)
#undef X1
#define X1(n) double fpr##n = 0.0;
  X4(d)
#undef X1
#define X1(n) "+r" (gpr##n),
  asm volatile ("" : X8(a) "=m" (mem) : : "memory");
  asm volatile ("" : X8(b) "=m" (mem) : : "memory");
  asm volatile ("" : X8(c) "=m" (mem) : : "memory");
#undef X1
#define X1(n) "+" FLOAT_REG_CONSTRAINT (fpr##n),
  asm volatile ("" : X4(d) "=m" (mem) : : "memory");
#undef X1
#define X1(n) "r" (gpr##n),
  asm volatile ("" : : X8(a) "m" (mem) : "memory");
  asm volatile ("" : : X8(b) "m" (mem) : "memory");
  asm volatile ("" : : X8(c) "m" (mem) : "memory");
#undef X1
#define X1(n) FLOAT_REG_CONSTRAINT (fpr##n),
  asm volatile ("" : : X4(d) "m" (mem) : "memory");
}
#endif

int
main ()
{
#ifndef __NO_FPRS__
  f ();
#endif
  return 0;
}

$clang-18 -c mutant.c
fatal error: error in backend: Cannot pop empty stack!
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: clang-18 -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 '@f'
 #0 0x00007faa8c035266 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/usr/lib/llvm-18/bin/../lib/libLLVM-18.so.1+0xd2b266)
 #1 0x00007faa8c033170 llvm::sys::RunSignalHandlers() (/usr/lib/llvm-18/bin/../lib/libLLVM-18.so.1+0xd29170)
 #2 0x00007faa8c0348c4 llvm::sys::CleanupOnSignal(unsigned long) (/usr/lib/llvm-18/bin/../lib/libLLVM-18.so.1+0xd2a8c4)
 #3 0x00007faa8bf829ae (/usr/lib/llvm-18/bin/../lib/libLLVM-18.so.1+0xc789ae)
 #4 0x00007faa8bf8296b (/usr/lib/llvm-18/bin/../lib/libLLVM-18.so.1+0xc7896b)
 #5 0x00007faa8c02fa67 llvm::sys::Process::Exit(int, bool) (/usr/lib/llvm-18/bin/../lib/libLLVM-18.so.1+0xd25a67)
 #6 0x000055a3fcc42c23 (/usr/lib/llvm-18/bin/clang+0x13c23)
 #7 0x00007faa8bf90c4f llvm::report_fatal_error(llvm::Twine const&, bool) (/usr/lib/llvm-18/bin/../lib/libLLVM-18.so.1+0xc86c4f)
 #8 0x00007faa8bf90b26 (/usr/lib/llvm-18/bin/../lib/libLLVM-18.so.1+0xc86b26)
 #9 0x00007faa8ebfa494 (/usr/lib/llvm-18/bin/../lib/libLLVM-18.so.1+0x38f0494)
#10 0x00007faa8ebf8cba (/usr/lib/llvm-18/bin/../lib/libLLVM-18.so.1+0x38eecba)
#11 0x00007faa8ebf7bbc (/usr/lib/llvm-18/bin/../lib/libLLVM-18.so.1+0x38edbbc)
#12 0x00007faa8c3e9552 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (/usr/lib/llvm-18/bin/../lib/libLLVM-18.so.1+0x10df552)
#13 0x00007faa8c17b0df llvm::FPPassManager::runOnFunction(llvm::Function&) (/usr/lib/llvm-18/bin/../lib/libLLVM-18.so.1+0xe710df)
#14 0x00007faa8c180dc3 llvm::FPPassManager::runOnModule(llvm::Module&) (/usr/lib/llvm-18/bin/../lib/libLLVM-18.so.1+0xe76dc3)
#15 0x00007faa8c17b7d4 llvm::legacy::PassManagerImpl::run(llvm::Module&) (/usr/lib/llvm-18/bin/../lib/libLLVM-18.so.1+0xe717d4)
#16 0x00007faa9481809f 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>>) (/usr/lib/llvm-18/bin/../lib/libclang-cpp.so.18+0x1ade09f)
#17 0x00007faa94bae5fe (/usr/lib/llvm-18/bin/../lib/libclang-cpp.so.18+0x1e745fe)
#18 0x00007faa937ca866 clang::ParseAST(clang::Sema&, bool, bool) (/usr/lib/llvm-18/bin/../lib/libclang-cpp.so.18+0xa90866)
#19 0x00007faa95622645 clang::FrontendAction::Execute() (/usr/lib/llvm-18/bin/../lib/libclang-cpp.so.18+0x28e8645)
#20 0x00007faa955a0cc4 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (/usr/lib/llvm-18/bin/../lib/libclang-cpp.so.18+0x2866cc4)
#21 0x00007faa9569d1c0 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (/usr/lib/llvm-18/bin/../lib/libclang-cpp.so.18+0x29631c0)
#22 0x000055a3fcc42837 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (/usr/lib/llvm-18/bin/clang+0x13837)
#23 0x000055a3fcc3f905 (/usr/lib/llvm-18/bin/clang+0x10905)
#24 0x00007faa95238909 (/usr/lib/llvm-18/bin/../lib/libclang-cpp.so.18+0x24fe909)
#25 0x00007faa8bf8294c llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) (/usr/lib/llvm-18/bin/../lib/libLLVM-18.so.1+0xc7894c)
#26 0x00007faa952382ae clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const (/usr/lib/llvm-18/bin/../lib/libclang-cpp.so.18+0x24fe2ae)
#27 0x00007faa952000f1 clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, clang::driver::Command const*&, bool) const (/usr/lib/llvm-18/bin/../lib/libclang-cpp.so.18+0x24c60f1)
#28 0x00007faa9520033e clang::driver::Compilation::ExecuteJobs(clang::driver::JobList const&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&, bool) const (/usr/lib/llvm-18/bin/../lib/libclang-cpp.so.18+0x24c633e)
#29 0x00007faa9521c39c clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&) (/usr/lib/llvm-18/bin/../lib/libclang-cpp.so.18+0x24e239c)
#30 0x000055a3fcc3f25c clang_main(int, char**, llvm::ToolContext const&) (/usr/lib/llvm-18/bin/clang+0x1025c)
#31 0x000055a3fcc4cf32 main (/usr/lib/llvm-18/bin/clang+0x1df32)
#32 0x00007faa8a519c87 __libc_start_main /build/glibc-CVJwZb/glibc-2.27/csu/../csu/libc-start.c:344:0
#33 0x000055a3fcc3c1ea _start (/usr/lib/llvm-18/bin/clang+0xd1ea)
clang-18: error: clang frontend command failed with exit code 70 (use -v to see invocation)
Ubuntu clang version 18.0.0 (++20231018091808+48a53509e851-1~exp1~20231018091910.1571)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
clang-18: note: diagnostic msg: 
********************

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

********************
@EugeneZelenko EugeneZelenko added backend:X86 crash Prefer [crash-on-valid] or [crash-on-invalid] and removed new issue labels Dec 11, 2023
@llvmbot
Copy link
Collaborator

llvmbot commented Dec 11, 2023

@llvm/issue-subscribers-backend-x86

Author: Anonymous (iamanonymouscs)

Clang-18 crashes on the test case. Compiler explorer: https://godbolt.org/z/8bTYeKP7G ``` $cat mutant.c #define X2(n) X1(n##0) X1(n##1) #define X4(n) X2(n##0) X2(n##1) #define X8(n) X4(n##0) X4(n##1)

#ifndef SPE
#define FLOAT_REG_CONSTRAINT "f"
#else
#define FLOAT_REG_CONSTRAINT "r"
#endif

#ifndef NO_FPRS
attribute((noinline)) void
f (void)
{
int mem;
#undef X1
#define X1(n) int gpr##n = 0;
X8(a) X8(b) X8(c)
#undef X1
#define X1(n) double fpr##n = 0.0;
X4(d)
#undef X1
#define X1(n) "+r" (gpr##n),
asm volatile ("" : X8(a) "=m" (mem) : : "memory");
asm volatile ("" : X8(b) "=m" (mem) : : "memory");
asm volatile ("" : X8(c) "=m" (mem) : : "memory");
#undef X1
#define X1(n) "+" FLOAT_REG_CONSTRAINT (fpr##n),
asm volatile ("" : X4(d) "=m" (mem) : : "memory");
#undef X1
#define X1(n) "r" (gpr##n),
asm volatile ("" : : X8(a) "m" (mem) : "memory");
asm volatile ("" : : X8(b) "m" (mem) : "memory");
asm volatile ("" : : X8(c) "m" (mem) : "memory");
#undef X1
#define X1(n) FLOAT_REG_CONSTRAINT (fpr##n),
asm volatile ("" : : X4(d) "m" (mem) : "memory");
}
#endif

int
main ()
{
#ifndef NO_FPRS
f ();
#endif
return 0;
}

$clang-18 -c mutant.c
fatal error: error in backend: Cannot pop empty stack!
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: clang-18 -c mutant.c

  1.  &lt;eof&gt; 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 '@<!-- -->f'
    

#0 0x00007faa8c035266 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/usr/lib/llvm-18/bin/../lib/libLLVM-18.so.1+0xd2b266)
#1 0x00007faa8c033170 llvm::sys::RunSignalHandlers() (/usr/lib/llvm-18/bin/../lib/libLLVM-18.so.1+0xd29170)
#2 0x00007faa8c0348c4 llvm::sys::CleanupOnSignal(unsigned long) (/usr/lib/llvm-18/bin/../lib/libLLVM-18.so.1+0xd2a8c4)
#3 0x00007faa8bf829ae (/usr/lib/llvm-18/bin/../lib/libLLVM-18.so.1+0xc789ae)
#4 0x00007faa8bf8296b (/usr/lib/llvm-18/bin/../lib/libLLVM-18.so.1+0xc7896b)
#5 0x00007faa8c02fa67 llvm::sys::Process::Exit(int, bool) (/usr/lib/llvm-18/bin/../lib/libLLVM-18.so.1+0xd25a67)
#6 0x000055a3fcc42c23 (/usr/lib/llvm-18/bin/clang+0x13c23)
#7 0x00007faa8bf90c4f llvm::report_fatal_error(llvm::Twine const&, bool) (/usr/lib/llvm-18/bin/../lib/libLLVM-18.so.1+0xc86c4f)
#8 0x00007faa8bf90b26 (/usr/lib/llvm-18/bin/../lib/libLLVM-18.so.1+0xc86b26)
#9 0x00007faa8ebfa494 (/usr/lib/llvm-18/bin/../lib/libLLVM-18.so.1+0x38f0494)
#10 0x00007faa8ebf8cba (/usr/lib/llvm-18/bin/../lib/libLLVM-18.so.1+0x38eecba)
#11 0x00007faa8ebf7bbc (/usr/lib/llvm-18/bin/../lib/libLLVM-18.so.1+0x38edbbc)
#12 0x00007faa8c3e9552 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (/usr/lib/llvm-18/bin/../lib/libLLVM-18.so.1+0x10df552)
#13 0x00007faa8c17b0df llvm::FPPassManager::runOnFunction(llvm::Function&) (/usr/lib/llvm-18/bin/../lib/libLLVM-18.so.1+0xe710df)
#14 0x00007faa8c180dc3 llvm::FPPassManager::runOnModule(llvm::Module&) (/usr/lib/llvm-18/bin/../lib/libLLVM-18.so.1+0xe76dc3)
#15 0x00007faa8c17b7d4 llvm::legacy::PassManagerImpl::run(llvm::Module&) (/usr/lib/llvm-18/bin/../lib/libLLVM-18.so.1+0xe717d4)
#16 0x00007faa9481809f 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>>) (/usr/lib/llvm-18/bin/../lib/libclang-cpp.so.18+0x1ade09f)
#17 0x00007faa94bae5fe (/usr/lib/llvm-18/bin/../lib/libclang-cpp.so.18+0x1e745fe)
#18 0x00007faa937ca866 clang::ParseAST(clang::Sema&, bool, bool) (/usr/lib/llvm-18/bin/../lib/libclang-cpp.so.18+0xa90866)
#19 0x00007faa95622645 clang::FrontendAction::Execute() (/usr/lib/llvm-18/bin/../lib/libclang-cpp.so.18+0x28e8645)
#20 0x00007faa955a0cc4 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (/usr/lib/llvm-18/bin/../lib/libclang-cpp.so.18+0x2866cc4)
#21 0x00007faa9569d1c0 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (/usr/lib/llvm-18/bin/../lib/libclang-cpp.so.18+0x29631c0)
#22 0x000055a3fcc42837 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (/usr/lib/llvm-18/bin/clang+0x13837)
#23 0x000055a3fcc3f905 (/usr/lib/llvm-18/bin/clang+0x10905)
#24 0x00007faa95238909 (/usr/lib/llvm-18/bin/../lib/libclang-cpp.so.18+0x24fe909)
#25 0x00007faa8bf8294c llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) (/usr/lib/llvm-18/bin/../lib/libLLVM-18.so.1+0xc7894c)
#26 0x00007faa952382ae clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, bool) const (/usr/lib/llvm-18/bin/../lib/libclang-cpp.so.18+0x24fe2ae)
#27 0x00007faa952000f1 clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, clang::driver::Command const*&, bool) const (/usr/lib/llvm-18/bin/../lib/libclang-cpp.so.18+0x24c60f1)
#28 0x00007faa9520033e clang::driver::Compilation::ExecuteJobs(clang::driver::JobList const&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&, bool) const (/usr/lib/llvm-18/bin/../lib/libclang-cpp.so.18+0x24c633e)
#29 0x00007faa9521c39c clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&) (/usr/lib/llvm-18/bin/../lib/libclang-cpp.so.18+0x24e239c)
#30 0x000055a3fcc3f25c clang_main(int, char**, llvm::ToolContext const&) (/usr/lib/llvm-18/bin/clang+0x1025c)
#31 0x000055a3fcc4cf32 main (/usr/lib/llvm-18/bin/clang+0x1df32)
#32 0x00007faa8a519c87 __libc_start_main /build/glibc-CVJwZb/glibc-2.27/csu/../csu/libc-start.c:344:0
#33 0x000055a3fcc3c1ea _start (/usr/lib/llvm-18/bin/clang+0xd1ea)
clang-18: error: clang frontend command failed with exit code 70 (use -v to see invocation)
Ubuntu clang version 18.0.0 (++20231018091808+48a53509e851-1exp120231018091910.1571)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
clang-18: note: diagnostic msg:


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


</details>

@phoebewang
Copy link
Contributor

Similar to #73109. It is caused by illegal inline assembly. It is not a new regression and GCC also failed to compile.

@knightXun
Copy link
Contributor

similar to:

void f (void)
{
  int mem;
  double fprd00 = 0.0; double fprd01 = 0.0; double fprd10 = 0.0; double fprd11 = 0.0;
  asm volatile ("" : "+" "f" (fprd00), "+" "f" (fprd01), "+" "f" (fprd10), "+" "f" (fprd11), "=m" (mem) : : "memory");
}

knightXun added a commit to knightXun/llvm-project that referenced this issue Dec 12, 2023
to align with GCC asm: "+f" is not allowed to be used on output register.

fix issue: llvm#75019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
backend:X86 crash Prefer [crash-on-valid] or [crash-on-invalid] inline-asm
Projects
None yet
Development

No branches or pull requests

6 participants