-; RUN: opt -mtriple=x86_64-- -Os -hotcoldsplit -debug-pass=Structure < %s -o /dev/null 2>&1 | FileCheck %s
+; RUN: opt -mtriple=x86_64-- -Os -hot-cold-split=true -debug-pass=Structure < %s -o /dev/null 2>&1 | FileCheck %s -check-prefix=DEFAULT-Os
+; RUN: opt -mtriple=x86_64-- -Os -hot-cold-split=true -passes='lto-pre-link<Os>' -debug-pass-manager < %s -o /dev/null 2>&1 | FileCheck %s -check-prefix=LTO-PRELINK-Os
+; RUN: opt -mtriple=x86_64-- -Os -hot-cold-split=true -passes='thinlto-pre-link<Os>' -debug-pass-manager < %s -o /dev/null 2>&1 | FileCheck %s -check-prefix=THINLTO-PRELINK-Os
+; RUN: opt -mtriple=x86_64-- -Os -hot-cold-split=true -passes='thinlto<Os>' -debug-pass-manager < %s -o /dev/null 2>&1 | FileCheck %s -check-prefix=THINLTO-POSTLINK-Os
+
; REQUIRES: asserts
-; CHECK-LABEL: Pass Arguments:
-; CHECK-NEXT: Target Transform Information
-; CHECK-NEXT: Type-Based Alias Analysis
-; CHECK-NEXT: Scoped NoAlias Alias Analysis
-; CHECK-NEXT: Assumption Cache Tracker
-; CHECK-NEXT: Target Library Information
-; CHECK-NEXT: FunctionPass Manager
-; CHECK-NEXT: Module Verifier
-; CHECK-NEXT: Instrument function entry/exit with calls to e.g. mcount() (pre inlining)
-; CHECK-NEXT: Simplify the CFG
-; CHECK-NEXT: Dominator Tree Construction
-; CHECK-NEXT: SROA
-; CHECK-NEXT: Early CSE
-; CHECK-NEXT: Lower 'expect' Intrinsics
-; CHECK-NEXT: Pass Arguments:
-; CHECK-NEXT: Target Library Information
-; CHECK-NEXT: Target Transform Information
-; Target Pass Configuration
-; CHECK: Type-Based Alias Analysis
-; CHECK-NEXT: Scoped NoAlias Alias Analysis
-; CHECK-NEXT: Assumption Cache Tracker
-; CHECK-NEXT: Profile summary info
-; CHECK-NEXT: ModulePass Manager
-; CHECK-NEXT: Force set function attributes
-; CHECK-NEXT: Infer set function attributes
-; CHECK-NEXT: Interprocedural Sparse Conditional Constant Propagation
-; CHECK-NEXT: Unnamed pass: implement Pass::getPassName()
-; CHECK-NEXT: Called Value Propagation
-; CHECK-NEXT: Global Variable Optimizer
-; CHECK-NEXT: Unnamed pass: implement Pass::getPassName()
-; CHECK-NEXT: FunctionPass Manager
-; CHECK-NEXT: Dominator Tree Construction
-; CHECK-NEXT: Promote Memory to Register
-; CHECK-NEXT: Dead Argument Elimination
-; CHECK-NEXT: FunctionPass Manager
-; CHECK-NEXT: Dominator Tree Construction
-; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
-; CHECK-NEXT: Function Alias Analysis Results
-; CHECK-NEXT: Natural Loop Information
-; CHECK-NEXT: Lazy Branch Probability Analysis
-; CHECK-NEXT: Lazy Block Frequency Analysis
-; CHECK-NEXT: Optimization Remark Emitter
-; CHECK-NEXT: Combine redundant instructions
-; CHECK-NEXT: Simplify the CFG
-; CHECK-NEXT: CallGraph Construction
-; CHECK-NEXT: Globals Alias Analysis
-; CHECK-NEXT: Call Graph SCC Pass Manager
-; CHECK-NEXT: Remove unused exception handling info
-; CHECK-NEXT: Function Integration/Inlining
-; CHECK-NEXT: Deduce function attributes
-; CHECK-NEXT: FunctionPass Manager
-; CHECK-NEXT: Dominator Tree Construction
-; CHECK-NEXT: SROA
-; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
-; CHECK-NEXT: Function Alias Analysis Results
-; CHECK-NEXT: Memory SSA
-; CHECK-NEXT: Early CSE w/ MemorySSA
-; CHECK-NEXT: Speculatively execute instructions if target has divergent branches
-; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
-; CHECK-NEXT: Function Alias Analysis Results
-; CHECK-NEXT: Lazy Value Information Analysis
-; CHECK-NEXT: Jump Threading
-; CHECK-NEXT: Value Propagation
-; CHECK-NEXT: Simplify the CFG
-; CHECK-NEXT: Dominator Tree Construction
-; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
-; CHECK-NEXT: Function Alias Analysis Results
-; CHECK-NEXT: Natural Loop Information
-; CHECK-NEXT: Lazy Branch Probability Analysis
-; CHECK-NEXT: Lazy Block Frequency Analysis
-; CHECK-NEXT: Optimization Remark Emitter
-; CHECK-NEXT: Combine redundant instructions
-; CHECK-NEXT: Optimization Remark Emitter
-; CHECK-NEXT: Tail Call Elimination
-; CHECK-NEXT: Simplify the CFG
-; CHECK-NEXT: Reassociate expressions
-; CHECK-NEXT: Dominator Tree Construction
-; CHECK-NEXT: Natural Loop Information
-; CHECK-NEXT: Canonicalize natural loops
-; CHECK-NEXT: LCSSA Verifier
-; CHECK-NEXT: Loop-Closed SSA Form Pass
-; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
-; CHECK-NEXT: Function Alias Analysis Results
-; CHECK-NEXT: Scalar Evolution Analysis
-; CHECK-NEXT: Loop Pass Manager
-; CHECK-NEXT: Rotate Loops
-; CHECK-NEXT: Loop Invariant Code Motion
-; CHECK-NEXT: Unswitch loops
-; CHECK-NEXT: Simplify the CFG
-; CHECK-NEXT: Dominator Tree Construction
-; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
-; CHECK-NEXT: Function Alias Analysis Results
-; CHECK-NEXT: Natural Loop Information
-; CHECK-NEXT: Lazy Branch Probability Analysis
-; CHECK-NEXT: Lazy Block Frequency Analysis
-; CHECK-NEXT: Optimization Remark Emitter
-; CHECK-NEXT: Combine redundant instructions
-; CHECK-NEXT: Canonicalize natural loops
-; CHECK-NEXT: LCSSA Verifier
-; CHECK-NEXT: Loop-Closed SSA Form Pass
-; CHECK-NEXT: Scalar Evolution Analysis
-; CHECK-NEXT: Loop Pass Manager
-; CHECK-NEXT: Induction Variable Simplification
-; CHECK-NEXT: Recognize loop idioms
-; CHECK-NEXT: Delete dead loops
-; CHECK-NEXT: Unroll loops
-; CHECK-NEXT: MergedLoadStoreMotion
-; CHECK-NEXT: Phi Values Analysis
-; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
-; CHECK-NEXT: Function Alias Analysis Results
-; CHECK-NEXT: Memory Dependence Analysis
-; CHECK-NEXT: Lazy Branch Probability Analysis
-; CHECK-NEXT: Lazy Block Frequency Analysis
-; CHECK-NEXT: Optimization Remark Emitter
-; CHECK-NEXT: Global Value Numbering
-; CHECK-NEXT: Phi Values Analysis
-; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
-; CHECK-NEXT: Function Alias Analysis Results
-; CHECK-NEXT: Memory Dependence Analysis
-; CHECK-NEXT: MemCpy Optimization
-; CHECK-NEXT: Sparse Conditional Constant Propagation
-; CHECK-NEXT: Demanded bits analysis
-; CHECK-NEXT: Bit-Tracking Dead Code Elimination
-; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
-; CHECK-NEXT: Function Alias Analysis Results
-; CHECK-NEXT: Natural Loop Information
-; CHECK-NEXT: Lazy Branch Probability Analysis
-; CHECK-NEXT: Lazy Block Frequency Analysis
-; CHECK-NEXT: Optimization Remark Emitter
-; CHECK-NEXT: Combine redundant instructions
-; CHECK-NEXT: Lazy Value Information Analysis
-; CHECK-NEXT: Jump Threading
-; CHECK-NEXT: Value Propagation
-; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
-; CHECK-NEXT: Function Alias Analysis Results
-; CHECK-NEXT: Phi Values Analysis
-; CHECK-NEXT: Memory Dependence Analysis
-; CHECK-NEXT: Dead Store Elimination
-; CHECK-NEXT: Natural Loop Information
-; CHECK-NEXT: Canonicalize natural loops
-; CHECK-NEXT: LCSSA Verifier
-; CHECK-NEXT: Loop-Closed SSA Form Pass
-; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
-; CHECK-NEXT: Function Alias Analysis Results
-; CHECK-NEXT: Scalar Evolution Analysis
-; CHECK-NEXT: Loop Pass Manager
-; CHECK-NEXT: Loop Invariant Code Motion
-; CHECK-NEXT: Post-Dominator Tree Construction
-; CHECK-NEXT: Aggressive Dead Code Elimination
-; CHECK-NEXT: Simplify the CFG
-; CHECK-NEXT: Dominator Tree Construction
-; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
-; CHECK-NEXT: Function Alias Analysis Results
-; CHECK-NEXT: Natural Loop Information
-; CHECK-NEXT: Lazy Branch Probability Analysis
-; CHECK-NEXT: Lazy Block Frequency Analysis
-; CHECK-NEXT: Optimization Remark Emitter
-; CHECK-NEXT: Combine redundant instructions
-; CHECK-NEXT: A No-Op Barrier Pass
-; CHECK-NEXT: Eliminate Available Externally Globals
-; CHECK-NEXT: CallGraph Construction
-; CHECK-NEXT: Deduce function attributes in RPO
-; CHECK-NEXT: Global Variable Optimizer
-; CHECK-NEXT: Unnamed pass: implement Pass::getPassName()
-; CHECK-NEXT: Dead Global Elimination
-; CHECK-NEXT: CallGraph Construction
-; CHECK-NEXT: Globals Alias Analysis
-; CHECK-NEXT: FunctionPass Manager
-; CHECK-NEXT: Float to int
-; CHECK-NEXT: Dominator Tree Construction
-; CHECK-NEXT: Natural Loop Information
-; CHECK-NEXT: Canonicalize natural loops
-; CHECK-NEXT: LCSSA Verifier
-; CHECK-NEXT: Loop-Closed SSA Form Pass
-; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
-; CHECK-NEXT: Function Alias Analysis Results
-; CHECK-NEXT: Scalar Evolution Analysis
-; CHECK-NEXT: Loop Pass Manager
-; CHECK-NEXT: Rotate Loops
-; CHECK-NEXT: Loop Access Analysis
-; CHECK-NEXT: Lazy Branch Probability Analysis
-; CHECK-NEXT: Lazy Block Frequency Analysis
-; CHECK-NEXT: Optimization Remark Emitter
-; CHECK-NEXT: Loop Distribution
-; CHECK-NEXT: Branch Probability Analysis
-; CHECK-NEXT: Block Frequency Analysis
-; CHECK-NEXT: Scalar Evolution Analysis
-; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
-; CHECK-NEXT: Function Alias Analysis Results
-; CHECK-NEXT: Loop Access Analysis
-; CHECK-NEXT: Demanded bits analysis
-; CHECK-NEXT: Lazy Branch Probability Analysis
-; CHECK-NEXT: Lazy Block Frequency Analysis
-; CHECK-NEXT: Optimization Remark Emitter
-; CHECK-NEXT: Loop Vectorization
-; CHECK-NEXT: Canonicalize natural loops
-; CHECK-NEXT: Scalar Evolution Analysis
-; CHECK-NEXT: Function Alias Analysis Results
-; CHECK-NEXT: Loop Access Analysis
-; CHECK-NEXT: Loop Load Elimination
-; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
-; CHECK-NEXT: Function Alias Analysis Results
-; CHECK-NEXT: Lazy Branch Probability Analysis
-; CHECK-NEXT: Lazy Block Frequency Analysis
-; CHECK-NEXT: Optimization Remark Emitter
-; CHECK-NEXT: Combine redundant instructions
-; CHECK-NEXT: Simplify the CFG
-; CHECK-NEXT: Dominator Tree Construction
-; CHECK-NEXT: Natural Loop Information
-; CHECK-NEXT: Scalar Evolution Analysis
-; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
-; CHECK-NEXT: Function Alias Analysis Results
-; CHECK-NEXT: Demanded bits analysis
-; CHECK-NEXT: Lazy Branch Probability Analysis
-; CHECK-NEXT: Lazy Block Frequency Analysis
-; CHECK-NEXT: Optimization Remark Emitter
-; CHECK-NEXT: SLP Vectorizer
-; CHECK-NEXT: Optimization Remark Emitter
-; CHECK-NEXT: Combine redundant instructions
-; CHECK-NEXT: Canonicalize natural loops
-; CHECK-NEXT: LCSSA Verifier
-; CHECK-NEXT: Loop-Closed SSA Form Pass
-; CHECK-NEXT: Scalar Evolution Analysis
-; CHECK-NEXT: Loop Pass Manager
-; CHECK-NEXT: Unroll loops
-; CHECK-NEXT: Lazy Branch Probability Analysis
-; CHECK-NEXT: Lazy Block Frequency Analysis
-; CHECK-NEXT: Optimization Remark Emitter
-; CHECK-NEXT: Combine redundant instructions
-; CHECK-NEXT: Canonicalize natural loops
-; CHECK-NEXT: LCSSA Verifier
-; CHECK-NEXT: Loop-Closed SSA Form Pass
-; CHECK-NEXT: Scalar Evolution Analysis
-; CHECK-NEXT: Loop Pass Manager
-; CHECK-NEXT: Loop Invariant Code Motion
-; CHECK-NEXT: Lazy Branch Probability Analysis
-; CHECK-NEXT: Lazy Block Frequency Analysis
-; CHECK-NEXT: Optimization Remark Emitter
-; CHECK-NEXT: Warn about non-applied transformations
-; CHECK-NEXT: Alignment from assumptions
-; CHECK-NEXT: Strip Unused Function Prototypes
-; CHECK-NEXT: Dead Global Elimination
-; CHECK-NEXT: Merge Duplicate Global Constants
-; CHECK-NEXT: FunctionPass Manager
-; CHECK-NEXT: Dominator Tree Construction
-; CHECK-NEXT: Natural Loop Information
-; CHECK-NEXT: Branch Probability Analysis
-; CHECK-NEXT: Block Frequency Analysis
-; CHECK-NEXT: Canonicalize natural loops
-; CHECK-NEXT: LCSSA Verifier
-; CHECK-NEXT: Loop-Closed SSA Form Pass
-; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
-; CHECK-NEXT: Function Alias Analysis Results
-; CHECK-NEXT: Scalar Evolution Analysis
-; CHECK-NEXT: Branch Probability Analysis
-; CHECK-NEXT: Block Frequency Analysis
-; CHECK-NEXT: Loop Pass Manager
-; CHECK-NEXT: Loop Sink
-; CHECK-NEXT: Lazy Branch Probability Analysis
-; CHECK-NEXT: Lazy Block Frequency Analysis
-; CHECK-NEXT: Optimization Remark Emitter
-; CHECK-NEXT: Remove redundant instructions
-; CHECK-NEXT: Hoist/decompose integer division and remainder
-; CHECK-NEXT: Simplify the CFG
-; CHECK-NEXT: Hot Cold Splitting
-; CHECK-NEXT: Unnamed pass: implement Pass::getPassName()
-; CHECK-NEXT: FunctionPass Manager
-; CHECK-NEXT: Module Verifier
-; CHECK-NEXT: Bitcode Writer
-; CHECK-NEXT: Pass Arguments: -domtree
-; CHECK-NEXT: FunctionPass Manager
-; CHECK-NEXT: Dominator Tree Construction
-; CHECK-NEXT: Pass Arguments: -targetlibinfo -domtree -loops -branch-prob -block-freq
-; CHECK-NEXT: Target Library Information
-; CHECK-NEXT: FunctionPass Manager
-; CHECK-NEXT: Dominator Tree Construction
-; CHECK-NEXT: Natural Loop Information
-; CHECK-NEXT: Branch Probability Analysis
-; CHECK-NEXT: Block Frequency Analysis
-; CHECK-NEXT: Pass Arguments: -targetlibinfo -domtree -loops -branch-prob -block-freq
-; CHECK-NEXT: Target Library Information
-; CHECK-NEXT: FunctionPass Manager
-; CHECK-NEXT: Dominator Tree Construction
-; CHECK-NEXT: Natural Loop Information
-; CHECK-NEXT: Branch Probability Analysis
-; CHECK-NEXT: Block Frequency Analysis
-; CHECK-NEXT: Pass Arguments: -targetlibinfo -domtree -loops -branch-prob -block-freq
-; CHECK-NEXT: Target Library Information
-; CHECK-NEXT: FunctionPass Manager
-; CHECK-NEXT: Dominator Tree Construction
-; CHECK-NEXT: Natural Loop Information
-; CHECK-NEXT: Branch Probability Analysis
-; CHECK-NEXT: Block Frequency Analysis
+; Splitting should occur after Mem2Reg and should be followed by InstCombine.
+
+; DEFAULT-Os: Promote Memory to Register
+; DEFAULT-Os: Hot Cold Splitting
+; DEFAULT-Os: Combine redundant instructions
+
+; LTO-PRELINK-Os-LABEL: Starting llvm::Module pass manager run.
+; LTO-PRELINK-Os: Running pass: ModuleToFunctionPassAdaptor<llvm::PromotePass>
+; LTO-PRELINK-Os: Running pass: HotColdSplittingPass
+; LTO-PRELINK-Os: Running pass: ModuleToFunctionPassAdaptor<llvm::PassManager<llvm::Function> >
+
+; THINLTO-PRELINK-Os-LABEL: Running analysis: PassInstrumentationAnalysis
+; THINLTO-PRELINK-Os: Running pass: ModuleToFunctionPassAdaptor<llvm::PromotePass>
+; THINLTO-PRELINK-Os: Running pass: HotColdSplittingPass
+; THINLTO-PRELINK-Os: Running pass: ModuleToFunctionPassAdaptor<llvm::PassManager<llvm::Function> >
+
+; THINLTO-POSTLINK-Os-NOT: HotColdSplitting