OSDN Git Service

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