1 ; Test the particular pass pipelines have the expected structure. This is 2 ; particularly important in order to check that the implicit scheduling of the 3 ; legacy pass manager doesn't introduce unexpected structural changes in the 4 ; pass pipeline. 5 ; 6 ; RUN: opt -disable-output -disable-verify -debug-pass=Structure \ 7 ; RUN: -O2 %s 2>&1 \ 8 ; RUN: | FileCheck %s --check-prefix=CHECK-O2 9 ; 10 ; In the first pipeline there should just be a function pass manager, no other 11 ; pass managers. 12 ; CHECK-O2: Pass Arguments: 13 ; CHECK-O2-NOT: Manager 14 ; CHECK-O2: FunctionPass Manager 15 ; CHECK-O2-NOT: Manager 16 ; 17 ; CHECK-O2: Pass Arguments: 18 ; CHECK-O2: ModulePass Manager 19 ; CHECK-O2-NOT: Manager 20 ; First function pass pipeline just does early opts. 21 ; CHECK-O2: FunctionPass Manager 22 ; CHECK-O2-NOT: Manager 23 ; FIXME: It's a bit odd to do dead arg elim in the middle of early opts... 24 ; CHECK-O2: Dead Argument Elimination 25 ; CHECK-O2-NEXT: FunctionPass Manager 26 ; CHECK-O2-NOT: Manager 27 ; Very carefully asert the CGSCC pass pipeline as it is fragile and unusually 28 ; susceptible to phase ordering issues. 29 ; CHECK-O2: CallGraph Construction 30 ; CHECK-O2-NEXT: Globals Alias Analysis 31 ; CHECK-O2-NEXT: Call Graph SCC Pass Manager 32 ; CHECK-O2-NEXT: Remove unused exception handling info 33 ; CHECK-O2-NEXT: Function Integration/Inlining 34 ; CHECK-O2-NEXT: Deduce function attributes 35 ; Next up is the main function pass pipeline. It shouldn't be split up and 36 ; should contain the main loop pass pipeline as well. 37 ; CHECK-O2-NEXT: FunctionPass Manager 38 ; CHECK-O2-NOT: Manager 39 ; CHECK-O2: Loop Pass Manager 40 ; CHECK-O2-NOT: Manager 41 ; FIXME: We shouldn't be pulling out to simplify-cfg and instcombine and 42 ; causing new loop pass managers. 43 ; CHECK-O2: Simplify the CFG 44 ; CHECK-O2-NOT: Manager 45 ; CHECK-O2: Combine redundant instructions 46 ; CHECK-O2-NOT: Manager 47 ; CHECK-O2: Loop Pass Manager 48 ; CHECK-O2-NOT: Manager 49 ; FIXME: It isn't clear that we need yet another loop pass pipeline 50 ; and run of LICM here. 51 ; CHECK-O2-NOT: Manager 52 ; CHECK-O2: Loop Pass Manager 53 ; CHECK-O2-NEXT: Loop Invariant Code Motion 54 ; CHECK-O2-NOT: Manager 55 ; Next we break out of the main Function passes inside the CGSCC pipeline with 56 ; a barrier pass. 57 ; CHECK-O2: A No-Op Barrier Pass 58 ; Reduce the size of the IR ASAP after the inliner. 59 ; CHECK-O2-NEXT: Eliminate Available Externally 60 ; Inferring function attribute should be right after the CGSCC pipeline, before 61 ; any other optimizations/analyses. 62 ; CHECK-O2-NEXT: CallGraph 63 ; CHECK-O2-NEXT: Deduce function attributes in RPO 64 ; CHECK-O2-NOT: Manager 65 ; Next is the late function pass pipeline. 66 ; CHECK-O2: FunctionPass Manager 67 ; CHECK-O2-NOT: Manager 68 ; We rotate loops prior to vectorization. 69 ; CHECK-O2: Loop Pass Manager 70 ; CHECK-O2-NEXT: Rotate Loops 71 ; CHECK-O2-NOT: Manager 72 ; CHECK-O2: Loop Vectorization 73 ; CHECK-O2-NOT: Manager 74 ; CHECK-O2: SLP Vectorizer 75 ; CHECK-O2-NOT: Manager 76 ; After vectorization we do partial unrolling. 77 ; CHECK-O2: Loop Pass Manager 78 ; CHECK-O2-NEXT: Unroll loops 79 ; CHECK-O2-NOT: Manager 80 ; After vectorization and unrolling we try to do any cleanup of inserted code, 81 ; including a run of LICM. This shouldn't run in the same loop pass manager as 82 ; the runtime unrolling though. 83 ; CHECK-O2: Loop Pass Manager 84 ; CHECK-O2-NEXT: Loop Invariant Code Motion 85 ; CHECK-O2-NOT: Manager 86 ; 87 ; FIXME: There really shouldn't be another pass manager, especially one that 88 ; just builds the domtree. It doesn't even run the verifier. 89 ; CHECK-O2: Pass Arguments: 90 ; CHECK-O2-NEXT: FunctionPass Manager 91 ; CHECK-O2-NEXT: Dominator Tree Construction 92 93 define void @foo() { 94 ret void 95 } 96