brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.2 KiB · 22997fb Raw
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