OSDN Git Service

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