-
Notifications
You must be signed in to change notification settings - Fork 15.1k
Closed
Labels
coroutinesC++20 coroutinesC++20 coroutines
Description
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
Assignees
Labels
coroutinesC++20 coroutinesC++20 coroutines