| ; 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 assert 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 |
| ; 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 |
| ; Reduce the size of the IR ASAP after the inliner. |
| ; CHECK-O2-NEXT: Global Variable Optimizer |
| ; CHECK-O2: Dead Global Elimination |
| ; 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: Simplify the CFG |
| ; 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: FunctionPass Manager |
| ; CHECK-O2-NEXT: Dominator Tree Construction |
| |
| define void @foo() { |
| ret void |
| } |