1; RUN: opt < %s -passes='cgscc(coro-split)' -S | FileCheck %s 2 3define ptr @f(i1 %n) presplitcoroutine { 4entry: 5 %x = alloca i64, addrspace(5) 6 %y = alloca i64, addrspace(5) 7 %id = call token @llvm.coro.id(i32 0, ptr null, ptr null, ptr null) 8 %size = call i32 @llvm.coro.size.i32() 9 %alloc = call ptr @malloc(i32 %size) 10 %hdl = call ptr @llvm.coro.begin(token %id, ptr %alloc) 11 br i1 %n, label %flag_true, label %flag_false 12 13flag_true: 14 br label %merge 15 16flag_false: 17 br label %merge 18 19merge: 20 %alias_phi = phi ptr addrspace(5) [ %x, %flag_true ], [ %y, %flag_false ] 21 %sp1 = call i8 @llvm.coro.suspend(token none, i1 false) 22 switch i8 %sp1, label %suspend [i8 0, label %resume 23 i8 1, label %cleanup] 24resume: 25 call void @print(ptr addrspace(5) %alias_phi) 26 br label %cleanup 27 28cleanup: 29 %mem = call ptr @llvm.coro.free(token %id, ptr %hdl) 30 call void @free(ptr %mem) 31 br label %suspend 32 33suspend: 34 call i1 @llvm.coro.end(ptr %hdl, i1 0) 35 ret ptr %hdl 36} 37 38; CHECK-LABEL: @f( 39; CHECK: [[X_ADDR:%[0-9]+]] = getelementptr inbounds %f.Frame, ptr %hdl, i32 0, i32 2 40; CHECK: %x.reload.addr = addrspacecast ptr [[X_ADDR]] to ptr addrspace(5) 41; CHECK: [[Y_ADDR:%[0-9]+]] = getelementptr inbounds %f.Frame, ptr %hdl, i32 0, i32 3 42; CHECK: %y.reload.addr = addrspacecast ptr [[Y_ADDR]] to ptr addrspace(5) 43 44declare ptr @llvm.coro.free(token, ptr) 45declare i32 @llvm.coro.size.i32() 46declare i8 @llvm.coro.suspend(token, i1) 47declare void @llvm.coro.resume(ptr) 48declare void @llvm.coro.destroy(ptr) 49 50declare token @llvm.coro.id(i32, ptr, ptr, ptr) 51declare i1 @llvm.coro.alloc(token) 52declare ptr @llvm.coro.begin(token, ptr) 53declare i1 @llvm.coro.end(ptr, i1) 54 55declare void @print(ptr) 56declare noalias ptr @malloc(i32) 57declare void @free(ptr) 58