75 lines · plain
1; Test that in some simple cases allocas will not live on the frame even2; though their pointers are stored.3; RUN: opt < %s -passes='cgscc(coro-split),simplifycfg,early-cse' -S | FileCheck %s4 5%handle = type { ptr }6 7define ptr @f() presplitcoroutine {8entry:9 %0 = alloca %"handle", align 810 %1 = alloca ptr, align 811 %id = call token @llvm.coro.id(i32 0, ptr null, ptr null, ptr null)12 %size = call i32 @llvm.coro.size.i32()13 %alloc = call ptr @malloc(i32 %size)14 %hdl = call ptr @llvm.coro.begin(token %id, ptr %alloc)15 br label %tricky16 17tricky:18 %2 = call ptr @await_suspend()19 store ptr %2, ptr %0, align 820 call void @llvm.lifetime.start.p0(ptr %1)21 store ptr %0, ptr %1, align 822 %3 = load ptr, ptr %1, align 823 %4 = load ptr, ptr %3, align 824 call void @llvm.lifetime.end.p0(ptr %1)25 br label %finish26 27finish:28 %sp1 = call i8 @llvm.coro.suspend(token none, i1 false)29 switch i8 %sp1, label %suspend [i8 0, label %resume30 i8 1, label %cleanup]31resume:32 br label %cleanup33 34cleanup:35 %mem = call ptr @llvm.coro.free(token %id, ptr %hdl)36 call void @free(ptr %mem)37 br label %suspend38 39suspend:40 call void @llvm.coro.end(ptr %hdl, i1 0, token none)41 ret ptr %hdl42}43 44; CHECK: %f.Frame = type { ptr, ptr, i1 }45; CHECK-LABEL: @f(46; CHECK-NEXT: entry:47; CHECK-NEXT: [[TMP0:%.*]] = alloca [[HANDLE:%.*]], align 848; CHECK-NEXT: [[TMP1:%.*]] = alloca ptr, align 849 50; CHECK: [[TMP2:%.*]] = call ptr @await_suspend()51; CHECK-NEXT: store ptr [[TMP2]], ptr [[TMP0]], align 852; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[TMP1]])53; CHECK-NEXT: store ptr [[TMP0]], ptr [[TMP1]], align 854; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[TMP1]])55;56 57declare ptr @llvm.coro.free(token, ptr)58declare i32 @llvm.coro.size.i32()59declare i8 @llvm.coro.suspend(token, i1)60declare void @llvm.coro.resume(ptr)61declare void @llvm.coro.destroy(ptr)62 63declare token @llvm.coro.id(i32, ptr, ptr, ptr)64declare i1 @llvm.coro.alloc(token)65declare ptr @llvm.coro.begin(token, ptr)66declare void @llvm.coro.end(ptr, i1, token)67 68declare void @llvm.lifetime.start.p0(ptr nocapture)69declare void @llvm.lifetime.end.p0(ptr nocapture)70 71declare ptr @await_suspend()72declare void @print(ptr nocapture)73declare noalias ptr @malloc(i32)74declare void @free(ptr)75