spe.md (frob_di_df_2): Handle non-offsettable memory operand.
[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 reference to register (reg:MODE REGNO) in INSN.
719 The type of the reference is specified by REF and can be SET,
720 CLOBBER, PRE_DEC, POST_DEC, PRE_INC, POST_INC or USE. */
721
722 static void
723 sched_analyze_reg (struct deps *deps, int regno, enum machine_mode mode,
724 enum rtx_code ref, rtx insn)
725 {
726 /* A hard reg in a wide mode may really be multiple registers.
727 If so, mark all of them just like the first. */
728 if (regno < FIRST_PSEUDO_REGISTER)
729 {
730 int i = hard_regno_nregs[regno][mode];
731 if (ref == SET)
732 {
733 while (--i >= 0)
734 SET_REGNO_REG_SET (reg_pending_sets, regno + i);
735 }
736 else if (ref == USE)
737 {
738 while (--i >= 0)
739 SET_REGNO_REG_SET (reg_pending_uses, regno + i);
740 }
741 else
742 {
743 while (--i >= 0)
744 SET_REGNO_REG_SET (reg_pending_clobbers, regno + i);
745 }
746 }
747
748 /* ??? Reload sometimes emits USEs and CLOBBERs of pseudos that
749 it does not reload. Ignore these as they have served their
750 purpose already. */
751 else if (regno >= deps->max_reg)
752 {
753 enum rtx_code code = GET_CODE (PATTERN (insn));
754 gcc_assert (code == USE || code == CLOBBER);
755 }
756
757 else
758 {
759 if (ref == SET)
760 SET_REGNO_REG_SET (reg_pending_sets, regno);
761 else if (ref == USE)
762 SET_REGNO_REG_SET (reg_pending_uses, regno);
763 else
764 SET_REGNO_REG_SET (reg_pending_clobbers, regno);
765
766 /* Pseudos that are REG_EQUIV to something may be replaced
767 by that during reloading. We need only add dependencies for
768 the address in the REG_EQUIV note. */
769 if (!reload_completed && get_reg_known_equiv_p (regno))
770 {
771 rtx t = get_reg_known_value (regno);
772 if (MEM_P (t))
773 sched_analyze_2 (deps, XEXP (t, 0), insn);
774 }
775
776 /* Don't let it cross a call after scheduling if it doesn't
777 already cross one. */
778 if (REG_N_CALLS_CROSSED (regno) == 0)
779 {
780 if (ref == USE)
781 deps->sched_before_next_call
782 = alloc_INSN_LIST (insn, deps->sched_before_next_call);
783 else
784 add_dependence_list (insn, deps->last_function_call, 1,
785 REG_DEP_ANTI);
786 }
787 }
788 }
789
790 /* Analyze a single SET, CLOBBER, PRE_DEC, POST_DEC, PRE_INC or POST_INC
791 rtx, X, creating all dependencies generated by the write to the
792 destination of X, and reads of everything mentioned. */
793
794 static void
795 sched_analyze_1 (struct deps *deps, rtx x, rtx insn)
796 {
797 rtx dest = XEXP (x, 0);
798 enum rtx_code code = GET_CODE (x);
799
800 if (dest == 0)
801 return;
802
803 if (GET_CODE (dest) == PARALLEL)
804 {
805 int i;
806
807 for (i = XVECLEN (dest, 0) - 1; i >= 0; i--)
808 if (XEXP (XVECEXP (dest, 0, i), 0) != 0)
809 sched_analyze_1 (deps,
810 gen_rtx_CLOBBER (VOIDmode,
811 XEXP (XVECEXP (dest, 0, i), 0)),
812 insn);
813
814 if (GET_CODE (x) == SET)
815 sched_analyze_2 (deps, SET_SRC (x), insn);
816 return;
817 }
818
819 while (GET_CODE (dest) == STRICT_LOW_PART || GET_CODE (dest) == SUBREG
820 || GET_CODE (dest) == ZERO_EXTRACT)
821 {
822 if (GET_CODE (dest) == STRICT_LOW_PART
823 || GET_CODE (dest) == ZERO_EXTRACT
824 || df_read_modify_subreg_p (dest))
825 {
826 /* These both read and modify the result. We must handle
827 them as writes to get proper dependencies for following
828 instructions. We must handle them as reads to get proper
829 dependencies from this to previous instructions.
830 Thus we need to call sched_analyze_2. */
831
832 sched_analyze_2 (deps, XEXP (dest, 0), insn);
833 }
834 if (GET_CODE (dest) == ZERO_EXTRACT)
835 {
836 /* The second and third arguments are values read by this insn. */
837 sched_analyze_2 (deps, XEXP (dest, 1), insn);
838 sched_analyze_2 (deps, XEXP (dest, 2), insn);
839 }
840 dest = XEXP (dest, 0);
841 }
842
843 if (REG_P (dest))
844 {
845 int regno = REGNO (dest);
846 enum machine_mode mode = GET_MODE (dest);
847
848 sched_analyze_reg (deps, regno, mode, code, insn);
849
850 #ifdef STACK_REGS
851 /* Treat all writes to a stack register as modifying the TOS. */
852 if (regno >= FIRST_STACK_REG && regno <= LAST_STACK_REG)
853 {
854 /* Avoid analyzing the same register twice. */
855 if (regno != FIRST_STACK_REG)
856 sched_analyze_reg (deps, FIRST_STACK_REG, mode, code, insn);
857 sched_analyze_reg (deps, FIRST_STACK_REG, mode, USE, insn);
858 }
859 #endif
860 }
861 else if (MEM_P (dest))
862 {
863 /* Writing memory. */
864 rtx t = dest;
865
866 if (current_sched_info->use_cselib)
867 {
868 t = shallow_copy_rtx (dest);
869 cselib_lookup (XEXP (t, 0), Pmode, 1);
870 XEXP (t, 0) = cselib_subst_to_values (XEXP (t, 0));
871 }
872 t = canon_rtx (t);
873
874 if (deps->pending_lists_length > MAX_PENDING_LIST_LENGTH)
875 {
876 /* Flush all pending reads and writes to prevent the pending lists
877 from getting any larger. Insn scheduling runs too slowly when
878 these lists get long. When compiling GCC with itself,
879 this flush occurs 8 times for sparc, and 10 times for m88k using
880 the default value of 32. */
881 flush_pending_lists (deps, insn, false, true);
882 }
883 else
884 {
885 rtx pending, pending_mem;
886
887 pending = deps->pending_read_insns;
888 pending_mem = deps->pending_read_mems;
889 while (pending)
890 {
891 if (anti_dependence (XEXP (pending_mem, 0), t)
892 && ! sched_insns_conditions_mutex_p (insn, XEXP (pending, 0)))
893 add_dependence (insn, XEXP (pending, 0), REG_DEP_ANTI);
894
895 pending = XEXP (pending, 1);
896 pending_mem = XEXP (pending_mem, 1);
897 }
898
899 pending = deps->pending_write_insns;
900 pending_mem = deps->pending_write_mems;
901 while (pending)
902 {
903 if (output_dependence (XEXP (pending_mem, 0), t)
904 && ! sched_insns_conditions_mutex_p (insn, XEXP (pending, 0)))
905 add_dependence (insn, XEXP (pending, 0), REG_DEP_OUTPUT);
906
907 pending = XEXP (pending, 1);
908 pending_mem = XEXP (pending_mem, 1);
909 }
910
911 add_dependence_list (insn, deps->last_pending_memory_flush, 1,
912 REG_DEP_ANTI);
913
914 add_insn_mem_dependence (deps, &deps->pending_write_insns,
915 &deps->pending_write_mems, insn, dest);
916 }
917 sched_analyze_2 (deps, XEXP (dest, 0), insn);
918 }
919
920 /* Analyze reads. */
921 if (GET_CODE (x) == SET)
922 sched_analyze_2 (deps, SET_SRC (x), insn);
923 }
924
925 /* Analyze the uses of memory and registers in rtx X in INSN. */
926
927 static void
928 sched_analyze_2 (struct deps *deps, rtx x, rtx insn)
929 {
930 int i;
931 int j;
932 enum rtx_code code;
933 const char *fmt;
934
935 if (x == 0)
936 return;
937
938 code = GET_CODE (x);
939
940 switch (code)
941 {
942 case CONST_INT:
943 case CONST_DOUBLE:
944 case CONST_VECTOR:
945 case SYMBOL_REF:
946 case CONST:
947 case LABEL_REF:
948 /* Ignore constants. Note that we must handle CONST_DOUBLE here
949 because it may have a cc0_rtx in its CONST_DOUBLE_CHAIN field, but
950 this does not mean that this insn is using cc0. */
951 return;
952
953 #ifdef HAVE_cc0
954 case CC0:
955 /* User of CC0 depends on immediately preceding insn. */
956 SCHED_GROUP_P (insn) = 1;
957 /* Don't move CC0 setter to another block (it can set up the
958 same flag for previous CC0 users which is safe). */
959 CANT_MOVE (prev_nonnote_insn (insn)) = 1;
960 return;
961 #endif
962
963 case REG:
964 {
965 int regno = REGNO (x);
966 enum machine_mode mode = GET_MODE (x);
967
968 sched_analyze_reg (deps, regno, mode, USE, insn);
969
970 #ifdef STACK_REGS
971 /* Treat all reads of a stack register as modifying the TOS. */
972 if (regno >= FIRST_STACK_REG && regno <= LAST_STACK_REG)
973 {
974 /* Avoid analyzing the same register twice. */
975 if (regno != FIRST_STACK_REG)
976 sched_analyze_reg (deps, FIRST_STACK_REG, mode, USE, insn);
977 sched_analyze_reg (deps, FIRST_STACK_REG, mode, SET, insn);
978 }
979 #endif
980 return;
981 }
982
983 case MEM:
984 {
985 /* Reading memory. */
986 rtx u;
987 rtx pending, pending_mem;
988 rtx t = x;
989
990 if (current_sched_info->use_cselib)
991 {
992 t = shallow_copy_rtx (t);
993 cselib_lookup (XEXP (t, 0), Pmode, 1);
994 XEXP (t, 0) = cselib_subst_to_values (XEXP (t, 0));
995 }
996 t = canon_rtx (t);
997 pending = deps->pending_read_insns;
998 pending_mem = deps->pending_read_mems;
999 while (pending)
1000 {
1001 if (read_dependence (XEXP (pending_mem, 0), t)
1002 && ! sched_insns_conditions_mutex_p (insn, XEXP (pending, 0)))
1003 add_dependence (insn, XEXP (pending, 0), REG_DEP_ANTI);
1004
1005 pending = XEXP (pending, 1);
1006 pending_mem = XEXP (pending_mem, 1);
1007 }
1008
1009 pending = deps->pending_write_insns;
1010 pending_mem = deps->pending_write_mems;
1011 while (pending)
1012 {
1013 if (true_dependence (XEXP (pending_mem, 0), VOIDmode,
1014 t, rtx_varies_p)
1015 && ! sched_insns_conditions_mutex_p (insn, XEXP (pending, 0)))
1016 {
1017 if (current_sched_info->flags & DO_SPECULATION)
1018 maybe_add_or_update_back_dep_1 (insn, XEXP (pending, 0),
1019 REG_DEP_TRUE,
1020 BEGIN_DATA | DEP_TRUE,
1021 XEXP (pending_mem, 0), t, 0);
1022 else
1023 add_dependence (insn, XEXP (pending, 0), REG_DEP_TRUE);
1024 }
1025
1026 pending = XEXP (pending, 1);
1027 pending_mem = XEXP (pending_mem, 1);
1028 }
1029
1030 for (u = deps->last_pending_memory_flush; u; u = XEXP (u, 1))
1031 if (! JUMP_P (XEXP (u, 0)) || deps_may_trap_p (x))
1032 add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI);
1033
1034 /* Always add these dependencies to pending_reads, since
1035 this insn may be followed by a write. */
1036 add_insn_mem_dependence (deps, &deps->pending_read_insns,
1037 &deps->pending_read_mems, insn, x);
1038
1039 /* Take advantage of tail recursion here. */
1040 sched_analyze_2 (deps, XEXP (x, 0), insn);
1041 return;
1042 }
1043
1044 /* Force pending stores to memory in case a trap handler needs them. */
1045 case TRAP_IF:
1046 flush_pending_lists (deps, insn, true, false);
1047 break;
1048
1049 case ASM_OPERANDS:
1050 case ASM_INPUT:
1051 case UNSPEC_VOLATILE:
1052 {
1053 /* Traditional and volatile asm instructions must be considered to use
1054 and clobber all hard registers, all pseudo-registers and all of
1055 memory. So must TRAP_IF and UNSPEC_VOLATILE operations.
1056
1057 Consider for instance a volatile asm that changes the fpu rounding
1058 mode. An insn should not be moved across this even if it only uses
1059 pseudo-regs because it might give an incorrectly rounded result. */
1060 if (code != ASM_OPERANDS || MEM_VOLATILE_P (x))
1061 reg_pending_barrier = TRUE_BARRIER;
1062
1063 /* For all ASM_OPERANDS, we must traverse the vector of input operands.
1064 We can not just fall through here since then we would be confused
1065 by the ASM_INPUT rtx inside ASM_OPERANDS, which do not indicate
1066 traditional asms unlike their normal usage. */
1067
1068 if (code == ASM_OPERANDS)
1069 {
1070 for (j = 0; j < ASM_OPERANDS_INPUT_LENGTH (x); j++)
1071 sched_analyze_2 (deps, ASM_OPERANDS_INPUT (x, j), insn);
1072 return;
1073 }
1074 break;
1075 }
1076
1077 case PRE_DEC:
1078 case POST_DEC:
1079 case PRE_INC:
1080 case POST_INC:
1081 /* These both read and modify the result. We must handle them as writes
1082 to get proper dependencies for following instructions. We must handle
1083 them as reads to get proper dependencies from this to previous
1084 instructions. Thus we need to pass them to both sched_analyze_1
1085 and sched_analyze_2. We must call sched_analyze_2 first in order
1086 to get the proper antecedent for the read. */
1087 sched_analyze_2 (deps, XEXP (x, 0), insn);
1088 sched_analyze_1 (deps, x, insn);
1089 return;
1090
1091 case POST_MODIFY:
1092 case PRE_MODIFY:
1093 /* op0 = op0 + op1 */
1094 sched_analyze_2 (deps, XEXP (x, 0), insn);
1095 sched_analyze_2 (deps, XEXP (x, 1), insn);
1096 sched_analyze_1 (deps, x, insn);
1097 return;
1098
1099 default:
1100 break;
1101 }
1102
1103 /* Other cases: walk the insn. */
1104 fmt = GET_RTX_FORMAT (code);
1105 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1106 {
1107 if (fmt[i] == 'e')
1108 sched_analyze_2 (deps, XEXP (x, i), insn);
1109 else if (fmt[i] == 'E')
1110 for (j = 0; j < XVECLEN (x, i); j++)
1111 sched_analyze_2 (deps, XVECEXP (x, i, j), insn);
1112 }
1113 }
1114
1115 /* Analyze an INSN with pattern X to find all dependencies. */
1116
1117 static void
1118 sched_analyze_insn (struct deps *deps, rtx x, rtx insn)
1119 {
1120 RTX_CODE code = GET_CODE (x);
1121 rtx link;
1122 unsigned i;
1123 reg_set_iterator rsi;
1124
1125 if (code == COND_EXEC)
1126 {
1127 sched_analyze_2 (deps, COND_EXEC_TEST (x), insn);
1128
1129 /* ??? Should be recording conditions so we reduce the number of
1130 false dependencies. */
1131 x = COND_EXEC_CODE (x);
1132 code = GET_CODE (x);
1133 }
1134 if (code == SET || code == CLOBBER)
1135 {
1136 sched_analyze_1 (deps, x, insn);
1137
1138 /* Bare clobber insns are used for letting life analysis, reg-stack
1139 and others know that a value is dead. Depend on the last call
1140 instruction so that reg-stack won't get confused. */
1141 if (code == CLOBBER)
1142 add_dependence_list (insn, deps->last_function_call, 1, REG_DEP_OUTPUT);
1143 }
1144 else if (code == PARALLEL)
1145 {
1146 for (i = XVECLEN (x, 0); i--;)
1147 {
1148 rtx sub = XVECEXP (x, 0, i);
1149 code = GET_CODE (sub);
1150
1151 if (code == COND_EXEC)
1152 {
1153 sched_analyze_2 (deps, COND_EXEC_TEST (sub), insn);
1154 sub = COND_EXEC_CODE (sub);
1155 code = GET_CODE (sub);
1156 }
1157 if (code == SET || code == CLOBBER)
1158 sched_analyze_1 (deps, sub, insn);
1159 else
1160 sched_analyze_2 (deps, sub, insn);
1161 }
1162 }
1163 else
1164 sched_analyze_2 (deps, x, insn);
1165
1166 /* Mark registers CLOBBERED or used by called function. */
1167 if (CALL_P (insn))
1168 {
1169 for (link = CALL_INSN_FUNCTION_USAGE (insn); link; link = XEXP (link, 1))
1170 {
1171 if (GET_CODE (XEXP (link, 0)) == CLOBBER)
1172 sched_analyze_1 (deps, XEXP (link, 0), insn);
1173 else
1174 sched_analyze_2 (deps, XEXP (link, 0), insn);
1175 }
1176 if (find_reg_note (insn, REG_SETJMP, NULL))
1177 reg_pending_barrier = MOVE_BARRIER;
1178 }
1179
1180 if (JUMP_P (insn))
1181 {
1182 rtx next;
1183 next = next_nonnote_insn (insn);
1184 if (next && BARRIER_P (next))
1185 reg_pending_barrier = TRUE_BARRIER;
1186 else
1187 {
1188 rtx pending, pending_mem;
1189 regset_head tmp_uses, tmp_sets;
1190 INIT_REG_SET (&tmp_uses);
1191 INIT_REG_SET (&tmp_sets);
1192
1193 (*current_sched_info->compute_jump_reg_dependencies)
1194 (insn, &deps->reg_conditional_sets, &tmp_uses, &tmp_sets);
1195 /* Make latency of jump equal to 0 by using anti-dependence. */
1196 EXECUTE_IF_SET_IN_REG_SET (&tmp_uses, 0, i, rsi)
1197 {
1198 struct deps_reg *reg_last = &deps->reg_last[i];
1199 add_dependence_list (insn, reg_last->sets, 0, REG_DEP_ANTI);
1200 add_dependence_list (insn, reg_last->clobbers, 0, REG_DEP_ANTI);
1201 reg_last->uses_length++;
1202 reg_last->uses = alloc_INSN_LIST (insn, reg_last->uses);
1203 }
1204 IOR_REG_SET (reg_pending_sets, &tmp_sets);
1205
1206 CLEAR_REG_SET (&tmp_uses);
1207 CLEAR_REG_SET (&tmp_sets);
1208
1209 /* All memory writes and volatile reads must happen before the
1210 jump. Non-volatile reads must happen before the jump iff
1211 the result is needed by the above register used mask. */
1212
1213 pending = deps->pending_write_insns;
1214 pending_mem = deps->pending_write_mems;
1215 while (pending)
1216 {
1217 if (! sched_insns_conditions_mutex_p (insn, XEXP (pending, 0)))
1218 add_dependence (insn, XEXP (pending, 0), REG_DEP_OUTPUT);
1219 pending = XEXP (pending, 1);
1220 pending_mem = XEXP (pending_mem, 1);
1221 }
1222
1223 pending = deps->pending_read_insns;
1224 pending_mem = deps->pending_read_mems;
1225 while (pending)
1226 {
1227 if (MEM_VOLATILE_P (XEXP (pending_mem, 0))
1228 && ! sched_insns_conditions_mutex_p (insn, XEXP (pending, 0)))
1229 add_dependence (insn, XEXP (pending, 0), REG_DEP_OUTPUT);
1230 pending = XEXP (pending, 1);
1231 pending_mem = XEXP (pending_mem, 1);
1232 }
1233
1234 add_dependence_list (insn, deps->last_pending_memory_flush, 1,
1235 REG_DEP_ANTI);
1236 }
1237 }
1238
1239 /* If this instruction can throw an exception, then moving it changes
1240 where block boundaries fall. This is mighty confusing elsewhere.
1241 Therefore, prevent such an instruction from being moved. */
1242 if (can_throw_internal (insn))
1243 reg_pending_barrier = MOVE_BARRIER;
1244
1245 /* Add dependencies if a scheduling barrier was found. */
1246 if (reg_pending_barrier)
1247 {
1248 /* In the case of barrier the most added dependencies are not
1249 real, so we use anti-dependence here. */
1250 if (sched_get_condition (insn))
1251 {
1252 EXECUTE_IF_SET_IN_REG_SET (&deps->reg_last_in_use, 0, i, rsi)
1253 {
1254 struct deps_reg *reg_last = &deps->reg_last[i];
1255 add_dependence_list (insn, reg_last->uses, 0, REG_DEP_ANTI);
1256 add_dependence_list
1257 (insn, reg_last->sets, 0,
1258 reg_pending_barrier == TRUE_BARRIER ? REG_DEP_TRUE : REG_DEP_ANTI);
1259 add_dependence_list
1260 (insn, reg_last->clobbers, 0,
1261 reg_pending_barrier == TRUE_BARRIER ? REG_DEP_TRUE : REG_DEP_ANTI);
1262 }
1263 }
1264 else
1265 {
1266 EXECUTE_IF_SET_IN_REG_SET (&deps->reg_last_in_use, 0, i, rsi)
1267 {
1268 struct deps_reg *reg_last = &deps->reg_last[i];
1269 add_dependence_list_and_free (insn, &reg_last->uses, 0,
1270 REG_DEP_ANTI);
1271 add_dependence_list_and_free
1272 (insn, &reg_last->sets, 0,
1273 reg_pending_barrier == TRUE_BARRIER ? REG_DEP_TRUE : REG_DEP_ANTI);
1274 add_dependence_list_and_free
1275 (insn, &reg_last->clobbers, 0,
1276 reg_pending_barrier == TRUE_BARRIER ? REG_DEP_TRUE : REG_DEP_ANTI);
1277 reg_last->uses_length = 0;
1278 reg_last->clobbers_length = 0;
1279 }
1280 }
1281
1282 for (i = 0; i < (unsigned)deps->max_reg; i++)
1283 {
1284 struct deps_reg *reg_last = &deps->reg_last[i];
1285 reg_last->sets = alloc_INSN_LIST (insn, reg_last->sets);
1286 SET_REGNO_REG_SET (&deps->reg_last_in_use, i);
1287 }
1288
1289 flush_pending_lists (deps, insn, true, true);
1290 CLEAR_REG_SET (&deps->reg_conditional_sets);
1291 reg_pending_barrier = NOT_A_BARRIER;
1292 }
1293 else
1294 {
1295 /* If the current insn is conditional, we can't free any
1296 of the lists. */
1297 if (sched_get_condition (insn))
1298 {
1299 EXECUTE_IF_SET_IN_REG_SET (reg_pending_uses, 0, i, rsi)
1300 {
1301 struct deps_reg *reg_last = &deps->reg_last[i];
1302 add_dependence_list (insn, reg_last->sets, 0, REG_DEP_TRUE);
1303 add_dependence_list (insn, reg_last->clobbers, 0, REG_DEP_TRUE);
1304 reg_last->uses = alloc_INSN_LIST (insn, reg_last->uses);
1305 reg_last->uses_length++;
1306 }
1307 EXECUTE_IF_SET_IN_REG_SET (reg_pending_clobbers, 0, i, rsi)
1308 {
1309 struct deps_reg *reg_last = &deps->reg_last[i];
1310 add_dependence_list (insn, reg_last->sets, 0, REG_DEP_OUTPUT);
1311 add_dependence_list (insn, reg_last->uses, 0, REG_DEP_ANTI);
1312 reg_last->clobbers = alloc_INSN_LIST (insn, reg_last->clobbers);
1313 reg_last->clobbers_length++;
1314 }
1315 EXECUTE_IF_SET_IN_REG_SET (reg_pending_sets, 0, i, rsi)
1316 {
1317 struct deps_reg *reg_last = &deps->reg_last[i];
1318 add_dependence_list (insn, reg_last->sets, 0, REG_DEP_OUTPUT);
1319 add_dependence_list (insn, reg_last->clobbers, 0, REG_DEP_OUTPUT);
1320 add_dependence_list (insn, reg_last->uses, 0, REG_DEP_ANTI);
1321 reg_last->sets = alloc_INSN_LIST (insn, reg_last->sets);
1322 SET_REGNO_REG_SET (&deps->reg_conditional_sets, i);
1323 }
1324 }
1325 else
1326 {
1327 EXECUTE_IF_SET_IN_REG_SET (reg_pending_uses, 0, i, rsi)
1328 {
1329 struct deps_reg *reg_last = &deps->reg_last[i];
1330 add_dependence_list (insn, reg_last->sets, 0, REG_DEP_TRUE);
1331 add_dependence_list (insn, reg_last->clobbers, 0, REG_DEP_TRUE);
1332 reg_last->uses_length++;
1333 reg_last->uses = alloc_INSN_LIST (insn, reg_last->uses);
1334 }
1335 EXECUTE_IF_SET_IN_REG_SET (reg_pending_clobbers, 0, i, rsi)
1336 {
1337 struct deps_reg *reg_last = &deps->reg_last[i];
1338 if (reg_last->uses_length > MAX_PENDING_LIST_LENGTH
1339 || reg_last->clobbers_length > MAX_PENDING_LIST_LENGTH)
1340 {
1341 add_dependence_list_and_free (insn, &reg_last->sets, 0,
1342 REG_DEP_OUTPUT);
1343 add_dependence_list_and_free (insn, &reg_last->uses, 0,
1344 REG_DEP_ANTI);
1345 add_dependence_list_and_free (insn, &reg_last->clobbers, 0,
1346 REG_DEP_OUTPUT);
1347 reg_last->sets = alloc_INSN_LIST (insn, reg_last->sets);
1348 reg_last->clobbers_length = 0;
1349 reg_last->uses_length = 0;
1350 }
1351 else
1352 {
1353 add_dependence_list (insn, reg_last->sets, 0, REG_DEP_OUTPUT);
1354 add_dependence_list (insn, reg_last->uses, 0, REG_DEP_ANTI);
1355 }
1356 reg_last->clobbers_length++;
1357 reg_last->clobbers = alloc_INSN_LIST (insn, reg_last->clobbers);
1358 }
1359 EXECUTE_IF_SET_IN_REG_SET (reg_pending_sets, 0, i, rsi)
1360 {
1361 struct deps_reg *reg_last = &deps->reg_last[i];
1362 add_dependence_list_and_free (insn, &reg_last->sets, 0,
1363 REG_DEP_OUTPUT);
1364 add_dependence_list_and_free (insn, &reg_last->clobbers, 0,
1365 REG_DEP_OUTPUT);
1366 add_dependence_list_and_free (insn, &reg_last->uses, 0,
1367 REG_DEP_ANTI);
1368 reg_last->sets = alloc_INSN_LIST (insn, reg_last->sets);
1369 reg_last->uses_length = 0;
1370 reg_last->clobbers_length = 0;
1371 CLEAR_REGNO_REG_SET (&deps->reg_conditional_sets, i);
1372 }
1373 }
1374
1375 IOR_REG_SET (&deps->reg_last_in_use, reg_pending_uses);
1376 IOR_REG_SET (&deps->reg_last_in_use, reg_pending_clobbers);
1377 IOR_REG_SET (&deps->reg_last_in_use, reg_pending_sets);
1378 }
1379 CLEAR_REG_SET (reg_pending_uses);
1380 CLEAR_REG_SET (reg_pending_clobbers);
1381 CLEAR_REG_SET (reg_pending_sets);
1382
1383 /* If we are currently in a libcall scheduling group, then mark the
1384 current insn as being in a scheduling group and that it can not
1385 be moved into a different basic block. */
1386
1387 if (deps->libcall_block_tail_insn)
1388 {
1389 SCHED_GROUP_P (insn) = 1;
1390 CANT_MOVE (insn) = 1;
1391 }
1392
1393 /* If a post-call group is still open, see if it should remain so.
1394 This insn must be a simple move of a hard reg to a pseudo or
1395 vice-versa.
1396
1397 We must avoid moving these insns for correctness on
1398 SMALL_REGISTER_CLASS machines, and for special registers like
1399 PIC_OFFSET_TABLE_REGNUM. For simplicity, extend this to all
1400 hard regs for all targets. */
1401
1402 if (deps->in_post_call_group_p)
1403 {
1404 rtx tmp, set = single_set (insn);
1405 int src_regno, dest_regno;
1406
1407 if (set == NULL)
1408 goto end_call_group;
1409
1410 tmp = SET_DEST (set);
1411 if (GET_CODE (tmp) == SUBREG)
1412 tmp = SUBREG_REG (tmp);
1413 if (REG_P (tmp))
1414 dest_regno = REGNO (tmp);
1415 else
1416 goto end_call_group;
1417
1418 tmp = SET_SRC (set);
1419 if (GET_CODE (tmp) == SUBREG)
1420 tmp = SUBREG_REG (tmp);
1421 if ((GET_CODE (tmp) == PLUS
1422 || GET_CODE (tmp) == MINUS)
1423 && REG_P (XEXP (tmp, 0))
1424 && REGNO (XEXP (tmp, 0)) == STACK_POINTER_REGNUM
1425 && dest_regno == STACK_POINTER_REGNUM)
1426 src_regno = STACK_POINTER_REGNUM;
1427 else if (REG_P (tmp))
1428 src_regno = REGNO (tmp);
1429 else
1430 goto end_call_group;
1431
1432 if (src_regno < FIRST_PSEUDO_REGISTER
1433 || dest_regno < FIRST_PSEUDO_REGISTER)
1434 {
1435 if (deps->in_post_call_group_p == post_call_initial)
1436 deps->in_post_call_group_p = post_call;
1437
1438 SCHED_GROUP_P (insn) = 1;
1439 CANT_MOVE (insn) = 1;
1440 }
1441 else
1442 {
1443 end_call_group:
1444 deps->in_post_call_group_p = not_post_call;
1445 }
1446 }
1447
1448 /* Fixup the dependencies in the sched group. */
1449 if (SCHED_GROUP_P (insn))
1450 fixup_sched_groups (insn);
1451 }
1452
1453 /* Analyze every insn between HEAD and TAIL inclusive, creating LOG_LINKS
1454 for every dependency. */
1455
1456 void
1457 sched_analyze (struct deps *deps, rtx head, rtx tail)
1458 {
1459 rtx insn;
1460
1461 if (current_sched_info->use_cselib)
1462 cselib_init (true);
1463
1464 /* Before reload, if the previous block ended in a call, show that
1465 we are inside a post-call group, so as to keep the lifetimes of
1466 hard registers correct. */
1467 if (! reload_completed && !LABEL_P (head))
1468 {
1469 insn = prev_nonnote_insn (head);
1470 if (insn && CALL_P (insn))
1471 deps->in_post_call_group_p = post_call_initial;
1472 }
1473 for (insn = head;; insn = NEXT_INSN (insn))
1474 {
1475 rtx link, end_seq, r0, set;
1476
1477 if (NONJUMP_INSN_P (insn) || JUMP_P (insn))
1478 {
1479 /* Clear out the stale LOG_LINKS from flow. */
1480 free_INSN_LIST_list (&LOG_LINKS (insn));
1481
1482 /* Make each JUMP_INSN a scheduling barrier for memory
1483 references. */
1484 if (JUMP_P (insn))
1485 {
1486 /* Keep the list a reasonable size. */
1487 if (deps->pending_flush_length++ > MAX_PENDING_LIST_LENGTH)
1488 flush_pending_lists (deps, insn, true, true);
1489 else
1490 deps->last_pending_memory_flush
1491 = alloc_INSN_LIST (insn, deps->last_pending_memory_flush);
1492 }
1493 sched_analyze_insn (deps, PATTERN (insn), insn);
1494 }
1495 else if (CALL_P (insn))
1496 {
1497 int i;
1498
1499 CANT_MOVE (insn) = 1;
1500
1501 /* Clear out the stale LOG_LINKS from flow. */
1502 free_INSN_LIST_list (&LOG_LINKS (insn));
1503
1504 if (find_reg_note (insn, REG_SETJMP, NULL))
1505 {
1506 /* This is setjmp. Assume that all registers, not just
1507 hard registers, may be clobbered by this call. */
1508 reg_pending_barrier = MOVE_BARRIER;
1509 }
1510 else
1511 {
1512 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
1513 /* A call may read and modify global register variables. */
1514 if (global_regs[i])
1515 {
1516 SET_REGNO_REG_SET (reg_pending_sets, i);
1517 SET_REGNO_REG_SET (reg_pending_uses, i);
1518 }
1519 /* Other call-clobbered hard regs may be clobbered.
1520 Since we only have a choice between 'might be clobbered'
1521 and 'definitely not clobbered', we must include all
1522 partly call-clobbered registers here. */
1523 else if (HARD_REGNO_CALL_PART_CLOBBERED (i, reg_raw_mode[i])
1524 || TEST_HARD_REG_BIT (regs_invalidated_by_call, i))
1525 SET_REGNO_REG_SET (reg_pending_clobbers, i);
1526 /* We don't know what set of fixed registers might be used
1527 by the function, but it is certain that the stack pointer
1528 is among them, but be conservative. */
1529 else if (fixed_regs[i])
1530 SET_REGNO_REG_SET (reg_pending_uses, i);
1531 /* The frame pointer is normally not used by the function
1532 itself, but by the debugger. */
1533 /* ??? MIPS o32 is an exception. It uses the frame pointer
1534 in the macro expansion of jal but does not represent this
1535 fact in the call_insn rtl. */
1536 else if (i == FRAME_POINTER_REGNUM
1537 || (i == HARD_FRAME_POINTER_REGNUM
1538 && (! reload_completed || frame_pointer_needed)))
1539 SET_REGNO_REG_SET (reg_pending_uses, i);
1540 }
1541
1542 /* For each insn which shouldn't cross a call, add a dependence
1543 between that insn and this call insn. */
1544 add_dependence_list_and_free (insn, &deps->sched_before_next_call, 1,
1545 REG_DEP_ANTI);
1546
1547 sched_analyze_insn (deps, PATTERN (insn), insn);
1548
1549 /* In the absence of interprocedural alias analysis, we must flush
1550 all pending reads and writes, and start new dependencies starting
1551 from here. But only flush writes for constant calls (which may
1552 be passed a pointer to something we haven't written yet). */
1553 flush_pending_lists (deps, insn, true, !CONST_OR_PURE_CALL_P (insn));
1554
1555 /* Remember the last function call for limiting lifetimes. */
1556 free_INSN_LIST_list (&deps->last_function_call);
1557 deps->last_function_call = alloc_INSN_LIST (insn, NULL_RTX);
1558
1559 /* Before reload, begin a post-call group, so as to keep the
1560 lifetimes of hard registers correct. */
1561 if (! reload_completed)
1562 deps->in_post_call_group_p = post_call;
1563 }
1564
1565 /* EH_REGION insn notes can not appear until well after we complete
1566 scheduling. */
1567 if (NOTE_P (insn))
1568 gcc_assert (NOTE_LINE_NUMBER (insn) != NOTE_INSN_EH_REGION_BEG
1569 && NOTE_LINE_NUMBER (insn) != NOTE_INSN_EH_REGION_END);
1570
1571 if (current_sched_info->use_cselib)
1572 cselib_process_insn (insn);
1573
1574 /* Now that we have completed handling INSN, check and see if it is
1575 a CLOBBER beginning a libcall block. If it is, record the
1576 end of the libcall sequence.
1577
1578 We want to schedule libcall blocks as a unit before reload. While
1579 this restricts scheduling, it preserves the meaning of a libcall
1580 block.
1581
1582 As a side effect, we may get better code due to decreased register
1583 pressure as well as less chance of a foreign insn appearing in
1584 a libcall block. */
1585 if (!reload_completed
1586 /* Note we may have nested libcall sequences. We only care about
1587 the outermost libcall sequence. */
1588 && deps->libcall_block_tail_insn == 0
1589 /* The sequence must start with a clobber of a register. */
1590 && NONJUMP_INSN_P (insn)
1591 && GET_CODE (PATTERN (insn)) == CLOBBER
1592 && (r0 = XEXP (PATTERN (insn), 0), REG_P (r0))
1593 && REG_P (XEXP (PATTERN (insn), 0))
1594 /* The CLOBBER must also have a REG_LIBCALL note attached. */
1595 && (link = find_reg_note (insn, REG_LIBCALL, NULL_RTX)) != 0
1596 && (end_seq = XEXP (link, 0)) != 0
1597 /* The insn referenced by the REG_LIBCALL note must be a
1598 simple nop copy with the same destination as the register
1599 mentioned in the clobber. */
1600 && (set = single_set (end_seq)) != 0
1601 && SET_DEST (set) == r0 && SET_SRC (set) == r0
1602 /* And finally the insn referenced by the REG_LIBCALL must
1603 also contain a REG_EQUAL note and a REG_RETVAL note. */
1604 && find_reg_note (end_seq, REG_EQUAL, NULL_RTX) != 0
1605 && find_reg_note (end_seq, REG_RETVAL, NULL_RTX) != 0)
1606 deps->libcall_block_tail_insn = XEXP (link, 0);
1607
1608 /* If we have reached the end of a libcall block, then close the
1609 block. */
1610 if (deps->libcall_block_tail_insn == insn)
1611 deps->libcall_block_tail_insn = 0;
1612
1613 if (insn == tail)
1614 {
1615 if (current_sched_info->use_cselib)
1616 cselib_finish ();
1617 return;
1618 }
1619 }
1620 gcc_unreachable ();
1621 }
1622 \f
1623
1624 /* The following function adds forward dependence (FROM, TO) with
1625 given DEP_TYPE. The forward dependence should be not exist before. */
1626
1627 void
1628 add_forw_dep (rtx to, rtx link)
1629 {
1630 rtx new_link, from;
1631
1632 from = XEXP (link, 0);
1633
1634 #ifdef ENABLE_CHECKING
1635 /* If add_dependence is working properly there should never
1636 be notes, deleted insns or duplicates in the backward
1637 links. Thus we need not check for them here.
1638
1639 However, if we have enabled checking we might as well go
1640 ahead and verify that add_dependence worked properly. */
1641 gcc_assert (INSN_P (from));
1642 gcc_assert (!INSN_DELETED_P (from));
1643 if (true_dependency_cache)
1644 {
1645 gcc_assert (!bitmap_bit_p (&forward_dependency_cache[INSN_LUID (from)],
1646 INSN_LUID (to)));
1647 bitmap_set_bit (&forward_dependency_cache[INSN_LUID (from)],
1648 INSN_LUID (to));
1649 }
1650 else
1651 gcc_assert (!find_insn_list (to, INSN_DEPEND (from)));
1652 #endif
1653
1654 if (!(current_sched_info->flags & USE_DEPS_LIST))
1655 new_link = alloc_INSN_LIST (to, INSN_DEPEND (from));
1656 else
1657 new_link = alloc_DEPS_LIST (to, INSN_DEPEND (from), DEP_STATUS (link));
1658
1659 PUT_REG_NOTE_KIND (new_link, REG_NOTE_KIND (link));
1660
1661 INSN_DEPEND (from) = new_link;
1662 INSN_DEP_COUNT (to) += 1;
1663 }
1664
1665 /* Examine insns in the range [ HEAD, TAIL ] and Use the backward
1666 dependences from LOG_LINKS to build forward dependences in
1667 INSN_DEPEND. */
1668
1669 void
1670 compute_forward_dependences (rtx head, rtx tail)
1671 {
1672 rtx insn;
1673 rtx next_tail;
1674
1675 next_tail = NEXT_INSN (tail);
1676 for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
1677 {
1678 rtx link;
1679
1680 if (! INSN_P (insn))
1681 continue;
1682
1683 if (current_sched_info->flags & DO_SPECULATION)
1684 {
1685 rtx new = 0, link, next;
1686
1687 for (link = LOG_LINKS (insn); link; link = next)
1688 {
1689 next = XEXP (link, 1);
1690 adjust_add_sorted_back_dep (insn, link, &new);
1691 }
1692
1693 LOG_LINKS (insn) = new;
1694 }
1695
1696 for (link = LOG_LINKS (insn); link; link = XEXP (link, 1))
1697 add_forw_dep (insn, link);
1698 }
1699 }
1700 \f
1701 /* Initialize variables for region data dependence analysis.
1702 n_bbs is the number of region blocks. */
1703
1704 void
1705 init_deps (struct deps *deps)
1706 {
1707 int max_reg = (reload_completed ? FIRST_PSEUDO_REGISTER : max_reg_num ());
1708
1709 deps->max_reg = max_reg;
1710 deps->reg_last = XCNEWVEC (struct deps_reg, max_reg);
1711 INIT_REG_SET (&deps->reg_last_in_use);
1712 INIT_REG_SET (&deps->reg_conditional_sets);
1713
1714 deps->pending_read_insns = 0;
1715 deps->pending_read_mems = 0;
1716 deps->pending_write_insns = 0;
1717 deps->pending_write_mems = 0;
1718 deps->pending_lists_length = 0;
1719 deps->pending_flush_length = 0;
1720 deps->last_pending_memory_flush = 0;
1721 deps->last_function_call = 0;
1722 deps->sched_before_next_call = 0;
1723 deps->in_post_call_group_p = not_post_call;
1724 deps->libcall_block_tail_insn = 0;
1725 }
1726
1727 /* Free insn lists found in DEPS. */
1728
1729 void
1730 free_deps (struct deps *deps)
1731 {
1732 unsigned i;
1733 reg_set_iterator rsi;
1734
1735 free_INSN_LIST_list (&deps->pending_read_insns);
1736 free_EXPR_LIST_list (&deps->pending_read_mems);
1737 free_INSN_LIST_list (&deps->pending_write_insns);
1738 free_EXPR_LIST_list (&deps->pending_write_mems);
1739 free_INSN_LIST_list (&deps->last_pending_memory_flush);
1740
1741 /* Without the EXECUTE_IF_SET, this loop is executed max_reg * nr_regions
1742 times. For a testcase with 42000 regs and 8000 small basic blocks,
1743 this loop accounted for nearly 60% (84 sec) of the total -O2 runtime. */
1744 EXECUTE_IF_SET_IN_REG_SET (&deps->reg_last_in_use, 0, i, rsi)
1745 {
1746 struct deps_reg *reg_last = &deps->reg_last[i];
1747 if (reg_last->uses)
1748 free_INSN_LIST_list (&reg_last->uses);
1749 if (reg_last->sets)
1750 free_INSN_LIST_list (&reg_last->sets);
1751 if (reg_last->clobbers)
1752 free_INSN_LIST_list (&reg_last->clobbers);
1753 }
1754 CLEAR_REG_SET (&deps->reg_last_in_use);
1755 CLEAR_REG_SET (&deps->reg_conditional_sets);
1756
1757 free (deps->reg_last);
1758 }
1759
1760 /* If it is profitable to use them, initialize caches for tracking
1761 dependency information. LUID is the number of insns to be scheduled,
1762 it is used in the estimate of profitability. */
1763
1764 void
1765 init_dependency_caches (int luid)
1766 {
1767 /* ?!? We could save some memory by computing a per-region luid mapping
1768 which could reduce both the number of vectors in the cache and the size
1769 of each vector. Instead we just avoid the cache entirely unless the
1770 average number of instructions in a basic block is very high. See
1771 the comment before the declaration of true_dependency_cache for
1772 what we consider "very high". */
1773 if (luid / n_basic_blocks > 100 * 5)
1774 {
1775 cache_size = 0;
1776 extend_dependency_caches (luid, true);
1777 }
1778 }
1779
1780 /* Create or extend (depending on CREATE_P) dependency caches to
1781 size N. */
1782 void
1783 extend_dependency_caches (int n, bool create_p)
1784 {
1785 if (create_p || true_dependency_cache)
1786 {
1787 int i, luid = cache_size + n;
1788
1789 true_dependency_cache = XRESIZEVEC (bitmap_head, true_dependency_cache,
1790 luid);
1791 output_dependency_cache = XRESIZEVEC (bitmap_head,
1792 output_dependency_cache, luid);
1793 anti_dependency_cache = XRESIZEVEC (bitmap_head, anti_dependency_cache,
1794 luid);
1795 #ifdef ENABLE_CHECKING
1796 forward_dependency_cache = XRESIZEVEC (bitmap_head,
1797 forward_dependency_cache, luid);
1798 #endif
1799 if (current_sched_info->flags & DO_SPECULATION)
1800 spec_dependency_cache = XRESIZEVEC (bitmap_head, spec_dependency_cache,
1801 luid);
1802
1803 for (i = cache_size; i < luid; i++)
1804 {
1805 bitmap_initialize (&true_dependency_cache[i], 0);
1806 bitmap_initialize (&output_dependency_cache[i], 0);
1807 bitmap_initialize (&anti_dependency_cache[i], 0);
1808 #ifdef ENABLE_CHECKING
1809 bitmap_initialize (&forward_dependency_cache[i], 0);
1810 #endif
1811 if (current_sched_info->flags & DO_SPECULATION)
1812 bitmap_initialize (&spec_dependency_cache[i], 0);
1813 }
1814 cache_size = luid;
1815 }
1816 }
1817
1818 /* Free the caches allocated in init_dependency_caches. */
1819
1820 void
1821 free_dependency_caches (void)
1822 {
1823 if (true_dependency_cache)
1824 {
1825 int i;
1826
1827 for (i = 0; i < cache_size; i++)
1828 {
1829 bitmap_clear (&true_dependency_cache[i]);
1830 bitmap_clear (&output_dependency_cache[i]);
1831 bitmap_clear (&anti_dependency_cache[i]);
1832 #ifdef ENABLE_CHECKING
1833 bitmap_clear (&forward_dependency_cache[i]);
1834 #endif
1835 if (current_sched_info->flags & DO_SPECULATION)
1836 bitmap_clear (&spec_dependency_cache[i]);
1837 }
1838 free (true_dependency_cache);
1839 true_dependency_cache = NULL;
1840 free (output_dependency_cache);
1841 output_dependency_cache = NULL;
1842 free (anti_dependency_cache);
1843 anti_dependency_cache = NULL;
1844 #ifdef ENABLE_CHECKING
1845 free (forward_dependency_cache);
1846 forward_dependency_cache = NULL;
1847 #endif
1848 if (current_sched_info->flags & DO_SPECULATION)
1849 {
1850 free (spec_dependency_cache);
1851 spec_dependency_cache = NULL;
1852 }
1853 }
1854 }
1855
1856 /* Initialize some global variables needed by the dependency analysis
1857 code. */
1858
1859 void
1860 init_deps_global (void)
1861 {
1862 reg_pending_sets = ALLOC_REG_SET (&reg_obstack);
1863 reg_pending_clobbers = ALLOC_REG_SET (&reg_obstack);
1864 reg_pending_uses = ALLOC_REG_SET (&reg_obstack);
1865 reg_pending_barrier = NOT_A_BARRIER;
1866 }
1867
1868 /* Free everything used by the dependency analysis code. */
1869
1870 void
1871 finish_deps_global (void)
1872 {
1873 FREE_REG_SET (reg_pending_sets);
1874 FREE_REG_SET (reg_pending_clobbers);
1875 FREE_REG_SET (reg_pending_uses);
1876 }
1877
1878 /* Insert LINK into the dependence chain pointed to by LINKP and
1879 maintain the sort order. */
1880 static void
1881 adjust_add_sorted_back_dep (rtx insn, rtx link, rtx *linkp)
1882 {
1883 gcc_assert (current_sched_info->flags & DO_SPECULATION);
1884
1885 /* If the insn cannot move speculatively, but the link is speculative,
1886 make it hard dependence. */
1887 if (HAS_INTERNAL_DEP (insn)
1888 && (DEP_STATUS (link) & SPECULATIVE))
1889 {
1890 DEP_STATUS (link) &= ~SPECULATIVE;
1891
1892 if (true_dependency_cache)
1893 bitmap_clear_bit (&spec_dependency_cache[INSN_LUID (insn)],
1894 INSN_LUID (XEXP (link, 0)));
1895 }
1896
1897 /* Non-speculative links go at the head of LOG_LINKS, followed by
1898 speculative links. */
1899 if (DEP_STATUS (link) & SPECULATIVE)
1900 while (*linkp && !(DEP_STATUS (*linkp) & SPECULATIVE))
1901 linkp = &XEXP (*linkp, 1);
1902
1903 XEXP (link, 1) = *linkp;
1904 *linkp = link;
1905 }
1906
1907 /* Move the dependence pointed to by LINKP to the back dependencies
1908 of INSN, and also add this dependence to the forward ones. All LOG_LINKS,
1909 except one pointed to by LINKP, must be sorted. */
1910 static void
1911 adjust_back_add_forw_dep (rtx insn, rtx *linkp)
1912 {
1913 rtx link;
1914
1915 gcc_assert (current_sched_info->flags & DO_SPECULATION);
1916
1917 link = *linkp;
1918 *linkp = XEXP (*linkp, 1);
1919
1920 adjust_add_sorted_back_dep (insn, link, &LOG_LINKS (insn));
1921 add_forw_dep (insn, link);
1922 }
1923
1924 /* Remove forward dependence ELEM from the DEPS_LIST of INSN. */
1925 static void
1926 delete_forw_dep (rtx insn, rtx elem)
1927 {
1928 gcc_assert (current_sched_info->flags & DO_SPECULATION);
1929
1930 #ifdef ENABLE_CHECKING
1931 if (true_dependency_cache)
1932 bitmap_clear_bit (&forward_dependency_cache[INSN_LUID (elem)],
1933 INSN_LUID (insn));
1934 #endif
1935
1936 remove_free_DEPS_LIST_elem (insn, &INSN_DEPEND (elem));
1937 INSN_DEP_COUNT (insn)--;
1938 }
1939
1940 /* Estimate the weakness of dependence between MEM1 and MEM2. */
1941 static dw_t
1942 estimate_dep_weak (rtx mem1, rtx mem2)
1943 {
1944 rtx r1, r2;
1945
1946 if (mem1 == mem2)
1947 /* MEMs are the same - don't speculate. */
1948 return MIN_DEP_WEAK;
1949
1950 r1 = XEXP (mem1, 0);
1951 r2 = XEXP (mem2, 0);
1952
1953 if (r1 == r2
1954 || (REG_P (r1) && REG_P (r2)
1955 && REGNO (r1) == REGNO (r2)))
1956 /* Again, MEMs are the same. */
1957 return MIN_DEP_WEAK;
1958 else if ((REG_P (r1) && !REG_P (r2))
1959 || (!REG_P (r1) && REG_P (r2)))
1960 /* Different addressing modes - reason to be more speculative,
1961 than usual. */
1962 return NO_DEP_WEAK - (NO_DEP_WEAK - UNCERTAIN_DEP_WEAK) / 2;
1963 else
1964 /* We can't say anything about the dependence. */
1965 return UNCERTAIN_DEP_WEAK;
1966 }
1967
1968 /* Add or update backward dependence between INSN and ELEM with type DEP_TYPE.
1969 This function can handle same INSN and ELEM (INSN == ELEM).
1970 It is a convenience wrapper. */
1971 void
1972 add_dependence (rtx insn, rtx elem, enum reg_note dep_type)
1973 {
1974 ds_t ds;
1975
1976 if (dep_type == REG_DEP_TRUE)
1977 ds = DEP_TRUE;
1978 else if (dep_type == REG_DEP_OUTPUT)
1979 ds = DEP_OUTPUT;
1980 else if (dep_type == REG_DEP_ANTI)
1981 ds = DEP_ANTI;
1982 else
1983 gcc_unreachable ();
1984
1985 maybe_add_or_update_back_dep_1 (insn, elem, dep_type, ds, 0, 0, 0);
1986 }
1987
1988 /* Add or update backward dependence between INSN and ELEM
1989 with given type DEP_TYPE and dep_status DS.
1990 This function is a convenience wrapper. */
1991 enum DEPS_ADJUST_RESULT
1992 add_or_update_back_dep (rtx insn, rtx elem, enum reg_note dep_type, ds_t ds)
1993 {
1994 return add_or_update_back_dep_1 (insn, elem, dep_type, ds, 0, 0, 0);
1995 }
1996
1997 /* Add or update both backward and forward dependencies between INSN and ELEM
1998 with given type DEP_TYPE and dep_status DS. */
1999 void
2000 add_or_update_back_forw_dep (rtx insn, rtx elem, enum reg_note dep_type,
2001 ds_t ds)
2002 {
2003 enum DEPS_ADJUST_RESULT res;
2004 rtx *linkp;
2005
2006 res = add_or_update_back_dep_1 (insn, elem, dep_type, ds, 0, 0, &linkp);
2007
2008 if (res == DEP_CHANGED || res == DEP_CREATED)
2009 {
2010 if (res == DEP_CHANGED)
2011 delete_forw_dep (insn, elem);
2012 else if (res == DEP_CREATED)
2013 linkp = &LOG_LINKS (insn);
2014
2015 adjust_back_add_forw_dep (insn, linkp);
2016 }
2017 }
2018
2019 /* Add both backward and forward dependencies between INSN and ELEM
2020 with given type DEP_TYPE and dep_status DS. */
2021 void
2022 add_back_forw_dep (rtx insn, rtx elem, enum reg_note dep_type, ds_t ds)
2023 {
2024 add_back_dep (insn, elem, dep_type, ds);
2025 adjust_back_add_forw_dep (insn, &LOG_LINKS (insn));
2026 }
2027
2028 /* Remove both backward and forward dependencies between INSN and ELEM. */
2029 void
2030 delete_back_forw_dep (rtx insn, rtx elem)
2031 {
2032 gcc_assert (current_sched_info->flags & DO_SPECULATION);
2033
2034 if (true_dependency_cache != NULL)
2035 {
2036 bitmap_clear_bit (&true_dependency_cache[INSN_LUID (insn)],
2037 INSN_LUID (elem));
2038 bitmap_clear_bit (&anti_dependency_cache[INSN_LUID (insn)],
2039 INSN_LUID (elem));
2040 bitmap_clear_bit (&output_dependency_cache[INSN_LUID (insn)],
2041 INSN_LUID (elem));
2042 bitmap_clear_bit (&spec_dependency_cache[INSN_LUID (insn)],
2043 INSN_LUID (elem));
2044 }
2045
2046 remove_free_DEPS_LIST_elem (elem, &LOG_LINKS (insn));
2047 delete_forw_dep (insn, elem);
2048 }
2049
2050 /* Return weakness of speculative type TYPE in the dep_status DS. */
2051 dw_t
2052 get_dep_weak (ds_t ds, ds_t type)
2053 {
2054 ds = ds & type;
2055 switch (type)
2056 {
2057 case BEGIN_DATA: ds >>= BEGIN_DATA_BITS_OFFSET; break;
2058 case BE_IN_DATA: ds >>= BE_IN_DATA_BITS_OFFSET; break;
2059 case BEGIN_CONTROL: ds >>= BEGIN_CONTROL_BITS_OFFSET; break;
2060 case BE_IN_CONTROL: ds >>= BE_IN_CONTROL_BITS_OFFSET; break;
2061 default: gcc_unreachable ();
2062 }
2063
2064 gcc_assert (MIN_DEP_WEAK <= ds && ds <= MAX_DEP_WEAK);
2065 return (dw_t) ds;
2066 }
2067
2068 /* Return the dep_status, which has the same parameters as DS, except for
2069 speculative type TYPE, that will have weakness DW. */
2070 ds_t
2071 set_dep_weak (ds_t ds, ds_t type, dw_t dw)
2072 {
2073 gcc_assert (MIN_DEP_WEAK <= dw && dw <= MAX_DEP_WEAK);
2074
2075 ds &= ~type;
2076 switch (type)
2077 {
2078 case BEGIN_DATA: ds |= ((ds_t) dw) << BEGIN_DATA_BITS_OFFSET; break;
2079 case BE_IN_DATA: ds |= ((ds_t) dw) << BE_IN_DATA_BITS_OFFSET; break;
2080 case BEGIN_CONTROL: ds |= ((ds_t) dw) << BEGIN_CONTROL_BITS_OFFSET; break;
2081 case BE_IN_CONTROL: ds |= ((ds_t) dw) << BE_IN_CONTROL_BITS_OFFSET; break;
2082 default: gcc_unreachable ();
2083 }
2084 return ds;
2085 }
2086
2087 /* Return the join of two dep_statuses DS1 and DS2. */
2088 ds_t
2089 ds_merge (ds_t ds1, ds_t ds2)
2090 {
2091 ds_t ds, t;
2092
2093 gcc_assert ((ds1 & SPECULATIVE) && (ds2 & SPECULATIVE));
2094
2095 ds = (ds1 & DEP_TYPES) | (ds2 & DEP_TYPES);
2096
2097 t = FIRST_SPEC_TYPE;
2098 do
2099 {
2100 if ((ds1 & t) && !(ds2 & t))
2101 ds |= ds1 & t;
2102 else if (!(ds1 & t) && (ds2 & t))
2103 ds |= ds2 & t;
2104 else if ((ds1 & t) && (ds2 & t))
2105 {
2106 ds_t dw;
2107
2108 dw = ((ds_t) get_dep_weak (ds1, t)) * ((ds_t) get_dep_weak (ds2, t));
2109 dw /= MAX_DEP_WEAK;
2110 if (dw < MIN_DEP_WEAK)
2111 dw = MIN_DEP_WEAK;
2112
2113 ds = set_dep_weak (ds, t, (dw_t) dw);
2114 }
2115
2116 if (t == LAST_SPEC_TYPE)
2117 break;
2118 t <<= SPEC_TYPE_SHIFT;
2119 }
2120 while (1);
2121
2122 return ds;
2123 }
2124
2125 #ifdef INSN_SCHEDULING
2126 #ifdef ENABLE_CHECKING
2127 /* Verify that dependence type and status are consistent.
2128 If RELAXED_P is true, then skip dep_weakness checks. */
2129 static void
2130 check_dep_status (enum reg_note dt, ds_t ds, bool relaxed_p)
2131 {
2132 /* Check that dependence type contains the same bits as the status. */
2133 if (dt == REG_DEP_TRUE)
2134 gcc_assert (ds & DEP_TRUE);
2135 else if (dt == REG_DEP_OUTPUT)
2136 gcc_assert ((ds & DEP_OUTPUT)
2137 && !(ds & DEP_TRUE));
2138 else
2139 gcc_assert ((dt == REG_DEP_ANTI)
2140 && (ds & DEP_ANTI)
2141 && !(ds & (DEP_OUTPUT | DEP_TRUE)));
2142
2143 /* HARD_DEP can not appear in dep_status of a link. */
2144 gcc_assert (!(ds & HARD_DEP));
2145
2146 /* Check that dependence status is set correctly when speculation is not
2147 supported. */
2148 if (!(current_sched_info->flags & DO_SPECULATION))
2149 gcc_assert (!(ds & SPECULATIVE));
2150 else if (ds & SPECULATIVE)
2151 {
2152 if (!relaxed_p)
2153 {
2154 ds_t type = FIRST_SPEC_TYPE;
2155
2156 /* Check that dependence weakness is in proper range. */
2157 do
2158 {
2159 if (ds & type)
2160 get_dep_weak (ds, type);
2161
2162 if (type == LAST_SPEC_TYPE)
2163 break;
2164 type <<= SPEC_TYPE_SHIFT;
2165 }
2166 while (1);
2167 }
2168
2169 if (ds & BEGIN_SPEC)
2170 {
2171 /* Only true dependence can be data speculative. */
2172 if (ds & BEGIN_DATA)
2173 gcc_assert (ds & DEP_TRUE);
2174
2175 /* Control dependencies in the insn scheduler are represented by
2176 anti-dependencies, therefore only anti dependence can be
2177 control speculative. */
2178 if (ds & BEGIN_CONTROL)
2179 gcc_assert (ds & DEP_ANTI);
2180 }
2181 else
2182 {
2183 /* Subsequent speculations should resolve true dependencies. */
2184 gcc_assert ((ds & DEP_TYPES) == DEP_TRUE);
2185 }
2186
2187 /* Check that true and anti dependencies can't have other speculative
2188 statuses. */
2189 if (ds & DEP_TRUE)
2190 gcc_assert (ds & (BEGIN_DATA | BE_IN_SPEC));
2191 /* An output dependence can't be speculative at all. */
2192 gcc_assert (!(ds & DEP_OUTPUT));
2193 if (ds & DEP_ANTI)
2194 gcc_assert (ds & BEGIN_CONTROL);
2195 }
2196 }
2197 #endif
2198 #endif