@@ -2420,47 +2420,43 @@ bool SwingSchedulerDAG::schedulePipeline(SMSchedule &Schedule) {
2420
2420
// upon the scheduled time for any predecessors/successors.
2421
2421
int EarlyStart = INT_MIN;
2422
2422
int LateStart = INT_MAX;
2423
- // These values are set when the size of the schedule window is limited
2424
- // due to chain dependences.
2425
- int SchedEnd = INT_MAX;
2426
- int SchedStart = INT_MIN;
2427
- Schedule.computeStart (SU, &EarlyStart, &LateStart, &SchedEnd, &SchedStart,
2428
- II, this );
2423
+ Schedule.computeStart (SU, &EarlyStart, &LateStart, II, this );
2429
2424
LLVM_DEBUG ({
2430
2425
dbgs () << " \n " ;
2431
2426
dbgs () << " Inst (" << SU->NodeNum << " ) " ;
2432
2427
SU->getInstr ()->dump ();
2433
2428
dbgs () << " \n " ;
2434
2429
});
2435
- LLVM_DEBUG ({
2436
- dbgs () << format (" \t es: %8x ls: %8x me: %8x ms: %8x\n " , EarlyStart,
2437
- LateStart, SchedEnd, SchedStart);
2438
- });
2430
+ LLVM_DEBUG (
2431
+ dbgs () << format (" \t es: %8x ls: %8x\n " , EarlyStart, LateStart));
2439
2432
2440
- if (EarlyStart > LateStart || SchedEnd < EarlyStart ||
2441
- SchedStart > LateStart)
2433
+ if (EarlyStart > LateStart)
2442
2434
scheduleFound = false ;
2443
- else if (EarlyStart != INT_MIN && LateStart == INT_MAX) {
2444
- SchedEnd = std::min (SchedEnd, EarlyStart + (int )II - 1 );
2445
- scheduleFound = Schedule.insert (SU, EarlyStart, SchedEnd, II);
2446
- } else if (EarlyStart == INT_MIN && LateStart != INT_MAX) {
2447
- SchedStart = std::max (SchedStart, LateStart - (int )II + 1 );
2448
- scheduleFound = Schedule.insert (SU, LateStart, SchedStart, II);
2449
- } else if (EarlyStart != INT_MIN && LateStart != INT_MAX) {
2450
- SchedEnd =
2451
- std::min (SchedEnd, std::min (LateStart, EarlyStart + (int )II - 1 ));
2452
- // When scheduling a Phi it is better to start at the late cycle and go
2453
- // backwards. The default order may insert the Phi too far away from
2454
- // its first dependence.
2455
- if (SU->getInstr ()->isPHI ())
2456
- scheduleFound = Schedule.insert (SU, SchedEnd, EarlyStart, II);
2435
+ else if (EarlyStart != INT_MIN && LateStart == INT_MAX)
2436
+ scheduleFound =
2437
+ Schedule.insert (SU, EarlyStart, EarlyStart + (int )II - 1 , II);
2438
+ else if (EarlyStart == INT_MIN && LateStart != INT_MAX)
2439
+ scheduleFound =
2440
+ Schedule.insert (SU, LateStart, LateStart - (int )II + 1 , II);
2441
+ else if (EarlyStart != INT_MIN && LateStart != INT_MAX) {
2442
+ LateStart = std::min (LateStart, EarlyStart + (int )II - 1 );
2443
+ // When scheduling a Phi it is better to start at the late cycle and
2444
+ // go backwards. The default order may insert the Phi too far away
2445
+ // from its first dependence.
2446
+ // Also, do backward search when all scheduled predecessors are
2447
+ // loop-carried output/order dependencies. Empirically, there are also
2448
+ // cases where scheduling becomes possible with backward search.
2449
+ if (SU->getInstr ()->isPHI () ||
2450
+ Schedule.onlyHasLoopCarriedOutputOrOrderPreds (SU, this ))
2451
+ scheduleFound = Schedule.insert (SU, LateStart, EarlyStart, II);
2457
2452
else
2458
- scheduleFound = Schedule.insert (SU, EarlyStart, SchedEnd , II);
2453
+ scheduleFound = Schedule.insert (SU, EarlyStart, LateStart , II);
2459
2454
} else {
2460
2455
int FirstCycle = Schedule.getFirstCycle ();
2461
2456
scheduleFound = Schedule.insert (SU, FirstCycle + getASAP (SU),
2462
2457
FirstCycle + getASAP (SU) + II - 1 , II);
2463
2458
}
2459
+
2464
2460
// Even if we find a schedule, make sure the schedule doesn't exceed the
2465
2461
// allowable number of stages. We keep trying if this happens.
2466
2462
if (scheduleFound)
@@ -2868,8 +2864,7 @@ static SUnit *multipleIterations(SUnit *SU, SwingSchedulerDAG *DAG) {
2868
2864
// / Compute the scheduling start slot for the instruction. The start slot
2869
2865
// / depends on any predecessor or successor nodes scheduled already.
2870
2866
void SMSchedule::computeStart (SUnit *SU, int *MaxEarlyStart, int *MinLateStart,
2871
- int *MinEnd, int *MaxStart, int II,
2872
- SwingSchedulerDAG *DAG) {
2867
+ int II, SwingSchedulerDAG *DAG) {
2873
2868
// Iterate over each instruction that has been scheduled already. The start
2874
2869
// slot computation depends on whether the previously scheduled instruction
2875
2870
// is a predecessor or successor of the specified instruction.
@@ -2888,7 +2883,7 @@ void SMSchedule::computeStart(SUnit *SU, int *MaxEarlyStart, int *MinLateStart,
2888
2883
*MaxEarlyStart = std::max (*MaxEarlyStart, EarlyStart);
2889
2884
if (DAG->isLoopCarriedDep (SU, Dep, false )) {
2890
2885
int End = earliestCycleInChain (Dep) + (II - 1 );
2891
- *MinEnd = std::min (*MinEnd , End);
2886
+ *MinLateStart = std::min (*MinLateStart , End);
2892
2887
}
2893
2888
} else {
2894
2889
int LateStart = cycle - Dep.getLatency () +
@@ -2912,7 +2907,7 @@ void SMSchedule::computeStart(SUnit *SU, int *MaxEarlyStart, int *MinLateStart,
2912
2907
*MinLateStart = std::min (*MinLateStart, LateStart);
2913
2908
if (DAG->isLoopCarriedDep (SU, Dep)) {
2914
2909
int Start = latestCycleInChain (Dep) + 1 - II;
2915
- *MaxStart = std::max (*MaxStart , Start);
2910
+ *MaxEarlyStart = std::max (*MaxEarlyStart , Start);
2916
2911
}
2917
2912
} else {
2918
2913
int EarlyStart = cycle + Dep.getLatency () -
@@ -3105,6 +3100,19 @@ bool SMSchedule::isLoopCarriedDefOfUse(const SwingSchedulerDAG *SSD,
3105
3100
return false ;
3106
3101
}
3107
3102
3103
+ // / Return true if all scheduled predecessors are loop-carried output/order
3104
+ // / dependencies.
3105
+ bool SMSchedule::onlyHasLoopCarriedOutputOrOrderPreds (
3106
+ SUnit *SU, SwingSchedulerDAG *DAG) const {
3107
+ for (const SDep &Pred : SU->Preds )
3108
+ if (InstrToCycle.count (Pred.getSUnit ()) && !DAG->isBackedge (SU, Pred))
3109
+ return false ;
3110
+ for (const SDep &Succ : SU->Succs )
3111
+ if (InstrToCycle.count (Succ.getSUnit ()) && DAG->isBackedge (SU, Succ))
3112
+ return false ;
3113
+ return true ;
3114
+ }
3115
+
3108
3116
// / Determine transitive dependences of unpipelineable instructions
3109
3117
SmallSet<SUnit *, 8 > SMSchedule::computeUnpipelineableNodes (
3110
3118
SwingSchedulerDAG *SSD, TargetInstrInfo::PipelinerLoopInfo *PLI) {
0 commit comments