OSDN Git Service

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