OSDN Git Service

2004-09-24 Ben Elliston <bje@au.ibm.com>
[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 #include "cfglayout.h"
47
48 /* This file contains functions for building the Control Flow Graph (CFG)
49    for a function tree.  */
50
51 /* Local declarations.  */
52
53 /* Initial capacity for the basic block array.  */
54 static const int initial_cfg_capacity = 20;
55
56 /* Mapping of labels to their associated blocks.  This can greatly speed up
57    building of the CFG in code with lots of gotos.  */
58 static GTY(()) varray_type label_to_block_map;
59
60 /* CFG statistics.  */
61 struct cfg_stats_d
62 {
63   long num_merged_labels;
64 };
65
66 static struct cfg_stats_d cfg_stats;
67
68 /* Nonzero if we found a computed goto while building basic blocks.  */
69 static bool found_computed_goto;
70
71 /* Basic blocks and flowgraphs.  */
72 static basic_block create_bb (void *, void *, basic_block);
73 static void create_block_annotation (basic_block);
74 static void free_blocks_annotations (void);
75 static void clear_blocks_annotations (void);
76 static void make_blocks (tree);
77 static void factor_computed_gotos (void);
78
79 /* Edges.  */
80 static void make_edges (void);
81 static void make_ctrl_stmt_edges (basic_block);
82 static void make_exit_edges (basic_block);
83 static void make_cond_expr_edges (basic_block);
84 static void make_switch_expr_edges (basic_block);
85 static void make_goto_expr_edges (basic_block);
86 static edge tree_redirect_edge_and_branch (edge, basic_block);
87 static edge tree_try_redirect_by_replacing_jump (edge, basic_block);
88 static void split_critical_edges (void);
89
90 /* Various helpers.  */
91 static inline bool stmt_starts_bb_p (tree, tree);
92 static int tree_verify_flow_info (void);
93 static void tree_make_forwarder_block (edge);
94 static bool thread_jumps (void);
95 static bool tree_forwarder_block_p (basic_block);
96 static void bsi_commit_edge_inserts_1 (edge e);
97 static void tree_cfg2vcg (FILE *);
98
99 /* Flowgraph optimization and cleanup.  */
100 static void tree_merge_blocks (basic_block, basic_block);
101 static bool tree_can_merge_blocks_p (basic_block, basic_block);
102 static void remove_bb (basic_block);
103 static bool cleanup_control_flow (void);
104 static bool cleanup_control_expr_graph (basic_block, block_stmt_iterator);
105 static edge find_taken_edge_cond_expr (basic_block, tree);
106 static edge find_taken_edge_switch_expr (basic_block, tree);
107 static tree find_case_label_for_value (tree, tree);
108 static bool phi_alternatives_equal (basic_block, edge, edge);
109
110
111 /*---------------------------------------------------------------------------
112                               Create basic blocks
113 ---------------------------------------------------------------------------*/
114
115 /* Entry point to the CFG builder for trees.  TP points to the list of
116    statements to be added to the flowgraph.  */
117
118 static void
119 build_tree_cfg (tree *tp)
120 {
121   /* Register specific tree functions.  */
122   tree_register_cfg_hooks ();
123
124   /* Initialize rbi_pool.  */
125   alloc_rbi_pool ();
126
127   /* Initialize the basic block array.  */
128   init_flow ();
129   profile_status = PROFILE_ABSENT;
130   n_basic_blocks = 0;
131   last_basic_block = 0;
132   VARRAY_BB_INIT (basic_block_info, initial_cfg_capacity, "basic_block_info");
133   memset ((void *) &cfg_stats, 0, sizeof (cfg_stats));
134
135   /* Build a mapping of labels to their associated blocks.  */
136   VARRAY_BB_INIT (label_to_block_map, initial_cfg_capacity,
137                   "label to block map");
138
139   ENTRY_BLOCK_PTR->next_bb = EXIT_BLOCK_PTR;
140   EXIT_BLOCK_PTR->prev_bb = ENTRY_BLOCK_PTR;
141
142   found_computed_goto = 0;
143   make_blocks (*tp);
144
145   /* Computed gotos are hell to deal with, especially if there are
146      lots of them with a large number of destinations.  So we factor
147      them to a common computed goto location before we build the
148      edge list.  After we convert back to normal form, we will un-factor
149      the computed gotos since factoring introduces an unwanted jump.  */
150   if (found_computed_goto)
151     factor_computed_gotos ();
152
153   /* Make sure there is always at least one block, even if its empty.  */
154   if (n_basic_blocks == 0)
155     create_empty_bb (ENTRY_BLOCK_PTR);
156
157   create_block_annotation (ENTRY_BLOCK_PTR);
158   create_block_annotation (EXIT_BLOCK_PTR);
159   
160   /* Adjust the size of the array.  */
161   VARRAY_GROW (basic_block_info, n_basic_blocks);
162
163   /* To speed up statement iterator walks, we first purge dead labels.  */
164   cleanup_dead_labels ();
165
166   /* Group case nodes to reduce the number of edges.
167      We do this after cleaning up dead labels because otherwise we miss
168      a lot of obvious case merging opportunities.  */
169   group_case_labels ();
170
171   /* Create the edges of the flowgraph.  */
172   make_edges ();
173
174   /* Debugging dumps.  */
175
176   /* Write the flowgraph to a VCG file.  */
177   {
178     int local_dump_flags;
179     FILE *dump_file = dump_begin (TDI_vcg, &local_dump_flags);
180     if (dump_file)
181       {
182         tree_cfg2vcg (dump_file);
183         dump_end (TDI_vcg, dump_file);
184       }
185   }
186
187   /* Dump a textual representation of the flowgraph.  */
188   if (dump_file)
189     dump_tree_cfg (dump_file, dump_flags);
190 }
191
192 static void
193 execute_build_cfg (void)
194 {
195   build_tree_cfg (&DECL_SAVED_TREE (current_function_decl));
196 }
197
198 struct tree_opt_pass pass_build_cfg =
199 {
200   "cfg",                                /* name */
201   NULL,                                 /* gate */
202   execute_build_cfg,                    /* execute */
203   NULL,                                 /* sub */
204   NULL,                                 /* next */
205   0,                                    /* static_pass_number */
206   TV_TREE_CFG,                          /* tv_id */
207   PROP_gimple_leh,                      /* properties_required */
208   PROP_cfg,                             /* properties_provided */
209   0,                                    /* properties_destroyed */
210   0,                                    /* todo_flags_start */
211   TODO_verify_stmts,                    /* todo_flags_finish */
212   0                                     /* letter */
213 };
214
215 /* Search the CFG for any computed gotos.  If found, factor them to a 
216    common computed goto site.  Also record the location of that site so
217    that we can un-factor the gotos after we have converted back to 
218    normal form.  */
219
220 static void
221 factor_computed_gotos (void)
222 {
223   basic_block bb;
224   tree factored_label_decl = NULL;
225   tree var = NULL;
226   tree factored_computed_goto_label = NULL;
227   tree factored_computed_goto = NULL;
228
229   /* We know there are one or more computed gotos in this function.
230      Examine the last statement in each basic block to see if the block
231      ends with a computed goto.  */
232         
233   FOR_EACH_BB (bb)
234     {
235       block_stmt_iterator bsi = bsi_last (bb);
236       tree last;
237
238       if (bsi_end_p (bsi))
239         continue;
240       last = bsi_stmt (bsi);
241
242       /* Ignore the computed goto we create when we factor the original
243          computed gotos.  */
244       if (last == factored_computed_goto)
245         continue;
246
247       /* If the last statement is a computed goto, factor it.  */
248       if (computed_goto_p (last))
249         {
250           tree assignment;
251
252           /* The first time we find a computed goto we need to create
253              the factored goto block and the variable each original
254              computed goto will use for their goto destination.  */
255           if (! factored_computed_goto)
256             {
257               basic_block new_bb = create_empty_bb (bb);
258               block_stmt_iterator new_bsi = bsi_start (new_bb);
259
260               /* Create the destination of the factored goto.  Each original
261                  computed goto will put its desired destination into this
262                  variable and jump to the label we create immediately
263                  below.  */
264               var = create_tmp_var (ptr_type_node, "gotovar");
265
266               /* Build a label for the new block which will contain the
267                  factored computed goto.  */
268               factored_label_decl = create_artificial_label ();
269               factored_computed_goto_label
270                 = build1 (LABEL_EXPR, void_type_node, factored_label_decl);
271               bsi_insert_after (&new_bsi, factored_computed_goto_label,
272                                 BSI_NEW_STMT);
273
274               /* Build our new computed goto.  */
275               factored_computed_goto = build1 (GOTO_EXPR, void_type_node, var);
276               bsi_insert_after (&new_bsi, factored_computed_goto,
277                                 BSI_NEW_STMT);
278             }
279
280           /* Copy the original computed goto's destination into VAR.  */
281           assignment = build (MODIFY_EXPR, ptr_type_node,
282                               var, GOTO_DESTINATION (last));
283           bsi_insert_before (&bsi, assignment, BSI_SAME_STMT);
284
285           /* And re-vector the computed goto to the new destination.  */
286           GOTO_DESTINATION (last) = factored_label_decl;
287         }
288     }
289 }
290
291
292 /* Create annotations for a single basic block.  */
293
294 static void
295 create_block_annotation (basic_block bb)
296 {
297   /* Verify that the tree_annotations field is clear.  */
298   gcc_assert (!bb->tree_annotations);
299   bb->tree_annotations = ggc_alloc_cleared (sizeof (struct bb_ann_d));
300 }
301
302
303 /* Free the annotations for all the basic blocks.  */
304
305 static void free_blocks_annotations (void)
306 {
307   clear_blocks_annotations ();  
308 }
309
310
311 /* Clear the annotations for all the basic blocks.  */
312
313 static void
314 clear_blocks_annotations (void)
315 {
316   basic_block bb;
317
318   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, NULL, next_bb)
319     bb->tree_annotations = NULL;
320 }
321
322
323 /* Build a flowgraph for the statement_list STMT_LIST.  */
324
325 static void
326 make_blocks (tree stmt_list)
327 {
328   tree_stmt_iterator i = tsi_start (stmt_list);
329   tree stmt = NULL;
330   bool start_new_block = true;
331   bool first_stmt_of_list = true;
332   basic_block bb = ENTRY_BLOCK_PTR;
333
334   while (!tsi_end_p (i))
335     {
336       tree prev_stmt;
337
338       prev_stmt = stmt;
339       stmt = tsi_stmt (i);
340
341       /* If the statement starts a new basic block or if we have determined
342          in a previous pass that we need to create a new block for STMT, do
343          so now.  */
344       if (start_new_block || stmt_starts_bb_p (stmt, prev_stmt))
345         {
346           if (!first_stmt_of_list)
347             stmt_list = tsi_split_statement_list_before (&i);
348           bb = create_basic_block (stmt_list, NULL, bb);
349           start_new_block = false;
350         }
351
352       /* Now add STMT to BB and create the subgraphs for special statement
353          codes.  */
354       set_bb_for_stmt (stmt, bb);
355
356       if (computed_goto_p (stmt))
357         found_computed_goto = true;
358
359       /* If STMT is a basic block terminator, set START_NEW_BLOCK for the
360          next iteration.  */
361       if (stmt_ends_bb_p (stmt))
362         start_new_block = true;
363
364       tsi_next (&i);
365       first_stmt_of_list = false;
366     }
367 }
368
369
370 /* Create and return a new empty basic block after bb AFTER.  */
371
372 static basic_block
373 create_bb (void *h, void *e, basic_block after)
374 {
375   basic_block bb;
376
377   gcc_assert (!e);
378
379   /* Create and initialize a new basic block.  */
380   bb = alloc_block ();
381   memset (bb, 0, sizeof (*bb));
382
383   bb->index = last_basic_block;
384   bb->flags = BB_NEW;
385   bb->stmt_list = h ? h : alloc_stmt_list ();
386
387   /* Add the new block to the linked list of blocks.  */
388   link_block (bb, after);
389
390   /* Grow the basic block array if needed.  */
391   if ((size_t) last_basic_block == VARRAY_SIZE (basic_block_info))
392     {
393       size_t new_size = last_basic_block + (last_basic_block + 3) / 4;
394       VARRAY_GROW (basic_block_info, new_size);
395     }
396
397   /* Add the newly created block to the array.  */
398   BASIC_BLOCK (last_basic_block) = bb;
399
400   create_block_annotation (bb);
401
402   n_basic_blocks++;
403   last_basic_block++;
404
405   initialize_bb_rbi (bb);
406   return bb;
407 }
408
409
410 /*---------------------------------------------------------------------------
411                                  Edge creation
412 ---------------------------------------------------------------------------*/
413
414 /* Join all the blocks in the flowgraph.  */
415
416 static void
417 make_edges (void)
418 {
419   basic_block bb;
420
421   /* Create an edge from entry to the first block with executable
422      statements in it.  */
423   make_edge (ENTRY_BLOCK_PTR, BASIC_BLOCK (0), EDGE_FALLTHRU);
424
425   /* Traverse basic block array placing edges.  */
426   FOR_EACH_BB (bb)
427     {
428       tree first = first_stmt (bb);
429       tree last = last_stmt (bb);
430
431       if (first)
432         {
433           /* Edges for statements that always alter flow control.  */
434           if (is_ctrl_stmt (last))
435             make_ctrl_stmt_edges (bb);
436
437           /* Edges for statements that sometimes alter flow control.  */
438           if (is_ctrl_altering_stmt (last))
439             make_exit_edges (bb);
440         }
441
442       /* Finally, if no edges were created above, this is a regular
443          basic block that only needs a fallthru edge.  */
444       if (EDGE_COUNT (bb->succs) == 0)
445         make_edge (bb, bb->next_bb, EDGE_FALLTHRU);
446     }
447
448   /* We do not care about fake edges, so remove any that the CFG
449      builder inserted for completeness.  */
450   remove_fake_exit_edges ();
451
452   /* Clean up the graph and warn for unreachable code.  */
453   cleanup_tree_cfg ();
454 }
455
456
457 /* Create edges for control statement at basic block BB.  */
458
459 static void
460 make_ctrl_stmt_edges (basic_block bb)
461 {
462   tree last = last_stmt (bb);
463
464   gcc_assert (last);
465   switch (TREE_CODE (last))
466     {
467     case GOTO_EXPR:
468       make_goto_expr_edges (bb);
469       break;
470
471     case RETURN_EXPR:
472       make_edge (bb, EXIT_BLOCK_PTR, 0);
473       break;
474
475     case COND_EXPR:
476       make_cond_expr_edges (bb);
477       break;
478
479     case SWITCH_EXPR:
480       make_switch_expr_edges (bb);
481       break;
482
483     case RESX_EXPR:
484       make_eh_edges (last);
485       /* Yet another NORETURN hack.  */
486       if (EDGE_COUNT (bb->succs) == 0)
487         make_edge (bb, EXIT_BLOCK_PTR, EDGE_FAKE);
488       break;
489
490     default:
491       gcc_unreachable ();
492     }
493 }
494
495
496 /* Create exit edges for statements in block BB that alter the flow of
497    control.  Statements that alter the control flow are 'goto', 'return'
498    and calls to non-returning functions.  */
499
500 static void
501 make_exit_edges (basic_block bb)
502 {
503   tree last = last_stmt (bb), op;
504
505   gcc_assert (last);
506   switch (TREE_CODE (last))
507     {
508     case CALL_EXPR:
509       /* If this function receives a nonlocal goto, then we need to
510          make edges from this call site to all the nonlocal goto
511          handlers.  */
512       if (TREE_SIDE_EFFECTS (last)
513           && current_function_has_nonlocal_label)
514         make_goto_expr_edges (bb);
515
516       /* If this statement has reachable exception handlers, then
517          create abnormal edges to them.  */
518       make_eh_edges (last);
519
520       /* Some calls are known not to return.  For such calls we create
521          a fake edge.
522
523          We really need to revamp how we build edges so that it's not
524          such a bloody pain to avoid creating edges for this case since
525          all we do is remove these edges when we're done building the
526          CFG.  */
527       if (call_expr_flags (last) & (ECF_NORETURN | ECF_LONGJMP))
528         {
529           make_edge (bb, EXIT_BLOCK_PTR, EDGE_FAKE);
530           return;
531         }
532
533       /* Don't forget the fall-thru edge.  */
534       make_edge (bb, bb->next_bb, EDGE_FALLTHRU);
535       break;
536
537     case MODIFY_EXPR:
538       /* A MODIFY_EXPR may have a CALL_EXPR on its RHS and the CALL_EXPR
539          may have an abnormal edge.  Search the RHS for this case and
540          create any required edges.  */
541       op = get_call_expr_in (last);
542       if (op && TREE_SIDE_EFFECTS (op)
543           && current_function_has_nonlocal_label)
544         make_goto_expr_edges (bb);
545
546       make_eh_edges (last);
547       make_edge (bb, bb->next_bb, EDGE_FALLTHRU);
548       break;
549
550     default:
551       gcc_unreachable ();
552     }
553 }
554
555
556 /* Create the edges for a COND_EXPR starting at block BB.
557    At this point, both clauses must contain only simple gotos.  */
558
559 static void
560 make_cond_expr_edges (basic_block bb)
561 {
562   tree entry = last_stmt (bb);
563   basic_block then_bb, else_bb;
564   tree then_label, else_label;
565
566   gcc_assert (entry);
567   gcc_assert (TREE_CODE (entry) == COND_EXPR);
568
569   /* Entry basic blocks for each component.  */
570   then_label = GOTO_DESTINATION (COND_EXPR_THEN (entry));
571   else_label = GOTO_DESTINATION (COND_EXPR_ELSE (entry));
572   then_bb = label_to_block (then_label);
573   else_bb = label_to_block (else_label);
574
575   make_edge (bb, then_bb, EDGE_TRUE_VALUE);
576   make_edge (bb, else_bb, EDGE_FALSE_VALUE);
577 }
578
579
580 /* Create the edges for a SWITCH_EXPR starting at block BB.
581    At this point, the switch body has been lowered and the
582    SWITCH_LABELS filled in, so this is in effect a multi-way branch.  */
583
584 static void
585 make_switch_expr_edges (basic_block bb)
586 {
587   tree entry = last_stmt (bb);
588   size_t i, n;
589   tree vec;
590
591   vec = SWITCH_LABELS (entry);
592   n = TREE_VEC_LENGTH (vec);
593
594   for (i = 0; i < n; ++i)
595     {
596       tree lab = CASE_LABEL (TREE_VEC_ELT (vec, i));
597       basic_block label_bb = label_to_block (lab);
598       make_edge (bb, label_bb, 0);
599     }
600 }
601
602
603 /* Return the basic block holding label DEST.  */
604
605 basic_block
606 label_to_block (tree dest)
607 {
608   int uid = LABEL_DECL_UID (dest);
609
610   /* We would die hard when faced by undefined label.  Emit label to
611      very first basic block.  This will hopefully make even the dataflow
612      and undefined variable warnings quite right.  */
613   if ((errorcount || sorrycount) && uid < 0)
614     {
615       block_stmt_iterator bsi = bsi_start (BASIC_BLOCK (0));
616       tree stmt;
617
618       stmt = build1 (LABEL_EXPR, void_type_node, dest);
619       bsi_insert_before (&bsi, stmt, BSI_NEW_STMT);
620       uid = LABEL_DECL_UID (dest);
621     }
622   return VARRAY_BB (label_to_block_map, uid);
623 }
624
625
626 /* Create edges for a goto statement at block BB.  */
627
628 static void
629 make_goto_expr_edges (basic_block bb)
630 {
631   tree goto_t, dest;
632   basic_block target_bb;
633   int for_call;
634   block_stmt_iterator last = bsi_last (bb);
635
636   goto_t = bsi_stmt (last);
637
638   /* If the last statement is not a GOTO (i.e., it is a RETURN_EXPR,
639      CALL_EXPR or MODIFY_EXPR), then the edge is an abnormal edge resulting
640      from a nonlocal goto.  */
641   if (TREE_CODE (goto_t) != GOTO_EXPR)
642     {
643       dest = error_mark_node;
644       for_call = 1;
645     }
646   else
647     {
648       dest = GOTO_DESTINATION (goto_t);
649       for_call = 0;
650
651       /* A GOTO to a local label creates normal edges.  */
652       if (simple_goto_p (goto_t))
653         {
654           edge e = make_edge (bb, label_to_block (dest), EDGE_FALLTHRU);
655 #ifdef USE_MAPPED_LOCATION
656           e->goto_locus = EXPR_LOCATION (goto_t);
657 #else
658           e->goto_locus = EXPR_LOCUS (goto_t);
659 #endif
660           bsi_remove (&last);
661           return;
662         }
663
664       /* Nothing more to do for nonlocal gotos.  */
665       if (TREE_CODE (dest) == LABEL_DECL)
666         return;
667
668       /* Computed gotos remain.  */
669     }
670
671   /* Look for the block starting with the destination label.  In the
672      case of a computed goto, make an edge to any label block we find
673      in the CFG.  */
674   FOR_EACH_BB (target_bb)
675     {
676       block_stmt_iterator bsi;
677
678       for (bsi = bsi_start (target_bb); !bsi_end_p (bsi); bsi_next (&bsi))
679         {
680           tree target = bsi_stmt (bsi);
681
682           if (TREE_CODE (target) != LABEL_EXPR)
683             break;
684
685           if (
686               /* Computed GOTOs.  Make an edge to every label block that has
687                  been marked as a potential target for a computed goto.  */
688               (FORCED_LABEL (LABEL_EXPR_LABEL (target)) && for_call == 0)
689               /* Nonlocal GOTO target.  Make an edge to every label block
690                  that has been marked as a potential target for a nonlocal
691                  goto.  */
692               || (DECL_NONLOCAL (LABEL_EXPR_LABEL (target)) && for_call == 1))
693             {
694               make_edge (bb, target_bb, EDGE_ABNORMAL);
695               break;
696             }
697         }
698     }
699
700   /* Degenerate case of computed goto with no labels.  */
701   if (!for_call && EDGE_COUNT (bb->succs) == 0)
702     make_edge (bb, EXIT_BLOCK_PTR, EDGE_FAKE);
703 }
704
705
706 /*---------------------------------------------------------------------------
707                                Flowgraph analysis
708 ---------------------------------------------------------------------------*/
709
710 /* Remove unreachable blocks and other miscellaneous clean up work.  */
711
712 bool
713 cleanup_tree_cfg (void)
714 {
715   bool something_changed = true;
716   bool retval = false;
717
718   timevar_push (TV_TREE_CLEANUP_CFG);
719
720   /* These three transformations can cascade, so we iterate on them until
721      nothing changes.  */
722   while (something_changed)
723     {
724       something_changed = cleanup_control_flow ();
725       something_changed |= delete_unreachable_blocks ();
726       something_changed |= thread_jumps ();
727       retval |= something_changed;
728     }
729
730   /* Merging the blocks creates no new opportunities for the other
731      optimizations, so do it here.  */
732   merge_seq_blocks ();
733
734   compact_blocks ();
735
736 #ifdef ENABLE_CHECKING
737   verify_flow_info ();
738 #endif
739   timevar_pop (TV_TREE_CLEANUP_CFG);
740   return retval;
741 }
742
743
744 /* Cleanup useless labels in basic blocks.  This is something we wish
745    to do early because it allows us to group case labels before creating
746    the edges for the CFG, and it speeds up block statement iterators in
747    all passes later on.
748    We only run this pass once, running it more than once is probably not
749    profitable.  */
750
751 /* A map from basic block index to the leading label of that block.  */
752 static tree *label_for_bb;
753
754 /* Callback for for_each_eh_region.  Helper for cleanup_dead_labels.  */
755 static void
756 update_eh_label (struct eh_region *region)
757 {
758   tree old_label = get_eh_region_tree_label (region);
759   if (old_label)
760     {
761       tree new_label;
762       basic_block bb = label_to_block (old_label);
763
764       /* ??? After optimizing, there may be EH regions with labels
765          that have already been removed from the function body, so
766          there is no basic block for them.  */
767       if (! bb)
768         return;
769
770       new_label = label_for_bb[bb->index];
771       set_eh_region_tree_label (region, new_label);
772     }
773 }
774
775 /* Given LABEL return the first label in the same basic block.  */
776 static tree
777 main_block_label (tree label)
778 {
779   basic_block bb = label_to_block (label);
780
781   /* label_to_block possibly inserted undefined label into the chain.  */
782   if (!label_for_bb[bb->index])
783     label_for_bb[bb->index] = label;
784   return label_for_bb[bb->index];
785 }
786
787 /* Cleanup redundant labels.  This is a three-steo process:
788      1) Find the leading label for each block.
789      2) Redirect all references to labels to the leading labels.
790      3) Cleanup all useless labels.  */
791
792 void
793 cleanup_dead_labels (void)
794 {
795   basic_block bb;
796   label_for_bb = xcalloc (last_basic_block, sizeof (tree));
797
798   /* Find a suitable label for each block.  We use the first user-defined
799      label is there is one, or otherwise just the first label we see.  */
800   FOR_EACH_BB (bb)
801     {
802       block_stmt_iterator i;
803
804       for (i = bsi_start (bb); !bsi_end_p (i); bsi_next (&i))
805         {
806           tree label, stmt = bsi_stmt (i);
807
808           if (TREE_CODE (stmt) != LABEL_EXPR)
809             break;
810
811           label = LABEL_EXPR_LABEL (stmt);
812
813           /* If we have not yet seen a label for the current block,
814              remember this one and see if there are more labels.  */
815           if (! label_for_bb[bb->index])
816             {
817               label_for_bb[bb->index] = label;
818               continue;
819             }
820
821           /* If we did see a label for the current block already, but it
822              is an artificially created label, replace it if the current
823              label is a user defined label.  */
824           if (! DECL_ARTIFICIAL (label)
825               && DECL_ARTIFICIAL (label_for_bb[bb->index]))
826             {
827               label_for_bb[bb->index] = label;
828               break;
829             }
830         }
831     }
832
833   /* Now redirect all jumps/branches to the selected label.
834      First do so for each block ending in a control statement.  */
835   FOR_EACH_BB (bb)
836     {
837       tree stmt = last_stmt (bb);
838       if (!stmt)
839         continue;
840
841       switch (TREE_CODE (stmt))
842         {
843         case COND_EXPR:
844           {
845             tree true_branch, false_branch;
846
847             true_branch = COND_EXPR_THEN (stmt);
848             false_branch = COND_EXPR_ELSE (stmt);
849
850             GOTO_DESTINATION (true_branch)
851               = main_block_label (GOTO_DESTINATION (true_branch));
852             GOTO_DESTINATION (false_branch)
853               = main_block_label (GOTO_DESTINATION (false_branch));
854
855             break;
856           }
857   
858         case SWITCH_EXPR:
859           {
860             size_t i;
861             tree vec = SWITCH_LABELS (stmt);
862             size_t n = TREE_VEC_LENGTH (vec);
863   
864             /* Replace all destination labels.  */
865             for (i = 0; i < n; ++i)
866               CASE_LABEL (TREE_VEC_ELT (vec, i))
867                 = main_block_label (CASE_LABEL (TREE_VEC_ELT (vec, i)));
868   
869             break;
870           }
871
872         /* We have to handle GOTO_EXPRs until they're removed, and we don't
873            remove them until after we've created the CFG edges.  */
874         case GOTO_EXPR:
875           if (! computed_goto_p (stmt))
876             {
877               GOTO_DESTINATION (stmt)
878                 = main_block_label (GOTO_DESTINATION (stmt));
879               break;
880             }
881
882         default:
883           break;
884       }
885     }
886
887   for_each_eh_region (update_eh_label);
888
889   /* Finally, purge dead labels.  All user-defined labels and labels that
890      can be the target of non-local gotos are preserved.  */
891   FOR_EACH_BB (bb)
892     {
893       block_stmt_iterator i;
894       tree label_for_this_bb = label_for_bb[bb->index];
895
896       if (! label_for_this_bb)
897         continue;
898
899       for (i = bsi_start (bb); !bsi_end_p (i); )
900         {
901           tree label, stmt = bsi_stmt (i);
902
903           if (TREE_CODE (stmt) != LABEL_EXPR)
904             break;
905
906           label = LABEL_EXPR_LABEL (stmt);
907
908           if (label == label_for_this_bb
909               || ! DECL_ARTIFICIAL (label)
910               || DECL_NONLOCAL (label))
911             bsi_next (&i);
912           else
913             bsi_remove (&i);
914         }
915     }
916
917   free (label_for_bb);
918 }
919
920 /* Look for blocks ending in a multiway branch (a SWITCH_EXPR in GIMPLE),
921    and scan the sorted vector of cases.  Combine the ones jumping to the
922    same label.
923    Eg. three separate entries 1: 2: 3: become one entry 1..3:  */
924
925 void
926 group_case_labels (void)
927 {
928   basic_block bb;
929
930   FOR_EACH_BB (bb)
931     {
932       tree stmt = last_stmt (bb);
933       if (stmt && TREE_CODE (stmt) == SWITCH_EXPR)
934         {
935           tree labels = SWITCH_LABELS (stmt);
936           int old_size = TREE_VEC_LENGTH (labels);
937           int i, j, new_size = old_size;
938           tree default_label = TREE_VEC_ELT (labels, old_size - 1);
939
940           /* Look for possible opportunities to merge cases.
941              Ignore the last element of the label vector because it
942              must be the default case.  */
943           i = 0;
944           while (i < old_size - 2)
945             {
946               tree base_case, base_label, base_high, type;
947               base_case = TREE_VEC_ELT (labels, i);
948
949               gcc_assert (base_case);
950               base_label = CASE_LABEL (base_case);
951
952               /* Discard cases that have the same destination as the
953                  default case.  */
954               if (base_label == default_label)
955                 {
956                   TREE_VEC_ELT (labels, i) = NULL_TREE;
957                   i++;
958                   continue;
959                 }
960
961               type = TREE_TYPE (CASE_LOW (base_case));
962               base_high = CASE_HIGH (base_case) ?
963                 CASE_HIGH (base_case) : CASE_LOW (base_case);
964
965               /* Try to merge case labels.  Break out when we reach the end
966                  of the label vector or when we cannot merge the next case
967                  label with the current one.  */
968               while (i < old_size - 2)
969                 {
970                   tree merge_case = TREE_VEC_ELT (labels, ++i);
971                   tree merge_label = CASE_LABEL (merge_case);
972                   tree t = int_const_binop (PLUS_EXPR, base_high,
973                                             integer_one_node, 1);
974
975                   /* Merge the cases if they jump to the same place,
976                      and their ranges are consecutive.  */
977                   if (merge_label == base_label
978                       && tree_int_cst_equal (CASE_LOW (merge_case), t))
979                     {
980                       base_high = CASE_HIGH (merge_case) ?
981                         CASE_HIGH (merge_case) : CASE_LOW (merge_case);
982                       CASE_HIGH (base_case) = base_high;
983                       TREE_VEC_ELT (labels, i) = NULL_TREE;
984                       new_size--;
985                     }
986                   else
987                     break;
988                 }
989             }
990
991           /* Compress the case labels in the label vector, and adjust the
992              length of the vector.  */
993           for (i = 0, j = 0; i < new_size; i++)
994             {
995               while (! TREE_VEC_ELT (labels, j))
996                 j++;
997               TREE_VEC_ELT (labels, i) = TREE_VEC_ELT (labels, j++);
998             }
999           TREE_VEC_LENGTH (labels) = new_size;
1000         }
1001     }
1002 }
1003
1004 /* Checks whether we can merge block B into block A.  */
1005
1006 static bool
1007 tree_can_merge_blocks_p (basic_block a, basic_block b)
1008 {
1009   tree stmt;
1010   block_stmt_iterator bsi;
1011
1012   if (EDGE_COUNT (a->succs) != 1)
1013     return false;
1014
1015   if (EDGE_SUCC (a, 0)->flags & EDGE_ABNORMAL)
1016     return false;
1017
1018   if (EDGE_SUCC (a, 0)->dest != b)
1019     return false;
1020
1021   if (b == EXIT_BLOCK_PTR)
1022     return false;
1023   
1024   if (EDGE_COUNT (b->preds) > 1)
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 (EDGE_SUCC (a, 0)->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 (EDGE_COUNT (bb->preds) != 1
1653       || !(EDGE_PRED (bb, 0)->flags & (EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
1654     return;
1655
1656   cond = COND_EXPR_COND (last_stmt (EDGE_PRED (bb, 0)->src));
1657
1658   if (TREE_CODE (cond) == VAR_DECL || TREE_CODE (cond) == PARM_DECL)
1659     {
1660       var = cond;
1661       val = (EDGE_PRED (bb, 0)->flags & EDGE_FALSE_VALUE
1662              ? boolean_false_node : boolean_true_node);
1663     }
1664   else if (TREE_CODE (cond) == TRUTH_NOT_EXPR
1665            && (TREE_CODE (TREE_OPERAND (cond, 0)) == VAR_DECL
1666                || TREE_CODE (TREE_OPERAND (cond, 0)) == PARM_DECL))
1667     {
1668       var = TREE_OPERAND (cond, 0);
1669       val = (EDGE_PRED (bb, 0)->flags & EDGE_FALSE_VALUE
1670              ? boolean_true_node : boolean_false_node);
1671     }
1672   else
1673     {
1674       if (EDGE_PRED (bb, 0)->flags & EDGE_FALSE_VALUE)
1675         cond = invert_truthvalue (cond);
1676       if (TREE_CODE (cond) == EQ_EXPR
1677           && (TREE_CODE (TREE_OPERAND (cond, 0)) == VAR_DECL
1678               || TREE_CODE (TREE_OPERAND (cond, 0)) == PARM_DECL)
1679           && (TREE_CODE (TREE_OPERAND (cond, 1)) == VAR_DECL
1680               || TREE_CODE (TREE_OPERAND (cond, 1)) == PARM_DECL
1681               || TREE_CONSTANT (TREE_OPERAND (cond, 1))))
1682         {
1683           var = TREE_OPERAND (cond, 0);
1684           val = TREE_OPERAND (cond, 1);
1685         }
1686       else
1687         return;
1688     }
1689
1690   /* Only work for normal local variables.  */
1691   ann = var_ann (var);
1692   if (!ann
1693       || ann->may_aliases
1694       || TREE_ADDRESSABLE (var))
1695     return;
1696
1697   if (! TREE_CONSTANT (val))
1698     {
1699       ann = var_ann (val);
1700       if (!ann
1701           || ann->may_aliases
1702           || TREE_ADDRESSABLE (val))
1703         return;
1704     }
1705
1706   /* Ignore floating point variables, since comparison behaves weird for
1707      them.  */
1708   if (FLOAT_TYPE_P (TREE_TYPE (var)))
1709     return;
1710
1711   for (bsi = bsi_start (bb); !bsi_end_p (bsi);)
1712     {
1713       stmt = bsi_stmt (bsi);
1714
1715       /* If the THEN/ELSE clause merely assigns a value to a variable/parameter
1716          which is already known to contain that value, then remove the useless
1717          THEN/ELSE clause.  */
1718       if (TREE_CODE (stmt) == MODIFY_EXPR
1719           && TREE_OPERAND (stmt, 0) == var
1720           && operand_equal_p (val, TREE_OPERAND (stmt, 1), 0))
1721         {
1722           bsi_remove (&bsi);
1723           continue;
1724         }
1725
1726       /* Invalidate the var if we encounter something that could modify it.
1727          Likewise for the value it was previously set to.  Note that we only
1728          consider values that are either a VAR_DECL or PARM_DECL so we
1729          can test for conflict very simply.  */
1730       if (TREE_CODE (stmt) == ASM_EXPR
1731           || (TREE_CODE (stmt) == MODIFY_EXPR
1732               && (TREE_OPERAND (stmt, 0) == var
1733                   || TREE_OPERAND (stmt, 0) == val)))
1734         return;
1735   
1736       bsi_next (&bsi);
1737     }
1738 }
1739
1740
1741 /* A CFG-aware version of remove_useless_stmts.  */
1742
1743 void
1744 cfg_remove_useless_stmts (void)
1745 {
1746   basic_block bb;
1747
1748 #ifdef ENABLE_CHECKING
1749   verify_flow_info ();
1750 #endif
1751
1752   FOR_EACH_BB (bb)
1753     {
1754       cfg_remove_useless_stmts_bb (bb);
1755     }
1756 }
1757
1758
1759 /* Remove PHI nodes associated with basic block BB and all edges out of BB.  */
1760
1761 static void
1762 remove_phi_nodes_and_edges_for_unreachable_block (basic_block bb)
1763 {
1764   tree phi;
1765
1766   /* Since this block is no longer reachable, we can just delete all
1767      of its PHI nodes.  */
1768   phi = phi_nodes (bb);
1769   while (phi)
1770     {
1771       tree next = PHI_CHAIN (phi);
1772       remove_phi_node (phi, NULL_TREE, bb);
1773       phi = next;
1774     }
1775
1776   /* Remove edges to BB's successors.  */
1777   while (EDGE_COUNT (bb->succs) > 0)
1778     ssa_remove_edge (EDGE_SUCC (bb, 0));
1779 }
1780
1781
1782 /* Remove statements of basic block BB.  */
1783
1784 static void
1785 remove_bb (basic_block bb)
1786 {
1787   block_stmt_iterator i;
1788   source_locus loc = 0;
1789
1790   if (dump_file)
1791     {
1792       fprintf (dump_file, "Removing basic block %d\n", bb->index);
1793       if (dump_flags & TDF_DETAILS)
1794         {
1795           dump_bb (bb, dump_file, 0);
1796           fprintf (dump_file, "\n");
1797         }
1798     }
1799
1800   /* Remove all the instructions in the block.  */
1801   for (i = bsi_start (bb); !bsi_end_p (i); bsi_remove (&i))
1802     {
1803       tree stmt = bsi_stmt (i);
1804       release_defs (stmt);
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       || EDGE_COUNT (bb->succs) != 1
1861       || EDGE_SUCC (bb, 0)->dest == EXIT_BLOCK_PTR
1862       || (EDGE_SUCC (bb, 0)->flags & EDGE_ABNORMAL) != 0
1863       || phi_nodes (bb)
1864       || phi_nodes (EDGE_SUCC (bb, 0)->dest))
1865     return NULL;
1866
1867   /* Walk past any labels at the start of this block.  */
1868   for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
1869     {
1870       stmt = bsi_stmt (bsi);
1871       if (TREE_CODE (stmt) != LABEL_EXPR)
1872         break;
1873     }
1874
1875   /* If we reached the end of this block we may be able to optimize this
1876      case.  */
1877   if (bsi_end_p (bsi))
1878     {
1879       edge dest;
1880
1881       /* Recursive call to pick up chains of forwarding blocks.  */
1882       dest = tree_block_forwards_to (EDGE_SUCC (bb, 0)->dest);
1883
1884       /* If none found, we forward to bb->succs[0] at minimum.  */
1885       if (!dest)
1886         dest = EDGE_SUCC (bb, 0);
1887
1888       ann->forwardable = 1;
1889       return dest;
1890     }
1891
1892   /* No forwarding possible.  */
1893   return NULL;
1894 }
1895
1896
1897 /* Try to remove superfluous control structures.  */
1898
1899 static bool
1900 cleanup_control_flow (void)
1901 {
1902   basic_block bb;
1903   block_stmt_iterator bsi;
1904   bool retval = false;
1905   tree stmt;
1906
1907   FOR_EACH_BB (bb)
1908     {
1909       bsi = bsi_last (bb);
1910
1911       if (bsi_end_p (bsi))
1912         continue;
1913       
1914       stmt = bsi_stmt (bsi);
1915       if (TREE_CODE (stmt) == COND_EXPR
1916           || TREE_CODE (stmt) == SWITCH_EXPR)
1917         retval |= cleanup_control_expr_graph (bb, bsi);
1918     }
1919   return retval;
1920 }
1921
1922
1923 /* Disconnect an unreachable block in the control expression starting
1924    at block BB.  */
1925
1926 static bool
1927 cleanup_control_expr_graph (basic_block bb, block_stmt_iterator bsi)
1928 {
1929   edge taken_edge;
1930   bool retval = false;
1931   tree expr = bsi_stmt (bsi), val;
1932
1933   if (EDGE_COUNT (bb->succs) > 1)
1934     {
1935       edge e;
1936       edge_iterator ei;
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 (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
1960         {
1961           if (e != taken_edge)
1962             {
1963               taken_edge->probability += e->probability;
1964               taken_edge->count += e->count;
1965               ssa_remove_edge (e);
1966               retval = true;
1967             }
1968           else
1969             ei_next (&ei);
1970         }
1971       if (taken_edge->probability > REG_BR_PROB_BASE)
1972         taken_edge->probability = REG_BR_PROB_BASE;
1973     }
1974   else
1975     taken_edge = EDGE_SUCC (bb, 0);
1976
1977   bsi_remove (&bsi);
1978   taken_edge->flags = EDGE_FALLTHRU;
1979
1980   /* We removed some paths from the cfg.  */
1981   if (dom_computed[CDI_DOMINATORS] >= DOM_CONS_OK)
1982     dom_computed[CDI_DOMINATORS] = DOM_CONS_OK;
1983
1984   return retval;
1985 }
1986
1987
1988 /* Given a control block BB and a predicate VAL, return the edge that
1989    will be taken out of the block.  If VAL does not match a unique
1990    edge, NULL is returned.  */
1991
1992 edge
1993 find_taken_edge (basic_block bb, tree val)
1994 {
1995   tree stmt;
1996
1997   stmt = last_stmt (bb);
1998
1999   gcc_assert (stmt);
2000   gcc_assert (is_ctrl_stmt (stmt));
2001
2002   /* If VAL is a predicate of the form N RELOP N, where N is an
2003      SSA_NAME, we can usually determine its truth value.  */
2004   if (val && COMPARISON_CLASS_P (val))
2005     val = fold (val);
2006
2007   /* If VAL is not a constant, we can't determine which edge might
2008      be taken.  */
2009   if (val == NULL || !really_constant_p (val))
2010     return NULL;
2011
2012   if (TREE_CODE (stmt) == COND_EXPR)
2013     return find_taken_edge_cond_expr (bb, val);
2014
2015   if (TREE_CODE (stmt) == SWITCH_EXPR)
2016     return find_taken_edge_switch_expr (bb, val);
2017
2018   return EDGE_SUCC (bb, 0);
2019 }
2020
2021
2022 /* Given a constant value VAL and the entry block BB to a COND_EXPR
2023    statement, determine which of the two edges will be taken out of the
2024    block.  Return NULL if either edge may be taken.  */
2025
2026 static edge
2027 find_taken_edge_cond_expr (basic_block bb, tree val)
2028 {
2029   edge true_edge, false_edge;
2030
2031   extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
2032
2033   /* If both edges of the branch lead to the same basic block, it doesn't
2034      matter which edge is taken.  */
2035   if (true_edge->dest == false_edge->dest)
2036     return true_edge;
2037
2038   /* Otherwise, try to determine which branch of the if() will be taken.
2039      If VAL is a constant but it can't be reduced to a 0 or a 1, then
2040      we don't really know which edge will be taken at runtime.  This
2041      may happen when comparing addresses (e.g., if (&var1 == 4)).  */
2042   if (integer_nonzerop (val))
2043     return true_edge;
2044   else if (integer_zerop (val))
2045     return false_edge;
2046   else
2047     return NULL;
2048 }
2049
2050
2051 /* Given a constant value VAL and the entry block BB to a SWITCH_EXPR
2052    statement, determine which edge will be taken out of the block.  Return
2053    NULL if any edge may be taken.  */
2054
2055 static edge
2056 find_taken_edge_switch_expr (basic_block bb, tree val)
2057 {
2058   tree switch_expr, taken_case;
2059   basic_block dest_bb;
2060   edge e;
2061
2062   if (TREE_CODE (val) != INTEGER_CST)
2063     return NULL;
2064
2065   switch_expr = last_stmt (bb);
2066   taken_case = find_case_label_for_value (switch_expr, val);
2067   dest_bb = label_to_block (CASE_LABEL (taken_case));
2068
2069   e = find_edge (bb, dest_bb);
2070   gcc_assert (e);
2071   return e;
2072 }
2073
2074
2075 /* Return the CASE_LABEL_EXPR that SWITCH_EXPR will take for VAL.
2076    We can make optimal use here of the fact that the case labels are
2077    sorted: We can do a binary search for a case matching VAL.  */
2078
2079 static tree
2080 find_case_label_for_value (tree switch_expr, tree val)
2081 {
2082   tree vec = SWITCH_LABELS (switch_expr);
2083   size_t low, high, n = TREE_VEC_LENGTH (vec);
2084   tree default_case = TREE_VEC_ELT (vec, n - 1);
2085
2086   for (low = -1, high = n - 1; high - low > 1; )
2087     {
2088       size_t i = (high + low) / 2;
2089       tree t = TREE_VEC_ELT (vec, i);
2090       int cmp;
2091
2092       /* Cache the result of comparing CASE_LOW and val.  */
2093       cmp = tree_int_cst_compare (CASE_LOW (t), val);
2094
2095       if (cmp > 0)
2096         high = i;
2097       else
2098         low = i;
2099
2100       if (CASE_HIGH (t) == NULL)
2101         {
2102           /* A singe-valued case label.  */
2103           if (cmp == 0)
2104             return t;
2105         }
2106       else
2107         {
2108           /* A case range.  We can only handle integer ranges.  */
2109           if (cmp <= 0 && tree_int_cst_compare (CASE_HIGH (t), val) >= 0)
2110             return t;
2111         }
2112     }
2113
2114   return default_case;
2115 }
2116
2117
2118 /* If all the PHI nodes in DEST have alternatives for E1 and E2 and
2119    those alternatives are equal in each of the PHI nodes, then return
2120    true, else return false.  */
2121
2122 static bool
2123 phi_alternatives_equal (basic_block dest, edge e1, edge e2)
2124 {
2125   tree phi, val1, val2;
2126   int n1, n2;
2127
2128   for (phi = phi_nodes (dest); phi; phi = PHI_CHAIN (phi))
2129     {
2130       n1 = phi_arg_from_edge (phi, e1);
2131       n2 = phi_arg_from_edge (phi, e2);
2132
2133       gcc_assert (n1 >= 0);
2134       gcc_assert (n2 >= 0);
2135
2136       val1 = PHI_ARG_DEF (phi, n1);
2137       val2 = PHI_ARG_DEF (phi, n2);
2138
2139       if (!operand_equal_p (val1, val2, 0))
2140         return false;
2141     }
2142
2143   return true;
2144 }
2145
2146
2147 /*---------------------------------------------------------------------------
2148                               Debugging functions
2149 ---------------------------------------------------------------------------*/
2150
2151 /* Dump tree-specific information of block BB to file OUTF.  */
2152
2153 void
2154 tree_dump_bb (basic_block bb, FILE *outf, int indent)
2155 {
2156   dump_generic_bb (outf, bb, indent, TDF_VOPS);
2157 }
2158
2159
2160 /* Dump a basic block on stderr.  */
2161
2162 void
2163 debug_tree_bb (basic_block bb)
2164 {
2165   dump_bb (bb, stderr, 0);
2166 }
2167
2168
2169 /* Dump basic block with index N on stderr.  */
2170
2171 basic_block
2172 debug_tree_bb_n (int n)
2173 {
2174   debug_tree_bb (BASIC_BLOCK (n));
2175   return BASIC_BLOCK (n);
2176 }        
2177
2178
2179 /* Dump the CFG on stderr.
2180
2181    FLAGS are the same used by the tree dumping functions
2182    (see TDF_* in tree.h).  */
2183
2184 void
2185 debug_tree_cfg (int flags)
2186 {
2187   dump_tree_cfg (stderr, flags);
2188 }
2189
2190
2191 /* Dump the program showing basic block boundaries on the given FILE.
2192
2193    FLAGS are the same used by the tree dumping functions (see TDF_* in
2194    tree.h).  */
2195
2196 void
2197 dump_tree_cfg (FILE *file, int flags)
2198 {
2199   if (flags & TDF_DETAILS)
2200     {
2201       const char *funcname
2202         = lang_hooks.decl_printable_name (current_function_decl, 2);
2203
2204       fputc ('\n', file);
2205       fprintf (file, ";; Function %s\n\n", funcname);
2206       fprintf (file, ";; \n%d basic blocks, %d edges, last basic block %d.\n\n",
2207                n_basic_blocks, n_edges, last_basic_block);
2208
2209       brief_dump_cfg (file);
2210       fprintf (file, "\n");
2211     }
2212
2213   if (flags & TDF_STATS)
2214     dump_cfg_stats (file);
2215
2216   dump_function_to_file (current_function_decl, file, flags | TDF_BLOCKS);
2217 }
2218
2219
2220 /* Dump CFG statistics on FILE.  */
2221
2222 void
2223 dump_cfg_stats (FILE *file)
2224 {
2225   static long max_num_merged_labels = 0;
2226   unsigned long size, total = 0;
2227   int n_edges;
2228   basic_block bb;
2229   const char * const fmt_str   = "%-30s%-13s%12s\n";
2230   const char * const fmt_str_1 = "%-30s%13d%11lu%c\n";
2231   const char * const fmt_str_3 = "%-43s%11lu%c\n";
2232   const char *funcname
2233     = lang_hooks.decl_printable_name (current_function_decl, 2);
2234
2235
2236   fprintf (file, "\nCFG Statistics for %s\n\n", funcname);
2237
2238   fprintf (file, "---------------------------------------------------------\n");
2239   fprintf (file, fmt_str, "", "  Number of  ", "Memory");
2240   fprintf (file, fmt_str, "", "  instances  ", "used ");
2241   fprintf (file, "---------------------------------------------------------\n");
2242
2243   size = n_basic_blocks * sizeof (struct basic_block_def);
2244   total += size;
2245   fprintf (file, fmt_str_1, "Basic blocks", n_basic_blocks,
2246            SCALE (size), LABEL (size));
2247
2248   n_edges = 0;
2249   FOR_EACH_BB (bb)
2250     n_edges += EDGE_COUNT (bb->succs);
2251   size = n_edges * sizeof (struct edge_def);
2252   total += size;
2253   fprintf (file, fmt_str_1, "Edges", n_edges, SCALE (size), LABEL (size));
2254
2255   size = n_basic_blocks * sizeof (struct bb_ann_d);
2256   total += size;
2257   fprintf (file, fmt_str_1, "Basic block annotations", n_basic_blocks,
2258            SCALE (size), LABEL (size));
2259
2260   fprintf (file, "---------------------------------------------------------\n");
2261   fprintf (file, fmt_str_3, "Total memory used by CFG data", SCALE (total),
2262            LABEL (total));
2263   fprintf (file, "---------------------------------------------------------\n");
2264   fprintf (file, "\n");
2265
2266   if (cfg_stats.num_merged_labels > max_num_merged_labels)
2267     max_num_merged_labels = cfg_stats.num_merged_labels;
2268
2269   fprintf (file, "Coalesced label blocks: %ld (Max so far: %ld)\n",
2270            cfg_stats.num_merged_labels, max_num_merged_labels);
2271
2272   fprintf (file, "\n");
2273 }
2274
2275
2276 /* Dump CFG statistics on stderr.  Keep extern so that it's always
2277    linked in the final executable.  */
2278
2279 void
2280 debug_cfg_stats (void)
2281 {
2282   dump_cfg_stats (stderr);
2283 }
2284
2285
2286 /* Dump the flowgraph to a .vcg FILE.  */
2287
2288 static void
2289 tree_cfg2vcg (FILE *file)
2290 {
2291   edge e;
2292   edge_iterator ei;
2293   basic_block bb;
2294   const char *funcname
2295     = lang_hooks.decl_printable_name (current_function_decl, 2);
2296
2297   /* Write the file header.  */
2298   fprintf (file, "graph: { title: \"%s\"\n", funcname);
2299   fprintf (file, "node: { title: \"ENTRY\" label: \"ENTRY\" }\n");
2300   fprintf (file, "node: { title: \"EXIT\" label: \"EXIT\" }\n");
2301
2302   /* Write blocks and edges.  */
2303   FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
2304     {
2305       fprintf (file, "edge: { sourcename: \"ENTRY\" targetname: \"%d\"",
2306                e->dest->index);
2307
2308       if (e->flags & EDGE_FAKE)
2309         fprintf (file, " linestyle: dotted priority: 10");
2310       else
2311         fprintf (file, " linestyle: solid priority: 100");
2312
2313       fprintf (file, " }\n");
2314     }
2315   fputc ('\n', file);
2316
2317   FOR_EACH_BB (bb)
2318     {
2319       enum tree_code head_code, end_code;
2320       const char *head_name, *end_name;
2321       int head_line = 0;
2322       int end_line = 0;
2323       tree first = first_stmt (bb);
2324       tree last = last_stmt (bb);
2325
2326       if (first)
2327         {
2328           head_code = TREE_CODE (first);
2329           head_name = tree_code_name[head_code];
2330           head_line = get_lineno (first);
2331         }
2332       else
2333         head_name = "no-statement";
2334
2335       if (last)
2336         {
2337           end_code = TREE_CODE (last);
2338           end_name = tree_code_name[end_code];
2339           end_line = get_lineno (last);
2340         }
2341       else
2342         end_name = "no-statement";
2343
2344       fprintf (file, "node: { title: \"%d\" label: \"#%d\\n%s (%d)\\n%s (%d)\"}\n",
2345                bb->index, bb->index, head_name, head_line, end_name,
2346                end_line);
2347
2348       FOR_EACH_EDGE (e, ei, bb->succs)
2349         {
2350           if (e->dest == EXIT_BLOCK_PTR)
2351             fprintf (file, "edge: { sourcename: \"%d\" targetname: \"EXIT\"", bb->index);
2352           else
2353             fprintf (file, "edge: { sourcename: \"%d\" targetname: \"%d\"", bb->index, e->dest->index);
2354
2355           if (e->flags & EDGE_FAKE)
2356             fprintf (file, " priority: 10 linestyle: dotted");
2357           else
2358             fprintf (file, " priority: 100 linestyle: solid");
2359
2360           fprintf (file, " }\n");
2361         }
2362
2363       if (bb->next_bb != EXIT_BLOCK_PTR)
2364         fputc ('\n', file);
2365     }
2366
2367   fputs ("}\n\n", file);
2368 }
2369
2370
2371
2372 /*---------------------------------------------------------------------------
2373                              Miscellaneous helpers
2374 ---------------------------------------------------------------------------*/
2375
2376 /* Return true if T represents a stmt that always transfers control.  */
2377
2378 bool
2379 is_ctrl_stmt (tree t)
2380 {
2381   return (TREE_CODE (t) == COND_EXPR
2382           || TREE_CODE (t) == SWITCH_EXPR
2383           || TREE_CODE (t) == GOTO_EXPR
2384           || TREE_CODE (t) == RETURN_EXPR
2385           || TREE_CODE (t) == RESX_EXPR);
2386 }
2387
2388
2389 /* Return true if T is a statement that may alter the flow of control
2390    (e.g., a call to a non-returning function).  */
2391
2392 bool
2393 is_ctrl_altering_stmt (tree t)
2394 {
2395   tree call;
2396
2397   gcc_assert (t);
2398   call = get_call_expr_in (t);
2399   if (call)
2400     {
2401       /* A non-pure/const CALL_EXPR alters flow control if the current
2402          function has nonlocal labels.  */
2403       if (TREE_SIDE_EFFECTS (call) && current_function_has_nonlocal_label)
2404         return true;
2405
2406       /* A CALL_EXPR also alters control flow if it does not return.  */
2407       if (call_expr_flags (call) & (ECF_NORETURN | ECF_LONGJMP))
2408         return true;
2409     }
2410
2411   /* If a statement can throw, it alters control flow.  */
2412   return tree_can_throw_internal (t);
2413 }
2414
2415
2416 /* Return true if T is a computed goto.  */
2417
2418 bool
2419 computed_goto_p (tree t)
2420 {
2421   return (TREE_CODE (t) == GOTO_EXPR
2422           && TREE_CODE (GOTO_DESTINATION (t)) != LABEL_DECL);
2423 }
2424
2425
2426 /* Checks whether EXPR is a simple local goto.  */
2427
2428 bool
2429 simple_goto_p (tree expr)
2430 {
2431   return (TREE_CODE (expr) == GOTO_EXPR
2432           && TREE_CODE (GOTO_DESTINATION (expr)) == LABEL_DECL);
2433 }
2434
2435
2436 /* Return true if T should start a new basic block.  PREV_T is the
2437    statement preceding T.  It is used when T is a label or a case label.
2438    Labels should only start a new basic block if their previous statement
2439    wasn't a label.  Otherwise, sequence of labels would generate
2440    unnecessary basic blocks that only contain a single label.  */
2441
2442 static inline bool
2443 stmt_starts_bb_p (tree t, tree prev_t)
2444 {
2445   enum tree_code code;
2446
2447   if (t == NULL_TREE)
2448     return false;
2449
2450   /* LABEL_EXPRs start a new basic block only if the preceding
2451      statement wasn't a label of the same type.  This prevents the
2452      creation of consecutive blocks that have nothing but a single
2453      label.  */
2454   code = TREE_CODE (t);
2455   if (code == LABEL_EXPR)
2456     {
2457       /* Nonlocal and computed GOTO targets always start a new block.  */
2458       if (code == LABEL_EXPR
2459           && (DECL_NONLOCAL (LABEL_EXPR_LABEL (t))
2460               || FORCED_LABEL (LABEL_EXPR_LABEL (t))))
2461         return true;
2462
2463       if (prev_t && TREE_CODE (prev_t) == code)
2464         {
2465           if (DECL_NONLOCAL (LABEL_EXPR_LABEL (prev_t)))
2466             return true;
2467
2468           cfg_stats.num_merged_labels++;
2469           return false;
2470         }
2471       else
2472         return true;
2473     }
2474
2475   return false;
2476 }
2477
2478
2479 /* Return true if T should end a basic block.  */
2480
2481 bool
2482 stmt_ends_bb_p (tree t)
2483 {
2484   return is_ctrl_stmt (t) || is_ctrl_altering_stmt (t);
2485 }
2486
2487
2488 /* Add gotos that used to be represented implicitly in the CFG.  */
2489
2490 void
2491 disband_implicit_edges (void)
2492 {
2493   basic_block bb;
2494   block_stmt_iterator last;
2495   edge e;
2496   edge_iterator ei;
2497   tree stmt, label;
2498
2499   FOR_EACH_BB (bb)
2500     {
2501       last = bsi_last (bb);
2502       stmt = last_stmt (bb);
2503
2504       if (stmt && TREE_CODE (stmt) == COND_EXPR)
2505         {
2506           /* Remove superfluous gotos from COND_EXPR branches.  Moved
2507              from cfg_remove_useless_stmts here since it violates the
2508              invariants for tree--cfg correspondence and thus fits better
2509              here where we do it anyway.  */
2510           FOR_EACH_EDGE (e, ei, bb->succs)
2511             {
2512               if (e->dest != bb->next_bb)
2513                 continue;
2514
2515               if (e->flags & EDGE_TRUE_VALUE)
2516                 COND_EXPR_THEN (stmt) = build_empty_stmt ();
2517               else if (e->flags & EDGE_FALSE_VALUE)
2518                 COND_EXPR_ELSE (stmt) = build_empty_stmt ();
2519               else
2520                 gcc_unreachable ();
2521               e->flags |= EDGE_FALLTHRU;
2522             }
2523
2524           continue;
2525         }
2526
2527       if (stmt && TREE_CODE (stmt) == RETURN_EXPR)
2528         {
2529           /* Remove the RETURN_EXPR if we may fall though to the exit
2530              instead.  */
2531           gcc_assert (EDGE_COUNT (bb->succs) == 1);
2532           gcc_assert (EDGE_SUCC (bb, 0)->dest == EXIT_BLOCK_PTR);
2533
2534           if (bb->next_bb == EXIT_BLOCK_PTR
2535               && !TREE_OPERAND (stmt, 0))
2536             {
2537               bsi_remove (&last);
2538               EDGE_SUCC (bb, 0)->flags |= EDGE_FALLTHRU;
2539             }
2540           continue;
2541         }
2542
2543       /* There can be no fallthru edge if the last statement is a control
2544          one.  */
2545       if (stmt && is_ctrl_stmt (stmt))
2546         continue;
2547
2548       /* Find a fallthru edge and emit the goto if necessary.  */
2549       FOR_EACH_EDGE (e, ei, bb->succs)
2550         if (e->flags & EDGE_FALLTHRU)
2551           break;
2552
2553       if (!e || e->dest == bb->next_bb)
2554         continue;
2555
2556       gcc_assert (e->dest != EXIT_BLOCK_PTR);
2557       label = tree_block_label (e->dest);
2558
2559       stmt = build1 (GOTO_EXPR, void_type_node, label);
2560 #ifdef USE_MAPPED_LOCATION
2561       SET_EXPR_LOCATION (stmt, e->goto_locus);
2562 #else
2563       SET_EXPR_LOCUS (stmt, e->goto_locus);
2564 #endif
2565       bsi_insert_after (&last, stmt, BSI_NEW_STMT);
2566       e->flags &= ~EDGE_FALLTHRU;
2567     }
2568 }
2569
2570 /* Remove block annotations and other datastructures.  */
2571
2572 void
2573 delete_tree_cfg_annotations (void)
2574 {
2575   basic_block bb;
2576   if (n_basic_blocks > 0)
2577     free_blocks_annotations ();
2578
2579   label_to_block_map = NULL;
2580   free_rbi_pool ();
2581   FOR_EACH_BB (bb)
2582     bb->rbi = NULL;
2583 }
2584
2585
2586 /* Return the first statement in basic block BB.  */
2587
2588 tree
2589 first_stmt (basic_block bb)
2590 {
2591   block_stmt_iterator i = bsi_start (bb);
2592   return !bsi_end_p (i) ? bsi_stmt (i) : NULL_TREE;
2593 }
2594
2595
2596 /* Return the last statement in basic block BB.  */
2597
2598 tree
2599 last_stmt (basic_block bb)
2600 {
2601   block_stmt_iterator b = bsi_last (bb);
2602   return !bsi_end_p (b) ? bsi_stmt (b) : NULL_TREE;
2603 }
2604
2605
2606 /* Return a pointer to the last statement in block BB.  */
2607
2608 tree *
2609 last_stmt_ptr (basic_block bb)
2610 {
2611   block_stmt_iterator last = bsi_last (bb);
2612   return !bsi_end_p (last) ? bsi_stmt_ptr (last) : NULL;
2613 }
2614
2615
2616 /* Return the last statement of an otherwise empty block.  Return NULL
2617    if the block is totally empty, or if it contains more than one
2618    statement.  */
2619
2620 tree
2621 last_and_only_stmt (basic_block bb)
2622 {
2623   block_stmt_iterator i = bsi_last (bb);
2624   tree last, prev;
2625
2626   if (bsi_end_p (i))
2627     return NULL_TREE;
2628
2629   last = bsi_stmt (i);
2630   bsi_prev (&i);
2631   if (bsi_end_p (i))
2632     return last;
2633
2634   /* Empty statements should no longer appear in the instruction stream.
2635      Everything that might have appeared before should be deleted by
2636      remove_useless_stmts, and the optimizers should just bsi_remove
2637      instead of smashing with build_empty_stmt.
2638
2639      Thus the only thing that should appear here in a block containing
2640      one executable statement is a label.  */
2641   prev = bsi_stmt (i);
2642   if (TREE_CODE (prev) == LABEL_EXPR)
2643     return last;
2644   else
2645     return NULL_TREE;
2646 }
2647
2648
2649 /* Mark BB as the basic block holding statement T.  */
2650
2651 void
2652 set_bb_for_stmt (tree t, basic_block bb)
2653 {
2654   if (TREE_CODE (t) == PHI_NODE)
2655     PHI_BB (t) = bb;
2656   else if (TREE_CODE (t) == STATEMENT_LIST)
2657     {
2658       tree_stmt_iterator i;
2659       for (i = tsi_start (t); !tsi_end_p (i); tsi_next (&i))
2660         set_bb_for_stmt (tsi_stmt (i), bb);
2661     }
2662   else
2663     {
2664       stmt_ann_t ann = get_stmt_ann (t);
2665       ann->bb = bb;
2666
2667       /* If the statement is a label, add the label to block-to-labels map
2668          so that we can speed up edge creation for GOTO_EXPRs.  */
2669       if (TREE_CODE (t) == LABEL_EXPR)
2670         {
2671           int uid;
2672
2673           t = LABEL_EXPR_LABEL (t);
2674           uid = LABEL_DECL_UID (t);
2675           if (uid == -1)
2676             {
2677               LABEL_DECL_UID (t) = uid = cfun->last_label_uid++;
2678               if (VARRAY_SIZE (label_to_block_map) <= (unsigned) uid)
2679                 VARRAY_GROW (label_to_block_map, 3 * uid / 2);
2680             }
2681           else
2682             /* We're moving an existing label.  Make sure that we've
2683                 removed it from the old block.  */
2684             gcc_assert (!bb || !VARRAY_BB (label_to_block_map, uid));
2685           VARRAY_BB (label_to_block_map, uid) = bb;
2686         }
2687     }
2688 }
2689
2690 /* Finds iterator for STMT.  */
2691
2692 extern block_stmt_iterator
2693 stmt_for_bsi (tree stmt)
2694 {
2695   block_stmt_iterator bsi;
2696
2697   for (bsi = bsi_start (bb_for_stmt (stmt)); !bsi_end_p (bsi); bsi_next (&bsi))
2698     if (bsi_stmt (bsi) == stmt)
2699       return bsi;
2700
2701   gcc_unreachable ();
2702 }
2703
2704 /* Insert statement (or statement list) T before the statement
2705    pointed-to by iterator I.  M specifies how to update iterator I
2706    after insertion (see enum bsi_iterator_update).  */
2707
2708 void
2709 bsi_insert_before (block_stmt_iterator *i, tree t, enum bsi_iterator_update m)
2710 {
2711   set_bb_for_stmt (t, i->bb);
2712   tsi_link_before (&i->tsi, t, m);
2713   modify_stmt (t);
2714 }
2715
2716
2717 /* Insert statement (or statement list) T after the statement
2718    pointed-to by iterator I.  M specifies how to update iterator I
2719    after insertion (see enum bsi_iterator_update).  */
2720
2721 void
2722 bsi_insert_after (block_stmt_iterator *i, tree t, enum bsi_iterator_update m)
2723 {
2724   set_bb_for_stmt (t, i->bb);
2725   tsi_link_after (&i->tsi, t, m);
2726   modify_stmt (t);
2727 }
2728
2729
2730 /* Remove the statement pointed to by iterator I.  The iterator is updated
2731    to the next statement.  */
2732
2733 void
2734 bsi_remove (block_stmt_iterator *i)
2735 {
2736   tree t = bsi_stmt (*i);
2737   set_bb_for_stmt (t, NULL);
2738   tsi_delink (&i->tsi);
2739 }
2740
2741
2742 /* Move the statement at FROM so it comes right after the statement at TO.  */
2743
2744 void 
2745 bsi_move_after (block_stmt_iterator *from, block_stmt_iterator *to)
2746 {
2747   tree stmt = bsi_stmt (*from);
2748   bsi_remove (from);
2749   bsi_insert_after (to, stmt, BSI_SAME_STMT);
2750
2751
2752
2753 /* Move the statement at FROM so it comes right before the statement at TO.  */
2754
2755 void 
2756 bsi_move_before (block_stmt_iterator *from, block_stmt_iterator *to)
2757 {
2758   tree stmt = bsi_stmt (*from);
2759   bsi_remove (from);
2760   bsi_insert_before (to, stmt, BSI_SAME_STMT);
2761 }
2762
2763
2764 /* Move the statement at FROM to the end of basic block BB.  */
2765
2766 void
2767 bsi_move_to_bb_end (block_stmt_iterator *from, basic_block bb)
2768 {
2769   block_stmt_iterator last = bsi_last (bb);
2770   
2771   /* Have to check bsi_end_p because it could be an empty block.  */
2772   if (!bsi_end_p (last) && is_ctrl_stmt (bsi_stmt (last)))
2773     bsi_move_before (from, &last);
2774   else
2775     bsi_move_after (from, &last);
2776 }
2777
2778
2779 /* Replace the contents of the statement pointed to by iterator BSI
2780    with STMT.  If PRESERVE_EH_INFO is true, the exception handling
2781    information of the original statement is preserved.  */
2782
2783 void
2784 bsi_replace (const block_stmt_iterator *bsi, tree stmt, bool preserve_eh_info)
2785 {
2786   int eh_region;
2787   tree orig_stmt = bsi_stmt (*bsi);
2788
2789   SET_EXPR_LOCUS (stmt, EXPR_LOCUS (orig_stmt));
2790   set_bb_for_stmt (stmt, bsi->bb);
2791
2792   /* Preserve EH region information from the original statement, if
2793      requested by the caller.  */
2794   if (preserve_eh_info)
2795     {
2796       eh_region = lookup_stmt_eh_region (orig_stmt);
2797       if (eh_region >= 0)
2798         add_stmt_to_eh_region (stmt, eh_region);
2799     }
2800
2801   *bsi_stmt_ptr (*bsi) = stmt;
2802   modify_stmt (stmt);
2803 }
2804
2805
2806 /* Insert the statement pointed-to by BSI into edge E.  Every attempt
2807    is made to place the statement in an existing basic block, but
2808    sometimes that isn't possible.  When it isn't possible, the edge is
2809    split and the statement is added to the new block.
2810
2811    In all cases, the returned *BSI points to the correct location.  The
2812    return value is true if insertion should be done after the location,
2813    or false if it should be done before the location.  If new basic block
2814    has to be created, it is stored in *NEW_BB.  */
2815
2816 static bool
2817 tree_find_edge_insert_loc (edge e, block_stmt_iterator *bsi,
2818                            basic_block *new_bb)
2819 {
2820   basic_block dest, src;
2821   tree tmp;
2822
2823   dest = e->dest;
2824  restart:
2825
2826   /* If the destination has one predecessor which has no PHI nodes,
2827      insert there.  Except for the exit block. 
2828
2829      The requirement for no PHI nodes could be relaxed.  Basically we
2830      would have to examine the PHIs to prove that none of them used
2831      the value set by the statement we want to insert on E.   That
2832      hardly seems worth the effort.  */
2833   if (EDGE_COUNT (dest->preds) == 1
2834       && ! phi_nodes (dest)
2835       && dest != EXIT_BLOCK_PTR)
2836     {
2837       *bsi = bsi_start (dest);
2838       if (bsi_end_p (*bsi))
2839         return true;
2840
2841       /* Make sure we insert after any leading labels.  */
2842       tmp = bsi_stmt (*bsi);
2843       while (TREE_CODE (tmp) == LABEL_EXPR)
2844         {
2845           bsi_next (bsi);
2846           if (bsi_end_p (*bsi))
2847             break;
2848           tmp = bsi_stmt (*bsi);
2849         }
2850
2851       if (bsi_end_p (*bsi))
2852         {
2853           *bsi = bsi_last (dest);
2854           return true;
2855         }
2856       else
2857         return false;
2858     }
2859
2860   /* If the source has one successor, the edge is not abnormal and
2861      the last statement does not end a basic block, insert there.
2862      Except for the entry block.  */
2863   src = e->src;
2864   if ((e->flags & EDGE_ABNORMAL) == 0
2865       && EDGE_COUNT (src->succs) == 1
2866       && src != ENTRY_BLOCK_PTR)
2867     {
2868       *bsi = bsi_last (src);
2869       if (bsi_end_p (*bsi))
2870         return true;
2871
2872       tmp = bsi_stmt (*bsi);
2873       if (!stmt_ends_bb_p (tmp))
2874         return true;
2875
2876       /* Insert code just before returning the value.  We may need to decompose
2877          the return in the case it contains non-trivial operand.  */
2878       if (TREE_CODE (tmp) == RETURN_EXPR)
2879         {
2880           tree op = TREE_OPERAND (tmp, 0);
2881           if (!is_gimple_val (op))
2882             {
2883               gcc_assert (TREE_CODE (op) == MODIFY_EXPR);
2884               bsi_insert_before (bsi, op, BSI_NEW_STMT);
2885               TREE_OPERAND (tmp, 0) = TREE_OPERAND (op, 0);
2886             }
2887           bsi_prev (bsi);
2888           return true;
2889         }
2890     }
2891
2892   /* Otherwise, create a new basic block, and split this edge.  */
2893   dest = split_edge (e);
2894   if (new_bb)
2895     *new_bb = dest;
2896   e = EDGE_PRED (dest, 0);
2897   goto restart;
2898 }
2899
2900
2901 /* This routine will commit all pending edge insertions, creating any new
2902    basic blocks which are necessary.
2903
2904    If specified, NEW_BLOCKS returns a count of the number of new basic
2905    blocks which were created.  */
2906
2907 void
2908 bsi_commit_edge_inserts (int *new_blocks)
2909 {
2910   basic_block bb;
2911   edge e;
2912   int blocks;
2913   edge_iterator ei;
2914
2915   blocks = n_basic_blocks;
2916
2917   bsi_commit_edge_inserts_1 (EDGE_SUCC (ENTRY_BLOCK_PTR, 0));
2918
2919   FOR_EACH_BB (bb)
2920     FOR_EACH_EDGE (e, ei, bb->succs)
2921       bsi_commit_edge_inserts_1 (e);
2922
2923   if (new_blocks)
2924     *new_blocks = n_basic_blocks - blocks;
2925 }
2926
2927
2928 /* Commit insertions pending at edge E.  */
2929
2930 static void
2931 bsi_commit_edge_inserts_1 (edge e)
2932 {
2933   if (PENDING_STMT (e))
2934     {
2935       block_stmt_iterator bsi;
2936       tree stmt = PENDING_STMT (e);
2937
2938       PENDING_STMT (e) = NULL_TREE;
2939
2940       if (tree_find_edge_insert_loc (e, &bsi, NULL))
2941         bsi_insert_after (&bsi, stmt, BSI_NEW_STMT);
2942       else
2943         bsi_insert_before (&bsi, stmt, BSI_NEW_STMT);
2944     }
2945 }
2946
2947
2948 /* Add STMT to the pending list of edge E.  No actual insertion is
2949    made until a call to bsi_commit_edge_inserts () is made.  */
2950
2951 void
2952 bsi_insert_on_edge (edge e, tree stmt)
2953 {
2954   append_to_statement_list (stmt, &PENDING_STMT (e));
2955 }
2956
2957 /* Similar to bsi_insert_on_edge+bsi_commit_edge_inserts.  If new block has to
2958    be created, it is returned.  */
2959
2960 basic_block
2961 bsi_insert_on_edge_immediate (edge e, tree stmt)
2962 {
2963   block_stmt_iterator bsi;
2964   basic_block new_bb = NULL;
2965
2966   gcc_assert (!PENDING_STMT (e));
2967
2968   if (tree_find_edge_insert_loc (e, &bsi, &new_bb))
2969     bsi_insert_after (&bsi, stmt, BSI_NEW_STMT);
2970   else
2971     bsi_insert_before (&bsi, stmt, BSI_NEW_STMT);
2972
2973   return new_bb;
2974 }
2975
2976 /*---------------------------------------------------------------------------
2977              Tree specific functions for CFG manipulation
2978 ---------------------------------------------------------------------------*/
2979
2980 /* Split a (typically critical) edge EDGE_IN.  Return the new block.
2981    Abort on abnormal edges.  */
2982
2983 static basic_block
2984 tree_split_edge (edge edge_in)
2985 {
2986   basic_block new_bb, after_bb, dest, src;
2987   edge new_edge, e;
2988   tree phi;
2989   int i, num_elem;
2990   edge_iterator ei;
2991
2992   /* Abnormal edges cannot be split.  */
2993   gcc_assert (!(edge_in->flags & EDGE_ABNORMAL));
2994
2995   src = edge_in->src;
2996   dest = edge_in->dest;
2997
2998   /* Place the new block in the block list.  Try to keep the new block
2999      near its "logical" location.  This is of most help to humans looking
3000      at debugging dumps.  */
3001   FOR_EACH_EDGE (e, ei, dest->preds)
3002     if (e->src->next_bb == dest)
3003       break;
3004   if (!e)
3005     after_bb = dest->prev_bb;
3006   else
3007     after_bb = edge_in->src;
3008
3009   new_bb = create_empty_bb (after_bb);
3010   new_bb->frequency = EDGE_FREQUENCY (edge_in);
3011   new_bb->count = edge_in->count;
3012   new_edge = make_edge (new_bb, dest, EDGE_FALLTHRU);
3013   new_edge->probability = REG_BR_PROB_BASE;
3014   new_edge->count = edge_in->count;
3015
3016   /* Find all the PHI arguments on the original edge, and change them to
3017      the new edge.  Do it before redirection, so that the argument does not
3018      get removed.  */
3019   for (phi = phi_nodes (dest); phi; phi = PHI_CHAIN (phi))
3020     {
3021       num_elem = PHI_NUM_ARGS (phi);
3022       for (i = 0; i < num_elem; i++)
3023         if (PHI_ARG_EDGE (phi, i) == edge_in)
3024           {
3025             PHI_ARG_EDGE (phi, i) = new_edge;
3026             break;
3027           }
3028     }
3029
3030   e = redirect_edge_and_branch (edge_in, new_bb);
3031   gcc_assert (e);
3032   gcc_assert (!PENDING_STMT (edge_in));
3033
3034   return new_bb;
3035 }
3036
3037
3038 /* Return true when BB has label LABEL in it.  */
3039
3040 static bool
3041 has_label_p (basic_block bb, tree label)
3042 {
3043   block_stmt_iterator bsi;
3044
3045   for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
3046     {
3047       tree stmt = bsi_stmt (bsi);
3048
3049       if (TREE_CODE (stmt) != LABEL_EXPR)
3050         return false;
3051       if (LABEL_EXPR_LABEL (stmt) == label)
3052         return true;
3053     }
3054   return false;
3055 }
3056
3057
3058 /* Callback for walk_tree, check that all elements with address taken are
3059    properly noticed as such.  */
3060
3061 static tree
3062 verify_expr (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
3063 {
3064   tree t = *tp, x;
3065
3066   if (TYPE_P (t))
3067     *walk_subtrees = 0;
3068   
3069   /* Check operand N for being valid GIMPLE and give error MSG if not. 
3070      We check for constants explicitly since they are not considered
3071      gimple invariants if they overflowed.  */
3072 #define CHECK_OP(N, MSG) \
3073   do { if (!CONSTANT_CLASS_P (TREE_OPERAND (t, N))              \
3074          && !is_gimple_val (TREE_OPERAND (t, N)))               \
3075        { error (MSG); return TREE_OPERAND (t, N); }} while (0)
3076
3077   switch (TREE_CODE (t))
3078     {
3079     case SSA_NAME:
3080       if (SSA_NAME_IN_FREE_LIST (t))
3081         {
3082           error ("SSA name in freelist but still referenced");
3083           return *tp;
3084         }
3085       break;
3086
3087     case MODIFY_EXPR:
3088       x = TREE_OPERAND (t, 0);
3089       if (TREE_CODE (x) == BIT_FIELD_REF
3090           && is_gimple_reg (TREE_OPERAND (x, 0)))
3091         {
3092           error ("GIMPLE register modified with BIT_FIELD_REF");
3093           return t;
3094         }
3095       break;
3096
3097     case ADDR_EXPR:
3098       /* Skip any references (they will be checked when we recurse down the
3099          tree) and ensure that any variable used as a prefix is marked
3100          addressable.  */
3101       for (x = TREE_OPERAND (t, 0);
3102            (handled_component_p (x)
3103             || TREE_CODE (x) == REALPART_EXPR
3104             || TREE_CODE (x) == IMAGPART_EXPR);
3105            x = TREE_OPERAND (x, 0))
3106         ;
3107
3108       if (TREE_CODE (x) != VAR_DECL && TREE_CODE (x) != PARM_DECL)
3109         return NULL;
3110       if (!TREE_ADDRESSABLE (x))
3111         {
3112           error ("address taken, but ADDRESSABLE bit not set");
3113           return x;
3114         }
3115       break;
3116
3117     case COND_EXPR:
3118       x = TREE_OPERAND (t, 0);
3119       if (TREE_CODE (TREE_TYPE (x)) != BOOLEAN_TYPE)
3120         {
3121           error ("non-boolean used in condition");
3122           return x;
3123         }
3124       break;
3125
3126     case NOP_EXPR:
3127     case CONVERT_EXPR:
3128     case FIX_TRUNC_EXPR:
3129     case FIX_CEIL_EXPR:
3130     case FIX_FLOOR_EXPR:
3131     case FIX_ROUND_EXPR:
3132     case FLOAT_EXPR:
3133     case NEGATE_EXPR:
3134     case ABS_EXPR:
3135     case BIT_NOT_EXPR:
3136     case NON_LVALUE_EXPR:
3137     case TRUTH_NOT_EXPR:
3138       CHECK_OP (0, "Invalid operand to unary operator");
3139       break;
3140
3141     case REALPART_EXPR:
3142     case IMAGPART_EXPR:
3143     case COMPONENT_REF:
3144     case ARRAY_REF:
3145     case ARRAY_RANGE_REF:
3146     case BIT_FIELD_REF:
3147     case VIEW_CONVERT_EXPR:
3148       /* We have a nest of references.  Verify that each of the operands
3149          that determine where to reference is either a constant or a variable,
3150          verify that the base is valid, and then show we've already checked
3151          the subtrees.  */
3152       while (TREE_CODE (t) == REALPART_EXPR || TREE_CODE (t) == IMAGPART_EXPR
3153              || handled_component_p (t))
3154         {
3155           if (TREE_CODE (t) == COMPONENT_REF && TREE_OPERAND (t, 2))
3156             CHECK_OP (2, "Invalid COMPONENT_REF offset operator");
3157           else if (TREE_CODE (t) == ARRAY_REF
3158                    || TREE_CODE (t) == ARRAY_RANGE_REF)
3159             {
3160               CHECK_OP (1, "Invalid array index.");
3161               if (TREE_OPERAND (t, 2))
3162                 CHECK_OP (2, "Invalid array lower bound.");
3163               if (TREE_OPERAND (t, 3))
3164                 CHECK_OP (3, "Invalid array stride.");
3165             }
3166           else if (TREE_CODE (t) == BIT_FIELD_REF)
3167             {
3168               CHECK_OP (1, "Invalid operand to BIT_FIELD_REF");
3169               CHECK_OP (2, "Invalid operand to BIT_FIELD_REF");
3170             }
3171
3172           t = TREE_OPERAND (t, 0);
3173         }
3174
3175       if (!CONSTANT_CLASS_P (t) && !is_gimple_lvalue (t))
3176         {
3177           error ("Invalid reference prefix.");
3178           return t;
3179         }
3180       *walk_subtrees = 0;
3181       break;
3182
3183     case LT_EXPR:
3184     case LE_EXPR:
3185     case GT_EXPR:
3186     case GE_EXPR:
3187     case EQ_EXPR:
3188     case NE_EXPR:
3189     case UNORDERED_EXPR:
3190     case ORDERED_EXPR:
3191     case UNLT_EXPR:
3192     case UNLE_EXPR:
3193     case UNGT_EXPR:
3194     case UNGE_EXPR:
3195     case UNEQ_EXPR:
3196     case LTGT_EXPR:
3197     case PLUS_EXPR:
3198     case MINUS_EXPR:
3199     case MULT_EXPR:
3200     case TRUNC_DIV_EXPR:
3201     case CEIL_DIV_EXPR:
3202     case FLOOR_DIV_EXPR:
3203     case ROUND_DIV_EXPR:
3204     case TRUNC_MOD_EXPR:
3205     case CEIL_MOD_EXPR:
3206     case FLOOR_MOD_EXPR:
3207     case ROUND_MOD_EXPR:
3208     case RDIV_EXPR:
3209     case EXACT_DIV_EXPR:
3210     case MIN_EXPR:
3211     case MAX_EXPR:
3212     case LSHIFT_EXPR:
3213     case RSHIFT_EXPR:
3214     case LROTATE_EXPR:
3215     case RROTATE_EXPR:
3216     case BIT_IOR_EXPR:
3217     case BIT_XOR_EXPR:
3218     case BIT_AND_EXPR:
3219       CHECK_OP (0, "Invalid operand to binary operator");
3220       CHECK_OP (1, "Invalid operand to binary operator");
3221       break;
3222
3223     default:
3224       break;
3225     }
3226   return NULL;
3227
3228 #undef CHECK_OP
3229 }
3230
3231
3232 /* Verify STMT, return true if STMT is not in GIMPLE form.
3233    TODO: Implement type checking.  */
3234
3235 static bool
3236 verify_stmt (tree stmt, bool last_in_block)
3237 {
3238   tree addr;
3239
3240   if (!is_gimple_stmt (stmt))
3241     {
3242       error ("Is not a valid GIMPLE statement.");
3243       goto fail;
3244     }
3245
3246   addr = walk_tree (&stmt, verify_expr, NULL, NULL);
3247   if (addr)
3248     {
3249       debug_generic_stmt (addr);
3250       return true;
3251     }
3252
3253   /* If the statement is marked as part of an EH region, then it is
3254      expected that the statement could throw.  Verify that when we
3255      have optimizations that simplify statements such that we prove
3256      that they cannot throw, that we update other data structures
3257      to match.  */
3258   if (lookup_stmt_eh_region (stmt) >= 0)
3259     {
3260       if (!tree_could_throw_p (stmt))
3261         {
3262           error ("Statement marked for throw, but doesn%'t.");
3263           goto fail;
3264         }
3265       if (!last_in_block && tree_can_throw_internal (stmt))
3266         {
3267           error ("Statement marked for throw in middle of block.");
3268           goto fail;
3269         }
3270     }
3271
3272   return false;
3273
3274  fail:
3275   debug_generic_stmt (stmt);
3276   return true;
3277 }
3278
3279
3280 /* Return true when the T can be shared.  */
3281
3282 static bool
3283 tree_node_can_be_shared (tree t)
3284 {
3285   if (IS_TYPE_OR_DECL_P (t)
3286       /* We check for constants explicitly since they are not considered
3287          gimple invariants if they overflowed.  */
3288       || CONSTANT_CLASS_P (t)
3289       || is_gimple_min_invariant (t)
3290       || TREE_CODE (t) == SSA_NAME)
3291     return true;
3292
3293   while (((TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
3294           /* We check for constants explicitly since they are not considered
3295              gimple invariants if they overflowed.  */
3296           && (CONSTANT_CLASS_P (TREE_OPERAND (t, 1))
3297               || is_gimple_min_invariant (TREE_OPERAND (t, 1))))
3298          || (TREE_CODE (t) == COMPONENT_REF
3299              || TREE_CODE (t) == REALPART_EXPR
3300              || TREE_CODE (t) == IMAGPART_EXPR))
3301     t = TREE_OPERAND (t, 0);
3302
3303   if (DECL_P (t))
3304     return true;
3305
3306   return false;
3307 }
3308
3309
3310 /* Called via walk_trees.  Verify tree sharing.  */
3311
3312 static tree
3313 verify_node_sharing (tree * tp, int *walk_subtrees, void *data)
3314 {
3315   htab_t htab = (htab_t) data;
3316   void **slot;
3317
3318   if (tree_node_can_be_shared (*tp))
3319     {
3320       *walk_subtrees = false;
3321       return NULL;
3322     }
3323
3324   slot = htab_find_slot (htab, *tp, INSERT);
3325   if (*slot)
3326     return *slot;
3327   *slot = *tp;
3328
3329   return NULL;
3330 }
3331
3332
3333 /* Verify the GIMPLE statement chain.  */
3334
3335 void
3336 verify_stmts (void)
3337 {
3338   basic_block bb;
3339   block_stmt_iterator bsi;
3340   bool err = false;
3341   htab_t htab;
3342   tree addr;
3343
3344   timevar_push (TV_TREE_STMT_VERIFY);
3345   htab = htab_create (37, htab_hash_pointer, htab_eq_pointer, NULL);
3346
3347   FOR_EACH_BB (bb)
3348     {
3349       tree phi;
3350       int i;
3351
3352       for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
3353         {
3354           int phi_num_args = PHI_NUM_ARGS (phi);
3355
3356           for (i = 0; i < phi_num_args; i++)
3357             {
3358               tree t = PHI_ARG_DEF (phi, i);
3359               tree addr;
3360
3361               /* Addressable variables do have SSA_NAMEs but they
3362                  are not considered gimple values.  */
3363               if (TREE_CODE (t) != SSA_NAME
3364                   && TREE_CODE (t) != FUNCTION_DECL
3365                   && !is_gimple_val (t))
3366                 {
3367                   error ("PHI def is not a GIMPLE value");
3368                   debug_generic_stmt (phi);
3369                   debug_generic_stmt (t);
3370                   err |= true;
3371                 }
3372
3373               addr = walk_tree (&t, verify_expr, NULL, NULL);
3374               if (addr)
3375                 {
3376                   debug_generic_stmt (addr);
3377                   err |= true;
3378                 }
3379
3380               addr = walk_tree (&t, verify_node_sharing, htab, NULL);
3381               if (addr)
3382                 {
3383                   error ("Incorrect sharing of tree nodes");
3384                   debug_generic_stmt (phi);
3385                   debug_generic_stmt (addr);
3386                   err |= true;
3387                 }
3388             }
3389         }
3390
3391       for (bsi = bsi_start (bb); !bsi_end_p (bsi); )
3392         {
3393           tree stmt = bsi_stmt (bsi);
3394           bsi_next (&bsi);
3395           err |= verify_stmt (stmt, bsi_end_p (bsi));
3396           addr = walk_tree (&stmt, verify_node_sharing, htab, NULL);
3397           if (addr)
3398             {
3399               error ("Incorrect sharing of tree nodes");
3400               debug_generic_stmt (stmt);
3401               debug_generic_stmt (addr);
3402               err |= true;
3403             }
3404         }
3405     }
3406
3407   if (err)
3408     internal_error ("verify_stmts failed.");
3409
3410   htab_delete (htab);
3411   timevar_pop (TV_TREE_STMT_VERIFY);
3412 }
3413
3414
3415 /* Verifies that the flow information is OK.  */
3416
3417 static int
3418 tree_verify_flow_info (void)
3419 {
3420   int err = 0;
3421   basic_block bb;
3422   block_stmt_iterator bsi;
3423   tree stmt;
3424   edge e;
3425   edge_iterator ei;
3426
3427   if (ENTRY_BLOCK_PTR->stmt_list)
3428     {
3429       error ("ENTRY_BLOCK has a statement list associated with it\n");
3430       err = 1;
3431     }
3432
3433   if (EXIT_BLOCK_PTR->stmt_list)
3434     {
3435       error ("EXIT_BLOCK has a statement list associated with it\n");
3436       err = 1;
3437     }
3438
3439   FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
3440     if (e->flags & EDGE_FALLTHRU)
3441       {
3442         error ("Fallthru to exit from bb %d\n", e->src->index);
3443         err = 1;
3444       }
3445
3446   FOR_EACH_BB (bb)
3447     {
3448       bool found_ctrl_stmt = false;
3449
3450       /* Skip labels on the start of basic block.  */
3451       for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
3452         {
3453           if (TREE_CODE (bsi_stmt (bsi)) != LABEL_EXPR)
3454             break;
3455
3456           if (label_to_block (LABEL_EXPR_LABEL (bsi_stmt (bsi))) != bb)
3457             {
3458               error ("Label %s to block does not match in bb %d\n",
3459                      IDENTIFIER_POINTER (DECL_NAME (bsi_stmt (bsi))),
3460                      bb->index);
3461               err = 1;
3462             }
3463
3464           if (decl_function_context (LABEL_EXPR_LABEL (bsi_stmt (bsi)))
3465               != current_function_decl)
3466             {
3467               error ("Label %s has incorrect context in bb %d\n",
3468                      IDENTIFIER_POINTER (DECL_NAME (bsi_stmt (bsi))),
3469                      bb->index);
3470               err = 1;
3471             }
3472         }
3473
3474       /* Verify that body of basic block BB is free of control flow.  */
3475       for (; !bsi_end_p (bsi); bsi_next (&bsi))
3476         {
3477           tree stmt = bsi_stmt (bsi);
3478
3479           if (found_ctrl_stmt)
3480             {
3481               error ("Control flow in the middle of basic block %d\n",
3482                      bb->index);
3483               err = 1;
3484             }
3485
3486           if (stmt_ends_bb_p (stmt))
3487             found_ctrl_stmt = true;
3488
3489           if (TREE_CODE (stmt) == LABEL_EXPR)
3490             {
3491               error ("Label %s in the middle of basic block %d\n",
3492                      IDENTIFIER_POINTER (DECL_NAME (stmt)),
3493                      bb->index);
3494               err = 1;
3495             }
3496         }
3497       bsi = bsi_last (bb);
3498       if (bsi_end_p (bsi))
3499         continue;
3500
3501       stmt = bsi_stmt (bsi);
3502
3503       if (is_ctrl_stmt (stmt))
3504         {
3505           FOR_EACH_EDGE (e, ei, bb->succs)
3506             if (e->flags & EDGE_FALLTHRU)
3507               {
3508                 error ("Fallthru edge after a control statement in bb %d \n",
3509                        bb->index);
3510                 err = 1;
3511               }
3512         }
3513
3514       switch (TREE_CODE (stmt))
3515         {
3516         case COND_EXPR:
3517           {
3518             edge true_edge;
3519             edge false_edge;
3520             if (TREE_CODE (COND_EXPR_THEN (stmt)) != GOTO_EXPR
3521                 || TREE_CODE (COND_EXPR_ELSE (stmt)) != GOTO_EXPR)
3522               {
3523                 error ("Structured COND_EXPR at the end of bb %d\n", bb->index);
3524                 err = 1;
3525               }
3526
3527             extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
3528
3529             if (!true_edge || !false_edge
3530                 || !(true_edge->flags & EDGE_TRUE_VALUE)
3531                 || !(false_edge->flags & EDGE_FALSE_VALUE)
3532                 || (true_edge->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL))
3533                 || (false_edge->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL))
3534                 || EDGE_COUNT (bb->succs) >= 3)
3535               {
3536                 error ("Wrong outgoing edge flags at end of bb %d\n",
3537                        bb->index);
3538                 err = 1;
3539               }
3540
3541             if (!has_label_p (true_edge->dest,
3542                               GOTO_DESTINATION (COND_EXPR_THEN (stmt))))
3543               {
3544                 error ("%<then%> label does not match edge at end of bb %d\n",
3545                        bb->index);
3546                 err = 1;
3547               }
3548
3549             if (!has_label_p (false_edge->dest,
3550                               GOTO_DESTINATION (COND_EXPR_ELSE (stmt))))
3551               {
3552                 error ("%<else%> label does not match edge at end of bb %d\n",
3553                        bb->index);
3554                 err = 1;
3555               }
3556           }
3557           break;
3558
3559         case GOTO_EXPR:
3560           if (simple_goto_p (stmt))
3561             {
3562               error ("Explicit goto at end of bb %d\n", bb->index);
3563               err = 1;
3564             }
3565           else
3566             {
3567               /* FIXME.  We should double check that the labels in the 
3568                  destination blocks have their address taken.  */
3569               FOR_EACH_EDGE (e, ei, bb->succs)
3570                 if ((e->flags & (EDGE_FALLTHRU | EDGE_TRUE_VALUE
3571                                  | EDGE_FALSE_VALUE))
3572                     || !(e->flags & EDGE_ABNORMAL))
3573                   {
3574                     error ("Wrong outgoing edge flags at end of bb %d\n",
3575                            bb->index);
3576                     err = 1;
3577                   }
3578             }
3579           break;
3580
3581         case RETURN_EXPR:
3582           if (EDGE_COUNT (bb->succs) != 1
3583               || (EDGE_SUCC (bb, 0)->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL
3584                                      | EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
3585             {
3586               error ("Wrong outgoing edge flags at end of bb %d\n", bb->index);
3587               err = 1;
3588             }
3589           if (EDGE_SUCC (bb, 0)->dest != EXIT_BLOCK_PTR)
3590             {
3591               error ("Return edge does not point to exit in bb %d\n",
3592                      bb->index);
3593               err = 1;
3594             }
3595           break;
3596
3597         case SWITCH_EXPR:
3598           {
3599             tree prev;
3600             edge e;
3601             size_t i, n;
3602             tree vec;
3603
3604             vec = SWITCH_LABELS (stmt);
3605             n = TREE_VEC_LENGTH (vec);
3606
3607             /* Mark all the destination basic blocks.  */
3608             for (i = 0; i < n; ++i)
3609               {
3610                 tree lab = CASE_LABEL (TREE_VEC_ELT (vec, i));
3611                 basic_block label_bb = label_to_block (lab);
3612
3613                 gcc_assert (!label_bb->aux || label_bb->aux == (void *)1);
3614                 label_bb->aux = (void *)1;
3615               }
3616
3617             /* Verify that the case labels are sorted.  */
3618             prev = TREE_VEC_ELT (vec, 0);
3619             for (i = 1; i < n - 1; ++i)
3620               {
3621                 tree c = TREE_VEC_ELT (vec, i);
3622                 if (! CASE_LOW (c))
3623                   {
3624                     error ("Found default case not at end of case vector");
3625                     err = 1;
3626                     continue;
3627                   }
3628                 if (! tree_int_cst_lt (CASE_LOW (prev), CASE_LOW (c)))
3629                   {
3630                     error ("Case labels not sorted:\n ");
3631                     print_generic_expr (stderr, prev, 0);
3632                     fprintf (stderr," is greater than ");
3633                     print_generic_expr (stderr, c, 0);
3634                     fprintf (stderr," but comes before it.\n");
3635                     err = 1;
3636                   }
3637                 prev = c;
3638               }
3639             if (CASE_LOW (TREE_VEC_ELT (vec, n - 1)))
3640               {
3641                 error ("No default case found at end of case vector");
3642                 err = 1;
3643               }
3644
3645             FOR_EACH_EDGE (e, ei, bb->succs)
3646               {
3647                 if (!e->dest->aux)
3648                   {
3649                     error ("Extra outgoing edge %d->%d\n",
3650                            bb->index, e->dest->index);
3651                     err = 1;
3652                   }
3653                 e->dest->aux = (void *)2;
3654                 if ((e->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL
3655                                  | EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
3656                   {
3657                     error ("Wrong outgoing edge flags at end of bb %d\n",
3658                            bb->index);
3659                     err = 1;
3660                   }
3661               }
3662
3663             /* Check that we have all of them.  */
3664             for (i = 0; i < n; ++i)
3665               {
3666                 tree lab = CASE_LABEL (TREE_VEC_ELT (vec, i));
3667                 basic_block label_bb = label_to_block (lab);
3668
3669                 if (label_bb->aux != (void *)2)
3670                   {
3671                     error ("Missing edge %i->%i\n",
3672                            bb->index, label_bb->index);
3673                     err = 1;
3674                   }
3675               }
3676
3677             FOR_EACH_EDGE (e, ei, bb->succs)
3678               e->dest->aux = (void *)0;
3679           }
3680
3681         default: ;
3682         }
3683     }
3684
3685   if (dom_computed[CDI_DOMINATORS] >= DOM_NO_FAST_QUERY)
3686     verify_dominators (CDI_DOMINATORS);
3687
3688   return err;
3689 }
3690
3691
3692 /* Updates phi nodes after creating forwarder block joined
3693    by edge FALLTHRU.  */
3694
3695 static void
3696 tree_make_forwarder_block (edge fallthru)
3697 {
3698   edge e;
3699   edge_iterator ei;
3700   basic_block dummy, bb;
3701   tree phi, new_phi, var, prev, next;
3702
3703   dummy = fallthru->src;
3704   bb = fallthru->dest;
3705
3706   if (EDGE_COUNT (bb->preds) == 1)
3707     return;
3708
3709   /* If we redirected a branch we must create new phi nodes at the
3710      start of BB.  */
3711   for (phi = phi_nodes (dummy); phi; phi = PHI_CHAIN (phi))
3712     {
3713       var = PHI_RESULT (phi);
3714       new_phi = create_phi_node (var, bb);
3715       SSA_NAME_DEF_STMT (var) = new_phi;
3716       SET_PHI_RESULT (phi, make_ssa_name (SSA_NAME_VAR (var), phi));
3717       add_phi_arg (&new_phi, PHI_RESULT (phi), fallthru);
3718     }
3719
3720   /* Ensure that the PHI node chain is in the same order.  */
3721   prev = NULL;
3722   for (phi = phi_nodes (bb); phi; phi = next)
3723     {
3724       next = PHI_CHAIN (phi);
3725       PHI_CHAIN (phi) = prev;
3726       prev = phi;
3727     }
3728   set_phi_nodes (bb, prev);
3729
3730   /* Add the arguments we have stored on edges.  */
3731   FOR_EACH_EDGE (e, ei, bb->preds)
3732     {
3733       if (e == fallthru)
3734         continue;
3735
3736       for (phi = phi_nodes (bb), var = PENDING_STMT (e);
3737            phi;
3738            phi = PHI_CHAIN (phi), var = TREE_CHAIN (var))
3739         add_phi_arg (&phi, TREE_VALUE (var), e);
3740
3741       PENDING_STMT (e) = NULL;
3742     }
3743 }
3744
3745
3746 /* Return true if basic block BB does nothing except pass control
3747    flow to another block and that we can safely insert a label at
3748    the start of the successor block.  */
3749
3750 static bool
3751 tree_forwarder_block_p (basic_block bb)
3752 {
3753   block_stmt_iterator bsi;
3754   edge e;
3755   edge_iterator ei;
3756
3757   /* If we have already determined that this block is not forwardable,
3758      then no further checks are necessary.  */
3759   if (! bb_ann (bb)->forwardable)
3760     return false;
3761
3762   /* BB must have a single outgoing normal edge.  Otherwise it can not be
3763      a forwarder block.  */
3764   if (EDGE_COUNT (bb->succs) != 1
3765       || EDGE_SUCC (bb, 0)->dest == EXIT_BLOCK_PTR
3766       || (EDGE_SUCC (bb, 0)->flags & EDGE_ABNORMAL)
3767       || bb == ENTRY_BLOCK_PTR)
3768     {
3769       bb_ann (bb)->forwardable = 0;
3770       return false; 
3771     }
3772
3773   /* Successors of the entry block are not forwarders.  */
3774   FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
3775     if (e->dest == bb)
3776       {
3777         bb_ann (bb)->forwardable = 0;
3778         return false;
3779       }
3780
3781   /* BB can not have any PHI nodes.  This could potentially be relaxed
3782      early in compilation if we re-rewrote the variables appearing in
3783      any PHI nodes in forwarder blocks.  */
3784   if (phi_nodes (bb))
3785     {
3786       bb_ann (bb)->forwardable = 0;
3787       return false; 
3788     }
3789
3790   /* Now walk through the statements.  We can ignore labels, anything else
3791      means this is not a forwarder block.  */
3792   for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
3793     {
3794       tree stmt = bsi_stmt (bsi);
3795  
3796       switch (TREE_CODE (stmt))
3797         {
3798         case LABEL_EXPR:
3799           if (DECL_NONLOCAL (LABEL_EXPR_LABEL (stmt)))
3800             return false;
3801           break;
3802
3803         default:
3804           bb_ann (bb)->forwardable = 0;
3805           return false;
3806         }
3807     }
3808
3809   return true;
3810 }
3811
3812
3813 /* Thread jumps over empty statements.
3814
3815    This code should _not_ thread over obviously equivalent conditions
3816    as that requires nontrivial updates to the SSA graph.  */
3817    
3818 static bool
3819 thread_jumps (void)
3820 {
3821   edge e, last, old;
3822   basic_block bb, dest, tmp, old_dest, curr, dom;
3823     tree phi;
3824   int arg;
3825   bool retval = false;
3826
3827   FOR_EACH_BB (bb)
3828     bb_ann (bb)->forwardable = 1;
3829
3830   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR, next_bb)
3831     {
3832       edge_iterator ei;
3833
3834       /* Don't waste time on unreachable blocks.  */
3835       if (EDGE_COUNT (bb->preds) == 0)
3836         continue;
3837
3838       /* Nor on forwarders.  */
3839       if (tree_forwarder_block_p (bb))
3840         continue;
3841       
3842       /* This block is now part of a forwarding path, mark it as not
3843          forwardable so that we can detect loops.  This bit will be
3844          reset below.  */
3845       bb_ann (bb)->forwardable = 0;
3846
3847       /* Examine each of our block's successors to see if it is
3848          forwardable.  */
3849       for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
3850         {
3851           int freq;
3852           gcov_type count;
3853
3854           /* If the edge is abnormal or its destination is not
3855              forwardable, then there's nothing to do.  */
3856           if ((e->flags & EDGE_ABNORMAL)
3857               || !tree_forwarder_block_p (e->dest))
3858             {
3859               ei_next (&ei);
3860               continue;
3861             }
3862
3863           count = e->count;
3864           freq = EDGE_FREQUENCY (e);
3865
3866           /* Now walk through as many forwarder block as possible to
3867              find the ultimate destination we want to thread our jump
3868              to.  */
3869           last = EDGE_SUCC (e->dest, 0);
3870           bb_ann (e->dest)->forwardable = 0;
3871           for (dest = EDGE_SUCC (e->dest, 0)->dest;
3872                tree_forwarder_block_p (dest);
3873                last = EDGE_SUCC (dest, 0),
3874                dest = EDGE_SUCC (dest, 0)->dest)
3875             {
3876               /* An infinite loop detected.  We redirect the edge anyway, so
3877                  that the loop is shrunk into single basic block.  */
3878               if (!bb_ann (dest)->forwardable)
3879                 break;
3880
3881               if (EDGE_SUCC (dest, 0)->dest == EXIT_BLOCK_PTR)
3882                 break;
3883
3884               bb_ann (dest)->forwardable = 0;
3885             }
3886
3887           /* Reset the forwardable marks to 1.  */
3888           for (tmp = e->dest;
3889                tmp != dest;
3890                tmp = EDGE_SUCC (tmp, 0)->dest)
3891             bb_ann (tmp)->forwardable = 1;
3892
3893           if (dest == e->dest)
3894             {
3895               ei_next (&ei);
3896               continue;
3897             }
3898               
3899           old = find_edge (bb, dest);
3900           if (old)
3901             {
3902               /* If there already is an edge, check whether the values
3903                  in phi nodes differ.  */
3904               if (!phi_alternatives_equal (dest, last, old))
3905                 {
3906                   /* The previous block is forwarder.  Redirect our jump
3907                      to that target instead since we know it has no PHI
3908                      nodes that will need updating.  */
3909                   dest = last->src;
3910           
3911                   /* That might mean that no forwarding at all is possible.  */
3912                   if (dest == e->dest)
3913                     {
3914                       ei_next (&ei);
3915                       continue;
3916                     }
3917
3918                   old = find_edge (bb, dest);
3919                 }
3920             }
3921
3922           /* Perform the redirection.  */
3923           retval = true;
3924           old_dest = e->dest;
3925           e = redirect_edge_and_branch (e, dest);
3926
3927           /* Update the profile.  */
3928           if (profile_status != PROFILE_ABSENT)
3929             for (curr = old_dest; curr != dest; curr = EDGE_SUCC (curr, 0)->dest)
3930               {
3931                 curr->frequency -= freq;
3932                 if (curr->frequency < 0)
3933                   curr->frequency = 0;
3934                 curr->count -= count;
3935                 if (curr->count < 0)
3936                   curr->count = 0;
3937                 EDGE_SUCC (curr, 0)->count -= count;
3938                 if (EDGE_SUCC (curr, 0)->count < 0)
3939                   EDGE_SUCC (curr, 0)->count = 0;
3940               }
3941
3942           if (!old)
3943             {
3944               /* Update PHI nodes.   We know that the new argument should
3945                  have the same value as the argument associated with LAST.
3946                  Otherwise we would have changed our target block above.  */
3947               for (phi = phi_nodes (dest); phi; phi = PHI_CHAIN (phi))
3948                 {
3949                   arg = phi_arg_from_edge (phi, last);
3950                   gcc_assert (arg >= 0);
3951                   add_phi_arg (&phi, PHI_ARG_DEF (phi, arg), e);
3952                 }
3953             }
3954
3955           /* Update the dominators.  */
3956           if (dom_computed[CDI_DOMINATORS] >= DOM_CONS_OK)
3957             {
3958               /* Remove the unreachable blocks (observe that if all blocks
3959                  were reachable before, only those in the path we threaded
3960                  over and did not have any predecessor outside of the path
3961                  become unreachable).  */
3962               for (; old_dest != dest; old_dest = tmp)
3963                 {
3964                   tmp = EDGE_SUCC (old_dest, 0)->dest;
3965
3966                   if (EDGE_COUNT (old_dest->preds) > 0)
3967                     break;
3968
3969                   delete_basic_block (old_dest);
3970                 }
3971               /* If the dominator of the destination was in the path, set its
3972                  dominator to the start of the redirected edge.  */
3973               if (get_immediate_dominator (CDI_DOMINATORS, old_dest) == NULL)
3974                 set_immediate_dominator (CDI_DOMINATORS, old_dest, bb);
3975
3976               /* Now proceed like if we forwarded just over one edge at a time.
3977                  Algorithm for forwarding edge S --> A over edge A --> B then
3978                  is
3979
3980                  if (idom (B) == A
3981                      && !dominated_by (S, B))
3982                    idom (B) = idom (A);
3983                  recount_idom (A);  */
3984
3985               for (; old_dest != dest; old_dest = tmp)
3986                 {
3987                   tmp = EDGE_SUCC (old_dest, 0)->dest;
3988
3989                   if (get_immediate_dominator (CDI_DOMINATORS, tmp) == old_dest
3990                       && !dominated_by_p (CDI_DOMINATORS, bb, tmp))
3991                     {
3992                       dom = get_immediate_dominator (CDI_DOMINATORS, old_dest);
3993                       set_immediate_dominator (CDI_DOMINATORS, tmp, dom);
3994                     }
3995
3996                   dom = recount_dominator (CDI_DOMINATORS, old_dest);
3997                   set_immediate_dominator (CDI_DOMINATORS, old_dest, dom);
3998                 }
3999             }
4000         }
4001
4002       /* Reset the forwardable bit on our block since it's no longer in
4003          a forwarding chain path.  */
4004       bb_ann (bb)->forwardable = 1;
4005     }
4006
4007   return retval;
4008 }
4009
4010
4011 /* Return a non-special label in the head of basic block BLOCK.
4012    Create one if it doesn't exist.  */
4013
4014 tree
4015 tree_block_label (basic_block bb)
4016 {
4017   block_stmt_iterator i, s = bsi_start (bb);
4018   bool first = true;
4019   tree label, stmt;
4020
4021   for (i = s; !bsi_end_p (i); first = false, bsi_next (&i))
4022     {
4023       stmt = bsi_stmt (i);
4024       if (TREE_CODE (stmt) != LABEL_EXPR)
4025         break;
4026       label = LABEL_EXPR_LABEL (stmt);
4027       if (!DECL_NONLOCAL (label))
4028         {
4029           if (!first)
4030             bsi_move_before (&i, &s);
4031           return label;
4032         }
4033     }
4034
4035   label = create_artificial_label ();
4036   stmt = build1 (LABEL_EXPR, void_type_node, label);
4037   bsi_insert_before (&s, stmt, BSI_NEW_STMT);
4038   return label;
4039 }
4040
4041
4042 /* Attempt to perform edge redirection by replacing a possibly complex
4043    jump instruction by a goto or by removing the jump completely.
4044    This can apply only if all edges now point to the same block.  The
4045    parameters and return values are equivalent to
4046    redirect_edge_and_branch.  */
4047
4048 static edge
4049 tree_try_redirect_by_replacing_jump (edge e, basic_block target)
4050 {
4051   basic_block src = e->src;
4052   edge tmp;
4053   block_stmt_iterator b;
4054   tree stmt;
4055   edge_iterator ei;
4056
4057   /* Verify that all targets will be TARGET.  */
4058   FOR_EACH_EDGE (tmp, ei, src->succs)
4059     if (tmp->dest != target && tmp != e)
4060       break;
4061
4062   if (tmp)
4063     return NULL;
4064
4065   b = bsi_last (src);
4066   if (bsi_end_p (b))
4067     return NULL;
4068   stmt = bsi_stmt (b);
4069
4070   if (TREE_CODE (stmt) == COND_EXPR
4071       || TREE_CODE (stmt) == SWITCH_EXPR)
4072     {
4073       bsi_remove (&b);
4074       e = ssa_redirect_edge (e, target);
4075       e->flags = EDGE_FALLTHRU;
4076       return e;
4077     }
4078
4079   return NULL;
4080 }
4081
4082
4083 /* Redirect E to DEST.  Return NULL on failure.  Otherwise, return the
4084    edge representing the redirected branch.  */
4085
4086 static edge
4087 tree_redirect_edge_and_branch (edge e, basic_block dest)
4088 {
4089   basic_block bb = e->src;
4090   block_stmt_iterator bsi;
4091   edge ret;
4092   tree label, stmt;
4093
4094   if (e->flags & (EDGE_ABNORMAL_CALL | EDGE_EH))
4095     return NULL;
4096
4097   if (e->src != ENTRY_BLOCK_PTR 
4098       && (ret = tree_try_redirect_by_replacing_jump (e, dest)))
4099     return ret;
4100
4101   if (e->dest == dest)
4102     return NULL;
4103
4104   label = tree_block_label (dest);
4105
4106   bsi = bsi_last (bb);
4107   stmt = bsi_end_p (bsi) ? NULL : bsi_stmt (bsi);
4108
4109   switch (stmt ? TREE_CODE (stmt) : ERROR_MARK)
4110     {
4111     case COND_EXPR:
4112       stmt = (e->flags & EDGE_TRUE_VALUE
4113               ? COND_EXPR_THEN (stmt)
4114               : COND_EXPR_ELSE (stmt));
4115       GOTO_DESTINATION (stmt) = label;
4116       break;
4117
4118     case GOTO_EXPR:
4119       /* No non-abnormal edges should lead from a non-simple goto, and
4120          simple ones should be represented implicitly.  */
4121       gcc_unreachable ();
4122
4123     case SWITCH_EXPR:
4124       {
4125         tree vec = SWITCH_LABELS (stmt);
4126         size_t i, n = TREE_VEC_LENGTH (vec);
4127
4128         for (i = 0; i < n; ++i)
4129           {
4130             tree elt = TREE_VEC_ELT (vec, i);
4131             if (label_to_block (CASE_LABEL (elt)) == e->dest)
4132               CASE_LABEL (elt) = label;
4133           }
4134       }
4135       break;
4136
4137     case RETURN_EXPR:
4138       bsi_remove (&bsi);
4139       e->flags |= EDGE_FALLTHRU;
4140       break;
4141
4142     default:
4143       /* Otherwise it must be a fallthru edge, and we don't need to
4144          do anything besides redirecting it.  */
4145       gcc_assert (e->flags & EDGE_FALLTHRU);
4146       break;
4147     }
4148
4149   /* Update/insert PHI nodes as necessary.  */
4150
4151   /* Now update the edges in the CFG.  */
4152   e = ssa_redirect_edge (e, dest);
4153
4154   return e;
4155 }
4156
4157
4158 /* Simple wrapper, as we can always redirect fallthru edges.  */
4159
4160 static basic_block
4161 tree_redirect_edge_and_branch_force (edge e, basic_block dest)
4162 {
4163   e = tree_redirect_edge_and_branch (e, dest);
4164   gcc_assert (e);
4165
4166   return NULL;
4167 }
4168
4169
4170 /* Splits basic block BB after statement STMT (but at least after the
4171    labels).  If STMT is NULL, BB is split just after the labels.  */
4172
4173 static basic_block
4174 tree_split_block (basic_block bb, void *stmt)
4175 {
4176   block_stmt_iterator bsi, bsi_tgt;
4177   tree act;
4178   basic_block new_bb;
4179   edge e;
4180   edge_iterator ei;
4181
4182   new_bb = create_empty_bb (bb);
4183
4184   /* Redirect the outgoing edges.  */
4185   new_bb->succs = bb->succs;
4186   bb->succs = NULL;
4187   FOR_EACH_EDGE (e, ei, new_bb->succs)
4188     e->src = new_bb;
4189
4190   if (stmt && TREE_CODE ((tree) stmt) == LABEL_EXPR)
4191     stmt = NULL;
4192
4193   /* Move everything from BSI to the new basic block.  */
4194   for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
4195     {
4196       act = bsi_stmt (bsi);
4197       if (TREE_CODE (act) == LABEL_EXPR)
4198         continue;
4199
4200       if (!stmt)
4201         break;
4202
4203       if (stmt == act)
4204         {
4205           bsi_next (&bsi);
4206           break;
4207         }
4208     }
4209
4210   bsi_tgt = bsi_start (new_bb);
4211   while (!bsi_end_p (bsi))
4212     {
4213       act = bsi_stmt (bsi);
4214       bsi_remove (&bsi);
4215       bsi_insert_after (&bsi_tgt, act, BSI_NEW_STMT);
4216     }
4217
4218   return new_bb;
4219 }
4220
4221
4222 /* Moves basic block BB after block AFTER.  */
4223
4224 static bool
4225 tree_move_block_after (basic_block bb, basic_block after)
4226 {
4227   if (bb->prev_bb == after)
4228     return true;
4229
4230   unlink_block (bb);
4231   link_block (bb, after);
4232
4233   return true;
4234 }
4235
4236
4237 /* Return true if basic_block can be duplicated.  */
4238
4239 static bool
4240 tree_can_duplicate_bb_p (basic_block bb ATTRIBUTE_UNUSED)
4241 {
4242   return true;
4243 }
4244
4245 /* Create a duplicate of the basic block BB.  NOTE: This does not
4246    preserve SSA form.  */
4247
4248 static basic_block
4249 tree_duplicate_bb (basic_block bb)
4250 {
4251   basic_block new_bb;
4252   block_stmt_iterator bsi, bsi_tgt;
4253   tree phi, val;
4254   ssa_op_iter op_iter;
4255
4256   new_bb = create_empty_bb (EXIT_BLOCK_PTR->prev_bb);
4257
4258   /* First copy the phi nodes.  We do not copy phi node arguments here,
4259      since the edges are not ready yet.  Keep the chain of phi nodes in
4260      the same order, so that we can add them later.  */
4261   for (phi = phi_nodes (bb); phi; phi = TREE_CHAIN (phi))
4262     {
4263       mark_for_rewrite (PHI_RESULT (phi));
4264       create_phi_node (PHI_RESULT (phi), new_bb);
4265     }
4266   set_phi_nodes (new_bb, nreverse (phi_nodes (new_bb)));
4267
4268   bsi_tgt = bsi_start (new_bb);
4269   for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
4270     {
4271       tree stmt = bsi_stmt (bsi);
4272       tree copy;
4273
4274       if (TREE_CODE (stmt) == LABEL_EXPR)
4275         continue;
4276
4277       /* Record the definitions.  */
4278       get_stmt_operands (stmt);
4279
4280       FOR_EACH_SSA_TREE_OPERAND (val, stmt, op_iter, SSA_OP_ALL_DEFS)
4281         mark_for_rewrite (val);
4282
4283       copy = unshare_expr (stmt);
4284
4285       /* Copy also the virtual operands.  */
4286       get_stmt_ann (copy);
4287       copy_virtual_operands (copy, stmt);
4288       
4289       bsi_insert_after (&bsi_tgt, copy, BSI_NEW_STMT);
4290     }
4291
4292   return new_bb;
4293 }
4294
4295 /* Basic block BB_COPY was created by code duplication.  Add phi node
4296    arguments for edges going out of BB_COPY.  The blocks that were
4297    duplicated have rbi->duplicated set to one.  */
4298
4299 void
4300 add_phi_args_after_copy_bb (basic_block bb_copy)
4301 {
4302   basic_block bb, dest;
4303   edge e, e_copy;
4304   edge_iterator ei;
4305   tree phi, phi_copy, phi_next, def;
4306       
4307   bb = bb_copy->rbi->original;
4308
4309   FOR_EACH_EDGE (e_copy, ei, bb_copy->succs)
4310     {
4311       if (!phi_nodes (e_copy->dest))
4312         continue;
4313
4314       if (e_copy->dest->rbi->duplicated)
4315         dest = e_copy->dest->rbi->original;
4316       else
4317         dest = e_copy->dest;
4318
4319       e = find_edge (bb, dest);
4320       if (!e)
4321         {
4322           /* During loop unrolling the target of the latch edge is copied.
4323              In this case we are not looking for edge to dest, but to
4324              duplicated block whose original was dest.  */
4325           FOR_EACH_EDGE (e, ei, bb->succs)
4326             if (e->dest->rbi->duplicated
4327                 && e->dest->rbi->original == dest)
4328               break;
4329
4330           gcc_assert (e != NULL);
4331         }
4332
4333       for (phi = phi_nodes (e->dest), phi_copy = phi_nodes (e_copy->dest);
4334            phi;
4335            phi = phi_next, phi_copy = TREE_CHAIN (phi_copy))
4336         {
4337           phi_next = TREE_CHAIN (phi);
4338
4339           gcc_assert (PHI_RESULT (phi) == PHI_RESULT (phi_copy));
4340           def = PHI_ARG_DEF_FROM_EDGE (phi, e);
4341           add_phi_arg (&phi_copy, def, e_copy);
4342         }
4343     }
4344 }
4345
4346 /* Blocks in REGION_COPY array of length N_REGION were created by
4347    duplication of basic blocks.  Add phi node arguments for edges
4348    going from these blocks.  */
4349
4350 void
4351 add_phi_args_after_copy (basic_block *region_copy, unsigned n_region)
4352 {
4353   unsigned i;
4354
4355   for (i = 0; i < n_region; i++)
4356     region_copy[i]->rbi->duplicated = 1;
4357
4358   for (i = 0; i < n_region; i++)
4359     add_phi_args_after_copy_bb (region_copy[i]);
4360
4361   for (i = 0; i < n_region; i++)
4362     region_copy[i]->rbi->duplicated = 0;
4363 }
4364
4365 /* Maps the old ssa name FROM_NAME to TO_NAME.  */
4366
4367 struct ssa_name_map_entry
4368 {
4369   tree from_name;
4370   tree to_name;
4371 };
4372
4373 /* Hash function for ssa_name_map_entry.  */
4374
4375 static hashval_t
4376 ssa_name_map_entry_hash (const void *entry)
4377 {
4378   const struct ssa_name_map_entry *en = entry;
4379   return SSA_NAME_VERSION (en->from_name);
4380 }
4381
4382 /* Equality function for ssa_name_map_entry.  */
4383
4384 static int
4385 ssa_name_map_entry_eq (const void *in_table, const void *ssa_name)
4386 {
4387   const struct ssa_name_map_entry *en = in_table;
4388
4389   return en->from_name == ssa_name;
4390 }
4391
4392 /* Allocate duplicates of ssa names in list DEFINITIONS and store the mapping
4393    to MAP.  */
4394
4395 void
4396 allocate_ssa_names (bitmap definitions, htab_t *map)
4397 {
4398   tree name;
4399   struct ssa_name_map_entry *entry;
4400   PTR *slot;
4401   unsigned ver;
4402   bitmap_iterator bi;
4403
4404   if (!*map)
4405     *map = htab_create (10, ssa_name_map_entry_hash,
4406                         ssa_name_map_entry_eq, free);
4407   EXECUTE_IF_SET_IN_BITMAP (definitions, 0, ver, bi)
4408     {
4409       name = ssa_name (ver);
4410       slot = htab_find_slot_with_hash (*map, name, SSA_NAME_VERSION (name),
4411                                        INSERT);
4412       if (*slot)
4413         entry = *slot;
4414       else
4415         {
4416           entry = xmalloc (sizeof (struct ssa_name_map_entry));
4417           entry->from_name = name;
4418           *slot = entry;
4419         }
4420       entry->to_name = duplicate_ssa_name (name, SSA_NAME_DEF_STMT (name));
4421     }
4422 }
4423
4424 /* Rewrite the definition DEF in statement STMT to new ssa name as specified
4425    by the mapping MAP.  */
4426
4427 static void
4428 rewrite_to_new_ssa_names_def (def_operand_p def, tree stmt, htab_t map)
4429 {
4430   tree name = DEF_FROM_PTR (def);
4431   struct ssa_name_map_entry *entry;
4432
4433   gcc_assert (TREE_CODE (name) == SSA_NAME);
4434
4435   entry = htab_find_with_hash (map, name, SSA_NAME_VERSION (name));
4436   if (!entry)
4437     return;
4438
4439   SET_DEF (def, entry->to_name);
4440   SSA_NAME_DEF_STMT (entry->to_name) = stmt;
4441 }
4442
4443 /* Rewrite the USE to new ssa name as specified by the mapping MAP.  */
4444
4445 static void
4446 rewrite_to_new_ssa_names_use (use_operand_p use, htab_t map)
4447 {
4448   tree name = USE_FROM_PTR (use);
4449   struct ssa_name_map_entry *entry;
4450
4451   if (TREE_CODE (name) != SSA_NAME)
4452     return;
4453
4454   entry = htab_find_with_hash (map, name, SSA_NAME_VERSION (name));
4455   if (!entry)
4456     return;
4457
4458   SET_USE (use, entry->to_name);
4459 }
4460
4461 /* Rewrite the ssa names in basic block BB to new ones as specified by the
4462    mapping MAP.  */
4463
4464 void
4465 rewrite_to_new_ssa_names_bb (basic_block bb, htab_t map)
4466 {
4467   unsigned i;
4468   edge e;
4469   edge_iterator ei;
4470   tree phi, stmt;
4471   block_stmt_iterator bsi;
4472   use_optype uses;
4473   vuse_optype vuses;
4474   def_optype defs;
4475   v_may_def_optype v_may_defs;
4476   v_must_def_optype v_must_defs;
4477   stmt_ann_t ann;
4478
4479   FOR_EACH_EDGE (e, ei, bb->preds)
4480     if (e->flags & EDGE_ABNORMAL)
4481       break;
4482
4483   for (phi = phi_nodes (bb); phi; phi = TREE_CHAIN (phi))
4484     {
4485       rewrite_to_new_ssa_names_def (PHI_RESULT_PTR (phi), phi, map);
4486       if (e)
4487         SSA_NAME_OCCURS_IN_ABNORMAL_PHI (PHI_RESULT (phi)) = 1;
4488     }
4489
4490   for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
4491     {
4492       stmt = bsi_stmt (bsi);
4493       get_stmt_operands (stmt);
4494       ann = stmt_ann (stmt);
4495
4496       uses = USE_OPS (ann);
4497       for (i = 0; i < NUM_USES (uses); i++)
4498         rewrite_to_new_ssa_names_use (USE_OP_PTR (uses, i), map);
4499
4500       defs = DEF_OPS (ann);
4501       for (i = 0; i < NUM_DEFS (defs); i++)
4502         rewrite_to_new_ssa_names_def (DEF_OP_PTR (defs, i), stmt, map);
4503
4504       vuses = VUSE_OPS (ann);
4505       for (i = 0; i < NUM_VUSES (vuses); i++)
4506         rewrite_to_new_ssa_names_use (VUSE_OP_PTR (vuses, i), map);
4507
4508       v_may_defs = V_MAY_DEF_OPS (ann);
4509       for (i = 0; i < NUM_V_MAY_DEFS (v_may_defs); i++)
4510         {
4511           rewrite_to_new_ssa_names_use
4512                   (V_MAY_DEF_OP_PTR (v_may_defs, i), map);
4513           rewrite_to_new_ssa_names_def
4514                   (V_MAY_DEF_RESULT_PTR (v_may_defs, i), stmt, map);
4515         }
4516
4517       v_must_defs = V_MUST_DEF_OPS (ann);
4518       for (i = 0; i < NUM_V_MUST_DEFS (v_must_defs); i++)
4519         rewrite_to_new_ssa_names_def
4520                 (V_MUST_DEF_OP_PTR (v_must_defs, i), stmt, map);
4521     }
4522
4523   FOR_EACH_EDGE (e, ei, bb->succs)
4524     for (phi = phi_nodes (e->dest); phi; phi = TREE_CHAIN (phi))
4525       {
4526         rewrite_to_new_ssa_names_use
4527                 (PHI_ARG_DEF_PTR_FROM_EDGE (phi, e), map);
4528
4529         if (e->flags & EDGE_ABNORMAL)
4530           {
4531             tree op = PHI_ARG_DEF_FROM_EDGE (phi, e);
4532             SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op) = 1;
4533           }
4534       }
4535 }
4536
4537 /* Rewrite the ssa names in N_REGION blocks REGION to the new ones as specified
4538    by the mapping MAP.  */
4539
4540 void
4541 rewrite_to_new_ssa_names (basic_block *region, unsigned n_region, htab_t map)
4542 {
4543   unsigned r;
4544
4545   for (r = 0; r < n_region; r++)
4546     rewrite_to_new_ssa_names_bb (region[r], map);
4547 }
4548
4549 /* Duplicates a REGION (set of N_REGION basic blocks) with just a single
4550    important exit edge EXIT.  By important we mean that no SSA name defined
4551    inside region is live over the other exit edges of the region.  All entry
4552    edges to the region must go to ENTRY->dest.  The edge ENTRY is redirected
4553    to the duplicate of the region.  SSA form, dominance and loop information
4554    is updated.  The new basic blocks are stored to REGION_COPY in the same
4555    order as they had in REGION, provided that REGION_COPY is not NULL.
4556    The function returns false if it is unable to copy the region,
4557    true otherwise.  */
4558
4559 bool
4560 tree_duplicate_sese_region (edge entry, edge exit,
4561                             basic_block *region, unsigned n_region,
4562                             basic_block *region_copy)
4563 {
4564   unsigned i, n_doms, ver;
4565   bool free_region_copy = false, copying_header = false;
4566   struct loop *loop = entry->dest->loop_father;
4567   edge exit_copy;
4568   bitmap definitions;
4569   tree phi, var;
4570   basic_block *doms;
4571   htab_t ssa_name_map = NULL;
4572   edge redirected;
4573   bitmap_iterator bi;
4574
4575   if (!can_copy_bbs_p (region, n_region))
4576     return false;
4577
4578   /* Some sanity checking.  Note that we do not check for all possible
4579      missuses of the functions.  I.e. if you ask to copy something weird,
4580      it will work, but the state of structures probably will not be
4581      correct.  */
4582
4583   for (i = 0; i < n_region; i++)
4584     {
4585       /* We do not handle subloops, i.e. all the blocks must belong to the
4586          same loop.  */
4587       if (region[i]->loop_father != loop)
4588         return false;
4589
4590       if (region[i] != entry->dest
4591           && region[i] == loop->header)
4592         return false;
4593     }
4594
4595   loop->copy = loop;
4596
4597   /* In case the function is used for loop header copying (which is the primary
4598      use), ensure that EXIT and its copy will be new latch and entry edges.  */
4599   if (loop->header == entry->dest)
4600     {
4601       copying_header = true;
4602       loop->copy = loop->outer;
4603
4604       if (!dominated_by_p (CDI_DOMINATORS, loop->latch, exit->src))
4605         return false;
4606
4607       for (i = 0; i < n_region; i++)
4608         if (region[i] != exit->src
4609             && dominated_by_p (CDI_DOMINATORS, region[i], exit->src))
4610           return false;
4611     }
4612
4613   if (!region_copy)
4614     {
4615       region_copy = xmalloc (sizeof (basic_block) * n_region);
4616       free_region_copy = true;
4617     }
4618
4619   gcc_assert (!any_marked_for_rewrite_p ());
4620
4621   /* Record blocks outside the region that are duplicated by something
4622      inside.  */
4623   doms = xmalloc (sizeof (basic_block) * n_basic_blocks);
4624   n_doms = get_dominated_by_region (CDI_DOMINATORS, region, n_region, doms);
4625
4626   copy_bbs (region, n_region, region_copy, &exit, 1, &exit_copy, loop);
4627   definitions = marked_ssa_names ();
4628
4629   if (copying_header)
4630     {
4631       loop->header = exit->dest;
4632       loop->latch = exit->src;
4633     }
4634
4635   /* Redirect the entry and add the phi node arguments.  */
4636   redirected = redirect_edge_and_branch (entry, entry->dest->rbi->copy);
4637   gcc_assert (redirected != NULL);
4638   for (phi = phi_nodes (entry->dest), var = PENDING_STMT (entry);
4639        phi;
4640        phi = TREE_CHAIN (phi), var = TREE_CHAIN (var))
4641     add_phi_arg (&phi, TREE_VALUE (var), entry);
4642   PENDING_STMT (entry) = NULL;
4643
4644   /* Concerning updating of dominators:  We must recount dominators
4645      for entry block and its copy.  Anything that is outside of the region, but
4646      was dominated by something inside needs recounting as well.  */
4647   set_immediate_dominator (CDI_DOMINATORS, entry->dest, entry->src);
4648   doms[n_doms++] = entry->dest->rbi->original;
4649   iterate_fix_dominators (CDI_DOMINATORS, doms, n_doms);
4650   free (doms);
4651
4652   /* Add the other phi node arguments.  */
4653   add_phi_args_after_copy (region_copy, n_region);
4654
4655   /* Add phi nodes for definitions at exit.  TODO -- once we have immediate
4656      uses, it should be possible to emit phi nodes just for definitions that
4657      are used outside region.  */
4658   EXECUTE_IF_SET_IN_BITMAP (definitions, 0, ver, bi)
4659     {
4660       tree name = ssa_name (ver);
4661
4662       phi = create_phi_node (name, exit->dest);
4663       add_phi_arg (&phi, name, exit);
4664       add_phi_arg (&phi, name, exit_copy);
4665
4666       SSA_NAME_DEF_STMT (name) = phi;
4667     }
4668
4669   /* And create new definitions inside region and its copy.  TODO -- once we
4670      have immediate uses, it might be better to leave definitions in region
4671      unchanged, create new ssa names for phi nodes on exit, and rewrite
4672      the uses, to avoid changing the copied region.  */
4673   allocate_ssa_names (definitions, &ssa_name_map);
4674   rewrite_to_new_ssa_names (region, n_region, ssa_name_map);
4675   allocate_ssa_names (definitions, &ssa_name_map);
4676   rewrite_to_new_ssa_names (region_copy, n_region, ssa_name_map);
4677   htab_delete (ssa_name_map);
4678
4679   if (free_region_copy)
4680     free (region_copy);
4681
4682   unmark_all_for_rewrite ();
4683   BITMAP_XFREE (definitions);
4684
4685   return true;
4686 }
4687
4688 /* Dump FUNCTION_DECL FN to file FILE using FLAGS (see TDF_* in tree.h)  */
4689
4690 void
4691 dump_function_to_file (tree fn, FILE *file, int flags)
4692 {
4693   tree arg, vars, var;
4694   bool ignore_topmost_bind = false, any_var = false;
4695   basic_block bb;
4696   tree chain;
4697
4698   fprintf (file, "%s (", lang_hooks.decl_printable_name (fn, 2));
4699
4700   arg = DECL_ARGUMENTS (fn);
4701   while (arg)
4702     {
4703       print_generic_expr (file, arg, dump_flags);
4704       if (TREE_CHAIN (arg))
4705         fprintf (file, ", ");
4706       arg = TREE_CHAIN (arg);
4707     }
4708   fprintf (file, ")\n");
4709
4710   if (flags & TDF_RAW)
4711     {
4712       dump_node (fn, TDF_SLIM | flags, file);
4713       return;
4714     }
4715
4716   /* When GIMPLE is lowered, the variables are no longer available in
4717      BIND_EXPRs, so display them separately.  */
4718   if (cfun && cfun->unexpanded_var_list)
4719     {
4720       ignore_topmost_bind = true;
4721
4722       fprintf (file, "{\n");
4723       for (vars = cfun->unexpanded_var_list; vars; vars = TREE_CHAIN (vars))
4724         {
4725           var = TREE_VALUE (vars);
4726
4727           print_generic_decl (file, var, flags);
4728           fprintf (file, "\n");
4729
4730           any_var = true;
4731         }
4732     }
4733
4734   if (basic_block_info)
4735     {
4736       /* Make a CFG based dump.  */
4737       check_bb_profile (ENTRY_BLOCK_PTR, file);
4738       if (!ignore_topmost_bind)
4739         fprintf (file, "{\n");
4740
4741       if (any_var && n_basic_blocks)
4742         fprintf (file, "\n");
4743
4744       FOR_EACH_BB (bb)
4745         dump_generic_bb (file, bb, 2, flags);
4746         
4747       fprintf (file, "}\n");
4748       check_bb_profile (EXIT_BLOCK_PTR, file);
4749     }
4750   else
4751     {
4752       int indent;
4753
4754       /* Make a tree based dump.  */
4755       chain = DECL_SAVED_TREE (fn);
4756
4757       if (TREE_CODE (chain) == BIND_EXPR)
4758         {
4759           if (ignore_topmost_bind)
4760             {
4761               chain = BIND_EXPR_BODY (chain);
4762               indent = 2;
4763             }
4764           else
4765             indent = 0;
4766         }
4767       else
4768         {
4769           if (!ignore_topmost_bind)
4770             fprintf (file, "{\n");
4771           indent = 2;
4772         }
4773
4774       if (any_var)
4775         fprintf (file, "\n");
4776
4777       print_generic_stmt_indented (file, chain, flags, indent);
4778       if (ignore_topmost_bind)
4779         fprintf (file, "}\n");
4780     }
4781
4782   fprintf (file, "\n\n");
4783 }
4784
4785
4786 /* Pretty print of the loops intermediate representation.  */
4787 static void print_loop (FILE *, struct loop *, int);
4788 static void print_pred_bbs (FILE *, basic_block bb);
4789 static void print_succ_bbs (FILE *, basic_block bb);
4790
4791
4792 /* Print the predecessors indexes of edge E on FILE.  */
4793
4794 static void
4795 print_pred_bbs (FILE *file, basic_block bb)
4796 {
4797   edge e;
4798   edge_iterator ei;
4799
4800   FOR_EACH_EDGE (e, ei, bb->preds)
4801     fprintf (file, "bb_%d", e->src->index);
4802 }
4803
4804
4805 /* Print the successors indexes of edge E on FILE.  */
4806
4807 static void
4808 print_succ_bbs (FILE *file, basic_block bb)
4809 {
4810   edge e;
4811   edge_iterator ei;
4812
4813   FOR_EACH_EDGE (e, ei, bb->succs)
4814     fprintf (file, "bb_%d", e->src->index);
4815 }
4816
4817
4818 /* Pretty print LOOP on FILE, indented INDENT spaces.  */
4819
4820 static void
4821 print_loop (FILE *file, struct loop *loop, int indent)
4822 {
4823   char *s_indent;
4824   basic_block bb;
4825   
4826   if (loop == NULL)
4827     return;
4828
4829   s_indent = (char *) alloca ((size_t) indent + 1);
4830   memset ((void *) s_indent, ' ', (size_t) indent);
4831   s_indent[indent] = '\0';
4832
4833   /* Print the loop's header.  */
4834   fprintf (file, "%sloop_%d\n", s_indent, loop->num);
4835   
4836   /* Print the loop's body.  */
4837   fprintf (file, "%s{\n", s_indent);
4838   FOR_EACH_BB (bb)
4839     if (bb->loop_father == loop)
4840       {
4841         /* Print the basic_block's header.  */
4842         fprintf (file, "%s  bb_%d (preds = {", s_indent, bb->index);
4843         print_pred_bbs (file, bb);
4844         fprintf (file, "}, succs = {");
4845         print_succ_bbs (file, bb);
4846         fprintf (file, "})\n");
4847         
4848         /* Print the basic_block's body.  */
4849         fprintf (file, "%s  {\n", s_indent);
4850         tree_dump_bb (bb, file, indent + 4);
4851         fprintf (file, "%s  }\n", s_indent);
4852       }
4853   
4854   print_loop (file, loop->inner, indent + 2);
4855   fprintf (file, "%s}\n", s_indent);
4856   print_loop (file, loop->next, indent);
4857 }
4858
4859
4860 /* Follow a CFG edge from the entry point of the program, and on entry
4861    of a loop, pretty print the loop structure on FILE.  */
4862
4863 void 
4864 print_loop_ir (FILE *file)
4865 {
4866   basic_block bb;
4867   
4868   bb = BASIC_BLOCK (0);
4869   if (bb && bb->loop_father)
4870     print_loop (file, bb->loop_father, 0);
4871 }
4872
4873
4874 /* Debugging loops structure at tree level.  */
4875
4876 void 
4877 debug_loop_ir (void)
4878 {
4879   print_loop_ir (stderr);
4880 }
4881
4882
4883 /* Return true if BB ends with a call, possibly followed by some
4884    instructions that must stay with the call.  Return false,
4885    otherwise.  */
4886
4887 static bool
4888 tree_block_ends_with_call_p (basic_block bb)
4889 {
4890   block_stmt_iterator bsi = bsi_last (bb);
4891   return get_call_expr_in (bsi_stmt (bsi)) != NULL;
4892 }
4893
4894
4895 /* Return true if BB ends with a conditional branch.  Return false,
4896    otherwise.  */
4897
4898 static bool
4899 tree_block_ends_with_condjump_p (basic_block bb)
4900 {
4901   tree stmt = tsi_stmt (bsi_last (bb).tsi);
4902   return (TREE_CODE (stmt) == COND_EXPR);
4903 }
4904
4905
4906 /* Return true if we need to add fake edge to exit at statement T.
4907    Helper function for tree_flow_call_edges_add.  */
4908
4909 static bool
4910 need_fake_edge_p (tree t)
4911 {
4912   tree call;
4913
4914   /* NORETURN and LONGJMP calls already have an edge to exit.
4915      CONST, PURE and ALWAYS_RETURN calls do not need one.
4916      We don't currently check for CONST and PURE here, although
4917      it would be a good idea, because those attributes are
4918      figured out from the RTL in mark_constant_function, and
4919      the counter incrementation code from -fprofile-arcs
4920      leads to different results from -fbranch-probabilities.  */
4921   call = get_call_expr_in (t);
4922   if (call
4923       && !(call_expr_flags (call) & 
4924            (ECF_NORETURN | ECF_LONGJMP | ECF_ALWAYS_RETURN)))
4925     return true;
4926
4927   if (TREE_CODE (t) == ASM_EXPR
4928        && (ASM_VOLATILE_P (t) || ASM_INPUT_P (t)))
4929     return true;
4930
4931   return false;
4932 }
4933
4934
4935 /* Add fake edges to the function exit for any non constant and non
4936    noreturn calls, volatile inline assembly in the bitmap of blocks
4937    specified by BLOCKS or to the whole CFG if BLOCKS is zero.  Return
4938    the number of blocks that were split.
4939
4940    The goal is to expose cases in which entering a basic block does
4941    not imply that all subsequent instructions must be executed.  */
4942
4943 static int
4944 tree_flow_call_edges_add (sbitmap blocks)
4945 {
4946   int i;
4947   int blocks_split = 0;
4948   int last_bb = last_basic_block;
4949   bool check_last_block = false;
4950
4951   if (n_basic_blocks == 0)
4952     return 0;
4953
4954   if (! blocks)
4955     check_last_block = true;
4956   else
4957     check_last_block = TEST_BIT (blocks, EXIT_BLOCK_PTR->prev_bb->index);
4958
4959   /* In the last basic block, before epilogue generation, there will be
4960      a fallthru edge to EXIT.  Special care is required if the last insn
4961      of the last basic block is a call because make_edge folds duplicate
4962      edges, which would result in the fallthru edge also being marked
4963      fake, which would result in the fallthru edge being removed by
4964      remove_fake_edges, which would result in an invalid CFG.
4965
4966      Moreover, we can't elide the outgoing fake edge, since the block
4967      profiler needs to take this into account in order to solve the minimal
4968      spanning tree in the case that the call doesn't return.
4969
4970      Handle this by adding a dummy instruction in a new last basic block.  */
4971   if (check_last_block)
4972     {
4973       edge_iterator ei;
4974       basic_block bb = EXIT_BLOCK_PTR->prev_bb;
4975       block_stmt_iterator bsi = bsi_last (bb);
4976       tree t = NULL_TREE;
4977       if (!bsi_end_p (bsi))
4978         t = bsi_stmt (bsi);
4979
4980       if (need_fake_edge_p (t))
4981         {
4982           edge e;
4983
4984           FOR_EACH_EDGE (e, ei, bb->succs)
4985             if (e->dest == EXIT_BLOCK_PTR)
4986               {
4987                 bsi_insert_on_edge (e, build_empty_stmt ());
4988                 bsi_commit_edge_inserts ((int *)NULL);
4989                 break;
4990               }
4991         }
4992     }
4993
4994   /* Now add fake edges to the function exit for any non constant
4995      calls since there is no way that we can determine if they will
4996      return or not...  */
4997   for (i = 0; i < last_bb; i++)
4998     {
4999       basic_block bb = BASIC_BLOCK (i);
5000       block_stmt_iterator bsi;
5001       tree stmt, last_stmt;
5002
5003       if (!bb)
5004         continue;
5005
5006       if (blocks && !TEST_BIT (blocks, i))
5007         continue;
5008
5009       bsi = bsi_last (bb);
5010       if (!bsi_end_p (bsi))
5011         {
5012           last_stmt = bsi_stmt (bsi);
5013           do
5014             {
5015               stmt = bsi_stmt (bsi);
5016               if (need_fake_edge_p (stmt))
5017                 {
5018                   edge e;
5019                   /* The handling above of the final block before the
5020                      epilogue should be enough to verify that there is
5021                      no edge to the exit block in CFG already.
5022                      Calling make_edge in such case would cause us to
5023                      mark that edge as fake and remove it later.  */
5024 #ifdef ENABLE_CHECKING
5025                   if (stmt == last_stmt)
5026                     {
5027                       edge_iterator ei;
5028                       FOR_EACH_EDGE (e, ei, bb->succs)
5029                         gcc_assert (e->dest != EXIT_BLOCK_PTR);
5030                     }
5031 #endif
5032
5033                   /* Note that the following may create a new basic block
5034                      and renumber the existing basic blocks.  */
5035                   if (stmt != last_stmt)
5036                     {
5037                       e = split_block (bb, stmt);
5038                       if (e)
5039                         blocks_split++;
5040                     }
5041                   make_edge (bb, EXIT_BLOCK_PTR, EDGE_FAKE);
5042                 }
5043               bsi_prev (&bsi);
5044             }
5045           while (!bsi_end_p (bsi));
5046         }
5047     }
5048
5049   if (blocks_split)
5050     verify_flow_info ();
5051
5052   return blocks_split;
5053 }
5054
5055 bool
5056 tree_purge_dead_eh_edges (basic_block bb)
5057 {
5058   bool changed = false;
5059   edge e;
5060   edge_iterator ei;
5061   tree stmt = last_stmt (bb);
5062
5063   if (stmt && tree_can_throw_internal (stmt))
5064     return false;
5065
5066   for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
5067     {
5068       if (e->flags & EDGE_EH)
5069         {
5070           ssa_remove_edge (e);
5071           changed = true;
5072         }
5073       else
5074         ei_next (&ei);
5075     }
5076
5077   return changed;
5078 }
5079
5080 bool
5081 tree_purge_all_dead_eh_edges (bitmap blocks)
5082 {
5083   bool changed = false;
5084   size_t i;
5085   bitmap_iterator bi;
5086
5087   EXECUTE_IF_SET_IN_BITMAP (blocks, 0, i, bi)
5088     {
5089       changed |= tree_purge_dead_eh_edges (BASIC_BLOCK (i));
5090     }
5091
5092   return changed;
5093 }
5094
5095 struct cfg_hooks tree_cfg_hooks = {
5096   "tree",
5097   tree_verify_flow_info,
5098   tree_dump_bb,                 /* dump_bb  */
5099   create_bb,                    /* create_basic_block  */
5100   tree_redirect_edge_and_branch,/* redirect_edge_and_branch  */
5101   tree_redirect_edge_and_branch_force,/* redirect_edge_and_branch_force  */
5102   remove_bb,                    /* delete_basic_block  */
5103   tree_split_block,             /* split_block  */
5104   tree_move_block_after,        /* move_block_after  */
5105   tree_can_merge_blocks_p,      /* can_merge_blocks_p  */
5106   tree_merge_blocks,            /* merge_blocks  */
5107   tree_predict_edge,            /* predict_edge  */
5108   tree_predicted_by_p,          /* predicted_by_p  */
5109   tree_can_duplicate_bb_p,      /* can_duplicate_block_p  */
5110   tree_duplicate_bb,            /* duplicate_block  */
5111   tree_split_edge,              /* split_edge  */
5112   tree_make_forwarder_block,    /* make_forward_block  */
5113   NULL,                         /* tidy_fallthru_edge  */
5114   tree_block_ends_with_call_p,  /* block_ends_with_call_p */
5115   tree_block_ends_with_condjump_p, /* block_ends_with_condjump_p */
5116   tree_flow_call_edges_add      /* flow_call_edges_add */
5117 };
5118
5119
5120 /* Split all critical edges.  */
5121
5122 static void
5123 split_critical_edges (void)
5124 {
5125   basic_block bb;
5126   edge e;
5127   edge_iterator ei;
5128
5129   FOR_ALL_BB (bb)
5130     {
5131       FOR_EACH_EDGE (e, ei, bb->succs)
5132         if (EDGE_CRITICAL_P (e) && !(e->flags & EDGE_ABNORMAL))
5133           {
5134             split_edge (e);
5135           }
5136     }
5137 }
5138
5139 struct tree_opt_pass pass_split_crit_edges = 
5140 {
5141   "crited",                          /* name */
5142   NULL,                          /* gate */
5143   split_critical_edges,          /* execute */
5144   NULL,                          /* sub */
5145   NULL,                          /* next */
5146   0,                             /* static_pass_number */
5147   TV_TREE_SPLIT_EDGES,           /* tv_id */
5148   PROP_cfg,                      /* properties required */
5149   PROP_no_crit_edges,            /* properties_provided */
5150   0,                             /* properties_destroyed */
5151   0,                             /* todo_flags_start */
5152   TODO_dump_func,                /* todo_flags_finish */
5153   0                              /* letter */
5154 };
5155
5156 \f
5157 /* Return EXP if it is a valid GIMPLE rvalue, else gimplify it into
5158    a temporary, make sure and register it to be renamed if necessary,
5159    and finally return the temporary.  Put the statements to compute
5160    EXP before the current statement in BSI.  */
5161
5162 tree
5163 gimplify_val (block_stmt_iterator *bsi, tree type, tree exp)
5164 {
5165   tree t, new_stmt, orig_stmt;
5166
5167   if (is_gimple_val (exp))
5168     return exp;
5169
5170   t = make_rename_temp (type, NULL);
5171   new_stmt = build (MODIFY_EXPR, type, t, exp);
5172
5173   orig_stmt = bsi_stmt (*bsi);
5174   SET_EXPR_LOCUS (new_stmt, EXPR_LOCUS (orig_stmt));
5175   TREE_BLOCK (new_stmt) = TREE_BLOCK (orig_stmt);
5176
5177   bsi_insert_before (bsi, new_stmt, BSI_SAME_STMT);
5178
5179   return t;
5180 }
5181
5182 /* Build a ternary operation and gimplify it.  Emit code before BSI.
5183    Return the gimple_val holding the result.  */
5184
5185 tree
5186 gimplify_build3 (block_stmt_iterator *bsi, enum tree_code code,
5187                  tree type, tree a, tree b, tree c)
5188 {
5189   tree ret;
5190
5191   ret = fold (build3 (code, type, a, b, c));
5192   STRIP_NOPS (ret);
5193
5194   return gimplify_val (bsi, type, ret);
5195 }
5196
5197 /* Build a binary operation and gimplify it.  Emit code before BSI.
5198    Return the gimple_val holding the result.  */
5199
5200 tree
5201 gimplify_build2 (block_stmt_iterator *bsi, enum tree_code code,
5202                  tree type, tree a, tree b)
5203 {
5204   tree ret;
5205
5206   ret = fold (build2 (code, type, a, b));
5207   STRIP_NOPS (ret);
5208
5209   return gimplify_val (bsi, type, ret);
5210 }
5211
5212 /* Build a unary operation and gimplify it.  Emit code before BSI.
5213    Return the gimple_val holding the result.  */
5214
5215 tree
5216 gimplify_build1 (block_stmt_iterator *bsi, enum tree_code code, tree type,
5217                  tree a)
5218 {
5219   tree ret;
5220
5221   ret = fold (build1 (code, type, a));
5222   STRIP_NOPS (ret);
5223
5224   return gimplify_val (bsi, type, ret);
5225 }
5226
5227
5228 \f
5229 /* Emit return warnings.  */
5230
5231 static void
5232 execute_warn_function_return (void)
5233 {
5234 #ifdef USE_MAPPED_LOCATION
5235   source_location location;
5236 #else
5237   location_t *locus;
5238 #endif
5239   tree last;
5240   edge e;
5241   edge_iterator ei;
5242
5243   if (warn_missing_noreturn
5244       && !TREE_THIS_VOLATILE (cfun->decl)
5245       && EDGE_COUNT (EXIT_BLOCK_PTR->preds) == 0
5246       && !lang_hooks.function.missing_noreturn_ok_p (cfun->decl))
5247     warning ("%Jfunction might be possible candidate for "
5248              "attribute %<noreturn%>",
5249              cfun->decl);
5250
5251   /* If we have a path to EXIT, then we do return.  */
5252   if (TREE_THIS_VOLATILE (cfun->decl)
5253       && EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0)
5254     {
5255 #ifdef USE_MAPPED_LOCATION
5256       location = UNKNOWN_LOCATION;
5257 #else
5258       locus = NULL;
5259 #endif
5260       FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
5261         {
5262           last = last_stmt (e->src);
5263           if (TREE_CODE (last) == RETURN_EXPR
5264 #ifdef USE_MAPPED_LOCATION
5265               && (location = EXPR_LOCATION (last)) != UNKNOWN_LOCATION)
5266 #else
5267               && (locus = EXPR_LOCUS (last)) != NULL)
5268 #endif
5269             break;
5270         }
5271 #ifdef USE_MAPPED_LOCATION
5272       if (location == UNKNOWN_LOCATION)
5273         location = cfun->function_end_locus;
5274       warning ("%H%<noreturn%> function does return", &location);
5275 #else
5276       if (!locus)
5277         locus = &cfun->function_end_locus;
5278       warning ("%H%<noreturn%> function does return", locus);
5279 #endif
5280     }
5281
5282   /* If we see "return;" in some basic block, then we do reach the end
5283      without returning a value.  */
5284   else if (warn_return_type
5285            && EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0
5286            && !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (cfun->decl))))
5287     {
5288       FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
5289         {
5290           tree last = last_stmt (e->src);
5291           if (TREE_CODE (last) == RETURN_EXPR
5292               && TREE_OPERAND (last, 0) == NULL)
5293             {
5294 #ifdef USE_MAPPED_LOCATION
5295               location = EXPR_LOCATION (last);
5296               if (location == UNKNOWN_LOCATION)
5297                   location = cfun->function_end_locus;
5298               warning ("%Hcontrol reaches end of non-void function", &location);
5299 #else
5300               locus = EXPR_LOCUS (last);
5301               if (!locus)
5302                 locus = &cfun->function_end_locus;
5303               warning ("%Hcontrol reaches end of non-void function", locus);
5304 #endif
5305               break;
5306             }
5307         }
5308     }
5309 }
5310
5311
5312 /* Given a basic block B which ends with a conditional and has
5313    precisely two successors, determine which of the edges is taken if
5314    the conditional is true and which is taken if the conditional is
5315    false.  Set TRUE_EDGE and FALSE_EDGE appropriately.  */
5316
5317 void
5318 extract_true_false_edges_from_block (basic_block b,
5319                                      edge *true_edge,
5320                                      edge *false_edge)
5321 {
5322   edge e = EDGE_SUCC (b, 0);
5323
5324   if (e->flags & EDGE_TRUE_VALUE)
5325     {
5326       *true_edge = e;
5327       *false_edge = EDGE_SUCC (b, 1);
5328     }
5329   else
5330     {
5331       *false_edge = e;
5332       *true_edge = EDGE_SUCC (b, 1);
5333     }
5334 }
5335
5336 struct tree_opt_pass pass_warn_function_return =
5337 {
5338   NULL,                                 /* name */
5339   NULL,                                 /* gate */
5340   execute_warn_function_return,         /* execute */
5341   NULL,                                 /* sub */
5342   NULL,                                 /* next */
5343   0,                                    /* static_pass_number */
5344   0,                                    /* tv_id */
5345   PROP_cfg,                             /* properties_required */
5346   0,                                    /* properties_provided */
5347   0,                                    /* properties_destroyed */
5348   0,                                    /* todo_flags_start */
5349   0,                                    /* todo_flags_finish */
5350   0                                     /* letter */
5351 };
5352
5353 #include "gt-tree-cfg.h"