2019-04-17 12:52:47 +08:00
|
|
|
; Third example from Doc/Coroutines.rst (two suspend points)
|
|
|
|
; RUN: opt < %s -O2 -enable-coroutines -S | FileCheck %s
|
[Coroutines][5/6] Add coroutine passes to pipeline
Summary:
Depends on https://reviews.llvm.org/D71901.
The fifth in a series of patches that ports the LLVM coroutines passes
to the new pass manager infrastructure.
The first 4 patches allow users to run coroutine passes by invoking, for
example `opt -passes=coro-early`. However, most of LLVM's tests for
coroutines use an option, `opt -enable-coroutines`, which adds all 4
coroutine passes to the appropriate legacy pass manager extension points.
This patch does the same, but using the new pass manager: when
coroutine features are enabled and the new pass manager is being used,
this adds the new-pass-manager-compliant coroutine passes to the pass
builder's pipeline.
This allows us to run all coroutine tests using the new pass manager
(besides those that use the coroutine retcon ABI used by the Swift
compiler, which is not yet supported in the new pass manager).
Reviewers: GorNishanov, lewissbaker, chandlerc, junparser, wenlei
Subscribers: wenlei, EricWF, Prazek, hiraditya, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D71902
2019-12-26 21:00:00 +08:00
|
|
|
; RUN: opt < %s -aa-pipeline=basic-aa -passes='default<O2>' -enable-coroutines -S | FileCheck %s
|
2019-04-17 12:52:47 +08:00
|
|
|
|
|
|
|
define i8* @f(i32 %n) {
|
|
|
|
entry:
|
|
|
|
%id = call token @llvm.coro.id(i32 0, i8* null, i8* null, i8* null)
|
|
|
|
%size = call i32 @llvm.coro.size.i32()
|
2020-03-01 20:55:06 +08:00
|
|
|
%need.dyn.alloc = call i1 @llvm.coro.alloc(token %id)
|
|
|
|
br i1 %need.dyn.alloc, label %dyn.alloc, label %coro.begin
|
|
|
|
dyn.alloc:
|
2019-04-17 12:52:47 +08:00
|
|
|
%alloc = call i8* @malloc(i32 %size)
|
2020-03-01 20:55:06 +08:00
|
|
|
br label %coro.begin
|
|
|
|
coro.begin:
|
|
|
|
%phi = phi i8* [ null, %entry ], [ %alloc, %dyn.alloc ]
|
|
|
|
%hdl = call noalias i8* @llvm.coro.begin(token %id, i8* %phi)
|
2019-04-17 12:52:47 +08:00
|
|
|
br label %loop
|
|
|
|
loop:
|
2020-03-01 20:55:06 +08:00
|
|
|
%n.val = phi i32 [ %n, %coro.begin ], [ %inc, %loop.resume ]
|
2019-04-17 12:52:47 +08:00
|
|
|
call void @print(i32 %n.val) #4
|
|
|
|
%0 = call i8 @llvm.coro.suspend(token none, i1 false)
|
|
|
|
switch i8 %0, label %suspend [i8 0, label %loop.resume
|
|
|
|
i8 1, label %cleanup]
|
|
|
|
loop.resume:
|
|
|
|
%inc = add nsw i32 %n.val, 1
|
|
|
|
%sub = xor i32 %n.val, -1
|
|
|
|
call void @print(i32 %sub)
|
|
|
|
%1 = call i8 @llvm.coro.suspend(token none, i1 false)
|
|
|
|
switch i8 %1, label %suspend [i8 0, label %loop
|
|
|
|
i8 1, label %cleanup]
|
|
|
|
cleanup:
|
|
|
|
%mem = call i8* @llvm.coro.free(token %id, i8* %hdl)
|
|
|
|
call void @free(i8* %mem)
|
|
|
|
br label %suspend
|
|
|
|
suspend:
|
|
|
|
call i1 @llvm.coro.end(i8* %hdl, i1 false)
|
|
|
|
ret i8* %hdl
|
|
|
|
}
|
|
|
|
|
|
|
|
; CHECK-LABEL: @main
|
|
|
|
define i32 @main() {
|
|
|
|
entry:
|
|
|
|
%hdl = call i8* @f(i32 4)
|
|
|
|
call void @llvm.coro.resume(i8* %hdl)
|
|
|
|
call void @llvm.coro.resume(i8* %hdl)
|
2020-03-01 20:55:06 +08:00
|
|
|
%c = ptrtoint i8* %hdl to i64
|
|
|
|
%to = icmp eq i64 %c, 0
|
|
|
|
br i1 %to, label %return, label %destroy
|
|
|
|
destroy:
|
2019-04-17 12:52:47 +08:00
|
|
|
call void @llvm.coro.destroy(i8* %hdl)
|
2020-03-01 20:55:06 +08:00
|
|
|
br label %return
|
|
|
|
return:
|
2019-04-17 12:52:47 +08:00
|
|
|
ret i32 0
|
2020-03-01 20:55:06 +08:00
|
|
|
; CHECK-NOT: i8* @malloc
|
2019-04-17 12:52:47 +08:00
|
|
|
; CHECK: call void @print(i32 4)
|
|
|
|
; CHECK-NEXT: call void @print(i32 -5)
|
|
|
|
; CHECK-NEXT: call void @print(i32 5)
|
|
|
|
; CHECK: ret i32 0
|
|
|
|
}
|
|
|
|
|
|
|
|
declare i8* @malloc(i32)
|
|
|
|
declare void @free(i8*)
|
|
|
|
declare void @print(i32)
|
|
|
|
|
|
|
|
declare token @llvm.coro.id(i32, i8*, i8*, i8*)
|
|
|
|
declare i1 @llvm.coro.alloc(token)
|
|
|
|
declare i32 @llvm.coro.size.i32()
|
|
|
|
declare i8* @llvm.coro.begin(token, i8*)
|
|
|
|
declare i8 @llvm.coro.suspend(token, i1)
|
|
|
|
declare i8* @llvm.coro.free(token, i8*)
|
|
|
|
declare i1 @llvm.coro.end(i8*, i1)
|
|
|
|
|
|
|
|
declare void @llvm.coro.resume(i8*)
|
|
|
|
declare void @llvm.coro.destroy(i8*)
|