OSDN Git Service

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