|  | ; Test that all coroutine passes run in the correct order at all optimization | 
|  | ; levels adds coroutine passes to the pipeline. | 
|  | ; | 
|  | ; RUN: opt < %s -disable-output -passes='default<O0>' \ | 
|  | ; RUN:     -debug-pass-manager 2>&1 | FileCheck %s --check-prefixes=CHECK-ALL | 
|  | ; RUN: opt < %s -disable-output -passes='default<O1>' \ | 
|  | ; RUN:     -debug-pass-manager 2>&1 | FileCheck %s --check-prefixes=CHECK-ALL,CHECK-OPT | 
|  | ; RUN: opt < %s -disable-output -passes='default<O2>' \ | 
|  | ; RUN:     -debug-pass-manager 2>&1 | FileCheck %s --check-prefixes=CHECK-ALL,CHECK-OPT | 
|  | ; RUN: opt < %s -disable-output -passes='default<O3>' \ | 
|  | ; RUN:     -debug-pass-manager 2>&1 | FileCheck %s --check-prefixes=CHECK-ALL,CHECK-OPT | 
|  | ; RUN: opt < %s -disable-output -debug-pass-manager \ | 
|  | ; RUN: -passes='module(coro-early),function(coro-elide),cgscc(coro-split),module(coro-cleanup)' 2>&1 \ | 
|  | ; RUN:     | FileCheck %s --check-prefixes=CHECK-ALL,CHECK-OPT | 
|  |  | 
|  | ; note that we run CoroElidePass before CoroSplitPass. This is because CoroElidePass is part of | 
|  | ; function simplification pipeline, which runs before CoroSplitPass. And since @foo is not | 
|  | ; a coroutine, it won't be put back into the CGSCC, and hence won't trigger a CoroElidePass | 
|  | ; after CoroSplitPass. | 
|  | ; CHECK-ALL: CoroEarlyPass | 
|  | ; CHECK-OPT: CoroElidePass | 
|  | ; CHECK-ALL: CoroSplitPass | 
|  | ; CHECK-ALL: CoroCleanupPass | 
|  |  | 
|  | declare token @llvm.coro.id(i32, ptr, ptr, ptr) | 
|  |  | 
|  | define void @foo() { | 
|  | ret void | 
|  | } |