<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/114487>114487</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [Coroutines] Crash during CoroAnnotationElidePass
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
            yuxuanchen1997
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          yuxuanchen1997
      </td>
    </tr>
</table>

<pre>
    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`. 
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWk1z27gZ_jXwBSMNCVAiefBBlq00bbLx2N7tUQMSLyXUEMABQDvqYX97ByAlirIt20l22-5uJpEifDzv834CJMCsFSsFcI4mF4iQbfO1Yapcg4rzPEWEoMnlGWvcWpvzYd9Zofn2_AZ4UwLHQtWNQ3SGUXSJohmaRt3f8JNDJRTgBy04RklUaY1IhkiOawO2lsKV2ujG-TE1GKsVk8Jtce0MVo2UGKUXLRAoZ7aIztpfGCMyiTCil7hkUmKn70F5AVI-bMYec2zZAyCS7ZAQyXdTC4MlK0B6jMJ4vTrq4bNr6SUFATsFCmY6BbyQJUjBYWlZBbvRBlwY3EGml4fYR9bowX5zawiOSCYowREic9wb5aX_5wfIcY_sBwxwC1gJhUjWiSST6GUc8o3-QmRC-6kiO5rX2BoU33NQWoHnIGJcMWnhAOgV35SSGThlvJ1qBhjfiQl8dclq1xgIPVrJbdfjXat0ox6F4kMppw25A340wkGL9xLQSUu20zZgVvDC9Fes2RryqfSjLL-B2mhc6s2GKb4Py6NBunZ4NOLCskLCSDeubnxDzawFi-glIqRc2bJEJKsaVTqhFaJzRK8QyazY1FJU27Ja7dpyROa7cSPmnLGIzL0Oo5BJB72IZKGdKaUdC-ND3gaMHBGCjec_lvJZ3u3nP4WUWBcWzAPg0jC7PqFnKIdksdYbQGSxLdeILLyNR7XR_4LSdT_9lygQWcwUk1srLCKL-Yfb-fyaWfuZKbYCMy7rGtFZHice9BP793bOpPxgWB0I0NntfI4RmTY1Zw7mH2aK79A6hIU2Hg-RbDDbT_LufRnyhd6fNIddd2B7JG_Q93OgdQO2kW7Xsej88sK8QuuQ_XSGZ9aC8UOxty7JrjBK5yj17OIdSqtb3s6eYkTITxrvXI-dYcpW2myC3y22a91Iv2g5o_36hRGZKXhExDuM-H-hyABfgUUkxjO1xQoeQ-nZzy4AbzQHCRwzu5tXG73RDjiGr8I6oVbYQLUH8uspSXHFhAQ-bgPl-tPV7PYK26bYCIcZLho_p9bGYafx2rnaeouTBSKLlXDrphiXenMQO8OIEtY2XtYCM-U1LGXDAbt1F664YOW9M6yETvytY-U95s2m3kdyNEZRfm30yrANZmbVbEA5-4ZoRmRRNEJy_-3L2OK1ZP9vZDoWZp_jsdf0plHKO8qzws-Vn2M6hVaNHQll3citDdi1lhzRyxjRC6VHlTaPzPCRfRSuXI9K7Wuh7-gaDFMrGDk9EqW3-UGP0yOp9X3jW-8Bav_LO98PWWth3cjXVq2C6EG71IzbkXXagB09CteKHVWskT4GOylC3R8j2BrKRjIHo0Lq8j40dbq2ELt9UADYD25UbYCL0nm_2h9eiLXymdVIn5ekdRch3fKNCI1w9DXa_YmnHDIOOGRDqEx2a9v_XBuhXIjvOx_wiGT9IMMel9o6A2zTFRyhXFtA3l6wb5va5ykii5-V-OobxEoxacdClYjOUkIRncW0Zx4fMS9ZNHmO-U2jWqi_McUleFtm305ux6pdQ-Jo6j-znhU5YlXFlOOBfL_x-eHmSeJgnp4H7Xik1SQv2TSpeBTh5dJACOyl8UtH1qJPk_a7HFs9niJyEX1NIh5F_TYPEZoM8Vg2nSZ4uax90jK-vBdSLn2wg69vrF1gTgjI86lvPRAwOSZcJoBXNmj5CtcygQHUdAhF0zwimBX6FaVJlkdkAJQeA2Ux4KWSS18jllxvmFDjUkv-Cm4WDwlmR7qmPEtPQtCMZ-kAIj-MM5LykrIKv2XH0mfIcCPSJu5LvbtNzFuG-d3Mk3FHfBCdvy7qZTlkGurkkYwn26N3sVjs182r4bbph-87U5-qXa76QhYd-ZIl9LAGn_TqcM_2l3ff6t0f7dUorAa9T-PTPg0od_rQezPOaqdNt6Q26oQ3X_TX7-GH04H1vJd-tLUn09jbO-_tPVh3CYtplZADWhwcE7Lbyng4_7DxbvOc8Npv74bv9AG9-lNHVvfw1jd8vEFkcRBZH5UDo5gcew1yn86TPrroUTZPqjI7oHYA827D_BUr_3Ox8uaVPBR90odJMixCJGL0xxehP2Cw_T9w_DMnxPcVz8lR8UynND2g9jm8nbjT19q6L4aD2WfbyR1RO-1dpu6m_EY7QJKmB-8CvOLToz3JFPj7ysFOx_m7zPUN9ngpvn83I39fhKWDly4ZJ3mRv6FiPmfeP4y9NnVrq2ziP3pbZYOgzIuCpPyA6u2GSXntzC04D3HBLLQdwoau_VGtsu5buc4u7xBZHEgKREmcIzqjtKeafyPVX5_rec9LvzcyDqY9eOgj0WnC1wbCYVf3GA_dC8pfn7Z_F9kQCruQC0Tj2D8upT3R-DRR04Rnm2tRgxRq-LL31hmhVjdQPVeWnkT-HTMrcJ9ZuQ44s-d6P4nCMLP9qCrtvfV0lNbySzjuWAj5DMh3db-gzswYtvWth6kabCKblVBPNy39eOt423ZwENNeTzg0o8e6aITkYNrE78rKAFXXbum07taIVot_CMVPjfoFjKgEmN249iXWe7_fGnxerm0PpxBZ_ASP158vjXjoH9QTH3l9TpOj9-MsS9MI69p9ZkJ9k0xdO34oMaX5cFdOjl6F0zzKMrxcSlGUS-uYccuSSbnctAxOvMdlUZbtX8J65OQYOU6KIbIHRUn04dPHi_mSjMl48oqIOCkGIiZH9pombIJb8A7pvYeIQVCHdCDqGZzGCYnIwjZFdw_BW90veXSGfV3Avv5hmqVJluFZoY0Djo__tCdUEE5FgbeRlXz69Mvn5fXNl79fze-WN1--3D0hikgS-5EovUCJX-5Jf7lkeDngbg24NrqQsMGFZBvg2GmcTuOiopQCTbNiQqZxUlZ0WvIJL0hGUz6BBCIGyRjfrYXF5ZqpFeDCALu3WKgHZgRTDlfaYNaffXfHmplbM4eFw2U4d8OMc_9P-DFsf9Sdj7sLXB_xmj0AZti1ZyMPgCvxFQv1_hPpOtzjWcRxEkWJ17MjLlw4jPYtrL0m0HJlimMmH9nW4hpMpc0GCyVFOKPVqj3K3l-QMmxT97pKcQ_4ETDXnqkf6Qzb64im0VwbfSUFh_DueRqN8Rk_pzynOTuD8zilURKnEZ2crc-LlFJWlDGLiynNSFFBQVkc0SJL45JP6Zk4JxFJ4ojGPmEnk3FGiwkkSZklNM0mrEJJBBsm5NgbZKzN6iwczp_HcZJk6Vm4fWbDvbvJ5Zk5D2YrmpVFSSSFdbaf54ST4YbefKe4RZNLPA8n-rzxywH2XbP9kepeybPGyPNvv0XQcX04J_8JAAD__-uVaQY">