OSDN Git Service

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