Merge from mainline
[official-gcc.git] / gcc / sched-deps.c
blob4831cff8ddfe4222384bbbed502167025f8c2265
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)
9 This file is part of GCC.
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.
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.
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. */
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"
48 static regset reg_pending_sets;
49 static regset reg_pending_clobbers;
50 static regset reg_pending_uses;
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
57 NOT_A_BARRIER = 0,
58 MOVE_BARRIER,
59 TRUE_BARRIER
62 static enum reg_pending_barrier_mode reg_pending_barrier;
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.
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.
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 *anti_dependency_cache;
79 static bitmap_head *output_dependency_cache;
80 static int cache_size;
82 /* To speed up checking consistency of formed forward insn
83 dependencies we use the following cache. Another possible solution
84 could be switching off checking duplication of insns in forward
85 dependencies. */
86 #ifdef ENABLE_CHECKING
87 static bitmap_head *forward_dependency_cache;
88 #endif
90 static int deps_may_trap_p (rtx);
91 static void add_dependence_list (rtx, rtx, int, enum reg_note);
92 static void add_dependence_list_and_free (rtx, rtx *, int, enum reg_note);
93 static void delete_all_dependences (rtx);
94 static void fixup_sched_groups (rtx);
96 static void flush_pending_lists (struct deps *, rtx, int, int);
97 static void sched_analyze_1 (struct deps *, rtx, rtx);
98 static void sched_analyze_2 (struct deps *, rtx, rtx);
99 static void sched_analyze_insn (struct deps *, rtx, rtx, rtx);
101 static rtx sched_get_condition (rtx);
102 static int conditions_mutex_p (rtx, rtx);
104 /* Return nonzero if a load of the memory reference MEM can cause a trap. */
106 static int
107 deps_may_trap_p (rtx mem)
109 rtx addr = XEXP (mem, 0);
111 if (REG_P (addr) && REGNO (addr) >= FIRST_PSEUDO_REGISTER)
113 rtx t = get_reg_known_value (REGNO (addr));
114 if (t)
115 addr = t;
117 return rtx_addr_can_trap_p (addr);
120 /* Return the INSN_LIST containing INSN in LIST, or NULL
121 if LIST does not contain INSN. */
124 find_insn_list (rtx insn, rtx list)
126 while (list)
128 if (XEXP (list, 0) == insn)
129 return list;
130 list = XEXP (list, 1);
132 return 0;
135 /* Find the condition under which INSN is executed. */
137 static rtx
138 sched_get_condition (rtx insn)
140 rtx pat = PATTERN (insn);
141 rtx src;
143 if (pat == 0)
144 return 0;
146 if (GET_CODE (pat) == COND_EXEC)
147 return COND_EXEC_TEST (pat);
149 if (!any_condjump_p (insn) || !onlyjump_p (insn))
150 return 0;
152 src = SET_SRC (pc_set (insn));
154 if (XEXP (src, 2) == pc_rtx)
155 return XEXP (src, 0);
156 else if (XEXP (src, 1) == pc_rtx)
158 rtx cond = XEXP (src, 0);
159 enum rtx_code revcode = reversed_comparison_code (cond, insn);
161 if (revcode == UNKNOWN)
162 return 0;
163 return gen_rtx_fmt_ee (revcode, GET_MODE (cond), XEXP (cond, 0),
164 XEXP (cond, 1));
167 return 0;
171 /* Return nonzero if conditions COND1 and COND2 can never be both true. */
173 static int
174 conditions_mutex_p (rtx cond1, rtx cond2)
176 if (COMPARISON_P (cond1)
177 && COMPARISON_P (cond2)
178 && GET_CODE (cond1) == reversed_comparison_code (cond2, NULL)
179 && XEXP (cond1, 0) == XEXP (cond2, 0)
180 && XEXP (cond1, 1) == XEXP (cond2, 1))
181 return 1;
182 return 0;
185 /* Return true if insn1 and insn2 can never depend on one another because
186 the conditions under which they are executed are mutually exclusive. */
187 bool
188 sched_insns_conditions_mutex_p (rtx insn1, rtx insn2)
190 rtx cond1, cond2;
192 /* flow.c doesn't handle conditional lifetimes entirely correctly;
193 calls mess up the conditional lifetimes. */
194 if (!CALL_P (insn1) && !CALL_P (insn2))
196 cond1 = sched_get_condition (insn1);
197 cond2 = sched_get_condition (insn2);
198 if (cond1 && cond2
199 && conditions_mutex_p (cond1, cond2)
200 /* Make sure first instruction doesn't affect condition of second
201 instruction if switched. */
202 && !modified_in_p (cond1, insn2)
203 /* Make sure second instruction doesn't affect condition of first
204 instruction if switched. */
205 && !modified_in_p (cond2, insn1))
206 return true;
208 return false;
211 /* Add ELEM wrapped in an INSN_LIST with reg note kind DEP_TYPE to the
212 LOG_LINKS of INSN, if not already there. DEP_TYPE indicates the
213 type of dependence that this link represents. The function returns
214 nonzero if a new entry has been added to insn's LOG_LINK. */
217 add_dependence (rtx insn, rtx elem, enum reg_note dep_type)
219 rtx link;
220 int present_p;
222 /* Don't depend an insn on itself. */
223 if (insn == elem)
224 return 0;
226 /* We can get a dependency on deleted insns due to optimizations in
227 the register allocation and reloading or due to splitting. Any
228 such dependency is useless and can be ignored. */
229 if (NOTE_P (elem))
230 return 0;
232 present_p = 1;
233 #ifdef INSN_SCHEDULING
234 /* ??? No good way to tell from here whether we're doing interblock
235 scheduling. Possibly add another callback. */
236 #if 0
237 /* (This code is guarded by INSN_SCHEDULING, otherwise INSN_BB is undefined.)
238 No need for interblock dependences with calls, since
239 calls are not moved between blocks. Note: the edge where
240 elem is a CALL is still required. */
241 if (CALL_P (insn)
242 && (INSN_BB (elem) != INSN_BB (insn)))
243 return 0;
244 #endif
246 /* If we already have a dependency for ELEM, then we do not need to
247 do anything. Avoiding the list walk below can cut compile times
248 dramatically for some code. */
249 if (true_dependency_cache != NULL)
251 enum reg_note present_dep_type = 0;
253 gcc_assert (anti_dependency_cache);
254 gcc_assert (output_dependency_cache);
255 if (bitmap_bit_p (&true_dependency_cache[INSN_LUID (insn)],
256 INSN_LUID (elem)))
257 /* Do nothing (present_set_type is already 0). */
259 else if (bitmap_bit_p (&anti_dependency_cache[INSN_LUID (insn)],
260 INSN_LUID (elem)))
261 present_dep_type = REG_DEP_ANTI;
262 else if (bitmap_bit_p (&output_dependency_cache[INSN_LUID (insn)],
263 INSN_LUID (elem)))
264 present_dep_type = REG_DEP_OUTPUT;
265 else
266 present_p = 0;
267 if (present_p && (int) dep_type >= (int) present_dep_type)
268 return 0;
270 #endif
272 /* Check that we don't already have this dependence. */
273 if (present_p)
274 for (link = LOG_LINKS (insn); link; link = XEXP (link, 1))
275 if (XEXP (link, 0) == elem)
277 #ifdef INSN_SCHEDULING
278 /* Clear corresponding cache entry because type of the link
279 may be changed. */
280 if (true_dependency_cache != NULL)
282 enum reg_note kind = REG_NOTE_KIND (link);
283 switch (kind)
285 case REG_DEP_ANTI:
286 bitmap_clear_bit (&anti_dependency_cache[INSN_LUID (insn)],
287 INSN_LUID (elem));
288 break;
289 case REG_DEP_OUTPUT:
290 gcc_assert (output_dependency_cache);
291 bitmap_clear_bit (&output_dependency_cache[INSN_LUID (insn)],
292 INSN_LUID (elem));
293 break;
294 default:
295 gcc_unreachable ();
298 #endif
300 /* If this is a more restrictive type of dependence than the existing
301 one, then change the existing dependence to this type. */
302 if ((int) dep_type < (int) REG_NOTE_KIND (link))
303 PUT_REG_NOTE_KIND (link, dep_type);
305 #ifdef INSN_SCHEDULING
306 /* If we are adding a dependency to INSN's LOG_LINKs, then
307 note that in the bitmap caches of dependency information. */
308 if (true_dependency_cache != NULL)
310 if ((int) REG_NOTE_KIND (link) == 0)
311 bitmap_set_bit (&true_dependency_cache[INSN_LUID (insn)],
312 INSN_LUID (elem));
313 else if (REG_NOTE_KIND (link) == REG_DEP_ANTI)
314 bitmap_set_bit (&anti_dependency_cache[INSN_LUID (insn)],
315 INSN_LUID (elem));
316 else if (REG_NOTE_KIND (link) == REG_DEP_OUTPUT)
317 bitmap_set_bit (&output_dependency_cache[INSN_LUID (insn)],
318 INSN_LUID (elem));
320 #endif
321 return 0;
323 /* Might want to check one level of transitivity to save conses. */
325 link = alloc_INSN_LIST (elem, LOG_LINKS (insn));
326 LOG_LINKS (insn) = link;
328 /* Insn dependency, not data dependency. */
329 PUT_REG_NOTE_KIND (link, dep_type);
331 #ifdef INSN_SCHEDULING
332 /* If we are adding a dependency to INSN's LOG_LINKs, then note that
333 in the bitmap caches of dependency information. */
334 if (true_dependency_cache != NULL)
336 if ((int) dep_type == 0)
337 bitmap_set_bit (&true_dependency_cache[INSN_LUID (insn)], INSN_LUID (elem));
338 else if (dep_type == REG_DEP_ANTI)
339 bitmap_set_bit (&anti_dependency_cache[INSN_LUID (insn)], INSN_LUID (elem));
340 else if (dep_type == REG_DEP_OUTPUT)
341 bitmap_set_bit (&output_dependency_cache[INSN_LUID (insn)], INSN_LUID (elem));
343 #endif
344 return 1;
347 /* A convenience wrapper to operate on an entire list. */
349 static void
350 add_dependence_list (rtx insn, rtx list, int uncond, enum reg_note dep_type)
352 for (; list; list = XEXP (list, 1))
354 if (uncond || ! sched_insns_conditions_mutex_p (insn, XEXP (list, 0)))
355 add_dependence (insn, XEXP (list, 0), dep_type);
359 /* Similar, but free *LISTP at the same time. */
361 static void
362 add_dependence_list_and_free (rtx insn, rtx *listp, int uncond,
363 enum reg_note dep_type)
365 rtx list, next;
366 for (list = *listp, *listp = NULL; list ; list = next)
368 next = XEXP (list, 1);
369 if (uncond || ! sched_insns_conditions_mutex_p (insn, XEXP (list, 0)))
370 add_dependence (insn, XEXP (list, 0), dep_type);
371 free_INSN_LIST_node (list);
375 /* Clear all dependencies for an insn. */
377 static void
378 delete_all_dependences (rtx insn)
380 /* Clear caches, if they exist, as well as free the dependence. */
382 #ifdef INSN_SCHEDULING
383 if (true_dependency_cache != NULL)
385 bitmap_clear (&true_dependency_cache[INSN_LUID (insn)]);
386 bitmap_clear (&anti_dependency_cache[INSN_LUID (insn)]);
387 bitmap_clear (&output_dependency_cache[INSN_LUID (insn)]);
389 #endif
391 free_INSN_LIST_list (&LOG_LINKS (insn));
394 /* All insns in a scheduling group except the first should only have
395 dependencies on the previous insn in the group. So we find the
396 first instruction in the scheduling group by walking the dependence
397 chains backwards. Then we add the dependencies for the group to
398 the previous nonnote insn. */
400 static void
401 fixup_sched_groups (rtx insn)
403 rtx link, prev_nonnote;
405 for (link = LOG_LINKS (insn); link ; link = XEXP (link, 1))
407 rtx i = insn;
410 i = prev_nonnote_insn (i);
412 if (XEXP (link, 0) == i)
413 goto next_link;
414 } while (SCHED_GROUP_P (i));
415 if (! sched_insns_conditions_mutex_p (i, XEXP (link, 0)))
416 add_dependence (i, XEXP (link, 0), REG_NOTE_KIND (link));
417 next_link:;
420 delete_all_dependences (insn);
422 prev_nonnote = prev_nonnote_insn (insn);
423 if (BLOCK_FOR_INSN (insn) == BLOCK_FOR_INSN (prev_nonnote)
424 && ! sched_insns_conditions_mutex_p (insn, prev_nonnote))
425 add_dependence (insn, prev_nonnote, REG_DEP_ANTI);
428 /* Process an insn's memory dependencies. There are four kinds of
429 dependencies:
431 (0) read dependence: read follows read
432 (1) true dependence: read follows write
433 (2) anti dependence: write follows read
434 (3) output dependence: write follows write
436 We are careful to build only dependencies which actually exist, and
437 use transitivity to avoid building too many links. */
439 /* Add an INSN and MEM reference pair to a pending INSN_LIST and MEM_LIST.
440 The MEM is a memory reference contained within INSN, which we are saving
441 so that we can do memory aliasing on it. */
443 static void
444 add_insn_mem_dependence (struct deps *deps, rtx *insn_list, rtx *mem_list,
445 rtx insn, rtx mem)
447 rtx link;
449 link = alloc_INSN_LIST (insn, *insn_list);
450 *insn_list = link;
452 if (current_sched_info->use_cselib)
454 mem = shallow_copy_rtx (mem);
455 XEXP (mem, 0) = cselib_subst_to_values (XEXP (mem, 0));
457 link = alloc_EXPR_LIST (VOIDmode, canon_rtx (mem), *mem_list);
458 *mem_list = link;
460 deps->pending_lists_length++;
463 /* Make a dependency between every memory reference on the pending lists
464 and INSN, thus flushing the pending lists. FOR_READ is true if emitting
465 dependencies for a read operation, similarly with FOR_WRITE. */
467 static void
468 flush_pending_lists (struct deps *deps, rtx insn, int for_read,
469 int for_write)
471 if (for_write)
473 add_dependence_list_and_free (insn, &deps->pending_read_insns, 1,
474 REG_DEP_ANTI);
475 free_EXPR_LIST_list (&deps->pending_read_mems);
478 add_dependence_list_and_free (insn, &deps->pending_write_insns, 1,
479 for_read ? REG_DEP_ANTI : REG_DEP_OUTPUT);
480 free_EXPR_LIST_list (&deps->pending_write_mems);
481 deps->pending_lists_length = 0;
483 add_dependence_list_and_free (insn, &deps->last_pending_memory_flush, 1,
484 for_read ? REG_DEP_ANTI : REG_DEP_OUTPUT);
485 deps->last_pending_memory_flush = alloc_INSN_LIST (insn, NULL_RTX);
486 deps->pending_flush_length = 1;
489 /* Analyze a single SET, CLOBBER, PRE_DEC, POST_DEC, PRE_INC or POST_INC
490 rtx, X, creating all dependencies generated by the write to the
491 destination of X, and reads of everything mentioned. */
493 static void
494 sched_analyze_1 (struct deps *deps, rtx x, rtx insn)
496 int regno;
497 rtx dest = XEXP (x, 0);
498 enum rtx_code code = GET_CODE (x);
500 if (dest == 0)
501 return;
503 if (GET_CODE (dest) == PARALLEL)
505 int i;
507 for (i = XVECLEN (dest, 0) - 1; i >= 0; i--)
508 if (XEXP (XVECEXP (dest, 0, i), 0) != 0)
509 sched_analyze_1 (deps,
510 gen_rtx_CLOBBER (VOIDmode,
511 XEXP (XVECEXP (dest, 0, i), 0)),
512 insn);
514 if (GET_CODE (x) == SET)
515 sched_analyze_2 (deps, SET_SRC (x), insn);
516 return;
519 while (GET_CODE (dest) == STRICT_LOW_PART || GET_CODE (dest) == SUBREG
520 || GET_CODE (dest) == ZERO_EXTRACT)
522 if (GET_CODE (dest) == STRICT_LOW_PART
523 || GET_CODE (dest) == ZERO_EXTRACT
524 || df_read_modify_subreg_p (dest))
526 /* These both read and modify the result. We must handle
527 them as writes to get proper dependencies for following
528 instructions. We must handle them as reads to get proper
529 dependencies from this to previous instructions.
530 Thus we need to call sched_analyze_2. */
532 sched_analyze_2 (deps, XEXP (dest, 0), insn);
534 if (GET_CODE (dest) == ZERO_EXTRACT)
536 /* The second and third arguments are values read by this insn. */
537 sched_analyze_2 (deps, XEXP (dest, 1), insn);
538 sched_analyze_2 (deps, XEXP (dest, 2), insn);
540 dest = XEXP (dest, 0);
543 if (REG_P (dest))
545 regno = REGNO (dest);
547 #ifdef STACK_REGS
548 /* Treat all writes to a stack register as modifying the TOS. */
549 if (regno >= FIRST_STACK_REG && regno <= LAST_STACK_REG)
551 SET_REGNO_REG_SET (reg_pending_uses, FIRST_STACK_REG);
552 regno = FIRST_STACK_REG;
554 #endif
556 /* A hard reg in a wide mode may really be multiple registers.
557 If so, mark all of them just like the first. */
558 if (regno < FIRST_PSEUDO_REGISTER)
560 int i = hard_regno_nregs[regno][GET_MODE (dest)];
561 if (code == SET)
563 while (--i >= 0)
564 SET_REGNO_REG_SET (reg_pending_sets, regno + i);
566 else
568 while (--i >= 0)
569 SET_REGNO_REG_SET (reg_pending_clobbers, regno + i);
572 /* ??? Reload sometimes emits USEs and CLOBBERs of pseudos that
573 it does not reload. Ignore these as they have served their
574 purpose already. */
575 else if (regno >= deps->max_reg)
577 gcc_assert (GET_CODE (PATTERN (insn)) == USE
578 || GET_CODE (PATTERN (insn)) == CLOBBER);
580 else
582 if (code == SET)
583 SET_REGNO_REG_SET (reg_pending_sets, regno);
584 else
585 SET_REGNO_REG_SET (reg_pending_clobbers, regno);
587 /* Pseudos that are REG_EQUIV to something may be replaced
588 by that during reloading. We need only add dependencies for
589 the address in the REG_EQUIV note. */
590 if (!reload_completed && get_reg_known_equiv_p (regno))
592 rtx t = get_reg_known_value (regno);
593 if (MEM_P (t))
594 sched_analyze_2 (deps, XEXP (t, 0), insn);
597 /* Don't let it cross a call after scheduling if it doesn't
598 already cross one. */
599 if (REG_N_CALLS_CROSSED (regno) == 0)
600 add_dependence_list (insn, deps->last_function_call, 1,
601 REG_DEP_ANTI);
604 else if (MEM_P (dest))
606 /* Writing memory. */
607 rtx t = dest;
609 if (current_sched_info->use_cselib)
611 t = shallow_copy_rtx (dest);
612 cselib_lookup (XEXP (t, 0), Pmode, 1);
613 XEXP (t, 0) = cselib_subst_to_values (XEXP (t, 0));
615 t = canon_rtx (t);
617 if (deps->pending_lists_length > MAX_PENDING_LIST_LENGTH)
619 /* Flush all pending reads and writes to prevent the pending lists
620 from getting any larger. Insn scheduling runs too slowly when
621 these lists get long. When compiling GCC with itself,
622 this flush occurs 8 times for sparc, and 10 times for m88k using
623 the default value of 32. */
624 flush_pending_lists (deps, insn, false, true);
626 else
628 rtx pending, pending_mem;
630 pending = deps->pending_read_insns;
631 pending_mem = deps->pending_read_mems;
632 while (pending)
634 if (anti_dependence (XEXP (pending_mem, 0), t)
635 && ! sched_insns_conditions_mutex_p (insn, XEXP (pending, 0)))
636 add_dependence (insn, XEXP (pending, 0), REG_DEP_ANTI);
638 pending = XEXP (pending, 1);
639 pending_mem = XEXP (pending_mem, 1);
642 pending = deps->pending_write_insns;
643 pending_mem = deps->pending_write_mems;
644 while (pending)
646 if (output_dependence (XEXP (pending_mem, 0), t)
647 && ! sched_insns_conditions_mutex_p (insn, XEXP (pending, 0)))
648 add_dependence (insn, XEXP (pending, 0), REG_DEP_OUTPUT);
650 pending = XEXP (pending, 1);
651 pending_mem = XEXP (pending_mem, 1);
654 add_dependence_list (insn, deps->last_pending_memory_flush, 1,
655 REG_DEP_ANTI);
657 add_insn_mem_dependence (deps, &deps->pending_write_insns,
658 &deps->pending_write_mems, insn, dest);
660 sched_analyze_2 (deps, XEXP (dest, 0), insn);
663 /* Analyze reads. */
664 if (GET_CODE (x) == SET)
665 sched_analyze_2 (deps, SET_SRC (x), insn);
668 /* Analyze the uses of memory and registers in rtx X in INSN. */
670 static void
671 sched_analyze_2 (struct deps *deps, rtx x, rtx insn)
673 int i;
674 int j;
675 enum rtx_code code;
676 const char *fmt;
678 if (x == 0)
679 return;
681 code = GET_CODE (x);
683 switch (code)
685 case CONST_INT:
686 case CONST_DOUBLE:
687 case CONST_VECTOR:
688 case SYMBOL_REF:
689 case CONST:
690 case LABEL_REF:
691 /* Ignore constants. Note that we must handle CONST_DOUBLE here
692 because it may have a cc0_rtx in its CONST_DOUBLE_CHAIN field, but
693 this does not mean that this insn is using cc0. */
694 return;
696 #ifdef HAVE_cc0
697 case CC0:
698 /* User of CC0 depends on immediately preceding insn. */
699 SCHED_GROUP_P (insn) = 1;
700 /* Don't move CC0 setter to another block (it can set up the
701 same flag for previous CC0 users which is safe). */
702 CANT_MOVE (prev_nonnote_insn (insn)) = 1;
703 return;
704 #endif
706 case REG:
708 int regno = REGNO (x);
710 #ifdef STACK_REGS
711 /* Treat all reads of a stack register as modifying the TOS. */
712 if (regno >= FIRST_STACK_REG && regno <= LAST_STACK_REG)
714 SET_REGNO_REG_SET (reg_pending_sets, FIRST_STACK_REG);
715 regno = FIRST_STACK_REG;
717 #endif
719 if (regno < FIRST_PSEUDO_REGISTER)
721 int i = hard_regno_nregs[regno][GET_MODE (x)];
722 while (--i >= 0)
723 SET_REGNO_REG_SET (reg_pending_uses, regno + i);
725 /* ??? Reload sometimes emits USEs and CLOBBERs of pseudos that
726 it does not reload. Ignore these as they have served their
727 purpose already. */
728 else if (regno >= deps->max_reg)
730 gcc_assert (GET_CODE (PATTERN (insn)) == USE
731 || GET_CODE (PATTERN (insn)) == CLOBBER);
733 else
735 SET_REGNO_REG_SET (reg_pending_uses, regno);
737 /* Pseudos that are REG_EQUIV to something may be replaced
738 by that during reloading. We need only add dependencies for
739 the address in the REG_EQUIV note. */
740 if (!reload_completed && get_reg_known_equiv_p (regno))
742 rtx t = get_reg_known_value (regno);
743 if (MEM_P (t))
744 sched_analyze_2 (deps, XEXP (t, 0), insn);
747 /* If the register does not already cross any calls, then add this
748 insn to the sched_before_next_call list so that it will still
749 not cross calls after scheduling. */
750 if (REG_N_CALLS_CROSSED (regno) == 0)
751 deps->sched_before_next_call
752 = alloc_INSN_LIST (insn, deps->sched_before_next_call);
754 return;
757 case MEM:
759 /* Reading memory. */
760 rtx u;
761 rtx pending, pending_mem;
762 rtx t = x;
764 if (current_sched_info->use_cselib)
766 t = shallow_copy_rtx (t);
767 cselib_lookup (XEXP (t, 0), Pmode, 1);
768 XEXP (t, 0) = cselib_subst_to_values (XEXP (t, 0));
770 t = canon_rtx (t);
771 pending = deps->pending_read_insns;
772 pending_mem = deps->pending_read_mems;
773 while (pending)
775 if (read_dependence (XEXP (pending_mem, 0), t)
776 && ! sched_insns_conditions_mutex_p (insn, XEXP (pending, 0)))
777 add_dependence (insn, XEXP (pending, 0), REG_DEP_ANTI);
779 pending = XEXP (pending, 1);
780 pending_mem = XEXP (pending_mem, 1);
783 pending = deps->pending_write_insns;
784 pending_mem = deps->pending_write_mems;
785 while (pending)
787 if (true_dependence (XEXP (pending_mem, 0), VOIDmode,
788 t, rtx_varies_p)
789 && ! sched_insns_conditions_mutex_p (insn, XEXP (pending, 0)))
790 add_dependence (insn, XEXP (pending, 0), REG_DEP_TRUE);
792 pending = XEXP (pending, 1);
793 pending_mem = XEXP (pending_mem, 1);
796 for (u = deps->last_pending_memory_flush; u; u = XEXP (u, 1))
797 if (! JUMP_P (XEXP (u, 0)) || deps_may_trap_p (x))
798 add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI);
800 /* Always add these dependencies to pending_reads, since
801 this insn may be followed by a write. */
802 add_insn_mem_dependence (deps, &deps->pending_read_insns,
803 &deps->pending_read_mems, insn, x);
805 /* Take advantage of tail recursion here. */
806 sched_analyze_2 (deps, XEXP (x, 0), insn);
807 return;
810 /* Force pending stores to memory in case a trap handler needs them. */
811 case TRAP_IF:
812 flush_pending_lists (deps, insn, true, false);
813 break;
815 case ASM_OPERANDS:
816 case ASM_INPUT:
817 case UNSPEC_VOLATILE:
819 /* Traditional and volatile asm instructions must be considered to use
820 and clobber all hard registers, all pseudo-registers and all of
821 memory. So must TRAP_IF and UNSPEC_VOLATILE operations.
823 Consider for instance a volatile asm that changes the fpu rounding
824 mode. An insn should not be moved across this even if it only uses
825 pseudo-regs because it might give an incorrectly rounded result. */
826 if (code != ASM_OPERANDS || MEM_VOLATILE_P (x))
827 reg_pending_barrier = TRUE_BARRIER;
829 /* For all ASM_OPERANDS, we must traverse the vector of input operands.
830 We can not just fall through here since then we would be confused
831 by the ASM_INPUT rtx inside ASM_OPERANDS, which do not indicate
832 traditional asms unlike their normal usage. */
834 if (code == ASM_OPERANDS)
836 for (j = 0; j < ASM_OPERANDS_INPUT_LENGTH (x); j++)
837 sched_analyze_2 (deps, ASM_OPERANDS_INPUT (x, j), insn);
838 return;
840 break;
843 case PRE_DEC:
844 case POST_DEC:
845 case PRE_INC:
846 case POST_INC:
847 /* These both read and modify the result. We must handle them as writes
848 to get proper dependencies for following instructions. We must handle
849 them as reads to get proper dependencies from this to previous
850 instructions. Thus we need to pass them to both sched_analyze_1
851 and sched_analyze_2. We must call sched_analyze_2 first in order
852 to get the proper antecedent for the read. */
853 sched_analyze_2 (deps, XEXP (x, 0), insn);
854 sched_analyze_1 (deps, x, insn);
855 return;
857 case POST_MODIFY:
858 case PRE_MODIFY:
859 /* op0 = op0 + op1 */
860 sched_analyze_2 (deps, XEXP (x, 0), insn);
861 sched_analyze_2 (deps, XEXP (x, 1), insn);
862 sched_analyze_1 (deps, x, insn);
863 return;
865 default:
866 break;
869 /* Other cases: walk the insn. */
870 fmt = GET_RTX_FORMAT (code);
871 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
873 if (fmt[i] == 'e')
874 sched_analyze_2 (deps, XEXP (x, i), insn);
875 else if (fmt[i] == 'E')
876 for (j = 0; j < XVECLEN (x, i); j++)
877 sched_analyze_2 (deps, XVECEXP (x, i, j), insn);
881 /* Analyze an INSN with pattern X to find all dependencies. */
883 static void
884 sched_analyze_insn (struct deps *deps, rtx x, rtx insn, rtx loop_notes)
886 RTX_CODE code = GET_CODE (x);
887 rtx link;
888 unsigned i;
889 reg_set_iterator rsi;
891 if (code == COND_EXEC)
893 sched_analyze_2 (deps, COND_EXEC_TEST (x), insn);
895 /* ??? Should be recording conditions so we reduce the number of
896 false dependencies. */
897 x = COND_EXEC_CODE (x);
898 code = GET_CODE (x);
900 if (code == SET || code == CLOBBER)
902 sched_analyze_1 (deps, x, insn);
904 /* Bare clobber insns are used for letting life analysis, reg-stack
905 and others know that a value is dead. Depend on the last call
906 instruction so that reg-stack won't get confused. */
907 if (code == CLOBBER)
908 add_dependence_list (insn, deps->last_function_call, 1, REG_DEP_OUTPUT);
910 else if (code == PARALLEL)
912 for (i = XVECLEN (x, 0); i--;)
914 rtx sub = XVECEXP (x, 0, i);
915 code = GET_CODE (sub);
917 if (code == COND_EXEC)
919 sched_analyze_2 (deps, COND_EXEC_TEST (sub), insn);
920 sub = COND_EXEC_CODE (sub);
921 code = GET_CODE (sub);
923 if (code == SET || code == CLOBBER)
924 sched_analyze_1 (deps, sub, insn);
925 else
926 sched_analyze_2 (deps, sub, insn);
929 else
930 sched_analyze_2 (deps, x, insn);
932 /* Mark registers CLOBBERED or used by called function. */
933 if (CALL_P (insn))
935 for (link = CALL_INSN_FUNCTION_USAGE (insn); link; link = XEXP (link, 1))
937 if (GET_CODE (XEXP (link, 0)) == CLOBBER)
938 sched_analyze_1 (deps, XEXP (link, 0), insn);
939 else
940 sched_analyze_2 (deps, XEXP (link, 0), insn);
942 if (find_reg_note (insn, REG_SETJMP, NULL))
943 reg_pending_barrier = MOVE_BARRIER;
946 if (JUMP_P (insn))
948 rtx next;
949 next = next_nonnote_insn (insn);
950 if (next && BARRIER_P (next))
951 reg_pending_barrier = TRUE_BARRIER;
952 else
954 rtx pending, pending_mem;
955 regset_head tmp_uses, tmp_sets;
956 INIT_REG_SET (&tmp_uses);
957 INIT_REG_SET (&tmp_sets);
959 (*current_sched_info->compute_jump_reg_dependencies)
960 (insn, &deps->reg_conditional_sets, &tmp_uses, &tmp_sets);
961 /* Make latency of jump equal to 0 by using anti-dependence. */
962 EXECUTE_IF_SET_IN_REG_SET (&tmp_uses, 0, i, rsi)
964 struct deps_reg *reg_last = &deps->reg_last[i];
965 add_dependence_list (insn, reg_last->sets, 0, REG_DEP_ANTI);
966 add_dependence_list (insn, reg_last->clobbers, 0, REG_DEP_ANTI);
967 reg_last->uses_length++;
968 reg_last->uses = alloc_INSN_LIST (insn, reg_last->uses);
970 IOR_REG_SET (reg_pending_sets, &tmp_sets);
972 CLEAR_REG_SET (&tmp_uses);
973 CLEAR_REG_SET (&tmp_sets);
975 /* All memory writes and volatile reads must happen before the
976 jump. Non-volatile reads must happen before the jump iff
977 the result is needed by the above register used mask. */
979 pending = deps->pending_write_insns;
980 pending_mem = deps->pending_write_mems;
981 while (pending)
983 if (! sched_insns_conditions_mutex_p (insn, XEXP (pending, 0)))
984 add_dependence (insn, XEXP (pending, 0), REG_DEP_OUTPUT);
985 pending = XEXP (pending, 1);
986 pending_mem = XEXP (pending_mem, 1);
989 pending = deps->pending_read_insns;
990 pending_mem = deps->pending_read_mems;
991 while (pending)
993 if (MEM_VOLATILE_P (XEXP (pending_mem, 0))
994 && ! sched_insns_conditions_mutex_p (insn, XEXP (pending, 0)))
995 add_dependence (insn, XEXP (pending, 0), REG_DEP_OUTPUT);
996 pending = XEXP (pending, 1);
997 pending_mem = XEXP (pending_mem, 1);
1000 add_dependence_list (insn, deps->last_pending_memory_flush, 1,
1001 REG_DEP_ANTI);
1005 /* If there is a {LOOP,EHREGION}_{BEG,END} note in the middle of a basic
1006 block, then we must be sure that no instructions are scheduled across it.
1007 Otherwise, the reg_n_refs info (which depends on loop_depth) would
1008 become incorrect. */
1009 if (loop_notes)
1011 rtx link;
1013 /* Update loop_notes with any notes from this insn. */
1014 link = loop_notes;
1015 while (XEXP (link, 1))
1017 gcc_assert (INTVAL (XEXP (link, 0)) == NOTE_INSN_LOOP_BEG
1018 || INTVAL (XEXP (link, 0)) == NOTE_INSN_LOOP_END);
1020 reg_pending_barrier = MOVE_BARRIER;
1021 link = XEXP (link, 1);
1023 XEXP (link, 1) = REG_NOTES (insn);
1024 REG_NOTES (insn) = loop_notes;
1027 /* If this instruction can throw an exception, then moving it changes
1028 where block boundaries fall. This is mighty confusing elsewhere.
1029 Therefore, prevent such an instruction from being moved. */
1030 if (can_throw_internal (insn))
1031 reg_pending_barrier = MOVE_BARRIER;
1033 /* Add dependencies if a scheduling barrier was found. */
1034 if (reg_pending_barrier)
1036 /* In the case of barrier the most added dependencies are not
1037 real, so we use anti-dependence here. */
1038 if (sched_get_condition (insn))
1040 EXECUTE_IF_SET_IN_REG_SET (&deps->reg_last_in_use, 0, i, rsi)
1042 struct deps_reg *reg_last = &deps->reg_last[i];
1043 add_dependence_list (insn, reg_last->uses, 0, REG_DEP_ANTI);
1044 add_dependence_list
1045 (insn, reg_last->sets, 0,
1046 reg_pending_barrier == TRUE_BARRIER ? REG_DEP_TRUE : REG_DEP_ANTI);
1047 add_dependence_list
1048 (insn, reg_last->clobbers, 0,
1049 reg_pending_barrier == TRUE_BARRIER ? REG_DEP_TRUE : REG_DEP_ANTI);
1052 else
1054 EXECUTE_IF_SET_IN_REG_SET (&deps->reg_last_in_use, 0, i, rsi)
1056 struct deps_reg *reg_last = &deps->reg_last[i];
1057 add_dependence_list_and_free (insn, &reg_last->uses, 0,
1058 REG_DEP_ANTI);
1059 add_dependence_list_and_free
1060 (insn, &reg_last->sets, 0,
1061 reg_pending_barrier == TRUE_BARRIER ? REG_DEP_TRUE : REG_DEP_ANTI);
1062 add_dependence_list_and_free
1063 (insn, &reg_last->clobbers, 0,
1064 reg_pending_barrier == TRUE_BARRIER ? REG_DEP_TRUE : REG_DEP_ANTI);
1065 reg_last->uses_length = 0;
1066 reg_last->clobbers_length = 0;
1070 for (i = 0; i < (unsigned)deps->max_reg; i++)
1072 struct deps_reg *reg_last = &deps->reg_last[i];
1073 reg_last->sets = alloc_INSN_LIST (insn, reg_last->sets);
1074 SET_REGNO_REG_SET (&deps->reg_last_in_use, i);
1077 flush_pending_lists (deps, insn, true, true);
1078 CLEAR_REG_SET (&deps->reg_conditional_sets);
1079 reg_pending_barrier = NOT_A_BARRIER;
1081 else
1083 /* If the current insn is conditional, we can't free any
1084 of the lists. */
1085 if (sched_get_condition (insn))
1087 EXECUTE_IF_SET_IN_REG_SET (reg_pending_uses, 0, i, rsi)
1089 struct deps_reg *reg_last = &deps->reg_last[i];
1090 add_dependence_list (insn, reg_last->sets, 0, REG_DEP_TRUE);
1091 add_dependence_list (insn, reg_last->clobbers, 0, REG_DEP_TRUE);
1092 reg_last->uses = alloc_INSN_LIST (insn, reg_last->uses);
1093 reg_last->uses_length++;
1095 EXECUTE_IF_SET_IN_REG_SET (reg_pending_clobbers, 0, i, rsi)
1097 struct deps_reg *reg_last = &deps->reg_last[i];
1098 add_dependence_list (insn, reg_last->sets, 0, REG_DEP_OUTPUT);
1099 add_dependence_list (insn, reg_last->uses, 0, REG_DEP_ANTI);
1100 reg_last->clobbers = alloc_INSN_LIST (insn, reg_last->clobbers);
1101 reg_last->clobbers_length++;
1103 EXECUTE_IF_SET_IN_REG_SET (reg_pending_sets, 0, i, rsi)
1105 struct deps_reg *reg_last = &deps->reg_last[i];
1106 add_dependence_list (insn, reg_last->sets, 0, REG_DEP_OUTPUT);
1107 add_dependence_list (insn, reg_last->clobbers, 0, REG_DEP_OUTPUT);
1108 add_dependence_list (insn, reg_last->uses, 0, REG_DEP_ANTI);
1109 reg_last->sets = alloc_INSN_LIST (insn, reg_last->sets);
1110 SET_REGNO_REG_SET (&deps->reg_conditional_sets, i);
1113 else
1115 EXECUTE_IF_SET_IN_REG_SET (reg_pending_uses, 0, i, rsi)
1117 struct deps_reg *reg_last = &deps->reg_last[i];
1118 add_dependence_list (insn, reg_last->sets, 0, REG_DEP_TRUE);
1119 add_dependence_list (insn, reg_last->clobbers, 0, REG_DEP_TRUE);
1120 reg_last->uses_length++;
1121 reg_last->uses = alloc_INSN_LIST (insn, reg_last->uses);
1123 EXECUTE_IF_SET_IN_REG_SET (reg_pending_clobbers, 0, i, rsi)
1125 struct deps_reg *reg_last = &deps->reg_last[i];
1126 if (reg_last->uses_length > MAX_PENDING_LIST_LENGTH
1127 || reg_last->clobbers_length > MAX_PENDING_LIST_LENGTH)
1129 add_dependence_list_and_free (insn, &reg_last->sets, 0,
1130 REG_DEP_OUTPUT);
1131 add_dependence_list_and_free (insn, &reg_last->uses, 0,
1132 REG_DEP_ANTI);
1133 add_dependence_list_and_free (insn, &reg_last->clobbers, 0,
1134 REG_DEP_OUTPUT);
1135 reg_last->sets = alloc_INSN_LIST (insn, reg_last->sets);
1136 reg_last->clobbers_length = 0;
1137 reg_last->uses_length = 0;
1139 else
1141 add_dependence_list (insn, reg_last->sets, 0, REG_DEP_OUTPUT);
1142 add_dependence_list (insn, reg_last->uses, 0, REG_DEP_ANTI);
1144 reg_last->clobbers_length++;
1145 reg_last->clobbers = alloc_INSN_LIST (insn, reg_last->clobbers);
1147 EXECUTE_IF_SET_IN_REG_SET (reg_pending_sets, 0, i, rsi)
1149 struct deps_reg *reg_last = &deps->reg_last[i];
1150 add_dependence_list_and_free (insn, &reg_last->sets, 0,
1151 REG_DEP_OUTPUT);
1152 add_dependence_list_and_free (insn, &reg_last->clobbers, 0,
1153 REG_DEP_OUTPUT);
1154 add_dependence_list_and_free (insn, &reg_last->uses, 0,
1155 REG_DEP_ANTI);
1156 reg_last->sets = alloc_INSN_LIST (insn, reg_last->sets);
1157 reg_last->uses_length = 0;
1158 reg_last->clobbers_length = 0;
1159 CLEAR_REGNO_REG_SET (&deps->reg_conditional_sets, i);
1163 IOR_REG_SET (&deps->reg_last_in_use, reg_pending_uses);
1164 IOR_REG_SET (&deps->reg_last_in_use, reg_pending_clobbers);
1165 IOR_REG_SET (&deps->reg_last_in_use, reg_pending_sets);
1167 CLEAR_REG_SET (reg_pending_uses);
1168 CLEAR_REG_SET (reg_pending_clobbers);
1169 CLEAR_REG_SET (reg_pending_sets);
1171 /* If we are currently in a libcall scheduling group, then mark the
1172 current insn as being in a scheduling group and that it can not
1173 be moved into a different basic block. */
1175 if (deps->libcall_block_tail_insn)
1177 SCHED_GROUP_P (insn) = 1;
1178 CANT_MOVE (insn) = 1;
1181 /* If a post-call group is still open, see if it should remain so.
1182 This insn must be a simple move of a hard reg to a pseudo or
1183 vice-versa.
1185 We must avoid moving these insns for correctness on
1186 SMALL_REGISTER_CLASS machines, and for special registers like
1187 PIC_OFFSET_TABLE_REGNUM. For simplicity, extend this to all
1188 hard regs for all targets. */
1190 if (deps->in_post_call_group_p)
1192 rtx tmp, set = single_set (insn);
1193 int src_regno, dest_regno;
1195 if (set == NULL)
1196 goto end_call_group;
1198 tmp = SET_DEST (set);
1199 if (GET_CODE (tmp) == SUBREG)
1200 tmp = SUBREG_REG (tmp);
1201 if (REG_P (tmp))
1202 dest_regno = REGNO (tmp);
1203 else
1204 goto end_call_group;
1206 tmp = SET_SRC (set);
1207 if (GET_CODE (tmp) == SUBREG)
1208 tmp = SUBREG_REG (tmp);
1209 if ((GET_CODE (tmp) == PLUS
1210 || GET_CODE (tmp) == MINUS)
1211 && REG_P (XEXP (tmp, 0))
1212 && REGNO (XEXP (tmp, 0)) == STACK_POINTER_REGNUM
1213 && dest_regno == STACK_POINTER_REGNUM)
1214 src_regno = STACK_POINTER_REGNUM;
1215 else if (REG_P (tmp))
1216 src_regno = REGNO (tmp);
1217 else
1218 goto end_call_group;
1220 if (src_regno < FIRST_PSEUDO_REGISTER
1221 || dest_regno < FIRST_PSEUDO_REGISTER)
1223 if (deps->in_post_call_group_p == post_call_initial)
1224 deps->in_post_call_group_p = post_call;
1226 SCHED_GROUP_P (insn) = 1;
1227 CANT_MOVE (insn) = 1;
1229 else
1231 end_call_group:
1232 deps->in_post_call_group_p = not_post_call;
1236 /* Fixup the dependencies in the sched group. */
1237 if (SCHED_GROUP_P (insn))
1238 fixup_sched_groups (insn);
1241 /* Analyze every insn between HEAD and TAIL inclusive, creating LOG_LINKS
1242 for every dependency. */
1244 void
1245 sched_analyze (struct deps *deps, rtx head, rtx tail)
1247 rtx insn;
1248 rtx loop_notes = 0;
1250 if (current_sched_info->use_cselib)
1251 cselib_init (true);
1253 /* Before reload, if the previous block ended in a call, show that
1254 we are inside a post-call group, so as to keep the lifetimes of
1255 hard registers correct. */
1256 if (! reload_completed && !LABEL_P (head))
1258 insn = prev_nonnote_insn (head);
1259 if (insn && CALL_P (insn))
1260 deps->in_post_call_group_p = post_call_initial;
1262 for (insn = head;; insn = NEXT_INSN (insn))
1264 rtx link, end_seq, r0, set;
1266 if (NONJUMP_INSN_P (insn) || JUMP_P (insn))
1268 /* Clear out the stale LOG_LINKS from flow. */
1269 free_INSN_LIST_list (&LOG_LINKS (insn));
1271 /* Make each JUMP_INSN a scheduling barrier for memory
1272 references. */
1273 if (JUMP_P (insn))
1275 /* Keep the list a reasonable size. */
1276 if (deps->pending_flush_length++ > MAX_PENDING_LIST_LENGTH)
1277 flush_pending_lists (deps, insn, true, true);
1278 else
1279 deps->last_pending_memory_flush
1280 = alloc_INSN_LIST (insn, deps->last_pending_memory_flush);
1282 sched_analyze_insn (deps, PATTERN (insn), insn, loop_notes);
1283 loop_notes = 0;
1285 else if (CALL_P (insn))
1287 int i;
1289 CANT_MOVE (insn) = 1;
1291 /* Clear out the stale LOG_LINKS from flow. */
1292 free_INSN_LIST_list (&LOG_LINKS (insn));
1294 if (find_reg_note (insn, REG_SETJMP, NULL))
1296 /* This is setjmp. Assume that all registers, not just
1297 hard registers, may be clobbered by this call. */
1298 reg_pending_barrier = MOVE_BARRIER;
1300 else
1302 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
1303 /* A call may read and modify global register variables. */
1304 if (global_regs[i])
1306 SET_REGNO_REG_SET (reg_pending_sets, i);
1307 SET_REGNO_REG_SET (reg_pending_uses, i);
1309 /* Other call-clobbered hard regs may be clobbered.
1310 Since we only have a choice between 'might be clobbered'
1311 and 'definitely not clobbered', we must include all
1312 partly call-clobbered registers here. */
1313 else if (HARD_REGNO_CALL_PART_CLOBBERED (i, reg_raw_mode[i])
1314 || TEST_HARD_REG_BIT (regs_invalidated_by_call, i))
1315 SET_REGNO_REG_SET (reg_pending_clobbers, i);
1316 /* We don't know what set of fixed registers might be used
1317 by the function, but it is certain that the stack pointer
1318 is among them, but be conservative. */
1319 else if (fixed_regs[i])
1320 SET_REGNO_REG_SET (reg_pending_uses, i);
1321 /* The frame pointer is normally not used by the function
1322 itself, but by the debugger. */
1323 /* ??? MIPS o32 is an exception. It uses the frame pointer
1324 in the macro expansion of jal but does not represent this
1325 fact in the call_insn rtl. */
1326 else if (i == FRAME_POINTER_REGNUM
1327 || (i == HARD_FRAME_POINTER_REGNUM
1328 && (! reload_completed || frame_pointer_needed)))
1329 SET_REGNO_REG_SET (reg_pending_uses, i);
1332 /* For each insn which shouldn't cross a call, add a dependence
1333 between that insn and this call insn. */
1334 add_dependence_list_and_free (insn, &deps->sched_before_next_call, 1,
1335 REG_DEP_ANTI);
1337 sched_analyze_insn (deps, PATTERN (insn), insn, loop_notes);
1338 loop_notes = 0;
1340 /* In the absence of interprocedural alias analysis, we must flush
1341 all pending reads and writes, and start new dependencies starting
1342 from here. But only flush writes for constant calls (which may
1343 be passed a pointer to something we haven't written yet). */
1344 flush_pending_lists (deps, insn, true, !CONST_OR_PURE_CALL_P (insn));
1346 /* Remember the last function call for limiting lifetimes. */
1347 free_INSN_LIST_list (&deps->last_function_call);
1348 deps->last_function_call = alloc_INSN_LIST (insn, NULL_RTX);
1350 /* Before reload, begin a post-call group, so as to keep the
1351 lifetimes of hard registers correct. */
1352 if (! reload_completed)
1353 deps->in_post_call_group_p = post_call;
1356 /* EH_REGION insn notes can not appear until well after we complete
1357 scheduling. */
1358 if (NOTE_P (insn))
1359 gcc_assert (NOTE_LINE_NUMBER (insn) != NOTE_INSN_EH_REGION_BEG
1360 && NOTE_LINE_NUMBER (insn) != NOTE_INSN_EH_REGION_END);
1362 /* See comments on reemit_notes as to why we do this.
1363 ??? Actually, the reemit_notes just say what is done, not why. */
1365 if (NOTE_P (insn)
1366 && (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG
1367 || NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END))
1369 loop_notes = alloc_EXPR_LIST (REG_SAVE_NOTE,
1370 GEN_INT (NOTE_LINE_NUMBER (insn)),
1371 loop_notes);
1372 CONST_OR_PURE_CALL_P (loop_notes) = CONST_OR_PURE_CALL_P (insn);
1375 if (current_sched_info->use_cselib)
1376 cselib_process_insn (insn);
1378 /* Now that we have completed handling INSN, check and see if it is
1379 a CLOBBER beginning a libcall block. If it is, record the
1380 end of the libcall sequence.
1382 We want to schedule libcall blocks as a unit before reload. While
1383 this restricts scheduling, it preserves the meaning of a libcall
1384 block.
1386 As a side effect, we may get better code due to decreased register
1387 pressure as well as less chance of a foreign insn appearing in
1388 a libcall block. */
1389 if (!reload_completed
1390 /* Note we may have nested libcall sequences. We only care about
1391 the outermost libcall sequence. */
1392 && deps->libcall_block_tail_insn == 0
1393 /* The sequence must start with a clobber of a register. */
1394 && NONJUMP_INSN_P (insn)
1395 && GET_CODE (PATTERN (insn)) == CLOBBER
1396 && (r0 = XEXP (PATTERN (insn), 0), REG_P (r0))
1397 && REG_P (XEXP (PATTERN (insn), 0))
1398 /* The CLOBBER must also have a REG_LIBCALL note attached. */
1399 && (link = find_reg_note (insn, REG_LIBCALL, NULL_RTX)) != 0
1400 && (end_seq = XEXP (link, 0)) != 0
1401 /* The insn referenced by the REG_LIBCALL note must be a
1402 simple nop copy with the same destination as the register
1403 mentioned in the clobber. */
1404 && (set = single_set (end_seq)) != 0
1405 && SET_DEST (set) == r0 && SET_SRC (set) == r0
1406 /* And finally the insn referenced by the REG_LIBCALL must
1407 also contain a REG_EQUAL note and a REG_RETVAL note. */
1408 && find_reg_note (end_seq, REG_EQUAL, NULL_RTX) != 0
1409 && find_reg_note (end_seq, REG_RETVAL, NULL_RTX) != 0)
1410 deps->libcall_block_tail_insn = XEXP (link, 0);
1412 /* If we have reached the end of a libcall block, then close the
1413 block. */
1414 if (deps->libcall_block_tail_insn == insn)
1415 deps->libcall_block_tail_insn = 0;
1417 if (insn == tail)
1419 if (current_sched_info->use_cselib)
1420 cselib_finish ();
1421 return;
1424 gcc_unreachable ();
1428 /* The following function adds forward dependence (FROM, TO) with
1429 given DEP_TYPE. The forward dependence should be not exist before. */
1431 void
1432 add_forward_dependence (rtx from, rtx to, enum reg_note dep_type)
1434 rtx new_link;
1436 #ifdef ENABLE_CHECKING
1437 /* If add_dependence is working properly there should never
1438 be notes, deleted insns or duplicates in the backward
1439 links. Thus we need not check for them here.
1441 However, if we have enabled checking we might as well go
1442 ahead and verify that add_dependence worked properly. */
1443 gcc_assert (!NOTE_P (from));
1444 gcc_assert (!INSN_DELETED_P (from));
1445 if (forward_dependency_cache)
1446 gcc_assert (!bitmap_bit_p (&forward_dependency_cache[INSN_LUID (from)],
1447 INSN_LUID (to)));
1448 else
1449 gcc_assert (!find_insn_list (to, INSN_DEPEND (from)));
1451 /* ??? If bitmap_bit_p is a predicate, what is this supposed to do? */
1452 if (forward_dependency_cache != NULL)
1453 bitmap_bit_p (&forward_dependency_cache[INSN_LUID (from)],
1454 INSN_LUID (to));
1455 #endif
1457 new_link = alloc_INSN_LIST (to, INSN_DEPEND (from));
1459 PUT_REG_NOTE_KIND (new_link, dep_type);
1461 INSN_DEPEND (from) = new_link;
1462 INSN_DEP_COUNT (to) += 1;
1465 /* Examine insns in the range [ HEAD, TAIL ] and Use the backward
1466 dependences from LOG_LINKS to build forward dependences in
1467 INSN_DEPEND. */
1469 void
1470 compute_forward_dependences (rtx head, rtx tail)
1472 rtx insn, link;
1473 rtx next_tail;
1475 next_tail = NEXT_INSN (tail);
1476 for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
1478 if (! INSN_P (insn))
1479 continue;
1481 for (link = LOG_LINKS (insn); link; link = XEXP (link, 1))
1482 add_forward_dependence (XEXP (link, 0), insn, REG_NOTE_KIND (link));
1486 /* Initialize variables for region data dependence analysis.
1487 n_bbs is the number of region blocks. */
1489 void
1490 init_deps (struct deps *deps)
1492 int max_reg = (reload_completed ? FIRST_PSEUDO_REGISTER : max_reg_num ());
1494 deps->max_reg = max_reg;
1495 deps->reg_last = XCNEWVEC (struct deps_reg, max_reg);
1496 INIT_REG_SET (&deps->reg_last_in_use);
1497 INIT_REG_SET (&deps->reg_conditional_sets);
1499 deps->pending_read_insns = 0;
1500 deps->pending_read_mems = 0;
1501 deps->pending_write_insns = 0;
1502 deps->pending_write_mems = 0;
1503 deps->pending_lists_length = 0;
1504 deps->pending_flush_length = 0;
1505 deps->last_pending_memory_flush = 0;
1506 deps->last_function_call = 0;
1507 deps->sched_before_next_call = 0;
1508 deps->in_post_call_group_p = not_post_call;
1509 deps->libcall_block_tail_insn = 0;
1512 /* Free insn lists found in DEPS. */
1514 void
1515 free_deps (struct deps *deps)
1517 unsigned i;
1518 reg_set_iterator rsi;
1520 free_INSN_LIST_list (&deps->pending_read_insns);
1521 free_EXPR_LIST_list (&deps->pending_read_mems);
1522 free_INSN_LIST_list (&deps->pending_write_insns);
1523 free_EXPR_LIST_list (&deps->pending_write_mems);
1524 free_INSN_LIST_list (&deps->last_pending_memory_flush);
1526 /* Without the EXECUTE_IF_SET, this loop is executed max_reg * nr_regions
1527 times. For a testcase with 42000 regs and 8000 small basic blocks,
1528 this loop accounted for nearly 60% (84 sec) of the total -O2 runtime. */
1529 EXECUTE_IF_SET_IN_REG_SET (&deps->reg_last_in_use, 0, i, rsi)
1531 struct deps_reg *reg_last = &deps->reg_last[i];
1532 if (reg_last->uses)
1533 free_INSN_LIST_list (&reg_last->uses);
1534 if (reg_last->sets)
1535 free_INSN_LIST_list (&reg_last->sets);
1536 if (reg_last->clobbers)
1537 free_INSN_LIST_list (&reg_last->clobbers);
1539 CLEAR_REG_SET (&deps->reg_last_in_use);
1540 CLEAR_REG_SET (&deps->reg_conditional_sets);
1542 free (deps->reg_last);
1545 /* If it is profitable to use them, initialize caches for tracking
1546 dependency information. LUID is the number of insns to be scheduled,
1547 it is used in the estimate of profitability. */
1549 void
1550 init_dependency_caches (int luid)
1552 /* ?!? We could save some memory by computing a per-region luid mapping
1553 which could reduce both the number of vectors in the cache and the size
1554 of each vector. Instead we just avoid the cache entirely unless the
1555 average number of instructions in a basic block is very high. See
1556 the comment before the declaration of true_dependency_cache for
1557 what we consider "very high". */
1558 if (luid / n_basic_blocks > 100 * 5)
1560 int i;
1561 true_dependency_cache = XNEWVEC (bitmap_head, luid);
1562 anti_dependency_cache = XNEWVEC (bitmap_head, luid);
1563 output_dependency_cache = XNEWVEC (bitmap_head, luid);
1564 #ifdef ENABLE_CHECKING
1565 forward_dependency_cache = XNEWVEC (bitmap_head, luid);
1566 #endif
1567 for (i = 0; i < luid; i++)
1569 bitmap_initialize (&true_dependency_cache[i], 0);
1570 bitmap_initialize (&anti_dependency_cache[i], 0);
1571 bitmap_initialize (&output_dependency_cache[i], 0);
1572 #ifdef ENABLE_CHECKING
1573 bitmap_initialize (&forward_dependency_cache[i], 0);
1574 #endif
1576 cache_size = luid;
1580 /* Free the caches allocated in init_dependency_caches. */
1582 void
1583 free_dependency_caches (void)
1585 if (true_dependency_cache)
1587 int i;
1589 for (i = 0; i < cache_size; i++)
1591 bitmap_clear (&true_dependency_cache[i]);
1592 bitmap_clear (&anti_dependency_cache[i]);
1593 bitmap_clear (&output_dependency_cache[i]);
1594 #ifdef ENABLE_CHECKING
1595 bitmap_clear (&forward_dependency_cache[i]);
1596 #endif
1598 free (true_dependency_cache);
1599 true_dependency_cache = NULL;
1600 free (anti_dependency_cache);
1601 anti_dependency_cache = NULL;
1602 free (output_dependency_cache);
1603 output_dependency_cache = NULL;
1604 #ifdef ENABLE_CHECKING
1605 free (forward_dependency_cache);
1606 forward_dependency_cache = NULL;
1607 #endif
1611 /* Initialize some global variables needed by the dependency analysis
1612 code. */
1614 void
1615 init_deps_global (void)
1617 reg_pending_sets = ALLOC_REG_SET (&reg_obstack);
1618 reg_pending_clobbers = ALLOC_REG_SET (&reg_obstack);
1619 reg_pending_uses = ALLOC_REG_SET (&reg_obstack);
1620 reg_pending_barrier = NOT_A_BARRIER;
1623 /* Free everything used by the dependency analysis code. */
1625 void
1626 finish_deps_global (void)
1628 FREE_REG_SET (reg_pending_sets);
1629 FREE_REG_SET (reg_pending_clobbers);
1630 FREE_REG_SET (reg_pending_uses);