> > When scheduling insn 58, we calculate a window of possible cycles according > to already scheduled predecessors and successors. This window looks like a > parallelogram in general rather than a rectangle: in the first cycle there > may be predecessors (already scheduled in the first cycle, or a multiple of > II cycles away) which must_preceed insn 58 (having tight dependence with > insn 58 if it is placed in the first cycle). So insn 58 can be placed in > 'rightmost' slots of the first cycle only. Similarly, in the last cycle, > insn 58 might be placed in 'leftmost' slots only, due to successors which > must_follow insn 58. Inside internal cycles (strictly between first and > last cycles), insn 58 can be placed in any vacant slot. > > Now if (as in the above case) an already scheduled insn 61 is both a > successor and a predecessor of insn 58, it may be that (not it the above > case) insn 61 must_precede insn 58 (when looking for available slots for > insn 58 in the first cycle) and must_follow insn 58 (when looking for > available slots in the last cycle). > > Currently we apply the must_precede and must_follow restrictions to all > cycles of the window. This is overly conservative (i.e., should not produce > above wrong code!). One way to improve this is to split the window into > first cycle (with must_precede), internal part (with neither must_precede > nor must_follow), and last cycle (with must_follow). And, of-course, if > first cycle == last cycle, apply both must_precede and must_follow for it. > > > Finally, note that in the above case we traverse the window backwards with > step -1, so 'start' is the last cycle 4, and 'end' is one past the first > cycle 0 (i.e. -1).
Thanks for the explanation! Is it reasonable to conclude that for the must_follow/must_precede calculation we should not relay on start/end rows (as they are influenced from the direction of the window); but use win_boundary_close_to_preds row and win_boundary_close_to_succs row, calculated from start and ends rows depending on the direction of the window (if step is 1 than in_boundery_close_to_preds = start; if step is -1 than in_boundary_close_to_preds = end, etc). win_boundary_close_to_preds will be used only for must_precede calculation and win_boundary_close_to_succs row will be used only for must_follow as you described above. Thanks, Revital