49 lines · plain
1; Never-silent floor for CoroSplit's PHI normalization.2;3; %target is reached by TWO distinct indirectbr predecessors. This is a shape4; SplitIndirectBrCriticalEdges deliberately does not handle (findIBRPredecessor5; bails when a block has more than one indirectbr predecessor), so an6; un-splittable indirectbr critical edge still reaches rewritePHIs. Instead of7; dereferencing the null SplitEdge result (a SIGSEGV), CoroSplit must abort with8; a loud, attributed error.9;10; RUN: not --crash opt < %s -passes='cgscc(coro-split)' -S 2>&1 | FileCheck %s11 12; CHECK: coro-split: cannot split a critical edge into PHI block 'target'13 14define ptr @f(ptr %d1, ptr %d2) presplitcoroutine {15entry:16 %id = call token @llvm.coro.id(i32 0, ptr null, ptr null, ptr null)17 %hdl = call ptr @llvm.coro.begin(token %id, ptr null)18 %sp = call i8 @llvm.coro.suspend(token none, i1 false)19 switch i8 %sp, label %suspend [i8 0, label %r120 i8 1, label %r2]21r1:22 %a1 = load ptr, ptr %d123 indirectbr ptr %a1, [label %target, label %t1]24t1:25 br label %cleanup26r2:27 %a2 = load ptr, ptr %d228 indirectbr ptr %a2, [label %target, label %t2]29t2:30 br label %cleanup31target:32 %p = phi i32 [ 1, %r1 ], [ 2, %r2 ]33 call void @print(i32 %p)34 br label %cleanup35cleanup:36 %mem = call ptr @llvm.coro.free(token %id, ptr %hdl)37 br label %suspend38suspend:39 call void @llvm.coro.end(ptr %hdl, i1 0, token none)40 ret ptr %hdl41}42 43declare ptr @llvm.coro.free(token, ptr)44declare i8 @llvm.coro.suspend(token, i1)45declare token @llvm.coro.id(i32, ptr, ptr, ptr)46declare ptr @llvm.coro.begin(token, ptr)47declare void @llvm.coro.end(ptr, i1, token)48declare void @print(i32)49