CoroSplit lowers various coroutine intrinsics. It's a CGSCC pass and CGSCC passes don't run on unreachable functions. Normally GlobalDCE will come along and delete unreachable functions, but we don't run GlobalDCE under -O0, so an unreachable function with coroutine intrinsics may never have CoroSplit run on it. This patch adds GlobalDCE when coroutines intrinsics are present. It also now runs all coroutine passes conditional when coroutine intrinsics are present. This should also solve the -O0 regression reported in D105877 due to LazyCallGraph construction. Fixes https://github.com/llvm/llvm-project/issues/54117 Reviewed By: ChuanqiXu Differential Revision: https://reviews.llvm.org/D122275
30 lines
1.5 KiB
LLVM
30 lines
1.5 KiB
LLVM
; Test that all coroutine passes run in the correct order at all optimization
|
|
; levels and -enable-coroutines adds coroutine passes to the pipeline.
|
|
;
|
|
; RUN: opt < %s -disable-output -passes='default<O0>' -enable-coroutines \
|
|
; RUN: -debug-pass-manager 2>&1 | FileCheck %s --check-prefixes=CHECK-ALL
|
|
; RUN: opt < %s -disable-output -passes='default<O1>' -enable-coroutines \
|
|
; RUN: -debug-pass-manager 2>&1 | FileCheck %s --check-prefixes=CHECK-ALL,CHECK-OPT
|
|
; RUN: opt < %s -disable-output -passes='default<O2>' -enable-coroutines \
|
|
; RUN: -debug-pass-manager 2>&1 | FileCheck %s --check-prefixes=CHECK-ALL,CHECK-OPT
|
|
; RUN: opt < %s -disable-output -passes='default<O3>' -enable-coroutines \
|
|
; RUN: -debug-pass-manager 2>&1 | FileCheck %s --check-prefixes=CHECK-ALL,CHECK-OPT
|
|
; RUN: opt < %s -disable-output -debug-pass-manager \
|
|
; RUN: -passes='function(coro-early),function(coro-elide),cgscc(coro-split),function(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, i8*, i8*, i8*)
|
|
|
|
define void @foo() {
|
|
ret void
|
|
}
|