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

    <tr>
        <th>Summary</th>
        <td>
            Crashed under O2 with "CoroInstr.h:186: void llvm::CoroIdInst::setCoroutineSelf(): Assertion `isa<ConstantPointerNull>(getArgOperand(CoroutineArg)) && "Coroutine argument is already assigned"' failed."
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    [llvm-project/llvm/test/Transforms/Coroutines/coro-frame-reuse-alloca-02.ll](https://github.com/llvm/llvm-project/blob/main/llvm/test/Transforms/Coroutines/coro-frame-reuse-alloca-02.ll)

This test already failed under O2, but it can pass `opt` verify. 

I reduced this case so it looks like this:
https://gcc.godbolt.org/z/nKjbn3doT

```
%"struct.task::promise_type" = type { i8 }
%struct.awaitable = type { i8 }
declare i8* @malloc(i64)
define void @a() "coroutine.presplit"="1" {
entry:
  %__promise = alloca %"struct.task::promise_type", align 1
  %ref.tmp7 = alloca %struct.awaitable, align 1
  %ref.tmp18 = alloca %struct.awaitable, align 1
  %0 = alloca i8
  %1 = call token @llvm.coro.id(i32 16, i8* nonnull %0, i8* bitcast (void ()* @a to i8*), i8* null)
  br label %init.ready
init.ready:
  %2 = call noalias nonnull i8* @llvm.coro.begin(token %1, i8* null)
  call void @llvm.lifetime.start.p0i8(i64 1, i8* nonnull %0)
  br label %if.then
if.then:
  %save = call token @llvm.coro.save(i8* null)
  %suspend = call i8 @llvm.coro.suspend(token %save, i1 false)
  switch i8 %suspend, label %coro.ret [
    i8 0, label %await.ready
    i8 1, label %cleanup1
  ]
await.ready:
  br label %cleanup1
cleanup1:
  br label %cleanup
cleanup:
  call i8* @llvm.coro.free(token %1, i8* %2)
  br label %coro.ret
coro.ret:
  call i1 @llvm.coro.end(i8* null, i1 false)
  ret void
}

declare token @llvm.coro.id(i32, i8* readnone, i8* nocapture readonly, i8*)
declare i1 @llvm.coro.alloc(token) 
declare i64 @llvm.coro.size.i64() 
declare i8* @llvm.coro.begin(token, i8* writeonly) 
declare token @llvm.coro.save(i8*) 
declare i8* @llvm.coro.frame() 
declare i8 @llvm.coro.suspend(token, i1) 
declare i8* @llvm.coro.free(token, i8* nocapture readonly) 
declare i1 @llvm.coro.end(i8*, i1) 
declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) 
```

However, the error message shown at the website is slightly different from my local running. 
My local error message:
```
opt: /home/spica/GitRepo/llvm-project/llvm/lib/Transforms/Coroutines/CoroInstr.h:186: void llvm::CoroIdInst::setCoroutineSelf(): Assertion `isa<ConstantPointerNull>(getArgOperand(CoroutineArg)) && "Coroutine argument is already assigned"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.      Program arguments: opt /home/spica/tmp/coro-frame-reuse-alloca-02.ll -O2
 #0 0x00007f3230e500d4 PrintStackTraceSignalHandler(void*) Signals.cpp:0:0
 #1 0x00007f3230e4d114 SignalHandler(int) Signals.cpp:0:0
 #2 0x00007f32308570c0 (/lib/x86_64-linux-gnu/libc.so.6+0x430c0)
 #3 0x00007f323085703b raise /build/glibc-sMfBJT/glibc-2.31/signal/../sysdeps/unix/sysv/linux/raise.c:51:1
 #4 0x00007f3230836859 abort /build/glibc-sMfBJT/glibc-2.31/stdlib/abort.c:81:7
 #5 0x00007f3230836729 get_sysdep_segment_value /build/glibc-sMfBJT/glibc-2.31/intl/loadmsgcat.c:509:8
 #6 0x00007f3230836729 _nl_load_domain /build/glibc-sMfBJT/glibc-2.31/intl/loadmsgcat.c:970:34
 #7 0x00007f3230848006 (/lib/x86_64-linux-gnu/libc.so.6+0x34006)
 #8 0x00007f322fdee4b2 (anonymous namespace)::Lowerer::lowerEarlyIntrinsics(llvm::Function&) CoroEarly.cpp:0:0
 #9 0x00007f322fdeeb15 llvm::CoroEarlyPass::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/usr/local/bin/../lib/../lib/libLLVMCoroutines.so.15git+0x1eb15)
#10 0x00007f3233b5f7b6 llvm::detail::PassModel<llvm::Module, llvm::CoroEarlyPass, llvm::PreservedAnalyses, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/usr/local/bin/../lib/libLLVMPasses.so.15git+0xa87b6)
#11 0x00007f32311c5f71 llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/usr/local/bin/../lib/libLLVMCore.so.15git+0x2d6f71)
#12 0x000056541d0ec345 llvm::runPassPipeline(llvm::StringRef, llvm::Module&, llvm::TargetMachine*, llvm::TargetLibraryInfoImpl*, llvm::ToolOutputFile*, llvm::ToolOutputFile*, llvm::ToolOutputFile*, llvm::StringRef, llvm::ArrayRef<llvm::StringRef>, llvm::ArrayRef<llvm::PassPlugin>, llvm::opt_tool::OutputKind, llvm::opt_tool::VerifierKind, bool, bool, bool, bool, bool) (/usr/local/bin/opt+0x34345)
#13 0x000056541d0dca7b main (/usr/local/bin/opt+0x24a7b)
#14 0x00007f32308380b3 __libc_start_main /build/glibc-sMfBJT/glibc-2.31/csu/../csu/libc-start.c:342:3
#15 0x000056541d0dd4fe _start (/usr/local/bin/opt+0x254fe)
Aborted (core dumped)
```
cc @regehr 
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzdWVtz47YO_jXOCycaXSxbfsiDk2zO7mnSzTSZvnooCbLZ0KKGpJK4v74AJevi2El225nOOTuObYrgB-ADCILeVOW7i0l8KeXz9rzS6g_I7CS8oSF-WDA0etS8NIXSW4ODK6VVbUUJNMhwcF5ovoVzDbWBcy6lyvi5H3pSTuLrSZhsrK3MJFqiNL7Wwm7q1MvUttdyoDuVKsWPLRflP2ZJuJj41xN_2bw_boRhhMi41MDzHSu4kJCzusxBs-_hJLxiaW2ZsCzjJau4MWwy81Vl8Z09gxbFzmNDyG9MQ15niGEJPOMGmFEEIJV6MkyKJ3BTxIRbccBLlnlrladKWk_pNT75E__KX_5IyyhXj0NVaEL7aoZhPAlDY3WdWc9y80SY0RL53AoDK7urAOfZJLpm9J1N5pdMJPhx3a1vF_MXLixPJZwWziGTXAM-m4RLNpn6W0czhlnMph3LORQYFfasRE4yHKdxjqEZ2T5kXqXBVFJgUEPUhu-Bs3J-2UBAafWu44rh2ni1an1y5jXhZZ_znuLJpViXLBgAaig8u63mB3iHbLy7OEh-arU_XIVk9jOBm8lwiln1BCURSHvAI-o8kRPVUciCGQE3YShVWdYoT7j901RYzEKLT5MmEC4Ibdg4gjdy7lmHVA_2CmOpZpKn4JBFKaznNkszOxiPohT29pcKHeems69Lmt6fFNa0y5PWVXT_pDEOcp9SDkGKAqzYgmcs19arfFpHiciCU-Qcdw0juYGy9asdjJwy_BnejQsJkO5jhtP62lRQ5j0E7anR-kZgyEQDiW4EWJ2kgQGiecHYbhxIh02inUcOUwMGP77cL2Ik74_EXJIOg9pKBWMwCbysqz5947YYDJf3dA2ZHS_tRu8Kj2QHoi1vb1Ko0AAnMojS8UTM9wy12vajQ3XBWFcTomGUj8aHmKdMbQtsV2lHJfSd3d17QORiBsMwnzNe2RoBaE6VctfNDepvW6UPzN_XaqfaVeSxOO6ccVaKP8FzhT05Iv3Bbu5NftHCQmPpIcgHW-lTWt2hf8LEd3dZE71P6uiT7P1YvAE7nUKn9H-uyB0xo4c67BHc-1f1Ati70EIscQy0VpptwRi-xmZlo15Kxq2beoHUYMwYdjIGz66NlTuWi6IAjecyK_BwZdsdo8NLMl2XpSjX-3bobv98BN9trAPDqKOKaKPebBQF8cZUIsN-4eY_wv4GlXrbHe57RpG-2w7S4FuJh7G3QQVBMiM1jlgH4JoEJ5OTVDM2YDuMB5BFe2LiwqUxoK1QJXWBwvBJdHWlcB0v7b0SpQX9K1WD6AsuWYNd6vX3CtA2CnUHuaS2btE0Qnh6z6gf6iYZ1-t6S-wi5_uuFNtObBwgdx3MvG1SvYa5-9svy4cvzNTpFptMju3qGrOwUtrS0f7DTbcwpnbEMbSaiTKTdQ4uFzLNzYalPHuymmfQqn-w-IDl9bYv0T5OLe61WuN-7NwhIxhG-UiIsXv6qG9n59iLN0V1EkY-8199_DcvIhxA7Pv5lN1r5N9Z80jmPSBhXH5FJyRlumt92kLSTBkvq8hm3_112MEYe5oHwZQdgqGmD4HCEVASz_3Mb3qvNmdfk9lqNj2Xoqxfz9dl3UxknlEeZsWl_zqNcEl_miBm9AYzSpnmrhXG-1ItZE5RJphzc1dc_vexG4ZeFBDnzmT84nk02pkcKop2XYrX5sGzswNtwk8H7WXoWEyHddBbMh1bEs2SeMF4Sln3WUts3vDgVjklCSmZ90riQyVzJB231aqxe2VgTam1euay_jQDGDvyXyqeb806443q2Kf9nfS6Z8d0r0q5ooWrXNGt9O-pXMwpY6Jpr3M-1jlNfH_2YykTTXHJKGWSAWZY5ADTNCRMjt3Ebqtq7Mpxy5kKt0xT4_B1i-eDxkR3A0mDL1zL3Te8ionSiAwTJumrJ-ZORiXRFbMFo0rmxI9vi8WhPWkQH5Rit_oea17zCM-Vkb47ldd0nXIXn_7xEvN6Z4S54yWeM2j81ZslVJZnTd0lTmujXVQytyFS9yuD2xYN2YOv-H57-_tdf7AQ40G8plsrsh6QE_1PC1hERhUqSuNins4GtuZgsYQ338lRtA_kMYtHHo65GU3d4yUa9DPkDQtgfoYbev2bhLcsk3eHDPMECRwxPKrTQZAhxcGQEGL1tGH_u-xgEsCYmzCfoe8jcvZnTzyLp0HuQxZNh5sMXSB-7kUFWEpg5M4D7fH1b1CM3Tnh5SMe72DveLZxOMtjs7ci1Vxj9SjUt20l30opJb_XtqrtjZBHQP7W9Al3llrzHT0dhqWXpch8KO4olDXddA7lsc9ZWTSsGTXm_SLau_kJqd_px0QBei-X0syHn-8lD_XUzaGA4R_lRzTOjzzj85S1J9pHaOEUhUdoh71A4qcRW63oZFq5y8rqRw7LzNT7xG--NrLu0pO5AzOk9159fOBMPi2ANYo_406M4p07S-pFwP1Ghv0ouL6W2u7F0UtLltHtTMMaNpqd5RdRvogW_MwKK-HiitrlwU_J7AWb732r__96IwnDs1rLi5-_dWAQw_hsc7GIQ2wNklkWYJPLF_m8CLJ5FKTxbIEnwXx65n7AMfQ_Fqi0hBfmIMic-PpMXIR-GPrzYOrHfjANPbwgJGmUBHNsOcIszTFsgEkpPXe1Vnp9pi-cSXh7MnTjFsaafrL1Fpw6xOe13Sh98ZVbU2M3QPeYM6f_wtn_F211pRA">