OSDN Git Service

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