OSDN Git Service

2006-03-30 Paolo Bonzini <bonzini@gnu.org>
[pf3gnuchains/gcc-fork.git] / gcc / sched-deps.c
1 /* Instruction scheduling pass.  This file computes dependencies between
2    instructions.
3    Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998,
4    1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
5    Free Software Foundation, Inc.
6    Contributed by Michael Tiemann (tiemann@cygnus.com) Enhanced by,
7    and currently maintained by, Jim Wilson (wilson@cygnus.com)
8
9 This file is part of GCC.
10
11 GCC is free software; you can redistribute it and/or modify it under
12 the terms of the GNU General Public License as published by the Free
13 Software Foundation; either version 2, or (at your option) any later
14 version.
15
16 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
17 WARRANTY; without even the implied warranty of MERCHANTABILITY or
18 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
19 for more details.
20
21 You should have received a copy of the GNU General Public License
22 along with GCC; see the file COPYING.  If not, write to the Free
23 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
24 02110-1301, USA.  */
25 \f
26 #include "config.h"
27 #include "system.h"
28 #include "coretypes.h"
29 #include "tm.h"
30 #include "toplev.h"
31 #include "rtl.h"
32 #include "tm_p.h"
33 #include "hard-reg-set.h"
34 #include "regs.h"
35 #include "function.h"
36 #include "flags.h"
37 #include "insn-config.h"
38 #include "insn-attr.h"
39 #include "except.h"
40 #include "toplev.h"
41 #include "recog.h"
42 #include "sched-int.h"
43 #include "params.h"
44 #include "cselib.h"
45 #include "df.h"
46
47
48 static regset reg_pending_sets;
49 static regset reg_pending_clobbers;
50 static regset reg_pending_uses;
51
52 /* The following enumeration values tell us what dependencies we
53    should use to implement the barrier.  We use true-dependencies for
54    TRUE_BARRIER and anti-dependencies for MOVE_BARRIER.  */
55 enum reg_pending_barrier_mode
56 {
57   NOT_A_BARRIER = 0,
58   MOVE_BARRIER,
59   TRUE_BARRIER
60 };
61
62 static enum reg_pending_barrier_mode reg_pending_barrier;
63
64 /* To speed up the test for duplicate dependency links we keep a
65    record of dependencies created by add_dependence when the average
66    number of instructions in a basic block is very large.
67
68    Studies have shown that there is typically around 5 instructions between
69    branches for typical C code.  So we can make a guess that the average
70    basic block is approximately 5 instructions long; we will choose 100X
71    the average size as a very large basic block.
72
73    Each insn has associated bitmaps for its dependencies.  Each bitmap
74    has enough entries to represent a dependency on any other insn in
75    the insn chain.  All bitmap for true dependencies cache is
76    allocated then the rest two ones are also allocated.  */
77 static bitmap_head *true_dependency_cache;
78 static bitmap_head *output_dependency_cache;
79 static bitmap_head *anti_dependency_cache;
80 static bitmap_head *spec_dependency_cache;
81 static int cache_size;
82
83 /* To speed up checking consistency of formed forward insn
84    dependencies we use the following cache.  Another possible solution
85    could be switching off checking duplication of insns in forward
86    dependencies.  */
87 #ifdef ENABLE_CHECKING
88 static bitmap_head *forward_dependency_cache;
89 #endif
90
91 static int deps_may_trap_p (rtx);
92 static void add_dependence_list (rtx, rtx, int, enum reg_note);
93 static void add_dependence_list_and_free (rtx, rtx *, int, enum reg_note);
94 static void delete_all_dependences (rtx);
95 static void fixup_sched_groups (rtx);
96
97 static void flush_pending_lists (struct deps *, rtx, int, int);
98 static void sched_analyze_1 (struct deps *, rtx, rtx);
99 static void sched_analyze_2 (struct deps *, rtx, rtx);
100 static void sched_analyze_insn (struct deps *, rtx, rtx);
101
102 static rtx sched_get_condition (rtx);
103 static int conditions_mutex_p (rtx, rtx);
104
105 static enum DEPS_ADJUST_RESULT maybe_add_or_update_back_dep_1 (rtx, rtx, 
106                                enum reg_note, ds_t, rtx, rtx, rtx **);
107 static enum DEPS_ADJUST_RESULT add_or_update_back_dep_1 (rtx, rtx, 
108                                enum reg_note, ds_t, rtx, rtx, rtx **);
109 static void add_back_dep (rtx, rtx, enum reg_note, ds_t);
110
111 static void adjust_add_sorted_back_dep (rtx, rtx, rtx *);
112 static void adjust_back_add_forw_dep (rtx, rtx *);
113 static void delete_forw_dep (rtx, rtx);
114 static dw_t estimate_dep_weak (rtx, rtx);
115 #ifdef INSN_SCHEDULING
116 #ifdef ENABLE_CHECKING
117 static void check_dep_status (enum reg_note, ds_t, bool);
118 #endif
119 #endif
120 \f
121 /* Return nonzero if a load of the memory reference MEM can cause a trap.  */
122
123 static int
124 deps_may_trap_p (rtx mem)
125 {
126   rtx addr = XEXP (mem, 0);
127
128   if (REG_P (addr) && REGNO (addr) >= FIRST_PSEUDO_REGISTER)
129     {
130       rtx t = get_reg_known_value (REGNO (addr));
131       if (t)
132         addr = t;
133     }
134   return rtx_addr_can_trap_p (addr);
135 }
136 \f
137 /* Return the INSN_LIST containing INSN in LIST, or NULL
138    if LIST does not contain INSN.  */
139
140 rtx
141 find_insn_list (rtx insn, rtx list)
142 {
143   while (list)
144     {
145       if (XEXP (list, 0) == insn)
146         return list;
147       list = XEXP (list, 1);
148     }
149   return 0;
150 }
151 \f
152 /* Find the condition under which INSN is executed.  */
153
154 static rtx
155 sched_get_condition (rtx insn)
156 {
157   rtx pat = PATTERN (insn);
158   rtx src;
159
160   if (pat == 0)
161     return 0;
162
163   if (GET_CODE (pat) == COND_EXEC)
164     return COND_EXEC_TEST (pat);
165
166   if (!any_condjump_p (insn) || !onlyjump_p (insn))
167     return 0;
168
169   src = SET_SRC (pc_set (insn));
170
171   if (XEXP (src, 2) == pc_rtx)
172     return XEXP (src, 0);
173   else if (XEXP (src, 1) == pc_rtx)
174     {
175       rtx cond = XEXP (src, 0);
176       enum rtx_code revcode = reversed_comparison_code (cond, insn);
177
178       if (revcode == UNKNOWN)
179         return 0;
180       return gen_rtx_fmt_ee (revcode, GET_MODE (cond), XEXP (cond, 0),
181                              XEXP (cond, 1));
182     }
183
184   return 0;
185 }
186
187 \f
188 /* Return nonzero if conditions COND1 and COND2 can never be both true.  */
189
190 static int
191 conditions_mutex_p (rtx cond1, rtx cond2)
192 {
193   if (COMPARISON_P (cond1)
194       && COMPARISON_P (cond2)
195       && GET_CODE (cond1) == reversed_comparison_code (cond2, NULL)
196       && XEXP (cond1, 0) == XEXP (cond2, 0)
197       && XEXP (cond1, 1) == XEXP (cond2, 1))
198     return 1;
199   return 0;
200 }
201
202 /* Return true if insn1 and insn2 can never depend on one another because
203    the conditions under which they are executed are mutually exclusive.  */
204 bool
205 sched_insns_conditions_mutex_p (rtx insn1, rtx insn2)
206 {
207   rtx cond1, cond2;
208
209   /* flow.c doesn't handle conditional lifetimes entirely correctly;
210      calls mess up the conditional lifetimes.  */
211   if (!CALL_P (insn1) && !CALL_P (insn2))
212     {
213       cond1 = sched_get_condition (insn1);
214       cond2 = sched_get_condition (insn2);
215       if (cond1 && cond2
216           && conditions_mutex_p (cond1, cond2)
217           /* Make sure first instruction doesn't affect condition of second
218              instruction if switched.  */
219           && !modified_in_p (cond1, insn2)
220           /* Make sure second instruction doesn't affect condition of first
221              instruction if switched.  */
222           && !modified_in_p (cond2, insn1))
223         return true;
224     }
225   return false;
226 }
227 \f
228 /* Add ELEM wrapped in an INSN_LIST with reg note kind DEP_TYPE to the
229    LOG_LINKS of INSN, if it is not already there.  DEP_TYPE indicates the
230    type of dependence that this link represents.  DS, if non-zero,
231    indicates speculations, through which this dependence can be overcome.
232    MEM1 and MEM2, if non-null, corresponds to memory locations in case of
233    data speculation.  The function returns a value indicating if an old entry
234    has been changed or a new entry has been added to insn's LOG_LINK.
235    In case of changed entry CHANGED_LINKPP sets to its address.
236    See also the definition of enum DEPS_ADJUST_RESULT in sched-int.h.  
237    Actual manipulation of dependence data structures is performed in 
238    add_or_update_back_dep_1.  */
239
240 static enum DEPS_ADJUST_RESULT
241 maybe_add_or_update_back_dep_1 (rtx insn, rtx elem, enum reg_note dep_type,
242                                 ds_t ds, rtx mem1, rtx mem2,
243                                 rtx **changed_linkpp)
244 {
245   gcc_assert (INSN_P (insn) && INSN_P (elem));
246
247   /* Don't depend an insn on itself.  */
248   if (insn == elem)
249     {
250 #ifdef INSN_SCHEDULING
251       if (current_sched_info->flags & DO_SPECULATION)
252         /* INSN has an internal dependence, which we can't overcome.  */
253         HAS_INTERNAL_DEP (insn) = 1;
254 #endif
255       return 0;
256     }
257
258   return add_or_update_back_dep_1 (insn, elem, dep_type,
259                                    ds, mem1, mem2, changed_linkpp);
260 }
261
262 /* This function has the same meaning of parameters and return values
263    as maybe_add_or_update_back_dep_1.  The only difference between these
264    two functions is that INSN and ELEM are guaranteed not to be the same
265    in this one.  */
266 static enum DEPS_ADJUST_RESULT
267 add_or_update_back_dep_1 (rtx insn, rtx elem, enum reg_note dep_type, 
268                           ds_t ds ATTRIBUTE_UNUSED,
269                           rtx mem1 ATTRIBUTE_UNUSED, rtx mem2 ATTRIBUTE_UNUSED,
270                           rtx **changed_linkpp ATTRIBUTE_UNUSED)
271 {
272   bool maybe_present_p = true, present_p = false;
273
274   gcc_assert (INSN_P (insn) && INSN_P (elem) && insn != elem);
275   
276 #ifdef INSN_SCHEDULING
277
278 #ifdef ENABLE_CHECKING
279   check_dep_status (dep_type, ds, mem1 != NULL);
280 #endif
281
282   /* If we already have a dependency for ELEM, then we do not need to
283      do anything.  Avoiding the list walk below can cut compile times
284      dramatically for some code.  */
285   if (true_dependency_cache != NULL)
286     {
287       enum reg_note present_dep_type;
288       
289       gcc_assert (output_dependency_cache);
290       gcc_assert (anti_dependency_cache);
291       if (!(current_sched_info->flags & USE_DEPS_LIST))
292         {          
293           if (bitmap_bit_p (&true_dependency_cache[INSN_LUID (insn)],
294                             INSN_LUID (elem)))
295             present_dep_type = REG_DEP_TRUE;
296           else if (bitmap_bit_p (&output_dependency_cache[INSN_LUID (insn)],
297                                  INSN_LUID (elem)))
298             present_dep_type = REG_DEP_OUTPUT;
299           else if (bitmap_bit_p (&anti_dependency_cache[INSN_LUID (insn)],
300                                  INSN_LUID (elem)))
301             present_dep_type = REG_DEP_ANTI;
302           else
303             maybe_present_p = false;
304
305           if (maybe_present_p)
306             {
307               if ((int) dep_type >= (int) present_dep_type)
308                 return DEP_PRESENT;
309               
310               present_p = true;
311             }
312         }
313       else
314         {      
315           ds_t present_dep_types = 0;
316           
317           if (bitmap_bit_p (&true_dependency_cache[INSN_LUID (insn)],
318                             INSN_LUID (elem)))
319             present_dep_types |= DEP_TRUE;
320           if (bitmap_bit_p (&output_dependency_cache[INSN_LUID (insn)],
321                             INSN_LUID (elem)))
322             present_dep_types |= DEP_OUTPUT;
323           if (bitmap_bit_p (&anti_dependency_cache[INSN_LUID (insn)],
324                             INSN_LUID (elem)))
325             present_dep_types |= DEP_ANTI;
326
327           if (present_dep_types)
328             {
329               if (!(current_sched_info->flags & DO_SPECULATION)
330                   || !bitmap_bit_p (&spec_dependency_cache[INSN_LUID (insn)],
331                                     INSN_LUID (elem)))
332                 {
333                   if ((present_dep_types | (ds & DEP_TYPES))
334                       == present_dep_types)
335                     /* We already have all these bits.  */
336                     return DEP_PRESENT;
337                 }
338               else
339                 {
340                   /* Only true dependencies can be data speculative and
341                      only anti dependencies can be control speculative.  */
342                   gcc_assert ((present_dep_types & (DEP_TRUE | DEP_ANTI))
343                               == present_dep_types);
344                   
345                   /* if (additional dep is SPECULATIVE) then
346                        we should update DEP_STATUS
347                      else
348                        we should reset existing dep to non-speculative.  */
349                 }
350                 
351               present_p = true;
352             }
353           else
354             maybe_present_p = false;
355         }
356     }
357 #endif
358
359   /* Check that we don't already have this dependence.  */
360   if (maybe_present_p)
361     {
362       rtx *linkp;
363
364       for (linkp = &LOG_LINKS (insn); *linkp; linkp = &XEXP (*linkp, 1))
365         {
366           rtx link = *linkp;
367
368           gcc_assert (true_dependency_cache == 0 || present_p);
369           
370           if (XEXP (link, 0) == elem)
371             {
372               enum DEPS_ADJUST_RESULT changed_p = DEP_PRESENT;
373
374 #ifdef INSN_SCHEDULING
375               if (current_sched_info->flags & USE_DEPS_LIST)
376                 {
377                   ds_t new_status = ds | DEP_STATUS (link);
378
379                   if (new_status & SPECULATIVE)
380                     {
381                       if (!(ds & SPECULATIVE)
382                           || !(DEP_STATUS (link) & SPECULATIVE))
383                         /* Then this dep can't be speculative.  */
384                         {
385                           new_status &= ~SPECULATIVE;
386                           if (true_dependency_cache
387                               && (DEP_STATUS (link) & SPECULATIVE))
388                             bitmap_clear_bit (&spec_dependency_cache
389                                               [INSN_LUID (insn)],
390                                               INSN_LUID (elem));
391                         }
392                       else
393                         {
394                           /* Both are speculative.  Merging probabilities.  */
395                           if (mem1)
396                             {
397                               dw_t dw;
398
399                               dw = estimate_dep_weak (mem1, mem2);
400                               ds = set_dep_weak (ds, BEGIN_DATA, dw);
401                             }
402                                                          
403                           new_status = ds_merge (DEP_STATUS (link), ds);
404                         }
405                     }
406
407                   ds = new_status;
408                 }
409
410               /* Clear corresponding cache entry because type of the link
411                  may have changed.  Keep them if we use_deps_list.  */
412               if (true_dependency_cache != NULL
413                   && !(current_sched_info->flags & USE_DEPS_LIST))
414                 {
415                   enum reg_note kind = REG_NOTE_KIND (link);
416
417                   switch (kind)
418                     {
419                     case REG_DEP_OUTPUT:
420                       bitmap_clear_bit (&output_dependency_cache
421                                         [INSN_LUID (insn)], INSN_LUID (elem));
422                       break;
423                     case REG_DEP_ANTI:
424                       bitmap_clear_bit (&anti_dependency_cache
425                                         [INSN_LUID (insn)], INSN_LUID (elem));
426                       break;
427                     default:
428                       gcc_unreachable ();                        
429                     }
430                 }
431
432               if ((current_sched_info->flags & USE_DEPS_LIST)
433                   && DEP_STATUS (link) != ds)
434                 {
435                   DEP_STATUS (link) = ds;
436                   changed_p = DEP_CHANGED;
437                 }
438 #endif
439
440               /* If this is a more restrictive type of dependence than the
441                  existing one, then change the existing dependence to this
442                  type.  */
443               if ((int) dep_type < (int) REG_NOTE_KIND (link))
444                 {
445                   PUT_REG_NOTE_KIND (link, dep_type);
446                   changed_p = DEP_CHANGED;
447                 }
448
449 #ifdef INSN_SCHEDULING
450               /* If we are adding a dependency to INSN's LOG_LINKs, then
451                  note that in the bitmap caches of dependency information.  */
452               if (true_dependency_cache != NULL)
453                 {
454                   if (!(current_sched_info->flags & USE_DEPS_LIST))
455                     {
456                       if (REG_NOTE_KIND (link) == REG_DEP_TRUE)
457                         bitmap_set_bit (&true_dependency_cache
458                                         [INSN_LUID (insn)], INSN_LUID (elem));
459                       else if (REG_NOTE_KIND (link) == REG_DEP_OUTPUT)
460                         bitmap_set_bit (&output_dependency_cache
461                                         [INSN_LUID (insn)], INSN_LUID (elem));
462                       else if (REG_NOTE_KIND (link) == REG_DEP_ANTI)
463                         bitmap_set_bit (&anti_dependency_cache
464                                         [INSN_LUID (insn)], INSN_LUID (elem));
465                     }
466                   else
467                     {
468                       if (ds & DEP_TRUE)
469                         bitmap_set_bit (&true_dependency_cache
470                                         [INSN_LUID (insn)], INSN_LUID (elem));
471                       if (ds & DEP_OUTPUT)
472                         bitmap_set_bit (&output_dependency_cache
473                                         [INSN_LUID (insn)], INSN_LUID (elem));
474                       if (ds & DEP_ANTI)
475                         bitmap_set_bit (&anti_dependency_cache
476                                         [INSN_LUID (insn)], INSN_LUID (elem));
477                       /* Note, that dep can become speculative only 
478                          at the moment of creation. Thus, we don't need to 
479                          check for it here.  */
480                     }
481                 }
482               
483               if (changed_linkpp && changed_p == DEP_CHANGED)
484                 *changed_linkpp = linkp;
485 #endif
486               return changed_p;
487             }     
488         }
489       /* We didn't find a dep. It shouldn't be present in the cache.  */
490       gcc_assert (!present_p);
491     }
492
493   /* Might want to check one level of transitivity to save conses.
494      This check should be done in maybe_add_or_update_back_dep_1.
495      Since we made it to add_or_update_back_dep_1, we must create
496      (or update) a link.  */
497
498   if (mem1)
499     {
500       gcc_assert (current_sched_info->flags & DO_SPECULATION);
501       ds = set_dep_weak (ds, BEGIN_DATA, estimate_dep_weak (mem1, mem2));
502     }
503   
504   add_back_dep (insn, elem, dep_type, ds);
505   
506   return DEP_CREATED;
507 }
508
509 /* This function creates a link between INSN and ELEM under any
510    conditions.  DS describes speculative status of the link.  */
511 static void
512 add_back_dep (rtx insn, rtx elem, enum reg_note dep_type, ds_t ds)
513 {
514   gcc_assert (INSN_P (insn) && INSN_P (elem) && insn != elem);
515
516   if (current_sched_info->flags & USE_DEPS_LIST)
517     LOG_LINKS (insn) = alloc_DEPS_LIST (elem, LOG_LINKS (insn), ds);
518   else
519     LOG_LINKS (insn) = alloc_INSN_LIST (elem, LOG_LINKS (insn));
520   
521   /* Insn dependency, not data dependency.  */
522   PUT_REG_NOTE_KIND (LOG_LINKS (insn), dep_type);
523     
524 #ifdef INSN_SCHEDULING
525 #ifdef ENABLE_CHECKING
526   check_dep_status (dep_type, ds, false);
527 #endif
528
529   /* If we are adding a dependency to INSN's LOG_LINKs, then note that
530      in the bitmap caches of dependency information.  */
531   if (true_dependency_cache != NULL)
532     {
533       if (!(current_sched_info->flags & USE_DEPS_LIST))
534         {
535           if (dep_type == REG_DEP_TRUE)
536             bitmap_set_bit (&true_dependency_cache[INSN_LUID (insn)],
537                             INSN_LUID (elem));
538           else if (dep_type == REG_DEP_OUTPUT)
539             bitmap_set_bit (&output_dependency_cache[INSN_LUID (insn)],
540                             INSN_LUID (elem));
541           else if (dep_type == REG_DEP_ANTI)
542                 bitmap_set_bit (&anti_dependency_cache[INSN_LUID (insn)],
543                                 INSN_LUID (elem));
544         }
545       else
546         {
547           if (ds & DEP_TRUE)
548             bitmap_set_bit (&true_dependency_cache[INSN_LUID (insn)],
549                             INSN_LUID (elem));
550           if (ds & DEP_OUTPUT)
551             bitmap_set_bit (&output_dependency_cache[INSN_LUID (insn)],
552                             INSN_LUID (elem));
553           if (ds & DEP_ANTI)
554             bitmap_set_bit (&anti_dependency_cache[INSN_LUID (insn)],
555                             INSN_LUID (elem));
556           if (ds & SPECULATIVE)
557             {
558               gcc_assert (current_sched_info->flags & DO_SPECULATION);
559               bitmap_set_bit (&spec_dependency_cache[INSN_LUID (insn)],
560                               INSN_LUID (elem));
561             }
562         }
563     }
564 #endif
565 }
566
567 /* A convenience wrapper to operate on an entire list.  */
568
569 static void
570 add_dependence_list (rtx insn, rtx list, int uncond, enum reg_note dep_type)
571 {
572   for (; list; list = XEXP (list, 1))
573     {
574       if (uncond || ! sched_insns_conditions_mutex_p (insn, XEXP (list, 0)))
575         add_dependence (insn, XEXP (list, 0), dep_type);
576     }
577 }
578
579 /* Similar, but free *LISTP at the same time.  */
580
581 static void
582 add_dependence_list_and_free (rtx insn, rtx *listp, int uncond,
583                               enum reg_note dep_type)
584 {
585   rtx list, next;
586   for (list = *listp, *listp = NULL; list ; list = next)
587     {
588       next = XEXP (list, 1);
589       if (uncond || ! sched_insns_conditions_mutex_p (insn, XEXP (list, 0)))
590         add_dependence (insn, XEXP (list, 0), dep_type);
591       free_INSN_LIST_node (list);
592     }
593 }
594
595 /* Clear all dependencies for an insn.  */
596
597 static void
598 delete_all_dependences (rtx insn)
599 {
600   /* Clear caches, if they exist, as well as free the dependence.  */
601
602 #ifdef INSN_SCHEDULING
603   if (true_dependency_cache != NULL)
604     {
605       bitmap_clear (&true_dependency_cache[INSN_LUID (insn)]);
606       bitmap_clear (&output_dependency_cache[INSN_LUID (insn)]);
607       bitmap_clear (&anti_dependency_cache[INSN_LUID (insn)]);
608       /* We don't have to clear forward_dependency_cache here,
609          because it is formed later.  */
610       if (current_sched_info->flags & DO_SPECULATION)
611         bitmap_clear (&spec_dependency_cache[INSN_LUID (insn)]);
612     }
613 #endif
614
615   if (!(current_sched_info->flags & USE_DEPS_LIST))
616     /* In this case LOG_LINKS are formed from the DEPS_LISTs,
617        not the INSN_LISTs.  */
618     free_INSN_LIST_list (&LOG_LINKS (insn));  
619   else
620     free_DEPS_LIST_list (&LOG_LINKS (insn));
621 }
622
623 /* All insns in a scheduling group except the first should only have
624    dependencies on the previous insn in the group.  So we find the
625    first instruction in the scheduling group by walking the dependence
626    chains backwards. Then we add the dependencies for the group to
627    the previous nonnote insn.  */
628
629 static void
630 fixup_sched_groups (rtx insn)
631 {
632   rtx link, prev_nonnote;
633
634   for (link = LOG_LINKS (insn); link ; link = XEXP (link, 1))
635     {
636       rtx i = insn;
637       do
638         {
639           i = prev_nonnote_insn (i);
640
641           if (XEXP (link, 0) == i)
642             goto next_link;
643         } while (SCHED_GROUP_P (i));
644       if (! sched_insns_conditions_mutex_p (i, XEXP (link, 0)))
645         add_dependence (i, XEXP (link, 0), REG_NOTE_KIND (link));
646     next_link:;
647     }
648
649   delete_all_dependences (insn);
650
651   prev_nonnote = prev_nonnote_insn (insn);
652   if (BLOCK_FOR_INSN (insn) == BLOCK_FOR_INSN (prev_nonnote)
653       && ! sched_insns_conditions_mutex_p (insn, prev_nonnote))
654     add_dependence (insn, prev_nonnote, REG_DEP_ANTI);
655 }
656 \f
657 /* Process an insn's memory dependencies.  There are four kinds of
658    dependencies:
659
660    (0) read dependence: read follows read
661    (1) true dependence: read follows write
662    (2) output dependence: write follows write
663    (3) anti dependence: write follows read
664
665    We are careful to build only dependencies which actually exist, and
666    use transitivity to avoid building too many links.  */
667
668 /* Add an INSN and MEM reference pair to a pending INSN_LIST and MEM_LIST.
669    The MEM is a memory reference contained within INSN, which we are saving
670    so that we can do memory aliasing on it.  */
671
672 static void
673 add_insn_mem_dependence (struct deps *deps, rtx *insn_list, rtx *mem_list,
674                          rtx insn, rtx mem)
675 {
676   rtx link;
677
678   link = alloc_INSN_LIST (insn, *insn_list);
679   *insn_list = link;
680
681   if (current_sched_info->use_cselib)
682     {
683       mem = shallow_copy_rtx (mem);
684       XEXP (mem, 0) = cselib_subst_to_values (XEXP (mem, 0));
685     }
686   link = alloc_EXPR_LIST (VOIDmode, canon_rtx (mem), *mem_list);
687   *mem_list = link;
688
689   deps->pending_lists_length++;
690 }
691
692 /* Make a dependency between every memory reference on the pending lists
693    and INSN, thus flushing the pending lists.  FOR_READ is true if emitting
694    dependencies for a read operation, similarly with FOR_WRITE.  */
695
696 static void
697 flush_pending_lists (struct deps *deps, rtx insn, int for_read,
698                      int for_write)
699 {
700   if (for_write)
701     {
702       add_dependence_list_and_free (insn, &deps->pending_read_insns, 1,
703                                     REG_DEP_ANTI);
704       free_EXPR_LIST_list (&deps->pending_read_mems);
705     }
706
707   add_dependence_list_and_free (insn, &deps->pending_write_insns, 1,
708                                 for_read ? REG_DEP_ANTI : REG_DEP_OUTPUT);
709   free_EXPR_LIST_list (&deps->pending_write_mems);
710   deps->pending_lists_length = 0;
711
712   add_dependence_list_and_free (insn, &deps->last_pending_memory_flush, 1,
713                                 for_read ? REG_DEP_ANTI : REG_DEP_OUTPUT);
714   deps->last_pending_memory_flush = alloc_INSN_LIST (insn, NULL_RTX);
715   deps->pending_flush_length = 1;
716 }
717 \f
718 /* Analyze a single SET, CLOBBER, PRE_DEC, POST_DEC, PRE_INC or POST_INC
719    rtx, X, creating all dependencies generated by the write to the
720    destination of X, and reads of everything mentioned.  */
721
722 static void
723 sched_analyze_1 (struct deps *deps, rtx x, rtx insn)
724 {
725   int regno;
726   rtx dest = XEXP (x, 0);
727   enum rtx_code code = GET_CODE (x);
728
729   if (dest == 0)
730     return;
731
732   if (GET_CODE (dest) == PARALLEL)
733     {
734       int i;
735
736       for (i = XVECLEN (dest, 0) - 1; i >= 0; i--)
737         if (XEXP (XVECEXP (dest, 0, i), 0) != 0)
738           sched_analyze_1 (deps,
739                            gen_rtx_CLOBBER (VOIDmode,
740                                             XEXP (XVECEXP (dest, 0, i), 0)),
741                            insn);
742
743       if (GET_CODE (x) == SET)
744         sched_analyze_2 (deps, SET_SRC (x), insn);
745       return;
746     }
747
748   while (GET_CODE (dest) == STRICT_LOW_PART || GET_CODE (dest) == SUBREG
749          || GET_CODE (dest) == ZERO_EXTRACT)
750     {
751       if (GET_CODE (dest) == STRICT_LOW_PART
752          || GET_CODE (dest) == ZERO_EXTRACT
753          || df_read_modify_subreg_p (dest))
754         {
755           /* These both read and modify the result.  We must handle
756              them as writes to get proper dependencies for following
757              instructions.  We must handle them as reads to get proper
758              dependencies from this to previous instructions.
759              Thus we need to call sched_analyze_2.  */
760
761           sched_analyze_2 (deps, XEXP (dest, 0), insn);
762         }
763       if (GET_CODE (dest) == ZERO_EXTRACT)
764         {
765           /* The second and third arguments are values read by this insn.  */
766           sched_analyze_2 (deps, XEXP (dest, 1), insn);
767           sched_analyze_2 (deps, XEXP (dest, 2), insn);
768         }
769       dest = XEXP (dest, 0);
770     }
771
772   if (REG_P (dest))
773     {
774       regno = REGNO (dest);
775
776 #ifdef STACK_REGS
777       /* Treat all writes to a stack register as modifying the TOS.  */
778       if (regno >= FIRST_STACK_REG && regno <= LAST_STACK_REG)
779         {
780           SET_REGNO_REG_SET (reg_pending_uses, FIRST_STACK_REG);
781           regno = FIRST_STACK_REG;
782         }
783 #endif
784
785       /* A hard reg in a wide mode may really be multiple registers.
786          If so, mark all of them just like the first.  */
787       if (regno < FIRST_PSEUDO_REGISTER)
788         {
789           int i = hard_regno_nregs[regno][GET_MODE (dest)];
790           if (code == SET)
791             {
792               while (--i >= 0)
793                 SET_REGNO_REG_SET (reg_pending_sets, regno + i);
794             }
795           else
796             {
797               while (--i >= 0)
798                 SET_REGNO_REG_SET (reg_pending_clobbers, regno + i);
799             }
800         }
801       /* ??? Reload sometimes emits USEs and CLOBBERs of pseudos that
802          it does not reload.  Ignore these as they have served their
803          purpose already.  */
804       else if (regno >= deps->max_reg)
805         {
806           gcc_assert (GET_CODE (PATTERN (insn)) == USE
807                       || GET_CODE (PATTERN (insn)) == CLOBBER);
808         }
809       else
810         {
811           if (code == SET)
812             SET_REGNO_REG_SET (reg_pending_sets, regno);
813           else
814             SET_REGNO_REG_SET (reg_pending_clobbers, regno);
815
816           /* Pseudos that are REG_EQUIV to something may be replaced
817              by that during reloading.  We need only add dependencies for
818              the address in the REG_EQUIV note.  */
819           if (!reload_completed && get_reg_known_equiv_p (regno))
820             {
821               rtx t = get_reg_known_value (regno);
822               if (MEM_P (t))
823                 sched_analyze_2 (deps, XEXP (t, 0), insn);
824             }
825
826           /* Don't let it cross a call after scheduling if it doesn't
827              already cross one.  */
828           if (REG_N_CALLS_CROSSED (regno) == 0)
829             add_dependence_list (insn, deps->last_function_call, 1,
830                                  REG_DEP_ANTI);
831         }
832     }
833   else if (MEM_P (dest))
834     {
835       /* Writing memory.  */
836       rtx t = dest;
837
838       if (current_sched_info->use_cselib)
839         {
840           t = shallow_copy_rtx (dest);
841           cselib_lookup (XEXP (t, 0), Pmode, 1);
842           XEXP (t, 0) = cselib_subst_to_values (XEXP (t, 0));
843         }
844       t = canon_rtx (t);
845
846       if (deps->pending_lists_length > MAX_PENDING_LIST_LENGTH)
847         {
848           /* Flush all pending reads and writes to prevent the pending lists
849              from getting any larger.  Insn scheduling runs too slowly when
850              these lists get long.  When compiling GCC with itself,
851              this flush occurs 8 times for sparc, and 10 times for m88k using
852              the default value of 32.  */
853           flush_pending_lists (deps, insn, false, true);
854         }
855       else
856         {
857           rtx pending, pending_mem;
858
859           pending = deps->pending_read_insns;
860           pending_mem = deps->pending_read_mems;
861           while (pending)
862             {
863               if (anti_dependence (XEXP (pending_mem, 0), t)
864                   && ! sched_insns_conditions_mutex_p (insn, XEXP (pending, 0)))
865                 add_dependence (insn, XEXP (pending, 0), REG_DEP_ANTI);
866
867               pending = XEXP (pending, 1);
868               pending_mem = XEXP (pending_mem, 1);
869             }
870
871           pending = deps->pending_write_insns;
872           pending_mem = deps->pending_write_mems;
873           while (pending)
874             {
875               if (output_dependence (XEXP (pending_mem, 0), t)
876                   && ! sched_insns_conditions_mutex_p (insn, XEXP (pending, 0)))
877                 add_dependence (insn, XEXP (pending, 0), REG_DEP_OUTPUT);
878
879               pending = XEXP (pending, 1);
880               pending_mem = XEXP (pending_mem, 1);
881             }
882
883           add_dependence_list (insn, deps->last_pending_memory_flush, 1,
884                                REG_DEP_ANTI);
885
886           add_insn_mem_dependence (deps, &deps->pending_write_insns,
887                                    &deps->pending_write_mems, insn, dest);
888         }
889       sched_analyze_2 (deps, XEXP (dest, 0), insn);
890     }
891
892   /* Analyze reads.  */
893   if (GET_CODE (x) == SET)
894     sched_analyze_2 (deps, SET_SRC (x), insn);
895 }
896
897 /* Analyze the uses of memory and registers in rtx X in INSN.  */
898
899 static void
900 sched_analyze_2 (struct deps *deps, rtx x, rtx insn)
901 {
902   int i;
903   int j;
904   enum rtx_code code;
905   const char *fmt;
906
907   if (x == 0)
908     return;
909
910   code = GET_CODE (x);
911
912   switch (code)
913     {
914     case CONST_INT:
915     case CONST_DOUBLE:
916     case CONST_VECTOR:
917     case SYMBOL_REF:
918     case CONST:
919     case LABEL_REF:
920       /* Ignore constants.  Note that we must handle CONST_DOUBLE here
921          because it may have a cc0_rtx in its CONST_DOUBLE_CHAIN field, but
922          this does not mean that this insn is using cc0.  */
923       return;
924
925 #ifdef HAVE_cc0
926     case CC0:
927       /* User of CC0 depends on immediately preceding insn.  */
928       SCHED_GROUP_P (insn) = 1;
929        /* Don't move CC0 setter to another block (it can set up the
930         same flag for previous CC0 users which is safe).  */
931       CANT_MOVE (prev_nonnote_insn (insn)) = 1;
932       return;
933 #endif
934
935     case REG:
936       {
937         int regno = REGNO (x);
938
939 #ifdef STACK_REGS
940       /* Treat all reads of a stack register as modifying the TOS.  */
941       if (regno >= FIRST_STACK_REG && regno <= LAST_STACK_REG)
942         {
943           SET_REGNO_REG_SET (reg_pending_sets, FIRST_STACK_REG);
944           regno = FIRST_STACK_REG;
945         }
946 #endif
947
948         if (regno < FIRST_PSEUDO_REGISTER)
949           {
950             int i = hard_regno_nregs[regno][GET_MODE (x)];
951             while (--i >= 0)
952               SET_REGNO_REG_SET (reg_pending_uses, regno + i);
953           }
954         /* ??? Reload sometimes emits USEs and CLOBBERs of pseudos that
955            it does not reload.  Ignore these as they have served their
956            purpose already.  */
957         else if (regno >= deps->max_reg)
958           {
959             gcc_assert (GET_CODE (PATTERN (insn)) == USE
960                         || GET_CODE (PATTERN (insn)) == CLOBBER);
961           }
962         else
963           {
964             SET_REGNO_REG_SET (reg_pending_uses, regno);
965
966             /* Pseudos that are REG_EQUIV to something may be replaced
967                by that during reloading.  We need only add dependencies for
968                the address in the REG_EQUIV note.  */
969             if (!reload_completed && get_reg_known_equiv_p (regno))
970               {
971                 rtx t = get_reg_known_value (regno);
972                 if (MEM_P (t))
973                   sched_analyze_2 (deps, XEXP (t, 0), insn);
974               }
975
976             /* If the register does not already cross any calls, then add this
977                insn to the sched_before_next_call list so that it will still
978                not cross calls after scheduling.  */
979             if (REG_N_CALLS_CROSSED (regno) == 0)
980               deps->sched_before_next_call
981                 = alloc_INSN_LIST (insn, deps->sched_before_next_call);
982           }
983         return;
984       }
985
986     case MEM:
987       {
988         /* Reading memory.  */
989         rtx u;
990         rtx pending, pending_mem;
991         rtx t = x;
992
993         if (current_sched_info->use_cselib)
994           {
995             t = shallow_copy_rtx (t);
996             cselib_lookup (XEXP (t, 0), Pmode, 1);
997             XEXP (t, 0) = cselib_subst_to_values (XEXP (t, 0));
998           }
999         t = canon_rtx (t);
1000         pending = deps->pending_read_insns;
1001         pending_mem = deps->pending_read_mems;
1002         while (pending)
1003           {
1004             if (read_dependence (XEXP (pending_mem, 0), t)
1005                 && ! sched_insns_conditions_mutex_p (insn, XEXP (pending, 0)))
1006               add_dependence (insn, XEXP (pending, 0), REG_DEP_ANTI);
1007
1008             pending = XEXP (pending, 1);
1009             pending_mem = XEXP (pending_mem, 1);
1010           }
1011
1012         pending = deps->pending_write_insns;
1013         pending_mem = deps->pending_write_mems;
1014         while (pending)
1015           {
1016             if (true_dependence (XEXP (pending_mem, 0), VOIDmode,
1017                                  t, rtx_varies_p)
1018                 && ! sched_insns_conditions_mutex_p (insn, XEXP (pending, 0)))
1019               {
1020                 if (current_sched_info->flags & DO_SPECULATION)
1021                   maybe_add_or_update_back_dep_1 (insn, XEXP (pending, 0),
1022                                                   REG_DEP_TRUE,
1023                                                   BEGIN_DATA | DEP_TRUE,
1024                                                   XEXP (pending_mem, 0), t, 0);
1025                 else
1026                   add_dependence (insn, XEXP (pending, 0), REG_DEP_TRUE);
1027               }
1028
1029             pending = XEXP (pending, 1);
1030             pending_mem = XEXP (pending_mem, 1);
1031           }
1032
1033         for (u = deps->last_pending_memory_flush; u; u = XEXP (u, 1))
1034           if (! JUMP_P (XEXP (u, 0)) || deps_may_trap_p (x))
1035             add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI);
1036
1037         /* Always add these dependencies to pending_reads, since
1038            this insn may be followed by a write.  */
1039         add_insn_mem_dependence (deps, &deps->pending_read_insns,
1040                                  &deps->pending_read_mems, insn, x);
1041
1042         /* Take advantage of tail recursion here.  */
1043         sched_analyze_2 (deps, XEXP (x, 0), insn);
1044         return;
1045       }
1046
1047     /* Force pending stores to memory in case a trap handler needs them.  */
1048     case TRAP_IF:
1049       flush_pending_lists (deps, insn, true, false);
1050       break;
1051
1052     case ASM_OPERANDS:
1053     case ASM_INPUT:
1054     case UNSPEC_VOLATILE:
1055       {
1056         /* Traditional and volatile asm instructions must be considered to use
1057            and clobber all hard registers, all pseudo-registers and all of
1058            memory.  So must TRAP_IF and UNSPEC_VOLATILE operations.
1059
1060            Consider for instance a volatile asm that changes the fpu rounding
1061            mode.  An insn should not be moved across this even if it only uses
1062            pseudo-regs because it might give an incorrectly rounded result.  */
1063         if (code != ASM_OPERANDS || MEM_VOLATILE_P (x))
1064           reg_pending_barrier = TRUE_BARRIER;
1065
1066         /* For all ASM_OPERANDS, we must traverse the vector of input operands.
1067            We can not just fall through here since then we would be confused
1068            by the ASM_INPUT rtx inside ASM_OPERANDS, which do not indicate
1069            traditional asms unlike their normal usage.  */
1070
1071         if (code == ASM_OPERANDS)
1072           {
1073             for (j = 0; j < ASM_OPERANDS_INPUT_LENGTH (x); j++)
1074               sched_analyze_2 (deps, ASM_OPERANDS_INPUT (x, j), insn);
1075             return;
1076           }
1077         break;
1078       }
1079
1080     case PRE_DEC:
1081     case POST_DEC:
1082     case PRE_INC:
1083     case POST_INC:
1084       /* These both read and modify the result.  We must handle them as writes
1085          to get proper dependencies for following instructions.  We must handle
1086          them as reads to get proper dependencies from this to previous
1087          instructions.  Thus we need to pass them to both sched_analyze_1
1088          and sched_analyze_2.  We must call sched_analyze_2 first in order
1089          to get the proper antecedent for the read.  */
1090       sched_analyze_2 (deps, XEXP (x, 0), insn);
1091       sched_analyze_1 (deps, x, insn);
1092       return;
1093
1094     case POST_MODIFY:
1095     case PRE_MODIFY:
1096       /* op0 = op0 + op1 */
1097       sched_analyze_2 (deps, XEXP (x, 0), insn);
1098       sched_analyze_2 (deps, XEXP (x, 1), insn);
1099       sched_analyze_1 (deps, x, insn);
1100       return;
1101
1102     default:
1103       break;
1104     }
1105
1106   /* Other cases: walk the insn.  */
1107   fmt = GET_RTX_FORMAT (code);
1108   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1109     {
1110       if (fmt[i] == 'e')
1111         sched_analyze_2 (deps, XEXP (x, i), insn);
1112       else if (fmt[i] == 'E')
1113         for (j = 0; j < XVECLEN (x, i); j++)
1114           sched_analyze_2 (deps, XVECEXP (x, i, j), insn);
1115     }
1116 }
1117
1118 /* Analyze an INSN with pattern X to find all dependencies.  */
1119
1120 static void
1121 sched_analyze_insn (struct deps *deps, rtx x, rtx insn)
1122 {
1123   RTX_CODE code = GET_CODE (x);
1124   rtx link;
1125   unsigned i;
1126   reg_set_iterator rsi;
1127
1128   if (code == COND_EXEC)
1129     {
1130       sched_analyze_2 (deps, COND_EXEC_TEST (x), insn);
1131
1132       /* ??? Should be recording conditions so we reduce the number of
1133          false dependencies.  */
1134       x = COND_EXEC_CODE (x);
1135       code = GET_CODE (x);
1136     }
1137   if (code == SET || code == CLOBBER)
1138     {
1139       sched_analyze_1 (deps, x, insn);
1140
1141       /* Bare clobber insns are used for letting life analysis, reg-stack
1142          and others know that a value is dead.  Depend on the last call
1143          instruction so that reg-stack won't get confused.  */
1144       if (code == CLOBBER)
1145         add_dependence_list (insn, deps->last_function_call, 1, REG_DEP_OUTPUT);
1146     }
1147   else if (code == PARALLEL)
1148     {
1149       for (i = XVECLEN (x, 0); i--;)
1150         {
1151           rtx sub = XVECEXP (x, 0, i);
1152           code = GET_CODE (sub);
1153
1154           if (code == COND_EXEC)
1155             {
1156               sched_analyze_2 (deps, COND_EXEC_TEST (sub), insn);
1157               sub = COND_EXEC_CODE (sub);
1158               code = GET_CODE (sub);
1159             }
1160           if (code == SET || code == CLOBBER)
1161             sched_analyze_1 (deps, sub, insn);
1162           else
1163             sched_analyze_2 (deps, sub, insn);
1164         }
1165     }
1166   else
1167     sched_analyze_2 (deps, x, insn);
1168
1169   /* Mark registers CLOBBERED or used by called function.  */
1170   if (CALL_P (insn))
1171     {
1172       for (link = CALL_INSN_FUNCTION_USAGE (insn); link; link = XEXP (link, 1))
1173         {
1174           if (GET_CODE (XEXP (link, 0)) == CLOBBER)
1175             sched_analyze_1 (deps, XEXP (link, 0), insn);
1176           else
1177             sched_analyze_2 (deps, XEXP (link, 0), insn);
1178         }
1179       if (find_reg_note (insn, REG_SETJMP, NULL))
1180         reg_pending_barrier = MOVE_BARRIER;
1181     }
1182
1183   if (JUMP_P (insn))
1184     {
1185       rtx next;
1186       next = next_nonnote_insn (insn);
1187       if (next && BARRIER_P (next))
1188         reg_pending_barrier = TRUE_BARRIER;
1189       else
1190         {
1191           rtx pending, pending_mem;
1192           regset_head tmp_uses, tmp_sets;
1193           INIT_REG_SET (&tmp_uses);
1194           INIT_REG_SET (&tmp_sets);
1195
1196           (*current_sched_info->compute_jump_reg_dependencies)
1197             (insn, &deps->reg_conditional_sets, &tmp_uses, &tmp_sets);
1198           /* Make latency of jump equal to 0 by using anti-dependence.  */
1199           EXECUTE_IF_SET_IN_REG_SET (&tmp_uses, 0, i, rsi)
1200             {
1201               struct deps_reg *reg_last = &deps->reg_last[i];
1202               add_dependence_list (insn, reg_last->sets, 0, REG_DEP_ANTI);
1203               add_dependence_list (insn, reg_last->clobbers, 0, REG_DEP_ANTI);
1204               reg_last->uses_length++;
1205               reg_last->uses = alloc_INSN_LIST (insn, reg_last->uses);
1206             }
1207           IOR_REG_SET (reg_pending_sets, &tmp_sets);
1208
1209           CLEAR_REG_SET (&tmp_uses);
1210           CLEAR_REG_SET (&tmp_sets);
1211
1212           /* All memory writes and volatile reads must happen before the
1213              jump.  Non-volatile reads must happen before the jump iff
1214              the result is needed by the above register used mask.  */
1215
1216           pending = deps->pending_write_insns;
1217           pending_mem = deps->pending_write_mems;
1218           while (pending)
1219             {
1220               if (! sched_insns_conditions_mutex_p (insn, XEXP (pending, 0)))
1221                 add_dependence (insn, XEXP (pending, 0), REG_DEP_OUTPUT);
1222               pending = XEXP (pending, 1);
1223               pending_mem = XEXP (pending_mem, 1);
1224             }
1225
1226           pending = deps->pending_read_insns;
1227           pending_mem = deps->pending_read_mems;
1228           while (pending)
1229             {
1230               if (MEM_VOLATILE_P (XEXP (pending_mem, 0))
1231                   && ! sched_insns_conditions_mutex_p (insn, XEXP (pending, 0)))
1232                 add_dependence (insn, XEXP (pending, 0), REG_DEP_OUTPUT);
1233               pending = XEXP (pending, 1);
1234               pending_mem = XEXP (pending_mem, 1);
1235             }
1236
1237           add_dependence_list (insn, deps->last_pending_memory_flush, 1,
1238                                REG_DEP_ANTI);
1239         }
1240     }
1241
1242   /* If this instruction can throw an exception, then moving it changes
1243      where block boundaries fall.  This is mighty confusing elsewhere.
1244      Therefore, prevent such an instruction from being moved.  */
1245   if (can_throw_internal (insn))
1246     reg_pending_barrier = MOVE_BARRIER;
1247
1248   /* Add dependencies if a scheduling barrier was found.  */
1249   if (reg_pending_barrier)
1250     {
1251       /* In the case of barrier the most added dependencies are not
1252          real, so we use anti-dependence here.  */
1253       if (sched_get_condition (insn))
1254         {
1255           EXECUTE_IF_SET_IN_REG_SET (&deps->reg_last_in_use, 0, i, rsi)
1256             {
1257               struct deps_reg *reg_last = &deps->reg_last[i];
1258               add_dependence_list (insn, reg_last->uses, 0, REG_DEP_ANTI);
1259               add_dependence_list
1260                 (insn, reg_last->sets, 0,
1261                  reg_pending_barrier == TRUE_BARRIER ? REG_DEP_TRUE : REG_DEP_ANTI);
1262               add_dependence_list
1263                 (insn, reg_last->clobbers, 0,
1264                  reg_pending_barrier == TRUE_BARRIER ? REG_DEP_TRUE : REG_DEP_ANTI);
1265             }
1266         }
1267       else
1268         {
1269           EXECUTE_IF_SET_IN_REG_SET (&deps->reg_last_in_use, 0, i, rsi)
1270             {
1271               struct deps_reg *reg_last = &deps->reg_last[i];
1272               add_dependence_list_and_free (insn, &reg_last->uses, 0,
1273                                             REG_DEP_ANTI);
1274               add_dependence_list_and_free
1275                 (insn, &reg_last->sets, 0,
1276                  reg_pending_barrier == TRUE_BARRIER ? REG_DEP_TRUE : REG_DEP_ANTI);
1277               add_dependence_list_and_free
1278                 (insn, &reg_last->clobbers, 0,
1279                  reg_pending_barrier == TRUE_BARRIER ? REG_DEP_TRUE : REG_DEP_ANTI);
1280               reg_last->uses_length = 0;
1281               reg_last->clobbers_length = 0;
1282             }
1283         }
1284
1285       for (i = 0; i < (unsigned)deps->max_reg; i++)
1286         {
1287           struct deps_reg *reg_last = &deps->reg_last[i];
1288           reg_last->sets = alloc_INSN_LIST (insn, reg_last->sets);
1289           SET_REGNO_REG_SET (&deps->reg_last_in_use, i);
1290         }
1291
1292       flush_pending_lists (deps, insn, true, true);
1293       CLEAR_REG_SET (&deps->reg_conditional_sets);
1294       reg_pending_barrier = NOT_A_BARRIER;
1295     }
1296   else
1297     {
1298       /* If the current insn is conditional, we can't free any
1299          of the lists.  */
1300       if (sched_get_condition (insn))
1301         {
1302           EXECUTE_IF_SET_IN_REG_SET (reg_pending_uses, 0, i, rsi)
1303             {
1304               struct deps_reg *reg_last = &deps->reg_last[i];
1305               add_dependence_list (insn, reg_last->sets, 0, REG_DEP_TRUE);
1306               add_dependence_list (insn, reg_last->clobbers, 0, REG_DEP_TRUE);
1307               reg_last->uses = alloc_INSN_LIST (insn, reg_last->uses);
1308               reg_last->uses_length++;
1309             }
1310           EXECUTE_IF_SET_IN_REG_SET (reg_pending_clobbers, 0, i, rsi)
1311             {
1312               struct deps_reg *reg_last = &deps->reg_last[i];
1313               add_dependence_list (insn, reg_last->sets, 0, REG_DEP_OUTPUT);
1314               add_dependence_list (insn, reg_last->uses, 0, REG_DEP_ANTI);
1315               reg_last->clobbers = alloc_INSN_LIST (insn, reg_last->clobbers);
1316               reg_last->clobbers_length++;
1317             }
1318           EXECUTE_IF_SET_IN_REG_SET (reg_pending_sets, 0, i, rsi)
1319             {
1320               struct deps_reg *reg_last = &deps->reg_last[i];
1321               add_dependence_list (insn, reg_last->sets, 0, REG_DEP_OUTPUT);
1322               add_dependence_list (insn, reg_last->clobbers, 0, REG_DEP_OUTPUT);
1323               add_dependence_list (insn, reg_last->uses, 0, REG_DEP_ANTI);
1324               reg_last->sets = alloc_INSN_LIST (insn, reg_last->sets);
1325               SET_REGNO_REG_SET (&deps->reg_conditional_sets, i);
1326             }
1327         }
1328       else
1329         {
1330           EXECUTE_IF_SET_IN_REG_SET (reg_pending_uses, 0, i, rsi)
1331             {
1332               struct deps_reg *reg_last = &deps->reg_last[i];
1333               add_dependence_list (insn, reg_last->sets, 0, REG_DEP_TRUE);
1334               add_dependence_list (insn, reg_last->clobbers, 0, REG_DEP_TRUE);
1335               reg_last->uses_length++;
1336               reg_last->uses = alloc_INSN_LIST (insn, reg_last->uses);
1337             }
1338           EXECUTE_IF_SET_IN_REG_SET (reg_pending_clobbers, 0, i, rsi)
1339             {
1340               struct deps_reg *reg_last = &deps->reg_last[i];
1341               if (reg_last->uses_length > MAX_PENDING_LIST_LENGTH
1342                   || reg_last->clobbers_length > MAX_PENDING_LIST_LENGTH)
1343                 {
1344                   add_dependence_list_and_free (insn, &reg_last->sets, 0,
1345                                                 REG_DEP_OUTPUT);
1346                   add_dependence_list_and_free (insn, &reg_last->uses, 0,
1347                                                 REG_DEP_ANTI);
1348                   add_dependence_list_and_free (insn, &reg_last->clobbers, 0,
1349                                                 REG_DEP_OUTPUT);
1350                   reg_last->sets = alloc_INSN_LIST (insn, reg_last->sets);
1351                   reg_last->clobbers_length = 0;
1352                   reg_last->uses_length = 0;
1353                 }
1354               else
1355                 {
1356                   add_dependence_list (insn, reg_last->sets, 0, REG_DEP_OUTPUT);
1357                   add_dependence_list (insn, reg_last->uses, 0, REG_DEP_ANTI);
1358                 }
1359               reg_last->clobbers_length++;
1360               reg_last->clobbers = alloc_INSN_LIST (insn, reg_last->clobbers);
1361             }
1362           EXECUTE_IF_SET_IN_REG_SET (reg_pending_sets, 0, i, rsi)
1363             {
1364               struct deps_reg *reg_last = &deps->reg_last[i];
1365               add_dependence_list_and_free (insn, &reg_last->sets, 0,
1366                                             REG_DEP_OUTPUT);
1367               add_dependence_list_and_free (insn, &reg_last->clobbers, 0,
1368                                             REG_DEP_OUTPUT);
1369               add_dependence_list_and_free (insn, &reg_last->uses, 0,
1370                                             REG_DEP_ANTI);
1371               reg_last->sets = alloc_INSN_LIST (insn, reg_last->sets);
1372               reg_last->uses_length = 0;
1373               reg_last->clobbers_length = 0;
1374               CLEAR_REGNO_REG_SET (&deps->reg_conditional_sets, i);
1375             }
1376         }
1377
1378       IOR_REG_SET (&deps->reg_last_in_use, reg_pending_uses);
1379       IOR_REG_SET (&deps->reg_last_in_use, reg_pending_clobbers);
1380       IOR_REG_SET (&deps->reg_last_in_use, reg_pending_sets);
1381     }
1382   CLEAR_REG_SET (reg_pending_uses);
1383   CLEAR_REG_SET (reg_pending_clobbers);
1384   CLEAR_REG_SET (reg_pending_sets);
1385
1386   /* If we are currently in a libcall scheduling group, then mark the
1387      current insn as being in a scheduling group and that it can not
1388      be moved into a different basic block.  */
1389
1390   if (deps->libcall_block_tail_insn)
1391     {
1392       SCHED_GROUP_P (insn) = 1;
1393       CANT_MOVE (insn) = 1;
1394     }
1395
1396   /* If a post-call group is still open, see if it should remain so.
1397      This insn must be a simple move of a hard reg to a pseudo or
1398      vice-versa.
1399
1400      We must avoid moving these insns for correctness on
1401      SMALL_REGISTER_CLASS machines, and for special registers like
1402      PIC_OFFSET_TABLE_REGNUM.  For simplicity, extend this to all
1403      hard regs for all targets.  */
1404
1405   if (deps->in_post_call_group_p)
1406     {
1407       rtx tmp, set = single_set (insn);
1408       int src_regno, dest_regno;
1409
1410       if (set == NULL)
1411         goto end_call_group;
1412
1413       tmp = SET_DEST (set);
1414       if (GET_CODE (tmp) == SUBREG)
1415         tmp = SUBREG_REG (tmp);
1416       if (REG_P (tmp))
1417         dest_regno = REGNO (tmp);
1418       else
1419         goto end_call_group;
1420
1421       tmp = SET_SRC (set);
1422       if (GET_CODE (tmp) == SUBREG)
1423         tmp = SUBREG_REG (tmp);
1424       if ((GET_CODE (tmp) == PLUS
1425            || GET_CODE (tmp) == MINUS)
1426           && REG_P (XEXP (tmp, 0))
1427           && REGNO (XEXP (tmp, 0)) == STACK_POINTER_REGNUM
1428           && dest_regno == STACK_POINTER_REGNUM)
1429         src_regno = STACK_POINTER_REGNUM;
1430       else if (REG_P (tmp))
1431         src_regno = REGNO (tmp);
1432       else
1433         goto end_call_group;
1434
1435       if (src_regno < FIRST_PSEUDO_REGISTER
1436           || dest_regno < FIRST_PSEUDO_REGISTER)
1437         {
1438           if (deps->in_post_call_group_p == post_call_initial)
1439             deps->in_post_call_group_p = post_call;
1440
1441           SCHED_GROUP_P (insn) = 1;
1442           CANT_MOVE (insn) = 1;
1443         }
1444       else
1445         {
1446         end_call_group:
1447           deps->in_post_call_group_p = not_post_call;
1448         }
1449     }
1450
1451   /* Fixup the dependencies in the sched group.  */
1452   if (SCHED_GROUP_P (insn))
1453     fixup_sched_groups (insn);
1454 }
1455
1456 /* Analyze every insn between HEAD and TAIL inclusive, creating LOG_LINKS
1457    for every dependency.  */
1458
1459 void
1460 sched_analyze (struct deps *deps, rtx head, rtx tail)
1461 {
1462   rtx insn;
1463
1464   if (current_sched_info->use_cselib)
1465     cselib_init (true);
1466
1467   /* Before reload, if the previous block ended in a call, show that
1468      we are inside a post-call group, so as to keep the lifetimes of
1469      hard registers correct.  */
1470   if (! reload_completed && !LABEL_P (head))
1471     {
1472       insn = prev_nonnote_insn (head);
1473       if (insn && CALL_P (insn))
1474         deps->in_post_call_group_p = post_call_initial;
1475     }
1476   for (insn = head;; insn = NEXT_INSN (insn))
1477     {
1478       rtx link, end_seq, r0, set;
1479
1480       if (NONJUMP_INSN_P (insn) || JUMP_P (insn))
1481         {
1482           /* Clear out the stale LOG_LINKS from flow.  */
1483           free_INSN_LIST_list (&LOG_LINKS (insn));
1484
1485           /* Make each JUMP_INSN a scheduling barrier for memory
1486              references.  */
1487           if (JUMP_P (insn))
1488             {
1489               /* Keep the list a reasonable size.  */
1490               if (deps->pending_flush_length++ > MAX_PENDING_LIST_LENGTH)
1491                 flush_pending_lists (deps, insn, true, true);
1492               else
1493                 deps->last_pending_memory_flush
1494                   = alloc_INSN_LIST (insn, deps->last_pending_memory_flush);
1495             }
1496           sched_analyze_insn (deps, PATTERN (insn), insn);
1497         }
1498       else if (CALL_P (insn))
1499         {
1500           int i;
1501
1502           CANT_MOVE (insn) = 1;
1503
1504           /* Clear out the stale LOG_LINKS from flow.  */
1505           free_INSN_LIST_list (&LOG_LINKS (insn));
1506
1507           if (find_reg_note (insn, REG_SETJMP, NULL))
1508             {
1509               /* This is setjmp.  Assume that all registers, not just
1510                  hard registers, may be clobbered by this call.  */
1511               reg_pending_barrier = MOVE_BARRIER;
1512             }
1513           else
1514             {
1515               for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
1516                 /* A call may read and modify global register variables.  */
1517                 if (global_regs[i])
1518                   {
1519                     SET_REGNO_REG_SET (reg_pending_sets, i);
1520                     SET_REGNO_REG_SET (reg_pending_uses, i);
1521                   }
1522                 /* Other call-clobbered hard regs may be clobbered.
1523                    Since we only have a choice between 'might be clobbered'
1524                    and 'definitely not clobbered', we must include all
1525                    partly call-clobbered registers here.  */
1526                 else if (HARD_REGNO_CALL_PART_CLOBBERED (i, reg_raw_mode[i])
1527                          || TEST_HARD_REG_BIT (regs_invalidated_by_call, i))
1528                   SET_REGNO_REG_SET (reg_pending_clobbers, i);
1529                 /* We don't know what set of fixed registers might be used
1530                    by the function, but it is certain that the stack pointer
1531                    is among them, but be conservative.  */
1532                 else if (fixed_regs[i])
1533                   SET_REGNO_REG_SET (reg_pending_uses, i);
1534                 /* The frame pointer is normally not used by the function
1535                    itself, but by the debugger.  */
1536                 /* ??? MIPS o32 is an exception.  It uses the frame pointer
1537                    in the macro expansion of jal but does not represent this
1538                    fact in the call_insn rtl.  */
1539                 else if (i == FRAME_POINTER_REGNUM
1540                          || (i == HARD_FRAME_POINTER_REGNUM
1541                              && (! reload_completed || frame_pointer_needed)))
1542                   SET_REGNO_REG_SET (reg_pending_uses, i);
1543             }
1544
1545           /* For each insn which shouldn't cross a call, add a dependence
1546              between that insn and this call insn.  */
1547           add_dependence_list_and_free (insn, &deps->sched_before_next_call, 1,
1548                                         REG_DEP_ANTI);
1549
1550           sched_analyze_insn (deps, PATTERN (insn), insn);
1551
1552           /* In the absence of interprocedural alias analysis, we must flush
1553              all pending reads and writes, and start new dependencies starting
1554              from here.  But only flush writes for constant calls (which may
1555              be passed a pointer to something we haven't written yet).  */
1556           flush_pending_lists (deps, insn, true, !CONST_OR_PURE_CALL_P (insn));
1557
1558           /* Remember the last function call for limiting lifetimes.  */
1559           free_INSN_LIST_list (&deps->last_function_call);
1560           deps->last_function_call = alloc_INSN_LIST (insn, NULL_RTX);
1561
1562           /* Before reload, begin a post-call group, so as to keep the
1563              lifetimes of hard registers correct.  */
1564           if (! reload_completed)
1565             deps->in_post_call_group_p = post_call;
1566         }
1567
1568       /* EH_REGION insn notes can not appear until well after we complete
1569          scheduling.  */
1570       if (NOTE_P (insn))
1571         gcc_assert (NOTE_LINE_NUMBER (insn) != NOTE_INSN_EH_REGION_BEG
1572                     && NOTE_LINE_NUMBER (insn) != NOTE_INSN_EH_REGION_END);
1573
1574       if (current_sched_info->use_cselib)
1575         cselib_process_insn (insn);
1576
1577       /* Now that we have completed handling INSN, check and see if it is
1578          a CLOBBER beginning a libcall block.   If it is, record the
1579          end of the libcall sequence.
1580
1581          We want to schedule libcall blocks as a unit before reload.  While
1582          this restricts scheduling, it preserves the meaning of a libcall
1583          block.
1584
1585          As a side effect, we may get better code due to decreased register
1586          pressure as well as less chance of a foreign insn appearing in
1587          a libcall block.  */
1588       if (!reload_completed
1589           /* Note we may have nested libcall sequences.  We only care about
1590              the outermost libcall sequence.  */
1591           && deps->libcall_block_tail_insn == 0
1592           /* The sequence must start with a clobber of a register.  */
1593           && NONJUMP_INSN_P (insn)
1594           && GET_CODE (PATTERN (insn)) == CLOBBER
1595           && (r0 = XEXP (PATTERN (insn), 0), REG_P (r0))
1596           && REG_P (XEXP (PATTERN (insn), 0))
1597           /* The CLOBBER must also have a REG_LIBCALL note attached.  */
1598           && (link = find_reg_note (insn, REG_LIBCALL, NULL_RTX)) != 0
1599           && (end_seq = XEXP (link, 0)) != 0
1600           /* The insn referenced by the REG_LIBCALL note must be a
1601              simple nop copy with the same destination as the register
1602              mentioned in the clobber.  */
1603           && (set = single_set (end_seq)) != 0
1604           && SET_DEST (set) == r0 && SET_SRC (set) == r0
1605           /* And finally the insn referenced by the REG_LIBCALL must
1606              also contain a REG_EQUAL note and a REG_RETVAL note.  */
1607           && find_reg_note (end_seq, REG_EQUAL, NULL_RTX) != 0
1608           && find_reg_note (end_seq, REG_RETVAL, NULL_RTX) != 0)
1609         deps->libcall_block_tail_insn = XEXP (link, 0);
1610
1611       /* If we have reached the end of a libcall block, then close the
1612          block.  */
1613       if (deps->libcall_block_tail_insn == insn)
1614         deps->libcall_block_tail_insn = 0;
1615
1616       if (insn == tail)
1617         {
1618           if (current_sched_info->use_cselib)
1619             cselib_finish ();
1620           return;
1621         }
1622     }
1623   gcc_unreachable ();
1624 }
1625 \f
1626
1627 /* The following function adds forward dependence (FROM, TO) with
1628    given DEP_TYPE.  The forward dependence should be not exist before.  */
1629
1630 void
1631 add_forw_dep (rtx to, rtx link)
1632 {
1633   rtx new_link, from;
1634
1635   from = XEXP (link, 0);
1636
1637 #ifdef ENABLE_CHECKING
1638   /* If add_dependence is working properly there should never
1639      be notes, deleted insns or duplicates in the backward
1640      links.  Thus we need not check for them here.
1641
1642      However, if we have enabled checking we might as well go
1643      ahead and verify that add_dependence worked properly.  */
1644   gcc_assert (INSN_P (from));
1645   gcc_assert (!INSN_DELETED_P (from));
1646   if (true_dependency_cache)
1647     {
1648       gcc_assert (!bitmap_bit_p (&forward_dependency_cache[INSN_LUID (from)],
1649                                  INSN_LUID (to)));
1650       bitmap_set_bit (&forward_dependency_cache[INSN_LUID (from)],
1651                       INSN_LUID (to));
1652     }
1653   else
1654     gcc_assert (!find_insn_list (to, INSN_DEPEND (from)));
1655 #endif
1656
1657   if (!(current_sched_info->flags & USE_DEPS_LIST))
1658     new_link = alloc_INSN_LIST (to, INSN_DEPEND (from));
1659   else
1660     new_link = alloc_DEPS_LIST (to, INSN_DEPEND (from), DEP_STATUS (link));
1661
1662   PUT_REG_NOTE_KIND (new_link, REG_NOTE_KIND (link));
1663
1664   INSN_DEPEND (from) = new_link;
1665   INSN_DEP_COUNT (to) += 1;
1666 }
1667
1668 /* Examine insns in the range [ HEAD, TAIL ] and Use the backward
1669    dependences from LOG_LINKS to build forward dependences in
1670    INSN_DEPEND.  */
1671
1672 void
1673 compute_forward_dependences (rtx head, rtx tail)
1674 {
1675   rtx insn;
1676   rtx next_tail;
1677
1678   next_tail = NEXT_INSN (tail);
1679   for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
1680     {
1681       rtx link;
1682       
1683       if (! INSN_P (insn))
1684         continue;
1685       
1686       if (current_sched_info->flags & DO_SPECULATION)
1687         {
1688           rtx new = 0, link, next;
1689
1690           for (link = LOG_LINKS (insn); link; link = next)
1691             {
1692               next = XEXP (link, 1);
1693               adjust_add_sorted_back_dep (insn, link, &new);
1694             }
1695
1696           LOG_LINKS (insn) = new;
1697         }
1698
1699       for (link = LOG_LINKS (insn); link; link = XEXP (link, 1))
1700         add_forw_dep (insn, link);
1701     }
1702 }
1703 \f
1704 /* Initialize variables for region data dependence analysis.
1705    n_bbs is the number of region blocks.  */
1706
1707 void
1708 init_deps (struct deps *deps)
1709 {
1710   int max_reg = (reload_completed ? FIRST_PSEUDO_REGISTER : max_reg_num ());
1711
1712   deps->max_reg = max_reg;
1713   deps->reg_last = XCNEWVEC (struct deps_reg, max_reg);
1714   INIT_REG_SET (&deps->reg_last_in_use);
1715   INIT_REG_SET (&deps->reg_conditional_sets);
1716
1717   deps->pending_read_insns = 0;
1718   deps->pending_read_mems = 0;
1719   deps->pending_write_insns = 0;
1720   deps->pending_write_mems = 0;
1721   deps->pending_lists_length = 0;
1722   deps->pending_flush_length = 0;
1723   deps->last_pending_memory_flush = 0;
1724   deps->last_function_call = 0;
1725   deps->sched_before_next_call = 0;
1726   deps->in_post_call_group_p = not_post_call;
1727   deps->libcall_block_tail_insn = 0;
1728 }
1729
1730 /* Free insn lists found in DEPS.  */
1731
1732 void
1733 free_deps (struct deps *deps)
1734 {
1735   unsigned i;
1736   reg_set_iterator rsi;
1737
1738   free_INSN_LIST_list (&deps->pending_read_insns);
1739   free_EXPR_LIST_list (&deps->pending_read_mems);
1740   free_INSN_LIST_list (&deps->pending_write_insns);
1741   free_EXPR_LIST_list (&deps->pending_write_mems);
1742   free_INSN_LIST_list (&deps->last_pending_memory_flush);
1743
1744   /* Without the EXECUTE_IF_SET, this loop is executed max_reg * nr_regions
1745      times.  For a testcase with 42000 regs and 8000 small basic blocks,
1746      this loop accounted for nearly 60% (84 sec) of the total -O2 runtime.  */
1747   EXECUTE_IF_SET_IN_REG_SET (&deps->reg_last_in_use, 0, i, rsi)
1748     {
1749       struct deps_reg *reg_last = &deps->reg_last[i];
1750       if (reg_last->uses)
1751         free_INSN_LIST_list (&reg_last->uses);
1752       if (reg_last->sets)
1753         free_INSN_LIST_list (&reg_last->sets);
1754       if (reg_last->clobbers)
1755         free_INSN_LIST_list (&reg_last->clobbers);
1756     }
1757   CLEAR_REG_SET (&deps->reg_last_in_use);
1758   CLEAR_REG_SET (&deps->reg_conditional_sets);
1759
1760   free (deps->reg_last);
1761 }
1762
1763 /* If it is profitable to use them, initialize caches for tracking
1764    dependency information.  LUID is the number of insns to be scheduled,
1765    it is used in the estimate of profitability.  */
1766
1767 void
1768 init_dependency_caches (int luid)
1769 {
1770   /* ?!? We could save some memory by computing a per-region luid mapping
1771      which could reduce both the number of vectors in the cache and the size
1772      of each vector.  Instead we just avoid the cache entirely unless the
1773      average number of instructions in a basic block is very high.  See
1774      the comment before the declaration of true_dependency_cache for
1775      what we consider "very high".  */
1776   if (luid / n_basic_blocks > 100 * 5)
1777     {
1778       cache_size = 0;
1779       extend_dependency_caches (luid, true);
1780     }
1781 }
1782
1783 /* Create or extend (depending on CREATE_P) dependency caches to
1784    size N.  */
1785 void
1786 extend_dependency_caches (int n, bool create_p)
1787 {
1788   if (create_p || true_dependency_cache)
1789     {
1790       int i, luid = cache_size + n;
1791
1792       true_dependency_cache = XRESIZEVEC (bitmap_head, true_dependency_cache,
1793                                           luid);
1794       output_dependency_cache = XRESIZEVEC (bitmap_head,
1795                                             output_dependency_cache, luid);
1796       anti_dependency_cache = XRESIZEVEC (bitmap_head, anti_dependency_cache,
1797                                           luid);
1798 #ifdef ENABLE_CHECKING
1799       forward_dependency_cache = XRESIZEVEC (bitmap_head,
1800                                              forward_dependency_cache, luid);
1801 #endif
1802       if (current_sched_info->flags & DO_SPECULATION)
1803         spec_dependency_cache = XRESIZEVEC (bitmap_head, spec_dependency_cache,
1804                                             luid);
1805
1806       for (i = cache_size; i < luid; i++)
1807         {
1808           bitmap_initialize (&true_dependency_cache[i], 0);
1809           bitmap_initialize (&output_dependency_cache[i], 0);
1810           bitmap_initialize (&anti_dependency_cache[i], 0);
1811 #ifdef ENABLE_CHECKING
1812           bitmap_initialize (&forward_dependency_cache[i], 0);
1813 #endif
1814           if (current_sched_info->flags & DO_SPECULATION)
1815             bitmap_initialize (&spec_dependency_cache[i], 0);
1816         }
1817       cache_size = luid;
1818     }
1819 }
1820
1821 /* Free the caches allocated in init_dependency_caches.  */
1822
1823 void
1824 free_dependency_caches (void)
1825 {
1826   if (true_dependency_cache)
1827     {
1828       int i;
1829
1830       for (i = 0; i < cache_size; i++)
1831         {
1832           bitmap_clear (&true_dependency_cache[i]);
1833           bitmap_clear (&output_dependency_cache[i]);
1834           bitmap_clear (&anti_dependency_cache[i]);
1835 #ifdef ENABLE_CHECKING
1836           bitmap_clear (&forward_dependency_cache[i]);
1837 #endif
1838           if (current_sched_info->flags & DO_SPECULATION)
1839             bitmap_clear (&spec_dependency_cache[i]);
1840         }
1841       free (true_dependency_cache);
1842       true_dependency_cache = NULL;
1843       free (output_dependency_cache);
1844       output_dependency_cache = NULL;
1845       free (anti_dependency_cache);
1846       anti_dependency_cache = NULL;
1847 #ifdef ENABLE_CHECKING
1848       free (forward_dependency_cache);
1849       forward_dependency_cache = NULL;
1850 #endif
1851       if (current_sched_info->flags & DO_SPECULATION)
1852         {
1853           free (spec_dependency_cache);
1854           spec_dependency_cache = NULL;
1855         }
1856     }
1857 }
1858
1859 /* Initialize some global variables needed by the dependency analysis
1860    code.  */
1861
1862 void
1863 init_deps_global (void)
1864 {
1865   reg_pending_sets = ALLOC_REG_SET (&reg_obstack);
1866   reg_pending_clobbers = ALLOC_REG_SET (&reg_obstack);
1867   reg_pending_uses = ALLOC_REG_SET (&reg_obstack);
1868   reg_pending_barrier = NOT_A_BARRIER;
1869 }
1870
1871 /* Free everything used by the dependency analysis code.  */
1872
1873 void
1874 finish_deps_global (void)
1875 {
1876   FREE_REG_SET (reg_pending_sets);
1877   FREE_REG_SET (reg_pending_clobbers);
1878   FREE_REG_SET (reg_pending_uses);
1879 }
1880
1881 /* Insert LINK into the dependence chain pointed to by LINKP and 
1882    maintain the sort order.  */
1883 static void
1884 adjust_add_sorted_back_dep (rtx insn, rtx link, rtx *linkp)
1885 {
1886   gcc_assert (current_sched_info->flags & DO_SPECULATION);
1887   
1888   /* If the insn cannot move speculatively, but the link is speculative,   
1889      make it hard dependence.  */
1890   if (HAS_INTERNAL_DEP (insn)
1891       && (DEP_STATUS (link) & SPECULATIVE))
1892     {      
1893       DEP_STATUS (link) &= ~SPECULATIVE;
1894       
1895       if (true_dependency_cache)
1896         bitmap_clear_bit (&spec_dependency_cache[INSN_LUID (insn)],
1897                           INSN_LUID (XEXP (link, 0)));
1898     }
1899
1900   /* Non-speculative links go at the head of LOG_LINKS, followed by
1901      speculative links.  */
1902   if (DEP_STATUS (link) & SPECULATIVE)
1903     while (*linkp && !(DEP_STATUS (*linkp) & SPECULATIVE))
1904       linkp = &XEXP (*linkp, 1);
1905
1906   XEXP (link, 1) = *linkp;
1907   *linkp = link;
1908 }
1909
1910 /* Move the dependence pointed to by LINKP to the back dependencies  
1911    of INSN, and also add this dependence to the forward ones.  All LOG_LINKS,
1912    except one pointed to by LINKP, must be sorted.  */
1913 static void
1914 adjust_back_add_forw_dep (rtx insn, rtx *linkp)
1915 {
1916   rtx link;
1917
1918   gcc_assert (current_sched_info->flags & DO_SPECULATION);
1919
1920   link = *linkp;
1921   *linkp = XEXP (*linkp, 1);  
1922
1923   adjust_add_sorted_back_dep (insn, link, &LOG_LINKS (insn));
1924   add_forw_dep (insn, link);
1925 }
1926
1927 /* Remove forward dependence ELEM from the DEPS_LIST of INSN.  */
1928 static void
1929 delete_forw_dep (rtx insn, rtx elem)
1930 {
1931   gcc_assert (current_sched_info->flags & DO_SPECULATION);
1932
1933 #ifdef ENABLE_CHECKING
1934   if (true_dependency_cache)
1935     bitmap_clear_bit (&forward_dependency_cache[INSN_LUID (elem)],
1936                       INSN_LUID (insn));
1937 #endif
1938
1939   remove_free_DEPS_LIST_elem (insn, &INSN_DEPEND (elem));    
1940   INSN_DEP_COUNT (insn)--;
1941 }
1942
1943 /* Estimate the weakness of dependence between MEM1 and MEM2.  */
1944 static dw_t
1945 estimate_dep_weak (rtx mem1, rtx mem2)
1946 {
1947   rtx r1, r2;
1948
1949   if (mem1 == mem2)
1950     /* MEMs are the same - don't speculate.  */
1951     return MIN_DEP_WEAK;
1952
1953   r1 = XEXP (mem1, 0);
1954   r2 = XEXP (mem2, 0);
1955
1956   if (r1 == r2
1957       || (REG_P (r1) && REG_P (r2)
1958           && REGNO (r1) == REGNO (r2)))
1959     /* Again, MEMs are the same.  */
1960     return MIN_DEP_WEAK;
1961   else if ((REG_P (r1) && !REG_P (r2))
1962            || (!REG_P (r1) && REG_P (r2)))
1963     /* Different addressing modes - reason to be more speculative,
1964        than usual.  */
1965     return NO_DEP_WEAK - (NO_DEP_WEAK - UNCERTAIN_DEP_WEAK) / 2;
1966   else
1967     /* We can't say anything about the dependence.  */
1968     return UNCERTAIN_DEP_WEAK;
1969 }
1970
1971 /* Add or update backward dependence between INSN and ELEM with type DEP_TYPE.
1972    This function can handle same INSN and ELEM (INSN == ELEM).
1973    It is a convenience wrapper.  */
1974 void
1975 add_dependence (rtx insn, rtx elem, enum reg_note dep_type)
1976 {
1977   ds_t ds;
1978   
1979   if (dep_type == REG_DEP_TRUE)
1980     ds = DEP_TRUE;
1981   else if (dep_type == REG_DEP_OUTPUT)
1982     ds = DEP_OUTPUT;
1983   else if (dep_type == REG_DEP_ANTI)
1984     ds = DEP_ANTI;
1985   else
1986     gcc_unreachable ();
1987
1988   maybe_add_or_update_back_dep_1 (insn, elem, dep_type, ds, 0, 0, 0);
1989 }
1990
1991 /* Add or update backward dependence between INSN and ELEM
1992    with given type DEP_TYPE and dep_status DS.
1993    This function is a convenience wrapper.  */
1994 enum DEPS_ADJUST_RESULT
1995 add_or_update_back_dep (rtx insn, rtx elem, enum reg_note dep_type, ds_t ds)
1996 {
1997   return add_or_update_back_dep_1 (insn, elem, dep_type, ds, 0, 0, 0);
1998 }
1999
2000 /* Add or update both backward and forward dependencies between INSN and ELEM
2001    with given type DEP_TYPE and dep_status DS.  */
2002 void
2003 add_or_update_back_forw_dep (rtx insn, rtx elem, enum reg_note dep_type,
2004                              ds_t ds)
2005 {
2006   enum DEPS_ADJUST_RESULT res;
2007   rtx *linkp;
2008
2009   res = add_or_update_back_dep_1 (insn, elem, dep_type, ds, 0, 0, &linkp);
2010
2011   if (res == DEP_CHANGED || res == DEP_CREATED)
2012     {
2013       if (res == DEP_CHANGED)
2014         delete_forw_dep (insn, elem);
2015       else if (res == DEP_CREATED)
2016         linkp = &LOG_LINKS (insn);
2017
2018       adjust_back_add_forw_dep (insn, linkp);
2019     }
2020 }
2021
2022 /* Add both backward and forward dependencies between INSN and ELEM
2023    with given type DEP_TYPE and dep_status DS.  */
2024 void
2025 add_back_forw_dep (rtx insn, rtx elem, enum reg_note dep_type, ds_t ds)
2026 {
2027   add_back_dep (insn, elem, dep_type, ds);  
2028   adjust_back_add_forw_dep (insn, &LOG_LINKS (insn));    
2029 }
2030
2031 /* Remove both backward and forward dependencies between INSN and ELEM.  */
2032 void
2033 delete_back_forw_dep (rtx insn, rtx elem)
2034 {
2035   gcc_assert (current_sched_info->flags & DO_SPECULATION);
2036
2037   if (true_dependency_cache != NULL)
2038     {
2039       bitmap_clear_bit (&true_dependency_cache[INSN_LUID (insn)],
2040                         INSN_LUID (elem));
2041       bitmap_clear_bit (&anti_dependency_cache[INSN_LUID (insn)],
2042                         INSN_LUID (elem));
2043       bitmap_clear_bit (&output_dependency_cache[INSN_LUID (insn)],
2044                         INSN_LUID (elem));
2045       bitmap_clear_bit (&spec_dependency_cache[INSN_LUID (insn)],
2046                         INSN_LUID (elem));
2047     }
2048
2049   remove_free_DEPS_LIST_elem (elem, &LOG_LINKS (insn));
2050   delete_forw_dep (insn, elem);
2051 }
2052
2053 /* Return weakness of speculative type TYPE in the dep_status DS.  */
2054 dw_t
2055 get_dep_weak (ds_t ds, ds_t type)
2056 {
2057   ds = ds & type;
2058   switch (type)
2059     {
2060     case BEGIN_DATA: ds >>= BEGIN_DATA_BITS_OFFSET; break;
2061     case BE_IN_DATA: ds >>= BE_IN_DATA_BITS_OFFSET; break;
2062     case BEGIN_CONTROL: ds >>= BEGIN_CONTROL_BITS_OFFSET; break;
2063     case BE_IN_CONTROL: ds >>= BE_IN_CONTROL_BITS_OFFSET; break;
2064     default: gcc_unreachable ();
2065     }
2066
2067   gcc_assert (MIN_DEP_WEAK <= ds && ds <= MAX_DEP_WEAK);
2068   return (dw_t) ds;
2069 }
2070
2071 /* Return the dep_status, which has the same parameters as DS, except for
2072    speculative type TYPE, that will have weakness DW.  */
2073 ds_t
2074 set_dep_weak (ds_t ds, ds_t type, dw_t dw)
2075 {
2076   gcc_assert (MIN_DEP_WEAK <= dw && dw <= MAX_DEP_WEAK);
2077
2078   ds &= ~type;
2079   switch (type)
2080     {
2081     case BEGIN_DATA: ds |= ((ds_t) dw) << BEGIN_DATA_BITS_OFFSET; break;
2082     case BE_IN_DATA: ds |= ((ds_t) dw) << BE_IN_DATA_BITS_OFFSET; break;
2083     case BEGIN_CONTROL: ds |= ((ds_t) dw) << BEGIN_CONTROL_BITS_OFFSET; break;
2084     case BE_IN_CONTROL: ds |= ((ds_t) dw) << BE_IN_CONTROL_BITS_OFFSET; break;
2085     default: gcc_unreachable ();
2086     }
2087   return ds;
2088 }
2089
2090 /* Return the join of two dep_statuses DS1 and DS2.  */
2091 ds_t
2092 ds_merge (ds_t ds1, ds_t ds2)
2093 {
2094   ds_t ds, t;
2095
2096   gcc_assert ((ds1 & SPECULATIVE) && (ds2 & SPECULATIVE));
2097
2098   ds = (ds1 & DEP_TYPES) | (ds2 & DEP_TYPES);
2099
2100   t = FIRST_SPEC_TYPE;
2101   do
2102     {
2103       if ((ds1 & t) && !(ds2 & t))
2104         ds |= ds1 & t;
2105       else if (!(ds1 & t) && (ds2 & t))
2106         ds |= ds2 & t;
2107       else if ((ds1 & t) && (ds2 & t))
2108         {
2109           ds_t dw;
2110
2111           dw = ((ds_t) get_dep_weak (ds1, t)) * ((ds_t) get_dep_weak (ds2, t));
2112           dw /= MAX_DEP_WEAK;
2113           if (dw < MIN_DEP_WEAK)
2114             dw = MIN_DEP_WEAK;
2115
2116           ds = set_dep_weak (ds, t, (dw_t) dw);
2117         }
2118
2119       if (t == LAST_SPEC_TYPE)
2120         break;
2121       t <<= SPEC_TYPE_SHIFT;
2122     }
2123   while (1);
2124
2125   return ds;
2126 }
2127
2128 #ifdef INSN_SCHEDULING
2129 #ifdef ENABLE_CHECKING
2130 /* Verify that dependence type and status are consistent.
2131    If RELAXED_P is true, then skip dep_weakness checks.  */
2132 static void
2133 check_dep_status (enum reg_note dt, ds_t ds, bool relaxed_p)
2134 {
2135   /* Check that dependence type contains the same bits as the status.  */
2136   if (dt == REG_DEP_TRUE)
2137     gcc_assert (ds & DEP_TRUE);
2138   else if (dt == REG_DEP_OUTPUT)
2139     gcc_assert ((ds & DEP_OUTPUT)
2140                 && !(ds & DEP_TRUE));    
2141   else 
2142     gcc_assert ((dt == REG_DEP_ANTI)
2143                 && (ds & DEP_ANTI)
2144                 && !(ds & (DEP_OUTPUT | DEP_TRUE)));
2145
2146   /* HARD_DEP can not appear in dep_status of a link.  */
2147   gcc_assert (!(ds & HARD_DEP));          
2148
2149   /* Check that dependence status is set correctly when speculation is not
2150      supported.  */
2151   if (!(current_sched_info->flags & DO_SPECULATION))
2152     gcc_assert (!(ds & SPECULATIVE));
2153   else if (ds & SPECULATIVE)
2154     {
2155       if (!relaxed_p)
2156         {
2157           ds_t type = FIRST_SPEC_TYPE;
2158
2159           /* Check that dependence weakness is in proper range.  */
2160           do
2161             {
2162               if (ds & type)
2163                 get_dep_weak (ds, type);
2164
2165               if (type == LAST_SPEC_TYPE)
2166                 break;
2167               type <<= SPEC_TYPE_SHIFT;
2168             }
2169           while (1);
2170         }
2171
2172       if (ds & BEGIN_SPEC)
2173         {
2174           /* Only true dependence can be data speculative.  */
2175           if (ds & BEGIN_DATA)
2176             gcc_assert (ds & DEP_TRUE);
2177
2178           /* Control dependencies in the insn scheduler are represented by
2179              anti-dependencies, therefore only anti dependence can be
2180              control speculative.  */
2181           if (ds & BEGIN_CONTROL)
2182             gcc_assert (ds & DEP_ANTI);
2183         }
2184       else
2185         {
2186           /* Subsequent speculations should resolve true dependencies.  */
2187           gcc_assert ((ds & DEP_TYPES) == DEP_TRUE);
2188         }
2189           
2190       /* Check that true and anti depencies can't have other speculative 
2191          statuses.  */
2192       if (ds & DEP_TRUE)
2193         gcc_assert (ds & (BEGIN_DATA | BE_IN_SPEC));
2194       /* An output dependence can't be speculative at all.  */
2195       gcc_assert (!(ds & DEP_OUTPUT));
2196       if (ds & DEP_ANTI)
2197         gcc_assert (ds & BEGIN_CONTROL);
2198     }
2199 }
2200 #endif
2201 #endif