@@ -2461,47 +2461,43 @@ bool SwingSchedulerDAG::schedulePipeline(SMSchedule &Schedule) {
2461
2461
// upon the scheduled time for any predecessors/successors.
2462
2462
int EarlyStart = INT_MIN;
2463
2463
int LateStart = INT_MAX;
2464
- // These values are set when the size of the schedule window is limited
2465
- // due to chain dependences.
2466
- int SchedEnd = INT_MAX;
2467
- int SchedStart = INT_MIN;
2468
- Schedule.computeStart (SU, &EarlyStart, &LateStart, &SchedEnd, &SchedStart,
2469
- II, this );
2464
+ Schedule.computeStart (SU, &EarlyStart, &LateStart, II, this );
2470
2465
LLVM_DEBUG ({
2471
2466
dbgs () << " \n " ;
2472
2467
dbgs () << " Inst (" << SU->NodeNum << " ) " ;
2473
2468
SU->getInstr ()->dump ();
2474
2469
dbgs () << " \n " ;
2475
2470
});
2476
- LLVM_DEBUG ({
2477
- dbgs () << format (" \t es: %8x ls: %8x me: %8x ms: %8x\n " , EarlyStart,
2478
- LateStart, SchedEnd, SchedStart);
2479
- });
2471
+ LLVM_DEBUG (
2472
+ dbgs () << format (" \t es: %8x ls: %8x\n " , EarlyStart, LateStart));
2480
2473
2481
- if (EarlyStart > LateStart || SchedEnd < EarlyStart ||
2482
- SchedStart > LateStart)
2474
+ if (EarlyStart > LateStart)
2483
2475
scheduleFound = false ;
2484
- else if (EarlyStart != INT_MIN && LateStart == INT_MAX) {
2485
- SchedEnd = std::min (SchedEnd, EarlyStart + (int )II - 1 );
2486
- scheduleFound = Schedule.insert (SU, EarlyStart, SchedEnd, II);
2487
- } else if (EarlyStart == INT_MIN && LateStart != INT_MAX) {
2488
- SchedStart = std::max (SchedStart, LateStart - (int )II + 1 );
2489
- scheduleFound = Schedule.insert (SU, LateStart, SchedStart, II);
2490
- } else if (EarlyStart != INT_MIN && LateStart != INT_MAX) {
2491
- SchedEnd =
2492
- std::min (SchedEnd, std::min (LateStart, EarlyStart + (int )II - 1 ));
2493
- // When scheduling a Phi it is better to start at the late cycle and go
2494
- // backwards. The default order may insert the Phi too far away from
2495
- // its first dependence.
2496
- if (SU->getInstr ()->isPHI ())
2497
- scheduleFound = Schedule.insert (SU, SchedEnd, EarlyStart, II);
2476
+ else if (EarlyStart != INT_MIN && LateStart == INT_MAX)
2477
+ scheduleFound =
2478
+ Schedule.insert (SU, EarlyStart, EarlyStart + (int )II - 1 , II);
2479
+ else if (EarlyStart == INT_MIN && LateStart != INT_MAX)
2480
+ scheduleFound =
2481
+ Schedule.insert (SU, LateStart, LateStart - (int )II + 1 , II);
2482
+ else if (EarlyStart != INT_MIN && LateStart != INT_MAX) {
2483
+ LateStart = std::min (LateStart, EarlyStart + (int )II - 1 );
2484
+ // When scheduling a Phi it is better to start at the late cycle and
2485
+ // go backwards. The default order may insert the Phi too far away
2486
+ // from its first dependence.
2487
+ // Also, do backward search when all scheduled predecessors are
2488
+ // loop-carried output/order dependencies. Empirically, there are also
2489
+ // cases where scheduling becomes possible with backward search.
2490
+ if (SU->getInstr ()->isPHI () ||
2491
+ Schedule.onlyHasLoopCarriedOutputOrOrderPreds (SU, this ))
2492
+ scheduleFound = Schedule.insert (SU, LateStart, EarlyStart, II);
2498
2493
else
2499
- scheduleFound = Schedule.insert (SU, EarlyStart, SchedEnd , II);
2494
+ scheduleFound = Schedule.insert (SU, EarlyStart, LateStart , II);
2500
2495
} else {
2501
2496
int FirstCycle = Schedule.getFirstCycle ();
2502
2497
scheduleFound = Schedule.insert (SU, FirstCycle + getASAP (SU),
2503
2498
FirstCycle + getASAP (SU) + II - 1 , II);
2504
2499
}
2500
+
2505
2501
// Even if we find a schedule, make sure the schedule doesn't exceed the
2506
2502
// allowable number of stages. We keep trying if this happens.
2507
2503
if (scheduleFound)
@@ -2909,8 +2905,7 @@ static SUnit *multipleIterations(SUnit *SU, SwingSchedulerDAG *DAG) {
2909
2905
// / Compute the scheduling start slot for the instruction. The start slot
2910
2906
// / depends on any predecessor or successor nodes scheduled already.
2911
2907
void SMSchedule::computeStart (SUnit *SU, int *MaxEarlyStart, int *MinLateStart,
2912
- int *MinEnd, int *MaxStart, int II,
2913
- SwingSchedulerDAG *DAG) {
2908
+ int II, SwingSchedulerDAG *DAG) {
2914
2909
// Iterate over each instruction that has been scheduled already. The start
2915
2910
// slot computation depends on whether the previously scheduled instruction
2916
2911
// is a predecessor or successor of the specified instruction.
@@ -2929,7 +2924,7 @@ void SMSchedule::computeStart(SUnit *SU, int *MaxEarlyStart, int *MinLateStart,
2929
2924
*MaxEarlyStart = std::max (*MaxEarlyStart, EarlyStart);
2930
2925
if (DAG->isLoopCarriedDep (SU, Dep, false )) {
2931
2926
int End = earliestCycleInChain (Dep) + (II - 1 );
2932
- *MinEnd = std::min (*MinEnd , End);
2927
+ *MinLateStart = std::min (*MinLateStart , End);
2933
2928
}
2934
2929
} else {
2935
2930
int LateStart = cycle - Dep.getLatency () +
@@ -2953,7 +2948,7 @@ void SMSchedule::computeStart(SUnit *SU, int *MaxEarlyStart, int *MinLateStart,
2953
2948
*MinLateStart = std::min (*MinLateStart, LateStart);
2954
2949
if (DAG->isLoopCarriedDep (SU, Dep)) {
2955
2950
int Start = latestCycleInChain (Dep) + 1 - II;
2956
- *MaxStart = std::max (*MaxStart , Start);
2951
+ *MaxEarlyStart = std::max (*MaxEarlyStart , Start);
2957
2952
}
2958
2953
} else {
2959
2954
int EarlyStart = cycle + Dep.getLatency () -
@@ -3146,6 +3141,19 @@ bool SMSchedule::isLoopCarriedDefOfUse(const SwingSchedulerDAG *SSD,
3146
3141
return false ;
3147
3142
}
3148
3143
3144
+ // / Return true if all scheduled predecessors are loop-carried output/order
3145
+ // / dependencies.
3146
+ bool SMSchedule::onlyHasLoopCarriedOutputOrOrderPreds (
3147
+ SUnit *SU, SwingSchedulerDAG *DAG) const {
3148
+ for (const SDep &Pred : SU->Preds )
3149
+ if (InstrToCycle.count (Pred.getSUnit ()) && !DAG->isBackedge (SU, Pred))
3150
+ return false ;
3151
+ for (const SDep &Succ : SU->Succs )
3152
+ if (InstrToCycle.count (Succ.getSUnit ()) && DAG->isBackedge (SU, Succ))
3153
+ return false ;
3154
+ return true ;
3155
+ }
3156
+
3149
3157
// / Determine transitive dependences of unpipelineable instructions
3150
3158
SmallSet<SUnit *, 8 > SMSchedule::computeUnpipelineableNodes (
3151
3159
SwingSchedulerDAG *SSD, TargetInstrInfo::PipelinerLoopInfo *PLI) {
0 commit comments