OSDN Git Service

6f5284ec10c445f73f18f49a3061bab914417717
[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 (bb->succ == NULL)
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 (bb->succ == NULL)
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 && !bb->succ)
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 (!a->succ
1013       || a->succ->succ_next)
1014     return false;
1015
1016   if (a->succ->flags & EDGE_ABNORMAL)
1017     return false;
1018
1019   if (a->succ->dest != b)
1020     return false;
1021
1022   if (b == EXIT_BLOCK_PTR)
1023     return false;
1024   
1025   if (b->pred->pred_next)
1026     return false;
1027
1028   /* If A ends by a statement causing exceptions or something similar, we
1029      cannot merge the blocks.  */
1030   stmt = last_stmt (a);
1031   if (stmt && stmt_ends_bb_p (stmt))
1032     return false;
1033
1034   /* Do not allow a block with only a non-local label to be merged.  */
1035   if (stmt && TREE_CODE (stmt) == LABEL_EXPR
1036       && DECL_NONLOCAL (LABEL_EXPR_LABEL (stmt)))
1037     return false;
1038
1039   /* There may be no phi nodes at the start of b.  Most of these degenerate
1040      phi nodes should be cleaned up by kill_redundant_phi_nodes.  */
1041   if (phi_nodes (b))
1042     return false;
1043
1044   /* Do not remove user labels.  */
1045   for (bsi = bsi_start (b); !bsi_end_p (bsi); bsi_next (&bsi))
1046     {
1047       stmt = bsi_stmt (bsi);
1048       if (TREE_CODE (stmt) != LABEL_EXPR)
1049         break;
1050       if (!DECL_ARTIFICIAL (LABEL_EXPR_LABEL (stmt)))
1051         return false;
1052     }
1053
1054   return true;
1055 }
1056
1057
1058 /* Merge block B into block A.  */
1059
1060 static void
1061 tree_merge_blocks (basic_block a, basic_block b)
1062 {
1063   block_stmt_iterator bsi;
1064   tree_stmt_iterator last;
1065
1066   if (dump_file)
1067     fprintf (dump_file, "Merging blocks %d and %d\n", a->index, b->index);
1068
1069   /* Ensure that B follows A.  */
1070   move_block_after (b, a);
1071
1072   gcc_assert (a->succ->flags & EDGE_FALLTHRU);
1073   gcc_assert (!last_stmt (a) || !stmt_ends_bb_p (last_stmt (a)));
1074
1075   /* Remove labels from B and set bb_for_stmt to A for other statements.  */
1076   for (bsi = bsi_start (b); !bsi_end_p (bsi);)
1077     {
1078       if (TREE_CODE (bsi_stmt (bsi)) == LABEL_EXPR)
1079         bsi_remove (&bsi);
1080       else
1081         {
1082           set_bb_for_stmt (bsi_stmt (bsi), a);
1083           bsi_next (&bsi);
1084         }
1085     }
1086
1087   /* Merge the chains.  */
1088   last = tsi_last (a->stmt_list);
1089   tsi_link_after (&last, b->stmt_list, TSI_NEW_STMT);
1090   b->stmt_list = NULL;
1091 }
1092
1093
1094 /* Walk the function tree removing unnecessary statements.
1095
1096      * Empty statement nodes are removed
1097
1098      * Unnecessary TRY_FINALLY and TRY_CATCH blocks are removed
1099
1100      * Unnecessary COND_EXPRs are removed
1101
1102      * Some unnecessary BIND_EXPRs are removed
1103
1104    Clearly more work could be done.  The trick is doing the analysis
1105    and removal fast enough to be a net improvement in compile times.
1106
1107    Note that when we remove a control structure such as a COND_EXPR
1108    BIND_EXPR, or TRY block, we will need to repeat this optimization pass
1109    to ensure we eliminate all the useless code.  */
1110
1111 struct rus_data
1112 {
1113   tree *last_goto;
1114   bool repeat;
1115   bool may_throw;
1116   bool may_branch;
1117   bool has_label;
1118 };
1119
1120 static void remove_useless_stmts_1 (tree *, struct rus_data *);
1121
1122 static bool
1123 remove_useless_stmts_warn_notreached (tree stmt)
1124 {
1125   if (EXPR_HAS_LOCATION (stmt))
1126     {
1127       location_t loc = EXPR_LOCATION (stmt);
1128       warning ("%Hwill never be executed", &loc);
1129       return true;
1130     }
1131
1132   switch (TREE_CODE (stmt))
1133     {
1134     case STATEMENT_LIST:
1135       {
1136         tree_stmt_iterator i;
1137         for (i = tsi_start (stmt); !tsi_end_p (i); tsi_next (&i))
1138           if (remove_useless_stmts_warn_notreached (tsi_stmt (i)))
1139             return true;
1140       }
1141       break;
1142
1143     case COND_EXPR:
1144       if (remove_useless_stmts_warn_notreached (COND_EXPR_COND (stmt)))
1145         return true;
1146       if (remove_useless_stmts_warn_notreached (COND_EXPR_THEN (stmt)))
1147         return true;
1148       if (remove_useless_stmts_warn_notreached (COND_EXPR_ELSE (stmt)))
1149         return true;
1150       break;
1151
1152     case TRY_FINALLY_EXPR:
1153     case TRY_CATCH_EXPR:
1154       if (remove_useless_stmts_warn_notreached (TREE_OPERAND (stmt, 0)))
1155         return true;
1156       if (remove_useless_stmts_warn_notreached (TREE_OPERAND (stmt, 1)))
1157         return true;
1158       break;
1159
1160     case CATCH_EXPR:
1161       return remove_useless_stmts_warn_notreached (CATCH_BODY (stmt));
1162     case EH_FILTER_EXPR:
1163       return remove_useless_stmts_warn_notreached (EH_FILTER_FAILURE (stmt));
1164     case BIND_EXPR:
1165       return remove_useless_stmts_warn_notreached (BIND_EXPR_BLOCK (stmt));
1166
1167     default:
1168       /* Not a live container.  */
1169       break;
1170     }
1171
1172   return false;
1173 }
1174
1175 static void
1176 remove_useless_stmts_cond (tree *stmt_p, struct rus_data *data)
1177 {
1178   tree then_clause, else_clause, cond;
1179   bool save_has_label, then_has_label, else_has_label;
1180
1181   save_has_label = data->has_label;
1182   data->has_label = false;
1183   data->last_goto = NULL;
1184
1185   remove_useless_stmts_1 (&COND_EXPR_THEN (*stmt_p), data);
1186
1187   then_has_label = data->has_label;
1188   data->has_label = false;
1189   data->last_goto = NULL;
1190
1191   remove_useless_stmts_1 (&COND_EXPR_ELSE (*stmt_p), data);
1192
1193   else_has_label = data->has_label;
1194   data->has_label = save_has_label | then_has_label | else_has_label;
1195
1196   fold_stmt (stmt_p);
1197   then_clause = COND_EXPR_THEN (*stmt_p);
1198   else_clause = COND_EXPR_ELSE (*stmt_p);
1199   cond = COND_EXPR_COND (*stmt_p);
1200
1201   /* If neither arm does anything at all, we can remove the whole IF.  */
1202   if (!TREE_SIDE_EFFECTS (then_clause) && !TREE_SIDE_EFFECTS (else_clause))
1203     {
1204       *stmt_p = build_empty_stmt ();
1205       data->repeat = true;
1206     }
1207
1208   /* If there are no reachable statements in an arm, then we can
1209      zap the entire conditional.  */
1210   else if (integer_nonzerop (cond) && !else_has_label)
1211     {
1212       if (warn_notreached)
1213         remove_useless_stmts_warn_notreached (else_clause);
1214       *stmt_p = then_clause;
1215       data->repeat = true;
1216     }
1217   else if (integer_zerop (cond) && !then_has_label)
1218     {
1219       if (warn_notreached)
1220         remove_useless_stmts_warn_notreached (then_clause);
1221       *stmt_p = else_clause;
1222       data->repeat = true;
1223     }
1224
1225   /* Check a couple of simple things on then/else with single stmts.  */
1226   else
1227     {
1228       tree then_stmt = expr_only (then_clause);
1229       tree else_stmt = expr_only (else_clause);
1230
1231       /* Notice branches to a common destination.  */
1232       if (then_stmt && else_stmt
1233           && TREE_CODE (then_stmt) == GOTO_EXPR
1234           && TREE_CODE (else_stmt) == GOTO_EXPR
1235           && (GOTO_DESTINATION (then_stmt) == GOTO_DESTINATION (else_stmt)))
1236         {
1237           *stmt_p = then_stmt;
1238           data->repeat = true;
1239         }
1240
1241       /* If the THEN/ELSE clause merely assigns a value to a variable or
1242          parameter which is already known to contain that value, then
1243          remove the useless THEN/ELSE clause.  */
1244       else if (TREE_CODE (cond) == VAR_DECL || TREE_CODE (cond) == PARM_DECL)
1245         {
1246           if (else_stmt
1247               && TREE_CODE (else_stmt) == MODIFY_EXPR
1248               && TREE_OPERAND (else_stmt, 0) == cond
1249               && integer_zerop (TREE_OPERAND (else_stmt, 1)))
1250             COND_EXPR_ELSE (*stmt_p) = alloc_stmt_list ();
1251         }
1252       else if ((TREE_CODE (cond) == EQ_EXPR || TREE_CODE (cond) == NE_EXPR)
1253                && (TREE_CODE (TREE_OPERAND (cond, 0)) == VAR_DECL
1254                    || TREE_CODE (TREE_OPERAND (cond, 0)) == PARM_DECL)
1255                && TREE_CONSTANT (TREE_OPERAND (cond, 1)))
1256         {
1257           tree stmt = (TREE_CODE (cond) == EQ_EXPR
1258                        ? then_stmt : else_stmt);
1259           tree *location = (TREE_CODE (cond) == EQ_EXPR
1260                             ? &COND_EXPR_THEN (*stmt_p)
1261                             : &COND_EXPR_ELSE (*stmt_p));
1262
1263           if (stmt
1264               && TREE_CODE (stmt) == MODIFY_EXPR
1265               && TREE_OPERAND (stmt, 0) == TREE_OPERAND (cond, 0)
1266               && TREE_OPERAND (stmt, 1) == TREE_OPERAND (cond, 1))
1267             *location = alloc_stmt_list ();
1268         }
1269     }
1270
1271   /* Protect GOTOs in the arm of COND_EXPRs from being removed.  They
1272      would be re-introduced during lowering.  */
1273   data->last_goto = NULL;
1274 }
1275
1276
1277 static void
1278 remove_useless_stmts_tf (tree *stmt_p, struct rus_data *data)
1279 {
1280   bool save_may_branch, save_may_throw;
1281   bool this_may_branch, this_may_throw;
1282
1283   /* Collect may_branch and may_throw information for the body only.  */
1284   save_may_branch = data->may_branch;
1285   save_may_throw = data->may_throw;
1286   data->may_branch = false;
1287   data->may_throw = false;
1288   data->last_goto = NULL;
1289
1290   remove_useless_stmts_1 (&TREE_OPERAND (*stmt_p, 0), data);
1291
1292   this_may_branch = data->may_branch;
1293   this_may_throw = data->may_throw;
1294   data->may_branch |= save_may_branch;
1295   data->may_throw |= save_may_throw;
1296   data->last_goto = NULL;
1297
1298   remove_useless_stmts_1 (&TREE_OPERAND (*stmt_p, 1), data);
1299
1300   /* If the body is empty, then we can emit the FINALLY block without
1301      the enclosing TRY_FINALLY_EXPR.  */
1302   if (!TREE_SIDE_EFFECTS (TREE_OPERAND (*stmt_p, 0)))
1303     {
1304       *stmt_p = TREE_OPERAND (*stmt_p, 1);
1305       data->repeat = true;
1306     }
1307
1308   /* If the handler is empty, then we can emit the TRY block without
1309      the enclosing TRY_FINALLY_EXPR.  */
1310   else if (!TREE_SIDE_EFFECTS (TREE_OPERAND (*stmt_p, 1)))
1311     {
1312       *stmt_p = TREE_OPERAND (*stmt_p, 0);
1313       data->repeat = true;
1314     }
1315
1316   /* If the body neither throws, nor branches, then we can safely
1317      string the TRY and FINALLY blocks together.  */
1318   else if (!this_may_branch && !this_may_throw)
1319     {
1320       tree stmt = *stmt_p;
1321       *stmt_p = TREE_OPERAND (stmt, 0);
1322       append_to_statement_list (TREE_OPERAND (stmt, 1), stmt_p);
1323       data->repeat = true;
1324     }
1325 }
1326
1327
1328 static void
1329 remove_useless_stmts_tc (tree *stmt_p, struct rus_data *data)
1330 {
1331   bool save_may_throw, this_may_throw;
1332   tree_stmt_iterator i;
1333   tree stmt;
1334
1335   /* Collect may_throw information for the body only.  */
1336   save_may_throw = data->may_throw;
1337   data->may_throw = false;
1338   data->last_goto = NULL;
1339
1340   remove_useless_stmts_1 (&TREE_OPERAND (*stmt_p, 0), data);
1341
1342   this_may_throw = data->may_throw;
1343   data->may_throw = save_may_throw;
1344
1345   /* If the body cannot throw, then we can drop the entire TRY_CATCH_EXPR.  */
1346   if (!this_may_throw)
1347     {
1348       if (warn_notreached)
1349         remove_useless_stmts_warn_notreached (TREE_OPERAND (*stmt_p, 1));
1350       *stmt_p = TREE_OPERAND (*stmt_p, 0);
1351       data->repeat = true;
1352       return;
1353     }
1354
1355   /* Process the catch clause specially.  We may be able to tell that
1356      no exceptions propagate past this point.  */
1357
1358   this_may_throw = true;
1359   i = tsi_start (TREE_OPERAND (*stmt_p, 1));
1360   stmt = tsi_stmt (i);
1361   data->last_goto = NULL;
1362
1363   switch (TREE_CODE (stmt))
1364     {
1365     case CATCH_EXPR:
1366       for (; !tsi_end_p (i); tsi_next (&i))
1367         {
1368           stmt = tsi_stmt (i);
1369           /* If we catch all exceptions, then the body does not
1370              propagate exceptions past this point.  */
1371           if (CATCH_TYPES (stmt) == NULL)
1372             this_may_throw = false;
1373           data->last_goto = NULL;
1374           remove_useless_stmts_1 (&CATCH_BODY (stmt), data);
1375         }
1376       break;
1377
1378     case EH_FILTER_EXPR:
1379       if (EH_FILTER_MUST_NOT_THROW (stmt))
1380         this_may_throw = false;
1381       else if (EH_FILTER_TYPES (stmt) == NULL)
1382         this_may_throw = false;
1383       remove_useless_stmts_1 (&EH_FILTER_FAILURE (stmt), data);
1384       break;
1385
1386     default:
1387       /* Otherwise this is a cleanup.  */
1388       remove_useless_stmts_1 (&TREE_OPERAND (*stmt_p, 1), data);
1389
1390       /* If the cleanup is empty, then we can emit the TRY block without
1391          the enclosing TRY_CATCH_EXPR.  */
1392       if (!TREE_SIDE_EFFECTS (TREE_OPERAND (*stmt_p, 1)))
1393         {
1394           *stmt_p = TREE_OPERAND (*stmt_p, 0);
1395           data->repeat = true;
1396         }
1397       break;
1398     }
1399   data->may_throw |= this_may_throw;
1400 }
1401
1402
1403 static void
1404 remove_useless_stmts_bind (tree *stmt_p, struct rus_data *data)
1405 {
1406   tree block;
1407
1408   /* First remove anything underneath the BIND_EXPR.  */
1409   remove_useless_stmts_1 (&BIND_EXPR_BODY (*stmt_p), data);
1410
1411   /* If the BIND_EXPR has no variables, then we can pull everything
1412      up one level and remove the BIND_EXPR, unless this is the toplevel
1413      BIND_EXPR for the current function or an inlined function.
1414
1415      When this situation occurs we will want to apply this
1416      optimization again.  */
1417   block = BIND_EXPR_BLOCK (*stmt_p);
1418   if (BIND_EXPR_VARS (*stmt_p) == NULL_TREE
1419       && *stmt_p != DECL_SAVED_TREE (current_function_decl)
1420       && (! block
1421           || ! BLOCK_ABSTRACT_ORIGIN (block)
1422           || (TREE_CODE (BLOCK_ABSTRACT_ORIGIN (block))
1423               != FUNCTION_DECL)))
1424     {
1425       *stmt_p = BIND_EXPR_BODY (*stmt_p);
1426       data->repeat = true;
1427     }
1428 }
1429
1430
1431 static void
1432 remove_useless_stmts_goto (tree *stmt_p, struct rus_data *data)
1433 {
1434   tree dest = GOTO_DESTINATION (*stmt_p);
1435
1436   data->may_branch = true;
1437   data->last_goto = NULL;
1438
1439   /* Record the last goto expr, so that we can delete it if unnecessary.  */
1440   if (TREE_CODE (dest) == LABEL_DECL)
1441     data->last_goto = stmt_p;
1442 }
1443
1444
1445 static void
1446 remove_useless_stmts_label (tree *stmt_p, struct rus_data *data)
1447 {
1448   tree label = LABEL_EXPR_LABEL (*stmt_p);
1449
1450   data->has_label = true;
1451
1452   /* We do want to jump across non-local label receiver code.  */
1453   if (DECL_NONLOCAL (label))
1454     data->last_goto = NULL;
1455
1456   else if (data->last_goto && GOTO_DESTINATION (*data->last_goto) == label)
1457     {
1458       *data->last_goto = build_empty_stmt ();
1459       data->repeat = true;
1460     }
1461
1462   /* ??? Add something here to delete unused labels.  */
1463 }
1464
1465
1466 /* If the function is "const" or "pure", then clear TREE_SIDE_EFFECTS on its
1467    decl.  This allows us to eliminate redundant or useless
1468    calls to "const" functions. 
1469
1470    Gimplifier already does the same operation, but we may notice functions
1471    being const and pure once their calls has been gimplified, so we need
1472    to update the flag.  */
1473
1474 static void
1475 update_call_expr_flags (tree call)
1476 {
1477   tree decl = get_callee_fndecl (call);
1478   if (!decl)
1479     return;
1480   if (call_expr_flags (call) & (ECF_CONST | ECF_PURE))
1481     TREE_SIDE_EFFECTS (call) = 0;
1482   if (TREE_NOTHROW (decl))
1483     TREE_NOTHROW (call) = 1;
1484 }
1485
1486
1487 /* T is CALL_EXPR.  Set current_function_calls_* flags.  */
1488
1489 void
1490 notice_special_calls (tree t)
1491 {
1492   int flags = call_expr_flags (t);
1493
1494   if (flags & ECF_MAY_BE_ALLOCA)
1495     current_function_calls_alloca = true;
1496   if (flags & ECF_RETURNS_TWICE)
1497     current_function_calls_setjmp = true;
1498 }
1499
1500
1501 /* Clear flags set by notice_special_calls.  Used by dead code removal
1502    to update the flags.  */
1503
1504 void
1505 clear_special_calls (void)
1506 {
1507   current_function_calls_alloca = false;
1508   current_function_calls_setjmp = false;
1509 }
1510
1511
1512 static void
1513 remove_useless_stmts_1 (tree *tp, struct rus_data *data)
1514 {
1515   tree t = *tp, op;
1516
1517   switch (TREE_CODE (t))
1518     {
1519     case COND_EXPR:
1520       remove_useless_stmts_cond (tp, data);
1521       break;
1522
1523     case TRY_FINALLY_EXPR:
1524       remove_useless_stmts_tf (tp, data);
1525       break;
1526
1527     case TRY_CATCH_EXPR:
1528       remove_useless_stmts_tc (tp, data);
1529       break;
1530
1531     case BIND_EXPR:
1532       remove_useless_stmts_bind (tp, data);
1533       break;
1534
1535     case GOTO_EXPR:
1536       remove_useless_stmts_goto (tp, data);
1537       break;
1538
1539     case LABEL_EXPR:
1540       remove_useless_stmts_label (tp, data);
1541       break;
1542
1543     case RETURN_EXPR:
1544       fold_stmt (tp);
1545       data->last_goto = NULL;
1546       data->may_branch = true;
1547       break;
1548
1549     case CALL_EXPR:
1550       fold_stmt (tp);
1551       data->last_goto = NULL;
1552       notice_special_calls (t);
1553       update_call_expr_flags (t);
1554       if (tree_could_throw_p (t))
1555         data->may_throw = true;
1556       break;
1557
1558     case MODIFY_EXPR:
1559       data->last_goto = NULL;
1560       fold_stmt (tp);
1561       op = get_call_expr_in (t);
1562       if (op)
1563         {
1564           update_call_expr_flags (op);
1565           notice_special_calls (op);
1566         }
1567       if (tree_could_throw_p (t))
1568         data->may_throw = true;
1569       break;
1570
1571     case STATEMENT_LIST:
1572       {
1573         tree_stmt_iterator i = tsi_start (t);
1574         while (!tsi_end_p (i))
1575           {
1576             t = tsi_stmt (i);
1577             if (IS_EMPTY_STMT (t))
1578               {
1579                 tsi_delink (&i);
1580                 continue;
1581               }
1582             
1583             remove_useless_stmts_1 (tsi_stmt_ptr (i), data);
1584
1585             t = tsi_stmt (i);
1586             if (TREE_CODE (t) == STATEMENT_LIST)
1587               {
1588                 tsi_link_before (&i, t, TSI_SAME_STMT);
1589                 tsi_delink (&i);
1590               }
1591             else
1592               tsi_next (&i);
1593           }
1594       }
1595       break;
1596     case SWITCH_EXPR:
1597       fold_stmt (tp);
1598       data->last_goto = NULL;
1599       break;
1600
1601     default:
1602       data->last_goto = NULL;
1603       break;
1604     }
1605 }
1606
1607 static void
1608 remove_useless_stmts (void)
1609 {
1610   struct rus_data data;
1611
1612   clear_special_calls ();
1613
1614   do
1615     {
1616       memset (&data, 0, sizeof (data));
1617       remove_useless_stmts_1 (&DECL_SAVED_TREE (current_function_decl), &data);
1618     }
1619   while (data.repeat);
1620 }
1621
1622
1623 struct tree_opt_pass pass_remove_useless_stmts = 
1624 {
1625   "useless",                            /* name */
1626   NULL,                                 /* gate */
1627   remove_useless_stmts,                 /* execute */
1628   NULL,                                 /* sub */
1629   NULL,                                 /* next */
1630   0,                                    /* static_pass_number */
1631   0,                                    /* tv_id */
1632   PROP_gimple_any,                      /* properties_required */
1633   0,                                    /* properties_provided */
1634   0,                                    /* properties_destroyed */
1635   0,                                    /* todo_flags_start */
1636   TODO_dump_func,                       /* todo_flags_finish */
1637   0                                     /* letter */
1638 };
1639
1640
1641 /* Remove obviously useless statements in basic block BB.  */
1642
1643 static void
1644 cfg_remove_useless_stmts_bb (basic_block bb)
1645 {
1646   block_stmt_iterator bsi;
1647   tree stmt = NULL_TREE;
1648   tree cond, var = NULL_TREE, val = NULL_TREE;
1649   struct var_ann_d *ann;
1650
1651   /* Check whether we come here from a condition, and if so, get the
1652      condition.  */
1653   if (!bb->pred
1654       || bb->pred->pred_next
1655       || !(bb->pred->flags & (EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
1656     return;
1657
1658   cond = COND_EXPR_COND (last_stmt (bb->pred->src));
1659
1660   if (TREE_CODE (cond) == VAR_DECL || TREE_CODE (cond) == PARM_DECL)
1661     {
1662       var = cond;
1663       val = (bb->pred->flags & EDGE_FALSE_VALUE
1664              ? boolean_false_node : boolean_true_node);
1665     }
1666   else if (TREE_CODE (cond) == TRUTH_NOT_EXPR
1667            && (TREE_CODE (TREE_OPERAND (cond, 0)) == VAR_DECL
1668                || TREE_CODE (TREE_OPERAND (cond, 0)) == PARM_DECL))
1669     {
1670       var = TREE_OPERAND (cond, 0);
1671       val = (bb->pred->flags & EDGE_FALSE_VALUE
1672              ? boolean_true_node : boolean_false_node);
1673     }
1674   else
1675     {
1676       if (bb->pred->flags & EDGE_FALSE_VALUE)
1677         cond = invert_truthvalue (cond);
1678       if (TREE_CODE (cond) == EQ_EXPR
1679           && (TREE_CODE (TREE_OPERAND (cond, 0)) == VAR_DECL
1680               || TREE_CODE (TREE_OPERAND (cond, 0)) == PARM_DECL)
1681           && (TREE_CODE (TREE_OPERAND (cond, 1)) == VAR_DECL
1682               || TREE_CODE (TREE_OPERAND (cond, 1)) == PARM_DECL
1683               || TREE_CONSTANT (TREE_OPERAND (cond, 1))))
1684         {
1685           var = TREE_OPERAND (cond, 0);
1686           val = TREE_OPERAND (cond, 1);
1687         }
1688       else
1689         return;
1690     }
1691
1692   /* Only work for normal local variables.  */
1693   ann = var_ann (var);
1694   if (!ann
1695       || ann->may_aliases
1696       || TREE_ADDRESSABLE (var))
1697     return;
1698
1699   if (! TREE_CONSTANT (val))
1700     {
1701       ann = var_ann (val);
1702       if (!ann
1703           || ann->may_aliases
1704           || TREE_ADDRESSABLE (val))
1705         return;
1706     }
1707
1708   /* Ignore floating point variables, since comparison behaves weird for
1709      them.  */
1710   if (FLOAT_TYPE_P (TREE_TYPE (var)))
1711     return;
1712
1713   for (bsi = bsi_start (bb); !bsi_end_p (bsi);)
1714     {
1715       stmt = bsi_stmt (bsi);
1716
1717       /* If the THEN/ELSE clause merely assigns a value to a variable/parameter
1718          which is already known to contain that value, then remove the useless
1719          THEN/ELSE clause.  */
1720       if (TREE_CODE (stmt) == MODIFY_EXPR
1721           && TREE_OPERAND (stmt, 0) == var
1722           && operand_equal_p (val, TREE_OPERAND (stmt, 1), 0))
1723         {
1724           bsi_remove (&bsi);
1725           continue;
1726         }
1727
1728       /* Invalidate the var if we encounter something that could modify it.
1729          Likewise for the value it was previously set to.  Note that we only
1730          consider values that are either a VAR_DECL or PARM_DECL so we
1731          can test for conflict very simply.  */
1732       if (TREE_CODE (stmt) == ASM_EXPR
1733           || (TREE_CODE (stmt) == MODIFY_EXPR
1734               && (TREE_OPERAND (stmt, 0) == var
1735                   || TREE_OPERAND (stmt, 0) == val)))
1736         return;
1737   
1738       bsi_next (&bsi);
1739     }
1740 }
1741
1742
1743 /* A CFG-aware version of remove_useless_stmts.  */
1744
1745 void
1746 cfg_remove_useless_stmts (void)
1747 {
1748   basic_block bb;
1749
1750 #ifdef ENABLE_CHECKING
1751   verify_flow_info ();
1752 #endif
1753
1754   FOR_EACH_BB (bb)
1755     {
1756       cfg_remove_useless_stmts_bb (bb);
1757     }
1758 }
1759
1760
1761 /* Remove PHI nodes associated with basic block BB and all edges out of BB.  */
1762
1763 static void
1764 remove_phi_nodes_and_edges_for_unreachable_block (basic_block bb)
1765 {
1766   tree phi;
1767
1768   /* Since this block is no longer reachable, we can just delete all
1769      of its PHI nodes.  */
1770   phi = phi_nodes (bb);
1771   while (phi)
1772     {
1773       tree next = PHI_CHAIN (phi);
1774       remove_phi_node (phi, NULL_TREE, bb);
1775       phi = next;
1776     }
1777
1778   /* Remove edges to BB's successors.  */
1779   while (bb->succ != NULL)
1780     ssa_remove_edge (bb->succ);
1781 }
1782
1783
1784 /* Remove statements of basic block BB.  */
1785
1786 static void
1787 remove_bb (basic_block bb)
1788 {
1789   block_stmt_iterator i;
1790   source_locus loc = 0;
1791
1792   if (dump_file)
1793     {
1794       fprintf (dump_file, "Removing basic block %d\n", bb->index);
1795       if (dump_flags & TDF_DETAILS)
1796         {
1797           dump_bb (bb, dump_file, 0);
1798           fprintf (dump_file, "\n");
1799         }
1800     }
1801
1802   /* Remove all the instructions in the block.  */
1803   for (i = bsi_start (bb); !bsi_end_p (i); bsi_remove (&i))
1804     {
1805       tree stmt = bsi_stmt (i);
1806       release_defs (stmt);
1807
1808       set_bb_for_stmt (stmt, NULL);
1809
1810       /* Don't warn for removed gotos.  Gotos are often removed due to
1811          jump threading, thus resulting in bogus warnings.  Not great,
1812          since this way we lose warnings for gotos in the original
1813          program that are indeed unreachable.  */
1814       if (TREE_CODE (stmt) != GOTO_EXPR && EXPR_HAS_LOCATION (stmt) && !loc)
1815 #ifdef USE_MAPPED_LOCATION
1816         loc = EXPR_LOCATION (stmt);
1817 #else
1818         loc = EXPR_LOCUS (stmt);
1819 #endif
1820     }
1821
1822   /* If requested, give a warning that the first statement in the
1823      block is unreachable.  We walk statements backwards in the
1824      loop above, so the last statement we process is the first statement
1825      in the block.  */
1826   if (warn_notreached && loc)
1827 #ifdef USE_MAPPED_LOCATION
1828     warning ("%Hwill never be executed", &loc);
1829 #else
1830     warning ("%Hwill never be executed", loc);
1831 #endif
1832
1833   remove_phi_nodes_and_edges_for_unreachable_block (bb);
1834 }
1835
1836
1837 /* Examine BB to determine if it is a forwarding block (a block which only
1838    transfers control to a new destination).  If BB is a forwarding block,
1839    then return the edge leading to the ultimate destination.  */
1840
1841 edge
1842 tree_block_forwards_to (basic_block bb)
1843 {
1844   block_stmt_iterator bsi;
1845   bb_ann_t ann = bb_ann (bb);
1846   tree stmt;
1847
1848   /* If this block is not forwardable, then avoid useless work.  */
1849   if (! ann->forwardable)
1850     return NULL;
1851
1852   /* Set this block to not be forwardable.  This prevents infinite loops since
1853      any block currently under examination is considered non-forwardable.  */
1854   ann->forwardable = 0;
1855
1856   /* No forwarding is possible if this block is a special block (ENTRY/EXIT),
1857      this block has more than one successor, this block's single successor is
1858      reached via an abnormal edge, this block has phi nodes, or this block's
1859      single successor has phi nodes.  */
1860   if (bb == EXIT_BLOCK_PTR
1861       || bb == ENTRY_BLOCK_PTR
1862       || !bb->succ
1863       || bb->succ->succ_next
1864       || bb->succ->dest == EXIT_BLOCK_PTR
1865       || (bb->succ->flags & EDGE_ABNORMAL) != 0
1866       || phi_nodes (bb)
1867       || phi_nodes (bb->succ->dest))
1868     return NULL;
1869
1870   /* Walk past any labels at the start of this block.  */
1871   for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
1872     {
1873       stmt = bsi_stmt (bsi);
1874       if (TREE_CODE (stmt) != LABEL_EXPR)
1875         break;
1876     }
1877
1878   /* If we reached the end of this block we may be able to optimize this
1879      case.  */
1880   if (bsi_end_p (bsi))
1881     {
1882       edge dest;
1883
1884       /* Recursive call to pick up chains of forwarding blocks.  */
1885       dest = tree_block_forwards_to (bb->succ->dest);
1886
1887       /* If none found, we forward to bb->succ at minimum.  */
1888       if (!dest)
1889         dest = bb->succ;
1890
1891       ann->forwardable = 1;
1892       return dest;
1893     }
1894
1895   /* No forwarding possible.  */
1896   return NULL;
1897 }
1898
1899
1900 /* Try to remove superfluous control structures.  */
1901
1902 static bool
1903 cleanup_control_flow (void)
1904 {
1905   basic_block bb;
1906   block_stmt_iterator bsi;
1907   bool retval = false;
1908   tree stmt;
1909
1910   FOR_EACH_BB (bb)
1911     {
1912       bsi = bsi_last (bb);
1913
1914       if (bsi_end_p (bsi))
1915         continue;
1916       
1917       stmt = bsi_stmt (bsi);
1918       if (TREE_CODE (stmt) == COND_EXPR
1919           || TREE_CODE (stmt) == SWITCH_EXPR)
1920         retval |= cleanup_control_expr_graph (bb, bsi);
1921     }
1922   return retval;
1923 }
1924
1925
1926 /* Disconnect an unreachable block in the control expression starting
1927    at block BB.  */
1928
1929 static bool
1930 cleanup_control_expr_graph (basic_block bb, block_stmt_iterator bsi)
1931 {
1932   edge taken_edge;
1933   bool retval = false;
1934   tree expr = bsi_stmt (bsi), val;
1935
1936   if (bb->succ->succ_next)
1937     {
1938       edge e, next;
1939
1940       switch (TREE_CODE (expr))
1941         {
1942         case COND_EXPR:
1943           val = COND_EXPR_COND (expr);
1944           break;
1945
1946         case SWITCH_EXPR:
1947           val = SWITCH_COND (expr);
1948           if (TREE_CODE (val) != INTEGER_CST)
1949             return false;
1950           break;
1951
1952         default:
1953           gcc_unreachable ();
1954         }
1955
1956       taken_edge = find_taken_edge (bb, val);
1957       if (!taken_edge)
1958         return false;
1959
1960       /* Remove all the edges except the one that is always executed.  */
1961       for (e = bb->succ; e; e = next)
1962         {
1963           next = e->succ_next;
1964           if (e != taken_edge)
1965             {
1966               taken_edge->probability += e->probability;
1967               taken_edge->count += e->count;
1968               ssa_remove_edge (e);
1969               retval = true;
1970             }
1971         }
1972       if (taken_edge->probability > REG_BR_PROB_BASE)
1973         taken_edge->probability = REG_BR_PROB_BASE;
1974     }
1975   else
1976     taken_edge = bb->succ;
1977
1978   bsi_remove (&bsi);
1979   taken_edge->flags = EDGE_FALLTHRU;
1980
1981   /* We removed some paths from the cfg.  */
1982   if (dom_computed[CDI_DOMINATORS] >= DOM_CONS_OK)
1983     dom_computed[CDI_DOMINATORS] = DOM_CONS_OK;
1984
1985   return retval;
1986 }
1987
1988
1989 /* Given a control block BB and a predicate VAL, return the edge that
1990    will be taken out of the block.  If VAL does not match a unique
1991    edge, NULL is returned.  */
1992
1993 edge
1994 find_taken_edge (basic_block bb, tree val)
1995 {
1996   tree stmt;
1997
1998   stmt = last_stmt (bb);
1999
2000   gcc_assert (stmt);
2001   gcc_assert (is_ctrl_stmt (stmt));
2002
2003   /* If VAL is a predicate of the form N RELOP N, where N is an
2004      SSA_NAME, we can usually determine its truth value.  */
2005   if (val && COMPARISON_CLASS_P (val))
2006     val = fold (val);
2007
2008   /* If VAL is not a constant, we can't determine which edge might
2009      be taken.  */
2010   if (val == NULL || !really_constant_p (val))
2011     return NULL;
2012
2013   if (TREE_CODE (stmt) == COND_EXPR)
2014     return find_taken_edge_cond_expr (bb, val);
2015
2016   if (TREE_CODE (stmt) == SWITCH_EXPR)
2017     return find_taken_edge_switch_expr (bb, val);
2018
2019   return bb->succ;
2020 }
2021
2022
2023 /* Given a constant value VAL and the entry block BB to a COND_EXPR
2024    statement, determine which of the two edges will be taken out of the
2025    block.  Return NULL if either edge may be taken.  */
2026
2027 static edge
2028 find_taken_edge_cond_expr (basic_block bb, tree val)
2029 {
2030   edge true_edge, false_edge;
2031
2032   extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
2033
2034   /* If both edges of the branch lead to the same basic block, it doesn't
2035      matter which edge is taken.  */
2036   if (true_edge->dest == false_edge->dest)
2037     return true_edge;
2038
2039   /* Otherwise, try to determine which branch of the if() will be taken.
2040      If VAL is a constant but it can't be reduced to a 0 or a 1, then
2041      we don't really know which edge will be taken at runtime.  This
2042      may happen when comparing addresses (e.g., if (&var1 == 4)).  */
2043   if (integer_nonzerop (val))
2044     return true_edge;
2045   else if (integer_zerop (val))
2046     return false_edge;
2047   else
2048     return NULL;
2049 }
2050
2051
2052 /* Given a constant value VAL and the entry block BB to a SWITCH_EXPR
2053    statement, determine which edge will be taken out of the block.  Return
2054    NULL if any edge may be taken.  */
2055
2056 static edge
2057 find_taken_edge_switch_expr (basic_block bb, tree val)
2058 {
2059   tree switch_expr, taken_case;
2060   basic_block dest_bb;
2061   edge e;
2062
2063   if (TREE_CODE (val) != INTEGER_CST)
2064     return NULL;
2065
2066   switch_expr = last_stmt (bb);
2067   taken_case = find_case_label_for_value (switch_expr, val);
2068   dest_bb = label_to_block (CASE_LABEL (taken_case));
2069
2070   e = find_edge (bb, dest_bb);
2071   gcc_assert (e);
2072   return e;
2073 }
2074
2075
2076 /* Return the CASE_LABEL_EXPR that SWITCH_EXPR will take for VAL.
2077    We can make optimal use here of the fact that the case labels are
2078    sorted: We can do a binary search for a case matching VAL.  */
2079
2080 static tree
2081 find_case_label_for_value (tree switch_expr, tree val)
2082 {
2083   tree vec = SWITCH_LABELS (switch_expr);
2084   size_t low, high, n = TREE_VEC_LENGTH (vec);
2085   tree default_case = TREE_VEC_ELT (vec, n - 1);
2086
2087   for (low = -1, high = n - 1; high - low > 1; )
2088     {
2089       size_t i = (high + low) / 2;
2090       tree t = TREE_VEC_ELT (vec, i);
2091       int cmp;
2092
2093       /* Cache the result of comparing CASE_LOW and val.  */
2094       cmp = tree_int_cst_compare (CASE_LOW (t), val);
2095
2096       if (cmp > 0)
2097         high = i;
2098       else
2099         low = i;
2100
2101       if (CASE_HIGH (t) == NULL)
2102         {
2103           /* A singe-valued case label.  */
2104           if (cmp == 0)
2105             return t;
2106         }
2107       else
2108         {
2109           /* A case range.  We can only handle integer ranges.  */
2110           if (cmp <= 0 && tree_int_cst_compare (CASE_HIGH (t), val) >= 0)
2111             return t;
2112         }
2113     }
2114
2115   return default_case;
2116 }
2117
2118
2119 /* If all the PHI nodes in DEST have alternatives for E1 and E2 and
2120    those alternatives are equal in each of the PHI nodes, then return
2121    true, else return false.  */
2122
2123 static bool
2124 phi_alternatives_equal (basic_block dest, edge e1, edge e2)
2125 {
2126   tree phi, val1, val2;
2127   int n1, n2;
2128
2129   for (phi = phi_nodes (dest); phi; phi = PHI_CHAIN (phi))
2130     {
2131       n1 = phi_arg_from_edge (phi, e1);
2132       n2 = phi_arg_from_edge (phi, e2);
2133
2134       gcc_assert (n1 >= 0);
2135       gcc_assert (n2 >= 0);
2136
2137       val1 = PHI_ARG_DEF (phi, n1);
2138       val2 = PHI_ARG_DEF (phi, n2);
2139
2140       if (!operand_equal_p (val1, val2, 0))
2141         return false;
2142     }
2143
2144   return true;
2145 }
2146
2147
2148 /*---------------------------------------------------------------------------
2149                               Debugging functions
2150 ---------------------------------------------------------------------------*/
2151
2152 /* Dump tree-specific information of block BB to file OUTF.  */
2153
2154 void
2155 tree_dump_bb (basic_block bb, FILE *outf, int indent)
2156 {
2157   dump_generic_bb (outf, bb, indent, TDF_VOPS);
2158 }
2159
2160
2161 /* Dump a basic block on stderr.  */
2162
2163 void
2164 debug_tree_bb (basic_block bb)
2165 {
2166   dump_bb (bb, stderr, 0);
2167 }
2168
2169
2170 /* Dump basic block with index N on stderr.  */
2171
2172 basic_block
2173 debug_tree_bb_n (int n)
2174 {
2175   debug_tree_bb (BASIC_BLOCK (n));
2176   return BASIC_BLOCK (n);
2177 }        
2178
2179
2180 /* Dump the CFG on stderr.
2181
2182    FLAGS are the same used by the tree dumping functions
2183    (see TDF_* in tree.h).  */
2184
2185 void
2186 debug_tree_cfg (int flags)
2187 {
2188   dump_tree_cfg (stderr, flags);
2189 }
2190
2191
2192 /* Dump the program showing basic block boundaries on the given FILE.
2193
2194    FLAGS are the same used by the tree dumping functions (see TDF_* in
2195    tree.h).  */
2196
2197 void
2198 dump_tree_cfg (FILE *file, int flags)
2199 {
2200   if (flags & TDF_DETAILS)
2201     {
2202       const char *funcname
2203         = lang_hooks.decl_printable_name (current_function_decl, 2);
2204
2205       fputc ('\n', file);
2206       fprintf (file, ";; Function %s\n\n", funcname);
2207       fprintf (file, ";; \n%d basic blocks, %d edges, last basic block %d.\n\n",
2208                n_basic_blocks, n_edges, last_basic_block);
2209
2210       brief_dump_cfg (file);
2211       fprintf (file, "\n");
2212     }
2213
2214   if (flags & TDF_STATS)
2215     dump_cfg_stats (file);
2216
2217   dump_function_to_file (current_function_decl, file, flags | TDF_BLOCKS);
2218 }
2219
2220
2221 /* Dump CFG statistics on FILE.  */
2222
2223 void
2224 dump_cfg_stats (FILE *file)
2225 {
2226   static long max_num_merged_labels = 0;
2227   unsigned long size, total = 0;
2228   int n_edges;
2229   basic_block bb;
2230   const char * const fmt_str   = "%-30s%-13s%12s\n";
2231   const char * const fmt_str_1 = "%-30s%13d%11lu%c\n";
2232   const char * const fmt_str_3 = "%-43s%11lu%c\n";
2233   const char *funcname
2234     = lang_hooks.decl_printable_name (current_function_decl, 2);
2235
2236
2237   fprintf (file, "\nCFG Statistics for %s\n\n", funcname);
2238
2239   fprintf (file, "---------------------------------------------------------\n");
2240   fprintf (file, fmt_str, "", "  Number of  ", "Memory");
2241   fprintf (file, fmt_str, "", "  instances  ", "used ");
2242   fprintf (file, "---------------------------------------------------------\n");
2243
2244   size = n_basic_blocks * sizeof (struct basic_block_def);
2245   total += size;
2246   fprintf (file, fmt_str_1, "Basic blocks", n_basic_blocks,
2247            SCALE (size), LABEL (size));
2248
2249   n_edges = 0;
2250   FOR_EACH_BB (bb)
2251     {
2252       edge e;
2253       for (e = bb->succ; e; e = e->succ_next)
2254         n_edges++;
2255     }
2256   size = n_edges * sizeof (struct edge_def);
2257   total += size;
2258   fprintf (file, fmt_str_1, "Edges", n_edges, SCALE (size), LABEL (size));
2259
2260   size = n_basic_blocks * sizeof (struct bb_ann_d);
2261   total += size;
2262   fprintf (file, fmt_str_1, "Basic block annotations", n_basic_blocks,
2263            SCALE (size), LABEL (size));
2264
2265   fprintf (file, "---------------------------------------------------------\n");
2266   fprintf (file, fmt_str_3, "Total memory used by CFG data", SCALE (total),
2267            LABEL (total));
2268   fprintf (file, "---------------------------------------------------------\n");
2269   fprintf (file, "\n");
2270
2271   if (cfg_stats.num_merged_labels > max_num_merged_labels)
2272     max_num_merged_labels = cfg_stats.num_merged_labels;
2273
2274   fprintf (file, "Coalesced label blocks: %ld (Max so far: %ld)\n",
2275            cfg_stats.num_merged_labels, max_num_merged_labels);
2276
2277   fprintf (file, "\n");
2278 }
2279
2280
2281 /* Dump CFG statistics on stderr.  Keep extern so that it's always
2282    linked in the final executable.  */
2283
2284 void
2285 debug_cfg_stats (void)
2286 {
2287   dump_cfg_stats (stderr);
2288 }
2289
2290
2291 /* Dump the flowgraph to a .vcg FILE.  */
2292
2293 static void
2294 tree_cfg2vcg (FILE *file)
2295 {
2296   edge e;
2297   basic_block bb;
2298   const char *funcname
2299     = lang_hooks.decl_printable_name (current_function_decl, 2);
2300
2301   /* Write the file header.  */
2302   fprintf (file, "graph: { title: \"%s\"\n", funcname);
2303   fprintf (file, "node: { title: \"ENTRY\" label: \"ENTRY\" }\n");
2304   fprintf (file, "node: { title: \"EXIT\" label: \"EXIT\" }\n");
2305
2306   /* Write blocks and edges.  */
2307   for (e = ENTRY_BLOCK_PTR->succ; e; e = e->succ_next)
2308     {
2309       fprintf (file, "edge: { sourcename: \"ENTRY\" targetname: \"%d\"",
2310                e->dest->index);
2311
2312       if (e->flags & EDGE_FAKE)
2313         fprintf (file, " linestyle: dotted priority: 10");
2314       else
2315         fprintf (file, " linestyle: solid priority: 100");
2316
2317       fprintf (file, " }\n");
2318     }
2319   fputc ('\n', file);
2320
2321   FOR_EACH_BB (bb)
2322     {
2323       enum tree_code head_code, end_code;
2324       const char *head_name, *end_name;
2325       int head_line = 0;
2326       int end_line = 0;
2327       tree first = first_stmt (bb);
2328       tree last = last_stmt (bb);
2329
2330       if (first)
2331         {
2332           head_code = TREE_CODE (first);
2333           head_name = tree_code_name[head_code];
2334           head_line = get_lineno (first);
2335         }
2336       else
2337         head_name = "no-statement";
2338
2339       if (last)
2340         {
2341           end_code = TREE_CODE (last);
2342           end_name = tree_code_name[end_code];
2343           end_line = get_lineno (last);
2344         }
2345       else
2346         end_name = "no-statement";
2347
2348       fprintf (file, "node: { title: \"%d\" label: \"#%d\\n%s (%d)\\n%s (%d)\"}\n",
2349                bb->index, bb->index, head_name, head_line, end_name,
2350                end_line);
2351
2352       for (e = bb->succ; e; e = e->succ_next)
2353         {
2354           if (e->dest == EXIT_BLOCK_PTR)
2355             fprintf (file, "edge: { sourcename: \"%d\" targetname: \"EXIT\"", bb->index);
2356           else
2357             fprintf (file, "edge: { sourcename: \"%d\" targetname: \"%d\"", bb->index, e->dest->index);
2358
2359           if (e->flags & EDGE_FAKE)
2360             fprintf (file, " priority: 10 linestyle: dotted");
2361           else
2362             fprintf (file, " priority: 100 linestyle: solid");
2363
2364           fprintf (file, " }\n");
2365         }
2366
2367       if (bb->next_bb != EXIT_BLOCK_PTR)
2368         fputc ('\n', file);
2369     }
2370
2371   fputs ("}\n\n", file);
2372 }
2373
2374
2375
2376 /*---------------------------------------------------------------------------
2377                              Miscellaneous helpers
2378 ---------------------------------------------------------------------------*/
2379
2380 /* Return true if T represents a stmt that always transfers control.  */
2381
2382 bool
2383 is_ctrl_stmt (tree t)
2384 {
2385   return (TREE_CODE (t) == COND_EXPR
2386           || TREE_CODE (t) == SWITCH_EXPR
2387           || TREE_CODE (t) == GOTO_EXPR
2388           || TREE_CODE (t) == RETURN_EXPR
2389           || TREE_CODE (t) == RESX_EXPR);
2390 }
2391
2392
2393 /* Return true if T is a statement that may alter the flow of control
2394    (e.g., a call to a non-returning function).  */
2395
2396 bool
2397 is_ctrl_altering_stmt (tree t)
2398 {
2399   tree call;
2400
2401   gcc_assert (t);
2402   call = get_call_expr_in (t);
2403   if (call)
2404     {
2405       /* A non-pure/const CALL_EXPR alters flow control if the current
2406          function has nonlocal labels.  */
2407       if (TREE_SIDE_EFFECTS (call) && current_function_has_nonlocal_label)
2408         return true;
2409
2410       /* A CALL_EXPR also alters control flow if it does not return.  */
2411       if (call_expr_flags (call) & (ECF_NORETURN | ECF_LONGJMP))
2412         return true;
2413     }
2414
2415   /* If a statement can throw, it alters control flow.  */
2416   return tree_can_throw_internal (t);
2417 }
2418
2419
2420 /* Return true if T is a computed goto.  */
2421
2422 bool
2423 computed_goto_p (tree t)
2424 {
2425   return (TREE_CODE (t) == GOTO_EXPR
2426           && TREE_CODE (GOTO_DESTINATION (t)) != LABEL_DECL);
2427 }
2428
2429
2430 /* Checks whether EXPR is a simple local goto.  */
2431
2432 bool
2433 simple_goto_p (tree expr)
2434 {
2435   return (TREE_CODE (expr) == GOTO_EXPR
2436           && TREE_CODE (GOTO_DESTINATION (expr)) == LABEL_DECL);
2437 }
2438
2439
2440 /* Return true if T should start a new basic block.  PREV_T is the
2441    statement preceding T.  It is used when T is a label or a case label.
2442    Labels should only start a new basic block if their previous statement
2443    wasn't a label.  Otherwise, sequence of labels would generate
2444    unnecessary basic blocks that only contain a single label.  */
2445
2446 static inline bool
2447 stmt_starts_bb_p (tree t, tree prev_t)
2448 {
2449   enum tree_code code;
2450
2451   if (t == NULL_TREE)
2452     return false;
2453
2454   /* LABEL_EXPRs start a new basic block only if the preceding
2455      statement wasn't a label of the same type.  This prevents the
2456      creation of consecutive blocks that have nothing but a single
2457      label.  */
2458   code = TREE_CODE (t);
2459   if (code == LABEL_EXPR)
2460     {
2461       /* Nonlocal and computed GOTO targets always start a new block.  */
2462       if (code == LABEL_EXPR
2463           && (DECL_NONLOCAL (LABEL_EXPR_LABEL (t))
2464               || FORCED_LABEL (LABEL_EXPR_LABEL (t))))
2465         return true;
2466
2467       if (prev_t && TREE_CODE (prev_t) == code)
2468         {
2469           if (DECL_NONLOCAL (LABEL_EXPR_LABEL (prev_t)))
2470             return true;
2471
2472           cfg_stats.num_merged_labels++;
2473           return false;
2474         }
2475       else
2476         return true;
2477     }
2478
2479   return false;
2480 }
2481
2482
2483 /* Return true if T should end a basic block.  */
2484
2485 bool
2486 stmt_ends_bb_p (tree t)
2487 {
2488   return is_ctrl_stmt (t) || is_ctrl_altering_stmt (t);
2489 }
2490
2491
2492 /* Add gotos that used to be represented implicitly in the CFG.  */
2493
2494 void
2495 disband_implicit_edges (void)
2496 {
2497   basic_block bb;
2498   block_stmt_iterator last;
2499   edge e;
2500   tree stmt, label;
2501
2502   FOR_EACH_BB (bb)
2503     {
2504       last = bsi_last (bb);
2505       stmt = last_stmt (bb);
2506
2507       if (stmt && TREE_CODE (stmt) == COND_EXPR)
2508         {
2509           /* Remove superfluous gotos from COND_EXPR branches.  Moved
2510              from cfg_remove_useless_stmts here since it violates the
2511              invariants for tree--cfg correspondence and thus fits better
2512              here where we do it anyway.  */
2513           for (e = bb->succ; e; e = e->succ_next)
2514             {
2515               if (e->dest != bb->next_bb)
2516                 continue;
2517
2518               if (e->flags & EDGE_TRUE_VALUE)
2519                 COND_EXPR_THEN (stmt) = build_empty_stmt ();
2520               else if (e->flags & EDGE_FALSE_VALUE)
2521                 COND_EXPR_ELSE (stmt) = build_empty_stmt ();
2522               else
2523                 gcc_unreachable ();
2524               e->flags |= EDGE_FALLTHRU;
2525             }
2526
2527           continue;
2528         }
2529
2530       if (stmt && TREE_CODE (stmt) == RETURN_EXPR)
2531         {
2532           /* Remove the RETURN_EXPR if we may fall though to the exit
2533              instead.  */
2534           gcc_assert (bb->succ);
2535           gcc_assert (!bb->succ->succ_next);
2536           gcc_assert (bb->succ->dest == EXIT_BLOCK_PTR);
2537
2538           if (bb->next_bb == EXIT_BLOCK_PTR
2539               && !TREE_OPERAND (stmt, 0))
2540             {
2541               bsi_remove (&last);
2542               bb->succ->flags |= EDGE_FALLTHRU;
2543             }
2544           continue;
2545         }
2546
2547       /* There can be no fallthru edge if the last statement is a control
2548          one.  */
2549       if (stmt && is_ctrl_stmt (stmt))
2550         continue;
2551
2552       /* Find a fallthru edge and emit the goto if necessary.  */
2553       for (e = bb->succ; e; e = e->succ_next)
2554         if (e->flags & EDGE_FALLTHRU)
2555           break;
2556
2557       if (!e || e->dest == bb->next_bb)
2558         continue;
2559
2560       gcc_assert (e->dest != EXIT_BLOCK_PTR);
2561       label = tree_block_label (e->dest);
2562
2563       stmt = build1 (GOTO_EXPR, void_type_node, label);
2564 #ifdef USE_MAPPED_LOCATION
2565       SET_EXPR_LOCATION (stmt, e->goto_locus);
2566 #else
2567       SET_EXPR_LOCUS (stmt, e->goto_locus);
2568 #endif
2569       bsi_insert_after (&last, stmt, BSI_NEW_STMT);
2570       e->flags &= ~EDGE_FALLTHRU;
2571     }
2572 }
2573
2574 /* Remove block annotations and other datastructures.  */
2575
2576 void
2577 delete_tree_cfg_annotations (void)
2578 {
2579   basic_block bb;
2580   if (n_basic_blocks > 0)
2581     free_blocks_annotations ();
2582
2583   label_to_block_map = NULL;
2584   free_rbi_pool ();
2585   FOR_EACH_BB (bb)
2586     bb->rbi = NULL;
2587 }
2588
2589
2590 /* Return the first statement in basic block BB.  */
2591
2592 tree
2593 first_stmt (basic_block bb)
2594 {
2595   block_stmt_iterator i = bsi_start (bb);
2596   return !bsi_end_p (i) ? bsi_stmt (i) : NULL_TREE;
2597 }
2598
2599
2600 /* Return the last statement in basic block BB.  */
2601
2602 tree
2603 last_stmt (basic_block bb)
2604 {
2605   block_stmt_iterator b = bsi_last (bb);
2606   return !bsi_end_p (b) ? bsi_stmt (b) : NULL_TREE;
2607 }
2608
2609
2610 /* Return a pointer to the last statement in block BB.  */
2611
2612 tree *
2613 last_stmt_ptr (basic_block bb)
2614 {
2615   block_stmt_iterator last = bsi_last (bb);
2616   return !bsi_end_p (last) ? bsi_stmt_ptr (last) : NULL;
2617 }
2618
2619
2620 /* Return the last statement of an otherwise empty block.  Return NULL
2621    if the block is totally empty, or if it contains more than one
2622    statement.  */
2623
2624 tree
2625 last_and_only_stmt (basic_block bb)
2626 {
2627   block_stmt_iterator i = bsi_last (bb);
2628   tree last, prev;
2629
2630   if (bsi_end_p (i))
2631     return NULL_TREE;
2632
2633   last = bsi_stmt (i);
2634   bsi_prev (&i);
2635   if (bsi_end_p (i))
2636     return last;
2637
2638   /* Empty statements should no longer appear in the instruction stream.
2639      Everything that might have appeared before should be deleted by
2640      remove_useless_stmts, and the optimizers should just bsi_remove
2641      instead of smashing with build_empty_stmt.
2642
2643      Thus the only thing that should appear here in a block containing
2644      one executable statement is a label.  */
2645   prev = bsi_stmt (i);
2646   if (TREE_CODE (prev) == LABEL_EXPR)
2647     return last;
2648   else
2649     return NULL_TREE;
2650 }
2651
2652
2653 /* Mark BB as the basic block holding statement T.  */
2654
2655 void
2656 set_bb_for_stmt (tree t, basic_block bb)
2657 {
2658   if (TREE_CODE (t) == PHI_NODE)
2659     PHI_BB (t) = bb;
2660   else if (TREE_CODE (t) == STATEMENT_LIST)
2661     {
2662       tree_stmt_iterator i;
2663       for (i = tsi_start (t); !tsi_end_p (i); tsi_next (&i))
2664         set_bb_for_stmt (tsi_stmt (i), bb);
2665     }
2666   else
2667     {
2668       stmt_ann_t ann = get_stmt_ann (t);
2669       ann->bb = bb;
2670
2671       /* If the statement is a label, add the label to block-to-labels map
2672          so that we can speed up edge creation for GOTO_EXPRs.  */
2673       if (TREE_CODE (t) == LABEL_EXPR)
2674         {
2675           int uid;
2676
2677           t = LABEL_EXPR_LABEL (t);
2678           uid = LABEL_DECL_UID (t);
2679           if (uid == -1)
2680             {
2681               LABEL_DECL_UID (t) = uid = cfun->last_label_uid++;
2682               if (VARRAY_SIZE (label_to_block_map) <= (unsigned) uid)
2683                 VARRAY_GROW (label_to_block_map, 3 * uid / 2);
2684             }
2685           else
2686             /* We're moving an existing label.  Make sure that we've
2687                 removed it from the old block.  */
2688             gcc_assert (!bb || !VARRAY_BB (label_to_block_map, uid));
2689           VARRAY_BB (label_to_block_map, uid) = bb;
2690         }
2691     }
2692 }
2693
2694 /* Finds iterator for STMT.  */
2695
2696 extern block_stmt_iterator
2697 stmt_for_bsi (tree stmt)
2698 {
2699   block_stmt_iterator bsi;
2700
2701   for (bsi = bsi_start (bb_for_stmt (stmt)); !bsi_end_p (bsi); bsi_next (&bsi))
2702     if (bsi_stmt (bsi) == stmt)
2703       return bsi;
2704
2705   gcc_unreachable ();
2706 }
2707
2708 /* Insert statement (or statement list) T before the statement
2709    pointed-to by iterator I.  M specifies how to update iterator I
2710    after insertion (see enum bsi_iterator_update).  */
2711
2712 void
2713 bsi_insert_before (block_stmt_iterator *i, tree t, enum bsi_iterator_update m)
2714 {
2715   set_bb_for_stmt (t, i->bb);
2716   tsi_link_before (&i->tsi, t, m);
2717   modify_stmt (t);
2718 }
2719
2720
2721 /* Insert statement (or statement list) T after the statement
2722    pointed-to by iterator I.  M specifies how to update iterator I
2723    after insertion (see enum bsi_iterator_update).  */
2724
2725 void
2726 bsi_insert_after (block_stmt_iterator *i, tree t, enum bsi_iterator_update m)
2727 {
2728   set_bb_for_stmt (t, i->bb);
2729   tsi_link_after (&i->tsi, t, m);
2730   modify_stmt (t);
2731 }
2732
2733
2734 /* Remove the statement pointed to by iterator I.  The iterator is updated
2735    to the next statement.  */
2736
2737 void
2738 bsi_remove (block_stmt_iterator *i)
2739 {
2740   tree t = bsi_stmt (*i);
2741   set_bb_for_stmt (t, NULL);
2742   tsi_delink (&i->tsi);
2743 }
2744
2745
2746 /* Move the statement at FROM so it comes right after the statement at TO.  */
2747
2748 void 
2749 bsi_move_after (block_stmt_iterator *from, block_stmt_iterator *to)
2750 {
2751   tree stmt = bsi_stmt (*from);
2752   bsi_remove (from);
2753   bsi_insert_after (to, stmt, BSI_SAME_STMT);
2754
2755
2756
2757 /* Move the statement at FROM so it comes right before the statement at TO.  */
2758
2759 void 
2760 bsi_move_before (block_stmt_iterator *from, block_stmt_iterator *to)
2761 {
2762   tree stmt = bsi_stmt (*from);
2763   bsi_remove (from);
2764   bsi_insert_before (to, stmt, BSI_SAME_STMT);
2765 }
2766
2767
2768 /* Move the statement at FROM to the end of basic block BB.  */
2769
2770 void
2771 bsi_move_to_bb_end (block_stmt_iterator *from, basic_block bb)
2772 {
2773   block_stmt_iterator last = bsi_last (bb);
2774   
2775   /* Have to check bsi_end_p because it could be an empty block.  */
2776   if (!bsi_end_p (last) && is_ctrl_stmt (bsi_stmt (last)))
2777     bsi_move_before (from, &last);
2778   else
2779     bsi_move_after (from, &last);
2780 }
2781
2782
2783 /* Replace the contents of the statement pointed to by iterator BSI
2784    with STMT.  If PRESERVE_EH_INFO is true, the exception handling
2785    information of the original statement is preserved.  */
2786
2787 void
2788 bsi_replace (const block_stmt_iterator *bsi, tree stmt, bool preserve_eh_info)
2789 {
2790   int eh_region;
2791   tree orig_stmt = bsi_stmt (*bsi);
2792
2793   SET_EXPR_LOCUS (stmt, EXPR_LOCUS (orig_stmt));
2794   set_bb_for_stmt (stmt, bsi->bb);
2795
2796   /* Preserve EH region information from the original statement, if
2797      requested by the caller.  */
2798   if (preserve_eh_info)
2799     {
2800       eh_region = lookup_stmt_eh_region (orig_stmt);
2801       if (eh_region >= 0)
2802         add_stmt_to_eh_region (stmt, eh_region);
2803     }
2804
2805   *bsi_stmt_ptr (*bsi) = stmt;
2806   modify_stmt (stmt);
2807 }
2808
2809
2810 /* Insert the statement pointed-to by BSI into edge E.  Every attempt
2811    is made to place the statement in an existing basic block, but
2812    sometimes that isn't possible.  When it isn't possible, the edge is
2813    split and the statement is added to the new block.
2814
2815    In all cases, the returned *BSI points to the correct location.  The
2816    return value is true if insertion should be done after the location,
2817    or false if it should be done before the location.  If new basic block
2818    has to be created, it is stored in *NEW_BB.  */
2819
2820 static bool
2821 tree_find_edge_insert_loc (edge e, block_stmt_iterator *bsi,
2822                            basic_block *new_bb)
2823 {
2824   basic_block dest, src;
2825   tree tmp;
2826
2827   dest = e->dest;
2828  restart:
2829
2830   /* If the destination has one predecessor which has no PHI nodes,
2831      insert there.  Except for the exit block. 
2832
2833      The requirement for no PHI nodes could be relaxed.  Basically we
2834      would have to examine the PHIs to prove that none of them used
2835      the value set by the statement we want to insert on E.   That
2836      hardly seems worth the effort.  */
2837   if (dest->pred->pred_next == NULL
2838       && ! phi_nodes (dest)
2839       && dest != EXIT_BLOCK_PTR)
2840     {
2841       *bsi = bsi_start (dest);
2842       if (bsi_end_p (*bsi))
2843         return true;
2844
2845       /* Make sure we insert after any leading labels.  */
2846       tmp = bsi_stmt (*bsi);
2847       while (TREE_CODE (tmp) == LABEL_EXPR)
2848         {
2849           bsi_next (bsi);
2850           if (bsi_end_p (*bsi))
2851             break;
2852           tmp = bsi_stmt (*bsi);
2853         }
2854
2855       if (bsi_end_p (*bsi))
2856         {
2857           *bsi = bsi_last (dest);
2858           return true;
2859         }
2860       else
2861         return false;
2862     }
2863
2864   /* If the source has one successor, the edge is not abnormal and
2865      the last statement does not end a basic block, insert there.
2866      Except for the entry block.  */
2867   src = e->src;
2868   if ((e->flags & EDGE_ABNORMAL) == 0
2869       && src->succ->succ_next == NULL
2870       && src != ENTRY_BLOCK_PTR)
2871     {
2872       *bsi = bsi_last (src);
2873       if (bsi_end_p (*bsi))
2874         return true;
2875
2876       tmp = bsi_stmt (*bsi);
2877       if (!stmt_ends_bb_p (tmp))
2878         return true;
2879
2880       /* Insert code just before returning the value.  We may need to decompose
2881          the return in the case it contains non-trivial operand.  */
2882       if (TREE_CODE (tmp) == RETURN_EXPR)
2883         {
2884           tree op = TREE_OPERAND (tmp, 0);
2885           if (!is_gimple_val (op))
2886             {
2887               gcc_assert (TREE_CODE (op) == MODIFY_EXPR);
2888               bsi_insert_before (bsi, op, BSI_NEW_STMT);
2889               TREE_OPERAND (tmp, 0) = TREE_OPERAND (op, 0);
2890             }
2891           bsi_prev (bsi);
2892           return true;
2893         }
2894     }
2895
2896   /* Otherwise, create a new basic block, and split this edge.  */
2897   dest = split_edge (e);
2898   if (new_bb)
2899     *new_bb = dest;
2900   e = dest->pred;
2901   goto restart;
2902 }
2903
2904
2905 /* This routine will commit all pending edge insertions, creating any new
2906    basic blocks which are necessary.
2907
2908    If specified, NEW_BLOCKS returns a count of the number of new basic
2909    blocks which were created.  */
2910
2911 void
2912 bsi_commit_edge_inserts (int *new_blocks)
2913 {
2914   basic_block bb;
2915   edge e;
2916   int blocks;
2917
2918   blocks = n_basic_blocks;
2919
2920   bsi_commit_edge_inserts_1 (ENTRY_BLOCK_PTR->succ);
2921
2922   FOR_EACH_BB (bb)
2923     for (e = bb->succ; e; e = e->succ_next)
2924       bsi_commit_edge_inserts_1 (e);
2925
2926   if (new_blocks)
2927     *new_blocks = n_basic_blocks - blocks;
2928 }
2929
2930
2931 /* Commit insertions pending at edge E.  */
2932
2933 static void
2934 bsi_commit_edge_inserts_1 (edge e)
2935 {
2936   if (PENDING_STMT (e))
2937     {
2938       block_stmt_iterator bsi;
2939       tree stmt = PENDING_STMT (e);
2940
2941       PENDING_STMT (e) = NULL_TREE;
2942
2943       if (tree_find_edge_insert_loc (e, &bsi, NULL))
2944         bsi_insert_after (&bsi, stmt, BSI_NEW_STMT);
2945       else
2946         bsi_insert_before (&bsi, stmt, BSI_NEW_STMT);
2947     }
2948 }
2949
2950
2951 /* Add STMT to the pending list of edge E.  No actual insertion is
2952    made until a call to bsi_commit_edge_inserts () is made.  */
2953
2954 void
2955 bsi_insert_on_edge (edge e, tree stmt)
2956 {
2957   append_to_statement_list (stmt, &PENDING_STMT (e));
2958 }
2959
2960 /* Similar to bsi_insert_on_edge+bsi_commit_edge_inserts.  If new block has to
2961    be created, it is returned.  */
2962
2963 basic_block
2964 bsi_insert_on_edge_immediate (edge e, tree stmt)
2965 {
2966   block_stmt_iterator bsi;
2967   basic_block new_bb = NULL;
2968
2969   gcc_assert (!PENDING_STMT (e));
2970
2971   if (tree_find_edge_insert_loc (e, &bsi, &new_bb))
2972     bsi_insert_after (&bsi, stmt, BSI_NEW_STMT);
2973   else
2974     bsi_insert_before (&bsi, stmt, BSI_NEW_STMT);
2975
2976   return new_bb;
2977 }
2978
2979 /*---------------------------------------------------------------------------
2980              Tree specific functions for CFG manipulation
2981 ---------------------------------------------------------------------------*/
2982
2983 /* Split a (typically critical) edge EDGE_IN.  Return the new block.
2984    Abort on abnormal edges.  */
2985
2986 static basic_block
2987 tree_split_edge (edge edge_in)
2988 {
2989   basic_block new_bb, after_bb, dest, src;
2990   edge new_edge, e;
2991   tree phi;
2992   int i, num_elem;
2993
2994   /* Abnormal edges cannot be split.  */
2995   gcc_assert (!(edge_in->flags & EDGE_ABNORMAL));
2996
2997   src = edge_in->src;
2998   dest = edge_in->dest;
2999
3000   /* Place the new block in the block list.  Try to keep the new block
3001      near its "logical" location.  This is of most help to humans looking
3002      at debugging dumps.  */
3003   for (e = dest->pred; e; e = e->pred_next)
3004     if (e->src->next_bb == dest)
3005       break;
3006   if (!e)
3007     after_bb = dest->prev_bb;
3008   else
3009     after_bb = edge_in->src;
3010
3011   new_bb = create_empty_bb (after_bb);
3012   new_bb->frequency = EDGE_FREQUENCY (edge_in);
3013   new_bb->count = edge_in->count;
3014   new_edge = make_edge (new_bb, dest, EDGE_FALLTHRU);
3015   new_edge->probability = REG_BR_PROB_BASE;
3016   new_edge->count = edge_in->count;
3017
3018   /* Find all the PHI arguments on the original edge, and change them to
3019      the new edge.  Do it before redirection, so that the argument does not
3020      get removed.  */
3021   for (phi = phi_nodes (dest); phi; phi = PHI_CHAIN (phi))
3022     {
3023       num_elem = PHI_NUM_ARGS (phi);
3024       for (i = 0; i < num_elem; i++)
3025         if (PHI_ARG_EDGE (phi, i) == edge_in)
3026           {
3027             PHI_ARG_EDGE (phi, i) = new_edge;
3028             break;
3029           }
3030     }
3031
3032   e = redirect_edge_and_branch (edge_in, new_bb);
3033   gcc_assert (e);
3034   gcc_assert (!PENDING_STMT (edge_in));
3035
3036   return new_bb;
3037 }
3038
3039
3040 /* Return true when BB has label LABEL in it.  */
3041
3042 static bool
3043 has_label_p (basic_block bb, tree label)
3044 {
3045   block_stmt_iterator bsi;
3046
3047   for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
3048     {
3049       tree stmt = bsi_stmt (bsi);
3050
3051       if (TREE_CODE (stmt) != LABEL_EXPR)
3052         return false;
3053       if (LABEL_EXPR_LABEL (stmt) == label)
3054         return true;
3055     }
3056   return false;
3057 }
3058
3059
3060 /* Callback for walk_tree, check that all elements with address taken are
3061    properly noticed as such.  */
3062
3063 static tree
3064 verify_expr (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
3065 {
3066   tree t = *tp, x;
3067
3068   if (TYPE_P (t))
3069     *walk_subtrees = 0;
3070   
3071   /* Check operand N for being valid GIMPLE and give error MSG if not. 
3072      We check for constants explicitly since they are not considered
3073      gimple invariants if they overflowed.  */
3074 #define CHECK_OP(N, MSG) \
3075   do { if (!CONSTANT_CLASS_P (TREE_OPERAND (t, N))              \
3076          && !is_gimple_val (TREE_OPERAND (t, N)))               \
3077        { error (MSG); return TREE_OPERAND (t, N); }} while (0)
3078
3079   switch (TREE_CODE (t))
3080     {
3081     case SSA_NAME:
3082       if (SSA_NAME_IN_FREE_LIST (t))
3083         {
3084           error ("SSA name in freelist but still referenced");
3085           return *tp;
3086         }
3087       break;
3088
3089     case MODIFY_EXPR:
3090       x = TREE_OPERAND (t, 0);
3091       if (TREE_CODE (x) == BIT_FIELD_REF
3092           && is_gimple_reg (TREE_OPERAND (x, 0)))
3093         {
3094           error ("GIMPLE register modified with BIT_FIELD_REF");
3095           return t;
3096         }
3097       break;
3098
3099     case ADDR_EXPR:
3100       /* Skip any references (they will be checked when we recurse down the
3101          tree) and ensure that any variable used as a prefix is marked
3102          addressable.  */
3103       for (x = TREE_OPERAND (t, 0);
3104            (handled_component_p (x)
3105             || TREE_CODE (x) == REALPART_EXPR
3106             || TREE_CODE (x) == IMAGPART_EXPR);
3107            x = TREE_OPERAND (x, 0))
3108         ;
3109
3110       if (TREE_CODE (x) != VAR_DECL && TREE_CODE (x) != PARM_DECL)
3111         return NULL;
3112       if (!TREE_ADDRESSABLE (x))
3113         {
3114           error ("address taken, but ADDRESSABLE bit not set");
3115           return x;
3116         }
3117       break;
3118
3119     case COND_EXPR:
3120       x = TREE_OPERAND (t, 0);
3121       if (TREE_CODE (TREE_TYPE (x)) != BOOLEAN_TYPE)
3122         {
3123           error ("non-boolean used in condition");
3124           return x;
3125         }
3126       break;
3127
3128     case NOP_EXPR:
3129     case CONVERT_EXPR:
3130     case FIX_TRUNC_EXPR:
3131     case FIX_CEIL_EXPR:
3132     case FIX_FLOOR_EXPR:
3133     case FIX_ROUND_EXPR:
3134     case FLOAT_EXPR:
3135     case NEGATE_EXPR:
3136     case ABS_EXPR:
3137     case BIT_NOT_EXPR:
3138     case NON_LVALUE_EXPR:
3139     case TRUTH_NOT_EXPR:
3140       CHECK_OP (0, "Invalid operand to unary operator");
3141       break;
3142
3143     case REALPART_EXPR:
3144     case IMAGPART_EXPR:
3145     case COMPONENT_REF:
3146     case ARRAY_REF:
3147     case ARRAY_RANGE_REF:
3148     case BIT_FIELD_REF:
3149     case VIEW_CONVERT_EXPR:
3150       /* We have a nest of references.  Verify that each of the operands
3151          that determine where to reference is either a constant or a variable,
3152          verify that the base is valid, and then show we've already checked
3153          the subtrees.  */
3154       while (TREE_CODE (t) == REALPART_EXPR || TREE_CODE (t) == IMAGPART_EXPR
3155              || handled_component_p (t))
3156         {
3157           if (TREE_CODE (t) == COMPONENT_REF && TREE_OPERAND (t, 2))
3158             CHECK_OP (2, "Invalid COMPONENT_REF offset operator");
3159           else if (TREE_CODE (t) == ARRAY_REF
3160                    || TREE_CODE (t) == ARRAY_RANGE_REF)
3161             {
3162               CHECK_OP (1, "Invalid array index.");
3163               if (TREE_OPERAND (t, 2))
3164                 CHECK_OP (2, "Invalid array lower bound.");
3165               if (TREE_OPERAND (t, 3))
3166                 CHECK_OP (3, "Invalid array stride.");
3167             }
3168           else if (TREE_CODE (t) == BIT_FIELD_REF)
3169             {
3170               CHECK_OP (1, "Invalid operand to BIT_FIELD_REF");
3171               CHECK_OP (2, "Invalid operand to BIT_FIELD_REF");
3172             }
3173
3174           t = TREE_OPERAND (t, 0);
3175         }
3176
3177       if (!CONSTANT_CLASS_P (t) && !is_gimple_lvalue (t))
3178         {
3179           error ("Invalid reference prefix.");
3180           return t;
3181         }
3182       *walk_subtrees = 0;
3183       break;
3184
3185     case LT_EXPR:
3186     case LE_EXPR:
3187     case GT_EXPR:
3188     case GE_EXPR:
3189     case EQ_EXPR:
3190     case NE_EXPR:
3191     case UNORDERED_EXPR:
3192     case ORDERED_EXPR:
3193     case UNLT_EXPR:
3194     case UNLE_EXPR:
3195     case UNGT_EXPR:
3196     case UNGE_EXPR:
3197     case UNEQ_EXPR:
3198     case LTGT_EXPR:
3199     case PLUS_EXPR:
3200     case MINUS_EXPR:
3201     case MULT_EXPR:
3202     case TRUNC_DIV_EXPR:
3203     case CEIL_DIV_EXPR:
3204     case FLOOR_DIV_EXPR:
3205     case ROUND_DIV_EXPR:
3206     case TRUNC_MOD_EXPR:
3207     case CEIL_MOD_EXPR:
3208     case FLOOR_MOD_EXPR:
3209     case ROUND_MOD_EXPR:
3210     case RDIV_EXPR:
3211     case EXACT_DIV_EXPR:
3212     case MIN_EXPR:
3213     case MAX_EXPR:
3214     case LSHIFT_EXPR:
3215     case RSHIFT_EXPR:
3216     case LROTATE_EXPR:
3217     case RROTATE_EXPR:
3218     case BIT_IOR_EXPR:
3219     case BIT_XOR_EXPR:
3220     case BIT_AND_EXPR:
3221       CHECK_OP (0, "Invalid operand to binary operator");
3222       CHECK_OP (1, "Invalid operand to binary operator");
3223       break;
3224
3225     default:
3226       break;
3227     }
3228   return NULL;
3229
3230 #undef CHECK_OP
3231 }
3232
3233
3234 /* Verify STMT, return true if STMT is not in GIMPLE form.
3235    TODO: Implement type checking.  */
3236
3237 static bool
3238 verify_stmt (tree stmt, bool last_in_block)
3239 {
3240   tree addr;
3241
3242   if (!is_gimple_stmt (stmt))
3243     {
3244       error ("Is not a valid GIMPLE statement.");
3245       goto fail;
3246     }
3247
3248   addr = walk_tree (&stmt, verify_expr, NULL, NULL);
3249   if (addr)
3250     {
3251       debug_generic_stmt (addr);
3252       return true;
3253     }
3254
3255   /* If the statement is marked as part of an EH region, then it is
3256      expected that the statement could throw.  Verify that when we
3257      have optimizations that simplify statements such that we prove
3258      that they cannot throw, that we update other data structures
3259      to match.  */
3260   if (lookup_stmt_eh_region (stmt) >= 0)
3261     {
3262       if (!tree_could_throw_p (stmt))
3263         {
3264           error ("Statement marked for throw, but doesn%'t.");
3265           goto fail;
3266         }
3267       if (!last_in_block && tree_can_throw_internal (stmt))
3268         {
3269           error ("Statement marked for throw in middle of block.");
3270           goto fail;
3271         }
3272     }
3273
3274   return false;
3275
3276  fail:
3277   debug_generic_stmt (stmt);
3278   return true;
3279 }
3280
3281
3282 /* Return true when the T can be shared.  */
3283
3284 static bool
3285 tree_node_can_be_shared (tree t)
3286 {
3287   if (IS_TYPE_OR_DECL_P (t)
3288       /* We check for constants explicitly since they are not considered
3289          gimple invariants if they overflowed.  */
3290       || CONSTANT_CLASS_P (t)
3291       || is_gimple_min_invariant (t)
3292       || TREE_CODE (t) == SSA_NAME)
3293     return true;
3294
3295   while (((TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
3296           /* We check for constants explicitly since they are not considered
3297              gimple invariants if they overflowed.  */
3298           && (CONSTANT_CLASS_P (TREE_OPERAND (t, 1))
3299               || is_gimple_min_invariant (TREE_OPERAND (t, 1))))
3300          || (TREE_CODE (t) == COMPONENT_REF
3301              || TREE_CODE (t) == REALPART_EXPR
3302              || TREE_CODE (t) == IMAGPART_EXPR))
3303     t = TREE_OPERAND (t, 0);
3304
3305   if (DECL_P (t))
3306     return true;
3307
3308   return false;
3309 }
3310
3311
3312 /* Called via walk_trees.  Verify tree sharing.  */
3313
3314 static tree
3315 verify_node_sharing (tree * tp, int *walk_subtrees, void *data)
3316 {
3317   htab_t htab = (htab_t) data;
3318   void **slot;
3319
3320   if (tree_node_can_be_shared (*tp))
3321     {
3322       *walk_subtrees = false;
3323       return NULL;
3324     }
3325
3326   slot = htab_find_slot (htab, *tp, INSERT);
3327   if (*slot)
3328     return *slot;
3329   *slot = *tp;
3330
3331   return NULL;
3332 }
3333
3334
3335 /* Verify the GIMPLE statement chain.  */
3336
3337 void
3338 verify_stmts (void)
3339 {
3340   basic_block bb;
3341   block_stmt_iterator bsi;
3342   bool err = false;
3343   htab_t htab;
3344   tree addr;
3345
3346   timevar_push (TV_TREE_STMT_VERIFY);
3347   htab = htab_create (37, htab_hash_pointer, htab_eq_pointer, NULL);
3348
3349   FOR_EACH_BB (bb)
3350     {
3351       tree phi;
3352       int i;
3353
3354       for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
3355         {
3356           int phi_num_args = PHI_NUM_ARGS (phi);
3357
3358           for (i = 0; i < phi_num_args; i++)
3359             {
3360               tree t = PHI_ARG_DEF (phi, i);
3361               tree addr;
3362
3363               /* Addressable variables do have SSA_NAMEs but they
3364                  are not considered gimple values.  */
3365               if (TREE_CODE (t) != SSA_NAME
3366                   && TREE_CODE (t) != FUNCTION_DECL
3367                   && !is_gimple_val (t))
3368                 {
3369                   error ("PHI def is not a GIMPLE value");
3370                   debug_generic_stmt (phi);
3371                   debug_generic_stmt (t);
3372                   err |= true;
3373                 }
3374
3375               addr = walk_tree (&t, verify_expr, NULL, NULL);
3376               if (addr)
3377                 {
3378                   debug_generic_stmt (addr);
3379                   err |= true;
3380                 }
3381
3382               addr = walk_tree (&t, verify_node_sharing, htab, NULL);
3383               if (addr)
3384                 {
3385                   error ("Incorrect sharing of tree nodes");
3386                   debug_generic_stmt (phi);
3387                   debug_generic_stmt (addr);
3388                   err |= true;
3389                 }
3390             }
3391         }
3392
3393       for (bsi = bsi_start (bb); !bsi_end_p (bsi); )
3394         {
3395           tree stmt = bsi_stmt (bsi);
3396           bsi_next (&bsi);
3397           err |= verify_stmt (stmt, bsi_end_p (bsi));
3398           addr = walk_tree (&stmt, verify_node_sharing, htab, NULL);
3399           if (addr)
3400             {
3401               error ("Incorrect sharing of tree nodes");
3402               debug_generic_stmt (stmt);
3403               debug_generic_stmt (addr);
3404               err |= true;
3405             }
3406         }
3407     }
3408
3409   if (err)
3410     internal_error ("verify_stmts failed.");
3411
3412   htab_delete (htab);
3413   timevar_pop (TV_TREE_STMT_VERIFY);
3414 }
3415
3416
3417 /* Verifies that the flow information is OK.  */
3418
3419 static int
3420 tree_verify_flow_info (void)
3421 {
3422   int err = 0;
3423   basic_block bb;
3424   block_stmt_iterator bsi;
3425   tree stmt;
3426   edge e;
3427
3428   if (ENTRY_BLOCK_PTR->stmt_list)
3429     {
3430       error ("ENTRY_BLOCK has a statement list associated with it\n");
3431       err = 1;
3432     }
3433
3434   if (EXIT_BLOCK_PTR->stmt_list)
3435     {
3436       error ("EXIT_BLOCK has a statement list associated with it\n");
3437       err = 1;
3438     }
3439
3440   for (e = EXIT_BLOCK_PTR->pred; e; e = e->pred_next)
3441     if (e->flags & EDGE_FALLTHRU)
3442       {
3443         error ("Fallthru to exit from bb %d\n", e->src->index);
3444         err = 1;
3445       }
3446
3447   FOR_EACH_BB (bb)
3448     {
3449       bool found_ctrl_stmt = false;
3450
3451       /* Skip labels on the start of basic block.  */
3452       for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
3453         {
3454           if (TREE_CODE (bsi_stmt (bsi)) != LABEL_EXPR)
3455             break;
3456
3457           if (label_to_block (LABEL_EXPR_LABEL (bsi_stmt (bsi))) != bb)
3458             {
3459               error ("Label %s to block does not match in bb %d\n",
3460                      IDENTIFIER_POINTER (DECL_NAME (bsi_stmt (bsi))),
3461                      bb->index);
3462               err = 1;
3463             }
3464
3465           if (decl_function_context (LABEL_EXPR_LABEL (bsi_stmt (bsi)))
3466               != current_function_decl)
3467             {
3468               error ("Label %s has incorrect context in bb %d\n",
3469                      IDENTIFIER_POINTER (DECL_NAME (bsi_stmt (bsi))),
3470                      bb->index);
3471               err = 1;
3472             }
3473         }
3474
3475       /* Verify that body of basic block BB is free of control flow.  */
3476       for (; !bsi_end_p (bsi); bsi_next (&bsi))
3477         {
3478           tree stmt = bsi_stmt (bsi);
3479
3480           if (found_ctrl_stmt)
3481             {
3482               error ("Control flow in the middle of basic block %d\n",
3483                      bb->index);
3484               err = 1;
3485             }
3486
3487           if (stmt_ends_bb_p (stmt))
3488             found_ctrl_stmt = true;
3489
3490           if (TREE_CODE (stmt) == LABEL_EXPR)
3491             {
3492               error ("Label %s in the middle of basic block %d\n",
3493                      IDENTIFIER_POINTER (DECL_NAME (stmt)),
3494                      bb->index);
3495               err = 1;
3496             }
3497         }
3498       bsi = bsi_last (bb);
3499       if (bsi_end_p (bsi))
3500         continue;
3501
3502       stmt = bsi_stmt (bsi);
3503
3504       if (is_ctrl_stmt (stmt))
3505         {
3506           for (e = bb->succ; e; e = e->succ_next)
3507             if (e->flags & EDGE_FALLTHRU)
3508               {
3509                 error ("Fallthru edge after a control statement in bb %d \n",
3510                        bb->index);
3511                 err = 1;
3512               }
3513         }
3514
3515       switch (TREE_CODE (stmt))
3516         {
3517         case COND_EXPR:
3518           {
3519             edge true_edge;
3520             edge false_edge;
3521             if (TREE_CODE (COND_EXPR_THEN (stmt)) != GOTO_EXPR
3522                 || TREE_CODE (COND_EXPR_ELSE (stmt)) != GOTO_EXPR)
3523               {
3524                 error ("Structured COND_EXPR at the end of bb %d\n", bb->index);
3525                 err = 1;
3526               }
3527
3528             extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
3529
3530             if (!true_edge || !false_edge
3531                 || !(true_edge->flags & EDGE_TRUE_VALUE)
3532                 || !(false_edge->flags & EDGE_FALSE_VALUE)
3533                 || (true_edge->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL))
3534                 || (false_edge->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL))
3535                 || bb->succ->succ_next->succ_next)
3536               {
3537                 error ("Wrong outgoing edge flags at end of bb %d\n",
3538                        bb->index);
3539                 err = 1;
3540               }
3541
3542             if (!has_label_p (true_edge->dest,
3543                               GOTO_DESTINATION (COND_EXPR_THEN (stmt))))
3544               {
3545                 error ("%<then%> label does not match edge at end of bb %d\n",
3546                        bb->index);
3547                 err = 1;
3548               }
3549
3550             if (!has_label_p (false_edge->dest,
3551                               GOTO_DESTINATION (COND_EXPR_ELSE (stmt))))
3552               {
3553                 error ("%<else%> label does not match edge at end of bb %d\n",
3554                        bb->index);
3555                 err = 1;
3556               }
3557           }
3558           break;
3559
3560         case GOTO_EXPR:
3561           if (simple_goto_p (stmt))
3562             {
3563               error ("Explicit goto at end of bb %d\n", bb->index);
3564               err = 1;
3565             }
3566           else
3567             {
3568               /* FIXME.  We should double check that the labels in the 
3569                  destination blocks have their address taken.  */
3570               for (e = bb->succ; e; e = e->succ_next)
3571                 if ((e->flags & (EDGE_FALLTHRU | EDGE_TRUE_VALUE
3572                                  | EDGE_FALSE_VALUE))
3573                     || !(e->flags & EDGE_ABNORMAL))
3574                   {
3575                     error ("Wrong outgoing edge flags at end of bb %d\n",
3576                            bb->index);
3577                     err = 1;
3578                   }
3579             }
3580           break;
3581
3582         case RETURN_EXPR:
3583           if (!bb->succ || bb->succ->succ_next
3584               || (bb->succ->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL
3585                                      | EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
3586             {
3587               error ("Wrong outgoing edge flags at end of bb %d\n", bb->index);
3588               err = 1;
3589             }
3590           if (bb->succ->dest != EXIT_BLOCK_PTR)
3591             {
3592               error ("Return edge does not point to exit in bb %d\n",
3593                      bb->index);
3594               err = 1;
3595             }
3596           break;
3597
3598         case SWITCH_EXPR:
3599           {
3600             tree prev;
3601             edge e;
3602             size_t i, n;
3603             tree vec;
3604
3605             vec = SWITCH_LABELS (stmt);
3606             n = TREE_VEC_LENGTH (vec);
3607
3608             /* Mark all the destination basic blocks.  */
3609             for (i = 0; i < n; ++i)
3610               {
3611                 tree lab = CASE_LABEL (TREE_VEC_ELT (vec, i));
3612                 basic_block label_bb = label_to_block (lab);
3613
3614                 gcc_assert (!label_bb->aux || label_bb->aux == (void *)1);
3615                 label_bb->aux = (void *)1;
3616               }
3617
3618             /* Verify that the case labels are sorted.  */
3619             prev = TREE_VEC_ELT (vec, 0);
3620             for (i = 1; i < n - 1; ++i)
3621               {
3622                 tree c = TREE_VEC_ELT (vec, i);
3623                 if (! CASE_LOW (c))
3624                   {
3625                     error ("Found default case not at end of case vector");
3626                     err = 1;
3627                     continue;
3628                   }
3629                 if (! tree_int_cst_lt (CASE_LOW (prev), CASE_LOW (c)))
3630                   {
3631                     error ("Case labels not sorted:\n ");
3632                     print_generic_expr (stderr, prev, 0);
3633                     fprintf (stderr," is greater than ");
3634                     print_generic_expr (stderr, c, 0);
3635                     fprintf (stderr," but comes before it.\n");
3636                     err = 1;
3637                   }
3638                 prev = c;
3639               }
3640             if (CASE_LOW (TREE_VEC_ELT (vec, n - 1)))
3641               {
3642                 error ("No default case found at end of case vector");
3643                 err = 1;
3644               }
3645
3646             for (e = bb->succ; e; e = e->succ_next)
3647               {
3648                 if (!e->dest->aux)
3649                   {
3650                     error ("Extra outgoing edge %d->%d\n",
3651                            bb->index, e->dest->index);
3652                     err = 1;
3653                   }
3654                 e->dest->aux = (void *)2;
3655                 if ((e->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL
3656                                  | EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
3657                   {
3658                     error ("Wrong outgoing edge flags at end of bb %d\n",
3659                            bb->index);
3660                     err = 1;
3661                   }
3662               }
3663
3664             /* Check that we have all of them.  */
3665             for (i = 0; i < n; ++i)
3666               {
3667                 tree lab = CASE_LABEL (TREE_VEC_ELT (vec, i));
3668                 basic_block label_bb = label_to_block (lab);
3669
3670                 if (label_bb->aux != (void *)2)
3671                   {
3672                     error ("Missing edge %i->%i\n",
3673                            bb->index, label_bb->index);
3674                     err = 1;
3675                   }
3676               }
3677
3678             for (e = bb->succ; e; e = e->succ_next)
3679               e->dest->aux = (void *)0;
3680           }
3681
3682         default: ;
3683         }
3684     }
3685
3686   if (dom_computed[CDI_DOMINATORS] >= DOM_NO_FAST_QUERY)
3687     verify_dominators (CDI_DOMINATORS);
3688
3689   return err;
3690 }
3691
3692
3693 /* Updates phi nodes after creating forwarder block joined
3694    by edge FALLTHRU.  */
3695
3696 static void
3697 tree_make_forwarder_block (edge fallthru)
3698 {
3699   edge e;
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 (!bb->pred->pred_next)
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 (e = bb->pred; e; e = e->pred_next)
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
3756   /* If we have already determined that this block is not forwardable,
3757      then no further checks are necessary.  */
3758   if (! bb_ann (bb)->forwardable)
3759     return false;
3760
3761   /* BB must have a single outgoing normal edge.  Otherwise it can not be
3762      a forwarder block.  */
3763   if (!bb->succ
3764       || bb->succ->succ_next
3765       || bb->succ->dest == EXIT_BLOCK_PTR
3766       || (bb->succ->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 (e = ENTRY_BLOCK_PTR->succ; e; e = e->succ_next)
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, next, 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       /* Don't waste time on unreachable blocks.  */
3833       if (!bb->pred)
3834         continue;
3835
3836       /* Nor on forwarders.  */
3837       if (tree_forwarder_block_p (bb))
3838         continue;
3839       
3840       /* This block is now part of a forwarding path, mark it as not
3841          forwardable so that we can detect loops.  This bit will be
3842          reset below.  */
3843       bb_ann (bb)->forwardable = 0;
3844
3845       /* Examine each of our block's successors to see if it is
3846          forwardable.  */
3847       for (e = bb->succ; e; e = next)
3848         {
3849           int freq;
3850           gcov_type count;
3851           next = e->succ_next;
3852
3853           /* If the edge is abnormal or its destination is not
3854              forwardable, then there's nothing to do.  */
3855           if ((e->flags & EDGE_ABNORMAL)
3856               || !tree_forwarder_block_p (e->dest))
3857             continue;
3858
3859           count = e->count;
3860           freq = EDGE_FREQUENCY (e);
3861
3862           /* Now walk through as many forwarder block as possible to
3863              find the ultimate destination we want to thread our jump
3864              to.  */
3865           last = e->dest->succ;
3866           bb_ann (e->dest)->forwardable = 0;
3867           for (dest = e->dest->succ->dest;
3868                tree_forwarder_block_p (dest);
3869                last = dest->succ,
3870                dest = dest->succ->dest)
3871             {
3872               /* An infinite loop detected.  We redirect the edge anyway, so
3873                  that the loop is shrunk into single basic block.  */
3874               if (!bb_ann (dest)->forwardable)
3875                 break;
3876
3877               if (dest->succ->dest == EXIT_BLOCK_PTR)
3878                 break;
3879
3880               bb_ann (dest)->forwardable = 0;
3881             }
3882
3883           /* Reset the forwardable marks to 1.  */
3884           for (tmp = e->dest;
3885                tmp != dest;
3886                tmp = tmp->succ->dest)
3887             bb_ann (tmp)->forwardable = 1;
3888
3889           if (dest == e->dest)
3890             continue;
3891               
3892           old = find_edge (bb, dest);
3893           if (old)
3894             {
3895               /* If there already is an edge, check whether the values
3896                  in phi nodes differ.  */
3897               if (!phi_alternatives_equal (dest, last, old))
3898                 {
3899                   /* The previous block is forwarder.  Redirect our jump
3900                      to that target instead since we know it has no PHI
3901                      nodes that will need updating.  */
3902                   dest = last->src;
3903           
3904                   /* That might mean that no forwarding at all is possible.  */
3905                   if (dest == e->dest)
3906                     continue;
3907
3908                   old = find_edge (bb, dest);
3909                 }
3910             }
3911
3912           /* Perform the redirection.  */
3913           retval = true;
3914           old_dest = e->dest;
3915           e = redirect_edge_and_branch (e, dest);
3916
3917           /* Update the profile.  */
3918           if (profile_status != PROFILE_ABSENT)
3919             for (curr = old_dest; curr != dest; curr = curr->succ->dest)
3920               {
3921                 curr->frequency -= freq;
3922                 if (curr->frequency < 0)
3923                   curr->frequency = 0;
3924                 curr->count -= count;
3925                 if (curr->count < 0)
3926                   curr->count = 0;
3927                 curr->succ->count -= count;
3928                 if (curr->succ->count < 0)
3929                   curr->succ->count = 0;
3930               }
3931
3932           if (!old)
3933             {
3934               /* Update PHI nodes.   We know that the new argument should
3935                  have the same value as the argument associated with LAST.
3936                  Otherwise we would have changed our target block above.  */
3937               for (phi = phi_nodes (dest); phi; phi = PHI_CHAIN (phi))
3938                 {
3939                   arg = phi_arg_from_edge (phi, last);
3940                   gcc_assert (arg >= 0);
3941                   add_phi_arg (&phi, PHI_ARG_DEF (phi, arg), e);
3942                 }
3943             }
3944
3945           /* Update the dominators.  */
3946           if (dom_computed[CDI_DOMINATORS] >= DOM_CONS_OK)
3947             {
3948               /* Remove the unreachable blocks (observe that if all blocks
3949                  were reachable before, only those in the path we threaded
3950                  over and did not have any predecessor outside of the path
3951                  become unreachable).  */
3952               for (; old_dest != dest; old_dest = tmp)
3953                 {
3954                   tmp = old_dest->succ->dest;
3955
3956                   if (old_dest->pred)
3957                     break;
3958
3959                   delete_basic_block (old_dest);
3960                 }
3961               /* If the dominator of the destination was in the path, set its
3962                  dominator to the start of the redirected edge.  */
3963               if (get_immediate_dominator (CDI_DOMINATORS, old_dest) == NULL)
3964                 set_immediate_dominator (CDI_DOMINATORS, old_dest, bb);
3965
3966               /* Now proceed like if we forwarded just over one edge at a time.
3967                  Algorithm for forwarding edge S --> A over edge A --> B then
3968                  is
3969
3970                  if (idom (B) == A
3971                      && !dominated_by (S, B))
3972                    idom (B) = idom (A);
3973                  recount_idom (A);  */
3974
3975               for (; old_dest != dest; old_dest = tmp)
3976                 {
3977                   tmp = old_dest->succ->dest;
3978
3979                   if (get_immediate_dominator (CDI_DOMINATORS, tmp) == old_dest
3980                       && !dominated_by_p (CDI_DOMINATORS, bb, tmp))
3981                     {
3982                       dom = get_immediate_dominator (CDI_DOMINATORS, old_dest);
3983                       set_immediate_dominator (CDI_DOMINATORS, tmp, dom);
3984                     }
3985
3986                   dom = recount_dominator (CDI_DOMINATORS, old_dest);
3987                   set_immediate_dominator (CDI_DOMINATORS, old_dest, dom);
3988                 }
3989             }
3990         }
3991
3992       /* Reset the forwardable bit on our block since it's no longer in
3993          a forwarding chain path.  */
3994       bb_ann (bb)->forwardable = 1;
3995     }
3996
3997   return retval;
3998 }
3999
4000
4001 /* Return a non-special label in the head of basic block BLOCK.
4002    Create one if it doesn't exist.  */
4003
4004 tree
4005 tree_block_label (basic_block bb)
4006 {
4007   block_stmt_iterator i, s = bsi_start (bb);
4008   bool first = true;
4009   tree label, stmt;
4010
4011   for (i = s; !bsi_end_p (i); first = false, bsi_next (&i))
4012     {
4013       stmt = bsi_stmt (i);
4014       if (TREE_CODE (stmt) != LABEL_EXPR)
4015         break;
4016       label = LABEL_EXPR_LABEL (stmt);
4017       if (!DECL_NONLOCAL (label))
4018         {
4019           if (!first)
4020             bsi_move_before (&i, &s);
4021           return label;
4022         }
4023     }
4024
4025   label = create_artificial_label ();
4026   stmt = build1 (LABEL_EXPR, void_type_node, label);
4027   bsi_insert_before (&s, stmt, BSI_NEW_STMT);
4028   return label;
4029 }
4030
4031
4032 /* Attempt to perform edge redirection by replacing a possibly complex
4033    jump instruction by a goto or by removing the jump completely.
4034    This can apply only if all edges now point to the same block.  The
4035    parameters and return values are equivalent to
4036    redirect_edge_and_branch.  */
4037
4038 static edge
4039 tree_try_redirect_by_replacing_jump (edge e, basic_block target)
4040 {
4041   basic_block src = e->src;
4042   edge tmp;
4043   block_stmt_iterator b;
4044   tree stmt;
4045
4046   /* Verify that all targets will be TARGET.  */
4047   for (tmp = src->succ; tmp; tmp = tmp->succ_next)
4048     if (tmp->dest != target && tmp != e)
4049       break;
4050
4051   if (tmp)
4052     return NULL;
4053
4054   b = bsi_last (src);
4055   if (bsi_end_p (b))
4056     return NULL;
4057   stmt = bsi_stmt (b);
4058
4059   if (TREE_CODE (stmt) == COND_EXPR
4060       || TREE_CODE (stmt) == SWITCH_EXPR)
4061     {
4062       bsi_remove (&b);
4063       e = ssa_redirect_edge (e, target);
4064       e->flags = EDGE_FALLTHRU;
4065       return e;
4066     }
4067
4068   return NULL;
4069 }
4070
4071
4072 /* Redirect E to DEST.  Return NULL on failure.  Otherwise, return the
4073    edge representing the redirected branch.  */
4074
4075 static edge
4076 tree_redirect_edge_and_branch (edge e, basic_block dest)
4077 {
4078   basic_block bb = e->src;
4079   block_stmt_iterator bsi;
4080   edge ret;
4081   tree label, stmt;
4082
4083   if (e->flags & (EDGE_ABNORMAL_CALL | EDGE_EH))
4084     return NULL;
4085
4086   if (e->src != ENTRY_BLOCK_PTR 
4087       && (ret = tree_try_redirect_by_replacing_jump (e, dest)))
4088     return ret;
4089
4090   if (e->dest == dest)
4091     return NULL;
4092
4093   label = tree_block_label (dest);
4094
4095   bsi = bsi_last (bb);
4096   stmt = bsi_end_p (bsi) ? NULL : bsi_stmt (bsi);
4097
4098   switch (stmt ? TREE_CODE (stmt) : ERROR_MARK)
4099     {
4100     case COND_EXPR:
4101       stmt = (e->flags & EDGE_TRUE_VALUE
4102               ? COND_EXPR_THEN (stmt)
4103               : COND_EXPR_ELSE (stmt));
4104       GOTO_DESTINATION (stmt) = label;
4105       break;
4106
4107     case GOTO_EXPR:
4108       /* No non-abnormal edges should lead from a non-simple goto, and
4109          simple ones should be represented implicitly.  */
4110       gcc_unreachable ();
4111
4112     case SWITCH_EXPR:
4113       {
4114         tree vec = SWITCH_LABELS (stmt);
4115         size_t i, n = TREE_VEC_LENGTH (vec);
4116
4117         for (i = 0; i < n; ++i)
4118           {
4119             tree elt = TREE_VEC_ELT (vec, i);
4120             if (label_to_block (CASE_LABEL (elt)) == e->dest)
4121               CASE_LABEL (elt) = label;
4122           }
4123       }
4124       break;
4125
4126     case RETURN_EXPR:
4127       bsi_remove (&bsi);
4128       e->flags |= EDGE_FALLTHRU;
4129       break;
4130
4131     default:
4132       /* Otherwise it must be a fallthru edge, and we don't need to
4133          do anything besides redirecting it.  */
4134       gcc_assert (e->flags & EDGE_FALLTHRU);
4135       break;
4136     }
4137
4138   /* Update/insert PHI nodes as necessary.  */
4139
4140   /* Now update the edges in the CFG.  */
4141   e = ssa_redirect_edge (e, dest);
4142
4143   return e;
4144 }
4145
4146
4147 /* Simple wrapper, as we can always redirect fallthru edges.  */
4148
4149 static basic_block
4150 tree_redirect_edge_and_branch_force (edge e, basic_block dest)
4151 {
4152   e = tree_redirect_edge_and_branch (e, dest);
4153   gcc_assert (e);
4154
4155   return NULL;
4156 }
4157
4158
4159 /* Splits basic block BB after statement STMT (but at least after the
4160    labels).  If STMT is NULL, BB is split just after the labels.  */
4161
4162 static basic_block
4163 tree_split_block (basic_block bb, void *stmt)
4164 {
4165   block_stmt_iterator bsi, bsi_tgt;
4166   tree act;
4167   basic_block new_bb;
4168   edge e;
4169
4170   new_bb = create_empty_bb (bb);
4171
4172   /* Redirect the outgoing edges.  */
4173   new_bb->succ = bb->succ;
4174   bb->succ = NULL;
4175   for (e = new_bb->succ; e; e = e->succ_next)
4176     e->src = new_bb;
4177
4178   if (stmt && TREE_CODE ((tree) stmt) == LABEL_EXPR)
4179     stmt = NULL;
4180
4181   /* Move everything from BSI to the new basic block.  */
4182   for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
4183     {
4184       act = bsi_stmt (bsi);
4185       if (TREE_CODE (act) == LABEL_EXPR)
4186         continue;
4187
4188       if (!stmt)
4189         break;
4190
4191       if (stmt == act)
4192         {
4193           bsi_next (&bsi);
4194           break;
4195         }
4196     }
4197
4198   bsi_tgt = bsi_start (new_bb);
4199   while (!bsi_end_p (bsi))
4200     {
4201       act = bsi_stmt (bsi);
4202       bsi_remove (&bsi);
4203       bsi_insert_after (&bsi_tgt, act, BSI_NEW_STMT);
4204     }
4205
4206   return new_bb;
4207 }
4208
4209
4210 /* Moves basic block BB after block AFTER.  */
4211
4212 static bool
4213 tree_move_block_after (basic_block bb, basic_block after)
4214 {
4215   if (bb->prev_bb == after)
4216     return true;
4217
4218   unlink_block (bb);
4219   link_block (bb, after);
4220
4221   return true;
4222 }
4223
4224
4225 /* Return true if basic_block can be duplicated.  */
4226
4227 static bool
4228 tree_can_duplicate_bb_p (basic_block bb ATTRIBUTE_UNUSED)
4229 {
4230   return true;
4231 }
4232
4233 /* Create a duplicate of the basic block BB.  NOTE: This does not
4234    preserve SSA form.  */
4235
4236 static basic_block
4237 tree_duplicate_bb (basic_block bb)
4238 {
4239   basic_block new_bb;
4240   block_stmt_iterator bsi, bsi_tgt;
4241   tree phi, val;
4242   ssa_op_iter op_iter;
4243
4244   new_bb = create_empty_bb (EXIT_BLOCK_PTR->prev_bb);
4245
4246   /* First copy the phi nodes.  We do not copy phi node arguments here,
4247      since the edges are not ready yet.  Keep the chain of phi nodes in
4248      the same order, so that we can add them later.  */
4249   for (phi = phi_nodes (bb); phi; phi = TREE_CHAIN (phi))
4250     {
4251       mark_for_rewrite (PHI_RESULT (phi));
4252       create_phi_node (PHI_RESULT (phi), new_bb);
4253     }
4254   set_phi_nodes (new_bb, nreverse (phi_nodes (new_bb)));
4255
4256   bsi_tgt = bsi_start (new_bb);
4257   for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
4258     {
4259       tree stmt = bsi_stmt (bsi);
4260       tree copy;
4261
4262       if (TREE_CODE (stmt) == LABEL_EXPR)
4263         continue;
4264
4265       /* Record the definitions.  */
4266       get_stmt_operands (stmt);
4267
4268       FOR_EACH_SSA_TREE_OPERAND (val, stmt, op_iter, SSA_OP_ALL_DEFS)
4269         mark_for_rewrite (val);
4270
4271       copy = unshare_expr (stmt);
4272
4273       /* Copy also the virtual operands.  */
4274       get_stmt_ann (copy);
4275       copy_virtual_operands (copy, stmt);
4276       
4277       bsi_insert_after (&bsi_tgt, copy, BSI_NEW_STMT);
4278     }
4279
4280   return new_bb;
4281 }
4282
4283 /* Basic block BB_COPY was created by code duplication.  Add phi node
4284    arguments for edges going out of BB_COPY.  The blocks that were
4285    duplicated have rbi->duplicated set to one.  */
4286
4287 void
4288 add_phi_args_after_copy_bb (basic_block bb_copy)
4289 {
4290   basic_block bb, dest;
4291   edge e, e_copy;
4292   tree phi, phi_copy, phi_next, def;
4293       
4294   bb = bb_copy->rbi->original;
4295
4296   for (e_copy = bb_copy->succ; e_copy; e_copy = e_copy->succ_next)
4297     {
4298       if (!phi_nodes (e_copy->dest))
4299         continue;
4300
4301       if (e_copy->dest->rbi->duplicated)
4302         dest = e_copy->dest->rbi->original;
4303       else
4304         dest = e_copy->dest;
4305
4306       e = find_edge (bb, dest);
4307       if (!e)
4308         {
4309           /* During loop unrolling the target of the latch edge is copied.
4310              In this case we are not looking for edge to dest, but to
4311              duplicated block whose original was dest.  */
4312           for (e = bb->succ; e; e = e->succ_next)
4313             if (e->dest->rbi->duplicated
4314                 && e->dest->rbi->original == dest)
4315               break;
4316
4317           gcc_assert (e != NULL);
4318         }
4319
4320       for (phi = phi_nodes (e->dest), phi_copy = phi_nodes (e_copy->dest);
4321            phi;
4322            phi = phi_next, phi_copy = TREE_CHAIN (phi_copy))
4323         {
4324           phi_next = TREE_CHAIN (phi);
4325
4326           gcc_assert (PHI_RESULT (phi) == PHI_RESULT (phi_copy));
4327           def = PHI_ARG_DEF_FROM_EDGE (phi, e);
4328           add_phi_arg (&phi_copy, def, e_copy);
4329         }
4330     }
4331 }
4332
4333 /* Blocks in REGION_COPY array of length N_REGION were created by
4334    duplication of basic blocks.  Add phi node arguments for edges
4335    going from these blocks.  */
4336
4337 void
4338 add_phi_args_after_copy (basic_block *region_copy, unsigned n_region)
4339 {
4340   unsigned i;
4341
4342   for (i = 0; i < n_region; i++)
4343     region_copy[i]->rbi->duplicated = 1;
4344
4345   for (i = 0; i < n_region; i++)
4346     add_phi_args_after_copy_bb (region_copy[i]);
4347
4348   for (i = 0; i < n_region; i++)
4349     region_copy[i]->rbi->duplicated = 0;
4350 }
4351
4352 /* Maps the old ssa name FROM_NAME to TO_NAME.  */
4353
4354 struct ssa_name_map_entry
4355 {
4356   tree from_name;
4357   tree to_name;
4358 };
4359
4360 /* Hash function for ssa_name_map_entry.  */
4361
4362 static hashval_t
4363 ssa_name_map_entry_hash (const void *entry)
4364 {
4365   const struct ssa_name_map_entry *en = entry;
4366   return SSA_NAME_VERSION (en->from_name);
4367 }
4368
4369 /* Equality function for ssa_name_map_entry.  */
4370
4371 static int
4372 ssa_name_map_entry_eq (const void *in_table, const void *ssa_name)
4373 {
4374   const struct ssa_name_map_entry *en = in_table;
4375
4376   return en->from_name == ssa_name;
4377 }
4378
4379 /* Allocate duplicates of ssa names in list DEFINITIONS and store the mapping
4380    to MAP.  */
4381
4382 void
4383 allocate_ssa_names (bitmap definitions, htab_t *map)
4384 {
4385   tree name;
4386   struct ssa_name_map_entry *entry;
4387   PTR *slot;
4388   unsigned ver;
4389   bitmap_iterator bi;
4390
4391   if (!*map)
4392     *map = htab_create (10, ssa_name_map_entry_hash,
4393                         ssa_name_map_entry_eq, free);
4394   EXECUTE_IF_SET_IN_BITMAP (definitions, 0, ver, bi)
4395     {
4396       name = ssa_name (ver);
4397       slot = htab_find_slot_with_hash (*map, name, SSA_NAME_VERSION (name),
4398                                        INSERT);
4399       if (*slot)
4400         entry = *slot;
4401       else
4402         {
4403           entry = xmalloc (sizeof (struct ssa_name_map_entry));
4404           entry->from_name = name;
4405           *slot = entry;
4406         }
4407       entry->to_name = duplicate_ssa_name (name, SSA_NAME_DEF_STMT (name));
4408     }
4409 }
4410
4411 /* Rewrite the definition DEF in statement STMT to new ssa name as specified
4412    by the mapping MAP.  */
4413
4414 static void
4415 rewrite_to_new_ssa_names_def (def_operand_p def, tree stmt, htab_t map)
4416 {
4417   tree name = DEF_FROM_PTR (def);
4418   struct ssa_name_map_entry *entry;
4419
4420   gcc_assert (TREE_CODE (name) == SSA_NAME);
4421
4422   entry = htab_find_with_hash (map, name, SSA_NAME_VERSION (name));
4423   if (!entry)
4424     return;
4425
4426   SET_DEF (def, entry->to_name);
4427   SSA_NAME_DEF_STMT (entry->to_name) = stmt;
4428 }
4429
4430 /* Rewrite the USE to new ssa name as specified by the mapping MAP.  */
4431
4432 static void
4433 rewrite_to_new_ssa_names_use (use_operand_p use, htab_t map)
4434 {
4435   tree name = USE_FROM_PTR (use);
4436   struct ssa_name_map_entry *entry;
4437
4438   if (TREE_CODE (name) != SSA_NAME)
4439     return;
4440
4441   entry = htab_find_with_hash (map, name, SSA_NAME_VERSION (name));
4442   if (!entry)
4443     return;
4444
4445   SET_USE (use, entry->to_name);
4446 }
4447
4448 /* Rewrite the ssa names in basic block BB to new ones as specified by the
4449    mapping MAP.  */
4450
4451 void
4452 rewrite_to_new_ssa_names_bb (basic_block bb, htab_t map)
4453 {
4454   unsigned i;
4455   edge e;
4456   tree phi, stmt;
4457   block_stmt_iterator bsi;
4458   use_optype uses;
4459   vuse_optype vuses;
4460   def_optype defs;
4461   v_may_def_optype v_may_defs;
4462   v_must_def_optype v_must_defs;
4463   stmt_ann_t ann;
4464
4465   for (e = bb->pred; e; e = e->pred_next)
4466     if (e->flags & EDGE_ABNORMAL)
4467       break;
4468
4469   for (phi = phi_nodes (bb); phi; phi = TREE_CHAIN (phi))
4470     {
4471       rewrite_to_new_ssa_names_def (PHI_RESULT_PTR (phi), phi, map);
4472       if (e)
4473         SSA_NAME_OCCURS_IN_ABNORMAL_PHI (PHI_RESULT (phi)) = 1;
4474     }
4475
4476   for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
4477     {
4478       stmt = bsi_stmt (bsi);
4479       get_stmt_operands (stmt);
4480       ann = stmt_ann (stmt);
4481
4482       uses = USE_OPS (ann);
4483       for (i = 0; i < NUM_USES (uses); i++)
4484         rewrite_to_new_ssa_names_use (USE_OP_PTR (uses, i), map);
4485
4486       defs = DEF_OPS (ann);
4487       for (i = 0; i < NUM_DEFS (defs); i++)
4488         rewrite_to_new_ssa_names_def (DEF_OP_PTR (defs, i), stmt, map);
4489
4490       vuses = VUSE_OPS (ann);
4491       for (i = 0; i < NUM_VUSES (vuses); i++)
4492         rewrite_to_new_ssa_names_use (VUSE_OP_PTR (vuses, i), map);
4493
4494       v_may_defs = V_MAY_DEF_OPS (ann);
4495       for (i = 0; i < NUM_V_MAY_DEFS (v_may_defs); i++)
4496         {
4497           rewrite_to_new_ssa_names_use
4498                   (V_MAY_DEF_OP_PTR (v_may_defs, i), map);
4499           rewrite_to_new_ssa_names_def
4500                   (V_MAY_DEF_RESULT_PTR (v_may_defs, i), stmt, map);
4501         }
4502
4503       v_must_defs = V_MUST_DEF_OPS (ann);
4504       for (i = 0; i < NUM_V_MUST_DEFS (v_must_defs); i++)
4505         rewrite_to_new_ssa_names_def
4506                 (V_MUST_DEF_OP_PTR (v_must_defs, i), stmt, map);
4507     }
4508
4509   for (e = bb->succ; e; e = e->succ_next)
4510     for (phi = phi_nodes (e->dest); phi; phi = TREE_CHAIN (phi))
4511       {
4512         rewrite_to_new_ssa_names_use
4513                 (PHI_ARG_DEF_PTR_FROM_EDGE (phi, e), map);
4514
4515         if (e->flags & EDGE_ABNORMAL)
4516           {
4517             tree op = PHI_ARG_DEF_FROM_EDGE (phi, e);
4518             SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op) = 1;
4519           }
4520       }
4521 }
4522
4523 /* Rewrite the ssa names in N_REGION blocks REGION to the new ones as specified
4524    by the mapping MAP.  */
4525
4526 void
4527 rewrite_to_new_ssa_names (basic_block *region, unsigned n_region, htab_t map)
4528 {
4529   unsigned r;
4530
4531   for (r = 0; r < n_region; r++)
4532     rewrite_to_new_ssa_names_bb (region[r], map);
4533 }
4534
4535 /* Duplicates a REGION (set of N_REGION basic blocks) with just a single
4536    important exit edge EXIT.  By important we mean that no SSA name defined
4537    inside region is live over the other exit edges of the region.  All entry
4538    edges to the region must go to ENTRY->dest.  The edge ENTRY is redirected
4539    to the duplicate of the region.  SSA form, dominance and loop information
4540    is updated.  The new basic blocks are stored to REGION_COPY in the same
4541    order as they had in REGION, provided that REGION_COPY is not NULL.
4542    The function returns false if it is unable to copy the region,
4543    true otherwise.  */
4544
4545 bool
4546 tree_duplicate_sese_region (edge entry, edge exit,
4547                             basic_block *region, unsigned n_region,
4548                             basic_block *region_copy)
4549 {
4550   unsigned i, n_doms, ver;
4551   bool free_region_copy = false, copying_header = false;
4552   struct loop *loop = entry->dest->loop_father;
4553   edge exit_copy;
4554   bitmap definitions;
4555   tree phi, var;
4556   basic_block *doms;
4557   htab_t ssa_name_map = NULL;
4558   edge redirected;
4559   bitmap_iterator bi;
4560
4561   if (!can_copy_bbs_p (region, n_region))
4562     return false;
4563
4564   /* Some sanity checking.  Note that we do not check for all possible
4565      missuses of the functions.  I.e. if you ask to copy something weird,
4566      it will work, but the state of structures probably will not be
4567      correct.  */
4568
4569   for (i = 0; i < n_region; i++)
4570     {
4571       /* We do not handle subloops, i.e. all the blocks must belong to the
4572          same loop.  */
4573       if (region[i]->loop_father != loop)
4574         return false;
4575
4576       if (region[i] != entry->dest
4577           && region[i] == loop->header)
4578         return false;
4579     }
4580
4581   loop->copy = loop;
4582
4583   /* In case the function is used for loop header copying (which is the primary
4584      use), ensure that EXIT and its copy will be new latch and entry edges.  */
4585   if (loop->header == entry->dest)
4586     {
4587       copying_header = true;
4588       loop->copy = loop->outer;
4589
4590       if (!dominated_by_p (CDI_DOMINATORS, loop->latch, exit->src))
4591         return false;
4592
4593       for (i = 0; i < n_region; i++)
4594         if (region[i] != exit->src
4595             && dominated_by_p (CDI_DOMINATORS, region[i], exit->src))
4596           return false;
4597     }
4598
4599   if (!region_copy)
4600     {
4601       region_copy = xmalloc (sizeof (basic_block) * n_region);
4602       free_region_copy = true;
4603     }
4604
4605   gcc_assert (!any_marked_for_rewrite_p ());
4606
4607   /* Record blocks outside the region that are duplicated by something
4608      inside.  */
4609   doms = xmalloc (sizeof (basic_block) * n_basic_blocks);
4610   n_doms = get_dominated_by_region (CDI_DOMINATORS, region, n_region, doms);
4611
4612   copy_bbs (region, n_region, region_copy, &exit, 1, &exit_copy, loop);
4613   definitions = marked_ssa_names ();
4614
4615   if (copying_header)
4616     {
4617       loop->header = exit->dest;
4618       loop->latch = exit->src;
4619     }
4620
4621   /* Redirect the entry and add the phi node arguments.  */
4622   redirected = redirect_edge_and_branch (entry, entry->dest->rbi->copy);
4623   gcc_assert (redirected != NULL);
4624   for (phi = phi_nodes (entry->dest), var = PENDING_STMT (entry);
4625        phi;
4626        phi = TREE_CHAIN (phi), var = TREE_CHAIN (var))
4627     add_phi_arg (&phi, TREE_VALUE (var), entry);
4628   PENDING_STMT (entry) = NULL;
4629
4630   /* Concerning updating of dominators:  We must recount dominators
4631      for entry block and its copy.  Anything that is outside of the region, but
4632      was dominated by something inside needs recounting as well.  */
4633   set_immediate_dominator (CDI_DOMINATORS, entry->dest, entry->src);
4634   doms[n_doms++] = entry->dest->rbi->original;
4635   iterate_fix_dominators (CDI_DOMINATORS, doms, n_doms);
4636   free (doms);
4637
4638   /* Add the other phi node arguments.  */
4639   add_phi_args_after_copy (region_copy, n_region);
4640
4641   /* Add phi nodes for definitions at exit.  TODO -- once we have immediate
4642      uses, it should be possible to emit phi nodes just for definitions that
4643      are used outside region.  */
4644   EXECUTE_IF_SET_IN_BITMAP (definitions, 0, ver, bi)
4645     {
4646       tree name = ssa_name (ver);
4647
4648       phi = create_phi_node (name, exit->dest);
4649       add_phi_arg (&phi, name, exit);
4650       add_phi_arg (&phi, name, exit_copy);
4651
4652       SSA_NAME_DEF_STMT (name) = phi;
4653     }
4654
4655   /* And create new definitions inside region and its copy.  TODO -- once we
4656      have immediate uses, it might be better to leave definitions in region
4657      unchanged, create new ssa names for phi nodes on exit, and rewrite
4658      the uses, to avoid changing the copied region.  */
4659   allocate_ssa_names (definitions, &ssa_name_map);
4660   rewrite_to_new_ssa_names (region, n_region, ssa_name_map);
4661   allocate_ssa_names (definitions, &ssa_name_map);
4662   rewrite_to_new_ssa_names (region_copy, n_region, ssa_name_map);
4663   htab_delete (ssa_name_map);
4664
4665   if (free_region_copy)
4666     free (region_copy);
4667
4668   unmark_all_for_rewrite ();
4669   BITMAP_XFREE (definitions);
4670
4671   return true;
4672 }
4673
4674 /* Dump FUNCTION_DECL FN to file FILE using FLAGS (see TDF_* in tree.h)  */
4675
4676 void
4677 dump_function_to_file (tree fn, FILE *file, int flags)
4678 {
4679   tree arg, vars, var;
4680   bool ignore_topmost_bind = false, any_var = false;
4681   basic_block bb;
4682   tree chain;
4683
4684   fprintf (file, "%s (", lang_hooks.decl_printable_name (fn, 2));
4685
4686   arg = DECL_ARGUMENTS (fn);
4687   while (arg)
4688     {
4689       print_generic_expr (file, arg, dump_flags);
4690       if (TREE_CHAIN (arg))
4691         fprintf (file, ", ");
4692       arg = TREE_CHAIN (arg);
4693     }
4694   fprintf (file, ")\n");
4695
4696   if (flags & TDF_RAW)
4697     {
4698       dump_node (fn, TDF_SLIM | flags, file);
4699       return;
4700     }
4701
4702   /* When GIMPLE is lowered, the variables are no longer available in
4703      BIND_EXPRs, so display them separately.  */
4704   if (cfun && cfun->unexpanded_var_list)
4705     {
4706       ignore_topmost_bind = true;
4707
4708       fprintf (file, "{\n");
4709       for (vars = cfun->unexpanded_var_list; vars; vars = TREE_CHAIN (vars))
4710         {
4711           var = TREE_VALUE (vars);
4712
4713           print_generic_decl (file, var, flags);
4714           fprintf (file, "\n");
4715
4716           any_var = true;
4717         }
4718     }
4719
4720   if (basic_block_info)
4721     {
4722       /* Make a CFG based dump.  */
4723       check_bb_profile (ENTRY_BLOCK_PTR, file);
4724       if (!ignore_topmost_bind)
4725         fprintf (file, "{\n");
4726
4727       if (any_var && n_basic_blocks)
4728         fprintf (file, "\n");
4729
4730       FOR_EACH_BB (bb)
4731         dump_generic_bb (file, bb, 2, flags);
4732         
4733       fprintf (file, "}\n");
4734       check_bb_profile (EXIT_BLOCK_PTR, file);
4735     }
4736   else
4737     {
4738       int indent;
4739
4740       /* Make a tree based dump.  */
4741       chain = DECL_SAVED_TREE (fn);
4742
4743       if (TREE_CODE (chain) == BIND_EXPR)
4744         {
4745           if (ignore_topmost_bind)
4746             {
4747               chain = BIND_EXPR_BODY (chain);
4748               indent = 2;
4749             }
4750           else
4751             indent = 0;
4752         }
4753       else
4754         {
4755           if (!ignore_topmost_bind)
4756             fprintf (file, "{\n");
4757           indent = 2;
4758         }
4759
4760       if (any_var)
4761         fprintf (file, "\n");
4762
4763       print_generic_stmt_indented (file, chain, flags, indent);
4764       if (ignore_topmost_bind)
4765         fprintf (file, "}\n");
4766     }
4767
4768   fprintf (file, "\n\n");
4769 }
4770
4771
4772 /* Pretty print of the loops intermediate representation.  */
4773 static void print_loop (FILE *, struct loop *, int);
4774 static void print_pred_bbs (FILE *, edge);
4775 static void print_succ_bbs (FILE *, edge);
4776
4777
4778 /* Print the predecessors indexes of edge E on FILE.  */
4779
4780 static void
4781 print_pred_bbs (FILE *file, edge e)
4782 {
4783   if (e == NULL)
4784     return;
4785   
4786   else if (e->pred_next == NULL)
4787     fprintf (file, "bb_%d", e->src->index);
4788   
4789   else
4790     {
4791       fprintf (file, "bb_%d, ", e->src->index);
4792       print_pred_bbs (file, e->pred_next);
4793     }
4794 }
4795
4796
4797 /* Print the successors indexes of edge E on FILE.  */
4798
4799 static void
4800 print_succ_bbs (FILE *file, edge e)
4801 {
4802   if (e == NULL)
4803     return;
4804   else if (e->succ_next == NULL)
4805     fprintf (file, "bb_%d", e->dest->index);
4806   else
4807     {
4808       fprintf (file, "bb_%d, ", e->dest->index);
4809       print_succ_bbs (file, e->succ_next);
4810     }
4811 }
4812
4813
4814 /* Pretty print LOOP on FILE, indented INDENT spaces.  */
4815
4816 static void
4817 print_loop (FILE *file, struct loop *loop, int indent)
4818 {
4819   char *s_indent;
4820   basic_block bb;
4821   
4822   if (loop == NULL)
4823     return;
4824
4825   s_indent = (char *) alloca ((size_t) indent + 1);
4826   memset ((void *) s_indent, ' ', (size_t) indent);
4827   s_indent[indent] = '\0';
4828
4829   /* Print the loop's header.  */
4830   fprintf (file, "%sloop_%d\n", s_indent, loop->num);
4831   
4832   /* Print the loop's body.  */
4833   fprintf (file, "%s{\n", s_indent);
4834   FOR_EACH_BB (bb)
4835     if (bb->loop_father == loop)
4836       {
4837         /* Print the basic_block's header.  */
4838         fprintf (file, "%s  bb_%d (preds = {", s_indent, bb->index);
4839         print_pred_bbs (file, bb->pred);
4840         fprintf (file, "}, succs = {");
4841         print_succ_bbs (file, bb->succ);
4842         fprintf (file, "})\n");
4843         
4844         /* Print the basic_block's body.  */
4845         fprintf (file, "%s  {\n", s_indent);
4846         tree_dump_bb (bb, file, indent + 4);
4847         fprintf (file, "%s  }\n", s_indent);
4848       }
4849   
4850   print_loop (file, loop->inner, indent + 2);
4851   fprintf (file, "%s}\n", s_indent);
4852   print_loop (file, loop->next, indent);
4853 }
4854
4855
4856 /* Follow a CFG edge from the entry point of the program, and on entry
4857    of a loop, pretty print the loop structure on FILE.  */
4858
4859 void 
4860 print_loop_ir (FILE *file)
4861 {
4862   basic_block bb;
4863   
4864   bb = BASIC_BLOCK (0);
4865   if (bb && bb->loop_father)
4866     print_loop (file, bb->loop_father, 0);
4867 }
4868
4869
4870 /* Debugging loops structure at tree level.  */
4871
4872 void 
4873 debug_loop_ir (void)
4874 {
4875   print_loop_ir (stderr);
4876 }
4877
4878
4879 /* Return true if BB ends with a call, possibly followed by some
4880    instructions that must stay with the call.  Return false,
4881    otherwise.  */
4882
4883 static bool
4884 tree_block_ends_with_call_p (basic_block bb)
4885 {
4886   block_stmt_iterator bsi = bsi_last (bb);
4887   return get_call_expr_in (bsi_stmt (bsi)) != NULL;
4888 }
4889
4890
4891 /* Return true if BB ends with a conditional branch.  Return false,
4892    otherwise.  */
4893
4894 static bool
4895 tree_block_ends_with_condjump_p (basic_block bb)
4896 {
4897   tree stmt = tsi_stmt (bsi_last (bb).tsi);
4898   return (TREE_CODE (stmt) == COND_EXPR);
4899 }
4900
4901
4902 /* Return true if we need to add fake edge to exit at statement T.
4903    Helper function for tree_flow_call_edges_add.  */
4904
4905 static bool
4906 need_fake_edge_p (tree t)
4907 {
4908   tree call;
4909
4910   /* NORETURN and LONGJMP calls already have an edge to exit.
4911      CONST, PURE and ALWAYS_RETURN calls do not need one.
4912      We don't currently check for CONST and PURE here, although
4913      it would be a good idea, because those attributes are
4914      figured out from the RTL in mark_constant_function, and
4915      the counter incrementation code from -fprofile-arcs
4916      leads to different results from -fbranch-probabilities.  */
4917   call = get_call_expr_in (t);
4918   if (call
4919       && !(call_expr_flags (call) & 
4920            (ECF_NORETURN | ECF_LONGJMP | ECF_ALWAYS_RETURN)))
4921     return true;
4922
4923   if (TREE_CODE (t) == ASM_EXPR
4924        && (ASM_VOLATILE_P (t) || ASM_INPUT_P (t)))
4925     return true;
4926
4927   return false;
4928 }
4929
4930
4931 /* Add fake edges to the function exit for any non constant and non
4932    noreturn calls, volatile inline assembly in the bitmap of blocks
4933    specified by BLOCKS or to the whole CFG if BLOCKS is zero.  Return
4934    the number of blocks that were split.
4935
4936    The goal is to expose cases in which entering a basic block does
4937    not imply that all subsequent instructions must be executed.  */
4938
4939 static int
4940 tree_flow_call_edges_add (sbitmap blocks)
4941 {
4942   int i;
4943   int blocks_split = 0;
4944   int last_bb = last_basic_block;
4945   bool check_last_block = false;
4946
4947   if (n_basic_blocks == 0)
4948     return 0;
4949
4950   if (! blocks)
4951     check_last_block = true;
4952   else
4953     check_last_block = TEST_BIT (blocks, EXIT_BLOCK_PTR->prev_bb->index);
4954
4955   /* In the last basic block, before epilogue generation, there will be
4956      a fallthru edge to EXIT.  Special care is required if the last insn
4957      of the last basic block is a call because make_edge folds duplicate
4958      edges, which would result in the fallthru edge also being marked
4959      fake, which would result in the fallthru edge being removed by
4960      remove_fake_edges, which would result in an invalid CFG.
4961
4962      Moreover, we can't elide the outgoing fake edge, since the block
4963      profiler needs to take this into account in order to solve the minimal
4964      spanning tree in the case that the call doesn't return.
4965
4966      Handle this by adding a dummy instruction in a new last basic block.  */
4967   if (check_last_block)
4968     {
4969       basic_block bb = EXIT_BLOCK_PTR->prev_bb;
4970       block_stmt_iterator bsi = bsi_last (bb);
4971       tree t = NULL_TREE;
4972       if (!bsi_end_p (bsi))
4973         t = bsi_stmt (bsi);
4974
4975       if (need_fake_edge_p (t))
4976         {
4977           edge e;
4978
4979           for (e = bb->succ; e; e = e->succ_next)
4980             if (e->dest == EXIT_BLOCK_PTR)
4981               {
4982                 bsi_insert_on_edge (e, build_empty_stmt ());
4983                 bsi_commit_edge_inserts ((int *)NULL);
4984                 break;
4985               }
4986         }
4987     }
4988
4989   /* Now add fake edges to the function exit for any non constant
4990      calls since there is no way that we can determine if they will
4991      return or not...  */
4992   for (i = 0; i < last_bb; i++)
4993     {
4994       basic_block bb = BASIC_BLOCK (i);
4995       block_stmt_iterator bsi;
4996       tree stmt, last_stmt;
4997
4998       if (!bb)
4999         continue;
5000
5001       if (blocks && !TEST_BIT (blocks, i))
5002         continue;
5003
5004       bsi = bsi_last (bb);
5005       if (!bsi_end_p (bsi))
5006         {
5007           last_stmt = bsi_stmt (bsi);
5008           do
5009             {
5010               stmt = bsi_stmt (bsi);
5011               if (need_fake_edge_p (stmt))
5012                 {
5013                   edge e;
5014                   /* The handling above of the final block before the
5015                      epilogue should be enough to verify that there is
5016                      no edge to the exit block in CFG already.
5017                      Calling make_edge in such case would cause us to
5018                      mark that edge as fake and remove it later.  */
5019 #ifdef ENABLE_CHECKING
5020                   if (stmt == last_stmt)
5021                     for (e = bb->succ; e; e = e->succ_next)
5022                       gcc_assert (e->dest != EXIT_BLOCK_PTR);
5023 #endif
5024
5025                   /* Note that the following may create a new basic block
5026                      and renumber the existing basic blocks.  */
5027                   if (stmt != last_stmt)
5028                     {
5029                       e = split_block (bb, stmt);
5030                       if (e)
5031                         blocks_split++;
5032                     }
5033                   make_edge (bb, EXIT_BLOCK_PTR, EDGE_FAKE);
5034                 }
5035               bsi_prev (&bsi);
5036             }
5037           while (!bsi_end_p (bsi));
5038         }
5039     }
5040
5041   if (blocks_split)
5042     verify_flow_info ();
5043
5044   return blocks_split;
5045 }
5046
5047 bool
5048 tree_purge_dead_eh_edges (basic_block bb)
5049 {
5050   bool changed = false;
5051   edge e, next;
5052   tree stmt = last_stmt (bb);
5053
5054   if (stmt && tree_can_throw_internal (stmt))
5055     return false;
5056
5057   for (e = bb->succ; e ; e = next)
5058     {
5059       next = e->succ_next;
5060       if (e->flags & EDGE_EH)
5061         {
5062           ssa_remove_edge (e);
5063           changed = true;
5064         }
5065     }
5066
5067   return changed;
5068 }
5069
5070 bool
5071 tree_purge_all_dead_eh_edges (bitmap blocks)
5072 {
5073   bool changed = false;
5074   size_t i;
5075   bitmap_iterator bi;
5076
5077   EXECUTE_IF_SET_IN_BITMAP (blocks, 0, i, bi)
5078     {
5079       changed |= tree_purge_dead_eh_edges (BASIC_BLOCK (i));
5080     }
5081
5082   return changed;
5083 }
5084
5085 struct cfg_hooks tree_cfg_hooks = {
5086   "tree",
5087   tree_verify_flow_info,
5088   tree_dump_bb,                 /* dump_bb  */
5089   create_bb,                    /* create_basic_block  */
5090   tree_redirect_edge_and_branch,/* redirect_edge_and_branch  */
5091   tree_redirect_edge_and_branch_force,/* redirect_edge_and_branch_force  */
5092   remove_bb,                    /* delete_basic_block  */
5093   tree_split_block,             /* split_block  */
5094   tree_move_block_after,        /* move_block_after  */
5095   tree_can_merge_blocks_p,      /* can_merge_blocks_p  */
5096   tree_merge_blocks,            /* merge_blocks  */
5097   tree_predict_edge,            /* predict_edge  */
5098   tree_predicted_by_p,          /* predicted_by_p  */
5099   tree_can_duplicate_bb_p,      /* can_duplicate_block_p  */
5100   tree_duplicate_bb,            /* duplicate_block  */
5101   tree_split_edge,              /* split_edge  */
5102   tree_make_forwarder_block,    /* make_forward_block  */
5103   NULL,                         /* tidy_fallthru_edge  */
5104   tree_block_ends_with_call_p,  /* block_ends_with_call_p */
5105   tree_block_ends_with_condjump_p, /* block_ends_with_condjump_p */
5106   tree_flow_call_edges_add      /* flow_call_edges_add */
5107 };
5108
5109
5110 /* Split all critical edges.  */
5111
5112 static void
5113 split_critical_edges (void)
5114 {
5115   basic_block bb;
5116   edge e;
5117
5118   FOR_ALL_BB (bb)
5119     {
5120       for (e = bb->succ; e ; e = e->succ_next)
5121         if (EDGE_CRITICAL_P (e) && !(e->flags & EDGE_ABNORMAL))
5122           {
5123             split_edge (e);
5124           }
5125     }
5126 }
5127
5128 struct tree_opt_pass pass_split_crit_edges = 
5129 {
5130   "crited",                          /* name */
5131   NULL,                          /* gate */
5132   split_critical_edges,          /* execute */
5133   NULL,                          /* sub */
5134   NULL,                          /* next */
5135   0,                             /* static_pass_number */
5136   TV_TREE_SPLIT_EDGES,           /* tv_id */
5137   PROP_cfg,                      /* properties required */
5138   PROP_no_crit_edges,            /* properties_provided */
5139   0,                             /* properties_destroyed */
5140   0,                             /* todo_flags_start */
5141   TODO_dump_func,                /* todo_flags_finish */
5142   0                              /* letter */
5143 };
5144
5145 \f
5146 /* Return EXP if it is a valid GIMPLE rvalue, else gimplify it into
5147    a temporary, make sure and register it to be renamed if necessary,
5148    and finally return the temporary.  Put the statements to compute
5149    EXP before the current statement in BSI.  */
5150
5151 tree
5152 gimplify_val (block_stmt_iterator *bsi, tree type, tree exp)
5153 {
5154   tree t, new_stmt, orig_stmt;
5155
5156   if (is_gimple_val (exp))
5157     return exp;
5158
5159   t = make_rename_temp (type, NULL);
5160   new_stmt = build (MODIFY_EXPR, type, t, exp);
5161
5162   orig_stmt = bsi_stmt (*bsi);
5163   SET_EXPR_LOCUS (new_stmt, EXPR_LOCUS (orig_stmt));
5164   TREE_BLOCK (new_stmt) = TREE_BLOCK (orig_stmt);
5165
5166   bsi_insert_before (bsi, new_stmt, BSI_SAME_STMT);
5167
5168   return t;
5169 }
5170
5171 /* Build a ternary operation and gimplify it.  Emit code before BSI.
5172    Return the gimple_val holding the result.  */
5173
5174 tree
5175 gimplify_build3 (block_stmt_iterator *bsi, enum tree_code code,
5176                  tree type, tree a, tree b, tree c)
5177 {
5178   tree ret;
5179
5180   ret = fold (build3 (code, type, a, b, c));
5181   STRIP_NOPS (ret);
5182
5183   return gimplify_val (bsi, type, ret);
5184 }
5185
5186 /* Build a binary operation and gimplify it.  Emit code before BSI.
5187    Return the gimple_val holding the result.  */
5188
5189 tree
5190 gimplify_build2 (block_stmt_iterator *bsi, enum tree_code code,
5191                  tree type, tree a, tree b)
5192 {
5193   tree ret;
5194
5195   ret = fold (build2 (code, type, a, b));
5196   STRIP_NOPS (ret);
5197
5198   return gimplify_val (bsi, type, ret);
5199 }
5200
5201 /* Build a unary operation and gimplify it.  Emit code before BSI.
5202    Return the gimple_val holding the result.  */
5203
5204 tree
5205 gimplify_build1 (block_stmt_iterator *bsi, enum tree_code code, tree type,
5206                  tree a)
5207 {
5208   tree ret;
5209
5210   ret = fold (build1 (code, type, a));
5211   STRIP_NOPS (ret);
5212
5213   return gimplify_val (bsi, type, ret);
5214 }
5215
5216
5217 \f
5218 /* Emit return warnings.  */
5219
5220 static void
5221 execute_warn_function_return (void)
5222 {
5223 #ifdef USE_MAPPED_LOCATION
5224   source_location location;
5225 #else
5226   location_t *locus;
5227 #endif
5228   tree last;
5229   edge e;
5230
5231   if (warn_missing_noreturn
5232       && !TREE_THIS_VOLATILE (cfun->decl)
5233       && EXIT_BLOCK_PTR->pred == NULL
5234       && !lang_hooks.function.missing_noreturn_ok_p (cfun->decl))
5235     warning ("%Jfunction might be possible candidate for "
5236              "attribute %<noreturn%>",
5237              cfun->decl);
5238
5239   /* If we have a path to EXIT, then we do return.  */
5240   if (TREE_THIS_VOLATILE (cfun->decl)
5241       && EXIT_BLOCK_PTR->pred != NULL)
5242     {
5243 #ifdef USE_MAPPED_LOCATION
5244       location = UNKNOWN_LOCATION;
5245 #else
5246       locus = NULL;
5247 #endif
5248       for (e = EXIT_BLOCK_PTR->pred; e ; e = e->pred_next)
5249         {
5250           last = last_stmt (e->src);
5251           if (TREE_CODE (last) == RETURN_EXPR
5252 #ifdef USE_MAPPED_LOCATION
5253               && (location = EXPR_LOCATION (last)) != UNKNOWN_LOCATION)
5254 #else
5255               && (locus = EXPR_LOCUS (last)) != NULL)
5256 #endif
5257             break;
5258         }
5259 #ifdef USE_MAPPED_LOCATION
5260       if (location == UNKNOWN_LOCATION)
5261         location = cfun->function_end_locus;
5262       warning ("%H%<noreturn%> function does return", &location);
5263 #else
5264       if (!locus)
5265         locus = &cfun->function_end_locus;
5266       warning ("%H%<noreturn%> function does return", locus);
5267 #endif
5268     }
5269
5270   /* If we see "return;" in some basic block, then we do reach the end
5271      without returning a value.  */
5272   else if (warn_return_type
5273            && EXIT_BLOCK_PTR->pred != NULL
5274            && !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (cfun->decl))))
5275     {
5276       for (e = EXIT_BLOCK_PTR->pred; e ; e = e->pred_next)
5277         {
5278           tree last = last_stmt (e->src);
5279           if (TREE_CODE (last) == RETURN_EXPR
5280               && TREE_OPERAND (last, 0) == NULL)
5281             {
5282 #ifdef USE_MAPPED_LOCATION
5283               location = EXPR_LOCATION (last);
5284               if (location == UNKNOWN_LOCATION)
5285                   location = cfun->function_end_locus;
5286               warning ("%Hcontrol reaches end of non-void function", &location);
5287 #else
5288               locus = EXPR_LOCUS (last);
5289               if (!locus)
5290                 locus = &cfun->function_end_locus;
5291               warning ("%Hcontrol reaches end of non-void function", locus);
5292 #endif
5293               break;
5294             }
5295         }
5296     }
5297 }
5298
5299
5300 /* Given a basic block B which ends with a conditional and has
5301    precisely two successors, determine which of the edges is taken if
5302    the conditional is true and which is taken if the conditional is
5303    false.  Set TRUE_EDGE and FALSE_EDGE appropriately.  */
5304
5305 void
5306 extract_true_false_edges_from_block (basic_block b,
5307                                      edge *true_edge,
5308                                      edge *false_edge)
5309 {
5310   edge e = b->succ;
5311
5312   if (e->flags & EDGE_TRUE_VALUE)
5313     {
5314       *true_edge = e;
5315       *false_edge = e->succ_next;
5316     }
5317   else
5318     {
5319       *false_edge = e;
5320       *true_edge = e->succ_next;
5321     }
5322 }
5323
5324 struct tree_opt_pass pass_warn_function_return =
5325 {
5326   NULL,                                 /* name */
5327   NULL,                                 /* gate */
5328   execute_warn_function_return,         /* execute */
5329   NULL,                                 /* sub */
5330   NULL,                                 /* next */
5331   0,                                    /* static_pass_number */
5332   0,                                    /* tv_id */
5333   PROP_cfg,                             /* properties_required */
5334   0,                                    /* properties_provided */
5335   0,                                    /* properties_destroyed */
5336   0,                                    /* todo_flags_start */
5337   0,                                    /* todo_flags_finish */
5338   0                                     /* letter */
5339 };
5340
5341 #include "gt-tree-cfg.h"