OSDN Git Service

* basic-block.h: Improve comments.
[pf3gnuchains/gcc-fork.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 /* Delete all unreachable basic blocks.   */
2059
2060 static void
2061 delete_unreachable_blocks ()
2062 {
2063   basic_block *worklist, *tos;
2064   edge e;
2065   int i, n;
2066
2067   n = n_basic_blocks;
2068   tos = worklist = (basic_block *) xmalloc (sizeof (basic_block) * n);
2069
2070   /* Use basic_block->aux as a marker.  Clear them all.  */
2071
2072   for (i = 0; i < n; ++i)
2073     BASIC_BLOCK (i)->aux = NULL;
2074
2075   /* Add our starting points to the worklist.  Almost always there will
2076      be only one.  It isn't inconcievable that we might one day directly
2077      support Fortran alternate entry points.  */
2078
2079   for (e = ENTRY_BLOCK_PTR->succ; e; e = e->succ_next)
2080     {
2081       *tos++ = e->dest;
2082
2083       /* Mark the block with a handy non-null value.  */
2084       e->dest->aux = e;
2085     }
2086
2087   /* Iterate: find everything reachable from what we've already seen.  */
2088
2089   while (tos != worklist)
2090     {
2091       basic_block b = *--tos;
2092
2093       for (e = b->succ; e; e = e->succ_next)
2094         if (!e->dest->aux)
2095           {
2096             *tos++ = e->dest;
2097             e->dest->aux = e;
2098           }
2099     }
2100
2101   /* Delete all unreachable basic blocks.  Count down so that we
2102      don't interfere with the block renumbering that happens in
2103      flow_delete_block.  */
2104
2105   for (i = n - 1; i >= 0; --i)
2106     {
2107       basic_block b = BASIC_BLOCK (i);
2108
2109       if (b->aux != NULL)
2110         /* This block was found.  Tidy up the mark.  */
2111         b->aux = NULL;
2112       else
2113         flow_delete_block (b);
2114     }
2115
2116   tidy_fallthru_edges ();
2117
2118   free (worklist);
2119 }
2120
2121 /* Return true if NOTE is not one of the ones that must be kept paired,
2122    so that we may simply delete them.  */
2123
2124 static int
2125 can_delete_note_p (note)
2126      rtx note;
2127 {
2128   return (NOTE_LINE_NUMBER (note) == NOTE_INSN_DELETED
2129           || NOTE_LINE_NUMBER (note) == NOTE_INSN_BASIC_BLOCK);
2130 }
2131
2132 /* Unlink a chain of insns between START and FINISH, leaving notes
2133    that must be paired.  */
2134
2135 void
2136 flow_delete_insn_chain (start, finish)
2137      rtx start, finish;
2138 {
2139   /* Unchain the insns one by one.  It would be quicker to delete all
2140      of these with a single unchaining, rather than one at a time, but
2141      we need to keep the NOTE's.  */
2142
2143   rtx next;
2144
2145   while (1)
2146     {
2147       next = NEXT_INSN (start);
2148       if (GET_CODE (start) == NOTE && !can_delete_note_p (start))
2149         ;
2150       else if (GET_CODE (start) == CODE_LABEL
2151                && ! can_delete_label_p (start))
2152         {
2153           const char *name = LABEL_NAME (start);
2154           PUT_CODE (start, NOTE);
2155           NOTE_LINE_NUMBER (start) = NOTE_INSN_DELETED_LABEL;
2156           NOTE_SOURCE_FILE (start) = name;
2157         }
2158       else
2159         next = flow_delete_insn (start);
2160
2161       if (start == finish)
2162         break;
2163       start = next;
2164     }
2165 }
2166
2167 /* Delete the insns in a (non-live) block.  We physically delete every
2168    non-deleted-note insn, and update the flow graph appropriately.
2169
2170    Return nonzero if we deleted an exception handler.  */
2171
2172 /* ??? Preserving all such notes strikes me as wrong.  It would be nice
2173    to post-process the stream to remove empty blocks, loops, ranges, etc.  */
2174
2175 int
2176 flow_delete_block (b)
2177      basic_block b;
2178 {
2179   int deleted_handler = 0;
2180   rtx insn, end, tmp;
2181
2182   /* If the head of this block is a CODE_LABEL, then it might be the
2183      label for an exception handler which can't be reached.
2184
2185      We need to remove the label from the exception_handler_label list
2186      and remove the associated NOTE_INSN_EH_REGION_BEG and
2187      NOTE_INSN_EH_REGION_END notes.  */
2188
2189   insn = b->head;
2190
2191   never_reached_warning (insn);
2192
2193   if (GET_CODE (insn) == CODE_LABEL)
2194     maybe_remove_eh_handler (insn);
2195
2196   /* Include any jump table following the basic block.  */
2197   end = b->end;
2198   if (GET_CODE (end) == JUMP_INSN
2199       && (tmp = JUMP_LABEL (end)) != NULL_RTX
2200       && (tmp = NEXT_INSN (tmp)) != NULL_RTX
2201       && GET_CODE (tmp) == JUMP_INSN
2202       && (GET_CODE (PATTERN (tmp)) == ADDR_VEC
2203           || GET_CODE (PATTERN (tmp)) == ADDR_DIFF_VEC))
2204     end = tmp;
2205
2206   /* Include any barrier that may follow the basic block.  */
2207   tmp = next_nonnote_insn (end);
2208   if (tmp && GET_CODE (tmp) == BARRIER)
2209     end = tmp;
2210
2211   /* Selectively delete the entire chain.  */
2212   flow_delete_insn_chain (insn, end);
2213
2214   /* Remove the edges into and out of this block.  Note that there may
2215      indeed be edges in, if we are removing an unreachable loop.  */
2216   {
2217     edge e, next, *q;
2218
2219     for (e = b->pred; e; e = next)
2220       {
2221         for (q = &e->src->succ; *q != e; q = &(*q)->succ_next)
2222           continue;
2223         *q = e->succ_next;
2224         next = e->pred_next;
2225         n_edges--;
2226         free (e);
2227       }
2228     for (e = b->succ; e; e = next)
2229       {
2230         for (q = &e->dest->pred; *q != e; q = &(*q)->pred_next)
2231           continue;
2232         *q = e->pred_next;
2233         next = e->succ_next;
2234         n_edges--;
2235         free (e);
2236       }
2237
2238     b->pred = NULL;
2239     b->succ = NULL;
2240   }
2241
2242   /* Remove the basic block from the array, and compact behind it.  */
2243   expunge_block (b);
2244
2245   return deleted_handler;
2246 }
2247
2248 /* Remove block B from the basic block array and compact behind it.  */
2249
2250 static void
2251 expunge_block (b)
2252      basic_block b;
2253 {
2254   int i, n = n_basic_blocks;
2255
2256   for (i = b->index; i + 1 < n; ++i)
2257     {
2258       basic_block x = BASIC_BLOCK (i + 1);
2259       BASIC_BLOCK (i) = x;
2260       x->index = i;
2261     }
2262
2263   basic_block_info->num_elements--;
2264   n_basic_blocks--;
2265 }
2266
2267 /* Delete INSN by patching it out.  Return the next insn.  */
2268
2269 rtx
2270 flow_delete_insn (insn)
2271      rtx insn;
2272 {
2273   rtx prev = PREV_INSN (insn);
2274   rtx next = NEXT_INSN (insn);
2275   rtx note;
2276
2277   PREV_INSN (insn) = NULL_RTX;
2278   NEXT_INSN (insn) = NULL_RTX;
2279   INSN_DELETED_P (insn) = 1;
2280
2281   if (prev)
2282     NEXT_INSN (prev) = next;
2283   if (next)
2284     PREV_INSN (next) = prev;
2285   else
2286     set_last_insn (prev);
2287
2288   if (GET_CODE (insn) == CODE_LABEL)
2289     remove_node_from_expr_list (insn, &nonlocal_goto_handler_labels);
2290
2291   /* If deleting a jump, decrement the use count of the label.  Deleting
2292      the label itself should happen in the normal course of block merging.  */
2293   if (GET_CODE (insn) == JUMP_INSN
2294       && JUMP_LABEL (insn)
2295       && GET_CODE (JUMP_LABEL (insn)) == CODE_LABEL)
2296     LABEL_NUSES (JUMP_LABEL (insn))--;
2297
2298   /* Also if deleting an insn that references a label.  */
2299   else if ((note = find_reg_note (insn, REG_LABEL, NULL_RTX)) != NULL_RTX
2300            && GET_CODE (XEXP (note, 0)) == CODE_LABEL)
2301     LABEL_NUSES (XEXP (note, 0))--;
2302
2303   return next;
2304 }
2305
2306 /* True if a given label can be deleted.  */
2307
2308 static int
2309 can_delete_label_p (label)
2310      rtx label;
2311 {
2312   rtx x;
2313
2314   if (LABEL_PRESERVE_P (label))
2315     return 0;
2316
2317   for (x = forced_labels; x; x = XEXP (x, 1))
2318     if (label == XEXP (x, 0))
2319       return 0;
2320   for (x = label_value_list; x; x = XEXP (x, 1))
2321     if (label == XEXP (x, 0))
2322       return 0;
2323   for (x = exception_handler_labels; x; x = XEXP (x, 1))
2324     if (label == XEXP (x, 0))
2325       return 0;
2326
2327   /* User declared labels must be preserved.  */
2328   if (LABEL_NAME (label) != 0)
2329     return 0;
2330
2331   return 1;
2332 }
2333
2334 static int
2335 tail_recursion_label_p (label)
2336      rtx label;
2337 {
2338   rtx x;
2339
2340   for (x = tail_recursion_label_list; x; x = XEXP (x, 1))
2341     if (label == XEXP (x, 0))
2342       return 1;
2343
2344   return 0;
2345 }
2346
2347 /* Blocks A and B are to be merged into a single block A.  The insns
2348    are already contiguous, hence `nomove'.  */
2349
2350 void
2351 merge_blocks_nomove (a, b)
2352      basic_block a, b;
2353 {
2354   edge e;
2355   rtx b_head, b_end, a_end;
2356   rtx del_first = NULL_RTX, del_last = NULL_RTX;
2357   int b_empty = 0;
2358
2359   /* If there was a CODE_LABEL beginning B, delete it.  */
2360   b_head = b->head;
2361   b_end = b->end;
2362   if (GET_CODE (b_head) == CODE_LABEL)
2363     {
2364       /* Detect basic blocks with nothing but a label.  This can happen
2365          in particular at the end of a function.  */
2366       if (b_head == b_end)
2367         b_empty = 1;
2368       del_first = del_last = b_head;
2369       b_head = NEXT_INSN (b_head);
2370     }
2371
2372   /* Delete the basic block note.  */
2373   if (NOTE_INSN_BASIC_BLOCK_P (b_head))
2374     {
2375       if (b_head == b_end)
2376         b_empty = 1;
2377       if (! del_last)
2378         del_first = b_head;
2379       del_last = b_head;
2380       b_head = NEXT_INSN (b_head);
2381     }
2382
2383   /* If there was a jump out of A, delete it.  */
2384   a_end = a->end;
2385   if (GET_CODE (a_end) == JUMP_INSN)
2386     {
2387       rtx prev;
2388
2389       for (prev = PREV_INSN (a_end); ; prev = PREV_INSN (prev))
2390         if (GET_CODE (prev) != NOTE
2391             || NOTE_LINE_NUMBER (prev) == NOTE_INSN_BASIC_BLOCK
2392             || prev == a->head)
2393           break;
2394
2395       del_first = a_end;
2396
2397 #ifdef HAVE_cc0
2398       /* If this was a conditional jump, we need to also delete
2399          the insn that set cc0.  */
2400       if (prev && sets_cc0_p (prev))
2401         {
2402           rtx tmp = prev;
2403           prev = prev_nonnote_insn (prev);
2404           if (!prev)
2405             prev = a->head;
2406           del_first = tmp;
2407         }
2408 #endif
2409
2410       a_end = prev;
2411     }
2412   else if (GET_CODE (NEXT_INSN (a_end)) == BARRIER)
2413     del_first = NEXT_INSN (a_end);
2414
2415   /* Delete everything marked above as well as crap that might be
2416      hanging out between the two blocks.  */
2417   flow_delete_insn_chain (del_first, del_last);
2418
2419   /* Normally there should only be one successor of A and that is B, but
2420      partway though the merge of blocks for conditional_execution we'll
2421      be merging a TEST block with THEN and ELSE successors.  Free the
2422      whole lot of them and hope the caller knows what they're doing.  */
2423   while (a->succ)
2424     remove_edge (a->succ);
2425
2426   /* Adjust the edges out of B for the new owner.  */
2427   for (e = b->succ; e; e = e->succ_next)
2428     e->src = a;
2429   a->succ = b->succ;
2430
2431   /* B hasn't quite yet ceased to exist.  Attempt to prevent mishap.  */
2432   b->pred = b->succ = NULL;
2433
2434   /* Reassociate the insns of B with A.  */
2435   if (!b_empty)
2436     {
2437       if (basic_block_for_insn)
2438         {
2439           BLOCK_FOR_INSN (b_head) = a;
2440           while (b_head != b_end)
2441             {
2442               b_head = NEXT_INSN (b_head);
2443               BLOCK_FOR_INSN (b_head) = a;
2444             }
2445         }
2446       a_end = b_end;
2447     }
2448   a->end = a_end;
2449
2450   expunge_block (b);
2451 }
2452
2453 /* Blocks A and B are to be merged into a single block.  A has no incoming
2454    fallthru edge, so it can be moved before B without adding or modifying
2455    any jumps (aside from the jump from A to B).  */
2456
2457 static int
2458 merge_blocks_move_predecessor_nojumps (a, b)
2459      basic_block a, b;
2460 {
2461   rtx start, end, barrier;
2462   int index;
2463
2464   start = a->head;
2465   end = a->end;
2466
2467   barrier = next_nonnote_insn (end);
2468   if (GET_CODE (barrier) != BARRIER)
2469     abort ();
2470   flow_delete_insn (barrier);
2471
2472   /* Move block and loop notes out of the chain so that we do not
2473      disturb their order.
2474
2475      ??? A better solution would be to squeeze out all the non-nested notes
2476      and adjust the block trees appropriately.   Even better would be to have
2477      a tighter connection between block trees and rtl so that this is not
2478      necessary.  */
2479   start = squeeze_notes (start, end);
2480
2481   /* Scramble the insn chain.  */
2482   if (end != PREV_INSN (b->head))
2483     reorder_insns (start, end, PREV_INSN (b->head));
2484
2485   if (rtl_dump_file)
2486     {
2487       fprintf (rtl_dump_file, "Moved block %d before %d and merged.\n",
2488                a->index, b->index);
2489     }
2490
2491   /* Swap the records for the two blocks around.  Although we are deleting B,
2492      A is now where B was and we want to compact the BB array from where
2493      A used to be.  */
2494   BASIC_BLOCK (a->index) = b;
2495   BASIC_BLOCK (b->index) = a;
2496   index = a->index;
2497   a->index = b->index;
2498   b->index = index;
2499
2500   /* Now blocks A and B are contiguous.  Merge them.  */
2501   merge_blocks_nomove (a, b);
2502
2503   return 1;
2504 }
2505
2506 /* Blocks A and B are to be merged into a single block.  B has no outgoing
2507    fallthru edge, so it can be moved after A without adding or modifying
2508    any jumps (aside from the jump from A to B).  */
2509
2510 static int
2511 merge_blocks_move_successor_nojumps (a, b)
2512      basic_block a, b;
2513 {
2514   rtx start, end, barrier;
2515
2516   start = b->head;
2517   end = b->end;
2518   barrier = NEXT_INSN (end);
2519
2520   /* Recognize a jump table following block B.  */
2521   if (GET_CODE (barrier) == CODE_LABEL
2522       && NEXT_INSN (barrier)
2523       && GET_CODE (NEXT_INSN (barrier)) == JUMP_INSN
2524       && (GET_CODE (PATTERN (NEXT_INSN (barrier))) == ADDR_VEC
2525           || GET_CODE (PATTERN (NEXT_INSN (barrier))) == ADDR_DIFF_VEC))
2526     {
2527       end = NEXT_INSN (barrier);
2528       barrier = NEXT_INSN (end);
2529     }
2530
2531   /* There had better have been a barrier there.  Delete it.  */
2532   if (GET_CODE (barrier) != BARRIER)
2533     abort ();
2534   flow_delete_insn (barrier);
2535
2536   /* Move block and loop notes out of the chain so that we do not
2537      disturb their order.
2538
2539      ??? A better solution would be to squeeze out all the non-nested notes
2540      and adjust the block trees appropriately.   Even better would be to have
2541      a tighter connection between block trees and rtl so that this is not
2542      necessary.  */
2543   start = squeeze_notes (start, end);
2544
2545   /* Scramble the insn chain.  */
2546   reorder_insns (start, end, a->end);
2547
2548   /* Now blocks A and B are contiguous.  Merge them.  */
2549   merge_blocks_nomove (a, b);
2550
2551   if (rtl_dump_file)
2552     {
2553       fprintf (rtl_dump_file, "Moved block %d after %d and merged.\n",
2554                b->index, a->index);
2555     }
2556
2557   return 1;
2558 }
2559
2560 /* Attempt to merge basic blocks that are potentially non-adjacent.
2561    Return true iff the attempt succeeded.  */
2562
2563 static int
2564 merge_blocks (e, b, c)
2565      edge e;
2566      basic_block b, c;
2567 {
2568   /* If C has a tail recursion label, do not merge.  There is no
2569      edge recorded from the call_placeholder back to this label, as
2570      that would make optimize_sibling_and_tail_recursive_calls more
2571      complex for no gain.  */
2572   if (GET_CODE (c->head) == CODE_LABEL
2573       && tail_recursion_label_p (c->head))
2574     return 0;
2575
2576   /* If B has a fallthru edge to C, no need to move anything.  */
2577   if (e->flags & EDGE_FALLTHRU)
2578     {
2579       merge_blocks_nomove (b, c);
2580
2581       if (rtl_dump_file)
2582         {
2583           fprintf (rtl_dump_file, "Merged %d and %d without moving.\n",
2584                    b->index, c->index);
2585         }
2586
2587       return 1;
2588     }
2589   else
2590     {
2591       edge tmp_edge;
2592       int c_has_outgoing_fallthru;
2593       int b_has_incoming_fallthru;
2594
2595       /* We must make sure to not munge nesting of exception regions,
2596          lexical blocks, and loop notes.
2597
2598          The first is taken care of by requiring that the active eh
2599          region at the end of one block always matches the active eh
2600          region at the beginning of the next block.
2601
2602          The later two are taken care of by squeezing out all the notes.  */
2603
2604       /* ???  A throw/catch edge (or any abnormal edge) should be rarely
2605          executed and we may want to treat blocks which have two out
2606          edges, one normal, one abnormal as only having one edge for
2607          block merging purposes.  */
2608
2609       for (tmp_edge = c->succ; tmp_edge; tmp_edge = tmp_edge->succ_next)
2610         if (tmp_edge->flags & EDGE_FALLTHRU)
2611           break;
2612       c_has_outgoing_fallthru = (tmp_edge != NULL);
2613
2614       for (tmp_edge = b->pred; tmp_edge; tmp_edge = tmp_edge->pred_next)
2615         if (tmp_edge->flags & EDGE_FALLTHRU)
2616           break;
2617       b_has_incoming_fallthru = (tmp_edge != NULL);
2618
2619       /* If B does not have an incoming fallthru, then it can be moved
2620          immediately before C without introducing or modifying jumps.
2621          C cannot be the first block, so we do not have to worry about
2622          accessing a non-existent block.  */
2623       if (! b_has_incoming_fallthru)
2624         return merge_blocks_move_predecessor_nojumps (b, c);
2625
2626       /* Otherwise, we're going to try to move C after B.  If C does
2627          not have an outgoing fallthru, then it can be moved
2628          immediately after B without introducing or modifying jumps.  */
2629       if (! c_has_outgoing_fallthru)
2630         return merge_blocks_move_successor_nojumps (b, c);
2631
2632       /* Otherwise, we'll need to insert an extra jump, and possibly
2633          a new block to contain it.  */
2634       /* ??? Not implemented yet.  */
2635
2636       return 0;
2637     }
2638 }
2639
2640 /* Top level driver for merge_blocks.  */
2641
2642 static void
2643 try_merge_blocks ()
2644 {
2645   int i;
2646
2647   /* Attempt to merge blocks as made possible by edge removal.  If a block
2648      has only one successor, and the successor has only one predecessor,
2649      they may be combined.  */
2650
2651   for (i = 0; i < n_basic_blocks;)
2652     {
2653       basic_block c, b = BASIC_BLOCK (i);
2654       edge s;
2655
2656       /* A loop because chains of blocks might be combineable.  */
2657       while ((s = b->succ) != NULL
2658              && s->succ_next == NULL
2659              && (s->flags & EDGE_EH) == 0
2660              && (c = s->dest) != EXIT_BLOCK_PTR
2661              && c->pred->pred_next == NULL
2662              /* If the jump insn has side effects, we can't kill the edge.  */
2663              && (GET_CODE (b->end) != JUMP_INSN
2664                  || onlyjump_p (b->end))
2665              && merge_blocks (s, b, c))
2666         continue;
2667
2668       /* Don't get confused by the index shift caused by deleting blocks.  */
2669       i = b->index + 1;
2670     }
2671 }
2672
2673 /* The given edge should potentially be a fallthru edge.  If that is in
2674    fact true, delete the jump and barriers that are in the way.  */
2675
2676 void
2677 tidy_fallthru_edge (e, b, c)
2678      edge e;
2679      basic_block b, c;
2680 {
2681   rtx q;
2682
2683   /* ??? In a late-running flow pass, other folks may have deleted basic
2684      blocks by nopping out blocks, leaving multiple BARRIERs between here
2685      and the target label. They ought to be chastized and fixed.
2686
2687      We can also wind up with a sequence of undeletable labels between
2688      one block and the next.
2689
2690      So search through a sequence of barriers, labels, and notes for
2691      the head of block C and assert that we really do fall through.  */
2692
2693   if (next_real_insn (b->end) != next_real_insn (PREV_INSN (c->head)))
2694     return;
2695
2696   /* Remove what will soon cease being the jump insn from the source block.
2697      If block B consisted only of this single jump, turn it into a deleted
2698      note.  */
2699   q = b->end;
2700   if (GET_CODE (q) == JUMP_INSN
2701       && onlyjump_p (q)
2702       && (any_uncondjump_p (q)
2703           || (b->succ == e && e->succ_next == NULL)))
2704     {
2705 #ifdef HAVE_cc0
2706       /* If this was a conditional jump, we need to also delete
2707          the insn that set cc0.  */
2708       if (any_condjump_p (q) && sets_cc0_p (PREV_INSN (q)))
2709         q = PREV_INSN (q);
2710 #endif
2711
2712       if (b->head == q)
2713         {
2714           PUT_CODE (q, NOTE);
2715           NOTE_LINE_NUMBER (q) = NOTE_INSN_DELETED;
2716           NOTE_SOURCE_FILE (q) = 0;
2717         }
2718       else
2719         {
2720           q = PREV_INSN (q);
2721
2722           /* We don't want a block to end on a line-number note since that has
2723              the potential of changing the code between -g and not -g.  */
2724           while (GET_CODE (q) == NOTE && NOTE_LINE_NUMBER (q) >= 0)
2725             q = PREV_INSN (q);
2726         }
2727
2728       b->end = q;
2729     }
2730
2731   /* Selectively unlink the sequence.  */
2732   if (q != PREV_INSN (c->head))
2733     flow_delete_insn_chain (NEXT_INSN (q), PREV_INSN (c->head));
2734
2735   e->flags |= EDGE_FALLTHRU;
2736 }
2737
2738 /* Fix up edges that now fall through, or rather should now fall through
2739    but previously required a jump around now deleted blocks.  Simplify
2740    the search by only examining blocks numerically adjacent, since this
2741    is how find_basic_blocks created them.  */
2742
2743 static void
2744 tidy_fallthru_edges ()
2745 {
2746   int i;
2747
2748   for (i = 1; i < n_basic_blocks; ++i)
2749     {
2750       basic_block b = BASIC_BLOCK (i - 1);
2751       basic_block c = BASIC_BLOCK (i);
2752       edge s;
2753
2754       /* We care about simple conditional or unconditional jumps with
2755          a single successor.
2756
2757          If we had a conditional branch to the next instruction when
2758          find_basic_blocks was called, then there will only be one
2759          out edge for the block which ended with the conditional
2760          branch (since we do not create duplicate edges).
2761
2762          Furthermore, the edge will be marked as a fallthru because we
2763          merge the flags for the duplicate edges.  So we do not want to
2764          check that the edge is not a FALLTHRU edge.  */
2765       if ((s = b->succ) != NULL
2766           && ! (s->flags & EDGE_COMPLEX)
2767           && s->succ_next == NULL
2768           && s->dest == c
2769           /* If the jump insn has side effects, we can't tidy the edge.  */
2770           && (GET_CODE (b->end) != JUMP_INSN
2771               || onlyjump_p (b->end)))
2772         tidy_fallthru_edge (s, b, c);
2773     }
2774 }
2775 \f
2776 /* Perform data flow analysis.
2777    F is the first insn of the function; FLAGS is a set of PROP_* flags
2778    to be used in accumulating flow info.  */
2779
2780 void
2781 life_analysis (f, file, flags)
2782      rtx f;
2783      FILE *file;
2784      int flags;
2785 {
2786 #ifdef ELIMINABLE_REGS
2787   register int i;
2788   static struct {int from, to; } eliminables[] = ELIMINABLE_REGS;
2789 #endif
2790
2791   /* Record which registers will be eliminated.  We use this in
2792      mark_used_regs.  */
2793
2794   CLEAR_HARD_REG_SET (elim_reg_set);
2795
2796 #ifdef ELIMINABLE_REGS
2797   for (i = 0; i < (int) ARRAY_SIZE (eliminables); i++)
2798     SET_HARD_REG_BIT (elim_reg_set, eliminables[i].from);
2799 #else
2800   SET_HARD_REG_BIT (elim_reg_set, FRAME_POINTER_REGNUM);
2801 #endif
2802
2803   if (! optimize)
2804     flags &= ~(PROP_LOG_LINKS | PROP_AUTOINC);
2805
2806   /* The post-reload life analysis have (on a global basis) the same
2807      registers live as was computed by reload itself.  elimination
2808      Otherwise offsets and such may be incorrect.
2809
2810      Reload will make some registers as live even though they do not
2811      appear in the rtl.
2812
2813      We don't want to create new auto-incs after reload, since they
2814      are unlikely to be useful and can cause problems with shared
2815      stack slots.  */
2816   if (reload_completed)
2817     flags &= ~(PROP_REG_INFO | PROP_AUTOINC);
2818
2819   /* We want alias analysis information for local dead store elimination.  */
2820   if (optimize && (flags & PROP_SCAN_DEAD_CODE))
2821     init_alias_analysis ();
2822
2823   /* Always remove no-op moves.  Do this before other processing so
2824      that we don't have to keep re-scanning them.  */
2825   delete_noop_moves (f);
2826
2827   /* Some targets can emit simpler epilogues if they know that sp was
2828      not ever modified during the function.  After reload, of course,
2829      we've already emitted the epilogue so there's no sense searching.  */
2830   if (! reload_completed)
2831     notice_stack_pointer_modification (f);
2832
2833   /* Allocate and zero out data structures that will record the
2834      data from lifetime analysis.  */
2835   allocate_reg_life_data ();
2836   allocate_bb_life_data ();
2837
2838   /* Find the set of registers live on function exit.  */
2839   mark_regs_live_at_end (EXIT_BLOCK_PTR->global_live_at_start);
2840
2841   /* "Update" life info from zero.  It'd be nice to begin the
2842      relaxation with just the exit and noreturn blocks, but that set
2843      is not immediately handy.  */
2844
2845   if (flags & PROP_REG_INFO)
2846     memset (regs_ever_live, 0, sizeof (regs_ever_live));
2847   update_life_info (NULL, UPDATE_LIFE_GLOBAL, flags);
2848
2849   /* Clean up.  */
2850   if (optimize && (flags & PROP_SCAN_DEAD_CODE))
2851     end_alias_analysis ();
2852
2853   if (file)
2854     dump_flow_info (file);
2855
2856   free_basic_block_vars (1);
2857
2858 #ifdef ENABLE_CHECKING
2859   {
2860     rtx insn;
2861
2862     /* Search for any REG_LABEL notes which reference deleted labels.  */
2863     for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
2864       {
2865         rtx inote = find_reg_note (insn, REG_LABEL, NULL_RTX);
2866
2867         if (inote && GET_CODE (inote) == NOTE_INSN_DELETED_LABEL)
2868           abort ();
2869       }
2870   }
2871 #endif
2872 }
2873
2874 /* A subroutine of verify_wide_reg, called through for_each_rtx.
2875    Search for REGNO.  If found, abort if it is not wider than word_mode.  */
2876
2877 static int
2878 verify_wide_reg_1 (px, pregno)
2879      rtx *px;
2880      void *pregno;
2881 {
2882   rtx x = *px;
2883   unsigned int regno = *(int *) pregno;
2884
2885   if (GET_CODE (x) == REG && REGNO (x) == regno)
2886     {
2887       if (GET_MODE_BITSIZE (GET_MODE (x)) <= BITS_PER_WORD)
2888         abort ();
2889       return 1;
2890     }
2891   return 0;
2892 }
2893
2894 /* A subroutine of verify_local_live_at_start.  Search through insns
2895    between HEAD and END looking for register REGNO.  */
2896
2897 static void
2898 verify_wide_reg (regno, head, end)
2899      int regno;
2900      rtx head, end;
2901 {
2902   while (1)
2903     {
2904       if (INSN_P (head)
2905           && for_each_rtx (&PATTERN (head), verify_wide_reg_1, &regno))
2906         return;
2907       if (head == end)
2908         break;
2909       head = NEXT_INSN (head);
2910     }
2911
2912   /* We didn't find the register at all.  Something's way screwy.  */
2913   if (rtl_dump_file)
2914     fprintf (rtl_dump_file, "Aborting in verify_wide_reg; reg %d\n", regno);
2915   print_rtl_and_abort ();
2916 }
2917
2918 /* A subroutine of update_life_info.  Verify that there are no untoward
2919    changes in live_at_start during a local update.  */
2920
2921 static void
2922 verify_local_live_at_start (new_live_at_start, bb)
2923      regset new_live_at_start;
2924      basic_block bb;
2925 {
2926   if (reload_completed)
2927     {
2928       /* After reload, there are no pseudos, nor subregs of multi-word
2929          registers.  The regsets should exactly match.  */
2930       if (! REG_SET_EQUAL_P (new_live_at_start, bb->global_live_at_start))
2931         {
2932           if (rtl_dump_file)
2933             {
2934               fprintf (rtl_dump_file,
2935                        "live_at_start mismatch in bb %d, aborting\n",
2936                        bb->index);
2937               debug_bitmap_file (rtl_dump_file, bb->global_live_at_start);
2938               debug_bitmap_file (rtl_dump_file, new_live_at_start);
2939             }
2940           print_rtl_and_abort ();
2941         }
2942     }
2943   else
2944     {
2945       int i;
2946
2947       /* Find the set of changed registers.  */
2948       XOR_REG_SET (new_live_at_start, bb->global_live_at_start);
2949
2950       EXECUTE_IF_SET_IN_REG_SET (new_live_at_start, 0, i,
2951         {
2952           /* No registers should die.  */
2953           if (REGNO_REG_SET_P (bb->global_live_at_start, i))
2954             {
2955               if (rtl_dump_file)
2956                 fprintf (rtl_dump_file,
2957                          "Register %d died unexpectedly in block %d\n", i,
2958                          bb->index);
2959               print_rtl_and_abort ();
2960             }
2961
2962           /* Verify that the now-live register is wider than word_mode.  */
2963           verify_wide_reg (i, bb->head, bb->end);
2964         });
2965     }
2966 }
2967
2968 /* Updates life information starting with the basic blocks set in BLOCKS.
2969    If BLOCKS is null, consider it to be the universal set.
2970
2971    If EXTENT is UPDATE_LIFE_LOCAL, such as after splitting or peepholeing,
2972    we are only expecting local modifications to basic blocks.  If we find
2973    extra registers live at the beginning of a block, then we either killed
2974    useful data, or we have a broken split that wants data not provided.
2975    If we find registers removed from live_at_start, that means we have
2976    a broken peephole that is killing a register it shouldn't.
2977
2978    ??? This is not true in one situation -- when a pre-reload splitter
2979    generates subregs of a multi-word pseudo, current life analysis will
2980    lose the kill.  So we _can_ have a pseudo go live.  How irritating.
2981
2982    Including PROP_REG_INFO does not properly refresh regs_ever_live
2983    unless the caller resets it to zero.  */
2984
2985 void
2986 update_life_info (blocks, extent, prop_flags)
2987      sbitmap blocks;
2988      enum update_life_extent extent;
2989      int prop_flags;
2990 {
2991   regset tmp;
2992   regset_head tmp_head;
2993   int i;
2994
2995   tmp = INITIALIZE_REG_SET (tmp_head);
2996
2997   /* For a global update, we go through the relaxation process again.  */
2998   if (extent != UPDATE_LIFE_LOCAL)
2999     {
3000       calculate_global_regs_live (blocks, blocks,
3001                                   prop_flags & PROP_SCAN_DEAD_CODE);
3002
3003       /* If asked, remove notes from the blocks we'll update.  */
3004       if (extent == UPDATE_LIFE_GLOBAL_RM_NOTES)
3005         count_or_remove_death_notes (blocks, 1);
3006     }
3007
3008   if (blocks)
3009     {
3010       EXECUTE_IF_SET_IN_SBITMAP (blocks, 0, i,
3011         {
3012           basic_block bb = BASIC_BLOCK (i);
3013
3014           COPY_REG_SET (tmp, bb->global_live_at_end);
3015           propagate_block (bb, tmp, NULL, NULL, prop_flags);
3016
3017           if (extent == UPDATE_LIFE_LOCAL)
3018             verify_local_live_at_start (tmp, bb);
3019         });
3020     }
3021   else
3022     {
3023       for (i = n_basic_blocks - 1; i >= 0; --i)
3024         {
3025           basic_block bb = BASIC_BLOCK (i);
3026
3027           COPY_REG_SET (tmp, bb->global_live_at_end);
3028           propagate_block (bb, tmp, NULL, NULL, prop_flags);
3029
3030           if (extent == UPDATE_LIFE_LOCAL)
3031             verify_local_live_at_start (tmp, bb);
3032         }
3033     }
3034
3035   FREE_REG_SET (tmp);
3036
3037   if (prop_flags & PROP_REG_INFO)
3038     {
3039       /* The only pseudos that are live at the beginning of the function
3040          are those that were not set anywhere in the function.  local-alloc
3041          doesn't know how to handle these correctly, so mark them as not
3042          local to any one basic block.  */
3043       EXECUTE_IF_SET_IN_REG_SET (ENTRY_BLOCK_PTR->global_live_at_end,
3044                                  FIRST_PSEUDO_REGISTER, i,
3045                                  { REG_BASIC_BLOCK (i) = REG_BLOCK_GLOBAL; });
3046
3047       /* We have a problem with any pseudoreg that lives across the setjmp.
3048          ANSI says that if a user variable does not change in value between
3049          the setjmp and the longjmp, then the longjmp preserves it.  This
3050          includes longjmp from a place where the pseudo appears dead.
3051          (In principle, the value still exists if it is in scope.)
3052          If the pseudo goes in a hard reg, some other value may occupy
3053          that hard reg where this pseudo is dead, thus clobbering the pseudo.
3054          Conclusion: such a pseudo must not go in a hard reg.  */
3055       EXECUTE_IF_SET_IN_REG_SET (regs_live_at_setjmp,
3056                                  FIRST_PSEUDO_REGISTER, i,
3057                                  {
3058                                    if (regno_reg_rtx[i] != 0)
3059                                      {
3060                                        REG_LIVE_LENGTH (i) = -1;
3061                                        REG_BASIC_BLOCK (i) = REG_BLOCK_UNKNOWN;
3062                                      }
3063                                  });
3064     }
3065 }
3066
3067 /* Free the variables allocated by find_basic_blocks.
3068
3069    KEEP_HEAD_END_P is non-zero if basic_block_info is not to be freed.  */
3070
3071 void
3072 free_basic_block_vars (keep_head_end_p)
3073      int keep_head_end_p;
3074 {
3075   if (basic_block_for_insn)
3076     {
3077       VARRAY_FREE (basic_block_for_insn);
3078       basic_block_for_insn = NULL;
3079     }
3080
3081   if (! keep_head_end_p)
3082     {
3083       clear_edges ();
3084       VARRAY_FREE (basic_block_info);
3085       n_basic_blocks = 0;
3086
3087       ENTRY_BLOCK_PTR->aux = NULL;
3088       ENTRY_BLOCK_PTR->global_live_at_end = NULL;
3089       EXIT_BLOCK_PTR->aux = NULL;
3090       EXIT_BLOCK_PTR->global_live_at_start = NULL;
3091     }
3092 }
3093
3094 /* Return nonzero if an insn consists only of SETs, each of which only sets a
3095    value to itself.  */
3096
3097 static int
3098 noop_move_p (insn)
3099      rtx insn;
3100 {
3101   rtx pat = PATTERN (insn);
3102
3103   /* Insns carrying these notes are useful later on.  */
3104   if (find_reg_note (insn, REG_EQUAL, NULL_RTX))
3105     return 0;
3106
3107   if (GET_CODE (pat) == SET && set_noop_p (pat))
3108     return 1;
3109
3110   if (GET_CODE (pat) == PARALLEL)
3111     {
3112       int i;
3113       /* If nothing but SETs of registers to themselves,
3114          this insn can also be deleted.  */
3115       for (i = 0; i < XVECLEN (pat, 0); i++)
3116         {
3117           rtx tem = XVECEXP (pat, 0, i);
3118
3119           if (GET_CODE (tem) == USE
3120               || GET_CODE (tem) == CLOBBER)
3121             continue;
3122
3123           if (GET_CODE (tem) != SET || ! set_noop_p (tem))
3124             return 0;
3125         }
3126
3127       return 1;
3128     }
3129   return 0;
3130 }
3131
3132 /* Delete any insns that copy a register to itself.  */
3133
3134 static void
3135 delete_noop_moves (f)
3136      rtx f;
3137 {
3138   rtx insn;
3139   for (insn = f; insn; insn = NEXT_INSN (insn))
3140     {
3141       if (GET_CODE (insn) == INSN && noop_move_p (insn))
3142         {
3143           PUT_CODE (insn, NOTE);
3144           NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
3145           NOTE_SOURCE_FILE (insn) = 0;
3146         }
3147     }
3148 }
3149
3150 /* Determine if the stack pointer is constant over the life of the function.
3151    Only useful before prologues have been emitted.  */
3152
3153 static void
3154 notice_stack_pointer_modification_1 (x, pat, data)
3155      rtx x;
3156      rtx pat ATTRIBUTE_UNUSED;
3157      void *data ATTRIBUTE_UNUSED;
3158 {
3159   if (x == stack_pointer_rtx
3160       /* The stack pointer is only modified indirectly as the result
3161          of a push until later in flow.  See the comments in rtl.texi
3162          regarding Embedded Side-Effects on Addresses.  */
3163       || (GET_CODE (x) == MEM
3164           && GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) == 'a'
3165           && XEXP (XEXP (x, 0), 0) == stack_pointer_rtx))
3166     current_function_sp_is_unchanging = 0;
3167 }
3168
3169 static void
3170 notice_stack_pointer_modification (f)
3171      rtx f;
3172 {
3173   rtx insn;
3174
3175   /* Assume that the stack pointer is unchanging if alloca hasn't
3176      been used.  */
3177   current_function_sp_is_unchanging = !current_function_calls_alloca;
3178   if (! current_function_sp_is_unchanging)
3179     return;
3180
3181   for (insn = f; insn; insn = NEXT_INSN (insn))
3182     {
3183       if (INSN_P (insn))
3184         {
3185           /* Check if insn modifies the stack pointer.  */
3186           note_stores (PATTERN (insn), notice_stack_pointer_modification_1,
3187                        NULL);
3188           if (! current_function_sp_is_unchanging)
3189             return;
3190         }
3191     }
3192 }
3193
3194 /* Mark a register in SET.  Hard registers in large modes get all
3195    of their component registers set as well.  */
3196
3197 static void
3198 mark_reg (reg, xset)
3199      rtx reg;
3200      void *xset;
3201 {
3202   regset set = (regset) xset;
3203   int regno = REGNO (reg);
3204
3205   if (GET_MODE (reg) == BLKmode)
3206     abort ();
3207
3208   SET_REGNO_REG_SET (set, regno);
3209   if (regno < FIRST_PSEUDO_REGISTER)
3210     {
3211       int n = HARD_REGNO_NREGS (regno, GET_MODE (reg));
3212       while (--n > 0)
3213         SET_REGNO_REG_SET (set, regno + n);
3214     }
3215 }
3216
3217 /* Mark those regs which are needed at the end of the function as live
3218    at the end of the last basic block.  */
3219
3220 static void
3221 mark_regs_live_at_end (set)
3222      regset set;
3223 {
3224   int i;
3225
3226   /* If exiting needs the right stack value, consider the stack pointer
3227      live at the end of the function.  */
3228   if ((HAVE_epilogue && reload_completed)
3229       || ! EXIT_IGNORE_STACK
3230       || (! FRAME_POINTER_REQUIRED
3231           && ! current_function_calls_alloca
3232           && flag_omit_frame_pointer)
3233       || current_function_sp_is_unchanging)
3234     {
3235       SET_REGNO_REG_SET (set, STACK_POINTER_REGNUM);
3236     }
3237
3238   /* Mark the frame pointer if needed at the end of the function.  If
3239      we end up eliminating it, it will be removed from the live list
3240      of each basic block by reload.  */
3241
3242   if (! reload_completed || frame_pointer_needed)
3243     {
3244       SET_REGNO_REG_SET (set, FRAME_POINTER_REGNUM);
3245 #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
3246       /* If they are different, also mark the hard frame pointer as live.  */
3247       if (! LOCAL_REGNO (HARD_FRAME_POINTER_REGNUM))
3248         SET_REGNO_REG_SET (set, HARD_FRAME_POINTER_REGNUM);
3249 #endif
3250     }
3251
3252 #ifndef PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
3253   /* Many architectures have a GP register even without flag_pic.
3254      Assume the pic register is not in use, or will be handled by
3255      other means, if it is not fixed.  */
3256   if (PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM
3257       && fixed_regs[PIC_OFFSET_TABLE_REGNUM])
3258     SET_REGNO_REG_SET (set, PIC_OFFSET_TABLE_REGNUM);
3259 #endif
3260
3261   /* Mark all global registers, and all registers used by the epilogue
3262      as being live at the end of the function since they may be
3263      referenced by our caller.  */
3264   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3265     if (global_regs[i] || EPILOGUE_USES (i))
3266       SET_REGNO_REG_SET (set, i);
3267
3268   if (HAVE_epilogue && reload_completed)
3269     {
3270       /* Mark all call-saved registers that we actually used.  */
3271       for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3272         if (regs_ever_live[i] && ! call_used_regs[i] && ! LOCAL_REGNO (i))
3273           SET_REGNO_REG_SET (set, i);
3274     }
3275
3276 #ifdef EH_RETURN_DATA_REGNO
3277   /* Mark the registers that will contain data for the handler.  */
3278   if (reload_completed && current_function_calls_eh_return)
3279     for (i = 0; ; ++i)
3280       {
3281         unsigned regno = EH_RETURN_DATA_REGNO(i);
3282         if (regno == INVALID_REGNUM)
3283           break;
3284         SET_REGNO_REG_SET (set, regno);
3285       }
3286 #endif
3287 #ifdef EH_RETURN_STACKADJ_RTX
3288   if ((! HAVE_epilogue || ! reload_completed)
3289       && current_function_calls_eh_return)
3290     {
3291       rtx tmp = EH_RETURN_STACKADJ_RTX;
3292       if (tmp && REG_P (tmp))
3293         mark_reg (tmp, set);
3294     }
3295 #endif
3296 #ifdef EH_RETURN_HANDLER_RTX
3297   if ((! HAVE_epilogue || ! reload_completed)
3298       && current_function_calls_eh_return)
3299     {
3300       rtx tmp = EH_RETURN_HANDLER_RTX;
3301       if (tmp && REG_P (tmp))
3302         mark_reg (tmp, set);
3303     }
3304 #endif
3305
3306   /* Mark function return value.  */
3307   diddle_return_value (mark_reg, set);
3308 }
3309
3310 /* Callback function for for_each_successor_phi.  DATA is a regset.
3311    Sets the SRC_REGNO, the regno of the phi alternative for phi node
3312    INSN, in the regset.  */
3313
3314 static int
3315 set_phi_alternative_reg (insn, dest_regno, src_regno, data)
3316      rtx insn ATTRIBUTE_UNUSED;
3317      int dest_regno ATTRIBUTE_UNUSED;
3318      int src_regno;
3319      void *data;
3320 {
3321   regset live = (regset) data;
3322   SET_REGNO_REG_SET (live, src_regno);
3323   return 0;
3324 }
3325
3326 /* Propagate global life info around the graph of basic blocks.  Begin
3327    considering blocks with their corresponding bit set in BLOCKS_IN.
3328    If BLOCKS_IN is null, consider it the universal set.
3329
3330    BLOCKS_OUT is set for every block that was changed.  */
3331
3332 static void
3333 calculate_global_regs_live (blocks_in, blocks_out, flags)
3334      sbitmap blocks_in, blocks_out;
3335      int flags;
3336 {
3337   basic_block *queue, *qhead, *qtail, *qend;
3338   regset tmp, new_live_at_end, call_used;
3339   regset_head tmp_head, call_used_head;
3340   regset_head new_live_at_end_head;
3341   int i;
3342
3343   tmp = INITIALIZE_REG_SET (tmp_head);
3344   new_live_at_end = INITIALIZE_REG_SET (new_live_at_end_head);
3345   call_used = INITIALIZE_REG_SET (call_used_head);
3346
3347   /* Inconveniently, this is only redily available in hard reg set form.  */
3348   for (i = 0; i < FIRST_PSEUDO_REGISTER; ++i)
3349     if (call_used_regs[i])
3350       SET_REGNO_REG_SET (call_used, i);
3351
3352   /* Create a worklist.  Allocate an extra slot for ENTRY_BLOCK, and one
3353      because the `head == tail' style test for an empty queue doesn't
3354      work with a full queue.  */
3355   queue = (basic_block *) xmalloc ((n_basic_blocks + 2) * sizeof (*queue));
3356   qtail = queue;
3357   qhead = qend = queue + n_basic_blocks + 2;
3358
3359   /* Queue the blocks set in the initial mask.  Do this in reverse block
3360      number order so that we are more likely for the first round to do
3361      useful work.  We use AUX non-null to flag that the block is queued.  */
3362   if (blocks_in)
3363     {
3364       /* Clear out the garbage that might be hanging out in bb->aux.  */
3365       for (i = n_basic_blocks - 1; i >= 0; --i)
3366         BASIC_BLOCK (i)->aux = NULL;
3367
3368       EXECUTE_IF_SET_IN_SBITMAP (blocks_in, 0, i,
3369         {
3370           basic_block bb = BASIC_BLOCK (i);
3371           *--qhead = bb;
3372           bb->aux = bb;
3373         });
3374     }
3375   else
3376     {
3377       for (i = 0; i < n_basic_blocks; ++i)
3378         {
3379           basic_block bb = BASIC_BLOCK (i);
3380           *--qhead = bb;
3381           bb->aux = bb;
3382         }
3383     }
3384
3385   if (blocks_out)
3386     sbitmap_zero (blocks_out);
3387
3388   /* We work through the queue until there are no more blocks.  What
3389      is live at the end of this block is precisely the union of what
3390      is live at the beginning of all its successors.  So, we set its
3391      GLOBAL_LIVE_AT_END field based on the GLOBAL_LIVE_AT_START field
3392      for its successors.  Then, we compute GLOBAL_LIVE_AT_START for
3393      this block by walking through the instructions in this block in
3394      reverse order and updating as we go.  If that changed
3395      GLOBAL_LIVE_AT_START, we add the predecessors of the block to the
3396      queue; they will now need to recalculate GLOBAL_LIVE_AT_END.
3397
3398      We are guaranteed to terminate, because GLOBAL_LIVE_AT_START
3399      never shrinks.  If a register appears in GLOBAL_LIVE_AT_START, it
3400      must either be live at the end of the block, or used within the
3401      block.  In the latter case, it will certainly never disappear
3402      from GLOBAL_LIVE_AT_START.  In the former case, the register
3403      could go away only if it disappeared from GLOBAL_LIVE_AT_START
3404      for one of the successor blocks.  By induction, that cannot
3405      occur.  */
3406   while (qhead != qtail)
3407     {
3408       int rescan, changed;
3409       basic_block bb;
3410       edge e;
3411
3412       bb = *qhead++;
3413       if (qhead == qend)
3414         qhead = queue;
3415       bb->aux = NULL;
3416
3417       /* Begin by propagating live_at_start from the successor blocks.  */
3418       CLEAR_REG_SET (new_live_at_end);
3419       for (e = bb->succ; e; e = e->succ_next)
3420         {
3421           basic_block sb = e->dest;
3422
3423           /* Call-clobbered registers die across exception and call edges.  */
3424           /* ??? Abnormal call edges ignored for the moment, as this gets
3425              confused by sibling call edges, which crashes reg-stack.  */
3426           if (e->flags & EDGE_EH)
3427             {
3428               bitmap_operation (tmp, sb->global_live_at_start,
3429                                 call_used, BITMAP_AND_COMPL);
3430               IOR_REG_SET (new_live_at_end, tmp);
3431             }
3432           else
3433             IOR_REG_SET (new_live_at_end, sb->global_live_at_start);
3434         }
3435
3436       /* The all-important stack pointer must always be live.  */
3437       SET_REGNO_REG_SET (new_live_at_end, STACK_POINTER_REGNUM);
3438
3439       /* Before reload, there are a few registers that must be forced
3440          live everywhere -- which might not already be the case for
3441          blocks within infinite loops.  */
3442       if (! reload_completed)
3443         {
3444           /* Any reference to any pseudo before reload is a potential
3445              reference of the frame pointer.  */
3446           SET_REGNO_REG_SET (new_live_at_end, FRAME_POINTER_REGNUM);
3447
3448 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
3449           /* Pseudos with argument area equivalences may require
3450              reloading via the argument pointer.  */
3451           if (fixed_regs[ARG_POINTER_REGNUM])
3452             SET_REGNO_REG_SET (new_live_at_end, ARG_POINTER_REGNUM);
3453 #endif
3454
3455           /* Any constant, or pseudo with constant equivalences, may
3456              require reloading from memory using the pic register.  */
3457           if (PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM
3458               && fixed_regs[PIC_OFFSET_TABLE_REGNUM])
3459             SET_REGNO_REG_SET (new_live_at_end, PIC_OFFSET_TABLE_REGNUM);
3460         }
3461
3462       /* Regs used in phi nodes are not included in
3463          global_live_at_start, since they are live only along a
3464          particular edge.  Set those regs that are live because of a
3465          phi node alternative corresponding to this particular block.  */
3466       if (in_ssa_form)
3467         for_each_successor_phi (bb, &set_phi_alternative_reg,
3468                                 new_live_at_end);
3469
3470       if (bb == ENTRY_BLOCK_PTR)
3471         {
3472           COPY_REG_SET (bb->global_live_at_end, new_live_at_end);
3473           continue;
3474         }
3475
3476       /* On our first pass through this block, we'll go ahead and continue.
3477          Recognize first pass by local_set NULL.  On subsequent passes, we
3478          get to skip out early if live_at_end wouldn't have changed.  */
3479
3480       if (bb->local_set == NULL)
3481         {
3482           bb->local_set = OBSTACK_ALLOC_REG_SET (&flow_obstack);
3483           bb->cond_local_set = OBSTACK_ALLOC_REG_SET (&flow_obstack);
3484           rescan = 1;
3485         }
3486       else
3487         {
3488           /* If any bits were removed from live_at_end, we'll have to
3489              rescan the block.  This wouldn't be necessary if we had
3490              precalculated local_live, however with PROP_SCAN_DEAD_CODE
3491              local_live is really dependent on live_at_end.  */
3492           CLEAR_REG_SET (tmp);
3493           rescan = bitmap_operation (tmp, bb->global_live_at_end,
3494                                      new_live_at_end, BITMAP_AND_COMPL);
3495
3496           if (! rescan)
3497             {
3498               /* If any of the registers in the new live_at_end set are
3499                  conditionally set in this basic block, we must rescan.
3500                  This is because conditional lifetimes at the end of the
3501                  block do not just take the live_at_end set into account,
3502                  but also the liveness at the start of each successor
3503                  block.  We can miss changes in those sets if we only
3504                  compare the new live_at_end against the previous one.  */
3505               CLEAR_REG_SET (tmp);
3506               rescan = bitmap_operation (tmp, new_live_at_end,
3507                                          bb->cond_local_set, BITMAP_AND);
3508             }
3509
3510           if (! rescan)
3511             {
3512               /* Find the set of changed bits.  Take this opportunity
3513                  to notice that this set is empty and early out.  */
3514               CLEAR_REG_SET (tmp);
3515               changed = bitmap_operation (tmp, bb->global_live_at_end,
3516                                           new_live_at_end, BITMAP_XOR);
3517               if (! changed)
3518                 continue;
3519
3520               /* If any of the changed bits overlap with local_set,
3521                  we'll have to rescan the block.  Detect overlap by
3522                  the AND with ~local_set turning off bits.  */
3523               rescan = bitmap_operation (tmp, tmp, bb->local_set,
3524                                          BITMAP_AND_COMPL);
3525             }
3526         }
3527
3528       /* Let our caller know that BB changed enough to require its
3529          death notes updated.  */
3530       if (blocks_out)
3531         SET_BIT (blocks_out, bb->index);
3532
3533       if (! rescan)
3534         {
3535           /* Add to live_at_start the set of all registers in
3536              new_live_at_end that aren't in the old live_at_end.  */
3537
3538           bitmap_operation (tmp, new_live_at_end, bb->global_live_at_end,
3539                             BITMAP_AND_COMPL);
3540           COPY_REG_SET (bb->global_live_at_end, new_live_at_end);
3541
3542           changed = bitmap_operation (bb->global_live_at_start,
3543                                       bb->global_live_at_start,
3544                                       tmp, BITMAP_IOR);
3545           if (! changed)
3546             continue;
3547         }
3548       else
3549         {
3550           COPY_REG_SET (bb->global_live_at_end, new_live_at_end);
3551
3552           /* Rescan the block insn by insn to turn (a copy of) live_at_end
3553              into live_at_start.  */
3554           propagate_block (bb, new_live_at_end, bb->local_set,
3555                            bb->cond_local_set, flags);
3556
3557           /* If live_at start didn't change, no need to go farther.  */
3558           if (REG_SET_EQUAL_P (bb->global_live_at_start, new_live_at_end))
3559             continue;
3560
3561           COPY_REG_SET (bb->global_live_at_start, new_live_at_end);
3562         }
3563
3564       /* Queue all predecessors of BB so that we may re-examine
3565          their live_at_end.  */
3566       for (e = bb->pred; e; e = e->pred_next)
3567         {
3568           basic_block pb = e->src;
3569           if (pb->aux == NULL)
3570             {
3571               *qtail++ = pb;
3572               if (qtail == qend)
3573                 qtail = queue;
3574               pb->aux = pb;
3575             }
3576         }
3577     }
3578
3579   FREE_REG_SET (tmp);
3580   FREE_REG_SET (new_live_at_end);
3581   FREE_REG_SET (call_used);
3582
3583   if (blocks_out)
3584     {
3585       EXECUTE_IF_SET_IN_SBITMAP (blocks_out, 0, i,
3586         {
3587           basic_block bb = BASIC_BLOCK (i);
3588           FREE_REG_SET (bb->local_set);
3589           FREE_REG_SET (bb->cond_local_set);
3590         });
3591     }
3592   else
3593     {
3594       for (i = n_basic_blocks - 1; i >= 0; --i)
3595         {
3596           basic_block bb = BASIC_BLOCK (i);
3597           FREE_REG_SET (bb->local_set);
3598           FREE_REG_SET (bb->cond_local_set);
3599         }
3600     }
3601
3602   free (queue);
3603 }
3604 \f
3605 /* Subroutines of life analysis.  */
3606
3607 /* Allocate the permanent data structures that represent the results
3608    of life analysis.  Not static since used also for stupid life analysis.  */
3609
3610 static void
3611 allocate_bb_life_data ()
3612 {
3613   register int i;
3614
3615   for (i = 0; i < n_basic_blocks; i++)
3616     {
3617       basic_block bb = BASIC_BLOCK (i);
3618
3619       bb->global_live_at_start = OBSTACK_ALLOC_REG_SET (&flow_obstack);
3620       bb->global_live_at_end = OBSTACK_ALLOC_REG_SET (&flow_obstack);
3621     }
3622
3623   ENTRY_BLOCK_PTR->global_live_at_end
3624     = OBSTACK_ALLOC_REG_SET (&flow_obstack);
3625   EXIT_BLOCK_PTR->global_live_at_start
3626     = OBSTACK_ALLOC_REG_SET (&flow_obstack);
3627
3628   regs_live_at_setjmp = OBSTACK_ALLOC_REG_SET (&flow_obstack);
3629 }
3630
3631 void
3632 allocate_reg_life_data ()
3633 {
3634   int i;
3635
3636   max_regno = max_reg_num ();
3637
3638   /* Recalculate the register space, in case it has grown.  Old style
3639      vector oriented regsets would set regset_{size,bytes} here also.  */
3640   allocate_reg_info (max_regno, FALSE, FALSE);
3641
3642   /* Reset all the data we'll collect in propagate_block and its
3643      subroutines.  */
3644   for (i = 0; i < max_regno; i++)
3645     {
3646       REG_N_SETS (i) = 0;
3647       REG_N_REFS (i) = 0;
3648       REG_N_DEATHS (i) = 0;
3649       REG_N_CALLS_CROSSED (i) = 0;
3650       REG_LIVE_LENGTH (i) = 0;
3651       REG_BASIC_BLOCK (i) = REG_BLOCK_UNKNOWN;
3652     }
3653 }
3654
3655 /* Delete dead instructions for propagate_block.  */
3656
3657 static void
3658 propagate_block_delete_insn (bb, insn)
3659      basic_block bb;
3660      rtx insn;
3661 {
3662   rtx inote = find_reg_note (insn, REG_LABEL, NULL_RTX);
3663
3664   /* If the insn referred to a label, and that label was attached to
3665      an ADDR_VEC, it's safe to delete the ADDR_VEC.  In fact, it's
3666      pretty much mandatory to delete it, because the ADDR_VEC may be
3667      referencing labels that no longer exist.
3668
3669      INSN may reference a deleted label, particularly when a jump
3670      table has been optimized into a direct jump.  There's no
3671      real good way to fix up the reference to the deleted label
3672      when the label is deleted, so we just allow it here.
3673
3674      After dead code elimination is complete, we do search for
3675      any REG_LABEL notes which reference deleted labels as a
3676      sanity check.  */
3677
3678   if (inote && GET_CODE (inote) == CODE_LABEL)
3679     {
3680       rtx label = XEXP (inote, 0);
3681       rtx next;
3682
3683       /* The label may be forced if it has been put in the constant
3684          pool.  If that is the only use we must discard the table
3685          jump following it, but not the label itself.  */
3686       if (LABEL_NUSES (label) == 1 + LABEL_PRESERVE_P (label)
3687           && (next = next_nonnote_insn (label)) != NULL
3688           && GET_CODE (next) == JUMP_INSN
3689           && (GET_CODE (PATTERN (next)) == ADDR_VEC
3690               || GET_CODE (PATTERN (next)) == ADDR_DIFF_VEC))
3691         {
3692           rtx pat = PATTERN (next);
3693           int diff_vec_p = GET_CODE (pat) == ADDR_DIFF_VEC;
3694           int len = XVECLEN (pat, diff_vec_p);
3695           int i;
3696
3697           for (i = 0; i < len; i++)
3698             LABEL_NUSES (XEXP (XVECEXP (pat, diff_vec_p, i), 0))--;
3699
3700           flow_delete_insn (next);
3701         }
3702     }
3703
3704   if (bb->end == insn)
3705     bb->end = PREV_INSN (insn);
3706   flow_delete_insn (insn);
3707 }
3708
3709 /* Delete dead libcalls for propagate_block.  Return the insn
3710    before the libcall.  */
3711
3712 static rtx
3713 propagate_block_delete_libcall (bb, insn, note)
3714      basic_block bb;
3715      rtx insn, note;
3716 {
3717   rtx first = XEXP (note, 0);
3718   rtx before = PREV_INSN (first);
3719
3720   if (insn == bb->end)
3721     bb->end = before;
3722
3723   flow_delete_insn_chain (first, insn);
3724   return before;
3725 }
3726
3727 /* Update the life-status of regs for one insn.  Return the previous insn.  */
3728
3729 rtx
3730 propagate_one_insn (pbi, insn)
3731      struct propagate_block_info *pbi;
3732      rtx insn;
3733 {
3734   rtx prev = PREV_INSN (insn);
3735   int flags = pbi->flags;
3736   int insn_is_dead = 0;
3737   int libcall_is_dead = 0;
3738   rtx note;
3739   int i;
3740
3741   if (! INSN_P (insn))
3742     return prev;
3743
3744   note = find_reg_note (insn, REG_RETVAL, NULL_RTX);
3745   if (flags & PROP_SCAN_DEAD_CODE)
3746     {
3747       insn_is_dead = insn_dead_p (pbi, PATTERN (insn), 0, REG_NOTES (insn));
3748       libcall_is_dead = (insn_is_dead && note != 0
3749                          && libcall_dead_p (pbi, note, insn));
3750     }
3751
3752   /* If an instruction consists of just dead store(s) on final pass,
3753      delete it.  */
3754   if ((flags & PROP_KILL_DEAD_CODE) && insn_is_dead)
3755     {
3756       /* If we're trying to delete a prologue or epilogue instruction
3757          that isn't flagged as possibly being dead, something is wrong.
3758          But if we are keeping the stack pointer depressed, we might well
3759          be deleting insns that are used to compute the amount to update
3760          it by, so they are fine.  */
3761       if (reload_completed
3762           && !(TREE_CODE (TREE_TYPE (current_function_decl)) == FUNCTION_TYPE
3763                 && (TYPE_RETURNS_STACK_DEPRESSED
3764                     (TREE_TYPE (current_function_decl))))
3765           && (((HAVE_epilogue || HAVE_prologue)
3766                && prologue_epilogue_contains (insn))
3767               || (HAVE_sibcall_epilogue
3768                   && sibcall_epilogue_contains (insn)))
3769           && find_reg_note (insn, REG_MAYBE_DEAD, NULL_RTX) == 0)
3770         abort ();
3771
3772       /* Record sets.  Do this even for dead instructions, since they
3773          would have killed the values if they hadn't been deleted.  */
3774       mark_set_regs (pbi, PATTERN (insn), insn);
3775
3776       /* CC0 is now known to be dead.  Either this insn used it,
3777          in which case it doesn't anymore, or clobbered it,
3778          so the next insn can't use it.  */
3779       pbi->cc0_live = 0;
3780
3781       if (libcall_is_dead)
3782         prev = propagate_block_delete_libcall (pbi->bb, insn, note);
3783       else
3784         propagate_block_delete_insn (pbi->bb, insn);
3785
3786       return prev;
3787     }
3788
3789   /* See if this is an increment or decrement that can be merged into
3790      a following memory address.  */
3791 #ifdef AUTO_INC_DEC
3792   {
3793     register rtx x = single_set (insn);
3794
3795     /* Does this instruction increment or decrement a register?  */
3796     if ((flags & PROP_AUTOINC)
3797         && x != 0
3798         && GET_CODE (SET_DEST (x)) == REG
3799         && (GET_CODE (SET_SRC (x)) == PLUS
3800             || GET_CODE (SET_SRC (x)) == MINUS)
3801         && XEXP (SET_SRC (x), 0) == SET_DEST (x)
3802         && GET_CODE (XEXP (SET_SRC (x), 1)) == CONST_INT
3803         /* Ok, look for a following memory ref we can combine with.
3804            If one is found, change the memory ref to a PRE_INC
3805            or PRE_DEC, cancel this insn, and return 1.
3806            Return 0 if nothing has been done.  */
3807         && try_pre_increment_1 (pbi, insn))
3808       return prev;
3809   }
3810 #endif /* AUTO_INC_DEC */
3811
3812   CLEAR_REG_SET (pbi->new_set);
3813
3814   /* If this is not the final pass, and this insn is copying the value of
3815      a library call and it's dead, don't scan the insns that perform the
3816      library call, so that the call's arguments are not marked live.  */
3817   if (libcall_is_dead)
3818     {
3819       /* Record the death of the dest reg.  */
3820       mark_set_regs (pbi, PATTERN (insn), insn);
3821
3822       insn = XEXP (note, 0);
3823       return PREV_INSN (insn);
3824     }
3825   else if (GET_CODE (PATTERN (insn)) == SET
3826            && SET_DEST (PATTERN (insn)) == stack_pointer_rtx
3827            && GET_CODE (SET_SRC (PATTERN (insn))) == PLUS
3828            && XEXP (SET_SRC (PATTERN (insn)), 0) == stack_pointer_rtx
3829            && GET_CODE (XEXP (SET_SRC (PATTERN (insn)), 1)) == CONST_INT)
3830     /* We have an insn to pop a constant amount off the stack.
3831        (Such insns use PLUS regardless of the direction of the stack,
3832        and any insn to adjust the stack by a constant is always a pop.)
3833        These insns, if not dead stores, have no effect on life.  */
3834     ;
3835   else
3836     {
3837       /* Any regs live at the time of a call instruction must not go
3838          in a register clobbered by calls.  Find all regs now live and
3839          record this for them.  */
3840
3841       if (GET_CODE (insn) == CALL_INSN && (flags & PROP_REG_INFO))
3842         EXECUTE_IF_SET_IN_REG_SET (pbi->reg_live, 0, i,
3843                                    { REG_N_CALLS_CROSSED (i)++; });
3844
3845       /* Record sets.  Do this even for dead instructions, since they
3846          would have killed the values if they hadn't been deleted.  */
3847       mark_set_regs (pbi, PATTERN (insn), insn);
3848
3849       if (GET_CODE (insn) == CALL_INSN)
3850         {
3851           register int i;
3852           rtx note, cond;
3853
3854           cond = NULL_RTX;
3855           if (GET_CODE (PATTERN (insn)) == COND_EXEC)
3856             cond = COND_EXEC_TEST (PATTERN (insn));
3857
3858           /* Non-constant calls clobber memory.  */
3859           if (! CONST_CALL_P (insn))
3860             {
3861               free_EXPR_LIST_list (&pbi->mem_set_list);
3862               pbi->mem_set_list_len = 0;
3863             }
3864
3865           /* There may be extra registers to be clobbered.  */
3866           for (note = CALL_INSN_FUNCTION_USAGE (insn);
3867                note;
3868                note = XEXP (note, 1))
3869             if (GET_CODE (XEXP (note, 0)) == CLOBBER)
3870               mark_set_1 (pbi, CLOBBER, XEXP (XEXP (note, 0), 0),
3871                           cond, insn, pbi->flags);
3872
3873           /* Calls change all call-used and global registers.  */
3874           for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3875             if (call_used_regs[i] && ! global_regs[i]
3876                 && ! fixed_regs[i])
3877               {
3878                 /* We do not want REG_UNUSED notes for these registers.  */
3879                 mark_set_1 (pbi, CLOBBER, gen_rtx_REG (reg_raw_mode[i], i),
3880                             cond, insn,
3881                             pbi->flags & ~(PROP_DEATH_NOTES | PROP_REG_INFO));
3882               }
3883         }
3884
3885       /* If an insn doesn't use CC0, it becomes dead since we assume
3886          that every insn clobbers it.  So show it dead here;
3887          mark_used_regs will set it live if it is referenced.  */
3888       pbi->cc0_live = 0;
3889
3890       /* Record uses.  */
3891       if (! insn_is_dead)
3892         mark_used_regs (pbi, PATTERN (insn), NULL_RTX, insn);
3893
3894       /* Sometimes we may have inserted something before INSN (such as a move)
3895          when we make an auto-inc.  So ensure we will scan those insns.  */
3896 #ifdef AUTO_INC_DEC
3897       prev = PREV_INSN (insn);
3898 #endif
3899
3900       if (! insn_is_dead && GET_CODE (insn) == CALL_INSN)
3901         {
3902           register int i;
3903           rtx note, cond;
3904
3905           cond = NULL_RTX;
3906           if (GET_CODE (PATTERN (insn)) == COND_EXEC)
3907             cond = COND_EXEC_TEST (PATTERN (insn));
3908
3909           /* Calls use their arguments.  */
3910           for (note = CALL_INSN_FUNCTION_USAGE (insn);
3911                note;
3912                note = XEXP (note, 1))
3913             if (GET_CODE (XEXP (note, 0)) == USE)
3914               mark_used_regs (pbi, XEXP (XEXP (note, 0), 0),
3915                               cond, insn);
3916
3917           /* The stack ptr is used (honorarily) by a CALL insn.  */
3918           SET_REGNO_REG_SET (pbi->reg_live, STACK_POINTER_REGNUM);
3919
3920           /* Calls may also reference any of the global registers,
3921              so they are made live.  */
3922           for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3923             if (global_regs[i])
3924               mark_used_reg (pbi, gen_rtx_REG (reg_raw_mode[i], i),
3925                              cond, insn);
3926         }
3927     }
3928
3929   /* On final pass, update counts of how many insns in which each reg
3930      is live.  */
3931   if (flags & PROP_REG_INFO)
3932     EXECUTE_IF_SET_IN_REG_SET (pbi->reg_live, 0, i,
3933                                { REG_LIVE_LENGTH (i)++; });
3934
3935   return prev;
3936 }
3937
3938 /* Initialize a propagate_block_info struct for public consumption.
3939    Note that the structure itself is opaque to this file, but that
3940    the user can use the regsets provided here.  */
3941
3942 struct propagate_block_info *
3943 init_propagate_block_info (bb, live, local_set, cond_local_set, flags)
3944      basic_block bb;
3945      regset live, local_set, cond_local_set;
3946      int flags;
3947 {
3948   struct propagate_block_info *pbi = xmalloc (sizeof (*pbi));
3949
3950   pbi->bb = bb;
3951   pbi->reg_live = live;
3952   pbi->mem_set_list = NULL_RTX;
3953   pbi->mem_set_list_len = 0;
3954   pbi->local_set = local_set;
3955   pbi->cond_local_set = cond_local_set;
3956   pbi->cc0_live = 0;
3957   pbi->flags = flags;
3958
3959   if (flags & (PROP_LOG_LINKS | PROP_AUTOINC))
3960     pbi->reg_next_use = (rtx *) xcalloc (max_reg_num (), sizeof (rtx));
3961   else
3962     pbi->reg_next_use = NULL;
3963
3964   pbi->new_set = BITMAP_XMALLOC ();
3965
3966 #ifdef HAVE_conditional_execution
3967   pbi->reg_cond_dead = splay_tree_new (splay_tree_compare_ints, NULL,
3968                                        free_reg_cond_life_info);
3969   pbi->reg_cond_reg = BITMAP_XMALLOC ();
3970
3971   /* If this block ends in a conditional branch, for each register live
3972      from one side of the branch and not the other, record the register
3973      as conditionally dead.  */
3974   if (GET_CODE (bb->end) == JUMP_INSN
3975       && any_condjump_p (bb->end))
3976     {
3977       regset_head diff_head;
3978       regset diff = INITIALIZE_REG_SET (diff_head);
3979       basic_block bb_true, bb_false;
3980       rtx cond_true, cond_false, set_src;
3981       int i;
3982
3983       /* Identify the successor blocks.  */
3984       bb_true = bb->succ->dest;
3985       if (bb->succ->succ_next != NULL)
3986         {
3987           bb_false = bb->succ->succ_next->dest;
3988
3989           if (bb->succ->flags & EDGE_FALLTHRU)
3990             {
3991               basic_block t = bb_false;
3992               bb_false = bb_true;
3993               bb_true = t;
3994             }
3995           else if (! (bb->succ->succ_next->flags & EDGE_FALLTHRU))
3996             abort ();
3997         }
3998       else
3999         {
4000           /* This can happen with a conditional jump to the next insn.  */
4001           if (JUMP_LABEL (bb->end) != bb_true->head)
4002             abort ();
4003
4004           /* Simplest way to do nothing.  */
4005           bb_false = bb_true;
4006         }
4007
4008       /* Extract the condition from the branch.  */
4009       set_src = SET_SRC (pc_set (bb->end));
4010       cond_true = XEXP (set_src, 0);
4011       cond_false = gen_rtx_fmt_ee (reverse_condition (GET_CODE (cond_true)),
4012                                    GET_MODE (cond_true), XEXP (cond_true, 0),
4013                                    XEXP (cond_true, 1));
4014       if (GET_CODE (XEXP (set_src, 1)) == PC)
4015         {
4016           rtx t = cond_false;
4017           cond_false = cond_true;
4018           cond_true = t;
4019         }
4020
4021       /* Compute which register lead different lives in the successors.  */
4022       if (bitmap_operation (diff, bb_true->global_live_at_start,
4023                             bb_false->global_live_at_start, BITMAP_XOR))
4024         {
4025           rtx reg = XEXP (cond_true, 0);
4026
4027           if (GET_CODE (reg) == SUBREG)
4028             reg = SUBREG_REG (reg);
4029
4030           if (GET_CODE (reg) != REG)
4031             abort ();
4032
4033           SET_REGNO_REG_SET (pbi->reg_cond_reg, REGNO (reg));
4034
4035           /* For each such register, mark it conditionally dead.  */
4036           EXECUTE_IF_SET_IN_REG_SET
4037             (diff, 0, i,
4038              {
4039                struct reg_cond_life_info *rcli;
4040                rtx cond;
4041
4042                rcli = (struct reg_cond_life_info *) xmalloc (sizeof (*rcli));
4043
4044                if (REGNO_REG_SET_P (bb_true->global_live_at_start, i))
4045                  cond = cond_false;
4046                else
4047                  cond = cond_true;
4048                rcli->condition = cond;
4049                rcli->stores = const0_rtx;
4050                rcli->orig_condition = cond;
4051
4052                splay_tree_insert (pbi->reg_cond_dead, i,
4053                                   (splay_tree_value) rcli);
4054              });
4055         }
4056
4057       FREE_REG_SET (diff);
4058     }
4059 #endif
4060
4061   /* If this block has no successors, any stores to the frame that aren't
4062      used later in the block are dead.  So make a pass over the block
4063      recording any such that are made and show them dead at the end.  We do
4064      a very conservative and simple job here.  */
4065   if (optimize
4066       && ! (TREE_CODE (TREE_TYPE (current_function_decl)) == FUNCTION_TYPE
4067             && (TYPE_RETURNS_STACK_DEPRESSED
4068                 (TREE_TYPE (current_function_decl))))
4069       && (flags & PROP_SCAN_DEAD_CODE)
4070       && (bb->succ == NULL
4071           || (bb->succ->succ_next == NULL
4072               && bb->succ->dest == EXIT_BLOCK_PTR
4073               && ! current_function_calls_eh_return)))
4074     {
4075       rtx insn, set;
4076       for (insn = bb->end; insn != bb->head; insn = PREV_INSN (insn))
4077         if (GET_CODE (insn) == INSN
4078             && (set = single_set (insn))
4079             && GET_CODE (SET_DEST (set)) == MEM)
4080           {
4081             rtx mem = SET_DEST (set);
4082             rtx canon_mem = canon_rtx (mem);
4083
4084             /* This optimization is performed by faking a store to the
4085                memory at the end of the block.  This doesn't work for
4086                unchanging memories because multiple stores to unchanging
4087                memory is illegal and alias analysis doesn't consider it.  */
4088             if (RTX_UNCHANGING_P (canon_mem))
4089               continue;
4090
4091             if (XEXP (canon_mem, 0) == frame_pointer_rtx
4092                 || (GET_CODE (XEXP (canon_mem, 0)) == PLUS
4093                     && XEXP (XEXP (canon_mem, 0), 0) == frame_pointer_rtx
4094                     && GET_CODE (XEXP (XEXP (canon_mem, 0), 1)) == CONST_INT))
4095               {
4096 #ifdef AUTO_INC_DEC
4097                 /* Store a copy of mem, otherwise the address may be scrogged
4098                    by find_auto_inc.  This matters because insn_dead_p uses
4099                    an rtx_equal_p check to determine if two addresses are
4100                    the same.  This works before find_auto_inc, but fails
4101                    after find_auto_inc, causing discrepencies between the
4102                    set of live registers calculated during the
4103                    calculate_global_regs_live phase and what actually exists
4104                    after flow completes, leading to aborts.  */
4105                 if (flags & PROP_AUTOINC)
4106                   mem = shallow_copy_rtx (mem);
4107 #endif
4108                 pbi->mem_set_list = alloc_EXPR_LIST (0, mem, pbi->mem_set_list);
4109                 if (++pbi->mem_set_list_len >= MAX_MEM_SET_LIST_LEN)
4110                   break;
4111               }
4112           }
4113     }
4114
4115   return pbi;
4116 }
4117
4118 /* Release a propagate_block_info struct.  */
4119
4120 void
4121 free_propagate_block_info (pbi)
4122      struct propagate_block_info *pbi;
4123 {
4124   free_EXPR_LIST_list (&pbi->mem_set_list);
4125
4126   BITMAP_XFREE (pbi->new_set);
4127
4128 #ifdef HAVE_conditional_execution
4129   splay_tree_delete (pbi->reg_cond_dead);
4130   BITMAP_XFREE (pbi->reg_cond_reg);
4131 #endif
4132
4133   if (pbi->reg_next_use)
4134     free (pbi->reg_next_use);
4135
4136   free (pbi);
4137 }
4138
4139 /* Compute the registers live at the beginning of a basic block BB from
4140    those live at the end.
4141
4142    When called, REG_LIVE contains those live at the end.  On return, it
4143    contains those live at the beginning.
4144
4145    LOCAL_SET, if non-null, will be set with all registers killed
4146    unconditionally by this basic block.
4147    Likewise, COND_LOCAL_SET, if non-null, will be set with all registers
4148    killed conditionally by this basic block.  If there is any unconditional
4149    set of a register, then the corresponding bit will be set in LOCAL_SET
4150    and cleared in COND_LOCAL_SET.
4151    It is valid for LOCAL_SET and COND_LOCAL_SET to be the same set.  In this
4152    case, the resulting set will be equal to the union of the two sets that
4153    would otherwise be computed.  */
4154
4155 void
4156 propagate_block (bb, live, local_set, cond_local_set, flags)
4157      basic_block bb;
4158      regset live;
4159      regset local_set;
4160      regset cond_local_set;
4161      int flags;
4162 {
4163   struct propagate_block_info *pbi;
4164   rtx insn, prev;
4165
4166   pbi = init_propagate_block_info (bb, live, local_set, cond_local_set, flags);
4167
4168   if (flags & PROP_REG_INFO)
4169     {
4170       register int i;
4171
4172       /* Process the regs live at the end of the block.
4173          Mark them as not local to any one basic block.  */
4174       EXECUTE_IF_SET_IN_REG_SET (live, 0, i,
4175                                  { REG_BASIC_BLOCK (i) = REG_BLOCK_GLOBAL; });
4176     }
4177
4178   /* Scan the block an insn at a time from end to beginning.  */
4179
4180   for (insn = bb->end;; insn = prev)
4181     {
4182       /* If this is a call to `setjmp' et al, warn if any
4183          non-volatile datum is live.  */
4184       if ((flags & PROP_REG_INFO)
4185           && GET_CODE (insn) == NOTE
4186           && NOTE_LINE_NUMBER (insn) == NOTE_INSN_SETJMP)
4187         IOR_REG_SET (regs_live_at_setjmp, pbi->reg_live);
4188
4189       prev = propagate_one_insn (pbi, insn);
4190
4191       if (insn == bb->head)
4192         break;
4193     }
4194
4195   free_propagate_block_info (pbi);
4196 }
4197 \f
4198 /* Return 1 if X (the body of an insn, or part of it) is just dead stores
4199    (SET expressions whose destinations are registers dead after the insn).
4200    NEEDED is the regset that says which regs are alive after the insn.
4201
4202    Unless CALL_OK is non-zero, an insn is needed if it contains a CALL.
4203
4204    If X is the entire body of an insn, NOTES contains the reg notes
4205    pertaining to the insn.  */
4206
4207 static int
4208 insn_dead_p (pbi, x, call_ok, notes)
4209      struct propagate_block_info *pbi;
4210      rtx x;
4211      int call_ok;
4212      rtx notes ATTRIBUTE_UNUSED;
4213 {
4214   enum rtx_code code = GET_CODE (x);
4215
4216 #ifdef AUTO_INC_DEC
4217   /* If flow is invoked after reload, we must take existing AUTO_INC
4218      expresions into account.  */
4219   if (reload_completed)
4220     {
4221       for (; notes; notes = XEXP (notes, 1))
4222         {
4223           if (REG_NOTE_KIND (notes) == REG_INC)
4224             {
4225               int regno = REGNO (XEXP (notes, 0));
4226
4227               /* Don't delete insns to set global regs.  */
4228               if ((regno < FIRST_PSEUDO_REGISTER && global_regs[regno])
4229                   || REGNO_REG_SET_P (pbi->reg_live, regno))
4230                 return 0;
4231             }
4232         }
4233     }
4234 #endif
4235
4236   /* If setting something that's a reg or part of one,
4237      see if that register's altered value will be live.  */
4238
4239   if (code == SET)
4240     {
4241       rtx r = SET_DEST (x);
4242
4243 #ifdef HAVE_cc0
4244       if (GET_CODE (r) == CC0)
4245         return ! pbi->cc0_live;
4246 #endif
4247
4248       /* A SET that is a subroutine call cannot be dead.  */
4249       if (GET_CODE (SET_SRC (x)) == CALL)
4250         {
4251           if (! call_ok)
4252             return 0;
4253         }
4254
4255       /* Don't eliminate loads from volatile memory or volatile asms.  */
4256       else if (volatile_refs_p (SET_SRC (x)))
4257         return 0;
4258
4259       if (GET_CODE (r) == MEM)
4260         {
4261           rtx temp;
4262
4263           if (MEM_VOLATILE_P (r))
4264             return 0;
4265
4266           /* Walk the set of memory locations we are currently tracking
4267              and see if one is an identical match to this memory location.
4268              If so, this memory write is dead (remember, we're walking
4269              backwards from the end of the block to the start).  Since
4270              rtx_equal_p does not check the alias set or flags, we also
4271              must have the potential for them to conflict (anti_dependence). */
4272           for (temp = pbi->mem_set_list; temp != 0; temp = XEXP (temp, 1))
4273             if (anti_dependence (r, XEXP (temp, 0)))
4274               {
4275                 rtx mem = XEXP (temp, 0);
4276
4277                 if (rtx_equal_p (mem, r))
4278                   return 1;
4279 #ifdef AUTO_INC_DEC
4280                 /* Check if memory reference matches an auto increment. Only
4281                    post increment/decrement or modify are valid.  */
4282                 if (GET_MODE (mem) == GET_MODE (r)
4283                     && (GET_CODE (XEXP (mem, 0)) == POST_DEC
4284                         || GET_CODE (XEXP (mem, 0)) == POST_INC
4285                         || GET_CODE (XEXP (mem, 0)) == POST_MODIFY)
4286                     && GET_MODE (XEXP (mem, 0)) == GET_MODE (r)
4287                     && rtx_equal_p (XEXP (XEXP (mem, 0), 0), XEXP (r, 0)))
4288                   return 1;
4289 #endif
4290               }
4291         }
4292       else
4293         {
4294           while (GET_CODE (r) == SUBREG
4295                  || GET_CODE (r) == STRICT_LOW_PART
4296                  || GET_CODE (r) == ZERO_EXTRACT)
4297             r = XEXP (r, 0);
4298
4299           if (GET_CODE (r) == REG)
4300             {
4301               int regno = REGNO (r);
4302
4303               /* Obvious.  */
4304               if (REGNO_REG_SET_P (pbi->reg_live, regno))
4305                 return 0;
4306
4307               /* If this is a hard register, verify that subsequent
4308                  words are not needed.  */
4309               if (regno < FIRST_PSEUDO_REGISTER)
4310                 {
4311                   int n = HARD_REGNO_NREGS (regno, GET_MODE (r));
4312
4313                   while (--n > 0)
4314                     if (REGNO_REG_SET_P (pbi->reg_live, regno+n))
4315                       return 0;
4316                 }
4317
4318               /* Don't delete insns to set global regs.  */
4319               if (regno < FIRST_PSEUDO_REGISTER && global_regs[regno])
4320                 return 0;
4321
4322               /* Make sure insns to set the stack pointer aren't deleted.  */
4323               if (regno == STACK_POINTER_REGNUM)
4324                 return 0;
4325
4326               /* ??? These bits might be redundant with the force live bits
4327                  in calculate_global_regs_live.  We would delete from
4328                  sequential sets; whether this actually affects real code
4329                  for anything but the stack pointer I don't know.  */
4330               /* Make sure insns to set the frame pointer aren't deleted.  */
4331               if (regno == FRAME_POINTER_REGNUM
4332                   && (! reload_completed || frame_pointer_needed))
4333                 return 0;
4334 #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
4335               if (regno == HARD_FRAME_POINTER_REGNUM
4336                   && (! reload_completed || frame_pointer_needed))
4337                 return 0;
4338 #endif
4339
4340 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
4341               /* Make sure insns to set arg pointer are never deleted
4342                  (if the arg pointer isn't fixed, there will be a USE
4343                  for it, so we can treat it normally).  */
4344               if (regno == ARG_POINTER_REGNUM && fixed_regs[regno])
4345                 return 0;
4346 #endif
4347
4348               /* Otherwise, the set is dead.  */
4349               return 1;
4350             }
4351         }
4352     }
4353
4354   /* If performing several activities, insn is dead if each activity
4355      is individually dead.  Also, CLOBBERs and USEs can be ignored; a
4356      CLOBBER or USE that's inside a PARALLEL doesn't make the insn
4357      worth keeping.  */
4358   else if (code == PARALLEL)
4359     {
4360       int i = XVECLEN (x, 0);
4361
4362       for (i--; i >= 0; i--)
4363         if (GET_CODE (XVECEXP (x, 0, i)) != CLOBBER
4364             && GET_CODE (XVECEXP (x, 0, i)) != USE
4365             && ! insn_dead_p (pbi, XVECEXP (x, 0, i), call_ok, NULL_RTX))
4366           return 0;
4367
4368       return 1;
4369     }
4370
4371   /* A CLOBBER of a pseudo-register that is dead serves no purpose.  That
4372      is not necessarily true for hard registers.  */
4373   else if (code == CLOBBER && GET_CODE (XEXP (x, 0)) == REG
4374            && REGNO (XEXP (x, 0)) >= FIRST_PSEUDO_REGISTER
4375            && ! REGNO_REG_SET_P (pbi->reg_live, REGNO (XEXP (x, 0))))
4376     return 1;
4377
4378   /* We do not check other CLOBBER or USE here.  An insn consisting of just
4379      a CLOBBER or just a USE should not be deleted.  */
4380   return 0;
4381 }
4382
4383 /* If INSN is the last insn in a libcall, and assuming INSN is dead,
4384    return 1 if the entire library call is dead.
4385    This is true if INSN copies a register (hard or pseudo)
4386    and if the hard return reg of the call insn is dead.
4387    (The caller should have tested the destination of the SET inside
4388    INSN already for death.)
4389
4390    If this insn doesn't just copy a register, then we don't
4391    have an ordinary libcall.  In that case, cse could not have
4392    managed to substitute the source for the dest later on,
4393    so we can assume the libcall is dead.
4394
4395    PBI is the block info giving pseudoregs live before this insn.
4396    NOTE is the REG_RETVAL note of the insn.  */
4397
4398 static int
4399 libcall_dead_p (pbi, note, insn)
4400      struct propagate_block_info *pbi;
4401      rtx note;
4402      rtx insn;
4403 {
4404   rtx x = single_set (insn);
4405
4406   if (x)
4407     {
4408       register rtx r = SET_SRC (x);
4409       if (GET_CODE (r) == REG)
4410         {
4411           rtx call = XEXP (note, 0);
4412           rtx call_pat;
4413           register int i;
4414
4415           /* Find the call insn.  */
4416           while (call != insn && GET_CODE (call) != CALL_INSN)
4417             call = NEXT_INSN (call);
4418
4419           /* If there is none, do nothing special,
4420              since ordinary death handling can understand these insns.  */
4421           if (call == insn)
4422             return 0;
4423
4424           /* See if the hard reg holding the value is dead.
4425              If this is a PARALLEL, find the call within it.  */
4426           call_pat = PATTERN (call);
4427           if (GET_CODE (call_pat) == PARALLEL)
4428             {
4429               for (i = XVECLEN (call_pat, 0) - 1; i >= 0; i--)
4430                 if (GET_CODE (XVECEXP (call_pat, 0, i)) == SET
4431                     && GET_CODE (SET_SRC (XVECEXP (call_pat, 0, i))) == CALL)
4432                   break;
4433
4434               /* This may be a library call that is returning a value
4435                  via invisible pointer.  Do nothing special, since
4436                  ordinary death handling can understand these insns.  */
4437               if (i < 0)
4438                 return 0;
4439
4440               call_pat = XVECEXP (call_pat, 0, i);
4441             }
4442
4443           return insn_dead_p (pbi, call_pat, 1, REG_NOTES (call));
4444         }
4445     }
4446   return 1;
4447 }
4448
4449 /* Return 1 if register REGNO was used before it was set, i.e. if it is
4450    live at function entry.  Don't count global register variables, variables
4451    in registers that can be used for function arg passing, or variables in
4452    fixed hard registers.  */
4453
4454 int
4455 regno_uninitialized (regno)
4456      int regno;
4457 {
4458   if (n_basic_blocks == 0
4459       || (regno < FIRST_PSEUDO_REGISTER
4460           && (global_regs[regno]
4461               || fixed_regs[regno]
4462               || FUNCTION_ARG_REGNO_P (regno))))
4463     return 0;
4464
4465   return REGNO_REG_SET_P (BASIC_BLOCK (0)->global_live_at_start, regno);
4466 }
4467
4468 /* 1 if register REGNO was alive at a place where `setjmp' was called
4469    and was set more than once or is an argument.
4470    Such regs may be clobbered by `longjmp'.  */
4471
4472 int
4473 regno_clobbered_at_setjmp (regno)
4474      int regno;
4475 {
4476   if (n_basic_blocks == 0)
4477     return 0;
4478
4479   return ((REG_N_SETS (regno) > 1
4480            || REGNO_REG_SET_P (BASIC_BLOCK (0)->global_live_at_start, regno))
4481           && REGNO_REG_SET_P (regs_live_at_setjmp, regno));
4482 }
4483 \f
4484 /* INSN references memory, possibly using autoincrement addressing modes.
4485    Find any entries on the mem_set_list that need to be invalidated due
4486    to an address change.  */
4487
4488 static void
4489 invalidate_mems_from_autoinc (pbi, insn)
4490      struct propagate_block_info *pbi;
4491      rtx insn;
4492 {
4493   rtx note = REG_NOTES (insn);
4494   for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
4495     {
4496       if (REG_NOTE_KIND (note) == REG_INC)
4497         {
4498           rtx temp = pbi->mem_set_list;
4499           rtx prev = NULL_RTX;
4500           rtx next;
4501
4502           while (temp)
4503             {
4504               next = XEXP (temp, 1);
4505               if (reg_overlap_mentioned_p (XEXP (note, 0), XEXP (temp, 0)))
4506                 {
4507                   /* Splice temp out of list.  */
4508                   if (prev)
4509                     XEXP (prev, 1) = next;
4510                   else
4511                     pbi->mem_set_list = next;
4512                   free_EXPR_LIST_node (temp);
4513                   pbi->mem_set_list_len--;
4514                 }
4515               else
4516                 prev = temp;
4517               temp = next;
4518             }
4519         }
4520     }
4521 }
4522
4523 /* EXP is either a MEM or a REG.  Remove any dependant entries
4524    from pbi->mem_set_list.  */
4525
4526 static void
4527 invalidate_mems_from_set (pbi, exp)
4528      struct propagate_block_info *pbi;
4529      rtx exp;
4530 {
4531   rtx temp = pbi->mem_set_list;
4532   rtx prev = NULL_RTX;
4533   rtx next;
4534
4535   while (temp)
4536     {
4537       next = XEXP (temp, 1);
4538       if ((GET_CODE (exp) == MEM
4539            && output_dependence (XEXP (temp, 0), exp))
4540           || (GET_CODE (exp) == REG
4541               && reg_overlap_mentioned_p (exp, XEXP (temp, 0))))
4542         {
4543           /* Splice this entry out of the list.  */
4544           if (prev)
4545             XEXP (prev, 1) = next;
4546           else
4547             pbi->mem_set_list = next;
4548           free_EXPR_LIST_node (temp);
4549           pbi->mem_set_list_len--;
4550         }
4551       else
4552         prev = temp;
4553       temp = next;
4554     }
4555 }
4556
4557 /* Process the registers that are set within X.  Their bits are set to
4558    1 in the regset DEAD, because they are dead prior to this insn.
4559
4560    If INSN is nonzero, it is the insn being processed.
4561
4562    FLAGS is the set of operations to perform.  */
4563
4564 static void
4565 mark_set_regs (pbi, x, insn)
4566      struct propagate_block_info *pbi;
4567      rtx x, insn;
4568 {
4569   rtx cond = NULL_RTX;
4570   rtx link;
4571   enum rtx_code code;
4572
4573   if (insn)
4574     for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
4575       {
4576         if (REG_NOTE_KIND (link) == REG_INC)
4577           mark_set_1 (pbi, SET, XEXP (link, 0),
4578                       (GET_CODE (x) == COND_EXEC
4579                        ? COND_EXEC_TEST (x) : NULL_RTX),
4580                       insn, pbi->flags);
4581       }
4582  retry:
4583   switch (code = GET_CODE (x))
4584     {
4585     case SET:
4586     case CLOBBER:
4587       mark_set_1 (pbi, code, SET_DEST (x), cond, insn, pbi->flags);
4588       return;
4589
4590     case COND_EXEC:
4591       cond = COND_EXEC_TEST (x);
4592       x = COND_EXEC_CODE (x);
4593       goto retry;
4594
4595     case PARALLEL:
4596       {
4597         register int i;
4598         for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
4599           {
4600             rtx sub = XVECEXP (x, 0, i);
4601             switch (code = GET_CODE (sub))
4602               {
4603               case COND_EXEC:
4604                 if (cond != NULL_RTX)
4605                   abort ();
4606
4607                 cond = COND_EXEC_TEST (sub);
4608                 sub = COND_EXEC_CODE (sub);
4609                 if (GET_CODE (sub) != SET && GET_CODE (sub) != CLOBBER)
4610                   break;
4611                 /* Fall through.  */
4612
4613               case SET:
4614               case CLOBBER:
4615                 mark_set_1 (pbi, code, SET_DEST (sub), cond, insn, pbi->flags);
4616                 break;
4617
4618               default:
4619                 break;
4620               }
4621           }
4622         break;
4623       }
4624
4625     default:
4626       break;
4627     }
4628 }
4629
4630 /* Process a single set, which appears in INSN.  REG (which may not
4631    actually be a REG, it may also be a SUBREG, PARALLEL, etc.) is
4632    being set using the CODE (which may be SET, CLOBBER, or COND_EXEC).
4633    If the set is conditional (because it appear in a COND_EXEC), COND
4634    will be the condition.  */
4635
4636 static void
4637 mark_set_1 (pbi, code, reg, cond, insn, flags)
4638      struct propagate_block_info *pbi;
4639      enum rtx_code code;
4640      rtx reg, cond, insn;
4641      int flags;
4642 {
4643   int regno_first = -1, regno_last = -1;
4644   unsigned long not_dead = 0;
4645   int i;
4646
4647   /* Modifying just one hardware register of a multi-reg value or just a
4648      byte field of a register does not mean the value from before this insn
4649      is now dead.  Of course, if it was dead after it's unused now.  */
4650
4651   switch (GET_CODE (reg))
4652     {
4653     case PARALLEL:
4654       /* Some targets place small structures in registers for return values of
4655          functions.  We have to detect this case specially here to get correct
4656          flow information.  */
4657       for (i = XVECLEN (reg, 0) - 1; i >= 0; i--)
4658         if (XEXP (XVECEXP (reg, 0, i), 0) != 0)
4659           mark_set_1 (pbi, code, XEXP (XVECEXP (reg, 0, i), 0), cond, insn,
4660                       flags);
4661       return;
4662
4663     case ZERO_EXTRACT:
4664     case SIGN_EXTRACT:
4665     case STRICT_LOW_PART:
4666       /* ??? Assumes STRICT_LOW_PART not used on multi-word registers.  */
4667       do
4668         reg = XEXP (reg, 0);
4669       while (GET_CODE (reg) == SUBREG
4670              || GET_CODE (reg) == ZERO_EXTRACT
4671              || GET_CODE (reg) == SIGN_EXTRACT
4672              || GET_CODE (reg) == STRICT_LOW_PART);
4673       if (GET_CODE (reg) == MEM)
4674         break;
4675       not_dead = (unsigned long) REGNO_REG_SET_P (pbi->reg_live, REGNO (reg));
4676       /* Fall through.  */
4677
4678     case REG:
4679       regno_last = regno_first = REGNO (reg);
4680       if (regno_first < FIRST_PSEUDO_REGISTER)
4681         regno_last += HARD_REGNO_NREGS (regno_first, GET_MODE (reg)) - 1;
4682       break;
4683
4684     case SUBREG:
4685       if (GET_CODE (SUBREG_REG (reg)) == REG)
4686         {
4687           enum machine_mode outer_mode = GET_MODE (reg);
4688           enum machine_mode inner_mode = GET_MODE (SUBREG_REG (reg));
4689
4690           /* Identify the range of registers affected.  This is moderately
4691              tricky for hard registers.  See alter_subreg.  */
4692
4693           regno_last = regno_first = REGNO (SUBREG_REG (reg));
4694           if (regno_first < FIRST_PSEUDO_REGISTER)
4695             {
4696               regno_first += subreg_regno_offset (regno_first, inner_mode,
4697                                                   SUBREG_BYTE (reg),
4698                                                   outer_mode);
4699               regno_last = (regno_first
4700                             + HARD_REGNO_NREGS (regno_first, outer_mode) - 1);
4701
4702               /* Since we've just adjusted the register number ranges, make
4703                  sure REG matches.  Otherwise some_was_live will be clear
4704                  when it shouldn't have been, and we'll create incorrect
4705                  REG_UNUSED notes.  */
4706               reg = gen_rtx_REG (outer_mode, regno_first);
4707             }
4708           else
4709             {
4710               /* If the number of words in the subreg is less than the number
4711                  of words in the full register, we have a well-defined partial
4712                  set.  Otherwise the high bits are undefined.
4713
4714                  This is only really applicable to pseudos, since we just took
4715                  care of multi-word hard registers.  */
4716               if (((GET_MODE_SIZE (outer_mode)
4717                     + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
4718                   < ((GET_MODE_SIZE (inner_mode)
4719                       + UNITS_PER_WORD - 1) / UNITS_PER_WORD))
4720                 not_dead = (unsigned long) REGNO_REG_SET_P (pbi->reg_live,
4721                                                             regno_first);
4722
4723               reg = SUBREG_REG (reg);
4724             }
4725         }
4726       else
4727         reg = SUBREG_REG (reg);
4728       break;
4729
4730     default:
4731       break;
4732     }
4733
4734   /* If this set is a MEM, then it kills any aliased writes.
4735      If this set is a REG, then it kills any MEMs which use the reg.  */
4736   if (optimize && (flags & PROP_SCAN_DEAD_CODE))
4737     {
4738       if (GET_CODE (reg) == MEM || GET_CODE (reg) == REG)
4739         invalidate_mems_from_set (pbi, reg);
4740
4741       /* If the memory reference had embedded side effects (autoincrement
4742          address modes.  Then we may need to kill some entries on the
4743          memory set list.  */
4744       if (insn && GET_CODE (reg) == MEM)
4745         invalidate_mems_from_autoinc (pbi, insn);
4746
4747       if (pbi->mem_set_list_len < MAX_MEM_SET_LIST_LEN
4748           && GET_CODE (reg) == MEM && ! side_effects_p (reg)
4749           /* ??? With more effort we could track conditional memory life.  */
4750           && ! cond
4751           /* We do not know the size of a BLKmode store, so we do not track
4752              them for redundant store elimination.  */
4753           && GET_MODE (reg) != BLKmode
4754           /* There are no REG_INC notes for SP, so we can't assume we'll see
4755              everything that invalidates it.  To be safe, don't eliminate any
4756              stores though SP; none of them should be redundant anyway.  */
4757           && ! reg_mentioned_p (stack_pointer_rtx, reg))
4758         {
4759 #ifdef AUTO_INC_DEC
4760           /* Store a copy of mem, otherwise the address may be
4761              scrogged by find_auto_inc.  */
4762           if (flags & PROP_AUTOINC)
4763             reg = shallow_copy_rtx (reg);
4764 #endif
4765           pbi->mem_set_list = alloc_EXPR_LIST (0, reg, pbi->mem_set_list);
4766           pbi->mem_set_list_len++;
4767         }
4768     }
4769
4770   if (GET_CODE (reg) == REG
4771       && ! (regno_first == FRAME_POINTER_REGNUM
4772             && (! reload_completed || frame_pointer_needed))
4773 #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
4774       && ! (regno_first == HARD_FRAME_POINTER_REGNUM
4775             && (! reload_completed || frame_pointer_needed))
4776 #endif
4777 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
4778       && ! (regno_first == ARG_POINTER_REGNUM && fixed_regs[regno_first])
4779 #endif
4780       )
4781     {
4782       int some_was_live = 0, some_was_dead = 0;
4783
4784       for (i = regno_first; i <= regno_last; ++i)
4785         {
4786           int needed_regno = REGNO_REG_SET_P (pbi->reg_live, i);
4787           if (pbi->local_set)
4788             {
4789               /* Order of the set operation matters here since both
4790                  sets may be the same.  */
4791               CLEAR_REGNO_REG_SET (pbi->cond_local_set, i);
4792               if (cond != NULL_RTX
4793                   && ! REGNO_REG_SET_P (pbi->local_set, i))
4794                 SET_REGNO_REG_SET (pbi->cond_local_set, i);
4795               else
4796                 SET_REGNO_REG_SET (pbi->local_set, i);
4797             }
4798           if (code != CLOBBER)
4799             SET_REGNO_REG_SET (pbi->new_set, i);
4800
4801           some_was_live |= needed_regno;
4802           some_was_dead |= ! needed_regno;
4803         }
4804
4805 #ifdef HAVE_conditional_execution
4806       /* Consider conditional death in deciding that the register needs
4807          a death note.  */
4808       if (some_was_live && ! not_dead
4809           /* The stack pointer is never dead.  Well, not strictly true,
4810              but it's very difficult to tell from here.  Hopefully
4811              combine_stack_adjustments will fix up the most egregious
4812              errors.  */
4813           && regno_first != STACK_POINTER_REGNUM)
4814         {
4815           for (i = regno_first; i <= regno_last; ++i)
4816             if (! mark_regno_cond_dead (pbi, i, cond))
4817               not_dead |= ((unsigned long) 1) << (i - regno_first);
4818         }
4819 #endif
4820
4821       /* Additional data to record if this is the final pass.  */
4822       if (flags & (PROP_LOG_LINKS | PROP_REG_INFO
4823                    | PROP_DEATH_NOTES | PROP_AUTOINC))
4824         {
4825           register rtx y;
4826           register int blocknum = pbi->bb->index;
4827
4828           y = NULL_RTX;
4829           if (flags & (PROP_LOG_LINKS | PROP_AUTOINC))
4830             {
4831               y = pbi->reg_next_use[regno_first];
4832
4833               /* The next use is no longer next, since a store intervenes.  */
4834               for (i = regno_first; i <= regno_last; ++i)
4835                 pbi->reg_next_use[i] = 0;
4836             }
4837
4838           if (flags & PROP_REG_INFO)
4839             {
4840               for (i = regno_first; i <= regno_last; ++i)
4841                 {
4842                   /* Count (weighted) references, stores, etc.  This counts a
4843                      register twice if it is modified, but that is correct.  */
4844                   REG_N_SETS (i) += 1;
4845                   REG_N_REFS (i) += (optimize_size ? 1
4846                                      : pbi->bb->loop_depth + 1);
4847
4848                   /* The insns where a reg is live are normally counted
4849                      elsewhere, but we want the count to include the insn
4850                      where the reg is set, and the normal counting mechanism
4851                      would not count it.  */
4852                   REG_LIVE_LENGTH (i) += 1;
4853                 }
4854
4855               /* If this is a hard reg, record this function uses the reg.  */
4856               if (regno_first < FIRST_PSEUDO_REGISTER)
4857                 {
4858                   for (i = regno_first; i <= regno_last; i++)
4859                     regs_ever_live[i] = 1;
4860                 }
4861               else
4862                 {
4863                   /* Keep track of which basic blocks each reg appears in.  */
4864                   if (REG_BASIC_BLOCK (regno_first) == REG_BLOCK_UNKNOWN)
4865                     REG_BASIC_BLOCK (regno_first) = blocknum;
4866                   else if (REG_BASIC_BLOCK (regno_first) != blocknum)
4867                     REG_BASIC_BLOCK (regno_first) = REG_BLOCK_GLOBAL;
4868                 }
4869             }
4870
4871           if (! some_was_dead)
4872             {
4873               if (flags & PROP_LOG_LINKS)
4874                 {
4875                   /* Make a logical link from the next following insn
4876                      that uses this register, back to this insn.
4877                      The following insns have already been processed.
4878
4879                      We don't build a LOG_LINK for hard registers containing
4880                      in ASM_OPERANDs.  If these registers get replaced,
4881                      we might wind up changing the semantics of the insn,
4882                      even if reload can make what appear to be valid
4883                      assignments later.  */
4884                   if (y && (BLOCK_NUM (y) == blocknum)
4885                       && (regno_first >= FIRST_PSEUDO_REGISTER
4886                           || asm_noperands (PATTERN (y)) < 0))
4887                     LOG_LINKS (y) = alloc_INSN_LIST (insn, LOG_LINKS (y));
4888                 }
4889             }
4890           else if (not_dead)
4891             ;
4892           else if (! some_was_live)
4893             {
4894               if (flags & PROP_REG_INFO)
4895                 REG_N_DEATHS (regno_first) += 1;
4896
4897               if (flags & PROP_DEATH_NOTES)
4898                 {
4899                   /* Note that dead stores have already been deleted
4900                      when possible.  If we get here, we have found a
4901                      dead store that cannot be eliminated (because the
4902                      same insn does something useful).  Indicate this
4903                      by marking the reg being set as dying here.  */
4904                   REG_NOTES (insn)
4905                     = alloc_EXPR_LIST (REG_UNUSED, reg, REG_NOTES (insn));
4906                 }
4907             }
4908           else
4909             {
4910               if (flags & PROP_DEATH_NOTES)
4911                 {
4912                   /* This is a case where we have a multi-word hard register
4913                      and some, but not all, of the words of the register are
4914                      needed in subsequent insns.  Write REG_UNUSED notes
4915                      for those parts that were not needed.  This case should
4916                      be rare.  */
4917
4918                   for (i = regno_first; i <= regno_last; ++i)
4919                     if (! REGNO_REG_SET_P (pbi->reg_live, i))
4920                       REG_NOTES (insn)
4921                         = alloc_EXPR_LIST (REG_UNUSED,
4922                                            gen_rtx_REG (reg_raw_mode[i], i),
4923                                            REG_NOTES (insn));
4924                 }
4925             }
4926         }
4927
4928       /* Mark the register as being dead.  */
4929       if (some_was_live
4930           /* The stack pointer is never dead.  Well, not strictly true,
4931              but it's very difficult to tell from here.  Hopefully
4932              combine_stack_adjustments will fix up the most egregious
4933              errors.  */
4934           && regno_first != STACK_POINTER_REGNUM)
4935         {
4936           for (i = regno_first; i <= regno_last; ++i)
4937             if (!(not_dead & (((unsigned long) 1) << (i - regno_first))))
4938               CLEAR_REGNO_REG_SET (pbi->reg_live, i);
4939         }
4940     }
4941   else if (GET_CODE (reg) == REG)
4942     {
4943       if (flags & (PROP_LOG_LINKS | PROP_AUTOINC))
4944         pbi->reg_next_use[regno_first] = 0;
4945     }
4946
4947   /* If this is the last pass and this is a SCRATCH, show it will be dying
4948      here and count it.  */
4949   else if (GET_CODE (reg) == SCRATCH)
4950     {
4951       if (flags & PROP_DEATH_NOTES)
4952         REG_NOTES (insn)
4953           = alloc_EXPR_LIST (REG_UNUSED, reg, REG_NOTES (insn));
4954     }
4955 }
4956 \f
4957 #ifdef HAVE_conditional_execution
4958 /* Mark REGNO conditionally dead.
4959    Return true if the register is now unconditionally dead.  */
4960
4961 static int
4962 mark_regno_cond_dead (pbi, regno, cond)
4963      struct propagate_block_info *pbi;
4964      int regno;
4965      rtx cond;
4966 {
4967   /* If this is a store to a predicate register, the value of the
4968      predicate is changing, we don't know that the predicate as seen
4969      before is the same as that seen after.  Flush all dependent
4970      conditions from reg_cond_dead.  This will make all such
4971      conditionally live registers unconditionally live.  */
4972   if (REGNO_REG_SET_P (pbi->reg_cond_reg, regno))
4973     flush_reg_cond_reg (pbi, regno);
4974
4975   /* If this is an unconditional store, remove any conditional
4976      life that may have existed.  */
4977   if (cond == NULL_RTX)
4978     splay_tree_remove (pbi->reg_cond_dead, regno);
4979   else
4980     {
4981       splay_tree_node node;
4982       struct reg_cond_life_info *rcli;
4983       rtx ncond;
4984
4985       /* Otherwise this is a conditional set.  Record that fact.
4986          It may have been conditionally used, or there may be a
4987          subsequent set with a complimentary condition.  */
4988
4989       node = splay_tree_lookup (pbi->reg_cond_dead, regno);
4990       if (node == NULL)
4991         {
4992           /* The register was unconditionally live previously.
4993              Record the current condition as the condition under
4994              which it is dead.  */
4995           rcli = (struct reg_cond_life_info *) xmalloc (sizeof (*rcli));
4996           rcli->condition = cond;
4997           rcli->stores = cond;
4998           rcli->orig_condition = const0_rtx;
4999           splay_tree_insert (pbi->reg_cond_dead, regno,
5000                              (splay_tree_value) rcli);
5001
5002           SET_REGNO_REG_SET (pbi->reg_cond_reg, REGNO (XEXP (cond, 0)));
5003
5004           /* Not unconditionaly dead.  */
5005           return 0;
5006         }
5007       else
5008         {
5009           /* The register was conditionally live previously.
5010              Add the new condition to the old.  */
5011           rcli = (struct reg_cond_life_info *) node->value;
5012           ncond = rcli->condition;
5013           ncond = ior_reg_cond (ncond, cond, 1);
5014           if (rcli->stores == const0_rtx)
5015             rcli->stores = cond;
5016           else if (rcli->stores != const1_rtx)
5017             rcli->stores = ior_reg_cond (rcli->stores, cond, 1);
5018
5019           /* If the register is now unconditionally dead, remove the entry
5020              in the splay_tree.  A register is unconditionally dead if the
5021              dead condition ncond is true.  A register is also unconditionally
5022              dead if the sum of all conditional stores is an unconditional
5023              store (stores is true), and the dead condition is identically the
5024              same as the original dead condition initialized at the end of
5025              the block.  This is a pointer compare, not an rtx_equal_p
5026              compare.  */
5027           if (ncond == const1_rtx
5028               || (ncond == rcli->orig_condition && rcli->stores == const1_rtx))
5029             splay_tree_remove (pbi->reg_cond_dead, regno);
5030           else
5031             {
5032               rcli->condition = ncond;
5033
5034               SET_REGNO_REG_SET (pbi->reg_cond_reg, REGNO (XEXP (cond, 0)));
5035
5036               /* Not unconditionaly dead.  */
5037               return 0;
5038             }
5039         }
5040     }
5041
5042   return 1;
5043 }
5044
5045 /* Called from splay_tree_delete for pbi->reg_cond_life.  */
5046
5047 static void
5048 free_reg_cond_life_info (value)
5049      splay_tree_value value;
5050 {
5051   struct reg_cond_life_info *rcli = (struct reg_cond_life_info *) value;
5052   free (rcli);
5053 }
5054
5055 /* Helper function for flush_reg_cond_reg.  */
5056
5057 static int
5058 flush_reg_cond_reg_1 (node, data)
5059      splay_tree_node node;
5060      void *data;
5061 {
5062   struct reg_cond_life_info *rcli;
5063   int *xdata = (int *) data;
5064   unsigned int regno = xdata[0];
5065
5066   /* Don't need to search if last flushed value was farther on in
5067      the in-order traversal.  */
5068   if (xdata[1] >= (int) node->key)
5069     return 0;
5070
5071   /* Splice out portions of the expression that refer to regno.  */
5072   rcli = (struct reg_cond_life_info *) node->value;
5073   rcli->condition = elim_reg_cond (rcli->condition, regno);
5074   if (rcli->stores != const0_rtx && rcli->stores != const1_rtx)
5075     rcli->stores = elim_reg_cond (rcli->stores, regno);
5076
5077   /* If the entire condition is now false, signal the node to be removed.  */
5078   if (rcli->condition == const0_rtx)
5079     {
5080       xdata[1] = node->key;
5081       return -1;
5082     }
5083   else if (rcli->condition == const1_rtx)
5084     abort ();
5085
5086   return 0;
5087 }
5088
5089 /* Flush all (sub) expressions referring to REGNO from REG_COND_LIVE.  */
5090
5091 static void
5092 flush_reg_cond_reg (pbi, regno)
5093      struct propagate_block_info *pbi;
5094      int regno;
5095 {
5096   int pair[2];
5097
5098   pair[0] = regno;
5099   pair[1] = -1;
5100   while (splay_tree_foreach (pbi->reg_cond_dead,
5101                              flush_reg_cond_reg_1, pair) == -1)
5102     splay_tree_remove (pbi->reg_cond_dead, pair[1]);
5103
5104   CLEAR_REGNO_REG_SET (pbi->reg_cond_reg, regno);
5105 }
5106
5107 /* Logical arithmetic on predicate conditions.  IOR, NOT and AND.
5108    For ior/and, the ADD flag determines whether we want to add the new
5109    condition X to the old one unconditionally.  If it is zero, we will
5110    only return a new expression if X allows us to simplify part of
5111    OLD, otherwise we return OLD unchanged to the caller.
5112    If ADD is nonzero, we will return a new condition in all cases.  The
5113    toplevel caller of one of these functions should always pass 1 for
5114    ADD.  */
5115
5116 static rtx
5117 ior_reg_cond (old, x, add)
5118      rtx old, x;
5119      int add;
5120 {
5121   rtx op0, op1;
5122
5123   if (GET_RTX_CLASS (GET_CODE (old)) == '<')
5124     {
5125       if (GET_RTX_CLASS (GET_CODE (x)) == '<'
5126           && REVERSE_CONDEXEC_PREDICATES_P (GET_CODE (x), GET_CODE (old))
5127           && REGNO (XEXP (x, 0)) == REGNO (XEXP (old, 0)))
5128         return const1_rtx;
5129       if (GET_CODE (x) == GET_CODE (old)
5130           && REGNO (XEXP (x, 0)) == REGNO (XEXP (old, 0)))
5131         return old;
5132       if (! add)
5133         return old;
5134       return gen_rtx_IOR (0, old, x);
5135     }
5136
5137   switch (GET_CODE (old))
5138     {
5139     case IOR:
5140       op0 = ior_reg_cond (XEXP (old, 0), x, 0);
5141       op1 = ior_reg_cond (XEXP (old, 1), x, 0);
5142       if (op0 != XEXP (old, 0) || op1 != XEXP (old, 1))
5143         {
5144           if (op0 == const0_rtx)
5145             return op1;
5146           if (op1 == const0_rtx)
5147             return op0;
5148           if (op0 == const1_rtx || op1 == const1_rtx)
5149             return const1_rtx;
5150           if (op0 == XEXP (old, 0))
5151             op0 = gen_rtx_IOR (0, op0, x);
5152           else
5153             op1 = gen_rtx_IOR (0, op1, x);
5154           return gen_rtx_IOR (0, op0, op1);
5155         }
5156       if (! add)
5157         return old;
5158       return gen_rtx_IOR (0, old, x);
5159
5160     case AND:
5161       op0 = ior_reg_cond (XEXP (old, 0), x, 0);
5162       op1 = ior_reg_cond (XEXP (old, 1), x, 0);
5163       if (op0 != XEXP (old, 0) || op1 != XEXP (old, 1))
5164         {
5165           if (op0 == const1_rtx)
5166             return op1;
5167           if (op1 == const1_rtx)
5168             return op0;
5169           if (op0 == const0_rtx || op1 == const0_rtx)
5170             return const0_rtx;
5171           if (op0 == XEXP (old, 0))
5172             op0 = gen_rtx_IOR (0, op0, x);
5173           else
5174             op1 = gen_rtx_IOR (0, op1, x);
5175           return gen_rtx_AND (0, op0, op1);
5176         }
5177       if (! add)
5178         return old;
5179       return gen_rtx_IOR (0, old, x);
5180
5181     case NOT:
5182       op0 = and_reg_cond (XEXP (old, 0), not_reg_cond (x), 0);
5183       if (op0 != XEXP (old, 0))
5184         return not_reg_cond (op0);
5185       if (! add)
5186         return old;
5187       return gen_rtx_IOR (0, old, x);
5188
5189     default:
5190       abort ();
5191     }
5192 }
5193
5194 static rtx
5195 not_reg_cond (x)
5196      rtx x;
5197 {
5198   enum rtx_code x_code;
5199
5200   if (x == const0_rtx)
5201     return const1_rtx;
5202   else if (x == const1_rtx)
5203     return const0_rtx;
5204   x_code = GET_CODE (x);
5205   if (x_code == NOT)
5206     return XEXP (x, 0);
5207   if (GET_RTX_CLASS (x_code) == '<'
5208       && GET_CODE (XEXP (x, 0)) == REG)
5209     {
5210       if (XEXP (x, 1) != const0_rtx)
5211         abort ();
5212
5213       return gen_rtx_fmt_ee (reverse_condition (x_code),
5214                              VOIDmode, XEXP (x, 0), const0_rtx);
5215     }
5216   return gen_rtx_NOT (0, x);
5217 }
5218
5219 static rtx
5220 and_reg_cond (old, x, add)
5221      rtx old, x;
5222      int add;
5223 {
5224   rtx op0, op1;
5225
5226   if (GET_RTX_CLASS (GET_CODE (old)) == '<')
5227     {
5228       if (GET_RTX_CLASS (GET_CODE (x)) == '<'
5229           && GET_CODE (x) == reverse_condition (GET_CODE (old))
5230           && REGNO (XEXP (x, 0)) == REGNO (XEXP (old, 0)))
5231         return const0_rtx;
5232       if (GET_CODE (x) == GET_CODE (old)
5233           && REGNO (XEXP (x, 0)) == REGNO (XEXP (old, 0)))
5234         return old;
5235       if (! add)
5236         return old;
5237       return gen_rtx_AND (0, old, x);
5238     }
5239
5240   switch (GET_CODE (old))
5241     {
5242     case IOR:
5243       op0 = and_reg_cond (XEXP (old, 0), x, 0);
5244       op1 = and_reg_cond (XEXP (old, 1), x, 0);
5245       if (op0 != XEXP (old, 0) || op1 != XEXP (old, 1))
5246         {
5247           if (op0 == const0_rtx)
5248             return op1;
5249           if (op1 == const0_rtx)
5250             return op0;
5251           if (op0 == const1_rtx || op1 == const1_rtx)
5252             return const1_rtx;
5253           if (op0 == XEXP (old, 0))
5254             op0 = gen_rtx_AND (0, op0, x);
5255           else
5256             op1 = gen_rtx_AND (0, op1, x);
5257           return gen_rtx_IOR (0, op0, op1);
5258         }
5259       if (! add)
5260         return old;
5261       return gen_rtx_AND (0, old, x);
5262
5263     case AND:
5264       op0 = and_reg_cond (XEXP (old, 0), x, 0);
5265       op1 = and_reg_cond (XEXP (old, 1), x, 0);
5266       if (op0 != XEXP (old, 0) || op1 != XEXP (old, 1))
5267         {
5268           if (op0 == const1_rtx)
5269             return op1;
5270           if (op1 == const1_rtx)
5271             return op0;
5272           if (op0 == const0_rtx || op1 == const0_rtx)
5273             return const0_rtx;
5274           if (op0 == XEXP (old, 0))
5275             op0 = gen_rtx_AND (0, op0, x);
5276           else
5277             op1 = gen_rtx_AND (0, op1, x);
5278           return gen_rtx_AND (0, op0, op1);
5279         }
5280       if (! add)
5281         return old;
5282
5283       /* If X is identical to one of the existing terms of the AND,
5284          then just return what we already have.  */
5285       /* ??? There really should be some sort of recursive check here in
5286          case there are nested ANDs.  */
5287       if ((GET_CODE (XEXP (old, 0)) == GET_CODE (x)
5288            && REGNO (XEXP (XEXP (old, 0), 0)) == REGNO (XEXP (x, 0)))
5289           || (GET_CODE (XEXP (old, 1)) == GET_CODE (x)
5290               && REGNO (XEXP (XEXP (old, 1), 0)) == REGNO (XEXP (x, 0))))
5291         return old;
5292
5293       return gen_rtx_AND (0, old, x);
5294
5295     case NOT:
5296       op0 = ior_reg_cond (XEXP (old, 0), not_reg_cond (x), 0);
5297       if (op0 != XEXP (old, 0))
5298         return not_reg_cond (op0);
5299       if (! add)
5300         return old;
5301       return gen_rtx_AND (0, old, x);
5302
5303     default:
5304       abort ();
5305     }
5306 }
5307
5308 /* Given a condition X, remove references to reg REGNO and return the
5309    new condition.  The removal will be done so that all conditions
5310    involving REGNO are considered to evaluate to false.  This function
5311    is used when the value of REGNO changes.  */
5312
5313 static rtx
5314 elim_reg_cond (x, regno)
5315      rtx x;
5316      unsigned int regno;
5317 {
5318   rtx op0, op1;
5319
5320   if (GET_RTX_CLASS (GET_CODE (x)) == '<')
5321     {
5322       if (REGNO (XEXP (x, 0)) == regno)
5323         return const0_rtx;
5324       return x;
5325     }
5326
5327   switch (GET_CODE (x))
5328     {
5329     case AND:
5330       op0 = elim_reg_cond (XEXP (x, 0), regno);
5331       op1 = elim_reg_cond (XEXP (x, 1), regno);
5332       if (op0 == const0_rtx || op1 == const0_rtx)
5333         return const0_rtx;
5334       if (op0 == const1_rtx)
5335         return op1;
5336       if (op1 == const1_rtx)
5337         return op0;
5338       if (op0 == XEXP (x, 0) && op1 == XEXP (x, 1))
5339         return x;
5340       return gen_rtx_AND (0, op0, op1);
5341
5342     case IOR:
5343       op0 = elim_reg_cond (XEXP (x, 0), regno);
5344       op1 = elim_reg_cond (XEXP (x, 1), regno);
5345       if (op0 == const1_rtx || op1 == const1_rtx)
5346         return const1_rtx;
5347       if (op0 == const0_rtx)
5348         return op1;
5349       if (op1 == const0_rtx)
5350         return op0;
5351       if (op0 == XEXP (x, 0) && op1 == XEXP (x, 1))
5352         return x;
5353       return gen_rtx_IOR (0, op0, op1);
5354
5355     case NOT:
5356       op0 = elim_reg_cond (XEXP (x, 0), regno);
5357       if (op0 == const0_rtx)
5358         return const1_rtx;
5359       if (op0 == const1_rtx)
5360         return const0_rtx;
5361       if (op0 != XEXP (x, 0))
5362         return not_reg_cond (op0);
5363       return x;
5364
5365     default:
5366       abort ();
5367     }
5368 }
5369 #endif /* HAVE_conditional_execution */
5370 \f
5371 #ifdef AUTO_INC_DEC
5372
5373 /* Try to substitute the auto-inc expression INC as the address inside
5374    MEM which occurs in INSN.  Currently, the address of MEM is an expression
5375    involving INCR_REG, and INCR is the next use of INCR_REG; it is an insn
5376    that has a single set whose source is a PLUS of INCR_REG and something
5377    else.  */
5378
5379 static void
5380 attempt_auto_inc (pbi, inc, insn, mem, incr, incr_reg)
5381      struct propagate_block_info *pbi;
5382      rtx inc, insn, mem, incr, incr_reg;
5383 {
5384   int regno = REGNO (incr_reg);
5385   rtx set = single_set (incr);
5386   rtx q = SET_DEST (set);
5387   rtx y = SET_SRC (set);
5388   int opnum = XEXP (y, 0) == incr_reg ? 0 : 1;
5389
5390   /* Make sure this reg appears only once in this insn.  */
5391   if (count_occurrences (PATTERN (insn), incr_reg, 1) != 1)
5392     return;
5393
5394   if (dead_or_set_p (incr, incr_reg)
5395       /* Mustn't autoinc an eliminable register.  */
5396       && (regno >= FIRST_PSEUDO_REGISTER
5397           || ! TEST_HARD_REG_BIT (elim_reg_set, regno)))
5398     {
5399       /* This is the simple case.  Try to make the auto-inc.  If
5400          we can't, we are done.  Otherwise, we will do any
5401          needed updates below.  */
5402       if (! validate_change (insn, &XEXP (mem, 0), inc, 0))
5403         return;
5404     }
5405   else if (GET_CODE (q) == REG
5406            /* PREV_INSN used here to check the semi-open interval
5407               [insn,incr).  */
5408            && ! reg_used_between_p (q,  PREV_INSN (insn), incr)
5409            /* We must also check for sets of q as q may be
5410               a call clobbered hard register and there may
5411               be a call between PREV_INSN (insn) and incr.  */
5412            && ! reg_set_between_p (q,  PREV_INSN (insn), incr))
5413     {
5414       /* We have *p followed sometime later by q = p+size.
5415          Both p and q must be live afterward,
5416          and q is not used between INSN and its assignment.
5417          Change it to q = p, ...*q..., q = q+size.
5418          Then fall into the usual case.  */
5419       rtx insns, temp;
5420
5421       start_sequence ();
5422       emit_move_insn (q, incr_reg);
5423       insns = get_insns ();
5424       end_sequence ();
5425
5426       if (basic_block_for_insn)
5427         for (temp = insns; temp; temp = NEXT_INSN (temp))
5428           set_block_for_insn (temp, pbi->bb);
5429
5430       /* If we can't make the auto-inc, or can't make the
5431          replacement into Y, exit.  There's no point in making
5432          the change below if we can't do the auto-inc and doing
5433          so is not correct in the pre-inc case.  */
5434
5435       XEXP (inc, 0) = q;
5436       validate_change (insn, &XEXP (mem, 0), inc, 1);
5437       validate_change (incr, &XEXP (y, opnum), q, 1);
5438       if (! apply_change_group ())
5439         return;
5440
5441       /* We now know we'll be doing this change, so emit the
5442          new insn(s) and do the updates.  */
5443       emit_insns_before (insns, insn);
5444
5445       if (pbi->bb->head == insn)
5446         pbi->bb->head = insns;
5447
5448       /* INCR will become a NOTE and INSN won't contain a
5449          use of INCR_REG.  If a use of INCR_REG was just placed in
5450          the insn before INSN, make that the next use.
5451          Otherwise, invalidate it.  */
5452       if (GET_CODE (PREV_INSN (insn)) == INSN
5453           && GET_CODE (PATTERN (PREV_INSN (insn))) == SET
5454           && SET_SRC (PATTERN (PREV_INSN (insn))) == incr_reg)
5455         pbi->reg_next_use[regno] = PREV_INSN (insn);
5456       else
5457         pbi->reg_next_use[regno] = 0;
5458
5459       incr_reg = q;
5460       regno = REGNO (q);
5461
5462       /* REGNO is now used in INCR which is below INSN, but
5463          it previously wasn't live here.  If we don't mark
5464          it as live, we'll put a REG_DEAD note for it
5465          on this insn, which is incorrect.  */
5466       SET_REGNO_REG_SET (pbi->reg_live, regno);
5467
5468       /* If there are any calls between INSN and INCR, show
5469          that REGNO now crosses them.  */
5470       for (temp = insn; temp != incr; temp = NEXT_INSN (temp))
5471         if (GET_CODE (temp) == CALL_INSN)
5472           REG_N_CALLS_CROSSED (regno)++;
5473     }
5474   else
5475     return;
5476
5477   /* If we haven't returned, it means we were able to make the
5478      auto-inc, so update the status.  First, record that this insn
5479      has an implicit side effect.  */
5480
5481   REG_NOTES (insn) = alloc_EXPR_LIST (REG_INC, incr_reg, REG_NOTES (insn));
5482
5483   /* Modify the old increment-insn to simply copy
5484      the already-incremented value of our register.  */
5485   if (! validate_change (incr, &SET_SRC (set), incr_reg, 0))
5486     abort ();
5487
5488   /* If that makes it a no-op (copying the register into itself) delete
5489      it so it won't appear to be a "use" and a "set" of this
5490      register.  */
5491   if (REGNO (SET_DEST (set)) == REGNO (incr_reg))
5492     {
5493       /* If the original source was dead, it's dead now.  */
5494       rtx note;
5495
5496       while ((note = find_reg_note (incr, REG_DEAD, NULL_RTX)) != NULL_RTX)
5497         {
5498           remove_note (incr, note);
5499           if (XEXP (note, 0) != incr_reg)
5500             CLEAR_REGNO_REG_SET (pbi->reg_live, REGNO (XEXP (note, 0)));
5501         }
5502
5503       PUT_CODE (incr, NOTE);
5504       NOTE_LINE_NUMBER (incr) = NOTE_INSN_DELETED;
5505       NOTE_SOURCE_FILE (incr) = 0;
5506     }
5507
5508   if (regno >= FIRST_PSEUDO_REGISTER)
5509     {
5510       /* Count an extra reference to the reg.  When a reg is
5511          incremented, spilling it is worse, so we want to make
5512          that less likely.  */
5513       REG_N_REFS (regno) += (optimize_size ? 1 : pbi->bb->loop_depth + 1);
5514
5515       /* Count the increment as a setting of the register,
5516          even though it isn't a SET in rtl.  */
5517       REG_N_SETS (regno)++;
5518     }
5519 }
5520
5521 /* X is a MEM found in INSN.  See if we can convert it into an auto-increment
5522    reference.  */
5523
5524 static void
5525 find_auto_inc (pbi, x, insn)
5526      struct propagate_block_info *pbi;
5527      rtx x;
5528      rtx insn;
5529 {
5530   rtx addr = XEXP (x, 0);
5531   HOST_WIDE_INT offset = 0;
5532   rtx set, y, incr, inc_val;
5533   int regno;
5534   int size = GET_MODE_SIZE (GET_MODE (x));
5535
5536   if (GET_CODE (insn) == JUMP_INSN)
5537     return;
5538
5539   /* Here we detect use of an index register which might be good for
5540      postincrement, postdecrement, preincrement, or predecrement.  */
5541
5542   if (GET_CODE (addr) == PLUS && GET_CODE (XEXP (addr, 1)) == CONST_INT)
5543     offset = INTVAL (XEXP (addr, 1)), addr = XEXP (addr, 0);
5544
5545   if (GET_CODE (addr) != REG)
5546     return;
5547
5548   regno = REGNO (addr);
5549
5550   /* Is the next use an increment that might make auto-increment? */
5551   incr = pbi->reg_next_use[regno];
5552   if (incr == 0 || BLOCK_NUM (incr) != BLOCK_NUM (insn))
5553     return;
5554   set = single_set (incr);
5555   if (set == 0 || GET_CODE (set) != SET)
5556     return;
5557   y = SET_SRC (set);
5558
5559   if (GET_CODE (y) != PLUS)
5560     return;
5561
5562   if (REG_P (XEXP (y, 0)) && REGNO (XEXP (y, 0)) == REGNO (addr))
5563     inc_val = XEXP (y, 1);
5564   else if (REG_P (XEXP (y, 1)) && REGNO (XEXP (y, 1)) == REGNO (addr))
5565     inc_val = XEXP (y, 0);
5566   else
5567     return;
5568
5569   if (GET_CODE (inc_val) == CONST_INT)
5570     {
5571       if (HAVE_POST_INCREMENT
5572           && (INTVAL (inc_val) == size && offset == 0))
5573         attempt_auto_inc (pbi, gen_rtx_POST_INC (Pmode, addr), insn, x,
5574                           incr, addr);
5575       else if (HAVE_POST_DECREMENT
5576                && (INTVAL (inc_val) == -size && offset == 0))
5577         attempt_auto_inc (pbi, gen_rtx_POST_DEC (Pmode, addr), insn, x,
5578                           incr, addr);
5579       else if (HAVE_PRE_INCREMENT
5580                && (INTVAL (inc_val) == size && offset == size))
5581         attempt_auto_inc (pbi, gen_rtx_PRE_INC (Pmode, addr), insn, x,
5582                           incr, addr);
5583       else if (HAVE_PRE_DECREMENT
5584                && (INTVAL (inc_val) == -size && offset == -size))
5585         attempt_auto_inc (pbi, gen_rtx_PRE_DEC (Pmode, addr), insn, x,
5586                           incr, addr);
5587       else if (HAVE_POST_MODIFY_DISP && offset == 0)
5588         attempt_auto_inc (pbi, gen_rtx_POST_MODIFY (Pmode, addr,
5589                                                     gen_rtx_PLUS (Pmode,
5590                                                                   addr,
5591                                                                   inc_val)),
5592                           insn, x, incr, addr);
5593     }
5594   else if (GET_CODE (inc_val) == REG
5595            && ! reg_set_between_p (inc_val, PREV_INSN (insn),
5596                                    NEXT_INSN (incr)))
5597
5598     {
5599       if (HAVE_POST_MODIFY_REG && offset == 0)
5600         attempt_auto_inc (pbi, gen_rtx_POST_MODIFY (Pmode, addr,
5601                                                     gen_rtx_PLUS (Pmode,
5602                                                                   addr,
5603                                                                   inc_val)),
5604                           insn, x, incr, addr);
5605     }
5606 }
5607
5608 #endif /* AUTO_INC_DEC */
5609 \f
5610 static void
5611 mark_used_reg (pbi, reg, cond, insn)
5612      struct propagate_block_info *pbi;
5613      rtx reg;
5614      rtx cond ATTRIBUTE_UNUSED;
5615      rtx insn;
5616 {
5617   unsigned int regno_first, regno_last, i;
5618   int some_was_live, some_was_dead, some_not_set;
5619
5620   regno_last = regno_first = REGNO (reg);
5621   if (regno_first < FIRST_PSEUDO_REGISTER)
5622     regno_last += HARD_REGNO_NREGS (regno_first, GET_MODE (reg)) - 1;
5623
5624   /* Find out if any of this register is live after this instruction.  */
5625   some_was_live = some_was_dead = 0;
5626   for (i = regno_first; i <= regno_last; ++i)
5627     {
5628       int needed_regno = REGNO_REG_SET_P (pbi->reg_live, i);
5629       some_was_live |= needed_regno;
5630       some_was_dead |= ! needed_regno;
5631     }
5632
5633   /* Find out if any of the register was set this insn.  */
5634   some_not_set = 0;
5635   for (i = regno_first; i <= regno_last; ++i)
5636     some_not_set |= ! REGNO_REG_SET_P (pbi->new_set, i);
5637
5638   if (pbi->flags & (PROP_LOG_LINKS | PROP_AUTOINC))
5639     {
5640       /* Record where each reg is used, so when the reg is set we know
5641          the next insn that uses it.  */
5642       pbi->reg_next_use[regno_first] = insn;
5643     }
5644
5645   if (pbi->flags & PROP_REG_INFO)
5646     {
5647       if (regno_first < FIRST_PSEUDO_REGISTER)
5648         {
5649           /* If this is a register we are going to try to eliminate,
5650              don't mark it live here.  If we are successful in
5651              eliminating it, it need not be live unless it is used for
5652              pseudos, in which case it will have been set live when it
5653              was allocated to the pseudos.  If the register will not
5654              be eliminated, reload will set it live at that point.
5655
5656              Otherwise, record that this function uses this register.  */
5657           /* ??? The PPC backend tries to "eliminate" on the pic
5658              register to itself.  This should be fixed.  In the mean
5659              time, hack around it.  */
5660
5661           if (! (TEST_HARD_REG_BIT (elim_reg_set, regno_first)
5662                  && (regno_first == FRAME_POINTER_REGNUM
5663                      || regno_first == ARG_POINTER_REGNUM)))
5664             for (i = regno_first; i <= regno_last; ++i)
5665               regs_ever_live[i] = 1;
5666         }
5667       else
5668         {
5669           /* Keep track of which basic block each reg appears in.  */
5670
5671           register int blocknum = pbi->bb->index;
5672           if (REG_BASIC_BLOCK (regno_first) == REG_BLOCK_UNKNOWN)
5673             REG_BASIC_BLOCK (regno_first) = blocknum;
5674           else if (REG_BASIC_BLOCK (regno_first) != blocknum)
5675             REG_BASIC_BLOCK (regno_first) = REG_BLOCK_GLOBAL;
5676
5677           /* Count (weighted) number of uses of each reg.  */
5678           REG_N_REFS (regno_first)
5679             += (optimize_size ? 1 : pbi->bb->loop_depth + 1);
5680         }
5681     }
5682
5683   /* Record and count the insns in which a reg dies.  If it is used in
5684      this insn and was dead below the insn then it dies in this insn.
5685      If it was set in this insn, we do not make a REG_DEAD note;
5686      likewise if we already made such a note.  */
5687   if ((pbi->flags & (PROP_DEATH_NOTES | PROP_REG_INFO))
5688       && some_was_dead
5689       && some_not_set)
5690     {
5691       /* Check for the case where the register dying partially
5692          overlaps the register set by this insn.  */
5693       if (regno_first != regno_last)
5694         for (i = regno_first; i <= regno_last; ++i)
5695           some_was_live |= REGNO_REG_SET_P (pbi->new_set, i);
5696
5697       /* If none of the words in X is needed, make a REG_DEAD note.
5698          Otherwise, we must make partial REG_DEAD notes.  */
5699       if (! some_was_live)
5700         {
5701           if ((pbi->flags & PROP_DEATH_NOTES)
5702               && ! find_regno_note (insn, REG_DEAD, regno_first))
5703             REG_NOTES (insn)
5704               = alloc_EXPR_LIST (REG_DEAD, reg, REG_NOTES (insn));
5705
5706           if (pbi->flags & PROP_REG_INFO)
5707             REG_N_DEATHS (regno_first)++;
5708         }
5709       else
5710         {
5711           /* Don't make a REG_DEAD note for a part of a register
5712              that is set in the insn.  */
5713           for (i = regno_first; i <= regno_last; ++i)
5714             if (! REGNO_REG_SET_P (pbi->reg_live, i)
5715                 && ! dead_or_set_regno_p (insn, i))
5716               REG_NOTES (insn)
5717                 = alloc_EXPR_LIST (REG_DEAD,
5718                                    gen_rtx_REG (reg_raw_mode[i], i),
5719                                    REG_NOTES (insn));
5720         }
5721     }
5722
5723   /* Mark the register as being live.  */
5724   for (i = regno_first; i <= regno_last; ++i)
5725     {
5726       SET_REGNO_REG_SET (pbi->reg_live, i);
5727
5728 #ifdef HAVE_conditional_execution
5729       /* If this is a conditional use, record that fact.  If it is later
5730          conditionally set, we'll know to kill the register.  */
5731       if (cond != NULL_RTX)
5732         {
5733           splay_tree_node node;
5734           struct reg_cond_life_info *rcli;
5735           rtx ncond;
5736
5737           if (some_was_live)
5738             {
5739               node = splay_tree_lookup (pbi->reg_cond_dead, i);
5740               if (node == NULL)
5741                 {
5742                   /* The register was unconditionally live previously.
5743                      No need to do anything.  */
5744                 }
5745               else
5746                 {
5747                   /* The register was conditionally live previously.
5748                      Subtract the new life cond from the old death cond.  */
5749                   rcli = (struct reg_cond_life_info *) node->value;
5750                   ncond = rcli->condition;
5751                   ncond = and_reg_cond (ncond, not_reg_cond (cond), 1);
5752
5753                   /* If the register is now unconditionally live,
5754                      remove the entry in the splay_tree.  */
5755                   if (ncond == const0_rtx)
5756                     splay_tree_remove (pbi->reg_cond_dead, i);
5757                   else
5758                     {
5759                       rcli->condition = ncond;
5760                       SET_REGNO_REG_SET (pbi->reg_cond_reg,
5761                                          REGNO (XEXP (cond, 0)));
5762                     }
5763                 }
5764             }
5765           else
5766             {
5767               /* The register was not previously live at all.  Record
5768                  the condition under which it is still dead.  */
5769               rcli = (struct reg_cond_life_info *) xmalloc (sizeof (*rcli));
5770               rcli->condition = not_reg_cond (cond);
5771               rcli->stores = const0_rtx;
5772               rcli->orig_condition = const0_rtx;
5773               splay_tree_insert (pbi->reg_cond_dead, i,
5774                                  (splay_tree_value) rcli);
5775
5776               SET_REGNO_REG_SET (pbi->reg_cond_reg, REGNO (XEXP (cond, 0)));
5777             }
5778         }
5779       else if (some_was_live)
5780         {
5781           /* The register may have been conditionally live previously, but
5782              is now unconditionally live.  Remove it from the conditionally
5783              dead list, so that a conditional set won't cause us to think
5784              it dead.  */
5785           splay_tree_remove (pbi->reg_cond_dead, i);
5786         }
5787 #endif
5788     }
5789 }
5790
5791 /* Scan expression X and store a 1-bit in NEW_LIVE for each reg it uses.
5792    This is done assuming the registers needed from X are those that
5793    have 1-bits in PBI->REG_LIVE.
5794
5795    INSN is the containing instruction.  If INSN is dead, this function
5796    is not called.  */
5797
5798 static void
5799 mark_used_regs (pbi, x, cond, insn)
5800      struct propagate_block_info *pbi;
5801      rtx x, cond, insn;
5802 {
5803   register RTX_CODE code;
5804   register int regno;
5805   int flags = pbi->flags;
5806
5807  retry:
5808   code = GET_CODE (x);
5809   switch (code)
5810     {
5811     case LABEL_REF:
5812     case SYMBOL_REF:
5813     case CONST_INT:
5814     case CONST:
5815     case CONST_DOUBLE:
5816     case PC:
5817     case ADDR_VEC:
5818     case ADDR_DIFF_VEC:
5819       return;
5820
5821 #ifdef HAVE_cc0
5822     case CC0:
5823       pbi->cc0_live = 1;
5824       return;
5825 #endif
5826
5827     case CLOBBER:
5828       /* If we are clobbering a MEM, mark any registers inside the address
5829          as being used.  */
5830       if (GET_CODE (XEXP (x, 0)) == MEM)
5831         mark_used_regs (pbi, XEXP (XEXP (x, 0), 0), cond, insn);
5832       return;
5833
5834     case MEM:
5835       /* Don't bother watching stores to mems if this is not the
5836          final pass.  We'll not be deleting dead stores this round.  */
5837       if (optimize && (flags & PROP_SCAN_DEAD_CODE))
5838         {
5839           /* Invalidate the data for the last MEM stored, but only if MEM is
5840              something that can be stored into.  */
5841           if (GET_CODE (XEXP (x, 0)) == SYMBOL_REF
5842               && CONSTANT_POOL_ADDRESS_P (XEXP (x, 0)))
5843             /* Needn't clear the memory set list.  */
5844             ;
5845           else
5846             {
5847               rtx temp = pbi->mem_set_list;
5848               rtx prev = NULL_RTX;
5849               rtx next;
5850
5851               while (temp)
5852                 {
5853                   next = XEXP (temp, 1);
5854                   if (anti_dependence (XEXP (temp, 0), x))
5855                     {
5856                       /* Splice temp out of the list.  */
5857                       if (prev)
5858                         XEXP (prev, 1) = next;
5859                       else
5860                         pbi->mem_set_list = next;
5861                       free_EXPR_LIST_node (temp);
5862                       pbi->mem_set_list_len--;
5863                     }
5864                   else
5865                     prev = temp;
5866                   temp = next;
5867                 }
5868             }
5869
5870           /* If the memory reference had embedded side effects (autoincrement
5871              address modes.  Then we may need to kill some entries on the
5872              memory set list.  */
5873           if (insn)
5874             invalidate_mems_from_autoinc (pbi, insn);
5875         }
5876
5877 #ifdef AUTO_INC_DEC
5878       if (flags & PROP_AUTOINC)
5879         find_auto_inc (pbi, x, insn);
5880 #endif
5881       break;
5882
5883     case SUBREG:
5884 #ifdef CLASS_CANNOT_CHANGE_MODE
5885       if (GET_CODE (SUBREG_REG (x)) == REG
5886           && REGNO (SUBREG_REG (x)) >= FIRST_PSEUDO_REGISTER
5887           && CLASS_CANNOT_CHANGE_MODE_P (GET_MODE (x),
5888                                          GET_MODE (SUBREG_REG (x))))
5889         REG_CHANGES_MODE (REGNO (SUBREG_REG (x))) = 1;
5890 #endif
5891
5892       /* While we're here, optimize this case.  */
5893       x = SUBREG_REG (x);
5894       if (GET_CODE (x) != REG)
5895         goto retry;
5896       /* Fall through.  */
5897
5898     case REG:
5899       /* See a register other than being set => mark it as needed.  */
5900       mark_used_reg (pbi, x, cond, insn);
5901       return;
5902
5903     case SET:
5904       {
5905         register rtx testreg = SET_DEST (x);
5906         int mark_dest = 0;
5907
5908         /* If storing into MEM, don't show it as being used.  But do
5909            show the address as being used.  */
5910         if (GET_CODE (testreg) == MEM)
5911           {
5912 #ifdef AUTO_INC_DEC
5913             if (flags & PROP_AUTOINC)
5914               find_auto_inc (pbi, testreg, insn);
5915 #endif
5916             mark_used_regs (pbi, XEXP (testreg, 0), cond, insn);
5917             mark_used_regs (pbi, SET_SRC (x), cond, insn);
5918             return;
5919           }
5920
5921         /* Storing in STRICT_LOW_PART is like storing in a reg
5922            in that this SET might be dead, so ignore it in TESTREG.
5923            but in some other ways it is like using the reg.
5924
5925            Storing in a SUBREG or a bit field is like storing the entire
5926            register in that if the register's value is not used
5927            then this SET is not needed.  */
5928         while (GET_CODE (testreg) == STRICT_LOW_PART
5929                || GET_CODE (testreg) == ZERO_EXTRACT
5930                || GET_CODE (testreg) == SIGN_EXTRACT
5931                || GET_CODE (testreg) == SUBREG)
5932           {
5933 #ifdef CLASS_CANNOT_CHANGE_MODE
5934             if (GET_CODE (testreg) == SUBREG
5935                 && GET_CODE (SUBREG_REG (testreg)) == REG
5936                 && REGNO (SUBREG_REG (testreg)) >= FIRST_PSEUDO_REGISTER
5937                 && CLASS_CANNOT_CHANGE_MODE_P (GET_MODE (SUBREG_REG (testreg)),
5938                                                GET_MODE (testreg)))
5939               REG_CHANGES_MODE (REGNO (SUBREG_REG (testreg))) = 1;
5940 #endif
5941
5942             /* Modifying a single register in an alternate mode
5943                does not use any of the old value.  But these other
5944                ways of storing in a register do use the old value.  */
5945             if (GET_CODE (testreg) == SUBREG
5946                 && !(REG_SIZE (SUBREG_REG (testreg)) > REG_SIZE (testreg)))
5947               ;
5948             else
5949               mark_dest = 1;
5950
5951             testreg = XEXP (testreg, 0);
5952           }
5953
5954         /* If this is a store into a register or group of registers,
5955            recursively scan the value being stored.  */
5956
5957         if ((GET_CODE (testreg) == PARALLEL
5958              && GET_MODE (testreg) == BLKmode)
5959             || (GET_CODE (testreg) == REG
5960                 && (regno = REGNO (testreg),
5961                     ! (regno == FRAME_POINTER_REGNUM
5962                        && (! reload_completed || frame_pointer_needed)))
5963 #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
5964                 && ! (regno == HARD_FRAME_POINTER_REGNUM
5965                       && (! reload_completed || frame_pointer_needed))
5966 #endif
5967 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
5968                 && ! (regno == ARG_POINTER_REGNUM && fixed_regs[regno])
5969 #endif
5970                 ))
5971           {
5972             if (mark_dest)
5973               mark_used_regs (pbi, SET_DEST (x), cond, insn);
5974             mark_used_regs (pbi, SET_SRC (x), cond, insn);
5975             return;
5976           }
5977       }
5978       break;
5979
5980     case ASM_OPERANDS:
5981     case UNSPEC_VOLATILE:
5982     case TRAP_IF:
5983     case ASM_INPUT:
5984       {
5985         /* Traditional and volatile asm instructions must be considered to use
5986            and clobber all hard registers, all pseudo-registers and all of
5987            memory.  So must TRAP_IF and UNSPEC_VOLATILE operations.
5988
5989            Consider for instance a volatile asm that changes the fpu rounding
5990            mode.  An insn should not be moved across this even if it only uses
5991            pseudo-regs because it might give an incorrectly rounded result.
5992
5993            ?!? Unfortunately, marking all hard registers as live causes massive
5994            problems for the register allocator and marking all pseudos as live
5995            creates mountains of uninitialized variable warnings.
5996
5997            So for now, just clear the memory set list and mark any regs
5998            we can find in ASM_OPERANDS as used.  */
5999         if (code != ASM_OPERANDS || MEM_VOLATILE_P (x))
6000           {
6001             free_EXPR_LIST_list (&pbi->mem_set_list);
6002             pbi->mem_set_list_len = 0;
6003           }
6004
6005         /* For all ASM_OPERANDS, we must traverse the vector of input operands.
6006            We can not just fall through here since then we would be confused
6007            by the ASM_INPUT rtx inside ASM_OPERANDS, which do not indicate
6008            traditional asms unlike their normal usage.  */
6009         if (code == ASM_OPERANDS)
6010           {
6011             int j;
6012
6013             for (j = 0; j < ASM_OPERANDS_INPUT_LENGTH (x); j++)
6014               mark_used_regs (pbi, ASM_OPERANDS_INPUT (x, j), cond, insn);
6015           }
6016         break;
6017       }
6018
6019     case COND_EXEC:
6020       if (cond != NULL_RTX)
6021         abort ();
6022
6023       mark_used_regs (pbi, COND_EXEC_TEST (x), NULL_RTX, insn);
6024
6025       cond = COND_EXEC_TEST (x);
6026       x = COND_EXEC_CODE (x);
6027       goto retry;
6028
6029     case PHI:
6030       /* We _do_not_ want to scan operands of phi nodes.  Operands of
6031          a phi function are evaluated only when control reaches this
6032          block along a particular edge.  Therefore, regs that appear
6033          as arguments to phi should not be added to the global live at
6034          start.  */
6035       return;
6036
6037     default:
6038       break;
6039     }
6040
6041   /* Recursively scan the operands of this expression.  */
6042
6043   {
6044     register const char *fmt = GET_RTX_FORMAT (code);
6045     register int i;
6046
6047     for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
6048       {
6049         if (fmt[i] == 'e')
6050           {
6051             /* Tail recursive case: save a function call level.  */
6052             if (i == 0)
6053               {
6054                 x = XEXP (x, 0);
6055                 goto retry;
6056               }
6057             mark_used_regs (pbi, XEXP (x, i), cond, insn);
6058           }
6059         else if (fmt[i] == 'E')
6060           {
6061             register int j;
6062             for (j = 0; j < XVECLEN (x, i); j++)
6063               mark_used_regs (pbi, XVECEXP (x, i, j), cond, insn);
6064           }
6065       }
6066   }
6067 }
6068 \f
6069 #ifdef AUTO_INC_DEC
6070
6071 static int
6072 try_pre_increment_1 (pbi, insn)
6073      struct propagate_block_info *pbi;
6074      rtx insn;
6075 {
6076   /* Find the next use of this reg.  If in same basic block,
6077      make it do pre-increment or pre-decrement if appropriate.  */
6078   rtx x = single_set (insn);
6079   HOST_WIDE_INT amount = ((GET_CODE (SET_SRC (x)) == PLUS ? 1 : -1)
6080                           * INTVAL (XEXP (SET_SRC (x), 1)));
6081   int regno = REGNO (SET_DEST (x));
6082   rtx y = pbi->reg_next_use[regno];
6083   if (y != 0
6084       && SET_DEST (x) != stack_pointer_rtx
6085       && BLOCK_NUM (y) == BLOCK_NUM (insn)
6086       /* Don't do this if the reg dies, or gets set in y; a standard addressing
6087          mode would be better.  */
6088       && ! dead_or_set_p (y, SET_DEST (x))
6089       && try_pre_increment (y, SET_DEST (x), amount))
6090     {
6091       /* We have found a suitable auto-increment and already changed
6092          insn Y to do it.  So flush this increment instruction.  */
6093       propagate_block_delete_insn (pbi->bb, insn);
6094
6095       /* Count a reference to this reg for the increment insn we are
6096          deleting.  When a reg is incremented, spilling it is worse,
6097          so we want to make that less likely.  */
6098       if (regno >= FIRST_PSEUDO_REGISTER)
6099         {
6100           REG_N_REFS (regno) += (optimize_size ? 1
6101                                  : pbi->bb->loop_depth + 1);
6102           REG_N_SETS (regno)++;
6103         }
6104
6105       /* Flush any remembered memories depending on the value of
6106          the incremented register.  */
6107       invalidate_mems_from_set (pbi, SET_DEST (x));
6108
6109       return 1;
6110     }
6111   return 0;
6112 }
6113
6114 /* Try to change INSN so that it does pre-increment or pre-decrement
6115    addressing on register REG in order to add AMOUNT to REG.
6116    AMOUNT is negative for pre-decrement.
6117    Returns 1 if the change could be made.
6118    This checks all about the validity of the result of modifying INSN.  */
6119
6120 static int
6121 try_pre_increment (insn, reg, amount)
6122      rtx insn, reg;
6123      HOST_WIDE_INT amount;
6124 {
6125   register rtx use;
6126
6127   /* Nonzero if we can try to make a pre-increment or pre-decrement.
6128      For example, addl $4,r1; movl (r1),... can become movl +(r1),...  */
6129   int pre_ok = 0;
6130   /* Nonzero if we can try to make a post-increment or post-decrement.
6131      For example, addl $4,r1; movl -4(r1),... can become movl (r1)+,...
6132      It is possible for both PRE_OK and POST_OK to be nonzero if the machine
6133      supports both pre-inc and post-inc, or both pre-dec and post-dec.  */
6134   int post_ok = 0;
6135
6136   /* Nonzero if the opportunity actually requires post-inc or post-dec.  */
6137   int do_post = 0;
6138
6139   /* From the sign of increment, see which possibilities are conceivable
6140      on this target machine.  */
6141   if (HAVE_PRE_INCREMENT && amount > 0)
6142     pre_ok = 1;
6143   if (HAVE_POST_INCREMENT && amount > 0)
6144     post_ok = 1;
6145
6146   if (HAVE_PRE_DECREMENT && amount < 0)
6147     pre_ok = 1;
6148   if (HAVE_POST_DECREMENT && amount < 0)
6149     post_ok = 1;
6150
6151   if (! (pre_ok || post_ok))
6152     return 0;
6153
6154   /* It is not safe to add a side effect to a jump insn
6155      because if the incremented register is spilled and must be reloaded
6156      there would be no way to store the incremented value back in memory.  */
6157
6158   if (GET_CODE (insn) == JUMP_INSN)
6159     return 0;
6160
6161   use = 0;
6162   if (pre_ok)
6163     use = find_use_as_address (PATTERN (insn), reg, 0);
6164   if (post_ok && (use == 0 || use == (rtx) 1))
6165     {
6166       use = find_use_as_address (PATTERN (insn), reg, -amount);
6167       do_post = 1;
6168     }
6169
6170   if (use == 0 || use == (rtx) 1)
6171     return 0;
6172
6173   if (GET_MODE_SIZE (GET_MODE (use)) != (amount > 0 ? amount : - amount))
6174     return 0;
6175
6176   /* See if this combination of instruction and addressing mode exists.  */
6177   if (! validate_change (insn, &XEXP (use, 0),
6178                          gen_rtx_fmt_e (amount > 0
6179                                         ? (do_post ? POST_INC : PRE_INC)
6180                                         : (do_post ? POST_DEC : PRE_DEC),
6181                                         Pmode, reg), 0))
6182     return 0;
6183
6184   /* Record that this insn now has an implicit side effect on X.  */
6185   REG_NOTES (insn) = alloc_EXPR_LIST (REG_INC, reg, REG_NOTES (insn));
6186   return 1;
6187 }
6188
6189 #endif /* AUTO_INC_DEC */
6190 \f
6191 /* Find the place in the rtx X where REG is used as a memory address.
6192    Return the MEM rtx that so uses it.
6193    If PLUSCONST is nonzero, search instead for a memory address equivalent to
6194    (plus REG (const_int PLUSCONST)).
6195
6196    If such an address does not appear, return 0.
6197    If REG appears more than once, or is used other than in such an address,
6198    return (rtx)1.  */
6199
6200 rtx
6201 find_use_as_address (x, reg, plusconst)
6202      register rtx x;
6203      rtx reg;
6204      HOST_WIDE_INT plusconst;
6205 {
6206   enum rtx_code code = GET_CODE (x);
6207   const char *fmt = GET_RTX_FORMAT (code);
6208   register int i;
6209   register rtx value = 0;
6210   register rtx tem;
6211
6212   if (code == MEM && XEXP (x, 0) == reg && plusconst == 0)
6213     return x;
6214
6215   if (code == MEM && GET_CODE (XEXP (x, 0)) == PLUS
6216       && XEXP (XEXP (x, 0), 0) == reg
6217       && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
6218       && INTVAL (XEXP (XEXP (x, 0), 1)) == plusconst)
6219     return x;
6220
6221   if (code == SIGN_EXTRACT || code == ZERO_EXTRACT)
6222     {
6223       /* If REG occurs inside a MEM used in a bit-field reference,
6224          that is unacceptable.  */
6225       if (find_use_as_address (XEXP (x, 0), reg, 0) != 0)
6226         return (rtx) (HOST_WIDE_INT) 1;
6227     }
6228
6229   if (x == reg)
6230     return (rtx) (HOST_WIDE_INT) 1;
6231
6232   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
6233     {
6234       if (fmt[i] == 'e')
6235         {
6236           tem = find_use_as_address (XEXP (x, i), reg, plusconst);
6237           if (value == 0)
6238             value = tem;
6239           else if (tem != 0)
6240             return (rtx) (HOST_WIDE_INT) 1;
6241         }
6242       else if (fmt[i] == 'E')
6243         {
6244           register int j;
6245           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
6246             {
6247               tem = find_use_as_address (XVECEXP (x, i, j), reg, plusconst);
6248               if (value == 0)
6249                 value = tem;
6250               else if (tem != 0)
6251                 return (rtx) (HOST_WIDE_INT) 1;
6252             }
6253         }
6254     }
6255
6256   return value;
6257 }
6258 \f
6259 /* Write information about registers and basic blocks into FILE.
6260    This is part of making a debugging dump.  */
6261
6262 void
6263 dump_regset (r, outf)
6264      regset r;
6265      FILE *outf;
6266 {
6267   int i;
6268   if (r == NULL)
6269     {
6270       fputs (" (nil)", outf);
6271       return;
6272     }
6273
6274   EXECUTE_IF_SET_IN_REG_SET (r, 0, i,
6275     {
6276       fprintf (outf, " %d", i);
6277       if (i < FIRST_PSEUDO_REGISTER)
6278         fprintf (outf, " [%s]",
6279                  reg_names[i]);
6280     });
6281 }
6282
6283 /* Print a human-reaable representation of R on the standard error
6284    stream.  This function is designed to be used from within the
6285    debugger.  */
6286
6287 void
6288 debug_regset (r)
6289      regset r;
6290 {
6291   dump_regset (r, stderr);
6292   putc ('\n', stderr);
6293 }
6294
6295 void
6296 dump_flow_info (file)
6297      FILE *file;
6298 {
6299   register int i;
6300   static const char * const reg_class_names[] = REG_CLASS_NAMES;
6301
6302   fprintf (file, "%d registers.\n", max_regno);
6303   for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
6304     if (REG_N_REFS (i))
6305       {
6306         enum reg_class class, altclass;
6307         fprintf (file, "\nRegister %d used %d times across %d insns",
6308                  i, REG_N_REFS (i), REG_LIVE_LENGTH (i));
6309         if (REG_BASIC_BLOCK (i) >= 0)
6310           fprintf (file, " in block %d", REG_BASIC_BLOCK (i));
6311         if (REG_N_SETS (i))
6312           fprintf (file, "; set %d time%s", REG_N_SETS (i),
6313                    (REG_N_SETS (i) == 1) ? "" : "s");
6314         if (REG_USERVAR_P (regno_reg_rtx[i]))
6315           fprintf (file, "; user var");
6316         if (REG_N_DEATHS (i) != 1)
6317           fprintf (file, "; dies in %d places", REG_N_DEATHS (i));
6318         if (REG_N_CALLS_CROSSED (i) == 1)
6319           fprintf (file, "; crosses 1 call");
6320         else if (REG_N_CALLS_CROSSED (i))
6321           fprintf (file, "; crosses %d calls", REG_N_CALLS_CROSSED (i));
6322         if (PSEUDO_REGNO_BYTES (i) != UNITS_PER_WORD)
6323           fprintf (file, "; %d bytes", PSEUDO_REGNO_BYTES (i));
6324         class = reg_preferred_class (i);
6325         altclass = reg_alternate_class (i);
6326         if (class != GENERAL_REGS || altclass != ALL_REGS)
6327           {
6328             if (altclass == ALL_REGS || class == ALL_REGS)
6329               fprintf (file, "; pref %s", reg_class_names[(int) class]);
6330             else if (altclass == NO_REGS)
6331               fprintf (file, "; %s or none", reg_class_names[(int) class]);
6332             else
6333               fprintf (file, "; pref %s, else %s",
6334                        reg_class_names[(int) class],
6335                        reg_class_names[(int) altclass]);
6336           }
6337         if (REG_POINTER (regno_reg_rtx[i]))
6338           fprintf (file, "; pointer");
6339         fprintf (file, ".\n");
6340       }
6341
6342   fprintf (file, "\n%d basic blocks, %d edges.\n", n_basic_blocks, n_edges);
6343   for (i = 0; i < n_basic_blocks; i++)
6344     {
6345       register basic_block bb = BASIC_BLOCK (i);
6346       register edge e;
6347
6348       fprintf (file, "\nBasic block %d: first insn %d, last %d, loop_depth %d, count %d.\n",
6349                i, INSN_UID (bb->head), INSN_UID (bb->end), bb->loop_depth, bb->count);
6350
6351       fprintf (file, "Predecessors: ");
6352       for (e = bb->pred; e; e = e->pred_next)
6353         dump_edge_info (file, e, 0);
6354
6355       fprintf (file, "\nSuccessors: ");
6356       for (e = bb->succ; e; e = e->succ_next)
6357         dump_edge_info (file, e, 1);
6358
6359       fprintf (file, "\nRegisters live at start:");
6360       dump_regset (bb->global_live_at_start, file);
6361
6362       fprintf (file, "\nRegisters live at end:");
6363       dump_regset (bb->global_live_at_end, file);
6364
6365       putc ('\n', file);
6366     }
6367
6368   putc ('\n', file);
6369 }
6370
6371 void
6372 debug_flow_info ()
6373 {
6374   dump_flow_info (stderr);
6375 }
6376
6377 static void
6378 dump_edge_info (file, e, do_succ)
6379      FILE *file;
6380      edge e;
6381      int do_succ;
6382 {
6383   basic_block side = (do_succ ? e->dest : e->src);
6384
6385   if (side == ENTRY_BLOCK_PTR)
6386     fputs (" ENTRY", file);
6387   else if (side == EXIT_BLOCK_PTR)
6388     fputs (" EXIT", file);
6389   else
6390     fprintf (file, " %d", side->index);
6391
6392   if (e->count)
6393     fprintf (file, " count:%d", e->count);
6394
6395   if (e->flags)
6396     {
6397       static const char * const bitnames[] = {
6398         "fallthru", "crit", "ab", "abcall", "eh", "fake"
6399       };
6400       int comma = 0;
6401       int i, flags = e->flags;
6402
6403       fputc (' ', file);
6404       fputc ('(', file);
6405       for (i = 0; flags; i++)
6406         if (flags & (1 << i))
6407           {
6408             flags &= ~(1 << i);
6409
6410             if (comma)
6411               fputc (',', file);
6412             if (i < (int) ARRAY_SIZE (bitnames))
6413               fputs (bitnames[i], file);
6414             else
6415               fprintf (file, "%d", i);
6416             comma = 1;
6417           }
6418       fputc (')', file);
6419     }
6420 }
6421 \f
6422 /* Print out one basic block with live information at start and end.  */
6423
6424 void
6425 dump_bb (bb, outf)
6426      basic_block bb;
6427      FILE *outf;
6428 {
6429   rtx insn;
6430   rtx last;
6431   edge e;
6432
6433   fprintf (outf, ";; Basic block %d, loop depth %d, count %d",
6434            bb->index, bb->loop_depth, bb->count);
6435   putc ('\n', outf);
6436
6437   fputs (";; Predecessors: ", outf);
6438   for (e = bb->pred; e; e = e->pred_next)
6439     dump_edge_info (outf, e, 0);
6440   putc ('\n', outf);
6441
6442   fputs (";; Registers live at start:", outf);
6443   dump_regset (bb->global_live_at_start, outf);
6444   putc ('\n', outf);
6445
6446   for (insn = bb->head, last = NEXT_INSN (bb->end);
6447        insn != last;
6448        insn = NEXT_INSN (insn))
6449     print_rtl_single (outf, insn);
6450
6451   fputs (";; Registers live at end:", outf);
6452   dump_regset (bb->global_live_at_end, outf);
6453   putc ('\n', outf);
6454
6455   fputs (";; Successors: ", outf);
6456   for (e = bb->succ; e; e = e->succ_next)
6457     dump_edge_info (outf, e, 1);
6458   putc ('\n', outf);
6459 }
6460
6461 void
6462 debug_bb (bb)
6463      basic_block bb;
6464 {
6465   dump_bb (bb, stderr);
6466 }
6467
6468 void
6469 debug_bb_n (n)
6470      int n;
6471 {
6472   dump_bb (BASIC_BLOCK (n), stderr);
6473 }
6474
6475 /* Like print_rtl, but also print out live information for the start of each
6476    basic block.  */
6477
6478 void
6479 print_rtl_with_bb (outf, rtx_first)
6480      FILE *outf;
6481      rtx rtx_first;
6482 {
6483   register rtx tmp_rtx;
6484
6485   if (rtx_first == 0)
6486     fprintf (outf, "(nil)\n");
6487   else
6488     {
6489       int i;
6490       enum bb_state { NOT_IN_BB, IN_ONE_BB, IN_MULTIPLE_BB };
6491       int max_uid = get_max_uid ();
6492       basic_block *start = (basic_block *)
6493         xcalloc (max_uid, sizeof (basic_block));
6494       basic_block *end = (basic_block *)
6495         xcalloc (max_uid, sizeof (basic_block));
6496       enum bb_state *in_bb_p = (enum bb_state *)
6497         xcalloc (max_uid, sizeof (enum bb_state));
6498
6499       for (i = n_basic_blocks - 1; i >= 0; i--)
6500         {
6501           basic_block bb = BASIC_BLOCK (i);
6502           rtx x;
6503
6504           start[INSN_UID (bb->head)] = bb;
6505           end[INSN_UID (bb->end)] = bb;
6506           for (x = bb->head; x != NULL_RTX; x = NEXT_INSN (x))
6507             {
6508               enum bb_state state = IN_MULTIPLE_BB;
6509               if (in_bb_p[INSN_UID (x)] == NOT_IN_BB)
6510                 state = IN_ONE_BB;
6511               in_bb_p[INSN_UID (x)] = state;
6512
6513               if (x == bb->end)
6514                 break;
6515             }
6516         }
6517
6518       for (tmp_rtx = rtx_first; NULL != tmp_rtx; tmp_rtx = NEXT_INSN (tmp_rtx))
6519         {
6520           int did_output;
6521           basic_block bb;
6522
6523           if ((bb = start[INSN_UID (tmp_rtx)]) != NULL)
6524             {
6525               fprintf (outf, ";; Start of basic block %d, registers live:",
6526                        bb->index);
6527               dump_regset (bb->global_live_at_start, outf);
6528               putc ('\n', outf);
6529             }
6530
6531           if (in_bb_p[INSN_UID (tmp_rtx)] == NOT_IN_BB
6532               && GET_CODE (tmp_rtx) != NOTE
6533               && GET_CODE (tmp_rtx) != BARRIER)
6534             fprintf (outf, ";; Insn is not within a basic block\n");
6535           else if (in_bb_p[INSN_UID (tmp_rtx)] == IN_MULTIPLE_BB)
6536             fprintf (outf, ";; Insn is in multiple basic blocks\n");
6537
6538           did_output = print_rtl_single (outf, tmp_rtx);
6539
6540           if ((bb = end[INSN_UID (tmp_rtx)]) != NULL)
6541             {
6542               fprintf (outf, ";; End of basic block %d, registers live:\n",
6543                        bb->index);
6544               dump_regset (bb->global_live_at_end, outf);
6545               putc ('\n', outf);
6546             }
6547
6548           if (did_output)
6549             putc ('\n', outf);
6550         }
6551
6552       free (start);
6553       free (end);
6554       free (in_bb_p);
6555     }
6556
6557   if (current_function_epilogue_delay_list != 0)
6558     {
6559       fprintf (outf, "\n;; Insns in epilogue delay list:\n\n");
6560       for (tmp_rtx = current_function_epilogue_delay_list; tmp_rtx != 0;
6561            tmp_rtx = XEXP (tmp_rtx, 1))
6562         print_rtl_single (outf, XEXP (tmp_rtx, 0));
6563     }
6564 }
6565
6566 /* Dump the rtl into the current debugging dump file, then abort.  */
6567
6568 static void
6569 print_rtl_and_abort_fcn (file, line, function)
6570      const char *file;
6571      int line;
6572      const char *function;
6573 {
6574   if (rtl_dump_file)
6575     {
6576       print_rtl_with_bb (rtl_dump_file, get_insns ());
6577       fclose (rtl_dump_file);
6578     }
6579
6580   fancy_abort (file, line, function);
6581 }
6582
6583 /* Recompute register set/reference counts immediately prior to register
6584    allocation.
6585
6586    This avoids problems with set/reference counts changing to/from values
6587    which have special meanings to the register allocators.
6588
6589    Additionally, the reference counts are the primary component used by the
6590    register allocators to prioritize pseudos for allocation to hard regs.
6591    More accurate reference counts generally lead to better register allocation.
6592
6593    F is the first insn to be scanned.
6594
6595    LOOP_STEP denotes how much loop_depth should be incremented per
6596    loop nesting level in order to increase the ref count more for
6597    references in a loop.
6598
6599    It might be worthwhile to update REG_LIVE_LENGTH, REG_BASIC_BLOCK and
6600    possibly other information which is used by the register allocators.  */
6601
6602 void
6603 recompute_reg_usage (f, loop_step)
6604      rtx f ATTRIBUTE_UNUSED;
6605      int loop_step ATTRIBUTE_UNUSED;
6606 {
6607   allocate_reg_life_data ();
6608   update_life_info (NULL, UPDATE_LIFE_LOCAL, PROP_REG_INFO);
6609 }
6610
6611 /* Optionally removes all the REG_DEAD and REG_UNUSED notes from a set of
6612    blocks.  If BLOCKS is NULL, assume the universal set.  Returns a count
6613    of the number of registers that died.  */
6614
6615 int
6616 count_or_remove_death_notes (blocks, kill)
6617      sbitmap blocks;
6618      int kill;
6619 {
6620   int i, count = 0;
6621
6622   for (i = n_basic_blocks - 1; i >= 0; --i)
6623     {
6624       basic_block bb;
6625       rtx insn;
6626
6627       if (blocks && ! TEST_BIT (blocks, i))
6628         continue;
6629
6630       bb = BASIC_BLOCK (i);
6631
6632       for (insn = bb->head;; insn = NEXT_INSN (insn))
6633         {
6634           if (INSN_P (insn))
6635             {
6636               rtx *pprev = &REG_NOTES (insn);
6637               rtx link = *pprev;
6638
6639               while (link)
6640                 {
6641                   switch (REG_NOTE_KIND (link))
6642                     {
6643                     case REG_DEAD:
6644                       if (GET_CODE (XEXP (link, 0)) == REG)
6645                         {
6646                           rtx reg = XEXP (link, 0);
6647                           int n;
6648
6649                           if (REGNO (reg) >= FIRST_PSEUDO_REGISTER)
6650                             n = 1;
6651                           else
6652                             n = HARD_REGNO_NREGS (REGNO (reg), GET_MODE (reg));
6653                           count += n;
6654                         }
6655                       /* Fall through.  */
6656
6657                     case REG_UNUSED:
6658                       if (kill)
6659                         {
6660                           rtx next = XEXP (link, 1);
6661                           free_EXPR_LIST_node (link);
6662                           *pprev = link = next;
6663                           break;
6664                         }
6665                       /* Fall through.  */
6666
6667                     default:
6668                       pprev = &XEXP (link, 1);
6669                       link = *pprev;
6670                       break;
6671                     }
6672                 }
6673             }
6674
6675           if (insn == bb->end)
6676             break;
6677         }
6678     }
6679
6680   return count;
6681 }
6682
6683
6684 /* Update insns block within BB.  */
6685
6686 void
6687 update_bb_for_insn (bb)
6688      basic_block bb;
6689 {
6690   rtx insn;
6691
6692   if (! basic_block_for_insn)
6693     return;
6694
6695   for (insn = bb->head; ; insn = NEXT_INSN (insn))
6696     {
6697       set_block_for_insn (insn, bb);
6698
6699       if (insn == bb->end)
6700         break;
6701     }
6702 }
6703
6704
6705 /* Record INSN's block as BB.  */
6706
6707 void
6708 set_block_for_insn (insn, bb)
6709      rtx insn;
6710      basic_block bb;
6711 {
6712   size_t uid = INSN_UID (insn);
6713   if (uid >= basic_block_for_insn->num_elements)
6714     {
6715       int new_size;
6716
6717       /* Add one-eighth the size so we don't keep calling xrealloc.  */
6718       new_size = uid + (uid + 7) / 8;
6719
6720       VARRAY_GROW (basic_block_for_insn, new_size);
6721     }
6722   VARRAY_BB (basic_block_for_insn, uid) = bb;
6723 }
6724
6725 /* When a new insn has been inserted into an existing block, it will
6726    sometimes emit more than a single insn. This routine will set the
6727    block number for the specified insn, and look backwards in the insn
6728    chain to see if there are any other uninitialized insns immediately 
6729    previous to this one, and set the block number for them too.  */
6730
6731 void
6732 set_block_for_new_insns (insn, bb)
6733      rtx insn;
6734      basic_block bb;
6735 {
6736   set_block_for_insn (insn, bb);
6737
6738   /* Scan the previous instructions setting the block number until we find 
6739      an instruction that has the block number set, or we find a note 
6740      of any kind.  */
6741   for (insn = PREV_INSN (insn); insn != NULL_RTX; insn = PREV_INSN (insn))
6742     {
6743       if (GET_CODE (insn) == NOTE)
6744         break;
6745       if (INSN_UID (insn) >= basic_block_for_insn->num_elements 
6746           || BLOCK_FOR_INSN (insn) == 0)
6747         set_block_for_insn (insn, bb);
6748       else
6749         break;
6750     }
6751 }
6752 \f
6753 /* Verify the CFG consistency.  This function check some CFG invariants and
6754    aborts when something is wrong.  Hope that this function will help to
6755    convert many optimization passes to preserve CFG consistent.
6756
6757    Currently it does following checks:
6758
6759    - test head/end pointers
6760    - overlapping of basic blocks
6761    - edge list corectness
6762    - headers of basic blocks (the NOTE_INSN_BASIC_BLOCK note)
6763    - tails of basic blocks (ensure that boundary is necesary)
6764    - scans body of the basic block for JUMP_INSN, CODE_LABEL
6765      and NOTE_INSN_BASIC_BLOCK
6766    - check that all insns are in the basic blocks
6767    (except the switch handling code, barriers and notes)
6768    - check that all returns are followed by barriers
6769
6770    In future it can be extended check a lot of other stuff as well
6771    (reachability of basic blocks, life information, etc. etc.).  */
6772
6773 void
6774 verify_flow_info ()
6775 {
6776   const int max_uid = get_max_uid ();
6777   const rtx rtx_first = get_insns ();
6778   rtx last_head = get_last_insn ();
6779   basic_block *bb_info;
6780   rtx x;
6781   int i, last_bb_num_seen, num_bb_notes, err = 0;
6782
6783   bb_info = (basic_block *) xcalloc (max_uid, sizeof (basic_block));
6784
6785   for (i = n_basic_blocks - 1; i >= 0; i--)
6786     {
6787       basic_block bb = BASIC_BLOCK (i);
6788       rtx head = bb->head;
6789       rtx end = bb->end;
6790
6791       /* Verify the end of the basic block is in the INSN chain.  */
6792       for (x = last_head; x != NULL_RTX; x = PREV_INSN (x))
6793         if (x == end)
6794           break;
6795       if (!x)
6796         {
6797           error ("End insn %d for block %d not found in the insn stream.",
6798                  INSN_UID (end), bb->index);
6799           err = 1;
6800         }
6801
6802       /* Work backwards from the end to the head of the basic block
6803          to verify the head is in the RTL chain.  */
6804       for (; x != NULL_RTX; x = PREV_INSN (x))
6805         {
6806           /* While walking over the insn chain, verify insns appear
6807              in only one basic block and initialize the BB_INFO array
6808              used by other passes.  */
6809           if (bb_info[INSN_UID (x)] != NULL)
6810             {
6811               error ("Insn %d is in multiple basic blocks (%d and %d)",
6812                      INSN_UID (x), bb->index, bb_info[INSN_UID (x)]->index);
6813               err = 1;
6814             }
6815           bb_info[INSN_UID (x)] = bb;
6816
6817           if (x == head)
6818             break;
6819         }
6820       if (!x)
6821         {
6822           error ("Head insn %d for block %d not found in the insn stream.",
6823                  INSN_UID (head), bb->index);
6824           err = 1;
6825         }
6826
6827       last_head = x;
6828     }
6829
6830   /* Now check the basic blocks (boundaries etc.) */
6831   for (i = n_basic_blocks - 1; i >= 0; i--)
6832     {
6833       basic_block bb = BASIC_BLOCK (i);
6834       /* Check corectness of edge lists */
6835       edge e;
6836
6837       e = bb->succ;
6838       while (e)
6839         {
6840           if (e->src != bb)
6841             {
6842               fprintf (stderr,
6843                        "verify_flow_info: Basic block %d succ edge is corrupted\n",
6844                        bb->index);
6845               fprintf (stderr, "Predecessor: ");
6846               dump_edge_info (stderr, e, 0);
6847               fprintf (stderr, "\nSuccessor: ");
6848               dump_edge_info (stderr, e, 1);
6849               fflush (stderr);
6850               err = 1;
6851             }
6852           if (e->dest != EXIT_BLOCK_PTR)
6853             {
6854               edge e2 = e->dest->pred;
6855               while (e2 && e2 != e)
6856                 e2 = e2->pred_next;
6857               if (!e2)
6858                 {
6859                   error ("Basic block %i edge lists are corrupted", bb->index);
6860                   err = 1;
6861                 }
6862             }
6863           e = e->succ_next;
6864         }
6865
6866       e = bb->pred;
6867       while (e)
6868         {
6869           if (e->dest != bb)
6870             {
6871               error ("Basic block %d pred edge is corrupted", bb->index);
6872               fputs ("Predecessor: ", stderr);
6873               dump_edge_info (stderr, e, 0);
6874               fputs ("\nSuccessor: ", stderr);
6875               dump_edge_info (stderr, e, 1);
6876               fputc ('\n', stderr);
6877               err = 1;
6878             }
6879           if (e->src != ENTRY_BLOCK_PTR)
6880             {
6881               edge e2 = e->src->succ;
6882               while (e2 && e2 != e)
6883                 e2 = e2->succ_next;
6884               if (!e2)
6885                 {
6886                   error ("Basic block %i edge lists are corrupted", bb->index);
6887                   err = 1;
6888                 }
6889             }
6890           e = e->pred_next;
6891         }
6892
6893       /* OK pointers are correct.  Now check the header of basic
6894          block.  It ought to contain optional CODE_LABEL followed
6895          by NOTE_BASIC_BLOCK.  */
6896       x = bb->head;
6897       if (GET_CODE (x) == CODE_LABEL)
6898         {
6899           if (bb->end == x)
6900             {
6901               error ("NOTE_INSN_BASIC_BLOCK is missing for block %d",
6902                      bb->index);
6903               err = 1;
6904             }
6905           x = NEXT_INSN (x);
6906         }
6907       if (!NOTE_INSN_BASIC_BLOCK_P (x) || NOTE_BASIC_BLOCK (x) != bb)
6908         {
6909           error ("NOTE_INSN_BASIC_BLOCK is missing for block %d\n",
6910                  bb->index);
6911           err = 1;
6912         }
6913
6914       if (bb->end == x)
6915         {
6916           /* Do checks for empty blocks here */
6917         }
6918       else
6919         {
6920           x = NEXT_INSN (x);
6921           while (x)
6922             {
6923               if (NOTE_INSN_BASIC_BLOCK_P (x))
6924                 {
6925                   error ("NOTE_INSN_BASIC_BLOCK %d in the middle of basic block %d",
6926                          INSN_UID (x), bb->index);
6927                   err = 1;
6928                 }
6929
6930               if (x == bb->end)
6931                 break;
6932
6933               if (GET_CODE (x) == JUMP_INSN
6934                   || GET_CODE (x) == CODE_LABEL
6935                   || GET_CODE (x) == BARRIER)
6936                 {
6937                   error ("In basic block %d:", bb->index);
6938                   fatal_insn ("Flow control insn inside a basic block", x);
6939                 }
6940
6941               x = NEXT_INSN (x);
6942             }
6943         }
6944     }
6945
6946   last_bb_num_seen = -1;
6947   num_bb_notes = 0;
6948   x = rtx_first;
6949   while (x)
6950     {
6951       if (NOTE_INSN_BASIC_BLOCK_P (x))
6952         {
6953           basic_block bb = NOTE_BASIC_BLOCK (x);
6954           num_bb_notes++;
6955           if (bb->index != last_bb_num_seen + 1)
6956             /* Basic blocks not numbered consecutively.  */
6957             abort ();
6958                
6959           last_bb_num_seen = bb->index;
6960         }
6961
6962       if (!bb_info[INSN_UID (x)])
6963         {
6964           switch (GET_CODE (x))
6965             {
6966             case BARRIER:
6967             case NOTE:
6968               break;
6969
6970             case CODE_LABEL:
6971               /* An addr_vec is placed outside any block block.  */
6972               if (NEXT_INSN (x)
6973                   && GET_CODE (NEXT_INSN (x)) == JUMP_INSN
6974                   && (GET_CODE (PATTERN (NEXT_INSN (x))) == ADDR_DIFF_VEC
6975                       || GET_CODE (PATTERN (NEXT_INSN (x))) == ADDR_VEC))
6976                 {
6977                   x = NEXT_INSN (x);
6978                 }
6979
6980               /* But in any case, non-deletable labels can appear anywhere.  */
6981               break;
6982
6983             default:
6984               fatal_insn ("Insn outside basic block", x);
6985             }
6986         }
6987
6988       if (INSN_P (x)
6989           && GET_CODE (x) == JUMP_INSN
6990           && returnjump_p (x) && ! condjump_p (x)
6991           && ! (NEXT_INSN (x) && GET_CODE (NEXT_INSN (x)) == BARRIER))
6992             fatal_insn ("Return not followed by barrier", x);
6993
6994       x = NEXT_INSN (x);
6995     }
6996
6997   if (num_bb_notes != n_basic_blocks)
6998     internal_error
6999       ("number of bb notes in insn chain (%d) != n_basic_blocks (%d)",
7000        num_bb_notes, n_basic_blocks);
7001
7002   if (err)
7003     abort ();
7004
7005   /* Clean up.  */
7006   free (bb_info);
7007 }
7008 \f
7009 /* Functions to access an edge list with a vector representation.
7010    Enough data is kept such that given an index number, the
7011    pred and succ that edge represents can be determined, or
7012    given a pred and a succ, its index number can be returned.
7013    This allows algorithms which consume a lot of memory to
7014    represent the normally full matrix of edge (pred,succ) with a
7015    single indexed vector,  edge (EDGE_INDEX (pred, succ)), with no
7016    wasted space in the client code due to sparse flow graphs.  */
7017
7018 /* This functions initializes the edge list. Basically the entire
7019    flowgraph is processed, and all edges are assigned a number,
7020    and the data structure is filled in.  */
7021
7022 struct edge_list *
7023 create_edge_list ()
7024 {
7025   struct edge_list *elist;
7026   edge e;
7027   int num_edges;
7028   int x;
7029   int block_count;
7030
7031   block_count = n_basic_blocks + 2;   /* Include the entry and exit blocks.  */
7032
7033   num_edges = 0;
7034
7035   /* Determine the number of edges in the flow graph by counting successor
7036      edges on each basic block.  */
7037   for (x = 0; x < n_basic_blocks; x++)
7038     {
7039       basic_block bb = BASIC_BLOCK (x);
7040
7041       for (e = bb->succ; e; e = e->succ_next)
7042         num_edges++;
7043     }
7044   /* Don't forget successors of the entry block.  */
7045   for (e = ENTRY_BLOCK_PTR->succ; e; e = e->succ_next)
7046     num_edges++;
7047
7048   elist = (struct edge_list *) xmalloc (sizeof (struct edge_list));
7049   elist->num_blocks = block_count;
7050   elist->num_edges = num_edges;
7051   elist->index_to_edge = (edge *) xmalloc (sizeof (edge) * num_edges);
7052
7053   num_edges = 0;
7054
7055   /* Follow successors of the entry block, and register these edges.  */
7056   for (e = ENTRY_BLOCK_PTR->succ; e; e = e->succ_next)
7057     {
7058       elist->index_to_edge[num_edges] = e;
7059       num_edges++;
7060     }
7061
7062   for (x = 0; x < n_basic_blocks; x++)
7063     {
7064       basic_block bb = BASIC_BLOCK (x);
7065
7066       /* Follow all successors of blocks, and register these edges.  */
7067       for (e = bb->succ; e; e = e->succ_next)
7068         {
7069           elist->index_to_edge[num_edges] = e;
7070           num_edges++;
7071         }
7072     }
7073   return elist;
7074 }
7075
7076 /* This function free's memory associated with an edge list.  */
7077
7078 void
7079 free_edge_list (elist)
7080      struct edge_list *elist;
7081 {
7082   if (elist)
7083     {
7084       free (elist->index_to_edge);
7085       free (elist);
7086     }
7087 }
7088
7089 /* This function provides debug output showing an edge list.  */
7090
7091 void
7092 print_edge_list (f, elist)
7093      FILE *f;
7094      struct edge_list *elist;
7095 {
7096   int x;
7097   fprintf (f, "Compressed edge list, %d BBs + entry & exit, and %d edges\n",
7098            elist->num_blocks - 2, elist->num_edges);
7099
7100   for (x = 0; x < elist->num_edges; x++)
7101     {
7102       fprintf (f, " %-4d - edge(", x);
7103       if (INDEX_EDGE_PRED_BB (elist, x) == ENTRY_BLOCK_PTR)
7104         fprintf (f, "entry,");
7105       else
7106         fprintf (f, "%d,", INDEX_EDGE_PRED_BB (elist, x)->index);
7107
7108       if (INDEX_EDGE_SUCC_BB (elist, x) == EXIT_BLOCK_PTR)
7109         fprintf (f, "exit)\n");
7110       else
7111         fprintf (f, "%d)\n", INDEX_EDGE_SUCC_BB (elist, x)->index);
7112     }
7113 }
7114
7115 /* This function provides an internal consistency check of an edge list,
7116    verifying that all edges are present, and that there are no
7117    extra edges.  */
7118
7119 void
7120 verify_edge_list (f, elist)
7121      FILE *f;
7122      struct edge_list *elist;
7123 {
7124   int x, pred, succ, index;
7125   edge e;
7126
7127   for (x = 0; x < n_basic_blocks; x++)
7128     {
7129       basic_block bb = BASIC_BLOCK (x);
7130
7131       for (e = bb->succ; e; e = e->succ_next)
7132         {
7133           pred = e->src->index;
7134           succ = e->dest->index;
7135           index = EDGE_INDEX (elist, e->src, e->dest);
7136           if (index == EDGE_INDEX_NO_EDGE)
7137             {
7138               fprintf (f, "*p* No index for edge from %d to %d\n", pred, succ);
7139               continue;
7140             }
7141           if (INDEX_EDGE_PRED_BB (elist, index)->index != pred)
7142             fprintf (f, "*p* Pred for index %d should be %d not %d\n",
7143                      index, pred, INDEX_EDGE_PRED_BB (elist, index)->index);
7144           if (INDEX_EDGE_SUCC_BB (elist, index)->index != succ)
7145             fprintf (f, "*p* Succ for index %d should be %d not %d\n",
7146                      index, succ, INDEX_EDGE_SUCC_BB (elist, index)->index);
7147         }
7148     }
7149   for (e = ENTRY_BLOCK_PTR->succ; e; e = e->succ_next)
7150     {
7151       pred = e->src->index;
7152       succ = e->dest->index;
7153       index = EDGE_INDEX (elist, e->src, e->dest);
7154       if (index == EDGE_INDEX_NO_EDGE)
7155         {
7156           fprintf (f, "*p* No index for edge from %d to %d\n", pred, succ);
7157           continue;
7158         }
7159       if (INDEX_EDGE_PRED_BB (elist, index)->index != pred)
7160         fprintf (f, "*p* Pred for index %d should be %d not %d\n",
7161                  index, pred, INDEX_EDGE_PRED_BB (elist, index)->index);
7162       if (INDEX_EDGE_SUCC_BB (elist, index)->index != succ)
7163         fprintf (f, "*p* Succ for index %d should be %d not %d\n",
7164                  index, succ, INDEX_EDGE_SUCC_BB (elist, index)->index);
7165     }
7166   /* We've verified that all the edges are in the list, no lets make sure
7167      there are no spurious edges in the list.  */
7168
7169   for (pred = 0; pred < n_basic_blocks; pred++)
7170     for (succ = 0; succ < n_basic_blocks; succ++)
7171       {
7172         basic_block p = BASIC_BLOCK (pred);
7173         basic_block s = BASIC_BLOCK (succ);
7174
7175         int found_edge = 0;
7176
7177         for (e = p->succ; e; e = e->succ_next)
7178           if (e->dest == s)
7179             {
7180               found_edge = 1;
7181               break;
7182             }
7183         for (e = s->pred; e; e = e->pred_next)
7184           if (e->src == p)
7185             {
7186               found_edge = 1;
7187               break;
7188             }
7189         if (EDGE_INDEX (elist, BASIC_BLOCK (pred), BASIC_BLOCK (succ))
7190             == EDGE_INDEX_NO_EDGE && found_edge != 0)
7191           fprintf (f, "*** Edge (%d, %d) appears to not have an index\n",
7192                    pred, succ);
7193         if (EDGE_INDEX (elist, BASIC_BLOCK (pred), BASIC_BLOCK (succ))
7194             != EDGE_INDEX_NO_EDGE && found_edge == 0)
7195           fprintf (f, "*** Edge (%d, %d) has index %d, but there is no edge\n",
7196                    pred, succ, EDGE_INDEX (elist, BASIC_BLOCK (pred),
7197                                            BASIC_BLOCK (succ)));
7198       }
7199   for (succ = 0; succ < n_basic_blocks; succ++)
7200     {
7201       basic_block p = ENTRY_BLOCK_PTR;
7202       basic_block s = BASIC_BLOCK (succ);
7203
7204       int found_edge = 0;
7205
7206       for (e = p->succ; e; e = e->succ_next)
7207         if (e->dest == s)
7208           {
7209             found_edge = 1;
7210             break;
7211           }
7212       for (e = s->pred; e; e = e->pred_next)
7213         if (e->src == p)
7214           {
7215             found_edge = 1;
7216             break;
7217           }
7218       if (EDGE_INDEX (elist, ENTRY_BLOCK_PTR, BASIC_BLOCK (succ))
7219           == EDGE_INDEX_NO_EDGE && found_edge != 0)
7220         fprintf (f, "*** Edge (entry, %d) appears to not have an index\n",
7221                  succ);
7222       if (EDGE_INDEX (elist, ENTRY_BLOCK_PTR, BASIC_BLOCK (succ))
7223           != EDGE_INDEX_NO_EDGE && found_edge == 0)
7224         fprintf (f, "*** Edge (entry, %d) has index %d, but no edge exists\n",
7225                  succ, EDGE_INDEX (elist, ENTRY_BLOCK_PTR,
7226                                    BASIC_BLOCK (succ)));
7227     }
7228   for (pred = 0; pred < n_basic_blocks; pred++)
7229     {
7230       basic_block p = BASIC_BLOCK (pred);
7231       basic_block s = EXIT_BLOCK_PTR;
7232
7233       int found_edge = 0;
7234
7235       for (e = p->succ; e; e = e->succ_next)
7236         if (e->dest == s)
7237           {
7238             found_edge = 1;
7239             break;
7240           }
7241       for (e = s->pred; e; e = e->pred_next)
7242         if (e->src == p)
7243           {
7244             found_edge = 1;
7245             break;
7246           }
7247       if (EDGE_INDEX (elist, BASIC_BLOCK (pred), EXIT_BLOCK_PTR)
7248           == EDGE_INDEX_NO_EDGE && found_edge != 0)
7249         fprintf (f, "*** Edge (%d, exit) appears to not have an index\n",
7250                  pred);
7251       if (EDGE_INDEX (elist, BASIC_BLOCK (pred), EXIT_BLOCK_PTR)
7252           != EDGE_INDEX_NO_EDGE && found_edge == 0)
7253         fprintf (f, "*** Edge (%d, exit) has index %d, but no edge exists\n",
7254                  pred, EDGE_INDEX (elist, BASIC_BLOCK (pred),
7255                                    EXIT_BLOCK_PTR));
7256     }
7257 }
7258
7259 /* This routine will determine what, if any, edge there is between
7260    a specified predecessor and successor.  */
7261
7262 int
7263 find_edge_index (edge_list, pred, succ)
7264      struct edge_list *edge_list;
7265      basic_block pred, succ;
7266 {
7267   int x;
7268   for (x = 0; x < NUM_EDGES (edge_list); x++)
7269     {
7270       if (INDEX_EDGE_PRED_BB (edge_list, x) == pred
7271           && INDEX_EDGE_SUCC_BB (edge_list, x) == succ)
7272         return x;
7273     }
7274   return (EDGE_INDEX_NO_EDGE);
7275 }
7276
7277 /* This function will remove an edge from the flow graph.  */
7278
7279 void
7280 remove_edge (e)
7281      edge e;
7282 {
7283   edge last_pred = NULL;
7284   edge last_succ = NULL;
7285   edge tmp;
7286   basic_block src, dest;
7287   src = e->src;
7288   dest = e->dest;
7289   for (tmp = src->succ; tmp && tmp != e; tmp = tmp->succ_next)
7290     last_succ = tmp;
7291
7292   if (!tmp)
7293     abort ();
7294   if (last_succ)
7295     last_succ->succ_next = e->succ_next;
7296   else
7297     src->succ = e->succ_next;
7298
7299   for (tmp = dest->pred; tmp && tmp != e; tmp = tmp->pred_next)
7300     last_pred = tmp;
7301
7302   if (!tmp)
7303     abort ();
7304   if (last_pred)
7305     last_pred->pred_next = e->pred_next;
7306   else
7307     dest->pred = e->pred_next;
7308
7309   n_edges--;
7310   free (e);
7311 }
7312
7313 /* This routine will remove any fake successor edges for a basic block.
7314    When the edge is removed, it is also removed from whatever predecessor
7315    list it is in.  */
7316
7317 static void
7318 remove_fake_successors (bb)
7319      basic_block bb;
7320 {
7321   edge e;
7322   for (e = bb->succ; e;)
7323     {
7324       edge tmp = e;
7325       e = e->succ_next;
7326       if ((tmp->flags & EDGE_FAKE) == EDGE_FAKE)
7327         remove_edge (tmp);
7328     }
7329 }
7330
7331 /* This routine will remove all fake edges from the flow graph.  If
7332    we remove all fake successors, it will automatically remove all
7333    fake predecessors.  */
7334
7335 void
7336 remove_fake_edges ()
7337 {
7338   int x;
7339
7340   for (x = 0; x < n_basic_blocks; x++)
7341     remove_fake_successors (BASIC_BLOCK (x));
7342
7343   /* We've handled all successors except the entry block's.  */
7344   remove_fake_successors (ENTRY_BLOCK_PTR);
7345 }
7346
7347 /* This function will add a fake edge between any block which has no
7348    successors, and the exit block. Some data flow equations require these
7349    edges to exist.  */
7350
7351 void
7352 add_noreturn_fake_exit_edges ()
7353 {
7354   int x;
7355
7356   for (x = 0; x < n_basic_blocks; x++)
7357     if (BASIC_BLOCK (x)->succ == NULL)
7358       make_edge (NULL, BASIC_BLOCK (x), EXIT_BLOCK_PTR, EDGE_FAKE);
7359 }
7360
7361 /* This function adds a fake edge between any infinite loops to the
7362    exit block.  Some optimizations require a path from each node to
7363    the exit node.
7364
7365    See also Morgan, Figure 3.10, pp. 82-83.
7366
7367    The current implementation is ugly, not attempting to minimize the
7368    number of inserted fake edges.  To reduce the number of fake edges
7369    to insert, add fake edges from _innermost_ loops containing only
7370    nodes not reachable from the exit block.  */
7371
7372 void
7373 connect_infinite_loops_to_exit ()
7374 {
7375   basic_block unvisited_block;
7376
7377   /* Perform depth-first search in the reverse graph to find nodes
7378      reachable from the exit block.  */
7379   struct depth_first_search_dsS dfs_ds;
7380
7381   flow_dfs_compute_reverse_init (&dfs_ds);
7382   flow_dfs_compute_reverse_add_bb (&dfs_ds, EXIT_BLOCK_PTR);
7383
7384   /* Repeatedly add fake edges, updating the unreachable nodes.  */
7385   while (1)
7386     {
7387       unvisited_block = flow_dfs_compute_reverse_execute (&dfs_ds);
7388       if (!unvisited_block)
7389         break;
7390       make_edge (NULL, unvisited_block, EXIT_BLOCK_PTR, EDGE_FAKE);
7391       flow_dfs_compute_reverse_add_bb (&dfs_ds, unvisited_block);
7392     }
7393
7394   flow_dfs_compute_reverse_finish (&dfs_ds);
7395
7396   return;
7397 }
7398
7399 /* Redirect an edge's successor from one block to another.  */
7400
7401 void
7402 redirect_edge_succ (e, new_succ)
7403      edge e;
7404      basic_block new_succ;
7405 {
7406   edge *pe;
7407
7408   /* Disconnect the edge from the old successor block.  */
7409   for (pe = &e->dest->pred; *pe != e; pe = &(*pe)->pred_next)
7410     continue;
7411   *pe = (*pe)->pred_next;
7412
7413   /* Reconnect the edge to the new successor block.  */
7414   e->pred_next = new_succ->pred;
7415   new_succ->pred = e;
7416   e->dest = new_succ;
7417 }
7418
7419 /* Redirect an edge's predecessor from one block to another.  */
7420
7421 void
7422 redirect_edge_pred (e, new_pred)
7423      edge e;
7424      basic_block new_pred;
7425 {
7426   edge *pe;
7427
7428   /* Disconnect the edge from the old predecessor block.  */
7429   for (pe = &e->src->succ; *pe != e; pe = &(*pe)->succ_next)
7430     continue;
7431   *pe = (*pe)->succ_next;
7432
7433   /* Reconnect the edge to the new predecessor block.  */
7434   e->succ_next = new_pred->succ;
7435   new_pred->succ = e;
7436   e->src = new_pred;
7437 }
7438 \f
7439 /* Dump the list of basic blocks in the bitmap NODES.  */
7440
7441 static void
7442 flow_nodes_print (str, nodes, file)
7443      const char *str;
7444      const sbitmap nodes;
7445      FILE *file;
7446 {
7447   int node;
7448
7449   if (! nodes)
7450     return;
7451
7452   fprintf (file, "%s { ", str);
7453   EXECUTE_IF_SET_IN_SBITMAP (nodes, 0, node, {fprintf (file, "%d ", node);});
7454   fputs ("}\n", file);
7455 }
7456
7457
7458 /* Dump the list of edges in the array EDGE_LIST.  */
7459
7460 static void
7461 flow_edge_list_print (str, edge_list, num_edges, file)
7462      const char *str;
7463      const edge *edge_list;
7464      int num_edges;
7465      FILE *file;
7466 {
7467   int i;
7468
7469   if (! edge_list)
7470     return;
7471
7472   fprintf (file, "%s { ", str);
7473   for (i = 0; i < num_edges; i++)
7474     fprintf (file, "%d->%d ", edge_list[i]->src->index,
7475              edge_list[i]->dest->index);
7476   fputs ("}\n", file);
7477 }
7478
7479
7480 /* Dump loop related CFG information.  */
7481
7482 static void
7483 flow_loops_cfg_dump (loops, file)
7484      const struct loops *loops;
7485      FILE *file;
7486 {
7487   int i;
7488
7489   if (! loops->num || ! file || ! loops->cfg.dom)
7490     return;
7491
7492   for (i = 0; i < n_basic_blocks; i++)
7493     {
7494       edge succ;
7495
7496       fprintf (file, ";; %d succs { ", i);
7497       for (succ = BASIC_BLOCK (i)->succ; succ; succ = succ->succ_next)
7498         fprintf (file, "%d ", succ->dest->index);
7499       flow_nodes_print ("} dom", loops->cfg.dom[i], file);
7500     }
7501
7502   /* Dump the DFS node order.  */
7503   if (loops->cfg.dfs_order)
7504     {
7505       fputs (";; DFS order: ", file);
7506       for (i = 0; i < n_basic_blocks; i++)
7507         fprintf (file, "%d ", loops->cfg.dfs_order[i]);
7508       fputs ("\n", file);
7509     }
7510   /* Dump the reverse completion node order.  */
7511   if (loops->cfg.rc_order)
7512     {
7513       fputs (";; RC order: ", file);
7514       for (i = 0; i < n_basic_blocks; i++)
7515         fprintf (file, "%d ", loops->cfg.rc_order[i]);
7516       fputs ("\n", file);
7517     }
7518 }
7519
7520 /* Return non-zero if the nodes of LOOP are a subset of OUTER.  */
7521
7522 static int
7523 flow_loop_nested_p (outer, loop)
7524      struct loop *outer;
7525      struct loop *loop;
7526 {
7527   return sbitmap_a_subset_b_p (loop->nodes, outer->nodes);
7528 }
7529
7530
7531 /* Dump the loop information specified by LOOP to the stream FILE
7532    using auxiliary dump callback function LOOP_DUMP_AUX if non null.  */
7533 void
7534 flow_loop_dump (loop, file, loop_dump_aux, verbose)
7535      const struct loop *loop;
7536      FILE *file;
7537      void (*loop_dump_aux) PARAMS((const struct loop *, FILE *, int));
7538      int verbose;
7539 {
7540   if (! loop || ! loop->header)
7541     return;
7542
7543   fprintf (file, ";;\n;; Loop %d (%d to %d):%s%s\n",
7544            loop->num, INSN_UID (loop->first->head),
7545            INSN_UID (loop->last->end),
7546            loop->shared ? " shared" : "",
7547            loop->invalid ? " invalid" : "");
7548   fprintf (file, ";;  header %d, latch %d, pre-header %d, first %d, last %d\n",
7549            loop->header->index, loop->latch->index,
7550            loop->pre_header ? loop->pre_header->index : -1,
7551            loop->first->index, loop->last->index);
7552   fprintf (file, ";;  depth %d, level %d, outer %ld\n",
7553            loop->depth, loop->level,
7554            (long) (loop->outer ? loop->outer->num : -1));
7555
7556   if (loop->pre_header_edges)
7557     flow_edge_list_print (";;  pre-header edges", loop->pre_header_edges,
7558                           loop->num_pre_header_edges, file);
7559   flow_edge_list_print (";;  entry edges", loop->entry_edges,
7560                         loop->num_entries, file);
7561   fprintf (file, ";;  %d", loop->num_nodes);
7562   flow_nodes_print (" nodes", loop->nodes, file);
7563   flow_edge_list_print (";;  exit edges", loop->exit_edges,
7564                         loop->num_exits, file);
7565   if (loop->exits_doms)
7566     flow_nodes_print (";;  exit doms", loop->exits_doms, file);
7567   if (loop_dump_aux)
7568     loop_dump_aux (loop, file, verbose);
7569 }
7570
7571
7572 /* Dump the loop information specified by LOOPS to the stream FILE,
7573    using auxiliary dump callback function LOOP_DUMP_AUX if non null.  */
7574 void
7575 flow_loops_dump (loops, file, loop_dump_aux, verbose)
7576      const struct loops *loops;
7577      FILE *file;
7578      void (*loop_dump_aux) PARAMS((const struct loop *, FILE *, int));
7579      int verbose;
7580 {
7581   int i;
7582   int num_loops;
7583
7584   num_loops = loops->num;
7585   if (! num_loops || ! file)
7586     return;
7587
7588   fprintf (file, ";; %d loops found, %d levels\n",
7589            num_loops, loops->levels);
7590
7591   for (i = 0; i < num_loops; i++)
7592     {
7593       struct loop *loop = &loops->array[i];
7594
7595       flow_loop_dump (loop, file, loop_dump_aux, verbose);
7596
7597       if (loop->shared)
7598         {
7599           int j;
7600
7601           for (j = 0; j < i; j++)
7602             {
7603               struct loop *oloop = &loops->array[j];
7604
7605               if (loop->header == oloop->header)
7606                 {
7607                   int disjoint;
7608                   int smaller;
7609
7610                   smaller = loop->num_nodes < oloop->num_nodes;
7611
7612                   /* If the union of LOOP and OLOOP is different than
7613                      the larger of LOOP and OLOOP then LOOP and OLOOP
7614                      must be disjoint.  */
7615                   disjoint = ! flow_loop_nested_p (smaller ? loop : oloop,
7616                                                    smaller ? oloop : loop);
7617                   fprintf (file,
7618                            ";; loop header %d shared by loops %d, %d %s\n",
7619                            loop->header->index, i, j,
7620                            disjoint ? "disjoint" : "nested");
7621                 }
7622             }
7623         }
7624     }
7625
7626   if (verbose)
7627     flow_loops_cfg_dump (loops, file);
7628 }
7629
7630
7631 /* Free all the memory allocated for LOOPS.  */
7632
7633 void
7634 flow_loops_free (loops)
7635      struct loops *loops;
7636 {
7637   if (loops->array)
7638     {
7639       int i;
7640
7641       if (! loops->num)
7642         abort ();
7643
7644       /* Free the loop descriptors.  */
7645       for (i = 0; i < loops->num; i++)
7646         {
7647           struct loop *loop = &loops->array[i];
7648
7649           if (loop->pre_header_edges)
7650             free (loop->pre_header_edges);
7651           if (loop->nodes)
7652             sbitmap_free (loop->nodes);
7653           if (loop->entry_edges)
7654             free (loop->entry_edges);
7655           if (loop->exit_edges)
7656             free (loop->exit_edges);
7657           if (loop->exits_doms)
7658             sbitmap_free (loop->exits_doms);
7659         }
7660       free (loops->array);
7661       loops->array = NULL;
7662
7663       if (loops->cfg.dom)
7664         sbitmap_vector_free (loops->cfg.dom);
7665       if (loops->cfg.dfs_order)
7666         free (loops->cfg.dfs_order);
7667
7668       if (loops->shared_headers)
7669         sbitmap_free (loops->shared_headers);
7670     }
7671 }
7672
7673
7674 /* Find the entry edges into the loop with header HEADER and nodes
7675    NODES and store in ENTRY_EDGES array.  Return the number of entry
7676    edges from the loop.  */
7677
7678 static int
7679 flow_loop_entry_edges_find (header, nodes, entry_edges)
7680      basic_block header;
7681      const sbitmap nodes;
7682      edge **entry_edges;
7683 {
7684   edge e;
7685   int num_entries;
7686
7687   *entry_edges = NULL;
7688
7689   num_entries = 0;
7690   for (e = header->pred; e; e = e->pred_next)
7691     {
7692       basic_block src = e->src;
7693
7694       if (src == ENTRY_BLOCK_PTR || ! TEST_BIT (nodes, src->index))
7695         num_entries++;
7696     }
7697
7698   if (! num_entries)
7699     abort ();
7700
7701   *entry_edges = (edge *) xmalloc (num_entries * sizeof (edge *));
7702
7703   num_entries = 0;
7704   for (e = header->pred; e; e = e->pred_next)
7705     {
7706       basic_block src = e->src;
7707
7708       if (src == ENTRY_BLOCK_PTR || ! TEST_BIT (nodes, src->index))
7709         (*entry_edges)[num_entries++] = e;
7710     }
7711
7712   return num_entries;
7713 }
7714
7715
7716 /* Find the exit edges from the loop using the bitmap of loop nodes
7717    NODES and store in EXIT_EDGES array.  Return the number of
7718    exit edges from the loop.  */
7719
7720 static int
7721 flow_loop_exit_edges_find (nodes, exit_edges)
7722      const sbitmap nodes;
7723      edge **exit_edges;
7724 {
7725   edge e;
7726   int node;
7727   int num_exits;
7728
7729   *exit_edges = NULL;
7730
7731   /* Check all nodes within the loop to see if there are any
7732      successors not in the loop.  Note that a node may have multiple
7733      exiting edges ?????  A node can have one jumping edge and one fallthru
7734      edge so only one of these can exit the loop.  */
7735   num_exits = 0;
7736   EXECUTE_IF_SET_IN_SBITMAP (nodes, 0, node, {
7737     for (e = BASIC_BLOCK (node)->succ; e; e = e->succ_next)
7738       {
7739         basic_block dest = e->dest;
7740
7741         if (dest == EXIT_BLOCK_PTR || ! TEST_BIT (nodes, dest->index))
7742             num_exits++;
7743       }
7744   });
7745
7746   if (! num_exits)
7747     return 0;
7748
7749   *exit_edges = (edge *) xmalloc (num_exits * sizeof (edge *));
7750
7751   /* Store all exiting edges into an array.  */
7752   num_exits = 0;
7753   EXECUTE_IF_SET_IN_SBITMAP (nodes, 0, node, {
7754     for (e = BASIC_BLOCK (node)->succ; e; e = e->succ_next)
7755       {
7756         basic_block dest = e->dest;
7757
7758         if (dest == EXIT_BLOCK_PTR || ! TEST_BIT (nodes, dest->index))
7759           (*exit_edges)[num_exits++] = e;
7760       }
7761   });
7762
7763   return num_exits;
7764 }
7765
7766
7767 /* Find the nodes contained within the loop with header HEADER and
7768    latch LATCH and store in NODES.  Return the number of nodes within
7769    the loop.  */
7770
7771 static int
7772 flow_loop_nodes_find (header, latch, nodes)
7773      basic_block header;
7774      basic_block latch;
7775      sbitmap nodes;
7776 {
7777   basic_block *stack;
7778   int sp;
7779   int num_nodes = 0;
7780
7781   stack = (basic_block *) xmalloc (n_basic_blocks * sizeof (basic_block));
7782   sp = 0;
7783
7784   /* Start with only the loop header in the set of loop nodes.  */
7785   sbitmap_zero (nodes);
7786   SET_BIT (nodes, header->index);
7787   num_nodes++;
7788   header->loop_depth++;
7789
7790   /* Push the loop latch on to the stack.  */
7791   if (! TEST_BIT (nodes, latch->index))
7792     {
7793       SET_BIT (nodes, latch->index);
7794       latch->loop_depth++;
7795       num_nodes++;
7796       stack[sp++] = latch;
7797     }
7798
7799   while (sp)
7800     {
7801       basic_block node;
7802       edge e;
7803
7804       node = stack[--sp];
7805       for (e = node->pred; e; e = e->pred_next)
7806         {
7807           basic_block ancestor = e->src;
7808
7809           /* If each ancestor not marked as part of loop, add to set of
7810              loop nodes and push on to stack.  */
7811           if (ancestor != ENTRY_BLOCK_PTR
7812               && ! TEST_BIT (nodes, ancestor->index))
7813             {
7814               SET_BIT (nodes, ancestor->index);
7815               ancestor->loop_depth++;
7816               num_nodes++;
7817               stack[sp++] = ancestor;
7818             }
7819         }
7820     }
7821   free (stack);
7822   return num_nodes;
7823 }
7824
7825 /* Compute the depth first search order and store in the array
7826   DFS_ORDER if non-zero, marking the nodes visited in VISITED.  If
7827   RC_ORDER is non-zero, return the reverse completion number for each
7828   node.  Returns the number of nodes visited.  A depth first search
7829   tries to get as far away from the starting point as quickly as
7830   possible.  */
7831
7832 static int
7833 flow_depth_first_order_compute (dfs_order, rc_order)
7834      int *dfs_order;
7835      int *rc_order;
7836 {
7837   edge *stack;
7838   int sp;
7839   int dfsnum = 0;
7840   int rcnum = n_basic_blocks - 1;
7841   sbitmap visited;
7842
7843   /* Allocate stack for back-tracking up CFG.  */
7844   stack = (edge *) xmalloc ((n_basic_blocks + 1) * sizeof (edge));
7845   sp = 0;
7846
7847   /* Allocate bitmap to track nodes that have been visited.  */
7848   visited = sbitmap_alloc (n_basic_blocks);
7849
7850   /* None of the nodes in the CFG have been visited yet.  */
7851   sbitmap_zero (visited);
7852
7853   /* Push the first edge on to the stack.  */
7854   stack[sp++] = ENTRY_BLOCK_PTR->succ;
7855
7856   while (sp)
7857     {
7858       edge e;
7859       basic_block src;
7860       basic_block dest;
7861
7862       /* Look at the edge on the top of the stack.  */
7863       e = stack[sp - 1];
7864       src = e->src;
7865       dest = e->dest;
7866
7867       /* Check if the edge destination has been visited yet.  */
7868       if (dest != EXIT_BLOCK_PTR && ! TEST_BIT (visited, dest->index))
7869         {
7870           /* Mark that we have visited the destination.  */
7871           SET_BIT (visited, dest->index);
7872
7873           if (dfs_order)
7874             dfs_order[dfsnum++] = dest->index;
7875
7876           if (dest->succ)
7877             {
7878               /* Since the DEST node has been visited for the first
7879                  time, check its successors.  */
7880               stack[sp++] = dest->succ;
7881             }
7882           else
7883             {
7884               /* There are no successors for the DEST node so assign
7885                  its reverse completion number.  */
7886               if (rc_order)
7887                 rc_order[rcnum--] = dest->index;
7888             }
7889         }
7890       else
7891         {
7892           if (! e->succ_next && src != ENTRY_BLOCK_PTR)
7893             {
7894               /* There are no more successors for the SRC node
7895                  so assign its reverse completion number.  */
7896               if (rc_order)
7897                 rc_order[rcnum--] = src->index;
7898             }
7899
7900           if (e->succ_next)
7901             stack[sp - 1] = e->succ_next;
7902           else
7903             sp--;
7904         }
7905     }
7906
7907   free (stack);
7908   sbitmap_free (visited);
7909
7910   /* The number of nodes visited should not be greater than
7911      n_basic_blocks.  */
7912   if (dfsnum > n_basic_blocks)
7913     abort ();
7914
7915   /* There are some nodes left in the CFG that are unreachable.  */
7916   if (dfsnum < n_basic_blocks)
7917     abort ();
7918   return dfsnum;
7919 }
7920
7921 /* Compute the depth first search order on the _reverse_ graph and
7922    store in the array DFS_ORDER, marking the nodes visited in VISITED.
7923    Returns the number of nodes visited.
7924
7925    The computation is split into three pieces:
7926
7927    flow_dfs_compute_reverse_init () creates the necessary data
7928    structures.
7929
7930    flow_dfs_compute_reverse_add_bb () adds a basic block to the data
7931    structures.  The block will start the search.
7932
7933    flow_dfs_compute_reverse_execute () continues (or starts) the
7934    search using the block on the top of the stack, stopping when the
7935    stack is empty.
7936
7937    flow_dfs_compute_reverse_finish () destroys the necessary data
7938    structures.
7939
7940    Thus, the user will probably call ..._init(), call ..._add_bb() to
7941    add a beginning basic block to the stack, call ..._execute(),
7942    possibly add another bb to the stack and again call ..._execute(),
7943    ..., and finally call _finish().  */
7944
7945 /* Initialize the data structures used for depth-first search on the
7946    reverse graph.  If INITIALIZE_STACK is nonzero, the exit block is
7947    added to the basic block stack.  DATA is the current depth-first
7948    search context.  If INITIALIZE_STACK is non-zero, there is an
7949    element on the stack.  */
7950
7951 static void
7952 flow_dfs_compute_reverse_init (data)
7953      depth_first_search_ds data;
7954 {
7955   /* Allocate stack for back-tracking up CFG.  */
7956   data->stack =
7957     (basic_block *) xmalloc ((n_basic_blocks - (INVALID_BLOCK + 1))
7958                              * sizeof (basic_block));
7959   data->sp = 0;
7960
7961   /* Allocate bitmap to track nodes that have been visited.  */
7962   data->visited_blocks = sbitmap_alloc (n_basic_blocks - (INVALID_BLOCK + 1));
7963
7964   /* None of the nodes in the CFG have been visited yet.  */
7965   sbitmap_zero (data->visited_blocks);
7966
7967   return;
7968 }
7969
7970 /* Add the specified basic block to the top of the dfs data
7971    structures.  When the search continues, it will start at the
7972    block.  */
7973
7974 static void
7975 flow_dfs_compute_reverse_add_bb (data, bb)
7976      depth_first_search_ds data;
7977      basic_block bb;
7978 {
7979   data->stack[data->sp++] = bb;
7980   return;
7981 }
7982
7983 /* Continue the depth-first search through the reverse graph starting
7984    with the block at the stack's top and ending when the stack is
7985    empty.  Visited nodes are marked.  Returns an unvisited basic
7986    block, or NULL if there is none available.  */
7987
7988 static basic_block
7989 flow_dfs_compute_reverse_execute (data)
7990      depth_first_search_ds data;
7991 {
7992   basic_block bb;
7993   edge e;
7994   int i;
7995
7996   while (data->sp > 0)
7997     {
7998       bb = data->stack[--data->sp];
7999
8000       /* Mark that we have visited this node.  */
8001       if (!TEST_BIT (data->visited_blocks, bb->index - (INVALID_BLOCK + 1)))
8002         {
8003           SET_BIT (data->visited_blocks, bb->index - (INVALID_BLOCK + 1));
8004
8005           /* Perform depth-first search on adjacent vertices.  */
8006           for (e = bb->pred; e; e = e->pred_next)
8007             flow_dfs_compute_reverse_add_bb (data, e->src);
8008         }
8009     }
8010
8011   /* Determine if there are unvisited basic blocks.  */
8012   for (i = n_basic_blocks - (INVALID_BLOCK + 1); --i >= 0;)
8013     if (!TEST_BIT (data->visited_blocks, i))
8014       return BASIC_BLOCK (i + (INVALID_BLOCK + 1));
8015   return NULL;
8016 }
8017
8018 /* Destroy the data structures needed for depth-first search on the
8019    reverse graph.  */
8020
8021 static void
8022 flow_dfs_compute_reverse_finish (data)
8023      depth_first_search_ds data;
8024 {
8025   free (data->stack);
8026   sbitmap_free (data->visited_blocks);
8027   return;
8028 }
8029
8030
8031 /* Find the root node of the loop pre-header extended basic block and
8032    the edges along the trace from the root node to the loop header.  */
8033
8034 static void
8035 flow_loop_pre_header_scan (loop)
8036      struct loop *loop;
8037 {
8038   int num = 0;
8039   basic_block ebb;
8040
8041   loop->num_pre_header_edges = 0;
8042
8043   if (loop->num_entries != 1)
8044      return;
8045
8046   ebb = loop->entry_edges[0]->src;
8047
8048   if (ebb != ENTRY_BLOCK_PTR)
8049     {
8050       edge e;
8051
8052       /* Count number of edges along trace from loop header to
8053          root of pre-header extended basic block.  Usually this is
8054          only one or two edges. */
8055       num++;
8056       while (ebb->pred->src != ENTRY_BLOCK_PTR && ! ebb->pred->pred_next)
8057         {
8058           ebb = ebb->pred->src;
8059           num++;
8060         }
8061
8062       loop->pre_header_edges = (edge *) xmalloc (num * sizeof (edge *));
8063       loop->num_pre_header_edges = num;
8064
8065       /* Store edges in order that they are followed.   The source
8066          of the first edge is the root node of the pre-header extended
8067          basic block and the destination of the last last edge is
8068          the loop header.  */
8069       for (e = loop->entry_edges[0]; num; e = e->src->pred)
8070         {
8071           loop->pre_header_edges[--num] = e;
8072         }
8073     }
8074 }
8075
8076
8077 /* Return the block for the pre-header of the loop with header
8078    HEADER where DOM specifies the dominator information.  Return NULL if
8079    there is no pre-header.  */
8080
8081 static basic_block
8082 flow_loop_pre_header_find (header, dom)
8083      basic_block header;
8084      const sbitmap *dom;
8085 {
8086   basic_block pre_header;
8087   edge e;
8088
8089   /* If block p is a predecessor of the header and is the only block
8090      that the header does not dominate, then it is the pre-header.  */
8091   pre_header = NULL;
8092   for (e = header->pred; e; e = e->pred_next)
8093     {
8094       basic_block node = e->src;
8095
8096       if (node != ENTRY_BLOCK_PTR
8097           && ! TEST_BIT (dom[node->index], header->index))
8098         {
8099           if (pre_header == NULL)
8100             pre_header = node;
8101           else
8102             {
8103               /* There are multiple edges into the header from outside
8104                  the loop so there is no pre-header block.  */
8105               pre_header = NULL;
8106               break;
8107             }
8108         }
8109     }
8110   return pre_header;
8111 }
8112
8113 /* Add LOOP to the loop hierarchy tree where PREVLOOP was the loop
8114    previously added.  The insertion algorithm assumes that the loops
8115    are added in the order found by a depth first search of the CFG.  */
8116
8117 static void
8118 flow_loop_tree_node_add (prevloop, loop)
8119      struct loop *prevloop;
8120      struct loop *loop;
8121 {
8122
8123   if (flow_loop_nested_p (prevloop, loop))
8124     {
8125       prevloop->inner = loop;
8126       loop->outer = prevloop;
8127       return;
8128     }
8129
8130   while (prevloop->outer)
8131     {
8132       if (flow_loop_nested_p (prevloop->outer, loop))
8133         {
8134           prevloop->next = loop;
8135           loop->outer = prevloop->outer;
8136           return;
8137         }
8138       prevloop = prevloop->outer;
8139     }
8140
8141   prevloop->next = loop;
8142   loop->outer = NULL;
8143 }
8144
8145 /* Build the loop hierarchy tree for LOOPS.  */
8146
8147 static void
8148 flow_loops_tree_build (loops)
8149      struct loops *loops;
8150 {
8151   int i;
8152   int num_loops;
8153
8154   num_loops = loops->num;
8155   if (! num_loops)
8156     return;
8157
8158   /* Root the loop hierarchy tree with the first loop found.
8159      Since we used a depth first search this should be the
8160      outermost loop.  */
8161   loops->tree = &loops->array[0];
8162   loops->tree->outer = loops->tree->inner = loops->tree->next = NULL;
8163
8164   /* Add the remaining loops to the tree.  */
8165   for (i = 1; i < num_loops; i++)
8166     flow_loop_tree_node_add (&loops->array[i - 1], &loops->array[i]);
8167 }
8168
8169 /* Helper function to compute loop nesting depth and enclosed loop level
8170    for the natural loop specified by LOOP at the loop depth DEPTH.
8171    Returns the loop level.  */
8172
8173 static int
8174 flow_loop_level_compute (loop, depth)
8175      struct loop *loop;
8176      int depth;
8177 {
8178   struct loop *inner;
8179   int level = 1;
8180
8181   if (! loop)
8182     return 0;
8183
8184   /* Traverse loop tree assigning depth and computing level as the
8185      maximum level of all the inner loops of this loop.  The loop
8186      level is equivalent to the height of the loop in the loop tree
8187      and corresponds to the number of enclosed loop levels (including
8188      itself).  */
8189   for (inner = loop->inner; inner; inner = inner->next)
8190     {
8191       int ilevel;
8192
8193       ilevel = flow_loop_level_compute (inner, depth + 1) + 1;
8194
8195       if (ilevel > level)
8196         level = ilevel;
8197     }
8198   loop->level = level;
8199   loop->depth = depth;
8200   return level;
8201 }
8202
8203 /* Compute the loop nesting depth and enclosed loop level for the loop
8204    hierarchy tree specfied by LOOPS.  Return the maximum enclosed loop
8205    level.  */
8206
8207 static int
8208 flow_loops_level_compute (loops)
8209      struct loops *loops;
8210 {
8211   struct loop *loop;
8212   int level;
8213   int levels = 0;
8214
8215   /* Traverse all the outer level loops.  */
8216   for (loop = loops->tree; loop; loop = loop->next)
8217     {
8218       level = flow_loop_level_compute (loop, 1);
8219       if (level > levels)
8220         levels = level;
8221     }
8222   return levels;
8223 }
8224
8225
8226 /* Scan a single natural loop specified by LOOP collecting information
8227    about it specified by FLAGS.  */
8228
8229 int
8230 flow_loop_scan (loops, loop, flags)
8231      struct loops *loops;
8232      struct loop *loop;
8233      int flags;
8234 {
8235   /* Determine prerequisites.  */
8236   if ((flags & LOOP_EXITS_DOMS) && ! loop->exit_edges)
8237     flags |= LOOP_EXIT_EDGES;
8238
8239   if (flags & LOOP_ENTRY_EDGES)
8240     {
8241       /* Find edges which enter the loop header.
8242          Note that the entry edges should only
8243          enter the header of a natural loop.  */
8244       loop->num_entries
8245         = flow_loop_entry_edges_find (loop->header,
8246                                       loop->nodes,
8247                                       &loop->entry_edges);
8248     }
8249
8250   if (flags & LOOP_EXIT_EDGES)
8251     {
8252       /* Find edges which exit the loop.  */
8253       loop->num_exits
8254         = flow_loop_exit_edges_find (loop->nodes,
8255                                      &loop->exit_edges);
8256     }
8257
8258   if (flags & LOOP_EXITS_DOMS)
8259     {
8260       int j;
8261
8262       /* Determine which loop nodes dominate all the exits
8263          of the loop.  */
8264       loop->exits_doms = sbitmap_alloc (n_basic_blocks);
8265       sbitmap_copy (loop->exits_doms, loop->nodes);
8266       for (j = 0; j < loop->num_exits; j++)
8267         sbitmap_a_and_b (loop->exits_doms, loop->exits_doms,
8268                          loops->cfg.dom[loop->exit_edges[j]->src->index]);
8269       
8270       /* The header of a natural loop must dominate
8271          all exits.  */
8272       if (! TEST_BIT (loop->exits_doms, loop->header->index))
8273         abort ();
8274     }
8275   
8276   if (flags & LOOP_PRE_HEADER)
8277     {
8278       /* Look to see if the loop has a pre-header node.  */
8279       loop->pre_header
8280         = flow_loop_pre_header_find (loop->header, loops->cfg.dom);
8281
8282       /* Find the blocks within the extended basic block of
8283          the loop pre-header.  */
8284       flow_loop_pre_header_scan (loop);
8285     }
8286   return 1;
8287 }
8288
8289
8290 /* Find all the natural loops in the function and save in LOOPS structure
8291    and recalculate loop_depth information in basic block structures.
8292    FLAGS controls which loop information is collected.
8293    Return the number of natural loops found.  */
8294
8295 int
8296 flow_loops_find (loops, flags)
8297      struct loops *loops;
8298      int flags;
8299 {
8300   int i;
8301   int b;
8302   int num_loops;
8303   edge e;
8304   sbitmap headers;
8305   sbitmap *dom;
8306   int *dfs_order;
8307   int *rc_order;
8308
8309   /* This function cannot be repeatedly called with different
8310      flags to build up the loop information.  The loop tree
8311      must always be built if this function is called.  */
8312   if (! (flags & LOOP_TREE))
8313     abort ();
8314
8315   memset (loops, 0, sizeof (*loops));
8316
8317   /* Taking care of this degenerate case makes the rest of
8318      this code simpler.  */
8319   if (n_basic_blocks == 0)
8320     return 0;
8321
8322   dfs_order = NULL;
8323   rc_order = NULL;
8324
8325   /* Compute the dominators.  */
8326   dom = sbitmap_vector_alloc (n_basic_blocks, n_basic_blocks);
8327   calculate_dominance_info (NULL, dom, CDI_DOMINATORS);
8328
8329   /* Count the number of loop edges (back edges).  This should be the
8330      same as the number of natural loops.  */
8331
8332   num_loops = 0;
8333   for (b = 0; b < n_basic_blocks; b++)
8334     {
8335       basic_block header;
8336
8337       header = BASIC_BLOCK (b);
8338       header->loop_depth = 0;
8339
8340       for (e = header->pred; e; e = e->pred_next)
8341         {
8342           basic_block latch = e->src;
8343
8344           /* Look for back edges where a predecessor is dominated
8345              by this block.  A natural loop has a single entry
8346              node (header) that dominates all the nodes in the
8347              loop.  It also has single back edge to the header
8348              from a latch node.  Note that multiple natural loops
8349              may share the same header.  */
8350           if (b != header->index)
8351             abort ();
8352
8353           if (latch != ENTRY_BLOCK_PTR && TEST_BIT (dom[latch->index], b))
8354             num_loops++;
8355         }
8356     }
8357
8358   if (num_loops)
8359     {
8360       /* Compute depth first search order of the CFG so that outer
8361          natural loops will be found before inner natural loops.  */
8362       dfs_order = (int *) xmalloc (n_basic_blocks * sizeof (int));
8363       rc_order = (int *) xmalloc (n_basic_blocks * sizeof (int));
8364       flow_depth_first_order_compute (dfs_order, rc_order);
8365
8366       /* Save CFG derived information to avoid recomputing it.  */
8367       loops->cfg.dom = dom;
8368       loops->cfg.dfs_order = dfs_order;
8369       loops->cfg.rc_order = rc_order;
8370
8371       /* Allocate loop structures.  */
8372       loops->array
8373         = (struct loop *) xcalloc (num_loops, sizeof (struct loop));
8374
8375       headers = sbitmap_alloc (n_basic_blocks);
8376       sbitmap_zero (headers);
8377
8378       loops->shared_headers = sbitmap_alloc (n_basic_blocks);
8379       sbitmap_zero (loops->shared_headers);
8380
8381       /* Find and record information about all the natural loops
8382          in the CFG.  */
8383       num_loops = 0;
8384       for (b = 0; b < n_basic_blocks; b++)
8385         {
8386           basic_block header;
8387
8388           /* Search the nodes of the CFG in reverse completion order
8389              so that we can find outer loops first.  */
8390           header = BASIC_BLOCK (rc_order[b]);
8391
8392           /* Look for all the possible latch blocks for this header.  */
8393           for (e = header->pred; e; e = e->pred_next)
8394             {
8395               basic_block latch = e->src;
8396
8397               /* Look for back edges where a predecessor is dominated
8398                  by this block.  A natural loop has a single entry
8399                  node (header) that dominates all the nodes in the
8400                  loop.  It also has single back edge to the header
8401                  from a latch node.  Note that multiple natural loops
8402                  may share the same header.  */
8403               if (latch != ENTRY_BLOCK_PTR
8404                   && TEST_BIT (dom[latch->index], header->index))
8405                 {
8406                   struct loop *loop;
8407
8408                   loop = loops->array + num_loops;
8409
8410                   loop->header = header;
8411                   loop->latch = latch;
8412                   loop->num = num_loops;
8413
8414                   num_loops++;
8415                 }
8416             }
8417         }
8418
8419       for (i = 0; i < num_loops; i++)
8420         {
8421           struct loop *loop = &loops->array[i];
8422
8423           /* Keep track of blocks that are loop headers so
8424              that we can tell which loops should be merged.  */
8425           if (TEST_BIT (headers, loop->header->index))
8426             SET_BIT (loops->shared_headers, loop->header->index);
8427           SET_BIT (headers, loop->header->index);
8428
8429           /* Find nodes contained within the loop.  */
8430           loop->nodes = sbitmap_alloc (n_basic_blocks);
8431           loop->num_nodes
8432             = flow_loop_nodes_find (loop->header, loop->latch, loop->nodes);
8433
8434           /* Compute first and last blocks within the loop.
8435              These are often the same as the loop header and
8436              loop latch respectively, but this is not always
8437              the case.  */
8438           loop->first
8439             = BASIC_BLOCK (sbitmap_first_set_bit (loop->nodes));
8440           loop->last
8441             = BASIC_BLOCK (sbitmap_last_set_bit (loop->nodes));
8442
8443           flow_loop_scan (loops, loop, flags);
8444         }
8445
8446       /* Natural loops with shared headers may either be disjoint or
8447          nested.  Disjoint loops with shared headers cannot be inner
8448          loops and should be merged.  For now just mark loops that share
8449          headers.  */
8450       for (i = 0; i < num_loops; i++)
8451         if (TEST_BIT (loops->shared_headers, loops->array[i].header->index))
8452           loops->array[i].shared = 1;
8453
8454       sbitmap_free (headers);
8455     }
8456
8457   loops->num = num_loops;
8458
8459   /* Build the loop hierarchy tree.  */
8460   flow_loops_tree_build (loops);
8461
8462   /* Assign the loop nesting depth and enclosed loop level for each
8463      loop.  */
8464   loops->levels = flow_loops_level_compute (loops);
8465
8466   return num_loops;
8467 }
8468
8469
8470 /* Update the information regarding the loops in the CFG
8471    specified by LOOPS.  */
8472 int
8473 flow_loops_update (loops, flags)
8474      struct loops *loops;
8475      int flags;
8476 {
8477   /* One day we may want to update the current loop data.  For now
8478      throw away the old stuff and rebuild what we need.  */
8479   if (loops->array)
8480     flow_loops_free (loops);
8481
8482   return flow_loops_find (loops, flags);
8483 }
8484
8485
8486 /* Return non-zero if edge E enters header of LOOP from outside of LOOP.  */
8487
8488 int
8489 flow_loop_outside_edge_p (loop, e)
8490      const struct loop *loop;
8491      edge e;
8492 {
8493   if (e->dest != loop->header)
8494     abort ();
8495   return (e->src == ENTRY_BLOCK_PTR)
8496     || ! TEST_BIT (loop->nodes, e->src->index);
8497 }
8498
8499 /* Clear LOG_LINKS fields of insns in a chain.
8500    Also clear the global_live_at_{start,end} fields of the basic block
8501    structures.  */
8502
8503 void
8504 clear_log_links (insns)
8505      rtx insns;
8506 {
8507   rtx i;
8508   int b;
8509
8510   for (i = insns; i; i = NEXT_INSN (i))
8511     if (INSN_P (i))
8512       LOG_LINKS (i) = 0;
8513
8514   for (b = 0; b < n_basic_blocks; b++)
8515     {
8516       basic_block bb = BASIC_BLOCK (b);
8517
8518       bb->global_live_at_start = NULL;
8519       bb->global_live_at_end = NULL;
8520     }
8521
8522   ENTRY_BLOCK_PTR->global_live_at_end = NULL;
8523   EXIT_BLOCK_PTR->global_live_at_start = NULL;
8524 }
8525
8526 /* Given a register bitmap, turn on the bits in a HARD_REG_SET that
8527    correspond to the hard registers, if any, set in that map.  This
8528    could be done far more efficiently by having all sorts of special-cases
8529    with moving single words, but probably isn't worth the trouble.  */
8530
8531 void
8532 reg_set_to_hard_reg_set (to, from)
8533      HARD_REG_SET *to;
8534      bitmap from;
8535 {
8536   int i;
8537
8538   EXECUTE_IF_SET_IN_BITMAP
8539     (from, 0, i,
8540      {
8541        if (i >= FIRST_PSEUDO_REGISTER)
8542          return;
8543        SET_HARD_REG_BIT (*to, i);
8544      });
8545 }
8546
8547 /* Called once at intialization time.  */
8548
8549 void
8550 init_flow ()
8551 {
8552   static int initialized;
8553
8554   if (!initialized)
8555     {
8556       gcc_obstack_init (&flow_obstack);
8557       flow_firstobj = (char *) obstack_alloc (&flow_obstack, 0);
8558       initialized = 1;
8559     }
8560   else
8561     {
8562       obstack_free (&flow_obstack, flow_firstobj);
8563       flow_firstobj = (char *) obstack_alloc (&flow_obstack, 0);
8564     }
8565 }