OSDN Git Service

* basic-block.h (struct edge_def): Add goto_locus.
[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           edge e = make_edge (bb, label_to_block (dest), EDGE_FALLTHRU);
684           e->goto_locus = EXPR_LOCUS (goto_t);
685           bsi_remove (&last);
686           return;
687         }
688
689       /* Nothing more to do for nonlocal gotos.  */
690       if (TREE_CODE (dest) == LABEL_DECL)
691         return;
692
693       /* Computed gotos remain.  */
694     }
695
696   /* Look for the block starting with the destination label.  In the
697      case of a computed goto, make an edge to any label block we find
698      in the CFG.  */
699   FOR_EACH_BB (target_bb)
700     {
701       block_stmt_iterator bsi;
702
703       for (bsi = bsi_start (target_bb); !bsi_end_p (bsi); bsi_next (&bsi))
704         {
705           tree target = bsi_stmt (bsi);
706
707           if (TREE_CODE (target) != LABEL_EXPR)
708             break;
709
710           if (
711               /* Computed GOTOs.  Make an edge to every label block that has
712                  been marked as a potential target for a computed goto.  */
713               (FORCED_LABEL (LABEL_EXPR_LABEL (target)) && for_call == 0)
714               /* Nonlocal GOTO target.  Make an edge to every label block
715                  that has been marked as a potential target for a nonlocal
716                  goto.  */
717               || (DECL_NONLOCAL (LABEL_EXPR_LABEL (target)) && for_call == 1))
718             {
719               make_edge (bb, target_bb, EDGE_ABNORMAL);
720               break;
721             }
722         }
723     }
724
725   /* Degenerate case of computed goto with no labels.  */
726   if (!for_call && !bb->succ)
727     make_edge (bb, EXIT_BLOCK_PTR, EDGE_FAKE);
728 }
729
730
731 /*---------------------------------------------------------------------------
732                                Flowgraph analysis
733 ---------------------------------------------------------------------------*/
734
735 /* Remove unreachable blocks and other miscellaneous clean up work.  */
736
737 void
738 cleanup_tree_cfg (void)
739 {
740   bool something_changed = true;
741
742   timevar_push (TV_TREE_CLEANUP_CFG);
743
744   /* These three transformations can cascade, so we iterate on them until
745      nothing changes.  */
746   while (something_changed)
747     {
748       something_changed = cleanup_control_flow ();
749       something_changed |= thread_jumps ();
750       something_changed |= delete_unreachable_blocks ();
751     }
752
753   /* Merging the blocks creates no new opportunities for the other
754      optimizations, so do it here.  */
755   merge_seq_blocks ();
756
757   compact_blocks ();
758
759 #ifdef ENABLE_CHECKING
760   verify_flow_info ();
761 #endif
762   timevar_pop (TV_TREE_CLEANUP_CFG);
763 }
764
765
766 /* Cleanup useless labels in basic blocks.  This is something we wish
767    to do early because it allows us to group case labels before creating
768    the edges for the CFG, and it speeds up block statement iterators in
769    all passes later on.
770    We only run this pass once, running it more than once is probably not
771    profitable.  */
772
773 /* A map from basic block index to the leading label of that block.  */
774 static tree *label_for_bb;
775
776 /* Callback for for_each_eh_region.  Helper for cleanup_dead_labels.  */
777 static void
778 update_eh_label (struct eh_region *region)
779 {
780   tree old_label = get_eh_region_tree_label (region);
781   if (old_label)
782     {
783       tree new_label = label_for_bb[label_to_block (old_label)->index];
784       set_eh_region_tree_label (region, new_label);
785     }
786 }
787
788 /* Cleanup redundant labels.  This is a three-steo process:
789      1) Find the leading label for each block.
790      2) Redirect all references to labels to the leading labels.
791      3) Cleanup all useless labels.  */
792
793 static void
794 cleanup_dead_labels (void)
795 {
796   basic_block bb;
797   label_for_bb = xcalloc (last_basic_block, sizeof (tree));
798
799   /* Find a suitable label for each block.  We use the first user-defined
800      label is there is one, or otherwise just the first label we see.  */
801   FOR_EACH_BB (bb)
802     {
803       block_stmt_iterator i;
804
805       for (i = bsi_start (bb); !bsi_end_p (i); bsi_next (&i))
806         {
807           tree label, stmt = bsi_stmt (i);
808
809           if (TREE_CODE (stmt) != LABEL_EXPR)
810             break;
811
812           label = LABEL_EXPR_LABEL (stmt);
813
814           /* If we have not yet seen a label for the current block,
815              remember this one and see if there are more labels.  */
816           if (! label_for_bb[bb->index])
817             {
818               label_for_bb[bb->index] = label;
819               continue;
820             }
821
822           /* If we did see a label for the current block already, but it
823              is an artificially created label, replace it if the current
824              label is a user defined label.  */
825           if (! DECL_ARTIFICIAL (label)
826               && DECL_ARTIFICIAL (label_for_bb[bb->index]))
827             {
828               label_for_bb[bb->index] = label;
829               break;
830             }
831         }
832     }
833
834   /* Now redirect all jumps/branches to the selected label.
835      First do so for each block ending in a control statement.  */
836   FOR_EACH_BB (bb)
837     {
838       tree stmt = last_stmt (bb);
839       if (!stmt)
840         continue;
841
842       switch (TREE_CODE (stmt))
843         {
844         case COND_EXPR:
845           {
846             tree true_branch, false_branch;
847             basic_block true_bb, false_bb;
848
849             true_branch = COND_EXPR_THEN (stmt);
850             false_branch = COND_EXPR_ELSE (stmt);
851             true_bb = label_to_block (GOTO_DESTINATION (true_branch));
852             false_bb = label_to_block (GOTO_DESTINATION (false_branch));
853
854             GOTO_DESTINATION (true_branch) = label_for_bb[true_bb->index];
855             GOTO_DESTINATION (false_branch) = label_for_bb[false_bb->index];
856
857             break;
858           }
859   
860         case SWITCH_EXPR:
861           {
862             size_t i;
863             tree vec = SWITCH_LABELS (stmt);
864             size_t n = TREE_VEC_LENGTH (vec);
865   
866             /* Replace all destination labels.  */
867             for (i = 0; i < n; ++i)
868               {
869                 tree label = CASE_LABEL (TREE_VEC_ELT (vec, i));
870
871                 CASE_LABEL (TREE_VEC_ELT (vec, i)) =
872                   label_for_bb[label_to_block (label)->index];
873               }
874   
875             break;
876           }
877
878         /* We have to handle GOTO_EXPRs until they're removed, and we don't
879            remove them until after we've created the CFG edges.  */
880         case GOTO_EXPR:
881           {
882             tree label = GOTO_DESTINATION (stmt);
883             if (! computed_goto_p (stmt))
884               GOTO_DESTINATION (stmt) =
885                 label_for_bb[label_to_block (label)->index];
886             break;
887           }
888
889         default:
890           break;
891       }
892     }
893
894   for_each_eh_region (update_eh_label);
895
896   /* Finally, purge dead labels.  All user-defined labels and labels that
897      can be the target of non-local gotos are preserved.  */
898   FOR_EACH_BB (bb)
899     {
900       block_stmt_iterator i;
901       tree label_for_this_bb = label_for_bb[bb->index];
902
903       if (! label_for_this_bb)
904         continue;
905
906       for (i = bsi_start (bb); !bsi_end_p (i); )
907         {
908           tree label, stmt = bsi_stmt (i);
909
910           if (TREE_CODE (stmt) != LABEL_EXPR)
911             break;
912
913           label = LABEL_EXPR_LABEL (stmt);
914
915           if (label == label_for_this_bb
916               || ! DECL_ARTIFICIAL (label)
917               || DECL_NONLOCAL (label))
918             bsi_next (&i);
919           else
920             bsi_remove (&i);
921         }
922     }
923
924   free (label_for_bb);
925 }
926
927 /* Look for blocks ending in a multiway branch (a SWITCH_EXPR in GIMPLE),
928    and scan the sorted vector of cases.  Combine the ones jumping to the
929    same label.
930    Eg. three separate entries 1: 2: 3: become one entry 1..3:  */
931
932 static void
933 group_case_labels (void)
934 {
935   basic_block bb;
936
937   FOR_EACH_BB (bb)
938     {
939       tree stmt = last_stmt (bb);
940       if (stmt && TREE_CODE (stmt) == SWITCH_EXPR)
941         {
942           tree labels = SWITCH_LABELS (stmt);
943           int old_size = TREE_VEC_LENGTH (labels);
944           int i, j, new_size = old_size;
945
946           /* Look for possible opportunities to merge cases.
947              Ignore the last element of the label vector because it
948              must be the default case.  */
949           i = 0;
950           while (i < old_size - 2)
951             {
952               tree base_case, base_label, base_high, type;
953               base_case = TREE_VEC_ELT (labels, i);
954
955               if (! base_case)
956                 abort ();
957
958               type = TREE_TYPE (CASE_LOW (base_case));
959               base_label = CASE_LABEL (base_case);
960               base_high = CASE_HIGH (base_case) ?
961                 CASE_HIGH (base_case) : CASE_LOW (base_case);
962
963               /* Try to merge case labels.  Break out when we reach the end
964                  of the label vector or when we cannot merge the next case
965                  label with the current one.  */
966               while (i < old_size - 2)
967                 {
968                   tree merge_case = TREE_VEC_ELT (labels, ++i);
969                   tree merge_label = CASE_LABEL (merge_case);
970                   tree t = int_const_binop (PLUS_EXPR, base_high,
971                                             integer_one_node, 1);
972
973                   /* Merge the cases if they jump to the same place,
974                      and their ranges are consecutive.  */
975                   if (merge_label == base_label
976                       && tree_int_cst_equal (CASE_LOW (merge_case), t))
977                     {
978                       base_high = CASE_HIGH (merge_case) ?
979                         CASE_HIGH (merge_case) : CASE_LOW (merge_case);
980                       CASE_HIGH (base_case) = base_high;
981                       TREE_VEC_ELT (labels, i) = NULL_TREE;
982                       new_size--;
983                     }
984                   else
985                     break;
986                 }
987             }
988
989           /* Compress the case labels in the label vector, and adjust the
990              length of the vector.  */
991           for (i = 0, j = 0; i < new_size; i++)
992             {
993               while (! TREE_VEC_ELT (labels, j))
994                 j++;
995               TREE_VEC_ELT (labels, i) = TREE_VEC_ELT (labels, j++);
996             }
997           TREE_VEC_LENGTH (labels) = new_size;
998         }
999     }
1000 }
1001
1002 /* Checks whether we can merge block B into block A.  */
1003
1004 static bool
1005 tree_can_merge_blocks_p (basic_block a, basic_block b)
1006 {
1007   tree stmt;
1008   block_stmt_iterator bsi;
1009
1010   if (!a->succ
1011       || a->succ->succ_next)
1012     return false;
1013
1014   if (a->succ->flags & EDGE_ABNORMAL)
1015     return false;
1016
1017   if (a->succ->dest != b)
1018     return false;
1019
1020   if (b == EXIT_BLOCK_PTR)
1021     return false;
1022   
1023   if (b->pred->pred_next)
1024     return false;
1025
1026   /* If A ends by a statement causing exceptions or something similar, we
1027      cannot merge the blocks.  */
1028   stmt = last_stmt (a);
1029   if (stmt && stmt_ends_bb_p (stmt))
1030     return false;
1031
1032   /* Do not allow a block with only a non-local label to be merged.  */
1033   if (stmt && TREE_CODE (stmt) == LABEL_EXPR
1034       && DECL_NONLOCAL (LABEL_EXPR_LABEL (stmt)))
1035     return false;
1036
1037   /* There may be no phi nodes at the start of b.  Most of these degenerate
1038      phi nodes should be cleaned up by kill_redundant_phi_nodes.  */
1039   if (phi_nodes (b))
1040     return false;
1041
1042   /* Do not remove user labels.  */
1043   for (bsi = bsi_start (b); !bsi_end_p (bsi); bsi_next (&bsi))
1044     {
1045       stmt = bsi_stmt (bsi);
1046       if (TREE_CODE (stmt) != LABEL_EXPR)
1047         break;
1048       if (!DECL_ARTIFICIAL (LABEL_EXPR_LABEL (stmt)))
1049         return false;
1050     }
1051
1052   return true;
1053 }
1054
1055
1056 /* Merge block B into block A.  */
1057
1058 static void
1059 tree_merge_blocks (basic_block a, basic_block b)
1060 {
1061   block_stmt_iterator bsi;
1062   tree_stmt_iterator last;
1063
1064   if (dump_file)
1065     fprintf (dump_file, "Merging blocks %d and %d\n", a->index, b->index);
1066
1067   /* Ensure that B follows A.  */
1068   move_block_after (b, a);
1069
1070   if (!(a->succ->flags & EDGE_FALLTHRU))
1071     abort ();
1072
1073   if (last_stmt (a)
1074       && stmt_ends_bb_p (last_stmt (a)))
1075     abort ();
1076
1077   /* Remove labels from B and set bb_for_stmt to A for other statements.  */
1078   for (bsi = bsi_start (b); !bsi_end_p (bsi);)
1079     {
1080       if (TREE_CODE (bsi_stmt (bsi)) == LABEL_EXPR)
1081         bsi_remove (&bsi);
1082       else
1083         {
1084           set_bb_for_stmt (bsi_stmt (bsi), a);
1085           bsi_next (&bsi);
1086         }
1087     }
1088
1089   /* Merge the chains.  */
1090   last = tsi_last (a->stmt_list);
1091   tsi_link_after (&last, b->stmt_list, TSI_NEW_STMT);
1092   b->stmt_list = NULL;
1093 }
1094
1095
1096 /* Walk the function tree removing unnecessary statements.
1097
1098      * Empty statement nodes are removed
1099
1100      * Unnecessary TRY_FINALLY and TRY_CATCH blocks are removed
1101
1102      * Unnecessary COND_EXPRs are removed
1103
1104      * Some unnecessary BIND_EXPRs are removed
1105
1106    Clearly more work could be done.  The trick is doing the analysis
1107    and removal fast enough to be a net improvement in compile times.
1108
1109    Note that when we remove a control structure such as a COND_EXPR
1110    BIND_EXPR, or TRY block, we will need to repeat this optimization pass
1111    to ensure we eliminate all the useless code.  */
1112
1113 struct rus_data
1114 {
1115   tree *last_goto;
1116   bool repeat;
1117   bool may_throw;
1118   bool may_branch;
1119   bool has_label;
1120 };
1121
1122 static void remove_useless_stmts_1 (tree *, struct rus_data *);
1123
1124 static bool
1125 remove_useless_stmts_warn_notreached (tree stmt)
1126 {
1127   if (EXPR_LOCUS (stmt))
1128     {
1129       warning ("%Hwill never be executed", EXPR_LOCUS (stmt));
1130       return true;
1131     }
1132
1133   switch (TREE_CODE (stmt))
1134     {
1135     case STATEMENT_LIST:
1136       {
1137         tree_stmt_iterator i;
1138         for (i = tsi_start (stmt); !tsi_end_p (i); tsi_next (&i))
1139           if (remove_useless_stmts_warn_notreached (tsi_stmt (i)))
1140             return true;
1141       }
1142       break;
1143
1144     case COND_EXPR:
1145       if (remove_useless_stmts_warn_notreached (COND_EXPR_COND (stmt)))
1146         return true;
1147       if (remove_useless_stmts_warn_notreached (COND_EXPR_THEN (stmt)))
1148         return true;
1149       if (remove_useless_stmts_warn_notreached (COND_EXPR_ELSE (stmt)))
1150         return true;
1151       break;
1152
1153     case TRY_FINALLY_EXPR:
1154     case TRY_CATCH_EXPR:
1155       if (remove_useless_stmts_warn_notreached (TREE_OPERAND (stmt, 0)))
1156         return true;
1157       if (remove_useless_stmts_warn_notreached (TREE_OPERAND (stmt, 1)))
1158         return true;
1159       break;
1160
1161     case CATCH_EXPR:
1162       return remove_useless_stmts_warn_notreached (CATCH_BODY (stmt));
1163     case EH_FILTER_EXPR:
1164       return remove_useless_stmts_warn_notreached (EH_FILTER_FAILURE (stmt));
1165     case BIND_EXPR:
1166       return remove_useless_stmts_warn_notreached (BIND_EXPR_BLOCK (stmt));
1167
1168     default:
1169       /* Not a live container.  */
1170       break;
1171     }
1172
1173   return false;
1174 }
1175
1176 static void
1177 remove_useless_stmts_cond (tree *stmt_p, struct rus_data *data)
1178 {
1179   tree then_clause, else_clause, cond;
1180   bool save_has_label, then_has_label, else_has_label;
1181
1182   save_has_label = data->has_label;
1183   data->has_label = false;
1184   data->last_goto = NULL;
1185
1186   remove_useless_stmts_1 (&COND_EXPR_THEN (*stmt_p), data);
1187
1188   then_has_label = data->has_label;
1189   data->has_label = false;
1190   data->last_goto = NULL;
1191
1192   remove_useless_stmts_1 (&COND_EXPR_ELSE (*stmt_p), data);
1193
1194   else_has_label = data->has_label;
1195   data->has_label = save_has_label | then_has_label | else_has_label;
1196
1197   fold_stmt (stmt_p);
1198   then_clause = COND_EXPR_THEN (*stmt_p);
1199   else_clause = COND_EXPR_ELSE (*stmt_p);
1200   cond = COND_EXPR_COND (*stmt_p);
1201
1202   /* If neither arm does anything at all, we can remove the whole IF.  */
1203   if (!TREE_SIDE_EFFECTS (then_clause) && !TREE_SIDE_EFFECTS (else_clause))
1204     {
1205       *stmt_p = build_empty_stmt ();
1206       data->repeat = true;
1207     }
1208
1209   /* If there are no reachable statements in an arm, then we can
1210      zap the entire conditional.  */
1211   else if (integer_nonzerop (cond) && !else_has_label)
1212     {
1213       if (warn_notreached)
1214         remove_useless_stmts_warn_notreached (else_clause);
1215       *stmt_p = then_clause;
1216       data->repeat = true;
1217     }
1218   else if (integer_zerop (cond) && !then_has_label)
1219     {
1220       if (warn_notreached)
1221         remove_useless_stmts_warn_notreached (then_clause);
1222       *stmt_p = else_clause;
1223       data->repeat = true;
1224     }
1225
1226   /* Check a couple of simple things on then/else with single stmts.  */
1227   else
1228     {
1229       tree then_stmt = expr_only (then_clause);
1230       tree else_stmt = expr_only (else_clause);
1231
1232       /* Notice branches to a common destination.  */
1233       if (then_stmt && else_stmt
1234           && TREE_CODE (then_stmt) == GOTO_EXPR
1235           && TREE_CODE (else_stmt) == GOTO_EXPR
1236           && (GOTO_DESTINATION (then_stmt) == GOTO_DESTINATION (else_stmt)))
1237         {
1238           *stmt_p = then_stmt;
1239           data->repeat = true;
1240         }
1241
1242       /* If the THEN/ELSE clause merely assigns a value to a variable or
1243          parameter which is already known to contain that value, then
1244          remove the useless THEN/ELSE clause.  */
1245       else if (TREE_CODE (cond) == VAR_DECL || TREE_CODE (cond) == PARM_DECL)
1246         {
1247           if (else_stmt
1248               && TREE_CODE (else_stmt) == MODIFY_EXPR
1249               && TREE_OPERAND (else_stmt, 0) == cond
1250               && integer_zerop (TREE_OPERAND (else_stmt, 1)))
1251             COND_EXPR_ELSE (*stmt_p) = alloc_stmt_list ();
1252         }
1253       else if ((TREE_CODE (cond) == EQ_EXPR || TREE_CODE (cond) == NE_EXPR)
1254                && (TREE_CODE (TREE_OPERAND (cond, 0)) == VAR_DECL
1255                    || TREE_CODE (TREE_OPERAND (cond, 0)) == PARM_DECL)
1256                && TREE_CONSTANT (TREE_OPERAND (cond, 1)))
1257         {
1258           tree stmt = (TREE_CODE (cond) == EQ_EXPR
1259                        ? then_stmt : else_stmt);
1260           tree *location = (TREE_CODE (cond) == EQ_EXPR
1261                             ? &COND_EXPR_THEN (*stmt_p)
1262                             : &COND_EXPR_ELSE (*stmt_p));
1263
1264           if (stmt
1265               && TREE_CODE (stmt) == MODIFY_EXPR
1266               && TREE_OPERAND (stmt, 0) == TREE_OPERAND (cond, 0)
1267               && TREE_OPERAND (stmt, 1) == TREE_OPERAND (cond, 1))
1268             *location = alloc_stmt_list ();
1269         }
1270     }
1271
1272   /* Protect GOTOs in the arm of COND_EXPRs from being removed.  They
1273      would be re-introduced during lowering.  */
1274   data->last_goto = NULL;
1275 }
1276
1277
1278 static void
1279 remove_useless_stmts_tf (tree *stmt_p, struct rus_data *data)
1280 {
1281   bool save_may_branch, save_may_throw;
1282   bool this_may_branch, this_may_throw;
1283
1284   /* Collect may_branch and may_throw information for the body only.  */
1285   save_may_branch = data->may_branch;
1286   save_may_throw = data->may_throw;
1287   data->may_branch = false;
1288   data->may_throw = false;
1289   data->last_goto = NULL;
1290
1291   remove_useless_stmts_1 (&TREE_OPERAND (*stmt_p, 0), data);
1292
1293   this_may_branch = data->may_branch;
1294   this_may_throw = data->may_throw;
1295   data->may_branch |= save_may_branch;
1296   data->may_throw |= save_may_throw;
1297   data->last_goto = NULL;
1298
1299   remove_useless_stmts_1 (&TREE_OPERAND (*stmt_p, 1), data);
1300
1301   /* If the body is empty, then we can emit the FINALLY block without
1302      the enclosing TRY_FINALLY_EXPR.  */
1303   if (!TREE_SIDE_EFFECTS (TREE_OPERAND (*stmt_p, 0)))
1304     {
1305       *stmt_p = TREE_OPERAND (*stmt_p, 1);
1306       data->repeat = true;
1307     }
1308
1309   /* If the handler is empty, then we can emit the TRY block without
1310      the enclosing TRY_FINALLY_EXPR.  */
1311   else if (!TREE_SIDE_EFFECTS (TREE_OPERAND (*stmt_p, 1)))
1312     {
1313       *stmt_p = TREE_OPERAND (*stmt_p, 0);
1314       data->repeat = true;
1315     }
1316
1317   /* If the body neither throws, nor branches, then we can safely
1318      string the TRY and FINALLY blocks together.  */
1319   else if (!this_may_branch && !this_may_throw)
1320     {
1321       tree stmt = *stmt_p;
1322       *stmt_p = TREE_OPERAND (stmt, 0);
1323       append_to_statement_list (TREE_OPERAND (stmt, 1), stmt_p);
1324       data->repeat = true;
1325     }
1326 }
1327
1328
1329 static void
1330 remove_useless_stmts_tc (tree *stmt_p, struct rus_data *data)
1331 {
1332   bool save_may_throw, this_may_throw;
1333   tree_stmt_iterator i;
1334   tree stmt;
1335
1336   /* Collect may_throw information for the body only.  */
1337   save_may_throw = data->may_throw;
1338   data->may_throw = false;
1339   data->last_goto = NULL;
1340
1341   remove_useless_stmts_1 (&TREE_OPERAND (*stmt_p, 0), data);
1342
1343   this_may_throw = data->may_throw;
1344   data->may_throw = save_may_throw;
1345
1346   /* If the body cannot throw, then we can drop the entire TRY_CATCH_EXPR.  */
1347   if (!this_may_throw)
1348     {
1349       if (warn_notreached)
1350         remove_useless_stmts_warn_notreached (TREE_OPERAND (*stmt_p, 1));
1351       *stmt_p = TREE_OPERAND (*stmt_p, 0);
1352       data->repeat = true;
1353       return;
1354     }
1355
1356   /* Process the catch clause specially.  We may be able to tell that
1357      no exceptions propagate past this point.  */
1358
1359   this_may_throw = true;
1360   i = tsi_start (TREE_OPERAND (*stmt_p, 1));
1361   stmt = tsi_stmt (i);
1362   data->last_goto = NULL;
1363
1364   switch (TREE_CODE (stmt))
1365     {
1366     case CATCH_EXPR:
1367       for (; !tsi_end_p (i); tsi_next (&i))
1368         {
1369           stmt = tsi_stmt (i);
1370           /* If we catch all exceptions, then the body does not
1371              propagate exceptions past this point.  */
1372           if (CATCH_TYPES (stmt) == NULL)
1373             this_may_throw = false;
1374           data->last_goto = NULL;
1375           remove_useless_stmts_1 (&CATCH_BODY (stmt), data);
1376         }
1377       break;
1378
1379     case EH_FILTER_EXPR:
1380       if (EH_FILTER_MUST_NOT_THROW (stmt))
1381         this_may_throw = false;
1382       else if (EH_FILTER_TYPES (stmt) == NULL)
1383         this_may_throw = false;
1384       remove_useless_stmts_1 (&EH_FILTER_FAILURE (stmt), data);
1385       break;
1386
1387     default:
1388       /* Otherwise this is a cleanup.  */
1389       remove_useless_stmts_1 (&TREE_OPERAND (*stmt_p, 1), data);
1390
1391       /* If the cleanup is empty, then we can emit the TRY block without
1392          the enclosing TRY_CATCH_EXPR.  */
1393       if (!TREE_SIDE_EFFECTS (TREE_OPERAND (*stmt_p, 1)))
1394         {
1395           *stmt_p = TREE_OPERAND (*stmt_p, 0);
1396           data->repeat = true;
1397         }
1398       break;
1399     }
1400   data->may_throw |= this_may_throw;
1401 }
1402
1403
1404 static void
1405 remove_useless_stmts_bind (tree *stmt_p, struct rus_data *data)
1406 {
1407   tree block;
1408
1409   /* First remove anything underneath the BIND_EXPR.  */
1410   remove_useless_stmts_1 (&BIND_EXPR_BODY (*stmt_p), data);
1411
1412   /* If the BIND_EXPR has no variables, then we can pull everything
1413      up one level and remove the BIND_EXPR, unless this is the toplevel
1414      BIND_EXPR for the current function or an inlined function.
1415
1416      When this situation occurs we will want to apply this
1417      optimization again.  */
1418   block = BIND_EXPR_BLOCK (*stmt_p);
1419   if (BIND_EXPR_VARS (*stmt_p) == NULL_TREE
1420       && *stmt_p != DECL_SAVED_TREE (current_function_decl)
1421       && (! block
1422           || ! BLOCK_ABSTRACT_ORIGIN (block)
1423           || (TREE_CODE (BLOCK_ABSTRACT_ORIGIN (block))
1424               != FUNCTION_DECL)))
1425     {
1426       *stmt_p = BIND_EXPR_BODY (*stmt_p);
1427       data->repeat = true;
1428     }
1429 }
1430
1431
1432 static void
1433 remove_useless_stmts_goto (tree *stmt_p, struct rus_data *data)
1434 {
1435   tree dest = GOTO_DESTINATION (*stmt_p);
1436
1437   data->may_branch = true;
1438   data->last_goto = NULL;
1439
1440   /* Record the last goto expr, so that we can delete it if unnecessary.  */
1441   if (TREE_CODE (dest) == LABEL_DECL)
1442     data->last_goto = stmt_p;
1443 }
1444
1445
1446 static void
1447 remove_useless_stmts_label (tree *stmt_p, struct rus_data *data)
1448 {
1449   tree label = LABEL_EXPR_LABEL (*stmt_p);
1450
1451   data->has_label = true;
1452
1453   /* We do want to jump across non-local label receiver code.  */
1454   if (DECL_NONLOCAL (label))
1455     data->last_goto = NULL;
1456
1457   else if (data->last_goto && GOTO_DESTINATION (*data->last_goto) == label)
1458     {
1459       *data->last_goto = build_empty_stmt ();
1460       data->repeat = true;
1461     }
1462
1463   /* ??? Add something here to delete unused labels.  */
1464 }
1465
1466
1467 /* If the function is "const" or "pure", then clear TREE_SIDE_EFFECTS on its
1468    decl.  This allows us to eliminate redundant or useless
1469    calls to "const" functions. 
1470
1471    Gimplifier already does the same operation, but we may notice functions
1472    being const and pure once their calls has been gimplified, so we need
1473    to update the flag.  */
1474
1475 static void
1476 update_call_expr_flags (tree call)
1477 {
1478   tree decl = get_callee_fndecl (call);
1479   if (!decl)
1480     return;
1481   if (call_expr_flags (call) & (ECF_CONST | ECF_PURE))
1482     TREE_SIDE_EFFECTS (call) = 0;
1483   if (TREE_NOTHROW (decl))
1484     TREE_NOTHROW (call) = 1;
1485 }
1486
1487
1488 /* T is CALL_EXPR.  Set current_function_calls_* flags.  */
1489
1490 void
1491 notice_special_calls (tree t)
1492 {
1493   int flags = call_expr_flags (t);
1494
1495   if (flags & ECF_MAY_BE_ALLOCA)
1496     current_function_calls_alloca = true;
1497   if (flags & ECF_RETURNS_TWICE)
1498     current_function_calls_setjmp = true;
1499 }
1500
1501
1502 /* Clear flags set by notice_special_calls.  Used by dead code removal
1503    to update the flags.  */
1504
1505 void
1506 clear_special_calls (void)
1507 {
1508   current_function_calls_alloca = false;
1509   current_function_calls_setjmp = false;
1510 }
1511
1512
1513 static void
1514 remove_useless_stmts_1 (tree *tp, struct rus_data *data)
1515 {
1516   tree t = *tp;
1517
1518   switch (TREE_CODE (t))
1519     {
1520     case COND_EXPR:
1521       remove_useless_stmts_cond (tp, data);
1522       break;
1523
1524     case TRY_FINALLY_EXPR:
1525       remove_useless_stmts_tf (tp, data);
1526       break;
1527
1528     case TRY_CATCH_EXPR:
1529       remove_useless_stmts_tc (tp, data);
1530       break;
1531
1532     case BIND_EXPR:
1533       remove_useless_stmts_bind (tp, data);
1534       break;
1535
1536     case GOTO_EXPR:
1537       remove_useless_stmts_goto (tp, data);
1538       break;
1539
1540     case LABEL_EXPR:
1541       remove_useless_stmts_label (tp, data);
1542       break;
1543
1544     case RETURN_EXPR:
1545       fold_stmt (tp);
1546       data->last_goto = NULL;
1547       data->may_branch = true;
1548       break;
1549
1550     case CALL_EXPR:
1551       fold_stmt (tp);
1552       data->last_goto = NULL;
1553       notice_special_calls (t);
1554       update_call_expr_flags (t);
1555       if (tree_could_throw_p (t))
1556         data->may_throw = true;
1557       break;
1558
1559     case MODIFY_EXPR:
1560       data->last_goto = NULL;
1561       fold_stmt (tp);
1562       if (TREE_CODE (TREE_OPERAND (t, 1)) == CALL_EXPR)
1563         {
1564           update_call_expr_flags (TREE_OPERAND (t, 1));
1565           notice_special_calls (TREE_OPERAND (t, 1));
1566         }
1567       if (tree_could_throw_p (t))
1568         data->may_throw = true;
1569       break;
1570
1571     case STATEMENT_LIST:
1572       {
1573         tree_stmt_iterator i = tsi_start (t);
1574         while (!tsi_end_p (i))
1575           {
1576             t = tsi_stmt (i);
1577             if (IS_EMPTY_STMT (t))
1578               {
1579                 tsi_delink (&i);
1580                 continue;
1581               }
1582             
1583             remove_useless_stmts_1 (tsi_stmt_ptr (i), data);
1584
1585             t = tsi_stmt (i);
1586             if (TREE_CODE (t) == STATEMENT_LIST)
1587               {
1588                 tsi_link_before (&i, t, TSI_SAME_STMT);
1589                 tsi_delink (&i);
1590               }
1591             else
1592               tsi_next (&i);
1593           }
1594       }
1595       break;
1596     case SWITCH_EXPR:
1597       fold_stmt (tp);
1598       data->last_goto = NULL;
1599       break;
1600
1601     default:
1602       data->last_goto = NULL;
1603       break;
1604     }
1605 }
1606
1607 static void
1608 remove_useless_stmts (void)
1609 {
1610   struct rus_data data;
1611
1612   clear_special_calls ();
1613
1614   do
1615     {
1616       memset (&data, 0, sizeof (data));
1617       remove_useless_stmts_1 (&DECL_SAVED_TREE (current_function_decl), &data);
1618     }
1619   while (data.repeat);
1620 }
1621
1622
1623 struct tree_opt_pass pass_remove_useless_stmts = 
1624 {
1625   "useless",                            /* name */
1626   NULL,                                 /* gate */
1627   remove_useless_stmts,                 /* execute */
1628   NULL,                                 /* sub */
1629   NULL,                                 /* next */
1630   0,                                    /* static_pass_number */
1631   0,                                    /* tv_id */
1632   PROP_gimple_any,                      /* properties_required */
1633   0,                                    /* properties_provided */
1634   0,                                    /* properties_destroyed */
1635   0,                                    /* todo_flags_start */
1636   TODO_dump_func                        /* todo_flags_finish */
1637 };
1638
1639
1640 /* Remove obviously useless statements in basic block BB.  */
1641
1642 static void
1643 cfg_remove_useless_stmts_bb (basic_block bb)
1644 {
1645   block_stmt_iterator bsi;
1646   tree stmt = NULL_TREE;
1647   tree cond, var = NULL_TREE, val = NULL_TREE;
1648   struct var_ann_d *ann;
1649
1650   /* Check whether we come here from a condition, and if so, get the
1651      condition.  */
1652   if (!bb->pred
1653       || bb->pred->pred_next
1654       || !(bb->pred->flags & (EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
1655     return;
1656
1657   cond = COND_EXPR_COND (last_stmt (bb->pred->src));
1658
1659   if (TREE_CODE (cond) == VAR_DECL || TREE_CODE (cond) == PARM_DECL)
1660     {
1661       var = cond;
1662       val = (bb->pred->flags & EDGE_FALSE_VALUE
1663              ? boolean_false_node : boolean_true_node);
1664     }
1665   else if (TREE_CODE (cond) == TRUTH_NOT_EXPR
1666            && (TREE_CODE (TREE_OPERAND (cond, 0)) == VAR_DECL
1667                || TREE_CODE (TREE_OPERAND (cond, 0)) == PARM_DECL))
1668     {
1669       var = TREE_OPERAND (cond, 0);
1670       val = (bb->pred->flags & EDGE_FALSE_VALUE
1671              ? boolean_true_node : boolean_false_node);
1672     }
1673   else
1674     {
1675       if (bb->pred->flags & EDGE_FALSE_VALUE)
1676         cond = invert_truthvalue (cond);
1677       if (TREE_CODE (cond) == EQ_EXPR
1678           && (TREE_CODE (TREE_OPERAND (cond, 0)) == VAR_DECL
1679               || TREE_CODE (TREE_OPERAND (cond, 0)) == PARM_DECL)
1680           && (TREE_CODE (TREE_OPERAND (cond, 1)) == VAR_DECL
1681               || TREE_CODE (TREE_OPERAND (cond, 1)) == PARM_DECL
1682               || TREE_CONSTANT (TREE_OPERAND (cond, 1))))
1683         {
1684           var = TREE_OPERAND (cond, 0);
1685           val = TREE_OPERAND (cond, 1);
1686         }
1687       else
1688         return;
1689     }
1690
1691   /* Only work for normal local variables.  */
1692   ann = var_ann (var);
1693   if (!ann
1694       || ann->may_aliases
1695       || TREE_ADDRESSABLE (var))
1696     return;
1697
1698   if (! TREE_CONSTANT (val))
1699     {
1700       ann = var_ann (val);
1701       if (!ann
1702           || ann->may_aliases
1703           || TREE_ADDRESSABLE (val))
1704         return;
1705     }
1706
1707   /* Ignore floating point variables, since comparison behaves weird for
1708      them.  */
1709   if (FLOAT_TYPE_P (TREE_TYPE (var)))
1710     return;
1711
1712   for (bsi = bsi_start (bb); !bsi_end_p (bsi);)
1713     {
1714       stmt = bsi_stmt (bsi);
1715
1716       /* If the THEN/ELSE clause merely assigns a value to a variable/parameter
1717          which is already known to contain that value, then remove the useless
1718          THEN/ELSE clause.  */
1719       if (TREE_CODE (stmt) == MODIFY_EXPR
1720           && TREE_OPERAND (stmt, 0) == var
1721           && operand_equal_p (val, TREE_OPERAND (stmt, 1), 0))
1722         {
1723           bsi_remove (&bsi);
1724           continue;
1725         }
1726
1727       /* Invalidate the var if we encounter something that could modify it.  */
1728       if (TREE_CODE (stmt) == ASM_EXPR
1729           || TREE_CODE (stmt) == VA_ARG_EXPR
1730           || (TREE_CODE (stmt) == MODIFY_EXPR
1731               && (TREE_OPERAND (stmt, 0) == var
1732                   || TREE_OPERAND (stmt, 0) == val
1733                   || TREE_CODE (TREE_OPERAND (stmt, 1)) == VA_ARG_EXPR)))
1734         return;
1735   
1736       bsi_next (&bsi);
1737     }
1738 }
1739
1740
1741 /* A CFG-aware version of remove_useless_stmts.  */
1742
1743 void
1744 cfg_remove_useless_stmts (void)
1745 {
1746   basic_block bb;
1747
1748 #ifdef ENABLE_CHECKING
1749   verify_flow_info ();
1750 #endif
1751
1752   FOR_EACH_BB (bb)
1753     {
1754       cfg_remove_useless_stmts_bb (bb);
1755     }
1756 }
1757
1758
1759 /* Remove PHI nodes associated with basic block BB and all edges out of BB.  */
1760
1761 static void
1762 remove_phi_nodes_and_edges_for_unreachable_block (basic_block bb)
1763 {
1764   tree phi;
1765
1766   /* Since this block is no longer reachable, we can just delete all
1767      of its PHI nodes.  */
1768   phi = phi_nodes (bb);
1769   while (phi)
1770     {
1771       tree next = TREE_CHAIN (phi);
1772       remove_phi_node (phi, NULL_TREE, bb);
1773       phi = next;
1774     }
1775
1776   /* Remove edges to BB's successors.  */
1777   while (bb->succ != NULL)
1778     ssa_remove_edge (bb->succ);
1779 }
1780
1781
1782 /* Remove statements of basic block BB.  */
1783
1784 static void
1785 remove_bb (basic_block bb)
1786 {
1787   block_stmt_iterator i;
1788   location_t *loc = NULL;
1789
1790   if (dump_file)
1791     {
1792       fprintf (dump_file, "Removing basic block %d\n", bb->index);
1793       if (dump_flags & TDF_DETAILS)
1794         {
1795           dump_bb (bb, dump_file, 0);
1796           fprintf (dump_file, "\n");
1797         }
1798     }
1799
1800   /* Remove all the instructions in the block.  */
1801   for (i = bsi_start (bb); !bsi_end_p (i); bsi_remove (&i))
1802     {
1803       tree stmt = bsi_stmt (i);
1804
1805       set_bb_for_stmt (stmt, NULL);
1806
1807       /* Don't warn for removed gotos.  Gotos are often removed due to
1808          jump threading, thus resulting in bogus warnings.  Not great,
1809          since this way we lose warnings for gotos in the original
1810          program that are indeed unreachable.  */
1811       if (TREE_CODE (stmt) != GOTO_EXPR && EXPR_LOCUS (stmt) && !loc)
1812         loc = EXPR_LOCUS (stmt);
1813     }
1814
1815   /* If requested, give a warning that the first statement in the
1816      block is unreachable.  We walk statements backwards in the
1817      loop above, so the last statement we process is the first statement
1818      in the block.  */
1819   if (warn_notreached && loc)
1820     warning ("%Hwill never be executed", loc);
1821
1822   remove_phi_nodes_and_edges_for_unreachable_block (bb);
1823 }
1824
1825
1826 /* Examine BB to determine if it is a forwarding block (a block which only
1827    transfers control to a new destination).  If BB is a forwarding block,
1828    then return the edge leading to the ultimate destination.  */
1829
1830 edge
1831 tree_block_forwards_to (basic_block bb)
1832 {
1833   block_stmt_iterator bsi;
1834   bb_ann_t ann = bb_ann (bb);
1835   tree stmt;
1836
1837   /* If this block is not forwardable, then avoid useless work.  */
1838   if (! ann->forwardable)
1839     return NULL;
1840
1841   /* Set this block to not be forwardable.  This prevents infinite loops since
1842      any block currently under examination is considered non-forwardable.  */
1843   ann->forwardable = 0;
1844
1845   /* No forwarding is possible if this block is a special block (ENTRY/EXIT),
1846      this block has more than one successor, this block's single successor is
1847      reached via an abnormal edge, this block has phi nodes, or this block's
1848      single successor has phi nodes.  */
1849   if (bb == EXIT_BLOCK_PTR
1850       || bb == ENTRY_BLOCK_PTR
1851       || !bb->succ
1852       || bb->succ->succ_next
1853       || bb->succ->dest == EXIT_BLOCK_PTR
1854       || (bb->succ->flags & EDGE_ABNORMAL) != 0
1855       || phi_nodes (bb)
1856       || phi_nodes (bb->succ->dest))
1857     return NULL;
1858
1859   /* Walk past any labels at the start of this block.  */
1860   for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
1861     {
1862       stmt = bsi_stmt (bsi);
1863       if (TREE_CODE (stmt) != LABEL_EXPR)
1864         break;
1865     }
1866
1867   /* If we reached the end of this block we may be able to optimize this
1868      case.  */
1869   if (bsi_end_p (bsi))
1870     {
1871       edge dest;
1872
1873       /* Recursive call to pick up chains of forwarding blocks.  */
1874       dest = tree_block_forwards_to (bb->succ->dest);
1875
1876       /* If none found, we forward to bb->succ at minimum.  */
1877       if (!dest)
1878         dest = bb->succ;
1879
1880       ann->forwardable = 1;
1881       return dest;
1882     }
1883
1884   /* No forwarding possible.  */
1885   return NULL;
1886 }
1887
1888
1889 /* Try to remove superfluous control structures.  */
1890
1891 static bool
1892 cleanup_control_flow (void)
1893 {
1894   basic_block bb;
1895   block_stmt_iterator bsi;
1896   bool retval = false;
1897   tree stmt;
1898
1899   FOR_EACH_BB (bb)
1900     {
1901       bsi = bsi_last (bb);
1902
1903       if (bsi_end_p (bsi))
1904         continue;
1905       
1906       stmt = bsi_stmt (bsi);
1907       if (TREE_CODE (stmt) == COND_EXPR
1908           || TREE_CODE (stmt) == SWITCH_EXPR)
1909         retval |= cleanup_control_expr_graph (bb, bsi);
1910     }
1911   return retval;
1912 }
1913
1914
1915 /* Disconnect an unreachable block in the control expression starting
1916    at block BB.  */
1917
1918 static bool
1919 cleanup_control_expr_graph (basic_block bb, block_stmt_iterator bsi)
1920 {
1921   edge taken_edge;
1922   bool retval = false;
1923   tree expr = bsi_stmt (bsi), val;
1924
1925   if (bb->succ->succ_next)
1926     {
1927       edge e, next;
1928
1929       switch (TREE_CODE (expr))
1930         {
1931         case COND_EXPR:
1932           val = COND_EXPR_COND (expr);
1933           break;
1934
1935         case SWITCH_EXPR:
1936           val = SWITCH_COND (expr);
1937           if (TREE_CODE (val) != INTEGER_CST)
1938             return false;
1939           break;
1940
1941         default:
1942           abort ();
1943         }
1944
1945       taken_edge = find_taken_edge (bb, val);
1946       if (!taken_edge)
1947         return false;
1948
1949       /* Remove all the edges except the one that is always executed.  */
1950       for (e = bb->succ; e; e = next)
1951         {
1952           next = e->succ_next;
1953           if (e != taken_edge)
1954             {
1955               taken_edge->probability += e->probability;
1956               taken_edge->count += e->count;
1957               ssa_remove_edge (e);
1958               retval = true;
1959             }
1960         }
1961       if (taken_edge->probability > REG_BR_PROB_BASE)
1962         taken_edge->probability = REG_BR_PROB_BASE;
1963     }
1964   else
1965     taken_edge = bb->succ;
1966
1967   bsi_remove (&bsi);
1968   taken_edge->flags = EDGE_FALLTHRU;
1969
1970   /* We removed some paths from the cfg.  */
1971   if (dom_computed[CDI_DOMINATORS] >= DOM_CONS_OK)
1972     dom_computed[CDI_DOMINATORS] = DOM_CONS_OK;
1973
1974   return retval;
1975 }
1976
1977
1978 /* Given a control block BB and a constant value VAL, return the edge that
1979    will be taken out of the block.  If VAL does not match a unique edge,
1980    NULL is returned.  */
1981
1982 edge
1983 find_taken_edge (basic_block bb, tree val)
1984 {
1985   tree stmt;
1986
1987   stmt = last_stmt (bb);
1988
1989 #if defined ENABLE_CHECKING
1990   if (stmt == NULL_TREE || !is_ctrl_stmt (stmt))
1991     abort ();
1992 #endif
1993
1994   /* If VAL is not a constant, we can't determine which edge might
1995      be taken.  */
1996   if (val == NULL || !really_constant_p (val))
1997     return NULL;
1998
1999   if (TREE_CODE (stmt) == COND_EXPR)
2000     return find_taken_edge_cond_expr (bb, val);
2001
2002   if (TREE_CODE (stmt) == SWITCH_EXPR)
2003     return find_taken_edge_switch_expr (bb, val);
2004
2005   return bb->succ;
2006 }
2007
2008
2009 /* Given a constant value VAL and the entry block BB to a COND_EXPR
2010    statement, determine which of the two edges will be taken out of the
2011    block.  Return NULL if either edge may be taken.  */
2012
2013 static edge
2014 find_taken_edge_cond_expr (basic_block bb, tree val)
2015 {
2016   edge true_edge, false_edge;
2017
2018   extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
2019
2020   /* If both edges of the branch lead to the same basic block, it doesn't
2021      matter which edge is taken.  */
2022   if (true_edge->dest == false_edge->dest)
2023     return true_edge;
2024
2025   /* Otherwise, try to determine which branch of the if() will be taken.
2026      If VAL is a constant but it can't be reduced to a 0 or a 1, then
2027      we don't really know which edge will be taken at runtime.  This
2028      may happen when comparing addresses (e.g., if (&var1 == 4)).  */
2029   if (integer_nonzerop (val))
2030     return true_edge;
2031   else if (integer_zerop (val))
2032     return false_edge;
2033   else
2034     return NULL;
2035 }
2036
2037
2038 /* Given a constant value VAL and the entry block BB to a SWITCH_EXPR
2039    statement, determine which edge will be taken out of the block.  Return
2040    NULL if any edge may be taken.  */
2041
2042 static edge
2043 find_taken_edge_switch_expr (basic_block bb, tree val)
2044 {
2045   tree switch_expr, taken_case;
2046   basic_block dest_bb;
2047   edge e;
2048
2049   if (TREE_CODE (val) != INTEGER_CST)
2050     return NULL;
2051
2052   switch_expr = last_stmt (bb);
2053   taken_case = find_case_label_for_value (switch_expr, val);
2054   dest_bb = label_to_block (CASE_LABEL (taken_case));
2055
2056   e = find_edge (bb, dest_bb);
2057   if (!e)
2058     abort ();
2059   return e;
2060 }
2061
2062
2063 /* Return the CASE_LABEL_EXPR that SWITCH_EXPR will take for VAL.
2064    We can make optimal use here of the fact that the case labels are
2065    sorted: We can do a binary search for a case matching VAL.  */
2066
2067 static tree
2068 find_case_label_for_value (tree switch_expr, tree val)
2069 {
2070   tree vec = SWITCH_LABELS (switch_expr);
2071   size_t low, high, n = TREE_VEC_LENGTH (vec);
2072   tree default_case = TREE_VEC_ELT (vec, n - 1);
2073
2074   for (low = -1, high = n - 1; high - low > 1; )
2075     {
2076       size_t i = (high + low) / 2;
2077       tree t = TREE_VEC_ELT (vec, i);
2078       int cmp;
2079
2080       /* Cache the result of comparing CASE_LOW and val.  */
2081       cmp = tree_int_cst_compare (CASE_LOW (t), val);
2082
2083       if (cmp > 0)
2084         high = i;
2085       else
2086         low = i;
2087
2088       if (CASE_HIGH (t) == NULL)
2089         {
2090           /* A singe-valued case label.  */
2091           if (cmp == 0)
2092             return t;
2093         }
2094       else
2095         {
2096           /* A case range.  We can only handle integer ranges.  */
2097           if (cmp <= 0 && tree_int_cst_compare (CASE_HIGH (t), val) >= 0)
2098             return t;
2099         }
2100     }
2101
2102   return default_case;
2103 }
2104
2105
2106 /* If all the PHI nodes in DEST have alternatives for E1 and E2 and
2107    those alternatives are equal in each of the PHI nodes, then return
2108    true, else return false.  */
2109
2110 static bool
2111 phi_alternatives_equal (basic_block dest, edge e1, edge e2)
2112 {
2113   tree phi, val1, val2;
2114   int n1, n2;
2115
2116   for (phi = phi_nodes (dest); phi; phi = TREE_CHAIN (phi))
2117     {
2118       n1 = phi_arg_from_edge (phi, e1);
2119       n2 = phi_arg_from_edge (phi, e2);
2120
2121 #ifdef ENABLE_CHECKING
2122       if (n1 < 0 || n2 < 0)
2123         abort ();
2124 #endif
2125
2126       val1 = PHI_ARG_DEF (phi, n1);
2127       val2 = PHI_ARG_DEF (phi, n2);
2128
2129       if (!operand_equal_p (val1, val2, 0))
2130         return false;
2131     }
2132
2133   return true;
2134 }
2135
2136
2137 /* Computing the Dominance Frontier:
2138
2139    As described in Morgan, section 3.5, this may be done simply by
2140    walking the dominator tree bottom-up, computing the frontier for
2141    the children before the parent.  When considering a block B,
2142    there are two cases:
2143
2144    (1) A flow graph edge leaving B that does not lead to a child
2145    of B in the dominator tree must be a block that is either equal
2146    to B or not dominated by B.  Such blocks belong in the frontier
2147    of B.
2148
2149    (2) Consider a block X in the frontier of one of the children C
2150    of B.  If X is not equal to B and is not dominated by B, it
2151    is in the frontier of B.  */
2152
2153 static void
2154 compute_dominance_frontiers_1 (bitmap *frontiers, basic_block bb, sbitmap done)
2155 {
2156   edge e;
2157   basic_block c;
2158
2159   SET_BIT (done, bb->index);
2160
2161   /* Do the frontier of the children first.  Not all children in the
2162      dominator tree (blocks dominated by this one) are children in the
2163      CFG, so check all blocks.  */
2164   for (c = first_dom_son (CDI_DOMINATORS, bb);
2165        c;
2166        c = next_dom_son (CDI_DOMINATORS, c))
2167     {
2168       if (! TEST_BIT (done, c->index))
2169         compute_dominance_frontiers_1 (frontiers, c, done);
2170     }
2171       
2172   /* Find blocks conforming to rule (1) above.  */
2173   for (e = bb->succ; e; e = e->succ_next)
2174     {
2175       if (e->dest == EXIT_BLOCK_PTR)
2176         continue;
2177       if (get_immediate_dominator (CDI_DOMINATORS, e->dest) != bb)
2178         bitmap_set_bit (frontiers[bb->index], e->dest->index);
2179     }
2180
2181   /* Find blocks conforming to rule (2).  */
2182   for (c = first_dom_son (CDI_DOMINATORS, bb);
2183        c;
2184        c = next_dom_son (CDI_DOMINATORS, c))
2185     {
2186       int x;
2187
2188       EXECUTE_IF_SET_IN_BITMAP (frontiers[c->index], 0, x,
2189         {
2190           if (get_immediate_dominator (CDI_DOMINATORS, BASIC_BLOCK (x)) != bb)
2191             bitmap_set_bit (frontiers[bb->index], x);
2192         });
2193     }
2194 }
2195
2196
2197 void
2198 compute_dominance_frontiers (bitmap *frontiers)
2199 {
2200   sbitmap done = sbitmap_alloc (last_basic_block);
2201
2202   timevar_push (TV_DOM_FRONTIERS);
2203
2204   sbitmap_zero (done);
2205
2206   compute_dominance_frontiers_1 (frontiers, ENTRY_BLOCK_PTR->succ->dest, done);
2207
2208   sbitmap_free (done);
2209
2210   timevar_pop (TV_DOM_FRONTIERS);
2211 }
2212
2213
2214
2215 /*---------------------------------------------------------------------------
2216                               Debugging functions
2217 ---------------------------------------------------------------------------*/
2218
2219 /* Dump tree-specific information of block BB to file OUTF.  */
2220
2221 void
2222 tree_dump_bb (basic_block bb, FILE *outf, int indent)
2223 {
2224   dump_generic_bb (outf, bb, indent, TDF_VOPS);
2225 }
2226
2227
2228 /* Dump a basic block on stderr.  */
2229
2230 void
2231 debug_tree_bb (basic_block bb)
2232 {
2233   dump_bb (bb, stderr, 0);
2234 }
2235
2236
2237 /* Dump basic block with index N on stderr.  */
2238
2239 basic_block
2240 debug_tree_bb_n (int n)
2241 {
2242   debug_tree_bb (BASIC_BLOCK (n));
2243   return BASIC_BLOCK (n);
2244 }        
2245
2246
2247 /* Dump the CFG on stderr.
2248
2249    FLAGS are the same used by the tree dumping functions
2250    (see TDF_* in tree.h).  */
2251
2252 void
2253 debug_tree_cfg (int flags)
2254 {
2255   dump_tree_cfg (stderr, flags);
2256 }
2257
2258
2259 /* Dump the program showing basic block boundaries on the given FILE.
2260
2261    FLAGS are the same used by the tree dumping functions (see TDF_* in
2262    tree.h).  */
2263
2264 void
2265 dump_tree_cfg (FILE *file, int flags)
2266 {
2267   if (flags & TDF_DETAILS)
2268     {
2269       const char *funcname
2270         = lang_hooks.decl_printable_name (current_function_decl, 2);
2271
2272       fputc ('\n', file);
2273       fprintf (file, ";; Function %s\n\n", funcname);
2274       fprintf (file, ";; \n%d basic blocks, %d edges, last basic block %d.\n\n",
2275                n_basic_blocks, n_edges, last_basic_block);
2276
2277       brief_dump_cfg (file);
2278       fprintf (file, "\n");
2279     }
2280
2281   if (flags & TDF_STATS)
2282     dump_cfg_stats (file);
2283
2284   dump_function_to_file (current_function_decl, file, flags | TDF_BLOCKS);
2285 }
2286
2287
2288 /* Dump CFG statistics on FILE.  */
2289
2290 void
2291 dump_cfg_stats (FILE *file)
2292 {
2293   static long max_num_merged_labels = 0;
2294   unsigned long size, total = 0;
2295   long n_edges;
2296   basic_block bb;
2297   const char * const fmt_str   = "%-30s%-13s%12s\n";
2298   const char * const fmt_str_1 = "%-30s%13lu%11lu%c\n";
2299   const char * const fmt_str_3 = "%-43s%11lu%c\n";
2300   const char *funcname
2301     = lang_hooks.decl_printable_name (current_function_decl, 2);
2302
2303
2304   fprintf (file, "\nCFG Statistics for %s\n\n", funcname);
2305
2306   fprintf (file, "---------------------------------------------------------\n");
2307   fprintf (file, fmt_str, "", "  Number of  ", "Memory");
2308   fprintf (file, fmt_str, "", "  instances  ", "used ");
2309   fprintf (file, "---------------------------------------------------------\n");
2310
2311   size = n_basic_blocks * sizeof (struct basic_block_def);
2312   total += size;
2313   fprintf (file, fmt_str_1, "Basic blocks", n_basic_blocks, SCALE (size),
2314            LABEL (size));
2315
2316   n_edges = 0;
2317   FOR_EACH_BB (bb)
2318     {
2319       edge e;
2320       for (e = bb->succ; e; e = e->succ_next)
2321         n_edges++;
2322     }
2323   size = n_edges * sizeof (struct edge_def);
2324   total += size;
2325   fprintf (file, fmt_str_1, "Edges", n_edges, SCALE (size), LABEL (size));
2326
2327   size = n_basic_blocks * sizeof (struct bb_ann_d);
2328   total += size;
2329   fprintf (file, fmt_str_1, "Basic block annotations", n_basic_blocks,
2330            SCALE (size), LABEL (size));
2331
2332   fprintf (file, "---------------------------------------------------------\n");
2333   fprintf (file, fmt_str_3, "Total memory used by CFG data", SCALE (total),
2334            LABEL (total));
2335   fprintf (file, "---------------------------------------------------------\n");
2336   fprintf (file, "\n");
2337
2338   if (cfg_stats.num_merged_labels > max_num_merged_labels)
2339     max_num_merged_labels = cfg_stats.num_merged_labels;
2340
2341   fprintf (file, "Coalesced label blocks: %ld (Max so far: %ld)\n",
2342            cfg_stats.num_merged_labels, max_num_merged_labels);
2343
2344   fprintf (file, "\n");
2345 }
2346
2347
2348 /* Dump CFG statistics on stderr.  Keep extern so that it's always
2349    linked in the final executable.  */
2350
2351 void
2352 debug_cfg_stats (void)
2353 {
2354   dump_cfg_stats (stderr);
2355 }
2356
2357
2358 /* Dump the flowgraph to a .vcg FILE.  */
2359
2360 static void
2361 tree_cfg2vcg (FILE *file)
2362 {
2363   edge e;
2364   basic_block bb;
2365   const char *funcname
2366     = lang_hooks.decl_printable_name (current_function_decl, 2);
2367
2368   /* Write the file header.  */
2369   fprintf (file, "graph: { title: \"%s\"\n", funcname);
2370   fprintf (file, "node: { title: \"ENTRY\" label: \"ENTRY\" }\n");
2371   fprintf (file, "node: { title: \"EXIT\" label: \"EXIT\" }\n");
2372
2373   /* Write blocks and edges.  */
2374   for (e = ENTRY_BLOCK_PTR->succ; e; e = e->succ_next)
2375     {
2376       fprintf (file, "edge: { sourcename: \"ENTRY\" targetname: \"%d\"",
2377                e->dest->index);
2378
2379       if (e->flags & EDGE_FAKE)
2380         fprintf (file, " linestyle: dotted priority: 10");
2381       else
2382         fprintf (file, " linestyle: solid priority: 100");
2383
2384       fprintf (file, " }\n");
2385     }
2386   fputc ('\n', file);
2387
2388   FOR_EACH_BB (bb)
2389     {
2390       enum tree_code head_code, end_code;
2391       const char *head_name, *end_name;
2392       int head_line = 0;
2393       int end_line = 0;
2394       tree first = first_stmt (bb);
2395       tree last = last_stmt (bb);
2396
2397       if (first)
2398         {
2399           head_code = TREE_CODE (first);
2400           head_name = tree_code_name[head_code];
2401           head_line = get_lineno (first);
2402         }
2403       else
2404         head_name = "no-statement";
2405
2406       if (last)
2407         {
2408           end_code = TREE_CODE (last);
2409           end_name = tree_code_name[end_code];
2410           end_line = get_lineno (last);
2411         }
2412       else
2413         end_name = "no-statement";
2414
2415       fprintf (file, "node: { title: \"%d\" label: \"#%d\\n%s (%d)\\n%s (%d)\"}\n",
2416                bb->index, bb->index, head_name, head_line, end_name,
2417                end_line);
2418
2419       for (e = bb->succ; e; e = e->succ_next)
2420         {
2421           if (e->dest == EXIT_BLOCK_PTR)
2422             fprintf (file, "edge: { sourcename: \"%d\" targetname: \"EXIT\"", bb->index);
2423           else
2424             fprintf (file, "edge: { sourcename: \"%d\" targetname: \"%d\"", bb->index, e->dest->index);
2425
2426           if (e->flags & EDGE_FAKE)
2427             fprintf (file, " priority: 10 linestyle: dotted");
2428           else
2429             fprintf (file, " priority: 100 linestyle: solid");
2430
2431           fprintf (file, " }\n");
2432         }
2433
2434       if (bb->next_bb != EXIT_BLOCK_PTR)
2435         fputc ('\n', file);
2436     }
2437
2438   fputs ("}\n\n", file);
2439 }
2440
2441
2442
2443 /*---------------------------------------------------------------------------
2444                              Miscellaneous helpers
2445 ---------------------------------------------------------------------------*/
2446
2447 /* Return true if T represents a stmt that always transfers control.  */
2448
2449 bool
2450 is_ctrl_stmt (tree t)
2451 {
2452   return (TREE_CODE (t) == COND_EXPR
2453           || TREE_CODE (t) == SWITCH_EXPR
2454           || TREE_CODE (t) == GOTO_EXPR
2455           || TREE_CODE (t) == RETURN_EXPR
2456           || TREE_CODE (t) == RESX_EXPR);
2457 }
2458
2459
2460 /* Return true if T is a statement that may alter the flow of control
2461    (e.g., a call to a non-returning function).  */
2462
2463 bool
2464 is_ctrl_altering_stmt (tree t)
2465 {
2466   tree call = t;
2467
2468 #if defined ENABLE_CHECKING
2469   if (t == NULL)
2470     abort ();
2471 #endif
2472
2473   switch (TREE_CODE (t))
2474     {
2475     case MODIFY_EXPR:
2476       /* A MODIFY_EXPR with a rhs of a call has the characteristics
2477          of the call.  */
2478       call = TREE_OPERAND (t, 1);
2479       if (TREE_CODE (call) != CALL_EXPR)
2480         break;
2481       /* FALLTHRU */
2482
2483     case CALL_EXPR:
2484       /* A non-pure/const CALL_EXPR alters flow control if the current
2485          function has nonlocal labels.  */
2486       if (TREE_SIDE_EFFECTS (t)
2487           && current_function_has_nonlocal_label)
2488         return true;
2489
2490       /* A CALL_EXPR also alters control flow if it does not return.  */
2491       if (call_expr_flags (call) & (ECF_NORETURN | ECF_LONGJMP))
2492         return true;
2493       break;
2494
2495     default:
2496       return false;
2497     }
2498
2499   /* If a statement can throw, it alters control flow.  */
2500   return tree_can_throw_internal (t);
2501 }
2502
2503
2504 /* Return true if T is a computed goto.  */
2505
2506 bool
2507 computed_goto_p (tree t)
2508 {
2509   return (TREE_CODE (t) == GOTO_EXPR
2510           && TREE_CODE (GOTO_DESTINATION (t)) != LABEL_DECL);
2511 }
2512
2513
2514 /* Checks whether EXPR is a simple local goto.  */
2515
2516 bool
2517 simple_goto_p (tree expr)
2518 {
2519   return  (TREE_CODE (expr) == GOTO_EXPR
2520            && TREE_CODE (GOTO_DESTINATION (expr)) == LABEL_DECL
2521            && (decl_function_context (GOTO_DESTINATION (expr))
2522                == current_function_decl));
2523 }
2524
2525
2526 /* Return true if T should start a new basic block.  PREV_T is the
2527    statement preceding T.  It is used when T is a label or a case label.
2528    Labels should only start a new basic block if their previous statement
2529    wasn't a label.  Otherwise, sequence of labels would generate
2530    unnecessary basic blocks that only contain a single label.  */
2531
2532 static inline bool
2533 stmt_starts_bb_p (tree t, tree prev_t)
2534 {
2535   enum tree_code code;
2536
2537   if (t == NULL_TREE)
2538     return false;
2539
2540   /* LABEL_EXPRs start a new basic block only if the preceding
2541      statement wasn't a label of the same type.  This prevents the
2542      creation of consecutive blocks that have nothing but a single
2543      label.  */
2544   code = TREE_CODE (t);
2545   if (code == LABEL_EXPR)
2546     {
2547       /* Nonlocal and computed GOTO targets always start a new block.  */
2548       if (code == LABEL_EXPR
2549           && (DECL_NONLOCAL (LABEL_EXPR_LABEL (t))
2550               || FORCED_LABEL (LABEL_EXPR_LABEL (t))))
2551         return true;
2552
2553       if (prev_t && TREE_CODE (prev_t) == code)
2554         {
2555           if (DECL_NONLOCAL (LABEL_EXPR_LABEL (prev_t)))
2556             return true;
2557
2558           cfg_stats.num_merged_labels++;
2559           return false;
2560         }
2561       else
2562         return true;
2563     }
2564
2565   return false;
2566 }
2567
2568
2569 /* Return true if T should end a basic block.  */
2570
2571 bool
2572 stmt_ends_bb_p (tree t)
2573 {
2574   return is_ctrl_stmt (t) || is_ctrl_altering_stmt (t);
2575 }
2576
2577
2578 /* Add gotos that used to be represented implicitly in the CFG.  */
2579
2580 void
2581 disband_implicit_edges (void)
2582 {
2583   basic_block bb;
2584   block_stmt_iterator last;
2585   edge e;
2586   tree stmt, label, forward;
2587
2588   FOR_EACH_BB (bb)
2589     {
2590       last = bsi_last (bb);
2591       stmt = last_stmt (bb);
2592
2593       if (stmt && TREE_CODE (stmt) == COND_EXPR)
2594         {
2595           /* Remove superfluous gotos from COND_EXPR branches.  Moved
2596              from cfg_remove_useless_stmts here since it violates the
2597              invariants for tree--cfg correspondence and thus fits better
2598              here where we do it anyway.  */
2599           for (e = bb->succ; e; e = e->succ_next)
2600             {
2601               if (e->dest != bb->next_bb)
2602                 continue;
2603
2604               if (e->flags & EDGE_TRUE_VALUE)
2605                 COND_EXPR_THEN (stmt) = build_empty_stmt ();
2606               else if (e->flags & EDGE_FALSE_VALUE)
2607                 COND_EXPR_ELSE (stmt) = build_empty_stmt ();
2608               else
2609                 abort ();
2610               e->flags |= EDGE_FALLTHRU;
2611             }
2612
2613           continue;
2614         }
2615
2616       if (stmt && TREE_CODE (stmt) == RETURN_EXPR)
2617         {
2618           /* Remove the RETURN_EXPR if we may fall though to the exit
2619              instead.  */
2620           if (!bb->succ
2621               || bb->succ->succ_next
2622               || bb->succ->dest != EXIT_BLOCK_PTR)
2623             abort ();
2624
2625           if (bb->next_bb == EXIT_BLOCK_PTR
2626               && !TREE_OPERAND (stmt, 0))
2627             {
2628               bsi_remove (&last);
2629               bb->succ->flags |= EDGE_FALLTHRU;
2630             }
2631           continue;
2632         }
2633
2634       /* There can be no fallthru edge if the last statement is a control
2635          one.  */
2636       if (stmt && is_ctrl_stmt (stmt))
2637         continue;
2638
2639       /* Find a fallthru edge and emit the goto if necessary.  */
2640       for (e = bb->succ; e; e = e->succ_next)
2641         if (e->flags & EDGE_FALLTHRU)
2642           break;
2643
2644       if (!e || 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       stmt = build1 (GOTO_EXPR, void_type_node, label);
2662       SET_EXPR_LOCUS (stmt, e->goto_locus);
2663       bsi_insert_after (&last, stmt, 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"