OSDN Git Service

65e8e89ab789d3162d4c7ad64fcd6cc214d2652d
[pf3gnuchains/gcc-fork.git] / gcc / tree-cfg.c
1 /* Control flow functions for trees.
2    Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
3    Contributed by Diego Novillo <dnovillo@redhat.com>
4
5 This file is part of GCC.
6
7 GCC 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 GCC 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 GCC; 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 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "tree.h"
27 #include "rtl.h"
28 #include "tm_p.h"
29 #include "hard-reg-set.h"
30 #include "basic-block.h"
31 #include "output.h"
32 #include "errors.h"
33 #include "flags.h"
34 #include "function.h"
35 #include "expr.h"
36 #include "ggc.h"
37 #include "langhooks.h"
38 #include "diagnostic.h"
39 #include "tree-flow.h"
40 #include "timevar.h"
41 #include "tree-dump.h"
42 #include "tree-pass.h"
43 #include "toplev.h"
44 #include "except.h"
45 #include "cfgloop.h"
46
47 /* This file contains functions for building the Control Flow Graph (CFG)
48    for a function tree.  */
49
50 /* Local declarations.  */
51
52 /* Initial capacity for the basic block array.  */
53 static const int initial_cfg_capacity = 20;
54
55 /* Mapping of labels to their associated blocks.  This can greatly speed up
56    building of the CFG in code with lots of gotos.  */
57 static GTY(()) varray_type label_to_block_map;
58
59 /* CFG statistics.  */
60 struct cfg_stats_d
61 {
62   long num_merged_labels;
63 };
64
65 static struct cfg_stats_d cfg_stats;
66
67 /* Nonzero if we found a computed goto while building basic blocks.  */
68 static bool found_computed_goto;
69
70 /* Basic blocks and flowgraphs.  */
71 static basic_block create_bb (void *, void *, basic_block);
72 static void create_block_annotation (basic_block);
73 static void free_blocks_annotations (void);
74 static void clear_blocks_annotations (void);
75 static void make_blocks (tree);
76 static void factor_computed_gotos (void);
77 static tree tree_block_label (basic_block bb);
78
79 /* Edges.  */
80 static void make_edges (void);
81 static void make_ctrl_stmt_edges (basic_block);
82 static void make_exit_edges (basic_block);
83 static void make_cond_expr_edges (basic_block);
84 static void make_switch_expr_edges (basic_block);
85 static void make_goto_expr_edges (basic_block);
86 static edge tree_redirect_edge_and_branch (edge, basic_block);
87 static edge tree_try_redirect_by_replacing_jump (edge, basic_block);
88 static void split_critical_edges (void);
89
90 /* Various helpers.  */
91 static inline bool stmt_starts_bb_p (tree, tree);
92 static int tree_verify_flow_info (void);
93 static void tree_make_forwarder_block (edge);
94 static bool thread_jumps (void);
95 static bool tree_forwarder_block_p (basic_block);
96 static void bsi_commit_edge_inserts_1 (edge e);
97 static void tree_cfg2vcg (FILE *);
98
99 /* Flowgraph optimization and cleanup.  */
100 static void tree_merge_blocks (basic_block, basic_block);
101 static bool tree_can_merge_blocks_p (basic_block, basic_block);
102 static void remove_bb (basic_block);
103 static void group_case_labels (void);
104 static void cleanup_dead_labels (void);
105 static bool cleanup_control_flow (void);
106 static bool cleanup_control_expr_graph (basic_block, block_stmt_iterator);
107 static edge find_taken_edge_cond_expr (basic_block, tree);
108 static edge find_taken_edge_switch_expr (basic_block, tree);
109 static tree find_case_label_for_value (tree, tree);
110 static bool phi_alternatives_equal (basic_block, edge, edge);
111
112
113 /*---------------------------------------------------------------------------
114                               Create basic blocks
115 ---------------------------------------------------------------------------*/
116
117 /* Entry point to the CFG builder for trees.  TP points to the list of
118    statements to be added to the flowgraph.  */
119
120 static void
121 build_tree_cfg (tree *tp)
122 {
123   /* Register specific tree functions.  */
124   tree_register_cfg_hooks ();
125
126   /* Initialize rbi_pool.  */
127   alloc_rbi_pool ();
128
129   /* Initialize the basic block array.  */
130   init_flow ();
131   n_basic_blocks = 0;
132   last_basic_block = 0;
133   VARRAY_BB_INIT (basic_block_info, initial_cfg_capacity, "basic_block_info");
134   memset ((void *) &cfg_stats, 0, sizeof (cfg_stats));
135
136   /* Build a mapping of labels to their associated blocks.  */
137   VARRAY_BB_INIT (label_to_block_map, initial_cfg_capacity,
138                   "label to block map");
139
140   ENTRY_BLOCK_PTR->next_bb = EXIT_BLOCK_PTR;
141   EXIT_BLOCK_PTR->prev_bb = ENTRY_BLOCK_PTR;
142
143   found_computed_goto = 0;
144   make_blocks (*tp);
145
146   /* Computed gotos are hell to deal with, especially if there are
147      lots of them with a large number of destinations.  So we factor
148      them to a common computed goto location before we build the
149      edge list.  After we convert back to normal form, we will un-factor
150      the computed gotos since factoring introduces an unwanted jump.  */
151   if (found_computed_goto)
152     factor_computed_gotos ();
153
154   /* Make sure there is always at least one block, even if its empty.  */
155   if (n_basic_blocks == 0)
156     create_empty_bb (ENTRY_BLOCK_PTR);
157
158   create_block_annotation (ENTRY_BLOCK_PTR);
159   create_block_annotation (EXIT_BLOCK_PTR);
160   
161   /* Adjust the size of the array.  */
162   VARRAY_GROW (basic_block_info, n_basic_blocks);
163
164   /* To speed up statement iterator walks, we first purge dead labels.  */
165   cleanup_dead_labels ();
166
167   /* Group case nodes to reduce the number of edges.
168      We do this after cleaning up dead labels because otherwise we miss
169      a lot of obvious case merging opportunities.  */
170   group_case_labels ();
171
172   /* Create the edges of the flowgraph.  */
173   make_edges ();
174
175   /* Debugging dumps.  */
176
177   /* Write the flowgraph to a VCG file.  */
178   {
179     int local_dump_flags;
180     FILE *dump_file = dump_begin (TDI_vcg, &local_dump_flags);
181     if (dump_file)
182       {
183         tree_cfg2vcg (dump_file);
184         dump_end (TDI_vcg, dump_file);
185       }
186   }
187
188   /* Dump a textual representation of the flowgraph.  */
189   if (dump_file)
190     dump_tree_cfg (dump_file, dump_flags);
191 }
192
193 static void
194 execute_build_cfg (void)
195 {
196   build_tree_cfg (&DECL_SAVED_TREE (current_function_decl));
197 }
198
199 struct tree_opt_pass pass_build_cfg =
200 {
201   "cfg",                                /* name */
202   NULL,                                 /* gate */
203   execute_build_cfg,                    /* execute */
204   NULL,                                 /* sub */
205   NULL,                                 /* next */
206   0,                                    /* static_pass_number */
207   TV_TREE_CFG,                          /* tv_id */
208   PROP_gimple_leh,                      /* properties_required */
209   PROP_cfg,                             /* properties_provided */
210   0,                                    /* properties_destroyed */
211   0,                                    /* todo_flags_start */
212   TODO_verify_stmts                     /* todo_flags_finish */
213 };
214
215 /* Search the CFG for any computed gotos.  If found, factor them to a 
216    common computed goto site.  Also record the location of that site so
217    that we can un-factor the gotos after we have converted back to 
218    normal form.  */
219
220 static void
221 factor_computed_gotos (void)
222 {
223   basic_block bb;
224   tree factored_label_decl = NULL;
225   tree var = NULL;
226   tree factored_computed_goto_label = NULL;
227   tree factored_computed_goto = NULL;
228
229   /* We know there are one or more computed gotos in this function.
230      Examine the last statement in each basic block to see if the block
231      ends with a computed goto.  */
232         
233   FOR_EACH_BB (bb)
234     {
235       block_stmt_iterator bsi = bsi_last (bb);
236       tree last;
237
238       if (bsi_end_p (bsi))
239         continue;
240       last = bsi_stmt (bsi);
241
242       /* Ignore the computed goto we create when we factor the original
243          computed gotos.  */
244       if (last == factored_computed_goto)
245         continue;
246
247       /* If the last statement is a computed goto, factor it.  */
248       if (computed_goto_p (last))
249         {
250           tree assignment;
251
252           /* The first time we find a computed goto we need to create
253              the factored goto block and the variable each original
254              computed goto will use for their goto destination.  */
255           if (! factored_computed_goto)
256             {
257               basic_block new_bb = create_empty_bb (bb);
258               block_stmt_iterator new_bsi = bsi_start (new_bb);
259
260               /* Create the destination of the factored goto.  Each original
261                  computed goto will put its desired destination into this
262                  variable and jump to the label we create immediately
263                  below.  */
264               var = create_tmp_var (ptr_type_node, "gotovar");
265
266               /* Build a label for the new block which will contain the
267                  factored computed goto.  */
268               factored_label_decl = create_artificial_label ();
269               factored_computed_goto_label
270                 = build1 (LABEL_EXPR, void_type_node, factored_label_decl);
271               bsi_insert_after (&new_bsi, factored_computed_goto_label,
272                                 BSI_NEW_STMT);
273
274               /* Build our new computed goto.  */
275               factored_computed_goto = build1 (GOTO_EXPR, void_type_node, var);
276               bsi_insert_after (&new_bsi, factored_computed_goto,
277                                 BSI_NEW_STMT);
278             }
279
280           /* Copy the original computed goto's destination into VAR.  */
281           assignment = build (MODIFY_EXPR, ptr_type_node,
282                               var, GOTO_DESTINATION (last));
283           bsi_insert_before (&bsi, assignment, BSI_SAME_STMT);
284
285           /* And re-vector the computed goto to the new destination.  */
286           GOTO_DESTINATION (last) = factored_label_decl;
287         }
288     }
289 }
290
291
292 /* Create annotations for a single basic block.  */
293
294 static void
295 create_block_annotation (basic_block bb)
296 {
297   /* Verify that the tree_annotations field is clear.  */
298   if (bb->tree_annotations)
299     abort ();
300   bb->tree_annotations = ggc_alloc_cleared (sizeof (struct bb_ann_d));
301 }
302
303
304 /* Free the annotations for all the basic blocks.  */
305
306 static void free_blocks_annotations (void)
307 {
308   clear_blocks_annotations ();  
309 }
310
311
312 /* Clear the annotations for all the basic blocks.  */
313
314 static void
315 clear_blocks_annotations (void)
316 {
317   basic_block bb;
318
319   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, NULL, next_bb)
320     bb->tree_annotations = NULL;
321 }
322
323
324 /* Build a flowgraph for the statement_list STMT_LIST.  */
325
326 static void
327 make_blocks (tree stmt_list)
328 {
329   tree_stmt_iterator i = tsi_start (stmt_list);
330   tree stmt = NULL;
331   bool start_new_block = true;
332   bool first_stmt_of_list = true;
333   basic_block bb = ENTRY_BLOCK_PTR;
334
335   while (!tsi_end_p (i))
336     {
337       tree prev_stmt;
338
339       prev_stmt = stmt;
340       stmt = tsi_stmt (i);
341
342       /* If the statement starts a new basic block or if we have determined
343          in a previous pass that we need to create a new block for STMT, do
344          so now.  */
345       if (start_new_block || stmt_starts_bb_p (stmt, prev_stmt))
346         {
347           if (!first_stmt_of_list)
348             stmt_list = tsi_split_statement_list_before (&i);
349           bb = create_basic_block (stmt_list, NULL, bb);
350           start_new_block = false;
351         }
352
353       /* Now add STMT to BB and create the subgraphs for special statement
354          codes.  */
355       set_bb_for_stmt (stmt, bb);
356
357       if (computed_goto_p (stmt))
358         found_computed_goto = true;
359
360       /* If STMT is a basic block terminator, set START_NEW_BLOCK for the
361          next iteration.  */
362       if (stmt_ends_bb_p (stmt))
363         start_new_block = true;
364
365       tsi_next (&i);
366       first_stmt_of_list = false;
367     }
368 }
369
370
371 /* Create and return a new empty basic block after bb AFTER.  */
372
373 static basic_block
374 create_bb (void *h, void *e, basic_block after)
375 {
376   basic_block bb;
377
378   if (e)
379     abort ();
380
381   /* Create and initialize a new basic block.  */
382   bb = alloc_block ();
383   memset (bb, 0, sizeof (*bb));
384
385   bb->index = last_basic_block;
386   bb->flags = BB_NEW;
387   bb->stmt_list = h ? h : alloc_stmt_list ();
388
389   /* Add the new block to the linked list of blocks.  */
390   link_block (bb, after);
391
392   /* Grow the basic block array if needed.  */
393   if ((size_t) last_basic_block == VARRAY_SIZE (basic_block_info))
394     {
395       size_t new_size = last_basic_block + (last_basic_block + 3) / 4;
396       VARRAY_GROW (basic_block_info, new_size);
397     }
398
399   /* Add the newly created block to the array.  */
400   BASIC_BLOCK (last_basic_block) = bb;
401
402   create_block_annotation (bb);
403
404   n_basic_blocks++;
405   last_basic_block++;
406
407   initialize_bb_rbi (bb);
408   return bb;
409 }
410
411
412 /*---------------------------------------------------------------------------
413                                  Edge creation
414 ---------------------------------------------------------------------------*/
415
416 /* Join all the blocks in the flowgraph.  */
417
418 static void
419 make_edges (void)
420 {
421   basic_block bb;
422   edge e;
423
424   /* Create an edge from entry to the first block with executable
425      statements in it.  */
426   make_edge (ENTRY_BLOCK_PTR, BASIC_BLOCK (0), EDGE_FALLTHRU);
427
428   /* Traverse basic block array placing edges.  */
429   FOR_EACH_BB (bb)
430     {
431       tree first = first_stmt (bb);
432       tree last = last_stmt (bb);
433
434       if (first)
435         {
436           /* Edges for statements that always alter flow control.  */
437           if (is_ctrl_stmt (last))
438             make_ctrl_stmt_edges (bb);
439
440           /* Edges for statements that sometimes alter flow control.  */
441           if (is_ctrl_altering_stmt (last))
442             make_exit_edges (bb);
443         }
444
445       /* Finally, if no edges were created above, this is a regular
446          basic block that only needs a fallthru edge.  */
447       if (bb->succ == NULL)
448         make_edge (bb, bb->next_bb, EDGE_FALLTHRU);
449     }
450
451   /* If there is a fallthru edge to exit out of the last block, transform it
452      to a return statement.  */
453   for (e = EXIT_BLOCK_PTR->prev_bb->succ; e; e = e->succ_next)
454     if (e->flags & EDGE_FALLTHRU)
455       break;
456
457   if (e && e->dest == EXIT_BLOCK_PTR)
458     {
459       block_stmt_iterator bsi;
460       basic_block ret_bb = EXIT_BLOCK_PTR->prev_bb;
461       tree x;
462
463       /* If E->SRC ends with a call that has an abnormal edge (for EH or
464          nonlocal goto), then we will need to split the edge to insert
465          an explicit return statement.  */
466       if (e != ret_bb->succ || e->succ_next)
467         {
468           ret_bb = split_edge (e);
469           e = ret_bb->succ;
470         }
471       e->flags &= ~EDGE_FALLTHRU;
472
473       x = build (RETURN_EXPR, void_type_node, NULL_TREE);
474       bsi = bsi_last (ret_bb);
475       bsi_insert_after (&bsi, x, BSI_NEW_STMT);
476     }
477
478   /* We do not care about fake edges, so remove any that the CFG
479      builder inserted for completeness.  */
480   remove_fake_edges ();
481
482   /* Clean up the graph and warn for unreachable code.  */
483   cleanup_tree_cfg ();
484 }
485
486
487 /* Create edges for control statement at basic block BB.  */
488
489 static void
490 make_ctrl_stmt_edges (basic_block bb)
491 {
492   tree last = last_stmt (bb);
493   tree first = first_stmt (bb);
494
495 #if defined ENABLE_CHECKING
496   if (last == NULL_TREE)
497     abort();
498 #endif
499
500   if (TREE_CODE (first) == LABEL_EXPR
501       && DECL_NONLOCAL (LABEL_EXPR_LABEL (first)))
502     make_edge (ENTRY_BLOCK_PTR, bb, EDGE_ABNORMAL);
503
504   switch (TREE_CODE (last))
505     {
506     case GOTO_EXPR:
507       make_goto_expr_edges (bb);
508       break;
509
510     case RETURN_EXPR:
511       make_edge (bb, EXIT_BLOCK_PTR, 0);
512       break;
513
514     case COND_EXPR:
515       make_cond_expr_edges (bb);
516       break;
517
518     case SWITCH_EXPR:
519       make_switch_expr_edges (bb);
520       break;
521
522     case RESX_EXPR:
523       make_eh_edges (last);
524       /* Yet another NORETURN hack.  */
525       if (bb->succ == NULL)
526         make_edge (bb, EXIT_BLOCK_PTR, EDGE_FAKE);
527       break;
528
529     default:
530       abort ();
531     }
532 }
533
534
535 /* Create exit edges for statements in block BB that alter the flow of
536    control.  Statements that alter the control flow are 'goto', 'return'
537    and calls to non-returning functions.  */
538
539 static void
540 make_exit_edges (basic_block bb)
541 {
542   tree last = last_stmt (bb);
543
544   if (last == NULL_TREE)
545     abort ();
546
547   switch (TREE_CODE (last))
548     {
549     case CALL_EXPR:
550       /* If this function receives a nonlocal goto, then we need to
551          make edges from this call site to all the nonlocal goto
552          handlers.  */
553       if (TREE_SIDE_EFFECTS (last)
554           && current_function_has_nonlocal_label)
555         make_goto_expr_edges (bb);
556
557       /* If this statement has reachable exception handlers, then
558          create abnormal edges to them.  */
559       make_eh_edges (last);
560
561       /* Some calls are known not to return.  For such calls we create
562          a fake edge.
563
564          We really need to revamp how we build edges so that it's not
565          such a bloody pain to avoid creating edges for this case since
566          all we do is remove these edges when we're done building the
567          CFG.  */
568       if (call_expr_flags (last) & (ECF_NORETURN | ECF_LONGJMP))
569         {
570           make_edge (bb, EXIT_BLOCK_PTR, EDGE_FAKE);
571           return;
572         }
573
574       /* Don't forget the fall-thru edge.  */
575       make_edge (bb, bb->next_bb, EDGE_FALLTHRU);
576       break;
577
578     case MODIFY_EXPR:
579       /* A MODIFY_EXPR may have a CALL_EXPR on its RHS and the CALL_EXPR
580          may have an abnormal edge.  Search the RHS for this case and
581          create any required edges.  */
582       if (TREE_CODE (TREE_OPERAND (last, 1)) == CALL_EXPR
583           && TREE_SIDE_EFFECTS (TREE_OPERAND (last, 1))
584           && current_function_has_nonlocal_label)
585         make_goto_expr_edges (bb);
586
587       make_eh_edges (last);
588       make_edge (bb, bb->next_bb, EDGE_FALLTHRU);
589       break;
590
591     default:
592       abort ();
593     }
594 }
595
596
597 /* Create the edges for a COND_EXPR starting at block BB.
598    At this point, both clauses must contain only simple gotos.  */
599
600 static void
601 make_cond_expr_edges (basic_block bb)
602 {
603   tree entry = last_stmt (bb);
604   basic_block then_bb, else_bb;
605   tree then_label, else_label;
606
607 #if defined ENABLE_CHECKING
608   if (entry == NULL_TREE || TREE_CODE (entry) != COND_EXPR)
609     abort ();
610 #endif
611
612   /* Entry basic blocks for each component.  */
613   then_label = GOTO_DESTINATION (COND_EXPR_THEN (entry));
614   else_label = GOTO_DESTINATION (COND_EXPR_ELSE (entry));
615   then_bb = label_to_block (then_label);
616   else_bb = label_to_block (else_label);
617
618   make_edge (bb, then_bb, EDGE_TRUE_VALUE);
619   make_edge (bb, else_bb, EDGE_FALSE_VALUE);
620 }
621
622
623 /* Create the edges for a SWITCH_EXPR starting at block BB.
624    At this point, the switch body has been lowered and the
625    SWITCH_LABELS filled in, so this is in effect a multi-way branch.  */
626
627 static void
628 make_switch_expr_edges (basic_block bb)
629 {
630   tree entry = last_stmt (bb);
631   size_t i, n;
632   tree vec;
633
634   vec = SWITCH_LABELS (entry);
635   n = TREE_VEC_LENGTH (vec);
636
637   for (i = 0; i < n; ++i)
638     {
639       tree lab = CASE_LABEL (TREE_VEC_ELT (vec, i));
640       basic_block label_bb = label_to_block (lab);
641       make_edge (bb, label_bb, 0);
642     }
643 }
644
645
646 /* Return the basic block holding label DEST.  */
647
648 basic_block
649 label_to_block (tree dest)
650 {
651   return VARRAY_BB (label_to_block_map, LABEL_DECL_UID (dest));
652 }
653
654
655 /* Create edges for a goto statement at block BB.  */
656
657 static void
658 make_goto_expr_edges (basic_block bb)
659 {
660   tree goto_t, dest;
661   basic_block target_bb;
662   int for_call;
663   block_stmt_iterator last = bsi_last (bb);
664
665   goto_t = bsi_stmt (last);
666
667   /* If the last statement is not a GOTO (i.e., it is a RETURN_EXPR,
668      CALL_EXPR or MODIFY_EXPR), then the edge is an abnormal edge resulting
669      from a nonlocal goto.  */
670   if (TREE_CODE (goto_t) != GOTO_EXPR)
671     {
672       dest = error_mark_node;
673       for_call = 1;
674     }
675   else
676     {
677       dest = GOTO_DESTINATION (goto_t);
678       for_call = 0;
679
680       /* A GOTO to a local label creates normal edges.  */
681       if (simple_goto_p (goto_t))
682         {
683           make_edge (bb, label_to_block (dest), EDGE_FALLTHRU);
684           bsi_remove (&last);
685           return;
686         }
687
688       /* Nothing more to do for nonlocal gotos.  */
689       if (TREE_CODE (dest) == LABEL_DECL)
690         return;
691
692       /* Computed gotos remain.  */
693     }
694
695   /* Look for the block starting with the destination label.  In the
696      case of a computed goto, make an edge to any label block we find
697      in the CFG.  */
698   FOR_EACH_BB (target_bb)
699     {
700       block_stmt_iterator bsi;
701
702       for (bsi = bsi_start (target_bb); !bsi_end_p (bsi); bsi_next (&bsi))
703         {
704           tree target = bsi_stmt (bsi);
705
706           if (TREE_CODE (target) != LABEL_EXPR)
707             break;
708
709           if (
710               /* Computed GOTOs.  Make an edge to every label block that has
711                  been marked as a potential target for a computed goto.  */
712               (FORCED_LABEL (LABEL_EXPR_LABEL (target)) && for_call == 0)
713               /* Nonlocal GOTO target.  Make an edge to every label block
714                  that has been marked as a potential target for a nonlocal
715                  goto.  */
716               || (DECL_NONLOCAL (LABEL_EXPR_LABEL (target)) && for_call == 1))
717             {
718               make_edge (bb, target_bb, EDGE_ABNORMAL);
719               break;
720             }
721         }
722     }
723
724   /* Degenerate case of computed goto with no labels.  */
725   if (!for_call && !bb->succ)
726     make_edge (bb, EXIT_BLOCK_PTR, EDGE_FAKE);
727 }
728
729
730 /*---------------------------------------------------------------------------
731                                Flowgraph analysis
732 ---------------------------------------------------------------------------*/
733
734 /* Remove unreachable blocks and other miscellaneous clean up work.  */
735
736 void
737 cleanup_tree_cfg (void)
738 {
739   bool something_changed = true;
740
741   timevar_push (TV_TREE_CLEANUP_CFG);
742
743   /* These three transformations can cascade, so we iterate on them until
744      nothing changes.  */
745   while (something_changed)
746     {
747       something_changed = cleanup_control_flow ();
748       something_changed |= thread_jumps ();
749       something_changed |= delete_unreachable_blocks ();
750     }
751
752   /* Merging the blocks creates no new opportunities for the other
753      optimizations, so do it here.  */
754   merge_seq_blocks ();
755
756   compact_blocks ();
757
758 #ifdef ENABLE_CHECKING
759   verify_flow_info ();
760 #endif
761   timevar_pop (TV_TREE_CLEANUP_CFG);
762 }
763
764
765 /* Cleanup useless labels in basic blocks.  This is something we wish
766    to do early because it allows us to group case labels before creating
767    the edges for the CFG, and it speeds up block statement iterators in
768    all passes later on.
769    We only run this pass once, running it more than once is probably not
770    profitable.  */
771
772 /* A map from basic block index to the leading label of that block.  */
773 static tree *label_for_bb;
774
775 /* Callback for for_each_eh_region.  Helper for cleanup_dead_labels.  */
776 static void
777 update_eh_label (struct eh_region *region)
778 {
779   tree old_label = get_eh_region_tree_label (region);
780   if (old_label)
781     {
782       tree new_label = label_for_bb[label_to_block (old_label)->index];
783       set_eh_region_tree_label (region, new_label);
784     }
785 }
786
787 /* Cleanup redundant labels.  This is a three-steo process:
788      1) Find the leading label for each block.
789      2) Redirect all references to labels to the leading labels.
790      3) Cleanup all useless labels.  */
791
792 static void
793 cleanup_dead_labels (void)
794 {
795   basic_block bb;
796   label_for_bb = xcalloc (last_basic_block, sizeof (tree));
797
798   /* Find a suitable label for each block.  We use the first user-defined
799      label is there is one, or otherwise just the first label we see.  */
800   FOR_EACH_BB (bb)
801     {
802       block_stmt_iterator i;
803
804       for (i = bsi_start (bb); !bsi_end_p (i); bsi_next (&i))
805         {
806           tree label, stmt = bsi_stmt (i);
807
808           if (TREE_CODE (stmt) != LABEL_EXPR)
809             break;
810
811           label = LABEL_EXPR_LABEL (stmt);
812
813           /* If we have not yet seen a label for the current block,
814              remember this one and see if there are more labels.  */
815           if (! label_for_bb[bb->index])
816             {
817               label_for_bb[bb->index] = label;
818               continue;
819             }
820
821           /* If we did see a label for the current block already, but it
822              is an artificially created label, replace it if the current
823              label is a user defined label.  */
824           if (! DECL_ARTIFICIAL (label)
825               && DECL_ARTIFICIAL (label_for_bb[bb->index]))
826             {
827               label_for_bb[bb->index] = label;
828               break;
829             }
830         }
831     }
832
833   /* Now redirect all jumps/branches to the selected label.
834      First do so for each block ending in a control statement.  */
835   FOR_EACH_BB (bb)
836     {
837       tree stmt = last_stmt (bb);
838       if (!stmt)
839         continue;
840
841       switch (TREE_CODE (stmt))
842         {
843         case COND_EXPR:
844           {
845             tree true_branch, false_branch;
846             basic_block true_bb, false_bb;
847
848             true_branch = COND_EXPR_THEN (stmt);
849             false_branch = COND_EXPR_ELSE (stmt);
850             true_bb = label_to_block (GOTO_DESTINATION (true_branch));
851             false_bb = label_to_block (GOTO_DESTINATION (false_branch));
852
853             GOTO_DESTINATION (true_branch) = label_for_bb[true_bb->index];
854             GOTO_DESTINATION (false_branch) = label_for_bb[false_bb->index];
855
856             break;
857           }
858   
859         case SWITCH_EXPR:
860           {
861             size_t i;
862             tree vec = SWITCH_LABELS (stmt);
863             size_t n = TREE_VEC_LENGTH (vec);
864   
865             /* Replace all destination labels.  */
866             for (i = 0; i < n; ++i)
867               {
868                 tree label = CASE_LABEL (TREE_VEC_ELT (vec, i));
869
870                 CASE_LABEL (TREE_VEC_ELT (vec, i)) =
871                   label_for_bb[label_to_block (label)->index];
872               }
873   
874             break;
875           }
876
877         /* We have to handle GOTO_EXPRs until they're removed, and we don't
878            remove them until after we've created the CFG edges.  */
879         case GOTO_EXPR:
880           {
881             tree label = GOTO_DESTINATION (stmt);
882             if (! computed_goto_p (stmt))
883               GOTO_DESTINATION (stmt) =
884                 label_for_bb[label_to_block (label)->index];
885             break;
886           }
887
888         default:
889           break;
890       }
891     }
892
893   for_each_eh_region (update_eh_label);
894
895   /* Finally, purge dead labels.  All user-defined labels and labels that
896      can be the target of non-local gotos are preserved.  */
897   FOR_EACH_BB (bb)
898     {
899       block_stmt_iterator i;
900       tree label_for_this_bb = label_for_bb[bb->index];
901
902       if (! label_for_this_bb)
903         continue;
904
905       for (i = bsi_start (bb); !bsi_end_p (i); )
906         {
907           tree label, stmt = bsi_stmt (i);
908
909           if (TREE_CODE (stmt) != LABEL_EXPR)
910             break;
911
912           label = LABEL_EXPR_LABEL (stmt);
913
914           if (label == label_for_this_bb
915               || ! DECL_ARTIFICIAL (label)
916               || DECL_NONLOCAL (label))
917             bsi_next (&i);
918           else
919             bsi_remove (&i);
920         }
921     }
922
923   free (label_for_bb);
924 }
925
926 /* Look for blocks ending in a multiway branch (a SWITCH_EXPR in GIMPLE),
927    and scan the sorted vector of cases.  Combine the ones jumping to the
928    same label.
929    Eg. three separate entries 1: 2: 3: become one entry 1..3:  */
930
931 static void
932 group_case_labels (void)
933 {
934   basic_block bb;
935
936   FOR_EACH_BB (bb)
937     {
938       tree stmt = last_stmt (bb);
939       if (stmt && TREE_CODE (stmt) == SWITCH_EXPR)
940         {
941           tree labels = SWITCH_LABELS (stmt);
942           int old_size = TREE_VEC_LENGTH (labels);
943           int i, j, new_size = old_size;
944
945           /* Look for possible opportunities to merge cases.
946              Ignore the last element of the label vector because it
947              must be the default case.  */
948           i = 0;
949           while (i < old_size - 2)
950             {
951               tree base_case, base_label, base_high, type;
952               base_case = TREE_VEC_ELT (labels, i);
953
954               if (! base_case)
955                 abort ();
956
957               type = TREE_TYPE (CASE_LOW (base_case));
958               base_label = CASE_LABEL (base_case);
959               base_high = CASE_HIGH (base_case) ?
960                 CASE_HIGH (base_case) : CASE_LOW (base_case);
961
962               /* Try to merge case labels.  Break out when we reach the end
963                  of the label vector or when we cannot merge the next case
964                  label with the current one.  */
965               while (i < old_size - 2)
966                 {
967                   tree merge_case = TREE_VEC_ELT (labels, ++i);
968                   tree merge_label = CASE_LABEL (merge_case);
969                   tree t = int_const_binop (PLUS_EXPR, base_high,
970                                             integer_one_node, 1);
971
972                   /* Merge the cases if they jump to the same place,
973                      and their ranges are consecutive.  */
974                   if (merge_label == base_label
975                       && tree_int_cst_equal (CASE_LOW (merge_case), t))
976                     {
977                       base_high = CASE_HIGH (merge_case) ?
978                         CASE_HIGH (merge_case) : CASE_LOW (merge_case);
979                       CASE_HIGH (base_case) = base_high;
980                       TREE_VEC_ELT (labels, i) = NULL_TREE;
981                       new_size--;
982                     }
983                   else
984                     break;
985                 }
986             }
987
988           /* Compress the case labels in the label vector, and adjust the
989              length of the vector.  */
990           for (i = 0, j = 0; i < new_size; i++)
991             {
992               while (! TREE_VEC_ELT (labels, j))
993                 j++;
994               TREE_VEC_ELT (labels, i) = TREE_VEC_ELT (labels, j++);
995             }
996           TREE_VEC_LENGTH (labels) = new_size;
997         }
998     }
999 }
1000
1001 /* Checks whether we can merge block B into block A.  */
1002
1003 static bool
1004 tree_can_merge_blocks_p (basic_block a, basic_block b)
1005 {
1006   tree stmt;
1007   block_stmt_iterator bsi;
1008
1009   if (!a->succ
1010       || a->succ->succ_next)
1011     return false;
1012
1013   if (a->succ->flags & EDGE_ABNORMAL)
1014     return false;
1015
1016   if (a->succ->dest != b)
1017     return false;
1018
1019   if (b == EXIT_BLOCK_PTR)
1020     return false;
1021   
1022   if (b->pred->pred_next)
1023     return false;
1024
1025   /* If A ends by a statement causing exceptions or something similar, we
1026      cannot merge the blocks.  */
1027   stmt = last_stmt (a);
1028   if (stmt && stmt_ends_bb_p (stmt))
1029     return false;
1030
1031   /* Do not allow a block with only a non-local label to be merged.  */
1032   if (stmt && TREE_CODE (stmt) == LABEL_EXPR
1033       && DECL_NONLOCAL (LABEL_EXPR_LABEL (stmt)))
1034     return false;
1035
1036   /* There may be no phi nodes at the start of b.  Most of these degenerate
1037      phi nodes should be cleaned up by kill_redundant_phi_nodes.  */
1038   if (phi_nodes (b))
1039     return false;
1040
1041   /* Do not remove user labels.  */
1042   for (bsi = bsi_start (b); !bsi_end_p (bsi); bsi_next (&bsi))
1043     {
1044       stmt = bsi_stmt (bsi);
1045       if (TREE_CODE (stmt) != LABEL_EXPR)
1046         break;
1047       if (!DECL_ARTIFICIAL (LABEL_EXPR_LABEL (stmt)))
1048         return false;
1049     }
1050
1051   return true;
1052 }
1053
1054
1055 /* Merge block B into block A.  */
1056
1057 static void
1058 tree_merge_blocks (basic_block a, basic_block b)
1059 {
1060   block_stmt_iterator bsi;
1061   tree_stmt_iterator last;
1062
1063   if (dump_file)
1064     fprintf (dump_file, "Merging blocks %d and %d\n", a->index, b->index);
1065
1066   /* Ensure that B follows A.  */
1067   move_block_after (b, a);
1068
1069   if (!(a->succ->flags & EDGE_FALLTHRU))
1070     abort ();
1071
1072   if (last_stmt (a)
1073       && stmt_ends_bb_p (last_stmt (a)))
1074     abort ();
1075
1076   /* Remove labels from B and set bb_for_stmt to A for other statements.  */
1077   for (bsi = bsi_start (b); !bsi_end_p (bsi);)
1078     {
1079       if (TREE_CODE (bsi_stmt (bsi)) == LABEL_EXPR)
1080         bsi_remove (&bsi);
1081       else
1082         {
1083           set_bb_for_stmt (bsi_stmt (bsi), a);
1084           bsi_next (&bsi);
1085         }
1086     }
1087
1088   /* Merge the chains.  */
1089   last = tsi_last (a->stmt_list);
1090   tsi_link_after (&last, b->stmt_list, TSI_NEW_STMT);
1091   b->stmt_list = NULL;
1092 }
1093
1094
1095 /* Walk the function tree removing unnecessary statements.
1096
1097      * Empty statement nodes are removed
1098
1099      * Unnecessary TRY_FINALLY and TRY_CATCH blocks are removed
1100
1101      * Unnecessary COND_EXPRs are removed
1102
1103      * Some unnecessary BIND_EXPRs are removed
1104
1105    Clearly more work could be done.  The trick is doing the analysis
1106    and removal fast enough to be a net improvement in compile times.
1107
1108    Note that when we remove a control structure such as a COND_EXPR
1109    BIND_EXPR, or TRY block, we will need to repeat this optimization pass
1110    to ensure we eliminate all the useless code.  */
1111
1112 struct rus_data
1113 {
1114   tree *last_goto;
1115   bool repeat;
1116   bool may_throw;
1117   bool may_branch;
1118   bool has_label;
1119 };
1120
1121 static void remove_useless_stmts_1 (tree *, struct rus_data *);
1122
1123 static bool
1124 remove_useless_stmts_warn_notreached (tree stmt)
1125 {
1126   if (EXPR_LOCUS (stmt))
1127     {
1128       warning ("%Hwill never be executed", EXPR_LOCUS (stmt));
1129       return true;
1130     }
1131
1132   switch (TREE_CODE (stmt))
1133     {
1134     case STATEMENT_LIST:
1135       {
1136         tree_stmt_iterator i;
1137         for (i = tsi_start (stmt); !tsi_end_p (i); tsi_next (&i))
1138           if (remove_useless_stmts_warn_notreached (tsi_stmt (i)))
1139             return true;
1140       }
1141       break;
1142
1143     case COND_EXPR:
1144       if (remove_useless_stmts_warn_notreached (COND_EXPR_COND (stmt)))
1145         return true;
1146       if (remove_useless_stmts_warn_notreached (COND_EXPR_THEN (stmt)))
1147         return true;
1148       if (remove_useless_stmts_warn_notreached (COND_EXPR_ELSE (stmt)))
1149         return true;
1150       break;
1151
1152     case TRY_FINALLY_EXPR:
1153     case TRY_CATCH_EXPR:
1154       if (remove_useless_stmts_warn_notreached (TREE_OPERAND (stmt, 0)))
1155         return true;
1156       if (remove_useless_stmts_warn_notreached (TREE_OPERAND (stmt, 1)))
1157         return true;
1158       break;
1159
1160     case CATCH_EXPR:
1161       return remove_useless_stmts_warn_notreached (CATCH_BODY (stmt));
1162     case EH_FILTER_EXPR:
1163       return remove_useless_stmts_warn_notreached (EH_FILTER_FAILURE (stmt));
1164     case BIND_EXPR:
1165       return remove_useless_stmts_warn_notreached (BIND_EXPR_BLOCK (stmt));
1166
1167     default:
1168       /* Not a live container.  */
1169       break;
1170     }
1171
1172   return false;
1173 }
1174
1175 static void
1176 remove_useless_stmts_cond (tree *stmt_p, struct rus_data *data)
1177 {
1178   tree then_clause, else_clause, cond;
1179   bool save_has_label, then_has_label, else_has_label;
1180
1181   save_has_label = data->has_label;
1182   data->has_label = false;
1183   data->last_goto = NULL;
1184
1185   remove_useless_stmts_1 (&COND_EXPR_THEN (*stmt_p), data);
1186
1187   then_has_label = data->has_label;
1188   data->has_label = false;
1189   data->last_goto = NULL;
1190
1191   remove_useless_stmts_1 (&COND_EXPR_ELSE (*stmt_p), data);
1192
1193   else_has_label = data->has_label;
1194   data->has_label = save_has_label | then_has_label | else_has_label;
1195
1196   fold_stmt (stmt_p);
1197   then_clause = COND_EXPR_THEN (*stmt_p);
1198   else_clause = COND_EXPR_ELSE (*stmt_p);
1199   cond = COND_EXPR_COND (*stmt_p);
1200
1201   /* If neither arm does anything at all, we can remove the whole IF.  */
1202   if (!TREE_SIDE_EFFECTS (then_clause) && !TREE_SIDE_EFFECTS (else_clause))
1203     {
1204       *stmt_p = build_empty_stmt ();
1205       data->repeat = true;
1206     }
1207
1208   /* If there are no reachable statements in an arm, then we can
1209      zap the entire conditional.  */
1210   else if (integer_nonzerop (cond) && !else_has_label)
1211     {
1212       if (warn_notreached)
1213         remove_useless_stmts_warn_notreached (else_clause);
1214       *stmt_p = then_clause;
1215       data->repeat = true;
1216     }
1217   else if (integer_zerop (cond) && !then_has_label)
1218     {
1219       if (warn_notreached)
1220         remove_useless_stmts_warn_notreached (then_clause);
1221       *stmt_p = else_clause;
1222       data->repeat = true;
1223     }
1224
1225   /* Check a couple of simple things on then/else with single stmts.  */
1226   else
1227     {
1228       tree then_stmt = expr_only (then_clause);
1229       tree else_stmt = expr_only (else_clause);
1230
1231       /* Notice branches to a common destination.  */
1232       if (then_stmt && else_stmt
1233           && TREE_CODE (then_stmt) == GOTO_EXPR
1234           && TREE_CODE (else_stmt) == GOTO_EXPR
1235           && (GOTO_DESTINATION (then_stmt) == GOTO_DESTINATION (else_stmt)))
1236         {
1237           *stmt_p = then_stmt;
1238           data->repeat = true;
1239         }
1240
1241       /* If the THEN/ELSE clause merely assigns a value to a variable or
1242          parameter which is already known to contain that value, then
1243          remove the useless THEN/ELSE clause.  */
1244       else if (TREE_CODE (cond) == VAR_DECL || TREE_CODE (cond) == PARM_DECL)
1245         {
1246           if (else_stmt
1247               && TREE_CODE (else_stmt) == MODIFY_EXPR
1248               && TREE_OPERAND (else_stmt, 0) == cond
1249               && integer_zerop (TREE_OPERAND (else_stmt, 1)))
1250             COND_EXPR_ELSE (*stmt_p) = alloc_stmt_list ();
1251         }
1252       else if ((TREE_CODE (cond) == EQ_EXPR || TREE_CODE (cond) == NE_EXPR)
1253                && (TREE_CODE (TREE_OPERAND (cond, 0)) == VAR_DECL
1254                    || TREE_CODE (TREE_OPERAND (cond, 0)) == PARM_DECL)
1255                && TREE_CONSTANT (TREE_OPERAND (cond, 1)))
1256         {
1257           tree stmt = (TREE_CODE (cond) == EQ_EXPR
1258                        ? then_stmt : else_stmt);
1259           tree *location = (TREE_CODE (cond) == EQ_EXPR
1260                             ? &COND_EXPR_THEN (*stmt_p)
1261                             : &COND_EXPR_ELSE (*stmt_p));
1262
1263           if (stmt
1264               && TREE_CODE (stmt) == MODIFY_EXPR
1265               && TREE_OPERAND (stmt, 0) == TREE_OPERAND (cond, 0)
1266               && TREE_OPERAND (stmt, 1) == TREE_OPERAND (cond, 1))
1267             *location = alloc_stmt_list ();
1268         }
1269     }
1270
1271   /* Protect GOTOs in the arm of COND_EXPRs from being removed.  They
1272      would be re-introduced during lowering.  */
1273   data->last_goto = NULL;
1274 }
1275
1276
1277 static void
1278 remove_useless_stmts_tf (tree *stmt_p, struct rus_data *data)
1279 {
1280   bool save_may_branch, save_may_throw;
1281   bool this_may_branch, this_may_throw;
1282
1283   /* Collect may_branch and may_throw information for the body only.  */
1284   save_may_branch = data->may_branch;
1285   save_may_throw = data->may_throw;
1286   data->may_branch = false;
1287   data->may_throw = false;
1288   data->last_goto = NULL;
1289
1290   remove_useless_stmts_1 (&TREE_OPERAND (*stmt_p, 0), data);
1291
1292   this_may_branch = data->may_branch;
1293   this_may_throw = data->may_throw;
1294   data->may_branch |= save_may_branch;
1295   data->may_throw |= save_may_throw;
1296   data->last_goto = NULL;
1297
1298   remove_useless_stmts_1 (&TREE_OPERAND (*stmt_p, 1), data);
1299
1300   /* If the body is empty, then we can emit the FINALLY block without
1301      the enclosing TRY_FINALLY_EXPR.  */
1302   if (!TREE_SIDE_EFFECTS (TREE_OPERAND (*stmt_p, 0)))
1303     {
1304       *stmt_p = TREE_OPERAND (*stmt_p, 1);
1305       data->repeat = true;
1306     }
1307
1308   /* If the handler is empty, then we can emit the TRY block without
1309      the enclosing TRY_FINALLY_EXPR.  */
1310   else if (!TREE_SIDE_EFFECTS (TREE_OPERAND (*stmt_p, 1)))
1311     {
1312       *stmt_p = TREE_OPERAND (*stmt_p, 0);
1313       data->repeat = true;
1314     }
1315
1316   /* If the body neither throws, nor branches, then we can safely
1317      string the TRY and FINALLY blocks together.  */
1318   else if (!this_may_branch && !this_may_throw)
1319     {
1320       tree stmt = *stmt_p;
1321       *stmt_p = TREE_OPERAND (stmt, 0);
1322       append_to_statement_list (TREE_OPERAND (stmt, 1), stmt_p);
1323       data->repeat = true;
1324     }
1325 }
1326
1327
1328 static void
1329 remove_useless_stmts_tc (tree *stmt_p, struct rus_data *data)
1330 {
1331   bool save_may_throw, this_may_throw;
1332   tree_stmt_iterator i;
1333   tree stmt;
1334
1335   /* Collect may_throw information for the body only.  */
1336   save_may_throw = data->may_throw;
1337   data->may_throw = false;
1338   data->last_goto = NULL;
1339
1340   remove_useless_stmts_1 (&TREE_OPERAND (*stmt_p, 0), data);
1341
1342   this_may_throw = data->may_throw;
1343   data->may_throw = save_may_throw;
1344
1345   /* If the body cannot throw, then we can drop the entire TRY_CATCH_EXPR.  */
1346   if (!this_may_throw)
1347     {
1348       if (warn_notreached)
1349         remove_useless_stmts_warn_notreached (TREE_OPERAND (*stmt_p, 1));
1350       *stmt_p = TREE_OPERAND (*stmt_p, 0);
1351       data->repeat = true;
1352       return;
1353     }
1354
1355   /* Process the catch clause specially.  We may be able to tell that
1356      no exceptions propagate past this point.  */
1357
1358   this_may_throw = true;
1359   i = tsi_start (TREE_OPERAND (*stmt_p, 1));
1360   stmt = tsi_stmt (i);
1361   data->last_goto = NULL;
1362
1363   switch (TREE_CODE (stmt))
1364     {
1365     case CATCH_EXPR:
1366       for (; !tsi_end_p (i); tsi_next (&i))
1367         {
1368           stmt = tsi_stmt (i);
1369           /* If we catch all exceptions, then the body does not
1370              propagate exceptions past this point.  */
1371           if (CATCH_TYPES (stmt) == NULL)
1372             this_may_throw = false;
1373           data->last_goto = NULL;
1374           remove_useless_stmts_1 (&CATCH_BODY (stmt), data);
1375         }
1376       break;
1377
1378     case EH_FILTER_EXPR:
1379       if (EH_FILTER_MUST_NOT_THROW (stmt))
1380         this_may_throw = false;
1381       else if (EH_FILTER_TYPES (stmt) == NULL)
1382         this_may_throw = false;
1383       remove_useless_stmts_1 (&EH_FILTER_FAILURE (stmt), data);
1384       break;
1385
1386     default:
1387       /* Otherwise this is a cleanup.  */
1388       remove_useless_stmts_1 (&TREE_OPERAND (*stmt_p, 1), data);
1389
1390       /* If the cleanup is empty, then we can emit the TRY block without
1391          the enclosing TRY_CATCH_EXPR.  */
1392       if (!TREE_SIDE_EFFECTS (TREE_OPERAND (*stmt_p, 1)))
1393         {
1394           *stmt_p = TREE_OPERAND (*stmt_p, 0);
1395           data->repeat = true;
1396         }
1397       break;
1398     }
1399   data->may_throw |= this_may_throw;
1400 }
1401
1402
1403 static void
1404 remove_useless_stmts_bind (tree *stmt_p, struct rus_data *data)
1405 {
1406   tree block;
1407
1408   /* First remove anything underneath the BIND_EXPR.  */
1409   remove_useless_stmts_1 (&BIND_EXPR_BODY (*stmt_p), data);
1410
1411   /* If the BIND_EXPR has no variables, then we can pull everything
1412      up one level and remove the BIND_EXPR, unless this is the toplevel
1413      BIND_EXPR for the current function or an inlined function.
1414
1415      When this situation occurs we will want to apply this
1416      optimization again.  */
1417   block = BIND_EXPR_BLOCK (*stmt_p);
1418   if (BIND_EXPR_VARS (*stmt_p) == NULL_TREE
1419       && *stmt_p != DECL_SAVED_TREE (current_function_decl)
1420       && (! block
1421           || ! BLOCK_ABSTRACT_ORIGIN (block)
1422           || (TREE_CODE (BLOCK_ABSTRACT_ORIGIN (block))
1423               != FUNCTION_DECL)))
1424     {
1425       *stmt_p = BIND_EXPR_BODY (*stmt_p);
1426       data->repeat = true;
1427     }
1428 }
1429
1430
1431 static void
1432 remove_useless_stmts_goto (tree *stmt_p, struct rus_data *data)
1433 {
1434   tree dest = GOTO_DESTINATION (*stmt_p);
1435
1436   data->may_branch = true;
1437   data->last_goto = NULL;
1438
1439   /* Record the last goto expr, so that we can delete it if unnecessary.  */
1440   if (TREE_CODE (dest) == LABEL_DECL)
1441     data->last_goto = stmt_p;
1442 }
1443
1444
1445 static void
1446 remove_useless_stmts_label (tree *stmt_p, struct rus_data *data)
1447 {
1448   tree label = LABEL_EXPR_LABEL (*stmt_p);
1449
1450   data->has_label = true;
1451
1452   /* We do want to jump across non-local label receiver code.  */
1453   if (DECL_NONLOCAL (label))
1454     data->last_goto = NULL;
1455
1456   else if (data->last_goto && GOTO_DESTINATION (*data->last_goto) == label)
1457     {
1458       *data->last_goto = build_empty_stmt ();
1459       data->repeat = true;
1460     }
1461
1462   /* ??? Add something here to delete unused labels.  */
1463 }
1464
1465
1466 /* If the function is "const" or "pure", then clear TREE_SIDE_EFFECTS on its
1467    decl.  This allows us to eliminate redundant or useless
1468    calls to "const" functions. 
1469
1470    Gimplifier already does the same operation, but we may notice functions
1471    being const and pure once their calls has been gimplified, so we need
1472    to update the flag.  */
1473
1474 static void
1475 update_call_expr_flags (tree call)
1476 {
1477   tree decl = get_callee_fndecl (call);
1478   if (!decl)
1479     return;
1480   if (call_expr_flags (call) & (ECF_CONST | ECF_PURE))
1481     TREE_SIDE_EFFECTS (call) = 0;
1482   if (TREE_NOTHROW (decl))
1483     TREE_NOTHROW (call) = 1;
1484 }
1485
1486
1487 /* T is CALL_EXPR.  Set current_function_calls_* flags.  */
1488
1489 void
1490 notice_special_calls (tree t)
1491 {
1492   int flags = call_expr_flags (t);
1493
1494   if (flags & ECF_MAY_BE_ALLOCA)
1495     current_function_calls_alloca = true;
1496   if (flags & ECF_RETURNS_TWICE)
1497     current_function_calls_setjmp = true;
1498 }
1499
1500
1501 /* Clear flags set by notice_special_calls.  Used by dead code removal
1502    to update the flags.  */
1503
1504 void
1505 clear_special_calls (void)
1506 {
1507   current_function_calls_alloca = false;
1508   current_function_calls_setjmp = false;
1509 }
1510
1511
1512 static void
1513 remove_useless_stmts_1 (tree *tp, struct rus_data *data)
1514 {
1515   tree t = *tp;
1516
1517   switch (TREE_CODE (t))
1518     {
1519     case COND_EXPR:
1520       remove_useless_stmts_cond (tp, data);
1521       break;
1522
1523     case TRY_FINALLY_EXPR:
1524       remove_useless_stmts_tf (tp, data);
1525       break;
1526
1527     case TRY_CATCH_EXPR:
1528       remove_useless_stmts_tc (tp, data);
1529       break;
1530
1531     case BIND_EXPR:
1532       remove_useless_stmts_bind (tp, data);
1533       break;
1534
1535     case GOTO_EXPR:
1536       remove_useless_stmts_goto (tp, data);
1537       break;
1538
1539     case LABEL_EXPR:
1540       remove_useless_stmts_label (tp, data);
1541       break;
1542
1543     case RETURN_EXPR:
1544       fold_stmt (tp);
1545       data->last_goto = NULL;
1546       data->may_branch = true;
1547       break;
1548
1549     case CALL_EXPR:
1550       fold_stmt (tp);
1551       data->last_goto = NULL;
1552       notice_special_calls (t);
1553       update_call_expr_flags (t);
1554       if (tree_could_throw_p (t))
1555         data->may_throw = true;
1556       break;
1557
1558     case MODIFY_EXPR:
1559       data->last_goto = NULL;
1560       fold_stmt (tp);
1561       if (TREE_CODE (TREE_OPERAND (t, 1)) == CALL_EXPR)
1562         {
1563           update_call_expr_flags (TREE_OPERAND (t, 1));
1564           notice_special_calls (TREE_OPERAND (t, 1));
1565         }
1566       if (tree_could_throw_p (t))
1567         data->may_throw = true;
1568       break;
1569
1570     case STATEMENT_LIST:
1571       {
1572         tree_stmt_iterator i = tsi_start (t);
1573         while (!tsi_end_p (i))
1574           {
1575             t = tsi_stmt (i);
1576             if (IS_EMPTY_STMT (t))
1577               {
1578                 tsi_delink (&i);
1579                 continue;
1580               }
1581             
1582             remove_useless_stmts_1 (tsi_stmt_ptr (i), data);
1583
1584             t = tsi_stmt (i);
1585             if (TREE_CODE (t) == STATEMENT_LIST)
1586               {
1587                 tsi_link_before (&i, t, TSI_SAME_STMT);
1588                 tsi_delink (&i);
1589               }
1590             else
1591               tsi_next (&i);
1592           }
1593       }
1594       break;
1595     case SWITCH_EXPR:
1596       fold_stmt (tp);
1597       data->last_goto = NULL;
1598       break;
1599
1600     default:
1601       data->last_goto = NULL;
1602       break;
1603     }
1604 }
1605
1606 static void
1607 remove_useless_stmts (void)
1608 {
1609   struct rus_data data;
1610
1611   clear_special_calls ();
1612
1613   do
1614     {
1615       memset (&data, 0, sizeof (data));
1616       remove_useless_stmts_1 (&DECL_SAVED_TREE (current_function_decl), &data);
1617     }
1618   while (data.repeat);
1619 }
1620
1621
1622 struct tree_opt_pass pass_remove_useless_stmts = 
1623 {
1624   "useless",                            /* name */
1625   NULL,                                 /* gate */
1626   remove_useless_stmts,                 /* execute */
1627   NULL,                                 /* sub */
1628   NULL,                                 /* next */
1629   0,                                    /* static_pass_number */
1630   0,                                    /* tv_id */
1631   PROP_gimple_any,                      /* properties_required */
1632   0,                                    /* properties_provided */
1633   0,                                    /* properties_destroyed */
1634   0,                                    /* todo_flags_start */
1635   TODO_dump_func                        /* todo_flags_finish */
1636 };
1637
1638
1639 /* Remove obviously useless statements in basic block BB.  */
1640
1641 static void
1642 cfg_remove_useless_stmts_bb (basic_block bb)
1643 {
1644   block_stmt_iterator bsi;
1645   tree stmt = NULL_TREE;
1646   tree cond, var = NULL_TREE, val = NULL_TREE;
1647   struct var_ann_d *ann;
1648
1649   /* Check whether we come here from a condition, and if so, get the
1650      condition.  */
1651   if (!bb->pred
1652       || bb->pred->pred_next
1653       || !(bb->pred->flags & (EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
1654     return;
1655
1656   cond = COND_EXPR_COND (last_stmt (bb->pred->src));
1657
1658   if (TREE_CODE (cond) == VAR_DECL || TREE_CODE (cond) == PARM_DECL)
1659     {
1660       var = cond;
1661       val = (bb->pred->flags & EDGE_FALSE_VALUE
1662              ? boolean_false_node : boolean_true_node);
1663     }
1664   else if (TREE_CODE (cond) == TRUTH_NOT_EXPR
1665            && (TREE_CODE (TREE_OPERAND (cond, 0)) == VAR_DECL
1666                || TREE_CODE (TREE_OPERAND (cond, 0)) == PARM_DECL))
1667     {
1668       var = TREE_OPERAND (cond, 0);
1669       val = (bb->pred->flags & EDGE_FALSE_VALUE
1670              ? boolean_true_node : boolean_false_node);
1671     }
1672   else
1673     {
1674       if (bb->pred->flags & EDGE_FALSE_VALUE)
1675         cond = invert_truthvalue (cond);
1676       if (TREE_CODE (cond) == EQ_EXPR
1677           && (TREE_CODE (TREE_OPERAND (cond, 0)) == VAR_DECL
1678               || TREE_CODE (TREE_OPERAND (cond, 0)) == PARM_DECL)
1679           && (TREE_CODE (TREE_OPERAND (cond, 1)) == VAR_DECL
1680               || TREE_CODE (TREE_OPERAND (cond, 1)) == PARM_DECL
1681               || TREE_CONSTANT (TREE_OPERAND (cond, 1))))
1682         {
1683           var = TREE_OPERAND (cond, 0);
1684           val = TREE_OPERAND (cond, 1);
1685         }
1686       else
1687         return;
1688     }
1689
1690   /* Only work for normal local variables.  */
1691   ann = var_ann (var);
1692   if (!ann
1693       || ann->may_aliases
1694       || TREE_ADDRESSABLE (var))
1695     return;
1696
1697   if (! TREE_CONSTANT (val))
1698     {
1699       ann = var_ann (val);
1700       if (!ann
1701           || ann->may_aliases
1702           || TREE_ADDRESSABLE (val))
1703         return;
1704     }
1705
1706   /* Ignore floating point variables, since comparison behaves weird for
1707      them.  */
1708   if (FLOAT_TYPE_P (TREE_TYPE (var)))
1709     return;
1710
1711   for (bsi = bsi_start (bb); !bsi_end_p (bsi);)
1712     {
1713       stmt = bsi_stmt (bsi);
1714
1715       /* If the THEN/ELSE clause merely assigns a value to a variable/parameter
1716          which is already known to contain that value, then remove the useless
1717          THEN/ELSE clause.  */
1718       if (TREE_CODE (stmt) == MODIFY_EXPR
1719           && TREE_OPERAND (stmt, 0) == var
1720           && operand_equal_p (val, TREE_OPERAND (stmt, 1), 0))
1721         {
1722           bsi_remove (&bsi);
1723           continue;
1724         }
1725
1726       /* Invalidate the var if we encounter something that could modify it.  */
1727       if (TREE_CODE (stmt) == ASM_EXPR
1728           || TREE_CODE (stmt) == VA_ARG_EXPR
1729           || (TREE_CODE (stmt) == MODIFY_EXPR
1730               && (TREE_OPERAND (stmt, 0) == var
1731                   || TREE_OPERAND (stmt, 0) == val
1732                   || TREE_CODE (TREE_OPERAND (stmt, 1)) == VA_ARG_EXPR)))
1733         return;
1734   
1735       bsi_next (&bsi);
1736     }
1737 }
1738
1739
1740 /* A CFG-aware version of remove_useless_stmts.  */
1741
1742 void
1743 cfg_remove_useless_stmts (void)
1744 {
1745   basic_block bb;
1746
1747 #ifdef ENABLE_CHECKING
1748   verify_flow_info ();
1749 #endif
1750
1751   FOR_EACH_BB (bb)
1752     {
1753       cfg_remove_useless_stmts_bb (bb);
1754     }
1755 }
1756
1757
1758 /* Remove PHI nodes associated with basic block BB and all edges out of BB.  */
1759
1760 static void
1761 remove_phi_nodes_and_edges_for_unreachable_block (basic_block bb)
1762 {
1763   tree phi;
1764
1765   /* Since this block is no longer reachable, we can just delete all
1766      of its PHI nodes.  */
1767   phi = phi_nodes (bb);
1768   while (phi)
1769     {
1770       tree next = TREE_CHAIN (phi);
1771       remove_phi_node (phi, NULL_TREE, bb);
1772       phi = next;
1773     }
1774
1775   /* Remove edges to BB's successors.  */
1776   while (bb->succ != NULL)
1777     ssa_remove_edge (bb->succ);
1778 }
1779
1780
1781 /* Remove statements of basic block BB.  */
1782
1783 static void
1784 remove_bb (basic_block bb)
1785 {
1786   block_stmt_iterator i;
1787   location_t *loc = NULL;
1788
1789   if (dump_file)
1790     {
1791       fprintf (dump_file, "Removing basic block %d\n", bb->index);
1792       if (dump_flags & TDF_DETAILS)
1793         {
1794           dump_bb (bb, dump_file, 0);
1795           fprintf (dump_file, "\n");
1796         }
1797     }
1798
1799   /* Remove all the instructions in the block.  */
1800   for (i = bsi_start (bb); !bsi_end_p (i); bsi_remove (&i))
1801     {
1802       tree stmt = bsi_stmt (i);
1803
1804       set_bb_for_stmt (stmt, NULL);
1805
1806       /* Don't warn for removed gotos.  Gotos are often removed due to
1807          jump threading, thus resulting in bogus warnings.  Not great,
1808          since this way we lose warnings for gotos in the original
1809          program that are indeed unreachable.  */
1810       if (TREE_CODE (stmt) != GOTO_EXPR && EXPR_LOCUS (stmt) && !loc)
1811         loc = EXPR_LOCUS (stmt);
1812     }
1813
1814   /* If requested, give a warning that the first statement in the
1815      block is unreachable.  We walk statements backwards in the
1816      loop above, so the last statement we process is the first statement
1817      in the block.  */
1818   if (warn_notreached && loc)
1819     warning ("%Hwill never be executed", loc);
1820
1821   remove_phi_nodes_and_edges_for_unreachable_block (bb);
1822 }
1823
1824
1825 /* Examine BB to determine if it is a forwarding block (a block which only
1826    transfers control to a new destination).  If BB is a forwarding block,
1827    then return the edge leading to the ultimate destination.  */
1828
1829 edge
1830 tree_block_forwards_to (basic_block bb)
1831 {
1832   block_stmt_iterator bsi;
1833   bb_ann_t ann = bb_ann (bb);
1834   tree stmt;
1835
1836   /* If this block is not forwardable, then avoid useless work.  */
1837   if (! ann->forwardable)
1838     return NULL;
1839
1840   /* Set this block to not be forwardable.  This prevents infinite loops since
1841      any block currently under examination is considered non-forwardable.  */
1842   ann->forwardable = 0;
1843
1844   /* No forwarding is possible if this block is a special block (ENTRY/EXIT),
1845      this block has more than one successor, this block's single successor is
1846      reached via an abnormal edge, this block has phi nodes, or this block's
1847      single successor has phi nodes.  */
1848   if (bb == EXIT_BLOCK_PTR
1849       || bb == ENTRY_BLOCK_PTR
1850       || !bb->succ
1851       || bb->succ->succ_next
1852       || bb->succ->dest == EXIT_BLOCK_PTR
1853       || (bb->succ->flags & EDGE_ABNORMAL) != 0
1854       || phi_nodes (bb)
1855       || phi_nodes (bb->succ->dest))
1856     return NULL;
1857
1858   /* Walk past any labels at the start of this block.  */
1859   for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
1860     {
1861       stmt = bsi_stmt (bsi);
1862       if (TREE_CODE (stmt) != LABEL_EXPR)
1863         break;
1864     }
1865
1866   /* If we reached the end of this block we may be able to optimize this
1867      case.  */
1868   if (bsi_end_p (bsi))
1869     {
1870       edge dest;
1871
1872       /* Recursive call to pick up chains of forwarding blocks.  */
1873       dest = tree_block_forwards_to (bb->succ->dest);
1874
1875       /* If none found, we forward to bb->succ at minimum.  */
1876       if (!dest)
1877         dest = bb->succ;
1878
1879       ann->forwardable = 1;
1880       return dest;
1881     }
1882
1883   /* No forwarding possible.  */
1884   return NULL;
1885 }
1886
1887
1888 /* Try to remove superfluous control structures.  */
1889
1890 static bool
1891 cleanup_control_flow (void)
1892 {
1893   basic_block bb;
1894   block_stmt_iterator bsi;
1895   bool retval = false;
1896   tree stmt;
1897
1898   FOR_EACH_BB (bb)
1899     {
1900       bsi = bsi_last (bb);
1901
1902       if (bsi_end_p (bsi))
1903         continue;
1904       
1905       stmt = bsi_stmt (bsi);
1906       if (TREE_CODE (stmt) == COND_EXPR
1907           || TREE_CODE (stmt) == SWITCH_EXPR)
1908         retval |= cleanup_control_expr_graph (bb, bsi);
1909     }
1910   return retval;
1911 }
1912
1913
1914 /* Disconnect an unreachable block in the control expression starting
1915    at block BB.  */
1916
1917 static bool
1918 cleanup_control_expr_graph (basic_block bb, block_stmt_iterator bsi)
1919 {
1920   edge taken_edge;
1921   bool retval = false;
1922   tree expr = bsi_stmt (bsi), val;
1923
1924   if (bb->succ->succ_next)
1925     {
1926       edge e, next;
1927
1928       switch (TREE_CODE (expr))
1929         {
1930         case COND_EXPR:
1931           val = COND_EXPR_COND (expr);
1932           break;
1933
1934         case SWITCH_EXPR:
1935           val = SWITCH_COND (expr);
1936           if (TREE_CODE (val) != INTEGER_CST)
1937             return false;
1938           break;
1939
1940         default:
1941           abort ();
1942         }
1943
1944       taken_edge = find_taken_edge (bb, val);
1945       if (!taken_edge)
1946         return false;
1947
1948       /* Remove all the edges except the one that is always executed.  */
1949       for (e = bb->succ; e; e = next)
1950         {
1951           next = e->succ_next;
1952           if (e != taken_edge)
1953             {
1954               taken_edge->probability += e->probability;
1955               taken_edge->count += e->count;
1956               ssa_remove_edge (e);
1957               retval = true;
1958             }
1959         }
1960       if (taken_edge->probability > REG_BR_PROB_BASE)
1961         taken_edge->probability = REG_BR_PROB_BASE;
1962     }
1963   else
1964     taken_edge = bb->succ;
1965
1966   bsi_remove (&bsi);
1967   taken_edge->flags = EDGE_FALLTHRU;
1968
1969   /* We removed some paths from the cfg.  */
1970   if (dom_computed[CDI_DOMINATORS] >= DOM_CONS_OK)
1971     dom_computed[CDI_DOMINATORS] = DOM_CONS_OK;
1972
1973   return retval;
1974 }
1975
1976
1977 /* Given a control block BB and a constant value VAL, return the edge that
1978    will be taken out of the block.  If VAL does not match a unique edge,
1979    NULL is returned.  */
1980
1981 edge
1982 find_taken_edge (basic_block bb, tree val)
1983 {
1984   tree stmt;
1985
1986   stmt = last_stmt (bb);
1987
1988 #if defined ENABLE_CHECKING
1989   if (stmt == NULL_TREE || !is_ctrl_stmt (stmt))
1990     abort ();
1991 #endif
1992
1993   /* If VAL is not a constant, we can't determine which edge might
1994      be taken.  */
1995   if (val == NULL || !really_constant_p (val))
1996     return NULL;
1997
1998   if (TREE_CODE (stmt) == COND_EXPR)
1999     return find_taken_edge_cond_expr (bb, val);
2000
2001   if (TREE_CODE (stmt) == SWITCH_EXPR)
2002     return find_taken_edge_switch_expr (bb, val);
2003
2004   return bb->succ;
2005 }
2006
2007
2008 /* Given a constant value VAL and the entry block BB to a COND_EXPR
2009    statement, determine which of the two edges will be taken out of the
2010    block.  Return NULL if either edge may be taken.  */
2011
2012 static edge
2013 find_taken_edge_cond_expr (basic_block bb, tree val)
2014 {
2015   edge true_edge, false_edge;
2016
2017   extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
2018
2019   /* If both edges of the branch lead to the same basic block, it doesn't
2020      matter which edge is taken.  */
2021   if (true_edge->dest == false_edge->dest)
2022     return true_edge;
2023
2024   /* Otherwise, try to determine which branch of the if() will be taken.
2025      If VAL is a constant but it can't be reduced to a 0 or a 1, then
2026      we don't really know which edge will be taken at runtime.  This
2027      may happen when comparing addresses (e.g., if (&var1 == 4)).  */
2028   if (integer_nonzerop (val))
2029     return true_edge;
2030   else if (integer_zerop (val))
2031     return false_edge;
2032   else
2033     return NULL;
2034 }
2035
2036
2037 /* Given a constant value VAL and the entry block BB to a SWITCH_EXPR
2038    statement, determine which edge will be taken out of the block.  Return
2039    NULL if any edge may be taken.  */
2040
2041 static edge
2042 find_taken_edge_switch_expr (basic_block bb, tree val)
2043 {
2044   tree switch_expr, taken_case;
2045   basic_block dest_bb;
2046   edge e;
2047
2048   if (TREE_CODE (val) != INTEGER_CST)
2049     return NULL;
2050
2051   switch_expr = last_stmt (bb);
2052   taken_case = find_case_label_for_value (switch_expr, val);
2053   dest_bb = label_to_block (CASE_LABEL (taken_case));
2054
2055   e = find_edge (bb, dest_bb);
2056   if (!e)
2057     abort ();
2058   return e;
2059 }
2060
2061
2062 /* Return the CASE_LABEL_EXPR that SWITCH_EXPR will take for VAL.
2063    We can make optimal use here of the fact that the case labels are
2064    sorted: We can do a binary search for a case matching VAL.  */
2065
2066 static tree
2067 find_case_label_for_value (tree switch_expr, tree val)
2068 {
2069   tree vec = SWITCH_LABELS (switch_expr);
2070   size_t low, high, n = TREE_VEC_LENGTH (vec);
2071   tree default_case = TREE_VEC_ELT (vec, n - 1);
2072
2073   for (low = -1, high = n - 1; high - low > 1; )
2074     {
2075       size_t i = (high + low) / 2;
2076       tree t = TREE_VEC_ELT (vec, i);
2077       int cmp;
2078
2079       /* Cache the result of comparing CASE_LOW and val.  */
2080       cmp = tree_int_cst_compare (CASE_LOW (t), val);
2081
2082       if (cmp > 0)
2083         high = i;
2084       else
2085         low = i;
2086
2087       if (CASE_HIGH (t) == NULL)
2088         {
2089           /* A singe-valued case label.  */
2090           if (cmp == 0)
2091             return t;
2092         }
2093       else
2094         {
2095           /* A case range.  We can only handle integer ranges.  */
2096           if (cmp <= 0 && tree_int_cst_compare (CASE_HIGH (t), val) >= 0)
2097             return t;
2098         }
2099     }
2100
2101   return default_case;
2102 }
2103
2104
2105 /* If all the PHI nodes in DEST have alternatives for E1 and E2 and
2106    those alternatives are equal in each of the PHI nodes, then return
2107    true, else return false.  */
2108
2109 static bool
2110 phi_alternatives_equal (basic_block dest, edge e1, edge e2)
2111 {
2112   tree phi, val1, val2;
2113   int n1, n2;
2114
2115   for (phi = phi_nodes (dest); phi; phi = TREE_CHAIN (phi))
2116     {
2117       n1 = phi_arg_from_edge (phi, e1);
2118       n2 = phi_arg_from_edge (phi, e2);
2119
2120 #ifdef ENABLE_CHECKING
2121       if (n1 < 0 || n2 < 0)
2122         abort ();
2123 #endif
2124
2125       val1 = PHI_ARG_DEF (phi, n1);
2126       val2 = PHI_ARG_DEF (phi, n2);
2127
2128       if (!operand_equal_p (val1, val2, 0))
2129         return false;
2130     }
2131
2132   return true;
2133 }
2134
2135
2136 /* Computing the Dominance Frontier:
2137
2138    As described in Morgan, section 3.5, this may be done simply by
2139    walking the dominator tree bottom-up, computing the frontier for
2140    the children before the parent.  When considering a block B,
2141    there are two cases:
2142
2143    (1) A flow graph edge leaving B that does not lead to a child
2144    of B in the dominator tree must be a block that is either equal
2145    to B or not dominated by B.  Such blocks belong in the frontier
2146    of B.
2147
2148    (2) Consider a block X in the frontier of one of the children C
2149    of B.  If X is not equal to B and is not dominated by B, it
2150    is in the frontier of B.  */
2151
2152 static void
2153 compute_dominance_frontiers_1 (bitmap *frontiers, basic_block bb, sbitmap done)
2154 {
2155   edge e;
2156   basic_block c;
2157
2158   SET_BIT (done, bb->index);
2159
2160   /* Do the frontier of the children first.  Not all children in the
2161      dominator tree (blocks dominated by this one) are children in the
2162      CFG, so check all blocks.  */
2163   for (c = first_dom_son (CDI_DOMINATORS, bb);
2164        c;
2165        c = next_dom_son (CDI_DOMINATORS, c))
2166     {
2167       if (! TEST_BIT (done, c->index))
2168         compute_dominance_frontiers_1 (frontiers, c, done);
2169     }
2170       
2171   /* Find blocks conforming to rule (1) above.  */
2172   for (e = bb->succ; e; e = e->succ_next)
2173     {
2174       if (e->dest == EXIT_BLOCK_PTR)
2175         continue;
2176       if (get_immediate_dominator (CDI_DOMINATORS, e->dest) != bb)
2177         bitmap_set_bit (frontiers[bb->index], e->dest->index);
2178     }
2179
2180   /* Find blocks conforming to rule (2).  */
2181   for (c = first_dom_son (CDI_DOMINATORS, bb);
2182        c;
2183        c = next_dom_son (CDI_DOMINATORS, c))
2184     {
2185       int x;
2186
2187       EXECUTE_IF_SET_IN_BITMAP (frontiers[c->index], 0, x,
2188         {
2189           if (get_immediate_dominator (CDI_DOMINATORS, BASIC_BLOCK (x)) != bb)
2190             bitmap_set_bit (frontiers[bb->index], x);
2191         });
2192     }
2193 }
2194
2195
2196 void
2197 compute_dominance_frontiers (bitmap *frontiers)
2198 {
2199   sbitmap done = sbitmap_alloc (last_basic_block);
2200
2201   timevar_push (TV_DOM_FRONTIERS);
2202
2203   sbitmap_zero (done);
2204
2205   compute_dominance_frontiers_1 (frontiers, ENTRY_BLOCK_PTR->succ->dest, done);
2206
2207   sbitmap_free (done);
2208
2209   timevar_pop (TV_DOM_FRONTIERS);
2210 }
2211
2212
2213
2214 /*---------------------------------------------------------------------------
2215                               Debugging functions
2216 ---------------------------------------------------------------------------*/
2217
2218 /* Dump tree-specific information of block BB to file OUTF.  */
2219
2220 void
2221 tree_dump_bb (basic_block bb, FILE *outf, int indent)
2222 {
2223   dump_generic_bb (outf, bb, indent, TDF_VOPS);
2224 }
2225
2226
2227 /* Dump a basic block on stderr.  */
2228
2229 void
2230 debug_tree_bb (basic_block bb)
2231 {
2232   dump_bb (bb, stderr, 0);
2233 }
2234
2235
2236 /* Dump basic block with index N on stderr.  */
2237
2238 basic_block
2239 debug_tree_bb_n (int n)
2240 {
2241   debug_tree_bb (BASIC_BLOCK (n));
2242   return BASIC_BLOCK (n);
2243 }        
2244
2245
2246 /* Dump the CFG on stderr.
2247
2248    FLAGS are the same used by the tree dumping functions
2249    (see TDF_* in tree.h).  */
2250
2251 void
2252 debug_tree_cfg (int flags)
2253 {
2254   dump_tree_cfg (stderr, flags);
2255 }
2256
2257
2258 /* Dump the program showing basic block boundaries on the given FILE.
2259
2260    FLAGS are the same used by the tree dumping functions (see TDF_* in
2261    tree.h).  */
2262
2263 void
2264 dump_tree_cfg (FILE *file, int flags)
2265 {
2266   if (flags & TDF_DETAILS)
2267     {
2268       const char *funcname
2269         = lang_hooks.decl_printable_name (current_function_decl, 2);
2270
2271       fputc ('\n', file);
2272       fprintf (file, ";; Function %s\n\n", funcname);
2273       fprintf (file, ";; \n%d basic blocks, %d edges, last basic block %d.\n\n",
2274                n_basic_blocks, n_edges, last_basic_block);
2275
2276       brief_dump_cfg (file);
2277       fprintf (file, "\n");
2278     }
2279
2280   if (flags & TDF_STATS)
2281     dump_cfg_stats (file);
2282
2283   dump_function_to_file (current_function_decl, file, flags | TDF_BLOCKS);
2284 }
2285
2286
2287 /* Dump CFG statistics on FILE.  */
2288
2289 void
2290 dump_cfg_stats (FILE *file)
2291 {
2292   static long max_num_merged_labels = 0;
2293   unsigned long size, total = 0;
2294   long n_edges;
2295   basic_block bb;
2296   const char * const fmt_str   = "%-30s%-13s%12s\n";
2297   const char * const fmt_str_1 = "%-30s%13lu%11lu%c\n";
2298   const char * const fmt_str_3 = "%-43s%11lu%c\n";
2299   const char *funcname
2300     = lang_hooks.decl_printable_name (current_function_decl, 2);
2301
2302
2303   fprintf (file, "\nCFG Statistics for %s\n\n", funcname);
2304
2305   fprintf (file, "---------------------------------------------------------\n");
2306   fprintf (file, fmt_str, "", "  Number of  ", "Memory");
2307   fprintf (file, fmt_str, "", "  instances  ", "used ");
2308   fprintf (file, "---------------------------------------------------------\n");
2309
2310   size = n_basic_blocks * sizeof (struct basic_block_def);
2311   total += size;
2312   fprintf (file, fmt_str_1, "Basic blocks", n_basic_blocks, SCALE (size),
2313            LABEL (size));
2314
2315   n_edges = 0;
2316   FOR_EACH_BB (bb)
2317     {
2318       edge e;
2319       for (e = bb->succ; e; e = e->succ_next)
2320         n_edges++;
2321     }
2322   size = n_edges * sizeof (struct edge_def);
2323   total += size;
2324   fprintf (file, fmt_str_1, "Edges", n_edges, SCALE (size), LABEL (size));
2325
2326   size = n_basic_blocks * sizeof (struct bb_ann_d);
2327   total += size;
2328   fprintf (file, fmt_str_1, "Basic block annotations", n_basic_blocks,
2329            SCALE (size), LABEL (size));
2330
2331   fprintf (file, "---------------------------------------------------------\n");
2332   fprintf (file, fmt_str_3, "Total memory used by CFG data", SCALE (total),
2333            LABEL (total));
2334   fprintf (file, "---------------------------------------------------------\n");
2335   fprintf (file, "\n");
2336
2337   if (cfg_stats.num_merged_labels > max_num_merged_labels)
2338     max_num_merged_labels = cfg_stats.num_merged_labels;
2339
2340   fprintf (file, "Coalesced label blocks: %ld (Max so far: %ld)\n",
2341            cfg_stats.num_merged_labels, max_num_merged_labels);
2342
2343   fprintf (file, "\n");
2344 }
2345
2346
2347 /* Dump CFG statistics on stderr.  Keep extern so that it's always
2348    linked in the final executable.  */
2349
2350 void
2351 debug_cfg_stats (void)
2352 {
2353   dump_cfg_stats (stderr);
2354 }
2355
2356
2357 /* Dump the flowgraph to a .vcg FILE.  */
2358
2359 static void
2360 tree_cfg2vcg (FILE *file)
2361 {
2362   edge e;
2363   basic_block bb;
2364   const char *funcname
2365     = lang_hooks.decl_printable_name (current_function_decl, 2);
2366
2367   /* Write the file header.  */
2368   fprintf (file, "graph: { title: \"%s\"\n", funcname);
2369   fprintf (file, "node: { title: \"ENTRY\" label: \"ENTRY\" }\n");
2370   fprintf (file, "node: { title: \"EXIT\" label: \"EXIT\" }\n");
2371
2372   /* Write blocks and edges.  */
2373   for (e = ENTRY_BLOCK_PTR->succ; e; e = e->succ_next)
2374     {
2375       fprintf (file, "edge: { sourcename: \"ENTRY\" targetname: \"%d\"",
2376                e->dest->index);
2377
2378       if (e->flags & EDGE_FAKE)
2379         fprintf (file, " linestyle: dotted priority: 10");
2380       else
2381         fprintf (file, " linestyle: solid priority: 100");
2382
2383       fprintf (file, " }\n");
2384     }
2385   fputc ('\n', file);
2386
2387   FOR_EACH_BB (bb)
2388     {
2389       enum tree_code head_code, end_code;
2390       const char *head_name, *end_name;
2391       int head_line = 0;
2392       int end_line = 0;
2393       tree first = first_stmt (bb);
2394       tree last = last_stmt (bb);
2395
2396       if (first)
2397         {
2398           head_code = TREE_CODE (first);
2399           head_name = tree_code_name[head_code];
2400           head_line = get_lineno (first);
2401         }
2402       else
2403         head_name = "no-statement";
2404
2405       if (last)
2406         {
2407           end_code = TREE_CODE (last);
2408           end_name = tree_code_name[end_code];
2409           end_line = get_lineno (last);
2410         }
2411       else
2412         end_name = "no-statement";
2413
2414       fprintf (file, "node: { title: \"%d\" label: \"#%d\\n%s (%d)\\n%s (%d)\"}\n",
2415                bb->index, bb->index, head_name, head_line, end_name,
2416                end_line);
2417
2418       for (e = bb->succ; e; e = e->succ_next)
2419         {
2420           if (e->dest == EXIT_BLOCK_PTR)
2421             fprintf (file, "edge: { sourcename: \"%d\" targetname: \"EXIT\"", bb->index);
2422           else
2423             fprintf (file, "edge: { sourcename: \"%d\" targetname: \"%d\"", bb->index, e->dest->index);
2424
2425           if (e->flags & EDGE_FAKE)
2426             fprintf (file, " priority: 10 linestyle: dotted");
2427           else
2428             fprintf (file, " priority: 100 linestyle: solid");
2429
2430           fprintf (file, " }\n");
2431         }
2432
2433       if (bb->next_bb != EXIT_BLOCK_PTR)
2434         fputc ('\n', file);
2435     }
2436
2437   fputs ("}\n\n", file);
2438 }
2439
2440
2441
2442 /*---------------------------------------------------------------------------
2443                              Miscellaneous helpers
2444 ---------------------------------------------------------------------------*/
2445
2446 /* Return true if T represents a stmt that always transfers control.  */
2447
2448 bool
2449 is_ctrl_stmt (tree t)
2450 {
2451   return (TREE_CODE (t) == COND_EXPR
2452           || TREE_CODE (t) == SWITCH_EXPR
2453           || TREE_CODE (t) == GOTO_EXPR
2454           || TREE_CODE (t) == RETURN_EXPR
2455           || TREE_CODE (t) == RESX_EXPR);
2456 }
2457
2458
2459 /* Return true if T is a statement that may alter the flow of control
2460    (e.g., a call to a non-returning function).  */
2461
2462 bool
2463 is_ctrl_altering_stmt (tree t)
2464 {
2465   tree call = t;
2466
2467 #if defined ENABLE_CHECKING
2468   if (t == NULL)
2469     abort ();
2470 #endif
2471
2472   switch (TREE_CODE (t))
2473     {
2474     case MODIFY_EXPR:
2475       /* A MODIFY_EXPR with a rhs of a call has the characteristics
2476          of the call.  */
2477       call = TREE_OPERAND (t, 1);
2478       if (TREE_CODE (call) != CALL_EXPR)
2479         break;
2480       /* FALLTHRU */
2481
2482     case CALL_EXPR:
2483       /* A non-pure/const CALL_EXPR alters flow control if the current
2484          function has nonlocal labels.  */
2485       if (TREE_SIDE_EFFECTS (t)
2486           && current_function_has_nonlocal_label)
2487         return true;
2488
2489       /* A CALL_EXPR also alters control flow if it does not return.  */
2490       if (call_expr_flags (call) & (ECF_NORETURN | ECF_LONGJMP))
2491         return true;
2492       break;
2493
2494     default:
2495       return false;
2496     }
2497
2498   /* If a statement can throw, it alters control flow.  */
2499   return tree_can_throw_internal (t);
2500 }
2501
2502
2503 /* Return true if T is a computed goto.  */
2504
2505 bool
2506 computed_goto_p (tree t)
2507 {
2508   return (TREE_CODE (t) == GOTO_EXPR
2509           && TREE_CODE (GOTO_DESTINATION (t)) != LABEL_DECL);
2510 }
2511
2512
2513 /* Checks whether EXPR is a simple local goto.  */
2514
2515 bool
2516 simple_goto_p (tree expr)
2517 {
2518   return  (TREE_CODE (expr) == GOTO_EXPR
2519            && TREE_CODE (GOTO_DESTINATION (expr)) == LABEL_DECL
2520            && (decl_function_context (GOTO_DESTINATION (expr))
2521                == current_function_decl));
2522 }
2523
2524
2525 /* Return true if T should start a new basic block.  PREV_T is the
2526    statement preceding T.  It is used when T is a label or a case label.
2527    Labels should only start a new basic block if their previous statement
2528    wasn't a label.  Otherwise, sequence of labels would generate
2529    unnecessary basic blocks that only contain a single label.  */
2530
2531 static inline bool
2532 stmt_starts_bb_p (tree t, tree prev_t)
2533 {
2534   enum tree_code code;
2535
2536   if (t == NULL_TREE)
2537     return false;
2538
2539   /* LABEL_EXPRs start a new basic block only if the preceding
2540      statement wasn't a label of the same type.  This prevents the
2541      creation of consecutive blocks that have nothing but a single
2542      label.  */
2543   code = TREE_CODE (t);
2544   if (code == LABEL_EXPR)
2545     {
2546       /* Nonlocal and computed GOTO targets always start a new block.  */
2547       if (code == LABEL_EXPR
2548           && (DECL_NONLOCAL (LABEL_EXPR_LABEL (t))
2549               || FORCED_LABEL (LABEL_EXPR_LABEL (t))))
2550         return true;
2551
2552       if (prev_t && TREE_CODE (prev_t) == code)
2553         {
2554           if (DECL_NONLOCAL (LABEL_EXPR_LABEL (prev_t)))
2555             return true;
2556
2557           cfg_stats.num_merged_labels++;
2558           return false;
2559         }
2560       else
2561         return true;
2562     }
2563
2564   return false;
2565 }
2566
2567
2568 /* Return true if T should end a basic block.  */
2569
2570 bool
2571 stmt_ends_bb_p (tree t)
2572 {
2573   return is_ctrl_stmt (t) || is_ctrl_altering_stmt (t);
2574 }
2575
2576
2577 /* Add gotos that used to be represented implicitly in the CFG.  */
2578
2579 void
2580 disband_implicit_edges (void)
2581 {
2582   basic_block bb;
2583   block_stmt_iterator last;
2584   edge e;
2585   tree stmt, label, forward;
2586
2587   FOR_EACH_BB (bb)
2588     {
2589       last = bsi_last (bb);
2590       stmt = last_stmt (bb);
2591
2592       if (stmt && TREE_CODE (stmt) == COND_EXPR)
2593         {
2594           /* Remove superfluous gotos from COND_EXPR branches.  Moved
2595              from cfg_remove_useless_stmts here since it violates the
2596              invariants for tree--cfg correspondence and thus fits better
2597              here where we do it anyway.  */
2598           for (e = bb->succ; e; e = e->succ_next)
2599             {
2600               if (e->dest != bb->next_bb)
2601                 continue;
2602
2603               if (e->flags & EDGE_TRUE_VALUE)
2604                 COND_EXPR_THEN (stmt) = build_empty_stmt ();
2605               else if (e->flags & EDGE_FALSE_VALUE)
2606                 COND_EXPR_ELSE (stmt) = build_empty_stmt ();
2607               else
2608                 abort ();
2609               e->flags |= EDGE_FALLTHRU;
2610             }
2611
2612           continue;
2613         }
2614
2615       if (stmt && TREE_CODE (stmt) == RETURN_EXPR)
2616         {
2617           /* Remove the RETURN_EXPR if we may fall though to the exit
2618              instead.  */
2619           if (!bb->succ
2620               || bb->succ->succ_next
2621               || bb->succ->dest != EXIT_BLOCK_PTR)
2622             abort ();
2623
2624           if (bb->next_bb == EXIT_BLOCK_PTR
2625               && !TREE_OPERAND (stmt, 0))
2626             {
2627               bsi_remove (&last);
2628               bb->succ->flags |= EDGE_FALLTHRU;
2629             }
2630           continue;
2631         }
2632
2633       /* There can be no fallthru edge if the last statement is a control
2634          one.  */
2635       if (stmt && is_ctrl_stmt (stmt))
2636         continue;
2637
2638       /* Find a fallthru edge and emit the goto if necessary.  */
2639       for (e = bb->succ; e; e = e->succ_next)
2640         if (e->flags & EDGE_FALLTHRU)
2641           break;
2642
2643       if (!e
2644           || e->dest == bb->next_bb)
2645         continue;
2646
2647       if (e->dest == EXIT_BLOCK_PTR)
2648         abort ();
2649
2650       label = tree_block_label (e->dest);
2651
2652       /* If this is a goto to a goto, jump to the final destination.
2653          Handles unfactoring of the computed jumps.
2654          ??? Why bother putting this back together when rtl is just
2655          about to take it apart again?  */
2656       forward = last_and_only_stmt (e->dest);
2657       if (forward
2658           && TREE_CODE (forward) == GOTO_EXPR)
2659         label = GOTO_DESTINATION (forward);
2660
2661       bsi_insert_after (&last,
2662                         build1 (GOTO_EXPR, void_type_node, label),
2663                         BSI_NEW_STMT);
2664       e->flags &= ~EDGE_FALLTHRU;
2665     }
2666 }
2667
2668
2669 /* Remove all the blocks and edges that make up the flowgraph.  */
2670
2671 void
2672 delete_tree_cfg (void)
2673 {
2674   if (n_basic_blocks > 0)
2675     free_blocks_annotations ();
2676
2677   free_basic_block_vars ();
2678   basic_block_info = NULL;
2679   label_to_block_map = NULL;
2680   free_rbi_pool ();
2681 }
2682
2683
2684 /* Return the first statement in basic block BB.  */
2685
2686 tree
2687 first_stmt (basic_block bb)
2688 {
2689   block_stmt_iterator i = bsi_start (bb);
2690   return !bsi_end_p (i) ? bsi_stmt (i) : NULL_TREE;
2691 }
2692
2693
2694 /* Return the last statement in basic block BB.  */
2695
2696 tree
2697 last_stmt (basic_block bb)
2698 {
2699   block_stmt_iterator b = bsi_last (bb);
2700   return !bsi_end_p (b) ? bsi_stmt (b) : NULL_TREE;
2701 }
2702
2703
2704 /* Return a pointer to the last statement in block BB.  */
2705
2706 tree *
2707 last_stmt_ptr (basic_block bb)
2708 {
2709   block_stmt_iterator last = bsi_last (bb);
2710   return !bsi_end_p (last) ? bsi_stmt_ptr (last) : NULL;
2711 }
2712
2713
2714 /* Return the last statement of an otherwise empty block.  Return NULL
2715    if the block is totally empty, or if it contains more than one
2716    statement.  */
2717
2718 tree
2719 last_and_only_stmt (basic_block bb)
2720 {
2721   block_stmt_iterator i = bsi_last (bb);
2722   tree last, prev;
2723
2724   if (bsi_end_p (i))
2725     return NULL_TREE;
2726
2727   last = bsi_stmt (i);
2728   bsi_prev (&i);
2729   if (bsi_end_p (i))
2730     return last;
2731
2732   /* Empty statements should no longer appear in the instruction stream.
2733      Everything that might have appeared before should be deleted by
2734      remove_useless_stmts, and the optimizers should just bsi_remove
2735      instead of smashing with build_empty_stmt.
2736
2737      Thus the only thing that should appear here in a block containing
2738      one executable statement is a label.  */
2739   prev = bsi_stmt (i);
2740   if (TREE_CODE (prev) == LABEL_EXPR)
2741     return last;
2742   else
2743     return NULL_TREE;
2744 }
2745
2746
2747 /* Mark BB as the basic block holding statement T.  */
2748
2749 void
2750 set_bb_for_stmt (tree t, basic_block bb)
2751 {
2752   if (TREE_CODE (t) == STATEMENT_LIST)
2753     {
2754       tree_stmt_iterator i;
2755       for (i = tsi_start (t); !tsi_end_p (i); tsi_next (&i))
2756         set_bb_for_stmt (tsi_stmt (i), bb);
2757     }
2758   else
2759     {
2760       stmt_ann_t ann = get_stmt_ann (t);
2761       ann->bb = bb;
2762
2763       /* If the statement is a label, add the label to block-to-labels map
2764          so that we can speed up edge creation for GOTO_EXPRs.  */
2765       if (TREE_CODE (t) == LABEL_EXPR)
2766         {
2767           int uid;
2768
2769           t = LABEL_EXPR_LABEL (t);
2770           uid = LABEL_DECL_UID (t);
2771           if (uid == -1)
2772             {
2773               LABEL_DECL_UID (t) = uid = cfun->last_label_uid++;
2774               if (VARRAY_SIZE (label_to_block_map) <= (unsigned) uid)
2775                 VARRAY_GROW (label_to_block_map, 3 * uid / 2);
2776             }
2777           else
2778             {
2779 #ifdef ENABLE_CHECKING
2780               /* We're moving an existing label.  Make sure that we've
2781                  removed it from the old block.  */
2782               if (bb && VARRAY_BB (label_to_block_map, uid))
2783                 abort ();
2784 #endif
2785             }
2786           VARRAY_BB (label_to_block_map, uid) = bb;
2787         }
2788     }
2789 }
2790
2791
2792 /* Insert statement (or statement list) T before the statement
2793    pointed-to by iterator I.  M specifies how to update iterator I
2794    after insertion (see enum bsi_iterator_update).  */
2795
2796 void
2797 bsi_insert_before (block_stmt_iterator *i, tree t, enum bsi_iterator_update m)
2798 {
2799   set_bb_for_stmt (t, i->bb);
2800   modify_stmt (t);
2801   tsi_link_before (&i->tsi, t, m);
2802 }
2803
2804
2805 /* Insert statement (or statement list) T after the statement
2806    pointed-to by iterator I.  M specifies how to update iterator I
2807    after insertion (see enum bsi_iterator_update).  */
2808
2809 void
2810 bsi_insert_after (block_stmt_iterator *i, tree t, enum bsi_iterator_update m)
2811 {
2812   set_bb_for_stmt (t, i->bb);
2813   modify_stmt (t);
2814   tsi_link_after (&i->tsi, t, m);
2815 }
2816
2817
2818 /* Remove the statement pointed to by iterator I.  The iterator is updated
2819    to the next statement.  */
2820
2821 void
2822 bsi_remove (block_stmt_iterator *i)
2823 {
2824   tree t = bsi_stmt (*i);
2825   set_bb_for_stmt (t, NULL);
2826   modify_stmt (t);
2827   tsi_delink (&i->tsi);
2828 }
2829
2830
2831 /* Move the statement at FROM so it comes right after the statement at TO.  */
2832
2833 void 
2834 bsi_move_after (block_stmt_iterator *from, block_stmt_iterator *to)
2835 {
2836   tree stmt = bsi_stmt (*from);
2837   bsi_remove (from);
2838   bsi_insert_after (to, stmt, BSI_SAME_STMT);
2839
2840
2841
2842 /* Move the statement at FROM so it comes right before the statement at TO.  */
2843
2844 void 
2845 bsi_move_before (block_stmt_iterator *from, block_stmt_iterator *to)
2846 {
2847   tree stmt = bsi_stmt (*from);
2848   bsi_remove (from);
2849   bsi_insert_before (to, stmt, BSI_SAME_STMT);
2850 }
2851
2852
2853 /* Move the statement at FROM to the end of basic block BB.  */
2854
2855 void
2856 bsi_move_to_bb_end (block_stmt_iterator *from, basic_block bb)
2857 {
2858   block_stmt_iterator last = bsi_last (bb);
2859   
2860   /* Have to check bsi_end_p because it could be an empty block.  */
2861   if (!bsi_end_p (last) && is_ctrl_stmt (bsi_stmt (last)))
2862     bsi_move_before (from, &last);
2863   else
2864     bsi_move_after (from, &last);
2865 }
2866
2867
2868 /* Replace the contents of the statement pointed to by iterator BSI
2869    with STMT.  If PRESERVE_EH_INFO is true, the exception handling
2870    information of the original statement is preserved.  */
2871
2872 void
2873 bsi_replace (const block_stmt_iterator *bsi, tree stmt, bool preserve_eh_info)
2874 {
2875   int eh_region;
2876   tree orig_stmt = bsi_stmt (*bsi);
2877
2878   SET_EXPR_LOCUS (stmt, EXPR_LOCUS (orig_stmt));
2879   set_bb_for_stmt (stmt, bsi->bb);
2880
2881   /* Preserve EH region information from the original statement, if
2882      requested by the caller.  */
2883   if (preserve_eh_info)
2884     {
2885       eh_region = lookup_stmt_eh_region (orig_stmt);
2886       if (eh_region >= 0)
2887         add_stmt_to_eh_region (stmt, eh_region);
2888     }
2889
2890   *bsi_stmt_ptr (*bsi) = stmt;
2891   modify_stmt (stmt);
2892 }
2893
2894
2895 /* Insert the statement pointed-to by BSI into edge E.  Every attempt
2896    is made to place the statement in an existing basic block, but
2897    sometimes that isn't possible.  When it isn't possible, the edge is
2898    split and the statement is added to the new block.
2899
2900    In all cases, the returned *BSI points to the correct location.  The
2901    return value is true if insertion should be done after the location,
2902    or false if it should be done before the location.  */
2903
2904 static bool
2905 tree_find_edge_insert_loc (edge e, block_stmt_iterator *bsi)
2906 {
2907   basic_block dest, src;
2908   tree tmp;
2909
2910   dest = e->dest;
2911  restart:
2912
2913   /* If the destination has one predecessor which has no PHI nodes,
2914      insert there.  Except for the exit block. 
2915
2916      The requirement for no PHI nodes could be relaxed.  Basically we
2917      would have to examine the PHIs to prove that none of them used
2918      the value set by the statement we want to insert on E.   That
2919      hardly seems worth the effort.  */
2920   if (dest->pred->pred_next == NULL
2921       && ! phi_nodes (dest)
2922       && dest != EXIT_BLOCK_PTR)
2923     {
2924       *bsi = bsi_start (dest);
2925       if (bsi_end_p (*bsi))
2926         return true;
2927
2928       /* Make sure we insert after any leading labels.  */
2929       tmp = bsi_stmt (*bsi);
2930       while (TREE_CODE (tmp) == LABEL_EXPR)
2931         {
2932           bsi_next (bsi);
2933           if (bsi_end_p (*bsi))
2934             break;
2935           tmp = bsi_stmt (*bsi);
2936         }
2937
2938       if (bsi_end_p (*bsi))
2939         {
2940           *bsi = bsi_last (dest);
2941           return true;
2942         }
2943       else
2944         return false;
2945     }
2946
2947   /* If the source has one successor, the edge is not abnormal and
2948      the last statement does not end a basic block, insert there.
2949      Except for the entry block.  */
2950   src = e->src;
2951   if ((e->flags & EDGE_ABNORMAL) == 0
2952       && src->succ->succ_next == NULL
2953       && src != ENTRY_BLOCK_PTR)
2954     {
2955       *bsi = bsi_last (src);
2956       if (bsi_end_p (*bsi))
2957         return true;
2958
2959       tmp = bsi_stmt (*bsi);
2960       if (!stmt_ends_bb_p (tmp))
2961         return true;
2962
2963       /* Insert code just before returning the value.  We may need to decompose
2964          the return in the case it contains non-trivial operand.  */
2965       if (TREE_CODE (tmp) == RETURN_EXPR)
2966         {
2967           tree op = TREE_OPERAND (tmp, 0);
2968           if (!is_gimple_val (op))
2969             {
2970               if (TREE_CODE (op) != MODIFY_EXPR)
2971                 abort ();
2972               bsi_insert_before (bsi, op, BSI_NEW_STMT);
2973               TREE_OPERAND (tmp, 0) = TREE_OPERAND (op, 0);
2974             }
2975           bsi_prev (bsi);
2976           return true;
2977         }
2978     }
2979
2980   /* Otherwise, create a new basic block, and split this edge.  */
2981   dest = split_edge (e);
2982   e = dest->pred;
2983   goto restart;
2984 }
2985
2986
2987 /* This routine will commit all pending edge insertions, creating any new
2988    basic blocks which are necessary.
2989
2990    If specified, NEW_BLOCKS returns a count of the number of new basic
2991    blocks which were created.  */
2992
2993 void
2994 bsi_commit_edge_inserts (int *new_blocks)
2995 {
2996   basic_block bb;
2997   edge e;
2998   int blocks;
2999
3000   blocks = n_basic_blocks;
3001
3002   bsi_commit_edge_inserts_1 (ENTRY_BLOCK_PTR->succ);
3003
3004   FOR_EACH_BB (bb)
3005     for (e = bb->succ; e; e = e->succ_next)
3006       bsi_commit_edge_inserts_1 (e);
3007
3008   if (new_blocks)
3009     *new_blocks = n_basic_blocks - blocks;
3010 }
3011
3012
3013 /* Commit insertions pending at edge E.  */
3014
3015 static void
3016 bsi_commit_edge_inserts_1 (edge e)
3017 {
3018   if (PENDING_STMT (e))
3019     {
3020       block_stmt_iterator bsi;
3021       tree stmt = PENDING_STMT (e);
3022
3023       PENDING_STMT (e) = NULL_TREE;
3024
3025       if (tree_find_edge_insert_loc (e, &bsi))
3026         bsi_insert_after (&bsi, stmt, BSI_NEW_STMT);
3027       else
3028         bsi_insert_before (&bsi, stmt, BSI_NEW_STMT);
3029     }
3030 }
3031
3032
3033 /* Add STMT to the pending list of edge E.  No actual insertion is
3034    made until a call to bsi_commit_edge_inserts () is made.  */
3035
3036 void
3037 bsi_insert_on_edge (edge e, tree stmt)
3038 {
3039   append_to_statement_list (stmt, &PENDING_STMT (e));
3040 }
3041
3042
3043 /* Specialized edge insertion for SSA-PRE.  FIXME: This should
3044    probably disappear.  The only reason it's here is because PRE needs
3045    the call to tree_find_edge_insert_loc().  */
3046
3047 void pre_insert_on_edge (edge e, tree stmt);
3048
3049 void
3050 pre_insert_on_edge (edge e, tree stmt)
3051 {
3052   block_stmt_iterator bsi;
3053
3054   if (PENDING_STMT (e))
3055     abort ();
3056
3057   if (tree_find_edge_insert_loc (e, &bsi))
3058     bsi_insert_after (&bsi, stmt, BSI_NEW_STMT);
3059   else
3060     bsi_insert_before (&bsi, stmt, BSI_NEW_STMT);
3061 }
3062
3063
3064 /*---------------------------------------------------------------------------
3065              Tree specific functions for CFG manipulation
3066 ---------------------------------------------------------------------------*/
3067
3068 /* Split a (typically critical) edge EDGE_IN.  Return the new block.
3069    Abort on abnormal edges.  */
3070
3071 static basic_block
3072 tree_split_edge (edge edge_in)
3073 {
3074   basic_block new_bb, after_bb, dest, src;
3075   edge new_edge, e;
3076   tree phi;
3077   int i, num_elem;
3078
3079   /* Abnormal edges cannot be split.  */
3080   if (edge_in->flags & EDGE_ABNORMAL)
3081     abort ();
3082
3083   src = edge_in->src;
3084   dest = edge_in->dest;
3085
3086   /* Place the new block in the block list.  Try to keep the new block
3087      near its "logical" location.  This is of most help to humans looking
3088      at debugging dumps.  */
3089   for (e = dest->pred; e; e = e->pred_next)
3090     if (e->src->next_bb == dest)
3091       break;
3092   if (!e)
3093     after_bb = dest->prev_bb;
3094   else
3095     after_bb = edge_in->src;
3096
3097   new_bb = create_empty_bb (after_bb);
3098   new_edge = make_edge (new_bb, dest, EDGE_FALLTHRU);
3099
3100   /* Find all the PHI arguments on the original edge, and change them to
3101      the new edge.  Do it before redirection, so that the argument does not
3102      get removed.  */
3103   for (phi = phi_nodes (dest); phi; phi = TREE_CHAIN (phi))
3104     {
3105       num_elem = PHI_NUM_ARGS (phi);
3106       for (i = 0; i < num_elem; i++)
3107         if (PHI_ARG_EDGE (phi, i) == edge_in)
3108           {
3109             PHI_ARG_EDGE (phi, i) = new_edge;
3110             break;
3111           }
3112     }
3113
3114   if (!redirect_edge_and_branch (edge_in, new_bb))
3115     abort ();
3116
3117   if (PENDING_STMT (edge_in))
3118     abort ();
3119
3120   return new_bb;
3121 }
3122
3123
3124 /* Return true when BB has label LABEL in it.  */
3125
3126 static bool
3127 has_label_p (basic_block bb, tree label)
3128 {
3129   block_stmt_iterator bsi;
3130
3131   for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
3132     {
3133       tree stmt = bsi_stmt (bsi);
3134
3135       if (TREE_CODE (stmt) != LABEL_EXPR)
3136         return false;
3137       if (LABEL_EXPR_LABEL (stmt) == label)
3138         return true;
3139     }
3140   return false;
3141 }
3142
3143
3144 /* Callback for walk_tree, check that all elements with address taken are
3145    properly noticed as such.  */
3146
3147 static tree
3148 verify_expr (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
3149              void *data ATTRIBUTE_UNUSED)
3150 {
3151   tree t = *tp, x;
3152
3153   if (TYPE_P (t))
3154     *walk_subtrees = 0;
3155
3156   switch (TREE_CODE (t))
3157     {
3158     case SSA_NAME:
3159       if (SSA_NAME_IN_FREE_LIST (t))
3160         {
3161           error ("SSA name in freelist but still referenced");
3162           return *tp;
3163         }
3164       break;
3165
3166     case MODIFY_EXPR:
3167       x = TREE_OPERAND (t, 0);
3168       if (TREE_CODE (x) == BIT_FIELD_REF
3169           && is_gimple_reg (TREE_OPERAND (x, 0)))
3170         {
3171           error ("GIMPLE register modified with BIT_FIELD_REF");
3172           return *tp;
3173         }
3174       break;
3175
3176     case ADDR_EXPR:
3177       x = TREE_OPERAND (t, 0);
3178       while (TREE_CODE (x) == ARRAY_REF
3179              || TREE_CODE (x) == COMPONENT_REF
3180              || TREE_CODE (x) == REALPART_EXPR
3181              || TREE_CODE (x) == IMAGPART_EXPR)
3182         x = TREE_OPERAND (x, 0);
3183       if (TREE_CODE (x) != VAR_DECL && TREE_CODE (x) != PARM_DECL)
3184         return NULL;
3185       if (!TREE_ADDRESSABLE (x))
3186         {
3187           error ("address taken, but ADDRESSABLE bit not set");
3188           return x;
3189         }
3190       break;
3191
3192     case COND_EXPR:
3193       x = TREE_OPERAND (t, 0);
3194       if (TREE_CODE (TREE_TYPE (x)) != BOOLEAN_TYPE)
3195         {
3196           error ("non-boolean used in condition");
3197           return x;
3198         }
3199       break;
3200
3201     case NOP_EXPR:
3202     case CONVERT_EXPR:
3203     case FIX_TRUNC_EXPR:
3204     case FIX_CEIL_EXPR:
3205     case FIX_FLOOR_EXPR:
3206     case FIX_ROUND_EXPR:
3207     case FLOAT_EXPR:
3208     case NEGATE_EXPR:
3209     case ABS_EXPR:
3210     case BIT_NOT_EXPR:
3211     case NON_LVALUE_EXPR:
3212     case TRUTH_NOT_EXPR:
3213       x = TREE_OPERAND (t, 0);
3214       /* We check for constants explicitly since they are not considered
3215          gimple invariants if they overflowed.  */
3216       if (TREE_CODE_CLASS (TREE_CODE (x)) != 'c'
3217           && !is_gimple_val (x))
3218         {
3219           error ("Invalid operand to unary operator");
3220           return x;
3221         }
3222       break;
3223
3224     case REALPART_EXPR:
3225     case IMAGPART_EXPR:
3226       break;
3227
3228     case LT_EXPR:
3229     case LE_EXPR:
3230     case GT_EXPR:
3231     case GE_EXPR:
3232     case EQ_EXPR:
3233     case NE_EXPR:
3234     case UNORDERED_EXPR:
3235     case ORDERED_EXPR:
3236     case UNLT_EXPR:
3237     case UNLE_EXPR:
3238     case UNGT_EXPR:
3239     case UNGE_EXPR:
3240     case UNEQ_EXPR:
3241     case LTGT_EXPR:
3242     case PLUS_EXPR:
3243     case MINUS_EXPR:
3244     case MULT_EXPR:
3245     case TRUNC_DIV_EXPR:
3246     case CEIL_DIV_EXPR:
3247     case FLOOR_DIV_EXPR:
3248     case ROUND_DIV_EXPR:
3249     case TRUNC_MOD_EXPR:
3250     case CEIL_MOD_EXPR:
3251     case FLOOR_MOD_EXPR:
3252     case ROUND_MOD_EXPR:
3253     case RDIV_EXPR:
3254     case EXACT_DIV_EXPR:
3255     case MIN_EXPR:
3256     case MAX_EXPR:
3257     case LSHIFT_EXPR:
3258     case RSHIFT_EXPR:
3259     case LROTATE_EXPR:
3260     case RROTATE_EXPR:
3261     case BIT_IOR_EXPR:
3262     case BIT_XOR_EXPR:
3263     case BIT_AND_EXPR:
3264       x = TREE_OPERAND (t, 0);
3265       /* We check for constants explicitly since they are not considered
3266          gimple invariants if they overflowed.  */
3267       if (TREE_CODE_CLASS (TREE_CODE (x)) != 'c'
3268           && !is_gimple_val (x))
3269         {
3270           error ("Invalid operand to binary operator");
3271           return x;
3272         }
3273       x = TREE_OPERAND (t, 1);
3274       /* We check for constants explicitly since they are not considered
3275          gimple invariants if they overflowed.  */
3276       if (TREE_CODE_CLASS (TREE_CODE (x)) != 'c'
3277           && !is_gimple_val (x))
3278         {
3279           error ("Invalid operand to binary operator");
3280           return x;
3281         }
3282       break;
3283
3284     default:
3285       break;
3286     }
3287   return NULL;
3288 }
3289
3290
3291 /* Verify STMT, return true if STMT is not in GIMPLE form.
3292    TODO: Implement type checking.  */
3293
3294 static bool
3295 verify_stmt (tree stmt)
3296 {
3297   tree addr;
3298
3299   if (!is_gimple_stmt (stmt))
3300     {
3301       error ("Is not a valid GIMPLE statement.");
3302       debug_generic_stmt (stmt);
3303       return true;
3304     }
3305
3306   addr = walk_tree (&stmt, verify_expr, NULL, NULL);
3307   if (addr)
3308     {
3309       debug_generic_stmt (addr);
3310       return true;
3311     }
3312
3313   return false;
3314 }
3315
3316
3317 /* Return true when the T can be shared.  */
3318
3319 static bool
3320 tree_node_can_be_shared (tree t)
3321 {
3322   if (TYPE_P (t) || DECL_P (t)
3323       /* We check for constants explicitly since they are not considered
3324          gimple invariants if they overflowed.  */
3325       || TREE_CODE_CLASS (TREE_CODE (t)) == 'c'
3326       || is_gimple_min_invariant (t)
3327       || TREE_CODE (t) == SSA_NAME)
3328     return true;
3329
3330   while ((TREE_CODE (t) == ARRAY_REF
3331           /* We check for constants explicitly since they are not considered
3332              gimple invariants if they overflowed.  */
3333           && (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (t, 1))) == 'c'
3334               || is_gimple_min_invariant (TREE_OPERAND (t, 1))))
3335          || (TREE_CODE (t) == COMPONENT_REF
3336              || TREE_CODE (t) == REALPART_EXPR
3337              || TREE_CODE (t) == IMAGPART_EXPR))
3338     t = TREE_OPERAND (t, 0);
3339
3340   if (DECL_P (t))
3341     return true;
3342
3343   return false;
3344 }
3345
3346
3347 /* Called via walk_trees.  Verify tree sharing.  */
3348
3349 static tree
3350 verify_node_sharing (tree * tp, int *walk_subtrees, void *data)
3351 {
3352   htab_t htab = (htab_t) data;
3353   void **slot;
3354
3355   if (tree_node_can_be_shared (*tp))
3356     {
3357       *walk_subtrees = false;
3358       return NULL;
3359     }
3360
3361   slot = htab_find_slot (htab, *tp, INSERT);
3362   if (*slot)
3363     return *slot;
3364   *slot = *tp;
3365
3366   return NULL;
3367 }
3368
3369
3370 /* Verify the GIMPLE statement chain.  */
3371
3372 void
3373 verify_stmts (void)
3374 {
3375   basic_block bb;
3376   block_stmt_iterator bsi;
3377   bool err = false;
3378   htab_t htab;
3379   tree addr;
3380
3381   timevar_push (TV_TREE_STMT_VERIFY);
3382   htab = htab_create (37, htab_hash_pointer, htab_eq_pointer, NULL);
3383
3384   FOR_EACH_BB (bb)
3385     {
3386       tree phi;
3387       int i;
3388
3389       for (phi = phi_nodes (bb); phi; phi = TREE_CHAIN (phi))
3390         {
3391           int phi_num_args = PHI_NUM_ARGS (phi);
3392
3393           for (i = 0; i < phi_num_args; i++)
3394             {
3395               tree t = PHI_ARG_DEF (phi, i);
3396               tree addr;
3397
3398               /* Addressable variables do have SSA_NAMEs but they
3399                  are not considered gimple values.  */
3400               if (TREE_CODE (t) != SSA_NAME
3401                   && TREE_CODE (t) != FUNCTION_DECL
3402                   && !is_gimple_val (t))
3403                 {
3404                   error ("PHI def is not a GIMPLE value");
3405                   debug_generic_stmt (phi);
3406                   debug_generic_stmt (t);
3407                   err |= true;
3408                 }
3409
3410               addr = walk_tree (&t, verify_expr, NULL, NULL);
3411               if (addr)
3412                 {
3413                   debug_generic_stmt (addr);
3414                   err |= true;
3415                 }
3416
3417               addr = walk_tree (&t, verify_node_sharing, htab, NULL);
3418               if (addr)
3419                 {
3420                   error ("Incorrect sharing of tree nodes");
3421                   debug_generic_stmt (phi);
3422                   debug_generic_stmt (addr);
3423                   err |= true;
3424                 }
3425             }
3426         }
3427
3428       for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
3429         {
3430           tree stmt = bsi_stmt (bsi);
3431           err |= verify_stmt (stmt);
3432           addr = walk_tree (&stmt, verify_node_sharing, htab, NULL);
3433           if (addr)
3434             {
3435               error ("Incorrect sharing of tree nodes");
3436               debug_generic_stmt (stmt);
3437               debug_generic_stmt (addr);
3438               err |= true;
3439             }
3440         }
3441     }
3442
3443   if (err)
3444     internal_error ("verify_stmts failed.");
3445
3446   htab_delete (htab);
3447   timevar_pop (TV_TREE_STMT_VERIFY);
3448 }
3449
3450
3451 /* Verifies that the flow information is OK.  */
3452
3453 static int
3454 tree_verify_flow_info (void)
3455 {
3456   int err = 0;
3457   basic_block bb;
3458   block_stmt_iterator bsi;
3459   tree stmt;
3460   edge e;
3461
3462   if (ENTRY_BLOCK_PTR->stmt_list)
3463     {
3464       error ("ENTRY_BLOCK has a statement list associated with it\n");
3465       err = 1;
3466     }
3467
3468   if (EXIT_BLOCK_PTR->stmt_list)
3469     {
3470       error ("EXIT_BLOCK has a statement list associated with it\n");
3471       err = 1;
3472     }
3473
3474   for (e = EXIT_BLOCK_PTR->pred; e; e = e->pred_next)
3475     if (e->flags & EDGE_FALLTHRU)
3476       {
3477         error ("Fallthru to exit from bb %d\n", e->src->index);
3478         err = 1;
3479       }
3480
3481   FOR_EACH_BB (bb)
3482     {
3483       bool found_ctrl_stmt = false;
3484
3485       /* Skip labels on the start of basic block.  */
3486       for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
3487         {
3488           if (TREE_CODE (bsi_stmt (bsi)) != LABEL_EXPR)
3489             break;
3490
3491           if (label_to_block (LABEL_EXPR_LABEL (bsi_stmt (bsi))) != bb)
3492             {
3493               error ("Label %s to block does not match in bb %d\n",
3494                      IDENTIFIER_POINTER (DECL_NAME (bsi_stmt (bsi))),
3495                      bb->index);
3496               err = 1;
3497             }
3498
3499           if (decl_function_context (LABEL_EXPR_LABEL (bsi_stmt (bsi)))
3500               != current_function_decl)
3501             {
3502               error ("Label %s has incorrect context in bb %d\n",
3503                      IDENTIFIER_POINTER (DECL_NAME (bsi_stmt (bsi))),
3504                      bb->index);
3505               err = 1;
3506             }
3507         }
3508
3509       /* Verify that body of basic block BB is free of control flow.  */
3510       for (; !bsi_end_p (bsi); bsi_next (&bsi))
3511         {
3512           tree stmt = bsi_stmt (bsi);
3513
3514           if (found_ctrl_stmt)
3515             {
3516               error ("Control flow in the middle of basic block %d\n",
3517                      bb->index);
3518               err = 1;
3519             }
3520
3521           if (stmt_ends_bb_p (stmt))
3522             found_ctrl_stmt = true;
3523
3524           if (TREE_CODE (stmt) == LABEL_EXPR)
3525             {
3526               error ("Label %s in the middle of basic block %d\n",
3527                      IDENTIFIER_POINTER (DECL_NAME (stmt)),
3528                      bb->index);
3529               err = 1;
3530             }
3531         }
3532       bsi = bsi_last (bb);
3533       if (bsi_end_p (bsi))
3534         continue;
3535
3536       stmt = bsi_stmt (bsi);
3537
3538       if (is_ctrl_stmt (stmt))
3539         {
3540           for (e = bb->succ; e; e = e->succ_next)
3541             if (e->flags & EDGE_FALLTHRU)
3542               {
3543                 error ("Fallthru edge after a control statement in bb %d \n",
3544                        bb->index);
3545                 err = 1;
3546               }
3547         }
3548
3549       switch (TREE_CODE (stmt))
3550         {
3551         case COND_EXPR:
3552           {
3553             edge true_edge;
3554             edge false_edge;
3555             if (TREE_CODE (COND_EXPR_THEN (stmt)) != GOTO_EXPR
3556                 || TREE_CODE (COND_EXPR_ELSE (stmt)) != GOTO_EXPR)
3557               {
3558                 error ("Structured COND_EXPR at the end of bb %d\n", bb->index);
3559                 err = 1;
3560               }
3561
3562             extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
3563
3564             if (!true_edge || !false_edge
3565                 || !(true_edge->flags & EDGE_TRUE_VALUE)
3566                 || !(false_edge->flags & EDGE_FALSE_VALUE)
3567                 || (true_edge->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL))
3568                 || (false_edge->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL))
3569                 || bb->succ->succ_next->succ_next)
3570               {
3571                 error ("Wrong outgoing edge flags at end of bb %d\n",
3572                        bb->index);
3573                 err = 1;
3574               }
3575
3576             if (!has_label_p (true_edge->dest,
3577                               GOTO_DESTINATION (COND_EXPR_THEN (stmt))))
3578               {
3579                 error ("`then' label does not match edge at end of bb %d\n",
3580                        bb->index);
3581                 err = 1;
3582               }
3583
3584             if (!has_label_p (false_edge->dest,
3585                               GOTO_DESTINATION (COND_EXPR_ELSE (stmt))))
3586               {
3587                 error ("`else' label does not match edge at end of bb %d\n",
3588                        bb->index);
3589                 err = 1;
3590               }
3591           }
3592           break;
3593
3594         case GOTO_EXPR:
3595           if (simple_goto_p (stmt))
3596             {
3597               error ("Explicit goto at end of bb %d\n", bb->index);
3598               err = 1;
3599             }
3600           else
3601             {
3602               /* FIXME.  We should double check that the labels in the 
3603                  destination blocks have their address taken.  */
3604               for (e = bb->succ; e; e = e->succ_next)
3605                 if ((e->flags & (EDGE_FALLTHRU | EDGE_TRUE_VALUE
3606                                  | EDGE_FALSE_VALUE))
3607                     || !(e->flags & EDGE_ABNORMAL))
3608                   {
3609                     error ("Wrong outgoing edge flags at end of bb %d\n",
3610                            bb->index);
3611                     err = 1;
3612                   }
3613             }
3614           break;
3615
3616         case RETURN_EXPR:
3617           if (!bb->succ || bb->succ->succ_next
3618               || (bb->succ->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL
3619                                      | EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
3620             {
3621               error ("Wrong outgoing edge flags at end of bb %d\n", bb->index);
3622               err = 1;
3623             }
3624           if (bb->succ->dest != EXIT_BLOCK_PTR)
3625             {
3626               error ("Return edge does not point to exit in bb %d\n",
3627                      bb->index);
3628               err = 1;
3629             }
3630           break;
3631
3632         case SWITCH_EXPR:
3633           {
3634             tree prev;
3635             edge e;
3636             size_t i, n;
3637             tree vec;
3638
3639             vec = SWITCH_LABELS (stmt);
3640             n = TREE_VEC_LENGTH (vec);
3641
3642             /* Mark all the destination basic blocks.  */
3643             for (i = 0; i < n; ++i)
3644               {
3645                 tree lab = CASE_LABEL (TREE_VEC_ELT (vec, i));
3646                 basic_block label_bb = label_to_block (lab);
3647
3648                 if (label_bb->aux && label_bb->aux != (void *)1)
3649                   abort ();
3650                 label_bb->aux = (void *)1;
3651               }
3652
3653             /* Verify that the case labels are sorted.  */
3654             prev = TREE_VEC_ELT (vec, 0);
3655             for (i = 1; i < n - 1; ++i)
3656               {
3657                 tree c = TREE_VEC_ELT (vec, i);
3658                 if (! CASE_LOW (c))
3659                   {
3660                     error ("Found default case not at end of case vector");
3661                     err = 1;
3662                     continue;
3663                   }
3664                 if (! tree_int_cst_lt (CASE_LOW (prev), CASE_LOW (c)))
3665                   {
3666                     error ("Case labels not sorted:\n ");
3667                     print_generic_expr (stderr, prev, 0);
3668                     fprintf (stderr," is greater than ");
3669                     print_generic_expr (stderr, c, 0);
3670                     fprintf (stderr," but comes before it.\n");
3671                     err = 1;
3672                   }
3673                 prev = c;
3674               }
3675             if (CASE_LOW (TREE_VEC_ELT (vec, n - 1)))
3676               {
3677                 error ("No default case found at end of case vector");
3678                 err = 1;
3679               }
3680
3681             for (e = bb->succ; e; e = e->succ_next)
3682               {
3683                 if (!e->dest->aux)
3684                   {
3685                     error ("Extra outgoing edge %d->%d\n",
3686                            bb->index, e->dest->index);
3687                     err = 1;
3688                   }
3689                 e->dest->aux = (void *)2;
3690                 if ((e->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL
3691                                  | EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
3692                   {
3693                     error ("Wrong outgoing edge flags at end of bb %d\n",
3694                            bb->index);
3695                     err = 1;
3696                   }
3697               }
3698
3699             /* Check that we have all of them.  */
3700             for (i = 0; i < n; ++i)
3701               {
3702                 tree lab = CASE_LABEL (TREE_VEC_ELT (vec, i));
3703                 basic_block label_bb = label_to_block (lab);
3704
3705                 if (label_bb->aux != (void *)2)
3706                   {
3707                     error ("Missing edge %i->%i\n",
3708                            bb->index, label_bb->index);
3709                     err = 1;
3710                   }
3711               }
3712
3713             for (e = bb->succ; e; e = e->succ_next)
3714               e->dest->aux = (void *)0;
3715           }
3716
3717         default: ;
3718         }
3719     }
3720
3721   if (dom_computed[CDI_DOMINATORS] >= DOM_NO_FAST_QUERY)
3722     verify_dominators (CDI_DOMINATORS);
3723
3724   return err;
3725 }
3726
3727
3728 /* Updates phi nodes after creating forwarder block joined
3729    by edge FALLTHRU.  */
3730
3731 static void
3732 tree_make_forwarder_block (edge fallthru)
3733 {
3734   edge e;
3735   basic_block dummy, bb;
3736   tree phi, new_phi, var;
3737
3738   dummy = fallthru->src;
3739   bb = fallthru->dest;
3740
3741   if (!bb->pred->pred_next)
3742     return;
3743
3744   /* If we redirected a branch we must create new phi nodes at the
3745      start of BB.  */
3746   for (phi = phi_nodes (dummy); phi; phi = TREE_CHAIN (phi))
3747     {
3748       var = PHI_RESULT (phi);
3749       new_phi = create_phi_node (var, bb);
3750       SSA_NAME_DEF_STMT (var) = new_phi;
3751       PHI_RESULT (phi) = make_ssa_name (SSA_NAME_VAR (var), phi);
3752       add_phi_arg (&new_phi, PHI_RESULT (phi), fallthru);
3753     }
3754
3755   /* Ensure that the PHI node chains are in the same order.  */
3756   set_phi_nodes (bb, nreverse (phi_nodes (bb)));
3757
3758   /* Add the arguments we have stored on edges.  */
3759   for (e = bb->pred; e; e = e->pred_next)
3760     {
3761       if (e == fallthru)
3762         continue;
3763
3764       for (phi = phi_nodes (bb), var = PENDING_STMT (e);
3765            phi;
3766            phi = TREE_CHAIN (phi), var = TREE_CHAIN (var))
3767         add_phi_arg (&phi, TREE_VALUE (var), e);
3768
3769       PENDING_STMT (e) = NULL;
3770     }
3771 }
3772
3773
3774 /* Return true if basic block BB does nothing except pass control
3775    flow to another block and that we can safely insert a label at
3776    the start of the successor block.  */
3777
3778 static bool
3779 tree_forwarder_block_p (basic_block bb)
3780 {
3781   block_stmt_iterator bsi;
3782   edge e;
3783
3784   /* If we have already determined that this block is not forwardable,
3785      then no further checks are necessary.  */
3786   if (! bb_ann (bb)->forwardable)
3787     return false;
3788
3789   /* BB must have a single outgoing normal edge.  Otherwise it can not be
3790      a forwarder block.  */
3791   if (!bb->succ
3792       || bb->succ->succ_next
3793       || bb->succ->dest == EXIT_BLOCK_PTR
3794       || (bb->succ->flags & EDGE_ABNORMAL)
3795       || bb == ENTRY_BLOCK_PTR)
3796     {
3797       bb_ann (bb)->forwardable = 0;
3798       return false; 
3799     }
3800
3801   /* Successors of the entry block are not forwarders.  */
3802   for (e = ENTRY_BLOCK_PTR->succ; e; e = e->succ_next)
3803     if (e->dest == bb)
3804       {
3805         bb_ann (bb)->forwardable = 0;
3806         return false;
3807       }
3808
3809   /* BB can not have any PHI nodes.  This could potentially be relaxed
3810      early in compilation if we re-rewrote the variables appearing in
3811      any PHI nodes in forwarder blocks.  */
3812   if (phi_nodes (bb))
3813     {
3814       bb_ann (bb)->forwardable = 0;
3815       return false; 
3816     }
3817
3818   /* Now walk through the statements.  We can ignore labels, anything else
3819      means this is not a forwarder block.  */
3820   for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
3821     {
3822       tree stmt = bsi_stmt (bsi);
3823  
3824       switch (TREE_CODE (stmt))
3825         {
3826         case LABEL_EXPR:
3827           if (DECL_NONLOCAL (LABEL_EXPR_LABEL (stmt)))
3828             return false;
3829           break;
3830
3831         default:
3832           bb_ann (bb)->forwardable = 0;
3833           return false;
3834         }
3835     }
3836
3837   return true;
3838 }
3839
3840
3841 /* Thread jumps over empty statements.
3842
3843    This code should _not_ thread over obviously equivalent conditions
3844    as that requires nontrivial updates to the SSA graph.  */
3845    
3846 static bool
3847 thread_jumps (void)
3848 {
3849   edge e, next, last, old;
3850   basic_block bb, dest, tmp;
3851   tree phi;
3852   int arg;
3853   bool retval = false;
3854
3855   FOR_EACH_BB (bb)
3856     bb_ann (bb)->forwardable = 1;
3857
3858   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR, next_bb)
3859     {
3860       /* Don't waste time on unreachable blocks.  */
3861       if (!bb->pred)
3862         continue;
3863
3864       /* Nor on forwarders.  */
3865       if (tree_forwarder_block_p (bb))
3866         continue;
3867       
3868       /* This block is now part of a forwarding path, mark it as not
3869          forwardable so that we can detect loops.  This bit will be
3870          reset below.  */
3871       bb_ann (bb)->forwardable = 0;
3872
3873       /* Examine each of our block's successors to see if it is
3874          forwardable.  */
3875       for (e = bb->succ; e; e = next)
3876         {
3877           next = e->succ_next;
3878
3879           /* If the edge is abnormal or its destination is not
3880              forwardable, then there's nothing to do.  */
3881           if ((e->flags & EDGE_ABNORMAL)
3882               || !tree_forwarder_block_p (e->dest))
3883             continue;
3884
3885           /* Now walk through as many forwarder block as possible to
3886              find the ultimate destination we want to thread our jump
3887              to.  */
3888           last = e->dest->succ;
3889           bb_ann (e->dest)->forwardable = 0;
3890           for (dest = e->dest->succ->dest;
3891                tree_forwarder_block_p (dest);
3892                last = dest->succ,
3893                dest = dest->succ->dest)
3894             {
3895               /* An infinite loop detected.  We redirect the edge anyway, so
3896                  that the loop is shrinked into single basic block.  */
3897               if (!bb_ann (dest)->forwardable)
3898                 break;
3899
3900               if (dest->succ->dest == EXIT_BLOCK_PTR)
3901                 break;
3902
3903               bb_ann (dest)->forwardable = 0;
3904             }
3905
3906           /* Reset the forwardable marks to 1.  */
3907           for (tmp = e->dest;
3908                tmp != dest;
3909                tmp = tmp->succ->dest)
3910             bb_ann (tmp)->forwardable = 1;
3911
3912           if (dest == e->dest)
3913             continue;
3914               
3915           old = find_edge (bb, dest);
3916           if (old)
3917             {
3918               /* If there already is an edge, check whether the values
3919                  in phi nodes differ.  */
3920               if (!phi_alternatives_equal (dest, last, old))
3921                 {
3922                   /* The previous block is forwarder.  Redirect our jump
3923                      to that target instead since we know it has no PHI
3924                      nodes that will need updating.  */
3925                   dest = last->src;
3926           
3927                   /* That might mean that no forwarding at all is possible.  */
3928                   if (dest == e->dest)
3929                     continue;
3930
3931                   old = find_edge (bb, dest);
3932                 }
3933             }
3934
3935           /* Perform the redirection.  */
3936           retval = true;
3937           e = redirect_edge_and_branch (e, dest);
3938
3939           /* TODO -- updating dominators in this case is simple.  */
3940           free_dominance_info (CDI_DOMINATORS);
3941
3942           if (!old)
3943             {
3944               /* Update PHI nodes.   We know that the new argument should
3945                  have the same value as the argument associated with LAST.
3946                  Otherwise we would have changed our target block above.  */
3947               for (phi = phi_nodes (dest); phi; phi = TREE_CHAIN (phi))
3948                 {
3949                   arg = phi_arg_from_edge (phi, last);
3950                   if (arg < 0)
3951                     abort ();
3952                   add_phi_arg (&phi, PHI_ARG_DEF (phi, arg), e);
3953                 }
3954             }
3955         }
3956
3957       /* Reset the forwardable bit on our block since it's no longer in
3958          a forwarding chain path.  */
3959       bb_ann (bb)->forwardable = 1;
3960     }
3961
3962   return retval;
3963 }
3964
3965
3966 /* Return a non-special label in the head of basic block BLOCK.
3967    Create one if it doesn't exist.  */
3968
3969 static tree
3970 tree_block_label (basic_block bb)
3971 {
3972   block_stmt_iterator i, s = bsi_start (bb);
3973   bool first = true;
3974   tree label, stmt;
3975
3976   for (i = s; !bsi_end_p (i); first = false, bsi_next (&i))
3977     {
3978       stmt = bsi_stmt (i);
3979       if (TREE_CODE (stmt) != LABEL_EXPR)
3980         break;
3981       label = LABEL_EXPR_LABEL (stmt);
3982       if (!DECL_NONLOCAL (label))
3983         {
3984           if (!first)
3985             bsi_move_before (&i, &s);
3986           return label;
3987         }
3988     }
3989
3990   label = create_artificial_label ();
3991   stmt = build1 (LABEL_EXPR, void_type_node, label);
3992   bsi_insert_before (&s, stmt, BSI_NEW_STMT);
3993   return label;
3994 }
3995
3996
3997 /* Attempt to perform edge redirection by replacing a possibly complex
3998    jump instruction by a goto or by removing the jump completely.
3999    This can apply only if all edges now point to the same block.  The
4000    parameters and return values are equivalent to
4001    redirect_edge_and_branch.  */
4002
4003 static edge
4004 tree_try_redirect_by_replacing_jump (edge e, basic_block target)
4005 {
4006   basic_block src = e->src;
4007   edge tmp;
4008   block_stmt_iterator b;
4009   tree stmt;
4010
4011   /* Verify that all targets will be TARGET.  */
4012   for (tmp = src->succ; tmp; tmp = tmp->succ_next)
4013     if (tmp->dest != target && tmp != e)
4014       break;
4015
4016   if (tmp)
4017     return NULL;
4018
4019   b = bsi_last (src);
4020   if (bsi_end_p (b))
4021     return NULL;
4022   stmt = bsi_stmt (b);
4023
4024   if (TREE_CODE (stmt) == COND_EXPR
4025       || TREE_CODE (stmt) == SWITCH_EXPR)
4026     {
4027       bsi_remove (&b);
4028       e = ssa_redirect_edge (e, target);
4029       e->flags = EDGE_FALLTHRU;
4030       return e;
4031     }
4032
4033   return NULL;
4034 }
4035
4036
4037 /* Redirect E to DEST.  Return NULL on failure.  Otherwise, return the
4038    edge representing the redirected branch.  */
4039
4040 static edge
4041 tree_redirect_edge_and_branch (edge e, basic_block dest)
4042 {
4043   basic_block bb = e->src;
4044   block_stmt_iterator bsi;
4045   edge ret;
4046   tree label, stmt;
4047
4048   if (e->flags & (EDGE_ABNORMAL_CALL | EDGE_EH))
4049     return NULL;
4050
4051   if (e->src != ENTRY_BLOCK_PTR 
4052       && (ret = tree_try_redirect_by_replacing_jump (e, dest)))
4053     return ret;
4054
4055   if (e->dest == dest)
4056     return NULL;
4057
4058   label = tree_block_label (dest);
4059
4060   bsi = bsi_last (bb);
4061   stmt = bsi_end_p (bsi) ? NULL : bsi_stmt (bsi);
4062
4063   switch (stmt ? TREE_CODE (stmt) : ERROR_MARK)
4064     {
4065     case COND_EXPR:
4066       stmt = (e->flags & EDGE_TRUE_VALUE
4067               ? COND_EXPR_THEN (stmt)
4068               : COND_EXPR_ELSE (stmt));
4069       GOTO_DESTINATION (stmt) = label;
4070       break;
4071
4072     case GOTO_EXPR:
4073       /* No non-abnormal edges should lead from a non-simple goto, and
4074          simple ones should be represented implicitly.  */
4075       abort ();
4076
4077     case SWITCH_EXPR:
4078       {
4079         tree vec = SWITCH_LABELS (stmt);
4080         size_t i, n = TREE_VEC_LENGTH (vec);
4081
4082         for (i = 0; i < n; ++i)
4083           {
4084             tree elt = TREE_VEC_ELT (vec, i);
4085             if (label_to_block (CASE_LABEL (elt)) == e->dest)
4086               CASE_LABEL (elt) = label;
4087           }
4088       }
4089       break;
4090
4091     case RETURN_EXPR:
4092       bsi_remove (&bsi);
4093       e->flags |= EDGE_FALLTHRU;
4094       break;
4095
4096     default:
4097       /* Otherwise it must be a fallthru edge, and we don't need to
4098          do anything besides redirecting it.  */
4099       if (!(e->flags & EDGE_FALLTHRU))
4100         abort ();
4101       break;
4102     }
4103
4104   /* Update/insert PHI nodes as necessary.  */
4105
4106   /* Now update the edges in the CFG.  */
4107   e = ssa_redirect_edge (e, dest);
4108
4109   return e;
4110 }
4111
4112
4113 /* Simple wrapper, as we can always redirect fallthru edges.  */
4114
4115 static basic_block
4116 tree_redirect_edge_and_branch_force (edge e, basic_block dest)
4117 {
4118   e = tree_redirect_edge_and_branch (e, dest);
4119   if (!e)
4120     abort ();
4121
4122   return NULL;
4123 }
4124
4125
4126 /* Splits basic block BB after statement STMT (but at least after the
4127    labels).  If STMT is NULL, BB is split just after the labels.  */
4128
4129 static basic_block
4130 tree_split_block (basic_block bb, void *stmt)
4131 {
4132   block_stmt_iterator bsi, bsi_tgt;
4133   tree act;
4134   basic_block new_bb;
4135   edge e;
4136
4137   new_bb = create_empty_bb (bb);
4138
4139   /* Redirect the outgoing edges.  */
4140   new_bb->succ = bb->succ;
4141   bb->succ = NULL;
4142   for (e = new_bb->succ; e; e = e->succ_next)
4143     e->src = new_bb;
4144
4145   if (stmt && TREE_CODE ((tree) stmt) == LABEL_EXPR)
4146     stmt = NULL;
4147
4148   /* Move everything from BSI to the new basic block.  */
4149   for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
4150     {
4151       act = bsi_stmt (bsi);
4152       if (TREE_CODE (act) == LABEL_EXPR)
4153         continue;
4154
4155       if (!stmt)
4156         break;
4157
4158       if (stmt == act)
4159         {
4160           bsi_next (&bsi);
4161           break;
4162         }
4163     }
4164
4165   bsi_tgt = bsi_start (new_bb);
4166   while (!bsi_end_p (bsi))
4167     {
4168       act = bsi_stmt (bsi);
4169       bsi_remove (&bsi);
4170       bsi_insert_after (&bsi_tgt, act, BSI_NEW_STMT);
4171     }
4172
4173   return new_bb;
4174 }
4175
4176
4177 /* Moves basic block BB after block AFTER.  */
4178
4179 static bool
4180 tree_move_block_after (basic_block bb, basic_block after)
4181 {
4182   if (bb->prev_bb == after)
4183     return true;
4184
4185   unlink_block (bb);
4186   link_block (bb, after);
4187
4188   return true;
4189 }
4190
4191
4192 /* Return true if basic_block can be duplicated.  */
4193
4194 static bool
4195 tree_can_duplicate_bb_p (basic_block bb ATTRIBUTE_UNUSED)
4196 {
4197   return true;
4198 }
4199
4200
4201 /* Create a duplicate of the basic block BB.  NOTE: This does not
4202    preserve SSA form.  */
4203
4204 static basic_block
4205 tree_duplicate_bb (basic_block bb)
4206 {
4207   basic_block new_bb;
4208   block_stmt_iterator bsi, bsi_tgt;
4209
4210   new_bb = create_empty_bb (EXIT_BLOCK_PTR->prev_bb);
4211   bsi_tgt = bsi_start (new_bb);
4212   for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
4213     {
4214       tree stmt = bsi_stmt (bsi);
4215
4216       if (TREE_CODE (stmt) == LABEL_EXPR)
4217         continue;
4218
4219       bsi_insert_after (&bsi_tgt, unshare_expr (stmt), BSI_NEW_STMT);
4220     }
4221
4222   return new_bb;
4223 }
4224
4225
4226 /* Dump FUNCTION_DECL FN to file FILE using FLAGS (see TDF_* in tree.h)  */
4227
4228 void
4229 dump_function_to_file (tree fn, FILE *file, int flags)
4230 {
4231   tree arg, vars, var;
4232   bool ignore_topmost_bind = false, any_var = false;
4233   basic_block bb;
4234   tree chain;
4235
4236   fprintf (file, "%s (", lang_hooks.decl_printable_name (fn, 2));
4237
4238   arg = DECL_ARGUMENTS (fn);
4239   while (arg)
4240     {
4241       print_generic_expr (file, arg, dump_flags);
4242       if (TREE_CHAIN (arg))
4243         fprintf (file, ", ");
4244       arg = TREE_CHAIN (arg);
4245     }
4246   fprintf (file, ")\n");
4247
4248   if (flags & TDF_RAW)
4249     {
4250       dump_node (fn, TDF_SLIM | flags, file);
4251       return;
4252     }
4253
4254   /* When GIMPLE is lowered, the variables are no longer available in
4255      BIND_EXPRs, so display them separately.  */
4256   if (cfun && cfun->unexpanded_var_list)
4257     {
4258       ignore_topmost_bind = true;
4259
4260       fprintf (file, "{\n");
4261       for (vars = cfun->unexpanded_var_list; vars; vars = TREE_CHAIN (vars))
4262         {
4263           var = TREE_VALUE (vars);
4264
4265           print_generic_decl (file, var, flags);
4266           fprintf (file, "\n");
4267
4268           any_var = true;
4269         }
4270     }
4271
4272   if (basic_block_info)
4273     {
4274       /* Make a CFG based dump.  */
4275       if (!ignore_topmost_bind)
4276         fprintf (file, "{\n");
4277
4278       if (any_var && n_basic_blocks)
4279         fprintf (file, "\n");
4280
4281       FOR_EACH_BB (bb)
4282         dump_generic_bb (file, bb, 2, flags);
4283         
4284       fprintf (file, "}\n");
4285     }
4286   else
4287     {
4288       int indent;
4289
4290       /* Make a tree based dump.  */
4291       chain = DECL_SAVED_TREE (fn);
4292
4293       if (TREE_CODE (chain) == BIND_EXPR)
4294         {
4295           if (ignore_topmost_bind)
4296             {
4297               chain = BIND_EXPR_BODY (chain);
4298               indent = 2;
4299             }
4300           else
4301             indent = 0;
4302         }
4303       else
4304         {
4305           if (!ignore_topmost_bind)
4306             fprintf (file, "{\n");
4307           indent = 2;
4308         }
4309
4310       if (any_var)
4311         fprintf (file, "\n");
4312
4313       print_generic_stmt_indented (file, chain, flags, indent);
4314       if (ignore_topmost_bind)
4315         fprintf (file, "}\n");
4316     }
4317
4318   fprintf (file, "\n\n");
4319 }
4320
4321
4322 /* Pretty print of the loops intermediate representation.  */
4323 static void print_loop (FILE *, struct loop *, int);
4324 static void print_pred_bbs (FILE *, edge);
4325 static void print_succ_bbs (FILE *, edge);
4326
4327
4328 /* Print the predecessors indexes of edge E on FILE.  */
4329
4330 static void
4331 print_pred_bbs (FILE *file, edge e)
4332 {
4333   if (e == NULL)
4334     return;
4335   
4336   else if (e->pred_next == NULL)
4337     fprintf (file, "bb_%d", e->src->index);
4338   
4339   else
4340     {
4341       fprintf (file, "bb_%d, ", e->src->index);
4342       print_pred_bbs (file, e->pred_next);
4343     }
4344 }
4345
4346
4347 /* Print the successors indexes of edge E on FILE.  */
4348
4349 static void
4350 print_succ_bbs (FILE *file, edge e)
4351 {
4352   if (e == NULL)
4353     return;
4354   else if (e->succ_next == NULL)
4355     fprintf (file, "bb_%d", e->dest->index);
4356   else
4357     {
4358       fprintf (file, "bb_%d, ", e->dest->index);
4359       print_succ_bbs (file, e->succ_next);
4360     }
4361 }
4362
4363
4364 /* Pretty print LOOP on FILE, indented INDENT spaces.  */
4365
4366 static void
4367 print_loop (FILE *file, struct loop *loop, int indent)
4368 {
4369   char *s_indent;
4370   basic_block bb;
4371   
4372   if (loop == NULL)
4373     return;
4374
4375   s_indent = (char *) alloca ((size_t) indent + 1);
4376   memset ((void *) s_indent, ' ', (size_t) indent);
4377   s_indent[indent] = '\0';
4378
4379   /* Print the loop's header.  */
4380   fprintf (file, "%sloop_%d\n", s_indent, loop->num);
4381   
4382   /* Print the loop's body.  */
4383   fprintf (file, "%s{\n", s_indent);
4384   FOR_EACH_BB (bb)
4385     if (bb->loop_father == loop)
4386       {
4387         /* Print the basic_block's header.  */
4388         fprintf (file, "%s  bb_%d (preds = {", s_indent, bb->index);
4389         print_pred_bbs (file, bb->pred);
4390         fprintf (file, "}, succs = {");
4391         print_succ_bbs (file, bb->succ);
4392         fprintf (file, "})\n");
4393         
4394         /* Print the basic_block's body.  */
4395         fprintf (file, "%s  {\n", s_indent);
4396         tree_dump_bb (bb, file, indent + 4);
4397         fprintf (file, "%s  }\n", s_indent);
4398       }
4399   
4400   print_loop (file, loop->inner, indent + 2);
4401   fprintf (file, "%s}\n", s_indent);
4402   print_loop (file, loop->next, indent);
4403 }
4404
4405
4406 /* Follow a CFG edge from the entry point of the program, and on entry
4407    of a loop, pretty print the loop structure on FILE.  */
4408
4409 void 
4410 print_loop_ir (FILE *file)
4411 {
4412   basic_block bb;
4413   
4414   bb = BASIC_BLOCK (0);
4415   if (bb && bb->loop_father)
4416     print_loop (file, bb->loop_father, 0);
4417 }
4418
4419
4420 /* Debugging loops structure at tree level.  */
4421
4422 void 
4423 debug_loop_ir (void)
4424 {
4425   print_loop_ir (stderr);
4426 }
4427
4428
4429 /* Return true if BB ends with a call, possibly followed by some
4430    instructions that must stay with the call.  Return false,
4431    otherwise.  */
4432
4433 static bool
4434 tree_block_ends_with_call_p (basic_block bb)
4435 {
4436   block_stmt_iterator bsi = bsi_last (bb);
4437   tree t = tsi_stmt (bsi.tsi);
4438
4439   if (TREE_CODE (t) == RETURN_EXPR && TREE_OPERAND (t, 0))
4440     t = TREE_OPERAND (t, 0);
4441
4442   if (TREE_CODE (t) == MODIFY_EXPR)
4443     t = TREE_OPERAND (t, 1);
4444
4445   return TREE_CODE (t) == CALL_EXPR;
4446 }
4447
4448
4449 /* Return true if BB ends with a conditional branch.  Return false,
4450    otherwise.  */
4451
4452 static bool
4453 tree_block_ends_with_condjump_p (basic_block bb)
4454 {
4455   tree stmt = tsi_stmt (bsi_last (bb).tsi);
4456   return (TREE_CODE (stmt) == COND_EXPR);
4457 }
4458
4459
4460 /* Return true if we need to add fake edge to exit at statement T.
4461    Helper function for tree_flow_call_edges_add.  */
4462
4463 static bool
4464 need_fake_edge_p (tree t)
4465 {
4466   if (TREE_CODE (t) == RETURN_EXPR && TREE_OPERAND (t, 0))
4467     t = TREE_OPERAND (t, 0);
4468
4469   if (TREE_CODE (t) == MODIFY_EXPR)
4470     t = TREE_OPERAND (t, 1);
4471
4472   /* NORETURN and LONGJMP calls already have an edge to exit.
4473      CONST, PURE and ALWAYS_RETURN calls do not need one.
4474      We don't currently check for CONST and PURE here, although
4475      it would be a good idea, because those attributes are
4476      figured out from the RTL in mark_constant_function, and
4477      the counter incrementation code from -fprofile-arcs
4478      leads to different results from -fbranch-probabilities.  */
4479   if (TREE_CODE (t) == CALL_EXPR
4480       && !(call_expr_flags (t) & 
4481             (ECF_NORETURN | ECF_LONGJMP | ECF_ALWAYS_RETURN)))
4482     return true;
4483
4484   if (TREE_CODE (t) == ASM_EXPR
4485        && (ASM_VOLATILE_P (t) || ASM_INPUT_P (t)))
4486     return true;
4487
4488   return false;
4489 }
4490
4491
4492 /* Add fake edges to the function exit for any non constant and non
4493    noreturn calls, volatile inline assembly in the bitmap of blocks
4494    specified by BLOCKS or to the whole CFG if BLOCKS is zero.  Return
4495    the number of blocks that were split.
4496
4497    The goal is to expose cases in which entering a basic block does
4498    not imply that all subsequent instructions must be executed.  */
4499
4500 static int
4501 tree_flow_call_edges_add (sbitmap blocks)
4502 {
4503   int i;
4504   int blocks_split = 0;
4505   int last_bb = last_basic_block;
4506   bool check_last_block = false;
4507
4508   if (n_basic_blocks == 0)
4509     return 0;
4510
4511   if (! blocks)
4512     check_last_block = true;
4513   else
4514     check_last_block = TEST_BIT (blocks, EXIT_BLOCK_PTR->prev_bb->index);
4515
4516   /* In the last basic block, before epilogue generation, there will be
4517      a fallthru edge to EXIT.  Special care is required if the last insn
4518      of the last basic block is a call because make_edge folds duplicate
4519      edges, which would result in the fallthru edge also being marked
4520      fake, which would result in the fallthru edge being removed by
4521      remove_fake_edges, which would result in an invalid CFG.
4522
4523      Moreover, we can't elide the outgoing fake edge, since the block
4524      profiler needs to take this into account in order to solve the minimal
4525      spanning tree in the case that the call doesn't return.
4526
4527      Handle this by adding a dummy instruction in a new last basic block.  */
4528   if (check_last_block)
4529     {
4530       basic_block bb = EXIT_BLOCK_PTR->prev_bb;
4531       block_stmt_iterator bsi = bsi_last (bb);
4532       tree t = NULL_TREE;
4533       if (!bsi_end_p (bsi))
4534         t = bsi_stmt (bsi);
4535
4536       if (need_fake_edge_p (t))
4537         {
4538           edge e;
4539
4540           for (e = bb->succ; e; e = e->succ_next)
4541             if (e->dest == EXIT_BLOCK_PTR)
4542               {
4543                 bsi_insert_on_edge (e, build_empty_stmt ());
4544                 bsi_commit_edge_inserts ((int *)NULL);
4545                 break;
4546               }
4547         }
4548     }
4549
4550   /* Now add fake edges to the function exit for any non constant
4551      calls since there is no way that we can determine if they will
4552      return or not...  */
4553   for (i = 0; i < last_bb; i++)
4554     {
4555       basic_block bb = BASIC_BLOCK (i);
4556       block_stmt_iterator bsi;
4557       tree stmt, last_stmt;
4558
4559       if (!bb)
4560         continue;
4561
4562       if (blocks && !TEST_BIT (blocks, i))
4563         continue;
4564
4565       bsi = bsi_last (bb);
4566       if (!bsi_end_p (bsi))
4567         {
4568           last_stmt = bsi_stmt (bsi);
4569           do
4570             {
4571               stmt = bsi_stmt (bsi);
4572               if (need_fake_edge_p (stmt))
4573                 {
4574                   edge e;
4575                   /* The handling above of the final block before the
4576                      epilogue should be enough to verify that there is
4577                      no edge to the exit block in CFG already.
4578                      Calling make_edge in such case would cause us to
4579                      mark that edge as fake and remove it later.  */
4580 #ifdef ENABLE_CHECKING
4581                   if (stmt == last_stmt)
4582                     for (e = bb->succ; e; e = e->succ_next)
4583                       if (e->dest == EXIT_BLOCK_PTR)
4584                         abort ();
4585 #endif
4586
4587                   /* Note that the following may create a new basic block
4588                      and renumber the existing basic blocks.  */
4589                   if (stmt != last_stmt)
4590                     {
4591                       e = split_block (bb, stmt);
4592                       if (e)
4593                         blocks_split++;
4594                     }
4595                   make_edge (bb, EXIT_BLOCK_PTR, EDGE_FAKE);
4596                 }
4597               bsi_prev (&bsi);
4598             }
4599           while (!bsi_end_p (bsi));
4600         }
4601     }
4602
4603   if (blocks_split)
4604     verify_flow_info ();
4605
4606   return blocks_split;
4607 }
4608
4609
4610 struct cfg_hooks tree_cfg_hooks = {
4611   "tree",
4612   tree_verify_flow_info,
4613   tree_dump_bb,                 /* dump_bb  */
4614   create_bb,                    /* create_basic_block  */
4615   tree_redirect_edge_and_branch,/* redirect_edge_and_branch  */
4616   tree_redirect_edge_and_branch_force,/* redirect_edge_and_branch_force  */
4617   remove_bb,                    /* delete_basic_block  */
4618   tree_split_block,             /* split_block  */
4619   tree_move_block_after,        /* move_block_after  */
4620   tree_can_merge_blocks_p,      /* can_merge_blocks_p  */
4621   tree_merge_blocks,            /* merge_blocks  */
4622   tree_predict_edge,            /* predict_edge  */
4623   tree_predicted_by_p,          /* predicted_by_p  */
4624   tree_can_duplicate_bb_p,      /* can_duplicate_block_p  */
4625   tree_duplicate_bb,            /* duplicate_block  */
4626   tree_split_edge,              /* split_edge  */
4627   tree_make_forwarder_block,    /* make_forward_block  */
4628   NULL,                         /* tidy_fallthru_edge  */
4629   tree_block_ends_with_call_p,  /* block_ends_with_call_p */
4630   tree_block_ends_with_condjump_p, /* block_ends_with_condjump_p */
4631   tree_flow_call_edges_add      /* flow_call_edges_add */
4632 };
4633
4634
4635 /* Split all critical edges.  */
4636
4637 static void
4638 split_critical_edges (void)
4639 {
4640   basic_block bb;
4641   edge e;
4642
4643   FOR_ALL_BB (bb)
4644     {
4645       for (e = bb->succ; e ; e = e->succ_next)
4646         if (EDGE_CRITICAL_P (e) && !(e->flags & EDGE_ABNORMAL))
4647           {
4648             split_edge (e);
4649           }
4650     }
4651 }
4652
4653 struct tree_opt_pass pass_split_crit_edges = 
4654 {
4655   NULL,                          /* name */
4656   NULL,                          /* gate */
4657   split_critical_edges,          /* execute */
4658   NULL,                          /* sub */
4659   NULL,                          /* next */
4660   0,                             /* static_pass_number */
4661   TV_TREE_SPLIT_EDGES,           /* tv_id */
4662   PROP_cfg,                      /* properties required */
4663   PROP_no_crit_edges,            /* properties_provided */
4664   0,                             /* properties_destroyed */
4665   0,                             /* todo_flags_start */
4666   0,                             /* todo_flags_finish */
4667 };
4668 \f
4669 /* Emit return warnings.  */
4670
4671 static void
4672 execute_warn_function_return (void)
4673 {
4674   location_t *locus;
4675   tree last;
4676   edge e;
4677
4678   if (warn_missing_noreturn
4679       && !TREE_THIS_VOLATILE (cfun->decl)
4680       && EXIT_BLOCK_PTR->pred == NULL
4681       && !lang_hooks.function.missing_noreturn_ok_p (cfun->decl))
4682     warning ("%Jfunction might be possible candidate for attribute `noreturn'",
4683              cfun->decl);
4684
4685   /* If we have a path to EXIT, then we do return.  */
4686   if (TREE_THIS_VOLATILE (cfun->decl)
4687       && EXIT_BLOCK_PTR->pred != NULL)
4688     {
4689       locus = NULL;
4690       for (e = EXIT_BLOCK_PTR->pred; e ; e = e->pred_next)
4691         {
4692           last = last_stmt (e->src);
4693           if (TREE_CODE (last) == RETURN_EXPR
4694               && (locus = EXPR_LOCUS (last)) != NULL)
4695             break;
4696         }
4697       if (!locus)
4698         locus = &cfun->function_end_locus;
4699       warning ("%H`noreturn' function does return", locus);
4700     }
4701
4702   /* If we see "return;" in some basic block, then we do reach the end
4703      without returning a value.  */
4704   else if (warn_return_type
4705            && EXIT_BLOCK_PTR->pred != NULL
4706            && !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (cfun->decl))))
4707     {
4708       for (e = EXIT_BLOCK_PTR->pred; e ; e = e->pred_next)
4709         {
4710           tree last = last_stmt (e->src);
4711           if (TREE_CODE (last) == RETURN_EXPR
4712               && TREE_OPERAND (last, 0) == NULL)
4713             {
4714               locus = EXPR_LOCUS (last);
4715               if (!locus)
4716                 locus = &cfun->function_end_locus;
4717               warning ("%Hcontrol reaches end of non-void function", locus);
4718               break;
4719             }
4720         }
4721     }
4722 }
4723
4724
4725 /* Given a basic block B which ends with a conditional and has
4726    precisely two successors, determine which of the edges is taken if
4727    the conditional is true and which is taken if the conditional is
4728    false.  Set TRUE_EDGE and FALSE_EDGE appropriately.  */
4729
4730 void
4731 extract_true_false_edges_from_block (basic_block b,
4732                                      edge *true_edge,
4733                                      edge *false_edge)
4734 {
4735   edge e = b->succ;
4736
4737   if (e->flags & EDGE_TRUE_VALUE)
4738     {
4739       *true_edge = e;
4740       *false_edge = e->succ_next;
4741     }
4742   else
4743     {
4744       *false_edge = e;
4745       *true_edge = e->succ_next;
4746     }
4747 }
4748
4749 struct tree_opt_pass pass_warn_function_return =
4750 {
4751   NULL,                                 /* name */
4752   NULL,                                 /* gate */
4753   execute_warn_function_return,         /* execute */
4754   NULL,                                 /* sub */
4755   NULL,                                 /* next */
4756   0,                                    /* static_pass_number */
4757   0,                                    /* tv_id */
4758   PROP_ssa,                             /* properties_required */
4759   0,                                    /* properties_provided */
4760   0,                                    /* properties_destroyed */
4761   0,                                    /* todo_flags_start */
4762   0                                     /* todo_flags_finish */
4763 };
4764
4765 #include "gt-tree-cfg.h"