1; Tests that the meaningless lifetime intrinsics could be removed after corosplit. 2; RUN: opt < %s -passes='cgscc(coro-split),simplifycfg,early-cse' -S | FileCheck %s 3 4define ptr @f(i1 %n) presplitcoroutine { 5entry: 6 %x = alloca i64 7 %y = alloca i64 8 %id = call token @llvm.coro.id(i32 0, ptr null, ptr null, ptr null) 9 %size = call i32 @llvm.coro.size.i32() 10 %alloc = call ptr @malloc(i32 %size) 11 %hdl = call ptr @llvm.coro.begin(token %id, ptr %alloc) 12 br i1 %n, label %flag_true, label %flag_false 13 14flag_true: 15 call void @llvm.lifetime.start.p0(i64 8, ptr %x) 16 br label %merge 17 18flag_false: 19 call void @llvm.lifetime.start.p0(i64 8, ptr %y) 20 br label %merge 21 22merge: 23 %phi = phi ptr [ %x, %flag_true ], [ %y, %flag_false ] 24 store i8 1, ptr %phi 25 %sp1 = call i8 @llvm.coro.suspend(token none, i1 false) 26 switch i8 %sp1, label %suspend [i8 0, label %resume 27 i8 1, label %cleanup] 28resume: 29 call void @print(ptr %phi) 30 call void @llvm.lifetime.end.p0(i64 8, ptr %x) 31 call void @llvm.lifetime.end.p0(i64 8, ptr %y) 32 br label %cleanup 33 34cleanup: 35 %mem = call ptr @llvm.coro.free(token %id, ptr %hdl) 36 call void @free(ptr %mem) 37 br label %suspend 38 39suspend: 40 call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) 41 ret ptr %hdl 42} 43 44; CHECK-NOT: call{{.*}}@llvm.lifetime 45 46declare ptr @llvm.coro.free(token, ptr) 47declare i32 @llvm.coro.size.i32() 48declare i8 @llvm.coro.suspend(token, i1) 49declare void @llvm.coro.resume(ptr) 50declare void @llvm.coro.destroy(ptr) 51 52declare token @llvm.coro.id(i32, ptr, ptr, ptr) 53declare i1 @llvm.coro.alloc(token) 54declare ptr @llvm.coro.begin(token, ptr) 55declare i1 @llvm.coro.end(ptr, i1, token) 56 57declare void @llvm.lifetime.start.p0(i64, ptr nocapture) 58declare void @llvm.lifetime.end.p0(i64, ptr nocapture) 59 60declare void @print(ptr) 61declare noalias ptr @malloc(i32) 62declare void @free(ptr) 63