OSDN Git Service

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