mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-14 07:31:47 +00:00
3885b5c478
Summary: For functions with profile data, we are confident that loop sink will be optimal in sinking code. Reviewers: davidxl, hfinkel Subscribers: mehdi_amini, mzolotukhin, llvm-commits Differential Revision: https://reviews.llvm.org/D26155 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@286325 91177308-0d34-0410-b5e6-96231b3b80d8
99 lines
3.6 KiB
LLVM
99 lines
3.6 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: FunctionPass Manager
|
|
; CHECK-O2: Loop Pass Manager
|
|
; CHECK-O2-NEXT: Loop Sink
|
|
; 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
|
|
}
|