1; Basic test for the new LTO pipeline. 2; For now the only difference is between -O1 and everything else, so 3; -O2, -O3, -Os, -Oz are the same. 4 5; RUN: opt -disable-verify -debug-pass-manager \ 6; RUN: -passes='lto<O1>' -S %s 2>&1 \ 7; RUN: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-O1 8; RUN: opt -disable-verify -debug-pass-manager \ 9; RUN: -passes='lto<O2>' -S %s 2>&1 \ 10; RUN: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-O2 11; RUN: opt -disable-verify -debug-pass-manager \ 12; RUN: -passes='lto<O3>' -S %s 2>&1 \ 13; RUN: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-O2 \ 14; RUN: --check-prefix=CHECK-O3 15; RUN: opt -disable-verify -debug-pass-manager \ 16; RUN: -passes='lto<Os>' -S %s 2>&1 \ 17; RUN: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-O2 18; RUN: opt -disable-verify -debug-pass-manager \ 19; RUN: -passes='lto<Oz>' -S %s 2>&1 \ 20; RUN: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-O2 21; RUN: opt -disable-verify -debug-pass-manager \ 22; RUN: -passes='lto<O3>' -S %s -passes-ep-peephole='no-op-function' 2>&1 \ 23; RUN: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-O2 \ 24; RUN: --check-prefix=CHECK-O3 --check-prefix=CHECK-EP-Peephole 25 26; CHECK-O: Starting llvm::Module pass manager run. 27; CHECK-O-NEXT: Running pass: PassManager<{{.*}}Module 28; CHECK-O-NEXT: Starting llvm::Module pass manager run. 29; CHECK-O-NEXT: Running pass: GlobalDCEPass 30; CHECK-O-NEXT: Running pass: ForceFunctionAttrsPass 31; CHECK-O-NEXT: Running pass: InferFunctionAttrsPass 32; CHECK-O-NEXT: Running analysis: TargetLibraryAnalysis 33; CHECK-O2-NEXT: Running pass: ModuleToFunctionPassAdaptor<{{.*}}PassManager{{.*}}> 34; CHECK-O2-NEXT: Running analysis: InnerAnalysisManagerProxy<{{.*}}Module 35; CHECK-O2-NEXT: Starting llvm::Function pass manager run. 36; CHECK-O2-NEXT: Running pass: CallSiteSplittingPass on foo 37; CHECK-O2-NEXT: Running analysis: TargetLibraryAnalysis on foo 38; CHECK-O2-NEXT: Running analysis: TargetIRAnalysis on foo 39; CHECK-O2-NEXT: Finished llvm::Function pass manager run. 40; CHECK-O2-NEXT: PGOIndirectCallPromotion 41; CHECK-O2-NEXT: Running analysis: ProfileSummaryAnalysis 42; CHECK-O2-NEXT: Running analysis: OptimizationRemarkEmitterAnalysis 43; CHECK-O2-NEXT: Running pass: IPSCCPPass 44; CHECK-O2-NEXT: Running pass: CalledValuePropagationPass 45; CHECK-O-NEXT: Running pass: ModuleToPostOrderCGSCCPassAdaptor<{{.*}}PostOrderFunctionAttrsPass> 46; CHECK-O-NEXT: Running analysis: InnerAnalysisManagerProxy<{{.*}}SCC 47; CHECK-O1-NEXT: Running analysis: InnerAnalysisManagerProxy<{{.*}}Function 48; CHECK-O-NEXT: Running analysis: LazyCallGraphAnalysis 49; CHECK-O-NEXT: Running analysis: FunctionAnalysisManagerCGSCCProxy 50; CHECK-O-NEXT: Running analysis: OuterAnalysisManagerProxy<{{.*}}LazyCallGraph{{.*}}> 51; CHECK-O-NEXT: Running analysis: AAManager 52; CHECK-O1-NEXT: Running analysis: TargetLibraryAnalysis 53; CHECK-O-NEXT: Running pass: ReversePostOrderFunctionAttrsPass 54; CHECK-O-NEXT: Running analysis: CallGraphAnalysis 55; CHECK-O-NEXT: Running pass: GlobalSplitPass 56; CHECK-O-NEXT: Running pass: WholeProgramDevirtPass 57; CHECK-O1-NEXT: Running pass: LowerTypeTestsPass 58; CHECK-O2-NEXT: Running pass: GlobalOptPass 59; CHECK-O2-NEXT: Running pass: ModuleToFunctionPassAdaptor<{{.*}}PromotePass> 60; CHECK-O2-NEXT: Running analysis: DominatorTreeAnalysis 61; CHECK-O2-NEXT: Running analysis: AssumptionAnalysis 62; CHECK-O2-NEXT: Running pass: ConstantMergePass 63; CHECK-O2-NEXT: Running pass: DeadArgumentEliminationPass 64; CHECK-O2-NEXT: Running pass: ModuleToFunctionPassAdaptor<{{.*}}PassManager{{.*}}> 65; CHECK-O2-NEXT: Starting llvm::Function pass manager run. 66; CHECK-O3-NEXT: Running pass: AggressiveInstCombinePass 67; CHECK-O2-NEXT: Running pass: InstCombinePass 68; CHECK-EP-Peephole-NEXT: Running pass: NoOpFunctionPass 69; CHECK-O2-NEXT: Finished llvm::Function pass manager run. 70; CHECK-O2-NEXT: Running pass: ModuleToPostOrderCGSCCPassAdaptor<{{.*}}InlinerPass> 71; CHECK-O2-NEXT: Running pass: GlobalOptPass 72; CHECK-O2-NEXT: Running pass: GlobalDCEPass 73; CHECK-O2-NEXT: Running pass: ModuleToFunctionPassAdaptor<{{.*}}PassManager{{.*}}> 74; CHECK-O2-NEXT: Starting llvm::Function pass manager run. 75; CHECK-O2-NEXT: Running pass: InstCombinePass 76; CHECK-EP-Peephole-NEXT: Running pass: NoOpFunctionPass 77; CHECK-O2-NEXT: Running pass: JumpThreadingPass 78; CHECK-O2-NEXT: Running analysis: LazyValueAnalysis 79; CHECK-O2-NEXT: Running pass: SROA on foo 80; CHECK-O2-NEXT: Finished llvm::Function pass manager run. 81; CHECK-O2-NEXT: Running pass: ModuleToPostOrderCGSCCPassAdaptor<{{.*}}PostOrderFunctionAttrsPass> 82; CHECK-O2-NEXT: Running pass: ModuleToFunctionPassAdaptor<{{.*}}PassManager{{.*}}> 83; CHECK-O2-NEXT: Running analysis: MemoryDependenceAnalysis 84; CHECK-O2-NEXT: Running analysis: PhiValuesAnalysis 85; CHECK-O2-NEXT: Running analysis: DemandedBitsAnalysis 86; CHECK-O2-NEXT: Running pass: CrossDSOCFIPass 87; CHECK-O2-NEXT: Running pass: LowerTypeTestsPass 88; CHECK-O2-NEXT: Running pass: ModuleToFunctionPassAdaptor<{{.*}}SimplifyCFGPass> 89; CHECK-O2-NEXT: Running pass: EliminateAvailableExternallyPass 90; CHECK-O2-NEXT: Running pass: GlobalDCEPass 91; CHECK-O-NEXT: Finished llvm::Module pass manager run. 92; CHECK-O-NEXT: Running pass: PrintModulePass 93 94; Make sure we get the IR back out without changes when we print the module. 95; CHECK-O-LABEL: define void @foo(i32 %n) local_unnamed_addr { 96; CHECK-O-NEXT: entry: 97; CHECK-O-NEXT: br label %loop 98; CHECK-O: loop: 99; CHECK-O-NEXT: %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 100; CHECK-O-NEXT: %iv.next = add i32 %iv, 1 101; CHECK-O-NEXT: tail call void @bar() 102; CHECK-O-NEXT: %cmp = icmp eq i32 %iv, %n 103; CHECK-O-NEXT: br i1 %cmp, label %exit, label %loop 104; CHECK-O: exit: 105; CHECK-O-NEXT: ret void 106; CHECK-O-NEXT: } 107; 108; CHECK-O-NEXT: Finished llvm::Module pass manager run. 109 110declare void @bar() local_unnamed_addr 111 112define void @foo(i32 %n) local_unnamed_addr { 113entry: 114 br label %loop 115loop: 116 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 117 %iv.next = add i32 %iv, 1 118 tail call void @bar() 119 %cmp = icmp eq i32 %iv, %n 120 br i1 %cmp, label %exit, label %loop 121exit: 122 ret void 123} 124