llvm / llvm/llvm-project

[opt] [licm] LNICM Not Invalidating Analysis Correctly

Open
#166,281 1 comment 0 reactions 0 assignees View on GitHub
confirmed crash-on-valid llvm:optimizations
Dominant language
LLVM
Stars
40.5k
Forks
18.7k
PR merge metrics
PR metrics pending

Description

Looks like after the LNICM pass deletes a dead instruction it does not correctly invalidate the cached DDG analysis, which causes the subsequent pass that requires the DDG analysis to use the stale information and crash.

Reproducer:
https://godbolt.org/z/81vKdcExM

Backtrace:
```PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace and instructions to reproduce the bug.
Stack dump:
0. Program arguments: /opt/compiler-explorer/clang-assertions-trunk/bin/opt -o /app/output.s -S --passes=cgscc(function(loop(require))),cgscc(function(loop-mssa(lnicm))),cgscc(function(loop(dot-ddg)))
1. Running pass "cgscc(function(loop(dot-ddg)))" on module ""
2. Running pass "loop(dot-ddg)" on function "b"
#0 0x00000000059945f8 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x59945f8)
#1 0x00000000059914a4 SignalHandler(int, siginfo_t*, void*) Signals.cpp:0:0
#2 0x0000719eac842520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
#3 0x0000000005547f0e (anonymous namespace)::TypePrinting::print(llvm::Type*, llvm::raw_ostream&) AsmWriter.cpp:0:0
#4 0x0000000005555b22 (anonymous namespace)::AssemblyWriter::printInstruction(llvm::Instruction const&) AsmWriter.cpp:0:0
#5 0x0000000005559825 llvm::Value::print(llvm::raw_ostream&, llvm::ModuleSlotTracker&, bool) const (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x5559825)
#6 0x0000000005559ddd llvm::Value::print(llvm::raw_ostream&, bool) const (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x5559ddd)
#7 0x0000000004d6e20d llvm::DOTGraphTraits::getVerboseNodeLabel[abi:cxx11](llvm::DDGNode const*, llvm::DataDependenceGraph const*) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x4d6e20d)
#8 0x0000000004d6f365 llvm::GraphWriterBase>::writeNode(llvm::DDGNode const*) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x4d6f365)
#9 0x0000000004d6f8eb llvm::raw_ostream& llvm::WriteGraph(llvm::raw_ostream&, llvm::DataDependenceGraph const* const&, bool, llvm::Twine const&) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x4d6f8eb)
#10 0x0000000004d6fb76 writeDDGToDotFile(llvm::DataDependenceGraph&, bool) DDGPrinter.cpp:0:0
#11 0x0000000004d70032 llvm::DDGDotPrinterPass::run(llvm::Loop&, llvm::AnalysisManager&, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x4d70032)
#12 0x0000000002fb607e llvm::detail::PassModel, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>::run(llvm::Loop&, llvm::AnalysisManager&, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x2fb607e)
#13 0x00000000046ef5b6 std::optional llvm::PassManager, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>::runSinglePass, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>, std::default_delete, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>>>>(llvm::Loop&, std::unique_ptr, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>, std::default_delete, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>>>&, llvm::AnalysisManager&, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&, llvm::PassInstrumentation&) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x46ef5b6)
#14 0x00000000046ef79f llvm::PassManager, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>::runWithoutLoopNestPasses(llvm::Loop&, llvm::AnalysisManager&, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x46ef79f)
#15 0x00000000046f0f04 llvm::PassManager, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>::run(llvm::Loop&, llvm::AnalysisManager&, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x46f0f04)
#16 0x00000000046f1edf llvm::FunctionToLoopPassAdaptor::run(llvm::Function&, llvm::AnalysisManager&) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x46f1edf)
#17 0x0000000000f0135e llvm::detail::PassModel>::run(llvm::Function&, llvm::AnalysisManager&) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0xf0135e)
#18 0x000000000576cc91 llvm::PassManager>::run(llvm::Function&, llvm::AnalysisManager&) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x576cc91)
#19 0x0000000000f0147e llvm::detail::PassModel>, llvm::AnalysisManager>::run(llvm::Function&, llvm::AnalysisManager&) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0xf0147e)
#20 0x0000000004d2a792 llvm::CGSCCToFunctionPassAdaptor::run(llvm::LazyCallGraph::SCC&, llvm::AnalysisManager&, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x4d2a792)
#21 0x0000000000f0019e llvm::detail::PassModel, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&>::run(llvm::LazyCallGraph::SCC&, llvm::AnalysisManager&, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0xf0019e)
#22 0x0000000004d22a22 llvm::PassManager, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&>::run(llvm::LazyCallGraph::SCC&, llvm::AnalysisManager&, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x4d22a22)
#23 0x0000000002fb4a6e llvm::detail::PassModel, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&>, llvm::AnalysisManager, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&>::run(llvm::LazyCallGraph::SCC&, llvm::AnalysisManager&, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x2fb4a6e)
#24 0x0000000004d24461 llvm::ModuleToPostOrderCGSCCPassAdaptor::run(llvm::Module&, llvm::AnalysisManager&) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x4d24461)
#25 0x0000000000f0017e llvm::detail::PassModel>::run(llvm::Module&, llvm::AnalysisManager&) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0xf0017e)
#26 0x000000000576acc1 llvm::PassManager>::run(llvm::Module&, llvm::AnalysisManager&) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x576acc1)
#27 0x0000000000986d8a llvm::runPassPipeline(llvm::StringRef, llvm::Module&, llvm::TargetMachine*, llvm::TargetLibraryInfoImpl*, llvm::ToolOutputFile*, llvm::ToolOutputFile*, llvm::ToolOutputFile*, llvm::StringRef, llvm::ArrayRef, llvm::ArrayRef>, llvm::opt_tool::OutputKind, llvm::opt_tool::VerifierKind, bool, bool, bool, bool, bool, bool, bool, bool) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x986d8a)
#28 0x000000000097b001 optMain (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x97b001)
#29 0x0000719eac829d90 (/lib/x86_64-linux-gnu/libc.so.6+0x29d90)
#30 0x0000719eac829e40 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x29e40)
#31 0x0000000000972415 _start (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x972415)
Program terminated with signal: SIGSEGV
Compiler returned: 139
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.