OSDN Git Service

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