OSDN Git Service

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