summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--test/Other/pass-pipelines.ll101
1 files changed, 101 insertions, 0 deletions
diff --git a/test/Other/pass-pipelines.ll b/test/Other/pass-pipelines.ll
new file mode 100644
index 00000000000..905dc73299b
--- /dev/null
+++ b/test/Other/pass-pipelines.ll
@@ -0,0 +1,101 @@
+; 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 have this extra loop pass manager!
+; CHECK-O2: Loop Pass Manager
+; CHECK-O2-NOT: Manager
+; FIXME: Yet another pointless loop pass 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: Yet another pointless loop pass manager!
+; CHECK-O2: Loop Pass Manager
+; CHECK-O2-NOT: Manager
+; FIXME: Yet another pointless loop pass 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
+; 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
+}