; Never-silent floor for CoroSplit's PHI normalization.
;
; %target is reached by TWO distinct indirectbr predecessors. This is a shape
; SplitIndirectBrCriticalEdges deliberately does not handle (findIBRPredecessor
; bails when a block has more than one indirectbr predecessor), so an
; un-splittable indirectbr critical edge still reaches rewritePHIs. Instead of
; dereferencing the null SplitEdge result (a SIGSEGV), CoroSplit must abort with
; a loud, attributed error.
;
; RUN: not --crash opt < %s -passes='cgscc(coro-split)' -S 2>&1 | FileCheck %s

; CHECK: coro-split: cannot split a critical edge into PHI block 'target'

define ptr @f(ptr %d1, ptr %d2) presplitcoroutine {
entry:
  %id = call token @llvm.coro.id(i32 0, ptr null, ptr null, ptr null)
  %hdl = call ptr @llvm.coro.begin(token %id, ptr null)
  %sp = call i8 @llvm.coro.suspend(token none, i1 false)
  switch i8 %sp, label %suspend [i8 0, label %r1
                                 i8 1, label %r2]
r1:
  %a1 = load ptr, ptr %d1
  indirectbr ptr %a1, [label %target, label %t1]
t1:
  br label %cleanup
r2:
  %a2 = load ptr, ptr %d2
  indirectbr ptr %a2, [label %target, label %t2]
t2:
  br label %cleanup
target:
  %p = phi i32 [ 1, %r1 ], [ 2, %r2 ]
  call void @print(i32 %p)
  br label %cleanup
cleanup:
  %mem = call ptr @llvm.coro.free(token %id, ptr %hdl)
  br label %suspend
suspend:
  call void @llvm.coro.end(ptr %hdl, i1 0, token none)
  ret ptr %hdl
}

declare ptr @llvm.coro.free(token, ptr)
declare i8  @llvm.coro.suspend(token, i1)
declare token @llvm.coro.id(i32, ptr, ptr, ptr)
declare ptr @llvm.coro.begin(token, ptr)
declare void @llvm.coro.end(ptr, i1, token)
declare void @print(i32)
