OSDN Git Service

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