OSDN Git Service

2006-12-13 Jakub Jelinek <jakub@redhat.com>
[pf3gnuchains/gcc-fork.git] / gcc / modulo-sched.c
1 /* Swing Modulo Scheduling implementation.
2    Copyright (C) 2004, 2005, 2006
3    Free Software Foundation, Inc.
4    Contributed by Ayal Zaks and Mustafa Hagog <zaks,mustafa@il.ibm.com>
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING.  If not, write to the Free
20 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
21 02110-1301, USA.  */
22
23
24 #include "config.h"
25 #include "system.h"
26 #include "coretypes.h"
27 #include "tm.h"
28 #include "toplev.h"
29 #include "rtl.h"
30 #include "tm_p.h"
31 #include "hard-reg-set.h"
32 #include "regs.h"
33 #include "function.h"
34 #include "flags.h"
35 #include "insn-config.h"
36 #include "insn-attr.h"
37 #include "except.h"
38 #include "toplev.h"
39 #include "recog.h"
40 #include "sched-int.h"
41 #include "target.h"
42 #include "cfglayout.h"
43 #include "cfgloop.h"
44 #include "cfghooks.h"
45 #include "expr.h"
46 #include "params.h"
47 #include "gcov-io.h"
48 #include "df.h"
49 #include "ddg.h"
50 #include "timevar.h"
51 #include "tree-pass.h"
52
53 #ifdef INSN_SCHEDULING
54
55 /* This file contains the implementation of the Swing Modulo Scheduler,
56    described in the following references:
57    [1] J. Llosa, A. Gonzalez, E. Ayguade, M. Valero., and J. Eckhardt.
58        Lifetime--sensitive modulo scheduling in a production environment.
59        IEEE Trans. on Comps., 50(3), March 2001
60    [2] J. Llosa, A. Gonzalez, E. Ayguade, and M. Valero.
61        Swing Modulo Scheduling: A Lifetime Sensitive Approach.
62        PACT '96 , pages 80-87, October 1996 (Boston - Massachusetts - USA).
63
64    The basic structure is:
65    1. Build a data-dependence graph (DDG) for each loop.
66    2. Use the DDG to order the insns of a loop (not in topological order
67       necessarily, but rather) trying to place each insn after all its
68       predecessors _or_ after all its successors.
69    3. Compute MII: a lower bound on the number of cycles to schedule the loop.
70    4. Use the ordering to perform list-scheduling of the loop:
71       1. Set II = MII.  We will try to schedule the loop within II cycles.
72       2. Try to schedule the insns one by one according to the ordering.
73          For each insn compute an interval of cycles by considering already-
74          scheduled preds and succs (and associated latencies); try to place
75          the insn in the cycles of this window checking for potential
76          resource conflicts (using the DFA interface).
77          Note: this is different from the cycle-scheduling of schedule_insns;
78          here the insns are not scheduled monotonically top-down (nor bottom-
79          up).
80       3. If failed in scheduling all insns - bump II++ and try again, unless
81          II reaches an upper bound MaxII, in which case report failure.
82    5. If we succeeded in scheduling the loop within II cycles, we now
83       generate prolog and epilog, decrease the counter of the loop, and
84       perform modulo variable expansion for live ranges that span more than
85       II cycles (i.e. use register copies to prevent a def from overwriting
86       itself before reaching the use).
87 */
88
89 \f
90 /* This page defines partial-schedule structures and functions for
91    modulo scheduling.  */
92
93 typedef struct partial_schedule *partial_schedule_ptr;
94 typedef struct ps_insn *ps_insn_ptr;
95
96 /* The minimum (absolute) cycle that a node of ps was scheduled in.  */
97 #define PS_MIN_CYCLE(ps) (((partial_schedule_ptr)(ps))->min_cycle)
98
99 /* The maximum (absolute) cycle that a node of ps was scheduled in.  */
100 #define PS_MAX_CYCLE(ps) (((partial_schedule_ptr)(ps))->max_cycle)
101
102 /* Perform signed modulo, always returning a non-negative value.  */
103 #define SMODULO(x,y) ((x) % (y) < 0 ? ((x) % (y) + (y)) : (x) % (y))
104
105 /* The number of different iterations the nodes in ps span, assuming
106    the stage boundaries are placed efficiently.  */
107 #define PS_STAGE_COUNT(ps) ((PS_MAX_CYCLE (ps) - PS_MIN_CYCLE (ps) \
108                              + 1 + (ps)->ii - 1) / (ps)->ii)
109
110 /* A single instruction in the partial schedule.  */
111 struct ps_insn
112 {
113   /* The corresponding DDG_NODE.  */
114   ddg_node_ptr node;
115
116   /* The (absolute) cycle in which the PS instruction is scheduled.
117      Same as SCHED_TIME (node).  */
118   int cycle;
119
120   /* The next/prev PS_INSN in the same row.  */
121   ps_insn_ptr next_in_row,
122               prev_in_row;
123
124   /* The number of nodes in the same row that come after this node.  */
125   int row_rest_count;
126 };
127
128 /* Holds the partial schedule as an array of II rows.  Each entry of the
129    array points to a linked list of PS_INSNs, which represents the
130    instructions that are scheduled for that row.  */
131 struct partial_schedule
132 {
133   int ii;       /* Number of rows in the partial schedule.  */
134   int history;  /* Threshold for conflict checking using DFA.  */
135
136   /* rows[i] points to linked list of insns scheduled in row i (0<=i<ii).  */
137   ps_insn_ptr *rows;
138
139   /* The earliest absolute cycle of an insn in the partial schedule.  */
140   int min_cycle;
141
142   /* The latest absolute cycle of an insn in the partial schedule.  */
143   int max_cycle;
144
145   ddg_ptr g;    /* The DDG of the insns in the partial schedule.  */
146 };
147
148 /* We use this to record all the register replacements we do in
149    the kernel so we can undo SMS if it is not profitable.  */
150 struct undo_replace_buff_elem
151 {
152   rtx insn;
153   rtx orig_reg;
154   rtx new_reg;
155   struct undo_replace_buff_elem *next;
156 };
157
158
159   
160 static partial_schedule_ptr create_partial_schedule (int ii, ddg_ptr, int history);
161 static void free_partial_schedule (partial_schedule_ptr);
162 static void reset_partial_schedule (partial_schedule_ptr, int new_ii);
163 void print_partial_schedule (partial_schedule_ptr, FILE *);
164 static int kernel_number_of_cycles (rtx first_insn, rtx last_insn);
165 static ps_insn_ptr ps_add_node_check_conflicts (partial_schedule_ptr,
166                                                 ddg_node_ptr node, int cycle,
167                                                 sbitmap must_precede,
168                                                 sbitmap must_follow);
169 static void rotate_partial_schedule (partial_schedule_ptr, int);
170 void set_row_column_for_ps (partial_schedule_ptr);
171 static bool ps_unschedule_node (partial_schedule_ptr, ddg_node_ptr );
172
173 \f
174 /* This page defines constants and structures for the modulo scheduling
175    driver.  */
176
177 /* As in haifa-sched.c:  */
178 /* issue_rate is the number of insns that can be scheduled in the same
179    machine cycle.  It can be defined in the config/mach/mach.h file,
180    otherwise we set it to 1.  */
181
182 static int issue_rate;
183
184 static int sms_order_nodes (ddg_ptr, int, int * result);
185 static void set_node_sched_params (ddg_ptr);
186 static partial_schedule_ptr sms_schedule_by_order (ddg_ptr, int, int, int *);
187 static void permute_partial_schedule (partial_schedule_ptr ps, rtx last);
188 static void generate_prolog_epilog (partial_schedule_ptr ,struct loop * loop, rtx);
189 static void duplicate_insns_of_cycles (partial_schedule_ptr ps,
190                                        int from_stage, int to_stage,
191                                        int is_prolog);
192
193 #define SCHED_ASAP(x) (((node_sched_params_ptr)(x)->aux.info)->asap)
194 #define SCHED_TIME(x) (((node_sched_params_ptr)(x)->aux.info)->time)
195 #define SCHED_FIRST_REG_MOVE(x) \
196         (((node_sched_params_ptr)(x)->aux.info)->first_reg_move)
197 #define SCHED_NREG_MOVES(x) \
198         (((node_sched_params_ptr)(x)->aux.info)->nreg_moves)
199 #define SCHED_ROW(x) (((node_sched_params_ptr)(x)->aux.info)->row)
200 #define SCHED_STAGE(x) (((node_sched_params_ptr)(x)->aux.info)->stage)
201 #define SCHED_COLUMN(x) (((node_sched_params_ptr)(x)->aux.info)->column)
202
203 /* The scheduling parameters held for each node.  */
204 typedef struct node_sched_params
205 {
206   int asap;     /* A lower-bound on the absolute scheduling cycle.  */
207   int time;     /* The absolute scheduling cycle (time >= asap).  */
208
209   /* The following field (first_reg_move) is a pointer to the first
210      register-move instruction added to handle the modulo-variable-expansion
211      of the register defined by this node.  This register-move copies the
212      original register defined by the node.  */
213   rtx first_reg_move;
214
215   /* The number of register-move instructions added, immediately preceding
216      first_reg_move.  */
217   int nreg_moves;
218
219   int row;    /* Holds time % ii.  */
220   int stage;  /* Holds time / ii.  */
221
222   /* The column of a node inside the ps.  If nodes u, v are on the same row,
223      u will precede v if column (u) < column (v).  */
224   int column;
225 } *node_sched_params_ptr;
226
227 \f
228 /* The following three functions are copied from the current scheduler
229    code in order to use sched_analyze() for computing the dependencies.
230    They are used when initializing the sched_info structure.  */
231 static const char *
232 sms_print_insn (rtx insn, int aligned ATTRIBUTE_UNUSED)
233 {
234   static char tmp[80];
235
236   sprintf (tmp, "i%4d", INSN_UID (insn));
237   return tmp;
238 }
239
240 static void
241 compute_jump_reg_dependencies (rtx insn ATTRIBUTE_UNUSED,
242                                regset cond_exec ATTRIBUTE_UNUSED,
243                                regset used ATTRIBUTE_UNUSED,
244                                regset set ATTRIBUTE_UNUSED)
245 {
246 }
247
248 static struct sched_info sms_sched_info =
249 {
250   NULL,
251   NULL,
252   NULL,
253   NULL,
254   NULL,
255   sms_print_insn,
256   NULL,
257   compute_jump_reg_dependencies,
258   NULL, NULL,
259   NULL, NULL,
260   0, 0, 0,
261
262   NULL, NULL, NULL, NULL, NULL,
263 #ifdef ENABLE_CHECKING
264   NULL,
265 #endif
266   0
267 };
268
269
270 /* Return the register decremented and tested in INSN,
271    or zero if it is not a decrement-and-branch insn.  */
272
273 static rtx
274 doloop_register_get (rtx insn ATTRIBUTE_UNUSED)
275 {
276 #ifdef HAVE_doloop_end
277   rtx pattern, reg, condition;
278
279   if (! JUMP_P (insn))
280     return NULL_RTX;
281
282   pattern = PATTERN (insn);
283   condition = doloop_condition_get (pattern);
284   if (! condition)
285     return NULL_RTX;
286
287   if (REG_P (XEXP (condition, 0)))
288     reg = XEXP (condition, 0);
289   else if (GET_CODE (XEXP (condition, 0)) == PLUS
290            && REG_P (XEXP (XEXP (condition, 0), 0)))
291     reg = XEXP (XEXP (condition, 0), 0);
292   else
293     gcc_unreachable ();
294
295   return reg;
296 #else
297   return NULL_RTX;
298 #endif
299 }
300
301 /* Check if COUNT_REG is set to a constant in the PRE_HEADER block, so
302    that the number of iterations is a compile-time constant.  If so,
303    return the rtx that sets COUNT_REG to a constant, and set COUNT to
304    this constant.  Otherwise return 0.  */
305 static rtx
306 const_iteration_count (rtx count_reg, basic_block pre_header,
307                        HOST_WIDEST_INT * count)
308 {
309   rtx insn;
310   rtx head, tail;
311
312   if (! pre_header)
313     return NULL_RTX;
314
315   get_ebb_head_tail (pre_header, pre_header, &head, &tail);
316
317   for (insn = tail; insn != PREV_INSN (head); insn = PREV_INSN (insn))
318     if (INSN_P (insn) && single_set (insn) &&
319         rtx_equal_p (count_reg, SET_DEST (single_set (insn))))
320       {
321         rtx pat = single_set (insn);
322
323         if (GET_CODE (SET_SRC (pat)) == CONST_INT)
324           {
325             *count = INTVAL (SET_SRC (pat));
326             return insn;
327           }
328
329         return NULL_RTX;
330       }
331
332   return NULL_RTX;
333 }
334
335 /* A very simple resource-based lower bound on the initiation interval.
336    ??? Improve the accuracy of this bound by considering the
337    utilization of various units.  */
338 static int
339 res_MII (ddg_ptr g)
340 {
341   return (g->num_nodes / issue_rate);
342 }
343
344
345 /* Points to the array that contains the sched data for each node.  */
346 static node_sched_params_ptr node_sched_params;
347
348 /* Allocate sched_params for each node and initialize it.  Assumes that
349    the aux field of each node contain the asap bound (computed earlier),
350    and copies it into the sched_params field.  */
351 static void
352 set_node_sched_params (ddg_ptr g)
353 {
354   int i;
355
356   /* Allocate for each node in the DDG a place to hold the "sched_data".  */
357   /* Initialize ASAP/ALAP/HIGHT to zero.  */
358   node_sched_params = (node_sched_params_ptr)
359                        xcalloc (g->num_nodes,
360                                 sizeof (struct node_sched_params));
361
362   /* Set the pointer of the general data of the node to point to the
363      appropriate sched_params structure.  */
364   for (i = 0; i < g->num_nodes; i++)
365     {
366       /* Watch out for aliasing problems?  */
367       node_sched_params[i].asap = g->nodes[i].aux.count;
368       g->nodes[i].aux.info = &node_sched_params[i];
369     }
370 }
371
372 static void
373 print_node_sched_params (FILE * file, int num_nodes)
374 {
375   int i;
376
377   if (! file)
378     return;
379   for (i = 0; i < num_nodes; i++)
380     {
381       node_sched_params_ptr nsp = &node_sched_params[i];
382       rtx reg_move = nsp->first_reg_move;
383       int j;
384
385       fprintf (file, "Node %d:\n", i);
386       fprintf (file, " asap = %d:\n", nsp->asap);
387       fprintf (file, " time = %d:\n", nsp->time);
388       fprintf (file, " nreg_moves = %d:\n", nsp->nreg_moves);
389       for (j = 0; j < nsp->nreg_moves; j++)
390         {
391           fprintf (file, " reg_move = ");
392           print_rtl_single (file, reg_move);
393           reg_move = PREV_INSN (reg_move);
394         }
395     }
396 }
397
398 /* Calculate an upper bound for II.  SMS should not schedule the loop if it
399    requires more cycles than this bound.  Currently set to the sum of the
400    longest latency edge for each node.  Reset based on experiments.  */
401 static int
402 calculate_maxii (ddg_ptr g)
403 {
404   int i;
405   int maxii = 0;
406
407   for (i = 0; i < g->num_nodes; i++)
408     {
409       ddg_node_ptr u = &g->nodes[i];
410       ddg_edge_ptr e;
411       int max_edge_latency = 0;
412
413       for (e = u->out; e; e = e->next_out)
414         max_edge_latency = MAX (max_edge_latency, e->latency);
415
416       maxii += max_edge_latency;
417     }
418   return maxii;
419 }
420
421 /*
422    Breaking intra-loop register anti-dependences:
423    Each intra-loop register anti-dependence implies a cross-iteration true
424    dependence of distance 1. Therefore, we can remove such false dependencies
425    and figure out if the partial schedule broke them by checking if (for a
426    true-dependence of distance 1): SCHED_TIME (def) < SCHED_TIME (use) and
427    if so generate a register move.   The number of such moves is equal to:
428               SCHED_TIME (use) - SCHED_TIME (def)       { 0 broken
429    nreg_moves = ----------------------------------- + 1 - {   dependence.
430                             ii                          { 1 if not.
431 */
432 static struct undo_replace_buff_elem *
433 generate_reg_moves (partial_schedule_ptr ps)
434 {
435   ddg_ptr g = ps->g;
436   int ii = ps->ii;
437   int i;
438   struct undo_replace_buff_elem *reg_move_replaces = NULL;
439
440   for (i = 0; i < g->num_nodes; i++)
441     {
442       ddg_node_ptr u = &g->nodes[i];
443       ddg_edge_ptr e;
444       int nreg_moves = 0, i_reg_move;
445       sbitmap *uses_of_defs;
446       rtx last_reg_move;
447       rtx prev_reg, old_reg;
448
449       /* Compute the number of reg_moves needed for u, by looking at life
450          ranges started at u (excluding self-loops).  */
451       for (e = u->out; e; e = e->next_out)
452         if (e->type == TRUE_DEP && e->dest != e->src)
453           {
454             int nreg_moves4e = (SCHED_TIME (e->dest) - SCHED_TIME (e->src)) / ii;
455
456             if (e->distance == 1)
457               nreg_moves4e = (SCHED_TIME (e->dest) - SCHED_TIME (e->src) + ii) / ii;
458
459             /* If dest precedes src in the schedule of the kernel, then dest
460                will read before src writes and we can save one reg_copy.  */
461             if (SCHED_ROW (e->dest) == SCHED_ROW (e->src)
462                 && SCHED_COLUMN (e->dest) < SCHED_COLUMN (e->src))
463               nreg_moves4e--;
464
465             nreg_moves = MAX (nreg_moves, nreg_moves4e);
466           }
467
468       if (nreg_moves == 0)
469         continue;
470
471       /* Every use of the register defined by node may require a different
472          copy of this register, depending on the time the use is scheduled.
473          Set a bitmap vector, telling which nodes use each copy of this
474          register.  */
475       uses_of_defs = sbitmap_vector_alloc (nreg_moves, g->num_nodes);
476       sbitmap_vector_zero (uses_of_defs, nreg_moves);
477       for (e = u->out; e; e = e->next_out)
478         if (e->type == TRUE_DEP && e->dest != e->src)
479           {
480             int dest_copy = (SCHED_TIME (e->dest) - SCHED_TIME (e->src)) / ii;
481
482             if (e->distance == 1)
483               dest_copy = (SCHED_TIME (e->dest) - SCHED_TIME (e->src) + ii) / ii;
484
485             if (SCHED_ROW (e->dest) == SCHED_ROW (e->src)
486                 && SCHED_COLUMN (e->dest) < SCHED_COLUMN (e->src))
487               dest_copy--;
488
489             if (dest_copy)
490               SET_BIT (uses_of_defs[dest_copy - 1], e->dest->cuid);
491           }
492
493       /* Now generate the reg_moves, attaching relevant uses to them.  */
494       SCHED_NREG_MOVES (u) = nreg_moves;
495       old_reg = prev_reg = copy_rtx (SET_DEST (single_set (u->insn)));
496       last_reg_move = u->insn;
497
498       for (i_reg_move = 0; i_reg_move < nreg_moves; i_reg_move++)
499         {
500           unsigned int i_use = 0;
501           rtx new_reg = gen_reg_rtx (GET_MODE (prev_reg));
502           rtx reg_move = gen_move_insn (new_reg, prev_reg);
503           sbitmap_iterator sbi;
504
505           add_insn_before (reg_move, last_reg_move);
506           last_reg_move = reg_move;
507
508           if (!SCHED_FIRST_REG_MOVE (u))
509             SCHED_FIRST_REG_MOVE (u) = reg_move;
510
511           EXECUTE_IF_SET_IN_SBITMAP (uses_of_defs[i_reg_move], 0, i_use, sbi)
512             {
513               struct undo_replace_buff_elem *rep;
514
515               rep = (struct undo_replace_buff_elem *)
516                     xcalloc (1, sizeof (struct undo_replace_buff_elem));
517               rep->insn = g->nodes[i_use].insn;
518               rep->orig_reg = old_reg;
519               rep->new_reg = new_reg;
520
521               if (! reg_move_replaces)
522                 reg_move_replaces = rep;
523               else
524                 {
525                   rep->next = reg_move_replaces;
526                   reg_move_replaces = rep;
527                 }
528
529               replace_rtx (g->nodes[i_use].insn, old_reg, new_reg);
530             }
531
532           prev_reg = new_reg;
533         }
534       sbitmap_vector_free (uses_of_defs);
535     }
536   return reg_move_replaces;
537 }
538
539 /* We call this when we want to undo the SMS schedule for a given loop.
540    One of the things that we do is to delete the register moves generated
541    for the sake of SMS; this function deletes the register move instructions
542    recorded in the undo buffer.  */
543 static void
544 undo_generate_reg_moves (partial_schedule_ptr ps,
545                          struct undo_replace_buff_elem *reg_move_replaces)
546 {
547   int i,j;
548
549   for (i = 0; i < ps->g->num_nodes; i++)
550     {
551       ddg_node_ptr u = &ps->g->nodes[i];
552       rtx prev;
553       rtx crr = SCHED_FIRST_REG_MOVE (u);
554
555       for (j = 0; j < SCHED_NREG_MOVES (u); j++)
556         {
557           prev = PREV_INSN (crr);
558           delete_insn (crr);
559           crr = prev;
560         }
561       SCHED_FIRST_REG_MOVE (u) = NULL_RTX;
562     }
563
564   while (reg_move_replaces)
565     {
566       struct undo_replace_buff_elem *rep = reg_move_replaces;
567
568       reg_move_replaces = reg_move_replaces->next;
569       replace_rtx (rep->insn, rep->new_reg, rep->orig_reg);
570     }
571 }
572
573 /* Free memory allocated for the undo buffer.  */
574 static void
575 free_undo_replace_buff (struct undo_replace_buff_elem *reg_move_replaces)
576 {
577
578   while (reg_move_replaces)
579     {
580       struct undo_replace_buff_elem *rep = reg_move_replaces;
581
582       reg_move_replaces = reg_move_replaces->next;
583       free (rep);
584     }
585 }
586
587 /* Bump the SCHED_TIMEs of all nodes to start from zero.  Set the values
588    of SCHED_ROW and SCHED_STAGE.  */
589 static void
590 normalize_sched_times (partial_schedule_ptr ps)
591 {
592   int i;
593   ddg_ptr g = ps->g;
594   int amount = PS_MIN_CYCLE (ps);
595   int ii = ps->ii;
596
597   /* Don't include the closing branch assuming that it is the last node.  */
598   for (i = 0; i < g->num_nodes - 1; i++)
599     {
600       ddg_node_ptr u = &g->nodes[i];
601       int normalized_time = SCHED_TIME (u) - amount;
602
603       gcc_assert (normalized_time >= 0);
604
605       SCHED_TIME (u) = normalized_time;
606       SCHED_ROW (u) = normalized_time % ii;
607       SCHED_STAGE (u) = normalized_time / ii;
608     }
609 }
610
611 /* Set SCHED_COLUMN of each node according to its position in PS.  */
612 static void
613 set_columns_for_ps (partial_schedule_ptr ps)
614 {
615   int row;
616
617   for (row = 0; row < ps->ii; row++)
618     {
619       ps_insn_ptr cur_insn = ps->rows[row];
620       int column = 0;
621
622       for (; cur_insn; cur_insn = cur_insn->next_in_row)
623         SCHED_COLUMN (cur_insn->node) = column++;
624     }
625 }
626
627 /* Permute the insns according to their order in PS, from row 0 to
628    row ii-1, and position them right before LAST.  This schedules
629    the insns of the loop kernel.  */
630 static void
631 permute_partial_schedule (partial_schedule_ptr ps, rtx last)
632 {
633   int ii = ps->ii;
634   int row;
635   ps_insn_ptr ps_ij;
636
637   for (row = 0; row < ii ; row++)
638     for (ps_ij = ps->rows[row]; ps_ij; ps_ij = ps_ij->next_in_row)
639       if (PREV_INSN (last) != ps_ij->node->insn)
640         reorder_insns_nobb (ps_ij->node->first_note, ps_ij->node->insn,
641                             PREV_INSN (last));
642 }
643
644 /* As part of undoing SMS we return to the original ordering of the
645    instructions inside the loop kernel.  Given the partial schedule PS, this
646    function returns the ordering of the instruction according to their CUID
647    in the DDG (PS->G), which is the original order of the instruction before
648    performing SMS.  */
649 static void
650 undo_permute_partial_schedule (partial_schedule_ptr ps, rtx last)
651 {
652   int i;
653
654   for (i = 0 ; i < ps->g->num_nodes; i++)
655     if (last == ps->g->nodes[i].insn
656         || last == ps->g->nodes[i].first_note)
657       break;
658     else if (PREV_INSN (last) != ps->g->nodes[i].insn)
659       reorder_insns_nobb (ps->g->nodes[i].first_note, ps->g->nodes[i].insn,
660                           PREV_INSN (last));
661 }
662
663 /* Used to generate the prologue & epilogue.  Duplicate the subset of
664    nodes whose stages are between FROM_STAGE and TO_STAGE (inclusive
665    of both), together with a prefix/suffix of their reg_moves.  */
666 static void
667 duplicate_insns_of_cycles (partial_schedule_ptr ps, int from_stage,
668                            int to_stage, int for_prolog)
669 {
670   int row;
671   ps_insn_ptr ps_ij;
672
673   for (row = 0; row < ps->ii; row++)
674     for (ps_ij = ps->rows[row]; ps_ij; ps_ij = ps_ij->next_in_row)
675       {
676         ddg_node_ptr u_node = ps_ij->node;
677         int j, i_reg_moves;
678         rtx reg_move = NULL_RTX;
679
680         if (for_prolog)
681           {
682             /* SCHED_STAGE (u_node) >= from_stage == 0.  Generate increasing
683                number of reg_moves starting with the second occurrence of
684                u_node, which is generated if its SCHED_STAGE <= to_stage.  */
685             i_reg_moves = to_stage - SCHED_STAGE (u_node) + 1;
686             i_reg_moves = MAX (i_reg_moves, 0);
687             i_reg_moves = MIN (i_reg_moves, SCHED_NREG_MOVES (u_node));
688
689             /* The reg_moves start from the *first* reg_move backwards.  */
690             if (i_reg_moves)
691               {
692                 reg_move = SCHED_FIRST_REG_MOVE (u_node);
693                 for (j = 1; j < i_reg_moves; j++)
694                   reg_move = PREV_INSN (reg_move);
695               }
696           }
697         else /* It's for the epilog.  */
698           {
699             /* SCHED_STAGE (u_node) <= to_stage.  Generate all reg_moves,
700                starting to decrease one stage after u_node no longer occurs;
701                that is, generate all reg_moves until
702                SCHED_STAGE (u_node) == from_stage - 1.  */
703             i_reg_moves = SCHED_NREG_MOVES (u_node)
704                        - (from_stage - SCHED_STAGE (u_node) - 1);
705             i_reg_moves = MAX (i_reg_moves, 0);
706             i_reg_moves = MIN (i_reg_moves, SCHED_NREG_MOVES (u_node));
707
708             /* The reg_moves start from the *last* reg_move forwards.  */
709             if (i_reg_moves)
710               {
711                 reg_move = SCHED_FIRST_REG_MOVE (u_node);
712                 for (j = 1; j < SCHED_NREG_MOVES (u_node); j++)
713                   reg_move = PREV_INSN (reg_move);
714               }
715           }
716
717         for (j = 0; j < i_reg_moves; j++, reg_move = NEXT_INSN (reg_move))
718           emit_insn (copy_rtx (PATTERN (reg_move)));
719         if (SCHED_STAGE (u_node) >= from_stage
720             && SCHED_STAGE (u_node) <= to_stage)
721           duplicate_insn_chain (u_node->first_note, u_node->insn);
722       }
723 }
724
725
726 /* Generate the instructions (including reg_moves) for prolog & epilog.  */
727 static void
728 generate_prolog_epilog (partial_schedule_ptr ps, struct loop * loop, rtx count_reg)
729 {
730   int i;
731   int last_stage = PS_STAGE_COUNT (ps) - 1;
732   edge e;
733
734   /* Generate the prolog, inserting its insns on the loop-entry edge.  */
735   start_sequence ();
736
737   if (count_reg)
738    /* Generate a subtract instruction at the beginning of the prolog to
739       adjust the loop count by STAGE_COUNT.  */
740    emit_insn (gen_sub2_insn (count_reg, GEN_INT (last_stage)));
741
742   for (i = 0; i < last_stage; i++)
743     duplicate_insns_of_cycles (ps, 0, i, 1);
744
745   /* Put the prolog on the entry edge.  */
746   e = loop_preheader_edge (loop);
747   split_edge_and_insert (e, get_insns());
748
749   end_sequence ();
750
751   /* Generate the epilog, inserting its insns on the loop-exit edge.  */
752   start_sequence ();
753
754   for (i = 0; i < last_stage; i++)
755     duplicate_insns_of_cycles (ps, i + 1, last_stage, 0);
756
757   /* Put the epilogue on the exit edge.  */
758   gcc_assert (single_exit (loop));
759   e = single_exit (loop);
760   split_edge_and_insert (e, get_insns());
761   end_sequence ();
762 }
763
764 /* Return true if all the BBs of the loop are empty except the
765    loop header.  */
766 static bool
767 loop_single_full_bb_p (struct loop *loop)
768 {
769   unsigned i;
770   basic_block *bbs = get_loop_body (loop);
771
772   for (i = 0; i < loop->num_nodes ; i++)
773     {
774       rtx head, tail;
775       bool empty_bb = true;
776
777       if (bbs[i] == loop->header)
778         continue;
779
780       /* Make sure that basic blocks other than the header
781          have only notes labels or jumps.  */
782       get_ebb_head_tail (bbs[i], bbs[i], &head, &tail);
783       for (; head != NEXT_INSN (tail); head = NEXT_INSN (head))
784         {
785           if (NOTE_P (head) || LABEL_P (head)
786               || (INSN_P (head) && JUMP_P (head)))
787             continue;
788           empty_bb = false;
789           break;
790         }
791
792       if (! empty_bb)
793         {
794           free (bbs);
795           return false;
796         }
797     }
798   free (bbs);
799   return true;
800 }
801
802 /* A simple loop from SMS point of view; it is a loop that is composed of
803    either a single basic block or two BBs - a header and a latch.  */
804 #define SIMPLE_SMS_LOOP_P(loop) ((loop->num_nodes < 3 )                     \
805                                   && (EDGE_COUNT (loop->latch->preds) == 1) \
806                                   && (EDGE_COUNT (loop->latch->succs) == 1))
807
808 /* Return true if the loop is in its canonical form and false if not.
809    i.e. SIMPLE_SMS_LOOP_P and have one preheader block, and single exit.  */
810 static bool
811 loop_canon_p (struct loop *loop)
812 {
813
814   if (loop->inner || ! loop->outer)
815     return false;
816
817   if (!single_exit (loop))
818     {
819       if (dump_file)
820         {
821           rtx insn = BB_END (loop->header);
822  
823           fprintf (dump_file, "SMS loop many exits ");
824                   fprintf (dump_file, " %s %d (file, line)\n",
825                            insn_file (insn), insn_line (insn));
826         }
827       return false;
828     }
829
830   if (! SIMPLE_SMS_LOOP_P (loop) && ! loop_single_full_bb_p (loop))
831     {
832       if (dump_file)
833         {
834           rtx insn = BB_END (loop->header);
835  
836           fprintf (dump_file, "SMS loop many BBs. ");
837           fprintf (dump_file, " %s %d (file, line)\n",
838                    insn_file (insn), insn_line (insn));
839         }
840       return false;
841     }
842
843     return true;
844 }
845
846 /* If there are more than one entry for the loop,
847    make it one by splitting the first entry edge and
848    redirecting the others to the new BB.  */
849 static void
850 canon_loop (struct loop *loop)
851 {
852   edge e;
853   edge_iterator i;
854
855   /* Avoid annoying special cases of edges going to exit
856      block.  */
857   FOR_EACH_EDGE (e, i, EXIT_BLOCK_PTR->preds)
858     if ((e->flags & EDGE_FALLTHRU) && (EDGE_COUNT (e->src->succs) > 1))
859       split_edge (e);
860
861   if (loop->latch == loop->header
862       || EDGE_COUNT (loop->latch->succs) > 1)
863     {
864       FOR_EACH_EDGE (e, i, loop->header->preds)
865         if (e->src == loop->latch)
866           break;
867       split_edge (e);
868     }
869 }
870
871 /* Main entry point, perform SMS scheduling on the loops of the function
872    that consist of single basic blocks.  */
873 static void
874 sms_schedule (void)
875 {
876   static int passes = 0;
877   rtx insn;
878   ddg_ptr *g_arr, g;
879   int * node_order;
880   int maxii;
881   loop_iterator li;
882   partial_schedule_ptr ps;
883   struct df *df;
884   basic_block bb = NULL;
885   struct loop *loop, *nloop;
886   basic_block condition_bb = NULL;
887   edge latch_edge;
888   gcov_type trip_count = 0;
889
890   loop_optimizer_init (LOOPS_HAVE_PREHEADERS
891                        | LOOPS_HAVE_MARKED_SINGLE_EXITS);
892   if (!current_loops)
893     return;  /* There are no loops to schedule.  */
894
895   /* Initialize issue_rate.  */
896   if (targetm.sched.issue_rate)
897     {
898       int temp = reload_completed;
899
900       reload_completed = 1;
901       issue_rate = targetm.sched.issue_rate ();
902       reload_completed = temp;
903     }
904   else
905     issue_rate = 1;
906
907   /* Initialize the scheduler.  */
908   current_sched_info = &sms_sched_info;
909   sched_init ();
910
911   /* Init Data Flow analysis, to be used in interloop dep calculation.  */
912   df = df_init (DF_HARD_REGS | DF_EQUIV_NOTES | DF_SUBREGS);
913   df_rd_add_problem (df, 0);
914   df_ru_add_problem (df, 0);
915   df_chain_add_problem (df, DF_DU_CHAIN | DF_UD_CHAIN);
916   df_analyze (df);
917
918   if (dump_file)
919     df_dump (df, dump_file);
920
921   /* Allocate memory to hold the DDG array one entry for each loop.
922      We use loop->num as index into this array.  */
923   g_arr = XCNEWVEC (ddg_ptr, number_of_loops ());
924
925   /* Build DDGs for all the relevant loops and hold them in G_ARR
926      indexed by the loop index.  */
927   FOR_EACH_LOOP (li, loop, 0)
928     {
929       rtx head, tail;
930       rtx count_reg;
931
932       /* For debugging.  */
933       if ((passes++ > MAX_SMS_LOOP_NUMBER) && (MAX_SMS_LOOP_NUMBER != -1))
934         {
935           if (dump_file)
936             fprintf (dump_file, "SMS reached MAX_PASSES... \n");
937
938           break;
939         }
940
941       if (! loop_canon_p (loop))
942         continue;
943
944       if (! loop_single_full_bb_p (loop))
945         continue;
946
947       bb = loop->header;
948
949       get_ebb_head_tail (bb, bb, &head, &tail);
950       latch_edge = loop_latch_edge (loop);
951       gcc_assert (single_exit (loop));
952       if (single_exit (loop)->count)
953         trip_count = latch_edge->count / single_exit (loop)->count;
954
955       /* Perfrom SMS only on loops that their average count is above threshold.  */
956
957       if ( latch_edge->count
958           && (latch_edge->count < single_exit (loop)->count * SMS_LOOP_AVERAGE_COUNT_THRESHOLD))
959         {
960           if (dump_file)
961             {
962               fprintf (dump_file, " %s %d (file, line)\n",
963                        insn_file (tail), insn_line (tail));
964               fprintf (dump_file, "SMS single-bb-loop\n");
965               if (profile_info && flag_branch_probabilities)
966                 {
967                   fprintf (dump_file, "SMS loop-count ");
968                   fprintf (dump_file, HOST_WIDEST_INT_PRINT_DEC,
969                            (HOST_WIDEST_INT) bb->count);
970                   fprintf (dump_file, "\n");
971                   fprintf (dump_file, "SMS trip-count ");
972                   fprintf (dump_file, HOST_WIDEST_INT_PRINT_DEC,
973                            (HOST_WIDEST_INT) trip_count);
974                   fprintf (dump_file, "\n");
975                   fprintf (dump_file, "SMS profile-sum-max ");
976                   fprintf (dump_file, HOST_WIDEST_INT_PRINT_DEC,
977                            (HOST_WIDEST_INT) profile_info->sum_max);
978                   fprintf (dump_file, "\n");
979                 }
980             }
981           continue;
982         }
983
984       /* Make sure this is a doloop.  */
985       if ( !(count_reg = doloop_register_get (tail)))
986         continue;
987
988       /* Don't handle BBs with calls or barriers, or !single_set insns.  */
989       for (insn = head; insn != NEXT_INSN (tail); insn = NEXT_INSN (insn))
990         if (CALL_P (insn)
991             || BARRIER_P (insn)
992             || (INSN_P (insn) && !JUMP_P (insn)
993                 && !single_set (insn) && GET_CODE (PATTERN (insn)) != USE))
994           break;
995
996       if (insn != NEXT_INSN (tail))
997         {
998           if (dump_file)
999             {
1000               if (CALL_P (insn))
1001                 fprintf (dump_file, "SMS loop-with-call\n");
1002               else if (BARRIER_P (insn))
1003                 fprintf (dump_file, "SMS loop-with-barrier\n");
1004               else
1005                 fprintf (dump_file, "SMS loop-with-not-single-set\n");
1006               print_rtl_single (dump_file, insn);
1007             }
1008
1009           continue;
1010         }
1011
1012       if (! (g = create_ddg (bb, df, 0)))
1013         {
1014           if (dump_file)
1015             fprintf (dump_file, "SMS doloop\n");
1016           continue;
1017         }
1018
1019       g_arr[loop->num] = g;
1020     }
1021
1022   /* Release Data Flow analysis data structures.  */
1023   df_finish (df);
1024   df = NULL;
1025
1026   /* We don't want to perform SMS on new loops - created by versioning.  */
1027   FOR_EACH_LOOP (li, loop, LI_ONLY_OLD)
1028     {
1029       rtx head, tail;
1030       rtx count_reg, count_init;
1031       int mii, rec_mii;
1032       unsigned stage_count = 0;
1033       HOST_WIDEST_INT loop_count = 0;
1034
1035       if (! (g = g_arr[loop->num]))
1036         continue;
1037
1038       if (dump_file)
1039         print_ddg (dump_file, g);
1040
1041       get_ebb_head_tail (loop->header, loop->header, &head, &tail);
1042
1043       latch_edge = loop_latch_edge (loop);
1044       gcc_assert (single_exit (loop));
1045       if (single_exit (loop)->count)
1046         trip_count = latch_edge->count / single_exit (loop)->count;
1047
1048       if (dump_file)
1049         {
1050           fprintf (dump_file, " %s %d (file, line)\n",
1051                    insn_file (tail), insn_line (tail));
1052           fprintf (dump_file, "SMS single-bb-loop\n");
1053           if (profile_info && flag_branch_probabilities)
1054             {
1055               fprintf (dump_file, "SMS loop-count ");
1056               fprintf (dump_file, HOST_WIDEST_INT_PRINT_DEC,
1057                        (HOST_WIDEST_INT) bb->count);
1058               fprintf (dump_file, "\n");
1059               fprintf (dump_file, "SMS profile-sum-max ");
1060               fprintf (dump_file, HOST_WIDEST_INT_PRINT_DEC,
1061                        (HOST_WIDEST_INT) profile_info->sum_max);
1062               fprintf (dump_file, "\n");
1063             }
1064           fprintf (dump_file, "SMS doloop\n");
1065           fprintf (dump_file, "SMS built-ddg %d\n", g->num_nodes);
1066           fprintf (dump_file, "SMS num-loads %d\n", g->num_loads);
1067           fprintf (dump_file, "SMS num-stores %d\n", g->num_stores);
1068         }
1069
1070
1071       /* In case of th loop have doloop register it gets special
1072          handling.  */
1073       count_init = NULL_RTX;
1074       if ((count_reg = doloop_register_get (tail)))
1075         {
1076           basic_block pre_header;
1077
1078           pre_header = loop_preheader_edge (loop)->src;
1079           count_init = const_iteration_count (count_reg, pre_header,
1080                                               &loop_count);
1081         }
1082       gcc_assert (count_reg);
1083
1084       if (dump_file && count_init)
1085         {
1086           fprintf (dump_file, "SMS const-doloop ");
1087           fprintf (dump_file, HOST_WIDEST_INT_PRINT_DEC,
1088                      loop_count);
1089           fprintf (dump_file, "\n");
1090         }
1091
1092       node_order = XNEWVEC (int, g->num_nodes);
1093
1094       mii = 1; /* Need to pass some estimate of mii.  */
1095       rec_mii = sms_order_nodes (g, mii, node_order);
1096       mii = MAX (res_MII (g), rec_mii);
1097       maxii = (calculate_maxii (g) * SMS_MAX_II_FACTOR) / 100;
1098
1099       if (dump_file)
1100         fprintf (dump_file, "SMS iis %d %d %d (rec_mii, mii, maxii)\n",
1101                  rec_mii, mii, maxii);
1102
1103       /* After sms_order_nodes and before sms_schedule_by_order, to copy over
1104          ASAP.  */
1105       set_node_sched_params (g);
1106
1107       ps = sms_schedule_by_order (g, mii, maxii, node_order);
1108
1109       if (ps)
1110         stage_count = PS_STAGE_COUNT (ps);
1111
1112       /* Stage count of 1 means that there is no interleaving between
1113          iterations, let the scheduling passes do the job.  */
1114       if (stage_count < 1
1115           || (count_init && (loop_count <= stage_count))
1116           || (flag_branch_probabilities && (trip_count <= stage_count)))
1117         {
1118           if (dump_file)
1119             {
1120               fprintf (dump_file, "SMS failed... \n");
1121               fprintf (dump_file, "SMS sched-failed (stage-count=%d, loop-count=", stage_count);
1122               fprintf (dump_file, HOST_WIDEST_INT_PRINT_DEC, loop_count);
1123               fprintf (dump_file, ", trip-count=");
1124               fprintf (dump_file, HOST_WIDEST_INT_PRINT_DEC, trip_count);
1125               fprintf (dump_file, ")\n");
1126             }
1127           continue;
1128         }
1129       else
1130         {
1131           int orig_cycles = kernel_number_of_cycles (BB_HEAD (g->bb), BB_END (g->bb));
1132           int new_cycles;
1133           struct undo_replace_buff_elem *reg_move_replaces;
1134
1135           if (dump_file)
1136             {
1137               fprintf (dump_file,
1138                        "SMS succeeded %d %d (with ii, sc)\n", ps->ii,
1139                        stage_count);
1140               print_partial_schedule (ps, dump_file);
1141               fprintf (dump_file,
1142                        "SMS Branch (%d) will later be scheduled at cycle %d.\n",
1143                        g->closing_branch->cuid, PS_MIN_CYCLE (ps) - 1);
1144             }
1145
1146           /* Set the stage boundaries.  If the DDG is built with closing_branch_deps,
1147              the closing_branch was scheduled and should appear in the last (ii-1)
1148              row.  Otherwise, we are free to schedule the branch, and we let nodes
1149              that were scheduled at the first PS_MIN_CYCLE cycle appear in the first
1150              row; this should reduce stage_count to minimum.  */
1151           normalize_sched_times (ps);
1152           rotate_partial_schedule (ps, PS_MIN_CYCLE (ps));
1153           set_columns_for_ps (ps);
1154
1155           /* Generate the kernel just to be able to measure its cycles.  */
1156           permute_partial_schedule (ps, g->closing_branch->first_note);
1157           reg_move_replaces = generate_reg_moves (ps);
1158
1159           /* Get the number of cycles the new kernel expect to execute in.  */
1160           new_cycles = kernel_number_of_cycles (BB_HEAD (g->bb), BB_END (g->bb));
1161
1162           /* Get back to the original loop so we can do loop versioning.  */
1163           undo_permute_partial_schedule (ps, g->closing_branch->first_note);
1164           if (reg_move_replaces)
1165             undo_generate_reg_moves (ps, reg_move_replaces);
1166
1167           if ( new_cycles >= orig_cycles)
1168             {
1169               /* SMS is not profitable so undo the permutation and reg move generation
1170                  and return the kernel to its original state.  */
1171               if (dump_file)
1172                 fprintf (dump_file, "Undoing SMS because it is not profitable.\n");
1173
1174             }
1175           else
1176             {
1177               canon_loop (loop);
1178
1179               /* case the BCT count is not known , Do loop-versioning */
1180               if (count_reg && ! count_init)
1181                 {
1182                   rtx comp_rtx = gen_rtx_fmt_ee (GT, VOIDmode, count_reg,
1183                                                  GEN_INT(stage_count));
1184
1185                   nloop = loop_version (loop, comp_rtx, &condition_bb, true);
1186                 }
1187
1188               /* Set new iteration count of loop kernel.  */
1189               if (count_reg && count_init)
1190                 SET_SRC (single_set (count_init)) = GEN_INT (loop_count
1191                                                              - stage_count + 1);
1192
1193               /* Now apply the scheduled kernel to the RTL of the loop.  */
1194               permute_partial_schedule (ps, g->closing_branch->first_note);
1195
1196               /* Mark this loop as software pipelined so the later
1197               scheduling passes doesn't touch it.  */
1198               if (! flag_resched_modulo_sched)
1199                 g->bb->flags |= BB_DISABLE_SCHEDULE;
1200               /* The life-info is not valid any more.  */
1201               g->bb->flags |= BB_DIRTY;
1202
1203               reg_move_replaces = generate_reg_moves (ps);
1204               if (dump_file)
1205                 print_node_sched_params (dump_file, g->num_nodes);
1206               /* Generate prolog and epilog.  */
1207               if (count_reg && !count_init)
1208                 generate_prolog_epilog (ps, loop, count_reg);
1209               else
1210                 generate_prolog_epilog (ps, loop, NULL_RTX);
1211             }
1212           free_undo_replace_buff (reg_move_replaces);
1213         }
1214
1215       free_partial_schedule (ps);
1216       free (node_sched_params);
1217       free (node_order);
1218       free_ddg (g);
1219     }
1220
1221   free (g_arr);
1222
1223   /* Release scheduler data, needed until now because of DFA.  */
1224   sched_finish ();
1225   loop_optimizer_finalize ();
1226 }
1227
1228 /* The SMS scheduling algorithm itself
1229    -----------------------------------
1230    Input: 'O' an ordered list of insns of a loop.
1231    Output: A scheduling of the loop - kernel, prolog, and epilogue.
1232
1233    'Q' is the empty Set
1234    'PS' is the partial schedule; it holds the currently scheduled nodes with
1235         their cycle/slot.
1236    'PSP' previously scheduled predecessors.
1237    'PSS' previously scheduled successors.
1238    't(u)' the cycle where u is scheduled.
1239    'l(u)' is the latency of u.
1240    'd(v,u)' is the dependence distance from v to u.
1241    'ASAP(u)' the earliest time at which u could be scheduled as computed in
1242              the node ordering phase.
1243    'check_hardware_resources_conflicts(u, PS, c)'
1244                              run a trace around cycle/slot through DFA model
1245                              to check resource conflicts involving instruction u
1246                              at cycle c given the partial schedule PS.
1247    'add_to_partial_schedule_at_time(u, PS, c)'
1248                              Add the node/instruction u to the partial schedule
1249                              PS at time c.
1250    'calculate_register_pressure(PS)'
1251                              Given a schedule of instructions, calculate the register
1252                              pressure it implies.  One implementation could be the
1253                              maximum number of overlapping live ranges.
1254    'maxRP' The maximum allowed register pressure, it is usually derived from the number
1255            registers available in the hardware.
1256
1257    1. II = MII.
1258    2. PS = empty list
1259    3. for each node u in O in pre-computed order
1260    4.   if (PSP(u) != Q && PSS(u) == Q) then
1261    5.     Early_start(u) = max ( t(v) + l(v) - d(v,u)*II ) over all every v in PSP(u).
1262    6.     start = Early_start; end = Early_start + II - 1; step = 1
1263    11.  else if (PSP(u) == Q && PSS(u) != Q) then
1264    12.      Late_start(u) = min ( t(v) - l(v) + d(v,u)*II ) over all every v in PSS(u).
1265    13.     start = Late_start; end = Late_start - II + 1; step = -1
1266    14.  else if (PSP(u) != Q && PSS(u) != Q) then
1267    15.     Early_start(u) = max ( t(v) + l(v) - d(v,u)*II ) over all every v in PSP(u).
1268    16.     Late_start(u) = min ( t(v) - l(v) + d(v,u)*II ) over all every v in PSS(u).
1269    17.     start = Early_start;
1270    18.     end = min(Early_start + II - 1 , Late_start);
1271    19.     step = 1
1272    20.     else "if (PSP(u) == Q && PSS(u) == Q)"
1273    21.    start = ASAP(u); end = start + II - 1; step = 1
1274    22.  endif
1275
1276    23.  success = false
1277    24.  for (c = start ; c != end ; c += step)
1278    25.     if check_hardware_resources_conflicts(u, PS, c) then
1279    26.       add_to_partial_schedule_at_time(u, PS, c)
1280    27.       success = true
1281    28.       break
1282    29.     endif
1283    30.  endfor
1284    31.  if (success == false) then
1285    32.    II = II + 1
1286    33.    if (II > maxII) then
1287    34.       finish - failed to schedule
1288    35.   endif
1289    36.    goto 2.
1290    37.  endif
1291    38. endfor
1292    39. if (calculate_register_pressure(PS) > maxRP) then
1293    40.    goto 32.
1294    41. endif
1295    42. compute epilogue & prologue
1296    43. finish - succeeded to schedule
1297 */
1298
1299 /* A limit on the number of cycles that resource conflicts can span.  ??? Should
1300    be provided by DFA, and be dependent on the type of insn scheduled.  Currently
1301    set to 0 to save compile time.  */
1302 #define DFA_HISTORY SMS_DFA_HISTORY
1303
1304 /* Given the partial schedule PS, this function calculates and returns the
1305    cycles in which we can schedule the node with the given index I.
1306    NOTE: Here we do the backtracking in SMS, in some special cases. We have
1307    noticed that there are several cases in which we fail    to SMS the loop
1308    because the sched window of a node is empty    due to tight data-deps. In
1309    such cases we want to unschedule    some of the predecessors/successors
1310    until we get non-empty    scheduling window.  It returns -1 if the
1311    scheduling window is empty and zero otherwise.  */
1312
1313 static int
1314 get_sched_window (partial_schedule_ptr ps, int *nodes_order, int i,
1315                   sbitmap sched_nodes, int ii, int *start_p, int *step_p, int *end_p)
1316 {
1317   int start, step, end;
1318   ddg_edge_ptr e;
1319   int u = nodes_order [i];
1320   ddg_node_ptr u_node = &ps->g->nodes[u];
1321   sbitmap psp = sbitmap_alloc (ps->g->num_nodes);
1322   sbitmap pss = sbitmap_alloc (ps->g->num_nodes);
1323   sbitmap u_node_preds = NODE_PREDECESSORS (u_node);
1324   sbitmap u_node_succs = NODE_SUCCESSORS (u_node);
1325   int psp_not_empty;
1326   int pss_not_empty;
1327
1328   /* 1. compute sched window for u (start, end, step).  */
1329   sbitmap_zero (psp);
1330   sbitmap_zero (pss);
1331   psp_not_empty = sbitmap_a_and_b_cg (psp, u_node_preds, sched_nodes);
1332   pss_not_empty = sbitmap_a_and_b_cg (pss, u_node_succs, sched_nodes);
1333
1334   if (psp_not_empty && !pss_not_empty)
1335     {
1336       int early_start = INT_MIN;
1337
1338       end = INT_MAX;
1339       for (e = u_node->in; e != 0; e = e->next_in)
1340         {
1341           ddg_node_ptr v_node = e->src;
1342           if (TEST_BIT (sched_nodes, v_node->cuid))
1343             {
1344               int node_st = SCHED_TIME (v_node)
1345                             + e->latency - (e->distance * ii);
1346
1347               early_start = MAX (early_start, node_st);
1348
1349               if (e->data_type == MEM_DEP)
1350                 end = MIN (end, SCHED_TIME (v_node) + ii - 1);
1351             }
1352         }
1353       start = early_start;
1354       end = MIN (end, early_start + ii);
1355       step = 1;
1356     }
1357
1358   else if (!psp_not_empty && pss_not_empty)
1359     {
1360       int late_start = INT_MAX;
1361
1362       end = INT_MIN;
1363       for (e = u_node->out; e != 0; e = e->next_out)
1364         {
1365           ddg_node_ptr v_node = e->dest;
1366           if (TEST_BIT (sched_nodes, v_node->cuid))
1367             {
1368               late_start = MIN (late_start,
1369                                 SCHED_TIME (v_node) - e->latency
1370                                 + (e->distance * ii));
1371               if (e->data_type == MEM_DEP)
1372                 end = MAX (end, SCHED_TIME (v_node) - ii + 1);
1373             }
1374         }
1375       start = late_start;
1376       end = MAX (end, late_start - ii);
1377       step = -1;
1378     }
1379
1380   else if (psp_not_empty && pss_not_empty)
1381     {
1382       int early_start = INT_MIN;
1383       int late_start = INT_MAX;
1384
1385       start = INT_MIN;
1386       end = INT_MAX;
1387       for (e = u_node->in; e != 0; e = e->next_in)
1388         {
1389           ddg_node_ptr v_node = e->src;
1390
1391           if (TEST_BIT (sched_nodes, v_node->cuid))
1392             {
1393               early_start = MAX (early_start,
1394                                  SCHED_TIME (v_node) + e->latency
1395                                  - (e->distance * ii));
1396               if (e->data_type == MEM_DEP)
1397                 end = MIN (end, SCHED_TIME (v_node) + ii - 1);
1398             }
1399         }
1400       for (e = u_node->out; e != 0; e = e->next_out)
1401         {
1402           ddg_node_ptr v_node = e->dest;
1403
1404           if (TEST_BIT (sched_nodes, v_node->cuid))
1405             {
1406               late_start = MIN (late_start,
1407                                 SCHED_TIME (v_node) - e->latency
1408                                 + (e->distance * ii));
1409               if (e->data_type == MEM_DEP)
1410                 start = MAX (start, SCHED_TIME (v_node) - ii + 1);
1411             }
1412         }
1413       start = MAX (start, early_start);
1414       end = MIN (end, MIN (early_start + ii, late_start + 1));
1415       step = 1;
1416     }
1417   else /* psp is empty && pss is empty.  */
1418     {
1419       start = SCHED_ASAP (u_node);
1420       end = start + ii;
1421       step = 1;
1422     }
1423
1424   *start_p = start;
1425   *step_p = step;
1426   *end_p = end;
1427   sbitmap_free (psp);
1428   sbitmap_free (pss);
1429
1430   if ((start >= end && step == 1) || (start <= end && step == -1))
1431     return -1;
1432   else
1433     return 0;
1434 }
1435
1436 /* This function implements the scheduling algorithm for SMS according to the
1437    above algorithm.  */
1438 static partial_schedule_ptr
1439 sms_schedule_by_order (ddg_ptr g, int mii, int maxii, int *nodes_order)
1440 {
1441   int ii = mii;
1442   int i, c, success;
1443   int try_again_with_larger_ii = true;
1444   int num_nodes = g->num_nodes;
1445   ddg_edge_ptr e;
1446   int start, end, step; /* Place together into one struct?  */
1447   sbitmap sched_nodes = sbitmap_alloc (num_nodes);
1448   sbitmap must_precede = sbitmap_alloc (num_nodes);
1449   sbitmap must_follow = sbitmap_alloc (num_nodes);
1450   sbitmap tobe_scheduled = sbitmap_alloc (num_nodes);
1451
1452   partial_schedule_ptr ps = create_partial_schedule (ii, g, DFA_HISTORY);
1453
1454   sbitmap_ones (tobe_scheduled);
1455   sbitmap_zero (sched_nodes);
1456
1457   while ((! sbitmap_equal (tobe_scheduled, sched_nodes)
1458          || try_again_with_larger_ii ) && ii < maxii)
1459     {
1460       int j;
1461       bool unscheduled_nodes = false;
1462
1463       if (dump_file)
1464         fprintf(dump_file, "Starting with ii=%d\n", ii);
1465       if (try_again_with_larger_ii)
1466         {
1467           try_again_with_larger_ii = false;
1468           sbitmap_zero (sched_nodes);
1469         }
1470
1471       for (i = 0; i < num_nodes; i++)
1472         {
1473           int u = nodes_order[i];
1474           ddg_node_ptr u_node = &ps->g->nodes[u];
1475           rtx insn = u_node->insn;
1476
1477           if (!INSN_P (insn))
1478             {
1479               RESET_BIT (tobe_scheduled, u);
1480               continue;
1481             }
1482
1483           if (JUMP_P (insn)) /* Closing branch handled later.  */
1484             {
1485               RESET_BIT (tobe_scheduled, u);
1486               continue;
1487             }
1488
1489           if (TEST_BIT (sched_nodes, u))
1490             continue;
1491
1492           /* Try to get non-empty scheduling window.  */
1493           j = i;
1494           while (get_sched_window (ps, nodes_order, i, sched_nodes, ii, &start, &step, &end) < 0
1495                  && j > 0)
1496             {
1497               unscheduled_nodes = true;
1498               if (TEST_BIT (NODE_PREDECESSORS (u_node), nodes_order[j - 1])
1499                   || TEST_BIT (NODE_SUCCESSORS (u_node), nodes_order[j - 1]))
1500                 {
1501                   ps_unschedule_node (ps, &ps->g->nodes[nodes_order[j - 1]]);
1502                   RESET_BIT (sched_nodes, nodes_order [j - 1]);
1503                 }
1504               j--;
1505             }
1506           if (j < 0)
1507             {
1508               /* ??? Try backtracking instead of immediately ii++?  */
1509               ii++;
1510               try_again_with_larger_ii = true;
1511               reset_partial_schedule (ps, ii);
1512               break;
1513             }
1514           /* 2. Try scheduling u in window.  */
1515           if (dump_file)
1516             fprintf(dump_file, "Trying to schedule node %d in (%d .. %d) step %d\n",
1517                     u, start, end, step);
1518
1519           /* use must_follow & must_precede bitmaps to determine order
1520              of nodes within the cycle.  */
1521           sbitmap_zero (must_precede);
1522           sbitmap_zero (must_follow);
1523           for (e = u_node->in; e != 0; e = e->next_in)
1524             if (TEST_BIT (sched_nodes, e->src->cuid)
1525                 && e->latency == (ii * e->distance)
1526                 && start == SCHED_TIME (e->src))
1527              SET_BIT (must_precede, e->src->cuid);
1528
1529           for (e = u_node->out; e != 0; e = e->next_out)
1530             if (TEST_BIT (sched_nodes, e->dest->cuid)
1531                 && e->latency == (ii * e->distance)
1532                 && end == SCHED_TIME (e->dest))
1533              SET_BIT (must_follow, e->dest->cuid);
1534
1535           success = 0;
1536           if ((step > 0 && start < end) ||  (step < 0 && start > end))
1537             for (c = start; c != end; c += step)
1538               {
1539                 ps_insn_ptr psi;
1540
1541                 psi = ps_add_node_check_conflicts (ps, u_node, c,
1542                                                    must_precede,
1543                                                    must_follow);
1544
1545                 if (psi)
1546                   {
1547                     SCHED_TIME (u_node) = c;
1548                     SET_BIT (sched_nodes, u);
1549                     success = 1;
1550                     if (dump_file)
1551                       fprintf(dump_file, "Schedule in %d\n", c);
1552                     break;
1553                   }
1554               }
1555           if (!success)
1556             {
1557               /* ??? Try backtracking instead of immediately ii++?  */
1558               ii++;
1559               try_again_with_larger_ii = true;
1560               reset_partial_schedule (ps, ii);
1561               break;
1562             }
1563           if (unscheduled_nodes)
1564             break;
1565
1566           /* ??? If (success), check register pressure estimates.  */
1567         } /* Continue with next node.  */
1568     } /* While try_again_with_larger_ii.  */
1569
1570   sbitmap_free (sched_nodes);
1571   sbitmap_free (must_precede);
1572   sbitmap_free (must_follow);
1573   sbitmap_free (tobe_scheduled);
1574
1575   if (ii >= maxii)
1576     {
1577       free_partial_schedule (ps);
1578       ps = NULL;
1579     }
1580   return ps;
1581 }
1582
1583 \f
1584 /* This page implements the algorithm for ordering the nodes of a DDG
1585    for modulo scheduling, activated through the
1586    "int sms_order_nodes (ddg_ptr, int mii, int * result)" API.  */
1587
1588 #define ORDER_PARAMS(x) ((struct node_order_params *) (x)->aux.info)
1589 #define ASAP(x) (ORDER_PARAMS ((x))->asap)
1590 #define ALAP(x) (ORDER_PARAMS ((x))->alap)
1591 #define HEIGHT(x) (ORDER_PARAMS ((x))->height)
1592 #define MOB(x) (ALAP ((x)) - ASAP ((x)))
1593 #define DEPTH(x) (ASAP ((x)))
1594
1595 typedef struct node_order_params * nopa;
1596
1597 static void order_nodes_of_sccs (ddg_all_sccs_ptr, int * result);
1598 static int order_nodes_in_scc (ddg_ptr, sbitmap, sbitmap, int*, int);
1599 static nopa  calculate_order_params (ddg_ptr, int mii);
1600 static int find_max_asap (ddg_ptr, sbitmap);
1601 static int find_max_hv_min_mob (ddg_ptr, sbitmap);
1602 static int find_max_dv_min_mob (ddg_ptr, sbitmap);
1603
1604 enum sms_direction {BOTTOMUP, TOPDOWN};
1605
1606 struct node_order_params
1607 {
1608   int asap;
1609   int alap;
1610   int height;
1611 };
1612
1613 /* Check if NODE_ORDER contains a permutation of 0 .. NUM_NODES-1.  */
1614 static void
1615 check_nodes_order (int *node_order, int num_nodes)
1616 {
1617   int i;
1618   sbitmap tmp = sbitmap_alloc (num_nodes);
1619
1620   sbitmap_zero (tmp);
1621
1622   for (i = 0; i < num_nodes; i++)
1623     {
1624       int u = node_order[i];
1625
1626       gcc_assert (u < num_nodes && u >= 0 && !TEST_BIT (tmp, u));
1627
1628       SET_BIT (tmp, u);
1629     }
1630
1631   sbitmap_free (tmp);
1632 }
1633
1634 /* Order the nodes of G for scheduling and pass the result in
1635    NODE_ORDER.  Also set aux.count of each node to ASAP.
1636    Return the recMII for the given DDG.  */
1637 static int
1638 sms_order_nodes (ddg_ptr g, int mii, int * node_order)
1639 {
1640   int i;
1641   int rec_mii = 0;
1642   ddg_all_sccs_ptr sccs = create_ddg_all_sccs (g);
1643
1644   nopa nops = calculate_order_params (g, mii);
1645
1646   order_nodes_of_sccs (sccs, node_order);
1647
1648   if (sccs->num_sccs > 0)
1649     /* First SCC has the largest recurrence_length.  */
1650     rec_mii = sccs->sccs[0]->recurrence_length;
1651
1652   /* Save ASAP before destroying node_order_params.  */
1653   for (i = 0; i < g->num_nodes; i++)
1654     {
1655       ddg_node_ptr v = &g->nodes[i];
1656       v->aux.count = ASAP (v);
1657     }
1658
1659   free (nops);
1660   free_ddg_all_sccs (sccs);
1661   check_nodes_order (node_order, g->num_nodes);
1662
1663   return rec_mii;
1664 }
1665
1666 static void
1667 order_nodes_of_sccs (ddg_all_sccs_ptr all_sccs, int * node_order)
1668 {
1669   int i, pos = 0;
1670   ddg_ptr g = all_sccs->ddg;
1671   int num_nodes = g->num_nodes;
1672   sbitmap prev_sccs = sbitmap_alloc (num_nodes);
1673   sbitmap on_path = sbitmap_alloc (num_nodes);
1674   sbitmap tmp = sbitmap_alloc (num_nodes);
1675   sbitmap ones = sbitmap_alloc (num_nodes);
1676
1677   sbitmap_zero (prev_sccs);
1678   sbitmap_ones (ones);
1679
1680   /* Perfrom the node ordering starting from the SCC with the highest recMII.
1681      For each SCC order the nodes according to their ASAP/ALAP/HEIGHT etc.  */
1682   for (i = 0; i < all_sccs->num_sccs; i++)
1683     {
1684       ddg_scc_ptr scc = all_sccs->sccs[i];
1685
1686       /* Add nodes on paths from previous SCCs to the current SCC.  */
1687       find_nodes_on_paths (on_path, g, prev_sccs, scc->nodes);
1688       sbitmap_a_or_b (tmp, scc->nodes, on_path);
1689
1690       /* Add nodes on paths from the current SCC to previous SCCs.  */
1691       find_nodes_on_paths (on_path, g, scc->nodes, prev_sccs);
1692       sbitmap_a_or_b (tmp, tmp, on_path);
1693
1694       /* Remove nodes of previous SCCs from current extended SCC.  */
1695       sbitmap_difference (tmp, tmp, prev_sccs);
1696
1697       pos = order_nodes_in_scc (g, prev_sccs, tmp, node_order, pos);
1698       /* Above call to order_nodes_in_scc updated prev_sccs |= tmp.  */
1699     }
1700
1701   /* Handle the remaining nodes that do not belong to any scc.  Each call
1702      to order_nodes_in_scc handles a single connected component.  */
1703   while (pos < g->num_nodes)
1704     {
1705       sbitmap_difference (tmp, ones, prev_sccs);
1706       pos = order_nodes_in_scc (g, prev_sccs, tmp, node_order, pos);
1707     }
1708   sbitmap_free (prev_sccs);
1709   sbitmap_free (on_path);
1710   sbitmap_free (tmp);
1711   sbitmap_free (ones);
1712 }
1713
1714 /* MII is needed if we consider backarcs (that do not close recursive cycles).  */
1715 static struct node_order_params *
1716 calculate_order_params (ddg_ptr g, int mii ATTRIBUTE_UNUSED)
1717 {
1718   int u;
1719   int max_asap;
1720   int num_nodes = g->num_nodes;
1721   ddg_edge_ptr e;
1722   /* Allocate a place to hold ordering params for each node in the DDG.  */
1723   nopa node_order_params_arr;
1724
1725   /* Initialize of ASAP/ALAP/HEIGHT to zero.  */
1726   node_order_params_arr = (nopa) xcalloc (num_nodes,
1727                                           sizeof (struct node_order_params));
1728
1729   /* Set the aux pointer of each node to point to its order_params structure.  */
1730   for (u = 0; u < num_nodes; u++)
1731     g->nodes[u].aux.info = &node_order_params_arr[u];
1732
1733   /* Disregarding a backarc from each recursive cycle to obtain a DAG,
1734      calculate ASAP, ALAP, mobility, distance, and height for each node
1735      in the dependence (direct acyclic) graph.  */
1736
1737   /* We assume that the nodes in the array are in topological order.  */
1738
1739   max_asap = 0;
1740   for (u = 0; u < num_nodes; u++)
1741     {
1742       ddg_node_ptr u_node = &g->nodes[u];
1743
1744       ASAP (u_node) = 0;
1745       for (e = u_node->in; e; e = e->next_in)
1746         if (e->distance == 0)
1747           ASAP (u_node) = MAX (ASAP (u_node),
1748                                ASAP (e->src) + e->latency);
1749       max_asap = MAX (max_asap, ASAP (u_node));
1750     }
1751
1752   for (u = num_nodes - 1; u > -1; u--)
1753     {
1754       ddg_node_ptr u_node = &g->nodes[u];
1755
1756       ALAP (u_node) = max_asap;
1757       HEIGHT (u_node) = 0;
1758       for (e = u_node->out; e; e = e->next_out)
1759         if (e->distance == 0)
1760           {
1761             ALAP (u_node) = MIN (ALAP (u_node),
1762                                  ALAP (e->dest) - e->latency);
1763             HEIGHT (u_node) = MAX (HEIGHT (u_node),
1764                                    HEIGHT (e->dest) + e->latency);
1765           }
1766     }
1767
1768   return node_order_params_arr;
1769 }
1770
1771 static int
1772 find_max_asap (ddg_ptr g, sbitmap nodes)
1773 {
1774   unsigned int u = 0;
1775   int max_asap = -1;
1776   int result = -1;
1777   sbitmap_iterator sbi;
1778
1779   EXECUTE_IF_SET_IN_SBITMAP (nodes, 0, u, sbi)
1780     {
1781       ddg_node_ptr u_node = &g->nodes[u];
1782
1783       if (max_asap < ASAP (u_node))
1784         {
1785           max_asap = ASAP (u_node);
1786           result = u;
1787         }
1788     }
1789   return result;
1790 }
1791
1792 static int
1793 find_max_hv_min_mob (ddg_ptr g, sbitmap nodes)
1794 {
1795   unsigned int u = 0;
1796   int max_hv = -1;
1797   int min_mob = INT_MAX;
1798   int result = -1;
1799   sbitmap_iterator sbi;
1800
1801   EXECUTE_IF_SET_IN_SBITMAP (nodes, 0, u, sbi)
1802     {
1803       ddg_node_ptr u_node = &g->nodes[u];
1804
1805       if (max_hv < HEIGHT (u_node))
1806         {
1807           max_hv = HEIGHT (u_node);
1808           min_mob = MOB (u_node);
1809           result = u;
1810         }
1811       else if ((max_hv == HEIGHT (u_node))
1812                && (min_mob > MOB (u_node)))
1813         {
1814           min_mob = MOB (u_node);
1815           result = u;
1816         }
1817     }
1818   return result;
1819 }
1820
1821 static int
1822 find_max_dv_min_mob (ddg_ptr g, sbitmap nodes)
1823 {
1824   unsigned int u = 0;
1825   int max_dv = -1;
1826   int min_mob = INT_MAX;
1827   int result = -1;
1828   sbitmap_iterator sbi;
1829
1830   EXECUTE_IF_SET_IN_SBITMAP (nodes, 0, u, sbi)
1831     {
1832       ddg_node_ptr u_node = &g->nodes[u];
1833
1834       if (max_dv < DEPTH (u_node))
1835         {
1836           max_dv = DEPTH (u_node);
1837           min_mob = MOB (u_node);
1838           result = u;
1839         }
1840       else if ((max_dv == DEPTH (u_node))
1841                && (min_mob > MOB (u_node)))
1842         {
1843           min_mob = MOB (u_node);
1844           result = u;
1845         }
1846     }
1847   return result;
1848 }
1849
1850 /* Places the nodes of SCC into the NODE_ORDER array starting
1851    at position POS, according to the SMS ordering algorithm.
1852    NODES_ORDERED (in&out parameter) holds the bitset of all nodes in
1853    the NODE_ORDER array, starting from position zero.  */
1854 static int
1855 order_nodes_in_scc (ddg_ptr g, sbitmap nodes_ordered, sbitmap scc,
1856                     int * node_order, int pos)
1857 {
1858   enum sms_direction dir;
1859   int num_nodes = g->num_nodes;
1860   sbitmap workset = sbitmap_alloc (num_nodes);
1861   sbitmap tmp = sbitmap_alloc (num_nodes);
1862   sbitmap zero_bitmap = sbitmap_alloc (num_nodes);
1863   sbitmap predecessors = sbitmap_alloc (num_nodes);
1864   sbitmap successors = sbitmap_alloc (num_nodes);
1865
1866   sbitmap_zero (predecessors);
1867   find_predecessors (predecessors, g, nodes_ordered);
1868
1869   sbitmap_zero (successors);
1870   find_successors (successors, g, nodes_ordered);
1871
1872   sbitmap_zero (tmp);
1873   if (sbitmap_a_and_b_cg (tmp, predecessors, scc))
1874     {
1875       sbitmap_copy (workset, tmp);
1876       dir = BOTTOMUP;
1877     }
1878   else if (sbitmap_a_and_b_cg (tmp, successors, scc))
1879     {
1880       sbitmap_copy (workset, tmp);
1881       dir = TOPDOWN;
1882     }
1883   else
1884     {
1885       int u;
1886
1887       sbitmap_zero (workset);
1888       if ((u = find_max_asap (g, scc)) >= 0)
1889         SET_BIT (workset, u);
1890       dir = BOTTOMUP;
1891     }
1892
1893   sbitmap_zero (zero_bitmap);
1894   while (!sbitmap_equal (workset, zero_bitmap))
1895     {
1896       int v;
1897       ddg_node_ptr v_node;
1898       sbitmap v_node_preds;
1899       sbitmap v_node_succs;
1900
1901       if (dir == TOPDOWN)
1902         {
1903           while (!sbitmap_equal (workset, zero_bitmap))
1904             {
1905               v = find_max_hv_min_mob (g, workset);
1906               v_node = &g->nodes[v];
1907               node_order[pos++] = v;
1908               v_node_succs = NODE_SUCCESSORS (v_node);
1909               sbitmap_a_and_b (tmp, v_node_succs, scc);
1910
1911               /* Don't consider the already ordered successors again.  */
1912               sbitmap_difference (tmp, tmp, nodes_ordered);
1913               sbitmap_a_or_b (workset, workset, tmp);
1914               RESET_BIT (workset, v);
1915               SET_BIT (nodes_ordered, v);
1916             }
1917           dir = BOTTOMUP;
1918           sbitmap_zero (predecessors);
1919           find_predecessors (predecessors, g, nodes_ordered);
1920           sbitmap_a_and_b (workset, predecessors, scc);
1921         }
1922       else
1923         {
1924           while (!sbitmap_equal (workset, zero_bitmap))
1925             {
1926               v = find_max_dv_min_mob (g, workset);
1927               v_node = &g->nodes[v];
1928               node_order[pos++] = v;
1929               v_node_preds = NODE_PREDECESSORS (v_node);
1930               sbitmap_a_and_b (tmp, v_node_preds, scc);
1931
1932               /* Don't consider the already ordered predecessors again.  */
1933               sbitmap_difference (tmp, tmp, nodes_ordered);
1934               sbitmap_a_or_b (workset, workset, tmp);
1935               RESET_BIT (workset, v);
1936               SET_BIT (nodes_ordered, v);
1937             }
1938           dir = TOPDOWN;
1939           sbitmap_zero (successors);
1940           find_successors (successors, g, nodes_ordered);
1941           sbitmap_a_and_b (workset, successors, scc);
1942         }
1943     }
1944   sbitmap_free (tmp);
1945   sbitmap_free (workset);
1946   sbitmap_free (zero_bitmap);
1947   sbitmap_free (predecessors);
1948   sbitmap_free (successors);
1949   return pos;
1950 }
1951
1952 \f
1953 /* This page contains functions for manipulating partial-schedules during
1954    modulo scheduling.  */
1955
1956 /* Create a partial schedule and allocate a memory to hold II rows.  */
1957
1958 static partial_schedule_ptr
1959 create_partial_schedule (int ii, ddg_ptr g, int history)
1960 {
1961   partial_schedule_ptr ps = XNEW (struct partial_schedule);
1962   ps->rows = (ps_insn_ptr *) xcalloc (ii, sizeof (ps_insn_ptr));
1963   ps->ii = ii;
1964   ps->history = history;
1965   ps->min_cycle = INT_MAX;
1966   ps->max_cycle = INT_MIN;
1967   ps->g = g;
1968
1969   return ps;
1970 }
1971
1972 /* Free the PS_INSNs in rows array of the given partial schedule.
1973    ??? Consider caching the PS_INSN's.  */
1974 static void
1975 free_ps_insns (partial_schedule_ptr ps)
1976 {
1977   int i;
1978
1979   for (i = 0; i < ps->ii; i++)
1980     {
1981       while (ps->rows[i])
1982         {
1983           ps_insn_ptr ps_insn = ps->rows[i]->next_in_row;
1984
1985           free (ps->rows[i]);
1986           ps->rows[i] = ps_insn;
1987         }
1988       ps->rows[i] = NULL;
1989     }
1990 }
1991
1992 /* Free all the memory allocated to the partial schedule.  */
1993
1994 static void
1995 free_partial_schedule (partial_schedule_ptr ps)
1996 {
1997   if (!ps)
1998     return;
1999   free_ps_insns (ps);
2000   free (ps->rows);
2001   free (ps);
2002 }
2003
2004 /* Clear the rows array with its PS_INSNs, and create a new one with
2005    NEW_II rows.  */
2006
2007 static void
2008 reset_partial_schedule (partial_schedule_ptr ps, int new_ii)
2009 {
2010   if (!ps)
2011     return;
2012   free_ps_insns (ps);
2013   if (new_ii == ps->ii)
2014     return;
2015   ps->rows = (ps_insn_ptr *) xrealloc (ps->rows, new_ii
2016                                                  * sizeof (ps_insn_ptr));
2017   memset (ps->rows, 0, new_ii * sizeof (ps_insn_ptr));
2018   ps->ii = new_ii;
2019   ps->min_cycle = INT_MAX;
2020   ps->max_cycle = INT_MIN;
2021 }
2022
2023 /* Prints the partial schedule as an ii rows array, for each rows
2024    print the ids of the insns in it.  */
2025 void
2026 print_partial_schedule (partial_schedule_ptr ps, FILE *dump)
2027 {
2028   int i;
2029
2030   for (i = 0; i < ps->ii; i++)
2031     {
2032       ps_insn_ptr ps_i = ps->rows[i];
2033
2034       fprintf (dump, "\n[CYCLE %d ]: ", i);
2035       while (ps_i)
2036         {
2037           fprintf (dump, "%d, ",
2038                    INSN_UID (ps_i->node->insn));
2039           ps_i = ps_i->next_in_row;
2040         }
2041     }
2042 }
2043
2044 /* Creates an object of PS_INSN and initializes it to the given parameters.  */
2045 static ps_insn_ptr
2046 create_ps_insn (ddg_node_ptr node, int rest_count, int cycle)
2047 {
2048   ps_insn_ptr ps_i = XNEW (struct ps_insn);
2049
2050   ps_i->node = node;
2051   ps_i->next_in_row = NULL;
2052   ps_i->prev_in_row = NULL;
2053   ps_i->row_rest_count = rest_count;
2054   ps_i->cycle = cycle;
2055
2056   return ps_i;
2057 }
2058
2059
2060 /* Removes the given PS_INSN from the partial schedule.  Returns false if the
2061    node is not found in the partial schedule, else returns true.  */
2062 static bool
2063 remove_node_from_ps (partial_schedule_ptr ps, ps_insn_ptr ps_i)
2064 {
2065   int row;
2066
2067   if (!ps || !ps_i)
2068     return false;
2069
2070   row = SMODULO (ps_i->cycle, ps->ii);
2071   if (! ps_i->prev_in_row)
2072     {
2073       if (ps_i != ps->rows[row])
2074         return false;
2075
2076       ps->rows[row] = ps_i->next_in_row;
2077       if (ps->rows[row])
2078         ps->rows[row]->prev_in_row = NULL;
2079     }
2080   else
2081     {
2082       ps_i->prev_in_row->next_in_row = ps_i->next_in_row;
2083       if (ps_i->next_in_row)
2084         ps_i->next_in_row->prev_in_row = ps_i->prev_in_row;
2085     }
2086   free (ps_i);
2087   return true;
2088 }
2089
2090 /* Unlike what literature describes for modulo scheduling (which focuses
2091    on VLIW machines) the order of the instructions inside a cycle is
2092    important.  Given the bitmaps MUST_FOLLOW and MUST_PRECEDE we know
2093    where the current instruction should go relative to the already
2094    scheduled instructions in the given cycle.  Go over these
2095    instructions and find the first possible column to put it in.  */
2096 static bool
2097 ps_insn_find_column (partial_schedule_ptr ps, ps_insn_ptr ps_i,
2098                      sbitmap must_precede, sbitmap must_follow)
2099 {
2100   ps_insn_ptr next_ps_i;
2101   ps_insn_ptr first_must_follow = NULL;
2102   ps_insn_ptr last_must_precede = NULL;
2103   int row;
2104
2105   if (! ps_i)
2106     return false;
2107
2108   row = SMODULO (ps_i->cycle, ps->ii);
2109
2110   /* Find the first must follow and the last must precede
2111      and insert the node immediately after the must precede
2112      but make sure that it there is no must follow after it.  */
2113   for (next_ps_i = ps->rows[row];
2114        next_ps_i;
2115        next_ps_i = next_ps_i->next_in_row)
2116     {
2117       if (TEST_BIT (must_follow, next_ps_i->node->cuid)
2118           && ! first_must_follow)
2119         first_must_follow = next_ps_i;
2120       if (TEST_BIT (must_precede, next_ps_i->node->cuid))
2121         {
2122           /* If we have already met a node that must follow, then
2123              there is no possible column.  */
2124           if (first_must_follow)
2125             return false;
2126           else
2127             last_must_precede = next_ps_i;
2128         }
2129     }
2130
2131   /* Now insert the node after INSERT_AFTER_PSI.  */
2132
2133   if (! last_must_precede)
2134     {
2135       ps_i->next_in_row = ps->rows[row];
2136       ps_i->prev_in_row = NULL;
2137       if (ps_i->next_in_row)
2138         ps_i->next_in_row->prev_in_row = ps_i;
2139       ps->rows[row] = ps_i;
2140     }
2141   else
2142     {
2143       ps_i->next_in_row = last_must_precede->next_in_row;
2144       last_must_precede->next_in_row = ps_i;
2145       ps_i->prev_in_row = last_must_precede;
2146       if (ps_i->next_in_row)
2147         ps_i->next_in_row->prev_in_row = ps_i;
2148     }
2149
2150   return true;
2151 }
2152
2153 /* Advances the PS_INSN one column in its current row; returns false
2154    in failure and true in success.  Bit N is set in MUST_FOLLOW if 
2155    the node with cuid N must be come after the node pointed to by 
2156    PS_I when scheduled in the same cycle.  */
2157 static int
2158 ps_insn_advance_column (partial_schedule_ptr ps, ps_insn_ptr ps_i,
2159                         sbitmap must_follow)
2160 {
2161   ps_insn_ptr prev, next;
2162   int row;
2163   ddg_node_ptr next_node;
2164
2165   if (!ps || !ps_i)
2166     return false;
2167
2168   row = SMODULO (ps_i->cycle, ps->ii);
2169
2170   if (! ps_i->next_in_row)
2171     return false;
2172
2173   next_node = ps_i->next_in_row->node;
2174
2175   /* Check if next_in_row is dependent on ps_i, both having same sched
2176      times (typically ANTI_DEP).  If so, ps_i cannot skip over it.  */
2177   if (TEST_BIT (must_follow, next_node->cuid))
2178     return false;
2179
2180   /* Advance PS_I over its next_in_row in the doubly linked list.  */
2181   prev = ps_i->prev_in_row;
2182   next = ps_i->next_in_row;
2183
2184   if (ps_i == ps->rows[row])
2185     ps->rows[row] = next;
2186
2187   ps_i->next_in_row = next->next_in_row;
2188
2189   if (next->next_in_row)
2190     next->next_in_row->prev_in_row = ps_i;
2191
2192   next->next_in_row = ps_i;
2193   ps_i->prev_in_row = next;
2194
2195   next->prev_in_row = prev;
2196   if (prev)
2197     prev->next_in_row = next;
2198
2199   return true;
2200 }
2201
2202 /* Inserts a DDG_NODE to the given partial schedule at the given cycle.
2203    Returns 0 if this is not possible and a PS_INSN otherwise.  Bit N is 
2204    set in MUST_PRECEDE/MUST_FOLLOW if the node with cuid N must be come 
2205    before/after (respectively) the node pointed to by PS_I when scheduled 
2206    in the same cycle.  */
2207 static ps_insn_ptr
2208 add_node_to_ps (partial_schedule_ptr ps, ddg_node_ptr node, int cycle,
2209                 sbitmap must_precede, sbitmap must_follow)
2210 {
2211   ps_insn_ptr ps_i;
2212   int rest_count = 1;
2213   int row = SMODULO (cycle, ps->ii);
2214
2215   if (ps->rows[row]
2216       && ps->rows[row]->row_rest_count >= issue_rate)
2217     return NULL;
2218
2219   if (ps->rows[row])
2220     rest_count += ps->rows[row]->row_rest_count;
2221
2222   ps_i = create_ps_insn (node, rest_count, cycle);
2223
2224   /* Finds and inserts PS_I according to MUST_FOLLOW and
2225      MUST_PRECEDE.  */
2226   if (! ps_insn_find_column (ps, ps_i, must_precede, must_follow))
2227     {
2228       free (ps_i);
2229       return NULL;
2230     }
2231
2232   return ps_i;
2233 }
2234
2235 /* Advance time one cycle.  Assumes DFA is being used.  */
2236 static void
2237 advance_one_cycle (void)
2238 {
2239   if (targetm.sched.dfa_pre_cycle_insn)
2240     state_transition (curr_state,
2241                       targetm.sched.dfa_pre_cycle_insn ());
2242
2243   state_transition (curr_state, NULL);
2244
2245   if (targetm.sched.dfa_post_cycle_insn)
2246     state_transition (curr_state,
2247                       targetm.sched.dfa_post_cycle_insn ());
2248 }
2249
2250 /* Given the kernel of a loop (from FIRST_INSN to LAST_INSN), finds
2251    the number of cycles according to DFA that the kernel fits in,
2252    we use this to check if we done well with SMS after we add
2253    register moves.  In some cases register moves overhead makes
2254    it even worse than the original loop.  We want SMS to be performed
2255    when it gives less cycles after register moves are added.  */
2256 static int
2257 kernel_number_of_cycles (rtx first_insn, rtx last_insn)
2258 {
2259   int cycles = 0;
2260   rtx insn;
2261   int can_issue_more = issue_rate;
2262
2263   state_reset (curr_state);
2264
2265   for (insn = first_insn;
2266        insn != NULL_RTX && insn != last_insn;
2267        insn = NEXT_INSN (insn))
2268     {
2269       if (! INSN_P (insn) || GET_CODE (PATTERN (insn)) == USE)
2270         continue;
2271
2272       /* Check if there is room for the current insn.  */
2273       if (!can_issue_more || state_dead_lock_p (curr_state))
2274         {
2275           cycles ++;
2276           advance_one_cycle ();
2277           can_issue_more = issue_rate;
2278         }
2279
2280         /* Update the DFA state and return with failure if the DFA found
2281            recource conflicts.  */
2282       if (state_transition (curr_state, insn) >= 0)
2283         {
2284           cycles ++;
2285           advance_one_cycle ();
2286           can_issue_more = issue_rate;
2287         }
2288
2289       if (targetm.sched.variable_issue)
2290         can_issue_more =
2291           targetm.sched.variable_issue (sched_dump, sched_verbose,
2292                                         insn, can_issue_more);
2293       /* A naked CLOBBER or USE generates no instruction, so don't
2294          let them consume issue slots.  */
2295       else if (GET_CODE (PATTERN (insn)) != USE
2296                && GET_CODE (PATTERN (insn)) != CLOBBER)
2297         can_issue_more--;
2298     }
2299   return cycles;
2300 }
2301
2302 /* Checks if PS has resource conflicts according to DFA, starting from
2303    FROM cycle to TO cycle; returns true if there are conflicts and false
2304    if there are no conflicts.  Assumes DFA is being used.  */
2305 static int
2306 ps_has_conflicts (partial_schedule_ptr ps, int from, int to)
2307 {
2308   int cycle;
2309
2310   state_reset (curr_state);
2311
2312   for (cycle = from; cycle <= to; cycle++)
2313     {
2314       ps_insn_ptr crr_insn;
2315       /* Holds the remaining issue slots in the current row.  */
2316       int can_issue_more = issue_rate;
2317
2318       /* Walk through the DFA for the current row.  */
2319       for (crr_insn = ps->rows[SMODULO (cycle, ps->ii)];
2320            crr_insn;
2321            crr_insn = crr_insn->next_in_row)
2322         {
2323           rtx insn = crr_insn->node->insn;
2324
2325           if (!INSN_P (insn))
2326             continue;
2327
2328           /* Check if there is room for the current insn.  */
2329           if (!can_issue_more || state_dead_lock_p (curr_state))
2330             return true;
2331
2332           /* Update the DFA state and return with failure if the DFA found
2333              recource conflicts.  */
2334           if (state_transition (curr_state, insn) >= 0)
2335             return true;
2336
2337           if (targetm.sched.variable_issue)
2338             can_issue_more =
2339               targetm.sched.variable_issue (sched_dump, sched_verbose,
2340                                             insn, can_issue_more);
2341           /* A naked CLOBBER or USE generates no instruction, so don't
2342              let them consume issue slots.  */
2343           else if (GET_CODE (PATTERN (insn)) != USE
2344                    && GET_CODE (PATTERN (insn)) != CLOBBER)
2345             can_issue_more--;
2346         }
2347
2348       /* Advance the DFA to the next cycle.  */
2349       advance_one_cycle ();
2350     }
2351   return false;
2352 }
2353
2354 /* Checks if the given node causes resource conflicts when added to PS at
2355    cycle C.  If not the node is added to PS and returned; otherwise zero
2356    is returned.  Bit N is set in MUST_PRECEDE/MUST_FOLLOW if the node with 
2357    cuid N must be come before/after (respectively) the node pointed to by 
2358    PS_I when scheduled in the same cycle.  */
2359 ps_insn_ptr
2360 ps_add_node_check_conflicts (partial_schedule_ptr ps, ddg_node_ptr n,
2361                              int c, sbitmap must_precede,
2362                              sbitmap must_follow)
2363 {
2364   int has_conflicts = 0;
2365   ps_insn_ptr ps_i;
2366
2367   /* First add the node to the PS, if this succeeds check for
2368      conflicts, trying different issue slots in the same row.  */
2369   if (! (ps_i = add_node_to_ps (ps, n, c, must_precede, must_follow)))
2370     return NULL; /* Failed to insert the node at the given cycle.  */
2371
2372   has_conflicts = ps_has_conflicts (ps, c, c)
2373                   || (ps->history > 0
2374                       && ps_has_conflicts (ps,
2375                                            c - ps->history,
2376                                            c + ps->history));
2377
2378   /* Try different issue slots to find one that the given node can be
2379      scheduled in without conflicts.  */
2380   while (has_conflicts)
2381     {
2382       if (! ps_insn_advance_column (ps, ps_i, must_follow))
2383         break;
2384       has_conflicts = ps_has_conflicts (ps, c, c)
2385                       || (ps->history > 0
2386                           && ps_has_conflicts (ps,
2387                                                c - ps->history,
2388                                                c + ps->history));
2389     }
2390
2391   if (has_conflicts)
2392     {
2393       remove_node_from_ps (ps, ps_i);
2394       return NULL;
2395     }
2396
2397   ps->min_cycle = MIN (ps->min_cycle, c);
2398   ps->max_cycle = MAX (ps->max_cycle, c);
2399   return ps_i;
2400 }
2401
2402 /* Rotate the rows of PS such that insns scheduled at time
2403    START_CYCLE will appear in row 0.  Updates max/min_cycles.  */
2404 void
2405 rotate_partial_schedule (partial_schedule_ptr ps, int start_cycle)
2406 {
2407   int i, row, backward_rotates;
2408   int last_row = ps->ii - 1;
2409
2410   if (start_cycle == 0)
2411     return;
2412
2413   backward_rotates = SMODULO (start_cycle, ps->ii);
2414
2415   /* Revisit later and optimize this into a single loop.  */
2416   for (i = 0; i < backward_rotates; i++)
2417     {
2418       ps_insn_ptr first_row = ps->rows[0];
2419
2420       for (row = 0; row < last_row; row++)
2421         ps->rows[row] = ps->rows[row+1];
2422
2423       ps->rows[last_row] = first_row;
2424     }
2425
2426   ps->max_cycle -= start_cycle;
2427   ps->min_cycle -= start_cycle;
2428 }
2429
2430 /* Remove the node N from the partial schedule PS; because we restart the DFA
2431    each time we want to check for resource conflicts; this is equivalent to
2432    unscheduling the node N.  */
2433 static bool
2434 ps_unschedule_node (partial_schedule_ptr ps, ddg_node_ptr n)
2435 {
2436   ps_insn_ptr ps_i;
2437   int row = SMODULO (SCHED_TIME (n), ps->ii);
2438
2439   if (row < 0 || row > ps->ii)
2440     return false;
2441
2442   for (ps_i = ps->rows[row];
2443        ps_i &&  ps_i->node != n;
2444        ps_i = ps_i->next_in_row);
2445   if (!ps_i)
2446     return false;
2447
2448   return remove_node_from_ps (ps, ps_i);
2449 }
2450 #endif /* INSN_SCHEDULING */
2451 \f
2452 static bool
2453 gate_handle_sms (void)
2454 {
2455   return (optimize > 0 && flag_modulo_sched);
2456 }
2457
2458
2459 /* Run instruction scheduler.  */
2460 /* Perform SMS module scheduling.  */
2461 static unsigned int
2462 rest_of_handle_sms (void)
2463 {
2464 #ifdef INSN_SCHEDULING
2465   basic_block bb;
2466
2467   /* We want to be able to create new pseudos.  */
2468   no_new_pseudos = 0;
2469   /* Collect loop information to be used in SMS.  */
2470   cfg_layout_initialize (CLEANUP_UPDATE_LIFE);
2471   sms_schedule ();
2472
2473   /* Update the life information, because we add pseudos.  */
2474   max_regno = max_reg_num ();
2475   allocate_reg_info (max_regno, FALSE, FALSE);
2476   update_life_info (NULL, UPDATE_LIFE_GLOBAL_RM_NOTES,
2477                     (PROP_DEATH_NOTES
2478                      | PROP_REG_INFO
2479                      | PROP_KILL_DEAD_CODE
2480                      | PROP_SCAN_DEAD_CODE));
2481
2482   no_new_pseudos = 1;
2483
2484   /* Finalize layout changes.  */
2485   FOR_EACH_BB (bb)
2486     if (bb->next_bb != EXIT_BLOCK_PTR)
2487       bb->aux = bb->next_bb;
2488   cfg_layout_finalize ();
2489   free_dominance_info (CDI_DOMINATORS);
2490 #endif /* INSN_SCHEDULING */
2491   return 0;
2492 }
2493
2494 struct tree_opt_pass pass_sms =
2495 {
2496   "sms",                                /* name */
2497   gate_handle_sms,                      /* gate */
2498   rest_of_handle_sms,                   /* execute */
2499   NULL,                                 /* sub */
2500   NULL,                                 /* next */
2501   0,                                    /* static_pass_number */
2502   TV_SMS,                               /* tv_id */
2503   0,                                    /* properties_required */
2504   0,                                    /* properties_provided */
2505   0,                                    /* properties_destroyed */
2506   TODO_dump_func,                       /* todo_flags_start */
2507   TODO_dump_func |
2508   TODO_ggc_collect,                     /* todo_flags_finish */
2509   'm'                                   /* letter */
2510 };
2511