builtins.c, [...]: Fix comment typos.
[gcc.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 nonzero,
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 dependencies 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