mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-23 12:40:38 +00:00
6c3ac407d3
This pass is supposed to reduce the size of the IR for compile time purpose. We should run it ASAP, except when we prepare for LTO or ThinLTO, and we want to keep them available for link-time inline. Differential Revision: http://reviews.llvm.org/D19813 From: Mehdi Amini <mehdi.amini@apple.com> git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@268394 91177308-0d34-0410-b5e6-96231b3b80d8
96 lines
3.5 KiB
LLVM
96 lines
3.5 KiB
LLVM
; Test the particular pass pipelines have the expected structure. This is
|
|
; particularly important in order to check that the implicit scheduling of the
|
|
; legacy pass manager doesn't introduce unexpected structural changes in the
|
|
; pass pipeline.
|
|
;
|
|
; RUN: opt -disable-output -disable-verify -debug-pass=Structure \
|
|
; RUN: -O2 %s 2>&1 \
|
|
; RUN: | FileCheck %s --check-prefix=CHECK-O2
|
|
;
|
|
; In the first pipeline there should just be a function pass manager, no other
|
|
; pass managers.
|
|
; CHECK-O2: Pass Arguments:
|
|
; CHECK-O2-NOT: Manager
|
|
; CHECK-O2: FunctionPass Manager
|
|
; CHECK-O2-NOT: Manager
|
|
;
|
|
; CHECK-O2: Pass Arguments:
|
|
; CHECK-O2: ModulePass Manager
|
|
; CHECK-O2-NOT: Manager
|
|
; First function pass pipeline just does early opts.
|
|
; CHECK-O2: FunctionPass Manager
|
|
; CHECK-O2-NOT: Manager
|
|
; FIXME: It's a bit odd to do dead arg elim in the middle of early opts...
|
|
; CHECK-O2: Dead Argument Elimination
|
|
; CHECK-O2-NEXT: FunctionPass Manager
|
|
; CHECK-O2-NOT: Manager
|
|
; Very carefully asert the CGSCC pass pipeline as it is fragile and unusually
|
|
; susceptible to phase ordering issues.
|
|
; CHECK-O2: CallGraph Construction
|
|
; CHECK-O2-NEXT: Globals Alias Analysis
|
|
; CHECK-O2-NEXT: Call Graph SCC Pass Manager
|
|
; CHECK-O2-NEXT: Remove unused exception handling info
|
|
; CHECK-O2-NEXT: Function Integration/Inlining
|
|
; CHECK-O2-NEXT: Deduce function attributes
|
|
; Next up is the main function pass pipeline. It shouldn't be split up and
|
|
; should contain the main loop pass pipeline as well.
|
|
; CHECK-O2-NEXT: FunctionPass Manager
|
|
; CHECK-O2-NOT: Manager
|
|
; CHECK-O2: Loop Pass Manager
|
|
; CHECK-O2-NOT: Manager
|
|
; FIXME: We shouldn't be pulling out to simplify-cfg and instcombine and
|
|
; causing new loop pass managers.
|
|
; CHECK-O2: Simplify the CFG
|
|
; CHECK-O2-NOT: Manager
|
|
; CHECK-O2: Combine redundant instructions
|
|
; CHECK-O2-NOT: Manager
|
|
; CHECK-O2: Loop Pass Manager
|
|
; CHECK-O2-NOT: Manager
|
|
; FIXME: It isn't clear that we need yet another loop pass pipeline
|
|
; and run of LICM here.
|
|
; CHECK-O2-NOT: Manager
|
|
; CHECK-O2: Loop Pass Manager
|
|
; CHECK-O2-NEXT: Loop Invariant Code Motion
|
|
; CHECK-O2-NOT: Manager
|
|
; Next we break out of the main Function passes inside the CGSCC pipeline with
|
|
; a barrier pass.
|
|
; CHECK-O2: A No-Op Barrier Pass
|
|
; Reduce the size of the IR ASAP after the inliner.
|
|
; CHECK-O2-NEXT: Eliminate Available Externally
|
|
; Inferring function attribute should be right after the CGSCC pipeline, before
|
|
; any other optimizations/analyses.
|
|
; CHECK-O2-NEXT: CallGraph
|
|
; CHECK-O2-NEXT: Deduce function attributes in RPO
|
|
; CHECK-O2-NOT: Manager
|
|
; Next is the late function pass pipeline.
|
|
; CHECK-O2: FunctionPass Manager
|
|
; CHECK-O2-NOT: Manager
|
|
; We rotate loops prior to vectorization.
|
|
; CHECK-O2: Loop Pass Manager
|
|
; CHECK-O2-NEXT: Rotate Loops
|
|
; CHECK-O2-NOT: Manager
|
|
; CHECK-O2: Loop Vectorization
|
|
; CHECK-O2-NOT: Manager
|
|
; CHECK-O2: SLP Vectorizer
|
|
; CHECK-O2-NOT: Manager
|
|
; After vectorization we do partial unrolling.
|
|
; CHECK-O2: Loop Pass Manager
|
|
; CHECK-O2-NEXT: Unroll loops
|
|
; CHECK-O2-NOT: Manager
|
|
; After vectorization and unrolling we try to do any cleanup of inserted code,
|
|
; including a run of LICM. This shouldn't run in the same loop pass manager as
|
|
; the runtime unrolling though.
|
|
; CHECK-O2: Loop Pass Manager
|
|
; CHECK-O2-NEXT: Loop Invariant Code Motion
|
|
; CHECK-O2-NOT: Manager
|
|
;
|
|
; FIXME: There really shouldn't be another pass manager, especially one that
|
|
; just builds the domtree. It doesn't even run the verifier.
|
|
; CHECK-O2: Pass Arguments:
|
|
; CHECK-O2-NEXT: FunctionPass Manager
|
|
; CHECK-O2-NEXT: Dominator Tree Construction
|
|
|
|
define void @foo() {
|
|
ret void
|
|
}
|