Home | History | Annotate | Download | only in Other
      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