OSDN Git Service

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