|  | ; 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 | 
|  | } |