OSDN Git Service

* flow.c (notice_stack_pointer_modification_1): Notice midifications
[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)) == PRE_MODIFY
3163               || GET_CODE (XEXP (x, 0)) == POST_MODIFY
3164               || GET_CODE (XEXP (x, 0)) == POST_DEC
3165               || GET_CODE (XEXP (x, 0)) == POST_INC)
3166           && XEXP (XEXP (x, 0), 0) == stack_pointer_rtx))
3167     current_function_sp_is_unchanging = 0;
3168 }
3169
3170 static void
3171 notice_stack_pointer_modification (f)
3172      rtx f;
3173 {
3174   rtx insn;
3175
3176   /* Assume that the stack pointer is unchanging if alloca hasn't
3177      been used.  */
3178   current_function_sp_is_unchanging = !current_function_calls_alloca;
3179   if (! current_function_sp_is_unchanging)
3180     return;
3181
3182   for (insn = f; insn; insn = NEXT_INSN (insn))
3183     {
3184       if (INSN_P (insn))
3185         {
3186           /* Check if insn modifies the stack pointer.  */
3187           note_stores (PATTERN (insn), notice_stack_pointer_modification_1,
3188                        NULL);
3189           if (! current_function_sp_is_unchanging)
3190             return;
3191         }
3192     }
3193 }
3194
3195 /* Mark a register in SET.  Hard registers in large modes get all
3196    of their component registers set as well.  */
3197
3198 static void
3199 mark_reg (reg, xset)
3200      rtx reg;
3201      void *xset;
3202 {
3203   regset set = (regset) xset;
3204   int regno = REGNO (reg);
3205
3206   if (GET_MODE (reg) == BLKmode)
3207     abort ();
3208
3209   SET_REGNO_REG_SET (set, regno);
3210   if (regno < FIRST_PSEUDO_REGISTER)
3211     {
3212       int n = HARD_REGNO_NREGS (regno, GET_MODE (reg));
3213       while (--n > 0)
3214         SET_REGNO_REG_SET (set, regno + n);
3215     }
3216 }
3217
3218 /* Mark those regs which are needed at the end of the function as live
3219    at the end of the last basic block.  */
3220
3221 static void
3222 mark_regs_live_at_end (set)
3223      regset set;
3224 {
3225   int i;
3226
3227   /* If exiting needs the right stack value, consider the stack pointer
3228      live at the end of the function.  */
3229   if ((HAVE_epilogue && reload_completed)
3230       || ! EXIT_IGNORE_STACK
3231       || (! FRAME_POINTER_REQUIRED
3232           && ! current_function_calls_alloca
3233           && flag_omit_frame_pointer)
3234       || current_function_sp_is_unchanging)
3235     {
3236       SET_REGNO_REG_SET (set, STACK_POINTER_REGNUM);
3237     }
3238
3239   /* Mark the frame pointer if needed at the end of the function.  If
3240      we end up eliminating it, it will be removed from the live list
3241      of each basic block by reload.  */
3242
3243   if (! reload_completed || frame_pointer_needed)
3244     {
3245       SET_REGNO_REG_SET (set, FRAME_POINTER_REGNUM);
3246 #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
3247       /* If they are different, also mark the hard frame pointer as live.  */
3248       if (! LOCAL_REGNO (HARD_FRAME_POINTER_REGNUM))
3249         SET_REGNO_REG_SET (set, HARD_FRAME_POINTER_REGNUM);
3250 #endif
3251     }
3252
3253 #ifdef PIC_OFFSET_TABLE_REGNUM
3254 #ifndef PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
3255   /* Many architectures have a GP register even without flag_pic.
3256      Assume the pic register is not in use, or will be handled by
3257      other means, if it is not fixed.  */
3258   if (fixed_regs[PIC_OFFSET_TABLE_REGNUM])
3259     SET_REGNO_REG_SET (set, PIC_OFFSET_TABLE_REGNUM);
3260 #endif
3261 #endif
3262
3263   /* Mark all global registers, and all registers used by the epilogue
3264      as being live at the end of the function since they may be
3265      referenced by our caller.  */
3266   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3267     if (global_regs[i] || EPILOGUE_USES (i))
3268       SET_REGNO_REG_SET (set, i);
3269
3270   /* Mark all call-saved registers that we actaully used.  */
3271   if (HAVE_epilogue && reload_completed)
3272     {
3273       for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3274         if (regs_ever_live[i] && ! call_used_regs[i] && ! LOCAL_REGNO (i))
3275           SET_REGNO_REG_SET (set, i);
3276     }
3277
3278   /* Mark function return value.  */
3279   diddle_return_value (mark_reg, set);
3280 }
3281
3282 /* Callback function for for_each_successor_phi.  DATA is a regset.
3283    Sets the SRC_REGNO, the regno of the phi alternative for phi node
3284    INSN, in the regset.  */
3285
3286 static int
3287 set_phi_alternative_reg (insn, dest_regno, src_regno, data)
3288      rtx insn ATTRIBUTE_UNUSED;
3289      int dest_regno ATTRIBUTE_UNUSED;
3290      int src_regno;
3291      void *data;
3292 {
3293   regset live = (regset) data;
3294   SET_REGNO_REG_SET (live, src_regno);
3295   return 0;
3296 }
3297
3298 /* Propagate global life info around the graph of basic blocks.  Begin
3299    considering blocks with their corresponding bit set in BLOCKS_IN.
3300    If BLOCKS_IN is null, consider it the universal set.
3301
3302    BLOCKS_OUT is set for every block that was changed.  */
3303
3304 static void
3305 calculate_global_regs_live (blocks_in, blocks_out, flags)
3306      sbitmap blocks_in, blocks_out;
3307      int flags;
3308 {
3309   basic_block *queue, *qhead, *qtail, *qend;
3310   regset tmp, new_live_at_end;
3311   regset_head tmp_head;
3312   regset_head new_live_at_end_head;
3313   int i;
3314
3315   tmp = INITIALIZE_REG_SET (tmp_head);
3316   new_live_at_end = INITIALIZE_REG_SET (new_live_at_end_head);
3317
3318   /* Create a worklist.  Allocate an extra slot for ENTRY_BLOCK, and one
3319      because the `head == tail' style test for an empty queue doesn't
3320      work with a full queue.  */
3321   queue = (basic_block *) xmalloc ((n_basic_blocks + 2) * sizeof (*queue));
3322   qtail = queue;
3323   qhead = qend = queue + n_basic_blocks + 2;
3324
3325   /* Queue the blocks set in the initial mask.  Do this in reverse block
3326      number order so that we are more likely for the first round to do
3327      useful work.  We use AUX non-null to flag that the block is queued.  */
3328   if (blocks_in)
3329     {
3330       /* Clear out the garbage that might be hanging out in bb->aux.  */
3331       for (i = n_basic_blocks - 1; i >= 0; --i)
3332         BASIC_BLOCK (i)->aux = NULL;
3333
3334       EXECUTE_IF_SET_IN_SBITMAP (blocks_in, 0, i,
3335         {
3336           basic_block bb = BASIC_BLOCK (i);
3337           *--qhead = bb;
3338           bb->aux = bb;
3339         });
3340     }
3341   else
3342     {
3343       for (i = 0; i < n_basic_blocks; ++i)
3344         {
3345           basic_block bb = BASIC_BLOCK (i);
3346           *--qhead = bb;
3347           bb->aux = bb;
3348         }
3349     }
3350
3351   if (blocks_out)
3352     sbitmap_zero (blocks_out);
3353
3354   while (qhead != qtail)
3355     {
3356       int rescan, changed;
3357       basic_block bb;
3358       edge e;
3359
3360       bb = *qhead++;
3361       if (qhead == qend)
3362         qhead = queue;
3363       bb->aux = NULL;
3364
3365       /* Begin by propogating live_at_start from the successor blocks.  */
3366       CLEAR_REG_SET (new_live_at_end);
3367       for (e = bb->succ; e; e = e->succ_next)
3368         {
3369           basic_block sb = e->dest;
3370           IOR_REG_SET (new_live_at_end, sb->global_live_at_start);
3371         }
3372
3373       /* The all-important stack pointer must always be live.  */
3374       SET_REGNO_REG_SET (new_live_at_end, STACK_POINTER_REGNUM);
3375
3376       /* Before reload, there are a few registers that must be forced
3377          live everywhere -- which might not already be the case for 
3378          blocks within infinite loops.  */
3379       if (! reload_completed)
3380         {
3381           /* Any reference to any pseudo before reload is a potential
3382              reference of the frame pointer.  */
3383           SET_REGNO_REG_SET (new_live_at_end, FRAME_POINTER_REGNUM);
3384
3385 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
3386           /* Pseudos with argument area equivalences may require
3387              reloading via the argument pointer.  */
3388           if (fixed_regs[ARG_POINTER_REGNUM])
3389             SET_REGNO_REG_SET (new_live_at_end, ARG_POINTER_REGNUM);
3390 #endif
3391
3392 #ifdef PIC_OFFSET_TABLE_REGNUM
3393           /* Any constant, or pseudo with constant equivalences, may
3394              require reloading from memory using the pic register.  */
3395           if (fixed_regs[PIC_OFFSET_TABLE_REGNUM])
3396             SET_REGNO_REG_SET (new_live_at_end, PIC_OFFSET_TABLE_REGNUM);
3397 #endif
3398         }
3399
3400       /* Regs used in phi nodes are not included in
3401          global_live_at_start, since they are live only along a
3402          particular edge.  Set those regs that are live because of a
3403          phi node alternative corresponding to this particular block.  */
3404       if (in_ssa_form)
3405         for_each_successor_phi (bb, &set_phi_alternative_reg,
3406                                 new_live_at_end);
3407
3408       if (bb == ENTRY_BLOCK_PTR)
3409         {
3410           COPY_REG_SET (bb->global_live_at_end, new_live_at_end);
3411           continue;
3412         }
3413
3414       /* On our first pass through this block, we'll go ahead and continue.
3415          Recognize first pass by local_set NULL.  On subsequent passes, we
3416          get to skip out early if live_at_end wouldn't have changed.  */
3417
3418       if (bb->local_set == NULL)
3419         {
3420           bb->local_set = OBSTACK_ALLOC_REG_SET (&flow_obstack);
3421           bb->cond_local_set = OBSTACK_ALLOC_REG_SET (&flow_obstack);
3422           rescan = 1;
3423         }
3424       else
3425         {
3426           /* If any bits were removed from live_at_end, we'll have to
3427              rescan the block.  This wouldn't be necessary if we had
3428              precalculated local_live, however with PROP_SCAN_DEAD_CODE
3429              local_live is really dependent on live_at_end.  */
3430           CLEAR_REG_SET (tmp);
3431           rescan = bitmap_operation (tmp, bb->global_live_at_end,
3432                                      new_live_at_end, BITMAP_AND_COMPL);
3433
3434           if (! rescan)
3435             {
3436               /* If any of the registers in the new live_at_end set are
3437                  conditionally set in this basic block, we must rescan.
3438                  This is because conditional lifetimes at the end of the
3439                  block do not just take the live_at_end set into account,
3440                  but also the liveness at the start of each successor
3441                  block.  We can miss changes in those sets if we only
3442                  compare the new live_at_end against the previous one.  */
3443               CLEAR_REG_SET (tmp);
3444               rescan = bitmap_operation (tmp, new_live_at_end,
3445                                          bb->cond_local_set, BITMAP_AND);
3446             }
3447
3448           if (! rescan)
3449             {
3450               /* Find the set of changed bits.  Take this opportunity
3451                  to notice that this set is empty and early out.  */
3452               CLEAR_REG_SET (tmp);
3453               changed = bitmap_operation (tmp, bb->global_live_at_end,
3454                                           new_live_at_end, BITMAP_XOR);
3455               if (! changed)
3456                 continue;
3457
3458               /* If any of the changed bits overlap with local_set,
3459                  we'll have to rescan the block.  Detect overlap by
3460                  the AND with ~local_set turning off bits.  */
3461               rescan = bitmap_operation (tmp, tmp, bb->local_set,
3462                                          BITMAP_AND_COMPL);
3463             }
3464         }
3465
3466       /* Let our caller know that BB changed enough to require its
3467          death notes updated.  */
3468       if (blocks_out)
3469         SET_BIT (blocks_out, bb->index);
3470
3471       if (! rescan)
3472         {
3473           /* Add to live_at_start the set of all registers in
3474              new_live_at_end that aren't in the old live_at_end.  */
3475
3476           bitmap_operation (tmp, new_live_at_end, bb->global_live_at_end,
3477                             BITMAP_AND_COMPL);
3478           COPY_REG_SET (bb->global_live_at_end, new_live_at_end);
3479
3480           changed = bitmap_operation (bb->global_live_at_start,
3481                                       bb->global_live_at_start,
3482                                       tmp, BITMAP_IOR);
3483           if (! changed)
3484             continue;
3485         }
3486       else
3487         {
3488           COPY_REG_SET (bb->global_live_at_end, new_live_at_end);
3489
3490           /* Rescan the block insn by insn to turn (a copy of) live_at_end
3491              into live_at_start.  */
3492           propagate_block (bb, new_live_at_end, bb->local_set,
3493                            bb->cond_local_set, flags);
3494
3495           /* If live_at start didn't change, no need to go farther.  */
3496           if (REG_SET_EQUAL_P (bb->global_live_at_start, new_live_at_end))
3497             continue;
3498
3499           COPY_REG_SET (bb->global_live_at_start, new_live_at_end);
3500         }
3501
3502       /* Queue all predecessors of BB so that we may re-examine
3503          their live_at_end.  */
3504       for (e = bb->pred; e; e = e->pred_next)
3505         {
3506           basic_block pb = e->src;
3507           if (pb->aux == NULL)
3508             {
3509               *qtail++ = pb;
3510               if (qtail == qend)
3511                 qtail = queue;
3512               pb->aux = pb;
3513             }
3514         }
3515     }
3516
3517   FREE_REG_SET (tmp);
3518   FREE_REG_SET (new_live_at_end);
3519
3520   if (blocks_out)
3521     {
3522       EXECUTE_IF_SET_IN_SBITMAP (blocks_out, 0, i,
3523         {
3524           basic_block bb = BASIC_BLOCK (i);
3525           FREE_REG_SET (bb->local_set);
3526           FREE_REG_SET (bb->cond_local_set);
3527         });
3528     }
3529   else
3530     {
3531       for (i = n_basic_blocks - 1; i >= 0; --i)
3532         {
3533           basic_block bb = BASIC_BLOCK (i);
3534           FREE_REG_SET (bb->local_set);
3535           FREE_REG_SET (bb->cond_local_set);
3536         }
3537     }
3538
3539   free (queue);
3540 }
3541 \f
3542 /* Subroutines of life analysis.  */
3543
3544 /* Allocate the permanent data structures that represent the results
3545    of life analysis.  Not static since used also for stupid life analysis.  */
3546
3547 static void
3548 allocate_bb_life_data ()
3549 {
3550   register int i;
3551
3552   for (i = 0; i < n_basic_blocks; i++)
3553     {
3554       basic_block bb = BASIC_BLOCK (i);
3555
3556       bb->global_live_at_start = OBSTACK_ALLOC_REG_SET (&flow_obstack);
3557       bb->global_live_at_end = OBSTACK_ALLOC_REG_SET (&flow_obstack);
3558     }
3559
3560   ENTRY_BLOCK_PTR->global_live_at_end
3561     = OBSTACK_ALLOC_REG_SET (&flow_obstack);
3562   EXIT_BLOCK_PTR->global_live_at_start
3563     = OBSTACK_ALLOC_REG_SET (&flow_obstack);
3564
3565   regs_live_at_setjmp = OBSTACK_ALLOC_REG_SET (&flow_obstack);
3566 }
3567
3568 void
3569 allocate_reg_life_data ()
3570 {
3571   int i;
3572
3573   max_regno = max_reg_num ();
3574
3575   /* Recalculate the register space, in case it has grown.  Old style
3576      vector oriented regsets would set regset_{size,bytes} here also.  */
3577   allocate_reg_info (max_regno, FALSE, FALSE);
3578
3579   /* Reset all the data we'll collect in propagate_block and its
3580      subroutines.  */
3581   for (i = 0; i < max_regno; i++)
3582     {
3583       REG_N_SETS (i) = 0;
3584       REG_N_REFS (i) = 0;
3585       REG_N_DEATHS (i) = 0;
3586       REG_N_CALLS_CROSSED (i) = 0;
3587       REG_LIVE_LENGTH (i) = 0;
3588       REG_BASIC_BLOCK (i) = REG_BLOCK_UNKNOWN;
3589     }
3590 }
3591
3592 /* Delete dead instructions for propagate_block.  */
3593
3594 static void
3595 propagate_block_delete_insn (bb, insn)
3596      basic_block bb;
3597      rtx insn;
3598 {
3599   rtx inote = find_reg_note (insn, REG_LABEL, NULL_RTX);
3600
3601   /* If the insn referred to a label, and that label was attached to
3602      an ADDR_VEC, it's safe to delete the ADDR_VEC.  In fact, it's
3603      pretty much mandatory to delete it, because the ADDR_VEC may be
3604      referencing labels that no longer exist.  */
3605
3606   if (inote)
3607     {
3608       rtx label = XEXP (inote, 0);
3609       rtx next;
3610
3611       if (LABEL_NUSES (label) == 1
3612           && (next = next_nonnote_insn (label)) != NULL
3613           && GET_CODE (next) == JUMP_INSN
3614           && (GET_CODE (PATTERN (next)) == ADDR_VEC
3615               || GET_CODE (PATTERN (next)) == ADDR_DIFF_VEC))
3616         {
3617           rtx pat = PATTERN (next);
3618           int diff_vec_p = GET_CODE (pat) == ADDR_DIFF_VEC;
3619           int len = XVECLEN (pat, diff_vec_p);
3620           int i;
3621
3622           for (i = 0; i < len; i++)
3623             LABEL_NUSES (XEXP (XVECEXP (pat, diff_vec_p, i), 0))--;
3624
3625           flow_delete_insn (next);
3626         }
3627     }
3628
3629   if (bb->end == insn)
3630     bb->end = PREV_INSN (insn);
3631   flow_delete_insn (insn);
3632 }
3633
3634 /* Delete dead libcalls for propagate_block.  Return the insn
3635    before the libcall.  */
3636
3637 static rtx
3638 propagate_block_delete_libcall (bb, insn, note)
3639      basic_block bb;
3640      rtx insn, note;
3641 {
3642   rtx first = XEXP (note, 0);
3643   rtx before = PREV_INSN (first);
3644
3645   if (insn == bb->end)
3646     bb->end = before;
3647
3648   flow_delete_insn_chain (first, insn);
3649   return before;
3650 }
3651
3652 /* Update the life-status of regs for one insn.  Return the previous insn.  */
3653
3654 rtx
3655 propagate_one_insn (pbi, insn)
3656      struct propagate_block_info *pbi;
3657      rtx insn;
3658 {
3659   rtx prev = PREV_INSN (insn);
3660   int flags = pbi->flags;
3661   int insn_is_dead = 0;
3662   int libcall_is_dead = 0;
3663   rtx note;
3664   int i;
3665
3666   if (! INSN_P (insn))
3667     return prev;
3668
3669   note = find_reg_note (insn, REG_RETVAL, NULL_RTX);
3670   if (flags & PROP_SCAN_DEAD_CODE)
3671     {
3672       insn_is_dead = insn_dead_p (pbi, PATTERN (insn), 0,
3673                                   REG_NOTES (insn));
3674       libcall_is_dead = (insn_is_dead && note != 0
3675                          && libcall_dead_p (pbi, note, insn));
3676     }
3677
3678   /* We almost certainly don't want to delete prologue or epilogue
3679      instructions.  Warn about probable compiler losage.  */
3680   if (insn_is_dead
3681       && reload_completed
3682       && (((HAVE_epilogue || HAVE_prologue)
3683            && prologue_epilogue_contains (insn))
3684           || (HAVE_sibcall_epilogue
3685               && sibcall_epilogue_contains (insn)))
3686       && find_reg_note (insn, REG_MAYBE_DEAD, NULL_RTX) == 0)
3687     {
3688       if (flags & PROP_KILL_DEAD_CODE)
3689         {
3690           warning ("ICE: would have deleted prologue/epilogue insn");
3691           if (!inhibit_warnings)
3692             debug_rtx (insn);
3693         }
3694       libcall_is_dead = insn_is_dead = 0;
3695     }
3696
3697   /* If an instruction consists of just dead store(s) on final pass,
3698      delete it.  */
3699   if ((flags & PROP_KILL_DEAD_CODE) && insn_is_dead)
3700     {
3701       /* Record sets.  Do this even for dead instructions, since they
3702          would have killed the values if they hadn't been deleted.  */
3703       mark_set_regs (pbi, PATTERN (insn), insn);
3704
3705       /* CC0 is now known to be dead.  Either this insn used it,
3706          in which case it doesn't anymore, or clobbered it,
3707          so the next insn can't use it.  */
3708       pbi->cc0_live = 0;
3709
3710       if (libcall_is_dead)
3711         {
3712           prev = propagate_block_delete_libcall (pbi->bb, insn, note);
3713           insn = NEXT_INSN (prev);
3714         }
3715       else
3716         propagate_block_delete_insn (pbi->bb, insn);
3717
3718       return prev;
3719     }
3720
3721   /* See if this is an increment or decrement that can be merged into
3722      a following memory address.  */
3723 #ifdef AUTO_INC_DEC
3724   {
3725     register rtx x = single_set (insn);
3726
3727     /* Does this instruction increment or decrement a register?  */
3728     if ((flags & PROP_AUTOINC)
3729         && x != 0
3730         && GET_CODE (SET_DEST (x)) == REG
3731         && (GET_CODE (SET_SRC (x)) == PLUS
3732             || GET_CODE (SET_SRC (x)) == MINUS)
3733         && XEXP (SET_SRC (x), 0) == SET_DEST (x)
3734         && GET_CODE (XEXP (SET_SRC (x), 1)) == CONST_INT
3735         /* Ok, look for a following memory ref we can combine with.
3736            If one is found, change the memory ref to a PRE_INC
3737            or PRE_DEC, cancel this insn, and return 1.
3738            Return 0 if nothing has been done.  */
3739         && try_pre_increment_1 (pbi, insn))
3740       return prev;
3741   }
3742 #endif /* AUTO_INC_DEC */
3743
3744   CLEAR_REG_SET (pbi->new_set);
3745
3746   /* If this is not the final pass, and this insn is copying the value of
3747      a library call and it's dead, don't scan the insns that perform the
3748      library call, so that the call's arguments are not marked live.  */
3749   if (libcall_is_dead)
3750     {
3751       /* Record the death of the dest reg.  */
3752       mark_set_regs (pbi, PATTERN (insn), insn);
3753
3754       insn = XEXP (note, 0);
3755       return PREV_INSN (insn);
3756     }
3757   else if (GET_CODE (PATTERN (insn)) == SET
3758            && SET_DEST (PATTERN (insn)) == stack_pointer_rtx
3759            && GET_CODE (SET_SRC (PATTERN (insn))) == PLUS
3760            && XEXP (SET_SRC (PATTERN (insn)), 0) == stack_pointer_rtx
3761            && GET_CODE (XEXP (SET_SRC (PATTERN (insn)), 1)) == CONST_INT)
3762     /* We have an insn to pop a constant amount off the stack.
3763        (Such insns use PLUS regardless of the direction of the stack,
3764        and any insn to adjust the stack by a constant is always a pop.)
3765        These insns, if not dead stores, have no effect on life.  */
3766     ;
3767   else
3768     {
3769       /* Any regs live at the time of a call instruction must not go
3770          in a register clobbered by calls.  Find all regs now live and
3771          record this for them.  */
3772
3773       if (GET_CODE (insn) == CALL_INSN && (flags & PROP_REG_INFO))
3774         EXECUTE_IF_SET_IN_REG_SET (pbi->reg_live, 0, i,
3775                                    { REG_N_CALLS_CROSSED (i)++; });
3776
3777       /* Record sets.  Do this even for dead instructions, since they
3778          would have killed the values if they hadn't been deleted.  */
3779       mark_set_regs (pbi, PATTERN (insn), insn);
3780
3781       if (GET_CODE (insn) == CALL_INSN)
3782         {
3783           register int i;
3784           rtx note, cond;
3785
3786           cond = NULL_RTX;
3787           if (GET_CODE (PATTERN (insn)) == COND_EXEC)
3788             cond = COND_EXEC_TEST (PATTERN (insn));
3789
3790           /* Non-constant calls clobber memory.  */
3791           if (! CONST_CALL_P (insn))
3792             free_EXPR_LIST_list (&pbi->mem_set_list);
3793
3794           /* There may be extra registers to be clobbered.  */
3795           for (note = CALL_INSN_FUNCTION_USAGE (insn);
3796                note;
3797                note = XEXP (note, 1))
3798             if (GET_CODE (XEXP (note, 0)) == CLOBBER)
3799               mark_set_1 (pbi, CLOBBER, XEXP (XEXP (note, 0), 0),
3800                           cond, insn, pbi->flags);
3801
3802           /* Calls change all call-used and global registers.  */
3803           for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3804             if (call_used_regs[i] && ! global_regs[i]
3805                 && ! fixed_regs[i])
3806               {
3807                 /* We do not want REG_UNUSED notes for these registers.  */
3808                 mark_set_1 (pbi, CLOBBER, gen_rtx_REG (reg_raw_mode[i], i),
3809                             cond, insn,
3810                             pbi->flags & ~(PROP_DEATH_NOTES | PROP_REG_INFO));
3811               }
3812         }
3813
3814       /* If an insn doesn't use CC0, it becomes dead since we assume
3815          that every insn clobbers it.  So show it dead here;
3816          mark_used_regs will set it live if it is referenced.  */
3817       pbi->cc0_live = 0;
3818
3819       /* Record uses.  */
3820       if (! insn_is_dead)
3821         mark_used_regs (pbi, PATTERN (insn), NULL_RTX, insn);
3822
3823       /* Sometimes we may have inserted something before INSN (such as a move)
3824          when we make an auto-inc.  So ensure we will scan those insns.  */
3825 #ifdef AUTO_INC_DEC
3826       prev = PREV_INSN (insn);
3827 #endif
3828
3829       if (! insn_is_dead && GET_CODE (insn) == CALL_INSN)
3830         {
3831           register int i;
3832           rtx note, cond;
3833
3834           cond = NULL_RTX;
3835           if (GET_CODE (PATTERN (insn)) == COND_EXEC)
3836             cond = COND_EXEC_TEST (PATTERN (insn));
3837
3838           /* Calls use their arguments.  */
3839           for (note = CALL_INSN_FUNCTION_USAGE (insn);
3840                note;
3841                note = XEXP (note, 1))
3842             if (GET_CODE (XEXP (note, 0)) == USE)
3843               mark_used_regs (pbi, XEXP (XEXP (note, 0), 0),
3844                               cond, insn);
3845
3846           /* The stack ptr is used (honorarily) by a CALL insn.  */
3847           SET_REGNO_REG_SET (pbi->reg_live, STACK_POINTER_REGNUM);
3848
3849           /* Calls may also reference any of the global registers,
3850              so they are made live.  */
3851           for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3852             if (global_regs[i])
3853               mark_used_reg (pbi, gen_rtx_REG (reg_raw_mode[i], i),
3854                              cond, insn);
3855         }
3856     }
3857
3858   /* On final pass, update counts of how many insns in which each reg
3859      is live.  */
3860   if (flags & PROP_REG_INFO)
3861     EXECUTE_IF_SET_IN_REG_SET (pbi->reg_live, 0, i,
3862                                { REG_LIVE_LENGTH (i)++; });
3863
3864   return prev;
3865 }
3866
3867 /* Initialize a propagate_block_info struct for public consumption.
3868    Note that the structure itself is opaque to this file, but that
3869    the user can use the regsets provided here.  */
3870
3871 struct propagate_block_info *
3872 init_propagate_block_info (bb, live, local_set, cond_local_set, flags)
3873      basic_block bb;
3874      regset live, local_set, cond_local_set;
3875      int flags;
3876 {
3877   struct propagate_block_info *pbi = xmalloc (sizeof (*pbi));
3878
3879   pbi->bb = bb;
3880   pbi->reg_live = live;
3881   pbi->mem_set_list = NULL_RTX;
3882   pbi->local_set = local_set;
3883   pbi->cond_local_set = cond_local_set;
3884   pbi->cc0_live = 0;
3885   pbi->flags = flags;
3886
3887   if (flags & (PROP_LOG_LINKS | PROP_AUTOINC))
3888     pbi->reg_next_use = (rtx *) xcalloc (max_reg_num (), sizeof (rtx));
3889   else
3890     pbi->reg_next_use = NULL;
3891
3892   pbi->new_set = BITMAP_XMALLOC ();
3893
3894 #ifdef HAVE_conditional_execution
3895   pbi->reg_cond_dead = splay_tree_new (splay_tree_compare_ints, NULL,
3896                                        free_reg_cond_life_info);
3897   pbi->reg_cond_reg = BITMAP_XMALLOC ();
3898
3899   /* If this block ends in a conditional branch, for each register live
3900      from one side of the branch and not the other, record the register
3901      as conditionally dead.  */
3902   if ((flags & (PROP_DEATH_NOTES | PROP_SCAN_DEAD_CODE))
3903       && GET_CODE (bb->end) == JUMP_INSN
3904       && any_condjump_p (bb->end))
3905     {
3906       regset_head diff_head;
3907       regset diff = INITIALIZE_REG_SET (diff_head);
3908       basic_block bb_true, bb_false;
3909       rtx cond_true, cond_false, set_src;
3910       int i;
3911
3912       /* Identify the successor blocks.  */
3913       bb_true = bb->succ->dest;
3914       if (bb->succ->succ_next != NULL)
3915         {
3916           bb_false = bb->succ->succ_next->dest;
3917
3918           if (bb->succ->flags & EDGE_FALLTHRU)
3919             {
3920               basic_block t = bb_false;
3921               bb_false = bb_true;
3922               bb_true = t;
3923             }
3924           else if (! (bb->succ->succ_next->flags & EDGE_FALLTHRU))
3925             abort ();
3926         }
3927       else
3928         {
3929           /* This can happen with a conditional jump to the next insn.  */
3930           if (JUMP_LABEL (bb->end) != bb_true->head)
3931             abort ();
3932
3933           /* Simplest way to do nothing.  */
3934           bb_false = bb_true;
3935         }
3936
3937       /* Extract the condition from the branch.  */
3938       set_src = SET_SRC (pc_set (bb->end));
3939       cond_true = XEXP (set_src, 0);
3940       cond_false = gen_rtx_fmt_ee (reverse_condition (GET_CODE (cond_true)),
3941                                    GET_MODE (cond_true), XEXP (cond_true, 0),
3942                                    XEXP (cond_true, 1));
3943       if (GET_CODE (XEXP (set_src, 1)) == PC)
3944         {
3945           rtx t = cond_false;
3946           cond_false = cond_true;
3947           cond_true = t;
3948         }
3949
3950       /* Compute which register lead different lives in the successors.  */
3951       if (bitmap_operation (diff, bb_true->global_live_at_start,
3952                             bb_false->global_live_at_start, BITMAP_XOR))
3953         {
3954           rtx reg = XEXP (cond_true, 0);
3955
3956           if (GET_CODE (reg) == SUBREG)
3957             reg = SUBREG_REG (reg);
3958
3959           if (GET_CODE (reg) != REG)
3960             abort ();
3961
3962           SET_REGNO_REG_SET (pbi->reg_cond_reg, REGNO (reg));
3963
3964           /* For each such register, mark it conditionally dead.  */
3965           EXECUTE_IF_SET_IN_REG_SET
3966             (diff, 0, i,
3967              {
3968                struct reg_cond_life_info *rcli;
3969                rtx cond;
3970
3971                rcli = (struct reg_cond_life_info *) xmalloc (sizeof (*rcli));
3972
3973                if (REGNO_REG_SET_P (bb_true->global_live_at_start, i))
3974                  cond = cond_false;
3975                else
3976                  cond = cond_true;
3977                rcli->condition = alloc_EXPR_LIST (0, cond, NULL_RTX);
3978
3979                splay_tree_insert (pbi->reg_cond_dead, i,
3980                                   (splay_tree_value) rcli);
3981              });
3982         }
3983
3984       FREE_REG_SET (diff);
3985     }
3986 #endif
3987
3988   /* If this block has no successors, any stores to the frame that aren't
3989      used later in the block are dead.  So make a pass over the block
3990      recording any such that are made and show them dead at the end.  We do
3991      a very conservative and simple job here.  */
3992   if (optimize
3993       && ! (TREE_CODE (TREE_TYPE (current_function_decl)) == FUNCTION_TYPE
3994             && (TYPE_RETURNS_STACK_DEPRESSED
3995                 (TREE_TYPE (current_function_decl))))
3996       && (flags & PROP_SCAN_DEAD_CODE)
3997       && (bb->succ == NULL
3998           || (bb->succ->succ_next == NULL
3999               && bb->succ->dest == EXIT_BLOCK_PTR)))
4000     {
4001       rtx insn;
4002       for (insn = bb->end; insn != bb->head; insn = PREV_INSN (insn))
4003         if (GET_CODE (insn) == INSN
4004             && GET_CODE (PATTERN (insn)) == SET
4005             && GET_CODE (SET_DEST (PATTERN (insn))) == MEM)
4006           {
4007             rtx mem = SET_DEST (PATTERN (insn));
4008
4009             if (XEXP (mem, 0) == frame_pointer_rtx
4010                 || (GET_CODE (XEXP (mem, 0)) == PLUS
4011                     && XEXP (XEXP (mem, 0), 0) == frame_pointer_rtx
4012                     && GET_CODE (XEXP (XEXP (mem, 0), 1)) == CONST_INT))
4013               {
4014 #ifdef AUTO_INC_DEC
4015                 /* Store a copy of mem, otherwise the address may be scrogged
4016                    by find_auto_inc.  This matters because insn_dead_p uses
4017                    an rtx_equal_p check to determine if two addresses are
4018                    the same.  This works before find_auto_inc, but fails
4019                    after find_auto_inc, causing discrepencies between the
4020                    set of live registers calculated during the
4021                    calculate_global_regs_live phase and what actually exists
4022                    after flow completes, leading to aborts.  */
4023                 if (flags & PROP_AUTOINC)
4024                   mem = shallow_copy_rtx (mem);
4025 #endif
4026                 pbi->mem_set_list = alloc_EXPR_LIST (0, mem, pbi->mem_set_list);
4027               }
4028           }
4029     }
4030
4031   return pbi;
4032 }
4033
4034 /* Release a propagate_block_info struct.  */
4035
4036 void
4037 free_propagate_block_info (pbi)
4038      struct propagate_block_info *pbi;
4039 {
4040   free_EXPR_LIST_list (&pbi->mem_set_list);
4041
4042   BITMAP_XFREE (pbi->new_set);
4043
4044 #ifdef HAVE_conditional_execution
4045   splay_tree_delete (pbi->reg_cond_dead);
4046   BITMAP_XFREE (pbi->reg_cond_reg);
4047 #endif
4048
4049   if (pbi->reg_next_use)
4050     free (pbi->reg_next_use);
4051
4052   free (pbi);
4053 }
4054
4055 /* Compute the registers live at the beginning of a basic block BB from
4056    those live at the end.
4057
4058    When called, REG_LIVE contains those live at the end.  On return, it
4059    contains those live at the beginning.
4060
4061    LOCAL_SET, if non-null, will be set with all registers killed
4062    unconditionally by this basic block.
4063    Likewise, COND_LOCAL_SET, if non-null, will be set with all registers
4064    killed conditionally by this basic block.  If there is any unconditional
4065    set of a register, then the corresponding bit will be set in LOCAL_SET
4066    and cleared in COND_LOCAL_SET.
4067    It is valid for LOCAL_SET and COND_LOCAL_SET to be the same set.  In this
4068    case, the resulting set will be equal to the union of the two sets that
4069    would otherwise be computed.  */
4070
4071 void
4072 propagate_block (bb, live, local_set, cond_local_set, flags)
4073      basic_block bb;
4074      regset live;
4075      regset local_set;
4076      regset cond_local_set;
4077      int flags;
4078 {
4079   struct propagate_block_info *pbi;
4080   rtx insn, prev;
4081
4082   pbi = init_propagate_block_info (bb, live, local_set, cond_local_set, flags);
4083
4084   if (flags & PROP_REG_INFO)
4085     {
4086       register int i;
4087
4088       /* Process the regs live at the end of the block.
4089          Mark them as not local to any one basic block.  */
4090       EXECUTE_IF_SET_IN_REG_SET (live, 0, i,
4091                                  { REG_BASIC_BLOCK (i) = REG_BLOCK_GLOBAL; });
4092     }
4093
4094   /* Scan the block an insn at a time from end to beginning.  */
4095
4096   for (insn = bb->end;; insn = prev)
4097     {
4098       /* If this is a call to `setjmp' et al, warn if any
4099          non-volatile datum is live.  */
4100       if ((flags & PROP_REG_INFO)
4101           && GET_CODE (insn) == NOTE
4102           && NOTE_LINE_NUMBER (insn) == NOTE_INSN_SETJMP)
4103         IOR_REG_SET (regs_live_at_setjmp, pbi->reg_live);
4104
4105       prev = propagate_one_insn (pbi, insn);
4106
4107       if (insn == bb->head)
4108         break;
4109     }
4110
4111   free_propagate_block_info (pbi);
4112 }
4113 \f
4114 /* Return 1 if X (the body of an insn, or part of it) is just dead stores
4115    (SET expressions whose destinations are registers dead after the insn).
4116    NEEDED is the regset that says which regs are alive after the insn.
4117
4118    Unless CALL_OK is non-zero, an insn is needed if it contains a CALL.
4119
4120    If X is the entire body of an insn, NOTES contains the reg notes
4121    pertaining to the insn.  */
4122
4123 static int
4124 insn_dead_p (pbi, x, call_ok, notes)
4125      struct propagate_block_info *pbi;
4126      rtx x;
4127      int call_ok;
4128      rtx notes ATTRIBUTE_UNUSED;
4129 {
4130   enum rtx_code code = GET_CODE (x);
4131
4132 #ifdef AUTO_INC_DEC
4133   /* If flow is invoked after reload, we must take existing AUTO_INC
4134      expresions into account.  */
4135   if (reload_completed)
4136     {
4137       for (; notes; notes = XEXP (notes, 1))
4138         {
4139           if (REG_NOTE_KIND (notes) == REG_INC)
4140             {
4141               int regno = REGNO (XEXP (notes, 0));
4142
4143               /* Don't delete insns to set global regs.  */
4144               if ((regno < FIRST_PSEUDO_REGISTER && global_regs[regno])
4145                   || REGNO_REG_SET_P (pbi->reg_live, regno))
4146                 return 0;
4147             }
4148         }
4149     }
4150 #endif
4151
4152   /* If setting something that's a reg or part of one,
4153      see if that register's altered value will be live.  */
4154
4155   if (code == SET)
4156     {
4157       rtx r = SET_DEST (x);
4158
4159 #ifdef HAVE_cc0
4160       if (GET_CODE (r) == CC0)
4161         return ! pbi->cc0_live;
4162 #endif
4163
4164       /* A SET that is a subroutine call cannot be dead.  */
4165       if (GET_CODE (SET_SRC (x)) == CALL)
4166         {
4167           if (! call_ok)
4168             return 0;
4169         }
4170
4171       /* Don't eliminate loads from volatile memory or volatile asms.  */
4172       else if (volatile_refs_p (SET_SRC (x)))
4173         return 0;
4174
4175       if (GET_CODE (r) == MEM)
4176         {
4177           rtx temp;
4178
4179           if (MEM_VOLATILE_P (r))
4180             return 0;
4181
4182           /* Walk the set of memory locations we are currently tracking
4183              and see if one is an identical match to this memory location.
4184              If so, this memory write is dead (remember, we're walking
4185              backwards from the end of the block to the start).  */
4186           temp = pbi->mem_set_list;
4187           while (temp)
4188             {
4189               rtx mem = XEXP (temp, 0);
4190
4191               if (rtx_equal_p (mem, r))
4192                 return 1;
4193 #ifdef AUTO_INC_DEC
4194               /* Check if memory reference matches an auto increment. Only
4195                  post increment/decrement or modify are valid.  */
4196               if (GET_MODE (mem) == GET_MODE (r)
4197                   && (GET_CODE (XEXP (mem, 0)) == POST_DEC
4198                       || GET_CODE (XEXP (mem, 0)) == POST_INC
4199                       || GET_CODE (XEXP (mem, 0)) == POST_MODIFY)
4200                   && GET_MODE (XEXP (mem, 0)) == GET_MODE (r)
4201                   && rtx_equal_p (XEXP (XEXP (mem, 0), 0), XEXP (r, 0)))
4202                 return 1;
4203 #endif
4204               temp = XEXP (temp, 1);
4205             }
4206         }
4207       else
4208         {
4209           while (GET_CODE (r) == SUBREG
4210                  || GET_CODE (r) == STRICT_LOW_PART
4211                  || GET_CODE (r) == ZERO_EXTRACT)
4212             r = XEXP (r, 0);
4213
4214           if (GET_CODE (r) == REG)
4215             {
4216               int regno = REGNO (r);
4217
4218               /* Obvious.  */
4219               if (REGNO_REG_SET_P (pbi->reg_live, regno))
4220                 return 0;
4221
4222               /* If this is a hard register, verify that subsequent
4223                  words are not needed.  */
4224               if (regno < FIRST_PSEUDO_REGISTER)
4225                 {
4226                   int n = HARD_REGNO_NREGS (regno, GET_MODE (r));
4227
4228                   while (--n > 0)
4229                     if (REGNO_REG_SET_P (pbi->reg_live, regno+n))
4230                       return 0;
4231                 }
4232
4233               /* Don't delete insns to set global regs.  */
4234               if (regno < FIRST_PSEUDO_REGISTER && global_regs[regno])
4235                 return 0;
4236
4237               /* Make sure insns to set the stack pointer aren't deleted.  */
4238               if (regno == STACK_POINTER_REGNUM)
4239                 return 0;
4240
4241               /* ??? These bits might be redundant with the force live bits
4242                  in calculate_global_regs_live.  We would delete from
4243                  sequential sets; whether this actually affects real code
4244                  for anything but the stack pointer I don't know.  */
4245               /* Make sure insns to set the frame pointer aren't deleted.  */
4246               if (regno == FRAME_POINTER_REGNUM
4247                   && (! reload_completed || frame_pointer_needed))
4248                 return 0;
4249 #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
4250               if (regno == HARD_FRAME_POINTER_REGNUM
4251                   && (! reload_completed || frame_pointer_needed))
4252                 return 0;
4253 #endif
4254
4255 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
4256               /* Make sure insns to set arg pointer are never deleted
4257                  (if the arg pointer isn't fixed, there will be a USE
4258                  for it, so we can treat it normally).  */
4259               if (regno == ARG_POINTER_REGNUM && fixed_regs[regno])
4260                 return 0;
4261 #endif
4262
4263               /* Otherwise, the set is dead.  */
4264               return 1;
4265             }
4266         }
4267     }
4268
4269   /* If performing several activities, insn is dead if each activity
4270      is individually dead.  Also, CLOBBERs and USEs can be ignored; a
4271      CLOBBER or USE that's inside a PARALLEL doesn't make the insn
4272      worth keeping.  */
4273   else if (code == PARALLEL)
4274     {
4275       int i = XVECLEN (x, 0);
4276
4277       for (i--; i >= 0; i--)
4278         if (GET_CODE (XVECEXP (x, 0, i)) != CLOBBER
4279             && GET_CODE (XVECEXP (x, 0, i)) != USE
4280             && ! insn_dead_p (pbi, XVECEXP (x, 0, i), call_ok, NULL_RTX))
4281           return 0;
4282
4283       return 1;
4284     }
4285
4286   /* A CLOBBER of a pseudo-register that is dead serves no purpose.  That
4287      is not necessarily true for hard registers.  */
4288   else if (code == CLOBBER && GET_CODE (XEXP (x, 0)) == REG
4289            && REGNO (XEXP (x, 0)) >= FIRST_PSEUDO_REGISTER
4290            && ! REGNO_REG_SET_P (pbi->reg_live, REGNO (XEXP (x, 0))))
4291     return 1;
4292
4293   /* We do not check other CLOBBER or USE here.  An insn consisting of just
4294      a CLOBBER or just a USE should not be deleted.  */
4295   return 0;
4296 }
4297
4298 /* If INSN is the last insn in a libcall, and assuming INSN is dead,
4299    return 1 if the entire library call is dead.
4300    This is true if INSN copies a register (hard or pseudo)
4301    and if the hard return reg of the call insn is dead.
4302    (The caller should have tested the destination of the SET inside
4303    INSN already for death.)
4304
4305    If this insn doesn't just copy a register, then we don't
4306    have an ordinary libcall.  In that case, cse could not have
4307    managed to substitute the source for the dest later on,
4308    so we can assume the libcall is dead.
4309
4310    PBI is the block info giving pseudoregs live before this insn.
4311    NOTE is the REG_RETVAL note of the insn.  */
4312
4313 static int
4314 libcall_dead_p (pbi, note, insn)
4315      struct propagate_block_info *pbi;
4316      rtx note;
4317      rtx insn;
4318 {
4319   rtx x = single_set (insn);
4320
4321   if (x)
4322     {
4323       register rtx r = SET_SRC (x);
4324       if (GET_CODE (r) == REG)
4325         {
4326           rtx call = XEXP (note, 0);
4327           rtx call_pat;
4328           register int i;
4329
4330           /* Find the call insn.  */
4331           while (call != insn && GET_CODE (call) != CALL_INSN)
4332             call = NEXT_INSN (call);
4333
4334           /* If there is none, do nothing special,
4335              since ordinary death handling can understand these insns.  */
4336           if (call == insn)
4337             return 0;
4338
4339           /* See if the hard reg holding the value is dead.
4340              If this is a PARALLEL, find the call within it.  */
4341           call_pat = PATTERN (call);
4342           if (GET_CODE (call_pat) == PARALLEL)
4343             {
4344               for (i = XVECLEN (call_pat, 0) - 1; i >= 0; i--)
4345                 if (GET_CODE (XVECEXP (call_pat, 0, i)) == SET
4346                     && GET_CODE (SET_SRC (XVECEXP (call_pat, 0, i))) == CALL)
4347                   break;
4348
4349               /* This may be a library call that is returning a value
4350                  via invisible pointer.  Do nothing special, since
4351                  ordinary death handling can understand these insns.  */
4352               if (i < 0)
4353                 return 0;
4354
4355               call_pat = XVECEXP (call_pat, 0, i);
4356             }
4357
4358           return insn_dead_p (pbi, call_pat, 1, REG_NOTES (call));
4359         }
4360     }
4361   return 1;
4362 }
4363
4364 /* Return 1 if register REGNO was used before it was set, i.e. if it is
4365    live at function entry.  Don't count global register variables, variables
4366    in registers that can be used for function arg passing, or variables in
4367    fixed hard registers.  */
4368
4369 int
4370 regno_uninitialized (regno)
4371      int regno;
4372 {
4373   if (n_basic_blocks == 0
4374       || (regno < FIRST_PSEUDO_REGISTER
4375           && (global_regs[regno]
4376               || fixed_regs[regno]
4377               || FUNCTION_ARG_REGNO_P (regno))))
4378     return 0;
4379
4380   return REGNO_REG_SET_P (BASIC_BLOCK (0)->global_live_at_start, regno);
4381 }
4382
4383 /* 1 if register REGNO was alive at a place where `setjmp' was called
4384    and was set more than once or is an argument.
4385    Such regs may be clobbered by `longjmp'.  */
4386
4387 int
4388 regno_clobbered_at_setjmp (regno)
4389      int regno;
4390 {
4391   if (n_basic_blocks == 0)
4392     return 0;
4393
4394   return ((REG_N_SETS (regno) > 1
4395            || REGNO_REG_SET_P (BASIC_BLOCK (0)->global_live_at_start, regno))
4396           && REGNO_REG_SET_P (regs_live_at_setjmp, regno));
4397 }
4398 \f
4399 /* INSN references memory, possibly using autoincrement addressing modes.
4400    Find any entries on the mem_set_list that need to be invalidated due
4401    to an address change.  */
4402
4403 static void
4404 invalidate_mems_from_autoinc (pbi, insn)
4405      struct propagate_block_info *pbi;
4406      rtx insn;
4407 {
4408   rtx note = REG_NOTES (insn);
4409   for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
4410     {
4411       if (REG_NOTE_KIND (note) == REG_INC)
4412         {
4413           rtx temp = pbi->mem_set_list;
4414           rtx prev = NULL_RTX;
4415           rtx next;
4416
4417           while (temp)
4418             {
4419               next = XEXP (temp, 1);
4420               if (reg_overlap_mentioned_p (XEXP (note, 0), XEXP (temp, 0)))
4421                 {
4422                   /* Splice temp out of list.  */
4423                   if (prev)
4424                     XEXP (prev, 1) = next;
4425                   else
4426                     pbi->mem_set_list = next;
4427                   free_EXPR_LIST_node (temp);
4428                 }
4429               else
4430                 prev = temp;
4431               temp = next;
4432             }
4433         }
4434     }
4435 }
4436
4437 /* EXP is either a MEM or a REG.  Remove any dependant entries
4438    from pbi->mem_set_list.  */
4439
4440 static void
4441 invalidate_mems_from_set (pbi, exp)
4442      struct propagate_block_info *pbi;
4443      rtx exp;
4444 {
4445   rtx temp = pbi->mem_set_list;
4446   rtx prev = NULL_RTX;
4447   rtx next;
4448
4449   while (temp)
4450     {
4451       next = XEXP (temp, 1);
4452       if ((GET_CODE (exp) == MEM
4453            && output_dependence (XEXP (temp, 0), exp))
4454           || (GET_CODE (exp) == REG
4455               && reg_overlap_mentioned_p (exp, XEXP (temp, 0))))
4456         {
4457           /* Splice this entry out of the list.  */
4458           if (prev)
4459             XEXP (prev, 1) = next;
4460           else
4461             pbi->mem_set_list = next;
4462           free_EXPR_LIST_node (temp);
4463         }
4464       else
4465         prev = temp;
4466       temp = next;
4467     }
4468 }
4469
4470 /* Process the registers that are set within X.  Their bits are set to
4471    1 in the regset DEAD, because they are dead prior to this insn.
4472
4473    If INSN is nonzero, it is the insn being processed.
4474
4475    FLAGS is the set of operations to perform.  */
4476
4477 static void
4478 mark_set_regs (pbi, x, insn)
4479      struct propagate_block_info *pbi;
4480      rtx x, insn;
4481 {
4482   rtx cond = NULL_RTX;
4483   rtx link;
4484   enum rtx_code code;
4485
4486   if (insn)
4487     for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
4488       {
4489         if (REG_NOTE_KIND (link) == REG_INC)
4490           mark_set_1 (pbi, SET, XEXP (link, 0),
4491                       (GET_CODE (x) == COND_EXEC
4492                        ? COND_EXEC_TEST (x) : NULL_RTX),
4493                       insn, pbi->flags);
4494       }
4495  retry:
4496   switch (code = GET_CODE (x))
4497     {
4498     case SET:
4499     case CLOBBER:
4500       mark_set_1 (pbi, code, SET_DEST (x), cond, insn, pbi->flags);
4501       return;
4502
4503     case COND_EXEC:
4504       cond = COND_EXEC_TEST (x);
4505       x = COND_EXEC_CODE (x);
4506       goto retry;
4507
4508     case PARALLEL:
4509       {
4510         register int i;
4511         for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
4512           {
4513             rtx sub = XVECEXP (x, 0, i);
4514             switch (code = GET_CODE (sub))
4515               {
4516               case COND_EXEC:
4517                 if (cond != NULL_RTX)
4518                   abort ();
4519
4520                 cond = COND_EXEC_TEST (sub);
4521                 sub = COND_EXEC_CODE (sub);
4522                 if (GET_CODE (sub) != SET && GET_CODE (sub) != CLOBBER)
4523                   break;
4524                 /* Fall through.  */
4525
4526               case SET:
4527               case CLOBBER:
4528                 mark_set_1 (pbi, code, SET_DEST (sub), cond, insn, pbi->flags);
4529                 break;
4530
4531               default:
4532                 break;
4533               }
4534           }
4535         break;
4536       }
4537
4538     default:
4539       break;
4540     }
4541 }
4542
4543 /* Process a single SET rtx, X.  */
4544
4545 static void
4546 mark_set_1 (pbi, code, reg, cond, insn, flags)
4547      struct propagate_block_info *pbi;
4548      enum rtx_code code;
4549      rtx reg, cond, insn;
4550      int flags;
4551 {
4552   int regno_first = -1, regno_last = -1;
4553   int not_dead = 0;
4554   int i;
4555
4556   /* Some targets place small structures in registers for
4557      return values of functions.  We have to detect this
4558      case specially here to get correct flow information.  */
4559   if (GET_CODE (reg) == PARALLEL
4560       && GET_MODE (reg) == BLKmode)
4561     {
4562       for (i = XVECLEN (reg, 0) - 1; i >= 0; i--)
4563         mark_set_1 (pbi, code, XVECEXP (reg, 0, i), cond, insn, flags);
4564       return;
4565     }
4566
4567   /* Modifying just one hardware register of a multi-reg value or just a
4568      byte field of a register does not mean the value from before this insn
4569      is now dead.  Of course, if it was dead after it's unused now.  */
4570
4571   switch (GET_CODE (reg))
4572     {
4573     case ZERO_EXTRACT:
4574     case SIGN_EXTRACT:
4575     case STRICT_LOW_PART:
4576       /* ??? Assumes STRICT_LOW_PART not used on multi-word registers.  */
4577       do
4578         reg = XEXP (reg, 0);
4579       while (GET_CODE (reg) == SUBREG
4580              || GET_CODE (reg) == ZERO_EXTRACT
4581              || GET_CODE (reg) == SIGN_EXTRACT
4582              || GET_CODE (reg) == STRICT_LOW_PART);
4583       if (GET_CODE (reg) == MEM)
4584         break;
4585       not_dead = REGNO_REG_SET_P (pbi->reg_live, REGNO (reg));
4586       /* Fall through.  */
4587
4588     case REG:
4589       regno_last = regno_first = REGNO (reg);
4590       if (regno_first < FIRST_PSEUDO_REGISTER)
4591         regno_last += HARD_REGNO_NREGS (regno_first, GET_MODE (reg)) - 1;
4592       break;
4593
4594     case SUBREG:
4595       if (GET_CODE (SUBREG_REG (reg)) == REG)
4596         {
4597           enum machine_mode outer_mode = GET_MODE (reg);
4598           enum machine_mode inner_mode = GET_MODE (SUBREG_REG (reg));
4599
4600           /* Identify the range of registers affected.  This is moderately
4601              tricky for hard registers.  See alter_subreg.  */
4602
4603           regno_last = regno_first = REGNO (SUBREG_REG (reg));
4604           if (regno_first < FIRST_PSEUDO_REGISTER)
4605             {
4606 #ifdef ALTER_HARD_SUBREG
4607               regno_first = ALTER_HARD_SUBREG (outer_mode, SUBREG_WORD (reg),
4608                                                inner_mode, regno_first);
4609 #else
4610               regno_first += SUBREG_WORD (reg);
4611 #endif
4612               regno_last = (regno_first
4613                             + HARD_REGNO_NREGS (regno_first, outer_mode) - 1);
4614
4615               /* Since we've just adjusted the register number ranges, make
4616                  sure REG matches.  Otherwise some_was_live will be clear
4617                  when it shouldn't have been, and we'll create incorrect
4618                  REG_UNUSED notes.  */
4619               reg = gen_rtx_REG (outer_mode, regno_first);
4620             }
4621           else
4622             {
4623               /* If the number of words in the subreg is less than the number
4624                  of words in the full register, we have a well-defined partial
4625                  set.  Otherwise the high bits are undefined.
4626
4627                  This is only really applicable to pseudos, since we just took
4628                  care of multi-word hard registers.  */
4629               if (((GET_MODE_SIZE (outer_mode)
4630                     + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
4631                   < ((GET_MODE_SIZE (inner_mode)
4632                       + UNITS_PER_WORD - 1) / UNITS_PER_WORD))
4633                 not_dead = REGNO_REG_SET_P (pbi->reg_live, regno_first);
4634
4635               reg = SUBREG_REG (reg);
4636             }
4637         }
4638       else
4639         reg = SUBREG_REG (reg);
4640       break;
4641
4642     default:
4643       break;
4644     }
4645
4646   /* If this set is a MEM, then it kills any aliased writes.
4647      If this set is a REG, then it kills any MEMs which use the reg.  */
4648   if (optimize && (flags & PROP_SCAN_DEAD_CODE))
4649     {
4650       if (GET_CODE (reg) == MEM || GET_CODE (reg) == REG)
4651         invalidate_mems_from_set (pbi, reg);
4652
4653       /* If the memory reference had embedded side effects (autoincrement
4654          address modes.  Then we may need to kill some entries on the
4655          memory set list.  */
4656       if (insn && GET_CODE (reg) == MEM)
4657         invalidate_mems_from_autoinc (pbi, insn);
4658
4659       if (GET_CODE (reg) == MEM && ! side_effects_p (reg)
4660           /* ??? With more effort we could track conditional memory life.  */
4661           && ! cond
4662           /* We do not know the size of a BLKmode store, so we do not track
4663              them for redundant store elimination.  */
4664           && GET_MODE (reg) != BLKmode
4665           /* There are no REG_INC notes for SP, so we can't assume we'll see
4666              everything that invalidates it.  To be safe, don't eliminate any
4667              stores though SP; none of them should be redundant anyway.  */
4668           && ! reg_mentioned_p (stack_pointer_rtx, reg))
4669         {
4670 #ifdef AUTO_INC_DEC
4671           /* Store a copy of mem, otherwise the address may be
4672              scrogged by find_auto_inc.  */
4673           if (flags & PROP_AUTOINC)
4674             reg = shallow_copy_rtx (reg);
4675 #endif
4676           pbi->mem_set_list = alloc_EXPR_LIST (0, reg, pbi->mem_set_list);
4677         }
4678     }
4679
4680   if (GET_CODE (reg) == REG
4681       && ! (regno_first == FRAME_POINTER_REGNUM
4682             && (! reload_completed || frame_pointer_needed))
4683 #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
4684       && ! (regno_first == HARD_FRAME_POINTER_REGNUM
4685             && (! reload_completed || frame_pointer_needed))
4686 #endif
4687 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
4688       && ! (regno_first == ARG_POINTER_REGNUM && fixed_regs[regno_first])
4689 #endif
4690       )
4691     {
4692       int some_was_live = 0, some_was_dead = 0;
4693
4694       for (i = regno_first; i <= regno_last; ++i)
4695         {
4696           int needed_regno = REGNO_REG_SET_P (pbi->reg_live, i);
4697           if (pbi->local_set)
4698             {
4699               /* Order of the set operation matters here since both
4700                  sets may be the same.  */
4701               CLEAR_REGNO_REG_SET (pbi->cond_local_set, i);
4702               if (cond != NULL_RTX
4703                   && ! REGNO_REG_SET_P (pbi->local_set, i))
4704                 SET_REGNO_REG_SET (pbi->cond_local_set, i);
4705               else
4706                 SET_REGNO_REG_SET (pbi->local_set, i);
4707             }
4708           if (code != CLOBBER)
4709             SET_REGNO_REG_SET (pbi->new_set, i);
4710
4711           some_was_live |= needed_regno;
4712           some_was_dead |= ! needed_regno;
4713         }
4714
4715 #ifdef HAVE_conditional_execution
4716       /* Consider conditional death in deciding that the register needs
4717          a death note.  */
4718       if (some_was_live && ! not_dead
4719           /* The stack pointer is never dead.  Well, not strictly true,
4720              but it's very difficult to tell from here.  Hopefully
4721              combine_stack_adjustments will fix up the most egregious
4722              errors.  */
4723           && regno_first != STACK_POINTER_REGNUM)
4724         {
4725           for (i = regno_first; i <= regno_last; ++i)
4726             if (! mark_regno_cond_dead (pbi, i, cond))
4727               not_dead = 1;
4728         }
4729 #endif
4730
4731       /* Additional data to record if this is the final pass.  */
4732       if (flags & (PROP_LOG_LINKS | PROP_REG_INFO
4733                    | PROP_DEATH_NOTES | PROP_AUTOINC))
4734         {
4735           register rtx y;
4736           register int blocknum = pbi->bb->index;
4737
4738           y = NULL_RTX;
4739           if (flags & (PROP_LOG_LINKS | PROP_AUTOINC))
4740             {
4741               y = pbi->reg_next_use[regno_first];
4742
4743               /* The next use is no longer next, since a store intervenes.  */
4744               for (i = regno_first; i <= regno_last; ++i)
4745                 pbi->reg_next_use[i] = 0;
4746             }
4747
4748           if (flags & PROP_REG_INFO)
4749             {
4750               for (i = regno_first; i <= regno_last; ++i)
4751                 {
4752                   /* Count (weighted) references, stores, etc.  This counts a
4753                      register twice if it is modified, but that is correct.  */
4754                   REG_N_SETS (i) += 1;
4755                   REG_N_REFS (i) += (optimize_size ? 1
4756                                      : pbi->bb->loop_depth + 1);
4757
4758                   /* The insns where a reg is live are normally counted
4759                      elsewhere, but we want the count to include the insn
4760                      where the reg is set, and the normal counting mechanism
4761                      would not count it.  */
4762                   REG_LIVE_LENGTH (i) += 1;
4763                 }
4764
4765               /* If this is a hard reg, record this function uses the reg.  */
4766               if (regno_first < FIRST_PSEUDO_REGISTER)
4767                 {
4768                   for (i = regno_first; i <= regno_last; i++)
4769                     regs_ever_live[i] = 1;
4770                 }
4771               else
4772                 {
4773                   /* Keep track of which basic blocks each reg appears in.  */
4774                   if (REG_BASIC_BLOCK (regno_first) == REG_BLOCK_UNKNOWN)
4775                     REG_BASIC_BLOCK (regno_first) = blocknum;
4776                   else if (REG_BASIC_BLOCK (regno_first) != blocknum)
4777                     REG_BASIC_BLOCK (regno_first) = REG_BLOCK_GLOBAL;
4778                 }
4779             }
4780
4781           if (! some_was_dead)
4782             {
4783               if (flags & PROP_LOG_LINKS)
4784                 {
4785                   /* Make a logical link from the next following insn
4786                      that uses this register, back to this insn.
4787                      The following insns have already been processed.
4788
4789                      We don't build a LOG_LINK for hard registers containing
4790                      in ASM_OPERANDs.  If these registers get replaced,
4791                      we might wind up changing the semantics of the insn,
4792                      even if reload can make what appear to be valid
4793                      assignments later.  */
4794                   if (y && (BLOCK_NUM (y) == blocknum)
4795                       && (regno_first >= FIRST_PSEUDO_REGISTER
4796                           || asm_noperands (PATTERN (y)) < 0))
4797                     LOG_LINKS (y) = alloc_INSN_LIST (insn, LOG_LINKS (y));
4798                 }
4799             }
4800           else if (not_dead)
4801             ;
4802           else if (! some_was_live)
4803             {
4804               if (flags & PROP_REG_INFO)
4805                 REG_N_DEATHS (regno_first) += 1;
4806
4807               if (flags & PROP_DEATH_NOTES)
4808                 {
4809                   /* Note that dead stores have already been deleted
4810                      when possible.  If we get here, we have found a
4811                      dead store that cannot be eliminated (because the
4812                      same insn does something useful).  Indicate this
4813                      by marking the reg being set as dying here.  */
4814                   REG_NOTES (insn)
4815                     = alloc_EXPR_LIST (REG_UNUSED, reg, REG_NOTES (insn));
4816                 }
4817             }
4818           else
4819             {
4820               if (flags & PROP_DEATH_NOTES)
4821                 {
4822                   /* This is a case where we have a multi-word hard register
4823                      and some, but not all, of the words of the register are
4824                      needed in subsequent insns.  Write REG_UNUSED notes
4825                      for those parts that were not needed.  This case should
4826                      be rare.  */
4827
4828                   for (i = regno_first; i <= regno_last; ++i)
4829                     if (! REGNO_REG_SET_P (pbi->reg_live, i))
4830                       REG_NOTES (insn)
4831                         = alloc_EXPR_LIST (REG_UNUSED,
4832                                            gen_rtx_REG (reg_raw_mode[i], i),
4833                                            REG_NOTES (insn));
4834                 }
4835             }
4836         }
4837
4838       /* Mark the register as being dead.  */
4839       if (some_was_live
4840           && ! not_dead
4841           /* The stack pointer is never dead.  Well, not strictly true,
4842              but it's very difficult to tell from here.  Hopefully
4843              combine_stack_adjustments will fix up the most egregious
4844              errors.  */
4845           && regno_first != STACK_POINTER_REGNUM)
4846         {
4847           for (i = regno_first; i <= regno_last; ++i)
4848             CLEAR_REGNO_REG_SET (pbi->reg_live, i);
4849         }
4850     }
4851   else if (GET_CODE (reg) == REG)
4852     {
4853       if (flags & (PROP_LOG_LINKS | PROP_AUTOINC))
4854         pbi->reg_next_use[regno_first] = 0;
4855     }
4856
4857   /* If this is the last pass and this is a SCRATCH, show it will be dying
4858      here and count it.  */
4859   else if (GET_CODE (reg) == SCRATCH)
4860     {
4861       if (flags & PROP_DEATH_NOTES)
4862         REG_NOTES (insn)
4863           = alloc_EXPR_LIST (REG_UNUSED, reg, REG_NOTES (insn));
4864     }
4865 }
4866 \f
4867 #ifdef HAVE_conditional_execution
4868 /* Mark REGNO conditionally dead.
4869    Return true if the register is now unconditionally dead.  */
4870
4871 static int
4872 mark_regno_cond_dead (pbi, regno, cond)
4873      struct propagate_block_info *pbi;
4874      int regno;
4875      rtx cond;
4876 {
4877   /* If this is a store to a predicate register, the value of the
4878      predicate is changing, we don't know that the predicate as seen
4879      before is the same as that seen after.  Flush all dependent
4880      conditions from reg_cond_dead.  This will make all such
4881      conditionally live registers unconditionally live.  */
4882   if (REGNO_REG_SET_P (pbi->reg_cond_reg, regno))
4883     flush_reg_cond_reg (pbi, regno);
4884
4885   /* If this is an unconditional store, remove any conditional
4886      life that may have existed.  */
4887   if (cond == NULL_RTX)
4888     splay_tree_remove (pbi->reg_cond_dead, regno);
4889   else
4890     {
4891       splay_tree_node node;
4892       struct reg_cond_life_info *rcli;
4893       rtx ncond;
4894
4895       /* Otherwise this is a conditional set.  Record that fact.
4896          It may have been conditionally used, or there may be a
4897          subsequent set with a complimentary condition.  */
4898
4899       node = splay_tree_lookup (pbi->reg_cond_dead, regno);
4900       if (node == NULL)
4901         {
4902           /* The register was unconditionally live previously.
4903              Record the current condition as the condition under
4904              which it is dead.  */
4905           rcli = (struct reg_cond_life_info *) xmalloc (sizeof (*rcli));
4906           rcli->condition = alloc_EXPR_LIST (0, cond, NULL_RTX);
4907           splay_tree_insert (pbi->reg_cond_dead, regno,
4908                              (splay_tree_value) rcli);
4909
4910           SET_REGNO_REG_SET (pbi->reg_cond_reg, REGNO (XEXP (cond, 0)));
4911
4912           /* Not unconditionaly dead.  */
4913           return 0;
4914         }
4915       else
4916         {
4917           /* The register was conditionally live previously.
4918              Add the new condition to the old.  */
4919           rcli = (struct reg_cond_life_info *) node->value;
4920           ncond = rcli->condition;
4921           ncond = ior_reg_cond (ncond, cond);
4922
4923           /* If the register is now unconditionally dead,
4924              remove the entry in the splay_tree.  */
4925           if (ncond == const1_rtx)
4926             splay_tree_remove (pbi->reg_cond_dead, regno);
4927           else
4928             {
4929               rcli->condition = ncond;
4930
4931               SET_REGNO_REG_SET (pbi->reg_cond_reg, REGNO (XEXP (cond, 0)));
4932
4933               /* Not unconditionaly dead.  */
4934               return 0;
4935             }
4936         }
4937     }
4938
4939   return 1;
4940 }
4941
4942 /* Called from splay_tree_delete for pbi->reg_cond_life.  */
4943
4944 static void
4945 free_reg_cond_life_info (value)
4946      splay_tree_value value;
4947 {
4948   struct reg_cond_life_info *rcli = (struct reg_cond_life_info *) value;
4949   free_EXPR_LIST_list (&rcli->condition);
4950   free (rcli);
4951 }
4952
4953 /* Helper function for flush_reg_cond_reg.  */
4954
4955 static int
4956 flush_reg_cond_reg_1 (node, data)
4957      splay_tree_node node;
4958      void *data;
4959 {
4960   struct reg_cond_life_info *rcli;
4961   int *xdata = (int *) data;
4962   unsigned int regno = xdata[0];
4963   rtx c, *prev;
4964
4965   /* Don't need to search if last flushed value was farther on in
4966      the in-order traversal.  */
4967   if (xdata[1] >= (int) node->key)
4968     return 0;
4969
4970   /* Splice out portions of the expression that refer to regno.  */
4971   rcli = (struct reg_cond_life_info *) node->value;
4972   c = *(prev = &rcli->condition);
4973   while (c)
4974     {
4975       if (regno == REGNO (XEXP (XEXP (c, 0), 0)))
4976         {
4977           rtx next = XEXP (c, 1);
4978           free_EXPR_LIST_node (c);
4979           c = *prev = next;
4980         }
4981       else
4982         c = *(prev = &XEXP (c, 1));
4983     }
4984
4985   /* If the entire condition is now NULL, signal the node to be removed.  */
4986   if (! rcli->condition)
4987     {
4988       xdata[1] = node->key;
4989       return -1;
4990     }
4991   else
4992     return 0;
4993 }
4994
4995 /* Flush all (sub) expressions referring to REGNO from REG_COND_LIVE.  */
4996
4997 static void
4998 flush_reg_cond_reg (pbi, regno)
4999      struct propagate_block_info *pbi;
5000      int regno;
5001 {
5002   int pair[2];
5003
5004   pair[0] = regno;
5005   pair[1] = -1;
5006   while (splay_tree_foreach (pbi->reg_cond_dead,
5007                              flush_reg_cond_reg_1, pair) == -1)
5008     splay_tree_remove (pbi->reg_cond_dead, pair[1]);
5009
5010   CLEAR_REGNO_REG_SET (pbi->reg_cond_reg, regno);
5011 }
5012
5013 /* Logical arithmetic on predicate conditions.  IOR, NOT and NAND.
5014    We actually use EXPR_LIST to chain the sub-expressions together
5015    instead of IOR because it's easier to manipulate and we have
5016    the lists.c functions to reuse nodes.
5017
5018    Return a new rtl expression as appropriate.  */
5019
5020 static rtx
5021 ior_reg_cond (old, x)
5022      rtx old, x;
5023 {
5024   enum rtx_code x_code;
5025   rtx x_reg;
5026   rtx c;
5027
5028   /* We expect these conditions to be of the form (eq reg 0).  */
5029   x_code = GET_CODE (x);
5030   if (GET_RTX_CLASS (x_code) != '<'
5031       || GET_CODE (x_reg = XEXP (x, 0)) != REG
5032       || XEXP (x, 1) != const0_rtx)
5033     abort ();
5034
5035   /* Search the expression for an existing sub-expression of X_REG.  */
5036   for (c = old; c; c = XEXP (c, 1))
5037     {
5038       rtx y = XEXP (c, 0);
5039       if (REGNO (XEXP (y, 0)) == REGNO (x_reg))
5040         {
5041           /* If we find X already present in OLD, we need do nothing.  */
5042           if (GET_CODE (y) == x_code)
5043             return old;
5044
5045           /* If we find X being a compliment of a condition in OLD,
5046              then the entire condition is true.  */
5047           if (GET_CODE (y) == reverse_condition (x_code))
5048             return const1_rtx;
5049         }
5050     }
5051
5052   /* Otherwise just add to the chain.  */
5053   return alloc_EXPR_LIST (0, x, old);
5054 }
5055
5056 static rtx
5057 not_reg_cond (x)
5058      rtx x;
5059 {
5060   enum rtx_code x_code;
5061   rtx x_reg;
5062
5063   /* We expect these conditions to be of the form (eq reg 0).  */
5064   x_code = GET_CODE (x);
5065   if (GET_RTX_CLASS (x_code) != '<'
5066       || GET_CODE (x_reg = XEXP (x, 0)) != REG
5067       || XEXP (x, 1) != const0_rtx)
5068     abort ();
5069
5070   return alloc_EXPR_LIST (0, gen_rtx_fmt_ee (reverse_condition (x_code),
5071                                              VOIDmode, x_reg, const0_rtx),
5072                           NULL_RTX);
5073 }
5074
5075 static rtx
5076 nand_reg_cond (old, x)
5077      rtx old, x;
5078 {
5079   enum rtx_code x_code;
5080   rtx x_reg;
5081   rtx c, *prev;
5082
5083   /* We expect these conditions to be of the form (eq reg 0).  */
5084   x_code = GET_CODE (x);
5085   if (GET_RTX_CLASS (x_code) != '<'
5086       || GET_CODE (x_reg = XEXP (x, 0)) != REG
5087       || XEXP (x, 1) != const0_rtx)
5088     abort ();
5089
5090   /* Search the expression for an existing sub-expression of X_REG.  */
5091
5092   for (c = *(prev = &old); c; c = *(prev = &XEXP (c, 1)))
5093     {
5094       rtx y = XEXP (c, 0);
5095       if (REGNO (XEXP (y, 0)) == REGNO (x_reg))
5096         {
5097           /* If we find X already present in OLD, then we need to
5098              splice it out.  */
5099           if (GET_CODE (y) == x_code)
5100             {
5101               *prev = XEXP (c, 1);
5102               free_EXPR_LIST_node (c);
5103               return old ? old : const0_rtx;
5104             }
5105
5106           /* If we find X being a compliment of a condition in OLD,
5107              then we need do nothing.  */
5108           if (GET_CODE (y) == reverse_condition (x_code))
5109             return old;
5110         }
5111     }
5112
5113   /* Otherwise, by implication, the register in question is now live for
5114      the inverse of the condition X.  */
5115   return alloc_EXPR_LIST (0, gen_rtx_fmt_ee (reverse_condition (x_code),
5116                                              VOIDmode, x_reg, const0_rtx),
5117                           old);
5118 }
5119 #endif /* HAVE_conditional_execution */
5120 \f
5121 #ifdef AUTO_INC_DEC
5122
5123 /* Try to substitute the auto-inc expression INC as the address inside
5124    MEM which occurs in INSN.  Currently, the address of MEM is an expression
5125    involving INCR_REG, and INCR is the next use of INCR_REG; it is an insn
5126    that has a single set whose source is a PLUS of INCR_REG and something
5127    else.  */
5128
5129 static void
5130 attempt_auto_inc (pbi, inc, insn, mem, incr, incr_reg)
5131      struct propagate_block_info *pbi;
5132      rtx inc, insn, mem, incr, incr_reg;
5133 {
5134   int regno = REGNO (incr_reg);
5135   rtx set = single_set (incr);
5136   rtx q = SET_DEST (set);
5137   rtx y = SET_SRC (set);
5138   int opnum = XEXP (y, 0) == incr_reg ? 0 : 1;
5139
5140   /* Make sure this reg appears only once in this insn.  */
5141   if (count_occurrences (PATTERN (insn), incr_reg, 1) != 1)
5142     return;
5143
5144   if (dead_or_set_p (incr, incr_reg)
5145       /* Mustn't autoinc an eliminable register.  */
5146       && (regno >= FIRST_PSEUDO_REGISTER
5147           || ! TEST_HARD_REG_BIT (elim_reg_set, regno)))
5148     {
5149       /* This is the simple case.  Try to make the auto-inc.  If
5150          we can't, we are done.  Otherwise, we will do any
5151          needed updates below.  */
5152       if (! validate_change (insn, &XEXP (mem, 0), inc, 0))
5153         return;
5154     }
5155   else if (GET_CODE (q) == REG
5156            /* PREV_INSN used here to check the semi-open interval
5157               [insn,incr).  */
5158            && ! reg_used_between_p (q,  PREV_INSN (insn), incr)
5159            /* We must also check for sets of q as q may be
5160               a call clobbered hard register and there may
5161               be a call between PREV_INSN (insn) and incr.  */
5162            && ! reg_set_between_p (q,  PREV_INSN (insn), incr))
5163     {
5164       /* We have *p followed sometime later by q = p+size.
5165          Both p and q must be live afterward,
5166          and q is not used between INSN and its assignment.
5167          Change it to q = p, ...*q..., q = q+size.
5168          Then fall into the usual case.  */
5169       rtx insns, temp;
5170
5171       start_sequence ();
5172       emit_move_insn (q, incr_reg);
5173       insns = get_insns ();
5174       end_sequence ();
5175
5176       if (basic_block_for_insn)
5177         for (temp = insns; temp; temp = NEXT_INSN (temp))
5178           set_block_for_insn (temp, pbi->bb);
5179
5180       /* If we can't make the auto-inc, or can't make the
5181          replacement into Y, exit.  There's no point in making
5182          the change below if we can't do the auto-inc and doing
5183          so is not correct in the pre-inc case.  */
5184
5185       XEXP (inc, 0) = q;
5186       validate_change (insn, &XEXP (mem, 0), inc, 1);
5187       validate_change (incr, &XEXP (y, opnum), q, 1);
5188       if (! apply_change_group ())
5189         return;
5190
5191       /* We now know we'll be doing this change, so emit the
5192          new insn(s) and do the updates.  */
5193       emit_insns_before (insns, insn);
5194
5195       if (pbi->bb->head == insn)
5196         pbi->bb->head = insns;
5197
5198       /* INCR will become a NOTE and INSN won't contain a
5199          use of INCR_REG.  If a use of INCR_REG was just placed in
5200          the insn before INSN, make that the next use.
5201          Otherwise, invalidate it.  */
5202       if (GET_CODE (PREV_INSN (insn)) == INSN
5203           && GET_CODE (PATTERN (PREV_INSN (insn))) == SET
5204           && SET_SRC (PATTERN (PREV_INSN (insn))) == incr_reg)
5205         pbi->reg_next_use[regno] = PREV_INSN (insn);
5206       else
5207         pbi->reg_next_use[regno] = 0;
5208
5209       incr_reg = q;
5210       regno = REGNO (q);
5211
5212       /* REGNO is now used in INCR which is below INSN, but
5213          it previously wasn't live here.  If we don't mark
5214          it as live, we'll put a REG_DEAD note for it
5215          on this insn, which is incorrect.  */
5216       SET_REGNO_REG_SET (pbi->reg_live, regno);
5217
5218       /* If there are any calls between INSN and INCR, show
5219          that REGNO now crosses them.  */
5220       for (temp = insn; temp != incr; temp = NEXT_INSN (temp))
5221         if (GET_CODE (temp) == CALL_INSN)
5222           REG_N_CALLS_CROSSED (regno)++;
5223     }
5224   else
5225     return;
5226
5227   /* If we haven't returned, it means we were able to make the
5228      auto-inc, so update the status.  First, record that this insn
5229      has an implicit side effect.  */
5230
5231   REG_NOTES (insn) = alloc_EXPR_LIST (REG_INC, incr_reg, REG_NOTES (insn));
5232
5233   /* Modify the old increment-insn to simply copy
5234      the already-incremented value of our register.  */
5235   if (! validate_change (incr, &SET_SRC (set), incr_reg, 0))
5236     abort ();
5237
5238   /* If that makes it a no-op (copying the register into itself) delete
5239      it so it won't appear to be a "use" and a "set" of this
5240      register.  */
5241   if (REGNO (SET_DEST (set)) == REGNO (incr_reg))
5242     {
5243       /* If the original source was dead, it's dead now.  */
5244       rtx note;
5245
5246       while ((note = find_reg_note (incr, REG_DEAD, NULL_RTX)) != NULL_RTX)
5247         {
5248           remove_note (incr, note);
5249           if (XEXP (note, 0) != incr_reg)
5250             CLEAR_REGNO_REG_SET (pbi->reg_live, REGNO (XEXP (note, 0)));
5251         }
5252
5253       PUT_CODE (incr, NOTE);
5254       NOTE_LINE_NUMBER (incr) = NOTE_INSN_DELETED;
5255       NOTE_SOURCE_FILE (incr) = 0;
5256     }
5257
5258   if (regno >= FIRST_PSEUDO_REGISTER)
5259     {
5260       /* Count an extra reference to the reg.  When a reg is
5261          incremented, spilling it is worse, so we want to make
5262          that less likely.  */
5263       REG_N_REFS (regno) += (optimize_size ? 1 : pbi->bb->loop_depth + 1);
5264
5265       /* Count the increment as a setting of the register,
5266          even though it isn't a SET in rtl.  */
5267       REG_N_SETS (regno)++;
5268     }
5269 }
5270
5271 /* X is a MEM found in INSN.  See if we can convert it into an auto-increment
5272    reference.  */
5273
5274 static void
5275 find_auto_inc (pbi, x, insn)
5276      struct propagate_block_info *pbi;
5277      rtx x;
5278      rtx insn;
5279 {
5280   rtx addr = XEXP (x, 0);
5281   HOST_WIDE_INT offset = 0;
5282   rtx set, y, incr, inc_val;
5283   int regno;
5284   int size = GET_MODE_SIZE (GET_MODE (x));
5285
5286   if (GET_CODE (insn) == JUMP_INSN)
5287     return;
5288
5289   /* Here we detect use of an index register which might be good for
5290      postincrement, postdecrement, preincrement, or predecrement.  */
5291
5292   if (GET_CODE (addr) == PLUS && GET_CODE (XEXP (addr, 1)) == CONST_INT)
5293     offset = INTVAL (XEXP (addr, 1)), addr = XEXP (addr, 0);
5294
5295   if (GET_CODE (addr) != REG)
5296     return;
5297
5298   regno = REGNO (addr);
5299
5300   /* Is the next use an increment that might make auto-increment? */
5301   incr = pbi->reg_next_use[regno];
5302   if (incr == 0 || BLOCK_NUM (incr) != BLOCK_NUM (insn))
5303     return;
5304   set = single_set (incr);
5305   if (set == 0 || GET_CODE (set) != SET)
5306     return;
5307   y = SET_SRC (set);
5308
5309   if (GET_CODE (y) != PLUS)
5310     return;
5311
5312   if (REG_P (XEXP (y, 0)) && REGNO (XEXP (y, 0)) == REGNO (addr))
5313     inc_val = XEXP (y, 1);
5314   else if (REG_P (XEXP (y, 1)) && REGNO (XEXP (y, 1)) == REGNO (addr))
5315     inc_val = XEXP (y, 0);
5316   else
5317     return;
5318
5319   if (GET_CODE (inc_val) == CONST_INT)
5320     {
5321       if (HAVE_POST_INCREMENT
5322           && (INTVAL (inc_val) == size && offset == 0))
5323         attempt_auto_inc (pbi, gen_rtx_POST_INC (Pmode, addr), insn, x,
5324                           incr, addr);
5325       else if (HAVE_POST_DECREMENT
5326                && (INTVAL (inc_val) == -size && offset == 0))
5327         attempt_auto_inc (pbi, gen_rtx_POST_DEC (Pmode, addr), insn, x,
5328                           incr, addr);
5329       else if (HAVE_PRE_INCREMENT
5330                && (INTVAL (inc_val) == size && offset == size))
5331         attempt_auto_inc (pbi, gen_rtx_PRE_INC (Pmode, addr), insn, x,
5332                           incr, addr);
5333       else if (HAVE_PRE_DECREMENT
5334                && (INTVAL (inc_val) == -size && offset == -size))
5335         attempt_auto_inc (pbi, gen_rtx_PRE_DEC (Pmode, addr), insn, x,
5336                           incr, addr);
5337       else if (HAVE_POST_MODIFY_DISP && offset == 0)
5338         attempt_auto_inc (pbi, gen_rtx_POST_MODIFY (Pmode, addr,
5339                                                     gen_rtx_PLUS (Pmode,
5340                                                                   addr,
5341                                                                   inc_val)),
5342                           insn, x, incr, addr);
5343     }
5344   else if (GET_CODE (inc_val) == REG
5345            && ! reg_set_between_p (inc_val, PREV_INSN (insn),
5346                                    NEXT_INSN (incr)))
5347
5348     {
5349       if (HAVE_POST_MODIFY_REG && offset == 0)
5350         attempt_auto_inc (pbi, gen_rtx_POST_MODIFY (Pmode, addr,
5351                                                     gen_rtx_PLUS (Pmode,
5352                                                                   addr,
5353                                                                   inc_val)),
5354                           insn, x, incr, addr);
5355     }
5356 }
5357
5358 #endif /* AUTO_INC_DEC */
5359 \f
5360 static void
5361 mark_used_reg (pbi, reg, cond, insn)
5362      struct propagate_block_info *pbi;
5363      rtx reg;
5364      rtx cond ATTRIBUTE_UNUSED;
5365      rtx insn;
5366 {
5367   int regno = REGNO (reg);
5368   int some_was_live = REGNO_REG_SET_P (pbi->reg_live, regno);
5369   int some_was_dead = ! some_was_live;
5370   int some_not_set;
5371   int n;
5372
5373   /* A hard reg in a wide mode may really be multiple registers.
5374      If so, mark all of them just like the first.  */
5375   if (regno < FIRST_PSEUDO_REGISTER)
5376     {
5377       n = HARD_REGNO_NREGS (regno, GET_MODE (reg));
5378       while (--n > 0)
5379         {
5380           int needed_regno = REGNO_REG_SET_P (pbi->reg_live, regno + n);
5381           some_was_live |= needed_regno;
5382           some_was_dead |= ! needed_regno;
5383         }
5384     }
5385
5386   if (pbi->flags & (PROP_LOG_LINKS | PROP_AUTOINC))
5387     {
5388       /* Record where each reg is used, so when the reg is set we know
5389          the next insn that uses it.  */
5390       pbi->reg_next_use[regno] = insn;
5391     }
5392
5393   if (pbi->flags & PROP_REG_INFO)
5394     {
5395       if (regno < FIRST_PSEUDO_REGISTER)
5396         {
5397           /* If this is a register we are going to try to eliminate,
5398              don't mark it live here.  If we are successful in
5399              eliminating it, it need not be live unless it is used for
5400              pseudos, in which case it will have been set live when it
5401              was allocated to the pseudos.  If the register will not
5402              be eliminated, reload will set it live at that point.
5403
5404              Otherwise, record that this function uses this register.  */
5405           /* ??? The PPC backend tries to "eliminate" on the pic
5406              register to itself.  This should be fixed.  In the mean
5407              time, hack around it.  */
5408
5409           if (! (TEST_HARD_REG_BIT (elim_reg_set, regno)
5410                  && (regno == FRAME_POINTER_REGNUM
5411                      || regno == ARG_POINTER_REGNUM)))
5412             {
5413               int n = HARD_REGNO_NREGS (regno, GET_MODE (reg));
5414               do
5415                 regs_ever_live[regno + --n] = 1;
5416               while (n > 0);
5417             }
5418         }
5419       else
5420         {
5421           /* Keep track of which basic block each reg appears in.  */
5422
5423           register int blocknum = pbi->bb->index;
5424           if (REG_BASIC_BLOCK (regno) == REG_BLOCK_UNKNOWN)
5425             REG_BASIC_BLOCK (regno) = blocknum;
5426           else if (REG_BASIC_BLOCK (regno) != blocknum)
5427             REG_BASIC_BLOCK (regno) = REG_BLOCK_GLOBAL;
5428
5429           /* Count (weighted) number of uses of each reg.  */
5430           REG_N_REFS (regno) += (optimize_size ? 1
5431                                  : pbi->bb->loop_depth + 1);
5432         }
5433     }
5434
5435   /* Find out if any of the register was set this insn.  */
5436   some_not_set = ! REGNO_REG_SET_P (pbi->new_set, regno);
5437   if (regno < FIRST_PSEUDO_REGISTER)
5438     {
5439       n = HARD_REGNO_NREGS (regno, GET_MODE (reg));
5440       while (--n > 0)
5441         some_not_set |= ! REGNO_REG_SET_P (pbi->new_set, regno + n);
5442     }
5443
5444   /* Record and count the insns in which a reg dies.  If it is used in
5445      this insn and was dead below the insn then it dies in this insn.
5446      If it was set in this insn, we do not make a REG_DEAD note;
5447      likewise if we already made such a note.  */
5448   if ((pbi->flags & (PROP_DEATH_NOTES | PROP_REG_INFO))
5449       && some_was_dead
5450       && some_not_set)
5451     {
5452       /* Check for the case where the register dying partially
5453          overlaps the register set by this insn.  */
5454       if (regno < FIRST_PSEUDO_REGISTER
5455           && HARD_REGNO_NREGS (regno, GET_MODE (reg)) > 1)
5456         {
5457           n = HARD_REGNO_NREGS (regno, GET_MODE (reg));
5458           while (--n >= 0)
5459             some_was_live |= REGNO_REG_SET_P (pbi->new_set, regno + n);
5460         }
5461
5462       /* If none of the words in X is needed, make a REG_DEAD note.
5463          Otherwise, we must make partial REG_DEAD notes.  */
5464       if (! some_was_live)
5465         {
5466           if ((pbi->flags & PROP_DEATH_NOTES)
5467               && ! find_regno_note (insn, REG_DEAD, regno))
5468             REG_NOTES (insn)
5469               = alloc_EXPR_LIST (REG_DEAD, reg, REG_NOTES (insn));
5470
5471           if (pbi->flags & PROP_REG_INFO)
5472             REG_N_DEATHS (regno)++;
5473         }
5474       else
5475         {
5476           /* Don't make a REG_DEAD note for a part of a register
5477              that is set in the insn.  */
5478
5479           n = regno + HARD_REGNO_NREGS (regno, GET_MODE (reg)) - 1;
5480           for (; n >= regno; n--)
5481             if (! REGNO_REG_SET_P (pbi->reg_live, n)
5482                 && ! dead_or_set_regno_p (insn, n))
5483               REG_NOTES (insn)
5484                 = alloc_EXPR_LIST (REG_DEAD,
5485                                    gen_rtx_REG (reg_raw_mode[n], n),
5486                                    REG_NOTES (insn));
5487         }
5488     }
5489
5490   SET_REGNO_REG_SET (pbi->reg_live, regno);
5491   if (regno < FIRST_PSEUDO_REGISTER)
5492     {
5493       n = HARD_REGNO_NREGS (regno, GET_MODE (reg));
5494       while (--n > 0)
5495         SET_REGNO_REG_SET (pbi->reg_live, regno + n);
5496     }
5497
5498 #ifdef HAVE_conditional_execution
5499   /* If this is a conditional use, record that fact.  If it is later
5500      conditionally set, we'll know to kill the register.  */
5501   if (cond != NULL_RTX)
5502     {
5503       splay_tree_node node;
5504       struct reg_cond_life_info *rcli;
5505       rtx ncond;
5506
5507       if (some_was_live)
5508         {
5509           node = splay_tree_lookup (pbi->reg_cond_dead, regno);
5510           if (node == NULL)
5511             {
5512               /* The register was unconditionally live previously.
5513                  No need to do anything.  */
5514             }
5515           else
5516             {
5517               /* The register was conditionally live previously.
5518                  Subtract the new life cond from the old death cond.  */
5519               rcli = (struct reg_cond_life_info *) node->value;
5520               ncond = rcli->condition;
5521               ncond = nand_reg_cond (ncond, cond);
5522
5523               /* If the register is now unconditionally live, remove the
5524                  entry in the splay_tree.  */
5525               if (ncond == const0_rtx)
5526                 {
5527                   rcli->condition = NULL_RTX;
5528                   splay_tree_remove (pbi->reg_cond_dead, regno);
5529                 }
5530               else
5531                 {
5532                   rcli->condition = ncond;
5533                   SET_REGNO_REG_SET (pbi->reg_cond_reg, REGNO (XEXP (cond, 0)));
5534                 }
5535             }
5536         }
5537       else
5538         {
5539           /* The register was not previously live at all.  Record
5540              the condition under which it is still dead.  */
5541           rcli = (struct reg_cond_life_info *) xmalloc (sizeof (*rcli));
5542           rcli->condition = not_reg_cond (cond);
5543           splay_tree_insert (pbi->reg_cond_dead, regno,
5544                              (splay_tree_value) rcli);
5545
5546           SET_REGNO_REG_SET (pbi->reg_cond_reg, REGNO (XEXP (cond, 0)));
5547         }
5548     }
5549   else if (some_was_live)
5550     {
5551       splay_tree_node node;
5552       struct reg_cond_life_info *rcli;
5553
5554       node = splay_tree_lookup (pbi->reg_cond_dead, regno);
5555       if (node != NULL)
5556         {
5557           /* The register was conditionally live previously, but is now
5558              unconditionally so.  Remove it from the conditionally dead
5559              list, so that a conditional set won't cause us to think
5560              it dead.  */
5561           rcli = (struct reg_cond_life_info *) node->value;
5562           rcli->condition = NULL_RTX;
5563           splay_tree_remove (pbi->reg_cond_dead, regno);
5564         }
5565     }
5566
5567 #endif
5568 }
5569
5570 /* Scan expression X and store a 1-bit in NEW_LIVE for each reg it uses.
5571    This is done assuming the registers needed from X are those that
5572    have 1-bits in PBI->REG_LIVE.
5573
5574    INSN is the containing instruction.  If INSN is dead, this function
5575    is not called.  */
5576
5577 static void
5578 mark_used_regs (pbi, x, cond, insn)
5579      struct propagate_block_info *pbi;
5580      rtx x, cond, insn;
5581 {
5582   register RTX_CODE code;
5583   register int regno;
5584   int flags = pbi->flags;
5585
5586  retry:
5587   code = GET_CODE (x);
5588   switch (code)
5589     {
5590     case LABEL_REF:
5591     case SYMBOL_REF:
5592     case CONST_INT:
5593     case CONST:
5594     case CONST_DOUBLE:
5595     case PC:
5596     case ADDR_VEC:
5597     case ADDR_DIFF_VEC:
5598       return;
5599
5600 #ifdef HAVE_cc0
5601     case CC0:
5602       pbi->cc0_live = 1;
5603       return;
5604 #endif
5605
5606     case CLOBBER:
5607       /* If we are clobbering a MEM, mark any registers inside the address
5608          as being used.  */
5609       if (GET_CODE (XEXP (x, 0)) == MEM)
5610         mark_used_regs (pbi, XEXP (XEXP (x, 0), 0), cond, insn);
5611       return;
5612
5613     case MEM:
5614       /* Don't bother watching stores to mems if this is not the
5615          final pass.  We'll not be deleting dead stores this round.  */
5616       if (optimize && (flags & PROP_SCAN_DEAD_CODE))
5617         {
5618           /* Invalidate the data for the last MEM stored, but only if MEM is
5619              something that can be stored into.  */
5620           if (GET_CODE (XEXP (x, 0)) == SYMBOL_REF
5621               && CONSTANT_POOL_ADDRESS_P (XEXP (x, 0)))
5622             /* Needn't clear the memory set list.  */
5623             ;
5624           else
5625             {
5626               rtx temp = pbi->mem_set_list;
5627               rtx prev = NULL_RTX;
5628               rtx next;
5629
5630               while (temp)
5631                 {
5632                   next = XEXP (temp, 1);
5633                   if (anti_dependence (XEXP (temp, 0), x))
5634                     {
5635                       /* Splice temp out of the list.  */
5636                       if (prev)
5637                         XEXP (prev, 1) = next;
5638                       else
5639                         pbi->mem_set_list = next;
5640                       free_EXPR_LIST_node (temp);
5641                     }
5642                   else
5643                     prev = temp;
5644                   temp = next;
5645                 }
5646             }
5647
5648           /* If the memory reference had embedded side effects (autoincrement
5649              address modes.  Then we may need to kill some entries on the
5650              memory set list.  */
5651           if (insn)
5652             invalidate_mems_from_autoinc (pbi, insn);
5653         }
5654
5655 #ifdef AUTO_INC_DEC
5656       if (flags & PROP_AUTOINC)
5657         find_auto_inc (pbi, x, insn);
5658 #endif
5659       break;
5660
5661     case SUBREG:
5662 #ifdef CLASS_CANNOT_CHANGE_MODE
5663       if (GET_CODE (SUBREG_REG (x)) == REG
5664           && REGNO (SUBREG_REG (x)) >= FIRST_PSEUDO_REGISTER
5665           && CLASS_CANNOT_CHANGE_MODE_P (GET_MODE (x),
5666                                          GET_MODE (SUBREG_REG (x))))
5667         REG_CHANGES_MODE (REGNO (SUBREG_REG (x))) = 1;
5668 #endif
5669
5670       /* While we're here, optimize this case.  */
5671       x = SUBREG_REG (x);
5672       if (GET_CODE (x) != REG)
5673         goto retry;
5674       /* Fall through.  */
5675
5676     case REG:
5677       /* See a register other than being set => mark it as needed.  */
5678       mark_used_reg (pbi, x, cond, insn);
5679       return;
5680
5681     case SET:
5682       {
5683         register rtx testreg = SET_DEST (x);
5684         int mark_dest = 0;
5685
5686         /* If storing into MEM, don't show it as being used.  But do
5687            show the address as being used.  */
5688         if (GET_CODE (testreg) == MEM)
5689           {
5690 #ifdef AUTO_INC_DEC
5691             if (flags & PROP_AUTOINC)
5692               find_auto_inc (pbi, testreg, insn);
5693 #endif
5694             mark_used_regs (pbi, XEXP (testreg, 0), cond, insn);
5695             mark_used_regs (pbi, SET_SRC (x), cond, insn);
5696             return;
5697           }
5698
5699         /* Storing in STRICT_LOW_PART is like storing in a reg
5700            in that this SET might be dead, so ignore it in TESTREG.
5701            but in some other ways it is like using the reg.
5702
5703            Storing in a SUBREG or a bit field is like storing the entire
5704            register in that if the register's value is not used
5705            then this SET is not needed.  */
5706         while (GET_CODE (testreg) == STRICT_LOW_PART
5707                || GET_CODE (testreg) == ZERO_EXTRACT
5708                || GET_CODE (testreg) == SIGN_EXTRACT
5709                || GET_CODE (testreg) == SUBREG)
5710           {
5711 #ifdef CLASS_CANNOT_CHANGE_MODE
5712             if (GET_CODE (testreg) == SUBREG
5713                 && GET_CODE (SUBREG_REG (testreg)) == REG
5714                 && REGNO (SUBREG_REG (testreg)) >= FIRST_PSEUDO_REGISTER
5715                 && CLASS_CANNOT_CHANGE_MODE_P (GET_MODE (SUBREG_REG (testreg)),
5716                                                GET_MODE (testreg)))
5717               REG_CHANGES_MODE (REGNO (SUBREG_REG (testreg))) = 1;
5718 #endif
5719
5720             /* Modifying a single register in an alternate mode
5721                does not use any of the old value.  But these other
5722                ways of storing in a register do use the old value.  */
5723             if (GET_CODE (testreg) == SUBREG
5724                 && !(REG_SIZE (SUBREG_REG (testreg)) > REG_SIZE (testreg)))
5725               ;
5726             else
5727               mark_dest = 1;
5728
5729             testreg = XEXP (testreg, 0);
5730           }
5731
5732         /* If this is a store into a register, recursively scan the
5733            value being stored.  */
5734
5735         if ((GET_CODE (testreg) == PARALLEL
5736              && GET_MODE (testreg) == BLKmode)
5737             || (GET_CODE (testreg) == REG
5738                 && (regno = REGNO (testreg),
5739                     ! (regno == FRAME_POINTER_REGNUM
5740                        && (! reload_completed || frame_pointer_needed)))
5741 #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
5742                 && ! (regno == HARD_FRAME_POINTER_REGNUM
5743                       && (! reload_completed || frame_pointer_needed))
5744 #endif
5745 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
5746                 && ! (regno == ARG_POINTER_REGNUM && fixed_regs[regno])
5747 #endif
5748                 ))
5749           {
5750             if (mark_dest)
5751               mark_used_regs (pbi, SET_DEST (x), cond, insn);
5752             mark_used_regs (pbi, SET_SRC (x), cond, insn);
5753             return;
5754           }
5755       }
5756       break;
5757
5758     case ASM_OPERANDS:
5759     case UNSPEC_VOLATILE:
5760     case TRAP_IF:
5761     case ASM_INPUT:
5762       {
5763         /* Traditional and volatile asm instructions must be considered to use
5764            and clobber all hard registers, all pseudo-registers and all of
5765            memory.  So must TRAP_IF and UNSPEC_VOLATILE operations.
5766
5767            Consider for instance a volatile asm that changes the fpu rounding
5768            mode.  An insn should not be moved across this even if it only uses
5769            pseudo-regs because it might give an incorrectly rounded result.
5770
5771            ?!? Unfortunately, marking all hard registers as live causes massive
5772            problems for the register allocator and marking all pseudos as live
5773            creates mountains of uninitialized variable warnings.
5774
5775            So for now, just clear the memory set list and mark any regs
5776            we can find in ASM_OPERANDS as used.  */
5777         if (code != ASM_OPERANDS || MEM_VOLATILE_P (x))
5778           free_EXPR_LIST_list (&pbi->mem_set_list);
5779
5780         /* For all ASM_OPERANDS, we must traverse the vector of input operands.
5781            We can not just fall through here since then we would be confused
5782            by the ASM_INPUT rtx inside ASM_OPERANDS, which do not indicate
5783            traditional asms unlike their normal usage.  */
5784         if (code == ASM_OPERANDS)
5785           {
5786             int j;
5787
5788             for (j = 0; j < ASM_OPERANDS_INPUT_LENGTH (x); j++)
5789               mark_used_regs (pbi, ASM_OPERANDS_INPUT (x, j), cond, insn);
5790           }
5791         break;
5792       }
5793
5794     case COND_EXEC:
5795       if (cond != NULL_RTX)
5796         abort ();
5797
5798       mark_used_regs (pbi, COND_EXEC_TEST (x), NULL_RTX, insn);
5799
5800       cond = COND_EXEC_TEST (x);
5801       x = COND_EXEC_CODE (x);
5802       goto retry;
5803
5804     case PHI:
5805       /* We _do_not_ want to scan operands of phi nodes.  Operands of
5806          a phi function are evaluated only when control reaches this
5807          block along a particular edge.  Therefore, regs that appear
5808          as arguments to phi should not be added to the global live at
5809          start.  */
5810       return;
5811
5812     default:
5813       break;
5814     }
5815
5816   /* Recursively scan the operands of this expression.  */
5817
5818   {
5819     register const char *fmt = GET_RTX_FORMAT (code);
5820     register int i;
5821
5822     for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
5823       {
5824         if (fmt[i] == 'e')
5825           {
5826             /* Tail recursive case: save a function call level.  */
5827             if (i == 0)
5828               {
5829                 x = XEXP (x, 0);
5830                 goto retry;
5831               }
5832             mark_used_regs (pbi, XEXP (x, i), cond, insn);
5833           }
5834         else if (fmt[i] == 'E')
5835           {
5836             register int j;
5837             for (j = 0; j < XVECLEN (x, i); j++)
5838               mark_used_regs (pbi, XVECEXP (x, i, j), cond, insn);
5839           }
5840       }
5841   }
5842 }
5843 \f
5844 #ifdef AUTO_INC_DEC
5845
5846 static int
5847 try_pre_increment_1 (pbi, insn)
5848      struct propagate_block_info *pbi;
5849      rtx insn;
5850 {
5851   /* Find the next use of this reg.  If in same basic block,
5852      make it do pre-increment or pre-decrement if appropriate.  */
5853   rtx x = single_set (insn);
5854   HOST_WIDE_INT amount = ((GET_CODE (SET_SRC (x)) == PLUS ? 1 : -1)
5855                           * INTVAL (XEXP (SET_SRC (x), 1)));
5856   int regno = REGNO (SET_DEST (x));
5857   rtx y = pbi->reg_next_use[regno];
5858   if (y != 0
5859       && SET_DEST (x) != stack_pointer_rtx
5860       && BLOCK_NUM (y) == BLOCK_NUM (insn)
5861       /* Don't do this if the reg dies, or gets set in y; a standard addressing
5862          mode would be better.  */
5863       && ! dead_or_set_p (y, SET_DEST (x))
5864       && try_pre_increment (y, SET_DEST (x), amount))
5865     {
5866       /* We have found a suitable auto-increment and already changed
5867          insn Y to do it.  So flush this increment instruction.  */
5868       propagate_block_delete_insn (pbi->bb, insn);
5869
5870       /* Count a reference to this reg for the increment insn we are
5871          deleting.  When a reg is incremented, spilling it is worse,
5872          so we want to make that less likely.  */
5873       if (regno >= FIRST_PSEUDO_REGISTER)
5874         {
5875           REG_N_REFS (regno) += (optimize_size ? 1
5876                                  : pbi->bb->loop_depth + 1);
5877           REG_N_SETS (regno)++;
5878         }
5879
5880       /* Flush any remembered memories depending on the value of
5881          the incremented register.  */
5882       invalidate_mems_from_set (pbi, SET_DEST (x));
5883
5884       return 1;
5885     }
5886   return 0;
5887 }
5888
5889 /* Try to change INSN so that it does pre-increment or pre-decrement
5890    addressing on register REG in order to add AMOUNT to REG.
5891    AMOUNT is negative for pre-decrement.
5892    Returns 1 if the change could be made.
5893    This checks all about the validity of the result of modifying INSN.  */
5894
5895 static int
5896 try_pre_increment (insn, reg, amount)
5897      rtx insn, reg;
5898      HOST_WIDE_INT amount;
5899 {
5900   register rtx use;
5901
5902   /* Nonzero if we can try to make a pre-increment or pre-decrement.
5903      For example, addl $4,r1; movl (r1),... can become movl +(r1),...  */
5904   int pre_ok = 0;
5905   /* Nonzero if we can try to make a post-increment or post-decrement.
5906      For example, addl $4,r1; movl -4(r1),... can become movl (r1)+,...
5907      It is possible for both PRE_OK and POST_OK to be nonzero if the machine
5908      supports both pre-inc and post-inc, or both pre-dec and post-dec.  */
5909   int post_ok = 0;
5910
5911   /* Nonzero if the opportunity actually requires post-inc or post-dec.  */
5912   int do_post = 0;
5913
5914   /* From the sign of increment, see which possibilities are conceivable
5915      on this target machine.  */
5916   if (HAVE_PRE_INCREMENT && amount > 0)
5917     pre_ok = 1;
5918   if (HAVE_POST_INCREMENT && amount > 0)
5919     post_ok = 1;
5920
5921   if (HAVE_PRE_DECREMENT && amount < 0)
5922     pre_ok = 1;
5923   if (HAVE_POST_DECREMENT && amount < 0)
5924     post_ok = 1;
5925
5926   if (! (pre_ok || post_ok))
5927     return 0;
5928
5929   /* It is not safe to add a side effect to a jump insn
5930      because if the incremented register is spilled and must be reloaded
5931      there would be no way to store the incremented value back in memory.  */
5932
5933   if (GET_CODE (insn) == JUMP_INSN)
5934     return 0;
5935
5936   use = 0;
5937   if (pre_ok)
5938     use = find_use_as_address (PATTERN (insn), reg, 0);
5939   if (post_ok && (use == 0 || use == (rtx) 1))
5940     {
5941       use = find_use_as_address (PATTERN (insn), reg, -amount);
5942       do_post = 1;
5943     }
5944
5945   if (use == 0 || use == (rtx) 1)
5946     return 0;
5947
5948   if (GET_MODE_SIZE (GET_MODE (use)) != (amount > 0 ? amount : - amount))
5949     return 0;
5950
5951   /* See if this combination of instruction and addressing mode exists.  */
5952   if (! validate_change (insn, &XEXP (use, 0),
5953                          gen_rtx_fmt_e (amount > 0
5954                                         ? (do_post ? POST_INC : PRE_INC)
5955                                         : (do_post ? POST_DEC : PRE_DEC),
5956                                         Pmode, reg), 0))
5957     return 0;
5958
5959   /* Record that this insn now has an implicit side effect on X.  */
5960   REG_NOTES (insn) = alloc_EXPR_LIST (REG_INC, reg, REG_NOTES (insn));
5961   return 1;
5962 }
5963
5964 #endif /* AUTO_INC_DEC */
5965 \f
5966 /* Find the place in the rtx X where REG is used as a memory address.
5967    Return the MEM rtx that so uses it.
5968    If PLUSCONST is nonzero, search instead for a memory address equivalent to
5969    (plus REG (const_int PLUSCONST)).
5970
5971    If such an address does not appear, return 0.
5972    If REG appears more than once, or is used other than in such an address,
5973    return (rtx)1.  */
5974
5975 rtx
5976 find_use_as_address (x, reg, plusconst)
5977      register rtx x;
5978      rtx reg;
5979      HOST_WIDE_INT plusconst;
5980 {
5981   enum rtx_code code = GET_CODE (x);
5982   const char *fmt = GET_RTX_FORMAT (code);
5983   register int i;
5984   register rtx value = 0;
5985   register rtx tem;
5986
5987   if (code == MEM && XEXP (x, 0) == reg && plusconst == 0)
5988     return x;
5989
5990   if (code == MEM && GET_CODE (XEXP (x, 0)) == PLUS
5991       && XEXP (XEXP (x, 0), 0) == reg
5992       && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
5993       && INTVAL (XEXP (XEXP (x, 0), 1)) == plusconst)
5994     return x;
5995
5996   if (code == SIGN_EXTRACT || code == ZERO_EXTRACT)
5997     {
5998       /* If REG occurs inside a MEM used in a bit-field reference,
5999          that is unacceptable.  */
6000       if (find_use_as_address (XEXP (x, 0), reg, 0) != 0)
6001         return (rtx) (HOST_WIDE_INT) 1;
6002     }
6003
6004   if (x == reg)
6005     return (rtx) (HOST_WIDE_INT) 1;
6006
6007   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
6008     {
6009       if (fmt[i] == 'e')
6010         {
6011           tem = find_use_as_address (XEXP (x, i), reg, plusconst);
6012           if (value == 0)
6013             value = tem;
6014           else if (tem != 0)
6015             return (rtx) (HOST_WIDE_INT) 1;
6016         }
6017       else if (fmt[i] == 'E')
6018         {
6019           register int j;
6020           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
6021             {
6022               tem = find_use_as_address (XVECEXP (x, i, j), reg, plusconst);
6023               if (value == 0)
6024                 value = tem;
6025               else if (tem != 0)
6026                 return (rtx) (HOST_WIDE_INT) 1;
6027             }
6028         }
6029     }
6030
6031   return value;
6032 }
6033 \f
6034 /* Write information about registers and basic blocks into FILE.
6035    This is part of making a debugging dump.  */
6036
6037 void
6038 dump_regset (r, outf)
6039      regset r;
6040      FILE *outf;
6041 {
6042   int i;
6043   if (r == NULL)
6044     {
6045       fputs (" (nil)", outf);
6046       return;
6047     }
6048
6049   EXECUTE_IF_SET_IN_REG_SET (r, 0, i,
6050     {
6051       fprintf (outf, " %d", i);
6052       if (i < FIRST_PSEUDO_REGISTER)
6053         fprintf (outf, " [%s]",
6054                  reg_names[i]);
6055     });
6056 }
6057
6058 void
6059 debug_regset (r)
6060      regset r;
6061 {
6062   dump_regset (r, stderr);
6063   putc ('\n', stderr);
6064 }
6065
6066 void
6067 dump_flow_info (file)
6068      FILE *file;
6069 {
6070   register int i;
6071   static const char * const reg_class_names[] = REG_CLASS_NAMES;
6072
6073   fprintf (file, "%d registers.\n", max_regno);
6074   for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
6075     if (REG_N_REFS (i))
6076       {
6077         enum reg_class class, altclass;
6078         fprintf (file, "\nRegister %d used %d times across %d insns",
6079                  i, REG_N_REFS (i), REG_LIVE_LENGTH (i));
6080         if (REG_BASIC_BLOCK (i) >= 0)
6081           fprintf (file, " in block %d", REG_BASIC_BLOCK (i));
6082         if (REG_N_SETS (i))
6083           fprintf (file, "; set %d time%s", REG_N_SETS (i),
6084                    (REG_N_SETS (i) == 1) ? "" : "s");
6085         if (REG_USERVAR_P (regno_reg_rtx[i]))
6086           fprintf (file, "; user var");
6087         if (REG_N_DEATHS (i) != 1)
6088           fprintf (file, "; dies in %d places", REG_N_DEATHS (i));
6089         if (REG_N_CALLS_CROSSED (i) == 1)
6090           fprintf (file, "; crosses 1 call");
6091         else if (REG_N_CALLS_CROSSED (i))
6092           fprintf (file, "; crosses %d calls", REG_N_CALLS_CROSSED (i));
6093         if (PSEUDO_REGNO_BYTES (i) != UNITS_PER_WORD)
6094           fprintf (file, "; %d bytes", PSEUDO_REGNO_BYTES (i));
6095         class = reg_preferred_class (i);
6096         altclass = reg_alternate_class (i);
6097         if (class != GENERAL_REGS || altclass != ALL_REGS)
6098           {
6099             if (altclass == ALL_REGS || class == ALL_REGS)
6100               fprintf (file, "; pref %s", reg_class_names[(int) class]);
6101             else if (altclass == NO_REGS)
6102               fprintf (file, "; %s or none", reg_class_names[(int) class]);
6103             else
6104               fprintf (file, "; pref %s, else %s",
6105                        reg_class_names[(int) class],
6106                        reg_class_names[(int) altclass]);
6107           }
6108         if (REG_POINTER (regno_reg_rtx[i]))
6109           fprintf (file, "; pointer");
6110         fprintf (file, ".\n");
6111       }
6112
6113   fprintf (file, "\n%d basic blocks, %d edges.\n", n_basic_blocks, n_edges);
6114   for (i = 0; i < n_basic_blocks; i++)
6115     {
6116       register basic_block bb = BASIC_BLOCK (i);
6117       register edge e;
6118
6119       fprintf (file, "\nBasic block %d: first insn %d, last %d, loop_depth %d, count %d.\n",
6120                i, INSN_UID (bb->head), INSN_UID (bb->end), bb->loop_depth, bb->count);
6121
6122       fprintf (file, "Predecessors: ");
6123       for (e = bb->pred; e; e = e->pred_next)
6124         dump_edge_info (file, e, 0);
6125
6126       fprintf (file, "\nSuccessors: ");
6127       for (e = bb->succ; e; e = e->succ_next)
6128         dump_edge_info (file, e, 1);
6129
6130       fprintf (file, "\nRegisters live at start:");
6131       dump_regset (bb->global_live_at_start, file);
6132
6133       fprintf (file, "\nRegisters live at end:");
6134       dump_regset (bb->global_live_at_end, file);
6135
6136       putc ('\n', file);
6137     }
6138
6139   putc ('\n', file);
6140 }
6141
6142 void
6143 debug_flow_info ()
6144 {
6145   dump_flow_info (stderr);
6146 }
6147
6148 static void
6149 dump_edge_info (file, e, do_succ)
6150      FILE *file;
6151      edge e;
6152      int do_succ;
6153 {
6154   basic_block side = (do_succ ? e->dest : e->src);
6155
6156   if (side == ENTRY_BLOCK_PTR)
6157     fputs (" ENTRY", file);
6158   else if (side == EXIT_BLOCK_PTR)
6159     fputs (" EXIT", file);
6160   else
6161     fprintf (file, " %d", side->index);
6162
6163   if (e->count)
6164     fprintf (file, " count:%d", e->count);
6165
6166   if (e->flags)
6167     {
6168       static const char * const bitnames[] = {
6169         "fallthru", "crit", "ab", "abcall", "eh", "fake"
6170       };
6171       int comma = 0;
6172       int i, flags = e->flags;
6173
6174       fputc (' ', file);
6175       fputc ('(', file);
6176       for (i = 0; flags; i++)
6177         if (flags & (1 << i))
6178           {
6179             flags &= ~(1 << i);
6180
6181             if (comma)
6182               fputc (',', file);
6183             if (i < (int) ARRAY_SIZE (bitnames))
6184               fputs (bitnames[i], file);
6185             else
6186               fprintf (file, "%d", i);
6187             comma = 1;
6188           }
6189       fputc (')', file);
6190     }
6191 }
6192 \f
6193 /* Print out one basic block with live information at start and end.  */
6194
6195 void
6196 dump_bb (bb, outf)
6197      basic_block bb;
6198      FILE *outf;
6199 {
6200   rtx insn;
6201   rtx last;
6202   edge e;
6203
6204   fprintf (outf, ";; Basic block %d, loop depth %d, count %d",
6205            bb->index, bb->loop_depth, bb->count);
6206   if (bb->eh_beg != -1 || bb->eh_end != -1)
6207     fprintf (outf, ", eh regions %d/%d", bb->eh_beg, bb->eh_end);
6208   putc ('\n', outf);
6209
6210   fputs (";; Predecessors: ", outf);
6211   for (e = bb->pred; e; e = e->pred_next)
6212     dump_edge_info (outf, e, 0);
6213   putc ('\n', outf);
6214
6215   fputs (";; Registers live at start:", outf);
6216   dump_regset (bb->global_live_at_start, outf);
6217   putc ('\n', outf);
6218
6219   for (insn = bb->head, last = NEXT_INSN (bb->end);
6220        insn != last;
6221        insn = NEXT_INSN (insn))
6222     print_rtl_single (outf, insn);
6223
6224   fputs (";; Registers live at end:", outf);
6225   dump_regset (bb->global_live_at_end, outf);
6226   putc ('\n', outf);
6227
6228   fputs (";; Successors: ", outf);
6229   for (e = bb->succ; e; e = e->succ_next)
6230     dump_edge_info (outf, e, 1);
6231   putc ('\n', outf);
6232 }
6233
6234 void
6235 debug_bb (bb)
6236      basic_block bb;
6237 {
6238   dump_bb (bb, stderr);
6239 }
6240
6241 void
6242 debug_bb_n (n)
6243      int n;
6244 {
6245   dump_bb (BASIC_BLOCK (n), stderr);
6246 }
6247
6248 /* Like print_rtl, but also print out live information for the start of each
6249    basic block.  */
6250
6251 void
6252 print_rtl_with_bb (outf, rtx_first)
6253      FILE *outf;
6254      rtx rtx_first;
6255 {
6256   register rtx tmp_rtx;
6257
6258   if (rtx_first == 0)
6259     fprintf (outf, "(nil)\n");
6260   else
6261     {
6262       int i;
6263       enum bb_state { NOT_IN_BB, IN_ONE_BB, IN_MULTIPLE_BB };
6264       int max_uid = get_max_uid ();
6265       basic_block *start = (basic_block *)
6266         xcalloc (max_uid, sizeof (basic_block));
6267       basic_block *end = (basic_block *)
6268         xcalloc (max_uid, sizeof (basic_block));
6269       enum bb_state *in_bb_p = (enum bb_state *)
6270         xcalloc (max_uid, sizeof (enum bb_state));
6271
6272       for (i = n_basic_blocks - 1; i >= 0; i--)
6273         {
6274           basic_block bb = BASIC_BLOCK (i);
6275           rtx x;
6276
6277           start[INSN_UID (bb->head)] = bb;
6278           end[INSN_UID (bb->end)] = bb;
6279           for (x = bb->head; x != NULL_RTX; x = NEXT_INSN (x))
6280             {
6281               enum bb_state state = IN_MULTIPLE_BB;
6282               if (in_bb_p[INSN_UID (x)] == NOT_IN_BB)
6283                 state = IN_ONE_BB;
6284               in_bb_p[INSN_UID (x)] = state;
6285
6286               if (x == bb->end)
6287                 break;
6288             }
6289         }
6290
6291       for (tmp_rtx = rtx_first; NULL != tmp_rtx; tmp_rtx = NEXT_INSN (tmp_rtx))
6292         {
6293           int did_output;
6294           basic_block bb;
6295
6296           if ((bb = start[INSN_UID (tmp_rtx)]) != NULL)
6297             {
6298               fprintf (outf, ";; Start of basic block %d, registers live:",
6299                        bb->index);
6300               dump_regset (bb->global_live_at_start, outf);
6301               putc ('\n', outf);
6302             }
6303
6304           if (in_bb_p[INSN_UID (tmp_rtx)] == NOT_IN_BB
6305               && GET_CODE (tmp_rtx) != NOTE
6306               && GET_CODE (tmp_rtx) != BARRIER)
6307             fprintf (outf, ";; Insn is not within a basic block\n");
6308           else if (in_bb_p[INSN_UID (tmp_rtx)] == IN_MULTIPLE_BB)
6309             fprintf (outf, ";; Insn is in multiple basic blocks\n");
6310
6311           did_output = print_rtl_single (outf, tmp_rtx);
6312
6313           if ((bb = end[INSN_UID (tmp_rtx)]) != NULL)
6314             {
6315               fprintf (outf, ";; End of basic block %d, registers live:\n",
6316                        bb->index);
6317               dump_regset (bb->global_live_at_end, outf);
6318               putc ('\n', outf);
6319             }
6320
6321           if (did_output)
6322             putc ('\n', outf);
6323         }
6324
6325       free (start);
6326       free (end);
6327       free (in_bb_p);
6328     }
6329
6330   if (current_function_epilogue_delay_list != 0)
6331     {
6332       fprintf (outf, "\n;; Insns in epilogue delay list:\n\n");
6333       for (tmp_rtx = current_function_epilogue_delay_list; tmp_rtx != 0;
6334            tmp_rtx = XEXP (tmp_rtx, 1))
6335         print_rtl_single (outf, XEXP (tmp_rtx, 0));
6336     }
6337 }
6338
6339 /* Dump the rtl into the current debugging dump file, then abort.  */
6340 static void
6341 print_rtl_and_abort ()
6342 {
6343   if (rtl_dump_file)
6344     {
6345       print_rtl_with_bb (rtl_dump_file, get_insns ());
6346       fclose (rtl_dump_file);
6347     }
6348   abort ();
6349 }
6350
6351 /* Recompute register set/reference counts immediately prior to register
6352    allocation.
6353
6354    This avoids problems with set/reference counts changing to/from values
6355    which have special meanings to the register allocators.
6356
6357    Additionally, the reference counts are the primary component used by the
6358    register allocators to prioritize pseudos for allocation to hard regs.
6359    More accurate reference counts generally lead to better register allocation.
6360
6361    F is the first insn to be scanned.
6362
6363    LOOP_STEP denotes how much loop_depth should be incremented per
6364    loop nesting level in order to increase the ref count more for
6365    references in a loop.
6366
6367    It might be worthwhile to update REG_LIVE_LENGTH, REG_BASIC_BLOCK and
6368    possibly other information which is used by the register allocators.  */
6369
6370 void
6371 recompute_reg_usage (f, loop_step)
6372      rtx f ATTRIBUTE_UNUSED;
6373      int loop_step ATTRIBUTE_UNUSED;
6374 {
6375   allocate_reg_life_data ();
6376   update_life_info (NULL, UPDATE_LIFE_LOCAL, PROP_REG_INFO);
6377 }
6378
6379 /* Optionally removes all the REG_DEAD and REG_UNUSED notes from a set of
6380    blocks.  If BLOCKS is NULL, assume the universal set.  Returns a count
6381    of the number of registers that died.  */
6382
6383 int
6384 count_or_remove_death_notes (blocks, kill)
6385      sbitmap blocks;
6386      int kill;
6387 {
6388   int i, count = 0;
6389
6390   for (i = n_basic_blocks - 1; i >= 0; --i)
6391     {
6392       basic_block bb;
6393       rtx insn;
6394
6395       if (blocks && ! TEST_BIT (blocks, i))
6396         continue;
6397
6398       bb = BASIC_BLOCK (i);
6399
6400       for (insn = bb->head;; insn = NEXT_INSN (insn))
6401         {
6402           if (INSN_P (insn))
6403             {
6404               rtx *pprev = &REG_NOTES (insn);
6405               rtx link = *pprev;
6406
6407               while (link)
6408                 {
6409                   switch (REG_NOTE_KIND (link))
6410                     {
6411                     case REG_DEAD:
6412                       if (GET_CODE (XEXP (link, 0)) == REG)
6413                         {
6414                           rtx reg = XEXP (link, 0);
6415                           int n;
6416
6417                           if (REGNO (reg) >= FIRST_PSEUDO_REGISTER)
6418                             n = 1;
6419                           else
6420                             n = HARD_REGNO_NREGS (REGNO (reg), GET_MODE (reg));
6421                           count += n;
6422                         }
6423                       /* Fall through.  */
6424
6425                     case REG_UNUSED:
6426                       if (kill)
6427                         {
6428                           rtx next = XEXP (link, 1);
6429                           free_EXPR_LIST_node (link);
6430                           *pprev = link = next;
6431                           break;
6432                         }
6433                       /* Fall through.  */
6434
6435                     default:
6436                       pprev = &XEXP (link, 1);
6437                       link = *pprev;
6438                       break;
6439                     }
6440                 }
6441             }
6442
6443           if (insn == bb->end)
6444             break;
6445         }
6446     }
6447
6448   return count;
6449 }
6450
6451
6452 /* Update insns block within BB.  */
6453
6454 void 
6455 update_bb_for_insn (bb)
6456      basic_block bb;
6457 {
6458   rtx insn;
6459
6460   if (! basic_block_for_insn)
6461     return;
6462
6463   for (insn = bb->head; ; insn = NEXT_INSN (insn))
6464     {
6465       set_block_for_insn (insn, bb);
6466
6467       if (insn == bb->end)
6468         break;
6469     }
6470 }
6471
6472
6473 /* Record INSN's block as BB.  */
6474
6475 void
6476 set_block_for_insn (insn, bb)
6477      rtx insn;
6478      basic_block bb;
6479 {
6480   size_t uid = INSN_UID (insn);
6481   if (uid >= basic_block_for_insn->num_elements)
6482     {
6483       int new_size;
6484
6485       /* Add one-eighth the size so we don't keep calling xrealloc.  */
6486       new_size = uid + (uid + 7) / 8;
6487
6488       VARRAY_GROW (basic_block_for_insn, new_size);
6489     }
6490   VARRAY_BB (basic_block_for_insn, uid) = bb;
6491 }
6492
6493 /* Record INSN's block number as BB.  */
6494 /* ??? This has got to go.  */
6495
6496 void
6497 set_block_num (insn, bb)
6498      rtx insn;
6499      int bb;
6500 {
6501   set_block_for_insn (insn, BASIC_BLOCK (bb));
6502 }
6503 \f
6504 /* Verify the CFG consistency.  This function check some CFG invariants and
6505    aborts when something is wrong.  Hope that this function will help to
6506    convert many optimization passes to preserve CFG consistent.
6507
6508    Currently it does following checks:
6509
6510    - test head/end pointers
6511    - overlapping of basic blocks
6512    - edge list corectness
6513    - headers of basic blocks (the NOTE_INSN_BASIC_BLOCK note)
6514    - tails of basic blocks (ensure that boundary is necesary)
6515    - scans body of the basic block for JUMP_INSN, CODE_LABEL
6516      and NOTE_INSN_BASIC_BLOCK
6517    - check that all insns are in the basic blocks
6518    (except the switch handling code, barriers and notes)
6519    - check that all returns are followed by barriers
6520
6521    In future it can be extended check a lot of other stuff as well
6522    (reachability of basic blocks, life information, etc. etc.).  */
6523
6524 void
6525 verify_flow_info ()
6526 {
6527   const int max_uid = get_max_uid ();
6528   const rtx rtx_first = get_insns ();
6529   rtx last_head = get_last_insn ();
6530   basic_block *bb_info;
6531   rtx x;
6532   int i, last_bb_num_seen, num_bb_notes, err = 0;
6533
6534   bb_info = (basic_block *) xcalloc (max_uid, sizeof (basic_block));
6535
6536   for (i = n_basic_blocks - 1; i >= 0; i--)
6537     {
6538       basic_block bb = BASIC_BLOCK (i);
6539       rtx head = bb->head;
6540       rtx end = bb->end;
6541
6542       /* Verify the end of the basic block is in the INSN chain.  */
6543       for (x = last_head; x != NULL_RTX; x = PREV_INSN (x))
6544         if (x == end)
6545           break;
6546       if (!x)
6547         {
6548           error ("End insn %d for block %d not found in the insn stream.",
6549                  INSN_UID (end), bb->index);
6550           err = 1;
6551         }
6552
6553       /* Work backwards from the end to the head of the basic block
6554          to verify the head is in the RTL chain.  */
6555       for (; x != NULL_RTX; x = PREV_INSN (x))
6556         {
6557           /* While walking over the insn chain, verify insns appear
6558              in only one basic block and initialize the BB_INFO array
6559              used by other passes.  */
6560           if (bb_info[INSN_UID (x)] != NULL)
6561             {
6562               error ("Insn %d is in multiple basic blocks (%d and %d)",
6563                      INSN_UID (x), bb->index, bb_info[INSN_UID (x)]->index);
6564               err = 1;
6565             }
6566           bb_info[INSN_UID (x)] = bb;
6567
6568           if (x == head)
6569             break;
6570         }
6571       if (!x)
6572         {
6573           error ("Head insn %d for block %d not found in the insn stream.",
6574                  INSN_UID (head), bb->index);
6575           err = 1;
6576         }
6577
6578       last_head = x;
6579     }
6580
6581   /* Now check the basic blocks (boundaries etc.) */
6582   for (i = n_basic_blocks - 1; i >= 0; i--)
6583     {
6584       basic_block bb = BASIC_BLOCK (i);
6585       /* Check corectness of edge lists */
6586       edge e;
6587
6588       e = bb->succ;
6589       while (e)
6590         {
6591           if (e->src != bb)
6592             {
6593               fprintf (stderr,
6594                        "verify_flow_info: Basic block %d succ edge is corrupted\n",
6595                        bb->index);
6596               fprintf (stderr, "Predecessor: ");
6597               dump_edge_info (stderr, e, 0);
6598               fprintf (stderr, "\nSuccessor: ");
6599               dump_edge_info (stderr, e, 1);
6600               fflush (stderr);
6601               err = 1;
6602             }
6603           if (e->dest != EXIT_BLOCK_PTR)
6604             {
6605               edge e2 = e->dest->pred;
6606               while (e2 && e2 != e)
6607                 e2 = e2->pred_next;
6608               if (!e2)
6609                 {
6610                   error ("Basic block %i edge lists are corrupted", bb->index);
6611                   err = 1;
6612                 }
6613             }
6614           e = e->succ_next;
6615         }
6616
6617       e = bb->pred;
6618       while (e)
6619         {
6620           if (e->dest != bb)
6621             {
6622               error ("Basic block %d pred edge is corrupted", bb->index);
6623               fputs ("Predecessor: ", stderr);
6624               dump_edge_info (stderr, e, 0);
6625               fputs ("\nSuccessor: ", stderr);
6626               dump_edge_info (stderr, e, 1);
6627               fputc ('\n', stderr);
6628               err = 1;
6629             }
6630           if (e->src != ENTRY_BLOCK_PTR)
6631             {
6632               edge e2 = e->src->succ;
6633               while (e2 && e2 != e)
6634                 e2 = e2->succ_next;
6635               if (!e2)
6636                 {
6637                   error ("Basic block %i edge lists are corrupted", bb->index);
6638                   err = 1;
6639                 }
6640             }
6641           e = e->pred_next;
6642         }
6643
6644       /* OK pointers are correct.  Now check the header of basic
6645          block.  It ought to contain optional CODE_LABEL followed
6646          by NOTE_BASIC_BLOCK.  */
6647       x = bb->head;
6648       if (GET_CODE (x) == CODE_LABEL)
6649         {
6650           if (bb->end == x)
6651             {
6652               error ("NOTE_INSN_BASIC_BLOCK is missing for block %d",
6653                      bb->index);
6654               err = 1;
6655             }
6656           x = NEXT_INSN (x);
6657         }
6658       if (!NOTE_INSN_BASIC_BLOCK_P (x) || NOTE_BASIC_BLOCK (x) != bb)
6659         {
6660           error ("NOTE_INSN_BASIC_BLOCK is missing for block %d\n",
6661                  bb->index);
6662           err = 1;
6663         }
6664
6665       if (bb->end == x)
6666         {
6667           /* Do checks for empty blocks here */
6668         }
6669       else
6670         {
6671           x = NEXT_INSN (x);
6672           while (x)
6673             {
6674               if (NOTE_INSN_BASIC_BLOCK_P (x))
6675                 {
6676                   error ("NOTE_INSN_BASIC_BLOCK %d in the middle of basic block %d",
6677                          INSN_UID (x), bb->index);
6678                   err = 1;
6679                 }
6680
6681               if (x == bb->end)
6682                 break;
6683
6684               if (GET_CODE (x) == JUMP_INSN
6685                   || GET_CODE (x) == CODE_LABEL
6686                   || GET_CODE (x) == BARRIER)
6687                 {
6688                   error ("In basic block %d:", bb->index);
6689                   fatal_insn ("Flow control insn inside a basic block", x);
6690                 }
6691
6692               x = NEXT_INSN (x);
6693             }
6694         }
6695     }
6696
6697   last_bb_num_seen = -1;
6698   num_bb_notes = 0;
6699   x = rtx_first;
6700   while (x)
6701     {
6702       if (NOTE_INSN_BASIC_BLOCK_P (x))
6703         {
6704           basic_block bb = NOTE_BASIC_BLOCK (x);
6705           num_bb_notes++;
6706           if (bb->index != last_bb_num_seen + 1)
6707             fatal ("Basic blocks not numbered consecutively");
6708           last_bb_num_seen = bb->index;
6709         }
6710
6711       if (!bb_info[INSN_UID (x)])
6712         {
6713           switch (GET_CODE (x))
6714             {
6715             case BARRIER:
6716             case NOTE:
6717               break;
6718
6719             case CODE_LABEL:
6720               /* An addr_vec is placed outside any block block.  */
6721               if (NEXT_INSN (x)
6722                   && GET_CODE (NEXT_INSN (x)) == JUMP_INSN
6723                   && (GET_CODE (PATTERN (NEXT_INSN (x))) == ADDR_DIFF_VEC
6724                       || GET_CODE (PATTERN (NEXT_INSN (x))) == ADDR_VEC))
6725                 {
6726                   x = NEXT_INSN (x);
6727                 }
6728
6729               /* But in any case, non-deletable labels can appear anywhere.  */
6730               break;
6731
6732             default:
6733               fatal_insn ("Insn outside basic block", x);
6734             }
6735         }
6736
6737       if (INSN_P (x)
6738           && GET_CODE (x) == JUMP_INSN
6739           && returnjump_p (x) && ! condjump_p (x)
6740           && ! (NEXT_INSN (x) && GET_CODE (NEXT_INSN (x)) == BARRIER))
6741             fatal_insn ("Return not followed by barrier", x);
6742
6743       x = NEXT_INSN (x);
6744     }
6745
6746   if (num_bb_notes != n_basic_blocks)
6747     fatal ("number of bb notes in insn chain (%d) != n_basic_blocks (%d)",
6748            num_bb_notes, n_basic_blocks);
6749
6750   if (err)
6751     abort ();
6752
6753   /* Clean up.  */
6754   free (bb_info);
6755 }
6756 \f
6757 /* Functions to access an edge list with a vector representation.
6758    Enough data is kept such that given an index number, the
6759    pred and succ that edge represents can be determined, or
6760    given a pred and a succ, its index number can be returned.
6761    This allows algorithms which consume a lot of memory to
6762    represent the normally full matrix of edge (pred,succ) with a
6763    single indexed vector,  edge (EDGE_INDEX (pred, succ)), with no
6764    wasted space in the client code due to sparse flow graphs.  */
6765
6766 /* This functions initializes the edge list. Basically the entire
6767    flowgraph is processed, and all edges are assigned a number,
6768    and the data structure is filled in.  */
6769
6770 struct edge_list *
6771 create_edge_list ()
6772 {
6773   struct edge_list *elist;
6774   edge e;
6775   int num_edges;
6776   int x;
6777   int block_count;
6778
6779   block_count = n_basic_blocks + 2;   /* Include the entry and exit blocks.  */
6780
6781   num_edges = 0;
6782
6783   /* Determine the number of edges in the flow graph by counting successor
6784      edges on each basic block.  */
6785   for (x = 0; x < n_basic_blocks; x++)
6786     {
6787       basic_block bb = BASIC_BLOCK (x);
6788
6789       for (e = bb->succ; e; e = e->succ_next)
6790         num_edges++;
6791     }
6792   /* Don't forget successors of the entry block.  */
6793   for (e = ENTRY_BLOCK_PTR->succ; e; e = e->succ_next)
6794     num_edges++;
6795
6796   elist = (struct edge_list *) xmalloc (sizeof (struct edge_list));
6797   elist->num_blocks = block_count;
6798   elist->num_edges = num_edges;
6799   elist->index_to_edge = (edge *) xmalloc (sizeof (edge) * num_edges);
6800
6801   num_edges = 0;
6802
6803   /* Follow successors of the entry block, and register these edges.  */
6804   for (e = ENTRY_BLOCK_PTR->succ; e; e = e->succ_next)
6805     {
6806       elist->index_to_edge[num_edges] = e;
6807       num_edges++;
6808     }
6809
6810   for (x = 0; x < n_basic_blocks; x++)
6811     {
6812       basic_block bb = BASIC_BLOCK (x);
6813
6814       /* Follow all successors of blocks, and register these edges.  */
6815       for (e = bb->succ; e; e = e->succ_next)
6816         {
6817           elist->index_to_edge[num_edges] = e;
6818           num_edges++;
6819         }
6820     }
6821   return elist;
6822 }
6823
6824 /* This function free's memory associated with an edge list.  */
6825
6826 void
6827 free_edge_list (elist)
6828      struct edge_list *elist;
6829 {
6830   if (elist)
6831     {
6832       free (elist->index_to_edge);
6833       free (elist);
6834     }
6835 }
6836
6837 /* This function provides debug output showing an edge list.  */
6838
6839 void
6840 print_edge_list (f, elist)
6841      FILE *f;
6842      struct edge_list *elist;
6843 {
6844   int x;
6845   fprintf (f, "Compressed edge list, %d BBs + entry & exit, and %d edges\n",
6846            elist->num_blocks - 2, elist->num_edges);
6847
6848   for (x = 0; x < elist->num_edges; x++)
6849     {
6850       fprintf (f, " %-4d - edge(", x);
6851       if (INDEX_EDGE_PRED_BB (elist, x) == ENTRY_BLOCK_PTR)
6852         fprintf (f, "entry,");
6853       else
6854         fprintf (f, "%d,", INDEX_EDGE_PRED_BB (elist, x)->index);
6855
6856       if (INDEX_EDGE_SUCC_BB (elist, x) == EXIT_BLOCK_PTR)
6857         fprintf (f, "exit)\n");
6858       else
6859         fprintf (f, "%d)\n", INDEX_EDGE_SUCC_BB (elist, x)->index);
6860     }
6861 }
6862
6863 /* This function provides an internal consistency check of an edge list,
6864    verifying that all edges are present, and that there are no
6865    extra edges.  */
6866
6867 void
6868 verify_edge_list (f, elist)
6869      FILE *f;
6870      struct edge_list *elist;
6871 {
6872   int x, pred, succ, index;
6873   edge e;
6874
6875   for (x = 0; x < n_basic_blocks; x++)
6876     {
6877       basic_block bb = BASIC_BLOCK (x);
6878
6879       for (e = bb->succ; e; e = e->succ_next)
6880         {
6881           pred = e->src->index;
6882           succ = e->dest->index;
6883           index = EDGE_INDEX (elist, e->src, e->dest);
6884           if (index == EDGE_INDEX_NO_EDGE)
6885             {
6886               fprintf (f, "*p* No index for edge from %d to %d\n", pred, succ);
6887               continue;
6888             }
6889           if (INDEX_EDGE_PRED_BB (elist, index)->index != pred)
6890             fprintf (f, "*p* Pred for index %d should be %d not %d\n",
6891                      index, pred, INDEX_EDGE_PRED_BB (elist, index)->index);
6892           if (INDEX_EDGE_SUCC_BB (elist, index)->index != succ)
6893             fprintf (f, "*p* Succ for index %d should be %d not %d\n",
6894                      index, succ, INDEX_EDGE_SUCC_BB (elist, index)->index);
6895         }
6896     }
6897   for (e = ENTRY_BLOCK_PTR->succ; e; e = e->succ_next)
6898     {
6899       pred = e->src->index;
6900       succ = e->dest->index;
6901       index = EDGE_INDEX (elist, e->src, e->dest);
6902       if (index == EDGE_INDEX_NO_EDGE)
6903         {
6904           fprintf (f, "*p* No index for edge from %d to %d\n", pred, succ);
6905           continue;
6906         }
6907       if (INDEX_EDGE_PRED_BB (elist, index)->index != pred)
6908         fprintf (f, "*p* Pred for index %d should be %d not %d\n",
6909                  index, pred, INDEX_EDGE_PRED_BB (elist, index)->index);
6910       if (INDEX_EDGE_SUCC_BB (elist, index)->index != succ)
6911         fprintf (f, "*p* Succ for index %d should be %d not %d\n",
6912                  index, succ, INDEX_EDGE_SUCC_BB (elist, index)->index);
6913     }
6914   /* We've verified that all the edges are in the list, no lets make sure
6915      there are no spurious edges in the list.  */
6916
6917   for (pred = 0; pred < n_basic_blocks; pred++)
6918     for (succ = 0; succ < n_basic_blocks; succ++)
6919       {
6920         basic_block p = BASIC_BLOCK (pred);
6921         basic_block s = BASIC_BLOCK (succ);
6922
6923         int found_edge = 0;
6924
6925         for (e = p->succ; e; e = e->succ_next)
6926           if (e->dest == s)
6927             {
6928               found_edge = 1;
6929               break;
6930             }
6931         for (e = s->pred; e; e = e->pred_next)
6932           if (e->src == p)
6933             {
6934               found_edge = 1;
6935               break;
6936             }
6937         if (EDGE_INDEX (elist, BASIC_BLOCK (pred), BASIC_BLOCK (succ))
6938             == EDGE_INDEX_NO_EDGE && found_edge != 0)
6939           fprintf (f, "*** Edge (%d, %d) appears to not have an index\n",
6940                    pred, succ);
6941         if (EDGE_INDEX (elist, BASIC_BLOCK (pred), BASIC_BLOCK (succ))
6942             != EDGE_INDEX_NO_EDGE && found_edge == 0)
6943           fprintf (f, "*** Edge (%d, %d) has index %d, but there is no edge\n",
6944                    pred, succ, EDGE_INDEX (elist, BASIC_BLOCK (pred),
6945                                            BASIC_BLOCK (succ)));
6946       }
6947   for (succ = 0; succ < n_basic_blocks; succ++)
6948     {
6949       basic_block p = ENTRY_BLOCK_PTR;
6950       basic_block s = BASIC_BLOCK (succ);
6951
6952       int found_edge = 0;
6953
6954       for (e = p->succ; e; e = e->succ_next)
6955         if (e->dest == s)
6956           {
6957             found_edge = 1;
6958             break;
6959           }
6960       for (e = s->pred; e; e = e->pred_next)
6961         if (e->src == p)
6962           {
6963             found_edge = 1;
6964             break;
6965           }
6966       if (EDGE_INDEX (elist, ENTRY_BLOCK_PTR, BASIC_BLOCK (succ))
6967           == EDGE_INDEX_NO_EDGE && found_edge != 0)
6968         fprintf (f, "*** Edge (entry, %d) appears to not have an index\n",
6969                  succ);
6970       if (EDGE_INDEX (elist, ENTRY_BLOCK_PTR, BASIC_BLOCK (succ))
6971           != EDGE_INDEX_NO_EDGE && found_edge == 0)
6972         fprintf (f, "*** Edge (entry, %d) has index %d, but no edge exists\n",
6973                  succ, EDGE_INDEX (elist, ENTRY_BLOCK_PTR,
6974                                    BASIC_BLOCK (succ)));
6975     }
6976   for (pred = 0; pred < n_basic_blocks; pred++)
6977     {
6978       basic_block p = BASIC_BLOCK (pred);
6979       basic_block s = EXIT_BLOCK_PTR;
6980
6981       int found_edge = 0;
6982
6983       for (e = p->succ; e; e = e->succ_next)
6984         if (e->dest == s)
6985           {
6986             found_edge = 1;
6987             break;
6988           }
6989       for (e = s->pred; e; e = e->pred_next)
6990         if (e->src == p)
6991           {
6992             found_edge = 1;
6993             break;
6994           }
6995       if (EDGE_INDEX (elist, BASIC_BLOCK (pred), EXIT_BLOCK_PTR)
6996           == EDGE_INDEX_NO_EDGE && found_edge != 0)
6997         fprintf (f, "*** Edge (%d, exit) appears to not have an index\n",
6998                  pred);
6999       if (EDGE_INDEX (elist, BASIC_BLOCK (pred), EXIT_BLOCK_PTR)
7000           != EDGE_INDEX_NO_EDGE && found_edge == 0)
7001         fprintf (f, "*** Edge (%d, exit) has index %d, but no edge exists\n",
7002                  pred, EDGE_INDEX (elist, BASIC_BLOCK (pred),
7003                                    EXIT_BLOCK_PTR));
7004     }
7005 }
7006
7007 /* This routine will determine what, if any, edge there is between
7008    a specified predecessor and successor.  */
7009
7010 int
7011 find_edge_index (edge_list, pred, succ)
7012      struct edge_list *edge_list;
7013      basic_block pred, succ;
7014 {
7015   int x;
7016   for (x = 0; x < NUM_EDGES (edge_list); x++)
7017     {
7018       if (INDEX_EDGE_PRED_BB (edge_list, x) == pred
7019           && INDEX_EDGE_SUCC_BB (edge_list, x) == succ)
7020         return x;
7021     }
7022   return (EDGE_INDEX_NO_EDGE);
7023 }
7024
7025 /* This function will remove an edge from the flow graph.  */
7026
7027 void
7028 remove_edge (e)
7029      edge e;
7030 {
7031   edge last_pred = NULL;
7032   edge last_succ = NULL;
7033   edge tmp;
7034   basic_block src, dest;
7035   src = e->src;
7036   dest = e->dest;
7037   for (tmp = src->succ; tmp && tmp != e; tmp = tmp->succ_next)
7038     last_succ = tmp;
7039
7040   if (!tmp)
7041     abort ();
7042   if (last_succ)
7043     last_succ->succ_next = e->succ_next;
7044   else
7045     src->succ = e->succ_next;
7046
7047   for (tmp = dest->pred; tmp && tmp != e; tmp = tmp->pred_next)
7048     last_pred = tmp;
7049
7050   if (!tmp)
7051     abort ();
7052   if (last_pred)
7053     last_pred->pred_next = e->pred_next;
7054   else
7055     dest->pred = e->pred_next;
7056
7057   n_edges--;
7058   free (e);
7059 }
7060
7061 /* This routine will remove any fake successor edges for a basic block.
7062    When the edge is removed, it is also removed from whatever predecessor
7063    list it is in.  */
7064
7065 static void
7066 remove_fake_successors (bb)
7067      basic_block bb;
7068 {
7069   edge e;
7070   for (e = bb->succ; e;)
7071     {
7072       edge tmp = e;
7073       e = e->succ_next;
7074       if ((tmp->flags & EDGE_FAKE) == EDGE_FAKE)
7075         remove_edge (tmp);
7076     }
7077 }
7078
7079 /* This routine will remove all fake edges from the flow graph.  If
7080    we remove all fake successors, it will automatically remove all
7081    fake predecessors.  */
7082
7083 void
7084 remove_fake_edges ()
7085 {
7086   int x;
7087
7088   for (x = 0; x < n_basic_blocks; x++)
7089     remove_fake_successors (BASIC_BLOCK (x));
7090
7091   /* We've handled all successors except the entry block's.  */
7092   remove_fake_successors (ENTRY_BLOCK_PTR);
7093 }
7094
7095 /* This function will add a fake edge between any block which has no
7096    successors, and the exit block. Some data flow equations require these
7097    edges to exist.  */
7098
7099 void
7100 add_noreturn_fake_exit_edges ()
7101 {
7102   int x;
7103
7104   for (x = 0; x < n_basic_blocks; x++)
7105     if (BASIC_BLOCK (x)->succ == NULL)
7106       make_edge (NULL, BASIC_BLOCK (x), EXIT_BLOCK_PTR, EDGE_FAKE);
7107 }
7108
7109 /* This function adds a fake edge between any infinite loops to the
7110    exit block.  Some optimizations require a path from each node to
7111    the exit node.
7112
7113    See also Morgan, Figure 3.10, pp. 82-83.
7114
7115    The current implementation is ugly, not attempting to minimize the
7116    number of inserted fake edges.  To reduce the number of fake edges
7117    to insert, add fake edges from _innermost_ loops containing only
7118    nodes not reachable from the exit block.  */
7119
7120 void
7121 connect_infinite_loops_to_exit ()
7122 {
7123   basic_block unvisited_block;
7124
7125   /* Perform depth-first search in the reverse graph to find nodes
7126      reachable from the exit block.  */
7127   struct depth_first_search_dsS dfs_ds;
7128
7129   flow_dfs_compute_reverse_init (&dfs_ds);
7130   flow_dfs_compute_reverse_add_bb (&dfs_ds, EXIT_BLOCK_PTR);
7131
7132   /* Repeatedly add fake edges, updating the unreachable nodes.  */
7133   while (1)
7134     {
7135       unvisited_block = flow_dfs_compute_reverse_execute (&dfs_ds);
7136       if (!unvisited_block)
7137         break;
7138       make_edge (NULL, unvisited_block, EXIT_BLOCK_PTR, EDGE_FAKE);
7139       flow_dfs_compute_reverse_add_bb (&dfs_ds, unvisited_block);
7140     }
7141
7142   flow_dfs_compute_reverse_finish (&dfs_ds);
7143
7144   return;
7145 }
7146
7147 /* Redirect an edge's successor from one block to another.  */
7148
7149 void
7150 redirect_edge_succ (e, new_succ)
7151      edge e;
7152      basic_block new_succ;
7153 {
7154   edge *pe;
7155
7156   /* Disconnect the edge from the old successor block.  */
7157   for (pe = &e->dest->pred; *pe != e; pe = &(*pe)->pred_next)
7158     continue;
7159   *pe = (*pe)->pred_next;
7160
7161   /* Reconnect the edge to the new successor block.  */
7162   e->pred_next = new_succ->pred;
7163   new_succ->pred = e;
7164   e->dest = new_succ;
7165 }
7166
7167 /* Redirect an edge's predecessor from one block to another.  */
7168
7169 void
7170 redirect_edge_pred (e, new_pred)
7171      edge e;
7172      basic_block new_pred;
7173 {
7174   edge *pe;
7175
7176   /* Disconnect the edge from the old predecessor block.  */
7177   for (pe = &e->src->succ; *pe != e; pe = &(*pe)->succ_next)
7178     continue;
7179   *pe = (*pe)->succ_next;
7180
7181   /* Reconnect the edge to the new predecessor block.  */
7182   e->succ_next = new_pred->succ;
7183   new_pred->succ = e;
7184   e->src = new_pred;
7185 }
7186 \f
7187 /* Dump the list of basic blocks in the bitmap NODES.  */
7188
7189 static void 
7190 flow_nodes_print (str, nodes, file)
7191      const char *str;
7192      const sbitmap nodes;
7193      FILE *file;
7194 {
7195   int node;
7196
7197   if (! nodes)
7198     return;
7199
7200   fprintf (file, "%s { ", str);
7201   EXECUTE_IF_SET_IN_SBITMAP (nodes, 0, node, {fprintf (file, "%d ", node);});
7202   fputs ("}\n", file);
7203 }
7204
7205
7206 /* Dump the list of edges in the array EDGE_LIST.  */
7207
7208 static void 
7209 flow_edge_list_print (str, edge_list, num_edges, file)
7210      const char *str;
7211      const edge *edge_list;
7212      int num_edges;
7213      FILE *file;
7214 {
7215   int i;
7216
7217   if (! edge_list)
7218     return;
7219
7220   fprintf (file, "%s { ", str);
7221   for (i = 0; i < num_edges; i++)
7222     fprintf (file, "%d->%d ", edge_list[i]->src->index,
7223              edge_list[i]->dest->index);
7224   fputs ("}\n", file);
7225 }
7226
7227
7228 /* Dump loop related CFG information.  */
7229
7230 static void
7231 flow_loops_cfg_dump (loops, file)
7232      const struct loops *loops;
7233      FILE *file;
7234 {
7235   int i;
7236
7237   if (! loops->num || ! file || ! loops->cfg.dom)
7238     return;
7239
7240   for (i = 0; i < n_basic_blocks; i++)
7241     {
7242       edge succ;
7243
7244       fprintf (file, ";; %d succs { ", i);
7245       for (succ = BASIC_BLOCK (i)->succ; succ; succ = succ->succ_next)
7246         fprintf (file, "%d ", succ->dest->index);
7247       flow_nodes_print ("} dom", loops->cfg.dom[i], file);
7248     }
7249
7250   /* Dump the DFS node order.  */
7251   if (loops->cfg.dfs_order)
7252     {
7253       fputs (";; DFS order: ", file);
7254       for (i = 0; i < n_basic_blocks; i++)
7255         fprintf (file, "%d ", loops->cfg.dfs_order[i]);
7256       fputs ("\n", file);
7257     }
7258   /* Dump the reverse completion node order.  */
7259   if (loops->cfg.rc_order)
7260     {
7261       fputs (";; RC order: ", file);
7262       for (i = 0; i < n_basic_blocks; i++)
7263         fprintf (file, "%d ", loops->cfg.rc_order[i]);
7264       fputs ("\n", file);
7265     }
7266 }
7267
7268 /* Return non-zero if the nodes of LOOP are a subset of OUTER.  */
7269
7270 static int
7271 flow_loop_nested_p (outer, loop)
7272      struct loop *outer;
7273      struct loop *loop;
7274 {
7275   return sbitmap_a_subset_b_p (loop->nodes, outer->nodes);
7276 }
7277
7278
7279 /* Dump the loop information specified by LOOP to the stream FILE
7280    using auxiliary dump callback function LOOP_DUMP_AUX if non null.  */
7281 void
7282 flow_loop_dump (loop, file, loop_dump_aux, verbose)
7283      const struct loop *loop;
7284      FILE *file;
7285      void (*loop_dump_aux) PARAMS((const struct loop *, FILE *, int));
7286      int verbose;
7287 {
7288   if (! loop || ! loop->header)
7289     return;
7290
7291   fprintf (file, ";;\n;; Loop %d (%d to %d):%s%s\n",
7292            loop->num, INSN_UID (loop->first->head),
7293            INSN_UID (loop->last->end),
7294            loop->shared ? " shared" : "",
7295            loop->invalid ? " invalid" : "");
7296   fprintf (file, ";;  header %d, latch %d, pre-header %d, first %d, last %d\n",
7297            loop->header->index, loop->latch->index,
7298            loop->pre_header ? loop->pre_header->index : -1,
7299            loop->first->index, loop->last->index);
7300   fprintf (file, ";;  depth %d, level %d, outer %ld\n",
7301            loop->depth, loop->level,
7302            (long) (loop->outer ? loop->outer->num : -1));
7303
7304   if (loop->pre_header_edges)
7305     flow_edge_list_print (";;  pre-header edges", loop->pre_header_edges,
7306                           loop->num_pre_header_edges, file);
7307   flow_edge_list_print (";;  entry edges", loop->entry_edges,
7308                         loop->num_entries, file);
7309   fprintf (file, ";;  %d", loop->num_nodes);
7310   flow_nodes_print (" nodes", loop->nodes, file);
7311   flow_edge_list_print (";;  exit edges", loop->exit_edges,
7312                         loop->num_exits, file);
7313   if (loop->exits_doms)
7314     flow_nodes_print (";;  exit doms", loop->exits_doms, file);
7315   if (loop_dump_aux)
7316     loop_dump_aux (loop, file, verbose);
7317 }
7318
7319
7320 /* Dump the loop information specified by LOOPS to the stream FILE,
7321    using auxiliary dump callback function LOOP_DUMP_AUX if non null.  */
7322 void 
7323 flow_loops_dump (loops, file, loop_dump_aux, verbose)
7324      const struct loops *loops;
7325      FILE *file;
7326      void (*loop_dump_aux) PARAMS((const struct loop *, FILE *, int));
7327      int verbose;
7328 {
7329   int i;
7330   int num_loops;
7331
7332   num_loops = loops->num;
7333   if (! num_loops || ! file)
7334     return;
7335
7336   fprintf (file, ";; %d loops found, %d levels\n", 
7337            num_loops, loops->levels);
7338
7339   for (i = 0; i < num_loops; i++)
7340     {
7341       struct loop *loop = &loops->array[i];
7342
7343       flow_loop_dump (loop, file, loop_dump_aux, verbose);
7344
7345       if (loop->shared)
7346         {
7347           int j;
7348
7349           for (j = 0; j < i; j++)
7350             {
7351               struct loop *oloop = &loops->array[j];
7352
7353               if (loop->header == oloop->header)
7354                 {
7355                   int disjoint;
7356                   int smaller;
7357
7358                   smaller = loop->num_nodes < oloop->num_nodes;
7359
7360                   /* If the union of LOOP and OLOOP is different than
7361                      the larger of LOOP and OLOOP then LOOP and OLOOP
7362                      must be disjoint.  */
7363                   disjoint = ! flow_loop_nested_p (smaller ? loop : oloop,
7364                                                    smaller ? oloop : loop);
7365                   fprintf (file, 
7366                            ";; loop header %d shared by loops %d, %d %s\n",
7367                            loop->header->index, i, j,
7368                            disjoint ? "disjoint" : "nested");
7369                 }
7370             }
7371         }
7372     }
7373
7374   if (verbose)
7375     flow_loops_cfg_dump (loops, file);
7376 }
7377
7378
7379 /* Free all the memory allocated for LOOPS.  */
7380
7381 void
7382 flow_loops_free (loops)
7383      struct loops *loops;
7384 {
7385   if (loops->array)
7386     {
7387       int i;
7388
7389       if (! loops->num)
7390         abort ();
7391
7392       /* Free the loop descriptors.  */
7393       for (i = 0; i < loops->num; i++)
7394         {
7395           struct loop *loop = &loops->array[i];
7396
7397           if (loop->pre_header_edges)
7398             free (loop->pre_header_edges);
7399           if (loop->nodes)
7400             sbitmap_free (loop->nodes);
7401           if (loop->entry_edges)
7402             free (loop->entry_edges);
7403           if (loop->exit_edges)
7404             free (loop->exit_edges);
7405           if (loop->exits_doms)
7406             sbitmap_free (loop->exits_doms);
7407         }
7408       free (loops->array);
7409       loops->array = NULL;
7410
7411       if (loops->cfg.dom)
7412         sbitmap_vector_free (loops->cfg.dom);
7413       if (loops->cfg.dfs_order)
7414         free (loops->cfg.dfs_order);
7415
7416       if (loops->shared_headers)
7417         sbitmap_free (loops->shared_headers);
7418     }
7419 }
7420
7421
7422 /* Find the entry edges into the loop with header HEADER and nodes
7423    NODES and store in ENTRY_EDGES array.  Return the number of entry
7424    edges from the loop.  */
7425
7426 static int
7427 flow_loop_entry_edges_find (header, nodes, entry_edges)
7428      basic_block header;
7429      const sbitmap nodes;
7430      edge **entry_edges;
7431 {
7432   edge e;
7433   int num_entries;
7434
7435   *entry_edges = NULL;
7436
7437   num_entries = 0;
7438   for (e = header->pred; e; e = e->pred_next)
7439     {
7440       basic_block src = e->src;
7441       
7442       if (src == ENTRY_BLOCK_PTR || ! TEST_BIT (nodes, src->index))
7443         num_entries++;
7444     }
7445
7446   if (! num_entries)
7447     abort ();
7448
7449   *entry_edges = (edge *) xmalloc (num_entries * sizeof (edge *));
7450
7451   num_entries = 0;
7452   for (e = header->pred; e; e = e->pred_next)
7453     {
7454       basic_block src = e->src;
7455       
7456       if (src == ENTRY_BLOCK_PTR || ! TEST_BIT (nodes, src->index))
7457         (*entry_edges)[num_entries++] = e;
7458     }
7459
7460   return num_entries;
7461 }
7462
7463
7464 /* Find the exit edges from the loop using the bitmap of loop nodes
7465    NODES and store in EXIT_EDGES array.  Return the number of
7466    exit edges from the loop.  */
7467
7468 static int
7469 flow_loop_exit_edges_find (nodes, exit_edges)
7470      const sbitmap nodes;
7471      edge **exit_edges;
7472 {
7473   edge e;
7474   int node;
7475   int num_exits;
7476
7477   *exit_edges = NULL;
7478
7479   /* Check all nodes within the loop to see if there are any
7480      successors not in the loop.  Note that a node may have multiple
7481      exiting edges ?????  A node can have one jumping edge and one fallthru
7482      edge so only one of these can exit the loop.  */
7483   num_exits = 0;
7484   EXECUTE_IF_SET_IN_SBITMAP (nodes, 0, node, {
7485     for (e = BASIC_BLOCK (node)->succ; e; e = e->succ_next)
7486       {
7487         basic_block dest = e->dest;       
7488
7489         if (dest == EXIT_BLOCK_PTR || ! TEST_BIT (nodes, dest->index))
7490             num_exits++;
7491       }
7492   });
7493
7494   if (! num_exits)
7495     return 0;
7496
7497   *exit_edges = (edge *) xmalloc (num_exits * sizeof (edge *));
7498
7499   /* Store all exiting edges into an array.  */
7500   num_exits = 0;
7501   EXECUTE_IF_SET_IN_SBITMAP (nodes, 0, node, {
7502     for (e = BASIC_BLOCK (node)->succ; e; e = e->succ_next)
7503       {
7504         basic_block dest = e->dest;       
7505
7506         if (dest == EXIT_BLOCK_PTR || ! TEST_BIT (nodes, dest->index))
7507           (*exit_edges)[num_exits++] = e;
7508       }
7509   });
7510
7511   return num_exits;
7512 }
7513
7514
7515 /* Find the nodes contained within the loop with header HEADER and
7516    latch LATCH and store in NODES.  Return the number of nodes within
7517    the loop.  */
7518
7519 static int
7520 flow_loop_nodes_find (header, latch, nodes)
7521      basic_block header;
7522      basic_block latch;
7523      sbitmap nodes;
7524 {
7525   basic_block *stack;
7526   int sp;
7527   int num_nodes = 0;
7528
7529   stack = (basic_block *) xmalloc (n_basic_blocks * sizeof (basic_block));
7530   sp = 0;
7531
7532   /* Start with only the loop header in the set of loop nodes.  */
7533   sbitmap_zero (nodes);
7534   SET_BIT (nodes, header->index);
7535   num_nodes++;
7536   header->loop_depth++;
7537
7538   /* Push the loop latch on to the stack.  */
7539   if (! TEST_BIT (nodes, latch->index))
7540     {
7541       SET_BIT (nodes, latch->index);
7542       latch->loop_depth++;
7543       num_nodes++;
7544       stack[sp++] = latch;
7545     }
7546
7547   while (sp)
7548     {
7549       basic_block node;
7550       edge e;
7551
7552       node = stack[--sp];
7553       for (e = node->pred; e; e = e->pred_next)
7554         {
7555           basic_block ancestor = e->src;
7556
7557           /* If each ancestor not marked as part of loop, add to set of
7558              loop nodes and push on to stack.  */
7559           if (ancestor != ENTRY_BLOCK_PTR
7560               && ! TEST_BIT (nodes, ancestor->index))
7561             {
7562               SET_BIT (nodes, ancestor->index);
7563               ancestor->loop_depth++;
7564               num_nodes++;
7565               stack[sp++] = ancestor;
7566             }
7567         }
7568     }
7569   free (stack);
7570   return num_nodes;
7571 }
7572
7573 /* Compute the depth first search order and store in the array
7574   DFS_ORDER if non-zero, marking the nodes visited in VISITED.  If
7575   RC_ORDER is non-zero, return the reverse completion number for each
7576   node.  Returns the number of nodes visited.  A depth first search
7577   tries to get as far away from the starting point as quickly as
7578   possible.  */
7579
7580 static int
7581 flow_depth_first_order_compute (dfs_order, rc_order)
7582      int *dfs_order;
7583      int *rc_order;
7584 {
7585   edge *stack;
7586   int sp;
7587   int dfsnum = 0;
7588   int rcnum = n_basic_blocks - 1;
7589   sbitmap visited;
7590
7591   /* Allocate stack for back-tracking up CFG.  */
7592   stack = (edge *) xmalloc ((n_basic_blocks + 1) * sizeof (edge));
7593   sp = 0;
7594
7595   /* Allocate bitmap to track nodes that have been visited.  */
7596   visited = sbitmap_alloc (n_basic_blocks);
7597
7598   /* None of the nodes in the CFG have been visited yet.  */
7599   sbitmap_zero (visited);
7600
7601   /* Push the first edge on to the stack.  */
7602   stack[sp++] = ENTRY_BLOCK_PTR->succ;
7603
7604   while (sp)
7605     {
7606       edge e;
7607       basic_block src;
7608       basic_block dest;
7609
7610       /* Look at the edge on the top of the stack.  */
7611       e = stack[sp - 1];
7612       src = e->src;
7613       dest = e->dest;
7614
7615       /* Check if the edge destination has been visited yet.  */
7616       if (dest != EXIT_BLOCK_PTR && ! TEST_BIT (visited, dest->index))
7617         {
7618           /* Mark that we have visited the destination.  */
7619           SET_BIT (visited, dest->index);
7620
7621           if (dfs_order)
7622             dfs_order[dfsnum++] = dest->index;
7623
7624           if (dest->succ)
7625             {
7626               /* Since the DEST node has been visited for the first
7627                  time, check its successors.  */
7628               stack[sp++] = dest->succ;
7629             }
7630           else
7631             {
7632               /* There are no successors for the DEST node so assign
7633                  its reverse completion number.  */
7634               if (rc_order)
7635                 rc_order[rcnum--] = dest->index;
7636             }
7637         }
7638       else
7639         {
7640           if (! e->succ_next && src != ENTRY_BLOCK_PTR)
7641             {
7642               /* There are no more successors for the SRC node
7643                  so assign its reverse completion number.  */
7644               if (rc_order)
7645                 rc_order[rcnum--] = src->index;
7646             }
7647
7648           if (e->succ_next)
7649             stack[sp - 1] = e->succ_next;
7650           else
7651             sp--;
7652         }
7653     }
7654
7655   free (stack);
7656   sbitmap_free (visited);
7657
7658   /* The number of nodes visited should not be greater than
7659      n_basic_blocks.  */
7660   if (dfsnum > n_basic_blocks)
7661     abort ();
7662
7663   /* There are some nodes left in the CFG that are unreachable.  */
7664   if (dfsnum < n_basic_blocks)
7665     abort ();
7666   return dfsnum;
7667 }
7668
7669 /* Compute the depth first search order on the _reverse_ graph and
7670    store in the array DFS_ORDER, marking the nodes visited in VISITED.
7671    Returns the number of nodes visited.
7672
7673    The computation is split into three pieces:
7674
7675    flow_dfs_compute_reverse_init () creates the necessary data
7676    structures.
7677
7678    flow_dfs_compute_reverse_add_bb () adds a basic block to the data
7679    structures.  The block will start the search.
7680
7681    flow_dfs_compute_reverse_execute () continues (or starts) the
7682    search using the block on the top of the stack, stopping when the
7683    stack is empty.
7684
7685    flow_dfs_compute_reverse_finish () destroys the necessary data
7686    structures.
7687
7688    Thus, the user will probably call ..._init(), call ..._add_bb() to
7689    add a beginning basic block to the stack, call ..._execute(),
7690    possibly add another bb to the stack and again call ..._execute(),
7691    ..., and finally call _finish().  */
7692
7693 /* Initialize the data structures used for depth-first search on the
7694    reverse graph.  If INITIALIZE_STACK is nonzero, the exit block is
7695    added to the basic block stack.  DATA is the current depth-first
7696    search context.  If INITIALIZE_STACK is non-zero, there is an
7697    element on the stack.  */
7698
7699 static void
7700 flow_dfs_compute_reverse_init (data)
7701      depth_first_search_ds data;
7702 {
7703   /* Allocate stack for back-tracking up CFG.  */
7704   data->stack =
7705     (basic_block *) xmalloc ((n_basic_blocks - (INVALID_BLOCK + 1))
7706                              * sizeof (basic_block));
7707   data->sp = 0;
7708
7709   /* Allocate bitmap to track nodes that have been visited.  */
7710   data->visited_blocks = sbitmap_alloc (n_basic_blocks - (INVALID_BLOCK + 1));
7711
7712   /* None of the nodes in the CFG have been visited yet.  */
7713   sbitmap_zero (data->visited_blocks);
7714
7715   return;
7716 }
7717
7718 /* Add the specified basic block to the top of the dfs data
7719    structures.  When the search continues, it will start at the
7720    block.  */
7721
7722 static void
7723 flow_dfs_compute_reverse_add_bb (data, bb)
7724      depth_first_search_ds data;
7725      basic_block bb;
7726 {
7727   data->stack[data->sp++] = bb;
7728   return;
7729 }
7730
7731 /* Continue the depth-first search through the reverse graph starting
7732    with the block at the stack's top and ending when the stack is
7733    empty.  Visited nodes are marked.  Returns an unvisited basic
7734    block, or NULL if there is none available.  */
7735
7736 static basic_block
7737 flow_dfs_compute_reverse_execute (data)
7738      depth_first_search_ds data;
7739 {
7740   basic_block bb;
7741   edge e;
7742   int i;
7743
7744   while (data->sp > 0)
7745     {
7746       bb = data->stack[--data->sp];
7747
7748       /* Mark that we have visited this node.  */
7749       if (!TEST_BIT (data->visited_blocks, bb->index - (INVALID_BLOCK + 1)))
7750         {
7751           SET_BIT (data->visited_blocks, bb->index - (INVALID_BLOCK + 1));
7752
7753           /* Perform depth-first search on adjacent vertices.  */
7754           for (e = bb->pred; e; e = e->pred_next)
7755             flow_dfs_compute_reverse_add_bb (data, e->src);
7756         }
7757     }
7758
7759   /* Determine if there are unvisited basic blocks.  */
7760   for (i = n_basic_blocks - (INVALID_BLOCK + 1); --i >= 0;)
7761     if (!TEST_BIT (data->visited_blocks, i))
7762       return BASIC_BLOCK (i + (INVALID_BLOCK + 1));
7763   return NULL;
7764 }
7765
7766 /* Destroy the data structures needed for depth-first search on the
7767    reverse graph.  */
7768
7769 static void
7770 flow_dfs_compute_reverse_finish (data)
7771      depth_first_search_ds data;
7772 {
7773   free (data->stack);
7774   sbitmap_free (data->visited_blocks);
7775   return;
7776 }
7777
7778
7779 /* Find the root node of the loop pre-header extended basic block and
7780    the edges along the trace from the root node to the loop header.  */
7781
7782 static void
7783 flow_loop_pre_header_scan (loop)
7784      struct loop *loop;
7785 {
7786   int num = 0;
7787   basic_block ebb;
7788
7789   loop->num_pre_header_edges = 0;
7790
7791   if (loop->num_entries != 1)
7792      return;
7793
7794   ebb = loop->entry_edges[0]->src;
7795
7796   if (ebb != ENTRY_BLOCK_PTR)
7797     {
7798       edge e;
7799
7800       /* Count number of edges along trace from loop header to
7801          root of pre-header extended basic block.  Usually this is
7802          only one or two edges. */
7803       num++;
7804       while (ebb->pred->src != ENTRY_BLOCK_PTR && ! ebb->pred->pred_next)
7805         {
7806           ebb = ebb->pred->src;
7807           num++;
7808         }
7809
7810       loop->pre_header_edges = (edge *) xmalloc (num * sizeof (edge *));
7811       loop->num_pre_header_edges = num;
7812
7813       /* Store edges in order that they are followed.   The source
7814          of the first edge is the root node of the pre-header extended
7815          basic block and the destination of the last last edge is
7816          the loop header.  */
7817       for (e = loop->entry_edges[0]; num; e = e->src->pred)
7818         {
7819           loop->pre_header_edges[--num] = e;
7820         }
7821     }
7822 }
7823
7824
7825 /* Return the block for the pre-header of the loop with header
7826    HEADER where DOM specifies the dominator information.  Return NULL if
7827    there is no pre-header.  */
7828
7829 static basic_block
7830 flow_loop_pre_header_find (header, dom)
7831      basic_block header;
7832      const sbitmap *dom;
7833 {
7834   basic_block pre_header;
7835   edge e;
7836
7837   /* If block p is a predecessor of the header and is the only block
7838      that the header does not dominate, then it is the pre-header.  */
7839   pre_header = NULL;
7840   for (e = header->pred; e; e = e->pred_next)
7841     {
7842       basic_block node = e->src;
7843
7844       if (node != ENTRY_BLOCK_PTR
7845           && ! TEST_BIT (dom[node->index], header->index))
7846         {
7847           if (pre_header == NULL)
7848             pre_header = node;
7849           else
7850             {
7851               /* There are multiple edges into the header from outside
7852                  the loop so there is no pre-header block.  */
7853               pre_header = NULL;
7854               break;
7855             }
7856         }
7857     }
7858   return pre_header;
7859 }
7860
7861 /* Add LOOP to the loop hierarchy tree where PREVLOOP was the loop
7862    previously added.  The insertion algorithm assumes that the loops
7863    are added in the order found by a depth first search of the CFG.  */
7864
7865 static void
7866 flow_loop_tree_node_add (prevloop, loop)
7867      struct loop *prevloop;
7868      struct loop *loop;
7869 {
7870
7871   if (flow_loop_nested_p (prevloop, loop))
7872     {
7873       prevloop->inner = loop;
7874       loop->outer = prevloop;
7875       return;
7876     }
7877
7878   while (prevloop->outer)
7879     {
7880       if (flow_loop_nested_p (prevloop->outer, loop))
7881         {
7882           prevloop->next = loop;
7883           loop->outer = prevloop->outer;
7884           return;
7885         }
7886       prevloop = prevloop->outer;
7887     }
7888
7889   prevloop->next = loop;
7890   loop->outer = NULL;
7891 }
7892
7893 /* Build the loop hierarchy tree for LOOPS.  */
7894
7895 static void
7896 flow_loops_tree_build (loops)
7897      struct loops *loops;
7898 {
7899   int i;
7900   int num_loops;
7901
7902   num_loops = loops->num;
7903   if (! num_loops)
7904     return;
7905
7906   /* Root the loop hierarchy tree with the first loop found.
7907      Since we used a depth first search this should be the
7908      outermost loop.  */
7909   loops->tree = &loops->array[0];
7910   loops->tree->outer = loops->tree->inner = loops->tree->next = NULL;
7911
7912   /* Add the remaining loops to the tree.  */
7913   for (i = 1; i < num_loops; i++)
7914     flow_loop_tree_node_add (&loops->array[i - 1], &loops->array[i]);
7915 }
7916
7917 /* Helper function to compute loop nesting depth and enclosed loop level
7918    for the natural loop specified by LOOP at the loop depth DEPTH.
7919    Returns the loop level.  */
7920
7921 static int
7922 flow_loop_level_compute (loop, depth)
7923      struct loop *loop;
7924      int depth;
7925 {
7926   struct loop *inner;
7927   int level = 1;
7928
7929   if (! loop)
7930     return 0;
7931
7932   /* Traverse loop tree assigning depth and computing level as the
7933      maximum level of all the inner loops of this loop.  The loop
7934      level is equivalent to the height of the loop in the loop tree
7935      and corresponds to the number of enclosed loop levels (including
7936      itself).  */
7937   for (inner = loop->inner; inner; inner = inner->next)
7938     {
7939       int ilevel;
7940
7941       ilevel = flow_loop_level_compute (inner, depth + 1) + 1;
7942
7943       if (ilevel > level)
7944         level = ilevel;
7945     }
7946   loop->level = level;
7947   loop->depth = depth;
7948   return level;
7949 }
7950
7951 /* Compute the loop nesting depth and enclosed loop level for the loop
7952    hierarchy tree specfied by LOOPS.  Return the maximum enclosed loop
7953    level.  */
7954
7955 static int
7956 flow_loops_level_compute (loops)
7957      struct loops *loops;
7958 {
7959   struct loop *loop;
7960   int level;
7961   int levels = 0;
7962
7963   /* Traverse all the outer level loops.  */
7964   for (loop = loops->tree; loop; loop = loop->next)
7965     {
7966       level = flow_loop_level_compute (loop, 1);
7967       if (level > levels)
7968         levels = level;
7969     }
7970   return levels;
7971 }
7972
7973
7974 /* Find all the natural loops in the function and save in LOOPS structure
7975    and recalculate loop_depth information in basic block structures.
7976    FLAGS controls which loop information is collected.
7977    Return the number of natural loops found.  */
7978
7979 int
7980 flow_loops_find (loops, flags)
7981      struct loops *loops;
7982      int flags;
7983 {
7984   int i;
7985   int b;
7986   int num_loops;
7987   edge e;
7988   sbitmap headers;
7989   sbitmap *dom;
7990   int *dfs_order;
7991   int *rc_order;
7992
7993   /* This function cannot be repeatedly called with different
7994      flags to build up the loop information.  The loop tree
7995      must always be built if this function is called.  */
7996   if (! (flags & LOOP_TREE))
7997     abort ();
7998     
7999   memset (loops, 0, sizeof (*loops));
8000
8001   /* Taking care of this degenerate case makes the rest of
8002      this code simpler.  */
8003   if (n_basic_blocks == 0)
8004     return 0;
8005
8006   dfs_order = NULL;
8007   rc_order = NULL;
8008
8009   /* Compute the dominators.  */
8010   dom = sbitmap_vector_alloc (n_basic_blocks, n_basic_blocks);
8011   calculate_dominance_info (NULL, dom, CDI_DOMINATORS);
8012
8013   /* Count the number of loop edges (back edges).  This should be the
8014      same as the number of natural loops.  */
8015
8016   num_loops = 0;
8017   for (b = 0; b < n_basic_blocks; b++)
8018     {
8019       basic_block header;
8020
8021       header = BASIC_BLOCK (b);
8022       header->loop_depth = 0;
8023
8024       for (e = header->pred; e; e = e->pred_next)
8025         {
8026           basic_block latch = e->src;
8027
8028           /* Look for back edges where a predecessor is dominated
8029              by this block.  A natural loop has a single entry
8030              node (header) that dominates all the nodes in the
8031              loop.  It also has single back edge to the header
8032              from a latch node.  Note that multiple natural loops
8033              may share the same header.  */
8034           if (b != header->index)
8035             abort ();
8036
8037           if (latch != ENTRY_BLOCK_PTR && TEST_BIT (dom[latch->index], b))
8038             num_loops++;
8039         }
8040     }
8041
8042   if (num_loops)
8043     {
8044       /* Compute depth first search order of the CFG so that outer
8045          natural loops will be found before inner natural loops.  */
8046       dfs_order = (int *) xmalloc (n_basic_blocks * sizeof (int));
8047       rc_order = (int *) xmalloc (n_basic_blocks * sizeof (int));
8048       flow_depth_first_order_compute (dfs_order, rc_order);
8049
8050       /* Allocate loop structures.  */
8051       loops->array
8052         = (struct loop *) xcalloc (num_loops, sizeof (struct loop));
8053
8054       headers = sbitmap_alloc (n_basic_blocks);
8055       sbitmap_zero (headers);
8056
8057       loops->shared_headers = sbitmap_alloc (n_basic_blocks);
8058       sbitmap_zero (loops->shared_headers);
8059
8060       /* Find and record information about all the natural loops
8061          in the CFG.  */
8062       num_loops = 0;
8063       for (b = 0; b < n_basic_blocks; b++)
8064         {
8065           basic_block header;
8066
8067           /* Search the nodes of the CFG in reverse completion order
8068              so that we can find outer loops first.  */
8069           header = BASIC_BLOCK (rc_order[b]);
8070
8071           /* Look for all the possible latch blocks for this header.  */
8072           for (e = header->pred; e; e = e->pred_next)
8073             {
8074               basic_block latch = e->src;
8075
8076               /* Look for back edges where a predecessor is dominated
8077                  by this block.  A natural loop has a single entry
8078                  node (header) that dominates all the nodes in the
8079                  loop.  It also has single back edge to the header
8080                  from a latch node.  Note that multiple natural loops
8081                  may share the same header.  */
8082               if (latch != ENTRY_BLOCK_PTR
8083                   && TEST_BIT (dom[latch->index], header->index))
8084                 {
8085                   struct loop *loop;
8086
8087                   loop = loops->array + num_loops;
8088
8089                   loop->header = header;
8090                   loop->latch = latch;
8091                   loop->num = num_loops;
8092
8093                   num_loops++;
8094                 }
8095             }
8096         }
8097
8098       for (i = 0; i < num_loops; i++)
8099         {
8100           struct loop *loop = &loops->array[i];
8101           int j;
8102
8103           /* Keep track of blocks that are loop headers so
8104              that we can tell which loops should be merged.  */
8105           if (TEST_BIT (headers, loop->header->index))
8106             SET_BIT (loops->shared_headers, loop->header->index);
8107           SET_BIT (headers, loop->header->index);
8108
8109           /* Find nodes contained within the loop.  */
8110           loop->nodes = sbitmap_alloc (n_basic_blocks);
8111           loop->num_nodes
8112             = flow_loop_nodes_find (loop->header, loop->latch, loop->nodes);
8113           
8114           /* Compute first and last blocks within the loop.
8115              These are often the same as the loop header and
8116              loop latch respectively, but this is not always
8117              the case.  */
8118           loop->first
8119             = BASIC_BLOCK (sbitmap_first_set_bit (loop->nodes));
8120           loop->last
8121             = BASIC_BLOCK (sbitmap_last_set_bit (loop->nodes));
8122           
8123           if (flags & LOOP_EDGES)
8124             {
8125               /* Find edges which enter the loop header.
8126                  Note that the entry edges should only
8127                  enter the header of a natural loop.  */
8128               loop->num_entries
8129                 = flow_loop_entry_edges_find (loop->header,
8130                                               loop->nodes,
8131                                               &loop->entry_edges);
8132               
8133               /* Find edges which exit the loop.  */
8134               loop->num_exits
8135                 = flow_loop_exit_edges_find (loop->nodes,
8136                                              &loop->exit_edges);
8137               
8138               /* Determine which loop nodes dominate all the exits
8139                  of the loop.  */
8140               loop->exits_doms = sbitmap_alloc (n_basic_blocks);
8141               sbitmap_copy (loop->exits_doms, loop->nodes);
8142               for (j = 0; j < loop->num_exits; j++)
8143                 sbitmap_a_and_b (loop->exits_doms, loop->exits_doms,
8144                                  dom[loop->exit_edges[j]->src->index]);
8145               
8146               /* The header of a natural loop must dominate
8147                  all exits.  */
8148               if (! TEST_BIT (loop->exits_doms, loop->header->index))
8149                 abort ();
8150             }
8151           
8152           if (flags & LOOP_PRE_HEADER)
8153             {
8154               /* Look to see if the loop has a pre-header node.  */
8155               loop->pre_header 
8156                 = flow_loop_pre_header_find (loop->header, dom);
8157
8158               flow_loop_pre_header_scan (loop);
8159             }
8160         }
8161
8162       /* Natural loops with shared headers may either be disjoint or
8163          nested.  Disjoint loops with shared headers cannot be inner
8164          loops and should be merged.  For now just mark loops that share
8165          headers.  */
8166       for (i = 0; i < num_loops; i++)
8167         if (TEST_BIT (loops->shared_headers, loops->array[i].header->index))
8168           loops->array[i].shared = 1;
8169
8170       sbitmap_free (headers);
8171     }
8172
8173   loops->num = num_loops;
8174
8175   /* Save CFG derived information to avoid recomputing it.  */
8176   loops->cfg.dom = dom;
8177   loops->cfg.dfs_order = dfs_order;
8178   loops->cfg.rc_order = rc_order;
8179
8180   /* Build the loop hierarchy tree.  */
8181   flow_loops_tree_build (loops);
8182
8183   /* Assign the loop nesting depth and enclosed loop level for each
8184      loop.  */
8185   loops->levels = flow_loops_level_compute (loops);
8186
8187   return num_loops;
8188 }
8189
8190
8191 /* Update the information regarding the loops in the CFG
8192    specified by LOOPS.  */
8193 int
8194 flow_loops_update (loops, flags)
8195      struct loops *loops;
8196      int flags;
8197 {
8198   /* One day we may want to update the current loop data.  For now
8199      throw away the old stuff and rebuild what we need.  */
8200   if (loops->array)
8201     flow_loops_free (loops);
8202   
8203   return flow_loops_find (loops, flags);
8204 }
8205
8206
8207 /* Return non-zero if edge E enters header of LOOP from outside of LOOP.  */
8208
8209 int
8210 flow_loop_outside_edge_p (loop, e)
8211      const struct loop *loop;
8212      edge e;
8213 {
8214   if (e->dest != loop->header)
8215     abort ();
8216   return (e->src == ENTRY_BLOCK_PTR)
8217     || ! TEST_BIT (loop->nodes, e->src->index);
8218 }
8219
8220 /* Clear LOG_LINKS fields of insns in a chain.
8221    Also clear the global_live_at_{start,end} fields of the basic block
8222    structures.  */
8223
8224 void
8225 clear_log_links (insns)
8226      rtx insns;
8227 {
8228   rtx i;
8229   int b;
8230
8231   for (i = insns; i; i = NEXT_INSN (i))
8232     if (INSN_P (i))
8233       LOG_LINKS (i) = 0;
8234
8235   for (b = 0; b < n_basic_blocks; b++)
8236     {
8237       basic_block bb = BASIC_BLOCK (b);
8238
8239       bb->global_live_at_start = NULL;
8240       bb->global_live_at_end = NULL;
8241     }
8242
8243   ENTRY_BLOCK_PTR->global_live_at_end = NULL;
8244   EXIT_BLOCK_PTR->global_live_at_start = NULL;
8245 }
8246
8247 /* Given a register bitmap, turn on the bits in a HARD_REG_SET that
8248    correspond to the hard registers, if any, set in that map.  This
8249    could be done far more efficiently by having all sorts of special-cases
8250    with moving single words, but probably isn't worth the trouble.  */
8251
8252 void
8253 reg_set_to_hard_reg_set (to, from)
8254      HARD_REG_SET *to;
8255      bitmap from;
8256 {
8257   int i;
8258
8259   EXECUTE_IF_SET_IN_BITMAP
8260     (from, 0, i,
8261      {
8262        if (i >= FIRST_PSEUDO_REGISTER)
8263          return;
8264        SET_HARD_REG_BIT (*to, i);
8265      });
8266 }
8267
8268 /* Called once at intialization time.  */
8269
8270 void
8271 init_flow ()
8272 {
8273   static int initialized;
8274
8275   if (!initialized)
8276     {
8277       gcc_obstack_init (&flow_obstack);
8278       flow_firstobj = (char *) obstack_alloc (&flow_obstack, 0);
8279       initialized = 1;
8280     }
8281   else
8282     {
8283       obstack_free (&flow_obstack, flow_firstobj);
8284       flow_firstobj = (char *) obstack_alloc (&flow_obstack, 0);
8285     }
8286 }