diff --git a/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp b/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp index fe396cbfc011db..9b28310a362255 100644 --- a/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp +++ b/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp @@ -500,6 +500,11 @@ bool PPCPassConfig::addInstSelector() { } void PPCPassConfig::addMachineSSAOptimization() { + // Run CTR loops pass before any cfg modification pass to prevent the + // canonical form of hardware loop from being destroied. + if (!DisableCTRLoops && getOptLevel() != CodeGenOpt::None) + addPass(createPPCCTRLoopsPass()); + // PPCBranchCoalescingPass need to be done before machine sinking // since it merges empty blocks. if (EnableBranchCoalescing && getOptLevel() != CodeGenOpt::None) @@ -540,16 +545,6 @@ void PPCPassConfig::addPreRegAlloc() { if (EnableExtraTOCRegDeps) addPass(createPPCTOCRegDepsPass()); - // Run CTR loops pass before MachinePipeliner pass. - // MachinePipeliner will pipeline all instructions before the terminator, but - // we don't want DecreaseCTRPseudo to be pipelined. - // Note we may lose some MachinePipeliner opportunities if we run CTR loops - // generation pass before MachinePipeliner and the loop is converted back to - // a normal loop. We can revisit this later for running PPCCTRLoops after - // MachinePipeliner and handling DecreaseCTRPseudo in MachinePipeliner pass. - if (getOptLevel() != CodeGenOpt::None) - addPass(createPPCCTRLoopsPass()); - if (getOptLevel() != CodeGenOpt::None) addPass(&MachinePipelinerID); } diff --git a/llvm/test/CodeGen/PowerPC/O3-pipeline.ll b/llvm/test/CodeGen/PowerPC/O3-pipeline.ll index 02ed427770c046..6b87f605dd8b73 100644 --- a/llvm/test/CodeGen/PowerPC/O3-pipeline.ll +++ b/llvm/test/CodeGen/PowerPC/O3-pipeline.ll @@ -95,6 +95,9 @@ ; CHECK-NEXT: PowerPC CTR Loops Verify ; CHECK-NEXT: PowerPC VSX Copy Legalization ; CHECK-NEXT: Finalize ISel and expand pseudo-instructions +; CHECK-NEXT: MachineDominator Tree Construction +; CHECK-NEXT: Machine Natural Loop Construction +; CHECK-NEXT: PowerPC CTR loops generation ; CHECK-NEXT: Lazy Machine Block Frequency Analysis ; CHECK-NEXT: Early Tail Duplication ; CHECK-NEXT: Optimize machine instruction PHIs @@ -134,9 +137,6 @@ ; CHECK-NEXT: PowerPC TOC Register Dependencies ; CHECK-NEXT: MachineDominator Tree Construction ; CHECK-NEXT: Machine Natural Loop Construction -; CHECK-NEXT: PowerPC CTR loops generation -; CHECK-NEXT: MachineDominator Tree Construction -; CHECK-NEXT: Machine Natural Loop Construction ; CHECK-NEXT: Slot index numbering ; CHECK-NEXT: Live Interval Analysis ; CHECK-NEXT: Lazy Machine Block Frequency Analysis