diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Target/PowerPC/PPCMachineScheduler.cpp')
| -rw-r--r-- | contrib/llvm-project/llvm/lib/Target/PowerPC/PPCMachineScheduler.cpp | 52 | 
1 files changed, 28 insertions, 24 deletions
diff --git a/contrib/llvm-project/llvm/lib/Target/PowerPC/PPCMachineScheduler.cpp b/contrib/llvm-project/llvm/lib/Target/PowerPC/PPCMachineScheduler.cpp index ce615e554d94..03712879f7c4 100644 --- a/contrib/llvm-project/llvm/lib/Target/PowerPC/PPCMachineScheduler.cpp +++ b/contrib/llvm-project/llvm/lib/Target/PowerPC/PPCMachineScheduler.cpp @@ -46,7 +46,7 @@ bool PPCPreRASchedStrategy::biasAddiLoadCandidate(SchedCandidate &Cand,    return false;  } -void PPCPreRASchedStrategy::tryCandidate(SchedCandidate &Cand, +bool PPCPreRASchedStrategy::tryCandidate(SchedCandidate &Cand,                                           SchedCandidate &TryCand,                                           SchedBoundary *Zone) const {    // From GenericScheduler::tryCandidate @@ -54,25 +54,25 @@ void PPCPreRASchedStrategy::tryCandidate(SchedCandidate &Cand,    // Initialize the candidate if needed.    if (!Cand.isValid()) {      TryCand.Reason = NodeOrder; -    return; +    return true;    }    // Bias PhysReg Defs and copies to their uses and defined respectively.    if (tryGreater(biasPhysReg(TryCand.SU, TryCand.AtTop),                   biasPhysReg(Cand.SU, Cand.AtTop), TryCand, Cand, PhysReg)) -    return; +    return TryCand.Reason != NoCand;    // Avoid exceeding the target's limit.    if (DAG->isTrackingPressure() &&        tryPressure(TryCand.RPDelta.Excess, Cand.RPDelta.Excess, TryCand, Cand,                    RegExcess, TRI, DAG->MF)) -    return; +    return TryCand.Reason != NoCand;    // Avoid increasing the max critical pressure in the scheduled region.    if (DAG->isTrackingPressure() &&        tryPressure(TryCand.RPDelta.CriticalMax, Cand.RPDelta.CriticalMax,                    TryCand, Cand, RegCritical, TRI, DAG->MF)) -    return; +    return TryCand.Reason != NoCand;    // We only compare a subset of features when comparing nodes between    // Top and Bottom boundary. Some properties are simply incomparable, in many @@ -86,12 +86,12 @@ void PPCPreRASchedStrategy::tryCandidate(SchedCandidate &Cand,      // heuristics to take precedence.      if (Rem.IsAcyclicLatencyLimited && !Zone->getCurrMOps() &&          tryLatency(TryCand, Cand, *Zone)) -      return; +      return TryCand.Reason != NoCand;      // Prioritize instructions that read unbuffered resources by stall cycles.      if (tryLess(Zone->getLatencyStallCycles(TryCand.SU),                  Zone->getLatencyStallCycles(Cand.SU), TryCand, Cand, Stall)) -      return; +      return TryCand.Reason != NoCand;    }    // Keep clustered nodes together to encourage downstream peephole @@ -106,37 +106,37 @@ void PPCPreRASchedStrategy::tryCandidate(SchedCandidate &Cand,        TryCand.AtTop ? DAG->getNextClusterSucc() : DAG->getNextClusterPred();    if (tryGreater(TryCand.SU == TryCandNextClusterSU,                   Cand.SU == CandNextClusterSU, TryCand, Cand, Cluster)) -    return; +    return TryCand.Reason != NoCand;    if (SameBoundary) {      // Weak edges are for clustering and other constraints.      if (tryLess(getWeakLeft(TryCand.SU, TryCand.AtTop),                  getWeakLeft(Cand.SU, Cand.AtTop), TryCand, Cand, Weak)) -      return; +      return TryCand.Reason != NoCand;    }    // Avoid increasing the max pressure of the entire region.    if (DAG->isTrackingPressure() &&        tryPressure(TryCand.RPDelta.CurrentMax, Cand.RPDelta.CurrentMax, TryCand,                    Cand, RegMax, TRI, DAG->MF)) -    return; +    return TryCand.Reason != NoCand;    if (SameBoundary) {      // Avoid critical resource consumption and balance the schedule.      TryCand.initResourceDelta(DAG, SchedModel);      if (tryLess(TryCand.ResDelta.CritResources, Cand.ResDelta.CritResources,                  TryCand, Cand, ResourceReduce)) -      return; +      return TryCand.Reason != NoCand;      if (tryGreater(TryCand.ResDelta.DemandedResources,                     Cand.ResDelta.DemandedResources, TryCand, Cand,                     ResourceDemand)) -      return; +      return TryCand.Reason != NoCand;      // Avoid serializing long latency dependence chains.      // For acyclic path limited loops, latency was already checked above.      if (!RegionPolicy.DisableLatencyHeuristic && TryCand.Policy.ReduceLatency &&          !Rem.IsAcyclicLatencyLimited && tryLatency(TryCand, Cand, *Zone)) -      return; +      return TryCand.Reason != NoCand;      // Fall through to original instruction order.      if ((Zone->isTop() && TryCand.SU->NodeNum < Cand.SU->NodeNum) || @@ -150,14 +150,16 @@ void PPCPreRASchedStrategy::tryCandidate(SchedCandidate &Cand,    // Add powerpc specific heuristic only when TryCand isn't selected or    // selected as node order.    if (TryCand.Reason != NodeOrder && TryCand.Reason != NoCand) -    return; +    return true;    // There are some benefits to schedule the ADDI before the load to hide the    // latency, as RA may create a true dependency between the load and addi.    if (SameBoundary) {      if (biasAddiLoadCandidate(Cand, TryCand, *Zone)) -      return; +      return TryCand.Reason != NoCand;    } + +  return TryCand.Reason != NoCand;  }  bool PPCPostRASchedStrategy::biasAddiCandidate(SchedCandidate &Cand, @@ -172,38 +174,38 @@ bool PPCPostRASchedStrategy::biasAddiCandidate(SchedCandidate &Cand,    return false;  } -void PPCPostRASchedStrategy::tryCandidate(SchedCandidate &Cand, +bool PPCPostRASchedStrategy::tryCandidate(SchedCandidate &Cand,                                            SchedCandidate &TryCand) {    // From PostGenericScheduler::tryCandidate    // Initialize the candidate if needed.    if (!Cand.isValid()) {      TryCand.Reason = NodeOrder; -    return; +    return true;    }    // Prioritize instructions that read unbuffered resources by stall cycles.    if (tryLess(Top.getLatencyStallCycles(TryCand.SU),                Top.getLatencyStallCycles(Cand.SU), TryCand, Cand, Stall)) -    return; +    return TryCand.Reason != NoCand;    // Keep clustered nodes together.    if (tryGreater(TryCand.SU == DAG->getNextClusterSucc(),                   Cand.SU == DAG->getNextClusterSucc(), TryCand, Cand, Cluster)) -    return; +    return TryCand.Reason != NoCand;    // Avoid critical resource consumption and balance the schedule.    if (tryLess(TryCand.ResDelta.CritResources, Cand.ResDelta.CritResources,                TryCand, Cand, ResourceReduce)) -    return; +    return TryCand.Reason != NoCand;    if (tryGreater(TryCand.ResDelta.DemandedResources,                   Cand.ResDelta.DemandedResources, TryCand, Cand,                   ResourceDemand)) -    return; +    return TryCand.Reason != NoCand;    // Avoid serializing long latency dependence chains.    if (Cand.Policy.ReduceLatency && tryLatency(TryCand, Cand, Top)) { -    return; +    return TryCand.Reason != NoCand;    }    // Fall through to original instruction order. @@ -215,14 +217,16 @@ void PPCPostRASchedStrategy::tryCandidate(SchedCandidate &Cand,    // 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; +    return true;    // 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; +    return TryCand.Reason != NoCand; + +  return TryCand.Reason != NoCand;  }  void PPCPostRASchedStrategy::enterMBB(MachineBasicBlock *MBB) {  | 
