]> gcc.gnu.org Git - gcc.git/blame - gcc/flow.c
flow.c (calculate_global_regs_live): Only force stack pointer live before reload.
[gcc.git] / gcc / flow.c
CommitLineData
d7429b6a 1/* Data flow analysis for GNU compiler.
c9bacfdb 2 Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3b708058 3 1999, 2000 Free Software Foundation, Inc.
d7429b6a
RK
4
5This file is part of GNU CC.
6
7GNU CC is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2, or (at your option)
10any later version.
11
12GNU CC is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with GNU CC; see the file COPYING. If not, write to
a35311b0
RK
19the Free Software Foundation, 59 Temple Place - Suite 330,
20Boston, MA 02111-1307, USA. */
d7429b6a 21
e881bb1b
RH
22/* This file contains the data flow analysis pass of the compiler. It
23 computes data flow information which tells combine_instructions
24 which insns to consider combining and controls register allocation.
d7429b6a 25
e881bb1b
RH
26 Additional data flow information that is too bulky to record is
27 generated during the analysis, and is used at that time to create
28 autoincrement and autodecrement addressing.
d7429b6a
RK
29
30 The first step is dividing the function into basic blocks.
31 find_basic_blocks does this. Then life_analysis determines
32 where each register is live and where it is dead.
33
34 ** find_basic_blocks **
35
e881bb1b
RH
36 find_basic_blocks divides the current function's rtl into basic
37 blocks and constructs the CFG. The blocks are recorded in the
38 basic_block_info array; the CFG exists in the edge structures
39 referenced by the blocks.
d7429b6a 40
e881bb1b 41 find_basic_blocks also finds any unreachable loops and deletes them.
d7429b6a
RK
42
43 ** life_analysis **
44
45 life_analysis is called immediately after find_basic_blocks.
46 It uses the basic block information to determine where each
47 hard or pseudo register is live.
48
49 ** live-register info **
50
51 The information about where each register is live is in two parts:
e881bb1b 52 the REG_NOTES of insns, and the vector basic_block->global_live_at_start.
d7429b6a 53
e881bb1b
RH
54 basic_block->global_live_at_start has an element for each basic
55 block, and the element is a bit-vector with a bit for each hard or
56 pseudo register. The bit is 1 if the register is live at the
57 beginning of the basic block.
d7429b6a 58
c9bacfdb 59 Two types of elements can be added to an insn's REG_NOTES.
d7429b6a
RK
60 A REG_DEAD note is added to an insn's REG_NOTES for any register
61 that meets both of two conditions: The value in the register is not
62 needed in subsequent insns and the insn does not replace the value in
63 the register (in the case of multi-word hard registers, the value in
64 each register must be replaced by the insn to avoid a REG_DEAD note).
65
66 In the vast majority of cases, an object in a REG_DEAD note will be
67 used somewhere in the insn. The (rare) exception to this is if an
68 insn uses a multi-word hard register and only some of the registers are
69 needed in subsequent insns. In that case, REG_DEAD notes will be
70 provided for those hard registers that are not subsequently needed.
71 Partial REG_DEAD notes of this type do not occur when an insn sets
72 only some of the hard registers used in such a multi-word operand;
73 omitting REG_DEAD notes for objects stored in an insn is optional and
74 the desire to do so does not justify the complexity of the partial
75 REG_DEAD notes.
76
77 REG_UNUSED notes are added for each register that is set by the insn
78 but is unused subsequently (if every register set by the insn is unused
79 and the insn does not reference memory or have some other side-effect,
80 the insn is deleted instead). If only part of a multi-word hard
81 register is used in a subsequent insn, REG_UNUSED notes are made for
82 the parts that will not be used.
83
84 To determine which registers are live after any insn, one can
85 start from the beginning of the basic block and scan insns, noting
86 which registers are set by each insn and which die there.
87
88 ** Other actions of life_analysis **
89
90 life_analysis sets up the LOG_LINKS fields of insns because the
91 information needed to do so is readily available.
92
93 life_analysis deletes insns whose only effect is to store a value
94 that is never used.
95
96 life_analysis notices cases where a reference to a register as
97 a memory address can be combined with a preceding or following
98 incrementation or decrementation of the register. The separate
99 instruction to increment or decrement is deleted and the address
100 is changed to a POST_INC or similar rtx.
101
102 Each time an incrementing or decrementing address is created,
103 a REG_INC element is added to the insn's REG_NOTES list.
104
105 life_analysis fills in certain vectors containing information about
d4b60170
RK
106 register usage: REG_N_REFS, REG_N_DEATHS, REG_N_SETS, REG_LIVE_LENGTH,
107 REG_N_CALLS_CROSSED and REG_BASIC_BLOCK.
fdb8a883
JW
108
109 life_analysis sets current_function_sp_is_unchanging if the function
110 doesn't modify the stack pointer. */
e881bb1b 111
c9bacfdb 112/* TODO:
e881bb1b
RH
113
114 Split out from life_analysis:
115 - local property discovery (bb->local_live, bb->local_set)
116 - global property computation
117 - log links creation
118 - pre/post modify transformation
119*/
d7429b6a 120\f
d7429b6a 121#include "config.h"
670ee920 122#include "system.h"
d3a923ee 123#include "tree.h"
d7429b6a 124#include "rtl.h"
6baf1cc8 125#include "tm_p.h"
efc9bd41 126#include "hard-reg-set.h"
d7429b6a
RK
127#include "basic-block.h"
128#include "insn-config.h"
129#include "regs.h"
d7429b6a
RK
130#include "flags.h"
131#include "output.h"
b384405b 132#include "function.h"
3d195391 133#include "except.h"
2e107e9e 134#include "toplev.h"
79c9824e 135#include "recog.h"
e881bb1b 136#include "insn-flags.h"
11bdd2ae 137#include "expr.h"
b53978a3 138#include "ssa.h"
d7429b6a
RK
139
140#include "obstack.h"
11ae508b 141#include "splay-tree.h"
c5c76735 142
d7429b6a
RK
143#define obstack_chunk_alloc xmalloc
144#define obstack_chunk_free free
145
e881bb1b
RH
146/* EXIT_IGNORE_STACK should be nonzero if, when returning from a function,
147 the stack pointer does not matter. The value is tested only in
148 functions that have frame pointers.
149 No definition is equivalent to always zero. */
150#ifndef EXIT_IGNORE_STACK
151#define EXIT_IGNORE_STACK 0
152#endif
153
d3a923ee
RH
154#ifndef HAVE_epilogue
155#define HAVE_epilogue 0
156#endif
d3a923ee
RH
157#ifndef HAVE_prologue
158#define HAVE_prologue 0
159#endif
0a1c58a2
JL
160#ifndef HAVE_sibcall_epilogue
161#define HAVE_sibcall_epilogue 0
162#endif
d3a923ee 163
2a3e384f
RH
164#ifndef LOCAL_REGNO
165#define LOCAL_REGNO(REGNO) 0
166#endif
167#ifndef EPILOGUE_USES
168#define EPILOGUE_USES(REGNO) 0
169#endif
170
1f8f4a0b 171/* The obstack on which the flow graph components are allocated. */
7eb136d6 172
1f8f4a0b
MM
173struct obstack flow_obstack;
174static char *flow_firstobj;
7eb136d6 175
e881bb1b 176/* Number of basic blocks in the current function. */
d7429b6a 177
e881bb1b 178int n_basic_blocks;
d7429b6a 179
d3a923ee
RH
180/* Number of edges in the current function. */
181
182int n_edges;
183
e881bb1b 184/* The basic block array. */
d7429b6a 185
e881bb1b 186varray_type basic_block_info;
d7429b6a 187
e881bb1b 188/* The special entry and exit blocks. */
d7429b6a 189
d4b60170
RK
190struct basic_block_def entry_exit_blocks[2]
191= {{NULL, /* head */
e881bb1b
RH
192 NULL, /* end */
193 NULL, /* pred */
194 NULL, /* succ */
195 NULL, /* local_set */
7dfc0fbe 196 NULL, /* cond_local_set */
e881bb1b
RH
197 NULL, /* global_live_at_start */
198 NULL, /* global_live_at_end */
199 NULL, /* aux */
200 ENTRY_BLOCK, /* index */
336a6399 201 0, /* loop_depth */
51891abe
JH
202 -1, -1, /* eh_beg, eh_end */
203 0 /* count */
e881bb1b
RH
204 },
205 {
206 NULL, /* head */
207 NULL, /* end */
208 NULL, /* pred */
209 NULL, /* succ */
210 NULL, /* local_set */
7dfc0fbe 211 NULL, /* cond_local_set */
e881bb1b
RH
212 NULL, /* global_live_at_start */
213 NULL, /* global_live_at_end */
214 NULL, /* aux */
215 EXIT_BLOCK, /* index */
336a6399 216 0, /* loop_depth */
51891abe
JH
217 -1, -1, /* eh_beg, eh_end */
218 0 /* count */
e881bb1b
RH
219 }
220};
d7429b6a 221
56744d1a
JL
222/* Nonzero if the second flow pass has completed. */
223int flow2_completed;
224
d7429b6a
RK
225/* Maximum register number used in this function, plus one. */
226
227int max_regno;
228
b1f21e0a 229/* Indexed by n, giving various register information */
d7429b6a 230
6feacd09 231varray_type reg_n_info;
d7429b6a 232
d7429b6a
RK
233/* Size of a regset for the current function,
234 in (1) bytes and (2) elements. */
235
236int regset_bytes;
237int regset_size;
238
d7429b6a 239/* Regset of regs live when calls to `setjmp'-like functions happen. */
e881bb1b 240/* ??? Does this exist only for the setjmp-clobbered warning message? */
d7429b6a
RK
241
242regset regs_live_at_setjmp;
243
244/* List made of EXPR_LIST rtx's which gives pairs of pseudo registers
245 that have to go in the same hard reg.
246 The first two regs in the list are a pair, and the next two
247 are another pair, etc. */
248rtx regs_may_share;
249
d7429b6a
RK
250/* Set of registers that may be eliminable. These are handled specially
251 in updating regs_ever_live. */
252
253static HARD_REG_SET elim_reg_set;
254
e881bb1b
RH
255/* The basic block structure for every insn, indexed by uid. */
256
257varray_type basic_block_for_insn;
258
259/* The labels mentioned in non-jump rtl. Valid during find_basic_blocks. */
c9bacfdb 260/* ??? Should probably be using LABEL_NUSES instead. It would take a
e881bb1b
RH
261 bit of surgery to be able to use or co-opt the routines in jump. */
262
263static rtx label_value_list;
be1bb652 264static rtx tail_recursion_label_list;
e881bb1b 265
11ae508b
RH
266/* Holds information for tracking conditional register life information. */
267struct reg_cond_life_info
268{
269 /* An EXPR_LIST of conditions under which a register is dead. */
270 rtx condition;
271
272 /* ??? Could store mask of bytes that are dead, so that we could finally
273 track lifetimes of multi-word registers accessed via subregs. */
274};
275
62828c00
RH
276/* For use in communicating between propagate_block and its subroutines.
277 Holds all information needed to compute life and def-use information. */
278
279struct propagate_block_info
280{
281 /* The basic block we're considering. */
282 basic_block bb;
283
284 /* Bit N is set if register N is conditionally or unconditionally live. */
285 regset reg_live;
286
9785c68d
RH
287 /* Bit N is set if register N is set this insn. */
288 regset new_set;
8e3f9094 289
62828c00
RH
290 /* Element N is the next insn that uses (hard or pseudo) register N
291 within the current basic block; or zero, if there is no such insn. */
292 rtx *reg_next_use;
293
294 /* Contains a list of all the MEMs we are tracking for dead store
295 elimination. */
296 rtx mem_set_list;
297
7dfc0fbe
BS
298 /* If non-null, record the set of registers set unconditionally in the
299 basic block. */
62828c00
RH
300 regset local_set;
301
7dfc0fbe
BS
302 /* If non-null, record the set of registers set conditionally in the
303 basic block. */
304 regset cond_local_set;
305
11ae508b
RH
306#ifdef HAVE_conditional_execution
307 /* Indexed by register number, holds a reg_cond_life_info for each
308 register that is not unconditionally live or dead. */
309 splay_tree reg_cond_dead;
310
311 /* Bit N is set if register N is in an expression in reg_cond_dead. */
312 regset reg_cond_reg;
313#endif
314
62828c00
RH
315 /* Non-zero if the value of CC0 is live. */
316 int cc0_live;
317
318 /* Flags controling the set of information propagate_block collects. */
319 int flags;
320};
321
c9bacfdb 322/* Store the data structures necessary for depth-first search. */
b53978a3
JO
323struct depth_first_search_dsS {
324 /* stack for backtracking during the algorithm */
325 basic_block *stack;
326
327 /* number of edges in the stack. That is, positions 0, ..., sp-1
c9bacfdb 328 have edges. */
b53978a3
JO
329 unsigned int sp;
330
331 /* record of basic blocks already seen by depth-first search */
332 sbitmap visited_blocks;
333};
334typedef struct depth_first_search_dsS *depth_first_search_ds;
335
d7429b6a 336/* Forward declarations */
711d877c 337static int count_basic_blocks PARAMS ((rtx));
be1bb652 338static void find_basic_blocks_1 PARAMS ((rtx));
1bc48f82 339static rtx find_label_refs PARAMS ((rtx, rtx));
711d877c
KG
340static void clear_edges PARAMS ((void));
341static void make_edges PARAMS ((rtx));
711d877c
KG
342static void make_label_edge PARAMS ((sbitmap *, basic_block,
343 rtx, int));
344static void make_eh_edge PARAMS ((sbitmap *, eh_nesting_info *,
345 basic_block, rtx, int));
346static void mark_critical_edges PARAMS ((void));
347static void move_stray_eh_region_notes PARAMS ((void));
348static void record_active_eh_regions PARAMS ((rtx));
349
350static void commit_one_edge_insertion PARAMS ((edge));
351
352static void delete_unreachable_blocks PARAMS ((void));
353static void delete_eh_regions PARAMS ((void));
354static int can_delete_note_p PARAMS ((rtx));
711d877c 355static void expunge_block PARAMS ((basic_block));
711d877c 356static int can_delete_label_p PARAMS ((rtx));
be1bb652 357static int tail_recursion_label_p PARAMS ((rtx));
711d877c
KG
358static int merge_blocks_move_predecessor_nojumps PARAMS ((basic_block,
359 basic_block));
360static int merge_blocks_move_successor_nojumps PARAMS ((basic_block,
336a6399 361 basic_block));
711d877c
KG
362static int merge_blocks PARAMS ((edge,basic_block,basic_block));
363static void try_merge_blocks PARAMS ((void));
5568fb48 364static void tidy_fallthru_edges PARAMS ((void));
711d877c
KG
365static int verify_wide_reg_1 PARAMS ((rtx *, void *));
366static void verify_wide_reg PARAMS ((int, rtx, rtx));
367static void verify_local_live_at_start PARAMS ((regset, basic_block));
368static int set_noop_p PARAMS ((rtx));
369static int noop_move_p PARAMS ((rtx));
3ea8083f
JL
370static void delete_noop_moves PARAMS ((rtx));
371static void notice_stack_pointer_modification_1 PARAMS ((rtx, rtx, void *));
372static void notice_stack_pointer_modification PARAMS ((rtx));
c13fde05 373static void mark_reg PARAMS ((rtx, void *));
711d877c 374static void mark_regs_live_at_end PARAMS ((regset));
4e872036 375static int set_phi_alternative_reg PARAMS ((rtx, int, int, void *));
711d877c 376static void calculate_global_regs_live PARAMS ((sbitmap, sbitmap, int));
62828c00
RH
377static void propagate_block_delete_insn PARAMS ((basic_block, rtx));
378static rtx propagate_block_delete_libcall PARAMS ((basic_block, rtx, rtx));
62828c00
RH
379static int insn_dead_p PARAMS ((struct propagate_block_info *,
380 rtx, int, rtx));
381static int libcall_dead_p PARAMS ((struct propagate_block_info *,
01fbc97d 382 rtx, rtx));
62828c00 383static void mark_set_regs PARAMS ((struct propagate_block_info *,
8e3f9094 384 rtx, rtx));
62828c00 385static void mark_set_1 PARAMS ((struct propagate_block_info *,
b4593d17
RH
386 enum rtx_code, rtx, rtx,
387 rtx, int));
11ae508b
RH
388#ifdef HAVE_conditional_execution
389static int mark_regno_cond_dead PARAMS ((struct propagate_block_info *,
390 int, rtx));
391static void free_reg_cond_life_info PARAMS ((splay_tree_value));
392static int flush_reg_cond_reg_1 PARAMS ((splay_tree_node, void *));
393static void flush_reg_cond_reg PARAMS ((struct propagate_block_info *,
394 int));
395static rtx ior_reg_cond PARAMS ((rtx, rtx));
396static rtx not_reg_cond PARAMS ((rtx));
397static rtx nand_reg_cond PARAMS ((rtx, rtx));
398#endif
1d300e19 399#ifdef AUTO_INC_DEC
4b983fdc
RH
400static void attempt_auto_inc PARAMS ((struct propagate_block_info *,
401 rtx, rtx, rtx, rtx, rtx));
62828c00
RH
402static void find_auto_inc PARAMS ((struct propagate_block_info *,
403 rtx, rtx));
404static int try_pre_increment_1 PARAMS ((struct propagate_block_info *,
405 rtx));
711d877c 406static int try_pre_increment PARAMS ((rtx, rtx, HOST_WIDE_INT));
1d300e19 407#endif
62828c00 408static void mark_used_reg PARAMS ((struct propagate_block_info *,
8e3f9094 409 rtx, rtx, rtx));
62828c00 410static void mark_used_regs PARAMS ((struct propagate_block_info *,
8e3f9094 411 rtx, rtx, rtx));
711d877c
KG
412void dump_flow_info PARAMS ((FILE *));
413void debug_flow_info PARAMS ((void));
414static void dump_edge_info PARAMS ((FILE *, edge, int));
f9b697bf 415static void print_rtl_and_abort PARAMS ((void));
711d877c 416
62828c00
RH
417static void invalidate_mems_from_autoinc PARAMS ((struct propagate_block_info *,
418 rtx));
1288c070
RH
419static void invalidate_mems_from_set PARAMS ((struct propagate_block_info *,
420 rtx));
711d877c 421static void remove_fake_successors PARAMS ((basic_block));
135ebc36
MH
422static void flow_nodes_print PARAMS ((const char *, const sbitmap,
423 FILE *));
424static void flow_edge_list_print PARAMS ((const char *, const edge *,
425 int, FILE *));
426static void flow_loops_cfg_dump PARAMS ((const struct loops *,
427 FILE *));
428static int flow_loop_nested_p PARAMS ((struct loop *,
429 struct loop *));
430static int flow_loop_entry_edges_find PARAMS ((basic_block, const sbitmap,
431 edge **));
432static int flow_loop_exit_edges_find PARAMS ((const sbitmap, edge **));
711d877c 433static int flow_loop_nodes_find PARAMS ((basic_block, basic_block, sbitmap));
c34d5374 434static int flow_depth_first_order_compute PARAMS ((int *, int *));
b53978a3
JO
435static void flow_dfs_compute_reverse_init
436 PARAMS ((depth_first_search_ds));
437static void flow_dfs_compute_reverse_add_bb
438 PARAMS ((depth_first_search_ds, basic_block));
439static basic_block flow_dfs_compute_reverse_execute
440 PARAMS ((depth_first_search_ds));
441static void flow_dfs_compute_reverse_finish
442 PARAMS ((depth_first_search_ds));
5d6a16e2
MH
443static void flow_loop_pre_header_scan PARAMS ((struct loop *));
444static basic_block flow_loop_pre_header_find PARAMS ((basic_block,
445 const sbitmap *));
711d877c
KG
446static void flow_loop_tree_node_add PARAMS ((struct loop *, struct loop *));
447static void flow_loops_tree_build PARAMS ((struct loops *));
448static int flow_loop_level_compute PARAMS ((struct loop *, int));
449static int flow_loops_level_compute PARAMS ((struct loops *));
1f8f4a0b 450static void allocate_bb_life_data PARAMS ((void));
d7429b6a 451\f
5ece9746 452/* Find basic blocks of the current function.
e881bb1b
RH
453 F is the first insn of the function and NREGS the number of register
454 numbers in use. */
d7429b6a
RK
455
456void
19d3c25c 457find_basic_blocks (f, nregs, file)
d7429b6a 458 rtx f;
e881bb1b
RH
459 int nregs ATTRIBUTE_UNUSED;
460 FILE *file ATTRIBUTE_UNUSED;
d7429b6a 461{
e881bb1b 462 int max_uid;
d7429b6a 463
e881bb1b
RH
464 /* Flush out existing data. */
465 if (basic_block_info != NULL)
466 {
467 int i;
421382ac 468
e881bb1b 469 clear_edges ();
d7429b6a 470
c9bacfdb 471 /* Clear bb->aux on all extant basic blocks. We'll use this as a
e881bb1b
RH
472 tag for reuse during create_basic_block, just in case some pass
473 copies around basic block notes improperly. */
474 for (i = 0; i < n_basic_blocks; ++i)
475 BASIC_BLOCK (i)->aux = NULL;
d7429b6a 476
e881bb1b
RH
477 VARRAY_FREE (basic_block_info);
478 }
27249135 479
e881bb1b 480 n_basic_blocks = count_basic_blocks (f);
27249135 481
e881bb1b
RH
482 /* Size the basic block table. The actual structures will be allocated
483 by find_basic_blocks_1, since we want to keep the structure pointers
484 stable across calls to find_basic_blocks. */
485 /* ??? This whole issue would be much simpler if we called find_basic_blocks
c9bacfdb 486 exactly once, and thereafter we don't have a single long chain of
e881bb1b
RH
487 instructions at all until close to the end of compilation when we
488 actually lay them out. */
8cfe18d6 489
e881bb1b
RH
490 VARRAY_BB_INIT (basic_block_info, n_basic_blocks, "basic_block_info");
491
be1bb652 492 find_basic_blocks_1 (f);
c9bacfdb 493
e881bb1b
RH
494 /* Record the block to which an insn belongs. */
495 /* ??? This should be done another way, by which (perhaps) a label is
496 tagged directly with the basic block that it starts. It is used for
497 more than that currently, but IMO that is the only valid use. */
498
499 max_uid = get_max_uid ();
d7429b6a 500#ifdef AUTO_INC_DEC
5ece9746
JL
501 /* Leave space for insns life_analysis makes in some cases for auto-inc.
502 These cases are rare, so we don't need too much space. */
e881bb1b 503 max_uid += max_uid / 10;
d7429b6a
RK
504#endif
505
2307e372 506 compute_bb_for_insn (max_uid);
e881bb1b
RH
507
508 /* Discover the edges of our cfg. */
336a6399
RH
509 record_active_eh_regions (f);
510 make_edges (label_value_list);
5568fb48
RH
511
512 /* Do very simple cleanup now, for the benefit of code that runs between
513 here and cleanup_cfg, e.g. thread_prologue_and_epilogue_insns. */
514 tidy_fallthru_edges ();
515
e881bb1b
RH
516 mark_critical_edges ();
517
34487bf8
RH
518#ifdef ENABLE_CHECKING
519 verify_flow_info ();
520#endif
d7429b6a 521}
5ece9746 522
b313a0fe
RH
523void
524check_function_return_warnings ()
525{
526 if (warn_missing_noreturn
527 && !TREE_THIS_VOLATILE (cfun->decl)
528 && EXIT_BLOCK_PTR->pred == NULL)
529 warning ("function might be possible candidate for attribute `noreturn'");
530
531 /* If we have a path to EXIT, then we do return. */
532 if (TREE_THIS_VOLATILE (cfun->decl)
533 && EXIT_BLOCK_PTR->pred != NULL)
534 warning ("`noreturn' function does return");
535
536 /* If the clobber_return_insn appears in some basic block, then we
537 do reach the end without returning a value. */
538 else if (warn_return_type
539 && cfun->x_clobber_return_insn != NULL
540 && EXIT_BLOCK_PTR->pred != NULL)
541 {
542 int max_uid = get_max_uid ();
543
544 /* If clobber_return_insn was excised by jump1, then renumber_insns
545 can make max_uid smaller than the number still recorded in our rtx.
546 That's fine, since this is a quick way of verifying that the insn
547 is no longer in the chain. */
548 if (INSN_UID (cfun->x_clobber_return_insn) < max_uid)
549 {
550 /* Recompute insn->block mapping, since the initial mapping is
551 set before we delete unreachable blocks. */
552 compute_bb_for_insn (max_uid);
553
554 if (BLOCK_FOR_INSN (cfun->x_clobber_return_insn) != NULL)
555 warning ("control reaches end of non-void function");
556 }
557 }
558}
559
e881bb1b 560/* Count the basic blocks of the function. */
dc2ede84 561
c9bacfdb 562static int
e881bb1b
RH
563count_basic_blocks (f)
564 rtx f;
565{
566 register rtx insn;
567 register RTX_CODE prev_code;
568 register int count = 0;
569 int eh_region = 0;
e881bb1b 570 int call_had_abnormal_edge = 0;
dc2ede84 571
e881bb1b
RH
572 prev_code = JUMP_INSN;
573 for (insn = f; insn; insn = NEXT_INSN (insn))
574 {
575 register RTX_CODE code = GET_CODE (insn);
576
e881bb1b
RH
577 if (code == CODE_LABEL
578 || (GET_RTX_CLASS (code) == 'i'
579 && (prev_code == JUMP_INSN
580 || prev_code == BARRIER
c29ea88a 581 || (prev_code == CALL_INSN && call_had_abnormal_edge))))
314883b8
RK
582 count++;
583
e881bb1b
RH
584 /* Record whether this call created an edge. */
585 if (code == CALL_INSN)
586 {
6af57aae 587 rtx note = find_reg_note (insn, REG_EH_REGION, NULL_RTX);
8ad52449 588 int region = (note ? INTVAL (XEXP (note, 0)) : 1);
314883b8 589
e881bb1b 590 call_had_abnormal_edge = 0;
6af57aae 591
6814a8a0
JM
592 /* If there is an EH region or rethrow, we have an edge. */
593 if ((eh_region && region > 0)
594 || find_reg_note (insn, REG_EH_RETHROW, NULL_RTX))
6af57aae 595 call_had_abnormal_edge = 1;
314883b8
RK
596 else if (nonlocal_goto_handler_labels && region >= 0)
597 /* If there is a nonlocal goto label and the specified
598 region number isn't -1, we have an edge. (0 means
599 no throw, but might have a nonlocal goto). */
600 call_had_abnormal_edge = 1;
e881bb1b 601 }
e881bb1b
RH
602
603 if (code != NOTE)
604 prev_code = code;
605 else if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_EH_REGION_BEG)
606 ++eh_region;
607 else if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_EH_REGION_END)
608 --eh_region;
e881bb1b
RH
609 }
610
611 /* The rest of the compiler works a bit smoother when we don't have to
612 check for the edge case of do-nothing functions with no basic blocks. */
613 if (count == 0)
614 {
615 emit_insn (gen_rtx_USE (VOIDmode, const0_rtx));
616 count = 1;
617 }
618
619 return count;
620}
dc2ede84 621
4eb00163 622/* Scan a list of insns for labels referred to other than by jumps.
1bc48f82 623 This is used to scan the alternatives of a call placeholder. */
4eb00163
JO
624static rtx
625find_label_refs (f, lvl)
1bc48f82
RE
626 rtx f;
627 rtx lvl;
628{
629 rtx insn;
630
631 for (insn = f; insn; insn = NEXT_INSN (insn))
2c3c49de 632 if (INSN_P (insn))
1bc48f82
RE
633 {
634 rtx note;
635
636 /* Make a list of all labels referred to other than by jumps
c9bacfdb 637 (which just don't have the REG_LABEL notes).
1bc48f82
RE
638
639 Make a special exception for labels followed by an ADDR*VEC,
c9bacfdb 640 as this would be a part of the tablejump setup code.
1bc48f82
RE
641
642 Make a special exception for the eh_return_stub_label, which
643 we know isn't part of any otherwise visible control flow. */
c9bacfdb 644
1bc48f82
RE
645 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
646 if (REG_NOTE_KIND (note) == REG_LABEL)
647 {
648 rtx lab = XEXP (note, 0), next;
649
650 if (lab == eh_return_stub_label)
651 ;
652 else if ((next = next_nonnote_insn (lab)) != NULL
653 && GET_CODE (next) == JUMP_INSN
654 && (GET_CODE (PATTERN (next)) == ADDR_VEC
655 || GET_CODE (PATTERN (next)) == ADDR_DIFF_VEC))
656 ;
657 else if (GET_CODE (lab) == NOTE)
658 ;
659 else
660 lvl = alloc_EXPR_LIST (0, XEXP (note, 0), lvl);
661 }
662 }
663
664 return lvl;
665}
666
d7429b6a 667/* Find all basic blocks of the function whose first insn is F.
d7429b6a 668
336a6399
RH
669 Collect and return a list of labels whose addresses are taken. This
670 will be used in make_edges for use with computed gotos. */
8329b5ec 671
be1bb652 672static void
336a6399 673find_basic_blocks_1 (f)
e881bb1b 674 rtx f;
e881bb1b
RH
675{
676 register rtx insn, next;
e881bb1b
RH
677 int i = 0;
678 rtx bb_note = NULL_RTX;
679 rtx eh_list = NULL_RTX;
be1bb652
RH
680 rtx lvl = NULL_RTX;
681 rtx trll = NULL_RTX;
e881bb1b
RH
682 rtx head = NULL_RTX;
683 rtx end = NULL_RTX;
c9bacfdb 684
e881bb1b
RH
685 /* We process the instructions in a slightly different way than we did
686 previously. This is so that we see a NOTE_BASIC_BLOCK after we have
687 closed out the previous block, so that it gets attached at the proper
688 place. Since this form should be equivalent to the previous,
336a6399 689 count_basic_blocks continues to use the old form as a check. */
d7429b6a 690
e881bb1b
RH
691 for (insn = f; insn; insn = next)
692 {
693 enum rtx_code code = GET_CODE (insn);
d7429b6a 694
e881bb1b 695 next = NEXT_INSN (insn);
d7429b6a 696
e881bb1b 697 switch (code)
e658434c 698 {
e881bb1b
RH
699 case NOTE:
700 {
701 int kind = NOTE_LINE_NUMBER (insn);
702
703 /* Keep a LIFO list of the currently active exception notes. */
704 if (kind == NOTE_INSN_EH_REGION_BEG)
336a6399 705 eh_list = alloc_INSN_LIST (insn, eh_list);
e881bb1b 706 else if (kind == NOTE_INSN_EH_REGION_END)
336a6399
RH
707 {
708 rtx t = eh_list;
314883b8 709
336a6399
RH
710 eh_list = XEXP (eh_list, 1);
711 free_INSN_LIST_node (t);
712 }
e881bb1b 713
c9bacfdb 714 /* Look for basic block notes with which to keep the
e881bb1b
RH
715 basic_block_info pointers stable. Unthread the note now;
716 we'll put it back at the right place in create_basic_block.
717 Or not at all if we've already found a note in this block. */
718 else if (kind == NOTE_INSN_BASIC_BLOCK)
719 {
720 if (bb_note == NULL_RTX)
721 bb_note = insn;
47095bfc
RH
722 else
723 next = flow_delete_insn (insn);
e881bb1b 724 }
e881bb1b
RH
725 break;
726 }
d7429b6a 727
e881bb1b 728 case CODE_LABEL:
c9bacfdb 729 /* A basic block starts at a label. If we've closed one off due
e881bb1b
RH
730 to a barrier or some such, no need to do it again. */
731 if (head != NULL_RTX)
2ec1535d 732 {
e881bb1b
RH
733 /* While we now have edge lists with which other portions of
734 the compiler might determine a call ending a basic block
735 does not imply an abnormal edge, it will be a bit before
736 everything can be updated. So continue to emit a noop at
737 the end of such a block. */
314883b8 738 if (GET_CODE (end) == CALL_INSN && ! SIBLING_CALL_P (end))
e881bb1b
RH
739 {
740 rtx nop = gen_rtx_USE (VOIDmode, const0_rtx);
741 end = emit_insn_after (nop, end);
742 }
743
e881bb1b
RH
744 create_basic_block (i++, head, end, bb_note);
745 bb_note = NULL_RTX;
2ec1535d 746 }
314883b8 747
e881bb1b
RH
748 head = end = insn;
749 break;
d06c6389 750
e881bb1b
RH
751 case JUMP_INSN:
752 /* A basic block ends at a jump. */
753 if (head == NULL_RTX)
754 head = insn;
755 else
756 {
c9bacfdb 757 /* ??? Make a special check for table jumps. The way this
7a3b7acb 758 happens is truly and amazingly gross. We are about to
e881bb1b
RH
759 create a basic block that contains just a code label and
760 an addr*vec jump insn. Worse, an addr_diff_vec creates
761 its own natural loop.
5c35539b 762
e881bb1b 763 Prevent this bit of brain damage, pasting things together
c9bacfdb 764 correctly in make_edges.
2c3a56ad 765
e881bb1b
RH
766 The correct solution involves emitting the table directly
767 on the tablejump instruction as a note, or JUMP_LABEL. */
e658434c 768
e881bb1b
RH
769 if (GET_CODE (PATTERN (insn)) == ADDR_VEC
770 || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC)
771 {
772 head = end = NULL;
773 n_basic_blocks--;
774 break;
775 }
776 }
777 end = insn;
778 goto new_bb_inclusive;
d7429b6a 779
e881bb1b
RH
780 case BARRIER:
781 /* A basic block ends at a barrier. It may be that an unconditional
782 jump already closed the basic block -- no need to do it again. */
783 if (head == NULL_RTX)
784 break;
d7429b6a 785
e881bb1b
RH
786 /* While we now have edge lists with which other portions of the
787 compiler might determine a call ending a basic block does not
788 imply an abnormal edge, it will be a bit before everything can
789 be updated. So continue to emit a noop at the end of such a
790 block. */
314883b8 791 if (GET_CODE (end) == CALL_INSN && ! SIBLING_CALL_P (end))
e881bb1b
RH
792 {
793 rtx nop = gen_rtx_USE (VOIDmode, const0_rtx);
794 end = emit_insn_after (nop, end);
795 }
796 goto new_bb_exclusive;
797
798 case CALL_INSN:
314883b8
RK
799 {
800 /* Record whether this call created an edge. */
801 rtx note = find_reg_note (insn, REG_EH_REGION, NULL_RTX);
802 int region = (note ? INTVAL (XEXP (note, 0)) : 1);
803 int call_has_abnormal_edge = 0;
804
1bc48f82
RE
805 if (GET_CODE (PATTERN (insn)) == CALL_PLACEHOLDER)
806 {
807 /* Scan each of the alternatives for label refs. */
808 lvl = find_label_refs (XEXP (PATTERN (insn), 0), lvl);
809 lvl = find_label_refs (XEXP (PATTERN (insn), 1), lvl);
810 lvl = find_label_refs (XEXP (PATTERN (insn), 2), lvl);
811 /* Record its tail recursion label, if any. */
812 if (XEXP (PATTERN (insn), 3) != NULL_RTX)
813 trll = alloc_EXPR_LIST (0, XEXP (PATTERN (insn), 3), trll);
814 }
be1bb652 815
314883b8
RK
816 /* If there is an EH region or rethrow, we have an edge. */
817 if ((eh_list && region > 0)
818 || find_reg_note (insn, REG_EH_RETHROW, NULL_RTX))
819 call_has_abnormal_edge = 1;
820 else if (nonlocal_goto_handler_labels && region >= 0)
821 /* If there is a nonlocal goto label and the specified
822 region number isn't -1, we have an edge. (0 means
823 no throw, but might have a nonlocal goto). */
824 call_has_abnormal_edge = 1;
e881bb1b 825
314883b8 826 /* A basic block ends at a call that can either throw or
c29ea88a
RK
827 do a non-local goto. */
828 if (call_has_abnormal_edge)
314883b8
RK
829 {
830 new_bb_inclusive:
831 if (head == NULL_RTX)
832 head = insn;
833 end = insn;
834
835 new_bb_exclusive:
836 create_basic_block (i++, head, end, bb_note);
837 head = end = NULL_RTX;
838 bb_note = NULL_RTX;
839 break;
840 }
c9bacfdb
KH
841 }
842 /* Fall through. */
d7429b6a 843
e881bb1b
RH
844 default:
845 if (GET_RTX_CLASS (code) == 'i')
846 {
847 if (head == NULL_RTX)
848 head = insn;
849 end = insn;
850 }
851 break;
852 }
d7429b6a 853
e881bb1b 854 if (GET_RTX_CLASS (code) == 'i')
d7429b6a 855 {
e881bb1b 856 rtx note;
421382ac 857
e881bb1b 858 /* Make a list of all labels referred to other than by jumps
c9bacfdb 859 (which just don't have the REG_LABEL notes).
2ec1535d 860
e881bb1b 861 Make a special exception for labels followed by an ADDR*VEC,
c9bacfdb 862 as this would be a part of the tablejump setup code.
421382ac 863
e881bb1b
RH
864 Make a special exception for the eh_return_stub_label, which
865 we know isn't part of any otherwise visible control flow. */
c9bacfdb 866
e881bb1b 867 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
c29ea88a
RK
868 if (REG_NOTE_KIND (note) == REG_LABEL)
869 {
870 rtx lab = XEXP (note, 0), next;
314883b8 871
c29ea88a 872 if (lab == eh_return_stub_label)
be1bb652 873 ;
c29ea88a
RK
874 else if ((next = next_nonnote_insn (lab)) != NULL
875 && GET_CODE (next) == JUMP_INSN
876 && (GET_CODE (PATTERN (next)) == ADDR_VEC
877 || GET_CODE (PATTERN (next)) == ADDR_DIFF_VEC))
878 ;
be1bb652
RH
879 else if (GET_CODE (lab) == NOTE)
880 ;
c29ea88a 881 else
be1bb652 882 lvl = alloc_EXPR_LIST (0, XEXP (note, 0), lvl);
c29ea88a 883 }
d7429b6a 884 }
e881bb1b 885 }
d7429b6a 886
e881bb1b 887 if (head != NULL_RTX)
336a6399 888 create_basic_block (i++, head, end, bb_note);
0d12ea97
RH
889 else if (bb_note)
890 flow_delete_insn (bb_note);
af14ce9c 891
e881bb1b
RH
892 if (i != n_basic_blocks)
893 abort ();
af14ce9c 894
be1bb652
RH
895 label_value_list = lvl;
896 tail_recursion_label_list = trll;
d7429b6a 897}
5ece9746 898
19d3c25c
RH
899/* Tidy the CFG by deleting unreachable code and whatnot. */
900
901void
902cleanup_cfg (f)
903 rtx f;
904{
905 delete_unreachable_blocks ();
906 move_stray_eh_region_notes ();
907 record_active_eh_regions (f);
908 try_merge_blocks ();
909 mark_critical_edges ();
2cade2ad
CP
910
911 /* Kill the data we won't maintain. */
be1bb652
RH
912 free_EXPR_LIST_list (&label_value_list);
913 free_EXPR_LIST_list (&tail_recursion_label_list);
19d3c25c
RH
914}
915
e881bb1b
RH
916/* Create a new basic block consisting of the instructions between
917 HEAD and END inclusive. Reuses the note and basic block struct
918 in BB_NOTE, if any. */
5ece9746 919
295ae817 920void
e881bb1b
RH
921create_basic_block (index, head, end, bb_note)
922 int index;
923 rtx head, end, bb_note;
5ece9746 924{
e881bb1b
RH
925 basic_block bb;
926
927 if (bb_note
b3bf5bde 928 && ! RTX_INTEGRATED_P (bb_note)
e881bb1b
RH
929 && (bb = NOTE_BASIC_BLOCK (bb_note)) != NULL
930 && bb->aux == NULL)
5ece9746 931 {
e881bb1b
RH
932 /* If we found an existing note, thread it back onto the chain. */
933
47095bfc
RH
934 rtx after;
935
e881bb1b 936 if (GET_CODE (head) == CODE_LABEL)
47095bfc 937 after = head;
e881bb1b
RH
938 else
939 {
47095bfc 940 after = PREV_INSN (head);
e881bb1b
RH
941 head = bb_note;
942 }
47095bfc
RH
943
944 if (after != bb_note && NEXT_INSN (after) != bb_note)
945 reorder_insns (bb_note, bb_note, after);
5ece9746 946 }
e881bb1b
RH
947 else
948 {
949 /* Otherwise we must create a note and a basic block structure.
950 Since we allow basic block structs in rtl, give the struct
951 the same lifetime by allocating it off the function obstack
952 rather than using malloc. */
8329b5ec 953
1f8f4a0b 954 bb = (basic_block) obstack_alloc (&flow_obstack, sizeof (*bb));
e881bb1b 955 memset (bb, 0, sizeof (*bb));
421382ac 956
e881bb1b
RH
957 if (GET_CODE (head) == CODE_LABEL)
958 bb_note = emit_note_after (NOTE_INSN_BASIC_BLOCK, head);
959 else
960 {
961 bb_note = emit_note_before (NOTE_INSN_BASIC_BLOCK, head);
962 head = bb_note;
963 }
964 NOTE_BASIC_BLOCK (bb_note) = bb;
965 }
966
eeea333e
RH
967 /* Always include the bb note in the block. */
968 if (NEXT_INSN (end) == bb_note)
969 end = bb_note;
970
e881bb1b
RH
971 bb->head = head;
972 bb->end = end;
973 bb->index = index;
974 BASIC_BLOCK (index) = bb;
975
976 /* Tag the block so that we know it has been used when considering
977 other basic block notes. */
978 bb->aux = bb;
421382ac 979}
e881bb1b
RH
980\f
981/* Records the basic block struct in BB_FOR_INSN, for every instruction
982 indexed by INSN_UID. MAX is the size of the array. */
421382ac 983
2307e372
RH
984void
985compute_bb_for_insn (max)
e881bb1b 986 int max;
421382ac 987{
e881bb1b 988 int i;
421382ac 989
49c3bb12
RH
990 if (basic_block_for_insn)
991 VARRAY_FREE (basic_block_for_insn);
2307e372
RH
992 VARRAY_BB_INIT (basic_block_for_insn, max, "basic_block_for_insn");
993
e881bb1b
RH
994 for (i = 0; i < n_basic_blocks; ++i)
995 {
996 basic_block bb = BASIC_BLOCK (i);
997 rtx insn, end;
998
999 end = bb->end;
1000 insn = bb->head;
1001 while (1)
1002 {
1003 int uid = INSN_UID (insn);
1004 if (uid < max)
2307e372 1005 VARRAY_BB (basic_block_for_insn, uid) = bb;
e881bb1b
RH
1006 if (insn == end)
1007 break;
1008 insn = NEXT_INSN (insn);
1009 }
1010 }
421382ac
BS
1011}
1012
e881bb1b 1013/* Free the memory associated with the edge structures. */
421382ac
BS
1014
1015static void
e881bb1b 1016clear_edges ()
421382ac 1017{
e881bb1b
RH
1018 int i;
1019 edge n, e;
421382ac 1020
e881bb1b 1021 for (i = 0; i < n_basic_blocks; ++i)
421382ac 1022 {
e881bb1b 1023 basic_block bb = BASIC_BLOCK (i);
421382ac 1024
c9bacfdb 1025 for (e = bb->succ; e; e = n)
421382ac 1026 {
e881bb1b
RH
1027 n = e->succ_next;
1028 free (e);
421382ac 1029 }
e881bb1b
RH
1030
1031 bb->succ = 0;
1032 bb->pred = 0;
1033 }
1034
c9bacfdb 1035 for (e = ENTRY_BLOCK_PTR->succ; e; e = n)
e881bb1b
RH
1036 {
1037 n = e->succ_next;
1038 free (e);
421382ac 1039 }
e881bb1b
RH
1040
1041 ENTRY_BLOCK_PTR->succ = 0;
1042 EXIT_BLOCK_PTR->pred = 0;
d3a923ee
RH
1043
1044 n_edges = 0;
421382ac
BS
1045}
1046
e881bb1b
RH
1047/* Identify the edges between basic blocks.
1048
1049 NONLOCAL_LABEL_LIST is a list of non-local labels in the function. Blocks
1050 that are otherwise unreachable may be reachable with a non-local goto.
1051
c9bacfdb 1052 BB_EH_END is an array indexed by basic block number in which we record
e881bb1b
RH
1053 the list of exception regions active at the end of the basic block. */
1054
dc2ede84 1055static void
336a6399 1056make_edges (label_value_list)
e881bb1b 1057 rtx label_value_list;
dc2ede84 1058{
e881bb1b 1059 int i;
1ef1bf06 1060 eh_nesting_info *eh_nest_info = init_eh_nesting_info ();
dbf08f94 1061 sbitmap *edge_cache = NULL;
e881bb1b
RH
1062
1063 /* Assume no computed jump; revise as we create edges. */
1064 current_function_has_computed_jump = 0;
1065
dbf08f94
RH
1066 /* Heavy use of computed goto in machine-generated code can lead to
1067 nearly fully-connected CFGs. In that case we spend a significant
1068 amount of time searching the edge lists for duplicates. */
1069 if (forced_labels || label_value_list)
1070 {
1071 edge_cache = sbitmap_vector_alloc (n_basic_blocks, n_basic_blocks);
1072 sbitmap_vector_zero (edge_cache, n_basic_blocks);
1073 }
1074
e881bb1b 1075 /* By nature of the way these get numbered, block 0 is always the entry. */
dbf08f94 1076 make_edge (edge_cache, ENTRY_BLOCK_PTR, BASIC_BLOCK (0), EDGE_FALLTHRU);
dc2ede84 1077
e881bb1b 1078 for (i = 0; i < n_basic_blocks; ++i)
421382ac 1079 {
e881bb1b 1080 basic_block bb = BASIC_BLOCK (i);
336a6399 1081 rtx insn, x;
e881bb1b 1082 enum rtx_code code;
4b523fc4 1083 int force_fallthru = 0;
421382ac 1084
336a6399 1085 /* Examine the last instruction of the block, and discover the
e881bb1b
RH
1086 ways we can leave the block. */
1087
1088 insn = bb->end;
1089 code = GET_CODE (insn);
1090
1091 /* A branch. */
1092 if (code == JUMP_INSN)
1093 {
1094 rtx tmp;
1095
1096 /* ??? Recognize a tablejump and do the right thing. */
1097 if ((tmp = JUMP_LABEL (insn)) != NULL_RTX
1098 && (tmp = NEXT_INSN (tmp)) != NULL_RTX
1099 && GET_CODE (tmp) == JUMP_INSN
1100 && (GET_CODE (PATTERN (tmp)) == ADDR_VEC
1101 || GET_CODE (PATTERN (tmp)) == ADDR_DIFF_VEC))
1102 {
1103 rtvec vec;
1104 int j;
1105
1106 if (GET_CODE (PATTERN (tmp)) == ADDR_VEC)
1107 vec = XVEC (PATTERN (tmp), 0);
1108 else
1109 vec = XVEC (PATTERN (tmp), 1);
1110
1111 for (j = GET_NUM_ELEM (vec) - 1; j >= 0; --j)
dbf08f94
RH
1112 make_label_edge (edge_cache, bb,
1113 XEXP (RTVEC_ELT (vec, j), 0), 0);
4b523fc4
RE
1114
1115 /* Some targets (eg, ARM) emit a conditional jump that also
1116 contains the out-of-range target. Scan for these and
1117 add an edge if necessary. */
1118 if ((tmp = single_set (insn)) != NULL
1119 && SET_DEST (tmp) == pc_rtx
1120 && GET_CODE (SET_SRC (tmp)) == IF_THEN_ELSE
1121 && GET_CODE (XEXP (SET_SRC (tmp), 2)) == LABEL_REF)
dbf08f94
RH
1122 make_label_edge (edge_cache, bb,
1123 XEXP (XEXP (SET_SRC (tmp), 2), 0), 0);
4b523fc4
RE
1124
1125#ifdef CASE_DROPS_THROUGH
1126 /* Silly VAXen. The ADDR_VEC is going to be in the way of
1127 us naturally detecting fallthru into the next block. */
1128 force_fallthru = 1;
1129#endif
e881bb1b
RH
1130 }
1131
1132 /* If this is a computed jump, then mark it as reaching
1133 everything on the label_value_list and forced_labels list. */
1134 else if (computed_jump_p (insn))
1135 {
dc2ede84 1136 current_function_has_computed_jump = 1;
dc2ede84 1137
e881bb1b 1138 for (x = label_value_list; x; x = XEXP (x, 1))
dbf08f94 1139 make_label_edge (edge_cache, bb, XEXP (x, 0), EDGE_ABNORMAL);
c9bacfdb 1140
dc2ede84 1141 for (x = forced_labels; x; x = XEXP (x, 1))
dbf08f94 1142 make_label_edge (edge_cache, bb, XEXP (x, 0), EDGE_ABNORMAL);
dc2ede84
BS
1143 }
1144
e881bb1b
RH
1145 /* Returns create an exit out. */
1146 else if (returnjump_p (insn))
dbf08f94 1147 make_edge (edge_cache, bb, EXIT_BLOCK_PTR, 0);
e881bb1b
RH
1148
1149 /* Otherwise, we have a plain conditional or unconditional jump. */
1150 else
dc2ede84 1151 {
e881bb1b
RH
1152 if (! JUMP_LABEL (insn))
1153 abort ();
dbf08f94 1154 make_label_edge (edge_cache, bb, JUMP_LABEL (insn), 0);
e881bb1b
RH
1155 }
1156 }
1157
c9bacfdb 1158 /* If this is a sibling call insn, then this is in effect a
0a1c58a2
JL
1159 combined call and return, and so we need an edge to the
1160 exit block. No need to worry about EH edges, since we
1161 wouldn't have created the sibling call in the first place. */
1162
1163 if (code == CALL_INSN && SIBLING_CALL_P (insn))
9a1ba437
RH
1164 make_edge (edge_cache, bb, EXIT_BLOCK_PTR,
1165 EDGE_ABNORMAL | EDGE_ABNORMAL_CALL);
0a1c58a2 1166
e881bb1b
RH
1167 /* If this is a CALL_INSN, then mark it as reaching the active EH
1168 handler for this CALL_INSN. If we're handling asynchronous
1169 exceptions then any insn can reach any of the active handlers.
b472794d 1170
e881bb1b 1171 Also mark the CALL_INSN as reaching any nonlocal goto handler. */
b472794d 1172
9a1ba437 1173 else if (code == CALL_INSN || asynchronous_exceptions)
e881bb1b 1174 {
6814a8a0
JM
1175 /* Add any appropriate EH edges. We do this unconditionally
1176 since there may be a REG_EH_REGION or REG_EH_RETHROW note
1177 on the call, and this needn't be within an EH region. */
1178 make_eh_edge (edge_cache, eh_nest_info, bb, insn, bb->eh_end);
336a6399
RH
1179
1180 /* If we have asynchronous exceptions, do the same for *all*
1181 exception regions active in the block. */
1182 if (asynchronous_exceptions
1183 && bb->eh_beg != bb->eh_end)
e881bb1b 1184 {
336a6399 1185 if (bb->eh_beg >= 0)
dbf08f94
RH
1186 make_eh_edge (edge_cache, eh_nest_info, bb,
1187 NULL_RTX, bb->eh_beg);
336a6399 1188
7a3b7acb 1189 for (x = bb->head; x != bb->end; x = NEXT_INSN (x))
336a6399
RH
1190 if (GET_CODE (x) == NOTE
1191 && (NOTE_LINE_NUMBER (x) == NOTE_INSN_EH_REGION_BEG
1192 || NOTE_LINE_NUMBER (x) == NOTE_INSN_EH_REGION_END))
1193 {
1194 int region = NOTE_EH_HANDLER (x);
dbf08f94
RH
1195 make_eh_edge (edge_cache, eh_nest_info, bb,
1196 NULL_RTX, region);
336a6399 1197 }
e881bb1b
RH
1198 }
1199
1200 if (code == CALL_INSN && nonlocal_goto_handler_labels)
1201 {
dc2ede84
BS
1202 /* ??? This could be made smarter: in some cases it's possible
1203 to tell that certain calls will not do a nonlocal goto.
1204
1205 For example, if the nested functions that do the nonlocal
1206 gotos do not have their addresses taken, then only calls to
1207 those functions or to other nested functions that use them
1208 could possibly do nonlocal gotos. */
1ef1bf06
AM
1209 /* We do know that a REG_EH_REGION note with a value less
1210 than 0 is guaranteed not to perform a non-local goto. */
1211 rtx note = find_reg_note (insn, REG_EH_REGION, NULL_RTX);
12a41c48 1212 if (!note || INTVAL (XEXP (note, 0)) >= 0)
c9bacfdb 1213 for (x = nonlocal_goto_handler_labels; x; x = XEXP (x, 1))
dbf08f94 1214 make_label_edge (edge_cache, bb, XEXP (x, 0),
1ef1bf06 1215 EDGE_ABNORMAL | EDGE_ABNORMAL_CALL);
dc2ede84
BS
1216 }
1217 }
e881bb1b
RH
1218
1219 /* We know something about the structure of the function __throw in
1220 libgcc2.c. It is the only function that ever contains eh_stub
1221 labels. It modifies its return address so that the last block
1222 returns to one of the eh_stub labels within it. So we have to
1223 make additional edges in the flow graph. */
1224 if (i + 1 == n_basic_blocks && eh_return_stub_label != 0)
dbf08f94 1225 make_label_edge (edge_cache, bb, eh_return_stub_label, EDGE_EH);
e881bb1b
RH
1226
1227 /* Find out if we can drop through to the next block. */
1228 insn = next_nonnote_insn (insn);
4b523fc4 1229 if (!insn || (i + 1 == n_basic_blocks && force_fallthru))
dbf08f94 1230 make_edge (edge_cache, bb, EXIT_BLOCK_PTR, EDGE_FALLTHRU);
e881bb1b
RH
1231 else if (i + 1 < n_basic_blocks)
1232 {
1233 rtx tmp = BLOCK_HEAD (i + 1);
1234 if (GET_CODE (tmp) == NOTE)
1235 tmp = next_nonnote_insn (tmp);
4b523fc4 1236 if (force_fallthru || insn == tmp)
dbf08f94 1237 make_edge (edge_cache, bb, BASIC_BLOCK (i + 1), EDGE_FALLTHRU);
e881bb1b 1238 }
dc2ede84 1239 }
dbf08f94 1240
1ef1bf06 1241 free_eh_nesting_info (eh_nest_info);
dbf08f94
RH
1242 if (edge_cache)
1243 sbitmap_vector_free (edge_cache);
e881bb1b
RH
1244}
1245
1246/* Create an edge between two basic blocks. FLAGS are auxiliary information
1247 about the edge that is accumulated between calls. */
1248
69732dcb 1249void
dbf08f94
RH
1250make_edge (edge_cache, src, dst, flags)
1251 sbitmap *edge_cache;
e881bb1b
RH
1252 basic_block src, dst;
1253 int flags;
1254{
dbf08f94 1255 int use_edge_cache;
e881bb1b
RH
1256 edge e;
1257
dbf08f94
RH
1258 /* Don't bother with edge cache for ENTRY or EXIT; there aren't that
1259 many edges to them, and we didn't allocate memory for it. */
1260 use_edge_cache = (edge_cache
1261 && src != ENTRY_BLOCK_PTR
1262 && dst != EXIT_BLOCK_PTR);
e881bb1b 1263
dbf08f94 1264 /* Make sure we don't add duplicate edges. */
25e4379f
MM
1265 switch (use_edge_cache)
1266 {
1267 default:
1268 /* Quick test for non-existance of the edge. */
1269 if (! TEST_BIT (edge_cache[src->index], dst->index))
1270 break;
1271
1272 /* The edge exists; early exit if no work to do. */
1273 if (flags == 0)
1274 return;
1275
1276 /* FALLTHRU */
1277 case 0:
1278 for (e = src->succ; e; e = e->succ_next)
1279 if (e->dest == dst)
1280 {
1281 e->flags |= flags;
1282 return;
1283 }
1284 break;
1285 }
e881bb1b
RH
1286
1287 e = (edge) xcalloc (1, sizeof (*e));
d3a923ee 1288 n_edges++;
e881bb1b
RH
1289
1290 e->succ_next = src->succ;
1291 e->pred_next = dst->pred;
1292 e->src = src;
1293 e->dest = dst;
1294 e->flags = flags;
1295
1296 src->succ = e;
1297 dst->pred = e;
dbf08f94
RH
1298
1299 if (use_edge_cache)
1300 SET_BIT (edge_cache[src->index], dst->index);
e881bb1b
RH
1301}
1302
1303/* Create an edge from a basic block to a label. */
1304
1305static void
dbf08f94
RH
1306make_label_edge (edge_cache, src, label, flags)
1307 sbitmap *edge_cache;
e881bb1b
RH
1308 basic_block src;
1309 rtx label;
1310 int flags;
1311{
1312 if (GET_CODE (label) != CODE_LABEL)
1313 abort ();
1314
1315 /* If the label was never emitted, this insn is junk, but avoid a
1316 crash trying to refer to BLOCK_FOR_INSN (label). This can happen
1317 as a result of a syntax error and a diagnostic has already been
1318 printed. */
1319
1320 if (INSN_UID (label) == 0)
1321 return;
1322
dbf08f94 1323 make_edge (edge_cache, src, BLOCK_FOR_INSN (label), flags);
e881bb1b 1324}
e6cfb550 1325
336a6399
RH
1326/* Create the edges generated by INSN in REGION. */
1327
1328static void
dbf08f94
RH
1329make_eh_edge (edge_cache, eh_nest_info, src, insn, region)
1330 sbitmap *edge_cache;
336a6399
RH
1331 eh_nesting_info *eh_nest_info;
1332 basic_block src;
1333 rtx insn;
1334 int region;
1335{
1336 handler_info **handler_list;
1337 int num, is_call;
1338
1339 is_call = (insn && GET_CODE (insn) == CALL_INSN ? EDGE_ABNORMAL_CALL : 0);
1340 num = reachable_handlers (region, eh_nest_info, insn, &handler_list);
1341 while (--num >= 0)
1342 {
dbf08f94 1343 make_label_edge (edge_cache, src, handler_list[num]->handler_label,
336a6399
RH
1344 EDGE_ABNORMAL | EDGE_EH | is_call);
1345 }
1346}
1347
1348/* EH_REGION notes appearing between basic blocks is ambiguous, and even
1349 dangerous if we intend to move basic blocks around. Move such notes
1350 into the following block. */
1351
1352static void
1353move_stray_eh_region_notes ()
1354{
1355 int i;
1356 basic_block b1, b2;
1357
1358 if (n_basic_blocks < 2)
1359 return;
1360
1361 b2 = BASIC_BLOCK (n_basic_blocks - 1);
1362 for (i = n_basic_blocks - 2; i >= 0; --i, b2 = b1)
1363 {
1364 rtx insn, next, list = NULL_RTX;
1365
1366 b1 = BASIC_BLOCK (i);
1367 for (insn = NEXT_INSN (b1->end); insn != b2->head; insn = next)
1368 {
1369 next = NEXT_INSN (insn);
1370 if (GET_CODE (insn) == NOTE
1371 && (NOTE_LINE_NUMBER (insn) == NOTE_INSN_EH_REGION_BEG
1372 || NOTE_LINE_NUMBER (insn) == NOTE_INSN_EH_REGION_END))
1373 {
1374 /* Unlink from the insn chain. */
1375 NEXT_INSN (PREV_INSN (insn)) = next;
1376 PREV_INSN (next) = PREV_INSN (insn);
1377
1378 /* Queue it. */
1379 NEXT_INSN (insn) = list;
1380 list = insn;
1381 }
1382 }
1383
1384 if (list == NULL_RTX)
1385 continue;
1386
1387 /* Find where to insert these things. */
1388 insn = b2->head;
1389 if (GET_CODE (insn) == CODE_LABEL)
1390 insn = NEXT_INSN (insn);
1391
1392 while (list)
1393 {
1394 next = NEXT_INSN (list);
1395 add_insn_after (list, insn);
1396 list = next;
1397 }
1398 }
1399}
1400
1401/* Recompute eh_beg/eh_end for each basic block. */
1402
1403static void
1404record_active_eh_regions (f)
1405 rtx f;
1406{
1407 rtx insn, eh_list = NULL_RTX;
1408 int i = 0;
1409 basic_block bb = BASIC_BLOCK (0);
1410
c9bacfdb 1411 for (insn = f; insn; insn = NEXT_INSN (insn))
336a6399
RH
1412 {
1413 if (bb->head == insn)
1414 bb->eh_beg = (eh_list ? NOTE_EH_HANDLER (XEXP (eh_list, 0)) : -1);
1415
1416 if (GET_CODE (insn) == NOTE)
1417 {
1418 int kind = NOTE_LINE_NUMBER (insn);
1419 if (kind == NOTE_INSN_EH_REGION_BEG)
1420 eh_list = alloc_INSN_LIST (insn, eh_list);
1421 else if (kind == NOTE_INSN_EH_REGION_END)
1422 {
1423 rtx t = XEXP (eh_list, 1);
1424 free_INSN_LIST_node (eh_list);
1425 eh_list = t;
1426 }
1427 }
1428
1429 if (bb->end == insn)
1430 {
1431 bb->eh_end = (eh_list ? NOTE_EH_HANDLER (XEXP (eh_list, 0)) : -1);
1432 i += 1;
30439f29
JL
1433 if (i == n_basic_blocks)
1434 break;
336a6399
RH
1435 bb = BASIC_BLOCK (i);
1436 }
1437 }
1438}
1439
e881bb1b 1440/* Identify critical edges and set the bits appropriately. */
336a6399 1441
e881bb1b
RH
1442static void
1443mark_critical_edges ()
1444{
1445 int i, n = n_basic_blocks;
1446 basic_block bb;
1447
1448 /* We begin with the entry block. This is not terribly important now,
1449 but could be if a front end (Fortran) implemented alternate entry
1450 points. */
1451 bb = ENTRY_BLOCK_PTR;
1452 i = -1;
1453
1454 while (1)
e6cfb550 1455 {
e881bb1b
RH
1456 edge e;
1457
1458 /* (1) Critical edges must have a source with multiple successors. */
1459 if (bb->succ && bb->succ->succ_next)
1460 {
c9bacfdb 1461 for (e = bb->succ; e; e = e->succ_next)
e881bb1b
RH
1462 {
1463 /* (2) Critical edges must have a destination with multiple
1464 predecessors. Note that we know there is at least one
1465 predecessor -- the edge we followed to get here. */
1466 if (e->dest->pred->pred_next)
1467 e->flags |= EDGE_CRITICAL;
1468 else
1469 e->flags &= ~EDGE_CRITICAL;
1470 }
1471 }
1472 else
1473 {
c9bacfdb 1474 for (e = bb->succ; e; e = e->succ_next)
e881bb1b
RH
1475 e->flags &= ~EDGE_CRITICAL;
1476 }
1477
1478 if (++i >= n)
1479 break;
1480 bb = BASIC_BLOCK (i);
e6cfb550 1481 }
e881bb1b
RH
1482}
1483\f
c586192c
MH
1484/* Split a block BB after insn INSN creating a new fallthru edge.
1485 Return the new edge. Note that to keep other parts of the compiler happy,
1486 this function renumbers all the basic blocks so that the new
1487 one has a number one greater than the block split. */
1488
1489edge
1490split_block (bb, insn)
1491 basic_block bb;
1492 rtx insn;
1493{
1494 basic_block new_bb;
1495 edge new_edge;
1496 edge e;
1497 rtx bb_note;
1498 int i, j;
1499
c586192c
MH
1500 /* There is no point splitting the block after its end. */
1501 if (bb->end == insn)
1502 return 0;
1503
1504 /* Create the new structures. */
1f8f4a0b 1505 new_bb = (basic_block) obstack_alloc (&flow_obstack, sizeof (*new_bb));
c586192c
MH
1506 new_edge = (edge) xcalloc (1, sizeof (*new_edge));
1507 n_edges++;
1508
1509 memset (new_bb, 0, sizeof (*new_bb));
1510
1511 new_bb->head = NEXT_INSN (insn);
1512 new_bb->end = bb->end;
1513 bb->end = insn;
1514
1515 new_bb->succ = bb->succ;
1516 bb->succ = new_edge;
1517 new_bb->pred = new_edge;
1518 new_bb->count = bb->count;
1519 new_bb->loop_depth = bb->loop_depth;
1520
1521 new_edge->src = bb;
1522 new_edge->dest = new_bb;
1523 new_edge->flags = EDGE_FALLTHRU;
1524 new_edge->probability = REG_BR_PROB_BASE;
1525 new_edge->count = bb->count;
1526
1527 /* Redirect the src of the successor edges of bb to point to new_bb. */
1528 for (e = new_bb->succ; e; e = e->succ_next)
1529 e->src = new_bb;
1530
1531 /* Place the new block just after the block being split. */
1532 VARRAY_GROW (basic_block_info, ++n_basic_blocks);
1533
1534 /* Some parts of the compiler expect blocks to be number in
1535 sequential order so insert the new block immediately after the
1536 block being split.. */
1537 j = bb->index;
1538 for (i = n_basic_blocks - 1; i > j + 1; --i)
1539 {
1540 basic_block tmp = BASIC_BLOCK (i - 1);
1541 BASIC_BLOCK (i) = tmp;
1542 tmp->index = i;
1543 }
1544
1545 BASIC_BLOCK (i) = new_bb;
1546 new_bb->index = i;
1547
1548 /* Create the basic block note. */
1549 bb_note = emit_note_before (NOTE_INSN_BASIC_BLOCK,
1550 new_bb->head);
1551 NOTE_BASIC_BLOCK (bb_note) = new_bb;
1552 new_bb->head = bb_note;
1553
1554 update_bb_for_insn (new_bb);
1555
1556 if (bb->global_live_at_start)
1557 {
1f8f4a0b
MM
1558 new_bb->global_live_at_start = OBSTACK_ALLOC_REG_SET (&flow_obstack);
1559 new_bb->global_live_at_end = OBSTACK_ALLOC_REG_SET (&flow_obstack);
c586192c
MH
1560 COPY_REG_SET (new_bb->global_live_at_end, bb->global_live_at_end);
1561
1562 /* We now have to calculate which registers are live at the end
1563 of the split basic block and at the start of the new basic
1564 block. Start with those registers that are known to be live
1565 at the end of the original basic block and get
1566 propagate_block to determine which registers are live. */
1567 COPY_REG_SET (new_bb->global_live_at_start, bb->global_live_at_end);
7dfc0fbe 1568 propagate_block (new_bb, new_bb->global_live_at_start, NULL, NULL, 0);
97ca9316 1569 COPY_REG_SET (bb->global_live_at_end,
c586192c
MH
1570 new_bb->global_live_at_start);
1571 }
1572
1573 return new_edge;
1574}
1575
1576
e881bb1b 1577/* Split a (typically critical) edge. Return the new block.
c9bacfdb 1578 Abort on abnormal edges.
e881bb1b
RH
1579
1580 ??? The code generally expects to be called on critical edges.
c9bacfdb 1581 The case of a block ending in an unconditional jump to a
e881bb1b
RH
1582 block with multiple predecessors is not handled optimally. */
1583
1584basic_block
1585split_edge (edge_in)
1586 edge edge_in;
1587{
1588 basic_block old_pred, bb, old_succ;
1589 edge edge_out;
1590 rtx bb_note;
abb14ef5 1591 int i, j;
c9bacfdb 1592
e881bb1b
RH
1593 /* Abnormal edges cannot be split. */
1594 if ((edge_in->flags & EDGE_ABNORMAL) != 0)
1595 abort ();
1596
1597 old_pred = edge_in->src;
1598 old_succ = edge_in->dest;
1599
1600 /* Remove the existing edge from the destination's pred list. */
1601 {
1602 edge *pp;
1603 for (pp = &old_succ->pred; *pp != edge_in; pp = &(*pp)->pred_next)
1604 continue;
1605 *pp = edge_in->pred_next;
1e7d57a3 1606 edge_in->pred_next = NULL;
e881bb1b
RH
1607 }
1608
1609 /* Create the new structures. */
1f8f4a0b 1610 bb = (basic_block) obstack_alloc (&flow_obstack, sizeof (*bb));
e881bb1b 1611 edge_out = (edge) xcalloc (1, sizeof (*edge_out));
d3a923ee 1612 n_edges++;
e881bb1b
RH
1613
1614 memset (bb, 0, sizeof (*bb));
e881bb1b
RH
1615
1616 /* ??? This info is likely going to be out of date very soon. */
e881bb1b
RH
1617 if (old_succ->global_live_at_start)
1618 {
1f8f4a0b
MM
1619 bb->global_live_at_start = OBSTACK_ALLOC_REG_SET (&flow_obstack);
1620 bb->global_live_at_end = OBSTACK_ALLOC_REG_SET (&flow_obstack);
e881bb1b
RH
1621 COPY_REG_SET (bb->global_live_at_start, old_succ->global_live_at_start);
1622 COPY_REG_SET (bb->global_live_at_end, old_succ->global_live_at_start);
1623 }
e881bb1b
RH
1624
1625 /* Wire them up. */
1626 bb->pred = edge_in;
1627 bb->succ = edge_out;
51891abe 1628 bb->count = edge_in->count;
1e7d57a3 1629
e881bb1b 1630 edge_in->dest = bb;
1e7d57a3
JH
1631 edge_in->flags &= ~EDGE_CRITICAL;
1632
1633 edge_out->pred_next = old_succ->pred;
1634 edge_out->succ_next = NULL;
e881bb1b
RH
1635 edge_out->src = bb;
1636 edge_out->dest = old_succ;
1e7d57a3
JH
1637 edge_out->flags = EDGE_FALLTHRU;
1638 edge_out->probability = REG_BR_PROB_BASE;
51891abe 1639 edge_out->count = edge_in->count;
1e7d57a3
JH
1640
1641 old_succ->pred = edge_out;
e881bb1b
RH
1642
1643 /* Tricky case -- if there existed a fallthru into the successor
1644 (and we're not it) we must add a new unconditional jump around
c9bacfdb 1645 the new block we're actually interested in.
e881bb1b
RH
1646
1647 Further, if that edge is critical, this means a second new basic
1648 block must be created to hold it. In order to simplify correct
1649 insn placement, do this before we touch the existing basic block
1650 ordering for the block we were really wanting. */
1651 if ((edge_in->flags & EDGE_FALLTHRU) == 0)
1652 {
1653 edge e;
c9bacfdb 1654 for (e = edge_out->pred_next; e; e = e->pred_next)
e881bb1b
RH
1655 if (e->flags & EDGE_FALLTHRU)
1656 break;
1657
1658 if (e)
1659 {
1660 basic_block jump_block;
1661 rtx pos;
1662
d9d4fb43
AS
1663 if ((e->flags & EDGE_CRITICAL) == 0
1664 && e->src != ENTRY_BLOCK_PTR)
e881bb1b
RH
1665 {
1666 /* Non critical -- we can simply add a jump to the end
1667 of the existing predecessor. */
1668 jump_block = e->src;
e881bb1b
RH
1669 }
1670 else
1671 {
1672 /* We need a new block to hold the jump. The simplest
1673 way to do the bulk of the work here is to recursively
1674 call ourselves. */
1675 jump_block = split_edge (e);
1676 e = jump_block->succ;
e881bb1b
RH
1677 }
1678
1e7d57a3
JH
1679 /* Now add the jump insn ... */
1680 pos = emit_jump_insn_after (gen_jump (old_succ->head),
1681 jump_block->end);
e881bb1b 1682 jump_block->end = pos;
414094de
JL
1683 if (basic_block_for_insn)
1684 set_block_for_insn (pos, jump_block);
e881bb1b 1685 emit_barrier_after (pos);
1e7d57a3
JH
1686
1687 /* ... let jump know that label is in use, ... */
a8688bd6 1688 JUMP_LABEL (pos) = old_succ->head;
1e7d57a3 1689 ++LABEL_NUSES (old_succ->head);
c9bacfdb 1690
e881bb1b
RH
1691 /* ... and clear fallthru on the outgoing edge. */
1692 e->flags &= ~EDGE_FALLTHRU;
1693
1694 /* Continue splitting the interesting edge. */
1695 }
1696 }
1697
1698 /* Place the new block just in front of the successor. */
1699 VARRAY_GROW (basic_block_info, ++n_basic_blocks);
abb14ef5
AM
1700 if (old_succ == EXIT_BLOCK_PTR)
1701 j = n_basic_blocks - 1;
1702 else
1703 j = old_succ->index;
1704 for (i = n_basic_blocks - 1; i > j; --i)
e881bb1b
RH
1705 {
1706 basic_block tmp = BASIC_BLOCK (i - 1);
1707 BASIC_BLOCK (i) = tmp;
1708 tmp->index = i;
1709 }
1710 BASIC_BLOCK (i) = bb;
1711 bb->index = i;
1712
c9bacfdb 1713 /* Create the basic block note.
9aa137f3
JL
1714
1715 Where we place the note can have a noticable impact on the generated
c9bacfdb 1716 code. Consider this cfg:
9aa137f3
JL
1717
1718 E
1719 |
1720 0
1721 / \
1722 +->1-->2--->E
1723 | |
1724 +--+
1725
1726 If we need to insert an insn on the edge from block 0 to block 1,
1727 we want to ensure the instructions we insert are outside of any
1728 loop notes that physically sit between block 0 and block 1. Otherwise
1729 we confuse the loop optimizer into thinking the loop is a phony. */
1730 if (old_succ != EXIT_BLOCK_PTR
1731 && PREV_INSN (old_succ->head)
1732 && GET_CODE (PREV_INSN (old_succ->head)) == NOTE
1733 && NOTE_LINE_NUMBER (PREV_INSN (old_succ->head)) == NOTE_INSN_LOOP_BEG)
1734 bb_note = emit_note_before (NOTE_INSN_BASIC_BLOCK,
1735 PREV_INSN (old_succ->head));
1736 else if (old_succ != EXIT_BLOCK_PTR)
abb14ef5
AM
1737 bb_note = emit_note_before (NOTE_INSN_BASIC_BLOCK, old_succ->head);
1738 else
1739 bb_note = emit_note_after (NOTE_INSN_BASIC_BLOCK, get_last_insn ());
e881bb1b
RH
1740 NOTE_BASIC_BLOCK (bb_note) = bb;
1741 bb->head = bb->end = bb_note;
1742
1743 /* Not quite simple -- for non-fallthru edges, we must adjust the
1744 predecessor's jump instruction to target our new block. */
1745 if ((edge_in->flags & EDGE_FALLTHRU) == 0)
1746 {
1747 rtx tmp, insn = old_pred->end;
1748 rtx old_label = old_succ->head;
1749 rtx new_label = gen_label_rtx ();
1750
1751 if (GET_CODE (insn) != JUMP_INSN)
1752 abort ();
1753
1754 /* ??? Recognize a tablejump and adjust all matching cases. */
1755 if ((tmp = JUMP_LABEL (insn)) != NULL_RTX
1756 && (tmp = NEXT_INSN (tmp)) != NULL_RTX
1757 && GET_CODE (tmp) == JUMP_INSN
1758 && (GET_CODE (PATTERN (tmp)) == ADDR_VEC
1759 || GET_CODE (PATTERN (tmp)) == ADDR_DIFF_VEC))
1760 {
1761 rtvec vec;
1762 int j;
1763
1764 if (GET_CODE (PATTERN (tmp)) == ADDR_VEC)
1765 vec = XVEC (PATTERN (tmp), 0);
1766 else
1767 vec = XVEC (PATTERN (tmp), 1);
1768
1769 for (j = GET_NUM_ELEM (vec) - 1; j >= 0; --j)
1770 if (XEXP (RTVEC_ELT (vec, j), 0) == old_label)
1771 {
c9bacfdb 1772 RTVEC_ELT (vec, j) = gen_rtx_LABEL_REF (VOIDmode, new_label);
e881bb1b
RH
1773 --LABEL_NUSES (old_label);
1774 ++LABEL_NUSES (new_label);
1775 }
506f9fbf
RE
1776
1777 /* Handle casesi dispatch insns */
1778 if ((tmp = single_set (insn)) != NULL
1779 && SET_DEST (tmp) == pc_rtx
1780 && GET_CODE (SET_SRC (tmp)) == IF_THEN_ELSE
1781 && GET_CODE (XEXP (SET_SRC (tmp), 2)) == LABEL_REF
1782 && XEXP (XEXP (SET_SRC (tmp), 2), 0) == old_label)
1783 {
c9bacfdb 1784 XEXP (SET_SRC (tmp), 2) = gen_rtx_LABEL_REF (VOIDmode,
506f9fbf
RE
1785 new_label);
1786 --LABEL_NUSES (old_label);
1787 ++LABEL_NUSES (new_label);
1788 }
e881bb1b
RH
1789 }
1790 else
1791 {
1792 /* This would have indicated an abnormal edge. */
1793 if (computed_jump_p (insn))
1794 abort ();
1795
1796 /* A return instruction can't be redirected. */
1797 if (returnjump_p (insn))
1798 abort ();
1799
1800 /* If the insn doesn't go where we think, we're confused. */
1801 if (JUMP_LABEL (insn) != old_label)
1802 abort ();
1803
9ba11d5a 1804 redirect_jump (insn, new_label, 0);
e881bb1b
RH
1805 }
1806
1807 emit_label_before (new_label, bb_note);
1808 bb->head = new_label;
1809 }
1810
e881bb1b
RH
1811 return bb;
1812}
1813
1814/* Queue instructions for insertion on an edge between two basic blocks.
1815 The new instructions and basic blocks (if any) will not appear in the
1816 CFG until commit_edge_insertions is called. */
1817
1818void
1819insert_insn_on_edge (pattern, e)
1820 rtx pattern;
1821 edge e;
1822{
1823 /* We cannot insert instructions on an abnormal critical edge.
1824 It will be easier to find the culprit if we die now. */
1825 if ((e->flags & (EDGE_ABNORMAL|EDGE_CRITICAL))
1826 == (EDGE_ABNORMAL|EDGE_CRITICAL))
1827 abort ();
1828
1829 if (e->insns == NULL_RTX)
1830 start_sequence ();
1831 else
1832 push_to_sequence (e->insns);
1833
1834 emit_insn (pattern);
1835
1836 e->insns = get_insns ();
c9bacfdb 1837 end_sequence ();
e881bb1b
RH
1838}
1839
1840/* Update the CFG for the instructions queued on edge E. */
1841
1842static void
1843commit_one_edge_insertion (e)
1844 edge e;
1845{
f5540cd4 1846 rtx before = NULL_RTX, after = NULL_RTX, insns, tmp, last;
e881bb1b
RH
1847 basic_block bb;
1848
19d3c25c
RH
1849 /* Pull the insns off the edge now since the edge might go away. */
1850 insns = e->insns;
1851 e->insns = NULL_RTX;
1852
e881bb1b
RH
1853 /* Figure out where to put these things. If the destination has
1854 one predecessor, insert there. Except for the exit block. */
1855 if (e->dest->pred->pred_next == NULL
1856 && e->dest != EXIT_BLOCK_PTR)
1857 {
1858 bb = e->dest;
1859
1860 /* Get the location correct wrt a code label, and "nice" wrt
1861 a basic block note, and before everything else. */
1862 tmp = bb->head;
1863 if (GET_CODE (tmp) == CODE_LABEL)
1864 tmp = NEXT_INSN (tmp);
589ca5cb 1865 if (NOTE_INSN_BASIC_BLOCK_P (tmp))
e881bb1b
RH
1866 tmp = NEXT_INSN (tmp);
1867 if (tmp == bb->head)
1868 before = tmp;
1869 else
1870 after = PREV_INSN (tmp);
1871 }
c9bacfdb 1872
e881bb1b
RH
1873 /* If the source has one successor and the edge is not abnormal,
1874 insert there. Except for the entry block. */
1875 else if ((e->flags & EDGE_ABNORMAL) == 0
1876 && e->src->succ->succ_next == NULL
1877 && e->src != ENTRY_BLOCK_PTR)
1878 {
1879 bb = e->src;
08520ad8
JL
1880 /* It is possible to have a non-simple jump here. Consider a target
1881 where some forms of unconditional jumps clobber a register. This
c9bacfdb 1882 happens on the fr30 for example.
08520ad8
JL
1883
1884 We know this block has a single successor, so we can just emit
1885 the queued insns before the jump. */
e881bb1b
RH
1886 if (GET_CODE (bb->end) == JUMP_INSN)
1887 {
e881bb1b
RH
1888 before = bb->end;
1889 }
1890 else
1891 {
1892 /* We'd better be fallthru, or we've lost track of what's what. */
1893 if ((e->flags & EDGE_FALLTHRU) == 0)
1894 abort ();
1895
1896 after = bb->end;
1897 }
1898 }
1899
1900 /* Otherwise we must split the edge. */
1901 else
1902 {
1903 bb = split_edge (e);
1904 after = bb->end;
1905 }
1906
1907 /* Now that we've found the spot, do the insertion. */
a8688bd6
AM
1908
1909 /* Set the new block number for these insns, if structure is allocated. */
1910 if (basic_block_for_insn)
1911 {
1912 rtx i;
19d3c25c 1913 for (i = insns; i != NULL_RTX; i = NEXT_INSN (i))
a8688bd6
AM
1914 set_block_for_insn (i, bb);
1915 }
1916
e881bb1b
RH
1917 if (before)
1918 {
19d3c25c 1919 emit_insns_before (insns, before);
e881bb1b 1920 if (before == bb->head)
19d3c25c 1921 bb->head = insns;
f5540cd4
RH
1922
1923 last = prev_nonnote_insn (before);
e881bb1b
RH
1924 }
1925 else
1926 {
f5540cd4 1927 last = emit_insns_after (insns, after);
e881bb1b 1928 if (after == bb->end)
f5540cd4
RH
1929 bb->end = last;
1930 }
19d3c25c 1931
f5540cd4
RH
1932 if (returnjump_p (last))
1933 {
c9bacfdb 1934 /* ??? Remove all outgoing edges from BB and add one for EXIT.
f5540cd4
RH
1935 This is not currently a problem because this only happens
1936 for the (single) epilogue, which already has a fallthru edge
1937 to EXIT. */
1938
1939 e = bb->succ;
1940 if (e->dest != EXIT_BLOCK_PTR
1941 || e->succ_next != NULL
1942 || (e->flags & EDGE_FALLTHRU) == 0)
1943 abort ();
1944 e->flags &= ~EDGE_FALLTHRU;
1945
1946 emit_barrier_after (last);
1947 bb->end = last;
1948
1949 if (before)
1950 flow_delete_insn (before);
e881bb1b 1951 }
f5540cd4
RH
1952 else if (GET_CODE (last) == JUMP_INSN)
1953 abort ();
e881bb1b
RH
1954}
1955
1956/* Update the CFG for all queued instructions. */
1957
1958void
1959commit_edge_insertions ()
1960{
1961 int i;
1962 basic_block bb;
1963
19d3c25c
RH
1964#ifdef ENABLE_CHECKING
1965 verify_flow_info ();
1966#endif
c9bacfdb 1967
e881bb1b
RH
1968 i = -1;
1969 bb = ENTRY_BLOCK_PTR;
1970 while (1)
1971 {
1972 edge e, next;
1973
c9bacfdb 1974 for (e = bb->succ; e; e = next)
e881bb1b
RH
1975 {
1976 next = e->succ_next;
1977 if (e->insns)
1978 commit_one_edge_insertion (e);
1979 }
1980
1981 if (++i >= n_basic_blocks)
1982 break;
1983 bb = BASIC_BLOCK (i);
1984 }
1985}
1986\f
1987/* Delete all unreachable basic blocks. */
1988
1989static void
1990delete_unreachable_blocks ()
1991{
1992 basic_block *worklist, *tos;
1993 int deleted_handler;
1994 edge e;
1995 int i, n;
1996
1997 n = n_basic_blocks;
67289ea6 1998 tos = worklist = (basic_block *) xmalloc (sizeof (basic_block) * n);
e881bb1b
RH
1999
2000 /* Use basic_block->aux as a marker. Clear them all. */
2001
2002 for (i = 0; i < n; ++i)
2003 BASIC_BLOCK (i)->aux = NULL;
2004
2005 /* Add our starting points to the worklist. Almost always there will
2006 be only one. It isn't inconcievable that we might one day directly
2007 support Fortran alternate entry points. */
2008
c9bacfdb 2009 for (e = ENTRY_BLOCK_PTR->succ; e; e = e->succ_next)
aa3d4bf9
RH
2010 {
2011 *tos++ = e->dest;
2012
2013 /* Mark the block with a handy non-null value. */
2014 e->dest->aux = e;
2015 }
c9bacfdb 2016
e881bb1b
RH
2017 /* Iterate: find everything reachable from what we've already seen. */
2018
2019 while (tos != worklist)
2020 {
2021 basic_block b = *--tos;
2022
c9bacfdb 2023 for (e = b->succ; e; e = e->succ_next)
e881bb1b 2024 if (!e->dest->aux)
aa3d4bf9
RH
2025 {
2026 *tos++ = e->dest;
2027 e->dest->aux = e;
2028 }
e881bb1b
RH
2029 }
2030
2031 /* Delete all unreachable basic blocks. Count down so that we don't
c9bacfdb 2032 interfere with the block renumbering that happens in flow_delete_block. */
e881bb1b
RH
2033
2034 deleted_handler = 0;
2035
2036 for (i = n - 1; i >= 0; --i)
2037 {
2038 basic_block b = BASIC_BLOCK (i);
2039
2040 if (b->aux != NULL)
2041 /* This block was found. Tidy up the mark. */
2042 b->aux = NULL;
2043 else
52294521 2044 deleted_handler |= flow_delete_block (b);
e881bb1b
RH
2045 }
2046
5568fb48 2047 tidy_fallthru_edges ();
e881bb1b 2048
e881bb1b 2049 /* If we deleted an exception handler, we may have EH region begin/end
c9bacfdb 2050 blocks to remove as well. */
e881bb1b
RH
2051 if (deleted_handler)
2052 delete_eh_regions ();
67289ea6
MM
2053
2054 free (worklist);
e881bb1b
RH
2055}
2056
2057/* Find EH regions for which there is no longer a handler, and delete them. */
2058
2059static void
2060delete_eh_regions ()
2061{
2062 rtx insn;
2063
1ef1bf06
AM
2064 update_rethrow_references ();
2065
e881bb1b
RH
2066 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
2067 if (GET_CODE (insn) == NOTE)
2068 {
c9bacfdb
KH
2069 if ((NOTE_LINE_NUMBER (insn) == NOTE_INSN_EH_REGION_BEG)
2070 || (NOTE_LINE_NUMBER (insn) == NOTE_INSN_EH_REGION_END))
e881bb1b 2071 {
ef178af3 2072 int num = NOTE_EH_HANDLER (insn);
1ef1bf06 2073 /* A NULL handler indicates a region is no longer needed,
6814a8a0 2074 as long as its rethrow label isn't used. */
1ef1bf06 2075 if (get_first_handler (num) == NULL && ! rethrow_used (num))
e881bb1b
RH
2076 {
2077 NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
2078 NOTE_SOURCE_FILE (insn) = 0;
2079 }
2080 }
2081 }
2082}
2083
2084/* Return true if NOTE is not one of the ones that must be kept paired,
2085 so that we may simply delete them. */
2086
2087static int
eeea333e 2088can_delete_note_p (note)
e881bb1b
RH
2089 rtx note;
2090{
2091 return (NOTE_LINE_NUMBER (note) == NOTE_INSN_DELETED
2092 || NOTE_LINE_NUMBER (note) == NOTE_INSN_BASIC_BLOCK);
2093}
2094
2095/* Unlink a chain of insns between START and FINISH, leaving notes
2096 that must be paired. */
2097
d3a923ee 2098void
5aabad00 2099flow_delete_insn_chain (start, finish)
e881bb1b
RH
2100 rtx start, finish;
2101{
2102 /* Unchain the insns one by one. It would be quicker to delete all
2103 of these with a single unchaining, rather than one at a time, but
2104 we need to keep the NOTE's. */
2105
2106 rtx next;
2107
2108 while (1)
2109 {
2110 next = NEXT_INSN (start);
eeea333e
RH
2111 if (GET_CODE (start) == NOTE && !can_delete_note_p (start))
2112 ;
be1bb652
RH
2113 else if (GET_CODE (start) == CODE_LABEL
2114 && ! can_delete_label_p (start))
2115 {
2116 const char *name = LABEL_NAME (start);
2117 PUT_CODE (start, NOTE);
2118 NOTE_LINE_NUMBER (start) = NOTE_INSN_DELETED_LABEL;
2119 NOTE_SOURCE_FILE (start) = name;
2120 }
eeea333e 2121 else
e881bb1b
RH
2122 next = flow_delete_insn (start);
2123
2124 if (start == finish)
2125 break;
2126 start = next;
2127 }
2128}
2129
2130/* Delete the insns in a (non-live) block. We physically delete every
2131 non-deleted-note insn, and update the flow graph appropriately.
2132
2133 Return nonzero if we deleted an exception handler. */
2134
2135/* ??? Preserving all such notes strikes me as wrong. It would be nice
2136 to post-process the stream to remove empty blocks, loops, ranges, etc. */
2137
52294521
RH
2138int
2139flow_delete_block (b)
e881bb1b
RH
2140 basic_block b;
2141{
2142 int deleted_handler = 0;
1519ae2c 2143 rtx insn, end, tmp;
e881bb1b
RH
2144
2145 /* If the head of this block is a CODE_LABEL, then it might be the
2146 label for an exception handler which can't be reached.
2147
2148 We need to remove the label from the exception_handler_label list
3ad47811
MM
2149 and remove the associated NOTE_INSN_EH_REGION_BEG and
2150 NOTE_INSN_EH_REGION_END notes. */
e881bb1b
RH
2151
2152 insn = b->head;
c9bacfdb 2153
312f6255
GK
2154 never_reached_warning (insn);
2155
e881bb1b
RH
2156 if (GET_CODE (insn) == CODE_LABEL)
2157 {
2158 rtx x, *prev = &exception_handler_labels;
2159
2160 for (x = exception_handler_labels; x; x = XEXP (x, 1))
2161 {
2162 if (XEXP (x, 0) == insn)
2163 {
2164 /* Found a match, splice this label out of the EH label list. */
2165 *prev = XEXP (x, 1);
2166 XEXP (x, 1) = NULL_RTX;
2167 XEXP (x, 0) = NULL_RTX;
2168
2169 /* Remove the handler from all regions */
2170 remove_handler (insn);
2171 deleted_handler = 1;
2172 break;
2173 }
2174 prev = &XEXP (x, 1);
2175 }
e881bb1b
RH
2176 }
2177
1519ae2c
RH
2178 /* Include any jump table following the basic block. */
2179 end = b->end;
2180 if (GET_CODE (end) == JUMP_INSN
2181 && (tmp = JUMP_LABEL (end)) != NULL_RTX
2182 && (tmp = NEXT_INSN (tmp)) != NULL_RTX
2183 && GET_CODE (tmp) == JUMP_INSN
2184 && (GET_CODE (PATTERN (tmp)) == ADDR_VEC
2185 || GET_CODE (PATTERN (tmp)) == ADDR_DIFF_VEC))
2186 end = tmp;
2187
2188 /* Include any barrier that may follow the basic block. */
1fa4609a 2189 tmp = next_nonnote_insn (end);
1519ae2c
RH
2190 if (tmp && GET_CODE (tmp) == BARRIER)
2191 end = tmp;
2192
2193 /* Selectively delete the entire chain. */
5aabad00 2194 flow_delete_insn_chain (insn, end);
e881bb1b 2195
c9bacfdb 2196 /* Remove the edges into and out of this block. Note that there may
e881bb1b
RH
2197 indeed be edges in, if we are removing an unreachable loop. */
2198 {
2199 edge e, next, *q;
2200
c9bacfdb 2201 for (e = b->pred; e; e = next)
e881bb1b
RH
2202 {
2203 for (q = &e->src->succ; *q != e; q = &(*q)->succ_next)
2204 continue;
2205 *q = e->succ_next;
2206 next = e->pred_next;
d3a923ee 2207 n_edges--;
e881bb1b
RH
2208 free (e);
2209 }
c9bacfdb 2210 for (e = b->succ; e; e = next)
e881bb1b
RH
2211 {
2212 for (q = &e->dest->pred; *q != e; q = &(*q)->pred_next)
2213 continue;
2214 *q = e->pred_next;
2215 next = e->succ_next;
d3a923ee 2216 n_edges--;
e881bb1b
RH
2217 free (e);
2218 }
2219
2220 b->pred = NULL;
2221 b->succ = NULL;
2222 }
2223
2224 /* Remove the basic block from the array, and compact behind it. */
2225 expunge_block (b);
2226
2227 return deleted_handler;
2228}
2229
2230/* Remove block B from the basic block array and compact behind it. */
2231
2232static void
2233expunge_block (b)
2234 basic_block b;
2235{
2236 int i, n = n_basic_blocks;
2237
2238 for (i = b->index; i + 1 < n; ++i)
2239 {
2240 basic_block x = BASIC_BLOCK (i + 1);
2241 BASIC_BLOCK (i) = x;
2242 x->index = i;
2243 }
2244
2245 basic_block_info->num_elements--;
2246 n_basic_blocks--;
2247}
2248
2249/* Delete INSN by patching it out. Return the next insn. */
2250
69732dcb 2251rtx
e881bb1b
RH
2252flow_delete_insn (insn)
2253 rtx insn;
2254{
2255 rtx prev = PREV_INSN (insn);
2256 rtx next = NEXT_INSN (insn);
1519ae2c 2257 rtx note;
e881bb1b
RH
2258
2259 PREV_INSN (insn) = NULL_RTX;
2260 NEXT_INSN (insn) = NULL_RTX;
aa9e158d 2261 INSN_DELETED_P (insn) = 1;
c9bacfdb 2262
e881bb1b
RH
2263 if (prev)
2264 NEXT_INSN (prev) = next;
2265 if (next)
2266 PREV_INSN (next) = prev;
2267 else
2268 set_last_insn (prev);
e6cfb550 2269
55a98783
JL
2270 if (GET_CODE (insn) == CODE_LABEL)
2271 remove_node_from_expr_list (insn, &nonlocal_goto_handler_labels);
2272
e881bb1b
RH
2273 /* If deleting a jump, decrement the use count of the label. Deleting
2274 the label itself should happen in the normal course of block merging. */
f5540cd4
RH
2275 if (GET_CODE (insn) == JUMP_INSN
2276 && JUMP_LABEL (insn)
2277 && GET_CODE (JUMP_LABEL (insn)) == CODE_LABEL)
e881bb1b
RH
2278 LABEL_NUSES (JUMP_LABEL (insn))--;
2279
1519ae2c 2280 /* Also if deleting an insn that references a label. */
f5540cd4
RH
2281 else if ((note = find_reg_note (insn, REG_LABEL, NULL_RTX)) != NULL_RTX
2282 && GET_CODE (XEXP (note, 0)) == CODE_LABEL)
1519ae2c
RH
2283 LABEL_NUSES (XEXP (note, 0))--;
2284
e881bb1b 2285 return next;
d7429b6a 2286}
8329b5ec 2287
e881bb1b
RH
2288/* True if a given label can be deleted. */
2289
c9bacfdb 2290static int
e881bb1b
RH
2291can_delete_label_p (label)
2292 rtx label;
dc2ede84 2293{
e881bb1b 2294 rtx x;
dc2ede84 2295
e881bb1b
RH
2296 if (LABEL_PRESERVE_P (label))
2297 return 0;
421382ac 2298
c9bacfdb 2299 for (x = forced_labels; x; x = XEXP (x, 1))
e881bb1b
RH
2300 if (label == XEXP (x, 0))
2301 return 0;
c9bacfdb 2302 for (x = label_value_list; x; x = XEXP (x, 1))
e881bb1b
RH
2303 if (label == XEXP (x, 0))
2304 return 0;
c9bacfdb 2305 for (x = exception_handler_labels; x; x = XEXP (x, 1))
e881bb1b
RH
2306 if (label == XEXP (x, 0))
2307 return 0;
dc2ede84 2308
abb3f0a9 2309 /* User declared labels must be preserved. */
088e7160 2310 if (LABEL_NAME (label) != 0)
abb3f0a9 2311 return 0;
c9bacfdb 2312
e881bb1b
RH
2313 return 1;
2314}
421382ac 2315
be1bb652
RH
2316static int
2317tail_recursion_label_p (label)
2318 rtx label;
2319{
2320 rtx x;
2321
c9bacfdb 2322 for (x = tail_recursion_label_list; x; x = XEXP (x, 1))
be1bb652
RH
2323 if (label == XEXP (x, 0))
2324 return 1;
2325
2326 return 0;
2327}
2328
dc108b7a
RH
2329/* Blocks A and B are to be merged into a single block A. The insns
2330 are already contiguous, hence `nomove'. */
2331
2332void
2333merge_blocks_nomove (a, b)
2334 basic_block a, b;
2335{
2336 edge e;
2337 rtx b_head, b_end, a_end;
2338 rtx del_first = NULL_RTX, del_last = NULL_RTX;
2339 int b_empty = 0;
2340
2341 /* If there was a CODE_LABEL beginning B, delete it. */
2342 b_head = b->head;
2343 b_end = b->end;
2344 if (GET_CODE (b_head) == CODE_LABEL)
2345 {
2346 /* Detect basic blocks with nothing but a label. This can happen
2347 in particular at the end of a function. */
2348 if (b_head == b_end)
2349 b_empty = 1;
2350 del_first = del_last = b_head;
2351 b_head = NEXT_INSN (b_head);
2352 }
2353
2354 /* Delete the basic block note. */
589ca5cb 2355 if (NOTE_INSN_BASIC_BLOCK_P (b_head))
dc108b7a
RH
2356 {
2357 if (b_head == b_end)
2358 b_empty = 1;
2359 if (! del_last)
2360 del_first = b_head;
2361 del_last = b_head;
2362 b_head = NEXT_INSN (b_head);
2363 }
2364
2365 /* If there was a jump out of A, delete it. */
2366 a_end = a->end;
2367 if (GET_CODE (a_end) == JUMP_INSN)
2368 {
2369 rtx prev;
2370
8416f80a 2371 for (prev = PREV_INSN (a_end); ; prev = PREV_INSN (prev))
7171b491
RH
2372 if (GET_CODE (prev) != NOTE
2373 || NOTE_LINE_NUMBER (prev) == NOTE_INSN_BASIC_BLOCK
2374 || prev == a->head)
8416f80a 2375 break;
dc108b7a
RH
2376
2377 del_first = a_end;
2378
2379#ifdef HAVE_cc0
2380 /* If this was a conditional jump, we need to also delete
2381 the insn that set cc0. */
2382 if (prev && sets_cc0_p (prev))
2383 {
c9bacfdb 2384 rtx tmp = prev;
dc108b7a
RH
2385 prev = prev_nonnote_insn (prev);
2386 if (!prev)
2387 prev = a->head;
2388 del_first = tmp;
2389 }
2390#endif
2391
2392 a_end = prev;
2393 }
abb9a4c5
RH
2394 else if (GET_CODE (NEXT_INSN (a_end)) == BARRIER)
2395 del_first = NEXT_INSN (a_end);
dc108b7a
RH
2396
2397 /* Delete everything marked above as well as crap that might be
2398 hanging out between the two blocks. */
2399 flow_delete_insn_chain (del_first, del_last);
2400
2401 /* Normally there should only be one successor of A and that is B, but
2402 partway though the merge of blocks for conditional_execution we'll
2403 be merging a TEST block with THEN and ELSE successors. Free the
2404 whole lot of them and hope the caller knows what they're doing. */
2405 while (a->succ)
2406 remove_edge (a->succ);
2407
2408 /* Adjust the edges out of B for the new owner. */
c9bacfdb 2409 for (e = b->succ; e; e = e->succ_next)
dc108b7a
RH
2410 e->src = a;
2411 a->succ = b->succ;
2412
2413 /* B hasn't quite yet ceased to exist. Attempt to prevent mishap. */
2414 b->pred = b->succ = NULL;
2415
2416 /* Reassociate the insns of B with A. */
2417 if (!b_empty)
2418 {
2419 if (basic_block_for_insn)
2420 {
2421 BLOCK_FOR_INSN (b_head) = a;
2422 while (b_head != b_end)
2423 {
2424 b_head = NEXT_INSN (b_head);
2425 BLOCK_FOR_INSN (b_head) = a;
2426 }
2427 }
2428 a_end = b_end;
2429 }
2430 a->end = a_end;
2431
2432 expunge_block (b);
2433}
2434
558389e3
JL
2435/* Blocks A and B are to be merged into a single block. A has no incoming
2436 fallthru edge, so it can be moved before B without adding or modifying
2437 any jumps (aside from the jump from A to B). */
2438
2439static int
336a6399 2440merge_blocks_move_predecessor_nojumps (a, b)
558389e3
JL
2441 basic_block a, b;
2442{
93cba993 2443 rtx start, end, barrier;
ee7b8369 2444 int index;
558389e3
JL
2445
2446 start = a->head;
2447 end = a->end;
558389e3 2448
558389e3 2449 barrier = next_nonnote_insn (end);
be1bb652
RH
2450 if (GET_CODE (barrier) != BARRIER)
2451 abort ();
2452 flow_delete_insn (barrier);
558389e3
JL
2453
2454 /* Move block and loop notes out of the chain so that we do not
2455 disturb their order.
2456
2457 ??? A better solution would be to squeeze out all the non-nested notes
2458 and adjust the block trees appropriately. Even better would be to have
2459 a tighter connection between block trees and rtl so that this is not
2460 necessary. */
2461 start = squeeze_notes (start, end);
2462
2463 /* Scramble the insn chain. */
93cba993
RH
2464 if (end != PREV_INSN (b->head))
2465 reorder_insns (start, end, PREV_INSN (b->head));
558389e3 2466
336a6399
RH
2467 if (rtl_dump_file)
2468 {
2469 fprintf (rtl_dump_file, "Moved block %d before %d and merged.\n",
2470 a->index, b->index);
2471 }
2472
ee7b8369
RE
2473 /* Swap the records for the two blocks around. Although we are deleting B,
2474 A is now where B was and we want to compact the BB array from where
2475 A used to be. */
c9bacfdb
KH
2476 BASIC_BLOCK (a->index) = b;
2477 BASIC_BLOCK (b->index) = a;
ee7b8369
RE
2478 index = a->index;
2479 a->index = b->index;
2480 b->index = index;
c9bacfdb 2481
ee7b8369
RE
2482 /* Now blocks A and B are contiguous. Merge them. */
2483 merge_blocks_nomove (a, b);
2484
558389e3
JL
2485 return 1;
2486}
2487
2488/* Blocks A and B are to be merged into a single block. B has no outgoing
2489 fallthru edge, so it can be moved after A without adding or modifying
2490 any jumps (aside from the jump from A to B). */
2491
2492static int
336a6399 2493merge_blocks_move_successor_nojumps (a, b)
558389e3
JL
2494 basic_block a, b;
2495{
93cba993 2496 rtx start, end, barrier;
558389e3
JL
2497
2498 start = b->head;
2499 end = b->end;
be1bb652
RH
2500 barrier = NEXT_INSN (end);
2501
2502 /* Recognize a jump table following block B. */
2503 if (GET_CODE (barrier) == CODE_LABEL
2504 && NEXT_INSN (barrier)
2505 && GET_CODE (NEXT_INSN (barrier)) == JUMP_INSN
2506 && (GET_CODE (PATTERN (NEXT_INSN (barrier))) == ADDR_VEC
2507 || GET_CODE (PATTERN (NEXT_INSN (barrier))) == ADDR_DIFF_VEC))
2508 {
2509 end = NEXT_INSN (barrier);
2510 barrier = NEXT_INSN (end);
2511 }
558389e3 2512
be1bb652
RH
2513 /* There had better have been a barrier there. Delete it. */
2514 if (GET_CODE (barrier) != BARRIER)
2515 abort ();
2516 flow_delete_insn (barrier);
558389e3
JL
2517
2518 /* Move block and loop notes out of the chain so that we do not
2519 disturb their order.
2520
2521 ??? A better solution would be to squeeze out all the non-nested notes
2522 and adjust the block trees appropriately. Even better would be to have
2523 a tighter connection between block trees and rtl so that this is not
2524 necessary. */
2525 start = squeeze_notes (start, end);
2526
2527 /* Scramble the insn chain. */
93cba993 2528 reorder_insns (start, end, a->end);
558389e3
JL
2529
2530 /* Now blocks A and B are contiguous. Merge them. */
2531 merge_blocks_nomove (a, b);
336a6399
RH
2532
2533 if (rtl_dump_file)
2534 {
2535 fprintf (rtl_dump_file, "Moved block %d after %d and merged.\n",
2536 b->index, a->index);
2537 }
2538
558389e3
JL
2539 return 1;
2540}
2541
c9bacfdb 2542/* Attempt to merge basic blocks that are potentially non-adjacent.
e881bb1b 2543 Return true iff the attempt succeeded. */
dc2ede84 2544
dc2ede84 2545static int
e881bb1b
RH
2546merge_blocks (e, b, c)
2547 edge e;
2548 basic_block b, c;
dc2ede84 2549{
be1bb652
RH
2550 /* If C has a tail recursion label, do not merge. There is no
2551 edge recorded from the call_placeholder back to this label, as
2552 that would make optimize_sibling_and_tail_recursive_calls more
2553 complex for no gain. */
2554 if (GET_CODE (c->head) == CODE_LABEL
2555 && tail_recursion_label_p (c->head))
2556 return 0;
2557
e881bb1b 2558 /* If B has a fallthru edge to C, no need to move anything. */
336a6399 2559 if (e->flags & EDGE_FALLTHRU)
e881bb1b 2560 {
336a6399 2561 merge_blocks_nomove (b, c);
558389e3 2562
336a6399
RH
2563 if (rtl_dump_file)
2564 {
2565 fprintf (rtl_dump_file, "Merged %d and %d without moving.\n",
2566 b->index, c->index);
2567 }
e881bb1b 2568
336a6399
RH
2569 return 1;
2570 }
2571 else
2572 {
2573 edge tmp_edge;
2574 basic_block d;
2575 int c_has_outgoing_fallthru;
2576 int b_has_incoming_fallthru;
e881bb1b 2577
336a6399
RH
2578 /* We must make sure to not munge nesting of exception regions,
2579 lexical blocks, and loop notes.
c9bacfdb 2580
336a6399
RH
2581 The first is taken care of by requiring that the active eh
2582 region at the end of one block always matches the active eh
2583 region at the beginning of the next block.
c9bacfdb 2584
336a6399 2585 The later two are taken care of by squeezing out all the notes. */
c9bacfdb 2586
336a6399
RH
2587 /* ??? A throw/catch edge (or any abnormal edge) should be rarely
2588 executed and we may want to treat blocks which have two out
2589 edges, one normal, one abnormal as only having one edge for
2590 block merging purposes. */
558389e3 2591
c9bacfdb 2592 for (tmp_edge = c->succ; tmp_edge; tmp_edge = tmp_edge->succ_next)
558389e3
JL
2593 if (tmp_edge->flags & EDGE_FALLTHRU)
2594 break;
2595 c_has_outgoing_fallthru = (tmp_edge != NULL);
2596
c9bacfdb 2597 for (tmp_edge = b->pred; tmp_edge; tmp_edge = tmp_edge->pred_next)
558389e3
JL
2598 if (tmp_edge->flags & EDGE_FALLTHRU)
2599 break;
2600 b_has_incoming_fallthru = (tmp_edge != NULL);
2601
336a6399
RH
2602 /* If B does not have an incoming fallthru, and the exception regions
2603 match, then it can be moved immediately before C without introducing
ff54d46b
JL
2604 or modifying jumps.
2605
2606 C can not be the first block, so we do not have to worry about
2607 accessing a non-existent block. */
336a6399
RH
2608 d = BASIC_BLOCK (c->index - 1);
2609 if (! b_has_incoming_fallthru
2610 && d->eh_end == b->eh_beg
2611 && b->eh_end == c->eh_beg)
2612 return merge_blocks_move_predecessor_nojumps (b, c);
2613
2614 /* Otherwise, we're going to try to move C after B. Make sure the
ff54d46b
JL
2615 exception regions match.
2616
2617 If B is the last basic block, then we must not try to access the
2618 block structure for block B + 1. Luckily in that case we do not
2619 need to worry about matching exception regions. */
2620 d = (b->index + 1 < n_basic_blocks ? BASIC_BLOCK (b->index + 1) : NULL);
336a6399 2621 if (b->eh_end == c->eh_beg
ff54d46b 2622 && (d == NULL || c->eh_end == d->eh_beg))
336a6399
RH
2623 {
2624 /* If C does not have an outgoing fallthru, then it can be moved
2625 immediately after B without introducing or modifying jumps. */
2626 if (! c_has_outgoing_fallthru)
2627 return merge_blocks_move_successor_nojumps (b, c);
2628
2629 /* Otherwise, we'll need to insert an extra jump, and possibly
2630 a new block to contain it. */
2631 /* ??? Not implemented yet. */
2632 }
558389e3 2633
336a6399 2634 return 0;
e881bb1b 2635 }
336a6399 2636}
dc2ede84 2637
336a6399 2638/* Top level driver for merge_blocks. */
421382ac 2639
336a6399
RH
2640static void
2641try_merge_blocks ()
2642{
2643 int i;
2644
2645 /* Attempt to merge blocks as made possible by edge removal. If a block
c9bacfdb 2646 has only one successor, and the successor has only one predecessor,
336a6399
RH
2647 they may be combined. */
2648
c9bacfdb 2649 for (i = 0; i < n_basic_blocks;)
336a6399
RH
2650 {
2651 basic_block c, b = BASIC_BLOCK (i);
2652 edge s;
2653
2654 /* A loop because chains of blocks might be combineable. */
2655 while ((s = b->succ) != NULL
2656 && s->succ_next == NULL
2657 && (s->flags & EDGE_EH) == 0
2658 && (c = s->dest) != EXIT_BLOCK_PTR
2659 && c->pred->pred_next == NULL
2660 /* If the jump insn has side effects, we can't kill the edge. */
2661 && (GET_CODE (b->end) != JUMP_INSN
2662 || onlyjump_p (b->end))
2663 && merge_blocks (s, b, c))
2664 continue;
2665
2666 /* Don't get confused by the index shift caused by deleting blocks. */
2667 i = b->index + 1;
2668 }
e881bb1b 2669}
421382ac 2670
5568fb48
RH
2671/* The given edge should potentially be a fallthru edge. If that is in
2672 fact true, delete the jump and barriers that are in the way. */
e881bb1b 2673
dc108b7a 2674void
e881bb1b
RH
2675tidy_fallthru_edge (e, b, c)
2676 edge e;
2677 basic_block b, c;
2678{
eeea333e 2679 rtx q;
e881bb1b
RH
2680
2681 /* ??? In a late-running flow pass, other folks may have deleted basic
2682 blocks by nopping out blocks, leaving multiple BARRIERs between here
2683 and the target label. They ought to be chastized and fixed.
2684
eeea333e
RH
2685 We can also wind up with a sequence of undeletable labels between
2686 one block and the next.
dc2ede84 2687
eeea333e
RH
2688 So search through a sequence of barriers, labels, and notes for
2689 the head of block C and assert that we really do fall through. */
421382ac 2690
eeea333e 2691 if (next_real_insn (b->end) != next_real_insn (PREV_INSN (c->head)))
e881bb1b 2692 return;
421382ac 2693
e881bb1b
RH
2694 /* Remove what will soon cease being the jump insn from the source block.
2695 If block B consisted only of this single jump, turn it into a deleted
2696 note. */
2697 q = b->end;
56aba4a8 2698 if (GET_CODE (q) == JUMP_INSN
7f1c097d
JH
2699 && onlyjump_p (q)
2700 && (any_uncondjump_p (q)
56aba4a8 2701 || (b->succ == e && e->succ_next == NULL)))
421382ac 2702 {
86a1db60
RH
2703#ifdef HAVE_cc0
2704 /* If this was a conditional jump, we need to also delete
2705 the insn that set cc0. */
7f1c097d 2706 if (any_condjump_p (q) && sets_cc0_p (PREV_INSN (q)))
86a1db60
RH
2707 q = PREV_INSN (q);
2708#endif
2709
e881bb1b
RH
2710 if (b->head == q)
2711 {
2712 PUT_CODE (q, NOTE);
2713 NOTE_LINE_NUMBER (q) = NOTE_INSN_DELETED;
2714 NOTE_SOURCE_FILE (q) = 0;
2715 }
e3f6ee23 2716 else
b578dbd7
RH
2717 q = PREV_INSN (q);
2718
2719 b->end = q;
421382ac 2720 }
421382ac 2721
e881bb1b 2722 /* Selectively unlink the sequence. */
86a1db60 2723 if (q != PREV_INSN (c->head))
5aabad00 2724 flow_delete_insn_chain (NEXT_INSN (q), PREV_INSN (c->head));
b7f7462b 2725
e881bb1b
RH
2726 e->flags |= EDGE_FALLTHRU;
2727}
dc2ede84 2728
5568fb48
RH
2729/* Fix up edges that now fall through, or rather should now fall through
2730 but previously required a jump around now deleted blocks. Simplify
2731 the search by only examining blocks numerically adjacent, since this
2732 is how find_basic_blocks created them. */
2733
2734static void
2735tidy_fallthru_edges ()
2736{
2737 int i;
2738
2739 for (i = 1; i < n_basic_blocks; ++i)
2740 {
2741 basic_block b = BASIC_BLOCK (i - 1);
2742 basic_block c = BASIC_BLOCK (i);
2743 edge s;
2744
2745 /* We care about simple conditional or unconditional jumps with
2746 a single successor.
2747
2748 If we had a conditional branch to the next instruction when
2749 find_basic_blocks was called, then there will only be one
2750 out edge for the block which ended with the conditional
2751 branch (since we do not create duplicate edges).
2752
2753 Furthermore, the edge will be marked as a fallthru because we
2754 merge the flags for the duplicate edges. So we do not want to
2755 check that the edge is not a FALLTHRU edge. */
2756 if ((s = b->succ) != NULL
2757 && s->succ_next == NULL
2758 && s->dest == c
2759 /* If the jump insn has side effects, we can't tidy the edge. */
2760 && (GET_CODE (b->end) != JUMP_INSN
2761 || onlyjump_p (b->end)))
2762 tidy_fallthru_edge (s, b, c);
2763 }
2764}
d7429b6a 2765\f
5ece9746 2766/* Perform data flow analysis.
7f8a79ba
RH
2767 F is the first insn of the function; FLAGS is a set of PROP_* flags
2768 to be used in accumulating flow info. */
5ece9746
JL
2769
2770void
7f8a79ba 2771life_analysis (f, file, flags)
5ece9746 2772 rtx f;
5ece9746 2773 FILE *file;
7f8a79ba 2774 int flags;
5ece9746 2775{
5ece9746 2776#ifdef ELIMINABLE_REGS
47ee9bcb 2777 register int i;
5ece9746
JL
2778 static struct {int from, to; } eliminables[] = ELIMINABLE_REGS;
2779#endif
4e872036 2780
5ece9746
JL
2781 /* Record which registers will be eliminated. We use this in
2782 mark_used_regs. */
2783
2784 CLEAR_HARD_REG_SET (elim_reg_set);
2785
2786#ifdef ELIMINABLE_REGS
b6a1cbae 2787 for (i = 0; i < (int) ARRAY_SIZE (eliminables); i++)
5ece9746
JL
2788 SET_HARD_REG_BIT (elim_reg_set, eliminables[i].from);
2789#else
2790 SET_HARD_REG_BIT (elim_reg_set, FRAME_POINTER_REGNUM);
2791#endif
2792
d29c259b 2793 if (! optimize)
b2262f4a 2794 flags &= ~(PROP_LOG_LINKS | PROP_AUTOINC);
7790df19 2795
3ea8083f
JL
2796 /* The post-reload life analysis have (on a global basis) the same
2797 registers live as was computed by reload itself. elimination
2798 Otherwise offsets and such may be incorrect.
2799
2800 Reload will make some registers as live even though they do not
c9bacfdb 2801 appear in the rtl.
61f286b6
RE
2802
2803 We don't want to create new auto-incs after reload, since they
2804 are unlikely to be useful and can cause problems with shared
2805 stack slots. */
3ea8083f 2806 if (reload_completed)
61f286b6 2807 flags &= ~(PROP_REG_INFO | PROP_AUTOINC);
3ea8083f 2808
7f8a79ba 2809 /* We want alias analysis information for local dead store elimination. */
b2262f4a 2810 if (optimize && (flags & PROP_SCAN_DEAD_CODE))
7f8a79ba
RH
2811 init_alias_analysis ();
2812
3ea8083f
JL
2813 /* Always remove no-op moves. Do this before other processing so
2814 that we don't have to keep re-scanning them. */
2815 delete_noop_moves (f);
2816
2817 /* Some targets can emit simpler epilogues if they know that sp was
2818 not ever modified during the function. After reload, of course,
2819 we've already emitted the epilogue so there's no sense searching. */
7790df19 2820 if (! reload_completed)
3ea8083f 2821 notice_stack_pointer_modification (f);
c9bacfdb 2822
3ea8083f
JL
2823 /* Allocate and zero out data structures that will record the
2824 data from lifetime analysis. */
2825 allocate_reg_life_data ();
2826 allocate_bb_life_data ();
7790df19 2827
3ea8083f
JL
2828 /* Find the set of registers live on function exit. */
2829 mark_regs_live_at_end (EXIT_BLOCK_PTR->global_live_at_start);
2830
2831 /* "Update" life info from zero. It'd be nice to begin the
2832 relaxation with just the exit and noreturn blocks, but that set
2833 is not immediately handy. */
c8082519
RH
2834
2835 if (flags & PROP_REG_INFO)
c9bacfdb 2836 memset (regs_ever_live, 0, sizeof (regs_ever_live));
693d9e2f 2837 update_life_info (NULL, UPDATE_LIFE_GLOBAL, flags);
3ea8083f
JL
2838
2839 /* Clean up. */
b2262f4a 2840 if (optimize && (flags & PROP_SCAN_DEAD_CODE))
7f8a79ba 2841 end_alias_analysis ();
db3a887b 2842
5ece9746
JL
2843 if (file)
2844 dump_flow_info (file);
2845
2846 free_basic_block_vars (1);
2847}
2848
d3a923ee
RH
2849/* A subroutine of verify_wide_reg, called through for_each_rtx.
2850 Search for REGNO. If found, abort if it is not wider than word_mode. */
2851
2852static int
2853verify_wide_reg_1 (px, pregno)
2854 rtx *px;
2855 void *pregno;
2856{
2857 rtx x = *px;
770ae6cc 2858 unsigned int regno = *(int *) pregno;
d3a923ee
RH
2859
2860 if (GET_CODE (x) == REG && REGNO (x) == regno)
2861 {
2862 if (GET_MODE_BITSIZE (GET_MODE (x)) <= BITS_PER_WORD)
2863 abort ();
2864 return 1;
2865 }
2866 return 0;
2867}
2868
2869/* A subroutine of verify_local_live_at_start. Search through insns
2870 between HEAD and END looking for register REGNO. */
2871
2872static void
2873verify_wide_reg (regno, head, end)
2874 int regno;
2875 rtx head, end;
2876{
2877 while (1)
2878 {
2c3c49de 2879 if (INSN_P (head)
d3a923ee
RH
2880 && for_each_rtx (&PATTERN (head), verify_wide_reg_1, &regno))
2881 return;
2882 if (head == end)
2883 break;
2884 head = NEXT_INSN (head);
2885 }
2886
2887 /* We didn't find the register at all. Something's way screwy. */
f9b697bf
BS
2888 if (rtl_dump_file)
2889 fprintf (rtl_dump_file, "Aborting in verify_wide_reg; reg %d\n", regno);
2890 print_rtl_and_abort ();
d3a923ee
RH
2891}
2892
2893/* A subroutine of update_life_info. Verify that there are no untoward
2894 changes in live_at_start during a local update. */
2895
2896static void
2897verify_local_live_at_start (new_live_at_start, bb)
2898 regset new_live_at_start;
2899 basic_block bb;
2900{
2901 if (reload_completed)
2902 {
2903 /* After reload, there are no pseudos, nor subregs of multi-word
2904 registers. The regsets should exactly match. */
2905 if (! REG_SET_EQUAL_P (new_live_at_start, bb->global_live_at_start))
f9b697bf
BS
2906 {
2907 if (rtl_dump_file)
2908 {
2909 fprintf (rtl_dump_file,
2910 "live_at_start mismatch in bb %d, aborting\n",
2911 bb->index);
2912 debug_bitmap_file (rtl_dump_file, bb->global_live_at_start);
2913 debug_bitmap_file (rtl_dump_file, new_live_at_start);
2914 }
2915 print_rtl_and_abort ();
2916 }
d3a923ee
RH
2917 }
2918 else
2919 {
2920 int i;
2921
2922 /* Find the set of changed registers. */
2923 XOR_REG_SET (new_live_at_start, bb->global_live_at_start);
2924
2925 EXECUTE_IF_SET_IN_REG_SET (new_live_at_start, 0, i,
2926 {
c762163e 2927 /* No registers should die. */
d3a923ee 2928 if (REGNO_REG_SET_P (bb->global_live_at_start, i))
f9b697bf
BS
2929 {
2930 if (rtl_dump_file)
2931 fprintf (rtl_dump_file,
2932 "Register %d died unexpectedly in block %d\n", i,
2933 bb->index);
2934 print_rtl_and_abort ();
2935 }
2936
c762163e
R
2937 /* Verify that the now-live register is wider than word_mode. */
2938 verify_wide_reg (i, bb->head, bb->end);
d3a923ee
RH
2939 });
2940 }
2941}
2942
3ea8083f 2943/* Updates life information starting with the basic blocks set in BLOCKS.
693d9e2f 2944 If BLOCKS is null, consider it to be the universal set.
c9bacfdb 2945
693d9e2f
RH
2946 If EXTENT is UPDATE_LIFE_LOCAL, such as after splitting or peepholeing,
2947 we are only expecting local modifications to basic blocks. If we find
2948 extra registers live at the beginning of a block, then we either killed
d3a923ee
RH
2949 useful data, or we have a broken split that wants data not provided.
2950 If we find registers removed from live_at_start, that means we have
2951 a broken peephole that is killing a register it shouldn't.
2952
2953 ??? This is not true in one situation -- when a pre-reload splitter
2954 generates subregs of a multi-word pseudo, current life analysis will
49c3bb12
RH
2955 lose the kill. So we _can_ have a pseudo go live. How irritating.
2956
62828c00
RH
2957 Including PROP_REG_INFO does not properly refresh regs_ever_live
2958 unless the caller resets it to zero. */
d3a923ee
RH
2959
2960void
49c3bb12 2961update_life_info (blocks, extent, prop_flags)
d3a923ee 2962 sbitmap blocks;
715e7fbc 2963 enum update_life_extent extent;
49c3bb12 2964 int prop_flags;
d3a923ee
RH
2965{
2966 regset tmp;
ee25a7a5 2967 regset_head tmp_head;
d3a923ee
RH
2968 int i;
2969
ee25a7a5 2970 tmp = INITIALIZE_REG_SET (tmp_head);
d3a923ee
RH
2971
2972 /* For a global update, we go through the relaxation process again. */
715e7fbc
RH
2973 if (extent != UPDATE_LIFE_LOCAL)
2974 {
49c3bb12
RH
2975 calculate_global_regs_live (blocks, blocks,
2976 prop_flags & PROP_SCAN_DEAD_CODE);
715e7fbc
RH
2977
2978 /* If asked, remove notes from the blocks we'll update. */
2979 if (extent == UPDATE_LIFE_GLOBAL_RM_NOTES)
2980 count_or_remove_death_notes (blocks, 1);
2981 }
d3a923ee 2982
693d9e2f 2983 if (blocks)
d3a923ee 2984 {
693d9e2f
RH
2985 EXECUTE_IF_SET_IN_SBITMAP (blocks, 0, i,
2986 {
2987 basic_block bb = BASIC_BLOCK (i);
2988
2989 COPY_REG_SET (tmp, bb->global_live_at_end);
7dfc0fbe 2990 propagate_block (bb, tmp, NULL, NULL, prop_flags);
693d9e2f
RH
2991
2992 if (extent == UPDATE_LIFE_LOCAL)
2993 verify_local_live_at_start (tmp, bb);
2994 });
2995 }
2996 else
2997 {
2998 for (i = n_basic_blocks - 1; i >= 0; --i)
2999 {
3000 basic_block bb = BASIC_BLOCK (i);
d3a923ee 3001
693d9e2f 3002 COPY_REG_SET (tmp, bb->global_live_at_end);
7dfc0fbe 3003 propagate_block (bb, tmp, NULL, NULL, prop_flags);
d3a923ee 3004
693d9e2f
RH
3005 if (extent == UPDATE_LIFE_LOCAL)
3006 verify_local_live_at_start (tmp, bb);
3007 }
3008 }
d3a923ee
RH
3009
3010 FREE_REG_SET (tmp);
3ea8083f
JL
3011
3012 if (prop_flags & PROP_REG_INFO)
3013 {
3014 /* The only pseudos that are live at the beginning of the function
3015 are those that were not set anywhere in the function. local-alloc
3016 doesn't know how to handle these correctly, so mark them as not
3017 local to any one basic block. */
3018 EXECUTE_IF_SET_IN_REG_SET (ENTRY_BLOCK_PTR->global_live_at_end,
3019 FIRST_PSEUDO_REGISTER, i,
3020 { REG_BASIC_BLOCK (i) = REG_BLOCK_GLOBAL; });
3021
c9bacfdb 3022 /* We have a problem with any pseudoreg that lives across the setjmp.
3ea8083f
JL
3023 ANSI says that if a user variable does not change in value between
3024 the setjmp and the longjmp, then the longjmp preserves it. This
3025 includes longjmp from a place where the pseudo appears dead.
3026 (In principle, the value still exists if it is in scope.)
3027 If the pseudo goes in a hard reg, some other value may occupy
3028 that hard reg where this pseudo is dead, thus clobbering the pseudo.
3029 Conclusion: such a pseudo must not go in a hard reg. */
3030 EXECUTE_IF_SET_IN_REG_SET (regs_live_at_setjmp,
3031 FIRST_PSEUDO_REGISTER, i,
3032 {
3033 if (regno_reg_rtx[i] != 0)
3034 {
3035 REG_LIVE_LENGTH (i) = -1;
3036 REG_BASIC_BLOCK (i) = REG_BLOCK_UNKNOWN;
3037 }
3038 });
3039 }
d3a923ee
RH
3040}
3041
5ece9746
JL
3042/* Free the variables allocated by find_basic_blocks.
3043
e881bb1b 3044 KEEP_HEAD_END_P is non-zero if basic_block_info is not to be freed. */
5ece9746
JL
3045
3046void
3047free_basic_block_vars (keep_head_end_p)
3048 int keep_head_end_p;
3049{
e881bb1b 3050 if (basic_block_for_insn)
5ece9746 3051 {
e881bb1b
RH
3052 VARRAY_FREE (basic_block_for_insn);
3053 basic_block_for_insn = NULL;
5ece9746
JL
3054 }
3055
e881bb1b 3056 if (! keep_head_end_p)
5ece9746 3057 {
e881bb1b
RH
3058 clear_edges ();
3059 VARRAY_FREE (basic_block_info);
3060 n_basic_blocks = 0;
359da67d
RH
3061
3062 ENTRY_BLOCK_PTR->aux = NULL;
3063 ENTRY_BLOCK_PTR->global_live_at_end = NULL;
3064 EXIT_BLOCK_PTR->aux = NULL;
3065 EXIT_BLOCK_PTR->global_live_at_start = NULL;
5ece9746
JL
3066 }
3067}
3068
dc2ede84 3069/* Return nonzero if the destination of SET equals the source. */
c9bacfdb 3070
dc2ede84
BS
3071static int
3072set_noop_p (set)
3073 rtx set;
3074{
3075 rtx src = SET_SRC (set);
3076 rtx dst = SET_DEST (set);
3ea8083f
JL
3077
3078 if (GET_CODE (src) == SUBREG && GET_CODE (dst) == SUBREG)
3079 {
3080 if (SUBREG_WORD (src) != SUBREG_WORD (dst))
3081 return 0;
3082 src = SUBREG_REG (src);
3083 dst = SUBREG_REG (dst);
3084 }
3085
3086 return (GET_CODE (src) == REG && GET_CODE (dst) == REG
3087 && REGNO (src) == REGNO (dst));
dc2ede84
BS
3088}
3089
3090/* Return nonzero if an insn consists only of SETs, each of which only sets a
3091 value to itself. */
c9bacfdb 3092
dc2ede84
BS
3093static int
3094noop_move_p (insn)
3095 rtx insn;
3096{
3097 rtx pat = PATTERN (insn);
3098
3099 /* Insns carrying these notes are useful later on. */
3100 if (find_reg_note (insn, REG_EQUAL, NULL_RTX))
3101 return 0;
3102
3103 if (GET_CODE (pat) == SET && set_noop_p (pat))
3104 return 1;
3105
3106 if (GET_CODE (pat) == PARALLEL)
3107 {
3108 int i;
3109 /* If nothing but SETs of registers to themselves,
3110 this insn can also be deleted. */
3111 for (i = 0; i < XVECLEN (pat, 0); i++)
3112 {
3113 rtx tem = XVECEXP (pat, 0, i);
3114
3115 if (GET_CODE (tem) == USE
3116 || GET_CODE (tem) == CLOBBER)
3117 continue;
3118
3119 if (GET_CODE (tem) != SET || ! set_noop_p (tem))
3120 return 0;
3121 }
3122
3123 return 1;
3124 }
3125 return 0;
3126}
3127
3ea8083f
JL
3128/* Delete any insns that copy a register to itself. */
3129
3130static void
3131delete_noop_moves (f)
3132 rtx f;
3133{
3134 rtx insn;
3135 for (insn = f; insn; insn = NEXT_INSN (insn))
3136 {
3137 if (GET_CODE (insn) == INSN && noop_move_p (insn))
3138 {
3139 PUT_CODE (insn, NOTE);
3140 NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
3141 NOTE_SOURCE_FILE (insn) = 0;
3142 }
3143 }
3144}
3145
3146/* Determine if the stack pointer is constant over the life of the function.
3147 Only useful before prologues have been emitted. */
3148
fdb8a883 3149static void
3ea8083f 3150notice_stack_pointer_modification_1 (x, pat, data)
fdb8a883
JW
3151 rtx x;
3152 rtx pat ATTRIBUTE_UNUSED;
84832317 3153 void *data ATTRIBUTE_UNUSED;
fdb8a883
JW
3154{
3155 if (x == stack_pointer_rtx
3156 /* The stack pointer is only modified indirectly as the result
3157 of a push until later in flow. See the comments in rtl.texi
3158 regarding Embedded Side-Effects on Addresses. */
3159 || (GET_CODE (x) == MEM
3160 && (GET_CODE (XEXP (x, 0)) == PRE_DEC
3161 || GET_CODE (XEXP (x, 0)) == PRE_INC
3162 || GET_CODE (XEXP (x, 0)) == POST_DEC
3163 || GET_CODE (XEXP (x, 0)) == POST_INC)
3164 && XEXP (XEXP (x, 0), 0) == stack_pointer_rtx))
3165 current_function_sp_is_unchanging = 0;
3166}
3167
dc2ede84 3168static void
3ea8083f 3169notice_stack_pointer_modification (f)
dc2ede84
BS
3170 rtx f;
3171{
3172 rtx insn;
3ea8083f
JL
3173
3174 /* Assume that the stack pointer is unchanging if alloca hasn't
3175 been used. */
3176 current_function_sp_is_unchanging = !current_function_calls_alloca;
3177 if (! current_function_sp_is_unchanging)
3178 return;
3179
dc2ede84
BS
3180 for (insn = f; insn; insn = NEXT_INSN (insn))
3181 {
2c3c49de 3182 if (INSN_P (insn))
dc2ede84 3183 {
3ea8083f
JL
3184 /* Check if insn modifies the stack pointer. */
3185 note_stores (PATTERN (insn), notice_stack_pointer_modification_1,
3186 NULL);
3187 if (! current_function_sp_is_unchanging)
3188 return;
dc2ede84
BS
3189 }
3190 }
3191}
3192
d3a923ee
RH
3193/* Mark a register in SET. Hard registers in large modes get all
3194 of their component registers set as well. */
c9bacfdb 3195
d3a923ee 3196static void
c13fde05 3197mark_reg (reg, xset)
d3a923ee 3198 rtx reg;
c13fde05 3199 void *xset;
d3a923ee 3200{
c13fde05 3201 regset set = (regset) xset;
d3a923ee
RH
3202 int regno = REGNO (reg);
3203
c13fde05
RH
3204 if (GET_MODE (reg) == BLKmode)
3205 abort ();
3206
d3a923ee
RH
3207 SET_REGNO_REG_SET (set, regno);
3208 if (regno < FIRST_PSEUDO_REGISTER)
3209 {
3210 int n = HARD_REGNO_NREGS (regno, GET_MODE (reg));
3211 while (--n > 0)
3212 SET_REGNO_REG_SET (set, regno + n);
3213 }
3214}
3215
dc2ede84
BS
3216/* Mark those regs which are needed at the end of the function as live
3217 at the end of the last basic block. */
c9bacfdb 3218
dc2ede84
BS
3219static void
3220mark_regs_live_at_end (set)
3221 regset set;
3222{
3223 int i;
d3a923ee 3224
e881bb1b
RH
3225 /* If exiting needs the right stack value, consider the stack pointer
3226 live at the end of the function. */
d3a923ee
RH
3227 if ((HAVE_epilogue && reload_completed)
3228 || ! EXIT_IGNORE_STACK
dc2ede84
BS
3229 || (! FRAME_POINTER_REQUIRED
3230 && ! current_function_calls_alloca
fdb8a883
JW
3231 && flag_omit_frame_pointer)
3232 || current_function_sp_is_unchanging)
e881bb1b
RH
3233 {
3234 SET_REGNO_REG_SET (set, STACK_POINTER_REGNUM);
3235 }
dc2ede84 3236
e881bb1b 3237 /* Mark the frame pointer if needed at the end of the function. If
dc2ede84
BS
3238 we end up eliminating it, it will be removed from the live list
3239 of each basic block by reload. */
3240
e4b8a413
JW
3241 if (! reload_completed || frame_pointer_needed)
3242 {
3243 SET_REGNO_REG_SET (set, FRAME_POINTER_REGNUM);
dc2ede84 3244#if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
2a3e384f
RH
3245 /* If they are different, also mark the hard frame pointer as live. */
3246 if (! LOCAL_REGNO (HARD_FRAME_POINTER_REGNUM))
3247 SET_REGNO_REG_SET (set, HARD_FRAME_POINTER_REGNUM);
c9bacfdb 3248#endif
e4b8a413 3249 }
dc2ede84 3250
d3a923ee
RH
3251#ifdef PIC_OFFSET_TABLE_REGNUM
3252#ifndef PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
3253 /* Many architectures have a GP register even without flag_pic.
3254 Assume the pic register is not in use, or will be handled by
3255 other means, if it is not fixed. */
3256 if (fixed_regs[PIC_OFFSET_TABLE_REGNUM])
3257 SET_REGNO_REG_SET (set, PIC_OFFSET_TABLE_REGNUM);
3258#endif
3259#endif
3260
e881bb1b 3261 /* Mark all global registers, and all registers used by the epilogue
dc2ede84
BS
3262 as being live at the end of the function since they may be
3263 referenced by our caller. */
3264 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
2a3e384f 3265 if (global_regs[i] || EPILOGUE_USES (i))
dc2ede84 3266 SET_REGNO_REG_SET (set, i);
e881bb1b 3267
d3a923ee
RH
3268 /* Mark all call-saved registers that we actaully used. */
3269 if (HAVE_epilogue && reload_completed)
3270 {
3271 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
2a3e384f 3272 if (regs_ever_live[i] && ! call_used_regs[i] && ! LOCAL_REGNO (i))
d3a923ee
RH
3273 SET_REGNO_REG_SET (set, i);
3274 }
3275
3276 /* Mark function return value. */
c13fde05 3277 diddle_return_value (mark_reg, set);
dc2ede84
BS
3278}
3279
4e872036
AS
3280/* Callback function for for_each_successor_phi. DATA is a regset.
3281 Sets the SRC_REGNO, the regno of the phi alternative for phi node
3282 INSN, in the regset. */
3283
3284static int
3285set_phi_alternative_reg (insn, dest_regno, src_regno, data)
3286 rtx insn ATTRIBUTE_UNUSED;
3287 int dest_regno ATTRIBUTE_UNUSED;
3288 int src_regno;
3289 void *data;
3290{
3291 regset live = (regset) data;
3292 SET_REGNO_REG_SET (live, src_regno);
3293 return 0;
3294}
3295
d3a923ee 3296/* Propagate global life info around the graph of basic blocks. Begin
c9bacfdb 3297 considering blocks with their corresponding bit set in BLOCKS_IN.
693d9e2f
RH
3298 If BLOCKS_IN is null, consider it the universal set.
3299
d3a923ee
RH
3300 BLOCKS_OUT is set for every block that was changed. */
3301
3302static void
3303calculate_global_regs_live (blocks_in, blocks_out, flags)
3304 sbitmap blocks_in, blocks_out;
3305 int flags;
3306{
3307 basic_block *queue, *qhead, *qtail, *qend;
3308 regset tmp, new_live_at_end;
ee25a7a5
MM
3309 regset_head tmp_head;
3310 regset_head new_live_at_end_head;
d3a923ee
RH
3311 int i;
3312
ee25a7a5
MM
3313 tmp = INITIALIZE_REG_SET (tmp_head);
3314 new_live_at_end = INITIALIZE_REG_SET (new_live_at_end_head);
d3a923ee
RH
3315
3316 /* Create a worklist. Allocate an extra slot for ENTRY_BLOCK, and one
c9bacfdb 3317 because the `head == tail' style test for an empty queue doesn't
d3a923ee 3318 work with a full queue. */
67289ea6 3319 queue = (basic_block *) xmalloc ((n_basic_blocks + 2) * sizeof (*queue));
d3a923ee
RH
3320 qtail = queue;
3321 qhead = qend = queue + n_basic_blocks + 2;
3322
3323 /* Queue the blocks set in the initial mask. Do this in reverse block
c9bacfdb 3324 number order so that we are more likely for the first round to do
d3a923ee 3325 useful work. We use AUX non-null to flag that the block is queued. */
693d9e2f 3326 if (blocks_in)
d3a923ee 3327 {
25e4379f
MM
3328 /* Clear out the garbage that might be hanging out in bb->aux. */
3329 for (i = n_basic_blocks - 1; i >= 0; --i)
3330 BASIC_BLOCK (i)->aux = NULL;
3331
693d9e2f
RH
3332 EXECUTE_IF_SET_IN_SBITMAP (blocks_in, 0, i,
3333 {
3334 basic_block bb = BASIC_BLOCK (i);
3335 *--qhead = bb;
3336 bb->aux = bb;
3337 });
3338 }
3339 else
3340 {
3341 for (i = 0; i < n_basic_blocks; ++i)
3342 {
3343 basic_block bb = BASIC_BLOCK (i);
3344 *--qhead = bb;
3345 bb->aux = bb;
3346 }
3347 }
d3a923ee 3348
693d9e2f
RH
3349 if (blocks_out)
3350 sbitmap_zero (blocks_out);
d3a923ee
RH
3351
3352 while (qhead != qtail)
3353 {
3354 int rescan, changed;
3355 basic_block bb;
3356 edge e;
3357
3358 bb = *qhead++;
3359 if (qhead == qend)
3360 qhead = queue;
3361 bb->aux = NULL;
3362
3363 /* Begin by propogating live_at_start from the successor blocks. */
3364 CLEAR_REG_SET (new_live_at_end);
c9bacfdb 3365 for (e = bb->succ; e; e = e->succ_next)
d3a923ee
RH
3366 {
3367 basic_block sb = e->dest;
3368 IOR_REG_SET (new_live_at_end, sb->global_live_at_start);
3369 }
3370
39c39be9
RH
3371 /* Before reload, there are a few registers that must be forced
3372 live everywhere -- which might not already be the case for
3373 blocks within infinite loops. */
770a7feb 3374 if (! reload_completed)
39c39be9
RH
3375 {
3376 /* The all-important stack pointer. */
3377 SET_REGNO_REG_SET (new_live_at_end, STACK_POINTER_REGNUM);
3378
3379 /* Any reference to any pseudo before reload is a potential
3380 reference of the frame pointer. */
3381 SET_REGNO_REG_SET (new_live_at_end, FRAME_POINTER_REGNUM);
3382
3383#if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
3384 /* Pseudos with argument area equivalences may require
3385 reloading via the argument pointer. */
3386 if (fixed_regs[ARG_POINTER_REGNUM])
3387 SET_REGNO_REG_SET (new_live_at_end, ARG_POINTER_REGNUM);
3388#endif
3389
3390#ifdef PIC_OFFSET_TABLE_REGNUM
3391 /* Any constant, or pseudo with constant equivalences, may
3392 require reloading from memory using the pic register. */
3393 if (fixed_regs[PIC_OFFSET_TABLE_REGNUM])
3394 SET_REGNO_REG_SET (new_live_at_end, PIC_OFFSET_TABLE_REGNUM);
3395#endif
3396 }
770a7feb 3397
4e872036
AS
3398 /* Regs used in phi nodes are not included in
3399 global_live_at_start, since they are live only along a
3400 particular edge. Set those regs that are live because of a
3401 phi node alternative corresponding to this particular block. */
1868a0d4 3402 if (in_ssa_form)
c9bacfdb 3403 for_each_successor_phi (bb, &set_phi_alternative_reg,
1868a0d4 3404 new_live_at_end);
4e872036 3405
d3a923ee
RH
3406 if (bb == ENTRY_BLOCK_PTR)
3407 {
3408 COPY_REG_SET (bb->global_live_at_end, new_live_at_end);
3409 continue;
3410 }
3411
c9bacfdb 3412 /* On our first pass through this block, we'll go ahead and continue.
d3a923ee
RH
3413 Recognize first pass by local_set NULL. On subsequent passes, we
3414 get to skip out early if live_at_end wouldn't have changed. */
3415
3416 if (bb->local_set == NULL)
3417 {
1f8f4a0b 3418 bb->local_set = OBSTACK_ALLOC_REG_SET (&flow_obstack);
7dfc0fbe 3419 bb->cond_local_set = OBSTACK_ALLOC_REG_SET (&flow_obstack);
d3a923ee
RH
3420 rescan = 1;
3421 }
3422 else
3423 {
3424 /* If any bits were removed from live_at_end, we'll have to
3425 rescan the block. This wouldn't be necessary if we had
3426 precalculated local_live, however with PROP_SCAN_DEAD_CODE
4eb00163 3427 local_live is really dependent on live_at_end. */
d3a923ee
RH
3428 CLEAR_REG_SET (tmp);
3429 rescan = bitmap_operation (tmp, bb->global_live_at_end,
3430 new_live_at_end, BITMAP_AND_COMPL);
3431
7dfc0fbe
BS
3432 if (! rescan)
3433 {
3434 /* If any of the registers in the new live_at_end set are
3435 conditionally set in this basic block, we must rescan.
3436 This is because conditional lifetimes at the end of the
3437 block do not just take the live_at_end set into account,
3438 but also the liveness at the start of each successor
3439 block. We can miss changes in those sets if we only
3440 compare the new live_at_end against the previous one. */
3441 CLEAR_REG_SET (tmp);
3442 rescan = bitmap_operation (tmp, new_live_at_end,
3443 bb->cond_local_set, BITMAP_AND);
3444 }
3445
d3a923ee
RH
3446 if (! rescan)
3447 {
3448 /* Find the set of changed bits. Take this opportunity
3449 to notice that this set is empty and early out. */
3450 CLEAR_REG_SET (tmp);
3451 changed = bitmap_operation (tmp, bb->global_live_at_end,
3452 new_live_at_end, BITMAP_XOR);
3453 if (! changed)
3454 continue;
3455
3456 /* If any of the changed bits overlap with local_set,
3457 we'll have to rescan the block. Detect overlap by
3458 the AND with ~local_set turning off bits. */
3459 rescan = bitmap_operation (tmp, tmp, bb->local_set,
3460 BITMAP_AND_COMPL);
3461 }
3462 }
3463
3464 /* Let our caller know that BB changed enough to require its
3465 death notes updated. */
693d9e2f
RH
3466 if (blocks_out)
3467 SET_BIT (blocks_out, bb->index);
d3a923ee
RH
3468
3469 if (! rescan)
3470 {
3471 /* Add to live_at_start the set of all registers in
3472 new_live_at_end that aren't in the old live_at_end. */
3473
3474 bitmap_operation (tmp, new_live_at_end, bb->global_live_at_end,
3475 BITMAP_AND_COMPL);
3476 COPY_REG_SET (bb->global_live_at_end, new_live_at_end);
3477
3478 changed = bitmap_operation (bb->global_live_at_start,
3479 bb->global_live_at_start,
3480 tmp, BITMAP_IOR);
3481 if (! changed)
3482 continue;
3483 }
3484 else
3485 {
3486 COPY_REG_SET (bb->global_live_at_end, new_live_at_end);
3487
3488 /* Rescan the block insn by insn to turn (a copy of) live_at_end
3489 into live_at_start. */
7dfc0fbe
BS
3490 propagate_block (bb, new_live_at_end, bb->local_set,
3491 bb->cond_local_set, flags);
d3a923ee
RH
3492
3493 /* If live_at start didn't change, no need to go farther. */
3494 if (REG_SET_EQUAL_P (bb->global_live_at_start, new_live_at_end))
3495 continue;
3496
3497 COPY_REG_SET (bb->global_live_at_start, new_live_at_end);
3498 }
3499
3500 /* Queue all predecessors of BB so that we may re-examine
3501 their live_at_end. */
c9bacfdb 3502 for (e = bb->pred; e; e = e->pred_next)
d3a923ee
RH
3503 {
3504 basic_block pb = e->src;
3505 if (pb->aux == NULL)
3506 {
3507 *qtail++ = pb;
3508 if (qtail == qend)
3509 qtail = queue;
3510 pb->aux = pb;
3511 }
3512 }
3513 }
3514
3515 FREE_REG_SET (tmp);
3516 FREE_REG_SET (new_live_at_end);
3517
693d9e2f 3518 if (blocks_out)
d3a923ee 3519 {
693d9e2f
RH
3520 EXECUTE_IF_SET_IN_SBITMAP (blocks_out, 0, i,
3521 {
3522 basic_block bb = BASIC_BLOCK (i);
3523 FREE_REG_SET (bb->local_set);
7dfc0fbe 3524 FREE_REG_SET (bb->cond_local_set);
693d9e2f
RH
3525 });
3526 }
3527 else
3528 {
3529 for (i = n_basic_blocks - 1; i >= 0; --i)
3530 {
3531 basic_block bb = BASIC_BLOCK (i);
3532 FREE_REG_SET (bb->local_set);
7dfc0fbe 3533 FREE_REG_SET (bb->cond_local_set);
693d9e2f
RH
3534 }
3535 }
67289ea6
MM
3536
3537 free (queue);
d7429b6a
RK
3538}
3539\f
3540/* Subroutines of life analysis. */
3541
3542/* Allocate the permanent data structures that represent the results
3543 of life analysis. Not static since used also for stupid life analysis. */
3544
1f8f4a0b 3545static void
359da67d 3546allocate_bb_life_data ()
d7429b6a
RK
3547{
3548 register int i;
d7429b6a 3549
e881bb1b
RH
3550 for (i = 0; i < n_basic_blocks; i++)
3551 {
3552 basic_block bb = BASIC_BLOCK (i);
3553
1f8f4a0b
MM
3554 bb->global_live_at_start = OBSTACK_ALLOC_REG_SET (&flow_obstack);
3555 bb->global_live_at_end = OBSTACK_ALLOC_REG_SET (&flow_obstack);
e881bb1b
RH
3556 }
3557
3558 ENTRY_BLOCK_PTR->global_live_at_end
1f8f4a0b 3559 = OBSTACK_ALLOC_REG_SET (&flow_obstack);
e881bb1b 3560 EXIT_BLOCK_PTR->global_live_at_start
1f8f4a0b 3561 = OBSTACK_ALLOC_REG_SET (&flow_obstack);
d7429b6a 3562
1f8f4a0b 3563 regs_live_at_setjmp = OBSTACK_ALLOC_REG_SET (&flow_obstack);
359da67d
RH
3564}
3565
3566void
3567allocate_reg_life_data ()
3568{
3569 int i;
3570
a9f531a6
RH
3571 max_regno = max_reg_num ();
3572
359da67d
RH
3573 /* Recalculate the register space, in case it has grown. Old style
3574 vector oriented regsets would set regset_{size,bytes} here also. */
3575 allocate_reg_info (max_regno, FALSE, FALSE);
3576
c9bacfdb 3577 /* Reset all the data we'll collect in propagate_block and its
49c3bb12 3578 subroutines. */
359da67d 3579 for (i = 0; i < max_regno; i++)
49c3bb12
RH
3580 {
3581 REG_N_SETS (i) = 0;
3582 REG_N_REFS (i) = 0;
3583 REG_N_DEATHS (i) = 0;
3584 REG_N_CALLS_CROSSED (i) = 0;
3585 REG_LIVE_LENGTH (i) = 0;
3586 REG_BASIC_BLOCK (i) = REG_BLOCK_UNKNOWN;
3587 }
d7429b6a
RK
3588}
3589
62828c00 3590/* Delete dead instructions for propagate_block. */
d7429b6a 3591
62828c00
RH
3592static void
3593propagate_block_delete_insn (bb, insn)
3594 basic_block bb;
3595 rtx insn;
3596{
3597 rtx inote = find_reg_note (insn, REG_LABEL, NULL_RTX);
d7429b6a 3598
62828c00
RH
3599 /* If the insn referred to a label, and that label was attached to
3600 an ADDR_VEC, it's safe to delete the ADDR_VEC. In fact, it's
3601 pretty much mandatory to delete it, because the ADDR_VEC may be
3602 referencing labels that no longer exist. */
d7429b6a 3603
62828c00
RH
3604 if (inote)
3605 {
3606 rtx label = XEXP (inote, 0);
3607 rtx next;
3608
3609 if (LABEL_NUSES (label) == 1
3610 && (next = next_nonnote_insn (label)) != NULL
3611 && GET_CODE (next) == JUMP_INSN
3612 && (GET_CODE (PATTERN (next)) == ADDR_VEC
3613 || GET_CODE (PATTERN (next)) == ADDR_DIFF_VEC))
3614 {
3615 rtx pat = PATTERN (next);
3616 int diff_vec_p = GET_CODE (pat) == ADDR_DIFF_VEC;
3617 int len = XVECLEN (pat, diff_vec_p);
3618 int i;
d7429b6a 3619
62828c00
RH
3620 for (i = 0; i < len; i++)
3621 LABEL_NUSES (XEXP (XVECEXP (pat, diff_vec_p, i), 0))--;
d7429b6a 3622
62828c00
RH
3623 flow_delete_insn (next);
3624 }
3625 }
3626
3627 if (bb->end == insn)
3628 bb->end = PREV_INSN (insn);
3629 flow_delete_insn (insn);
3630}
3631
3632/* Delete dead libcalls for propagate_block. Return the insn
3633 before the libcall. */
3634
3635static rtx
3636propagate_block_delete_libcall (bb, insn, note)
65f6fa24 3637 basic_block bb;
62828c00 3638 rtx insn, note;
d7429b6a 3639{
62828c00
RH
3640 rtx first = XEXP (note, 0);
3641 rtx before = PREV_INSN (first);
d7429b6a 3642
62828c00
RH
3643 if (insn == bb->end)
3644 bb->end = before;
c9bacfdb 3645
62828c00
RH
3646 flow_delete_insn_chain (first, insn);
3647 return before;
3648}
d7429b6a 3649
292f3869
RH
3650/* Update the life-status of regs for one insn. Return the previous insn. */
3651
3652rtx
3653propagate_one_insn (pbi, insn)
3654 struct propagate_block_info *pbi;
3655 rtx insn;
3656{
3657 rtx prev = PREV_INSN (insn);
3658 int flags = pbi->flags;
3659 int insn_is_dead = 0;
3660 int libcall_is_dead = 0;
3661 rtx note;
3662 int i;
3663
3664 if (! INSN_P (insn))
3665 return prev;
3666
3667 note = find_reg_note (insn, REG_RETVAL, NULL_RTX);
3668 if (flags & PROP_SCAN_DEAD_CODE)
3669 {
3670 insn_is_dead = insn_dead_p (pbi, PATTERN (insn), 0,
3671 REG_NOTES (insn));
3672 libcall_is_dead = (insn_is_dead && note != 0
01fbc97d 3673 && libcall_dead_p (pbi, note, insn));
292f3869
RH
3674 }
3675
3676 /* We almost certainly don't want to delete prologue or epilogue
3677 instructions. Warn about probable compiler losage. */
3678 if (insn_is_dead
3679 && reload_completed
3680 && (((HAVE_epilogue || HAVE_prologue)
3681 && prologue_epilogue_contains (insn))
3682 || (HAVE_sibcall_epilogue
8cd8f856
GK
3683 && sibcall_epilogue_contains (insn)))
3684 && find_reg_note (insn, REG_MAYBE_DEAD, NULL_RTX) == 0)
292f3869
RH
3685 {
3686 if (flags & PROP_KILL_DEAD_CODE)
c9bacfdb 3687 {
292f3869
RH
3688 warning ("ICE: would have deleted prologue/epilogue insn");
3689 if (!inhibit_warnings)
3690 debug_rtx (insn);
3691 }
3692 libcall_is_dead = insn_is_dead = 0;
3693 }
3694
3695 /* If an instruction consists of just dead store(s) on final pass,
3696 delete it. */
3697 if ((flags & PROP_KILL_DEAD_CODE) && insn_is_dead)
3698 {
5e9e738c
RH
3699 /* Record sets. Do this even for dead instructions, since they
3700 would have killed the values if they hadn't been deleted. */
3701 mark_set_regs (pbi, PATTERN (insn), insn);
3702
3703 /* CC0 is now known to be dead. Either this insn used it,
3704 in which case it doesn't anymore, or clobbered it,
3705 so the next insn can't use it. */
3706 pbi->cc0_live = 0;
3707
292f3869
RH
3708 if (libcall_is_dead)
3709 {
3710 prev = propagate_block_delete_libcall (pbi->bb, insn, note);
3711 insn = NEXT_INSN (prev);
3712 }
3713 else
3714 propagate_block_delete_insn (pbi->bb, insn);
3715
292f3869
RH
3716 return prev;
3717 }
3718
3719 /* See if this is an increment or decrement that can be merged into
3720 a following memory address. */
3721#ifdef AUTO_INC_DEC
3722 {
3723 register rtx x = single_set (insn);
3724
3725 /* Does this instruction increment or decrement a register? */
61f286b6 3726 if ((flags & PROP_AUTOINC)
292f3869
RH
3727 && x != 0
3728 && GET_CODE (SET_DEST (x)) == REG
3729 && (GET_CODE (SET_SRC (x)) == PLUS
3730 || GET_CODE (SET_SRC (x)) == MINUS)
3731 && XEXP (SET_SRC (x), 0) == SET_DEST (x)
3732 && GET_CODE (XEXP (SET_SRC (x), 1)) == CONST_INT
3733 /* Ok, look for a following memory ref we can combine with.
3734 If one is found, change the memory ref to a PRE_INC
3735 or PRE_DEC, cancel this insn, and return 1.
3736 Return 0 if nothing has been done. */
3737 && try_pre_increment_1 (pbi, insn))
3738 return prev;
3739 }
3740#endif /* AUTO_INC_DEC */
3741
9785c68d 3742 CLEAR_REG_SET (pbi->new_set);
292f3869
RH
3743
3744 /* If this is not the final pass, and this insn is copying the value of
3745 a library call and it's dead, don't scan the insns that perform the
3746 library call, so that the call's arguments are not marked live. */
3747 if (libcall_is_dead)
3748 {
3749 /* Record the death of the dest reg. */
3750 mark_set_regs (pbi, PATTERN (insn), insn);
3751
3752 insn = XEXP (note, 0);
3753 return PREV_INSN (insn);
3754 }
3755 else if (GET_CODE (PATTERN (insn)) == SET
3756 && SET_DEST (PATTERN (insn)) == stack_pointer_rtx
3757 && GET_CODE (SET_SRC (PATTERN (insn))) == PLUS
3758 && XEXP (SET_SRC (PATTERN (insn)), 0) == stack_pointer_rtx
3759 && GET_CODE (XEXP (SET_SRC (PATTERN (insn)), 1)) == CONST_INT)
3760 /* We have an insn to pop a constant amount off the stack.
3761 (Such insns use PLUS regardless of the direction of the stack,
3762 and any insn to adjust the stack by a constant is always a pop.)
3763 These insns, if not dead stores, have no effect on life. */
3764 ;
3765 else
3766 {
3767 /* Any regs live at the time of a call instruction must not go
3768 in a register clobbered by calls. Find all regs now live and
3769 record this for them. */
3770
3771 if (GET_CODE (insn) == CALL_INSN && (flags & PROP_REG_INFO))
3772 EXECUTE_IF_SET_IN_REG_SET (pbi->reg_live, 0, i,
3773 { REG_N_CALLS_CROSSED (i)++; });
3774
3775 /* Record sets. Do this even for dead instructions, since they
3776 would have killed the values if they hadn't been deleted. */
3777 mark_set_regs (pbi, PATTERN (insn), insn);
3778
3779 if (GET_CODE (insn) == CALL_INSN)
3780 {
3781 register int i;
3782 rtx note, cond;
3783
3784 cond = NULL_RTX;
3785 if (GET_CODE (PATTERN (insn)) == COND_EXEC)
3786 cond = COND_EXEC_TEST (PATTERN (insn));
3787
3788 /* Non-constant calls clobber memory. */
3789 if (! CONST_CALL_P (insn))
3790 free_EXPR_LIST_list (&pbi->mem_set_list);
3791
3792 /* There may be extra registers to be clobbered. */
3793 for (note = CALL_INSN_FUNCTION_USAGE (insn);
3794 note;
3795 note = XEXP (note, 1))
3796 if (GET_CODE (XEXP (note, 0)) == CLOBBER)
b4593d17
RH
3797 mark_set_1 (pbi, CLOBBER, XEXP (XEXP (note, 0), 0),
3798 cond, insn, pbi->flags);
292f3869
RH
3799
3800 /* Calls change all call-used and global registers. */
3801 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3802 if (call_used_regs[i] && ! global_regs[i]
3803 && ! fixed_regs[i])
3804 {
b4593d17
RH
3805 /* We do not want REG_UNUSED notes for these registers. */
3806 mark_set_1 (pbi, CLOBBER, gen_rtx_REG (reg_raw_mode[i], i),
8d6fe133
RH
3807 cond, insn,
3808 pbi->flags & ~(PROP_DEATH_NOTES | PROP_REG_INFO));
292f3869
RH
3809 }
3810 }
3811
3812 /* If an insn doesn't use CC0, it becomes dead since we assume
3813 that every insn clobbers it. So show it dead here;
3814 mark_used_regs will set it live if it is referenced. */
3815 pbi->cc0_live = 0;
3816
3817 /* Record uses. */
3818 if (! insn_is_dead)
3819 mark_used_regs (pbi, PATTERN (insn), NULL_RTX, insn);
3820
3821 /* Sometimes we may have inserted something before INSN (such as a move)
3822 when we make an auto-inc. So ensure we will scan those insns. */
3823#ifdef AUTO_INC_DEC
3824 prev = PREV_INSN (insn);
3825#endif
3826
3827 if (! insn_is_dead && GET_CODE (insn) == CALL_INSN)
3828 {
3829 register int i;
3830 rtx note, cond;
3831
3832 cond = NULL_RTX;
3833 if (GET_CODE (PATTERN (insn)) == COND_EXEC)
3834 cond = COND_EXEC_TEST (PATTERN (insn));
3835
3836 /* Calls use their arguments. */
3837 for (note = CALL_INSN_FUNCTION_USAGE (insn);
3838 note;
3839 note = XEXP (note, 1))
3840 if (GET_CODE (XEXP (note, 0)) == USE)
3841 mark_used_regs (pbi, XEXP (XEXP (note, 0), 0),
3842 cond, insn);
3843
3844 /* The stack ptr is used (honorarily) by a CALL insn. */
3845 SET_REGNO_REG_SET (pbi->reg_live, STACK_POINTER_REGNUM);
3846
3847 /* Calls may also reference any of the global registers,
3848 so they are made live. */
3849 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3850 if (global_regs[i])
3851 mark_used_reg (pbi, gen_rtx_REG (reg_raw_mode[i], i),
3852 cond, insn);
3853 }
3854 }
3855
292f3869
RH
3856 /* On final pass, update counts of how many insns in which each reg
3857 is live. */
3858 if (flags & PROP_REG_INFO)
3859 EXECUTE_IF_SET_IN_REG_SET (pbi->reg_live, 0, i,
3860 { REG_LIVE_LENGTH (i)++; });
3861
3862 return prev;
3863}
3864
3865/* Initialize a propagate_block_info struct for public consumption.
3866 Note that the structure itself is opaque to this file, but that
3867 the user can use the regsets provided here. */
3868
3869struct propagate_block_info *
7dfc0fbe 3870init_propagate_block_info (bb, live, local_set, cond_local_set, flags)
292f3869 3871 basic_block bb;
7dfc0fbe 3872 regset live, local_set, cond_local_set;
292f3869
RH
3873 int flags;
3874{
c9bacfdb 3875 struct propagate_block_info *pbi = xmalloc (sizeof (*pbi));
292f3869
RH
3876
3877 pbi->bb = bb;
3878 pbi->reg_live = live;
3879 pbi->mem_set_list = NULL_RTX;
3880 pbi->local_set = local_set;
7dfc0fbe 3881 pbi->cond_local_set = cond_local_set;
292f3869
RH
3882 pbi->cc0_live = 0;
3883 pbi->flags = flags;
3884
3885 if (flags & (PROP_LOG_LINKS | PROP_AUTOINC))
3886 pbi->reg_next_use = (rtx *) xcalloc (max_reg_num (), sizeof (rtx));
3887 else
3888 pbi->reg_next_use = NULL;
3889
9785c68d 3890 pbi->new_set = BITMAP_XMALLOC ();
292f3869 3891
11ae508b
RH
3892#ifdef HAVE_conditional_execution
3893 pbi->reg_cond_dead = splay_tree_new (splay_tree_compare_ints, NULL,
3894 free_reg_cond_life_info);
3895 pbi->reg_cond_reg = BITMAP_XMALLOC ();
3896
3897 /* If this block ends in a conditional branch, for each register live
3898 from one side of the branch and not the other, record the register
3899 as conditionally dead. */
eb7e5da2
RH
3900 if ((flags & (PROP_DEATH_NOTES | PROP_SCAN_DEAD_CODE))
3901 && GET_CODE (bb->end) == JUMP_INSN
7f1c097d 3902 && any_condjump_p (bb->end))
11ae508b
RH
3903 {
3904 regset_head diff_head;
3905 regset diff = INITIALIZE_REG_SET (diff_head);
3906 basic_block bb_true, bb_false;
3a8c5c77 3907 rtx cond_true, cond_false, set_src;
11ae508b
RH
3908 int i;
3909
3910 /* Identify the successor blocks. */
11ae508b 3911 bb_true = bb->succ->dest;
4fb9b830 3912 if (bb->succ->succ_next != NULL)
11ae508b 3913 {
c9bacfdb 3914 bb_false = bb->succ->succ_next->dest;
4fb9b830
RH
3915
3916 if (bb->succ->flags & EDGE_FALLTHRU)
3917 {
3918 basic_block t = bb_false;
3919 bb_false = bb_true;
3920 bb_true = t;
3921 }
3922 else if (! (bb->succ->succ_next->flags & EDGE_FALLTHRU))
3923 abort ();
3924 }
3925 else
3926 {
3927 /* This can happen with a conditional jump to the next insn. */
3928 if (JUMP_LABEL (bb->end) != bb_true->head)
3929 abort ();
3930
3931 /* Simplest way to do nothing. */
11ae508b 3932 bb_false = bb_true;
11ae508b 3933 }
c9bacfdb 3934
11ae508b 3935 /* Extract the condition from the branch. */
3a8c5c77
RH
3936 set_src = SET_SRC (pc_set (bb->end));
3937 cond_true = XEXP (set_src, 0);
11ae508b
RH
3938 cond_false = gen_rtx_fmt_ee (reverse_condition (GET_CODE (cond_true)),
3939 GET_MODE (cond_true), XEXP (cond_true, 0),
3940 XEXP (cond_true, 1));
3a8c5c77 3941 if (GET_CODE (XEXP (set_src, 1)) == PC)
11ae508b
RH
3942 {
3943 rtx t = cond_false;
3944 cond_false = cond_true;
3945 cond_true = t;
3946 }
3947
3948 /* Compute which register lead different lives in the successors. */
3949 if (bitmap_operation (diff, bb_true->global_live_at_start,
3950 bb_false->global_live_at_start, BITMAP_XOR))
3951 {
056b6841
RE
3952 rtx reg = XEXP (cond_true, 0);
3953
3954 if (GET_CODE (reg) == SUBREG)
3955 reg = SUBREG_REG (reg);
3956
3957 if (GET_CODE (reg) != REG)
11ae508b 3958 abort ();
056b6841
RE
3959
3960 SET_REGNO_REG_SET (pbi->reg_cond_reg, REGNO (reg));
11ae508b
RH
3961
3962 /* For each such register, mark it conditionally dead. */
3963 EXECUTE_IF_SET_IN_REG_SET
3964 (diff, 0, i,
3965 {
3966 struct reg_cond_life_info *rcli;
3967 rtx cond;
3968
3969 rcli = (struct reg_cond_life_info *) xmalloc (sizeof (*rcli));
3970
3971 if (REGNO_REG_SET_P (bb_true->global_live_at_start, i))
3972 cond = cond_false;
3973 else
3974 cond = cond_true;
3975 rcli->condition = alloc_EXPR_LIST (0, cond, NULL_RTX);
3976
ad3958e7 3977 splay_tree_insert (pbi->reg_cond_dead, i,
11ae508b
RH
3978 (splay_tree_value) rcli);
3979 });
3980 }
3981
3982 FREE_REG_SET (diff);
3983 }
3984#endif
3985
eb7e5da2
RH
3986 /* If this block has no successors, any stores to the frame that aren't
3987 used later in the block are dead. So make a pass over the block
3988 recording any such that are made and show them dead at the end. We do
3989 a very conservative and simple job here. */
b2262f4a 3990 if (optimize
6324d2bb
RK
3991 && ! (TREE_CODE (TREE_TYPE (current_function_decl)) == FUNCTION_TYPE
3992 && (TYPE_RETURNS_STACK_DEPRESSED
3993 (TREE_TYPE (current_function_decl))))
b2262f4a 3994 && (flags & PROP_SCAN_DEAD_CODE)
eb7e5da2 3995 && (bb->succ == NULL
c9bacfdb 3996 || (bb->succ->succ_next == NULL
eb7e5da2
RH
3997 && bb->succ->dest == EXIT_BLOCK_PTR)))
3998 {
3999 rtx insn;
4000 for (insn = bb->end; insn != bb->head; insn = PREV_INSN (insn))
4001 if (GET_CODE (insn) == INSN
4002 && GET_CODE (PATTERN (insn)) == SET
4003 && GET_CODE (SET_DEST (PATTERN (insn))) == MEM)
4004 {
4005 rtx mem = SET_DEST (PATTERN (insn));
c9bacfdb 4006
eb7e5da2
RH
4007 if (XEXP (mem, 0) == frame_pointer_rtx
4008 || (GET_CODE (XEXP (mem, 0)) == PLUS
4009 && XEXP (XEXP (mem, 0), 0) == frame_pointer_rtx
4010 && GET_CODE (XEXP (XEXP (mem, 0), 1)) == CONST_INT))
c32e1e6f
RH
4011 {
4012#ifdef AUTO_INC_DEC
4013 /* Store a copy of mem, otherwise the address may be scrogged
4014 by find_auto_inc. This matters because insn_dead_p uses
4015 an rtx_equal_p check to determine if two addresses are
4016 the same. This works before find_auto_inc, but fails
4017 after find_auto_inc, causing discrepencies between the
4018 set of live registers calculated during the
4019 calculate_global_regs_live phase and what actually exists
4020 after flow completes, leading to aborts. */
4021 if (flags & PROP_AUTOINC)
4022 mem = shallow_copy_rtx (mem);
4023#endif
4024 pbi->mem_set_list = alloc_EXPR_LIST (0, mem, pbi->mem_set_list);
4025 }
eb7e5da2
RH
4026 }
4027 }
4028
292f3869
RH
4029 return pbi;
4030}
4031
4032/* Release a propagate_block_info struct. */
4033
4034void
4035free_propagate_block_info (pbi)
4036 struct propagate_block_info *pbi;
4037{
4038 free_EXPR_LIST_list (&pbi->mem_set_list);
4039
9785c68d 4040 BITMAP_XFREE (pbi->new_set);
292f3869 4041
11ae508b
RH
4042#ifdef HAVE_conditional_execution
4043 splay_tree_delete (pbi->reg_cond_dead);
4044 BITMAP_XFREE (pbi->reg_cond_reg);
4045#endif
4046
292f3869
RH
4047 if (pbi->reg_next_use)
4048 free (pbi->reg_next_use);
4049
4050 free (pbi);
4051}
4052
62828c00
RH
4053/* Compute the registers live at the beginning of a basic block BB from
4054 those live at the end.
d7429b6a 4055
62828c00
RH
4056 When called, REG_LIVE contains those live at the end. On return, it
4057 contains those live at the beginning.
4058
7dfc0fbe
BS
4059 LOCAL_SET, if non-null, will be set with all registers killed
4060 unconditionally by this basic block.
4061 Likewise, COND_LOCAL_SET, if non-null, will be set with all registers
4062 killed conditionally by this basic block. If there is any unconditional
4063 set of a register, then the corresponding bit will be set in LOCAL_SET
4064 and cleared in COND_LOCAL_SET.
4065 It is valid for LOCAL_SET and COND_LOCAL_SET to be the same set. In this
4066 case, the resulting set will be equal to the union of the two sets that
4067 would otherwise be computed. */
62828c00 4068
292f3869 4069void
7dfc0fbe 4070propagate_block (bb, live, local_set, cond_local_set, flags)
62828c00
RH
4071 basic_block bb;
4072 regset live;
4073 regset local_set;
7dfc0fbe 4074 regset cond_local_set;
62828c00
RH
4075 int flags;
4076{
292f3869 4077 struct propagate_block_info *pbi;
62828c00 4078 rtx insn, prev;
c9bacfdb 4079
7dfc0fbe 4080 pbi = init_propagate_block_info (bb, live, local_set, cond_local_set, flags);
d7429b6a 4081
d3a923ee 4082 if (flags & PROP_REG_INFO)
d7429b6a 4083 {
916b1701 4084 register int i;
d7429b6a 4085
d7429b6a 4086 /* Process the regs live at the end of the block.
c9bacfdb 4087 Mark them as not local to any one basic block. */
62828c00 4088 EXECUTE_IF_SET_IN_REG_SET (live, 0, i,
292f3869 4089 { REG_BASIC_BLOCK (i) = REG_BLOCK_GLOBAL; });
d7429b6a
RK
4090 }
4091
4092 /* Scan the block an insn at a time from end to beginning. */
4093
c9bacfdb 4094 for (insn = bb->end;; insn = prev)
d7429b6a 4095 {
292f3869
RH
4096 /* If this is a call to `setjmp' et al, warn if any
4097 non-volatile datum is live. */
4098 if ((flags & PROP_REG_INFO)
4099 && GET_CODE (insn) == NOTE
4100 && NOTE_LINE_NUMBER (insn) == NOTE_INSN_SETJMP)
4101 IOR_REG_SET (regs_live_at_setjmp, pbi->reg_live);
11f246f6 4102
292f3869 4103 prev = propagate_one_insn (pbi, insn);
d7429b6a 4104
65f6fa24 4105 if (insn == bb->head)
d7429b6a
RK
4106 break;
4107 }
4108
292f3869 4109 free_propagate_block_info (pbi);
d7429b6a
RK
4110}
4111\f
4112/* Return 1 if X (the body of an insn, or part of it) is just dead stores
4113 (SET expressions whose destinations are registers dead after the insn).
4114 NEEDED is the regset that says which regs are alive after the insn.
4115
e398aa80
R
4116 Unless CALL_OK is non-zero, an insn is needed if it contains a CALL.
4117
4118 If X is the entire body of an insn, NOTES contains the reg notes
4119 pertaining to the insn. */
d7429b6a
RK
4120
4121static int
62828c00
RH
4122insn_dead_p (pbi, x, call_ok, notes)
4123 struct propagate_block_info *pbi;
d7429b6a 4124 rtx x;
d7429b6a 4125 int call_ok;
e398aa80 4126 rtx notes ATTRIBUTE_UNUSED;
d7429b6a 4127{
e5e809f4
JL
4128 enum rtx_code code = GET_CODE (x);
4129
e398aa80
R
4130#ifdef AUTO_INC_DEC
4131 /* If flow is invoked after reload, we must take existing AUTO_INC
4132 expresions into account. */
4133 if (reload_completed)
4134 {
c9bacfdb 4135 for (; notes; notes = XEXP (notes, 1))
e398aa80
R
4136 {
4137 if (REG_NOTE_KIND (notes) == REG_INC)
4138 {
4139 int regno = REGNO (XEXP (notes, 0));
4140
4141 /* Don't delete insns to set global regs. */
4142 if ((regno < FIRST_PSEUDO_REGISTER && global_regs[regno])
62828c00 4143 || REGNO_REG_SET_P (pbi->reg_live, regno))
e398aa80
R
4144 return 0;
4145 }
4146 }
4147 }
4148#endif
4149
d7429b6a
RK
4150 /* If setting something that's a reg or part of one,
4151 see if that register's altered value will be live. */
4152
4153 if (code == SET)
4154 {
e5e809f4
JL
4155 rtx r = SET_DEST (x);
4156
d7429b6a
RK
4157#ifdef HAVE_cc0
4158 if (GET_CODE (r) == CC0)
62828c00 4159 return ! pbi->cc0_live;
d7429b6a 4160#endif
c9bacfdb 4161
3ea8083f
JL
4162 /* A SET that is a subroutine call cannot be dead. */
4163 if (GET_CODE (SET_SRC (x)) == CALL)
4164 {
4165 if (! call_ok)
4166 return 0;
4167 }
4168
4169 /* Don't eliminate loads from volatile memory or volatile asms. */
4170 else if (volatile_refs_p (SET_SRC (x)))
4171 return 0;
4172
4173 if (GET_CODE (r) == MEM)
db3a887b
CB
4174 {
4175 rtx temp;
3ea8083f
JL
4176
4177 if (MEM_VOLATILE_P (r))
4178 return 0;
4179
db3a887b
CB
4180 /* Walk the set of memory locations we are currently tracking
4181 and see if one is an identical match to this memory location.
4182 If so, this memory write is dead (remember, we're walking
51891abe 4183 backwards from the end of the block to the start). */
62828c00 4184 temp = pbi->mem_set_list;
db3a887b
CB
4185 while (temp)
4186 {
4f4b88d0
HB
4187 rtx mem = XEXP (temp, 0);
4188
4189 if (rtx_equal_p (mem, r))
4190 return 1;
4191#ifdef AUTO_INC_DEC
4192 /* Check if memory reference matches an auto increment. Only
4193 post increment/decrement or modify are valid. */
4194 if (GET_MODE (mem) == GET_MODE (r)
4195 && (GET_CODE (XEXP (mem, 0)) == POST_DEC
4196 || GET_CODE (XEXP (mem, 0)) == POST_INC
4197 || GET_CODE (XEXP (mem, 0)) == POST_MODIFY)
4198 && GET_MODE (XEXP (mem, 0)) == GET_MODE (r)
4199 && rtx_equal_p (XEXP (XEXP (mem, 0), 0), XEXP (r, 0)))
db3a887b 4200 return 1;
4f4b88d0 4201#endif
db3a887b
CB
4202 temp = XEXP (temp, 1);
4203 }
4204 }
3ea8083f
JL
4205 else
4206 {
4207 while (GET_CODE (r) == SUBREG
4208 || GET_CODE (r) == STRICT_LOW_PART
4209 || GET_CODE (r) == ZERO_EXTRACT)
4210 r = XEXP (r, 0);
d7429b6a 4211
3ea8083f
JL
4212 if (GET_CODE (r) == REG)
4213 {
4214 int regno = REGNO (r);
d7429b6a 4215
3ea8083f 4216 /* Obvious. */
62828c00 4217 if (REGNO_REG_SET_P (pbi->reg_live, regno))
3ea8083f
JL
4218 return 0;
4219
4220 /* If this is a hard register, verify that subsequent
4221 words are not needed. */
4222 if (regno < FIRST_PSEUDO_REGISTER)
4223 {
4224 int n = HARD_REGNO_NREGS (regno, GET_MODE (r));
4225
4226 while (--n > 0)
62828c00 4227 if (REGNO_REG_SET_P (pbi->reg_live, regno+n))
3ea8083f
JL
4228 return 0;
4229 }
4230
4231 /* Don't delete insns to set global regs. */
4232 if (regno < FIRST_PSEUDO_REGISTER && global_regs[regno])
4233 return 0;
4234
4235 /* Make sure insns to set the stack pointer aren't deleted. */
4236 if (regno == STACK_POINTER_REGNUM)
4237 return 0;
d7429b6a 4238
39c39be9
RH
4239 /* ??? These bits might be redundant with the force live bits
4240 in calculate_global_regs_live. We would delete from
4241 sequential sets; whether this actually affects real code
4242 for anything but the stack pointer I don't know. */
3ea8083f
JL
4243 /* Make sure insns to set the frame pointer aren't deleted. */
4244 if (regno == FRAME_POINTER_REGNUM
e4b8a413 4245 && (! reload_completed || frame_pointer_needed))
3ea8083f 4246 return 0;
73a187c1 4247#if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
3ea8083f 4248 if (regno == HARD_FRAME_POINTER_REGNUM
e4b8a413 4249 && (! reload_completed || frame_pointer_needed))
3ea8083f 4250 return 0;
73a187c1 4251#endif
3ea8083f 4252
d7e4fe8b
RS
4253#if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
4254 /* Make sure insns to set arg pointer are never deleted
3ea8083f
JL
4255 (if the arg pointer isn't fixed, there will be a USE
4256 for it, so we can treat it normally). */
4257 if (regno == ARG_POINTER_REGNUM && fixed_regs[regno])
4258 return 0;
d7e4fe8b 4259#endif
d7429b6a 4260
3ea8083f
JL
4261 /* Otherwise, the set is dead. */
4262 return 1;
d7429b6a 4263 }
d7429b6a
RK
4264 }
4265 }
e5e809f4 4266
3ea8083f
JL
4267 /* If performing several activities, insn is dead if each activity
4268 is individually dead. Also, CLOBBERs and USEs can be ignored; a
4269 CLOBBER or USE that's inside a PARALLEL doesn't make the insn
4270 worth keeping. */
d7429b6a
RK
4271 else if (code == PARALLEL)
4272 {
e5e809f4
JL
4273 int i = XVECLEN (x, 0);
4274
d7429b6a 4275 for (i--; i >= 0; i--)
e5e809f4
JL
4276 if (GET_CODE (XVECEXP (x, 0, i)) != CLOBBER
4277 && GET_CODE (XVECEXP (x, 0, i)) != USE
62828c00 4278 && ! insn_dead_p (pbi, XVECEXP (x, 0, i), call_ok, NULL_RTX))
e5e809f4
JL
4279 return 0;
4280
d7429b6a
RK
4281 return 1;
4282 }
e5e809f4
JL
4283
4284 /* A CLOBBER of a pseudo-register that is dead serves no purpose. That
4285 is not necessarily true for hard registers. */
4286 else if (code == CLOBBER && GET_CODE (XEXP (x, 0)) == REG
4287 && REGNO (XEXP (x, 0)) >= FIRST_PSEUDO_REGISTER
62828c00 4288 && ! REGNO_REG_SET_P (pbi->reg_live, REGNO (XEXP (x, 0))))
e5e809f4
JL
4289 return 1;
4290
4291 /* We do not check other CLOBBER or USE here. An insn consisting of just
4292 a CLOBBER or just a USE should not be deleted. */
d7429b6a
RK
4293 return 0;
4294}
4295
01fbc97d 4296/* If INSN is the last insn in a libcall, and assuming INSN is dead,
d7429b6a 4297 return 1 if the entire library call is dead.
01fbc97d
SC
4298 This is true if INSN copies a register (hard or pseudo)
4299 and if the hard return reg of the call insn is dead.
4300 (The caller should have tested the destination of the SET inside
4301 INSN already for death.)
d7429b6a
RK
4302
4303 If this insn doesn't just copy a register, then we don't
4304 have an ordinary libcall. In that case, cse could not have
4305 managed to substitute the source for the dest later on,
4306 so we can assume the libcall is dead.
4307
01fbc97d
SC
4308 PBI is the block info giving pseudoregs live before this insn.
4309 NOTE is the REG_RETVAL note of the insn. */
d7429b6a
RK
4310
4311static int
01fbc97d 4312libcall_dead_p (pbi, note, insn)
62828c00 4313 struct propagate_block_info *pbi;
d7429b6a
RK
4314 rtx note;
4315 rtx insn;
4316{
01fbc97d 4317 rtx x = single_set (insn);
d7429b6a 4318
01fbc97d 4319 if (x)
d7429b6a
RK
4320 {
4321 register rtx r = SET_SRC (x);
4322 if (GET_CODE (r) == REG)
4323 {
4324 rtx call = XEXP (note, 0);
e398aa80 4325 rtx call_pat;
d7429b6a
RK
4326 register int i;
4327
4328 /* Find the call insn. */
4329 while (call != insn && GET_CODE (call) != CALL_INSN)
4330 call = NEXT_INSN (call);
4331
4332 /* If there is none, do nothing special,
4333 since ordinary death handling can understand these insns. */
4334 if (call == insn)
4335 return 0;
4336
4337 /* See if the hard reg holding the value is dead.
4338 If this is a PARALLEL, find the call within it. */
e398aa80
R
4339 call_pat = PATTERN (call);
4340 if (GET_CODE (call_pat) == PARALLEL)
d7429b6a 4341 {
e398aa80
R
4342 for (i = XVECLEN (call_pat, 0) - 1; i >= 0; i--)
4343 if (GET_CODE (XVECEXP (call_pat, 0, i)) == SET
4344 && GET_CODE (SET_SRC (XVECEXP (call_pat, 0, i))) == CALL)
d7429b6a
RK
4345 break;
4346
761a5bcd
JW
4347 /* This may be a library call that is returning a value
4348 via invisible pointer. Do nothing special, since
4349 ordinary death handling can understand these insns. */
d7429b6a 4350 if (i < 0)
761a5bcd 4351 return 0;
d7429b6a 4352
e398aa80 4353 call_pat = XVECEXP (call_pat, 0, i);
d7429b6a
RK
4354 }
4355
62828c00 4356 return insn_dead_p (pbi, call_pat, 1, REG_NOTES (call));
d7429b6a
RK
4357 }
4358 }
4359 return 1;
4360}
4361
bd80fbde
RH
4362/* Return 1 if register REGNO was used before it was set, i.e. if it is
4363 live at function entry. Don't count global register variables, variables
4364 in registers that can be used for function arg passing, or variables in
4365 fixed hard registers. */
d7429b6a
RK
4366
4367int
4368regno_uninitialized (regno)
4369 int regno;
4370{
b0b7b46a 4371 if (n_basic_blocks == 0
6a45254e 4372 || (regno < FIRST_PSEUDO_REGISTER
bd80fbde
RH
4373 && (global_regs[regno]
4374 || fixed_regs[regno]
4375 || FUNCTION_ARG_REGNO_P (regno))))
d7429b6a
RK
4376 return 0;
4377
e881bb1b 4378 return REGNO_REG_SET_P (BASIC_BLOCK (0)->global_live_at_start, regno);
d7429b6a
RK
4379}
4380
4381/* 1 if register REGNO was alive at a place where `setjmp' was called
4382 and was set more than once or is an argument.
4383 Such regs may be clobbered by `longjmp'. */
4384
4385int
4386regno_clobbered_at_setjmp (regno)
4387 int regno;
4388{
4389 if (n_basic_blocks == 0)
4390 return 0;
4391
b1f21e0a 4392 return ((REG_N_SETS (regno) > 1
e881bb1b 4393 || REGNO_REG_SET_P (BASIC_BLOCK (0)->global_live_at_start, regno))
916b1701 4394 && REGNO_REG_SET_P (regs_live_at_setjmp, regno));
d7429b6a
RK
4395}
4396\f
15e088b2
JL
4397/* INSN references memory, possibly using autoincrement addressing modes.
4398 Find any entries on the mem_set_list that need to be invalidated due
4399 to an address change. */
a4c44acf 4400
15e088b2 4401static void
62828c00
RH
4402invalidate_mems_from_autoinc (pbi, insn)
4403 struct propagate_block_info *pbi;
15e088b2
JL
4404 rtx insn;
4405{
4406 rtx note = REG_NOTES (insn);
4407 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
4408 {
4409 if (REG_NOTE_KIND (note) == REG_INC)
c9bacfdb
KH
4410 {
4411 rtx temp = pbi->mem_set_list;
4412 rtx prev = NULL_RTX;
ff666313 4413 rtx next;
15e088b2 4414
c9bacfdb 4415 while (temp)
15e088b2 4416 {
ff666313 4417 next = XEXP (temp, 1);
15e088b2 4418 if (reg_overlap_mentioned_p (XEXP (note, 0), XEXP (temp, 0)))
c9bacfdb
KH
4419 {
4420 /* Splice temp out of list. */
4421 if (prev)
4422 XEXP (prev, 1) = next;
4423 else
4424 pbi->mem_set_list = next;
ff666313 4425 free_EXPR_LIST_node (temp);
c9bacfdb 4426 }
15e088b2 4427 else
c9bacfdb
KH
4428 prev = temp;
4429 temp = next;
15e088b2
JL
4430 }
4431 }
4432 }
4433}
4434
1288c070
RH
4435/* EXP is either a MEM or a REG. Remove any dependant entries
4436 from pbi->mem_set_list. */
4437
4438static void
4439invalidate_mems_from_set (pbi, exp)
4440 struct propagate_block_info *pbi;
4441 rtx exp;
4442{
4443 rtx temp = pbi->mem_set_list;
4444 rtx prev = NULL_RTX;
4445 rtx next;
4446
4447 while (temp)
4448 {
4449 next = XEXP (temp, 1);
4450 if ((GET_CODE (exp) == MEM
4451 && output_dependence (XEXP (temp, 0), exp))
4452 || (GET_CODE (exp) == REG
4453 && reg_overlap_mentioned_p (exp, XEXP (temp, 0))))
4454 {
4455 /* Splice this entry out of the list. */
4456 if (prev)
4457 XEXP (prev, 1) = next;
4458 else
4459 pbi->mem_set_list = next;
4460 free_EXPR_LIST_node (temp);
4461 }
4462 else
4463 prev = temp;
4464 temp = next;
4465 }
4466}
4467
d3a923ee
RH
4468/* Process the registers that are set within X. Their bits are set to
4469 1 in the regset DEAD, because they are dead prior to this insn.
d7429b6a 4470
d3a923ee
RH
4471 If INSN is nonzero, it is the insn being processed.
4472
4473 FLAGS is the set of operations to perform. */
d7429b6a 4474
d7429b6a 4475static void
8e3f9094 4476mark_set_regs (pbi, x, insn)
62828c00 4477 struct propagate_block_info *pbi;
62828c00 4478 rtx x, insn;
d7429b6a 4479{
62828c00 4480 rtx cond = NULL_RTX;
8ba7b396 4481 rtx link;
b4593d17 4482 enum rtx_code code;
d7429b6a 4483
8ba7b396
R
4484 if (insn)
4485 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
4486 {
4487 if (REG_NOTE_KIND (link) == REG_INC)
4488 mark_set_1 (pbi, SET, XEXP (link, 0),
4489 (GET_CODE (x) == COND_EXEC
4490 ? COND_EXEC_TEST (x) : NULL_RTX),
4491 insn, pbi->flags);
4492 }
62828c00 4493 retry:
b4593d17 4494 switch (code = GET_CODE (x))
d7429b6a 4495 {
62828c00
RH
4496 case SET:
4497 case CLOBBER:
b4593d17 4498 mark_set_1 (pbi, code, SET_DEST (x), cond, insn, pbi->flags);
62828c00
RH
4499 return;
4500
4501 case COND_EXEC:
4502 cond = COND_EXEC_TEST (x);
4503 x = COND_EXEC_CODE (x);
4504 goto retry;
4505
4506 case PARALLEL:
4507 {
4508 register int i;
4509 for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
4510 {
4511 rtx sub = XVECEXP (x, 0, i);
b4593d17 4512 switch (code = GET_CODE (sub))
62828c00
RH
4513 {
4514 case COND_EXEC:
4515 if (cond != NULL_RTX)
4516 abort ();
4517
4518 cond = COND_EXEC_TEST (sub);
4519 sub = COND_EXEC_CODE (sub);
4520 if (GET_CODE (sub) != SET && GET_CODE (sub) != CLOBBER)
4521 break;
c9bacfdb 4522 /* Fall through. */
62828c00
RH
4523
4524 case SET:
4525 case CLOBBER:
b4593d17 4526 mark_set_1 (pbi, code, SET_DEST (sub), cond, insn, pbi->flags);
62828c00
RH
4527 break;
4528
4529 default:
4530 break;
4531 }
4532 }
4533 break;
4534 }
4535
4536 default:
4537 break;
d7429b6a
RK
4538 }
4539}
4540
4541/* Process a single SET rtx, X. */
4542
4543static void
b4593d17 4544mark_set_1 (pbi, code, reg, cond, insn, flags)
62828c00 4545 struct propagate_block_info *pbi;
b4593d17 4546 enum rtx_code code;
62828c00 4547 rtx reg, cond, insn;
b4593d17 4548 int flags;
d7429b6a 4549{
b4593d17 4550 int regno_first = -1, regno_last = -1;
9785c68d 4551 int not_dead = 0;
b4593d17 4552 int i;
d7429b6a 4553
86465af7
DM
4554 /* Some targets place small structures in registers for
4555 return values of functions. We have to detect this
4556 case specially here to get correct flow information. */
4557 if (GET_CODE (reg) == PARALLEL
4558 && GET_MODE (reg) == BLKmode)
4559 {
86465af7 4560 for (i = XVECLEN (reg, 0) - 1; i >= 0; i--)
b4593d17 4561 mark_set_1 (pbi, code, XVECEXP (reg, 0, i), cond, insn, flags);
86465af7
DM
4562 return;
4563 }
4564
8e3f9094
RH
4565 /* Modifying just one hardware register of a multi-reg value or just a
4566 byte field of a register does not mean the value from before this insn
9785c68d 4567 is now dead. Of course, if it was dead after it's unused now. */
8e3f9094 4568
9785c68d
RH
4569 switch (GET_CODE (reg))
4570 {
4571 case ZERO_EXTRACT:
4572 case SIGN_EXTRACT:
4573 case STRICT_LOW_PART:
4574 /* ??? Assumes STRICT_LOW_PART not used on multi-word registers. */
4575 do
4576 reg = XEXP (reg, 0);
4577 while (GET_CODE (reg) == SUBREG
4578 || GET_CODE (reg) == ZERO_EXTRACT
4579 || GET_CODE (reg) == SIGN_EXTRACT
4580 || GET_CODE (reg) == STRICT_LOW_PART);
1b513b77
JH
4581 if (GET_CODE (reg) == MEM)
4582 break;
9785c68d 4583 not_dead = REGNO_REG_SET_P (pbi->reg_live, REGNO (reg));
c9bacfdb 4584 /* Fall through. */
9785c68d
RH
4585
4586 case REG:
4587 regno_last = regno_first = REGNO (reg);
4588 if (regno_first < FIRST_PSEUDO_REGISTER)
4589 regno_last += HARD_REGNO_NREGS (regno_first, GET_MODE (reg)) - 1;
4590 break;
d7429b6a 4591
9785c68d
RH
4592 case SUBREG:
4593 if (GET_CODE (SUBREG_REG (reg)) == REG)
4594 {
4595 enum machine_mode outer_mode = GET_MODE (reg);
4596 enum machine_mode inner_mode = GET_MODE (SUBREG_REG (reg));
d7429b6a 4597
9785c68d
RH
4598 /* Identify the range of registers affected. This is moderately
4599 tricky for hard registers. See alter_subreg. */
4600
4601 regno_last = regno_first = REGNO (SUBREG_REG (reg));
4602 if (regno_first < FIRST_PSEUDO_REGISTER)
4603 {
4604#ifdef ALTER_HARD_SUBREG
4605 regno_first = ALTER_HARD_SUBREG (outer_mode, SUBREG_WORD (reg),
4606 inner_mode, regno_first);
4607#else
4608 regno_first += SUBREG_WORD (reg);
4609#endif
4610 regno_last = (regno_first
4611 + HARD_REGNO_NREGS (regno_first, outer_mode) - 1);
4612
4613 /* Since we've just adjusted the register number ranges, make
4614 sure REG matches. Otherwise some_was_live will be clear
4615 when it shouldn't have been, and we'll create incorrect
4616 REG_UNUSED notes. */
4617 reg = gen_rtx_REG (outer_mode, regno_first);
4618 }
4619 else
4620 {
4621 /* If the number of words in the subreg is less than the number
4622 of words in the full register, we have a well-defined partial
4623 set. Otherwise the high bits are undefined.
4624
4625 This is only really applicable to pseudos, since we just took
4626 care of multi-word hard registers. */
4627 if (((GET_MODE_SIZE (outer_mode)
4628 + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
4629 < ((GET_MODE_SIZE (inner_mode)
4630 + UNITS_PER_WORD - 1) / UNITS_PER_WORD))
4631 not_dead = REGNO_REG_SET_P (pbi->reg_live, regno_first);
4632
4633 reg = SUBREG_REG (reg);
4634 }
4635 }
4636 else
4637 reg = SUBREG_REG (reg);
4638 break;
4639
4640 default:
4641 break;
4642 }
d7429b6a 4643
c9bacfdb 4644 /* If this set is a MEM, then it kills any aliased writes.
db3a887b 4645 If this set is a REG, then it kills any MEMs which use the reg. */
b2262f4a 4646 if (optimize && (flags & PROP_SCAN_DEAD_CODE))
db3a887b 4647 {
62828c00 4648 if (GET_CODE (reg) == MEM || GET_CODE (reg) == REG)
1288c070 4649 invalidate_mems_from_set (pbi, reg);
15e088b2 4650
d3a923ee
RH
4651 /* If the memory reference had embedded side effects (autoincrement
4652 address modes. Then we may need to kill some entries on the
4653 memory set list. */
4654 if (insn && GET_CODE (reg) == MEM)
62828c00 4655 invalidate_mems_from_autoinc (pbi, insn);
d3a923ee
RH
4656
4657 if (GET_CODE (reg) == MEM && ! side_effects_p (reg)
a0ee3b83
RH
4658 /* ??? With more effort we could track conditional memory life. */
4659 && ! cond
d3a923ee
RH
4660 /* We do not know the size of a BLKmode store, so we do not track
4661 them for redundant store elimination. */
4662 && GET_MODE (reg) != BLKmode
c9bacfdb 4663 /* There are no REG_INC notes for SP, so we can't assume we'll see
d3a923ee
RH
4664 everything that invalidates it. To be safe, don't eliminate any
4665 stores though SP; none of them should be redundant anyway. */
4666 && ! reg_mentioned_p (stack_pointer_rtx, reg))
c32e1e6f
RH
4667 {
4668#ifdef AUTO_INC_DEC
4669 /* Store a copy of mem, otherwise the address may be
4670 scrogged by find_auto_inc. */
4671 if (flags & PROP_AUTOINC)
4672 reg = shallow_copy_rtx (reg);
4673#endif
4674 pbi->mem_set_list = alloc_EXPR_LIST (0, reg, pbi->mem_set_list);
4675 }
d3a923ee 4676 }
d7429b6a
RK
4677
4678 if (GET_CODE (reg) == REG
9785c68d
RH
4679 && ! (regno_first == FRAME_POINTER_REGNUM
4680 && (! reload_completed || frame_pointer_needed))
73a187c1 4681#if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
b4593d17 4682 && ! (regno_first == HARD_FRAME_POINTER_REGNUM
e4b8a413 4683 && (! reload_completed || frame_pointer_needed))
73a187c1 4684#endif
d7e4fe8b 4685#if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
b4593d17 4686 && ! (regno_first == ARG_POINTER_REGNUM && fixed_regs[regno_first])
d7e4fe8b 4687#endif
62828c00 4688 )
d7429b6a 4689 {
b4593d17 4690 int some_was_live = 0, some_was_dead = 0;
d7429b6a 4691
b4593d17
RH
4692 for (i = regno_first; i <= regno_last; ++i)
4693 {
4694 int needed_regno = REGNO_REG_SET_P (pbi->reg_live, i);
4695 if (pbi->local_set)
7dfc0fbe
BS
4696 {
4697 /* Order of the set operation matters here since both
4698 sets may be the same. */
4699 CLEAR_REGNO_REG_SET (pbi->cond_local_set, i);
4700 if (cond != NULL_RTX
4701 && ! REGNO_REG_SET_P (pbi->local_set, i))
4702 SET_REGNO_REG_SET (pbi->cond_local_set, i);
4703 else
4704 SET_REGNO_REG_SET (pbi->local_set, i);
4705 }
9785c68d
RH
4706 if (code != CLOBBER)
4707 SET_REGNO_REG_SET (pbi->new_set, i);
b4593d17
RH
4708
4709 some_was_live |= needed_regno;
4710 some_was_dead |= ! needed_regno;
4711 }
d3a923ee 4712
11ae508b
RH
4713#ifdef HAVE_conditional_execution
4714 /* Consider conditional death in deciding that the register needs
4715 a death note. */
f0acaf02 4716 if (some_was_live && ! not_dead
11ae508b
RH
4717 /* The stack pointer is never dead. Well, not strictly true,
4718 but it's very difficult to tell from here. Hopefully
4719 combine_stack_adjustments will fix up the most egregious
4720 errors. */
4721 && regno_first != STACK_POINTER_REGNUM)
4722 {
4723 for (i = regno_first; i <= regno_last; ++i)
4724 if (! mark_regno_cond_dead (pbi, i, cond))
4725 not_dead = 1;
4726 }
4727#endif
4728
d7429b6a 4729 /* Additional data to record if this is the final pass. */
d3a923ee
RH
4730 if (flags & (PROP_LOG_LINKS | PROP_REG_INFO
4731 | PROP_DEATH_NOTES | PROP_AUTOINC))
d7429b6a 4732 {
d3a923ee 4733 register rtx y;
62828c00 4734 register int blocknum = pbi->bb->index;
d7429b6a 4735
d3a923ee
RH
4736 y = NULL_RTX;
4737 if (flags & (PROP_LOG_LINKS | PROP_AUTOINC))
d7429b6a 4738 {
b4593d17 4739 y = pbi->reg_next_use[regno_first];
93514916 4740
b4593d17
RH
4741 /* The next use is no longer next, since a store intervenes. */
4742 for (i = regno_first; i <= regno_last; ++i)
4743 pbi->reg_next_use[i] = 0;
d7429b6a 4744 }
93514916 4745
b4593d17
RH
4746 if (flags & PROP_REG_INFO)
4747 {
4748 for (i = regno_first; i <= regno_last; ++i)
d3a923ee 4749 {
b4593d17 4750 /* Count (weighted) references, stores, etc. This counts a
d3a923ee 4751 register twice if it is modified, but that is correct. */
b4593d17
RH
4752 REG_N_SETS (i) += 1;
4753 REG_N_REFS (i) += (optimize_size ? 1
4754 : pbi->bb->loop_depth + 1);
4755
d3a923ee
RH
4756 /* The insns where a reg is live are normally counted
4757 elsewhere, but we want the count to include the insn
4758 where the reg is set, and the normal counting mechanism
4759 would not count it. */
c9bacfdb 4760 REG_LIVE_LENGTH (i) += 1;
b4593d17
RH
4761 }
4762
4763 /* If this is a hard reg, record this function uses the reg. */
4764 if (regno_first < FIRST_PSEUDO_REGISTER)
4765 {
4766 for (i = regno_first; i <= regno_last; i++)
4767 regs_ever_live[i] = 1;
4768 }
4769 else
4770 {
4771 /* Keep track of which basic blocks each reg appears in. */
4772 if (REG_BASIC_BLOCK (regno_first) == REG_BLOCK_UNKNOWN)
4773 REG_BASIC_BLOCK (regno_first) = blocknum;
4774 else if (REG_BASIC_BLOCK (regno_first) != blocknum)
4775 REG_BASIC_BLOCK (regno_first) = REG_BLOCK_GLOBAL;
d3a923ee 4776 }
d7429b6a
RK
4777 }
4778
62828c00 4779 if (! some_was_dead)
d7429b6a 4780 {
d3a923ee
RH
4781 if (flags & PROP_LOG_LINKS)
4782 {
4783 /* Make a logical link from the next following insn
4784 that uses this register, back to this insn.
4785 The following insns have already been processed.
4786
4787 We don't build a LOG_LINK for hard registers containing
4788 in ASM_OPERANDs. If these registers get replaced,
4789 we might wind up changing the semantics of the insn,
4790 even if reload can make what appear to be valid
4791 assignments later. */
4792 if (y && (BLOCK_NUM (y) == blocknum)
b4593d17 4793 && (regno_first >= FIRST_PSEUDO_REGISTER
d3a923ee
RH
4794 || asm_noperands (PATTERN (y)) < 0))
4795 LOG_LINKS (y) = alloc_INSN_LIST (insn, LOG_LINKS (y));
4796 }
d7429b6a 4797 }
9785c68d
RH
4798 else if (not_dead)
4799 ;
62828c00 4800 else if (! some_was_live)
d7429b6a 4801 {
d3a923ee 4802 if (flags & PROP_REG_INFO)
b4593d17 4803 REG_N_DEATHS (regno_first) += 1;
d3a923ee
RH
4804
4805 if (flags & PROP_DEATH_NOTES)
4806 {
4807 /* Note that dead stores have already been deleted
4808 when possible. If we get here, we have found a
4809 dead store that cannot be eliminated (because the
4810 same insn does something useful). Indicate this
4811 by marking the reg being set as dying here. */
4812 REG_NOTES (insn)
4813 = alloc_EXPR_LIST (REG_UNUSED, reg, REG_NOTES (insn));
4814 }
d7429b6a
RK
4815 }
4816 else
4817 {
d3a923ee
RH
4818 if (flags & PROP_DEATH_NOTES)
4819 {
4820 /* This is a case where we have a multi-word hard register
4821 and some, but not all, of the words of the register are
4822 needed in subsequent insns. Write REG_UNUSED notes
4823 for those parts that were not needed. This case should
4824 be rare. */
4825
b4593d17
RH
4826 for (i = regno_first; i <= regno_last; ++i)
4827 if (! REGNO_REG_SET_P (pbi->reg_live, i))
d3a923ee 4828 REG_NOTES (insn)
b4593d17
RH
4829 = alloc_EXPR_LIST (REG_UNUSED,
4830 gen_rtx_REG (reg_raw_mode[i], i),
4831 REG_NOTES (insn));
d3a923ee 4832 }
d7429b6a
RK
4833 }
4834 }
b4593d17
RH
4835
4836 /* Mark the register as being dead. */
4837 if (some_was_live
507741dd 4838 && ! not_dead
b4593d17
RH
4839 /* The stack pointer is never dead. Well, not strictly true,
4840 but it's very difficult to tell from here. Hopefully
4841 combine_stack_adjustments will fix up the most egregious
4842 errors. */
4843 && regno_first != STACK_POINTER_REGNUM)
4844 {
4845 for (i = regno_first; i <= regno_last; ++i)
9785c68d 4846 CLEAR_REGNO_REG_SET (pbi->reg_live, i);
b4593d17 4847 }
d7429b6a 4848 }
8244fc4f 4849 else if (GET_CODE (reg) == REG)
d3a923ee
RH
4850 {
4851 if (flags & (PROP_LOG_LINKS | PROP_AUTOINC))
b4593d17 4852 pbi->reg_next_use[regno_first] = 0;
d3a923ee 4853 }
d7429b6a
RK
4854
4855 /* If this is the last pass and this is a SCRATCH, show it will be dying
4856 here and count it. */
d3a923ee 4857 else if (GET_CODE (reg) == SCRATCH)
d7429b6a 4858 {
d3a923ee
RH
4859 if (flags & PROP_DEATH_NOTES)
4860 REG_NOTES (insn)
4861 = alloc_EXPR_LIST (REG_UNUSED, reg, REG_NOTES (insn));
d7429b6a
RK
4862 }
4863}
4864\f
11ae508b 4865#ifdef HAVE_conditional_execution
c9bacfdb
KH
4866/* Mark REGNO conditionally dead.
4867 Return true if the register is now unconditionally dead. */
11ae508b
RH
4868
4869static int
4870mark_regno_cond_dead (pbi, regno, cond)
4871 struct propagate_block_info *pbi;
4872 int regno;
4873 rtx cond;
4874{
4875 /* If this is a store to a predicate register, the value of the
4876 predicate is changing, we don't know that the predicate as seen
4eb00163 4877 before is the same as that seen after. Flush all dependent
11ae508b
RH
4878 conditions from reg_cond_dead. This will make all such
4879 conditionally live registers unconditionally live. */
4880 if (REGNO_REG_SET_P (pbi->reg_cond_reg, regno))
4881 flush_reg_cond_reg (pbi, regno);
4882
4883 /* If this is an unconditional store, remove any conditional
4884 life that may have existed. */
4885 if (cond == NULL_RTX)
4886 splay_tree_remove (pbi->reg_cond_dead, regno);
4887 else
4888 {
4889 splay_tree_node node;
4890 struct reg_cond_life_info *rcli;
4891 rtx ncond;
4892
4893 /* Otherwise this is a conditional set. Record that fact.
4894 It may have been conditionally used, or there may be a
4895 subsequent set with a complimentary condition. */
4896
4897 node = splay_tree_lookup (pbi->reg_cond_dead, regno);
4898 if (node == NULL)
4899 {
4900 /* The register was unconditionally live previously.
4901 Record the current condition as the condition under
4902 which it is dead. */
c9bacfdb 4903 rcli = (struct reg_cond_life_info *) xmalloc (sizeof (*rcli));
11ae508b
RH
4904 rcli->condition = alloc_EXPR_LIST (0, cond, NULL_RTX);
4905 splay_tree_insert (pbi->reg_cond_dead, regno,
4906 (splay_tree_value) rcli);
4907
7791b7f9 4908 SET_REGNO_REG_SET (pbi->reg_cond_reg, REGNO (XEXP (cond, 0)));
11ae508b
RH
4909
4910 /* Not unconditionaly dead. */
4911 return 0;
4912 }
4913 else
4914 {
c9bacfdb 4915 /* The register was conditionally live previously.
11ae508b
RH
4916 Add the new condition to the old. */
4917 rcli = (struct reg_cond_life_info *) node->value;
4918 ncond = rcli->condition;
4919 ncond = ior_reg_cond (ncond, cond);
4920
4921 /* If the register is now unconditionally dead,
4922 remove the entry in the splay_tree. */
4923 if (ncond == const1_rtx)
4924 splay_tree_remove (pbi->reg_cond_dead, regno);
4925 else
4926 {
4927 rcli->condition = ncond;
4928
7791b7f9 4929 SET_REGNO_REG_SET (pbi->reg_cond_reg, REGNO (XEXP (cond, 0)));
11ae508b
RH
4930
4931 /* Not unconditionaly dead. */
4932 return 0;
4933 }
4934 }
4935 }
4936
4937 return 1;
4938}
4939
4940/* Called from splay_tree_delete for pbi->reg_cond_life. */
4941
4942static void
4943free_reg_cond_life_info (value)
4944 splay_tree_value value;
4945{
4946 struct reg_cond_life_info *rcli = (struct reg_cond_life_info *) value;
4947 free_EXPR_LIST_list (&rcli->condition);
4948 free (rcli);
4949}
4950
4951/* Helper function for flush_reg_cond_reg. */
4952
4953static int
4954flush_reg_cond_reg_1 (node, data)
4955 splay_tree_node node;
4956 void *data;
4957{
4958 struct reg_cond_life_info *rcli;
4959 int *xdata = (int *) data;
4960 unsigned int regno = xdata[0];
4961 rtx c, *prev;
4962
4963 /* Don't need to search if last flushed value was farther on in
4964 the in-order traversal. */
4965 if (xdata[1] >= (int) node->key)
4966 return 0;
4967
4968 /* Splice out portions of the expression that refer to regno. */
4969 rcli = (struct reg_cond_life_info *) node->value;
4970 c = *(prev = &rcli->condition);
4971 while (c)
4972 {
4973 if (regno == REGNO (XEXP (XEXP (c, 0), 0)))
4974 {
4975 rtx next = XEXP (c, 1);
4976 free_EXPR_LIST_node (c);
4977 c = *prev = next;
4978 }
4979 else
4980 c = *(prev = &XEXP (c, 1));
4981 }
4982
4983 /* If the entire condition is now NULL, signal the node to be removed. */
4984 if (! rcli->condition)
4985 {
4986 xdata[1] = node->key;
4987 return -1;
4988 }
4989 else
4990 return 0;
4991}
4992
4993/* Flush all (sub) expressions referring to REGNO from REG_COND_LIVE. */
4994
4995static void
4996flush_reg_cond_reg (pbi, regno)
4997 struct propagate_block_info *pbi;
4998 int regno;
4999{
5000 int pair[2];
5001
5002 pair[0] = regno;
5003 pair[1] = -1;
5004 while (splay_tree_foreach (pbi->reg_cond_dead,
5005 flush_reg_cond_reg_1, pair) == -1)
5006 splay_tree_remove (pbi->reg_cond_dead, pair[1]);
5007
5008 CLEAR_REGNO_REG_SET (pbi->reg_cond_reg, regno);
5009}
5010
5011/* Logical arithmetic on predicate conditions. IOR, NOT and NAND.
5012 We actually use EXPR_LIST to chain the sub-expressions together
c9bacfdb 5013 instead of IOR because it's easier to manipulate and we have
11ae508b 5014 the lists.c functions to reuse nodes.
c9bacfdb 5015
11ae508b
RH
5016 Return a new rtl expression as appropriate. */
5017
5018static rtx
5019ior_reg_cond (old, x)
5020 rtx old, x;
5021{
5022 enum rtx_code x_code;
5023 rtx x_reg;
5024 rtx c;
5025
5026 /* We expect these conditions to be of the form (eq reg 0). */
5027 x_code = GET_CODE (x);
5028 if (GET_RTX_CLASS (x_code) != '<'
5029 || GET_CODE (x_reg = XEXP (x, 0)) != REG
5030 || XEXP (x, 1) != const0_rtx)
5031 abort ();
5032
5033 /* Search the expression for an existing sub-expression of X_REG. */
c9bacfdb 5034 for (c = old; c; c = XEXP (c, 1))
11ae508b
RH
5035 {
5036 rtx y = XEXP (c, 0);
5037 if (REGNO (XEXP (y, 0)) == REGNO (x_reg))
5038 {
5039 /* If we find X already present in OLD, we need do nothing. */
5040 if (GET_CODE (y) == x_code)
5041 return old;
5042
c9bacfdb 5043 /* If we find X being a compliment of a condition in OLD,
11ae508b
RH
5044 then the entire condition is true. */
5045 if (GET_CODE (y) == reverse_condition (x_code))
5046 return const1_rtx;
5047 }
5048 }
5049
5050 /* Otherwise just add to the chain. */
5051 return alloc_EXPR_LIST (0, x, old);
5052}
5053
5054static rtx
5055not_reg_cond (x)
5056 rtx x;
5057{
5058 enum rtx_code x_code;
5059 rtx x_reg;
5060
5061 /* We expect these conditions to be of the form (eq reg 0). */
5062 x_code = GET_CODE (x);
5063 if (GET_RTX_CLASS (x_code) != '<'
5064 || GET_CODE (x_reg = XEXP (x, 0)) != REG
5065 || XEXP (x, 1) != const0_rtx)
5066 abort ();
5067
5068 return alloc_EXPR_LIST (0, gen_rtx_fmt_ee (reverse_condition (x_code),
5069 VOIDmode, x_reg, const0_rtx),
5070 NULL_RTX);
5071}
5072
5073static rtx
5074nand_reg_cond (old, x)
5075 rtx old, x;
5076{
5077 enum rtx_code x_code;
5078 rtx x_reg;
5079 rtx c, *prev;
5080
5081 /* We expect these conditions to be of the form (eq reg 0). */
5082 x_code = GET_CODE (x);
5083 if (GET_RTX_CLASS (x_code) != '<'
5084 || GET_CODE (x_reg = XEXP (x, 0)) != REG
5085 || XEXP (x, 1) != const0_rtx)
5086 abort ();
5087
5088 /* Search the expression for an existing sub-expression of X_REG. */
5089
c9bacfdb 5090 for (c = *(prev = &old); c; c = *(prev = &XEXP (c, 1)))
11ae508b
RH
5091 {
5092 rtx y = XEXP (c, 0);
5093 if (REGNO (XEXP (y, 0)) == REGNO (x_reg))
5094 {
c9bacfdb 5095 /* If we find X already present in OLD, then we need to
11ae508b
RH
5096 splice it out. */
5097 if (GET_CODE (y) == x_code)
5098 {
5099 *prev = XEXP (c, 1);
5100 free_EXPR_LIST_node (c);
5101 return old ? old : const0_rtx;
5102 }
5103
c9bacfdb 5104 /* If we find X being a compliment of a condition in OLD,
11ae508b
RH
5105 then we need do nothing. */
5106 if (GET_CODE (y) == reverse_condition (x_code))
5107 return old;
5108 }
5109 }
5110
5111 /* Otherwise, by implication, the register in question is now live for
5112 the inverse of the condition X. */
5113 return alloc_EXPR_LIST (0, gen_rtx_fmt_ee (reverse_condition (x_code),
5114 VOIDmode, x_reg, const0_rtx),
5115 old);
5116}
5117#endif /* HAVE_conditional_execution */
5118\f
d7429b6a
RK
5119#ifdef AUTO_INC_DEC
5120
4b983fdc
RH
5121/* Try to substitute the auto-inc expression INC as the address inside
5122 MEM which occurs in INSN. Currently, the address of MEM is an expression
5123 involving INCR_REG, and INCR is the next use of INCR_REG; it is an insn
5124 that has a single set whose source is a PLUS of INCR_REG and something
5125 else. */
5126
5127static void
5128attempt_auto_inc (pbi, inc, insn, mem, incr, incr_reg)
5129 struct propagate_block_info *pbi;
5130 rtx inc, insn, mem, incr, incr_reg;
5131{
5132 int regno = REGNO (incr_reg);
5133 rtx set = single_set (incr);
5134 rtx q = SET_DEST (set);
5135 rtx y = SET_SRC (set);
5136 int opnum = XEXP (y, 0) == incr_reg ? 0 : 1;
5137
5138 /* Make sure this reg appears only once in this insn. */
5139 if (count_occurrences (PATTERN (insn), incr_reg, 1) != 1)
5140 return;
5141
5142 if (dead_or_set_p (incr, incr_reg)
5143 /* Mustn't autoinc an eliminable register. */
5144 && (regno >= FIRST_PSEUDO_REGISTER
5145 || ! TEST_HARD_REG_BIT (elim_reg_set, regno)))
5146 {
5147 /* This is the simple case. Try to make the auto-inc. If
5148 we can't, we are done. Otherwise, we will do any
5149 needed updates below. */
5150 if (! validate_change (insn, &XEXP (mem, 0), inc, 0))
5151 return;
5152 }
5153 else if (GET_CODE (q) == REG
5154 /* PREV_INSN used here to check the semi-open interval
5155 [insn,incr). */
5156 && ! reg_used_between_p (q, PREV_INSN (insn), incr)
5157 /* We must also check for sets of q as q may be
5158 a call clobbered hard register and there may
5159 be a call between PREV_INSN (insn) and incr. */
5160 && ! reg_set_between_p (q, PREV_INSN (insn), incr))
5161 {
5162 /* We have *p followed sometime later by q = p+size.
5163 Both p and q must be live afterward,
5164 and q is not used between INSN and its assignment.
5165 Change it to q = p, ...*q..., q = q+size.
5166 Then fall into the usual case. */
5167 rtx insns, temp;
4b983fdc
RH
5168
5169 start_sequence ();
5170 emit_move_insn (q, incr_reg);
5171 insns = get_insns ();
5172 end_sequence ();
5173
5174 if (basic_block_for_insn)
5175 for (temp = insns; temp; temp = NEXT_INSN (temp))
5176 set_block_for_insn (temp, pbi->bb);
5177
5178 /* If we can't make the auto-inc, or can't make the
5179 replacement into Y, exit. There's no point in making
5180 the change below if we can't do the auto-inc and doing
5181 so is not correct in the pre-inc case. */
5182
5183 XEXP (inc, 0) = q;
5184 validate_change (insn, &XEXP (mem, 0), inc, 1);
5185 validate_change (incr, &XEXP (y, opnum), q, 1);
5186 if (! apply_change_group ())
5187 return;
5188
5189 /* We now know we'll be doing this change, so emit the
5190 new insn(s) and do the updates. */
5191 emit_insns_before (insns, insn);
5192
5193 if (pbi->bb->head == insn)
5194 pbi->bb->head = insns;
5195
5196 /* INCR will become a NOTE and INSN won't contain a
5197 use of INCR_REG. If a use of INCR_REG was just placed in
c9bacfdb 5198 the insn before INSN, make that the next use.
4b983fdc
RH
5199 Otherwise, invalidate it. */
5200 if (GET_CODE (PREV_INSN (insn)) == INSN
5201 && GET_CODE (PATTERN (PREV_INSN (insn))) == SET
5202 && SET_SRC (PATTERN (PREV_INSN (insn))) == incr_reg)
5203 pbi->reg_next_use[regno] = PREV_INSN (insn);
5204 else
5205 pbi->reg_next_use[regno] = 0;
5206
5207 incr_reg = q;
5208 regno = REGNO (q);
5209
5210 /* REGNO is now used in INCR which is below INSN, but
5211 it previously wasn't live here. If we don't mark
5212 it as live, we'll put a REG_DEAD note for it
5213 on this insn, which is incorrect. */
5214 SET_REGNO_REG_SET (pbi->reg_live, regno);
5215
5216 /* If there are any calls between INSN and INCR, show
5217 that REGNO now crosses them. */
5218 for (temp = insn; temp != incr; temp = NEXT_INSN (temp))
5219 if (GET_CODE (temp) == CALL_INSN)
5220 REG_N_CALLS_CROSSED (regno)++;
5221 }
5222 else
5223 return;
5224
5225 /* If we haven't returned, it means we were able to make the
5226 auto-inc, so update the status. First, record that this insn
5227 has an implicit side effect. */
5228
c9bacfdb 5229 REG_NOTES (insn) = alloc_EXPR_LIST (REG_INC, incr_reg, REG_NOTES (insn));
4b983fdc
RH
5230
5231 /* Modify the old increment-insn to simply copy
5232 the already-incremented value of our register. */
5233 if (! validate_change (incr, &SET_SRC (set), incr_reg, 0))
5234 abort ();
5235
5236 /* If that makes it a no-op (copying the register into itself) delete
5237 it so it won't appear to be a "use" and a "set" of this
5238 register. */
5239 if (REGNO (SET_DEST (set)) == REGNO (incr_reg))
5240 {
5241 /* If the original source was dead, it's dead now. */
5242 rtx note;
c9bacfdb 5243
0858c623 5244 while ((note = find_reg_note (incr, REG_DEAD, NULL_RTX)) != NULL_RTX)
4b983fdc
RH
5245 {
5246 remove_note (incr, note);
5247 if (XEXP (note, 0) != incr_reg)
5248 CLEAR_REGNO_REG_SET (pbi->reg_live, REGNO (XEXP (note, 0)));
5249 }
5250
5251 PUT_CODE (incr, NOTE);
5252 NOTE_LINE_NUMBER (incr) = NOTE_INSN_DELETED;
5253 NOTE_SOURCE_FILE (incr) = 0;
5254 }
5255
5256 if (regno >= FIRST_PSEUDO_REGISTER)
5257 {
5258 /* Count an extra reference to the reg. When a reg is
5259 incremented, spilling it is worse, so we want to make
5260 that less likely. */
5261 REG_N_REFS (regno) += (optimize_size ? 1 : pbi->bb->loop_depth + 1);
5262
5263 /* Count the increment as a setting of the register,
5264 even though it isn't a SET in rtl. */
5265 REG_N_SETS (regno)++;
5266 }
5267}
5268
d7429b6a
RK
5269/* X is a MEM found in INSN. See if we can convert it into an auto-increment
5270 reference. */
5271
5272static void
62828c00
RH
5273find_auto_inc (pbi, x, insn)
5274 struct propagate_block_info *pbi;
d7429b6a
RK
5275 rtx x;
5276 rtx insn;
5277{
5278 rtx addr = XEXP (x, 0);
e658434c 5279 HOST_WIDE_INT offset = 0;
4b983fdc
RH
5280 rtx set, y, incr, inc_val;
5281 int regno;
5282 int size = GET_MODE_SIZE (GET_MODE (x));
5283
5284 if (GET_CODE (insn) == JUMP_INSN)
5285 return;
d7429b6a
RK
5286
5287 /* Here we detect use of an index register which might be good for
5288 postincrement, postdecrement, preincrement, or predecrement. */
5289
5290 if (GET_CODE (addr) == PLUS && GET_CODE (XEXP (addr, 1)) == CONST_INT)
5291 offset = INTVAL (XEXP (addr, 1)), addr = XEXP (addr, 0);
5292
4b983fdc
RH
5293 if (GET_CODE (addr) != REG)
5294 return;
d7429b6a 5295
4b983fdc 5296 regno = REGNO (addr);
7280c2a4 5297
4b983fdc
RH
5298 /* Is the next use an increment that might make auto-increment? */
5299 incr = pbi->reg_next_use[regno];
5300 if (incr == 0 || BLOCK_NUM (incr) != BLOCK_NUM (insn))
5301 return;
5302 set = single_set (incr);
5303 if (set == 0 || GET_CODE (set) != SET)
5304 return;
5305 y = SET_SRC (set);
7280c2a4 5306
4b983fdc
RH
5307 if (GET_CODE (y) != PLUS)
5308 return;
7280c2a4 5309
66ed03f8 5310 if (REG_P (XEXP (y, 0)) && REGNO (XEXP (y, 0)) == REGNO (addr))
4b983fdc 5311 inc_val = XEXP (y, 1);
66ed03f8 5312 else if (REG_P (XEXP (y, 1)) && REGNO (XEXP (y, 1)) == REGNO (addr))
4b983fdc
RH
5313 inc_val = XEXP (y, 0);
5314 else
66ed03f8 5315 return;
d7429b6a 5316
4b983fdc
RH
5317 if (GET_CODE (inc_val) == CONST_INT)
5318 {
5319 if (HAVE_POST_INCREMENT
5320 && (INTVAL (inc_val) == size && offset == 0))
5321 attempt_auto_inc (pbi, gen_rtx_POST_INC (Pmode, addr), insn, x,
5322 incr, addr);
5323 else if (HAVE_POST_DECREMENT
c9bacfdb 5324 && (INTVAL (inc_val) == -size && offset == 0))
4b983fdc
RH
5325 attempt_auto_inc (pbi, gen_rtx_POST_DEC (Pmode, addr), insn, x,
5326 incr, addr);
5327 else if (HAVE_PRE_INCREMENT
5328 && (INTVAL (inc_val) == size && offset == size))
5329 attempt_auto_inc (pbi, gen_rtx_PRE_INC (Pmode, addr), insn, x,
5330 incr, addr);
5331 else if (HAVE_PRE_DECREMENT
c9bacfdb 5332 && (INTVAL (inc_val) == -size && offset == -size))
4b983fdc
RH
5333 attempt_auto_inc (pbi, gen_rtx_PRE_DEC (Pmode, addr), insn, x,
5334 incr, addr);
5335 else if (HAVE_POST_MODIFY_DISP && offset == 0)
5336 attempt_auto_inc (pbi, gen_rtx_POST_MODIFY (Pmode, addr,
5337 gen_rtx_PLUS (Pmode,
5338 addr,
5339 inc_val)),
5340 insn, x, incr, addr);
5341 }
5342 else if (GET_CODE (inc_val) == REG
5343 && ! reg_set_between_p (inc_val, PREV_INSN (insn),
5344 NEXT_INSN (incr)))
7280c2a4 5345
4b983fdc
RH
5346 {
5347 if (HAVE_POST_MODIFY_REG && offset == 0)
5348 attempt_auto_inc (pbi, gen_rtx_POST_MODIFY (Pmode, addr,
5349 gen_rtx_PLUS (Pmode,
5350 addr,
5351 inc_val)),
5352 insn, x, incr, addr);
d7429b6a
RK
5353 }
5354}
4b983fdc 5355
d7429b6a
RK
5356#endif /* AUTO_INC_DEC */
5357\f
62828c00 5358static void
8e3f9094 5359mark_used_reg (pbi, reg, cond, insn)
62828c00 5360 struct propagate_block_info *pbi;
62828c00
RH
5361 rtx reg;
5362 rtx cond ATTRIBUTE_UNUSED;
5363 rtx insn;
5364{
5365 int regno = REGNO (reg);
5366 int some_was_live = REGNO_REG_SET_P (pbi->reg_live, regno);
5367 int some_was_dead = ! some_was_live;
9785c68d
RH
5368 int some_not_set;
5369 int n;
62828c00
RH
5370
5371 /* A hard reg in a wide mode may really be multiple registers.
5372 If so, mark all of them just like the first. */
5373 if (regno < FIRST_PSEUDO_REGISTER)
5374 {
9785c68d 5375 n = HARD_REGNO_NREGS (regno, GET_MODE (reg));
62828c00
RH
5376 while (--n > 0)
5377 {
9785c68d 5378 int needed_regno = REGNO_REG_SET_P (pbi->reg_live, regno + n);
62828c00
RH
5379 some_was_live |= needed_regno;
5380 some_was_dead |= ! needed_regno;
5381 }
5382 }
5383
5384 if (pbi->flags & (PROP_LOG_LINKS | PROP_AUTOINC))
5385 {
5386 /* Record where each reg is used, so when the reg is set we know
5387 the next insn that uses it. */
5388 pbi->reg_next_use[regno] = insn;
5389 }
5390
5391 if (pbi->flags & PROP_REG_INFO)
5392 {
5393 if (regno < FIRST_PSEUDO_REGISTER)
5394 {
5395 /* If this is a register we are going to try to eliminate,
5396 don't mark it live here. If we are successful in
5397 eliminating it, it need not be live unless it is used for
5398 pseudos, in which case it will have been set live when it
5399 was allocated to the pseudos. If the register will not
5400 be eliminated, reload will set it live at that point.
5401
5402 Otherwise, record that this function uses this register. */
b2433fcd
RH
5403 /* ??? The PPC backend tries to "eliminate" on the pic
5404 register to itself. This should be fixed. In the mean
5405 time, hack around it. */
d7429b6a 5406
b2433fcd
RH
5407 if (! (TEST_HARD_REG_BIT (elim_reg_set, regno)
5408 && (regno == FRAME_POINTER_REGNUM
5409 || regno == ARG_POINTER_REGNUM)))
62828c00
RH
5410 {
5411 int n = HARD_REGNO_NREGS (regno, GET_MODE (reg));
62828c00
RH
5412 do
5413 regs_ever_live[regno + --n] = 1;
5414 while (n > 0);
5415 }
5416 }
5417 else
5418 {
5419 /* Keep track of which basic block each reg appears in. */
5420
5421 register int blocknum = pbi->bb->index;
5422 if (REG_BASIC_BLOCK (regno) == REG_BLOCK_UNKNOWN)
5423 REG_BASIC_BLOCK (regno) = blocknum;
5424 else if (REG_BASIC_BLOCK (regno) != blocknum)
5425 REG_BASIC_BLOCK (regno) = REG_BLOCK_GLOBAL;
5426
5427 /* Count (weighted) number of uses of each reg. */
ebfe71a8
NC
5428 REG_N_REFS (regno) += (optimize_size ? 1
5429 : pbi->bb->loop_depth + 1);
62828c00
RH
5430 }
5431 }
d7429b6a 5432
9785c68d
RH
5433 /* Find out if any of the register was set this insn. */
5434 some_not_set = ! REGNO_REG_SET_P (pbi->new_set, regno);
5435 if (regno < FIRST_PSEUDO_REGISTER)
5436 {
5437 n = HARD_REGNO_NREGS (regno, GET_MODE (reg));
5438 while (--n > 0)
5439 some_not_set |= ! REGNO_REG_SET_P (pbi->new_set, regno + n);
5440 }
5441
62828c00
RH
5442 /* Record and count the insns in which a reg dies. If it is used in
5443 this insn and was dead below the insn then it dies in this insn.
5444 If it was set in this insn, we do not make a REG_DEAD note;
9785c68d
RH
5445 likewise if we already made such a note. */
5446 if ((pbi->flags & (PROP_DEATH_NOTES | PROP_REG_INFO))
62828c00 5447 && some_was_dead
9785c68d 5448 && some_not_set)
62828c00 5449 {
62828c00
RH
5450 /* Check for the case where the register dying partially
5451 overlaps the register set by this insn. */
5452 if (regno < FIRST_PSEUDO_REGISTER
5453 && HARD_REGNO_NREGS (regno, GET_MODE (reg)) > 1)
5454 {
5455 n = HARD_REGNO_NREGS (regno, GET_MODE (reg));
5456 while (--n >= 0)
9785c68d 5457 some_was_live |= REGNO_REG_SET_P (pbi->new_set, regno + n);
62828c00
RH
5458 }
5459
5460 /* If none of the words in X is needed, make a REG_DEAD note.
5461 Otherwise, we must make partial REG_DEAD notes. */
5462 if (! some_was_live)
5463 {
9785c68d
RH
5464 if ((pbi->flags & PROP_DEATH_NOTES)
5465 && ! find_regno_note (insn, REG_DEAD, regno))
5466 REG_NOTES (insn)
5467 = alloc_EXPR_LIST (REG_DEAD, reg, REG_NOTES (insn));
5468
5469 if (pbi->flags & PROP_REG_INFO)
5470 REG_N_DEATHS (regno)++;
62828c00
RH
5471 }
5472 else
5473 {
5474 /* Don't make a REG_DEAD note for a part of a register
5475 that is set in the insn. */
5476
5477 n = regno + HARD_REGNO_NREGS (regno, GET_MODE (reg)) - 1;
5478 for (; n >= regno; n--)
9785c68d 5479 if (! REGNO_REG_SET_P (pbi->reg_live, n)
62828c00
RH
5480 && ! dead_or_set_regno_p (insn, n))
5481 REG_NOTES (insn)
5482 = alloc_EXPR_LIST (REG_DEAD,
5483 gen_rtx_REG (reg_raw_mode[n], n),
5484 REG_NOTES (insn));
5485 }
5486 }
9785c68d
RH
5487
5488 SET_REGNO_REG_SET (pbi->reg_live, regno);
5489 if (regno < FIRST_PSEUDO_REGISTER)
5490 {
5491 n = HARD_REGNO_NREGS (regno, GET_MODE (reg));
5492 while (--n > 0)
5493 SET_REGNO_REG_SET (pbi->reg_live, regno + n);
5494 }
11ae508b
RH
5495
5496#ifdef HAVE_conditional_execution
5497 /* If this is a conditional use, record that fact. If it is later
5498 conditionally set, we'll know to kill the register. */
5499 if (cond != NULL_RTX)
5500 {
5501 splay_tree_node node;
5502 struct reg_cond_life_info *rcli;
5503 rtx ncond;
5504
5505 if (some_was_live)
5506 {
5507 node = splay_tree_lookup (pbi->reg_cond_dead, regno);
5508 if (node == NULL)
5509 {
5510 /* The register was unconditionally live previously.
5511 No need to do anything. */
5512 }
5513 else
5514 {
c9bacfdb 5515 /* The register was conditionally live previously.
11ae508b
RH
5516 Subtract the new life cond from the old death cond. */
5517 rcli = (struct reg_cond_life_info *) node->value;
5518 ncond = rcli->condition;
5519 ncond = nand_reg_cond (ncond, cond);
5520
5521 /* If the register is now unconditionally live, remove the
5522 entry in the splay_tree. */
5523 if (ncond == const0_rtx)
5524 {
5525 rcli->condition = NULL_RTX;
5526 splay_tree_remove (pbi->reg_cond_dead, regno);
5527 }
5528 else
7791b7f9
RH
5529 {
5530 rcli->condition = ncond;
5531 SET_REGNO_REG_SET (pbi->reg_cond_reg, REGNO (XEXP (cond, 0)));
5532 }
11ae508b
RH
5533 }
5534 }
5535 else
5536 {
5537 /* The register was not previously live at all. Record
5538 the condition under which it is still dead. */
5539 rcli = (struct reg_cond_life_info *) xmalloc (sizeof (*rcli));
5540 rcli->condition = not_reg_cond (cond);
5541 splay_tree_insert (pbi->reg_cond_dead, regno,
5542 (splay_tree_value) rcli);
7791b7f9
RH
5543
5544 SET_REGNO_REG_SET (pbi->reg_cond_reg, REGNO (XEXP (cond, 0)));
11ae508b
RH
5545 }
5546 }
6a3dbe65
RE
5547 else if (some_was_live)
5548 {
5549 splay_tree_node node;
5550 struct reg_cond_life_info *rcli;
5551
5552 node = splay_tree_lookup (pbi->reg_cond_dead, regno);
5553 if (node != NULL)
5554 {
5555 /* The register was conditionally live previously, but is now
5556 unconditionally so. Remove it from the conditionally dead
5557 list, so that a conditional set won't cause us to think
5558 it dead. */
5559 rcli = (struct reg_cond_life_info *) node->value;
5560 rcli->condition = NULL_RTX;
5561 splay_tree_remove (pbi->reg_cond_dead, regno);
5562 }
5563 }
5564
11ae508b 5565#endif
62828c00
RH
5566}
5567
5568/* Scan expression X and store a 1-bit in NEW_LIVE for each reg it uses.
5569 This is done assuming the registers needed from X are those that
5570 have 1-bits in PBI->REG_LIVE.
5571
5572 INSN is the containing instruction. If INSN is dead, this function
5573 is not called. */
d7429b6a
RK
5574
5575static void
8e3f9094 5576mark_used_regs (pbi, x, cond, insn)
62828c00 5577 struct propagate_block_info *pbi;
62828c00 5578 rtx x, cond, insn;
d7429b6a
RK
5579{
5580 register RTX_CODE code;
5581 register int regno;
62828c00 5582 int flags = pbi->flags;
d7429b6a
RK
5583
5584 retry:
5585 code = GET_CODE (x);
5586 switch (code)
5587 {
5588 case LABEL_REF:
5589 case SYMBOL_REF:
5590 case CONST_INT:
5591 case CONST:
5592 case CONST_DOUBLE:
5593 case PC:
d7429b6a
RK
5594 case ADDR_VEC:
5595 case ADDR_DIFF_VEC:
d7429b6a
RK
5596 return;
5597
5598#ifdef HAVE_cc0
5599 case CC0:
62828c00 5600 pbi->cc0_live = 1;
d7429b6a
RK
5601 return;
5602#endif
5603
2f1553a4
RK
5604 case CLOBBER:
5605 /* If we are clobbering a MEM, mark any registers inside the address
5606 as being used. */
5607 if (GET_CODE (XEXP (x, 0)) == MEM)
8e3f9094 5608 mark_used_regs (pbi, XEXP (XEXP (x, 0), 0), cond, insn);
2f1553a4
RK
5609 return;
5610
d7429b6a 5611 case MEM:
c9bacfdb 5612 /* Don't bother watching stores to mems if this is not the
d3a923ee 5613 final pass. We'll not be deleting dead stores this round. */
b2262f4a 5614 if (optimize && (flags & PROP_SCAN_DEAD_CODE))
db3a887b 5615 {
c9bacfdb 5616 /* Invalidate the data for the last MEM stored, but only if MEM is
d3a923ee 5617 something that can be stored into. */
c9bacfdb 5618 if (GET_CODE (XEXP (x, 0)) == SYMBOL_REF
d3a923ee 5619 && CONSTANT_POOL_ADDRESS_P (XEXP (x, 0)))
c9bacfdb
KH
5620 /* Needn't clear the memory set list. */
5621 ;
5622 else
db3a887b 5623 {
62828c00 5624 rtx temp = pbi->mem_set_list;
d3a923ee 5625 rtx prev = NULL_RTX;
ff666313 5626 rtx next;
d3a923ee
RH
5627
5628 while (temp)
db3a887b 5629 {
ff666313 5630 next = XEXP (temp, 1);
d3a923ee
RH
5631 if (anti_dependence (XEXP (temp, 0), x))
5632 {
5633 /* Splice temp out of the list. */
5634 if (prev)
ff666313 5635 XEXP (prev, 1) = next;
d3a923ee 5636 else
62828c00 5637 pbi->mem_set_list = next;
ff666313 5638 free_EXPR_LIST_node (temp);
d3a923ee 5639 }
db3a887b 5640 else
d3a923ee 5641 prev = temp;
ff666313 5642 temp = next;
db3a887b 5643 }
db3a887b 5644 }
d7429b6a 5645
d3a923ee
RH
5646 /* If the memory reference had embedded side effects (autoincrement
5647 address modes. Then we may need to kill some entries on the
5648 memory set list. */
5649 if (insn)
62828c00 5650 invalidate_mems_from_autoinc (pbi, insn);
d3a923ee 5651 }
15e088b2 5652
d7429b6a 5653#ifdef AUTO_INC_DEC
61f286b6 5654 if (flags & PROP_AUTOINC)
62828c00 5655 find_auto_inc (pbi, x, insn);
d7429b6a
RK
5656#endif
5657 break;
5658
80f8f04a 5659 case SUBREG:
02188693 5660#ifdef CLASS_CANNOT_CHANGE_MODE
80f8f04a
RK
5661 if (GET_CODE (SUBREG_REG (x)) == REG
5662 && REGNO (SUBREG_REG (x)) >= FIRST_PSEUDO_REGISTER
02188693
RH
5663 && CLASS_CANNOT_CHANGE_MODE_P (GET_MODE (x),
5664 GET_MODE (SUBREG_REG (x))))
5665 REG_CHANGES_MODE (REGNO (SUBREG_REG (x))) = 1;
5666#endif
80f8f04a
RK
5667
5668 /* While we're here, optimize this case. */
5669 x = SUBREG_REG (x);
ce79abf3 5670 if (GET_CODE (x) != REG)
62828c00 5671 goto retry;
c9bacfdb 5672 /* Fall through. */
80f8f04a 5673
d7429b6a 5674 case REG:
62828c00 5675 /* See a register other than being set => mark it as needed. */
8e3f9094 5676 mark_used_reg (pbi, x, cond, insn);
d7429b6a
RK
5677 return;
5678
5679 case SET:
5680 {
5681 register rtx testreg = SET_DEST (x);
5682 int mark_dest = 0;
5683
5684 /* If storing into MEM, don't show it as being used. But do
5685 show the address as being used. */
5686 if (GET_CODE (testreg) == MEM)
5687 {
5688#ifdef AUTO_INC_DEC
61f286b6 5689 if (flags & PROP_AUTOINC)
62828c00 5690 find_auto_inc (pbi, testreg, insn);
d7429b6a 5691#endif
8e3f9094
RH
5692 mark_used_regs (pbi, XEXP (testreg, 0), cond, insn);
5693 mark_used_regs (pbi, SET_SRC (x), cond, insn);
d7429b6a
RK
5694 return;
5695 }
c9bacfdb 5696
d7429b6a
RK
5697 /* Storing in STRICT_LOW_PART is like storing in a reg
5698 in that this SET might be dead, so ignore it in TESTREG.
5699 but in some other ways it is like using the reg.
5700
5701 Storing in a SUBREG or a bit field is like storing the entire
5702 register in that if the register's value is not used
5703 then this SET is not needed. */
5704 while (GET_CODE (testreg) == STRICT_LOW_PART
5705 || GET_CODE (testreg) == ZERO_EXTRACT
5706 || GET_CODE (testreg) == SIGN_EXTRACT
5707 || GET_CODE (testreg) == SUBREG)
5708 {
02188693 5709#ifdef CLASS_CANNOT_CHANGE_MODE
88285acf
RK
5710 if (GET_CODE (testreg) == SUBREG
5711 && GET_CODE (SUBREG_REG (testreg)) == REG
5712 && REGNO (SUBREG_REG (testreg)) >= FIRST_PSEUDO_REGISTER
02188693
RH
5713 && CLASS_CANNOT_CHANGE_MODE_P (GET_MODE (SUBREG_REG (testreg)),
5714 GET_MODE (testreg)))
5715 REG_CHANGES_MODE (REGNO (SUBREG_REG (testreg))) = 1;
5716#endif
88285acf 5717
d7429b6a
RK
5718 /* Modifying a single register in an alternate mode
5719 does not use any of the old value. But these other
5720 ways of storing in a register do use the old value. */
5721 if (GET_CODE (testreg) == SUBREG
5722 && !(REG_SIZE (SUBREG_REG (testreg)) > REG_SIZE (testreg)))
5723 ;
5724 else
5725 mark_dest = 1;
5726
5727 testreg = XEXP (testreg, 0);
5728 }
5729
62828c00
RH
5730 /* If this is a store into a register, recursively scan the
5731 value being stored. */
d7429b6a 5732
86465af7
DM
5733 if ((GET_CODE (testreg) == PARALLEL
5734 && GET_MODE (testreg) == BLKmode)
5735 || (GET_CODE (testreg) == REG
62828c00
RH
5736 && (regno = REGNO (testreg),
5737 ! (regno == FRAME_POINTER_REGNUM
5738 && (! reload_completed || frame_pointer_needed)))
73a187c1 5739#if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
e4b8a413
JW
5740 && ! (regno == HARD_FRAME_POINTER_REGNUM
5741 && (! reload_completed || frame_pointer_needed))
73a187c1 5742#endif
d7e4fe8b 5743#if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
86465af7 5744 && ! (regno == ARG_POINTER_REGNUM && fixed_regs[regno])
d7e4fe8b 5745#endif
86465af7 5746 ))
d7429b6a 5747 {
d7429b6a 5748 if (mark_dest)
8e3f9094
RH
5749 mark_used_regs (pbi, SET_DEST (x), cond, insn);
5750 mark_used_regs (pbi, SET_SRC (x), cond, insn);
d7429b6a
RK
5751 return;
5752 }
5753 }
5754 break;
5755
40b5a77c
JL
5756 case ASM_OPERANDS:
5757 case UNSPEC_VOLATILE:
5758 case TRAP_IF:
5759 case ASM_INPUT:
5760 {
5761 /* Traditional and volatile asm instructions must be considered to use
5762 and clobber all hard registers, all pseudo-registers and all of
5763 memory. So must TRAP_IF and UNSPEC_VOLATILE operations.
5764
5765 Consider for instance a volatile asm that changes the fpu rounding
5766 mode. An insn should not be moved across this even if it only uses
c9bacfdb 5767 pseudo-regs because it might give an incorrectly rounded result.
40b5a77c
JL
5768
5769 ?!? Unfortunately, marking all hard registers as live causes massive
5770 problems for the register allocator and marking all pseudos as live
5771 creates mountains of uninitialized variable warnings.
5772
5773 So for now, just clear the memory set list and mark any regs
5774 we can find in ASM_OPERANDS as used. */
5775 if (code != ASM_OPERANDS || MEM_VOLATILE_P (x))
62828c00 5776 free_EXPR_LIST_list (&pbi->mem_set_list);
40b5a77c 5777
c9bacfdb 5778 /* For all ASM_OPERANDS, we must traverse the vector of input operands.
40b5a77c
JL
5779 We can not just fall through here since then we would be confused
5780 by the ASM_INPUT rtx inside ASM_OPERANDS, which do not indicate
5781 traditional asms unlike their normal usage. */
5782 if (code == ASM_OPERANDS)
5783 {
5784 int j;
5785
5786 for (j = 0; j < ASM_OPERANDS_INPUT_LENGTH (x); j++)
8e3f9094 5787 mark_used_regs (pbi, ASM_OPERANDS_INPUT (x, j), cond, insn);
40b5a77c
JL
5788 }
5789 break;
5790 }
5791
62828c00
RH
5792 case COND_EXEC:
5793 if (cond != NULL_RTX)
5794 abort ();
5795
8e3f9094 5796 mark_used_regs (pbi, COND_EXEC_TEST (x), NULL_RTX, insn);
62828c00
RH
5797
5798 cond = COND_EXEC_TEST (x);
5799 x = COND_EXEC_CODE (x);
5800 goto retry;
5801
4e872036
AS
5802 case PHI:
5803 /* We _do_not_ want to scan operands of phi nodes. Operands of
5804 a phi function are evaluated only when control reaches this
5805 block along a particular edge. Therefore, regs that appear
5806 as arguments to phi should not be added to the global live at
5807 start. */
5808 return;
40b5a77c 5809
e9a25f70
JL
5810 default:
5811 break;
d7429b6a
RK
5812 }
5813
5814 /* Recursively scan the operands of this expression. */
5815
5816 {
6f7d635c 5817 register const char *fmt = GET_RTX_FORMAT (code);
d7429b6a 5818 register int i;
c9bacfdb 5819
d7429b6a
RK
5820 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
5821 {
5822 if (fmt[i] == 'e')
5823 {
5824 /* Tail recursive case: save a function call level. */
5825 if (i == 0)
5826 {
5827 x = XEXP (x, 0);
5828 goto retry;
5829 }
8e3f9094 5830 mark_used_regs (pbi, XEXP (x, i), cond, insn);
d7429b6a
RK
5831 }
5832 else if (fmt[i] == 'E')
5833 {
5834 register int j;
5835 for (j = 0; j < XVECLEN (x, i); j++)
8e3f9094 5836 mark_used_regs (pbi, XVECEXP (x, i, j), cond, insn);
d7429b6a
RK
5837 }
5838 }
5839 }
5840}
5841\f
5842#ifdef AUTO_INC_DEC
5843
5844static int
62828c00
RH
5845try_pre_increment_1 (pbi, insn)
5846 struct propagate_block_info *pbi;
d7429b6a
RK
5847 rtx insn;
5848{
5849 /* Find the next use of this reg. If in same basic block,
5850 make it do pre-increment or pre-decrement if appropriate. */
956d6950 5851 rtx x = single_set (insn);
5f4f0e22 5852 HOST_WIDE_INT amount = ((GET_CODE (SET_SRC (x)) == PLUS ? 1 : -1)
c9bacfdb 5853 * INTVAL (XEXP (SET_SRC (x), 1)));
d7429b6a 5854 int regno = REGNO (SET_DEST (x));
62828c00 5855 rtx y = pbi->reg_next_use[regno];
d7429b6a 5856 if (y != 0
24948ccc 5857 && SET_DEST (x) != stack_pointer_rtx
d7429b6a 5858 && BLOCK_NUM (y) == BLOCK_NUM (insn)
89861c38 5859 /* Don't do this if the reg dies, or gets set in y; a standard addressing
0f41302f 5860 mode would be better. */
89861c38 5861 && ! dead_or_set_p (y, SET_DEST (x))
956d6950 5862 && try_pre_increment (y, SET_DEST (x), amount))
d7429b6a 5863 {
1288c070
RH
5864 /* We have found a suitable auto-increment and already changed
5865 insn Y to do it. So flush this increment instruction. */
5866 propagate_block_delete_insn (pbi->bb, insn);
5867
5868 /* Count a reference to this reg for the increment insn we are
5869 deleting. When a reg is incremented, spilling it is worse,
5870 so we want to make that less likely. */
d7429b6a
RK
5871 if (regno >= FIRST_PSEUDO_REGISTER)
5872 {
ebfe71a8
NC
5873 REG_N_REFS (regno) += (optimize_size ? 1
5874 : pbi->bb->loop_depth + 1);
b1f21e0a 5875 REG_N_SETS (regno)++;
d7429b6a 5876 }
1288c070
RH
5877
5878 /* Flush any remembered memories depending on the value of
5879 the incremented register. */
5880 invalidate_mems_from_set (pbi, SET_DEST (x));
5881
d7429b6a
RK
5882 return 1;
5883 }
5884 return 0;
5885}
5886
5887/* Try to change INSN so that it does pre-increment or pre-decrement
5888 addressing on register REG in order to add AMOUNT to REG.
5889 AMOUNT is negative for pre-decrement.
5890 Returns 1 if the change could be made.
5891 This checks all about the validity of the result of modifying INSN. */
5892
5893static int
5894try_pre_increment (insn, reg, amount)
5895 rtx insn, reg;
5f4f0e22 5896 HOST_WIDE_INT amount;
d7429b6a
RK
5897{
5898 register rtx use;
5899
5900 /* Nonzero if we can try to make a pre-increment or pre-decrement.
5901 For example, addl $4,r1; movl (r1),... can become movl +(r1),... */
5902 int pre_ok = 0;
5903 /* Nonzero if we can try to make a post-increment or post-decrement.
5904 For example, addl $4,r1; movl -4(r1),... can become movl (r1)+,...
5905 It is possible for both PRE_OK and POST_OK to be nonzero if the machine
5906 supports both pre-inc and post-inc, or both pre-dec and post-dec. */
5907 int post_ok = 0;
5908
5909 /* Nonzero if the opportunity actually requires post-inc or post-dec. */
5910 int do_post = 0;
5911
5912 /* From the sign of increment, see which possibilities are conceivable
5913 on this target machine. */
940da324 5914 if (HAVE_PRE_INCREMENT && amount > 0)
d7429b6a 5915 pre_ok = 1;
940da324 5916 if (HAVE_POST_INCREMENT && amount > 0)
d7429b6a 5917 post_ok = 1;
d7429b6a 5918
940da324 5919 if (HAVE_PRE_DECREMENT && amount < 0)
d7429b6a 5920 pre_ok = 1;
940da324 5921 if (HAVE_POST_DECREMENT && amount < 0)
d7429b6a 5922 post_ok = 1;
d7429b6a
RK
5923
5924 if (! (pre_ok || post_ok))
5925 return 0;
5926
5927 /* It is not safe to add a side effect to a jump insn
5928 because if the incremented register is spilled and must be reloaded
5929 there would be no way to store the incremented value back in memory. */
5930
5931 if (GET_CODE (insn) == JUMP_INSN)
5932 return 0;
5933
5934 use = 0;
5935 if (pre_ok)
5936 use = find_use_as_address (PATTERN (insn), reg, 0);
5937 if (post_ok && (use == 0 || use == (rtx) 1))
5938 {
5939 use = find_use_as_address (PATTERN (insn), reg, -amount);
5940 do_post = 1;
5941 }
5942
5943 if (use == 0 || use == (rtx) 1)
5944 return 0;
5945
5946 if (GET_MODE_SIZE (GET_MODE (use)) != (amount > 0 ? amount : - amount))
5947 return 0;
5948
a0fbc3a9
SC
5949 /* See if this combination of instruction and addressing mode exists. */
5950 if (! validate_change (insn, &XEXP (use, 0),
38a448ca
RH
5951 gen_rtx_fmt_e (amount > 0
5952 ? (do_post ? POST_INC : PRE_INC)
5953 : (do_post ? POST_DEC : PRE_DEC),
5954 Pmode, reg), 0))
a0fbc3a9 5955 return 0;
d7429b6a
RK
5956
5957 /* Record that this insn now has an implicit side effect on X. */
d3a923ee 5958 REG_NOTES (insn) = alloc_EXPR_LIST (REG_INC, reg, REG_NOTES (insn));
d7429b6a
RK
5959 return 1;
5960}
5961
5962#endif /* AUTO_INC_DEC */
5963\f
5964/* Find the place in the rtx X where REG is used as a memory address.
5965 Return the MEM rtx that so uses it.
5966 If PLUSCONST is nonzero, search instead for a memory address equivalent to
5967 (plus REG (const_int PLUSCONST)).
5968
5969 If such an address does not appear, return 0.
5970 If REG appears more than once, or is used other than in such an address,
5971 return (rtx)1. */
5972
8c660648 5973rtx
d7429b6a
RK
5974find_use_as_address (x, reg, plusconst)
5975 register rtx x;
5976 rtx reg;
e658434c 5977 HOST_WIDE_INT plusconst;
d7429b6a
RK
5978{
5979 enum rtx_code code = GET_CODE (x);
6f7d635c 5980 const char *fmt = GET_RTX_FORMAT (code);
d7429b6a
RK
5981 register int i;
5982 register rtx value = 0;
5983 register rtx tem;
5984
5985 if (code == MEM && XEXP (x, 0) == reg && plusconst == 0)
5986 return x;
5987
5988 if (code == MEM && GET_CODE (XEXP (x, 0)) == PLUS
5989 && XEXP (XEXP (x, 0), 0) == reg
5990 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
5991 && INTVAL (XEXP (XEXP (x, 0), 1)) == plusconst)
5992 return x;
5993
5994 if (code == SIGN_EXTRACT || code == ZERO_EXTRACT)
5995 {
5996 /* If REG occurs inside a MEM used in a bit-field reference,
5997 that is unacceptable. */
5998 if (find_use_as_address (XEXP (x, 0), reg, 0) != 0)
6fa5c106 5999 return (rtx) (HOST_WIDE_INT) 1;
d7429b6a
RK
6000 }
6001
6002 if (x == reg)
6fa5c106 6003 return (rtx) (HOST_WIDE_INT) 1;
d7429b6a
RK
6004
6005 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
6006 {
6007 if (fmt[i] == 'e')
6008 {
6009 tem = find_use_as_address (XEXP (x, i), reg, plusconst);
6010 if (value == 0)
6011 value = tem;
6012 else if (tem != 0)
6fa5c106 6013 return (rtx) (HOST_WIDE_INT) 1;
d7429b6a 6014 }
d4757e6a 6015 else if (fmt[i] == 'E')
d7429b6a
RK
6016 {
6017 register int j;
6018 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
6019 {
6020 tem = find_use_as_address (XVECEXP (x, i, j), reg, plusconst);
6021 if (value == 0)
6022 value = tem;
6023 else if (tem != 0)
6fa5c106 6024 return (rtx) (HOST_WIDE_INT) 1;
d7429b6a
RK
6025 }
6026 }
6027 }
6028
6029 return value;
6030}
6031\f
6032/* Write information about registers and basic blocks into FILE.
6033 This is part of making a debugging dump. */
6034
b7ba4d8d
ZW
6035void
6036dump_regset (r, outf)
6037 regset r;
6038 FILE *outf;
6039{
6040 int i;
6041 if (r == NULL)
6042 {
6043 fputs (" (nil)", outf);
6044 return;
6045 }
6046
6047 EXECUTE_IF_SET_IN_REG_SET (r, 0, i,
6048 {
6049 fprintf (outf, " %d", i);
6050 if (i < FIRST_PSEUDO_REGISTER)
6051 fprintf (outf, " [%s]",
6052 reg_names[i]);
6053 });
6054}
6055
6056void
6057debug_regset (r)
6058 regset r;
6059{
6060 dump_regset (r, stderr);
6061 putc ('\n', stderr);
6062}
6063
d7429b6a
RK
6064void
6065dump_flow_info (file)
6066 FILE *file;
6067{
6068 register int i;
6f7d635c 6069 static const char * const reg_class_names[] = REG_CLASS_NAMES;
d7429b6a
RK
6070
6071 fprintf (file, "%d registers.\n", max_regno);
d7429b6a 6072 for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
b1f21e0a 6073 if (REG_N_REFS (i))
d7429b6a 6074 {
e4600702 6075 enum reg_class class, altclass;
d7429b6a 6076 fprintf (file, "\nRegister %d used %d times across %d insns",
b1f21e0a
MM
6077 i, REG_N_REFS (i), REG_LIVE_LENGTH (i));
6078 if (REG_BASIC_BLOCK (i) >= 0)
6079 fprintf (file, " in block %d", REG_BASIC_BLOCK (i));
6fc4610b 6080 if (REG_N_SETS (i))
c9bacfdb
KH
6081 fprintf (file, "; set %d time%s", REG_N_SETS (i),
6082 (REG_N_SETS (i) == 1) ? "" : "s");
6fc4610b 6083 if (REG_USERVAR_P (regno_reg_rtx[i]))
c9bacfdb 6084 fprintf (file, "; user var");
b1f21e0a
MM
6085 if (REG_N_DEATHS (i) != 1)
6086 fprintf (file, "; dies in %d places", REG_N_DEATHS (i));
6087 if (REG_N_CALLS_CROSSED (i) == 1)
d7429b6a 6088 fprintf (file, "; crosses 1 call");
b1f21e0a
MM
6089 else if (REG_N_CALLS_CROSSED (i))
6090 fprintf (file, "; crosses %d calls", REG_N_CALLS_CROSSED (i));
d7429b6a
RK
6091 if (PSEUDO_REGNO_BYTES (i) != UNITS_PER_WORD)
6092 fprintf (file, "; %d bytes", PSEUDO_REGNO_BYTES (i));
6093 class = reg_preferred_class (i);
e4600702
RK
6094 altclass = reg_alternate_class (i);
6095 if (class != GENERAL_REGS || altclass != ALL_REGS)
d7429b6a 6096 {
e4600702
RK
6097 if (altclass == ALL_REGS || class == ALL_REGS)
6098 fprintf (file, "; pref %s", reg_class_names[(int) class]);
6099 else if (altclass == NO_REGS)
d7429b6a
RK
6100 fprintf (file, "; %s or none", reg_class_names[(int) class]);
6101 else
e4600702
RK
6102 fprintf (file, "; pref %s, else %s",
6103 reg_class_names[(int) class],
6104 reg_class_names[(int) altclass]);
d7429b6a 6105 }
3502dc9c 6106 if (REG_POINTER (regno_reg_rtx[i]))
d7429b6a
RK
6107 fprintf (file, "; pointer");
6108 fprintf (file, ".\n");
6109 }
e881bb1b 6110
d3a923ee 6111 fprintf (file, "\n%d basic blocks, %d edges.\n", n_basic_blocks, n_edges);
e881bb1b
RH
6112 for (i = 0; i < n_basic_blocks; i++)
6113 {
6114 register basic_block bb = BASIC_BLOCK (i);
e881bb1b
RH
6115 register edge e;
6116
51891abe
JH
6117 fprintf (file, "\nBasic block %d: first insn %d, last %d, loop_depth %d, count %d.\n",
6118 i, INSN_UID (bb->head), INSN_UID (bb->end), bb->loop_depth, bb->count);
e881bb1b
RH
6119
6120 fprintf (file, "Predecessors: ");
c9bacfdb 6121 for (e = bb->pred; e; e = e->pred_next)
e881bb1b
RH
6122 dump_edge_info (file, e, 0);
6123
6124 fprintf (file, "\nSuccessors: ");
c9bacfdb 6125 for (e = bb->succ; e; e = e->succ_next)
e881bb1b
RH
6126 dump_edge_info (file, e, 1);
6127
6128 fprintf (file, "\nRegisters live at start:");
b7ba4d8d 6129 dump_regset (bb->global_live_at_start, file);
e881bb1b
RH
6130
6131 fprintf (file, "\nRegisters live at end:");
b7ba4d8d 6132 dump_regset (bb->global_live_at_end, file);
e881bb1b 6133
c9bacfdb 6134 putc ('\n', file);
e881bb1b
RH
6135 }
6136
c9bacfdb 6137 putc ('\n', file);
e881bb1b
RH
6138}
6139
93cba993
RH
6140void
6141debug_flow_info ()
6142{
6143 dump_flow_info (stderr);
6144}
6145
e881bb1b
RH
6146static void
6147dump_edge_info (file, e, do_succ)
6148 FILE *file;
6149 edge e;
6150 int do_succ;
6151{
6152 basic_block side = (do_succ ? e->dest : e->src);
6153
6154 if (side == ENTRY_BLOCK_PTR)
6155 fputs (" ENTRY", file);
6156 else if (side == EXIT_BLOCK_PTR)
6157 fputs (" EXIT", file);
6158 else
6159 fprintf (file, " %d", side->index);
6160
51891abe
JH
6161 if (e->count)
6162 fprintf (file, " count:%d", e->count);
6163
e881bb1b
RH
6164 if (e->flags)
6165 {
6f7d635c 6166 static const char * const bitnames[] = {
e881bb1b
RH
6167 "fallthru", "crit", "ab", "abcall", "eh", "fake"
6168 };
6169 int comma = 0;
6170 int i, flags = e->flags;
6171
6172 fputc (' ', file);
6173 fputc ('(', file);
6174 for (i = 0; flags; i++)
6175 if (flags & (1 << i))
6176 {
6177 flags &= ~(1 << i);
6178
6179 if (comma)
6180 fputc (',', file);
9a56f4f6 6181 if (i < (int) ARRAY_SIZE (bitnames))
e881bb1b
RH
6182 fputs (bitnames[i], file);
6183 else
6184 fprintf (file, "%d", i);
6185 comma = 1;
6186 }
6187 fputc (')', file);
6188 }
d7429b6a 6189}
3e28fe44 6190\f
b7ba4d8d 6191/* Print out one basic block with live information at start and end. */
c9bacfdb 6192
b7ba4d8d
ZW
6193void
6194dump_bb (bb, outf)
6195 basic_block bb;
6196 FILE *outf;
6197{
6198 rtx insn;
6199 rtx last;
6200 edge e;
6201
51891abe
JH
6202 fprintf (outf, ";; Basic block %d, loop depth %d, count %d",
6203 bb->index, bb->loop_depth, bb->count);
b7ba4d8d
ZW
6204 if (bb->eh_beg != -1 || bb->eh_end != -1)
6205 fprintf (outf, ", eh regions %d/%d", bb->eh_beg, bb->eh_end);
6206 putc ('\n', outf);
6207
6208 fputs (";; Predecessors: ", outf);
c9bacfdb 6209 for (e = bb->pred; e; e = e->pred_next)
b7ba4d8d
ZW
6210 dump_edge_info (outf, e, 0);
6211 putc ('\n', outf);
6212
6213 fputs (";; Registers live at start:", outf);
6214 dump_regset (bb->global_live_at_start, outf);
6215 putc ('\n', outf);
6216
6217 for (insn = bb->head, last = NEXT_INSN (bb->end);
6218 insn != last;
6219 insn = NEXT_INSN (insn))
6220 print_rtl_single (outf, insn);
6221
6222 fputs (";; Registers live at end:", outf);
6223 dump_regset (bb->global_live_at_end, outf);
6224 putc ('\n', outf);
6225
6226 fputs (";; Successors: ", outf);
6227 for (e = bb->succ; e; e = e->succ_next)
6228 dump_edge_info (outf, e, 1);
6229 putc ('\n', outf);
6230}
6231
6232void
6233debug_bb (bb)
6234 basic_block bb;
6235{
6236 dump_bb (bb, stderr);
6237}
6238
6239void
6240debug_bb_n (n)
6241 int n;
6242{
c9bacfdb 6243 dump_bb (BASIC_BLOCK (n), stderr);
b7ba4d8d
ZW
6244}
6245
3e28fe44
MM
6246/* Like print_rtl, but also print out live information for the start of each
6247 basic block. */
6248
6249void
6250print_rtl_with_bb (outf, rtx_first)
6251 FILE *outf;
6252 rtx rtx_first;
6253{
6254 register rtx tmp_rtx;
6255
6256 if (rtx_first == 0)
6257 fprintf (outf, "(nil)\n");
3e28fe44
MM
6258 else
6259 {
e881bb1b 6260 int i;
3e28fe44
MM
6261 enum bb_state { NOT_IN_BB, IN_ONE_BB, IN_MULTIPLE_BB };
6262 int max_uid = get_max_uid ();
54ea1de9 6263 basic_block *start = (basic_block *)
67289ea6 6264 xcalloc (max_uid, sizeof (basic_block));
54ea1de9 6265 basic_block *end = (basic_block *)
67289ea6 6266 xcalloc (max_uid, sizeof (basic_block));
2a92c071 6267 enum bb_state *in_bb_p = (enum bb_state *)
67289ea6 6268 xcalloc (max_uid, sizeof (enum bb_state));
3e28fe44 6269
e881bb1b 6270 for (i = n_basic_blocks - 1; i >= 0; i--)
3e28fe44 6271 {
e881bb1b 6272 basic_block bb = BASIC_BLOCK (i);
3e28fe44 6273 rtx x;
e881bb1b
RH
6274
6275 start[INSN_UID (bb->head)] = bb;
6276 end[INSN_UID (bb->end)] = bb;
6277 for (x = bb->head; x != NULL_RTX; x = NEXT_INSN (x))
3e28fe44 6278 {
e881bb1b 6279 enum bb_state state = IN_MULTIPLE_BB;
c9bacfdb 6280 if (in_bb_p[INSN_UID (x)] == NOT_IN_BB)
e881bb1b 6281 state = IN_ONE_BB;
c9bacfdb 6282 in_bb_p[INSN_UID (x)] = state;
e881bb1b
RH
6283
6284 if (x == bb->end)
3e28fe44
MM
6285 break;
6286 }
6287 }
6288
6289 for (tmp_rtx = rtx_first; NULL != tmp_rtx; tmp_rtx = NEXT_INSN (tmp_rtx))
6290 {
b707b450 6291 int did_output;
e881bb1b 6292 basic_block bb;
b707b450 6293
e881bb1b 6294 if ((bb = start[INSN_UID (tmp_rtx)]) != NULL)
3e28fe44
MM
6295 {
6296 fprintf (outf, ";; Start of basic block %d, registers live:",
e881bb1b 6297 bb->index);
b7ba4d8d 6298 dump_regset (bb->global_live_at_start, outf);
3e28fe44
MM
6299 putc ('\n', outf);
6300 }
6301
c9bacfdb 6302 if (in_bb_p[INSN_UID (tmp_rtx)] == NOT_IN_BB
3e28fe44 6303 && GET_CODE (tmp_rtx) != NOTE
d29c259b 6304 && GET_CODE (tmp_rtx) != BARRIER)
3e28fe44 6305 fprintf (outf, ";; Insn is not within a basic block\n");
c9bacfdb 6306 else if (in_bb_p[INSN_UID (tmp_rtx)] == IN_MULTIPLE_BB)
3e28fe44
MM
6307 fprintf (outf, ";; Insn is in multiple basic blocks\n");
6308
b707b450 6309 did_output = print_rtl_single (outf, tmp_rtx);
3e28fe44 6310
e881bb1b 6311 if ((bb = end[INSN_UID (tmp_rtx)]) != NULL)
62828c00
RH
6312 {
6313 fprintf (outf, ";; End of basic block %d, registers live:\n",
6314 bb->index);
6315 dump_regset (bb->global_live_at_end, outf);
6316 putc ('\n', outf);
6317 }
3e28fe44 6318
b707b450 6319 if (did_output)
9ec36da5 6320 putc ('\n', outf);
3e28fe44 6321 }
67289ea6
MM
6322
6323 free (start);
6324 free (end);
6325 free (in_bb_p);
3e28fe44 6326 }
c5c76735
JL
6327
6328 if (current_function_epilogue_delay_list != 0)
6329 {
6330 fprintf (outf, "\n;; Insns in epilogue delay list:\n\n");
6331 for (tmp_rtx = current_function_epilogue_delay_list; tmp_rtx != 0;
6332 tmp_rtx = XEXP (tmp_rtx, 1))
6333 print_rtl_single (outf, XEXP (tmp_rtx, 0));
6334 }
3e28fe44 6335}
5ece9746 6336
f9b697bf
BS
6337/* Dump the rtl into the current debugging dump file, then abort. */
6338static void
c3ff75c4 6339print_rtl_and_abort ()
f9b697bf
BS
6340{
6341 if (rtl_dump_file)
6342 {
6343 print_rtl_with_bb (rtl_dump_file, get_insns ());
6344 fclose (rtl_dump_file);
6345 }
6346 abort ();
6347}
6348
4c649323
JL
6349/* Recompute register set/reference counts immediately prior to register
6350 allocation.
6351
6352 This avoids problems with set/reference counts changing to/from values
6353 which have special meanings to the register allocators.
6354
6355 Additionally, the reference counts are the primary component used by the
6356 register allocators to prioritize pseudos for allocation to hard regs.
6357 More accurate reference counts generally lead to better register allocation.
6358
213c4983 6359 F is the first insn to be scanned.
9b15c17f 6360
213c4983 6361 LOOP_STEP denotes how much loop_depth should be incremented per
9b15c17f
RH
6362 loop nesting level in order to increase the ref count more for
6363 references in a loop.
213c4983 6364
4c649323
JL
6365 It might be worthwhile to update REG_LIVE_LENGTH, REG_BASIC_BLOCK and
6366 possibly other information which is used by the register allocators. */
6367
762a1d90 6368void
213c4983 6369recompute_reg_usage (f, loop_step)
272df862
KG
6370 rtx f ATTRIBUTE_UNUSED;
6371 int loop_step ATTRIBUTE_UNUSED;
4c649323 6372{
f134997f
RH
6373 allocate_reg_life_data ();
6374 update_life_info (NULL, UPDATE_LIFE_LOCAL, PROP_REG_INFO);
4c649323 6375}
e881bb1b 6376
d3a923ee 6377/* Optionally removes all the REG_DEAD and REG_UNUSED notes from a set of
3071fab5
RH
6378 blocks. If BLOCKS is NULL, assume the universal set. Returns a count
6379 of the number of registers that died. */
d3a923ee
RH
6380
6381int
6382count_or_remove_death_notes (blocks, kill)
c9bacfdb
KH
6383 sbitmap blocks;
6384 int kill;
d3a923ee
RH
6385{
6386 int i, count = 0;
6387
6388 for (i = n_basic_blocks - 1; i >= 0; --i)
6389 {
6390 basic_block bb;
6391 rtx insn;
6392
3071fab5 6393 if (blocks && ! TEST_BIT (blocks, i))
d3a923ee
RH
6394 continue;
6395
6396 bb = BASIC_BLOCK (i);
6397
c9bacfdb 6398 for (insn = bb->head;; insn = NEXT_INSN (insn))
d3a923ee 6399 {
2c3c49de 6400 if (INSN_P (insn))
d3a923ee
RH
6401 {
6402 rtx *pprev = &REG_NOTES (insn);
6403 rtx link = *pprev;
6404
6405 while (link)
6406 {
6407 switch (REG_NOTE_KIND (link))
6408 {
6409 case REG_DEAD:
6410 if (GET_CODE (XEXP (link, 0)) == REG)
6411 {
6412 rtx reg = XEXP (link, 0);
6413 int n;
6414
6415 if (REGNO (reg) >= FIRST_PSEUDO_REGISTER)
6416 n = 1;
6417 else
6418 n = HARD_REGNO_NREGS (REGNO (reg), GET_MODE (reg));
6419 count += n;
6420 }
c9bacfdb 6421 /* Fall through. */
d3a923ee
RH
6422
6423 case REG_UNUSED:
6424 if (kill)
6425 {
6426 rtx next = XEXP (link, 1);
6427 free_EXPR_LIST_node (link);
c9bacfdb
KH
6428 *pprev = link = next;
6429 break;
d3a923ee 6430 }
c9bacfdb 6431 /* Fall through. */
d3a923ee
RH
6432
6433 default:
6434 pprev = &XEXP (link, 1);
6435 link = *pprev;
6436 break;
6437 }
6438 }
6439 }
6440
6441 if (insn == bb->end)
6442 break;
6443 }
6444 }
6445
6446 return count;
6447}
6448
c586192c
MH
6449
6450/* Update insns block within BB. */
6451
6452void
6453update_bb_for_insn (bb)
6454 basic_block bb;
6455{
6456 rtx insn;
6457
6458 if (! basic_block_for_insn)
6459 return;
6460
6461 for (insn = bb->head; ; insn = NEXT_INSN (insn))
6462 {
6463 set_block_for_insn (insn, bb);
6464
6465 if (insn == bb->end)
6466 break;
6467 }
6468}
6469
6470
e881bb1b
RH
6471/* Record INSN's block as BB. */
6472
6473void
6474set_block_for_insn (insn, bb)
6475 rtx insn;
6476 basic_block bb;
6477{
6478 size_t uid = INSN_UID (insn);
6479 if (uid >= basic_block_for_insn->num_elements)
6480 {
6481 int new_size;
c9bacfdb 6482
e881bb1b
RH
6483 /* Add one-eighth the size so we don't keep calling xrealloc. */
6484 new_size = uid + (uid + 7) / 8;
6485
6486 VARRAY_GROW (basic_block_for_insn, new_size);
6487 }
6488 VARRAY_BB (basic_block_for_insn, uid) = bb;
6489}
6490
6491/* Record INSN's block number as BB. */
6492/* ??? This has got to go. */
6493
6494void
6495set_block_num (insn, bb)
6496 rtx insn;
6497 int bb;
6498{
6499 set_block_for_insn (insn, BASIC_BLOCK (bb));
6500}
34487bf8 6501\f
d3a923ee
RH
6502/* Verify the CFG consistency. This function check some CFG invariants and
6503 aborts when something is wrong. Hope that this function will help to
6504 convert many optimization passes to preserve CFG consistent.
f2a1bc02 6505
c9bacfdb 6506 Currently it does following checks:
f2a1bc02 6507
d3a923ee
RH
6508 - test head/end pointers
6509 - overlapping of basic blocks
6510 - edge list corectness
6511 - headers of basic blocks (the NOTE_INSN_BASIC_BLOCK note)
6512 - tails of basic blocks (ensure that boundary is necesary)
6513 - scans body of the basic block for JUMP_INSN, CODE_LABEL
6514 and NOTE_INSN_BASIC_BLOCK
c9bacfdb 6515 - check that all insns are in the basic blocks
d3a923ee 6516 (except the switch handling code, barriers and notes)
0edd203b 6517 - check that all returns are followed by barriers
f2a1bc02 6518
d3a923ee
RH
6519 In future it can be extended check a lot of other stuff as well
6520 (reachability of basic blocks, life information, etc. etc.). */
f2a1bc02 6521
d3a923ee
RH
6522void
6523verify_flow_info ()
f2a1bc02 6524{
d3a923ee
RH
6525 const int max_uid = get_max_uid ();
6526 const rtx rtx_first = get_insns ();
6ff71a97 6527 rtx last_head = get_last_insn ();
d3a923ee
RH
6528 basic_block *bb_info;
6529 rtx x;
18ca529b 6530 int i, last_bb_num_seen, num_bb_notes, err = 0;
f2a1bc02 6531
67289ea6 6532 bb_info = (basic_block *) xcalloc (max_uid, sizeof (basic_block));
f2a1bc02 6533
d3a923ee 6534 for (i = n_basic_blocks - 1; i >= 0; i--)
f2a1bc02 6535 {
d3a923ee 6536 basic_block bb = BASIC_BLOCK (i);
6ff71a97
JL
6537 rtx head = bb->head;
6538 rtx end = bb->end;
f2a1bc02 6539
6ff71a97
JL
6540 /* Verify the end of the basic block is in the INSN chain. */
6541 for (x = last_head; x != NULL_RTX; x = PREV_INSN (x))
6542 if (x == end)
d3a923ee
RH
6543 break;
6544 if (!x)
6545 {
6ff71a97
JL
6546 error ("End insn %d for block %d not found in the insn stream.",
6547 INSN_UID (end), bb->index);
d3a923ee
RH
6548 err = 1;
6549 }
f2a1bc02 6550
6ff71a97
JL
6551 /* Work backwards from the end to the head of the basic block
6552 to verify the head is in the RTL chain. */
c9bacfdb 6553 for (; x != NULL_RTX; x = PREV_INSN (x))
f2a1bc02 6554 {
6ff71a97
JL
6555 /* While walking over the insn chain, verify insns appear
6556 in only one basic block and initialize the BB_INFO array
6557 used by other passes. */
d3a923ee 6558 if (bb_info[INSN_UID (x)] != NULL)
f2a1bc02 6559 {
d3a923ee
RH
6560 error ("Insn %d is in multiple basic blocks (%d and %d)",
6561 INSN_UID (x), bb->index, bb_info[INSN_UID (x)]->index);
6562 err = 1;
f2a1bc02 6563 }
d3a923ee
RH
6564 bb_info[INSN_UID (x)] = bb;
6565
6ff71a97 6566 if (x == head)
f2a1bc02
BM
6567 break;
6568 }
d3a923ee
RH
6569 if (!x)
6570 {
6ff71a97
JL
6571 error ("Head insn %d for block %d not found in the insn stream.",
6572 INSN_UID (head), bb->index);
d3a923ee
RH
6573 err = 1;
6574 }
6ff71a97
JL
6575
6576 last_head = x;
f2a1bc02 6577 }
f2a1bc02 6578
d3a923ee
RH
6579 /* Now check the basic blocks (boundaries etc.) */
6580 for (i = n_basic_blocks - 1; i >= 0; i--)
f2a1bc02 6581 {
d3a923ee
RH
6582 basic_block bb = BASIC_BLOCK (i);
6583 /* Check corectness of edge lists */
6584 edge e;
f2a1bc02 6585
d3a923ee
RH
6586 e = bb->succ;
6587 while (e)
f2a1bc02 6588 {
d3a923ee 6589 if (e->src != bb)
f2a1bc02 6590 {
c9bacfdb
KH
6591 fprintf (stderr,
6592 "verify_flow_info: Basic block %d succ edge is corrupted\n",
d3a923ee
RH
6593 bb->index);
6594 fprintf (stderr, "Predecessor: ");
6595 dump_edge_info (stderr, e, 0);
6596 fprintf (stderr, "\nSuccessor: ");
6597 dump_edge_info (stderr, e, 1);
6598 fflush (stderr);
6599 err = 1;
f2a1bc02 6600 }
d3a923ee 6601 if (e->dest != EXIT_BLOCK_PTR)
f2a1bc02 6602 {
d3a923ee
RH
6603 edge e2 = e->dest->pred;
6604 while (e2 && e2 != e)
6605 e2 = e2->pred_next;
6606 if (!e2)
6607 {
6608 error ("Basic block %i edge lists are corrupted", bb->index);
6609 err = 1;
6610 }
f2a1bc02 6611 }
d3a923ee 6612 e = e->succ_next;
f2a1bc02 6613 }
f2a1bc02 6614
d3a923ee
RH
6615 e = bb->pred;
6616 while (e)
f2a1bc02 6617 {
d3a923ee 6618 if (e->dest != bb)
f2a1bc02 6619 {
d3a923ee
RH
6620 error ("Basic block %d pred edge is corrupted", bb->index);
6621 fputs ("Predecessor: ", stderr);
6622 dump_edge_info (stderr, e, 0);
6623 fputs ("\nSuccessor: ", stderr);
6624 dump_edge_info (stderr, e, 1);
6625 fputc ('\n', stderr);
6626 err = 1;
34487bf8
RH
6627 }
6628 if (e->src != ENTRY_BLOCK_PTR)
6629 {
6630 edge e2 = e->src->succ;
6631 while (e2 && e2 != e)
6632 e2 = e2->succ_next;
6633 if (!e2)
6634 {
987009bf 6635 error ("Basic block %i edge lists are corrupted", bb->index);
d3a923ee 6636 err = 1;
34487bf8
RH
6637 }
6638 }
6639 e = e->pred_next;
6640 }
6641
6642 /* OK pointers are correct. Now check the header of basic
6643 block. It ought to contain optional CODE_LABEL followed
6644 by NOTE_BASIC_BLOCK. */
6645 x = bb->head;
6646 if (GET_CODE (x) == CODE_LABEL)
6647 {
6648 if (bb->end == x)
6649 {
987009bf
ZW
6650 error ("NOTE_INSN_BASIC_BLOCK is missing for block %d",
6651 bb->index);
d3a923ee 6652 err = 1;
34487bf8
RH
6653 }
6654 x = NEXT_INSN (x);
6655 }
589ca5cb 6656 if (!NOTE_INSN_BASIC_BLOCK_P (x) || NOTE_BASIC_BLOCK (x) != bb)
34487bf8 6657 {
987009bf 6658 error ("NOTE_INSN_BASIC_BLOCK is missing for block %d\n",
34487bf8 6659 bb->index);
d3a923ee 6660 err = 1;
34487bf8
RH
6661 }
6662
6663 if (bb->end == x)
6664 {
6665 /* Do checks for empty blocks here */
6666 }
6667 else
6668 {
6669 x = NEXT_INSN (x);
6670 while (x)
6671 {
589ca5cb 6672 if (NOTE_INSN_BASIC_BLOCK_P (x))
34487bf8 6673 {
987009bf 6674 error ("NOTE_INSN_BASIC_BLOCK %d in the middle of basic block %d",
34487bf8 6675 INSN_UID (x), bb->index);
d3a923ee 6676 err = 1;
34487bf8
RH
6677 }
6678
6679 if (x == bb->end)
6680 break;
6681
6682 if (GET_CODE (x) == JUMP_INSN
6683 || GET_CODE (x) == CODE_LABEL
6684 || GET_CODE (x) == BARRIER)
6685 {
987009bf
ZW
6686 error ("In basic block %d:", bb->index);
6687 fatal_insn ("Flow control insn inside a basic block", x);
34487bf8
RH
6688 }
6689
6690 x = NEXT_INSN (x);
6691 }
6692 }
6693 }
6694
18ca529b
JE
6695 last_bb_num_seen = -1;
6696 num_bb_notes = 0;
34487bf8
RH
6697 x = rtx_first;
6698 while (x)
6699 {
589ca5cb 6700 if (NOTE_INSN_BASIC_BLOCK_P (x))
18ca529b
JE
6701 {
6702 basic_block bb = NOTE_BASIC_BLOCK (x);
6703 num_bb_notes++;
6704 if (bb->index != last_bb_num_seen + 1)
6705 fatal ("Basic blocks not numbered consecutively");
6706 last_bb_num_seen = bb->index;
6707 }
6708
34487bf8
RH
6709 if (!bb_info[INSN_UID (x)])
6710 {
6711 switch (GET_CODE (x))
6712 {
6713 case BARRIER:
6714 case NOTE:
6715 break;
6716
6717 case CODE_LABEL:
6718 /* An addr_vec is placed outside any block block. */
6719 if (NEXT_INSN (x)
6720 && GET_CODE (NEXT_INSN (x)) == JUMP_INSN
6721 && (GET_CODE (PATTERN (NEXT_INSN (x))) == ADDR_DIFF_VEC
6722 || GET_CODE (PATTERN (NEXT_INSN (x))) == ADDR_VEC))
6723 {
6724 x = NEXT_INSN (x);
6725 }
6726
6727 /* But in any case, non-deletable labels can appear anywhere. */
6728 break;
6729
6730 default:
987009bf 6731 fatal_insn ("Insn outside basic block", x);
34487bf8
RH
6732 }
6733 }
6734
2c3c49de 6735 if (INSN_P (x)
0edd203b 6736 && GET_CODE (x) == JUMP_INSN
2ca19d5e 6737 && returnjump_p (x) && ! condjump_p (x)
0edd203b
JE
6738 && ! (NEXT_INSN (x) && GET_CODE (NEXT_INSN (x)) == BARRIER))
6739 fatal_insn ("Return not followed by barrier", x);
6740
34487bf8
RH
6741 x = NEXT_INSN (x);
6742 }
d3a923ee 6743
18ca529b
JE
6744 if (num_bb_notes != n_basic_blocks)
6745 fatal ("number of bb notes in insn chain (%d) != n_basic_blocks (%d)",
6746 num_bb_notes, n_basic_blocks);
6747
d3a923ee
RH
6748 if (err)
6749 abort ();
67289ea6
MM
6750
6751 /* Clean up. */
6752 free (bb_info);
34487bf8 6753}
410538ea
AM
6754\f
6755/* Functions to access an edge list with a vector representation.
c9bacfdb 6756 Enough data is kept such that given an index number, the
4eb00163
JO
6757 pred and succ that edge represents can be determined, or
6758 given a pred and a succ, its index number can be returned.
c9bacfdb 6759 This allows algorithms which consume a lot of memory to
410538ea
AM
6760 represent the normally full matrix of edge (pred,succ) with a
6761 single indexed vector, edge (EDGE_INDEX (pred, succ)), with no
6762 wasted space in the client code due to sparse flow graphs. */
6763
c9bacfdb 6764/* This functions initializes the edge list. Basically the entire
410538ea 6765 flowgraph is processed, and all edges are assigned a number,
4eb00163 6766 and the data structure is filled in. */
c9bacfdb 6767
410538ea
AM
6768struct edge_list *
6769create_edge_list ()
6770{
6771 struct edge_list *elist;
6772 edge e;
6773 int num_edges;
e2bef702 6774 int x;
410538ea
AM
6775 int block_count;
6776
6777 block_count = n_basic_blocks + 2; /* Include the entry and exit blocks. */
6778
6779 num_edges = 0;
6780
6781 /* Determine the number of edges in the flow graph by counting successor
6782 edges on each basic block. */
6783 for (x = 0; x < n_basic_blocks; x++)
6784 {
6785 basic_block bb = BASIC_BLOCK (x);
6786
6787 for (e = bb->succ; e; e = e->succ_next)
6788 num_edges++;
6789 }
6790 /* Don't forget successors of the entry block. */
6791 for (e = ENTRY_BLOCK_PTR->succ; e; e = e->succ_next)
6792 num_edges++;
6793
2c852885 6794 elist = (struct edge_list *) xmalloc (sizeof (struct edge_list));
410538ea
AM
6795 elist->num_blocks = block_count;
6796 elist->num_edges = num_edges;
2c852885 6797 elist->index_to_edge = (edge *) xmalloc (sizeof (edge) * num_edges);
410538ea
AM
6798
6799 num_edges = 0;
6800
6801 /* Follow successors of the entry block, and register these edges. */
6802 for (e = ENTRY_BLOCK_PTR->succ; e; e = e->succ_next)
6803 {
6804 elist->index_to_edge[num_edges] = e;
6805 num_edges++;
6806 }
c9bacfdb 6807
410538ea
AM
6808 for (x = 0; x < n_basic_blocks; x++)
6809 {
6810 basic_block bb = BASIC_BLOCK (x);
6811
6812 /* Follow all successors of blocks, and register these edges. */
6813 for (e = bb->succ; e; e = e->succ_next)
6814 {
6815 elist->index_to_edge[num_edges] = e;
6816 num_edges++;
6817 }
6818 }
6819 return elist;
6820}
6821
6822/* This function free's memory associated with an edge list. */
c9bacfdb 6823
410538ea
AM
6824void
6825free_edge_list (elist)
6826 struct edge_list *elist;
6827{
6828 if (elist)
6829 {
6830 free (elist->index_to_edge);
6831 free (elist);
6832 }
6833}
6834
6835/* This function provides debug output showing an edge list. */
c9bacfdb
KH
6836
6837void
410538ea
AM
6838print_edge_list (f, elist)
6839 FILE *f;
6840 struct edge_list *elist;
6841{
6842 int x;
c9bacfdb
KH
6843 fprintf (f, "Compressed edge list, %d BBs + entry & exit, and %d edges\n",
6844 elist->num_blocks - 2, elist->num_edges);
410538ea
AM
6845
6846 for (x = 0; x < elist->num_edges; x++)
6847 {
6848 fprintf (f, " %-4d - edge(", x);
6849 if (INDEX_EDGE_PRED_BB (elist, x) == ENTRY_BLOCK_PTR)
c9bacfdb 6850 fprintf (f, "entry,");
410538ea 6851 else
c9bacfdb 6852 fprintf (f, "%d,", INDEX_EDGE_PRED_BB (elist, x)->index);
410538ea
AM
6853
6854 if (INDEX_EDGE_SUCC_BB (elist, x) == EXIT_BLOCK_PTR)
c9bacfdb 6855 fprintf (f, "exit)\n");
410538ea 6856 else
c9bacfdb 6857 fprintf (f, "%d)\n", INDEX_EDGE_SUCC_BB (elist, x)->index);
410538ea
AM
6858 }
6859}
6860
4eb00163 6861/* This function provides an internal consistency check of an edge list,
c9bacfdb 6862 verifying that all edges are present, and that there are no
410538ea 6863 extra edges. */
c9bacfdb 6864
410538ea
AM
6865void
6866verify_edge_list (f, elist)
6867 FILE *f;
6868 struct edge_list *elist;
6869{
6870 int x, pred, succ, index;
410538ea
AM
6871 edge e;
6872
6873 for (x = 0; x < n_basic_blocks; x++)
6874 {
6875 basic_block bb = BASIC_BLOCK (x);
6876
6877 for (e = bb->succ; e; e = e->succ_next)
6878 {
6879 pred = e->src->index;
6880 succ = e->dest->index;
d675a426 6881 index = EDGE_INDEX (elist, e->src, e->dest);
410538ea
AM
6882 if (index == EDGE_INDEX_NO_EDGE)
6883 {
c9bacfdb 6884 fprintf (f, "*p* No index for edge from %d to %d\n", pred, succ);
410538ea
AM
6885 continue;
6886 }
6887 if (INDEX_EDGE_PRED_BB (elist, index)->index != pred)
6888 fprintf (f, "*p* Pred for index %d should be %d not %d\n",
6889 index, pred, INDEX_EDGE_PRED_BB (elist, index)->index);
6890 if (INDEX_EDGE_SUCC_BB (elist, index)->index != succ)
6891 fprintf (f, "*p* Succ for index %d should be %d not %d\n",
6892 index, succ, INDEX_EDGE_SUCC_BB (elist, index)->index);
6893 }
6894 }
6895 for (e = ENTRY_BLOCK_PTR->succ; e; e = e->succ_next)
6896 {
6897 pred = e->src->index;
6898 succ = e->dest->index;
d675a426 6899 index = EDGE_INDEX (elist, e->src, e->dest);
410538ea
AM
6900 if (index == EDGE_INDEX_NO_EDGE)
6901 {
c9bacfdb 6902 fprintf (f, "*p* No index for edge from %d to %d\n", pred, succ);
410538ea
AM
6903 continue;
6904 }
6905 if (INDEX_EDGE_PRED_BB (elist, index)->index != pred)
6906 fprintf (f, "*p* Pred for index %d should be %d not %d\n",
6907 index, pred, INDEX_EDGE_PRED_BB (elist, index)->index);
6908 if (INDEX_EDGE_SUCC_BB (elist, index)->index != succ)
6909 fprintf (f, "*p* Succ for index %d should be %d not %d\n",
6910 index, succ, INDEX_EDGE_SUCC_BB (elist, index)->index);
6911 }
6912 /* We've verified that all the edges are in the list, no lets make sure
6913 there are no spurious edges in the list. */
c9bacfdb
KH
6914
6915 for (pred = 0; pred < n_basic_blocks; pred++)
6916 for (succ = 0; succ < n_basic_blocks; succ++)
410538ea 6917 {
c9bacfdb
KH
6918 basic_block p = BASIC_BLOCK (pred);
6919 basic_block s = BASIC_BLOCK (succ);
410538ea 6920
c9bacfdb 6921 int found_edge = 0;
410538ea 6922
c9bacfdb
KH
6923 for (e = p->succ; e; e = e->succ_next)
6924 if (e->dest == s)
410538ea
AM
6925 {
6926 found_edge = 1;
6927 break;
6928 }
c9bacfdb
KH
6929 for (e = s->pred; e; e = e->pred_next)
6930 if (e->src == p)
410538ea
AM
6931 {
6932 found_edge = 1;
6933 break;
6934 }
c9bacfdb 6935 if (EDGE_INDEX (elist, BASIC_BLOCK (pred), BASIC_BLOCK (succ))
d675a426 6936 == EDGE_INDEX_NO_EDGE && found_edge != 0)
410538ea 6937 fprintf (f, "*** Edge (%d, %d) appears to not have an index\n",
c9bacfdb
KH
6938 pred, succ);
6939 if (EDGE_INDEX (elist, BASIC_BLOCK (pred), BASIC_BLOCK (succ))
d675a426 6940 != EDGE_INDEX_NO_EDGE && found_edge == 0)
410538ea 6941 fprintf (f, "*** Edge (%d, %d) has index %d, but there is no edge\n",
c9bacfdb 6942 pred, succ, EDGE_INDEX (elist, BASIC_BLOCK (pred),
d675a426 6943 BASIC_BLOCK (succ)));
410538ea 6944 }
c9bacfdb
KH
6945 for (succ = 0; succ < n_basic_blocks; succ++)
6946 {
6947 basic_block p = ENTRY_BLOCK_PTR;
6948 basic_block s = BASIC_BLOCK (succ);
410538ea 6949
c9bacfdb 6950 int found_edge = 0;
410538ea 6951
c9bacfdb
KH
6952 for (e = p->succ; e; e = e->succ_next)
6953 if (e->dest == s)
6954 {
6955 found_edge = 1;
6956 break;
6957 }
6958 for (e = s->pred; e; e = e->pred_next)
6959 if (e->src == p)
6960 {
6961 found_edge = 1;
6962 break;
6963 }
6964 if (EDGE_INDEX (elist, ENTRY_BLOCK_PTR, BASIC_BLOCK (succ))
6965 == EDGE_INDEX_NO_EDGE && found_edge != 0)
6966 fprintf (f, "*** Edge (entry, %d) appears to not have an index\n",
6967 succ);
6968 if (EDGE_INDEX (elist, ENTRY_BLOCK_PTR, BASIC_BLOCK (succ))
6969 != EDGE_INDEX_NO_EDGE && found_edge == 0)
6970 fprintf (f, "*** Edge (entry, %d) has index %d, but no edge exists\n",
6971 succ, EDGE_INDEX (elist, ENTRY_BLOCK_PTR,
6972 BASIC_BLOCK (succ)));
6973 }
6974 for (pred = 0; pred < n_basic_blocks; pred++)
6975 {
6976 basic_block p = BASIC_BLOCK (pred);
6977 basic_block s = EXIT_BLOCK_PTR;
410538ea 6978
c9bacfdb 6979 int found_edge = 0;
410538ea 6980
c9bacfdb
KH
6981 for (e = p->succ; e; e = e->succ_next)
6982 if (e->dest == s)
6983 {
6984 found_edge = 1;
6985 break;
6986 }
6987 for (e = s->pred; e; e = e->pred_next)
6988 if (e->src == p)
6989 {
6990 found_edge = 1;
6991 break;
6992 }
6993 if (EDGE_INDEX (elist, BASIC_BLOCK (pred), EXIT_BLOCK_PTR)
6994 == EDGE_INDEX_NO_EDGE && found_edge != 0)
6995 fprintf (f, "*** Edge (%d, exit) appears to not have an index\n",
6996 pred);
6997 if (EDGE_INDEX (elist, BASIC_BLOCK (pred), EXIT_BLOCK_PTR)
6998 != EDGE_INDEX_NO_EDGE && found_edge == 0)
6999 fprintf (f, "*** Edge (%d, exit) has index %d, but no edge exists\n",
7000 pred, EDGE_INDEX (elist, BASIC_BLOCK (pred),
7001 EXIT_BLOCK_PTR));
7002 }
410538ea
AM
7003}
7004
7005/* This routine will determine what, if any, edge there is between
7006 a specified predecessor and successor. */
c9bacfdb 7007
410538ea
AM
7008int
7009find_edge_index (edge_list, pred, succ)
7010 struct edge_list *edge_list;
d675a426 7011 basic_block pred, succ;
410538ea
AM
7012{
7013 int x;
7014 for (x = 0; x < NUM_EDGES (edge_list); x++)
7015 {
d675a426
AM
7016 if (INDEX_EDGE_PRED_BB (edge_list, x) == pred
7017 && INDEX_EDGE_SUCC_BB (edge_list, x) == succ)
410538ea
AM
7018 return x;
7019 }
7020 return (EDGE_INDEX_NO_EDGE);
7021}
7022
87fdf7ff 7023/* This function will remove an edge from the flow graph. */
c9bacfdb 7024
69732dcb 7025void
87fdf7ff
AM
7026remove_edge (e)
7027 edge e;
7028{
7029 edge last_pred = NULL;
7030 edge last_succ = NULL;
7031 edge tmp;
7032 basic_block src, dest;
7033 src = e->src;
7034 dest = e->dest;
7035 for (tmp = src->succ; tmp && tmp != e; tmp = tmp->succ_next)
7036 last_succ = tmp;
7037
7038 if (!tmp)
7039 abort ();
7040 if (last_succ)
7041 last_succ->succ_next = e->succ_next;
7042 else
7043 src->succ = e->succ_next;
7044
7045 for (tmp = dest->pred; tmp && tmp != e; tmp = tmp->pred_next)
7046 last_pred = tmp;
7047
7048 if (!tmp)
7049 abort ();
7050 if (last_pred)
7051 last_pred->pred_next = e->pred_next;
7052 else
7053 dest->pred = e->pred_next;
7054
d3a923ee 7055 n_edges--;
87fdf7ff 7056 free (e);
87fdf7ff
AM
7057}
7058
7059/* This routine will remove any fake successor edges for a basic block.
7060 When the edge is removed, it is also removed from whatever predecessor
7061 list it is in. */
c9bacfdb 7062
87fdf7ff
AM
7063static void
7064remove_fake_successors (bb)
7065 basic_block bb;
7066{
7067 edge e;
c9bacfdb 7068 for (e = bb->succ; e;)
87fdf7ff
AM
7069 {
7070 edge tmp = e;
7071 e = e->succ_next;
7072 if ((tmp->flags & EDGE_FAKE) == EDGE_FAKE)
7073 remove_edge (tmp);
7074 }
7075}
7076
7077/* This routine will remove all fake edges from the flow graph. If
7078 we remove all fake successors, it will automatically remove all
7079 fake predecessors. */
c9bacfdb 7080
87fdf7ff
AM
7081void
7082remove_fake_edges ()
7083{
7084 int x;
87fdf7ff
AM
7085
7086 for (x = 0; x < n_basic_blocks; x++)
d3a923ee
RH
7087 remove_fake_successors (BASIC_BLOCK (x));
7088
c7d04f29 7089 /* We've handled all successors except the entry block's. */
87fdf7ff
AM
7090 remove_fake_successors (ENTRY_BLOCK_PTR);
7091}
7092
4eb00163 7093/* This function will add a fake edge between any block which has no
87fdf7ff
AM
7094 successors, and the exit block. Some data flow equations require these
7095 edges to exist. */
c9bacfdb 7096
87fdf7ff 7097void
c7d04f29 7098add_noreturn_fake_exit_edges ()
87fdf7ff
AM
7099{
7100 int x;
7101
7102 for (x = 0; x < n_basic_blocks; x++)
7103 if (BASIC_BLOCK (x)->succ == NULL)
dbf08f94 7104 make_edge (NULL, BASIC_BLOCK (x), EXIT_BLOCK_PTR, EDGE_FAKE);
87fdf7ff 7105}
f008a564 7106
b53978a3
JO
7107/* This function adds a fake edge between any infinite loops to the
7108 exit block. Some optimizations require a path from each node to
7109 the exit node.
f008a564 7110
b53978a3
JO
7111 See also Morgan, Figure 3.10, pp. 82-83.
7112
7113 The current implementation is ugly, not attempting to minimize the
7114 number of inserted fake edges. To reduce the number of fake edges
7115 to insert, add fake edges from _innermost_ loops containing only
c9bacfdb
KH
7116 nodes not reachable from the exit block. */
7117
b53978a3
JO
7118void
7119connect_infinite_loops_to_exit ()
7120{
7121 basic_block unvisited_block;
7122
7123 /* Perform depth-first search in the reverse graph to find nodes
c9bacfdb 7124 reachable from the exit block. */
b53978a3
JO
7125 struct depth_first_search_dsS dfs_ds;
7126
7127 flow_dfs_compute_reverse_init (&dfs_ds);
7128 flow_dfs_compute_reverse_add_bb (&dfs_ds, EXIT_BLOCK_PTR);
c9bacfdb
KH
7129
7130 /* Repeatedly add fake edges, updating the unreachable nodes. */
b53978a3
JO
7131 while (1)
7132 {
7133 unvisited_block = flow_dfs_compute_reverse_execute (&dfs_ds);
7134 if (!unvisited_block)
7135 break;
7136 make_edge (NULL, unvisited_block, EXIT_BLOCK_PTR, EDGE_FAKE);
7137 flow_dfs_compute_reverse_add_bb (&dfs_ds, unvisited_block);
7138 }
7139
7140 flow_dfs_compute_reverse_finish (&dfs_ds);
7141
7142 return;
7143}
7144
7145/* Redirect an edge's successor from one block to another. */
c9bacfdb 7146
f008a564
RH
7147void
7148redirect_edge_succ (e, new_succ)
7149 edge e;
7150 basic_block new_succ;
7151{
7152 edge *pe;
7153
7154 /* Disconnect the edge from the old successor block. */
c9bacfdb 7155 for (pe = &e->dest->pred; *pe != e; pe = &(*pe)->pred_next)
f008a564
RH
7156 continue;
7157 *pe = (*pe)->pred_next;
7158
7159 /* Reconnect the edge to the new successor block. */
7160 e->pred_next = new_succ->pred;
7161 new_succ->pred = e;
7162 e->dest = new_succ;
7163}
7164
7165/* Redirect an edge's predecessor from one block to another. */
c9bacfdb 7166
f008a564
RH
7167void
7168redirect_edge_pred (e, new_pred)
7169 edge e;
7170 basic_block new_pred;
7171{
7172 edge *pe;
7173
7174 /* Disconnect the edge from the old predecessor block. */
c9bacfdb 7175 for (pe = &e->src->succ; *pe != e; pe = &(*pe)->succ_next)
f008a564
RH
7176 continue;
7177 *pe = (*pe)->succ_next;
7178
7179 /* Reconnect the edge to the new predecessor block. */
7180 e->succ_next = new_pred->succ;
7181 new_pred->succ = e;
7182 e->src = new_pred;
7183}
4dc9341c
MH
7184\f
7185/* Dump the list of basic blocks in the bitmap NODES. */
c9bacfdb 7186
135ebc36 7187static void
4dc9341c
MH
7188flow_nodes_print (str, nodes, file)
7189 const char *str;
7190 const sbitmap nodes;
7191 FILE *file;
7192{
7193 int node;
7194
135ebc36
MH
7195 if (! nodes)
7196 return;
7197
4dc9341c
MH
7198 fprintf (file, "%s { ", str);
7199 EXECUTE_IF_SET_IN_SBITMAP (nodes, 0, node, {fprintf (file, "%d ", node);});
7200 fputs ("}\n", file);
7201}
7202
c9bacfdb 7203
135ebc36
MH
7204/* Dump the list of edges in the array EDGE_LIST. */
7205
7206static void
7207flow_edge_list_print (str, edge_list, num_edges, file)
4dc9341c 7208 const char *str;
135ebc36 7209 const edge *edge_list;
4dc9341c
MH
7210 int num_edges;
7211 FILE *file;
7212{
7213 int i;
7214
135ebc36
MH
7215 if (! edge_list)
7216 return;
7217
4dc9341c
MH
7218 fprintf (file, "%s { ", str);
7219 for (i = 0; i < num_edges; i++)
135ebc36
MH
7220 fprintf (file, "%d->%d ", edge_list[i]->src->index,
7221 edge_list[i]->dest->index);
4dc9341c
MH
7222 fputs ("}\n", file);
7223}
7224
135ebc36 7225
4dc9341c 7226/* Dump loop related CFG information. */
c9bacfdb 7227
4dc9341c
MH
7228static void
7229flow_loops_cfg_dump (loops, file)
7230 const struct loops *loops;
7231 FILE *file;
7232{
7233 int i;
7234
7235 if (! loops->num || ! file || ! loops->cfg.dom)
7236 return;
7237
7238 for (i = 0; i < n_basic_blocks; i++)
7239 {
7240 edge succ;
7241
7242 fprintf (file, ";; %d succs { ", i);
7243 for (succ = BASIC_BLOCK (i)->succ; succ; succ = succ->succ_next)
7244 fprintf (file, "%d ", succ->dest->index);
c9bacfdb 7245 flow_nodes_print ("} dom", loops->cfg.dom[i], file);
4dc9341c
MH
7246 }
7247
4dc9341c
MH
7248 /* Dump the DFS node order. */
7249 if (loops->cfg.dfs_order)
7250 {
7251 fputs (";; DFS order: ", file);
7252 for (i = 0; i < n_basic_blocks; i++)
7253 fprintf (file, "%d ", loops->cfg.dfs_order[i]);
7254 fputs ("\n", file);
7255 }
c34d5374
MH
7256 /* Dump the reverse completion node order. */
7257 if (loops->cfg.rc_order)
7258 {
7259 fputs (";; RC order: ", file);
7260 for (i = 0; i < n_basic_blocks; i++)
7261 fprintf (file, "%d ", loops->cfg.rc_order[i]);
7262 fputs ("\n", file);
7263 }
4dc9341c
MH
7264}
7265
4dc9341c 7266/* Return non-zero if the nodes of LOOP are a subset of OUTER. */
c9bacfdb 7267
272df862 7268static int
4dc9341c
MH
7269flow_loop_nested_p (outer, loop)
7270 struct loop *outer;
7271 struct loop *loop;
7272{
7273 return sbitmap_a_subset_b_p (loop->nodes, outer->nodes);
7274}
7275
c9bacfdb 7276
6057c0e6
MH
7277/* Dump the loop information specified by LOOP to the stream FILE
7278 using auxiliary dump callback function LOOP_DUMP_AUX if non null. */
c9bacfdb 7279void
6057c0e6
MH
7280flow_loop_dump (loop, file, loop_dump_aux, verbose)
7281 const struct loop *loop;
7282 FILE *file;
31a1fdad 7283 void (*loop_dump_aux) PARAMS((const struct loop *, FILE *, int));
6057c0e6
MH
7284 int verbose;
7285{
7286 if (! loop || ! loop->header)
7287 return;
7288
7289 fprintf (file, ";;\n;; Loop %d (%d to %d):%s%s\n",
7290 loop->num, INSN_UID (loop->first->head),
7291 INSN_UID (loop->last->end),
7292 loop->shared ? " shared" : "",
7293 loop->invalid ? " invalid" : "");
7294 fprintf (file, ";; header %d, latch %d, pre-header %d, first %d, last %d\n",
7295 loop->header->index, loop->latch->index,
7296 loop->pre_header ? loop->pre_header->index : -1,
7297 loop->first->index, loop->last->index);
7298 fprintf (file, ";; depth %d, level %d, outer %ld\n",
7299 loop->depth, loop->level,
7300 (long) (loop->outer ? loop->outer->num : -1));
7301
4a7da9b5
MH
7302 if (loop->pre_header_edges)
7303 flow_edge_list_print (";; pre-header edges", loop->pre_header_edges,
7304 loop->num_pre_header_edges, file);
5d6a16e2 7305 flow_edge_list_print (";; entry edges", loop->entry_edges,
135ebc36 7306 loop->num_entries, file);
6057c0e6
MH
7307 fprintf (file, ";; %d", loop->num_nodes);
7308 flow_nodes_print (" nodes", loop->nodes, file);
5d6a16e2 7309 flow_edge_list_print (";; exit edges", loop->exit_edges,
135ebc36 7310 loop->num_exits, file);
5d6a16e2
MH
7311 if (loop->exits_doms)
7312 flow_nodes_print (";; exit doms", loop->exits_doms, file);
6057c0e6
MH
7313 if (loop_dump_aux)
7314 loop_dump_aux (loop, file, verbose);
7315}
7316
7317
7318/* Dump the loop information specified by LOOPS to the stream FILE,
7319 using auxiliary dump callback function LOOP_DUMP_AUX if non null. */
7320void
7321flow_loops_dump (loops, file, loop_dump_aux, verbose)
4dc9341c
MH
7322 const struct loops *loops;
7323 FILE *file;
31a1fdad 7324 void (*loop_dump_aux) PARAMS((const struct loop *, FILE *, int));
4dc9341c
MH
7325 int verbose;
7326{
7327 int i;
7328 int num_loops;
7329
7330 num_loops = loops->num;
7331 if (! num_loops || ! file)
7332 return;
7333
6057c0e6 7334 fprintf (file, ";; %d loops found, %d levels\n",
d6181b1b 7335 num_loops, loops->levels);
4dc9341c
MH
7336
7337 for (i = 0; i < num_loops; i++)
7338 {
7339 struct loop *loop = &loops->array[i];
7340
6057c0e6 7341 flow_loop_dump (loop, file, loop_dump_aux, verbose);
4dc9341c
MH
7342
7343 if (loop->shared)
7344 {
7345 int j;
7346
7347 for (j = 0; j < i; j++)
7348 {
7349 struct loop *oloop = &loops->array[j];
7350
7351 if (loop->header == oloop->header)
7352 {
7353 int disjoint;
7354 int smaller;
7355
7356 smaller = loop->num_nodes < oloop->num_nodes;
7357
7358 /* If the union of LOOP and OLOOP is different than
7359 the larger of LOOP and OLOOP then LOOP and OLOOP
7360 must be disjoint. */
b760c4b1
MH
7361 disjoint = ! flow_loop_nested_p (smaller ? loop : oloop,
7362 smaller ? oloop : loop);
6057c0e6 7363 fprintf (file,
c34d5374 7364 ";; loop header %d shared by loops %d, %d %s\n",
4dc9341c
MH
7365 loop->header->index, i, j,
7366 disjoint ? "disjoint" : "nested");
7367 }
7368 }
7369 }
4dc9341c
MH
7370 }
7371
7372 if (verbose)
7373 flow_loops_cfg_dump (loops, file);
7374}
7375
6057c0e6 7376
4dc9341c 7377/* Free all the memory allocated for LOOPS. */
c9bacfdb
KH
7378
7379void
4dc9341c 7380flow_loops_free (loops)
c9bacfdb 7381 struct loops *loops;
4dc9341c
MH
7382{
7383 if (loops->array)
7384 {
7385 int i;
7386
7387 if (! loops->num)
7388 abort ();
7389
7390 /* Free the loop descriptors. */
7391 for (i = 0; i < loops->num; i++)
7392 {
7393 struct loop *loop = &loops->array[i];
c9bacfdb 7394
4a7da9b5
MH
7395 if (loop->pre_header_edges)
7396 free (loop->pre_header_edges);
4dc9341c
MH
7397 if (loop->nodes)
7398 sbitmap_free (loop->nodes);
135ebc36
MH
7399 if (loop->entry_edges)
7400 free (loop->entry_edges);
7401 if (loop->exit_edges)
7402 free (loop->exit_edges);
5d6a16e2
MH
7403 if (loop->exits_doms)
7404 sbitmap_free (loop->exits_doms);
4dc9341c
MH
7405 }
7406 free (loops->array);
7407 loops->array = NULL;
c9bacfdb 7408
4dc9341c
MH
7409 if (loops->cfg.dom)
7410 sbitmap_vector_free (loops->cfg.dom);
7411 if (loops->cfg.dfs_order)
7412 free (loops->cfg.dfs_order);
7413
5d6a16e2
MH
7414 if (loops->shared_headers)
7415 sbitmap_free (loops->shared_headers);
4dc9341c
MH
7416 }
7417}
7418
6057c0e6 7419
135ebc36
MH
7420/* Find the entry edges into the loop with header HEADER and nodes
7421 NODES and store in ENTRY_EDGES array. Return the number of entry
7422 edges from the loop. */
7423
7424static int
7425flow_loop_entry_edges_find (header, nodes, entry_edges)
7426 basic_block header;
7427 const sbitmap nodes;
7428 edge **entry_edges;
7429{
7430 edge e;
7431 int num_entries;
7432
7433 *entry_edges = NULL;
7434
7435 num_entries = 0;
7436 for (e = header->pred; e; e = e->pred_next)
7437 {
7438 basic_block src = e->src;
7439
7440 if (src == ENTRY_BLOCK_PTR || ! TEST_BIT (nodes, src->index))
7441 num_entries++;
7442 }
7443
7444 if (! num_entries)
7445 abort ();
7446
7447 *entry_edges = (edge *) xmalloc (num_entries * sizeof (edge *));
7448
7449 num_entries = 0;
7450 for (e = header->pred; e; e = e->pred_next)
7451 {
7452 basic_block src = e->src;
7453
7454 if (src == ENTRY_BLOCK_PTR || ! TEST_BIT (nodes, src->index))
7455 (*entry_edges)[num_entries++] = e;
7456 }
7457
7458 return num_entries;
7459}
7460
7461
7462/* Find the exit edges from the loop using the bitmap of loop nodes
7463 NODES and store in EXIT_EDGES array. Return the number of
7464 exit edges from the loop. */
c9bacfdb 7465
4dc9341c 7466static int
135ebc36 7467flow_loop_exit_edges_find (nodes, exit_edges)
4dc9341c 7468 const sbitmap nodes;
135ebc36 7469 edge **exit_edges;
4dc9341c
MH
7470{
7471 edge e;
7472 int node;
7473 int num_exits;
7474
135ebc36 7475 *exit_edges = NULL;
4dc9341c
MH
7476
7477 /* Check all nodes within the loop to see if there are any
7478 successors not in the loop. Note that a node may have multiple
135ebc36
MH
7479 exiting edges ????? A node can have one jumping edge and one fallthru
7480 edge so only one of these can exit the loop. */
4dc9341c
MH
7481 num_exits = 0;
7482 EXECUTE_IF_SET_IN_SBITMAP (nodes, 0, node, {
7483 for (e = BASIC_BLOCK (node)->succ; e; e = e->succ_next)
7484 {
135ebc36 7485 basic_block dest = e->dest;
4dc9341c
MH
7486
7487 if (dest == EXIT_BLOCK_PTR || ! TEST_BIT (nodes, dest->index))
7488 num_exits++;
7489 }
7490 });
7491
7492 if (! num_exits)
7493 return 0;
7494
135ebc36 7495 *exit_edges = (edge *) xmalloc (num_exits * sizeof (edge *));
4dc9341c
MH
7496
7497 /* Store all exiting edges into an array. */
7498 num_exits = 0;
7499 EXECUTE_IF_SET_IN_SBITMAP (nodes, 0, node, {
7500 for (e = BASIC_BLOCK (node)->succ; e; e = e->succ_next)
7501 {
135ebc36 7502 basic_block dest = e->dest;
4dc9341c
MH
7503
7504 if (dest == EXIT_BLOCK_PTR || ! TEST_BIT (nodes, dest->index))
135ebc36 7505 (*exit_edges)[num_exits++] = e;
4dc9341c
MH
7506 }
7507 });
7508
7509 return num_exits;
7510}
7511
135ebc36 7512
4dc9341c
MH
7513/* Find the nodes contained within the loop with header HEADER and
7514 latch LATCH and store in NODES. Return the number of nodes within
7515 the loop. */
c9bacfdb
KH
7516
7517static int
4dc9341c
MH
7518flow_loop_nodes_find (header, latch, nodes)
7519 basic_block header;
7520 basic_block latch;
7521 sbitmap nodes;
7522{
7523 basic_block *stack;
7524 int sp;
7525 int num_nodes = 0;
7526
7527 stack = (basic_block *) xmalloc (n_basic_blocks * sizeof (basic_block));
7528 sp = 0;
7529
7530 /* Start with only the loop header in the set of loop nodes. */
7531 sbitmap_zero (nodes);
7532 SET_BIT (nodes, header->index);
7533 num_nodes++;
ce4bbac7 7534 header->loop_depth++;
4dc9341c
MH
7535
7536 /* Push the loop latch on to the stack. */
7537 if (! TEST_BIT (nodes, latch->index))
7538 {
7539 SET_BIT (nodes, latch->index);
ce4bbac7 7540 latch->loop_depth++;
4dc9341c
MH
7541 num_nodes++;
7542 stack[sp++] = latch;
7543 }
7544
7545 while (sp)
7546 {
7547 basic_block node;
7548 edge e;
7549
7550 node = stack[--sp];
7551 for (e = node->pred; e; e = e->pred_next)
7552 {
7553 basic_block ancestor = e->src;
c9bacfdb 7554
4dc9341c
MH
7555 /* If each ancestor not marked as part of loop, add to set of
7556 loop nodes and push on to stack. */
7557 if (ancestor != ENTRY_BLOCK_PTR
7558 && ! TEST_BIT (nodes, ancestor->index))
7559 {
7560 SET_BIT (nodes, ancestor->index);
ce4bbac7 7561 ancestor->loop_depth++;
4dc9341c
MH
7562 num_nodes++;
7563 stack[sp++] = ancestor;
7564 }
7565 }
7566 }
7567 free (stack);
7568 return num_nodes;
7569}
7570
4dc9341c 7571/* Compute the depth first search order and store in the array
c34d5374
MH
7572 DFS_ORDER if non-zero, marking the nodes visited in VISITED. If
7573 RC_ORDER is non-zero, return the reverse completion number for each
7574 node. Returns the number of nodes visited. A depth first search
7575 tries to get as far away from the starting point as quickly as
7576 possible. */
c9bacfdb 7577
4dc9341c 7578static int
c34d5374 7579flow_depth_first_order_compute (dfs_order, rc_order)
4dc9341c 7580 int *dfs_order;
c34d5374 7581 int *rc_order;
4dc9341c 7582{
4dc9341c
MH
7583 edge *stack;
7584 int sp;
7585 int dfsnum = 0;
c34d5374 7586 int rcnum = n_basic_blocks - 1;
4dc9341c
MH
7587 sbitmap visited;
7588
7589 /* Allocate stack for back-tracking up CFG. */
628f05b4 7590 stack = (edge *) xmalloc ((n_basic_blocks + 1) * sizeof (edge));
4dc9341c
MH
7591 sp = 0;
7592
7593 /* Allocate bitmap to track nodes that have been visited. */
7594 visited = sbitmap_alloc (n_basic_blocks);
7595
7596 /* None of the nodes in the CFG have been visited yet. */
7597 sbitmap_zero (visited);
c9bacfdb 7598
628f05b4
MH
7599 /* Push the first edge on to the stack. */
7600 stack[sp++] = ENTRY_BLOCK_PTR->succ;
7601
7602 while (sp)
4dc9341c 7603 {
628f05b4
MH
7604 edge e;
7605 basic_block src;
7606 basic_block dest;
7607
7608 /* Look at the edge on the top of the stack. */
7609 e = stack[sp - 1];
7610 src = e->src;
7611 dest = e->dest;
c9bacfdb 7612
628f05b4
MH
7613 /* Check if the edge destination has been visited yet. */
7614 if (dest != EXIT_BLOCK_PTR && ! TEST_BIT (visited, dest->index))
4dc9341c 7615 {
628f05b4
MH
7616 /* Mark that we have visited the destination. */
7617 SET_BIT (visited, dest->index);
c9bacfdb 7618
c34d5374
MH
7619 if (dfs_order)
7620 dfs_order[dfsnum++] = dest->index;
628f05b4 7621
c9bacfdb
KH
7622 if (dest->succ)
7623 {
7624 /* Since the DEST node has been visited for the first
7625 time, check its successors. */
7626 stack[sp++] = dest->succ;
7627 }
7628 else
7629 {
7630 /* There are no successors for the DEST node so assign
7631 its reverse completion number. */
c34d5374
MH
7632 if (rc_order)
7633 rc_order[rcnum--] = dest->index;
c9bacfdb 7634 }
4dc9341c
MH
7635 }
7636 else
7637 {
628f05b4 7638 if (! e->succ_next && src != ENTRY_BLOCK_PTR)
c9bacfdb
KH
7639 {
7640 /* There are no more successors for the SRC node
7641 so assign its reverse completion number. */
c34d5374
MH
7642 if (rc_order)
7643 rc_order[rcnum--] = src->index;
c9bacfdb
KH
7644 }
7645
628f05b4
MH
7646 if (e->succ_next)
7647 stack[sp - 1] = e->succ_next;
7648 else
7649 sp--;
4dc9341c
MH
7650 }
7651 }
628f05b4 7652
4dc9341c
MH
7653 free (stack);
7654 sbitmap_free (visited);
7655
7656 /* The number of nodes visited should not be greater than
7657 n_basic_blocks. */
7658 if (dfsnum > n_basic_blocks)
7659 abort ();
7660
7661 /* There are some nodes left in the CFG that are unreachable. */
7662 if (dfsnum < n_basic_blocks)
7663 abort ();
7664 return dfsnum;
7665}
7666
b53978a3
JO
7667/* Compute the depth first search order on the _reverse_ graph and
7668 store in the array DFS_ORDER, marking the nodes visited in VISITED.
7669 Returns the number of nodes visited.
7670
7671 The computation is split into three pieces:
7672
7673 flow_dfs_compute_reverse_init () creates the necessary data
7674 structures.
7675
7676 flow_dfs_compute_reverse_add_bb () adds a basic block to the data
7677 structures. The block will start the search.
7678
7679 flow_dfs_compute_reverse_execute () continues (or starts) the
7680 search using the block on the top of the stack, stopping when the
7681 stack is empty.
7682
7683 flow_dfs_compute_reverse_finish () destroys the necessary data
7684 structures.
7685
7686 Thus, the user will probably call ..._init(), call ..._add_bb() to
7687 add a beginning basic block to the stack, call ..._execute(),
7688 possibly add another bb to the stack and again call ..._execute(),
c9bacfdb 7689 ..., and finally call _finish(). */
b53978a3
JO
7690
7691/* Initialize the data structures used for depth-first search on the
7692 reverse graph. If INITIALIZE_STACK is nonzero, the exit block is
7693 added to the basic block stack. DATA is the current depth-first
7694 search context. If INITIALIZE_STACK is non-zero, there is an
7695 element on the stack. */
7696
7697static void
7698flow_dfs_compute_reverse_init (data)
7699 depth_first_search_ds data;
7700{
7701 /* Allocate stack for back-tracking up CFG. */
7702 data->stack =
c9bacfdb 7703 (basic_block *) xmalloc ((n_basic_blocks - (INVALID_BLOCK + 1))
b53978a3
JO
7704 * sizeof (basic_block));
7705 data->sp = 0;
7706
7707 /* Allocate bitmap to track nodes that have been visited. */
c9bacfdb 7708 data->visited_blocks = sbitmap_alloc (n_basic_blocks - (INVALID_BLOCK + 1));
b53978a3
JO
7709
7710 /* None of the nodes in the CFG have been visited yet. */
7711 sbitmap_zero (data->visited_blocks);
7712
7713 return;
7714}
7715
7716/* Add the specified basic block to the top of the dfs data
7717 structures. When the search continues, it will start at the
c9bacfdb 7718 block. */
b53978a3
JO
7719
7720static void
7721flow_dfs_compute_reverse_add_bb (data, bb)
7722 depth_first_search_ds data;
7723 basic_block bb;
7724{
7725 data->stack[data->sp++] = bb;
7726 return;
7727}
7728
7729/* Continue the depth-first search through the reverse graph starting
7730 with the block at the stack's top and ending when the stack is
7731 empty. Visited nodes are marked. Returns an unvisited basic
7732 block, or NULL if there is none available. */
c9bacfdb 7733
b53978a3
JO
7734static basic_block
7735flow_dfs_compute_reverse_execute (data)
7736 depth_first_search_ds data;
7737{
7738 basic_block bb;
7739 edge e;
7740 int i;
7741
7742 while (data->sp > 0)
7743 {
7744 bb = data->stack[--data->sp];
7745
c9bacfdb
KH
7746 /* Mark that we have visited this node. */
7747 if (!TEST_BIT (data->visited_blocks, bb->index - (INVALID_BLOCK + 1)))
b53978a3 7748 {
c9bacfdb 7749 SET_BIT (data->visited_blocks, bb->index - (INVALID_BLOCK + 1));
b53978a3 7750
c9bacfdb 7751 /* Perform depth-first search on adjacent vertices. */
b53978a3
JO
7752 for (e = bb->pred; e; e = e->pred_next)
7753 flow_dfs_compute_reverse_add_bb (data, e->src);
7754 }
7755 }
7756
c9bacfdb
KH
7757 /* Determine if there are unvisited basic blocks. */
7758 for (i = n_basic_blocks - (INVALID_BLOCK + 1); --i >= 0;)
b53978a3 7759 if (!TEST_BIT (data->visited_blocks, i))
c9bacfdb 7760 return BASIC_BLOCK (i + (INVALID_BLOCK + 1));
b53978a3
JO
7761 return NULL;
7762}
7763
7764/* Destroy the data structures needed for depth-first search on the
c9bacfdb 7765 reverse graph. */
b53978a3
JO
7766
7767static void
7768flow_dfs_compute_reverse_finish (data)
7769 depth_first_search_ds data;
7770{
7771 free (data->stack);
7772 sbitmap_free (data->visited_blocks);
7773 return;
7774}
7775
5d6a16e2
MH
7776
7777/* Find the root node of the loop pre-header extended basic block and
4a7da9b5 7778 the edges along the trace from the root node to the loop header. */
5d6a16e2
MH
7779
7780static void
7781flow_loop_pre_header_scan (loop)
7782 struct loop *loop;
7783{
4a7da9b5 7784 int num = 0;
5d6a16e2
MH
7785 basic_block ebb;
7786
4a7da9b5
MH
7787 loop->num_pre_header_edges = 0;
7788
5d6a16e2
MH
7789 if (loop->num_entries != 1)
7790 return;
7791
5d6a16e2 7792 ebb = loop->entry_edges[0]->src;
ef120fc0
MH
7793
7794 if (ebb != ENTRY_BLOCK_PTR)
5d6a16e2 7795 {
4a7da9b5
MH
7796 edge e;
7797
7798 /* Count number of edges along trace from loop header to
7799 root of pre-header extended basic block. Usually this is
7800 only one or two edges. */
7801 num++;
7802 while (ebb->pred->src != ENTRY_BLOCK_PTR && ! ebb->pred->pred_next)
ef120fc0
MH
7803 {
7804 ebb = ebb->pred->src;
4a7da9b5
MH
7805 num++;
7806 }
7807
7808 loop->pre_header_edges = (edge *) xmalloc (num * sizeof (edge *));
7809 loop->num_pre_header_edges = num;
7810
7811 /* Store edges in order that they are followed. The source
7812 of the first edge is the root node of the pre-header extended
7813 basic block and the destination of the last last edge is
7814 the loop header. */
7815 for (e = loop->entry_edges[0]; num; e = e->src->pred)
7816 {
7817 loop->pre_header_edges[--num] = e;
ef120fc0 7818 }
5d6a16e2 7819 }
5d6a16e2
MH
7820}
7821
7822
4dc9341c
MH
7823/* Return the block for the pre-header of the loop with header
7824 HEADER where DOM specifies the dominator information. Return NULL if
7825 there is no pre-header. */
c9bacfdb 7826
4dc9341c
MH
7827static basic_block
7828flow_loop_pre_header_find (header, dom)
7829 basic_block header;
c9bacfdb 7830 const sbitmap *dom;
4dc9341c
MH
7831{
7832 basic_block pre_header;
7833 edge e;
7834
7835 /* If block p is a predecessor of the header and is the only block
7836 that the header does not dominate, then it is the pre-header. */
7837 pre_header = NULL;
7838 for (e = header->pred; e; e = e->pred_next)
7839 {
7840 basic_block node = e->src;
c9bacfdb 7841
4dc9341c
MH
7842 if (node != ENTRY_BLOCK_PTR
7843 && ! TEST_BIT (dom[node->index], header->index))
7844 {
7845 if (pre_header == NULL)
7846 pre_header = node;
7847 else
7848 {
c9bacfdb 7849 /* There are multiple edges into the header from outside
4dc9341c
MH
7850 the loop so there is no pre-header block. */
7851 pre_header = NULL;
7852 break;
7853 }
7854 }
7855 }
7856 return pre_header;
7857}
7858
3abd3239
MH
7859/* Add LOOP to the loop hierarchy tree where PREVLOOP was the loop
7860 previously added. The insertion algorithm assumes that the loops
7861 are added in the order found by a depth first search of the CFG. */
c9bacfdb 7862
4dc9341c 7863static void
3abd3239
MH
7864flow_loop_tree_node_add (prevloop, loop)
7865 struct loop *prevloop;
4dc9341c
MH
7866 struct loop *loop;
7867{
4dc9341c 7868
3abd3239
MH
7869 if (flow_loop_nested_p (prevloop, loop))
7870 {
7871 prevloop->inner = loop;
7872 loop->outer = prevloop;
7873 return;
7874 }
4dc9341c 7875
3abd3239 7876 while (prevloop->outer)
4dc9341c 7877 {
3abd3239 7878 if (flow_loop_nested_p (prevloop->outer, loop))
4dc9341c 7879 {
3abd3239
MH
7880 prevloop->next = loop;
7881 loop->outer = prevloop->outer;
4dc9341c
MH
7882 return;
7883 }
3abd3239 7884 prevloop = prevloop->outer;
4dc9341c 7885 }
c9bacfdb 7886
3abd3239
MH
7887 prevloop->next = loop;
7888 loop->outer = NULL;
4dc9341c
MH
7889}
7890
4dc9341c 7891/* Build the loop hierarchy tree for LOOPS. */
c9bacfdb 7892
4dc9341c
MH
7893static void
7894flow_loops_tree_build (loops)
c9bacfdb 7895 struct loops *loops;
4dc9341c
MH
7896{
7897 int i;
7898 int num_loops;
7899
7900 num_loops = loops->num;
7901 if (! num_loops)
7902 return;
7903
7904 /* Root the loop hierarchy tree with the first loop found.
c9bacfdb 7905 Since we used a depth first search this should be the
4dc9341c
MH
7906 outermost loop. */
7907 loops->tree = &loops->array[0];
7908 loops->tree->outer = loops->tree->inner = loops->tree->next = NULL;
7909
7910 /* Add the remaining loops to the tree. */
7911 for (i = 1; i < num_loops; i++)
3abd3239 7912 flow_loop_tree_node_add (&loops->array[i - 1], &loops->array[i]);
4dc9341c
MH
7913}
7914
4dc9341c 7915/* Helper function to compute loop nesting depth and enclosed loop level
c9bacfdb 7916 for the natural loop specified by LOOP at the loop depth DEPTH.
4dc9341c 7917 Returns the loop level. */
c9bacfdb 7918
4dc9341c
MH
7919static int
7920flow_loop_level_compute (loop, depth)
7921 struct loop *loop;
7922 int depth;
7923{
7924 struct loop *inner;
d6181b1b 7925 int level = 1;
4dc9341c
MH
7926
7927 if (! loop)
7928 return 0;
7929
7930 /* Traverse loop tree assigning depth and computing level as the
7931 maximum level of all the inner loops of this loop. The loop
7932 level is equivalent to the height of the loop in the loop tree
d6181b1b
MH
7933 and corresponds to the number of enclosed loop levels (including
7934 itself). */
4dc9341c
MH
7935 for (inner = loop->inner; inner; inner = inner->next)
7936 {
7937 int ilevel;
7938
7939 ilevel = flow_loop_level_compute (inner, depth + 1) + 1;
7940
7941 if (ilevel > level)
7942 level = ilevel;
7943 }
7944 loop->level = level;
7945 loop->depth = depth;
7946 return level;
7947}
7948
4dc9341c
MH
7949/* Compute the loop nesting depth and enclosed loop level for the loop
7950 hierarchy tree specfied by LOOPS. Return the maximum enclosed loop
7951 level. */
d4b60170 7952
d6181b1b 7953static int
4dc9341c
MH
7954flow_loops_level_compute (loops)
7955 struct loops *loops;
7956{
d6181b1b
MH
7957 struct loop *loop;
7958 int level;
7959 int levels = 0;
7960
7961 /* Traverse all the outer level loops. */
7962 for (loop = loops->tree; loop; loop = loop->next)
7963 {
7964 level = flow_loop_level_compute (loop, 1);
7965 if (level > levels)
7966 levels = level;
7967 }
7968 return levels;
4dc9341c
MH
7969}
7970
5d6a16e2 7971
ce4bbac7
JH
7972/* Find all the natural loops in the function and save in LOOPS structure
7973 and recalculate loop_depth information in basic block structures.
5d6a16e2 7974 FLAGS controls which loop information is collected.
4dc9341c 7975 Return the number of natural loops found. */
d4b60170 7976
c9bacfdb 7977int
5d6a16e2 7978flow_loops_find (loops, flags)
c9bacfdb 7979 struct loops *loops;
5d6a16e2 7980 int flags;
4dc9341c
MH
7981{
7982 int i;
7983 int b;
7984 int num_loops;
7985 edge e;
7986 sbitmap headers;
7987 sbitmap *dom;
7988 int *dfs_order;
c34d5374 7989 int *rc_order;
c9bacfdb 7990
5d6a16e2
MH
7991 /* This function cannot be repeatedly called with different
7992 flags to build up the loop information. The loop tree
7993 must always be built if this function is called. */
7994 if (! (flags & LOOP_TREE))
7995 abort ();
7996
7997 memset (loops, 0, sizeof (*loops));
4dc9341c
MH
7998
7999 /* Taking care of this degenerate case makes the rest of
8000 this code simpler. */
8001 if (n_basic_blocks == 0)
8002 return 0;
8003
5d6a16e2
MH
8004 dfs_order = NULL;
8005 rc_order = NULL;
8006
4dc9341c
MH
8007 /* Compute the dominators. */
8008 dom = sbitmap_vector_alloc (n_basic_blocks, n_basic_blocks);
f8032688 8009 calculate_dominance_info (NULL, dom, CDI_DOMINATORS);
4dc9341c
MH
8010
8011 /* Count the number of loop edges (back edges). This should be the
5d6a16e2 8012 same as the number of natural loops. */
ce4bbac7 8013
4dc9341c
MH
8014 num_loops = 0;
8015 for (b = 0; b < n_basic_blocks; b++)
8016 {
5d6a16e2
MH
8017 basic_block header;
8018
8019 header = BASIC_BLOCK (b);
8020 header->loop_depth = 0;
8021
8022 for (e = header->pred; e; e = e->pred_next)
4dc9341c
MH
8023 {
8024 basic_block latch = e->src;
c9bacfdb 8025
4dc9341c
MH
8026 /* Look for back edges where a predecessor is dominated
8027 by this block. A natural loop has a single entry
8028 node (header) that dominates all the nodes in the
8029 loop. It also has single back edge to the header
8030 from a latch node. Note that multiple natural loops
8031 may share the same header. */
5d6a16e2
MH
8032 if (b != header->index)
8033 abort ();
8034
4dc9341c
MH
8035 if (latch != ENTRY_BLOCK_PTR && TEST_BIT (dom[latch->index], b))
8036 num_loops++;
8037 }
8038 }
c9bacfdb 8039
4dc9341c
MH
8040 if (num_loops)
8041 {
8042 /* Compute depth first search order of the CFG so that outer
8043 natural loops will be found before inner natural loops. */
8044 dfs_order = (int *) xmalloc (n_basic_blocks * sizeof (int));
c34d5374
MH
8045 rc_order = (int *) xmalloc (n_basic_blocks * sizeof (int));
8046 flow_depth_first_order_compute (dfs_order, rc_order);
4dc9341c
MH
8047
8048 /* Allocate loop structures. */
d4b60170
RK
8049 loops->array
8050 = (struct loop *) xcalloc (num_loops, sizeof (struct loop));
c9bacfdb 8051
4dc9341c
MH
8052 headers = sbitmap_alloc (n_basic_blocks);
8053 sbitmap_zero (headers);
8054
8055 loops->shared_headers = sbitmap_alloc (n_basic_blocks);
8056 sbitmap_zero (loops->shared_headers);
8057
8058 /* Find and record information about all the natural loops
8059 in the CFG. */
8060 num_loops = 0;
8061 for (b = 0; b < n_basic_blocks; b++)
8062 {
8063 basic_block header;
8064
5d6a16e2
MH
8065 /* Search the nodes of the CFG in reverse completion order
8066 so that we can find outer loops first. */
c34d5374 8067 header = BASIC_BLOCK (rc_order[b]);
c9bacfdb 8068
4dc9341c
MH
8069 /* Look for all the possible latch blocks for this header. */
8070 for (e = header->pred; e; e = e->pred_next)
8071 {
8072 basic_block latch = e->src;
c9bacfdb 8073
4dc9341c
MH
8074 /* Look for back edges where a predecessor is dominated
8075 by this block. A natural loop has a single entry
8076 node (header) that dominates all the nodes in the
8077 loop. It also has single back edge to the header
8078 from a latch node. Note that multiple natural loops
8079 may share the same header. */
8080 if (latch != ENTRY_BLOCK_PTR
8081 && TEST_BIT (dom[latch->index], header->index))
8082 {
8083 struct loop *loop;
c9bacfdb 8084
4dc9341c 8085 loop = loops->array + num_loops;
c9bacfdb 8086
4dc9341c
MH
8087 loop->header = header;
8088 loop->latch = latch;
c34d5374 8089 loop->num = num_loops;
c9bacfdb 8090
4dc9341c
MH
8091 num_loops++;
8092 }
8093 }
8094 }
c9bacfdb 8095
5d6a16e2
MH
8096 for (i = 0; i < num_loops; i++)
8097 {
8098 struct loop *loop = &loops->array[i];
8099 int j;
8100
8101 /* Keep track of blocks that are loop headers so
8102 that we can tell which loops should be merged. */
8103 if (TEST_BIT (headers, loop->header->index))
8104 SET_BIT (loops->shared_headers, loop->header->index);
8105 SET_BIT (headers, loop->header->index);
8106
8107 /* Find nodes contained within the loop. */
8108 loop->nodes = sbitmap_alloc (n_basic_blocks);
8109 loop->num_nodes
8110 = flow_loop_nodes_find (loop->header, loop->latch, loop->nodes);
8111
8112 /* Compute first and last blocks within the loop.
8113 These are often the same as the loop header and
8114 loop latch respectively, but this is not always
8115 the case. */
8116 loop->first
8117 = BASIC_BLOCK (sbitmap_first_set_bit (loop->nodes));
8118 loop->last
8119 = BASIC_BLOCK (sbitmap_last_set_bit (loop->nodes));
8120
8121 if (flags & LOOP_EDGES)
8122 {
8123 /* Find edges which enter the loop header.
8124 Note that the entry edges should only
8125 enter the header of a natural loop. */
8126 loop->num_entries
8127 = flow_loop_entry_edges_find (loop->header,
8128 loop->nodes,
8129 &loop->entry_edges);
8130
8131 /* Find edges which exit the loop. */
8132 loop->num_exits
8133 = flow_loop_exit_edges_find (loop->nodes,
8134 &loop->exit_edges);
8135
8136 /* Determine which loop nodes dominate all the exits
8137 of the loop. */
8138 loop->exits_doms = sbitmap_alloc (n_basic_blocks);
8139 sbitmap_copy (loop->exits_doms, loop->nodes);
8140 for (j = 0; j < loop->num_exits; j++)
8141 sbitmap_a_and_b (loop->exits_doms, loop->exits_doms,
8142 dom[loop->exit_edges[j]->src->index]);
8143
8144 /* The header of a natural loop must dominate
8145 all exits. */
8146 if (! TEST_BIT (loop->exits_doms, loop->header->index))
8147 abort ();
8148 }
8149
8150 if (flags & LOOP_PRE_HEADER)
8151 {
8152 /* Look to see if the loop has a pre-header node. */
8153 loop->pre_header
8154 = flow_loop_pre_header_find (loop->header, dom);
8155
8156 flow_loop_pre_header_scan (loop);
8157 }
8158 }
8159
4dc9341c
MH
8160 /* Natural loops with shared headers may either be disjoint or
8161 nested. Disjoint loops with shared headers cannot be inner
8162 loops and should be merged. For now just mark loops that share
8163 headers. */
8164 for (i = 0; i < num_loops; i++)
8165 if (TEST_BIT (loops->shared_headers, loops->array[i].header->index))
8166 loops->array[i].shared = 1;
8167
8168 sbitmap_free (headers);
8169 }
8170
8171 loops->num = num_loops;
8172
8173 /* Save CFG derived information to avoid recomputing it. */
8174 loops->cfg.dom = dom;
8175 loops->cfg.dfs_order = dfs_order;
c34d5374 8176 loops->cfg.rc_order = rc_order;
4dc9341c
MH
8177
8178 /* Build the loop hierarchy tree. */
8179 flow_loops_tree_build (loops);
8180
8181 /* Assign the loop nesting depth and enclosed loop level for each
8182 loop. */
d6181b1b 8183 loops->levels = flow_loops_level_compute (loops);
4dc9341c
MH
8184
8185 return num_loops;
8186}
8187
5d6a16e2
MH
8188
8189/* Update the information regarding the loops in the CFG
8190 specified by LOOPS. */
8191int
8192flow_loops_update (loops, flags)
8193 struct loops *loops;
8194 int flags;
8195{
8196 /* One day we may want to update the current loop data. For now
8197 throw away the old stuff and rebuild what we need. */
8198 if (loops->array)
8199 flow_loops_free (loops);
8200
8201 return flow_loops_find (loops, flags);
8202}
8203
8204
4dc9341c 8205/* Return non-zero if edge E enters header of LOOP from outside of LOOP. */
efc9bd41 8206
4dc9341c
MH
8207int
8208flow_loop_outside_edge_p (loop, e)
8209 const struct loop *loop;
8210 edge e;
8211{
8212 if (e->dest != loop->header)
8213 abort ();
8214 return (e->src == ENTRY_BLOCK_PTR)
8215 || ! TEST_BIT (loop->nodes, e->src->index);
8216}
11bdd2ae 8217
c9bacfdb 8218/* Clear LOG_LINKS fields of insns in a chain.
1868b439
GK
8219 Also clear the global_live_at_{start,end} fields of the basic block
8220 structures. */
efc9bd41 8221
d9d4fb43
AS
8222void
8223clear_log_links (insns)
8224 rtx insns;
8225{
8226 rtx i;
1868b439
GK
8227 int b;
8228
d9d4fb43 8229 for (i = insns; i; i = NEXT_INSN (i))
2c3c49de 8230 if (INSN_P (i))
d9d4fb43 8231 LOG_LINKS (i) = 0;
1868b439
GK
8232
8233 for (b = 0; b < n_basic_blocks; b++)
8234 {
da92f7ff 8235 basic_block bb = BASIC_BLOCK (b);
1868b439
GK
8236
8237 bb->global_live_at_start = NULL;
8238 bb->global_live_at_end = NULL;
8239 }
8240
8241 ENTRY_BLOCK_PTR->global_live_at_end = NULL;
8242 EXIT_BLOCK_PTR->global_live_at_start = NULL;
d9d4fb43 8243}
efc9bd41
RK
8244
8245/* Given a register bitmap, turn on the bits in a HARD_REG_SET that
8246 correspond to the hard registers, if any, set in that map. This
8247 could be done far more efficiently by having all sorts of special-cases
8248 with moving single words, but probably isn't worth the trouble. */
8249
8250void
8251reg_set_to_hard_reg_set (to, from)
8252 HARD_REG_SET *to;
8253 bitmap from;
8254{
8255 int i;
8256
8257 EXECUTE_IF_SET_IN_BITMAP
8258 (from, 0, i,
8259 {
8260 if (i >= FIRST_PSEUDO_REGISTER)
8261 return;
8262 SET_HARD_REG_BIT (*to, i);
8263 });
8264}
1f8f4a0b
MM
8265
8266/* Called once at intialization time. */
8267
8268void
8269init_flow ()
8270{
8271 static int initialized;
8272
8273 if (!initialized)
8274 {
8275 gcc_obstack_init (&flow_obstack);
8276 flow_firstobj = (char *) obstack_alloc (&flow_obstack, 0);
8277 initialized = 1;
8278 }
8279 else
8280 {
8281 obstack_free (&flow_obstack, flow_firstobj);
8282 flow_firstobj = (char *) obstack_alloc (&flow_obstack, 0);
8283 }
8284}
This page took 2.273672 seconds and 5 git commands to generate.