Skip to content

[Coroutines] Crash during CoroAnnotationElidePass #114487

@yuxuanchen1997

Description

@yuxuanchen1997

Reduced input:

define void @foo() presplitcoroutine personality ptr null {
entry:
  %0 = call token @llvm.coro.save(ptr null)
  br label %branch

branch:
  call void @bar() coro_elide_safe
  ret void
}

define void @bar() presplitcoroutine personality ptr null {
entry:
  %0 = call token @llvm.coro.id(i32 0, ptr null, ptr null, ptr null)
  %1 = call ptr @llvm.coro.begin(token %0, ptr null)
  %2 = call token @llvm.coro.save(ptr null)
  %3 = call i8 @llvm.coro.suspend(token none, i1 false)
  ret void
}

declare token @llvm.coro.id(i32, ptr readnone, ptr nocapture readonly, ptr) nounwind
declare ptr @llvm.coro.begin(token, ptr writeonly) nounwind
declare token @llvm.coro.save(ptr) nomerge nounwind
declare i8 @llvm.coro.suspend(token, i1) nounwind

Repro command:

opt --disable-output --passes="cgscc(function<>(simplifycfg<>),function-attrs,coro-split,function(coro-annotation-elide))" repro.ll

Will observe crash:

opt: /home/ych/llvm-project/llvm/lib/Analysis/CGSCCPassManager.cpp:914: LazyCallGraph::SCC &updateCGAndAnalysisManagerForPass(LazyCallGraph &, LazyCallGraph::SCC &, LazyCallGraph::Node &, CGSCCAnalysisManager &, CGSCCUpdateResult &, FunctionAnalysisManager &, bool): Assertion `(E || !FunctionPass) && "No function transformations should introduce *new* " "call edges! Any new calls should be modeled as " "promoted existing ref edges!"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.	Program arguments: /home/ych/llvm-project//build/bin/opt --disable-output --passes=cgscc(function<>(simplifycfg<>),function-attrs,coro-split,function(coro-annotation-elide)) ir.ll
1.	Running pass "cgscc(function(simplifycfg<bonus-inst-threshold=1;no-forward-switch-cond;no-switch-range-to-icmp;no-switch-to-lookup;keep-loops;no-hoist-common-insts;no-hoist-loads-stores-with-cond-faulting;no-sink-common-insts;speculate-blocks;simplify-cond-branch;no-speculate-unpredictables>),function-attrs,coro-split,function(coro-annotation-elide))" on module "ir.ll"
 #0 0x00000000016de8de llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /home/ych/llvm-project/llvm/lib/Support/Unix/Signals.inc:723:13
 #1 0x00000000016dca05 llvm::sys::RunSignalHandlers() /home/ych/llvm-project/llvm/lib/Support/Signals.cpp:106:18
 #2 0x00000000016df13d SignalHandler(int) /home/ych/llvm-project/llvm/lib/Support/Unix/Signals.inc:413:1
 #3 0x00007f59ca64fd00 __restore_rt (/lib64/libc.so.6+0x40d00)
 #4 0x00007f59ca6a8664 __pthread_kill_implementation (/lib64/libc.so.6+0x99664)
 #5 0x00007f59ca64fc4e gsignal (/lib64/libc.so.6+0x40c4e)
 #6 0x00007f59ca637902 abort (/lib64/libc.so.6+0x28902)
 #7 0x00007f59ca63781e _nl_load_domain.cold (/lib64/libc.so.6+0x2881e)
 #8 0x00007f59ca647d87 (/lib64/libc.so.6+0x38d87)
 #9 0x00000000027dc3af updateCGAndAnalysisManagerForPass(llvm::LazyCallGraph&, llvm::LazyCallGraph::SCC&, llvm::LazyCallGraph::Node&, llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>&, llvm::CGSCCUpdateResult&, llvm::AnalysisManager<llvm::Function>&, bool) /home/ych/llvm-project/llvm/lib/Analysis/CGSCCPassManager.cpp:917:11
#10 0x00000000027da43e llvm::updateCGAndAnalysisManagerForFunctionPass(llvm::LazyCallGraph&, llvm::LazyCallGraph::SCC&, llvm::LazyCallGraph::Node&, llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>&, llvm::CGSCCUpdateResult&, llvm::AnalysisManager<llvm::Function>&) /home/ych/llvm-project/llvm/lib/Analysis/CGSCCPassManager.cpp:0:10
#11 0x00000000027da43e llvm::CGSCCToFunctionPassAdaptor::run(llvm::LazyCallGraph::SCC&, llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>&, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&) /home/ych/llvm-project/llvm/lib/Analysis/CGSCCPassManager.cpp:561:19
#12 0x0000000002a13f42 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/ych/llvm-project/llvm/include/llvm/IR/PassManagerInternal.h:90:5
#13 0x00000000027d5fc8 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/ych/llvm-project/llvm/lib/Analysis/CGSCCPassManager.cpp:90:12
#14 0x0000000002a20a32 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/ych/llvm-project/llvm/include/llvm/IR/PassManagerInternal.h:90:5
#15 0x00000000027d7637 llvm::ModuleToPostOrderCGSCCPassAdaptor::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) /home/ych/llvm-project/llvm/lib/Analysis/CGSCCPassManager.cpp:277:18
#16 0x0000000002a16ed2 llvm::detail::PassModel<llvm::Module, llvm::ModuleToPostOrderCGSCCPassAdaptor, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) /home/ych/llvm-project/llvm/include/llvm/IR/PassManagerInternal.h:90:5
#17 0x00000000018d29b9 llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) /home/ych/llvm-project/llvm/include/llvm/IR/PassManagerImpl.h:85:8
#18 0x00000000029bb27d llvm::SmallPtrSetImplBase::isSmall() const /home/ych/llvm-project/llvm/include/llvm/ADT/SmallPtrSet.h:219:33
#19 0x00000000029bb27d llvm::SmallPtrSetImplBase::~SmallPtrSetImplBase() /home/ych/llvm-project/llvm/include/llvm/ADT/SmallPtrSet.h:85:10
#20 0x00000000029bb27d llvm::PreservedAnalyses::~PreservedAnalyses() /home/ych/llvm-project/llvm/include/llvm/IR/Analysis.h:111:7
#21 0x00000000029bb27d llvm::runPassPipeline(llvm::StringRef, llvm::Module&, llvm::TargetMachine*, llvm::TargetLibraryInfoImpl*, llvm::ToolOutputFile*, llvm::ToolOutputFile*, llvm::ToolOutputFile*, llvm::StringRef, llvm::ArrayRef<llvm::PassPlugin>, llvm::ArrayRef<std::function<void (llvm::PassBuilder&)>>, llvm::opt_tool::OutputKind, llvm::opt_tool::VerifierKind, bool, bool, bool, bool, bool, bool, bool) /home/ych/llvm-project/llvm/tools/opt/NewPMDriver.cpp:541:3
#22 0x00000000016a8770 optMain /home/ych/llvm-project/llvm/tools/opt/optdriver.cpp:739:12
#23 0x00007f59ca639088 __libc_start_call_main (/lib64/libc.so.6+0x2a088)
#24 0x00007f59ca63914b __libc_start_main@GLIBC_2.2.5 (/lib64/libc.so.6+0x2a14b)
#25 0x00000000016a64a5 _start (/home/ych/llvm-project//build/bin/opt+0x16a64a5)
/home/ych/llvm-util/subcommands/run: line 5: 387488 Aborted                 (core dumped) $LLVM_PROJECT_ROOT/build/bin/$1 ${@:2}

The problem blamed to 761bf33. This change breaks invariant for a function pass (that it cannot add additional edges).
I have a tentative fix in #114004 to change it back to a CGSCC pass and always perform inlining on the coroutine ramp function like we do in the traditional CoroElidePass.

Metadata

Metadata

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions