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 assert 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 ; CHECK-O2-NEXT: Eliminate Available Externally 59 ; Inferring function attribute should be right after the CGSCC pipeline, before 60 ; any other optimizations/analyses. 61 ; CHECK-O2-NEXT: CallGraph 62 ; CHECK-O2-NEXT: Deduce function attributes in RPO 63 ; CHECK-O2-NOT: Manager 64 ; Reduce the size of the IR ASAP after the inliner. 65 ; CHECK-O2-NEXT: Global Variable Optimizer 66 ; CHECK-O2: Dead Global Elimination 67 ; Next is the late function pass pipeline. 68 ; CHECK-O2: FunctionPass Manager 69 ; CHECK-O2-NOT: Manager 70 ; We rotate loops prior to vectorization. 71 ; CHECK-O2: Loop Pass Manager 72 ; CHECK-O2-NEXT: Rotate Loops 73 ; CHECK-O2-NOT: Manager 74 ; CHECK-O2: Loop Vectorization 75 ; CHECK-O2-NOT: Manager 76 ; CHECK-O2: SLP Vectorizer 77 ; CHECK-O2-NOT: Manager 78 ; After vectorization we do partial unrolling. 79 ; CHECK-O2: Loop Pass Manager 80 ; CHECK-O2-NEXT: Unroll loops 81 ; CHECK-O2-NOT: Manager 82 ; After vectorization and unrolling we try to do any cleanup of inserted code, 83 ; including a run of LICM. This shouldn't run in the same loop pass manager as 84 ; the runtime unrolling though. 85 ; CHECK-O2: Loop Pass Manager 86 ; CHECK-O2-NEXT: Loop Invariant Code Motion 87 ; CHECK-O2: FunctionPass Manager 88 ; CHECK-O2: Loop Pass Manager 89 ; CHECK-O2-NEXT: Loop Sink 90 ; CHECK-O2: Simplify the CFG 91 ; CHECK-O2-NOT: Manager 92 ; 93 ; FIXME: There really shouldn't be another pass manager, especially one that 94 ; just builds the domtree. It doesn't even run the verifier. 95 ; CHECK-O2: Pass Arguments: 96 ; CHECK-O2: FunctionPass Manager 97 ; CHECK-O2-NEXT: Dominator Tree Construction 98 99 define void @foo() { 100 ret void 101 } 102