diff options
Diffstat (limited to 'llvm/lib/Target/PowerPC/PPCMachineScheduler.cpp')
-rw-r--r-- | llvm/lib/Target/PowerPC/PPCMachineScheduler.cpp | 52 |
1 files changed, 44 insertions, 8 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCMachineScheduler.cpp b/llvm/lib/Target/PowerPC/PPCMachineScheduler.cpp index a38c8f475066..5649d7d13966 100644 --- a/llvm/lib/Target/PowerPC/PPCMachineScheduler.cpp +++ b/llvm/lib/Target/PowerPC/PPCMachineScheduler.cpp @@ -15,6 +15,16 @@ static cl::opt<bool> DisableAddiLoadHeuristic("disable-ppc-sched-addi-load", cl::desc("Disable scheduling addi instruction before" "load for ppc"), cl::Hidden); +static cl::opt<bool> + EnableAddiHeuristic("ppc-postra-bias-addi", + cl::desc("Enable scheduling addi instruction as early" + "as possible post ra"), + cl::Hidden, cl::init(true)); + +static bool isADDIInstr(const GenericScheduler::SchedCandidate &Cand) { + return Cand.SU->getInstr()->getOpcode() == PPC::ADDI || + Cand.SU->getInstr()->getOpcode() == PPC::ADDI8; +} bool PPCPreRASchedStrategy::biasAddiLoadCandidate(SchedCandidate &Cand, SchedCandidate &TryCand, @@ -22,19 +32,13 @@ bool PPCPreRASchedStrategy::biasAddiLoadCandidate(SchedCandidate &Cand, if (DisableAddiLoadHeuristic) return false; - auto isADDIInstr = [&] (const MachineInstr &Inst) { - return Inst.getOpcode() == PPC::ADDI || Inst.getOpcode() == PPC::ADDI8; - }; - SchedCandidate &FirstCand = Zone.isTop() ? TryCand : Cand; SchedCandidate &SecondCand = Zone.isTop() ? Cand : TryCand; - if (isADDIInstr(*FirstCand.SU->getInstr()) && - SecondCand.SU->getInstr()->mayLoad()) { + if (isADDIInstr(FirstCand) && SecondCand.SU->getInstr()->mayLoad()) { TryCand.Reason = Stall; return true; } - if (FirstCand.SU->getInstr()->mayLoad() && - isADDIInstr(*SecondCand.SU->getInstr())) { + if (FirstCand.SU->getInstr()->mayLoad() && isADDIInstr(SecondCand)) { TryCand.Reason = NoCand; return true; } @@ -61,6 +65,38 @@ void PPCPreRASchedStrategy::tryCandidate(SchedCandidate &Cand, return; } +bool PPCPostRASchedStrategy::biasAddiCandidate(SchedCandidate &Cand, + SchedCandidate &TryCand) const { + if (!EnableAddiHeuristic) + return false; + + if (isADDIInstr(TryCand) && !isADDIInstr(Cand)) { + TryCand.Reason = Stall; + return true; + } + return false; +} + +void PPCPostRASchedStrategy::tryCandidate(SchedCandidate &Cand, + SchedCandidate &TryCand) { + PostGenericScheduler::tryCandidate(Cand, TryCand); + + if (!Cand.isValid()) + return; + + // Add powerpc post ra specific heuristic only when TryCand isn't selected or + // selected as node order. + if (TryCand.Reason != NodeOrder && TryCand.Reason != NoCand) + return; + + // There are some benefits to schedule the ADDI as early as possible post ra + // to avoid stalled by vector instructions which take up all the hw units. + // And ADDI is usually used to post inc the loop indvar, which matters the + // performance. + if (biasAddiCandidate(Cand, TryCand)) + return; +} + void PPCPostRASchedStrategy::enterMBB(MachineBasicBlock *MBB) { // Custom PPC PostRA specific behavior here. PostGenericScheduler::enterMBB(MBB); |