OSDN Git Service

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