llvm / llvm-project

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

GCC 13 miscompiles LLVM #76750

Open steven-johnson opened 9 months ago

steven-johnson commented 9 months ago

Building on x86 Linux at commit e775ba384efe31928bac796b2a4d388a1c298c5e:

Multiple crashes, first one below, remainder in enclosed text file/

[0/12] Performing build step for 'builtins'
[1/22] Building C object CMakeFiles/clang_rt.builtins-i386.dir/umodsi3.c.o
FAILED: CMakeFiles/clang_rt.builtins-i386.dir/umodsi3.c.o 
/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang --target=x86_64-unknown-linux-gnu -DVISIBILITY_HIDDEN  -O3 -DNDEBUG -m32 -fno-lto -std=c11 -fPIC -fno-builtin -fvisibility=hidden -fomit-frame-pointer -DCOMPILER_RT_HAS_FLOAT16 -MD -MT CMakeFiles/clang_rt.builtins-i386.dir/umodsi3.c.o -MF CMakeFiles/clang_rt.builtins-i386.dir/umodsi3.c.o.d -o CMakeFiles/clang_rt.builtins-i386.dir/umodsi3.c.o -c /usr/local/google/home/srj/GitHub/llvm-project/18/compiler-rt/lib/builtins/umodsi3.c
clang: /usr/local/google/home/srj/GitHub/llvm-project/18/llvm/include/llvm/Support/Casting.h:578: decltype(auto) llvm::cast(From*) [with To = ConstantInt; From = Constant]: Assertion `isa<To>(Val) && "cast<Ty>() argument of incompatible type!"' 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/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang --target=x86_64-unknown-linux-gnu -DVISIBILITY_HIDDEN -O3 -DNDEBUG -m32 -fno-lto -std=c11 -fPIC -fno-builtin -fvisibility=hidden -fomit-frame-pointer -DCOMPILER_RT_HAS_FLOAT16 -MD -MT CMakeFiles/clang_rt.builtins-i386.dir/umodsi3.c.o -MF CMakeFiles/clang_rt.builtins-i386.dir/umodsi3.c.o.d -o CMakeFiles/clang_rt.builtins-i386.dir/umodsi3.c.o -c /usr/local/google/home/srj/GitHub/llvm-project/18/compiler-rt/lib/builtins/umodsi3.c
1.  <eof> parser at end of file
2.  Optimizer
 #0 0x00005618ddad221b llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x32db21b)
 #1 0x00005618ddacf3cb llvm::sys::RunSignalHandlers() (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x32d83cb)
 #2 0x00005618dda17a68 CrashRecoverySignalHandler(int) CrashRecoveryContext.cpp:0:0
 #3 0x00007f498457b510 (/lib/x86_64-linux-gnu/libc.so.6+0x3c510)
 #4 0x00007f49845c90fc __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
 #5 0x00007f498457b472 raise ./signal/../sysdeps/posix/raise.c:27:6
 #6 0x00007f49845654b2 abort ./stdlib/abort.c:81:7
 #7 0x00007f49845653d5 _nl_load_domain ./intl/loadmsgcat.c:1177:9
 #8 0x00007f49845743a2 (/lib/x86_64-linux-gnu/libc.so.6+0x353a2)
 #9 0x00005618dccb9e5b llvm::ScalarEvolution::getNegativeSCEV(llvm::SCEV const*, llvm::SCEV::NoWrapFlags) (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x24c2e5b)
#10 0x00005618dccb2de2 llvm::ScalarEvolution::getMinusSCEV(llvm::SCEV const*, llvm::SCEV const*, llvm::SCEV::NoWrapFlags, unsigned int) (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x24bbde2)
#11 0x00005618dcccdaa1 llvm::ScalarEvolution::computeExitLimitFromICmp(llvm::Loop const*, llvm::CmpInst::Predicate, llvm::SCEV const*, llvm::SCEV const*, bool, bool) (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x24d6aa1)
#12 0x00005618dcccdf27 llvm::ScalarEvolution::computeExitLimitFromICmp(llvm::Loop const*, llvm::ICmpInst*, bool, bool, bool) (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x24d6f27)
#13 0x00005618dccce1b3 llvm::ScalarEvolution::computeExitLimitFromCondImpl(llvm::ScalarEvolution::ExitLimitCache&, llvm::Loop const*, llvm::Value*, bool, bool, bool) (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x24d71b3)
#14 0x00005618dccce720 llvm::ScalarEvolution::computeExitLimitFromCondCached(llvm::ScalarEvolution::ExitLimitCache&, llvm::Loop const*, llvm::Value*, bool, bool, bool) (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x24d7720)
#15 0x00005618dccce8dc llvm::ScalarEvolution::computeExitLimitFromCond(llvm::Loop const*, llvm::Value*, bool, bool, bool) (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x24d78dc)
#16 0x00005618dcc9cf46 llvm::ScalarEvolution::computeExitLimit(llvm::Loop const*, llvm::BasicBlock*, bool) (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x24a5f46)
#17 0x00005618dcc9d5da llvm::ScalarEvolution::computeBackedgeTakenCount(llvm::Loop const*, bool) (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x24a65da)
#18 0x00005618dcc9e5d8 llvm::ScalarEvolution::getBackedgeTakenInfo(llvm::Loop const*) (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x24a75d8)
#19 0x00005618dccb24b1 llvm::ScalarEvolution::proveNoWrapViaConstantRanges(llvm::SCEVAddRecExpr const*) (.part.0) ScalarEvolution.cpp:0:0
#20 0x00005618dcc995b0 llvm::ScalarEvolution::createSimpleAffineAddRec(llvm::PHINode*, llvm::Value*, llvm::Value*) (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x24a25b0)
#21 0x00005618dcc99991 llvm::ScalarEvolution::createAddRecFromPHI(llvm::PHINode*) (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x24a2991)
#22 0x00005618dcc9a341 llvm::ScalarEvolution::createNodeForPHI(llvm::PHINode*) (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x24a3341)
#23 0x00005618dcc9c2c7 llvm::ScalarEvolution::createSCEVIter(llvm::Value*) (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x24a52c7)
#24 0x00005618e152c14c (anonymous namespace)::State::addInfoFor(llvm::BasicBlock&) ConstraintElimination.cpp:0:0
#25 0x00005618e153782f eliminateConstraints(llvm::Function&, llvm::DominatorTree&, llvm::LoopInfo&, llvm::ScalarEvolution&, llvm::OptimizationRemarkEmitter&) ConstraintElimination.cpp:0:0
#26 0x00005618e1539a79 llvm::ConstraintEliminationPass::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x6d42a79)
#27 0x00005618dedebf3d llvm::detail::PassModel<llvm::Function, llvm::ConstraintEliminationPass, llvm::PreservedAnalyses, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x45f4f3d)
#28 0x00005618dc056322 llvm::detail::PassModel<llvm::Function, llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>, llvm::PreservedAnalyses, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x185f322)
#29 0x00005618e1793ea0 llvm::CGSCCToFunctionPassAdaptor::run(llvm::LazyCallGraph::SCC&, llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>&, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&) (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x6f9cea0)
#30 0x00005618dedeae7d llvm::detail::PassModel<llvm::LazyCallGraph::SCC, llvm::CGSCCToFunctionPassAdaptor, llvm::PreservedAnalyses, llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&>::run(llvm::LazyCallGraph::SCC&, llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>&, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&) (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x45f3e7d)
#31 0x00005618e178d47f llvm::PassManager<llvm::LazyCallGraph::SCC, llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&>::run(llvm::LazyCallGraph::SCC&, llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>&, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&) (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x6f9647f)
#32 0x00005618dedeae3d llvm::detail::PassModel<llvm::LazyCallGraph::SCC, llvm::PassManager<llvm::LazyCallGraph::SCC, llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&>, llvm::PreservedAnalyses, llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&>::run(llvm::LazyCallGraph::SCC&, llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>&, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&) (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x45f3e3d)
#33 0x00005618e1794b3d llvm::DevirtSCCRepeatedPass::run(llvm::LazyCallGraph::SCC&, llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>&, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&) (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x6f9db3d)
#34 0x00005618dedeae5d llvm::detail::PassModel<llvm::LazyCallGraph::SCC, llvm::DevirtSCCRepeatedPass, llvm::PreservedAnalyses, llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&>::run(llvm::LazyCallGraph::SCC&, llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>&, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&) (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x45f3e5d)
#35 0x00005618e178efb7 llvm::ModuleToPostOrderCGSCCPassAdaptor::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x6f97fb7)
#36 0x00005618df092ce3 llvm::ModuleInlinerWrapperPass::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x489bce3)
#37 0x00005618dedea9fd llvm::detail::PassModel<llvm::Module, llvm::ModuleInlinerWrapperPass, llvm::PreservedAnalyses, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x45f39fd)
#38 0x00005618dd5b61c1 llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x2dbf1c1)
#39 0x00005618ddd36bca (anonymous namespace)::EmitAssemblyHelper::RunOptimizationPipeline(clang::BackendAction, std::unique_ptr<llvm::raw_pwrite_stream, std::default_delete<llvm::raw_pwrite_stream>>&, std::unique_ptr<llvm::ToolOutputFile, std::default_delete<llvm::ToolOutputFile>>&, clang::BackendConsumer*) BackendUtil.cpp:0:0
#40 0x00005618ddd39f0c 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/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x3542f0c)
#41 0x00005618de320bce clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x3b29bce)
#42 0x00005618dfec7d29 clang::ParseAST(clang::Sema&, bool, bool) (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x56d0d29)
#43 0x00005618de5bdf59 clang::FrontendAction::Execute() (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x3dc6f59)
#44 0x00005618de540332 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x3d49332)
#45 0x00005618de68d23f clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x3e9623f)
#46 0x00005618db92b97d cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x113497d)
#47 0x00005618db92380f ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&, llvm::ToolContext const&) driver.cpp:0:0
#48 0x00005618de365219 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
#49 0x00005618dda17ec2 llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x3220ec2)
#50 0x00005618de366918 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
#51 0x00005618de32b6d5 clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, clang::driver::Command const*&, bool) const (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x3b346d5)
#52 0x00005618de32c1cd clang::driver::Compilation::ExecuteJobs(clang::driver::JobList const&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&, bool) const (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x3b351cd)
#53 0x00005618de3384e4 clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&) (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x3b414e4)
#54 0x00005618db9291c7 clang_main(int, char**, llvm::ToolContext const&) (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x11321c7)
#55 0x00005618db81f301 main (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x1028301)
#56 0x00007f49845666ca __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:74:3
#57 0x00007f4984566785 call_init ./csu/../csu/libc-start.c:128:20
#58 0x00007f4984566785 __libc_start_main ./csu/../csu/libc-start.c:347:5
#59 0x00005618db922541 _start (/usr/local/google/home/srj/GitHub/llvm-project/18/build/./bin/clang+0x112b541)
clang: error: clang frontend command failed with exit code 134 (use -v to see invocation)
clang version 18.0.0git (https://github.com/llvm/llvm-project e775ba384efe31928bac796b2a4d388a1c298c5e)
Target: i386-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/local/google/home/srj/GitHub/llvm-project/18/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/umodsi3-542cd4.c
clang: note: diagnostic msg: /tmp/umodsi3-542cd4.sh
clang: note: diagnostic msg: 

cfiles.zip shfiles.zip crash.dump.txt

steven-johnson commented 9 months ago

FYI, my LLVM CMake build config looks like:

  cmake \
    -D CMAKE_BUILD_TYPE=Release \
    -D CMAKE_INSTALL_PREFIX="${HOME}/llvm-$n-install" \
    -D BUILTINS_CMAKE_ARGS=-DCOMPILER_RT_ENABLE_IOS=OFF \
    -D LLVM_BUILD_32_BITS=OFF \
    -D LLVM_CCACHE_BUILD=ON \
    -D LLVM_CCACHE_MAXSIZE=20G \
    -D LLVM_ENABLE_ASSERTIONS=ON \
    -D LLVM_ENABLE_BINDINGS=OFF \
    -D LLVM_ENABLE_DIA_SDK=OFF \
    -D LLVM_ENABLE_CURL=OFF \
    -D LLVM_ENABLE_HTTPLIB=OFF \
    -D LLVM_ENABLE_IDE=OFF \
    -D LLVM_ENABLE_LIBXML2=OFF \
    -D LLVM_ENABLE_OCAMLDOC=OFF \
    -D LLVM_ENABLE_PROJECTS="clang;lld;clang-tools-extra" \
    -D LLVM_ENABLE_RUNTIMES="compiler-rt;libcxx;libcxxabi;libunwind" \
    -D LLVM_ENABLE_RTTI=ON \
    -D LLVM_ENABLE_TERMINFO=OFF \
    -D LLVM_ENABLE_WARNINGS=OFF \
    -D LLVM_ENABLE_ZLIB=ON \
    -D LLVM_ENABLE_ZSTD=OFF \
    -D LLVM_INCLUDE_BENCHMARKS=OFF \
    -D LLVM_INCLUDE_EXAMPLES=OFF \
    -D LLVM_INCLUDE_TESTS=OFF \
    -D LLVM_TARGETS_TO_BUILD="X86;ARM;NVPTX;AArch64;PowerPC;Hexagon;WebAssembly;RISCV" \
steven-johnson commented 9 months ago

This is actually pretty baffling: LLVM 17 and 16 build just fine for me, but I tried to bisect an injection point and get the same failure mode all the way back to November revisions of the main branch. Something peculiar about my build environment? Suggestions welcome.

fhahn commented 9 months ago

@steven-johnson Is it possible to extract the IR before the crashing pass, via -mllvm -print-on-crash -mllvm -print-module-scope (might take very long if the module is big) or -mllvm -print-before=constraint-elimination -mllvm -print-module-scope (might print a lot but might be quicker)

steven-johnson commented 9 months ago

I'm now unable to repro the failure (baffling) -- I'm closing this until I can repro. Sorry for the noise.

nikic commented 9 months ago

This happens when building LLVM with GCC 13.

nikic commented 9 months ago

This started occurring with https://github.com/llvm/llvm-project/commit/673a4671f3e8b7158d990f6456428175a6eac38c, see the comments there.

nikic commented 9 months ago

The bug manifests like this:

; RUN: opt -S -passes=instcombine < %s
define i8 @test() {
  %sub = sub i8 10, 8
  ret i8 %sub
}

Results in:

define i8 @test() {
  ret i8 sub (i8 10, i8 8)
}

So we end up creating a constant expression instead of folding to a constant.

nikic commented 9 months ago

Per https://bugzilla.redhat.com/show_bug.cgi?id=2255518 this affects the GCC 13.2 from Fedora, but not the one from Ubuntu.

nikic commented 9 months ago

49e3e7514309823e39627175d5337c5d5aff92c1 perturbs things just enough to avoid the miscompile.