OSDN Git Service

* tree-pass.h (pass_purge_lineno_notes): Remove declaration.
[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 one and only entry edge.  */
746   e = loop_preheader_edge (loop);
747   loop_split_edge_with(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 one and only one exit edge.  */
758   gcc_assert (loop->single_exit);
759   e = loop->single_exit;
760   loop_split_edge_with(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 (!loop->single_exit)
818     {
819       if (dump_file)
820         {
821           fprintf (dump_file, "SMS loop many exits ");
822         }
823       return false;
824     }
825
826   if (! SIMPLE_SMS_LOOP_P (loop) && ! loop_single_full_bb_p (loop))
827     {
828       if (dump_file)
829         {
830           fprintf (dump_file, "SMS loop many BBs. ");
831         }
832       return false;
833     }
834
835     return true;
836 }
837
838 /* If there are more than one entry for the loop,
839    make it one by splitting the first entry edge and
840    redirecting the others to the new BB.  */
841 static void
842 canon_loop (struct loop *loop)
843 {
844   edge e;
845   edge_iterator i;
846
847   /* Avoid annoying special cases of edges going to exit
848      block.  */
849   FOR_EACH_EDGE (e, i, EXIT_BLOCK_PTR->preds)
850     if ((e->flags & EDGE_FALLTHRU) && (EDGE_COUNT (e->src->succs) > 1))
851       loop_split_edge_with (e, NULL_RTX);
852
853   if (loop->latch == loop->header
854       || EDGE_COUNT (loop->latch->succs) > 1)
855     {
856       FOR_EACH_EDGE (e, i, loop->header->preds)
857         if (e->src == loop->latch)
858           break;
859       loop_split_edge_with (e, NULL_RTX);
860     }
861 }
862
863 /* Main entry point, perform SMS scheduling on the loops of the function
864    that consist of single basic blocks.  */
865 static void
866 sms_schedule (void)
867 {
868   static int passes = 0;
869   rtx insn;
870   ddg_ptr *g_arr, g;
871   int * node_order;
872   int maxii;
873   unsigned i,num_loops;
874   partial_schedule_ptr ps;
875   struct df *df;
876   struct loops *loops;
877   basic_block bb = NULL;
878   /* vars to the versioning only if needed*/
879   struct loop * nloop;
880   basic_block condition_bb = NULL;
881   edge latch_edge;
882   gcov_type trip_count = 0;
883
884   loops = loop_optimizer_init (LOOPS_HAVE_PREHEADERS
885                                | LOOPS_HAVE_MARKED_SINGLE_EXITS);
886   if (!loops)
887     return;  /* There is no loops to schedule.  */
888
889   /* Initialize issue_rate.  */
890   if (targetm.sched.issue_rate)
891     {
892       int temp = reload_completed;
893
894       reload_completed = 1;
895       issue_rate = targetm.sched.issue_rate ();
896       reload_completed = temp;
897     }
898   else
899     issue_rate = 1;
900
901   /* Initialize the scheduler.  */
902   current_sched_info = &sms_sched_info;
903   sched_init ();
904
905   /* Init Data Flow analysis, to be used in interloop dep calculation.  */
906   df = df_init (DF_HARD_REGS | DF_EQUIV_NOTES | DF_SUBREGS);
907   df_rd_add_problem (df, 0);
908   df_ru_add_problem (df, 0);
909   df_chain_add_problem (df, DF_DU_CHAIN | DF_UD_CHAIN);
910   df_analyze (df);
911
912   if (dump_file)
913     df_dump (df, dump_file);
914
915   /* Allocate memory to hold the DDG array one entry for each loop.
916      We use loop->num as index into this array.  */
917   g_arr = XCNEWVEC (ddg_ptr, loops->num);
918
919
920   /* Build DDGs for all the relevant loops and hold them in G_ARR
921      indexed by the loop index.  */
922   for (i = 0; i < loops->num; i++)
923     {
924       rtx head, tail;
925       rtx count_reg;
926       struct loop *loop = loops->parray[i];
927
928       /* For debugging.  */
929       if ((passes++ > MAX_SMS_LOOP_NUMBER) && (MAX_SMS_LOOP_NUMBER != -1))
930         {
931           if (dump_file)
932             fprintf (dump_file, "SMS reached MAX_PASSES... \n");
933
934           break;
935         }
936
937       if (! loop_canon_p (loop))
938         continue;
939
940       if (! loop_single_full_bb_p (loop))
941         continue;
942
943       bb = loop->header;
944
945       get_ebb_head_tail (bb, bb, &head, &tail);
946       latch_edge = loop_latch_edge (loop);
947       gcc_assert (loop->single_exit);
948       if (loop->single_exit->count)
949         trip_count = latch_edge->count / loop->single_exit->count;
950
951       /* Perfrom SMS only on loops that their average count is above threshold.  */
952
953       if ( latch_edge->count
954           && (latch_edge->count < loop->single_exit->count * SMS_LOOP_AVERAGE_COUNT_THRESHOLD))
955         {
956           if (dump_file)
957             {
958               fprintf (dump_file, "SMS single-bb-loop\n");
959               if (profile_info && flag_branch_probabilities)
960                 {
961                   fprintf (dump_file, "SMS loop-count ");
962                   fprintf (dump_file, HOST_WIDEST_INT_PRINT_DEC,
963                            (HOST_WIDEST_INT) bb->count);
964                   fprintf (dump_file, "\n");
965                   fprintf (dump_file, "SMS trip-count ");
966                   fprintf (dump_file, HOST_WIDEST_INT_PRINT_DEC,
967                            (HOST_WIDEST_INT) trip_count);
968                   fprintf (dump_file, "\n");
969                   fprintf (dump_file, "SMS profile-sum-max ");
970                   fprintf (dump_file, HOST_WIDEST_INT_PRINT_DEC,
971                            (HOST_WIDEST_INT) profile_info->sum_max);
972                   fprintf (dump_file, "\n");
973                 }
974             }
975           continue;
976         }
977
978       /* Make sure this is a doloop.  */
979       if ( !(count_reg = doloop_register_get (tail)))
980         continue;
981
982       /* Don't handle BBs with calls or barriers, or !single_set insns.  */
983       for (insn = head; insn != NEXT_INSN (tail); insn = NEXT_INSN (insn))
984         if (CALL_P (insn)
985             || BARRIER_P (insn)
986             || (INSN_P (insn) && !JUMP_P (insn)
987                 && !single_set (insn) && GET_CODE (PATTERN (insn)) != USE))
988           break;
989
990       if (insn != NEXT_INSN (tail))
991         {
992           if (dump_file)
993             {
994               if (CALL_P (insn))
995                 fprintf (dump_file, "SMS loop-with-call\n");
996               else if (BARRIER_P (insn))
997                 fprintf (dump_file, "SMS loop-with-barrier\n");
998               else
999                 fprintf (dump_file, "SMS loop-with-not-single-set\n");
1000               print_rtl_single (dump_file, insn);
1001             }
1002
1003           continue;
1004         }
1005
1006       if (! (g = create_ddg (bb, df, 0)))
1007         {
1008           if (dump_file)
1009             fprintf (dump_file, "SMS doloop\n");
1010           continue;
1011         }
1012
1013       g_arr[i] = g;
1014     }
1015
1016   /* Release Data Flow analysis data structures.  */
1017   df_finish (df);
1018   df = NULL;
1019
1020   /* We don't want to perform SMS on new loops - created by versioning.  */
1021   num_loops = loops->num;
1022   /* Go over the built DDGs and perfrom SMS for each one of them.  */
1023   for (i = 0; i < num_loops; i++)
1024     {
1025       rtx head, tail;
1026       rtx count_reg, count_init;
1027       int mii, rec_mii;
1028       unsigned stage_count = 0;
1029       HOST_WIDEST_INT loop_count = 0;
1030       struct loop *loop = loops->parray[i];
1031
1032       if (! (g = g_arr[i]))
1033         continue;
1034
1035       if (dump_file)
1036         print_ddg (dump_file, g);
1037
1038       get_ebb_head_tail (loop->header, loop->header, &head, &tail);
1039
1040       latch_edge = loop_latch_edge (loop);
1041       gcc_assert (loop->single_exit);
1042       if (loop->single_exit->count)
1043         trip_count = latch_edge->count / loop->single_exit->count;
1044
1045       if (dump_file)
1046         {
1047           fprintf (dump_file, "SMS single-bb-loop\n");
1048           if (profile_info && flag_branch_probabilities)
1049             {
1050               fprintf (dump_file, "SMS loop-count ");
1051               fprintf (dump_file, HOST_WIDEST_INT_PRINT_DEC,
1052                        (HOST_WIDEST_INT) bb->count);
1053               fprintf (dump_file, "\n");
1054               fprintf (dump_file, "SMS profile-sum-max ");
1055               fprintf (dump_file, HOST_WIDEST_INT_PRINT_DEC,
1056                        (HOST_WIDEST_INT) profile_info->sum_max);
1057               fprintf (dump_file, "\n");
1058             }
1059           fprintf (dump_file, "SMS doloop\n");
1060           fprintf (dump_file, "SMS built-ddg %d\n", g->num_nodes);
1061           fprintf (dump_file, "SMS num-loads %d\n", g->num_loads);
1062           fprintf (dump_file, "SMS num-stores %d\n", g->num_stores);
1063         }
1064
1065
1066       /* In case of th loop have doloop register it gets special
1067          handling.  */
1068       count_init = NULL_RTX;
1069       if ((count_reg = doloop_register_get (tail)))
1070         {
1071           basic_block pre_header;
1072
1073           pre_header = loop_preheader_edge (loop)->src;
1074           count_init = const_iteration_count (count_reg, pre_header,
1075                                               &loop_count);
1076         }
1077       gcc_assert (count_reg);
1078
1079       if (dump_file && count_init)
1080         {
1081           fprintf (dump_file, "SMS const-doloop ");
1082           fprintf (dump_file, HOST_WIDEST_INT_PRINT_DEC,
1083                      loop_count);
1084           fprintf (dump_file, "\n");
1085         }
1086
1087       node_order = XNEWVEC (int, g->num_nodes);
1088
1089       mii = 1; /* Need to pass some estimate of mii.  */
1090       rec_mii = sms_order_nodes (g, mii, node_order);
1091       mii = MAX (res_MII (g), rec_mii);
1092       maxii = (calculate_maxii (g) * SMS_MAX_II_FACTOR) / 100;
1093
1094       if (dump_file)
1095         fprintf (dump_file, "SMS iis %d %d %d (rec_mii, mii, maxii)\n",
1096                  rec_mii, mii, maxii);
1097
1098       /* After sms_order_nodes and before sms_schedule_by_order, to copy over
1099          ASAP.  */
1100       set_node_sched_params (g);
1101
1102       ps = sms_schedule_by_order (g, mii, maxii, node_order);
1103
1104       if (ps)
1105         stage_count = PS_STAGE_COUNT (ps);
1106
1107       /* Stage count of 1 means that there is no interleaving between
1108          iterations, let the scheduling passes do the job.  */
1109       if (stage_count < 1
1110           || (count_init && (loop_count <= stage_count))
1111           || (flag_branch_probabilities && (trip_count <= stage_count)))
1112         {
1113           if (dump_file)
1114             {
1115               fprintf (dump_file, "SMS failed... \n");
1116               fprintf (dump_file, "SMS sched-failed (stage-count=%d, loop-count=", stage_count);
1117               fprintf (dump_file, HOST_WIDEST_INT_PRINT_DEC, loop_count);
1118               fprintf (dump_file, ", trip-count=");
1119               fprintf (dump_file, HOST_WIDEST_INT_PRINT_DEC, trip_count);
1120               fprintf (dump_file, ")\n");
1121             }
1122           continue;
1123         }
1124       else
1125         {
1126           int orig_cycles = kernel_number_of_cycles (BB_HEAD (g->bb), BB_END (g->bb));
1127           int new_cycles;
1128           struct undo_replace_buff_elem *reg_move_replaces;
1129
1130           if (dump_file)
1131             {
1132               fprintf (dump_file,
1133                        "SMS succeeded %d %d (with ii, sc)\n", ps->ii,
1134                        stage_count);
1135               print_partial_schedule (ps, dump_file);
1136               fprintf (dump_file,
1137                        "SMS Branch (%d) will later be scheduled at cycle %d.\n",
1138                        g->closing_branch->cuid, PS_MIN_CYCLE (ps) - 1);
1139             }
1140
1141           /* Set the stage boundaries.  If the DDG is built with closing_branch_deps,
1142              the closing_branch was scheduled and should appear in the last (ii-1)
1143              row.  Otherwise, we are free to schedule the branch, and we let nodes
1144              that were scheduled at the first PS_MIN_CYCLE cycle appear in the first
1145              row; this should reduce stage_count to minimum.  */
1146           normalize_sched_times (ps);
1147           rotate_partial_schedule (ps, PS_MIN_CYCLE (ps));
1148           set_columns_for_ps (ps);
1149
1150           /* Generate the kernel just to be able to measure its cycles.  */
1151           permute_partial_schedule (ps, g->closing_branch->first_note);
1152           reg_move_replaces = generate_reg_moves (ps);
1153
1154           /* Get the number of cycles the new kernel expect to execute in.  */
1155           new_cycles = kernel_number_of_cycles (BB_HEAD (g->bb), BB_END (g->bb));
1156
1157           /* Get back to the original loop so we can do loop versioning.  */
1158           undo_permute_partial_schedule (ps, g->closing_branch->first_note);
1159           if (reg_move_replaces)
1160             undo_generate_reg_moves (ps, reg_move_replaces);
1161
1162           if ( new_cycles >= orig_cycles)
1163             {
1164               /* SMS is not profitable so undo the permutation and reg move generation
1165                  and return the kernel to its original state.  */
1166               if (dump_file)
1167                 fprintf (dump_file, "Undoing SMS because it is not profitable.\n");
1168
1169             }
1170           else
1171             {
1172               canon_loop (loop);
1173
1174               /* case the BCT count is not known , Do loop-versioning */
1175               if (count_reg && ! count_init)
1176                 {
1177                   rtx comp_rtx = gen_rtx_fmt_ee (GT, VOIDmode, count_reg,
1178                                                  GEN_INT(stage_count));
1179
1180                   nloop = loop_version (loops, loop, comp_rtx, &condition_bb,
1181                                         true);
1182                 }
1183
1184               /* Set new iteration count of loop kernel.  */
1185               if (count_reg && count_init)
1186                 SET_SRC (single_set (count_init)) = GEN_INT (loop_count
1187                                                              - stage_count + 1);
1188
1189               /* Now apply the scheduled kernel to the RTL of the loop.  */
1190               permute_partial_schedule (ps, g->closing_branch->first_note);
1191
1192               /* Mark this loop as software pipelined so the later
1193               scheduling passes doesn't touch it.  */
1194               if (! flag_resched_modulo_sched)
1195                 g->bb->flags |= BB_DISABLE_SCHEDULE;
1196               /* The life-info is not valid any more.  */
1197               g->bb->flags |= BB_DIRTY;
1198
1199               reg_move_replaces = generate_reg_moves (ps);
1200               if (dump_file)
1201                 print_node_sched_params (dump_file, g->num_nodes);
1202               /* Generate prolog and epilog.  */
1203               if (count_reg && !count_init)
1204                 generate_prolog_epilog (ps, loop, count_reg);
1205               else
1206                 generate_prolog_epilog (ps, loop, NULL_RTX);
1207             }
1208           free_undo_replace_buff (reg_move_replaces);
1209         }
1210
1211       free_partial_schedule (ps);
1212       free (node_sched_params);
1213       free (node_order);
1214       free_ddg (g);
1215     }
1216
1217   free (g_arr);
1218
1219   /* Release scheduler data, needed until now because of DFA.  */
1220   sched_finish ();
1221   loop_optimizer_finalize (loops);
1222 }
1223
1224 /* The SMS scheduling algorithm itself
1225    -----------------------------------
1226    Input: 'O' an ordered list of insns of a loop.
1227    Output: A scheduling of the loop - kernel, prolog, and epilogue.
1228
1229    'Q' is the empty Set
1230    'PS' is the partial schedule; it holds the currently scheduled nodes with
1231         their cycle/slot.
1232    'PSP' previously scheduled predecessors.
1233    'PSS' previously scheduled successors.
1234    't(u)' the cycle where u is scheduled.
1235    'l(u)' is the latency of u.
1236    'd(v,u)' is the dependence distance from v to u.
1237    'ASAP(u)' the earliest time at which u could be scheduled as computed in
1238              the node ordering phase.
1239    'check_hardware_resources_conflicts(u, PS, c)'
1240                              run a trace around cycle/slot through DFA model
1241                              to check resource conflicts involving instruction u
1242                              at cycle c given the partial schedule PS.
1243    'add_to_partial_schedule_at_time(u, PS, c)'
1244                              Add the node/instruction u to the partial schedule
1245                              PS at time c.
1246    'calculate_register_pressure(PS)'
1247                              Given a schedule of instructions, calculate the register
1248                              pressure it implies.  One implementation could be the
1249                              maximum number of overlapping live ranges.
1250    'maxRP' The maximum allowed register pressure, it is usually derived from the number
1251            registers available in the hardware.
1252
1253    1. II = MII.
1254    2. PS = empty list
1255    3. for each node u in O in pre-computed order
1256    4.   if (PSP(u) != Q && PSS(u) == Q) then
1257    5.     Early_start(u) = max ( t(v) + l(v) - d(v,u)*II ) over all every v in PSP(u).
1258    6.     start = Early_start; end = Early_start + II - 1; step = 1
1259    11.  else if (PSP(u) == Q && PSS(u) != Q) then
1260    12.      Late_start(u) = min ( t(v) - l(v) + d(v,u)*II ) over all every v in PSS(u).
1261    13.     start = Late_start; end = Late_start - II + 1; step = -1
1262    14.  else if (PSP(u) != Q && PSS(u) != Q) then
1263    15.     Early_start(u) = max ( t(v) + l(v) - d(v,u)*II ) over all every v in PSP(u).
1264    16.     Late_start(u) = min ( t(v) - l(v) + d(v,u)*II ) over all every v in PSS(u).
1265    17.     start = Early_start;
1266    18.     end = min(Early_start + II - 1 , Late_start);
1267    19.     step = 1
1268    20.     else "if (PSP(u) == Q && PSS(u) == Q)"
1269    21.    start = ASAP(u); end = start + II - 1; step = 1
1270    22.  endif
1271
1272    23.  success = false
1273    24.  for (c = start ; c != end ; c += step)
1274    25.     if check_hardware_resources_conflicts(u, PS, c) then
1275    26.       add_to_partial_schedule_at_time(u, PS, c)
1276    27.       success = true
1277    28.       break
1278    29.     endif
1279    30.  endfor
1280    31.  if (success == false) then
1281    32.    II = II + 1
1282    33.    if (II > maxII) then
1283    34.       finish - failed to schedule
1284    35.   endif
1285    36.    goto 2.
1286    37.  endif
1287    38. endfor
1288    39. if (calculate_register_pressure(PS) > maxRP) then
1289    40.    goto 32.
1290    41. endif
1291    42. compute epilogue & prologue
1292    43. finish - succeeded to schedule
1293 */
1294
1295 /* A limit on the number of cycles that resource conflicts can span.  ??? Should
1296    be provided by DFA, and be dependent on the type of insn scheduled.  Currently
1297    set to 0 to save compile time.  */
1298 #define DFA_HISTORY SMS_DFA_HISTORY
1299
1300 /* Given the partial schedule PS, this function calculates and returns the
1301    cycles in which we can schedule the node with the given index I.
1302    NOTE: Here we do the backtracking in SMS, in some special cases. We have
1303    noticed that there are several cases in which we fail    to SMS the loop
1304    because the sched window of a node is empty    due to tight data-deps. In
1305    such cases we want to unschedule    some of the predecessors/successors
1306    until we get non-empty    scheduling window.  It returns -1 if the
1307    scheduling window is empty and zero otherwise.  */
1308
1309 static int
1310 get_sched_window (partial_schedule_ptr ps, int *nodes_order, int i,
1311                   sbitmap sched_nodes, int ii, int *start_p, int *step_p, int *end_p)
1312 {
1313   int start, step, end;
1314   ddg_edge_ptr e;
1315   int u = nodes_order [i];
1316   ddg_node_ptr u_node = &ps->g->nodes[u];
1317   sbitmap psp = sbitmap_alloc (ps->g->num_nodes);
1318   sbitmap pss = sbitmap_alloc (ps->g->num_nodes);
1319   sbitmap u_node_preds = NODE_PREDECESSORS (u_node);
1320   sbitmap u_node_succs = NODE_SUCCESSORS (u_node);
1321   int psp_not_empty;
1322   int pss_not_empty;
1323
1324   /* 1. compute sched window for u (start, end, step).  */
1325   sbitmap_zero (psp);
1326   sbitmap_zero (pss);
1327   psp_not_empty = sbitmap_a_and_b_cg (psp, u_node_preds, sched_nodes);
1328   pss_not_empty = sbitmap_a_and_b_cg (pss, u_node_succs, sched_nodes);
1329
1330   if (psp_not_empty && !pss_not_empty)
1331     {
1332       int early_start = INT_MIN;
1333
1334       end = INT_MAX;
1335       for (e = u_node->in; e != 0; e = e->next_in)
1336         {
1337           ddg_node_ptr v_node = e->src;
1338           if (TEST_BIT (sched_nodes, v_node->cuid))
1339             {
1340               int node_st = SCHED_TIME (v_node)
1341                             + e->latency - (e->distance * ii);
1342
1343               early_start = MAX (early_start, node_st);
1344
1345               if (e->data_type == MEM_DEP)
1346                 end = MIN (end, SCHED_TIME (v_node) + ii - 1);
1347             }
1348         }
1349       start = early_start;
1350       end = MIN (end, early_start + ii);
1351       step = 1;
1352     }
1353
1354   else if (!psp_not_empty && pss_not_empty)
1355     {
1356       int late_start = INT_MAX;
1357
1358       end = INT_MIN;
1359       for (e = u_node->out; e != 0; e = e->next_out)
1360         {
1361           ddg_node_ptr v_node = e->dest;
1362           if (TEST_BIT (sched_nodes, v_node->cuid))
1363             {
1364               late_start = MIN (late_start,
1365                                 SCHED_TIME (v_node) - e->latency
1366                                 + (e->distance * ii));
1367               if (e->data_type == MEM_DEP)
1368                 end = MAX (end, SCHED_TIME (v_node) - ii + 1);
1369             }
1370         }
1371       start = late_start;
1372       end = MAX (end, late_start - ii);
1373       step = -1;
1374     }
1375
1376   else if (psp_not_empty && pss_not_empty)
1377     {
1378       int early_start = INT_MIN;
1379       int late_start = INT_MAX;
1380
1381       start = INT_MIN;
1382       end = INT_MAX;
1383       for (e = u_node->in; e != 0; e = e->next_in)
1384         {
1385           ddg_node_ptr v_node = e->src;
1386
1387           if (TEST_BIT (sched_nodes, v_node->cuid))
1388             {
1389               early_start = MAX (early_start,
1390                                  SCHED_TIME (v_node) + e->latency
1391                                  - (e->distance * ii));
1392               if (e->data_type == MEM_DEP)
1393                 end = MIN (end, SCHED_TIME (v_node) + ii - 1);
1394             }
1395         }
1396       for (e = u_node->out; e != 0; e = e->next_out)
1397         {
1398           ddg_node_ptr v_node = e->dest;
1399
1400           if (TEST_BIT (sched_nodes, v_node->cuid))
1401             {
1402               late_start = MIN (late_start,
1403                                 SCHED_TIME (v_node) - e->latency
1404                                 + (e->distance * ii));
1405               if (e->data_type == MEM_DEP)
1406                 start = MAX (start, SCHED_TIME (v_node) - ii + 1);
1407             }
1408         }
1409       start = MAX (start, early_start);
1410       end = MIN (end, MIN (early_start + ii, late_start + 1));
1411       step = 1;
1412     }
1413   else /* psp is empty && pss is empty.  */
1414     {
1415       start = SCHED_ASAP (u_node);
1416       end = start + ii;
1417       step = 1;
1418     }
1419
1420   *start_p = start;
1421   *step_p = step;
1422   *end_p = end;
1423   sbitmap_free (psp);
1424   sbitmap_free (pss);
1425
1426   if ((start >= end && step == 1) || (start <= end && step == -1))
1427     return -1;
1428   else
1429     return 0;
1430 }
1431
1432 /* This function implements the scheduling algorithm for SMS according to the
1433    above algorithm.  */
1434 static partial_schedule_ptr
1435 sms_schedule_by_order (ddg_ptr g, int mii, int maxii, int *nodes_order)
1436 {
1437   int ii = mii;
1438   int i, c, success;
1439   int try_again_with_larger_ii = true;
1440   int num_nodes = g->num_nodes;
1441   ddg_edge_ptr e;
1442   int start, end, step; /* Place together into one struct?  */
1443   sbitmap sched_nodes = sbitmap_alloc (num_nodes);
1444   sbitmap must_precede = sbitmap_alloc (num_nodes);
1445   sbitmap must_follow = sbitmap_alloc (num_nodes);
1446   sbitmap tobe_scheduled = sbitmap_alloc (num_nodes);
1447
1448   partial_schedule_ptr ps = create_partial_schedule (ii, g, DFA_HISTORY);
1449
1450   sbitmap_ones (tobe_scheduled);
1451   sbitmap_zero (sched_nodes);
1452
1453   while ((! sbitmap_equal (tobe_scheduled, sched_nodes)
1454          || try_again_with_larger_ii ) && ii < maxii)
1455     {
1456       int j;
1457       bool unscheduled_nodes = false;
1458
1459       if (dump_file)
1460         fprintf(dump_file, "Starting with ii=%d\n", ii);
1461       if (try_again_with_larger_ii)
1462         {
1463           try_again_with_larger_ii = false;
1464           sbitmap_zero (sched_nodes);
1465         }
1466
1467       for (i = 0; i < num_nodes; i++)
1468         {
1469           int u = nodes_order[i];
1470           ddg_node_ptr u_node = &ps->g->nodes[u];
1471           rtx insn = u_node->insn;
1472
1473           if (!INSN_P (insn))
1474             {
1475               RESET_BIT (tobe_scheduled, u);
1476               continue;
1477             }
1478
1479           if (JUMP_P (insn)) /* Closing branch handled later.  */
1480             {
1481               RESET_BIT (tobe_scheduled, u);
1482               continue;
1483             }
1484
1485           if (TEST_BIT (sched_nodes, u))
1486             continue;
1487
1488           /* Try to get non-empty scheduling window.  */
1489           j = i;
1490           while (get_sched_window (ps, nodes_order, i, sched_nodes, ii, &start, &step, &end) < 0
1491                  && j > 0)
1492             {
1493               unscheduled_nodes = true;
1494               if (TEST_BIT (NODE_PREDECESSORS (u_node), nodes_order[j - 1])
1495                   || TEST_BIT (NODE_SUCCESSORS (u_node), nodes_order[j - 1]))
1496                 {
1497                   ps_unschedule_node (ps, &ps->g->nodes[nodes_order[j - 1]]);
1498                   RESET_BIT (sched_nodes, nodes_order [j - 1]);
1499                 }
1500               j--;
1501             }
1502           if (j < 0)
1503             {
1504               /* ??? Try backtracking instead of immediately ii++?  */
1505               ii++;
1506               try_again_with_larger_ii = true;
1507               reset_partial_schedule (ps, ii);
1508               break;
1509             }
1510           /* 2. Try scheduling u in window.  */
1511           if (dump_file)
1512             fprintf(dump_file, "Trying to schedule node %d in (%d .. %d) step %d\n",
1513                     u, start, end, step);
1514
1515           /* use must_follow & must_precede bitmaps to determine order
1516              of nodes within the cycle.  */
1517           sbitmap_zero (must_precede);
1518           sbitmap_zero (must_follow);
1519           for (e = u_node->in; e != 0; e = e->next_in)
1520             if (TEST_BIT (sched_nodes, e->src->cuid)
1521                 && e->latency == (ii * e->distance)
1522                 && start == SCHED_TIME (e->src))
1523              SET_BIT (must_precede, e->src->cuid);
1524
1525           for (e = u_node->out; e != 0; e = e->next_out)
1526             if (TEST_BIT (sched_nodes, e->dest->cuid)
1527                 && e->latency == (ii * e->distance)
1528                 && end == SCHED_TIME (e->dest))
1529              SET_BIT (must_follow, e->dest->cuid);
1530
1531           success = 0;
1532           if ((step > 0 && start < end) ||  (step < 0 && start > end))
1533             for (c = start; c != end; c += step)
1534               {
1535                 ps_insn_ptr psi;
1536
1537                 psi = ps_add_node_check_conflicts (ps, u_node, c,
1538                                                    must_precede,
1539                                                    must_follow);
1540
1541                 if (psi)
1542                   {
1543                     SCHED_TIME (u_node) = c;
1544                     SET_BIT (sched_nodes, u);
1545                     success = 1;
1546                     if (dump_file)
1547                       fprintf(dump_file, "Schedule in %d\n", c);
1548                     break;
1549                   }
1550               }
1551           if (!success)
1552             {
1553               /* ??? Try backtracking instead of immediately ii++?  */
1554               ii++;
1555               try_again_with_larger_ii = true;
1556               reset_partial_schedule (ps, ii);
1557               break;
1558             }
1559           if (unscheduled_nodes)
1560             break;
1561
1562           /* ??? If (success), check register pressure estimates.  */
1563         } /* Continue with next node.  */
1564     } /* While try_again_with_larger_ii.  */
1565
1566   sbitmap_free (sched_nodes);
1567   sbitmap_free (must_precede);
1568   sbitmap_free (must_follow);
1569   sbitmap_free (tobe_scheduled);
1570
1571   if (ii >= maxii)
1572     {
1573       free_partial_schedule (ps);
1574       ps = NULL;
1575     }
1576   return ps;
1577 }
1578
1579 \f
1580 /* This page implements the algorithm for ordering the nodes of a DDG
1581    for modulo scheduling, activated through the
1582    "int sms_order_nodes (ddg_ptr, int mii, int * result)" API.  */
1583
1584 #define ORDER_PARAMS(x) ((struct node_order_params *) (x)->aux.info)
1585 #define ASAP(x) (ORDER_PARAMS ((x))->asap)
1586 #define ALAP(x) (ORDER_PARAMS ((x))->alap)
1587 #define HEIGHT(x) (ORDER_PARAMS ((x))->height)
1588 #define MOB(x) (ALAP ((x)) - ASAP ((x)))
1589 #define DEPTH(x) (ASAP ((x)))
1590
1591 typedef struct node_order_params * nopa;
1592
1593 static void order_nodes_of_sccs (ddg_all_sccs_ptr, int * result);
1594 static int order_nodes_in_scc (ddg_ptr, sbitmap, sbitmap, int*, int);
1595 static nopa  calculate_order_params (ddg_ptr, int mii);
1596 static int find_max_asap (ddg_ptr, sbitmap);
1597 static int find_max_hv_min_mob (ddg_ptr, sbitmap);
1598 static int find_max_dv_min_mob (ddg_ptr, sbitmap);
1599
1600 enum sms_direction {BOTTOMUP, TOPDOWN};
1601
1602 struct node_order_params
1603 {
1604   int asap;
1605   int alap;
1606   int height;
1607 };
1608
1609 /* Check if NODE_ORDER contains a permutation of 0 .. NUM_NODES-1.  */
1610 static void
1611 check_nodes_order (int *node_order, int num_nodes)
1612 {
1613   int i;
1614   sbitmap tmp = sbitmap_alloc (num_nodes);
1615
1616   sbitmap_zero (tmp);
1617
1618   for (i = 0; i < num_nodes; i++)
1619     {
1620       int u = node_order[i];
1621
1622       gcc_assert (u < num_nodes && u >= 0 && !TEST_BIT (tmp, u));
1623
1624       SET_BIT (tmp, u);
1625     }
1626
1627   sbitmap_free (tmp);
1628 }
1629
1630 /* Order the nodes of G for scheduling and pass the result in
1631    NODE_ORDER.  Also set aux.count of each node to ASAP.
1632    Return the recMII for the given DDG.  */
1633 static int
1634 sms_order_nodes (ddg_ptr g, int mii, int * node_order)
1635 {
1636   int i;
1637   int rec_mii = 0;
1638   ddg_all_sccs_ptr sccs = create_ddg_all_sccs (g);
1639
1640   nopa nops = calculate_order_params (g, mii);
1641
1642   order_nodes_of_sccs (sccs, node_order);
1643
1644   if (sccs->num_sccs > 0)
1645     /* First SCC has the largest recurrence_length.  */
1646     rec_mii = sccs->sccs[0]->recurrence_length;
1647
1648   /* Save ASAP before destroying node_order_params.  */
1649   for (i = 0; i < g->num_nodes; i++)
1650     {
1651       ddg_node_ptr v = &g->nodes[i];
1652       v->aux.count = ASAP (v);
1653     }
1654
1655   free (nops);
1656   free_ddg_all_sccs (sccs);
1657   check_nodes_order (node_order, g->num_nodes);
1658
1659   return rec_mii;
1660 }
1661
1662 static void
1663 order_nodes_of_sccs (ddg_all_sccs_ptr all_sccs, int * node_order)
1664 {
1665   int i, pos = 0;
1666   ddg_ptr g = all_sccs->ddg;
1667   int num_nodes = g->num_nodes;
1668   sbitmap prev_sccs = sbitmap_alloc (num_nodes);
1669   sbitmap on_path = sbitmap_alloc (num_nodes);
1670   sbitmap tmp = sbitmap_alloc (num_nodes);
1671   sbitmap ones = sbitmap_alloc (num_nodes);
1672
1673   sbitmap_zero (prev_sccs);
1674   sbitmap_ones (ones);
1675
1676   /* Perfrom the node ordering starting from the SCC with the highest recMII.
1677      For each SCC order the nodes according to their ASAP/ALAP/HEIGHT etc.  */
1678   for (i = 0; i < all_sccs->num_sccs; i++)
1679     {
1680       ddg_scc_ptr scc = all_sccs->sccs[i];
1681
1682       /* Add nodes on paths from previous SCCs to the current SCC.  */
1683       find_nodes_on_paths (on_path, g, prev_sccs, scc->nodes);
1684       sbitmap_a_or_b (tmp, scc->nodes, on_path);
1685
1686       /* Add nodes on paths from the current SCC to previous SCCs.  */
1687       find_nodes_on_paths (on_path, g, scc->nodes, prev_sccs);
1688       sbitmap_a_or_b (tmp, tmp, on_path);
1689
1690       /* Remove nodes of previous SCCs from current extended SCC.  */
1691       sbitmap_difference (tmp, tmp, prev_sccs);
1692
1693       pos = order_nodes_in_scc (g, prev_sccs, tmp, node_order, pos);
1694       /* Above call to order_nodes_in_scc updated prev_sccs |= tmp.  */
1695     }
1696
1697   /* Handle the remaining nodes that do not belong to any scc.  Each call
1698      to order_nodes_in_scc handles a single connected component.  */
1699   while (pos < g->num_nodes)
1700     {
1701       sbitmap_difference (tmp, ones, prev_sccs);
1702       pos = order_nodes_in_scc (g, prev_sccs, tmp, node_order, pos);
1703     }
1704   sbitmap_free (prev_sccs);
1705   sbitmap_free (on_path);
1706   sbitmap_free (tmp);
1707   sbitmap_free (ones);
1708 }
1709
1710 /* MII is needed if we consider backarcs (that do not close recursive cycles).  */
1711 static struct node_order_params *
1712 calculate_order_params (ddg_ptr g, int mii ATTRIBUTE_UNUSED)
1713 {
1714   int u;
1715   int max_asap;
1716   int num_nodes = g->num_nodes;
1717   ddg_edge_ptr e;
1718   /* Allocate a place to hold ordering params for each node in the DDG.  */
1719   nopa node_order_params_arr;
1720
1721   /* Initialize of ASAP/ALAP/HEIGHT to zero.  */
1722   node_order_params_arr = (nopa) xcalloc (num_nodes,
1723                                           sizeof (struct node_order_params));
1724
1725   /* Set the aux pointer of each node to point to its order_params structure.  */
1726   for (u = 0; u < num_nodes; u++)
1727     g->nodes[u].aux.info = &node_order_params_arr[u];
1728
1729   /* Disregarding a backarc from each recursive cycle to obtain a DAG,
1730      calculate ASAP, ALAP, mobility, distance, and height for each node
1731      in the dependence (direct acyclic) graph.  */
1732
1733   /* We assume that the nodes in the array are in topological order.  */
1734
1735   max_asap = 0;
1736   for (u = 0; u < num_nodes; u++)
1737     {
1738       ddg_node_ptr u_node = &g->nodes[u];
1739
1740       ASAP (u_node) = 0;
1741       for (e = u_node->in; e; e = e->next_in)
1742         if (e->distance == 0)
1743           ASAP (u_node) = MAX (ASAP (u_node),
1744                                ASAP (e->src) + e->latency);
1745       max_asap = MAX (max_asap, ASAP (u_node));
1746     }
1747
1748   for (u = num_nodes - 1; u > -1; u--)
1749     {
1750       ddg_node_ptr u_node = &g->nodes[u];
1751
1752       ALAP (u_node) = max_asap;
1753       HEIGHT (u_node) = 0;
1754       for (e = u_node->out; e; e = e->next_out)
1755         if (e->distance == 0)
1756           {
1757             ALAP (u_node) = MIN (ALAP (u_node),
1758                                  ALAP (e->dest) - e->latency);
1759             HEIGHT (u_node) = MAX (HEIGHT (u_node),
1760                                    HEIGHT (e->dest) + e->latency);
1761           }
1762     }
1763
1764   return node_order_params_arr;
1765 }
1766
1767 static int
1768 find_max_asap (ddg_ptr g, sbitmap nodes)
1769 {
1770   unsigned int u = 0;
1771   int max_asap = -1;
1772   int result = -1;
1773   sbitmap_iterator sbi;
1774
1775   EXECUTE_IF_SET_IN_SBITMAP (nodes, 0, u, sbi)
1776     {
1777       ddg_node_ptr u_node = &g->nodes[u];
1778
1779       if (max_asap < ASAP (u_node))
1780         {
1781           max_asap = ASAP (u_node);
1782           result = u;
1783         }
1784     }
1785   return result;
1786 }
1787
1788 static int
1789 find_max_hv_min_mob (ddg_ptr g, sbitmap nodes)
1790 {
1791   unsigned int u = 0;
1792   int max_hv = -1;
1793   int min_mob = INT_MAX;
1794   int result = -1;
1795   sbitmap_iterator sbi;
1796
1797   EXECUTE_IF_SET_IN_SBITMAP (nodes, 0, u, sbi)
1798     {
1799       ddg_node_ptr u_node = &g->nodes[u];
1800
1801       if (max_hv < HEIGHT (u_node))
1802         {
1803           max_hv = HEIGHT (u_node);
1804           min_mob = MOB (u_node);
1805           result = u;
1806         }
1807       else if ((max_hv == HEIGHT (u_node))
1808                && (min_mob > MOB (u_node)))
1809         {
1810           min_mob = MOB (u_node);
1811           result = u;
1812         }
1813     }
1814   return result;
1815 }
1816
1817 static int
1818 find_max_dv_min_mob (ddg_ptr g, sbitmap nodes)
1819 {
1820   unsigned int u = 0;
1821   int max_dv = -1;
1822   int min_mob = INT_MAX;
1823   int result = -1;
1824   sbitmap_iterator sbi;
1825
1826   EXECUTE_IF_SET_IN_SBITMAP (nodes, 0, u, sbi)
1827     {
1828       ddg_node_ptr u_node = &g->nodes[u];
1829
1830       if (max_dv < DEPTH (u_node))
1831         {
1832           max_dv = DEPTH (u_node);
1833           min_mob = MOB (u_node);
1834           result = u;
1835         }
1836       else if ((max_dv == DEPTH (u_node))
1837                && (min_mob > MOB (u_node)))
1838         {
1839           min_mob = MOB (u_node);
1840           result = u;
1841         }
1842     }
1843   return result;
1844 }
1845
1846 /* Places the nodes of SCC into the NODE_ORDER array starting
1847    at position POS, according to the SMS ordering algorithm.
1848    NODES_ORDERED (in&out parameter) holds the bitset of all nodes in
1849    the NODE_ORDER array, starting from position zero.  */
1850 static int
1851 order_nodes_in_scc (ddg_ptr g, sbitmap nodes_ordered, sbitmap scc,
1852                     int * node_order, int pos)
1853 {
1854   enum sms_direction dir;
1855   int num_nodes = g->num_nodes;
1856   sbitmap workset = sbitmap_alloc (num_nodes);
1857   sbitmap tmp = sbitmap_alloc (num_nodes);
1858   sbitmap zero_bitmap = sbitmap_alloc (num_nodes);
1859   sbitmap predecessors = sbitmap_alloc (num_nodes);
1860   sbitmap successors = sbitmap_alloc (num_nodes);
1861
1862   sbitmap_zero (predecessors);
1863   find_predecessors (predecessors, g, nodes_ordered);
1864
1865   sbitmap_zero (successors);
1866   find_successors (successors, g, nodes_ordered);
1867
1868   sbitmap_zero (tmp);
1869   if (sbitmap_a_and_b_cg (tmp, predecessors, scc))
1870     {
1871       sbitmap_copy (workset, tmp);
1872       dir = BOTTOMUP;
1873     }
1874   else if (sbitmap_a_and_b_cg (tmp, successors, scc))
1875     {
1876       sbitmap_copy (workset, tmp);
1877       dir = TOPDOWN;
1878     }
1879   else
1880     {
1881       int u;
1882
1883       sbitmap_zero (workset);
1884       if ((u = find_max_asap (g, scc)) >= 0)
1885         SET_BIT (workset, u);
1886       dir = BOTTOMUP;
1887     }
1888
1889   sbitmap_zero (zero_bitmap);
1890   while (!sbitmap_equal (workset, zero_bitmap))
1891     {
1892       int v;
1893       ddg_node_ptr v_node;
1894       sbitmap v_node_preds;
1895       sbitmap v_node_succs;
1896
1897       if (dir == TOPDOWN)
1898         {
1899           while (!sbitmap_equal (workset, zero_bitmap))
1900             {
1901               v = find_max_hv_min_mob (g, workset);
1902               v_node = &g->nodes[v];
1903               node_order[pos++] = v;
1904               v_node_succs = NODE_SUCCESSORS (v_node);
1905               sbitmap_a_and_b (tmp, v_node_succs, scc);
1906
1907               /* Don't consider the already ordered successors again.  */
1908               sbitmap_difference (tmp, tmp, nodes_ordered);
1909               sbitmap_a_or_b (workset, workset, tmp);
1910               RESET_BIT (workset, v);
1911               SET_BIT (nodes_ordered, v);
1912             }
1913           dir = BOTTOMUP;
1914           sbitmap_zero (predecessors);
1915           find_predecessors (predecessors, g, nodes_ordered);
1916           sbitmap_a_and_b (workset, predecessors, scc);
1917         }
1918       else
1919         {
1920           while (!sbitmap_equal (workset, zero_bitmap))
1921             {
1922               v = find_max_dv_min_mob (g, workset);
1923               v_node = &g->nodes[v];
1924               node_order[pos++] = v;
1925               v_node_preds = NODE_PREDECESSORS (v_node);
1926               sbitmap_a_and_b (tmp, v_node_preds, scc);
1927
1928               /* Don't consider the already ordered predecessors again.  */
1929               sbitmap_difference (tmp, tmp, nodes_ordered);
1930               sbitmap_a_or_b (workset, workset, tmp);
1931               RESET_BIT (workset, v);
1932               SET_BIT (nodes_ordered, v);
1933             }
1934           dir = TOPDOWN;
1935           sbitmap_zero (successors);
1936           find_successors (successors, g, nodes_ordered);
1937           sbitmap_a_and_b (workset, successors, scc);
1938         }
1939     }
1940   sbitmap_free (tmp);
1941   sbitmap_free (workset);
1942   sbitmap_free (zero_bitmap);
1943   sbitmap_free (predecessors);
1944   sbitmap_free (successors);
1945   return pos;
1946 }
1947
1948 \f
1949 /* This page contains functions for manipulating partial-schedules during
1950    modulo scheduling.  */
1951
1952 /* Create a partial schedule and allocate a memory to hold II rows.  */
1953
1954 static partial_schedule_ptr
1955 create_partial_schedule (int ii, ddg_ptr g, int history)
1956 {
1957   partial_schedule_ptr ps = XNEW (struct partial_schedule);
1958   ps->rows = (ps_insn_ptr *) xcalloc (ii, sizeof (ps_insn_ptr));
1959   ps->ii = ii;
1960   ps->history = history;
1961   ps->min_cycle = INT_MAX;
1962   ps->max_cycle = INT_MIN;
1963   ps->g = g;
1964
1965   return ps;
1966 }
1967
1968 /* Free the PS_INSNs in rows array of the given partial schedule.
1969    ??? Consider caching the PS_INSN's.  */
1970 static void
1971 free_ps_insns (partial_schedule_ptr ps)
1972 {
1973   int i;
1974
1975   for (i = 0; i < ps->ii; i++)
1976     {
1977       while (ps->rows[i])
1978         {
1979           ps_insn_ptr ps_insn = ps->rows[i]->next_in_row;
1980
1981           free (ps->rows[i]);
1982           ps->rows[i] = ps_insn;
1983         }
1984       ps->rows[i] = NULL;
1985     }
1986 }
1987
1988 /* Free all the memory allocated to the partial schedule.  */
1989
1990 static void
1991 free_partial_schedule (partial_schedule_ptr ps)
1992 {
1993   if (!ps)
1994     return;
1995   free_ps_insns (ps);
1996   free (ps->rows);
1997   free (ps);
1998 }
1999
2000 /* Clear the rows array with its PS_INSNs, and create a new one with
2001    NEW_II rows.  */
2002
2003 static void
2004 reset_partial_schedule (partial_schedule_ptr ps, int new_ii)
2005 {
2006   if (!ps)
2007     return;
2008   free_ps_insns (ps);
2009   if (new_ii == ps->ii)
2010     return;
2011   ps->rows = (ps_insn_ptr *) xrealloc (ps->rows, new_ii
2012                                                  * sizeof (ps_insn_ptr));
2013   memset (ps->rows, 0, new_ii * sizeof (ps_insn_ptr));
2014   ps->ii = new_ii;
2015   ps->min_cycle = INT_MAX;
2016   ps->max_cycle = INT_MIN;
2017 }
2018
2019 /* Prints the partial schedule as an ii rows array, for each rows
2020    print the ids of the insns in it.  */
2021 void
2022 print_partial_schedule (partial_schedule_ptr ps, FILE *dump)
2023 {
2024   int i;
2025
2026   for (i = 0; i < ps->ii; i++)
2027     {
2028       ps_insn_ptr ps_i = ps->rows[i];
2029
2030       fprintf (dump, "\n[CYCLE %d ]: ", i);
2031       while (ps_i)
2032         {
2033           fprintf (dump, "%d, ",
2034                    INSN_UID (ps_i->node->insn));
2035           ps_i = ps_i->next_in_row;
2036         }
2037     }
2038 }
2039
2040 /* Creates an object of PS_INSN and initializes it to the given parameters.  */
2041 static ps_insn_ptr
2042 create_ps_insn (ddg_node_ptr node, int rest_count, int cycle)
2043 {
2044   ps_insn_ptr ps_i = XNEW (struct ps_insn);
2045
2046   ps_i->node = node;
2047   ps_i->next_in_row = NULL;
2048   ps_i->prev_in_row = NULL;
2049   ps_i->row_rest_count = rest_count;
2050   ps_i->cycle = cycle;
2051
2052   return ps_i;
2053 }
2054
2055
2056 /* Removes the given PS_INSN from the partial schedule.  Returns false if the
2057    node is not found in the partial schedule, else returns true.  */
2058 static bool
2059 remove_node_from_ps (partial_schedule_ptr ps, ps_insn_ptr ps_i)
2060 {
2061   int row;
2062
2063   if (!ps || !ps_i)
2064     return false;
2065
2066   row = SMODULO (ps_i->cycle, ps->ii);
2067   if (! ps_i->prev_in_row)
2068     {
2069       if (ps_i != ps->rows[row])
2070         return false;
2071
2072       ps->rows[row] = ps_i->next_in_row;
2073       if (ps->rows[row])
2074         ps->rows[row]->prev_in_row = NULL;
2075     }
2076   else
2077     {
2078       ps_i->prev_in_row->next_in_row = ps_i->next_in_row;
2079       if (ps_i->next_in_row)
2080         ps_i->next_in_row->prev_in_row = ps_i->prev_in_row;
2081     }
2082   free (ps_i);
2083   return true;
2084 }
2085
2086 /* Unlike what literature describes for modulo scheduling (which focuses
2087    on VLIW machines) the order of the instructions inside a cycle is
2088    important.  Given the bitmaps MUST_FOLLOW and MUST_PRECEDE we know
2089    where the current instruction should go relative to the already
2090    scheduled instructions in the given cycle.  Go over these
2091    instructions and find the first possible column to put it in.  */
2092 static bool
2093 ps_insn_find_column (partial_schedule_ptr ps, ps_insn_ptr ps_i,
2094                      sbitmap must_precede, sbitmap must_follow)
2095 {
2096   ps_insn_ptr next_ps_i;
2097   ps_insn_ptr first_must_follow = NULL;
2098   ps_insn_ptr last_must_precede = NULL;
2099   int row;
2100
2101   if (! ps_i)
2102     return false;
2103
2104   row = SMODULO (ps_i->cycle, ps->ii);
2105
2106   /* Find the first must follow and the last must precede
2107      and insert the node immediately after the must precede
2108      but make sure that it there is no must follow after it.  */
2109   for (next_ps_i = ps->rows[row];
2110        next_ps_i;
2111        next_ps_i = next_ps_i->next_in_row)
2112     {
2113       if (TEST_BIT (must_follow, next_ps_i->node->cuid)
2114           && ! first_must_follow)
2115         first_must_follow = next_ps_i;
2116       if (TEST_BIT (must_precede, next_ps_i->node->cuid))
2117         {
2118           /* If we have already met a node that must follow, then
2119              there is no possible column.  */
2120           if (first_must_follow)
2121             return false;
2122           else
2123             last_must_precede = next_ps_i;
2124         }
2125     }
2126
2127   /* Now insert the node after INSERT_AFTER_PSI.  */
2128
2129   if (! last_must_precede)
2130     {
2131       ps_i->next_in_row = ps->rows[row];
2132       ps_i->prev_in_row = NULL;
2133       if (ps_i->next_in_row)
2134         ps_i->next_in_row->prev_in_row = ps_i;
2135       ps->rows[row] = ps_i;
2136     }
2137   else
2138     {
2139       ps_i->next_in_row = last_must_precede->next_in_row;
2140       last_must_precede->next_in_row = ps_i;
2141       ps_i->prev_in_row = last_must_precede;
2142       if (ps_i->next_in_row)
2143         ps_i->next_in_row->prev_in_row = ps_i;
2144     }
2145
2146   return true;
2147 }
2148
2149 /* Advances the PS_INSN one column in its current row; returns false
2150    in failure and true in success.  Bit N is set in MUST_FOLLOW if 
2151    the node with cuid N must be come after the node pointed to by 
2152    PS_I when scheduled in the same cycle.  */
2153 static int
2154 ps_insn_advance_column (partial_schedule_ptr ps, ps_insn_ptr ps_i,
2155                         sbitmap must_follow)
2156 {
2157   ps_insn_ptr prev, next;
2158   int row;
2159   ddg_node_ptr next_node;
2160
2161   if (!ps || !ps_i)
2162     return false;
2163
2164   row = SMODULO (ps_i->cycle, ps->ii);
2165
2166   if (! ps_i->next_in_row)
2167     return false;
2168
2169   next_node = ps_i->next_in_row->node;
2170
2171   /* Check if next_in_row is dependent on ps_i, both having same sched
2172      times (typically ANTI_DEP).  If so, ps_i cannot skip over it.  */
2173   if (TEST_BIT (must_follow, next_node->cuid))
2174     return false;
2175
2176   /* Advance PS_I over its next_in_row in the doubly linked list.  */
2177   prev = ps_i->prev_in_row;
2178   next = ps_i->next_in_row;
2179
2180   if (ps_i == ps->rows[row])
2181     ps->rows[row] = next;
2182
2183   ps_i->next_in_row = next->next_in_row;
2184
2185   if (next->next_in_row)
2186     next->next_in_row->prev_in_row = ps_i;
2187
2188   next->next_in_row = ps_i;
2189   ps_i->prev_in_row = next;
2190
2191   next->prev_in_row = prev;
2192   if (prev)
2193     prev->next_in_row = next;
2194
2195   return true;
2196 }
2197
2198 /* Inserts a DDG_NODE to the given partial schedule at the given cycle.
2199    Returns 0 if this is not possible and a PS_INSN otherwise.  Bit N is 
2200    set in MUST_PRECEDE/MUST_FOLLOW if the node with cuid N must be come 
2201    before/after (respectively) the node pointed to by PS_I when scheduled 
2202    in the same cycle.  */
2203 static ps_insn_ptr
2204 add_node_to_ps (partial_schedule_ptr ps, ddg_node_ptr node, int cycle,
2205                 sbitmap must_precede, sbitmap must_follow)
2206 {
2207   ps_insn_ptr ps_i;
2208   int rest_count = 1;
2209   int row = SMODULO (cycle, ps->ii);
2210
2211   if (ps->rows[row]
2212       && ps->rows[row]->row_rest_count >= issue_rate)
2213     return NULL;
2214
2215   if (ps->rows[row])
2216     rest_count += ps->rows[row]->row_rest_count;
2217
2218   ps_i = create_ps_insn (node, rest_count, cycle);
2219
2220   /* Finds and inserts PS_I according to MUST_FOLLOW and
2221      MUST_PRECEDE.  */
2222   if (! ps_insn_find_column (ps, ps_i, must_precede, must_follow))
2223     {
2224       free (ps_i);
2225       return NULL;
2226     }
2227
2228   return ps_i;
2229 }
2230
2231 /* Advance time one cycle.  Assumes DFA is being used.  */
2232 static void
2233 advance_one_cycle (void)
2234 {
2235   if (targetm.sched.dfa_pre_cycle_insn)
2236     state_transition (curr_state,
2237                       targetm.sched.dfa_pre_cycle_insn ());
2238
2239   state_transition (curr_state, NULL);
2240
2241   if (targetm.sched.dfa_post_cycle_insn)
2242     state_transition (curr_state,
2243                       targetm.sched.dfa_post_cycle_insn ());
2244 }
2245
2246 /* Given the kernel of a loop (from FIRST_INSN to LAST_INSN), finds
2247    the number of cycles according to DFA that the kernel fits in,
2248    we use this to check if we done well with SMS after we add
2249    register moves.  In some cases register moves overhead makes
2250    it even worse than the original loop.  We want SMS to be performed
2251    when it gives less cycles after register moves are added.  */
2252 static int
2253 kernel_number_of_cycles (rtx first_insn, rtx last_insn)
2254 {
2255   int cycles = 0;
2256   rtx insn;
2257   int can_issue_more = issue_rate;
2258
2259   state_reset (curr_state);
2260
2261   for (insn = first_insn;
2262        insn != NULL_RTX && insn != last_insn;
2263        insn = NEXT_INSN (insn))
2264     {
2265       if (! INSN_P (insn) || GET_CODE (PATTERN (insn)) == USE)
2266         continue;
2267
2268       /* Check if there is room for the current insn.  */
2269       if (!can_issue_more || state_dead_lock_p (curr_state))
2270         {
2271           cycles ++;
2272           advance_one_cycle ();
2273           can_issue_more = issue_rate;
2274         }
2275
2276         /* Update the DFA state and return with failure if the DFA found
2277            recource conflicts.  */
2278       if (state_transition (curr_state, insn) >= 0)
2279         {
2280           cycles ++;
2281           advance_one_cycle ();
2282           can_issue_more = issue_rate;
2283         }
2284
2285       if (targetm.sched.variable_issue)
2286         can_issue_more =
2287           targetm.sched.variable_issue (sched_dump, sched_verbose,
2288                                         insn, can_issue_more);
2289       /* A naked CLOBBER or USE generates no instruction, so don't
2290          let them consume issue slots.  */
2291       else if (GET_CODE (PATTERN (insn)) != USE
2292                && GET_CODE (PATTERN (insn)) != CLOBBER)
2293         can_issue_more--;
2294     }
2295   return cycles;
2296 }
2297
2298 /* Checks if PS has resource conflicts according to DFA, starting from
2299    FROM cycle to TO cycle; returns true if there are conflicts and false
2300    if there are no conflicts.  Assumes DFA is being used.  */
2301 static int
2302 ps_has_conflicts (partial_schedule_ptr ps, int from, int to)
2303 {
2304   int cycle;
2305
2306   state_reset (curr_state);
2307
2308   for (cycle = from; cycle <= to; cycle++)
2309     {
2310       ps_insn_ptr crr_insn;
2311       /* Holds the remaining issue slots in the current row.  */
2312       int can_issue_more = issue_rate;
2313
2314       /* Walk through the DFA for the current row.  */
2315       for (crr_insn = ps->rows[SMODULO (cycle, ps->ii)];
2316            crr_insn;
2317            crr_insn = crr_insn->next_in_row)
2318         {
2319           rtx insn = crr_insn->node->insn;
2320
2321           if (!INSN_P (insn))
2322             continue;
2323
2324           /* Check if there is room for the current insn.  */
2325           if (!can_issue_more || state_dead_lock_p (curr_state))
2326             return true;
2327
2328           /* Update the DFA state and return with failure if the DFA found
2329              recource conflicts.  */
2330           if (state_transition (curr_state, insn) >= 0)
2331             return true;
2332
2333           if (targetm.sched.variable_issue)
2334             can_issue_more =
2335               targetm.sched.variable_issue (sched_dump, sched_verbose,
2336                                             insn, can_issue_more);
2337           /* A naked CLOBBER or USE generates no instruction, so don't
2338              let them consume issue slots.  */
2339           else if (GET_CODE (PATTERN (insn)) != USE
2340                    && GET_CODE (PATTERN (insn)) != CLOBBER)
2341             can_issue_more--;
2342         }
2343
2344       /* Advance the DFA to the next cycle.  */
2345       advance_one_cycle ();
2346     }
2347   return false;
2348 }
2349
2350 /* Checks if the given node causes resource conflicts when added to PS at
2351    cycle C.  If not the node is added to PS and returned; otherwise zero
2352    is returned.  Bit N is set in MUST_PRECEDE/MUST_FOLLOW if the node with 
2353    cuid N must be come before/after (respectively) the node pointed to by 
2354    PS_I when scheduled in the same cycle.  */
2355 ps_insn_ptr
2356 ps_add_node_check_conflicts (partial_schedule_ptr ps, ddg_node_ptr n,
2357                              int c, sbitmap must_precede,
2358                              sbitmap must_follow)
2359 {
2360   int has_conflicts = 0;
2361   ps_insn_ptr ps_i;
2362
2363   /* First add the node to the PS, if this succeeds check for
2364      conflicts, trying different issue slots in the same row.  */
2365   if (! (ps_i = add_node_to_ps (ps, n, c, must_precede, must_follow)))
2366     return NULL; /* Failed to insert the node at the given cycle.  */
2367
2368   has_conflicts = ps_has_conflicts (ps, c, c)
2369                   || (ps->history > 0
2370                       && ps_has_conflicts (ps,
2371                                            c - ps->history,
2372                                            c + ps->history));
2373
2374   /* Try different issue slots to find one that the given node can be
2375      scheduled in without conflicts.  */
2376   while (has_conflicts)
2377     {
2378       if (! ps_insn_advance_column (ps, ps_i, must_follow))
2379         break;
2380       has_conflicts = ps_has_conflicts (ps, c, c)
2381                       || (ps->history > 0
2382                           && ps_has_conflicts (ps,
2383                                                c - ps->history,
2384                                                c + ps->history));
2385     }
2386
2387   if (has_conflicts)
2388     {
2389       remove_node_from_ps (ps, ps_i);
2390       return NULL;
2391     }
2392
2393   ps->min_cycle = MIN (ps->min_cycle, c);
2394   ps->max_cycle = MAX (ps->max_cycle, c);
2395   return ps_i;
2396 }
2397
2398 /* Rotate the rows of PS such that insns scheduled at time
2399    START_CYCLE will appear in row 0.  Updates max/min_cycles.  */
2400 void
2401 rotate_partial_schedule (partial_schedule_ptr ps, int start_cycle)
2402 {
2403   int i, row, backward_rotates;
2404   int last_row = ps->ii - 1;
2405
2406   if (start_cycle == 0)
2407     return;
2408
2409   backward_rotates = SMODULO (start_cycle, ps->ii);
2410
2411   /* Revisit later and optimize this into a single loop.  */
2412   for (i = 0; i < backward_rotates; i++)
2413     {
2414       ps_insn_ptr first_row = ps->rows[0];
2415
2416       for (row = 0; row < last_row; row++)
2417         ps->rows[row] = ps->rows[row+1];
2418
2419       ps->rows[last_row] = first_row;
2420     }
2421
2422   ps->max_cycle -= start_cycle;
2423   ps->min_cycle -= start_cycle;
2424 }
2425
2426 /* Remove the node N from the partial schedule PS; because we restart the DFA
2427    each time we want to check for resource conflicts; this is equivalent to
2428    unscheduling the node N.  */
2429 static bool
2430 ps_unschedule_node (partial_schedule_ptr ps, ddg_node_ptr n)
2431 {
2432   ps_insn_ptr ps_i;
2433   int row = SMODULO (SCHED_TIME (n), ps->ii);
2434
2435   if (row < 0 || row > ps->ii)
2436     return false;
2437
2438   for (ps_i = ps->rows[row];
2439        ps_i &&  ps_i->node != n;
2440        ps_i = ps_i->next_in_row);
2441   if (!ps_i)
2442     return false;
2443
2444   return remove_node_from_ps (ps, ps_i);
2445 }
2446 #endif /* INSN_SCHEDULING */
2447 \f
2448 static bool
2449 gate_handle_sms (void)
2450 {
2451   return (optimize > 0 && flag_modulo_sched);
2452 }
2453
2454
2455 /* Run instruction scheduler.  */
2456 /* Perform SMS module scheduling.  */
2457 static unsigned int
2458 rest_of_handle_sms (void)
2459 {
2460 #ifdef INSN_SCHEDULING
2461   basic_block bb;
2462
2463   /* We want to be able to create new pseudos.  */
2464   no_new_pseudos = 0;
2465   /* Collect loop information to be used in SMS.  */
2466   cfg_layout_initialize (CLEANUP_UPDATE_LIFE);
2467   sms_schedule ();
2468
2469   /* Update the life information, because we add pseudos.  */
2470   max_regno = max_reg_num ();
2471   allocate_reg_info (max_regno, FALSE, FALSE);
2472   update_life_info (NULL, UPDATE_LIFE_GLOBAL_RM_NOTES,
2473                     (PROP_DEATH_NOTES
2474                      | PROP_REG_INFO
2475                      | PROP_KILL_DEAD_CODE
2476                      | PROP_SCAN_DEAD_CODE));
2477
2478   no_new_pseudos = 1;
2479
2480   /* Finalize layout changes.  */
2481   FOR_EACH_BB (bb)
2482     if (bb->next_bb != EXIT_BLOCK_PTR)
2483       bb->aux = bb->next_bb;
2484   cfg_layout_finalize ();
2485   free_dominance_info (CDI_DOMINATORS);
2486 #endif /* INSN_SCHEDULING */
2487   return 0;
2488 }
2489
2490 struct tree_opt_pass pass_sms =
2491 {
2492   "sms",                                /* name */
2493   gate_handle_sms,                      /* gate */
2494   rest_of_handle_sms,                   /* execute */
2495   NULL,                                 /* sub */
2496   NULL,                                 /* next */
2497   0,                                    /* static_pass_number */
2498   TV_SMS,                               /* tv_id */
2499   0,                                    /* properties_required */
2500   0,                                    /* properties_provided */
2501   0,                                    /* properties_destroyed */
2502   TODO_dump_func,                       /* todo_flags_start */
2503   TODO_dump_func |
2504   TODO_ggc_collect,                     /* todo_flags_finish */
2505   'm'                                   /* letter */
2506 };
2507