OSDN Git Service

PR c/15498
[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
1806       set_bb_for_stmt (stmt, NULL);
1807
1808       /* Don't warn for removed gotos.  Gotos are often removed due to
1809          jump threading, thus resulting in bogus warnings.  Not great,
1810          since this way we lose warnings for gotos in the original
1811          program that are indeed unreachable.  */
1812       if (TREE_CODE (stmt) != GOTO_EXPR && EXPR_HAS_LOCATION (stmt) && !loc)
1813 #ifdef USE_MAPPED_LOCATION
1814         loc = EXPR_LOCATION (stmt);
1815 #else
1816         loc = EXPR_LOCUS (stmt);
1817 #endif
1818     }
1819
1820   /* If requested, give a warning that the first statement in the
1821      block is unreachable.  We walk statements backwards in the
1822      loop above, so the last statement we process is the first statement
1823      in the block.  */
1824   if (warn_notreached && loc)
1825 #ifdef USE_MAPPED_LOCATION
1826     warning ("%Hwill never be executed", &loc);
1827 #else
1828     warning ("%Hwill never be executed", loc);
1829 #endif
1830
1831   remove_phi_nodes_and_edges_for_unreachable_block (bb);
1832 }
1833
1834
1835 /* Examine BB to determine if it is a forwarding block (a block which only
1836    transfers control to a new destination).  If BB is a forwarding block,
1837    then return the edge leading to the ultimate destination.  */
1838
1839 edge
1840 tree_block_forwards_to (basic_block bb)
1841 {
1842   block_stmt_iterator bsi;
1843   bb_ann_t ann = bb_ann (bb);
1844   tree stmt;
1845
1846   /* If this block is not forwardable, then avoid useless work.  */
1847   if (! ann->forwardable)
1848     return NULL;
1849
1850   /* Set this block to not be forwardable.  This prevents infinite loops since
1851      any block currently under examination is considered non-forwardable.  */
1852   ann->forwardable = 0;
1853
1854   /* No forwarding is possible if this block is a special block (ENTRY/EXIT),
1855      this block has more than one successor, this block's single successor is
1856      reached via an abnormal edge, this block has phi nodes, or this block's
1857      single successor has phi nodes.  */
1858   if (bb == EXIT_BLOCK_PTR
1859       || bb == ENTRY_BLOCK_PTR
1860       || !bb->succ
1861       || bb->succ->succ_next
1862       || bb->succ->dest == EXIT_BLOCK_PTR
1863       || (bb->succ->flags & EDGE_ABNORMAL) != 0
1864       || phi_nodes (bb)
1865       || phi_nodes (bb->succ->dest))
1866     return NULL;
1867
1868   /* Walk past any labels at the start of this block.  */
1869   for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
1870     {
1871       stmt = bsi_stmt (bsi);
1872       if (TREE_CODE (stmt) != LABEL_EXPR)
1873         break;
1874     }
1875
1876   /* If we reached the end of this block we may be able to optimize this
1877      case.  */
1878   if (bsi_end_p (bsi))
1879     {
1880       edge dest;
1881
1882       /* Recursive call to pick up chains of forwarding blocks.  */
1883       dest = tree_block_forwards_to (bb->succ->dest);
1884
1885       /* If none found, we forward to bb->succ at minimum.  */
1886       if (!dest)
1887         dest = bb->succ;
1888
1889       ann->forwardable = 1;
1890       return dest;
1891     }
1892
1893   /* No forwarding possible.  */
1894   return NULL;
1895 }
1896
1897
1898 /* Try to remove superfluous control structures.  */
1899
1900 static bool
1901 cleanup_control_flow (void)
1902 {
1903   basic_block bb;
1904   block_stmt_iterator bsi;
1905   bool retval = false;
1906   tree stmt;
1907
1908   FOR_EACH_BB (bb)
1909     {
1910       bsi = bsi_last (bb);
1911
1912       if (bsi_end_p (bsi))
1913         continue;
1914       
1915       stmt = bsi_stmt (bsi);
1916       if (TREE_CODE (stmt) == COND_EXPR
1917           || TREE_CODE (stmt) == SWITCH_EXPR)
1918         retval |= cleanup_control_expr_graph (bb, bsi);
1919     }
1920   return retval;
1921 }
1922
1923
1924 /* Disconnect an unreachable block in the control expression starting
1925    at block BB.  */
1926
1927 static bool
1928 cleanup_control_expr_graph (basic_block bb, block_stmt_iterator bsi)
1929 {
1930   edge taken_edge;
1931   bool retval = false;
1932   tree expr = bsi_stmt (bsi), val;
1933
1934   if (bb->succ->succ_next)
1935     {
1936       edge e, next;
1937
1938       switch (TREE_CODE (expr))
1939         {
1940         case COND_EXPR:
1941           val = COND_EXPR_COND (expr);
1942           break;
1943
1944         case SWITCH_EXPR:
1945           val = SWITCH_COND (expr);
1946           if (TREE_CODE (val) != INTEGER_CST)
1947             return false;
1948           break;
1949
1950         default:
1951           gcc_unreachable ();
1952         }
1953
1954       taken_edge = find_taken_edge (bb, val);
1955       if (!taken_edge)
1956         return false;
1957
1958       /* Remove all the edges except the one that is always executed.  */
1959       for (e = bb->succ; e; e = next)
1960         {
1961           next = e->succ_next;
1962           if (e != taken_edge)
1963             {
1964               taken_edge->probability += e->probability;
1965               taken_edge->count += e->count;
1966               ssa_remove_edge (e);
1967               retval = true;
1968             }
1969         }
1970       if (taken_edge->probability > REG_BR_PROB_BASE)
1971         taken_edge->probability = REG_BR_PROB_BASE;
1972     }
1973   else
1974     taken_edge = bb->succ;
1975
1976   bsi_remove (&bsi);
1977   taken_edge->flags = EDGE_FALLTHRU;
1978
1979   /* We removed some paths from the cfg.  */
1980   if (dom_computed[CDI_DOMINATORS] >= DOM_CONS_OK)
1981     dom_computed[CDI_DOMINATORS] = DOM_CONS_OK;
1982
1983   return retval;
1984 }
1985
1986
1987 /* Given a control block BB and a predicate VAL, return the edge that
1988    will be taken out of the block.  If VAL does not match a unique
1989    edge, NULL is returned.  */
1990
1991 edge
1992 find_taken_edge (basic_block bb, tree val)
1993 {
1994   tree stmt;
1995
1996   stmt = last_stmt (bb);
1997
1998   gcc_assert (stmt);
1999   gcc_assert (is_ctrl_stmt (stmt));
2000
2001   /* If VAL is a predicate of the form N RELOP N, where N is an
2002      SSA_NAME, we can always determine its truth value (except when
2003      doing floating point comparisons that may involve NaNs).  */
2004   if (val
2005       && TREE_CODE_CLASS (TREE_CODE (val)) == '<'
2006       && TREE_OPERAND (val, 0) == TREE_OPERAND (val, 1)
2007       && TREE_CODE (TREE_OPERAND (val, 0)) == SSA_NAME
2008       && (TREE_CODE (TREE_TYPE (TREE_OPERAND (val, 0))) != REAL_TYPE
2009           || !HONOR_NANS (TYPE_MODE (TREE_TYPE (TREE_OPERAND (val, 0))))))
2010     {
2011       enum tree_code code = TREE_CODE (val);
2012
2013       if (code == EQ_EXPR || code == LE_EXPR || code == GE_EXPR)
2014         val = boolean_true_node;
2015       else if (code == LT_EXPR || code == GT_EXPR || code == NE_EXPR)
2016         val = boolean_false_node;
2017     }
2018
2019   /* If VAL is not a constant, we can't determine which edge might
2020      be taken.  */
2021   if (val == NULL || !really_constant_p (val))
2022     return NULL;
2023
2024   if (TREE_CODE (stmt) == COND_EXPR)
2025     return find_taken_edge_cond_expr (bb, val);
2026
2027   if (TREE_CODE (stmt) == SWITCH_EXPR)
2028     return find_taken_edge_switch_expr (bb, val);
2029
2030   return bb->succ;
2031 }
2032
2033
2034 /* Given a constant value VAL and the entry block BB to a COND_EXPR
2035    statement, determine which of the two edges will be taken out of the
2036    block.  Return NULL if either edge may be taken.  */
2037
2038 static edge
2039 find_taken_edge_cond_expr (basic_block bb, tree val)
2040 {
2041   edge true_edge, false_edge;
2042
2043   extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
2044
2045   /* If both edges of the branch lead to the same basic block, it doesn't
2046      matter which edge is taken.  */
2047   if (true_edge->dest == false_edge->dest)
2048     return true_edge;
2049
2050   /* Otherwise, try to determine which branch of the if() will be taken.
2051      If VAL is a constant but it can't be reduced to a 0 or a 1, then
2052      we don't really know which edge will be taken at runtime.  This
2053      may happen when comparing addresses (e.g., if (&var1 == 4)).  */
2054   if (integer_nonzerop (val))
2055     return true_edge;
2056   else if (integer_zerop (val))
2057     return false_edge;
2058   else
2059     return NULL;
2060 }
2061
2062
2063 /* Given a constant value VAL and the entry block BB to a SWITCH_EXPR
2064    statement, determine which edge will be taken out of the block.  Return
2065    NULL if any edge may be taken.  */
2066
2067 static edge
2068 find_taken_edge_switch_expr (basic_block bb, tree val)
2069 {
2070   tree switch_expr, taken_case;
2071   basic_block dest_bb;
2072   edge e;
2073
2074   if (TREE_CODE (val) != INTEGER_CST)
2075     return NULL;
2076
2077   switch_expr = last_stmt (bb);
2078   taken_case = find_case_label_for_value (switch_expr, val);
2079   dest_bb = label_to_block (CASE_LABEL (taken_case));
2080
2081   e = find_edge (bb, dest_bb);
2082   gcc_assert (e);
2083   return e;
2084 }
2085
2086
2087 /* Return the CASE_LABEL_EXPR that SWITCH_EXPR will take for VAL.
2088    We can make optimal use here of the fact that the case labels are
2089    sorted: We can do a binary search for a case matching VAL.  */
2090
2091 static tree
2092 find_case_label_for_value (tree switch_expr, tree val)
2093 {
2094   tree vec = SWITCH_LABELS (switch_expr);
2095   size_t low, high, n = TREE_VEC_LENGTH (vec);
2096   tree default_case = TREE_VEC_ELT (vec, n - 1);
2097
2098   for (low = -1, high = n - 1; high - low > 1; )
2099     {
2100       size_t i = (high + low) / 2;
2101       tree t = TREE_VEC_ELT (vec, i);
2102       int cmp;
2103
2104       /* Cache the result of comparing CASE_LOW and val.  */
2105       cmp = tree_int_cst_compare (CASE_LOW (t), val);
2106
2107       if (cmp > 0)
2108         high = i;
2109       else
2110         low = i;
2111
2112       if (CASE_HIGH (t) == NULL)
2113         {
2114           /* A singe-valued case label.  */
2115           if (cmp == 0)
2116             return t;
2117         }
2118       else
2119         {
2120           /* A case range.  We can only handle integer ranges.  */
2121           if (cmp <= 0 && tree_int_cst_compare (CASE_HIGH (t), val) >= 0)
2122             return t;
2123         }
2124     }
2125
2126   return default_case;
2127 }
2128
2129
2130 /* If all the PHI nodes in DEST have alternatives for E1 and E2 and
2131    those alternatives are equal in each of the PHI nodes, then return
2132    true, else return false.  */
2133
2134 static bool
2135 phi_alternatives_equal (basic_block dest, edge e1, edge e2)
2136 {
2137   tree phi, val1, val2;
2138   int n1, n2;
2139
2140   for (phi = phi_nodes (dest); phi; phi = PHI_CHAIN (phi))
2141     {
2142       n1 = phi_arg_from_edge (phi, e1);
2143       n2 = phi_arg_from_edge (phi, e2);
2144
2145       gcc_assert (n1 >= 0);
2146       gcc_assert (n2 >= 0);
2147
2148       val1 = PHI_ARG_DEF (phi, n1);
2149       val2 = PHI_ARG_DEF (phi, n2);
2150
2151       if (!operand_equal_p (val1, val2, 0))
2152         return false;
2153     }
2154
2155   return true;
2156 }
2157
2158
2159 /*---------------------------------------------------------------------------
2160                               Debugging functions
2161 ---------------------------------------------------------------------------*/
2162
2163 /* Dump tree-specific information of block BB to file OUTF.  */
2164
2165 void
2166 tree_dump_bb (basic_block bb, FILE *outf, int indent)
2167 {
2168   dump_generic_bb (outf, bb, indent, TDF_VOPS);
2169 }
2170
2171
2172 /* Dump a basic block on stderr.  */
2173
2174 void
2175 debug_tree_bb (basic_block bb)
2176 {
2177   dump_bb (bb, stderr, 0);
2178 }
2179
2180
2181 /* Dump basic block with index N on stderr.  */
2182
2183 basic_block
2184 debug_tree_bb_n (int n)
2185 {
2186   debug_tree_bb (BASIC_BLOCK (n));
2187   return BASIC_BLOCK (n);
2188 }        
2189
2190
2191 /* Dump the CFG on stderr.
2192
2193    FLAGS are the same used by the tree dumping functions
2194    (see TDF_* in tree.h).  */
2195
2196 void
2197 debug_tree_cfg (int flags)
2198 {
2199   dump_tree_cfg (stderr, flags);
2200 }
2201
2202
2203 /* Dump the program showing basic block boundaries on the given FILE.
2204
2205    FLAGS are the same used by the tree dumping functions (see TDF_* in
2206    tree.h).  */
2207
2208 void
2209 dump_tree_cfg (FILE *file, int flags)
2210 {
2211   if (flags & TDF_DETAILS)
2212     {
2213       const char *funcname
2214         = lang_hooks.decl_printable_name (current_function_decl, 2);
2215
2216       fputc ('\n', file);
2217       fprintf (file, ";; Function %s\n\n", funcname);
2218       fprintf (file, ";; \n%d basic blocks, %d edges, last basic block %d.\n\n",
2219                n_basic_blocks, n_edges, last_basic_block);
2220
2221       brief_dump_cfg (file);
2222       fprintf (file, "\n");
2223     }
2224
2225   if (flags & TDF_STATS)
2226     dump_cfg_stats (file);
2227
2228   dump_function_to_file (current_function_decl, file, flags | TDF_BLOCKS);
2229 }
2230
2231
2232 /* Dump CFG statistics on FILE.  */
2233
2234 void
2235 dump_cfg_stats (FILE *file)
2236 {
2237   static long max_num_merged_labels = 0;
2238   unsigned long size, total = 0;
2239   int n_edges;
2240   basic_block bb;
2241   const char * const fmt_str   = "%-30s%-13s%12s\n";
2242   const char * const fmt_str_1 = "%-30s%13d%11lu%c\n";
2243   const char * const fmt_str_3 = "%-43s%11lu%c\n";
2244   const char *funcname
2245     = lang_hooks.decl_printable_name (current_function_decl, 2);
2246
2247
2248   fprintf (file, "\nCFG Statistics for %s\n\n", funcname);
2249
2250   fprintf (file, "---------------------------------------------------------\n");
2251   fprintf (file, fmt_str, "", "  Number of  ", "Memory");
2252   fprintf (file, fmt_str, "", "  instances  ", "used ");
2253   fprintf (file, "---------------------------------------------------------\n");
2254
2255   size = n_basic_blocks * sizeof (struct basic_block_def);
2256   total += size;
2257   fprintf (file, fmt_str_1, "Basic blocks", n_basic_blocks,
2258            SCALE (size), LABEL (size));
2259
2260   n_edges = 0;
2261   FOR_EACH_BB (bb)
2262     {
2263       edge e;
2264       for (e = bb->succ; e; e = e->succ_next)
2265         n_edges++;
2266     }
2267   size = n_edges * sizeof (struct edge_def);
2268   total += size;
2269   fprintf (file, fmt_str_1, "Edges", n_edges, SCALE (size), LABEL (size));
2270
2271   size = n_basic_blocks * sizeof (struct bb_ann_d);
2272   total += size;
2273   fprintf (file, fmt_str_1, "Basic block annotations", n_basic_blocks,
2274            SCALE (size), LABEL (size));
2275
2276   fprintf (file, "---------------------------------------------------------\n");
2277   fprintf (file, fmt_str_3, "Total memory used by CFG data", SCALE (total),
2278            LABEL (total));
2279   fprintf (file, "---------------------------------------------------------\n");
2280   fprintf (file, "\n");
2281
2282   if (cfg_stats.num_merged_labels > max_num_merged_labels)
2283     max_num_merged_labels = cfg_stats.num_merged_labels;
2284
2285   fprintf (file, "Coalesced label blocks: %ld (Max so far: %ld)\n",
2286            cfg_stats.num_merged_labels, max_num_merged_labels);
2287
2288   fprintf (file, "\n");
2289 }
2290
2291
2292 /* Dump CFG statistics on stderr.  Keep extern so that it's always
2293    linked in the final executable.  */
2294
2295 void
2296 debug_cfg_stats (void)
2297 {
2298   dump_cfg_stats (stderr);
2299 }
2300
2301
2302 /* Dump the flowgraph to a .vcg FILE.  */
2303
2304 static void
2305 tree_cfg2vcg (FILE *file)
2306 {
2307   edge e;
2308   basic_block bb;
2309   const char *funcname
2310     = lang_hooks.decl_printable_name (current_function_decl, 2);
2311
2312   /* Write the file header.  */
2313   fprintf (file, "graph: { title: \"%s\"\n", funcname);
2314   fprintf (file, "node: { title: \"ENTRY\" label: \"ENTRY\" }\n");
2315   fprintf (file, "node: { title: \"EXIT\" label: \"EXIT\" }\n");
2316
2317   /* Write blocks and edges.  */
2318   for (e = ENTRY_BLOCK_PTR->succ; e; e = e->succ_next)
2319     {
2320       fprintf (file, "edge: { sourcename: \"ENTRY\" targetname: \"%d\"",
2321                e->dest->index);
2322
2323       if (e->flags & EDGE_FAKE)
2324         fprintf (file, " linestyle: dotted priority: 10");
2325       else
2326         fprintf (file, " linestyle: solid priority: 100");
2327
2328       fprintf (file, " }\n");
2329     }
2330   fputc ('\n', file);
2331
2332   FOR_EACH_BB (bb)
2333     {
2334       enum tree_code head_code, end_code;
2335       const char *head_name, *end_name;
2336       int head_line = 0;
2337       int end_line = 0;
2338       tree first = first_stmt (bb);
2339       tree last = last_stmt (bb);
2340
2341       if (first)
2342         {
2343           head_code = TREE_CODE (first);
2344           head_name = tree_code_name[head_code];
2345           head_line = get_lineno (first);
2346         }
2347       else
2348         head_name = "no-statement";
2349
2350       if (last)
2351         {
2352           end_code = TREE_CODE (last);
2353           end_name = tree_code_name[end_code];
2354           end_line = get_lineno (last);
2355         }
2356       else
2357         end_name = "no-statement";
2358
2359       fprintf (file, "node: { title: \"%d\" label: \"#%d\\n%s (%d)\\n%s (%d)\"}\n",
2360                bb->index, bb->index, head_name, head_line, end_name,
2361                end_line);
2362
2363       for (e = bb->succ; e; e = e->succ_next)
2364         {
2365           if (e->dest == EXIT_BLOCK_PTR)
2366             fprintf (file, "edge: { sourcename: \"%d\" targetname: \"EXIT\"", bb->index);
2367           else
2368             fprintf (file, "edge: { sourcename: \"%d\" targetname: \"%d\"", bb->index, e->dest->index);
2369
2370           if (e->flags & EDGE_FAKE)
2371             fprintf (file, " priority: 10 linestyle: dotted");
2372           else
2373             fprintf (file, " priority: 100 linestyle: solid");
2374
2375           fprintf (file, " }\n");
2376         }
2377
2378       if (bb->next_bb != EXIT_BLOCK_PTR)
2379         fputc ('\n', file);
2380     }
2381
2382   fputs ("}\n\n", file);
2383 }
2384
2385
2386
2387 /*---------------------------------------------------------------------------
2388                              Miscellaneous helpers
2389 ---------------------------------------------------------------------------*/
2390
2391 /* Return true if T represents a stmt that always transfers control.  */
2392
2393 bool
2394 is_ctrl_stmt (tree t)
2395 {
2396   return (TREE_CODE (t) == COND_EXPR
2397           || TREE_CODE (t) == SWITCH_EXPR
2398           || TREE_CODE (t) == GOTO_EXPR
2399           || TREE_CODE (t) == RETURN_EXPR
2400           || TREE_CODE (t) == RESX_EXPR);
2401 }
2402
2403
2404 /* Return true if T is a statement that may alter the flow of control
2405    (e.g., a call to a non-returning function).  */
2406
2407 bool
2408 is_ctrl_altering_stmt (tree t)
2409 {
2410   tree call;
2411
2412   gcc_assert (t);
2413   call = get_call_expr_in (t);
2414   if (call)
2415     {
2416       /* A non-pure/const CALL_EXPR alters flow control if the current
2417          function has nonlocal labels.  */
2418       if (TREE_SIDE_EFFECTS (call) && current_function_has_nonlocal_label)
2419         return true;
2420
2421       /* A CALL_EXPR also alters control flow if it does not return.  */
2422       if (call_expr_flags (call) & (ECF_NORETURN | ECF_LONGJMP))
2423         return true;
2424     }
2425
2426   /* If a statement can throw, it alters control flow.  */
2427   return tree_can_throw_internal (t);
2428 }
2429
2430
2431 /* Return true if T is a computed goto.  */
2432
2433 bool
2434 computed_goto_p (tree t)
2435 {
2436   return (TREE_CODE (t) == GOTO_EXPR
2437           && TREE_CODE (GOTO_DESTINATION (t)) != LABEL_DECL);
2438 }
2439
2440
2441 /* Checks whether EXPR is a simple local goto.  */
2442
2443 bool
2444 simple_goto_p (tree expr)
2445 {
2446   return (TREE_CODE (expr) == GOTO_EXPR
2447           && TREE_CODE (GOTO_DESTINATION (expr)) == LABEL_DECL);
2448 }
2449
2450
2451 /* Return true if T should start a new basic block.  PREV_T is the
2452    statement preceding T.  It is used when T is a label or a case label.
2453    Labels should only start a new basic block if their previous statement
2454    wasn't a label.  Otherwise, sequence of labels would generate
2455    unnecessary basic blocks that only contain a single label.  */
2456
2457 static inline bool
2458 stmt_starts_bb_p (tree t, tree prev_t)
2459 {
2460   enum tree_code code;
2461
2462   if (t == NULL_TREE)
2463     return false;
2464
2465   /* LABEL_EXPRs start a new basic block only if the preceding
2466      statement wasn't a label of the same type.  This prevents the
2467      creation of consecutive blocks that have nothing but a single
2468      label.  */
2469   code = TREE_CODE (t);
2470   if (code == LABEL_EXPR)
2471     {
2472       /* Nonlocal and computed GOTO targets always start a new block.  */
2473       if (code == LABEL_EXPR
2474           && (DECL_NONLOCAL (LABEL_EXPR_LABEL (t))
2475               || FORCED_LABEL (LABEL_EXPR_LABEL (t))))
2476         return true;
2477
2478       if (prev_t && TREE_CODE (prev_t) == code)
2479         {
2480           if (DECL_NONLOCAL (LABEL_EXPR_LABEL (prev_t)))
2481             return true;
2482
2483           cfg_stats.num_merged_labels++;
2484           return false;
2485         }
2486       else
2487         return true;
2488     }
2489
2490   return false;
2491 }
2492
2493
2494 /* Return true if T should end a basic block.  */
2495
2496 bool
2497 stmt_ends_bb_p (tree t)
2498 {
2499   return is_ctrl_stmt (t) || is_ctrl_altering_stmt (t);
2500 }
2501
2502
2503 /* Add gotos that used to be represented implicitly in the CFG.  */
2504
2505 void
2506 disband_implicit_edges (void)
2507 {
2508   basic_block bb;
2509   block_stmt_iterator last;
2510   edge e;
2511   tree stmt, label;
2512
2513   FOR_EACH_BB (bb)
2514     {
2515       last = bsi_last (bb);
2516       stmt = last_stmt (bb);
2517
2518       if (stmt && TREE_CODE (stmt) == COND_EXPR)
2519         {
2520           /* Remove superfluous gotos from COND_EXPR branches.  Moved
2521              from cfg_remove_useless_stmts here since it violates the
2522              invariants for tree--cfg correspondence and thus fits better
2523              here where we do it anyway.  */
2524           for (e = bb->succ; e; e = e->succ_next)
2525             {
2526               if (e->dest != bb->next_bb)
2527                 continue;
2528
2529               if (e->flags & EDGE_TRUE_VALUE)
2530                 COND_EXPR_THEN (stmt) = build_empty_stmt ();
2531               else if (e->flags & EDGE_FALSE_VALUE)
2532                 COND_EXPR_ELSE (stmt) = build_empty_stmt ();
2533               else
2534                 gcc_unreachable ();
2535               e->flags |= EDGE_FALLTHRU;
2536             }
2537
2538           continue;
2539         }
2540
2541       if (stmt && TREE_CODE (stmt) == RETURN_EXPR)
2542         {
2543           /* Remove the RETURN_EXPR if we may fall though to the exit
2544              instead.  */
2545           gcc_assert (bb->succ);
2546           gcc_assert (!bb->succ->succ_next);
2547           gcc_assert (bb->succ->dest == EXIT_BLOCK_PTR);
2548
2549           if (bb->next_bb == EXIT_BLOCK_PTR
2550               && !TREE_OPERAND (stmt, 0))
2551             {
2552               bsi_remove (&last);
2553               bb->succ->flags |= EDGE_FALLTHRU;
2554             }
2555           continue;
2556         }
2557
2558       /* There can be no fallthru edge if the last statement is a control
2559          one.  */
2560       if (stmt && is_ctrl_stmt (stmt))
2561         continue;
2562
2563       /* Find a fallthru edge and emit the goto if necessary.  */
2564       for (e = bb->succ; e; e = e->succ_next)
2565         if (e->flags & EDGE_FALLTHRU)
2566           break;
2567
2568       if (!e || e->dest == bb->next_bb)
2569         continue;
2570
2571       gcc_assert (e->dest != EXIT_BLOCK_PTR);
2572       label = tree_block_label (e->dest);
2573
2574       stmt = build1 (GOTO_EXPR, void_type_node, label);
2575 #ifdef USE_MAPPED_LOCATION
2576       SET_EXPR_LOCATION (stmt, e->goto_locus);
2577 #else
2578       SET_EXPR_LOCUS (stmt, e->goto_locus);
2579 #endif
2580       bsi_insert_after (&last, stmt, BSI_NEW_STMT);
2581       e->flags &= ~EDGE_FALLTHRU;
2582     }
2583 }
2584
2585 /* Remove block annotations and other datastructures.  */
2586
2587 void
2588 delete_tree_cfg_annotations (void)
2589 {
2590   basic_block bb;
2591   if (n_basic_blocks > 0)
2592     free_blocks_annotations ();
2593
2594   label_to_block_map = NULL;
2595   free_rbi_pool ();
2596   FOR_EACH_BB (bb)
2597     bb->rbi = NULL;
2598 }
2599
2600
2601 /* Return the first statement in basic block BB.  */
2602
2603 tree
2604 first_stmt (basic_block bb)
2605 {
2606   block_stmt_iterator i = bsi_start (bb);
2607   return !bsi_end_p (i) ? bsi_stmt (i) : NULL_TREE;
2608 }
2609
2610
2611 /* Return the last statement in basic block BB.  */
2612
2613 tree
2614 last_stmt (basic_block bb)
2615 {
2616   block_stmt_iterator b = bsi_last (bb);
2617   return !bsi_end_p (b) ? bsi_stmt (b) : NULL_TREE;
2618 }
2619
2620
2621 /* Return a pointer to the last statement in block BB.  */
2622
2623 tree *
2624 last_stmt_ptr (basic_block bb)
2625 {
2626   block_stmt_iterator last = bsi_last (bb);
2627   return !bsi_end_p (last) ? bsi_stmt_ptr (last) : NULL;
2628 }
2629
2630
2631 /* Return the last statement of an otherwise empty block.  Return NULL
2632    if the block is totally empty, or if it contains more than one
2633    statement.  */
2634
2635 tree
2636 last_and_only_stmt (basic_block bb)
2637 {
2638   block_stmt_iterator i = bsi_last (bb);
2639   tree last, prev;
2640
2641   if (bsi_end_p (i))
2642     return NULL_TREE;
2643
2644   last = bsi_stmt (i);
2645   bsi_prev (&i);
2646   if (bsi_end_p (i))
2647     return last;
2648
2649   /* Empty statements should no longer appear in the instruction stream.
2650      Everything that might have appeared before should be deleted by
2651      remove_useless_stmts, and the optimizers should just bsi_remove
2652      instead of smashing with build_empty_stmt.
2653
2654      Thus the only thing that should appear here in a block containing
2655      one executable statement is a label.  */
2656   prev = bsi_stmt (i);
2657   if (TREE_CODE (prev) == LABEL_EXPR)
2658     return last;
2659   else
2660     return NULL_TREE;
2661 }
2662
2663
2664 /* Mark BB as the basic block holding statement T.  */
2665
2666 void
2667 set_bb_for_stmt (tree t, basic_block bb)
2668 {
2669   if (TREE_CODE (t) == PHI_NODE)
2670     PHI_BB (t) = bb;
2671   else if (TREE_CODE (t) == STATEMENT_LIST)
2672     {
2673       tree_stmt_iterator i;
2674       for (i = tsi_start (t); !tsi_end_p (i); tsi_next (&i))
2675         set_bb_for_stmt (tsi_stmt (i), bb);
2676     }
2677   else
2678     {
2679       stmt_ann_t ann = get_stmt_ann (t);
2680       ann->bb = bb;
2681
2682       /* If the statement is a label, add the label to block-to-labels map
2683          so that we can speed up edge creation for GOTO_EXPRs.  */
2684       if (TREE_CODE (t) == LABEL_EXPR)
2685         {
2686           int uid;
2687
2688           t = LABEL_EXPR_LABEL (t);
2689           uid = LABEL_DECL_UID (t);
2690           if (uid == -1)
2691             {
2692               LABEL_DECL_UID (t) = uid = cfun->last_label_uid++;
2693               if (VARRAY_SIZE (label_to_block_map) <= (unsigned) uid)
2694                 VARRAY_GROW (label_to_block_map, 3 * uid / 2);
2695             }
2696           else
2697             /* We're moving an existing label.  Make sure that we've
2698                 removed it from the old block.  */
2699             gcc_assert (!bb || !VARRAY_BB (label_to_block_map, uid));
2700           VARRAY_BB (label_to_block_map, uid) = bb;
2701         }
2702     }
2703 }
2704
2705 /* Finds iterator for STMT.  */
2706
2707 extern block_stmt_iterator
2708 stmt_for_bsi (tree stmt)
2709 {
2710   block_stmt_iterator bsi;
2711
2712   for (bsi = bsi_start (bb_for_stmt (stmt)); !bsi_end_p (bsi); bsi_next (&bsi))
2713     if (bsi_stmt (bsi) == stmt)
2714       return bsi;
2715
2716   gcc_unreachable ();
2717 }
2718
2719 /* Insert statement (or statement list) T before the statement
2720    pointed-to by iterator I.  M specifies how to update iterator I
2721    after insertion (see enum bsi_iterator_update).  */
2722
2723 void
2724 bsi_insert_before (block_stmt_iterator *i, tree t, enum bsi_iterator_update m)
2725 {
2726   set_bb_for_stmt (t, i->bb);
2727   tsi_link_before (&i->tsi, t, m);
2728   modify_stmt (t);
2729 }
2730
2731
2732 /* Insert statement (or statement list) T after the statement
2733    pointed-to by iterator I.  M specifies how to update iterator I
2734    after insertion (see enum bsi_iterator_update).  */
2735
2736 void
2737 bsi_insert_after (block_stmt_iterator *i, tree t, enum bsi_iterator_update m)
2738 {
2739   set_bb_for_stmt (t, i->bb);
2740   tsi_link_after (&i->tsi, t, m);
2741   modify_stmt (t);
2742 }
2743
2744
2745 /* Remove the statement pointed to by iterator I.  The iterator is updated
2746    to the next statement.  */
2747
2748 void
2749 bsi_remove (block_stmt_iterator *i)
2750 {
2751   tree t = bsi_stmt (*i);
2752   set_bb_for_stmt (t, NULL);
2753   tsi_delink (&i->tsi);
2754 }
2755
2756
2757 /* Move the statement at FROM so it comes right after the statement at TO.  */
2758
2759 void 
2760 bsi_move_after (block_stmt_iterator *from, block_stmt_iterator *to)
2761 {
2762   tree stmt = bsi_stmt (*from);
2763   bsi_remove (from);
2764   bsi_insert_after (to, stmt, BSI_SAME_STMT);
2765
2766
2767
2768 /* Move the statement at FROM so it comes right before the statement at TO.  */
2769
2770 void 
2771 bsi_move_before (block_stmt_iterator *from, block_stmt_iterator *to)
2772 {
2773   tree stmt = bsi_stmt (*from);
2774   bsi_remove (from);
2775   bsi_insert_before (to, stmt, BSI_SAME_STMT);
2776 }
2777
2778
2779 /* Move the statement at FROM to the end of basic block BB.  */
2780
2781 void
2782 bsi_move_to_bb_end (block_stmt_iterator *from, basic_block bb)
2783 {
2784   block_stmt_iterator last = bsi_last (bb);
2785   
2786   /* Have to check bsi_end_p because it could be an empty block.  */
2787   if (!bsi_end_p (last) && is_ctrl_stmt (bsi_stmt (last)))
2788     bsi_move_before (from, &last);
2789   else
2790     bsi_move_after (from, &last);
2791 }
2792
2793
2794 /* Replace the contents of the statement pointed to by iterator BSI
2795    with STMT.  If PRESERVE_EH_INFO is true, the exception handling
2796    information of the original statement is preserved.  */
2797
2798 void
2799 bsi_replace (const block_stmt_iterator *bsi, tree stmt, bool preserve_eh_info)
2800 {
2801   int eh_region;
2802   tree orig_stmt = bsi_stmt (*bsi);
2803
2804   SET_EXPR_LOCUS (stmt, EXPR_LOCUS (orig_stmt));
2805   set_bb_for_stmt (stmt, bsi->bb);
2806
2807   /* Preserve EH region information from the original statement, if
2808      requested by the caller.  */
2809   if (preserve_eh_info)
2810     {
2811       eh_region = lookup_stmt_eh_region (orig_stmt);
2812       if (eh_region >= 0)
2813         add_stmt_to_eh_region (stmt, eh_region);
2814     }
2815
2816   *bsi_stmt_ptr (*bsi) = stmt;
2817   modify_stmt (stmt);
2818 }
2819
2820
2821 /* Insert the statement pointed-to by BSI into edge E.  Every attempt
2822    is made to place the statement in an existing basic block, but
2823    sometimes that isn't possible.  When it isn't possible, the edge is
2824    split and the statement is added to the new block.
2825
2826    In all cases, the returned *BSI points to the correct location.  The
2827    return value is true if insertion should be done after the location,
2828    or false if it should be done before the location.  If new basic block
2829    has to be created, it is stored in *NEW_BB.  */
2830
2831 static bool
2832 tree_find_edge_insert_loc (edge e, block_stmt_iterator *bsi,
2833                            basic_block *new_bb)
2834 {
2835   basic_block dest, src;
2836   tree tmp;
2837
2838   dest = e->dest;
2839  restart:
2840
2841   /* If the destination has one predecessor which has no PHI nodes,
2842      insert there.  Except for the exit block. 
2843
2844      The requirement for no PHI nodes could be relaxed.  Basically we
2845      would have to examine the PHIs to prove that none of them used
2846      the value set by the statement we want to insert on E.   That
2847      hardly seems worth the effort.  */
2848   if (dest->pred->pred_next == NULL
2849       && ! phi_nodes (dest)
2850       && dest != EXIT_BLOCK_PTR)
2851     {
2852       *bsi = bsi_start (dest);
2853       if (bsi_end_p (*bsi))
2854         return true;
2855
2856       /* Make sure we insert after any leading labels.  */
2857       tmp = bsi_stmt (*bsi);
2858       while (TREE_CODE (tmp) == LABEL_EXPR)
2859         {
2860           bsi_next (bsi);
2861           if (bsi_end_p (*bsi))
2862             break;
2863           tmp = bsi_stmt (*bsi);
2864         }
2865
2866       if (bsi_end_p (*bsi))
2867         {
2868           *bsi = bsi_last (dest);
2869           return true;
2870         }
2871       else
2872         return false;
2873     }
2874
2875   /* If the source has one successor, the edge is not abnormal and
2876      the last statement does not end a basic block, insert there.
2877      Except for the entry block.  */
2878   src = e->src;
2879   if ((e->flags & EDGE_ABNORMAL) == 0
2880       && src->succ->succ_next == NULL
2881       && src != ENTRY_BLOCK_PTR)
2882     {
2883       *bsi = bsi_last (src);
2884       if (bsi_end_p (*bsi))
2885         return true;
2886
2887       tmp = bsi_stmt (*bsi);
2888       if (!stmt_ends_bb_p (tmp))
2889         return true;
2890
2891       /* Insert code just before returning the value.  We may need to decompose
2892          the return in the case it contains non-trivial operand.  */
2893       if (TREE_CODE (tmp) == RETURN_EXPR)
2894         {
2895           tree op = TREE_OPERAND (tmp, 0);
2896           if (!is_gimple_val (op))
2897             {
2898               gcc_assert (TREE_CODE (op) == MODIFY_EXPR);
2899               bsi_insert_before (bsi, op, BSI_NEW_STMT);
2900               TREE_OPERAND (tmp, 0) = TREE_OPERAND (op, 0);
2901             }
2902           bsi_prev (bsi);
2903           return true;
2904         }
2905     }
2906
2907   /* Otherwise, create a new basic block, and split this edge.  */
2908   dest = split_edge (e);
2909   if (new_bb)
2910     *new_bb = dest;
2911   e = dest->pred;
2912   goto restart;
2913 }
2914
2915
2916 /* This routine will commit all pending edge insertions, creating any new
2917    basic blocks which are necessary.
2918
2919    If specified, NEW_BLOCKS returns a count of the number of new basic
2920    blocks which were created.  */
2921
2922 void
2923 bsi_commit_edge_inserts (int *new_blocks)
2924 {
2925   basic_block bb;
2926   edge e;
2927   int blocks;
2928
2929   blocks = n_basic_blocks;
2930
2931   bsi_commit_edge_inserts_1 (ENTRY_BLOCK_PTR->succ);
2932
2933   FOR_EACH_BB (bb)
2934     for (e = bb->succ; e; e = e->succ_next)
2935       bsi_commit_edge_inserts_1 (e);
2936
2937   if (new_blocks)
2938     *new_blocks = n_basic_blocks - blocks;
2939 }
2940
2941
2942 /* Commit insertions pending at edge E.  */
2943
2944 static void
2945 bsi_commit_edge_inserts_1 (edge e)
2946 {
2947   if (PENDING_STMT (e))
2948     {
2949       block_stmt_iterator bsi;
2950       tree stmt = PENDING_STMT (e);
2951
2952       PENDING_STMT (e) = NULL_TREE;
2953
2954       if (tree_find_edge_insert_loc (e, &bsi, NULL))
2955         bsi_insert_after (&bsi, stmt, BSI_NEW_STMT);
2956       else
2957         bsi_insert_before (&bsi, stmt, BSI_NEW_STMT);
2958     }
2959 }
2960
2961
2962 /* Add STMT to the pending list of edge E.  No actual insertion is
2963    made until a call to bsi_commit_edge_inserts () is made.  */
2964
2965 void
2966 bsi_insert_on_edge (edge e, tree stmt)
2967 {
2968   append_to_statement_list (stmt, &PENDING_STMT (e));
2969 }
2970
2971 /* Similar to bsi_insert_on_edge+bsi_commit_edge_inserts.  If new block has to
2972    be created, it is returned.  */
2973
2974 basic_block
2975 bsi_insert_on_edge_immediate (edge e, tree stmt)
2976 {
2977   block_stmt_iterator bsi;
2978   basic_block new_bb = NULL;
2979
2980   gcc_assert (!PENDING_STMT (e));
2981
2982   if (tree_find_edge_insert_loc (e, &bsi, &new_bb))
2983     bsi_insert_after (&bsi, stmt, BSI_NEW_STMT);
2984   else
2985     bsi_insert_before (&bsi, stmt, BSI_NEW_STMT);
2986
2987   return new_bb;
2988 }
2989
2990 /*---------------------------------------------------------------------------
2991              Tree specific functions for CFG manipulation
2992 ---------------------------------------------------------------------------*/
2993
2994 /* Split a (typically critical) edge EDGE_IN.  Return the new block.
2995    Abort on abnormal edges.  */
2996
2997 static basic_block
2998 tree_split_edge (edge edge_in)
2999 {
3000   basic_block new_bb, after_bb, dest, src;
3001   edge new_edge, e;
3002   tree phi;
3003   int i, num_elem;
3004
3005   /* Abnormal edges cannot be split.  */
3006   gcc_assert (!(edge_in->flags & EDGE_ABNORMAL));
3007
3008   src = edge_in->src;
3009   dest = edge_in->dest;
3010
3011   /* Place the new block in the block list.  Try to keep the new block
3012      near its "logical" location.  This is of most help to humans looking
3013      at debugging dumps.  */
3014   for (e = dest->pred; e; e = e->pred_next)
3015     if (e->src->next_bb == dest)
3016       break;
3017   if (!e)
3018     after_bb = dest->prev_bb;
3019   else
3020     after_bb = edge_in->src;
3021
3022   new_bb = create_empty_bb (after_bb);
3023   new_bb->frequency = EDGE_FREQUENCY (edge_in);
3024   new_bb->count = edge_in->count;
3025   new_edge = make_edge (new_bb, dest, EDGE_FALLTHRU);
3026   new_edge->probability = REG_BR_PROB_BASE;
3027   new_edge->count = edge_in->count;
3028
3029   /* Find all the PHI arguments on the original edge, and change them to
3030      the new edge.  Do it before redirection, so that the argument does not
3031      get removed.  */
3032   for (phi = phi_nodes (dest); phi; phi = PHI_CHAIN (phi))
3033     {
3034       num_elem = PHI_NUM_ARGS (phi);
3035       for (i = 0; i < num_elem; i++)
3036         if (PHI_ARG_EDGE (phi, i) == edge_in)
3037           {
3038             PHI_ARG_EDGE (phi, i) = new_edge;
3039             break;
3040           }
3041     }
3042
3043   e = redirect_edge_and_branch (edge_in, new_bb);
3044   gcc_assert (e);
3045   gcc_assert (!PENDING_STMT (edge_in));
3046
3047   return new_bb;
3048 }
3049
3050
3051 /* Return true when BB has label LABEL in it.  */
3052
3053 static bool
3054 has_label_p (basic_block bb, tree label)
3055 {
3056   block_stmt_iterator bsi;
3057
3058   for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
3059     {
3060       tree stmt = bsi_stmt (bsi);
3061
3062       if (TREE_CODE (stmt) != LABEL_EXPR)
3063         return false;
3064       if (LABEL_EXPR_LABEL (stmt) == label)
3065         return true;
3066     }
3067   return false;
3068 }
3069
3070
3071 /* Callback for walk_tree, check that all elements with address taken are
3072    properly noticed as such.  */
3073
3074 static tree
3075 verify_expr (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
3076 {
3077   tree t = *tp, x;
3078
3079   if (TYPE_P (t))
3080     *walk_subtrees = 0;
3081   
3082   /* Check operand N for being valid GIMPLE and give error MSG if not. 
3083      We check for constants explicitly since they are not considered
3084      gimple invariants if they overflowed.  */
3085 #define CHECK_OP(N, MSG) \
3086   do { if (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (t, N))) != 'c'     \
3087          && !is_gimple_val (TREE_OPERAND (t, N)))                       \
3088        { error (MSG); return TREE_OPERAND (t, N); }} while (0)
3089
3090   switch (TREE_CODE (t))
3091     {
3092     case SSA_NAME:
3093       if (SSA_NAME_IN_FREE_LIST (t))
3094         {
3095           error ("SSA name in freelist but still referenced");
3096           return *tp;
3097         }
3098       break;
3099
3100     case MODIFY_EXPR:
3101       x = TREE_OPERAND (t, 0);
3102       if (TREE_CODE (x) == BIT_FIELD_REF
3103           && is_gimple_reg (TREE_OPERAND (x, 0)))
3104         {
3105           error ("GIMPLE register modified with BIT_FIELD_REF");
3106           return t;
3107         }
3108       break;
3109
3110     case ADDR_EXPR:
3111       /* Skip any references (they will be checked when we recurse down the
3112          tree) and ensure that any variable used as a prefix is marked
3113          addressable.  */
3114       for (x = TREE_OPERAND (t, 0);
3115            (handled_component_p (x)
3116             || TREE_CODE (x) == REALPART_EXPR
3117             || TREE_CODE (x) == IMAGPART_EXPR);
3118            x = TREE_OPERAND (x, 0))
3119         ;
3120
3121       if (TREE_CODE (x) != VAR_DECL && TREE_CODE (x) != PARM_DECL)
3122         return NULL;
3123       if (!TREE_ADDRESSABLE (x))
3124         {
3125           error ("address taken, but ADDRESSABLE bit not set");
3126           return x;
3127         }
3128       break;
3129
3130     case COND_EXPR:
3131       x = TREE_OPERAND (t, 0);
3132       if (TREE_CODE (TREE_TYPE (x)) != BOOLEAN_TYPE)
3133         {
3134           error ("non-boolean used in condition");
3135           return x;
3136         }
3137       break;
3138
3139     case NOP_EXPR:
3140     case CONVERT_EXPR:
3141     case FIX_TRUNC_EXPR:
3142     case FIX_CEIL_EXPR:
3143     case FIX_FLOOR_EXPR:
3144     case FIX_ROUND_EXPR:
3145     case FLOAT_EXPR:
3146     case NEGATE_EXPR:
3147     case ABS_EXPR:
3148     case BIT_NOT_EXPR:
3149     case NON_LVALUE_EXPR:
3150     case TRUTH_NOT_EXPR:
3151       CHECK_OP (0, "Invalid operand to unary operator");
3152       break;
3153
3154     case REALPART_EXPR:
3155     case IMAGPART_EXPR:
3156     case COMPONENT_REF:
3157     case ARRAY_REF:
3158     case ARRAY_RANGE_REF:
3159     case BIT_FIELD_REF:
3160     case VIEW_CONVERT_EXPR:
3161       /* We have a nest of references.  Verify that each of the operands
3162          that determine where to reference is either a constant or a variable,
3163          verify that the base is valid, and then show we've already checked
3164          the subtrees.  */
3165       while (TREE_CODE (t) == REALPART_EXPR || TREE_CODE (t) == IMAGPART_EXPR
3166              || handled_component_p (t))
3167         {
3168           if (TREE_CODE (t) == COMPONENT_REF && TREE_OPERAND (t, 2))
3169             CHECK_OP (2, "Invalid COMPONENT_REF offset operator");
3170           else if (TREE_CODE (t) == ARRAY_REF
3171                    || TREE_CODE (t) == ARRAY_RANGE_REF)
3172             {
3173               CHECK_OP (1, "Invalid array index.");
3174               if (TREE_OPERAND (t, 2))
3175                 CHECK_OP (2, "Invalid array lower bound.");
3176               if (TREE_OPERAND (t, 3))
3177                 CHECK_OP (3, "Invalid array stride.");
3178             }
3179           else if (TREE_CODE (t) == BIT_FIELD_REF)
3180             {
3181               CHECK_OP (1, "Invalid operand to BIT_FIELD_REF");
3182               CHECK_OP (2, "Invalid operand to BIT_FIELD_REF");
3183             }
3184
3185           t = TREE_OPERAND (t, 0);
3186         }
3187
3188       if (TREE_CODE_CLASS (TREE_CODE (t)) != 'c'
3189           && !is_gimple_lvalue (t))
3190         {
3191           error ("Invalid reference prefix.");
3192           return t;
3193         }
3194       *walk_subtrees = 0;
3195       break;
3196
3197     case LT_EXPR:
3198     case LE_EXPR:
3199     case GT_EXPR:
3200     case GE_EXPR:
3201     case EQ_EXPR:
3202     case NE_EXPR:
3203     case UNORDERED_EXPR:
3204     case ORDERED_EXPR:
3205     case UNLT_EXPR:
3206     case UNLE_EXPR:
3207     case UNGT_EXPR:
3208     case UNGE_EXPR:
3209     case UNEQ_EXPR:
3210     case LTGT_EXPR:
3211     case PLUS_EXPR:
3212     case MINUS_EXPR:
3213     case MULT_EXPR:
3214     case TRUNC_DIV_EXPR:
3215     case CEIL_DIV_EXPR:
3216     case FLOOR_DIV_EXPR:
3217     case ROUND_DIV_EXPR:
3218     case TRUNC_MOD_EXPR:
3219     case CEIL_MOD_EXPR:
3220     case FLOOR_MOD_EXPR:
3221     case ROUND_MOD_EXPR:
3222     case RDIV_EXPR:
3223     case EXACT_DIV_EXPR:
3224     case MIN_EXPR:
3225     case MAX_EXPR:
3226     case LSHIFT_EXPR:
3227     case RSHIFT_EXPR:
3228     case LROTATE_EXPR:
3229     case RROTATE_EXPR:
3230     case BIT_IOR_EXPR:
3231     case BIT_XOR_EXPR:
3232     case BIT_AND_EXPR:
3233       CHECK_OP (0, "Invalid operand to binary operator");
3234       CHECK_OP (1, "Invalid operand to binary operator");
3235       break;
3236
3237     default:
3238       break;
3239     }
3240   return NULL;
3241
3242 #undef CHECK_OP
3243 }
3244
3245
3246 /* Verify STMT, return true if STMT is not in GIMPLE form.
3247    TODO: Implement type checking.  */
3248
3249 static bool
3250 verify_stmt (tree stmt, bool last_in_block)
3251 {
3252   tree addr;
3253
3254   if (!is_gimple_stmt (stmt))
3255     {
3256       error ("Is not a valid GIMPLE statement.");
3257       goto fail;
3258     }
3259
3260   addr = walk_tree (&stmt, verify_expr, NULL, NULL);
3261   if (addr)
3262     {
3263       debug_generic_stmt (addr);
3264       return true;
3265     }
3266
3267   /* If the statement is marked as part of an EH region, then it is
3268      expected that the statement could throw.  Verify that when we
3269      have optimizations that simplify statements such that we prove
3270      that they cannot throw, that we update other data structures
3271      to match.  */
3272   if (lookup_stmt_eh_region (stmt) >= 0)
3273     {
3274       if (!tree_could_throw_p (stmt))
3275         {
3276           error ("Statement marked for throw, but doesn't.");
3277           goto fail;
3278         }
3279       if (!last_in_block && tree_can_throw_internal (stmt))
3280         {
3281           error ("Statement marked for throw in middle of block.");
3282           goto fail;
3283         }
3284     }
3285
3286   return false;
3287
3288  fail:
3289   debug_generic_stmt (stmt);
3290   return true;
3291 }
3292
3293
3294 /* Return true when the T can be shared.  */
3295
3296 static bool
3297 tree_node_can_be_shared (tree t)
3298 {
3299   if (TYPE_P (t) || DECL_P (t)
3300       /* We check for constants explicitly since they are not considered
3301          gimple invariants if they overflowed.  */
3302       || TREE_CODE_CLASS (TREE_CODE (t)) == 'c'
3303       || is_gimple_min_invariant (t)
3304       || TREE_CODE (t) == SSA_NAME)
3305     return true;
3306
3307   while (((TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
3308           /* We check for constants explicitly since they are not considered
3309              gimple invariants if they overflowed.  */
3310           && (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (t, 1))) == 'c'
3311               || is_gimple_min_invariant (TREE_OPERAND (t, 1))))
3312          || (TREE_CODE (t) == COMPONENT_REF
3313              || TREE_CODE (t) == REALPART_EXPR
3314              || TREE_CODE (t) == IMAGPART_EXPR))
3315     t = TREE_OPERAND (t, 0);
3316
3317   if (DECL_P (t))
3318     return true;
3319
3320   return false;
3321 }
3322
3323
3324 /* Called via walk_trees.  Verify tree sharing.  */
3325
3326 static tree
3327 verify_node_sharing (tree * tp, int *walk_subtrees, void *data)
3328 {
3329   htab_t htab = (htab_t) data;
3330   void **slot;
3331
3332   if (tree_node_can_be_shared (*tp))
3333     {
3334       *walk_subtrees = false;
3335       return NULL;
3336     }
3337
3338   slot = htab_find_slot (htab, *tp, INSERT);
3339   if (*slot)
3340     return *slot;
3341   *slot = *tp;
3342
3343   return NULL;
3344 }
3345
3346
3347 /* Verify the GIMPLE statement chain.  */
3348
3349 void
3350 verify_stmts (void)
3351 {
3352   basic_block bb;
3353   block_stmt_iterator bsi;
3354   bool err = false;
3355   htab_t htab;
3356   tree addr;
3357
3358   timevar_push (TV_TREE_STMT_VERIFY);
3359   htab = htab_create (37, htab_hash_pointer, htab_eq_pointer, NULL);
3360
3361   FOR_EACH_BB (bb)
3362     {
3363       tree phi;
3364       int i;
3365
3366       for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
3367         {
3368           int phi_num_args = PHI_NUM_ARGS (phi);
3369
3370           for (i = 0; i < phi_num_args; i++)
3371             {
3372               tree t = PHI_ARG_DEF (phi, i);
3373               tree addr;
3374
3375               /* Addressable variables do have SSA_NAMEs but they
3376                  are not considered gimple values.  */
3377               if (TREE_CODE (t) != SSA_NAME
3378                   && TREE_CODE (t) != FUNCTION_DECL
3379                   && !is_gimple_val (t))
3380                 {
3381                   error ("PHI def is not a GIMPLE value");
3382                   debug_generic_stmt (phi);
3383                   debug_generic_stmt (t);
3384                   err |= true;
3385                 }
3386
3387               addr = walk_tree (&t, verify_expr, NULL, NULL);
3388               if (addr)
3389                 {
3390                   debug_generic_stmt (addr);
3391                   err |= true;
3392                 }
3393
3394               addr = walk_tree (&t, verify_node_sharing, htab, NULL);
3395               if (addr)
3396                 {
3397                   error ("Incorrect sharing of tree nodes");
3398                   debug_generic_stmt (phi);
3399                   debug_generic_stmt (addr);
3400                   err |= true;
3401                 }
3402             }
3403         }
3404
3405       for (bsi = bsi_start (bb); !bsi_end_p (bsi); )
3406         {
3407           tree stmt = bsi_stmt (bsi);
3408           bsi_next (&bsi);
3409           err |= verify_stmt (stmt, bsi_end_p (bsi));
3410           addr = walk_tree (&stmt, verify_node_sharing, htab, NULL);
3411           if (addr)
3412             {
3413               error ("Incorrect sharing of tree nodes");
3414               debug_generic_stmt (stmt);
3415               debug_generic_stmt (addr);
3416               err |= true;
3417             }
3418         }
3419     }
3420
3421   if (err)
3422     internal_error ("verify_stmts failed.");
3423
3424   htab_delete (htab);
3425   timevar_pop (TV_TREE_STMT_VERIFY);
3426 }
3427
3428
3429 /* Verifies that the flow information is OK.  */
3430
3431 static int
3432 tree_verify_flow_info (void)
3433 {
3434   int err = 0;
3435   basic_block bb;
3436   block_stmt_iterator bsi;
3437   tree stmt;
3438   edge e;
3439
3440   if (ENTRY_BLOCK_PTR->stmt_list)
3441     {
3442       error ("ENTRY_BLOCK has a statement list associated with it\n");
3443       err = 1;
3444     }
3445
3446   if (EXIT_BLOCK_PTR->stmt_list)
3447     {
3448       error ("EXIT_BLOCK has a statement list associated with it\n");
3449       err = 1;
3450     }
3451
3452   for (e = EXIT_BLOCK_PTR->pred; e; e = e->pred_next)
3453     if (e->flags & EDGE_FALLTHRU)
3454       {
3455         error ("Fallthru to exit from bb %d\n", e->src->index);
3456         err = 1;
3457       }
3458
3459   FOR_EACH_BB (bb)
3460     {
3461       bool found_ctrl_stmt = false;
3462
3463       /* Skip labels on the start of basic block.  */
3464       for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
3465         {
3466           if (TREE_CODE (bsi_stmt (bsi)) != LABEL_EXPR)
3467             break;
3468
3469           if (label_to_block (LABEL_EXPR_LABEL (bsi_stmt (bsi))) != bb)
3470             {
3471               error ("Label %s to block does not match in bb %d\n",
3472                      IDENTIFIER_POINTER (DECL_NAME (bsi_stmt (bsi))),
3473                      bb->index);
3474               err = 1;
3475             }
3476
3477           if (decl_function_context (LABEL_EXPR_LABEL (bsi_stmt (bsi)))
3478               != current_function_decl)
3479             {
3480               error ("Label %s has incorrect context in bb %d\n",
3481                      IDENTIFIER_POINTER (DECL_NAME (bsi_stmt (bsi))),
3482                      bb->index);
3483               err = 1;
3484             }
3485         }
3486
3487       /* Verify that body of basic block BB is free of control flow.  */
3488       for (; !bsi_end_p (bsi); bsi_next (&bsi))
3489         {
3490           tree stmt = bsi_stmt (bsi);
3491
3492           if (found_ctrl_stmt)
3493             {
3494               error ("Control flow in the middle of basic block %d\n",
3495                      bb->index);
3496               err = 1;
3497             }
3498
3499           if (stmt_ends_bb_p (stmt))
3500             found_ctrl_stmt = true;
3501
3502           if (TREE_CODE (stmt) == LABEL_EXPR)
3503             {
3504               error ("Label %s in the middle of basic block %d\n",
3505                      IDENTIFIER_POINTER (DECL_NAME (stmt)),
3506                      bb->index);
3507               err = 1;
3508             }
3509         }
3510       bsi = bsi_last (bb);
3511       if (bsi_end_p (bsi))
3512         continue;
3513
3514       stmt = bsi_stmt (bsi);
3515
3516       if (is_ctrl_stmt (stmt))
3517         {
3518           for (e = bb->succ; e; e = e->succ_next)
3519             if (e->flags & EDGE_FALLTHRU)
3520               {
3521                 error ("Fallthru edge after a control statement in bb %d \n",
3522                        bb->index);
3523                 err = 1;
3524               }
3525         }
3526
3527       switch (TREE_CODE (stmt))
3528         {
3529         case COND_EXPR:
3530           {
3531             edge true_edge;
3532             edge false_edge;
3533             if (TREE_CODE (COND_EXPR_THEN (stmt)) != GOTO_EXPR
3534                 || TREE_CODE (COND_EXPR_ELSE (stmt)) != GOTO_EXPR)
3535               {
3536                 error ("Structured COND_EXPR at the end of bb %d\n", bb->index);
3537                 err = 1;
3538               }
3539
3540             extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
3541
3542             if (!true_edge || !false_edge
3543                 || !(true_edge->flags & EDGE_TRUE_VALUE)
3544                 || !(false_edge->flags & EDGE_FALSE_VALUE)
3545                 || (true_edge->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL))
3546                 || (false_edge->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL))
3547                 || bb->succ->succ_next->succ_next)
3548               {
3549                 error ("Wrong outgoing edge flags at end of bb %d\n",
3550                        bb->index);
3551                 err = 1;
3552               }
3553
3554             if (!has_label_p (true_edge->dest,
3555                               GOTO_DESTINATION (COND_EXPR_THEN (stmt))))
3556               {
3557                 error ("`then' label does not match edge at end of bb %d\n",
3558                        bb->index);
3559                 err = 1;
3560               }
3561
3562             if (!has_label_p (false_edge->dest,
3563                               GOTO_DESTINATION (COND_EXPR_ELSE (stmt))))
3564               {
3565                 error ("`else' label does not match edge at end of bb %d\n",
3566                        bb->index);
3567                 err = 1;
3568               }
3569           }
3570           break;
3571
3572         case GOTO_EXPR:
3573           if (simple_goto_p (stmt))
3574             {
3575               error ("Explicit goto at end of bb %d\n", bb->index);
3576               err = 1;
3577             }
3578           else
3579             {
3580               /* FIXME.  We should double check that the labels in the 
3581                  destination blocks have their address taken.  */
3582               for (e = bb->succ; e; e = e->succ_next)
3583                 if ((e->flags & (EDGE_FALLTHRU | EDGE_TRUE_VALUE
3584                                  | EDGE_FALSE_VALUE))
3585                     || !(e->flags & EDGE_ABNORMAL))
3586                   {
3587                     error ("Wrong outgoing edge flags at end of bb %d\n",
3588                            bb->index);
3589                     err = 1;
3590                   }
3591             }
3592           break;
3593
3594         case RETURN_EXPR:
3595           if (!bb->succ || bb->succ->succ_next
3596               || (bb->succ->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL
3597                                      | EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
3598             {
3599               error ("Wrong outgoing edge flags at end of bb %d\n", bb->index);
3600               err = 1;
3601             }
3602           if (bb->succ->dest != EXIT_BLOCK_PTR)
3603             {
3604               error ("Return edge does not point to exit in bb %d\n",
3605                      bb->index);
3606               err = 1;
3607             }
3608           break;
3609
3610         case SWITCH_EXPR:
3611           {
3612             tree prev;
3613             edge e;
3614             size_t i, n;
3615             tree vec;
3616
3617             vec = SWITCH_LABELS (stmt);
3618             n = TREE_VEC_LENGTH (vec);
3619
3620             /* Mark all the destination basic blocks.  */
3621             for (i = 0; i < n; ++i)
3622               {
3623                 tree lab = CASE_LABEL (TREE_VEC_ELT (vec, i));
3624                 basic_block label_bb = label_to_block (lab);
3625
3626                 gcc_assert (!label_bb->aux || label_bb->aux == (void *)1);
3627                 label_bb->aux = (void *)1;
3628               }
3629
3630             /* Verify that the case labels are sorted.  */
3631             prev = TREE_VEC_ELT (vec, 0);
3632             for (i = 1; i < n - 1; ++i)
3633               {
3634                 tree c = TREE_VEC_ELT (vec, i);
3635                 if (! CASE_LOW (c))
3636                   {
3637                     error ("Found default case not at end of case vector");
3638                     err = 1;
3639                     continue;
3640                   }
3641                 if (! tree_int_cst_lt (CASE_LOW (prev), CASE_LOW (c)))
3642                   {
3643                     error ("Case labels not sorted:\n ");
3644                     print_generic_expr (stderr, prev, 0);
3645                     fprintf (stderr," is greater than ");
3646                     print_generic_expr (stderr, c, 0);
3647                     fprintf (stderr," but comes before it.\n");
3648                     err = 1;
3649                   }
3650                 prev = c;
3651               }
3652             if (CASE_LOW (TREE_VEC_ELT (vec, n - 1)))
3653               {
3654                 error ("No default case found at end of case vector");
3655                 err = 1;
3656               }
3657
3658             for (e = bb->succ; e; e = e->succ_next)
3659               {
3660                 if (!e->dest->aux)
3661                   {
3662                     error ("Extra outgoing edge %d->%d\n",
3663                            bb->index, e->dest->index);
3664                     err = 1;
3665                   }
3666                 e->dest->aux = (void *)2;
3667                 if ((e->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL
3668                                  | EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
3669                   {
3670                     error ("Wrong outgoing edge flags at end of bb %d\n",
3671                            bb->index);
3672                     err = 1;
3673                   }
3674               }
3675
3676             /* Check that we have all of them.  */
3677             for (i = 0; i < n; ++i)
3678               {
3679                 tree lab = CASE_LABEL (TREE_VEC_ELT (vec, i));
3680                 basic_block label_bb = label_to_block (lab);
3681
3682                 if (label_bb->aux != (void *)2)
3683                   {
3684                     error ("Missing edge %i->%i\n",
3685                            bb->index, label_bb->index);
3686                     err = 1;
3687                   }
3688               }
3689
3690             for (e = bb->succ; e; e = e->succ_next)
3691               e->dest->aux = (void *)0;
3692           }
3693
3694         default: ;
3695         }
3696     }
3697
3698   if (dom_computed[CDI_DOMINATORS] >= DOM_NO_FAST_QUERY)
3699     verify_dominators (CDI_DOMINATORS);
3700
3701   return err;
3702 }
3703
3704
3705 /* Updates phi nodes after creating forwarder block joined
3706    by edge FALLTHRU.  */
3707
3708 static void
3709 tree_make_forwarder_block (edge fallthru)
3710 {
3711   edge e;
3712   basic_block dummy, bb;
3713   tree phi, new_phi, var, prev, next;
3714
3715   dummy = fallthru->src;
3716   bb = fallthru->dest;
3717
3718   if (!bb->pred->pred_next)
3719     return;
3720
3721   /* If we redirected a branch we must create new phi nodes at the
3722      start of BB.  */
3723   for (phi = phi_nodes (dummy); phi; phi = PHI_CHAIN (phi))
3724     {
3725       var = PHI_RESULT (phi);
3726       new_phi = create_phi_node (var, bb);
3727       SSA_NAME_DEF_STMT (var) = new_phi;
3728       SET_PHI_RESULT (phi, make_ssa_name (SSA_NAME_VAR (var), phi));
3729       add_phi_arg (&new_phi, PHI_RESULT (phi), fallthru);
3730     }
3731
3732   /* Ensure that the PHI node chain is in the same order.  */
3733   prev = NULL;
3734   for (phi = phi_nodes (bb); phi; phi = next)
3735     {
3736       next = PHI_CHAIN (phi);
3737       PHI_CHAIN (phi) = prev;
3738       prev = phi;
3739     }
3740   set_phi_nodes (bb, prev);
3741
3742   /* Add the arguments we have stored on edges.  */
3743   for (e = bb->pred; e; e = e->pred_next)
3744     {
3745       if (e == fallthru)
3746         continue;
3747
3748       for (phi = phi_nodes (bb), var = PENDING_STMT (e);
3749            phi;
3750            phi = PHI_CHAIN (phi), var = TREE_CHAIN (var))
3751         add_phi_arg (&phi, TREE_VALUE (var), e);
3752
3753       PENDING_STMT (e) = NULL;
3754     }
3755 }
3756
3757
3758 /* Return true if basic block BB does nothing except pass control
3759    flow to another block and that we can safely insert a label at
3760    the start of the successor block.  */
3761
3762 static bool
3763 tree_forwarder_block_p (basic_block bb)
3764 {
3765   block_stmt_iterator bsi;
3766   edge e;
3767
3768   /* If we have already determined that this block is not forwardable,
3769      then no further checks are necessary.  */
3770   if (! bb_ann (bb)->forwardable)
3771     return false;
3772
3773   /* BB must have a single outgoing normal edge.  Otherwise it can not be
3774      a forwarder block.  */
3775   if (!bb->succ
3776       || bb->succ->succ_next
3777       || bb->succ->dest == EXIT_BLOCK_PTR
3778       || (bb->succ->flags & EDGE_ABNORMAL)
3779       || bb == ENTRY_BLOCK_PTR)
3780     {
3781       bb_ann (bb)->forwardable = 0;
3782       return false; 
3783     }
3784
3785   /* Successors of the entry block are not forwarders.  */
3786   for (e = ENTRY_BLOCK_PTR->succ; e; e = e->succ_next)
3787     if (e->dest == bb)
3788       {
3789         bb_ann (bb)->forwardable = 0;
3790         return false;
3791       }
3792
3793   /* BB can not have any PHI nodes.  This could potentially be relaxed
3794      early in compilation if we re-rewrote the variables appearing in
3795      any PHI nodes in forwarder blocks.  */
3796   if (phi_nodes (bb))
3797     {
3798       bb_ann (bb)->forwardable = 0;
3799       return false; 
3800     }
3801
3802   /* Now walk through the statements.  We can ignore labels, anything else
3803      means this is not a forwarder block.  */
3804   for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
3805     {
3806       tree stmt = bsi_stmt (bsi);
3807  
3808       switch (TREE_CODE (stmt))
3809         {
3810         case LABEL_EXPR:
3811           if (DECL_NONLOCAL (LABEL_EXPR_LABEL (stmt)))
3812             return false;
3813           break;
3814
3815         default:
3816           bb_ann (bb)->forwardable = 0;
3817           return false;
3818         }
3819     }
3820
3821   return true;
3822 }
3823
3824
3825 /* Thread jumps over empty statements.
3826
3827    This code should _not_ thread over obviously equivalent conditions
3828    as that requires nontrivial updates to the SSA graph.  */
3829    
3830 static bool
3831 thread_jumps (void)
3832 {
3833   edge e, next, last, old;
3834   basic_block bb, dest, tmp, old_dest, dom;
3835   tree phi;
3836   int arg;
3837   bool retval = false;
3838
3839   FOR_EACH_BB (bb)
3840     bb_ann (bb)->forwardable = 1;
3841
3842   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR, next_bb)
3843     {
3844       /* Don't waste time on unreachable blocks.  */
3845       if (!bb->pred)
3846         continue;
3847
3848       /* Nor on forwarders.  */
3849       if (tree_forwarder_block_p (bb))
3850         continue;
3851       
3852       /* This block is now part of a forwarding path, mark it as not
3853          forwardable so that we can detect loops.  This bit will be
3854          reset below.  */
3855       bb_ann (bb)->forwardable = 0;
3856
3857       /* Examine each of our block's successors to see if it is
3858          forwardable.  */
3859       for (e = bb->succ; e; e = next)
3860         {
3861           int freq;
3862           gcov_type count;
3863           next = e->succ_next;
3864
3865           /* If the edge is abnormal or its destination is not
3866              forwardable, then there's nothing to do.  */
3867           if ((e->flags & EDGE_ABNORMAL)
3868               || !tree_forwarder_block_p (e->dest))
3869             continue;
3870
3871           count = e->count;
3872           freq = EDGE_FREQUENCY (e);
3873
3874           /* Now walk through as many forwarder block as possible to
3875              find the ultimate destination we want to thread our jump
3876              to.  */
3877           last = e->dest->succ;
3878           bb_ann (e->dest)->forwardable = 0;
3879           for (dest = e->dest->succ->dest;
3880                tree_forwarder_block_p (dest);
3881                last = dest->succ,
3882                dest = dest->succ->dest)
3883             {
3884               /* An infinite loop detected.  We redirect the edge anyway, so
3885                  that the loop is shrunk into single basic block.  */
3886               if (!bb_ann (dest)->forwardable)
3887                 break;
3888
3889               if (dest->succ->dest == EXIT_BLOCK_PTR)
3890                 break;
3891
3892               bb_ann (dest)->forwardable = 0;
3893               dest->frequency -= freq;
3894               if (dest->frequency < 0)
3895                 dest->frequency = 0;
3896               dest->count -= count;
3897               if (dest->count < 0)
3898                 dest->count = 0;
3899               dest->succ->count -= count;
3900               if (dest->succ->count < 0)
3901                 dest->succ->count = 0;
3902             }
3903
3904           /* Reset the forwardable marks to 1.  */
3905           for (tmp = e->dest;
3906                tmp != dest;
3907                tmp = tmp->succ->dest)
3908             bb_ann (tmp)->forwardable = 1;
3909
3910           if (dest == e->dest)
3911             continue;
3912               
3913           old = find_edge (bb, dest);
3914           if (old)
3915             {
3916               /* If there already is an edge, check whether the values
3917                  in phi nodes differ.  */
3918               if (!phi_alternatives_equal (dest, last, old))
3919                 {
3920                   /* The previous block is forwarder.  Redirect our jump
3921                      to that target instead since we know it has no PHI
3922                      nodes that will need updating.  */
3923                   dest = last->src;
3924           
3925                   /* That might mean that no forwarding at all is possible.  */
3926                   if (dest == e->dest)
3927                     continue;
3928
3929                   old = find_edge (bb, dest);
3930                 }
3931             }
3932
3933           /* Perform the redirection.  */
3934           retval = true;
3935           old_dest = e->dest;
3936           e = redirect_edge_and_branch (e, dest);
3937
3938           if (!old)
3939             {
3940               /* Update PHI nodes.   We know that the new argument should
3941                  have the same value as the argument associated with LAST.
3942                  Otherwise we would have changed our target block above.  */
3943               for (phi = phi_nodes (dest); phi; phi = PHI_CHAIN (phi))
3944                 {
3945                   arg = phi_arg_from_edge (phi, last);
3946                   gcc_assert (arg >= 0);
3947                   add_phi_arg (&phi, PHI_ARG_DEF (phi, arg), e);
3948                 }
3949             }
3950
3951           /* Update the dominators.  */
3952           if (dom_computed[CDI_DOMINATORS] >= DOM_CONS_OK)
3953             {
3954               /* Remove the unreachable blocks (observe that if all blocks
3955                  were reachable before, only those in the path we threaded
3956                  over and did not have any predecessor outside of the path
3957                  become unreachable).  */
3958               for (; old_dest != dest; old_dest = tmp)
3959                 {
3960                   tmp = old_dest->succ->dest;
3961
3962                   if (old_dest->pred)
3963                     break;
3964
3965                   delete_basic_block (old_dest);
3966                 }
3967               /* If the dominator of the destination was in the path, set its
3968                  dominator to the start of the redirected edge.  */
3969               if (get_immediate_dominator (CDI_DOMINATORS, old_dest) == NULL)
3970                 set_immediate_dominator (CDI_DOMINATORS, old_dest, bb);
3971
3972               /* Now proceed like if we forwarded just over one edge at a time.
3973                  Algorithm for forwarding edge S --> A over edge A --> B then
3974                  is
3975
3976                  if (idom (B) == A
3977                      && !dominated_by (S, B))
3978                    idom (B) = idom (A);
3979                  recount_idom (A);  */
3980
3981               for (; old_dest != dest; old_dest = tmp)
3982                 {
3983                   tmp = old_dest->succ->dest;
3984
3985                   if (get_immediate_dominator (CDI_DOMINATORS, tmp) == old_dest
3986                       && !dominated_by_p (CDI_DOMINATORS, bb, tmp))
3987                     {
3988                       dom = get_immediate_dominator (CDI_DOMINATORS, old_dest);
3989                       set_immediate_dominator (CDI_DOMINATORS, tmp, dom);
3990                     }
3991
3992                   dom = recount_dominator (CDI_DOMINATORS, old_dest);
3993                   set_immediate_dominator (CDI_DOMINATORS, old_dest, dom);
3994                 }
3995             }
3996         }
3997
3998       /* Reset the forwardable bit on our block since it's no longer in
3999          a forwarding chain path.  */
4000       bb_ann (bb)->forwardable = 1;
4001     }
4002
4003   return retval;
4004 }
4005
4006
4007 /* Return a non-special label in the head of basic block BLOCK.
4008    Create one if it doesn't exist.  */
4009
4010 tree
4011 tree_block_label (basic_block bb)
4012 {
4013   block_stmt_iterator i, s = bsi_start (bb);
4014   bool first = true;
4015   tree label, stmt;
4016
4017   for (i = s; !bsi_end_p (i); first = false, bsi_next (&i))
4018     {
4019       stmt = bsi_stmt (i);
4020       if (TREE_CODE (stmt) != LABEL_EXPR)
4021         break;
4022       label = LABEL_EXPR_LABEL (stmt);
4023       if (!DECL_NONLOCAL (label))
4024         {
4025           if (!first)
4026             bsi_move_before (&i, &s);
4027           return label;
4028         }
4029     }
4030
4031   label = create_artificial_label ();
4032   stmt = build1 (LABEL_EXPR, void_type_node, label);
4033   bsi_insert_before (&s, stmt, BSI_NEW_STMT);
4034   return label;
4035 }
4036
4037
4038 /* Attempt to perform edge redirection by replacing a possibly complex
4039    jump instruction by a goto or by removing the jump completely.
4040    This can apply only if all edges now point to the same block.  The
4041    parameters and return values are equivalent to
4042    redirect_edge_and_branch.  */
4043
4044 static edge
4045 tree_try_redirect_by_replacing_jump (edge e, basic_block target)
4046 {
4047   basic_block src = e->src;
4048   edge tmp;
4049   block_stmt_iterator b;
4050   tree stmt;
4051
4052   /* Verify that all targets will be TARGET.  */
4053   for (tmp = src->succ; tmp; tmp = tmp->succ_next)
4054     if (tmp->dest != target && tmp != e)
4055       break;
4056
4057   if (tmp)
4058     return NULL;
4059
4060   b = bsi_last (src);
4061   if (bsi_end_p (b))
4062     return NULL;
4063   stmt = bsi_stmt (b);
4064
4065   if (TREE_CODE (stmt) == COND_EXPR
4066       || TREE_CODE (stmt) == SWITCH_EXPR)
4067     {
4068       bsi_remove (&b);
4069       e = ssa_redirect_edge (e, target);
4070       e->flags = EDGE_FALLTHRU;
4071       return e;
4072     }
4073
4074   return NULL;
4075 }
4076
4077
4078 /* Redirect E to DEST.  Return NULL on failure.  Otherwise, return the
4079    edge representing the redirected branch.  */
4080
4081 static edge
4082 tree_redirect_edge_and_branch (edge e, basic_block dest)
4083 {
4084   basic_block bb = e->src;
4085   block_stmt_iterator bsi;
4086   edge ret;
4087   tree label, stmt;
4088
4089   if (e->flags & (EDGE_ABNORMAL_CALL | EDGE_EH))
4090     return NULL;
4091
4092   if (e->src != ENTRY_BLOCK_PTR 
4093       && (ret = tree_try_redirect_by_replacing_jump (e, dest)))
4094     return ret;
4095
4096   if (e->dest == dest)
4097     return NULL;
4098
4099   label = tree_block_label (dest);
4100
4101   bsi = bsi_last (bb);
4102   stmt = bsi_end_p (bsi) ? NULL : bsi_stmt (bsi);
4103
4104   switch (stmt ? TREE_CODE (stmt) : ERROR_MARK)
4105     {
4106     case COND_EXPR:
4107       stmt = (e->flags & EDGE_TRUE_VALUE
4108               ? COND_EXPR_THEN (stmt)
4109               : COND_EXPR_ELSE (stmt));
4110       GOTO_DESTINATION (stmt) = label;
4111       break;
4112
4113     case GOTO_EXPR:
4114       /* No non-abnormal edges should lead from a non-simple goto, and
4115          simple ones should be represented implicitly.  */
4116       gcc_unreachable ();
4117
4118     case SWITCH_EXPR:
4119       {
4120         tree vec = SWITCH_LABELS (stmt);
4121         size_t i, n = TREE_VEC_LENGTH (vec);
4122
4123         for (i = 0; i < n; ++i)
4124           {
4125             tree elt = TREE_VEC_ELT (vec, i);
4126             if (label_to_block (CASE_LABEL (elt)) == e->dest)
4127               CASE_LABEL (elt) = label;
4128           }
4129       }
4130       break;
4131
4132     case RETURN_EXPR:
4133       bsi_remove (&bsi);
4134       e->flags |= EDGE_FALLTHRU;
4135       break;
4136
4137     default:
4138       /* Otherwise it must be a fallthru edge, and we don't need to
4139          do anything besides redirecting it.  */
4140       gcc_assert (e->flags & EDGE_FALLTHRU);
4141       break;
4142     }
4143
4144   /* Update/insert PHI nodes as necessary.  */
4145
4146   /* Now update the edges in the CFG.  */
4147   e = ssa_redirect_edge (e, dest);
4148
4149   return e;
4150 }
4151
4152
4153 /* Simple wrapper, as we can always redirect fallthru edges.  */
4154
4155 static basic_block
4156 tree_redirect_edge_and_branch_force (edge e, basic_block dest)
4157 {
4158   e = tree_redirect_edge_and_branch (e, dest);
4159   gcc_assert (e);
4160
4161   return NULL;
4162 }
4163
4164
4165 /* Splits basic block BB after statement STMT (but at least after the
4166    labels).  If STMT is NULL, BB is split just after the labels.  */
4167
4168 static basic_block
4169 tree_split_block (basic_block bb, void *stmt)
4170 {
4171   block_stmt_iterator bsi, bsi_tgt;
4172   tree act;
4173   basic_block new_bb;
4174   edge e;
4175
4176   new_bb = create_empty_bb (bb);
4177
4178   /* Redirect the outgoing edges.  */
4179   new_bb->succ = bb->succ;
4180   bb->succ = NULL;
4181   for (e = new_bb->succ; e; e = e->succ_next)
4182     e->src = new_bb;
4183
4184   if (stmt && TREE_CODE ((tree) stmt) == LABEL_EXPR)
4185     stmt = NULL;
4186
4187   /* Move everything from BSI to the new basic block.  */
4188   for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
4189     {
4190       act = bsi_stmt (bsi);
4191       if (TREE_CODE (act) == LABEL_EXPR)
4192         continue;
4193
4194       if (!stmt)
4195         break;
4196
4197       if (stmt == act)
4198         {
4199           bsi_next (&bsi);
4200           break;
4201         }
4202     }
4203
4204   bsi_tgt = bsi_start (new_bb);
4205   while (!bsi_end_p (bsi))
4206     {
4207       act = bsi_stmt (bsi);
4208       bsi_remove (&bsi);
4209       bsi_insert_after (&bsi_tgt, act, BSI_NEW_STMT);
4210     }
4211
4212   return new_bb;
4213 }
4214
4215
4216 /* Moves basic block BB after block AFTER.  */
4217
4218 static bool
4219 tree_move_block_after (basic_block bb, basic_block after)
4220 {
4221   if (bb->prev_bb == after)
4222     return true;
4223
4224   unlink_block (bb);
4225   link_block (bb, after);
4226
4227   return true;
4228 }
4229
4230
4231 /* Return true if basic_block can be duplicated.  */
4232
4233 static bool
4234 tree_can_duplicate_bb_p (basic_block bb ATTRIBUTE_UNUSED)
4235 {
4236   return true;
4237 }
4238
4239
4240 /* Create a duplicate of the basic block BB.  NOTE: This does not
4241    preserve SSA form.  */
4242
4243 static basic_block
4244 tree_duplicate_bb (basic_block bb)
4245 {
4246   basic_block new_bb;
4247   block_stmt_iterator bsi, bsi_tgt;
4248   tree phi, val;
4249   ssa_op_iter op_iter;
4250
4251   new_bb = create_empty_bb (EXIT_BLOCK_PTR->prev_bb);
4252
4253   for (phi = phi_nodes (bb); phi; phi = TREE_CHAIN (phi))
4254     {
4255       mark_for_rewrite (PHI_RESULT (phi));
4256     }
4257
4258   bsi_tgt = bsi_start (new_bb);
4259   for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
4260     {
4261       tree stmt = bsi_stmt (bsi);
4262       tree copy;
4263
4264       if (TREE_CODE (stmt) == LABEL_EXPR)
4265         continue;
4266
4267       /* Record the definitions.  */
4268       get_stmt_operands (stmt);
4269
4270       FOR_EACH_SSA_TREE_OPERAND (val, stmt, op_iter, SSA_OP_ALL_DEFS)
4271         mark_for_rewrite (val);
4272
4273       copy = unshare_expr (stmt);
4274
4275       /* Copy also the virtual operands.  */
4276       get_stmt_ann (copy);
4277       copy_virtual_operands (copy, stmt);
4278       
4279       bsi_insert_after (&bsi_tgt, copy, BSI_NEW_STMT);
4280     }
4281
4282   return new_bb;
4283 }
4284
4285
4286 /* Dump FUNCTION_DECL FN to file FILE using FLAGS (see TDF_* in tree.h)  */
4287
4288 void
4289 dump_function_to_file (tree fn, FILE *file, int flags)
4290 {
4291   tree arg, vars, var;
4292   bool ignore_topmost_bind = false, any_var = false;
4293   basic_block bb;
4294   tree chain;
4295
4296   fprintf (file, "%s (", lang_hooks.decl_printable_name (fn, 2));
4297
4298   arg = DECL_ARGUMENTS (fn);
4299   while (arg)
4300     {
4301       print_generic_expr (file, arg, dump_flags);
4302       if (TREE_CHAIN (arg))
4303         fprintf (file, ", ");
4304       arg = TREE_CHAIN (arg);
4305     }
4306   fprintf (file, ")\n");
4307
4308   if (flags & TDF_RAW)
4309     {
4310       dump_node (fn, TDF_SLIM | flags, file);
4311       return;
4312     }
4313
4314   /* When GIMPLE is lowered, the variables are no longer available in
4315      BIND_EXPRs, so display them separately.  */
4316   if (cfun && cfun->unexpanded_var_list)
4317     {
4318       ignore_topmost_bind = true;
4319
4320       fprintf (file, "{\n");
4321       for (vars = cfun->unexpanded_var_list; vars; vars = TREE_CHAIN (vars))
4322         {
4323           var = TREE_VALUE (vars);
4324
4325           print_generic_decl (file, var, flags);
4326           fprintf (file, "\n");
4327
4328           any_var = true;
4329         }
4330     }
4331
4332   if (basic_block_info)
4333     {
4334       /* Make a CFG based dump.  */
4335       check_bb_profile (ENTRY_BLOCK_PTR, file);
4336       if (!ignore_topmost_bind)
4337         fprintf (file, "{\n");
4338
4339       if (any_var && n_basic_blocks)
4340         fprintf (file, "\n");
4341
4342       FOR_EACH_BB (bb)
4343         dump_generic_bb (file, bb, 2, flags);
4344         
4345       fprintf (file, "}\n");
4346       check_bb_profile (EXIT_BLOCK_PTR, file);
4347     }
4348   else
4349     {
4350       int indent;
4351
4352       /* Make a tree based dump.  */
4353       chain = DECL_SAVED_TREE (fn);
4354
4355       if (TREE_CODE (chain) == BIND_EXPR)
4356         {
4357           if (ignore_topmost_bind)
4358             {
4359               chain = BIND_EXPR_BODY (chain);
4360               indent = 2;
4361             }
4362           else
4363             indent = 0;
4364         }
4365       else
4366         {
4367           if (!ignore_topmost_bind)
4368             fprintf (file, "{\n");
4369           indent = 2;
4370         }
4371
4372       if (any_var)
4373         fprintf (file, "\n");
4374
4375       print_generic_stmt_indented (file, chain, flags, indent);
4376       if (ignore_topmost_bind)
4377         fprintf (file, "}\n");
4378     }
4379
4380   fprintf (file, "\n\n");
4381 }
4382
4383
4384 /* Pretty print of the loops intermediate representation.  */
4385 static void print_loop (FILE *, struct loop *, int);
4386 static void print_pred_bbs (FILE *, edge);
4387 static void print_succ_bbs (FILE *, edge);
4388
4389
4390 /* Print the predecessors indexes of edge E on FILE.  */
4391
4392 static void
4393 print_pred_bbs (FILE *file, edge e)
4394 {
4395   if (e == NULL)
4396     return;
4397   
4398   else if (e->pred_next == NULL)
4399     fprintf (file, "bb_%d", e->src->index);
4400   
4401   else
4402     {
4403       fprintf (file, "bb_%d, ", e->src->index);
4404       print_pred_bbs (file, e->pred_next);
4405     }
4406 }
4407
4408
4409 /* Print the successors indexes of edge E on FILE.  */
4410
4411 static void
4412 print_succ_bbs (FILE *file, edge e)
4413 {
4414   if (e == NULL)
4415     return;
4416   else if (e->succ_next == NULL)
4417     fprintf (file, "bb_%d", e->dest->index);
4418   else
4419     {
4420       fprintf (file, "bb_%d, ", e->dest->index);
4421       print_succ_bbs (file, e->succ_next);
4422     }
4423 }
4424
4425
4426 /* Pretty print LOOP on FILE, indented INDENT spaces.  */
4427
4428 static void
4429 print_loop (FILE *file, struct loop *loop, int indent)
4430 {
4431   char *s_indent;
4432   basic_block bb;
4433   
4434   if (loop == NULL)
4435     return;
4436
4437   s_indent = (char *) alloca ((size_t) indent + 1);
4438   memset ((void *) s_indent, ' ', (size_t) indent);
4439   s_indent[indent] = '\0';
4440
4441   /* Print the loop's header.  */
4442   fprintf (file, "%sloop_%d\n", s_indent, loop->num);
4443   
4444   /* Print the loop's body.  */
4445   fprintf (file, "%s{\n", s_indent);
4446   FOR_EACH_BB (bb)
4447     if (bb->loop_father == loop)
4448       {
4449         /* Print the basic_block's header.  */
4450         fprintf (file, "%s  bb_%d (preds = {", s_indent, bb->index);
4451         print_pred_bbs (file, bb->pred);
4452         fprintf (file, "}, succs = {");
4453         print_succ_bbs (file, bb->succ);
4454         fprintf (file, "})\n");
4455         
4456         /* Print the basic_block's body.  */
4457         fprintf (file, "%s  {\n", s_indent);
4458         tree_dump_bb (bb, file, indent + 4);
4459         fprintf (file, "%s  }\n", s_indent);
4460       }
4461   
4462   print_loop (file, loop->inner, indent + 2);
4463   fprintf (file, "%s}\n", s_indent);
4464   print_loop (file, loop->next, indent);
4465 }
4466
4467
4468 /* Follow a CFG edge from the entry point of the program, and on entry
4469    of a loop, pretty print the loop structure on FILE.  */
4470
4471 void 
4472 print_loop_ir (FILE *file)
4473 {
4474   basic_block bb;
4475   
4476   bb = BASIC_BLOCK (0);
4477   if (bb && bb->loop_father)
4478     print_loop (file, bb->loop_father, 0);
4479 }
4480
4481
4482 /* Debugging loops structure at tree level.  */
4483
4484 void 
4485 debug_loop_ir (void)
4486 {
4487   print_loop_ir (stderr);
4488 }
4489
4490
4491 /* Return true if BB ends with a call, possibly followed by some
4492    instructions that must stay with the call.  Return false,
4493    otherwise.  */
4494
4495 static bool
4496 tree_block_ends_with_call_p (basic_block bb)
4497 {
4498   block_stmt_iterator bsi = bsi_last (bb);
4499   return get_call_expr_in (bsi_stmt (bsi)) != NULL;
4500 }
4501
4502
4503 /* Return true if BB ends with a conditional branch.  Return false,
4504    otherwise.  */
4505
4506 static bool
4507 tree_block_ends_with_condjump_p (basic_block bb)
4508 {
4509   tree stmt = tsi_stmt (bsi_last (bb).tsi);
4510   return (TREE_CODE (stmt) == COND_EXPR);
4511 }
4512
4513
4514 /* Return true if we need to add fake edge to exit at statement T.
4515    Helper function for tree_flow_call_edges_add.  */
4516
4517 static bool
4518 need_fake_edge_p (tree t)
4519 {
4520   tree call;
4521
4522   /* NORETURN and LONGJMP calls already have an edge to exit.
4523      CONST, PURE and ALWAYS_RETURN calls do not need one.
4524      We don't currently check for CONST and PURE here, although
4525      it would be a good idea, because those attributes are
4526      figured out from the RTL in mark_constant_function, and
4527      the counter incrementation code from -fprofile-arcs
4528      leads to different results from -fbranch-probabilities.  */
4529   call = get_call_expr_in (t);
4530   if (call
4531       && !(call_expr_flags (call) & 
4532            (ECF_NORETURN | ECF_LONGJMP | ECF_ALWAYS_RETURN)))
4533     return true;
4534
4535   if (TREE_CODE (t) == ASM_EXPR
4536        && (ASM_VOLATILE_P (t) || ASM_INPUT_P (t)))
4537     return true;
4538
4539   return false;
4540 }
4541
4542
4543 /* Add fake edges to the function exit for any non constant and non
4544    noreturn calls, volatile inline assembly in the bitmap of blocks
4545    specified by BLOCKS or to the whole CFG if BLOCKS is zero.  Return
4546    the number of blocks that were split.
4547
4548    The goal is to expose cases in which entering a basic block does
4549    not imply that all subsequent instructions must be executed.  */
4550
4551 static int
4552 tree_flow_call_edges_add (sbitmap blocks)
4553 {
4554   int i;
4555   int blocks_split = 0;
4556   int last_bb = last_basic_block;
4557   bool check_last_block = false;
4558
4559   if (n_basic_blocks == 0)
4560     return 0;
4561
4562   if (! blocks)
4563     check_last_block = true;
4564   else
4565     check_last_block = TEST_BIT (blocks, EXIT_BLOCK_PTR->prev_bb->index);
4566
4567   /* In the last basic block, before epilogue generation, there will be
4568      a fallthru edge to EXIT.  Special care is required if the last insn
4569      of the last basic block is a call because make_edge folds duplicate
4570      edges, which would result in the fallthru edge also being marked
4571      fake, which would result in the fallthru edge being removed by
4572      remove_fake_edges, which would result in an invalid CFG.
4573
4574      Moreover, we can't elide the outgoing fake edge, since the block
4575      profiler needs to take this into account in order to solve the minimal
4576      spanning tree in the case that the call doesn't return.
4577
4578      Handle this by adding a dummy instruction in a new last basic block.  */
4579   if (check_last_block)
4580     {
4581       basic_block bb = EXIT_BLOCK_PTR->prev_bb;
4582       block_stmt_iterator bsi = bsi_last (bb);
4583       tree t = NULL_TREE;
4584       if (!bsi_end_p (bsi))
4585         t = bsi_stmt (bsi);
4586
4587       if (need_fake_edge_p (t))
4588         {
4589           edge e;
4590
4591           for (e = bb->succ; e; e = e->succ_next)
4592             if (e->dest == EXIT_BLOCK_PTR)
4593               {
4594                 bsi_insert_on_edge (e, build_empty_stmt ());
4595                 bsi_commit_edge_inserts ((int *)NULL);
4596                 break;
4597               }
4598         }
4599     }
4600
4601   /* Now add fake edges to the function exit for any non constant
4602      calls since there is no way that we can determine if they will
4603      return or not...  */
4604   for (i = 0; i < last_bb; i++)
4605     {
4606       basic_block bb = BASIC_BLOCK (i);
4607       block_stmt_iterator bsi;
4608       tree stmt, last_stmt;
4609
4610       if (!bb)
4611         continue;
4612
4613       if (blocks && !TEST_BIT (blocks, i))
4614         continue;
4615
4616       bsi = bsi_last (bb);
4617       if (!bsi_end_p (bsi))
4618         {
4619           last_stmt = bsi_stmt (bsi);
4620           do
4621             {
4622               stmt = bsi_stmt (bsi);
4623               if (need_fake_edge_p (stmt))
4624                 {
4625                   edge e;
4626                   /* The handling above of the final block before the
4627                      epilogue should be enough to verify that there is
4628                      no edge to the exit block in CFG already.
4629                      Calling make_edge in such case would cause us to
4630                      mark that edge as fake and remove it later.  */
4631 #ifdef ENABLE_CHECKING
4632                   if (stmt == last_stmt)
4633                     for (e = bb->succ; e; e = e->succ_next)
4634                       gcc_assert (e->dest != EXIT_BLOCK_PTR);
4635 #endif
4636
4637                   /* Note that the following may create a new basic block
4638                      and renumber the existing basic blocks.  */
4639                   if (stmt != last_stmt)
4640                     {
4641                       e = split_block (bb, stmt);
4642                       if (e)
4643                         blocks_split++;
4644                     }
4645                   make_edge (bb, EXIT_BLOCK_PTR, EDGE_FAKE);
4646                 }
4647               bsi_prev (&bsi);
4648             }
4649           while (!bsi_end_p (bsi));
4650         }
4651     }
4652
4653   if (blocks_split)
4654     verify_flow_info ();
4655
4656   return blocks_split;
4657 }
4658
4659 bool
4660 tree_purge_dead_eh_edges (basic_block bb)
4661 {
4662   bool changed = false;
4663   edge e, next;
4664   tree stmt = last_stmt (bb);
4665
4666   if (stmt && tree_can_throw_internal (stmt))
4667     return false;
4668
4669   for (e = bb->succ; e ; e = next)
4670     {
4671       next = e->succ_next;
4672       if (e->flags & EDGE_EH)
4673         {
4674           ssa_remove_edge (e);
4675           changed = true;
4676         }
4677     }
4678
4679   return changed;
4680 }
4681
4682 bool
4683 tree_purge_all_dead_eh_edges (bitmap blocks)
4684 {
4685   bool changed = false;
4686   size_t i;
4687
4688   EXECUTE_IF_SET_IN_BITMAP (blocks, 0, i,
4689     { changed |= tree_purge_dead_eh_edges (BASIC_BLOCK (i)); });
4690
4691   return changed;
4692 }
4693
4694 struct cfg_hooks tree_cfg_hooks = {
4695   "tree",
4696   tree_verify_flow_info,
4697   tree_dump_bb,                 /* dump_bb  */
4698   create_bb,                    /* create_basic_block  */
4699   tree_redirect_edge_and_branch,/* redirect_edge_and_branch  */
4700   tree_redirect_edge_and_branch_force,/* redirect_edge_and_branch_force  */
4701   remove_bb,                    /* delete_basic_block  */
4702   tree_split_block,             /* split_block  */
4703   tree_move_block_after,        /* move_block_after  */
4704   tree_can_merge_blocks_p,      /* can_merge_blocks_p  */
4705   tree_merge_blocks,            /* merge_blocks  */
4706   tree_predict_edge,            /* predict_edge  */
4707   tree_predicted_by_p,          /* predicted_by_p  */
4708   tree_can_duplicate_bb_p,      /* can_duplicate_block_p  */
4709   tree_duplicate_bb,            /* duplicate_block  */
4710   tree_split_edge,              /* split_edge  */
4711   tree_make_forwarder_block,    /* make_forward_block  */
4712   NULL,                         /* tidy_fallthru_edge  */
4713   tree_block_ends_with_call_p,  /* block_ends_with_call_p */
4714   tree_block_ends_with_condjump_p, /* block_ends_with_condjump_p */
4715   tree_flow_call_edges_add      /* flow_call_edges_add */
4716 };
4717
4718
4719 /* Split all critical edges.  */
4720
4721 static void
4722 split_critical_edges (void)
4723 {
4724   basic_block bb;
4725   edge e;
4726
4727   FOR_ALL_BB (bb)
4728     {
4729       for (e = bb->succ; e ; e = e->succ_next)
4730         if (EDGE_CRITICAL_P (e) && !(e->flags & EDGE_ABNORMAL))
4731           {
4732             split_edge (e);
4733           }
4734     }
4735 }
4736
4737 struct tree_opt_pass pass_split_crit_edges = 
4738 {
4739   "crited",                          /* name */
4740   NULL,                          /* gate */
4741   split_critical_edges,          /* execute */
4742   NULL,                          /* sub */
4743   NULL,                          /* next */
4744   0,                             /* static_pass_number */
4745   TV_TREE_SPLIT_EDGES,           /* tv_id */
4746   PROP_cfg,                      /* properties required */
4747   PROP_no_crit_edges,            /* properties_provided */
4748   0,                             /* properties_destroyed */
4749   0,                             /* todo_flags_start */
4750   TODO_dump_func,                /* todo_flags_finish */
4751   0                              /* letter */
4752 };
4753
4754 \f
4755 /* Return EXP if it is a valid GIMPLE rvalue, else gimplify it into
4756    a temporary, make sure and register it to be renamed if necessary,
4757    and finally return the temporary.  Put the statements to compute
4758    EXP before the current statement in BSI.  */
4759
4760 tree
4761 gimplify_val (block_stmt_iterator *bsi, tree type, tree exp)
4762 {
4763   tree t, new_stmt, orig_stmt;
4764
4765   if (is_gimple_val (exp))
4766     return exp;
4767
4768   t = make_rename_temp (type, NULL);
4769   new_stmt = build (MODIFY_EXPR, type, t, exp);
4770
4771   orig_stmt = bsi_stmt (*bsi);
4772   SET_EXPR_LOCUS (new_stmt, EXPR_LOCUS (orig_stmt));
4773   TREE_BLOCK (new_stmt) = TREE_BLOCK (orig_stmt);
4774
4775   bsi_insert_before (bsi, new_stmt, BSI_SAME_STMT);
4776
4777   return t;
4778 }
4779
4780 /* Build a ternary operation and gimplify it.  Emit code before BSI.
4781    Return the gimple_val holding the result.  */
4782
4783 tree
4784 gimplify_build3 (block_stmt_iterator *bsi, enum tree_code code,
4785                  tree type, tree a, tree b, tree c)
4786 {
4787   tree ret;
4788
4789   ret = fold (build3 (code, type, a, b, c));
4790   STRIP_NOPS (ret);
4791
4792   return gimplify_val (bsi, type, ret);
4793 }
4794
4795 /* Build a binary operation and gimplify it.  Emit code before BSI.
4796    Return the gimple_val holding the result.  */
4797
4798 tree
4799 gimplify_build2 (block_stmt_iterator *bsi, enum tree_code code,
4800                  tree type, tree a, tree b)
4801 {
4802   tree ret;
4803
4804   ret = fold (build2 (code, type, a, b));
4805   STRIP_NOPS (ret);
4806
4807   return gimplify_val (bsi, type, ret);
4808 }
4809
4810 /* Build a unary operation and gimplify it.  Emit code before BSI.
4811    Return the gimple_val holding the result.  */
4812
4813 tree
4814 gimplify_build1 (block_stmt_iterator *bsi, enum tree_code code, tree type,
4815                  tree a)
4816 {
4817   tree ret;
4818
4819   ret = fold (build1 (code, type, a));
4820   STRIP_NOPS (ret);
4821
4822   return gimplify_val (bsi, type, ret);
4823 }
4824
4825
4826 \f
4827 /* Emit return warnings.  */
4828
4829 static void
4830 execute_warn_function_return (void)
4831 {
4832 #ifdef USE_MAPPED_LOCATION
4833   source_location location;
4834 #else
4835   location_t *locus;
4836 #endif
4837   tree last;
4838   edge e;
4839
4840   if (warn_missing_noreturn
4841       && !TREE_THIS_VOLATILE (cfun->decl)
4842       && EXIT_BLOCK_PTR->pred == NULL
4843       && !lang_hooks.function.missing_noreturn_ok_p (cfun->decl))
4844     warning ("%Jfunction might be possible candidate for attribute `noreturn'",
4845              cfun->decl);
4846
4847   /* If we have a path to EXIT, then we do return.  */
4848   if (TREE_THIS_VOLATILE (cfun->decl)
4849       && EXIT_BLOCK_PTR->pred != NULL)
4850     {
4851 #ifdef USE_MAPPED_LOCATION
4852       location = UNKNOWN_LOCATION;
4853 #else
4854       locus = NULL;
4855 #endif
4856       for (e = EXIT_BLOCK_PTR->pred; e ; e = e->pred_next)
4857         {
4858           last = last_stmt (e->src);
4859           if (TREE_CODE (last) == RETURN_EXPR
4860 #ifdef USE_MAPPED_LOCATION
4861               && (location = EXPR_LOCATION (last)) != UNKNOWN_LOCATION)
4862 #else
4863               && (locus = EXPR_LOCUS (last)) != NULL)
4864 #endif
4865             break;
4866         }
4867 #ifdef USE_MAPPED_LOCATION
4868       if (location == UNKNOWN_LOCATION)
4869         location = cfun->function_end_locus;
4870       warning ("%H`noreturn' function does return", &location);
4871 #else
4872       if (!locus)
4873         locus = &cfun->function_end_locus;
4874       warning ("%H`noreturn' function does return", locus);
4875 #endif
4876     }
4877
4878   /* If we see "return;" in some basic block, then we do reach the end
4879      without returning a value.  */
4880   else if (warn_return_type
4881            && EXIT_BLOCK_PTR->pred != NULL
4882            && !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (cfun->decl))))
4883     {
4884       for (e = EXIT_BLOCK_PTR->pred; e ; e = e->pred_next)
4885         {
4886           tree last = last_stmt (e->src);
4887           if (TREE_CODE (last) == RETURN_EXPR
4888               && TREE_OPERAND (last, 0) == NULL)
4889             {
4890 #ifdef USE_MAPPED_LOCATION
4891               location = EXPR_LOCATION (last);
4892               if (location == UNKNOWN_LOCATION)
4893                   location = cfun->function_end_locus;
4894               warning ("%Hcontrol reaches end of non-void function", &location);
4895 #else
4896               locus = EXPR_LOCUS (last);
4897               if (!locus)
4898                 locus = &cfun->function_end_locus;
4899               warning ("%Hcontrol reaches end of non-void function", locus);
4900 #endif
4901               break;
4902             }
4903         }
4904     }
4905 }
4906
4907
4908 /* Given a basic block B which ends with a conditional and has
4909    precisely two successors, determine which of the edges is taken if
4910    the conditional is true and which is taken if the conditional is
4911    false.  Set TRUE_EDGE and FALSE_EDGE appropriately.  */
4912
4913 void
4914 extract_true_false_edges_from_block (basic_block b,
4915                                      edge *true_edge,
4916                                      edge *false_edge)
4917 {
4918   edge e = b->succ;
4919
4920   if (e->flags & EDGE_TRUE_VALUE)
4921     {
4922       *true_edge = e;
4923       *false_edge = e->succ_next;
4924     }
4925   else
4926     {
4927       *false_edge = e;
4928       *true_edge = e->succ_next;
4929     }
4930 }
4931
4932 struct tree_opt_pass pass_warn_function_return =
4933 {
4934   NULL,                                 /* name */
4935   NULL,                                 /* gate */
4936   execute_warn_function_return,         /* execute */
4937   NULL,                                 /* sub */
4938   NULL,                                 /* next */
4939   0,                                    /* static_pass_number */
4940   0,                                    /* tv_id */
4941   PROP_cfg,                             /* properties_required */
4942   0,                                    /* properties_provided */
4943   0,                                    /* properties_destroyed */
4944   0,                                    /* todo_flags_start */
4945   0,                                    /* todo_flags_finish */
4946   0                                     /* letter */
4947 };
4948
4949 #include "gt-tree-cfg.h"