brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.8 KiB · 86eba3b Raw
162 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; First example from Doc/Coroutines.rst (two block loop) converted to retcon3; RUN: opt < %s -passes='default<O2>' -S | FileCheck %s4; RUN: opt < %s -passes='module(coro-early),cgscc(coro-split),module(coro-cleanup)' -S | FileCheck --check-prefix=CORO %s5 6define ptr @f(ptr %buffer, i32 %n) {7; CHECK-LABEL: @f(8; CHECK-NEXT:  coro.return:9; CHECK-NEXT:    store i32 [[N:%.*]], ptr [[BUFFER:%.*]], align 410; CHECK-NEXT:    tail call void @print(i32 [[N]])11; CHECK-NEXT:    ret ptr @f.resume.012;13; CORO-LABEL: @f(14; CORO-NEXT:  entry:15; CORO-NEXT:    [[N_VAL_SPILL_ADDR:%.*]] = getelementptr inbounds [[F_FRAME:%.*]], ptr [[BUFFER:%.*]], i32 0, i32 016; CORO-NEXT:    store i32 [[N:%.*]], ptr [[N_VAL_SPILL_ADDR]], align 417; CORO-NEXT:    call void @print(i32 [[N]])18; CORO-NEXT:    ret ptr @f.resume.019;20entry:21  %id = call token @llvm.coro.id.retcon(i32 8, i32 4, ptr %buffer, ptr @prototype, ptr @allocate, ptr @deallocate)22  %hdl = call ptr @llvm.coro.begin(token %id, ptr null)23  br label %loop24 25loop:26  %n.val = phi i32 [ %n, %entry ], [ %inc, %resume ]27  call void @print(i32 %n.val)28  %unwind0 = call i1 (...) @llvm.coro.suspend.retcon.i1()29  br i1 %unwind0, label %cleanup, label %resume30 31resume:32  %inc = add i32 %n.val, 133  br label %loop34 35cleanup:36  call void @llvm.coro.end(ptr %hdl, i1 0, token none)37  unreachable38}39 40 41 42define i32 @main() {43; CHECK-LABEL: @main(44; CHECK-NEXT:  entry:45; CHECK-NEXT:    tail call void @print(i32 4)46; CHECK-NEXT:    tail call void @llvm.experimental.noalias.scope.decl(metadata [[META0:![0-9]+]])47; CHECK-NEXT:    tail call void @print(i32 5), !noalias [[META0]]48; CHECK-NEXT:    tail call void @llvm.experimental.noalias.scope.decl(metadata [[META3:![0-9]+]])49; CHECK-NEXT:    tail call void @print(i32 6), !noalias [[META3]]50; CHECK-NEXT:    ret i32 051;52; CORO-LABEL: @main(53; CORO-NEXT:  entry:54; CORO-NEXT:    [[TMP0:%.*]] = alloca [8 x i8], align 455; CORO-NEXT:    [[CONT0:%.*]] = call ptr @f(ptr [[TMP0]], i32 4)56; CORO-NEXT:    [[CONT1:%.*]] = call ptr [[CONT0]](ptr [[TMP0]], i1 zeroext false)57; CORO-NEXT:    [[CONT2:%.*]] = call ptr [[CONT1]](ptr [[TMP0]], i1 zeroext false)58; CORO-NEXT:    [[TMP1:%.*]] = call ptr [[CONT2]](ptr [[TMP0]], i1 zeroext true)59; CORO-NEXT:    ret i32 060;61entry:62  %0 = alloca [8 x i8], align 463  %prepare = call ptr @llvm.coro.prepare.retcon(ptr @f)64  %cont0 = call ptr %prepare(ptr %0, i32 4)65  %cont1 = call ptr %cont0(ptr %0, i1 zeroext false)66  %cont2 = call ptr %cont1(ptr %0, i1 zeroext false)67  call ptr %cont2(ptr %0, i1 zeroext true)68  ret i32 069}70 71;   Unfortunately, we don't seem to fully optimize this right now due72;   to some sort of phase-ordering thing.73 74define hidden { ptr, ptr } @g(ptr %buffer, ptr %ptr) {75; CHECK-LABEL: @g(76; CHECK-NEXT:  coro.return:77; CHECK-NEXT:    [[TMP0:%.*]] = tail call ptr @allocate(i32 8)78; CHECK-NEXT:    store ptr [[TMP0]], ptr [[BUFFER:%.*]], align 879; CHECK-NEXT:    store ptr [[PTR:%.*]], ptr [[TMP0]], align 880; CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { ptr, ptr } { ptr @g.resume.0, ptr poison }, ptr [[PTR]], 181; CHECK-NEXT:    ret { ptr, ptr } [[TMP1]]82;83; CORO-LABEL: @g(84; CORO-NEXT:  entry:85; CORO-NEXT:    [[TMP0:%.*]] = call ptr @allocate(i32 8)86; CORO-NEXT:    store ptr [[TMP0]], ptr [[BUFFER:%.*]], align 887; CORO-NEXT:    [[PTR_SPILL_ADDR:%.*]] = getelementptr inbounds [[G_FRAME:%.*]], ptr [[TMP0]], i32 0, i32 088; CORO-NEXT:    store ptr [[PTR:%.*]], ptr [[PTR_SPILL_ADDR]], align 889; CORO-NEXT:    [[PTR_RELOAD_ADDR:%.*]] = getelementptr inbounds [[G_FRAME]], ptr [[TMP0]], i32 0, i32 090; CORO-NEXT:    [[PTR_RELOAD:%.*]] = load ptr, ptr [[PTR_RELOAD_ADDR]], align 891; CORO-NEXT:    [[TMP1:%.*]] = insertvalue { ptr, ptr } poison, ptr @g.resume.0, 092; CORO-NEXT:    [[TMP2:%.*]] = insertvalue { ptr, ptr } [[TMP1]], ptr [[PTR_RELOAD]], 193; CORO-NEXT:    ret { ptr, ptr } [[TMP2]]94;95entry:96  %id = call token @llvm.coro.id.retcon(i32 8, i32 4, ptr %buffer, ptr @g_prototype, ptr @allocate, ptr @deallocate)97  %hdl = call ptr @llvm.coro.begin(token %id, ptr null)98  br label %loop99 100loop:101  %unwind0 = call i1 (...) @llvm.coro.suspend.retcon.i1(ptr %ptr)102  br i1 %unwind0, label %cleanup, label %resume103 104resume:105  br label %loop106 107cleanup:108  call void @llvm.coro.end(ptr %hdl, i1 0, token none)109  unreachable110}111 112define ptr @nosuspend(ptr %buffer, i32 %n) {113; CHECK-LABEL: @nosuspend(114; CHECK-NEXT:  entry:115; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4116; CHECK-NEXT:    store i32 [[N:%.*]], ptr [[A]], align 4117; CHECK-NEXT:    call void @use_var_ptr(ptr nonnull [[A]])118; CHECK-NEXT:    [[AL:%.*]] = load i32, ptr [[A]], align 4119; CHECK-NEXT:    call void @use_var(i32 [[AL]])120; CHECK-NEXT:    ret ptr null121;122; CORO-LABEL: @nosuspend(123; CORO-NEXT:  entry:124; CORO-NEXT:    [[A:%.*]] = alloca i32, align 4125; CORO-NEXT:    store i32 [[N:%.*]], ptr [[A]], align 4126; CORO-NEXT:    call void @use_var_ptr(ptr [[A]])127; CORO-NEXT:    [[AL:%.*]] = load i32, ptr [[A]], align 4128; CORO-NEXT:    call void @use_var(i32 [[AL]])129; CORO-NEXT:    ret ptr null130;131entry:132  %id = call token @llvm.coro.id.retcon(i32 8, i32 4, ptr %buffer, ptr @prototype, ptr @allocate, ptr @deallocate)133  %hdl = call ptr @llvm.coro.begin(token %id, ptr null)134  %a = alloca i32135  store i32 %n, ptr %a136  br label %cleanup137 138cleanup:139  call void @use_var_ptr(ptr %a)140  %al = load i32, ptr %a141  call void @use_var(i32 %al)142  call void @llvm.coro.end(ptr %hdl, i1 0, token none)143  ret ptr %hdl144}145 146declare token @llvm.coro.id.retcon(i32, i32, ptr, ptr, ptr, ptr)147declare ptr @llvm.coro.begin(token, ptr)148declare i1 @llvm.coro.suspend.retcon.i1(...)149declare void @llvm.coro.end(ptr, i1, token)150declare ptr @llvm.coro.prepare.retcon(ptr)151 152declare void @use_var(i32)153declare void @use_var_ptr(ptr)154 155declare ptr @prototype(ptr, i1 zeroext)156declare {ptr,ptr} @g_prototype(ptr, i1 zeroext)157 158declare noalias ptr @allocate(i32 %size)159declare void @deallocate(ptr %ptr)160 161declare void @print(i32)162