171 lines · plain
1; REQUIRES: x86-registered-target2; RUN: opt -passes='pgo-instr-gen,instrprof,coro-split' -do-counter-promotion=true -S < %s | FileCheck %s3 4; CHECK-LABEL: define internal fastcc void @f.resume5; CHECK: musttail call fastcc void 6; CHECK-NEXT: ret void7; CHECK: musttail call fastcc void 8; CHECK-NEXT: ret void9; CHECK-LABEL: define internal fastcc void @f.destroy10target triple = "x86_64-grtev4-linux-gnu"11 12%CoroutinePromise = type { ptr, i64, [8 x i8], ptr} 13%Awaitable.1 = type { ptr }14%Awaitable.2 = type { ptr, ptr }15 16declare void @await_suspend(ptr noundef nonnull align 1 dereferenceable(1), ptr) local_unnamed_addr17declare ptr @await_transform_await_suspend(ptr noundef nonnull align 8 dereferenceable(16), ptr) local_unnamed_addr18declare void @destroy_frame_slowpath(ptr noundef nonnull align 16 dereferenceable(32)) local_unnamed_addr19declare ptr @other_coro();20declare void @heap_delete(ptr noundef, i64 noundef, i64 noundef) local_unnamed_addr21declare noundef nonnull ptr @heap_allocate(i64 noundef, i64 noundef) local_unnamed_addr22 23declare void @llvm.assume(i1 noundef)24declare i64 @llvm.coro.align.i64()25declare i1 @llvm.coro.alloc(token)26declare ptr @llvm.coro.begin(token, ptr writeonly)27declare void @llvm.coro.end(ptr, i1, token)28declare ptr @llvm.coro.free(token, ptr nocapture readonly)29declare token @llvm.coro.id(i32, ptr readnone, ptr nocapture readonly, ptr)30declare token @llvm.coro.save(ptr)31declare i64 @llvm.coro.size.i64()32declare ptr @llvm.coro.subfn.addr(ptr nocapture readonly, i8)33declare i8 @llvm.coro.suspend(token, i1)34declare void @llvm.instrprof.increment(ptr, i64, i32, i32)35declare void @llvm.instrprof.value.profile(ptr, i64, i64, i32, i32)36declare void @llvm.lifetime.start.p0(ptr nocapture)37declare void @llvm.lifetime.end.p0(ptr nocapture)38 39; Function Attrs: noinline nounwind presplitcoroutine uwtable40define ptr @f(i32 %0) presplitcoroutine align 32 {41 %2 = alloca i32, align 842 %3 = alloca %CoroutinePromise, align 1643 %4 = alloca %Awaitable.1, align 844 %5 = alloca %Awaitable.2, align 845 %6 = call token @llvm.coro.id(i32 8, ptr nonnull %3, ptr nonnull @f, ptr null)46 %7 = call i1 @llvm.coro.alloc(token %6)47 br i1 %7, label %8, label %1248 498: ; preds = %150 %9 = call i64 @llvm.coro.size.i64()51 %10 = call i64 @llvm.coro.align.i64()52 %11 = call noalias noundef nonnull ptr @heap_allocate(i64 noundef %9, i64 noundef %10) #2753 call void @llvm.assume(i1 true) [ "align"(ptr %11, i64 %10) ]54 br label %1255 5612: ; preds = %8, %157 %13 = phi ptr [ null, %1 ], [ %11, %8 ]58 %14 = call ptr @llvm.coro.begin(token %6, ptr %13) #2859 call void @llvm.lifetime.start.p0(ptr nonnull %3) #960 store ptr null, ptr %3, align 1661 %15 = getelementptr inbounds {ptr, i64}, ptr %3, i64 0, i32 162 store i64 0, ptr %15, align 863 call void @llvm.lifetime.start.p0(ptr nonnull %4) #964 store ptr %3, ptr %4, align 865 %16 = call token @llvm.coro.save(ptr null)66 call void @await_suspend(ptr noundef nonnull align 1 dereferenceable(1) %4, ptr %14) #967 %17 = call i8 @llvm.coro.suspend(token %16, i1 false)68 switch i8 %17, label %61 [69 i8 0, label %1870 i8 1, label %2171 ]72 7318: ; preds = %1274 call void @llvm.lifetime.end.p0(ptr nonnull %4) #975 %19 = icmp slt i32 0, %076 br i1 %19, label %20, label %3677 7820: ; preds = %1879 br label %2280 8121: ; preds = %1282 call void @llvm.lifetime.end.p0(ptr nonnull %4) #983 br label %5484 8522: ; preds = %20, %3186 %23 = phi i32 [ 0, %20 ], [ %32, %31 ]87 call void @llvm.lifetime.start.p0(ptr nonnull %5) #988 %24 = call ptr @other_coro()89 store ptr %3, ptr %5, align 890 %25 = getelementptr inbounds { ptr, ptr }, ptr %5, i64 0, i32 191 store ptr %24, ptr %25, align 892 %26 = call token @llvm.coro.save(ptr null)93 call void @llvm.coro.await.suspend.handle(ptr null, ptr null, ptr @await_transform_await_suspend)94 %30 = call i8 @llvm.coro.suspend(token %26, i1 false)95 switch i8 %30, label %60 [96 i8 0, label %3197 i8 1, label %3498 ]99 10031: ; preds = %22101 call void @llvm.lifetime.end.p0(ptr nonnull %5) #9102 %32 = add nuw nsw i32 %23, 1103 %33 = icmp slt i32 %32, %0104 br i1 %33, label %22, label %35, !llvm.loop !0105 10634: ; preds = %22107 call void @llvm.lifetime.end.p0(ptr nonnull %5) #9108 br label %54109 11035: ; preds = %31111 br label %36112 11336: ; preds = %35, %18114 %37 = call token @llvm.coro.save(ptr null)115 %38 = getelementptr inbounds i8, ptr %14, i64 16116 %39 = getelementptr inbounds i8, ptr %14, i64 32117 %40 = load i64, ptr %39, align 8118 %41 = load ptr, ptr %38, align 16119 %42 = icmp eq ptr %41, null120 br i1 %42, label %43, label %46121 12243: ; preds = %36123 call void @llvm.coro.await.suspend.handle(ptr null, ptr null, ptr @await_transform_await_suspend)124 br label %47125 12646: ; preds = %36127 call void @destroy_frame_slowpath(ptr noundef nonnull align 16 dereferenceable(32) %38) #9128 br label %47129 13047: ; preds = %43, %46131 %48 = inttoptr i64 %40 to ptr132 %49 = call ptr @llvm.coro.subfn.addr(ptr %48, i8 0)133 %50 = ptrtoint ptr %49 to i64134 call fastcc void %49(ptr %48) #9135 %51 = call i8 @llvm.coro.suspend(token %37, i1 true) #28136 switch i8 %51, label %61 [137 i8 0, label %53138 i8 1, label %52139 ]140 14152: ; preds = %47142 br label %54143 14453: ; preds = %47145 call void @llvm.lifetime.start.p0(ptr nonnull %2) #9146 unreachable147 14854: ; preds = %52, %34, %21149 call void @llvm.lifetime.end.p0(ptr nonnull %3) #9150 %55 = call ptr @llvm.coro.free(token %6, ptr %14)151 %56 = icmp eq ptr %55, null152 br i1 %56, label %61, label %57153 15457: ; preds = %54155 %58 = call i64 @llvm.coro.size.i64()156 %59 = call i64 @llvm.coro.align.i64()157 call void @heap_delete(ptr noundef nonnull %55, i64 noundef %58, i64 noundef %59) #9158 br label %61159 16060: ; preds = %22161 br label %61162 16361: ; preds = %60, %57, %54, %47, %12164 %62 = getelementptr inbounds i8, ptr %3, i64 -16165 call void @llvm.coro.end(ptr null, i1 false, token none) #28166 ret ptr %62167}168 169!0 = distinct !{!0, !1}170!1 = !{!"llvm.loop.mustprogress"}171