OSDN Git Service

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