Skip to content

clang-19: Assertion failure in LoopInstSimplify (LCSSA violation) when compiling Abseil btree_set with -fopencilk -O3 #429

@biqar

Description

@biqar

Describe the bug

OpenCilk's clang-19 crashes with an internal assertion failure during the optimization pipeline when compiling C++17 code that uses absl::btree_set from the Abseil library at -O3 with -fopencilk. The crash occurs in LoopInstSimplify due to a Loop-Closed SSA (LCSSA) invariant violation, suggesting that OpenCilk's task-simplify passes are corrupting loop IR in a way that the downstream loop-instsimplify pass does not expect.
The bug does not reproduce with non-Abseil container types (e.g. std::set, std::unordered_set, TLX btree) under the same compiler flags, suggesting the interaction is specific to Abseil's heavily templated btree internals.

Expected behavior

Successfully able to compile the code.

OpenCilk version

System information

  • OS: Ubuntu 24.04.4
  • CPU: AMD EPYC 9555

Steps to reproduce (include relevant output)

  1. Install Abseil (tested with a recent release built with -DCMAKE_CXX_STANDARD=17)
  2. Compile any translation unit that uses absl::btree_set with the following flags:
clang++ -std=c++17 -fopencilk -O3 -I<abseil_install>/include source.cpp

Working example code

Attached the preprocessed source.

Additional comments

Full stack trace:

clang-19: /home/rislam63/opencilk/llvm/lib/Transforms/Scalar/LoopInstSimplify.cpp:127: bool simplifyLoopInst(llvm::Loop&, llvm::DominatorTree&, llvm::LoopInfo&, llvm::AssumptionCache&, const llvm::TargetLibraryInfo&, llvm::MemorySSAUpdater*): Assertion `(L.contains(UserI) || isa<PHINode>(UserI)) && "Uses outside the loop should be PHI nodes due to LCSSA!"' failed.
PLEASE submit a bug report to https://github.com/OpenCilk/opencilk-project/issues/ and include the crash backtrace, preprocessed source, and associated run script.
Stack dump:
0.      Program arguments: /home/rislam63/opencilk/build/bin/clang-19 -cc1 -triple x86_64-unknown-linux-gnu -emit-obj -dumpdir PageRank_absl_btree_set- -disable-free -clear-ast-before-backend -main-file-name PageRank.C -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=none -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debug-info-kind=constructor -dwarf-version=5 -debugger-tuning=gdb -fdebug-compilation-dir=/home/rislam63/graphbolt/apps -fcoverage-compilation-dir=/home/rislam63/graphbolt/apps -resource-dir /home/rislam63/opencilk/build/lib/clang/19 -D CILK -D EDGELONG -I ../external/tlx -I ../external/alex/src -I ../external/dhb/include -I ../external/abseil/install/include -D USE_ABSL_BTREE_SET -c-isystem /home/rislam63/opencilk/build/include -c-isystem . -cxx-isystem /home/rislam63/opencilk/build/include -cxx-isystem . -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/x86_64-linux-gnu/c++/13 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/backward -internal-isystem /home/rislam63/opencilk/build/lib/clang/19/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/13/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -O3 -std=c++17 -fdeprecated-macro -ferror-limit 19 -fopencilk --opencilk-abi-bitcode=/home/rislam63/opencilk/build/lib/clang/19/lib/x86_64-unknown-linux-gnu/libopencilk-abi.bc -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -fcxx-exceptions -fexceptions -fcolor-diagnostics -vectorize-loops -vectorize-slp -stripmine-loops -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /tmp/PageRank-c9aa88.o -x c++ PageRank.C
1.      <eof> parser at end of file
2.      Optimizer
3.      Running pass "require<globals-aa>,function(invalidate<aa>),require<profile-summary>,cgscc(devirt<4>(inline,function-attrs<skip-non-recursive-function-attrs>,argpromotion,openmp-opt-cgscc,function<eager-inv;no-rerun>(sroa<modify-cfg>,early-cse<memssa>,speculative-execution<only-if-divergent-target>,jump-threading,correlated-propagation,simplifycfg<bonus-inst-threshold=1;no-forward-switch-cond;switch-range-to-icmp;no-switch-to-lookup;keep-loops;no-hoist-common-insts;no-sink-common-insts;speculate-blocks;simplify-cond-branch;no-speculate-unpredictables>,task-simplify,instcombine<max-iterations=1;no-use-loop-info;no-verify-fixpoint>,aggressive-instcombine,libcalls-shrinkwrap,tailcallelim,simplifycfg<bonus-inst-threshold=1;no-forward-switch-cond;switch-range-to-icmp;no-switch-to-lookup;keep-loops;no-hoist-common-insts;no-sink-common-insts;speculate-blocks;simplify-cond-branch;no-speculate-unpredictables>,task-simplify,reassociate,constraint-elimination,loop-mssa(loop-instsimplify,loop-simplifycfg,licm<no-allowspeculation>,loop-rotate<header-duplication;no-prepare-for-lto>,licm<allowspeculation>,simple-loop-unswitch<nontrivial;trivial>),simplifycfg<bonus-inst-threshold=1;no-forward-switch-cond;switch-range-to-icmp;no-switch-to-lookup;keep-loops;no-hoist-common-insts;no-sink-common-insts;speculate-blocks;simplify-cond-branch;no-speculate-unpredictables>,task-simplify,instcombine<max-iterations=1;no-use-loop-info;no-verify-fixpoint>,loop(loop-idiom,indvars,simple-loop-unswitch<nontrivial;trivial>,loop-deletion,loop-unroll-full),sroa<modify-cfg>,vector-combine,mldst-motion<no-split-footer-bb>,gvn<>,sccp,bdce,instcombine<max-iterations=1;no-use-loop-info;no-verify-fixpoint>,jump-threading,correlated-propagation,adce,memcpyopt,dse,move-auto-init,loop-mssa(licm<allowspeculation>),coro-elide,simplifycfg<bonus-inst-threshold=1;no-forward-switch-cond;switch-range-to-icmp;no-switch-to-lookup;keep-loops;hoist-common-insts;sink-common-insts;speculate-blocks;simplify-cond-branch;no-speculate-unpredictables>,task-simplify,instcombine<max-iterations=1;no-use-loop-info;no-verify-fixpoint>),function-attrs,function(require<should-not-run-function-passes>),coro-split)),function(invalidate<should-not-run-function-passes>),cgscc(devirt<4>())" on module "PageRank.C"
4.      Running pass "cgscc(devirt<4>(inline,function-attrs<skip-non-recursive-function-attrs>,argpromotion,openmp-opt-cgscc,function<eager-inv;no-rerun>(sroa<modify-cfg>,early-cse<memssa>,speculative-execution<only-if-divergent-target>,jump-threading,correlated-propagation,simplifycfg<bonus-inst-threshold=1;no-forward-switch-cond;switch-range-to-icmp;no-switch-to-lookup;keep-loops;no-hoist-common-insts;no-sink-common-insts;speculate-blocks;simplify-cond-branch;no-speculate-unpredictables>,task-simplify,instcombine<max-iterations=1;no-use-loop-info;no-verify-fixpoint>,aggressive-instcombine,libcalls-shrinkwrap,tailcallelim,simplifycfg<bonus-inst-threshold=1;no-forward-switch-cond;switch-range-to-icmp;no-switch-to-lookup;keep-loops;no-hoist-common-insts;no-sink-common-insts;speculate-blocks;simplify-cond-branch;no-speculate-unpredictables>,task-simplify,reassociate,constraint-elimination,loop-mssa(loop-instsimplify,loop-simplifycfg,licm<no-allowspeculation>,loop-rotate<header-duplication;no-prepare-for-lto>,licm<allowspeculation>,simple-loop-unswitch<nontrivial;trivial>),simplifycfg<bonus-inst-threshold=1;no-forward-switch-cond;switch-range-to-icmp;no-switch-to-lookup;keep-loops;no-hoist-common-insts;no-sink-common-insts;speculate-blocks;simplify-cond-branch;no-speculate-unpredictables>,task-simplify,instcombine<max-iterations=1;no-use-loop-info;no-verify-fixpoint>,loop(loop-idiom,indvars,simple-loop-unswitch<nontrivial;trivial>,loop-deletion,loop-unroll-full),sroa<modify-cfg>,vector-combine,mldst-motion<no-split-footer-bb>,gvn<>,sccp,bdce,instcombine<max-iterations=1;no-use-loop-info;no-verify-fixpoint>,jump-threading,correlated-propagation,adce,memcpyopt,dse,move-auto-init,loop-mssa(licm<allowspeculation>),coro-elide,simplifycfg<bonus-inst-threshold=1;no-forward-switch-cond;switch-range-to-icmp;no-switch-to-lookup;keep-loops;hoist-common-insts;sink-common-insts;speculate-blocks;simplify-cond-branch;no-speculate-unpredictables>,task-simplify,instcombine<max-iterations=1;no-use-loop-info;no-verify-fixpoint>),function-attrs,function(require<should-not-run-function-passes>),coro-split))" on module "PageRank.C"
5.      Running pass "loop-mssa(loop-instsimplify,loop-simplifycfg,licm<no-allowspeculation>,loop-rotate<header-duplication;no-prepare-for-lto>,licm<allowspeculation>,simple-loop-unswitch<nontrivial;trivial>)" on function "_ZN18graph_StdContainerI31asymmetricNeighborsAbslBtreeSetEC2EjmPjPlb"
 #0 0x00005956047e8ea2 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/home/rislam63/opencilk/build/bin/clang-19+0x2884ea2)
 #1 0x00005956047e5f1f llvm::sys::RunSignalHandlers() (/home/rislam63/opencilk/build/bin/clang-19+0x2881f1f)
 #2 0x00005956047e6065 SignalHandler(int) Signals.cpp:0:0
 #3 0x0000739937645330 (/lib/x86_64-linux-gnu/libc.so.6+0x45330)
 #4 0x000073993769eb2c __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
 #5 0x000073993769eb2c __pthread_kill_internal ./nptl/pthread_kill.c:78:10
 #6 0x000073993769eb2c pthread_kill ./nptl/pthread_kill.c:89:10
 #7 0x000073993764527e raise ./signal/../sysdeps/posix/raise.c:27:6
 #8 0x00007399376288ff abort ./stdlib/abort.c:81:7
 #9 0x000073993762881b _nl_load_domain ./intl/loadmsgcat.c:1177:9
#10 0x000073993763b517 (/lib/x86_64-linux-gnu/libc.so.6+0x3b517)
#11 0x0000595608a797ae llvm::LoopInstSimplifyPass::run(llvm::Loop&, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>&, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&) (/home/rislam63/opencilk/build/bin/clang-19+0x6b157ae)
#12 0x0000595605d34665 llvm::detail::PassModel<llvm::Loop, llvm::LoopInstSimplifyPass, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>::run(llvm::Loop&, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>&, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&) (/home/rislam63/opencilk/build/bin/clang-19+0x3dd0665)
#13 0x0000595604602973 llvm::PassManager<llvm::Loop, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>::runWithoutLoopNestPasses(llvm::Loop&, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>&, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&) (/home/rislam63/opencilk/build/bin/clang-19+0x269e973)
#14 0x000059560460241c llvm::PassManager<llvm::Loop, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>::run(llvm::Loop&, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>&, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&) (/home/rislam63/opencilk/build/bin/clang-19+0x269e41c)
#15 0x0000595604604256 llvm::FunctionToLoopPassAdaptor::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/home/rislam63/opencilk/build/bin/clang-19+0x26a0256)
#16 0x000059560331b4d5 llvm::detail::PassModel<llvm::Function, llvm::FunctionToLoopPassAdaptor, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/home/rislam63/opencilk/build/bin/clang-19+0x13b74d5)
#17 0x0000595604299d2e llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/home/rislam63/opencilk/build/bin/clang-19+0x2335d2e)
#18 0x000059560331ada5 llvm::detail::PassModel<llvm::Function, llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/home/rislam63/opencilk/build/bin/clang-19+0x13b6da5)
#19 0x0000595608c14b36 llvm::CGSCCToFunctionPassAdaptor::run(llvm::LazyCallGraph::SCC&, llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>&, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&) (/home/rislam63/opencilk/build/bin/clang-19+0x6cb0b36)
#20 0x0000595605d30ee5 llvm::detail::PassModel<llvm::LazyCallGraph::SCC, llvm::CGSCCToFunctionPassAdaptor, 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&) (/home/rislam63/opencilk/build/bin/clang-19+0x3dccee5)
#21 0x0000595608c0eefd 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&) (/home/rislam63/opencilk/build/bin/clang-19+0x6caaefd)
#22 0x0000595605d30e45 llvm::detail::PassModel<llvm::LazyCallGraph::SCC, llvm::PassManager<llvm::LazyCallGraph::SCC, llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&>, 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&) (/home/rislam63/opencilk/build/bin/clang-19+0x3dcce45)
#23 0x0000595608c15c25 llvm::DevirtSCCRepeatedPass::run(llvm::LazyCallGraph::SCC&, llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>&, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&) (/home/rislam63/opencilk/build/bin/clang-19+0x6cb1c25)
#24 0x0000595605d30e95 llvm::detail::PassModel<llvm::LazyCallGraph::SCC, llvm::DevirtSCCRepeatedPass, 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&) (/home/rislam63/opencilk/build/bin/clang-19+0x3dcce95)
#25 0x0000595608c10ae8 llvm::ModuleToPostOrderCGSCCPassAdaptor::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/home/rislam63/opencilk/build/bin/clang-19+0x6cacae8)
#26 0x0000595605d30df5 llvm::detail::PassModel<llvm::Module, llvm::ModuleToPostOrderCGSCCPassAdaptor, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/home/rislam63/opencilk/build/bin/clang-19+0x3dccdf5)
#27 0x0000595604296ded llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/home/rislam63/opencilk/build/bin/clang-19+0x2332ded)
#28 0x000059560601d467 llvm::ModuleInlinerWrapperPass::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/home/rislam63/opencilk/build/bin/clang-19+0x40b9467)
#29 0x0000595605d30525 llvm::detail::PassModel<llvm::Module, llvm::ModuleInlinerWrapperPass, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/home/rislam63/opencilk/build/bin/clang-19+0x3dcc525)
#30 0x0000595604296ded llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/home/rislam63/opencilk/build/bin/clang-19+0x2332ded)
#31 0x0000595604b3ca60 (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
#32 0x0000595604b40157 (anonymous namespace)::EmitAssemblyHelper::EmitAssembly(clang::BackendAction, std::unique_ptr<llvm::raw_pwrite_stream, std::default_delete<llvm::raw_pwrite_stream>>, clang::BackendConsumer*) BackendUtil.cpp:0:0
#33 0x0000595604b4117d 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*) (/home/rislam63/opencilk/build/bin/clang-19+0x2bdd17d)
#34 0x00005956051b67ce clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) (/home/rislam63/opencilk/build/bin/clang-19+0x32527ce)
#35 0x0000595606fad19c clang::ParseAST(clang::Sema&, bool, bool) (/home/rislam63/opencilk/build/bin/clang-19+0x504919c)
#36 0x0000595605487121 clang::FrontendAction::Execute() (/home/rislam63/opencilk/build/bin/clang-19+0x3523121)
#37 0x000059560540aacd clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (/home/rislam63/opencilk/build/bin/clang-19+0x34a6acd)
#38 0x0000595605561167 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (/home/rislam63/opencilk/build/bin/clang-19+0x35fd167)
#39 0x0000595602eb2877 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (/home/rislam63/opencilk/build/bin/clang-19+0xf4e877)
#40 0x0000595602eaae87 ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&, llvm::ToolContext const&) driver.cpp:0:0
#41 0x0000595602eae076 clang_main(int, char**, llvm::ToolContext const&) (/home/rislam63/opencilk/build/bin/clang-19+0xf4a076)
#42 0x0000595602dad0ca main (/home/rislam63/opencilk/build/bin/clang-19+0xe490ca)
#43 0x000073993762a1ca __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:74:3
#44 0x000073993762a28b call_init ./csu/../csu/libc-start.c:128:20
#45 0x000073993762a28b __libc_start_main ./csu/../csu/libc-start.c:347:5
#46 0x0000595602eaa405 _start (/home/rislam63/opencilk/build/bin/clang-19+0xf46405)
clang++: error: unable to execute command: Aborted (core dumped)
clang++: error: clang frontend command failed due to signal (use -v to see invocation)
clang version 19.1.7 (https://github.com/OpenCilk/opencilk-project cd8ccfc1fd8293654dde7bf26657f08f89c7e54b)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /home/rislam63/opencilk/build/bin
Build config: +assertions
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/PageRank-af44dd.cpp
clang++: note: diagnostic msg: /tmp/PageRank-af44dd.sh
clang++: note: diagnostic msg: 

********************

PageRank-af44dd.cpp
PageRank-af44dd.sh

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions