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 93define void @foo() { 94 ret void 95} 96