Issue 114487
Summary [Coroutines] Crash during CoroAnnotationElidePass
Labels
Assignees yuxuanchen1997
Reporter 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 761bf333e378b52614cf36cd5db2837d5e4e0ae4. This change breaks invariant for a function pass (that it cannot add additional edges). 
I have a tentative fix in https://github.com/llvm/llvm-project/pull/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`. 
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to