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