brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.6 KiB · d432be9 Raw
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