[TTI] getTypeBasedIntrinsicInstrCost - add basic handling for strided load/store...
[llvm-project.git] / llvm / test / Transforms / Coroutines / coro-retcon-opaque-ptr.ll
blob1908b31f52db39595fcd2544252f4d3d906b196d
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -passes='default<O2>' -S | FileCheck %s
4 ; Same test as coro-retcon.ll, but with opaque pointers enabled.
6 define ptr @f(ptr %buffer, i32 %n) {
7 ; CHECK-LABEL: @f(
8 ; CHECK-NEXT:  coro.return:
9 ; CHECK-NEXT:    store i32 [[N:%.*]], ptr [[BUFFER:%.*]], align 4
10 ; CHECK-NEXT:    tail call void @print(i32 [[N]])
11 ; CHECK-NEXT:    ret ptr @f.resume.0
13 entry:
14   %id = call token @llvm.coro.id.retcon(i32 8, i32 4, ptr %buffer, ptr @prototype, ptr @allocate, ptr @deallocate)
15   %hdl = call ptr @llvm.coro.begin(token %id, ptr null)
16   br label %loop
18 loop:                                             ; preds = %resume, %entry
19   %n.val = phi i32 [ %n, %entry ], [ %inc, %resume ]
20   call void @print(i32 %n.val)
21   %unwind0 = call i1 (...) @llvm.coro.suspend.retcon.i1()
22   br i1 %unwind0, label %cleanup, label %resume
24 resume:                                           ; preds = %loop
25   %inc = add i32 %n.val, 1
26   br label %loop
28 cleanup:                                          ; preds = %loop
29   %0 = call i1 @llvm.coro.end(ptr %hdl, i1 false, token none)
30   unreachable
33 define i32 @main() {
34 ; CHECK-LABEL: @main(
35 ; CHECK-NEXT:  entry:
36 ; CHECK-NEXT:    tail call void @print(i32 4)
37 ; CHECK-NEXT:    tail call void @llvm.experimental.noalias.scope.decl(metadata [[META0:![0-9]+]])
38 ; CHECK-NEXT:    tail call void @print(i32 5), !noalias [[META0]]
39 ; CHECK-NEXT:    tail call void @llvm.experimental.noalias.scope.decl(metadata [[META3:![0-9]+]])
40 ; CHECK-NEXT:    tail call void @print(i32 6), !noalias [[META3]]
41 ; CHECK-NEXT:    ret i32 0
43 entry:
44   %0 = alloca [8 x i8], align 4
45   %prepare = call ptr @llvm.coro.prepare.retcon(ptr @f)
46   %cont0 = call ptr %prepare(ptr %0, i32 4)
47   %cont1 = call ptr %cont0(ptr %0, i1 zeroext false)
48   %cont2 = call ptr %cont1(ptr %0, i1 zeroext false)
49   %1 = call ptr %cont2(ptr %0, i1 zeroext true)
50   ret i32 0
53 define hidden { ptr, ptr } @g(ptr %buffer, ptr %ptr) {
54 ; CHECK-LABEL: @g(
55 ; CHECK-NEXT:  coro.return:
56 ; CHECK-NEXT:    [[TMP0:%.*]] = tail call ptr @allocate(i32 8)
57 ; CHECK-NEXT:    store ptr [[TMP0]], ptr [[BUFFER:%.*]], align 8
58 ; CHECK-NEXT:    store ptr [[PTR:%.*]], ptr [[TMP0]], align 8
59 ; CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { ptr, ptr } { ptr @g.resume.0, ptr poison }, ptr [[PTR]], 1
60 ; CHECK-NEXT:    ret { ptr, ptr } [[TMP1]]
62 entry:
63   %id = call token @llvm.coro.id.retcon(i32 8, i32 4, ptr %buffer, ptr @g_prototype, ptr @allocate, ptr @deallocate)
64   %hdl = call ptr @llvm.coro.begin(token %id, ptr null)
65   br label %loop
67 loop:                                             ; preds = %resume, %entry
68   %unwind0 = call i1 (...) @llvm.coro.suspend.retcon.i1(ptr %ptr)
69   br i1 %unwind0, label %cleanup, label %resume
71 resume:                                           ; preds = %loop
72   br label %loop
74 cleanup:                                          ; preds = %loop
75   %0 = call i1 @llvm.coro.end(ptr %hdl, i1 false, token none)
76   unreachable
79 declare token @llvm.coro.id.retcon(i32, i32, ptr, ptr, ptr, ptr)
80 declare ptr @llvm.coro.begin(token, ptr)
81 declare i1 @llvm.coro.suspend.retcon.i1(...)
82 declare i1 @llvm.coro.end(ptr, i1, token)
83 declare ptr @llvm.coro.prepare.retcon(ptr)
85 declare ptr @prototype(ptr, i1 zeroext)
86 declare {ptr,ptr} @g_prototype(ptr, i1 zeroext)
88 declare noalias ptr @allocate(i32 %size)
89 declare void @deallocate(ptr %ptr)
91 declare void @print(i32)