OSDN Git Service

PR tree-optimize/22348
[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_2 = "%-30s%13ld%11lu%c\n";
2244   const char * const fmt_str_3 = "%-43s%11lu%c\n";
2245   const char *funcname
2246     = lang_hooks.decl_printable_name (current_function_decl, 2);
2247
2248
2249   fprintf (file, "\nCFG Statistics for %s\n\n", funcname);
2250
2251   fprintf (file, "---------------------------------------------------------\n");
2252   fprintf (file, fmt_str, "", "  Number of  ", "Memory");
2253   fprintf (file, fmt_str, "", "  instances  ", "used ");
2254   fprintf (file, "---------------------------------------------------------\n");
2255
2256   size = n_basic_blocks * sizeof (struct basic_block_def);
2257   total += size;
2258   fprintf (file, fmt_str_1, "Basic blocks", n_basic_blocks,
2259            SCALE (size), LABEL (size));
2260
2261   num_edges = 0;
2262   FOR_EACH_BB (bb)
2263     num_edges += EDGE_COUNT (bb->succs);
2264   size = num_edges * sizeof (struct edge_def);
2265   total += size;
2266   fprintf (file, fmt_str_2, "Edges", num_edges, SCALE (size), LABEL (size));
2267
2268   fprintf (file, "---------------------------------------------------------\n");
2269   fprintf (file, fmt_str_3, "Total memory used by CFG data", SCALE (total),
2270            LABEL (total));
2271   fprintf (file, "---------------------------------------------------------\n");
2272   fprintf (file, "\n");
2273
2274   if (cfg_stats.num_merged_labels > max_num_merged_labels)
2275     max_num_merged_labels = cfg_stats.num_merged_labels;
2276
2277   fprintf (file, "Coalesced label blocks: %ld (Max so far: %ld)\n",
2278            cfg_stats.num_merged_labels, max_num_merged_labels);
2279
2280   fprintf (file, "\n");
2281 }
2282
2283
2284 /* Dump CFG statistics on stderr.  Keep extern so that it's always
2285    linked in the final executable.  */
2286
2287 void
2288 debug_cfg_stats (void)
2289 {
2290   dump_cfg_stats (stderr);
2291 }
2292
2293
2294 /* Dump the flowgraph to a .vcg FILE.  */
2295
2296 static void
2297 tree_cfg2vcg (FILE *file)
2298 {
2299   edge e;
2300   edge_iterator ei;
2301   basic_block bb;
2302   const char *funcname
2303     = lang_hooks.decl_printable_name (current_function_decl, 2);
2304
2305   /* Write the file header.  */
2306   fprintf (file, "graph: { title: \"%s\"\n", funcname);
2307   fprintf (file, "node: { title: \"ENTRY\" label: \"ENTRY\" }\n");
2308   fprintf (file, "node: { title: \"EXIT\" label: \"EXIT\" }\n");
2309
2310   /* Write blocks and edges.  */
2311   FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
2312     {
2313       fprintf (file, "edge: { sourcename: \"ENTRY\" targetname: \"%d\"",
2314                e->dest->index);
2315
2316       if (e->flags & EDGE_FAKE)
2317         fprintf (file, " linestyle: dotted priority: 10");
2318       else
2319         fprintf (file, " linestyle: solid priority: 100");
2320
2321       fprintf (file, " }\n");
2322     }
2323   fputc ('\n', file);
2324
2325   FOR_EACH_BB (bb)
2326     {
2327       enum tree_code head_code, end_code;
2328       const char *head_name, *end_name;
2329       int head_line = 0;
2330       int end_line = 0;
2331       tree first = first_stmt (bb);
2332       tree last = last_stmt (bb);
2333
2334       if (first)
2335         {
2336           head_code = TREE_CODE (first);
2337           head_name = tree_code_name[head_code];
2338           head_line = get_lineno (first);
2339         }
2340       else
2341         head_name = "no-statement";
2342
2343       if (last)
2344         {
2345           end_code = TREE_CODE (last);
2346           end_name = tree_code_name[end_code];
2347           end_line = get_lineno (last);
2348         }
2349       else
2350         end_name = "no-statement";
2351
2352       fprintf (file, "node: { title: \"%d\" label: \"#%d\\n%s (%d)\\n%s (%d)\"}\n",
2353                bb->index, bb->index, head_name, head_line, end_name,
2354                end_line);
2355
2356       FOR_EACH_EDGE (e, ei, bb->succs)
2357         {
2358           if (e->dest == EXIT_BLOCK_PTR)
2359             fprintf (file, "edge: { sourcename: \"%d\" targetname: \"EXIT\"", bb->index);
2360           else
2361             fprintf (file, "edge: { sourcename: \"%d\" targetname: \"%d\"", bb->index, e->dest->index);
2362
2363           if (e->flags & EDGE_FAKE)
2364             fprintf (file, " priority: 10 linestyle: dotted");
2365           else
2366             fprintf (file, " priority: 100 linestyle: solid");
2367
2368           fprintf (file, " }\n");
2369         }
2370
2371       if (bb->next_bb != EXIT_BLOCK_PTR)
2372         fputc ('\n', file);
2373     }
2374
2375   fputs ("}\n\n", file);
2376 }
2377
2378
2379
2380 /*---------------------------------------------------------------------------
2381                              Miscellaneous helpers
2382 ---------------------------------------------------------------------------*/
2383
2384 /* Return true if T represents a stmt that always transfers control.  */
2385
2386 bool
2387 is_ctrl_stmt (tree t)
2388 {
2389   return (TREE_CODE (t) == COND_EXPR
2390           || TREE_CODE (t) == SWITCH_EXPR
2391           || TREE_CODE (t) == GOTO_EXPR
2392           || TREE_CODE (t) == RETURN_EXPR
2393           || TREE_CODE (t) == RESX_EXPR);
2394 }
2395
2396
2397 /* Return true if T is a statement that may alter the flow of control
2398    (e.g., a call to a non-returning function).  */
2399
2400 bool
2401 is_ctrl_altering_stmt (tree t)
2402 {
2403   tree call;
2404
2405   gcc_assert (t);
2406   call = get_call_expr_in (t);
2407   if (call)
2408     {
2409       /* A non-pure/const CALL_EXPR alters flow control if the current
2410          function has nonlocal labels.  */
2411       if (TREE_SIDE_EFFECTS (call) && current_function_has_nonlocal_label)
2412         return true;
2413
2414       /* A CALL_EXPR also alters control flow if it does not return.  */
2415       if (call_expr_flags (call) & ECF_NORETURN)
2416         return true;
2417     }
2418
2419   /* If a statement can throw, it alters control flow.  */
2420   return tree_can_throw_internal (t);
2421 }
2422
2423
2424 /* Return true if T is a computed goto.  */
2425
2426 bool
2427 computed_goto_p (tree t)
2428 {
2429   return (TREE_CODE (t) == GOTO_EXPR
2430           && TREE_CODE (GOTO_DESTINATION (t)) != LABEL_DECL);
2431 }
2432
2433
2434 /* Checks whether EXPR is a simple local goto.  */
2435
2436 bool
2437 simple_goto_p (tree expr)
2438 {
2439   return (TREE_CODE (expr) == GOTO_EXPR
2440           && TREE_CODE (GOTO_DESTINATION (expr)) == LABEL_DECL);
2441 }
2442
2443
2444 /* Return true if T should start a new basic block.  PREV_T is the
2445    statement preceding T.  It is used when T is a label or a case label.
2446    Labels should only start a new basic block if their previous statement
2447    wasn't a label.  Otherwise, sequence of labels would generate
2448    unnecessary basic blocks that only contain a single label.  */
2449
2450 static inline bool
2451 stmt_starts_bb_p (tree t, tree prev_t)
2452 {
2453   if (t == NULL_TREE)
2454     return false;
2455
2456   /* LABEL_EXPRs start a new basic block only if the preceding
2457      statement wasn't a label of the same type.  This prevents the
2458      creation of consecutive blocks that have nothing but a single
2459      label.  */
2460   if (TREE_CODE (t) == LABEL_EXPR)
2461     {
2462       /* Nonlocal and computed GOTO targets always start a new block.  */
2463       if (DECL_NONLOCAL (LABEL_EXPR_LABEL (t))
2464           || FORCED_LABEL (LABEL_EXPR_LABEL (t)))
2465         return true;
2466
2467       if (prev_t && TREE_CODE (prev_t) == LABEL_EXPR)
2468         {
2469           if (DECL_NONLOCAL (LABEL_EXPR_LABEL (prev_t)))
2470             return true;
2471
2472           cfg_stats.num_merged_labels++;
2473           return false;
2474         }
2475       else
2476         return true;
2477     }
2478
2479   return false;
2480 }
2481
2482
2483 /* Return true if T should end a basic block.  */
2484
2485 bool
2486 stmt_ends_bb_p (tree t)
2487 {
2488   return is_ctrl_stmt (t) || is_ctrl_altering_stmt (t);
2489 }
2490
2491
2492 /* Add gotos that used to be represented implicitly in the CFG.  */
2493
2494 void
2495 disband_implicit_edges (void)
2496 {
2497   basic_block bb;
2498   block_stmt_iterator last;
2499   edge e;
2500   edge_iterator ei;
2501   tree stmt, label;
2502
2503   FOR_EACH_BB (bb)
2504     {
2505       last = bsi_last (bb);
2506       stmt = last_stmt (bb);
2507
2508       if (stmt && TREE_CODE (stmt) == COND_EXPR)
2509         {
2510           /* Remove superfluous gotos from COND_EXPR branches.  Moved
2511              from cfg_remove_useless_stmts here since it violates the
2512              invariants for tree--cfg correspondence and thus fits better
2513              here where we do it anyway.  */
2514           e = find_edge (bb, bb->next_bb);
2515           if (e)
2516             {
2517               if (e->flags & EDGE_TRUE_VALUE)
2518                 COND_EXPR_THEN (stmt) = build_empty_stmt ();
2519               else if (e->flags & EDGE_FALSE_VALUE)
2520                 COND_EXPR_ELSE (stmt) = build_empty_stmt ();
2521               else
2522                 gcc_unreachable ();
2523               e->flags |= EDGE_FALLTHRU;
2524             }
2525
2526           continue;
2527         }
2528
2529       if (stmt && TREE_CODE (stmt) == RETURN_EXPR)
2530         {
2531           /* Remove the RETURN_EXPR if we may fall though to the exit
2532              instead.  */
2533           gcc_assert (single_succ_p (bb));
2534           gcc_assert (single_succ (bb) == EXIT_BLOCK_PTR);
2535
2536           if (bb->next_bb == EXIT_BLOCK_PTR
2537               && !TREE_OPERAND (stmt, 0))
2538             {
2539               bsi_remove (&last);
2540               single_succ_edge (bb)->flags |= EDGE_FALLTHRU;
2541             }
2542           continue;
2543         }
2544
2545       /* There can be no fallthru edge if the last statement is a control
2546          one.  */
2547       if (stmt && is_ctrl_stmt (stmt))
2548         continue;
2549
2550       /* Find a fallthru edge and emit the goto if necessary.  */
2551       FOR_EACH_EDGE (e, ei, bb->succs)
2552         if (e->flags & EDGE_FALLTHRU)
2553           break;
2554
2555       if (!e || e->dest == bb->next_bb)
2556         continue;
2557
2558       gcc_assert (e->dest != EXIT_BLOCK_PTR);
2559       label = tree_block_label (e->dest);
2560
2561       stmt = build1 (GOTO_EXPR, void_type_node, label);
2562 #ifdef USE_MAPPED_LOCATION
2563       SET_EXPR_LOCATION (stmt, e->goto_locus);
2564 #else
2565       SET_EXPR_LOCUS (stmt, e->goto_locus);
2566 #endif
2567       bsi_insert_after (&last, stmt, BSI_NEW_STMT);
2568       e->flags &= ~EDGE_FALLTHRU;
2569     }
2570 }
2571
2572 /* Remove block annotations and other datastructures.  */
2573
2574 void
2575 delete_tree_cfg_annotations (void)
2576 {
2577   label_to_block_map = NULL;
2578 }
2579
2580
2581 /* Return the first statement in basic block BB.  */
2582
2583 tree
2584 first_stmt (basic_block bb)
2585 {
2586   block_stmt_iterator i = bsi_start (bb);
2587   return !bsi_end_p (i) ? bsi_stmt (i) : NULL_TREE;
2588 }
2589
2590
2591 /* Return the last statement in basic block BB.  */
2592
2593 tree
2594 last_stmt (basic_block bb)
2595 {
2596   block_stmt_iterator b = bsi_last (bb);
2597   return !bsi_end_p (b) ? bsi_stmt (b) : NULL_TREE;
2598 }
2599
2600
2601 /* Return a pointer to the last statement in block BB.  */
2602
2603 tree *
2604 last_stmt_ptr (basic_block bb)
2605 {
2606   block_stmt_iterator last = bsi_last (bb);
2607   return !bsi_end_p (last) ? bsi_stmt_ptr (last) : NULL;
2608 }
2609
2610
2611 /* Return the last statement of an otherwise empty block.  Return NULL
2612    if the block is totally empty, or if it contains more than one
2613    statement.  */
2614
2615 tree
2616 last_and_only_stmt (basic_block bb)
2617 {
2618   block_stmt_iterator i = bsi_last (bb);
2619   tree last, prev;
2620
2621   if (bsi_end_p (i))
2622     return NULL_TREE;
2623
2624   last = bsi_stmt (i);
2625   bsi_prev (&i);
2626   if (bsi_end_p (i))
2627     return last;
2628
2629   /* Empty statements should no longer appear in the instruction stream.
2630      Everything that might have appeared before should be deleted by
2631      remove_useless_stmts, and the optimizers should just bsi_remove
2632      instead of smashing with build_empty_stmt.
2633
2634      Thus the only thing that should appear here in a block containing
2635      one executable statement is a label.  */
2636   prev = bsi_stmt (i);
2637   if (TREE_CODE (prev) == LABEL_EXPR)
2638     return last;
2639   else
2640     return NULL_TREE;
2641 }
2642
2643
2644 /* Mark BB as the basic block holding statement T.  */
2645
2646 void
2647 set_bb_for_stmt (tree t, basic_block bb)
2648 {
2649   if (TREE_CODE (t) == PHI_NODE)
2650     PHI_BB (t) = bb;
2651   else if (TREE_CODE (t) == STATEMENT_LIST)
2652     {
2653       tree_stmt_iterator i;
2654       for (i = tsi_start (t); !tsi_end_p (i); tsi_next (&i))
2655         set_bb_for_stmt (tsi_stmt (i), bb);
2656     }
2657   else
2658     {
2659       stmt_ann_t ann = get_stmt_ann (t);
2660       ann->bb = bb;
2661
2662       /* If the statement is a label, add the label to block-to-labels map
2663          so that we can speed up edge creation for GOTO_EXPRs.  */
2664       if (TREE_CODE (t) == LABEL_EXPR)
2665         {
2666           int uid;
2667
2668           t = LABEL_EXPR_LABEL (t);
2669           uid = LABEL_DECL_UID (t);
2670           if (uid == -1)
2671             {
2672               LABEL_DECL_UID (t) = uid = cfun->last_label_uid++;
2673               if (VARRAY_SIZE (label_to_block_map) <= (unsigned) uid)
2674                 VARRAY_GROW (label_to_block_map, 3 * uid / 2);
2675             }
2676           else
2677             /* We're moving an existing label.  Make sure that we've
2678                 removed it from the old block.  */
2679             gcc_assert (!bb || !VARRAY_BB (label_to_block_map, uid));
2680           VARRAY_BB (label_to_block_map, uid) = bb;
2681         }
2682     }
2683 }
2684
2685 /* Finds iterator for STMT.  */
2686
2687 extern block_stmt_iterator
2688 bsi_for_stmt (tree stmt)
2689 {
2690   block_stmt_iterator bsi;
2691
2692   for (bsi = bsi_start (bb_for_stmt (stmt)); !bsi_end_p (bsi); bsi_next (&bsi))
2693     if (bsi_stmt (bsi) == stmt)
2694       return bsi;
2695
2696   gcc_unreachable ();
2697 }
2698
2699 /* Mark statement T as modified, and update it.  */
2700 static inline void
2701 update_modified_stmts (tree t)
2702 {
2703   if (TREE_CODE (t) == STATEMENT_LIST)
2704     {
2705       tree_stmt_iterator i;
2706       tree stmt;
2707       for (i = tsi_start (t); !tsi_end_p (i); tsi_next (&i))
2708         {
2709           stmt = tsi_stmt (i);
2710           update_stmt_if_modified (stmt);
2711         }
2712     }
2713   else
2714     update_stmt_if_modified (t);
2715 }
2716
2717 /* Insert statement (or statement list) T before the statement
2718    pointed-to by iterator I.  M specifies how to update iterator I
2719    after insertion (see enum bsi_iterator_update).  */
2720
2721 void
2722 bsi_insert_before (block_stmt_iterator *i, tree t, enum bsi_iterator_update m)
2723 {
2724   set_bb_for_stmt (t, i->bb);
2725   update_modified_stmts (t);
2726   tsi_link_before (&i->tsi, t, m);
2727 }
2728
2729
2730 /* Insert statement (or statement list) T after the statement
2731    pointed-to by iterator I.  M specifies how to update iterator I
2732    after insertion (see enum bsi_iterator_update).  */
2733
2734 void
2735 bsi_insert_after (block_stmt_iterator *i, tree t, enum bsi_iterator_update m)
2736 {
2737   set_bb_for_stmt (t, i->bb);
2738   update_modified_stmts (t);
2739   tsi_link_after (&i->tsi, t, m);
2740 }
2741
2742
2743 /* Remove the statement pointed to by iterator I.  The iterator is updated
2744    to the next statement.  */
2745
2746 void
2747 bsi_remove (block_stmt_iterator *i)
2748 {
2749   tree t = bsi_stmt (*i);
2750   set_bb_for_stmt (t, NULL);
2751   delink_stmt_imm_use (t);
2752   tsi_delink (&i->tsi);
2753   mark_stmt_modified (t);
2754 }
2755
2756
2757 /* Move the statement at FROM so it comes right after the statement at TO.  */
2758
2759 void 
2760 bsi_move_after (block_stmt_iterator *from, block_stmt_iterator *to)
2761 {
2762   tree stmt = bsi_stmt (*from);
2763   bsi_remove (from);
2764   bsi_insert_after (to, stmt, BSI_SAME_STMT);
2765
2766
2767
2768 /* Move the statement at FROM so it comes right before the statement at TO.  */
2769
2770 void 
2771 bsi_move_before (block_stmt_iterator *from, block_stmt_iterator *to)
2772 {
2773   tree stmt = bsi_stmt (*from);
2774   bsi_remove (from);
2775   bsi_insert_before (to, stmt, BSI_SAME_STMT);
2776 }
2777
2778
2779 /* Move the statement at FROM to the end of basic block BB.  */
2780
2781 void
2782 bsi_move_to_bb_end (block_stmt_iterator *from, basic_block bb)
2783 {
2784   block_stmt_iterator last = bsi_last (bb);
2785   
2786   /* Have to check bsi_end_p because it could be an empty block.  */
2787   if (!bsi_end_p (last) && is_ctrl_stmt (bsi_stmt (last)))
2788     bsi_move_before (from, &last);
2789   else
2790     bsi_move_after (from, &last);
2791 }
2792
2793
2794 /* Replace the contents of the statement pointed to by iterator BSI
2795    with STMT.  If PRESERVE_EH_INFO is true, the exception handling
2796    information of the original statement is preserved.  */
2797
2798 void
2799 bsi_replace (const block_stmt_iterator *bsi, tree stmt, bool preserve_eh_info)
2800 {
2801   int eh_region;
2802   tree orig_stmt = bsi_stmt (*bsi);
2803
2804   SET_EXPR_LOCUS (stmt, EXPR_LOCUS (orig_stmt));
2805   set_bb_for_stmt (stmt, bsi->bb);
2806
2807   /* Preserve EH region information from the original statement, if
2808      requested by the caller.  */
2809   if (preserve_eh_info)
2810     {
2811       eh_region = lookup_stmt_eh_region (orig_stmt);
2812       if (eh_region >= 0)
2813         add_stmt_to_eh_region (stmt, eh_region);
2814     }
2815
2816   delink_stmt_imm_use (orig_stmt);
2817   *bsi_stmt_ptr (*bsi) = stmt;
2818   mark_stmt_modified (stmt);
2819   update_modified_stmts (stmt);
2820 }
2821
2822
2823 /* Insert the statement pointed-to by BSI into edge E.  Every attempt
2824    is made to place the statement in an existing basic block, but
2825    sometimes that isn't possible.  When it isn't possible, the edge is
2826    split and the statement is added to the new block.
2827
2828    In all cases, the returned *BSI points to the correct location.  The
2829    return value is true if insertion should be done after the location,
2830    or false if it should be done before the location.  If new basic block
2831    has to be created, it is stored in *NEW_BB.  */
2832
2833 static bool
2834 tree_find_edge_insert_loc (edge e, block_stmt_iterator *bsi,
2835                            basic_block *new_bb)
2836 {
2837   basic_block dest, src;
2838   tree tmp;
2839
2840   dest = e->dest;
2841  restart:
2842
2843   /* If the destination has one predecessor which has no PHI nodes,
2844      insert there.  Except for the exit block. 
2845
2846      The requirement for no PHI nodes could be relaxed.  Basically we
2847      would have to examine the PHIs to prove that none of them used
2848      the value set by the statement we want to insert on E.  That
2849      hardly seems worth the effort.  */
2850   if (single_pred_p (dest)
2851       && ! phi_nodes (dest)
2852       && dest != EXIT_BLOCK_PTR)
2853     {
2854       *bsi = bsi_start (dest);
2855       if (bsi_end_p (*bsi))
2856         return true;
2857
2858       /* Make sure we insert after any leading labels.  */
2859       tmp = bsi_stmt (*bsi);
2860       while (TREE_CODE (tmp) == LABEL_EXPR)
2861         {
2862           bsi_next (bsi);
2863           if (bsi_end_p (*bsi))
2864             break;
2865           tmp = bsi_stmt (*bsi);
2866         }
2867
2868       if (bsi_end_p (*bsi))
2869         {
2870           *bsi = bsi_last (dest);
2871           return true;
2872         }
2873       else
2874         return false;
2875     }
2876
2877   /* If the source has one successor, the edge is not abnormal and
2878      the last statement does not end a basic block, insert there.
2879      Except for the entry block.  */
2880   src = e->src;
2881   if ((e->flags & EDGE_ABNORMAL) == 0
2882       && single_succ_p (src)
2883       && src != ENTRY_BLOCK_PTR)
2884     {
2885       *bsi = bsi_last (src);
2886       if (bsi_end_p (*bsi))
2887         return true;
2888
2889       tmp = bsi_stmt (*bsi);
2890       if (!stmt_ends_bb_p (tmp))
2891         return true;
2892
2893       /* Insert code just before returning the value.  We may need to decompose
2894          the return in the case it contains non-trivial operand.  */
2895       if (TREE_CODE (tmp) == RETURN_EXPR)
2896         {
2897           tree op = TREE_OPERAND (tmp, 0);
2898           if (!is_gimple_val (op))
2899             {
2900               gcc_assert (TREE_CODE (op) == MODIFY_EXPR);
2901               bsi_insert_before (bsi, op, BSI_NEW_STMT);
2902               TREE_OPERAND (tmp, 0) = TREE_OPERAND (op, 0);
2903             }
2904           bsi_prev (bsi);
2905           return true;
2906         }
2907     }
2908
2909   /* Otherwise, create a new basic block, and split this edge.  */
2910   dest = split_edge (e);
2911   if (new_bb)
2912     *new_bb = dest;
2913   e = single_pred_edge (dest);
2914   goto restart;
2915 }
2916
2917
2918 /* This routine will commit all pending edge insertions, creating any new
2919    basic blocks which are necessary.  */
2920
2921 void
2922 bsi_commit_edge_inserts (void)
2923 {
2924   basic_block bb;
2925   edge e;
2926   edge_iterator ei;
2927
2928   bsi_commit_one_edge_insert (single_succ_edge (ENTRY_BLOCK_PTR), NULL);
2929
2930   FOR_EACH_BB (bb)
2931     FOR_EACH_EDGE (e, ei, bb->succs)
2932       bsi_commit_one_edge_insert (e, NULL);
2933 }
2934
2935
2936 /* Commit insertions pending at edge E. If a new block is created, set NEW_BB
2937    to this block, otherwise set it to NULL.  */
2938
2939 void
2940 bsi_commit_one_edge_insert (edge e, basic_block *new_bb)
2941 {
2942   if (new_bb)
2943     *new_bb = NULL;
2944   if (PENDING_STMT (e))
2945     {
2946       block_stmt_iterator bsi;
2947       tree stmt = PENDING_STMT (e);
2948
2949       PENDING_STMT (e) = NULL_TREE;
2950
2951       if (tree_find_edge_insert_loc (e, &bsi, new_bb))
2952         bsi_insert_after (&bsi, stmt, BSI_NEW_STMT);
2953       else
2954         bsi_insert_before (&bsi, stmt, BSI_NEW_STMT);
2955     }
2956 }
2957
2958
2959 /* Add STMT to the pending list of edge E.  No actual insertion is
2960    made until a call to bsi_commit_edge_inserts () is made.  */
2961
2962 void
2963 bsi_insert_on_edge (edge e, tree stmt)
2964 {
2965   append_to_statement_list (stmt, &PENDING_STMT (e));
2966 }
2967
2968 /* Similar to bsi_insert_on_edge+bsi_commit_edge_inserts.  If a new
2969    block has to be created, it is returned.  */
2970
2971 basic_block
2972 bsi_insert_on_edge_immediate (edge e, tree stmt)
2973 {
2974   block_stmt_iterator bsi;
2975   basic_block new_bb = NULL;
2976
2977   gcc_assert (!PENDING_STMT (e));
2978
2979   if (tree_find_edge_insert_loc (e, &bsi, &new_bb))
2980     bsi_insert_after (&bsi, stmt, BSI_NEW_STMT);
2981   else
2982     bsi_insert_before (&bsi, stmt, BSI_NEW_STMT);
2983
2984   return new_bb;
2985 }
2986
2987 /*---------------------------------------------------------------------------
2988              Tree specific functions for CFG manipulation
2989 ---------------------------------------------------------------------------*/
2990
2991 /* Reinstall those PHI arguments queued in OLD_EDGE to NEW_EDGE.  */
2992
2993 static void
2994 reinstall_phi_args (edge new_edge, edge old_edge)
2995 {
2996   tree var, phi;
2997
2998   if (!PENDING_STMT (old_edge))
2999     return;
3000   
3001   for (var = PENDING_STMT (old_edge), phi = phi_nodes (new_edge->dest);
3002        var && phi;
3003        var = TREE_CHAIN (var), phi = PHI_CHAIN (phi))
3004     {
3005       tree result = TREE_PURPOSE (var);
3006       tree arg = TREE_VALUE (var);
3007
3008       gcc_assert (result == PHI_RESULT (phi));
3009
3010       add_phi_arg (phi, arg, new_edge);
3011     }
3012
3013   PENDING_STMT (old_edge) = NULL;
3014 }
3015
3016 /* Split a (typically critical) edge EDGE_IN.  Return the new block.
3017    Abort on abnormal edges.  */
3018
3019 static basic_block
3020 tree_split_edge (edge edge_in)
3021 {
3022   basic_block new_bb, after_bb, dest, src;
3023   edge new_edge, e;
3024
3025   /* Abnormal edges cannot be split.  */
3026   gcc_assert (!(edge_in->flags & EDGE_ABNORMAL));
3027
3028   src = edge_in->src;
3029   dest = edge_in->dest;
3030
3031   /* Place the new block in the block list.  Try to keep the new block
3032      near its "logical" location.  This is of most help to humans looking
3033      at debugging dumps.  */
3034   if (dest->prev_bb && find_edge (dest->prev_bb, dest))
3035     after_bb = edge_in->src;
3036   else
3037     after_bb = dest->prev_bb;
3038
3039   new_bb = create_empty_bb (after_bb);
3040   new_bb->frequency = EDGE_FREQUENCY (edge_in);
3041   new_bb->count = edge_in->count;
3042   new_edge = make_edge (new_bb, dest, EDGE_FALLTHRU);
3043   new_edge->probability = REG_BR_PROB_BASE;
3044   new_edge->count = edge_in->count;
3045
3046   e = redirect_edge_and_branch (edge_in, new_bb);
3047   gcc_assert (e);
3048   reinstall_phi_args (new_edge, e);
3049
3050   return new_bb;
3051 }
3052
3053
3054 /* Return true when BB has label LABEL in it.  */
3055
3056 static bool
3057 has_label_p (basic_block bb, tree label)
3058 {
3059   block_stmt_iterator bsi;
3060
3061   for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
3062     {
3063       tree stmt = bsi_stmt (bsi);
3064
3065       if (TREE_CODE (stmt) != LABEL_EXPR)
3066         return false;
3067       if (LABEL_EXPR_LABEL (stmt) == label)
3068         return true;
3069     }
3070   return false;
3071 }
3072
3073
3074 /* Callback for walk_tree, check that all elements with address taken are
3075    properly noticed as such.  The DATA is an int* that is 1 if TP was seen
3076    inside a PHI node.  */
3077
3078 static tree
3079 verify_expr (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
3080 {
3081   tree t = *tp, x;
3082   bool in_phi = (data != NULL);
3083
3084   if (TYPE_P (t))
3085     *walk_subtrees = 0;
3086   
3087   /* Check operand N for being valid GIMPLE and give error MSG if not.  */
3088 #define CHECK_OP(N, MSG) \
3089   do { if (!is_gimple_val (TREE_OPERAND (t, N)))                \
3090        { error (MSG); return TREE_OPERAND (t, N); }} while (0)
3091
3092   switch (TREE_CODE (t))
3093     {
3094     case SSA_NAME:
3095       if (SSA_NAME_IN_FREE_LIST (t))
3096         {
3097           error ("SSA name in freelist but still referenced");
3098           return *tp;
3099         }
3100       break;
3101
3102     case ASSERT_EXPR:
3103       x = fold (ASSERT_EXPR_COND (t));
3104       if (x == boolean_false_node)
3105         {
3106           error ("ASSERT_EXPR with an always-false condition");
3107           return *tp;
3108         }
3109       break;
3110
3111     case MODIFY_EXPR:
3112       x = TREE_OPERAND (t, 0);
3113       if (TREE_CODE (x) == BIT_FIELD_REF
3114           && is_gimple_reg (TREE_OPERAND (x, 0)))
3115         {
3116           error ("GIMPLE register modified with BIT_FIELD_REF");
3117           return t;
3118         }
3119       break;
3120
3121     case ADDR_EXPR:
3122       {
3123         bool old_invariant;
3124         bool old_constant;
3125         bool old_side_effects;
3126         bool new_invariant;
3127         bool new_constant;
3128         bool new_side_effects;
3129
3130         /* ??? tree-ssa-alias.c may have overlooked dead PHI nodes, missing
3131            dead PHIs that take the address of something.  But if the PHI
3132            result is dead, the fact that it takes the address of anything
3133            is irrelevant.  Because we can not tell from here if a PHI result
3134            is dead, we just skip this check for PHIs altogether.  This means
3135            we may be missing "valid" checks, but what can you do?
3136            This was PR19217.  */
3137         if (in_phi)
3138           break;
3139
3140         old_invariant = TREE_INVARIANT (t);
3141         old_constant = TREE_CONSTANT (t);
3142         old_side_effects = TREE_SIDE_EFFECTS (t);
3143
3144         recompute_tree_invarant_for_addr_expr (t);
3145         new_invariant = TREE_INVARIANT (t);
3146         new_side_effects = TREE_SIDE_EFFECTS (t);
3147         new_constant = TREE_CONSTANT (t);
3148
3149         if (old_invariant != new_invariant)
3150           {
3151             error ("invariant not recomputed when ADDR_EXPR changed");
3152             return t;
3153           }
3154
3155         if (old_constant != new_constant)
3156           {
3157             error ("constant not recomputed when ADDR_EXPR changed");
3158             return t;
3159           }
3160         if (old_side_effects != new_side_effects)
3161           {
3162             error ("side effects not recomputed when ADDR_EXPR changed");
3163             return t;
3164           }
3165
3166         /* Skip any references (they will be checked when we recurse down the
3167            tree) and ensure that any variable used as a prefix is marked
3168            addressable.  */
3169         for (x = TREE_OPERAND (t, 0);
3170              handled_component_p (x);
3171              x = TREE_OPERAND (x, 0))
3172           ;
3173
3174         if (TREE_CODE (x) != VAR_DECL && TREE_CODE (x) != PARM_DECL)
3175           return NULL;
3176         if (!TREE_ADDRESSABLE (x))
3177           {
3178             error ("address taken, but ADDRESSABLE bit not set");
3179             return x;
3180           }
3181         break;
3182       }
3183
3184     case COND_EXPR:
3185       x = COND_EXPR_COND (t);
3186       if (TREE_CODE (TREE_TYPE (x)) != BOOLEAN_TYPE)
3187         {
3188           error ("non-boolean used in condition");
3189           return x;
3190         }
3191       if (!is_gimple_condexpr (x))
3192         {
3193           error ("invalid conditional operand");
3194           return x;
3195         }
3196       break;
3197
3198     case NOP_EXPR:
3199     case CONVERT_EXPR:
3200     case FIX_TRUNC_EXPR:
3201     case FIX_CEIL_EXPR:
3202     case FIX_FLOOR_EXPR:
3203     case FIX_ROUND_EXPR:
3204     case FLOAT_EXPR:
3205     case NEGATE_EXPR:
3206     case ABS_EXPR:
3207     case BIT_NOT_EXPR:
3208     case NON_LVALUE_EXPR:
3209     case TRUTH_NOT_EXPR:
3210       CHECK_OP (0, "invalid operand to unary operator");
3211       break;
3212
3213     case REALPART_EXPR:
3214     case IMAGPART_EXPR:
3215     case COMPONENT_REF:
3216     case ARRAY_REF:
3217     case ARRAY_RANGE_REF:
3218     case BIT_FIELD_REF:
3219     case VIEW_CONVERT_EXPR:
3220       /* We have a nest of references.  Verify that each of the operands
3221          that determine where to reference is either a constant or a variable,
3222          verify that the base is valid, and then show we've already checked
3223          the subtrees.  */
3224       while (handled_component_p (t))
3225         {
3226           if (TREE_CODE (t) == COMPONENT_REF && TREE_OPERAND (t, 2))
3227             CHECK_OP (2, "invalid COMPONENT_REF offset operator");
3228           else if (TREE_CODE (t) == ARRAY_REF
3229                    || TREE_CODE (t) == ARRAY_RANGE_REF)
3230             {
3231               CHECK_OP (1, "invalid array index");
3232               if (TREE_OPERAND (t, 2))
3233                 CHECK_OP (2, "invalid array lower bound");
3234               if (TREE_OPERAND (t, 3))
3235                 CHECK_OP (3, "invalid array stride");
3236             }
3237           else if (TREE_CODE (t) == BIT_FIELD_REF)
3238             {
3239               CHECK_OP (1, "invalid operand to BIT_FIELD_REF");
3240               CHECK_OP (2, "invalid operand to BIT_FIELD_REF");
3241             }
3242
3243           t = TREE_OPERAND (t, 0);
3244         }
3245
3246       if (!CONSTANT_CLASS_P (t) && !is_gimple_lvalue (t))
3247         {
3248           error ("invalid reference prefix");
3249           return t;
3250         }
3251       *walk_subtrees = 0;
3252       break;
3253
3254     case LT_EXPR:
3255     case LE_EXPR:
3256     case GT_EXPR:
3257     case GE_EXPR:
3258     case EQ_EXPR:
3259     case NE_EXPR:
3260     case UNORDERED_EXPR:
3261     case ORDERED_EXPR:
3262     case UNLT_EXPR:
3263     case UNLE_EXPR:
3264     case UNGT_EXPR:
3265     case UNGE_EXPR:
3266     case UNEQ_EXPR:
3267     case LTGT_EXPR:
3268     case PLUS_EXPR:
3269     case MINUS_EXPR:
3270     case MULT_EXPR:
3271     case TRUNC_DIV_EXPR:
3272     case CEIL_DIV_EXPR:
3273     case FLOOR_DIV_EXPR:
3274     case ROUND_DIV_EXPR:
3275     case TRUNC_MOD_EXPR:
3276     case CEIL_MOD_EXPR:
3277     case FLOOR_MOD_EXPR:
3278     case ROUND_MOD_EXPR:
3279     case RDIV_EXPR:
3280     case EXACT_DIV_EXPR:
3281     case MIN_EXPR:
3282     case MAX_EXPR:
3283     case LSHIFT_EXPR:
3284     case RSHIFT_EXPR:
3285     case LROTATE_EXPR:
3286     case RROTATE_EXPR:
3287     case BIT_IOR_EXPR:
3288     case BIT_XOR_EXPR:
3289     case BIT_AND_EXPR:
3290       CHECK_OP (0, "invalid operand to binary operator");
3291       CHECK_OP (1, "invalid operand to binary operator");
3292       break;
3293
3294     default:
3295       break;
3296     }
3297   return NULL;
3298
3299 #undef CHECK_OP
3300 }
3301
3302
3303 /* Verify STMT, return true if STMT is not in GIMPLE form.
3304    TODO: Implement type checking.  */
3305
3306 static bool
3307 verify_stmt (tree stmt, bool last_in_block)
3308 {
3309   tree addr;
3310
3311   if (!is_gimple_stmt (stmt))
3312     {
3313       error ("is not a valid GIMPLE statement");
3314       goto fail;
3315     }
3316
3317   addr = walk_tree (&stmt, verify_expr, NULL, NULL);
3318   if (addr)
3319     {
3320       debug_generic_stmt (addr);
3321       return true;
3322     }
3323
3324   /* If the statement is marked as part of an EH region, then it is
3325      expected that the statement could throw.  Verify that when we
3326      have optimizations that simplify statements such that we prove
3327      that they cannot throw, that we update other data structures
3328      to match.  */
3329   if (lookup_stmt_eh_region (stmt) >= 0)
3330     {
3331       if (!tree_could_throw_p (stmt))
3332         {
3333           error ("statement marked for throw, but doesn%'t");
3334           goto fail;
3335         }
3336       if (!last_in_block && tree_can_throw_internal (stmt))
3337         {
3338           error ("statement marked for throw in middle of block");
3339           goto fail;
3340         }
3341     }
3342
3343   return false;
3344
3345  fail:
3346   debug_generic_stmt (stmt);
3347   return true;
3348 }
3349
3350
3351 /* Return true when the T can be shared.  */
3352
3353 static bool
3354 tree_node_can_be_shared (tree t)
3355 {
3356   if (IS_TYPE_OR_DECL_P (t)
3357       /* We check for constants explicitly since they are not considered
3358          gimple invariants if they overflowed.  */
3359       || CONSTANT_CLASS_P (t)
3360       || is_gimple_min_invariant (t)
3361       || TREE_CODE (t) == SSA_NAME
3362       || t == error_mark_node)
3363     return true;
3364
3365   if (TREE_CODE (t) == CASE_LABEL_EXPR)
3366     return true;
3367
3368   while (((TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
3369           /* We check for constants explicitly since they are not considered
3370              gimple invariants if they overflowed.  */
3371           && (CONSTANT_CLASS_P (TREE_OPERAND (t, 1))
3372               || is_gimple_min_invariant (TREE_OPERAND (t, 1))))
3373          || (TREE_CODE (t) == COMPONENT_REF
3374              || TREE_CODE (t) == REALPART_EXPR
3375              || TREE_CODE (t) == IMAGPART_EXPR))
3376     t = TREE_OPERAND (t, 0);
3377
3378   if (DECL_P (t))
3379     return true;
3380
3381   return false;
3382 }
3383
3384
3385 /* Called via walk_trees.  Verify tree sharing.  */
3386
3387 static tree
3388 verify_node_sharing (tree * tp, int *walk_subtrees, void *data)
3389 {
3390   htab_t htab = (htab_t) data;
3391   void **slot;
3392
3393   if (tree_node_can_be_shared (*tp))
3394     {
3395       *walk_subtrees = false;
3396       return NULL;
3397     }
3398
3399   slot = htab_find_slot (htab, *tp, INSERT);
3400   if (*slot)
3401     return *slot;
3402   *slot = *tp;
3403
3404   return NULL;
3405 }
3406
3407
3408 /* Verify the GIMPLE statement chain.  */
3409
3410 void
3411 verify_stmts (void)
3412 {
3413   basic_block bb;
3414   block_stmt_iterator bsi;
3415   bool err = false;
3416   htab_t htab;
3417   tree addr;
3418
3419   timevar_push (TV_TREE_STMT_VERIFY);
3420   htab = htab_create (37, htab_hash_pointer, htab_eq_pointer, NULL);
3421
3422   FOR_EACH_BB (bb)
3423     {
3424       tree phi;
3425       int i;
3426
3427       for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
3428         {
3429           int phi_num_args = PHI_NUM_ARGS (phi);
3430
3431           if (bb_for_stmt (phi) != bb)
3432             {
3433               error ("bb_for_stmt (phi) is set to a wrong basic block");
3434               err |= true;
3435             }
3436
3437           for (i = 0; i < phi_num_args; i++)
3438             {
3439               tree t = PHI_ARG_DEF (phi, i);
3440               tree addr;
3441
3442               /* Addressable variables do have SSA_NAMEs but they
3443                  are not considered gimple values.  */
3444               if (TREE_CODE (t) != SSA_NAME
3445                   && TREE_CODE (t) != FUNCTION_DECL
3446                   && !is_gimple_val (t))
3447                 {
3448                   error ("PHI def is not a GIMPLE value");
3449                   debug_generic_stmt (phi);
3450                   debug_generic_stmt (t);
3451                   err |= true;
3452                 }
3453
3454               addr = walk_tree (&t, verify_expr, (void *) 1, NULL);
3455               if (addr)
3456                 {
3457                   debug_generic_stmt (addr);
3458                   err |= true;
3459                 }
3460
3461               addr = walk_tree (&t, verify_node_sharing, htab, NULL);
3462               if (addr)
3463                 {
3464                   error ("incorrect sharing of tree nodes");
3465                   debug_generic_stmt (phi);
3466                   debug_generic_stmt (addr);
3467                   err |= true;
3468                 }
3469             }
3470         }
3471
3472       for (bsi = bsi_start (bb); !bsi_end_p (bsi); )
3473         {
3474           tree stmt = bsi_stmt (bsi);
3475
3476           if (bb_for_stmt (stmt) != bb)
3477             {
3478               error ("bb_for_stmt (stmt) is set to a wrong basic block");
3479               err |= true;
3480             }
3481
3482           bsi_next (&bsi);
3483           err |= verify_stmt (stmt, bsi_end_p (bsi));
3484           addr = walk_tree (&stmt, verify_node_sharing, htab, NULL);
3485           if (addr)
3486             {
3487               error ("incorrect sharing of tree nodes");
3488               debug_generic_stmt (stmt);
3489               debug_generic_stmt (addr);
3490               err |= true;
3491             }
3492         }
3493     }
3494
3495   if (err)
3496     internal_error ("verify_stmts failed");
3497
3498   htab_delete (htab);
3499   timevar_pop (TV_TREE_STMT_VERIFY);
3500 }
3501
3502
3503 /* Verifies that the flow information is OK.  */
3504
3505 static int
3506 tree_verify_flow_info (void)
3507 {
3508   int err = 0;
3509   basic_block bb;
3510   block_stmt_iterator bsi;
3511   tree stmt;
3512   edge e;
3513   edge_iterator ei;
3514
3515   if (ENTRY_BLOCK_PTR->stmt_list)
3516     {
3517       error ("ENTRY_BLOCK has a statement list associated with it");
3518       err = 1;
3519     }
3520
3521   if (EXIT_BLOCK_PTR->stmt_list)
3522     {
3523       error ("EXIT_BLOCK has a statement list associated with it");
3524       err = 1;
3525     }
3526
3527   FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
3528     if (e->flags & EDGE_FALLTHRU)
3529       {
3530         error ("fallthru to exit from bb %d", e->src->index);
3531         err = 1;
3532       }
3533
3534   FOR_EACH_BB (bb)
3535     {
3536       bool found_ctrl_stmt = false;
3537
3538       stmt = NULL_TREE;
3539
3540       /* Skip labels on the start of basic block.  */
3541       for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
3542         {
3543           tree prev_stmt = stmt;
3544
3545           stmt = bsi_stmt (bsi);
3546
3547           if (TREE_CODE (stmt) != LABEL_EXPR)
3548             break;
3549
3550           if (prev_stmt && DECL_NONLOCAL (LABEL_EXPR_LABEL (stmt)))
3551             {
3552               error ("nonlocal label %s is not first "
3553                      "in a sequence of labels in bb %d",
3554                      IDENTIFIER_POINTER (DECL_NAME (LABEL_EXPR_LABEL (stmt))),
3555                      bb->index);
3556               err = 1;
3557             }
3558
3559           if (label_to_block (LABEL_EXPR_LABEL (stmt)) != bb)
3560             {
3561               error ("label %s to block does not match in bb %d",
3562                      IDENTIFIER_POINTER (DECL_NAME (LABEL_EXPR_LABEL (stmt))),
3563                      bb->index);
3564               err = 1;
3565             }
3566
3567           if (decl_function_context (LABEL_EXPR_LABEL (stmt))
3568               != current_function_decl)
3569             {
3570               error ("label %s has incorrect context in bb %d",
3571                      IDENTIFIER_POINTER (DECL_NAME (LABEL_EXPR_LABEL (stmt))),
3572                      bb->index);
3573               err = 1;
3574             }
3575         }
3576
3577       /* Verify that body of basic block BB is free of control flow.  */
3578       for (; !bsi_end_p (bsi); bsi_next (&bsi))
3579         {
3580           tree stmt = bsi_stmt (bsi);
3581
3582           if (found_ctrl_stmt)
3583             {
3584               error ("control flow in the middle of basic block %d",
3585                      bb->index);
3586               err = 1;
3587             }
3588
3589           if (stmt_ends_bb_p (stmt))
3590             found_ctrl_stmt = true;
3591
3592           if (TREE_CODE (stmt) == LABEL_EXPR)
3593             {
3594               error ("label %s in the middle of basic block %d",
3595                      IDENTIFIER_POINTER (DECL_NAME (LABEL_EXPR_LABEL (stmt))),
3596                      bb->index);
3597               err = 1;
3598             }
3599         }
3600       bsi = bsi_last (bb);
3601       if (bsi_end_p (bsi))
3602         continue;
3603
3604       stmt = bsi_stmt (bsi);
3605
3606       err |= verify_eh_edges (stmt);
3607
3608       if (is_ctrl_stmt (stmt))
3609         {
3610           FOR_EACH_EDGE (e, ei, bb->succs)
3611             if (e->flags & EDGE_FALLTHRU)
3612               {
3613                 error ("fallthru edge after a control statement in bb %d",
3614                        bb->index);
3615                 err = 1;
3616               }
3617         }
3618
3619       switch (TREE_CODE (stmt))
3620         {
3621         case COND_EXPR:
3622           {
3623             edge true_edge;
3624             edge false_edge;
3625             if (TREE_CODE (COND_EXPR_THEN (stmt)) != GOTO_EXPR
3626                 || TREE_CODE (COND_EXPR_ELSE (stmt)) != GOTO_EXPR)
3627               {
3628                 error ("structured COND_EXPR at the end of bb %d", bb->index);
3629                 err = 1;
3630               }
3631
3632             extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
3633
3634             if (!true_edge || !false_edge
3635                 || !(true_edge->flags & EDGE_TRUE_VALUE)
3636                 || !(false_edge->flags & EDGE_FALSE_VALUE)
3637                 || (true_edge->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL))
3638                 || (false_edge->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL))
3639                 || EDGE_COUNT (bb->succs) >= 3)
3640               {
3641                 error ("wrong outgoing edge flags at end of bb %d",
3642                        bb->index);
3643                 err = 1;
3644               }
3645
3646             if (!has_label_p (true_edge->dest,
3647                               GOTO_DESTINATION (COND_EXPR_THEN (stmt))))
3648               {
3649                 error ("%<then%> label does not match edge at end of bb %d",
3650                        bb->index);
3651                 err = 1;
3652               }
3653
3654             if (!has_label_p (false_edge->dest,
3655                               GOTO_DESTINATION (COND_EXPR_ELSE (stmt))))
3656               {
3657                 error ("%<else%> label does not match edge at end of bb %d",
3658                        bb->index);
3659                 err = 1;
3660               }
3661           }
3662           break;
3663
3664         case GOTO_EXPR:
3665           if (simple_goto_p (stmt))
3666             {
3667               error ("explicit goto at end of bb %d", bb->index);
3668               err = 1;
3669             }
3670           else
3671             {
3672               /* FIXME.  We should double check that the labels in the 
3673                  destination blocks have their address taken.  */
3674               FOR_EACH_EDGE (e, ei, bb->succs)
3675                 if ((e->flags & (EDGE_FALLTHRU | EDGE_TRUE_VALUE
3676                                  | EDGE_FALSE_VALUE))
3677                     || !(e->flags & EDGE_ABNORMAL))
3678                   {
3679                     error ("wrong outgoing edge flags at end of bb %d",
3680                            bb->index);
3681                     err = 1;
3682                   }
3683             }
3684           break;
3685
3686         case RETURN_EXPR:
3687           if (!single_succ_p (bb)
3688               || (single_succ_edge (bb)->flags
3689                   & (EDGE_FALLTHRU | EDGE_ABNORMAL
3690                      | EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
3691             {
3692               error ("wrong outgoing edge flags at end of bb %d", bb->index);
3693               err = 1;
3694             }
3695           if (single_succ (bb) != EXIT_BLOCK_PTR)
3696             {
3697               error ("return edge does not point to exit in bb %d",
3698                      bb->index);
3699               err = 1;
3700             }
3701           break;
3702
3703         case SWITCH_EXPR:
3704           {
3705             tree prev;
3706             edge e;
3707             size_t i, n;
3708             tree vec;
3709
3710             vec = SWITCH_LABELS (stmt);
3711             n = TREE_VEC_LENGTH (vec);
3712
3713             /* Mark all the destination basic blocks.  */
3714             for (i = 0; i < n; ++i)
3715               {
3716                 tree lab = CASE_LABEL (TREE_VEC_ELT (vec, i));
3717                 basic_block label_bb = label_to_block (lab);
3718
3719                 gcc_assert (!label_bb->aux || label_bb->aux == (void *)1);
3720                 label_bb->aux = (void *)1;
3721               }
3722
3723             /* Verify that the case labels are sorted.  */
3724             prev = TREE_VEC_ELT (vec, 0);
3725             for (i = 1; i < n - 1; ++i)
3726               {
3727                 tree c = TREE_VEC_ELT (vec, i);
3728                 if (! CASE_LOW (c))
3729                   {
3730                     error ("found default case not at end of case vector");
3731                     err = 1;
3732                     continue;
3733                   }
3734                 if (! tree_int_cst_lt (CASE_LOW (prev), CASE_LOW (c)))
3735                   {
3736                     error ("case labels not sorted:");
3737                     print_generic_expr (stderr, prev, 0);
3738                     fprintf (stderr," is greater than ");
3739                     print_generic_expr (stderr, c, 0);
3740                     fprintf (stderr," but comes before it.\n");
3741                     err = 1;
3742                   }
3743                 prev = c;
3744               }
3745             if (CASE_LOW (TREE_VEC_ELT (vec, n - 1)))
3746               {
3747                 error ("no default case found at end of case vector");
3748                 err = 1;
3749               }
3750
3751             FOR_EACH_EDGE (e, ei, bb->succs)
3752               {
3753                 if (!e->dest->aux)
3754                   {
3755                     error ("extra outgoing edge %d->%d",
3756                            bb->index, e->dest->index);
3757                     err = 1;
3758                   }
3759                 e->dest->aux = (void *)2;
3760                 if ((e->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL
3761                                  | EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
3762                   {
3763                     error ("wrong outgoing edge flags at end of bb %d",
3764                            bb->index);
3765                     err = 1;
3766                   }
3767               }
3768
3769             /* Check that we have all of them.  */
3770             for (i = 0; i < n; ++i)
3771               {
3772                 tree lab = CASE_LABEL (TREE_VEC_ELT (vec, i));
3773                 basic_block label_bb = label_to_block (lab);
3774
3775                 if (label_bb->aux != (void *)2)
3776                   {
3777                     error ("missing edge %i->%i",
3778                            bb->index, label_bb->index);
3779                     err = 1;
3780                   }
3781               }
3782
3783             FOR_EACH_EDGE (e, ei, bb->succs)
3784               e->dest->aux = (void *)0;
3785           }
3786
3787         default: ;
3788         }
3789     }
3790
3791   if (dom_computed[CDI_DOMINATORS] >= DOM_NO_FAST_QUERY)
3792     verify_dominators (CDI_DOMINATORS);
3793
3794   return err;
3795 }
3796
3797
3798 /* Updates phi nodes after creating a forwarder block joined
3799    by edge FALLTHRU.  */
3800
3801 static void
3802 tree_make_forwarder_block (edge fallthru)
3803 {
3804   edge e;
3805   edge_iterator ei;
3806   basic_block dummy, bb;
3807   tree phi, new_phi, var;
3808
3809   dummy = fallthru->src;
3810   bb = fallthru->dest;
3811
3812   if (single_pred_p (bb))
3813     return;
3814
3815   /* If we redirected a branch we must create new phi nodes at the
3816      start of BB.  */
3817   for (phi = phi_nodes (dummy); phi; phi = PHI_CHAIN (phi))
3818     {
3819       var = PHI_RESULT (phi);
3820       new_phi = create_phi_node (var, bb);
3821       SSA_NAME_DEF_STMT (var) = new_phi;
3822       SET_PHI_RESULT (phi, make_ssa_name (SSA_NAME_VAR (var), phi));
3823       add_phi_arg (new_phi, PHI_RESULT (phi), fallthru);
3824     }
3825
3826   /* Ensure that the PHI node chain is in the same order.  */
3827   set_phi_nodes (bb, phi_reverse (phi_nodes (bb)));
3828
3829   /* Add the arguments we have stored on edges.  */
3830   FOR_EACH_EDGE (e, ei, bb->preds)
3831     {
3832       if (e == fallthru)
3833         continue;
3834
3835       flush_pending_stmts (e);
3836     }
3837 }
3838
3839
3840 /* Return a non-special label in the head of basic block BLOCK.
3841    Create one if it doesn't exist.  */
3842
3843 tree
3844 tree_block_label (basic_block bb)
3845 {
3846   block_stmt_iterator i, s = bsi_start (bb);
3847   bool first = true;
3848   tree label, stmt;
3849
3850   for (i = s; !bsi_end_p (i); first = false, bsi_next (&i))
3851     {
3852       stmt = bsi_stmt (i);
3853       if (TREE_CODE (stmt) != LABEL_EXPR)
3854         break;
3855       label = LABEL_EXPR_LABEL (stmt);
3856       if (!DECL_NONLOCAL (label))
3857         {
3858           if (!first)
3859             bsi_move_before (&i, &s);
3860           return label;
3861         }
3862     }
3863
3864   label = create_artificial_label ();
3865   stmt = build1 (LABEL_EXPR, void_type_node, label);
3866   bsi_insert_before (&s, stmt, BSI_NEW_STMT);
3867   return label;
3868 }
3869
3870
3871 /* Attempt to perform edge redirection by replacing a possibly complex
3872    jump instruction by a goto or by removing the jump completely.
3873    This can apply only if all edges now point to the same block.  The
3874    parameters and return values are equivalent to
3875    redirect_edge_and_branch.  */
3876
3877 static edge
3878 tree_try_redirect_by_replacing_jump (edge e, basic_block target)
3879 {
3880   basic_block src = e->src;
3881   block_stmt_iterator b;
3882   tree stmt;
3883
3884   /* We can replace or remove a complex jump only when we have exactly
3885      two edges.  */
3886   if (EDGE_COUNT (src->succs) != 2
3887       /* Verify that all targets will be TARGET.  Specifically, the
3888          edge that is not E must also go to TARGET.  */
3889       || EDGE_SUCC (src, EDGE_SUCC (src, 0) == e)->dest != target)
3890     return NULL;
3891
3892   b = bsi_last (src);
3893   if (bsi_end_p (b))
3894     return NULL;
3895   stmt = bsi_stmt (b);
3896
3897   if (TREE_CODE (stmt) == COND_EXPR
3898       || TREE_CODE (stmt) == SWITCH_EXPR)
3899     {
3900       bsi_remove (&b);
3901       e = ssa_redirect_edge (e, target);
3902       e->flags = EDGE_FALLTHRU;
3903       return e;
3904     }
3905
3906   return NULL;
3907 }
3908
3909
3910 /* Redirect E to DEST.  Return NULL on failure.  Otherwise, return the
3911    edge representing the redirected branch.  */
3912
3913 static edge
3914 tree_redirect_edge_and_branch (edge e, basic_block dest)
3915 {
3916   basic_block bb = e->src;
3917   block_stmt_iterator bsi;
3918   edge ret;
3919   tree label, stmt;
3920
3921   if (e->flags & (EDGE_ABNORMAL_CALL | EDGE_EH))
3922     return NULL;
3923
3924   if (e->src != ENTRY_BLOCK_PTR 
3925       && (ret = tree_try_redirect_by_replacing_jump (e, dest)))
3926     return ret;
3927
3928   if (e->dest == dest)
3929     return NULL;
3930
3931   label = tree_block_label (dest);
3932
3933   bsi = bsi_last (bb);
3934   stmt = bsi_end_p (bsi) ? NULL : bsi_stmt (bsi);
3935
3936   switch (stmt ? TREE_CODE (stmt) : ERROR_MARK)
3937     {
3938     case COND_EXPR:
3939       stmt = (e->flags & EDGE_TRUE_VALUE
3940               ? COND_EXPR_THEN (stmt)
3941               : COND_EXPR_ELSE (stmt));
3942       GOTO_DESTINATION (stmt) = label;
3943       break;
3944
3945     case GOTO_EXPR:
3946       /* No non-abnormal edges should lead from a non-simple goto, and
3947          simple ones should be represented implicitly.  */
3948       gcc_unreachable ();
3949
3950     case SWITCH_EXPR:
3951       {
3952         tree cases = get_cases_for_edge (e, stmt);
3953
3954         /* If we have a list of cases associated with E, then use it
3955            as it's a lot faster than walking the entire case vector.  */
3956         if (cases)
3957           {
3958             edge e2 = find_edge (e->src, dest);
3959             tree last, first;
3960
3961             first = cases;
3962             while (cases)
3963               {
3964                 last = cases;
3965                 CASE_LABEL (cases) = label;
3966                 cases = TREE_CHAIN (cases);
3967               }
3968
3969             /* If there was already an edge in the CFG, then we need
3970                to move all the cases associated with E to E2.  */
3971             if (e2)
3972               {
3973                 tree cases2 = get_cases_for_edge (e2, stmt);
3974
3975                 TREE_CHAIN (last) = TREE_CHAIN (cases2);
3976                 TREE_CHAIN (cases2) = first;
3977               }
3978           }
3979         else
3980           {
3981             tree vec = SWITCH_LABELS (stmt);
3982             size_t i, n = TREE_VEC_LENGTH (vec);
3983
3984             for (i = 0; i < n; i++)
3985               {
3986                 tree elt = TREE_VEC_ELT (vec, i);
3987
3988                 if (label_to_block (CASE_LABEL (elt)) == e->dest)
3989                   CASE_LABEL (elt) = label;
3990               }
3991           }
3992
3993         break;
3994       }
3995
3996     case RETURN_EXPR:
3997       bsi_remove (&bsi);
3998       e->flags |= EDGE_FALLTHRU;
3999       break;
4000
4001     default:
4002       /* Otherwise it must be a fallthru edge, and we don't need to
4003          do anything besides redirecting it.  */
4004       gcc_assert (e->flags & EDGE_FALLTHRU);
4005       break;
4006     }
4007
4008   /* Update/insert PHI nodes as necessary.  */
4009
4010   /* Now update the edges in the CFG.  */
4011   e = ssa_redirect_edge (e, dest);
4012
4013   return e;
4014 }
4015
4016
4017 /* Simple wrapper, as we can always redirect fallthru edges.  */
4018
4019 static basic_block
4020 tree_redirect_edge_and_branch_force (edge e, basic_block dest)
4021 {
4022   e = tree_redirect_edge_and_branch (e, dest);
4023   gcc_assert (e);
4024
4025   return NULL;
4026 }
4027
4028
4029 /* Splits basic block BB after statement STMT (but at least after the
4030    labels).  If STMT is NULL, BB is split just after the labels.  */
4031
4032 static basic_block
4033 tree_split_block (basic_block bb, void *stmt)
4034 {
4035   block_stmt_iterator bsi, bsi_tgt;
4036   tree act;
4037   basic_block new_bb;
4038   edge e;
4039   edge_iterator ei;
4040
4041   new_bb = create_empty_bb (bb);
4042
4043   /* Redirect the outgoing edges.  */
4044   new_bb->succs = bb->succs;
4045   bb->succs = NULL;
4046   FOR_EACH_EDGE (e, ei, new_bb->succs)
4047     e->src = new_bb;
4048
4049   if (stmt && TREE_CODE ((tree) stmt) == LABEL_EXPR)
4050     stmt = NULL;
4051
4052   /* Move everything from BSI to the new basic block.  */
4053   for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
4054     {
4055       act = bsi_stmt (bsi);
4056       if (TREE_CODE (act) == LABEL_EXPR)
4057         continue;
4058
4059       if (!stmt)
4060         break;
4061
4062       if (stmt == act)
4063         {
4064           bsi_next (&bsi);
4065           break;
4066         }
4067     }
4068
4069   bsi_tgt = bsi_start (new_bb);
4070   while (!bsi_end_p (bsi))
4071     {
4072       act = bsi_stmt (bsi);
4073       bsi_remove (&bsi);
4074       bsi_insert_after (&bsi_tgt, act, BSI_NEW_STMT);
4075     }
4076
4077   return new_bb;
4078 }
4079
4080
4081 /* Moves basic block BB after block AFTER.  */
4082
4083 static bool
4084 tree_move_block_after (basic_block bb, basic_block after)
4085 {
4086   if (bb->prev_bb == after)
4087     return true;
4088
4089   unlink_block (bb);
4090   link_block (bb, after);
4091
4092   return true;
4093 }
4094
4095
4096 /* Return true if basic_block can be duplicated.  */
4097
4098 static bool
4099 tree_can_duplicate_bb_p (basic_block bb ATTRIBUTE_UNUSED)
4100 {
4101   return true;
4102 }
4103
4104
4105 /* Create a duplicate of the basic block BB.  NOTE: This does not
4106    preserve SSA form.  */
4107
4108 static basic_block
4109 tree_duplicate_bb (basic_block bb)
4110 {
4111   basic_block new_bb;
4112   block_stmt_iterator bsi, bsi_tgt;
4113   tree phi;
4114
4115   new_bb = create_empty_bb (EXIT_BLOCK_PTR->prev_bb);
4116
4117   /* Copy the PHI nodes.  We ignore PHI node arguments here because
4118      the incoming edges have not been setup yet.  */
4119   for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
4120     {
4121       tree copy = create_phi_node (PHI_RESULT (phi), new_bb);
4122       create_new_def_for (PHI_RESULT (copy), copy, PHI_RESULT_PTR (copy));
4123     }
4124
4125   /* Keep the chain of PHI nodes in the same order so that they can be
4126      updated by ssa_redirect_edge.  */
4127   set_phi_nodes (new_bb, phi_reverse (phi_nodes (new_bb)));
4128
4129   bsi_tgt = bsi_start (new_bb);
4130   for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
4131     {
4132       def_operand_p def_p;
4133       ssa_op_iter op_iter;
4134       tree stmt, copy;
4135       int region;
4136
4137       stmt = bsi_stmt (bsi);
4138       if (TREE_CODE (stmt) == LABEL_EXPR)
4139         continue;
4140
4141       /* Create a new copy of STMT and duplicate STMT's virtual
4142          operands.  */
4143       copy = unshare_expr (stmt);
4144       bsi_insert_after (&bsi_tgt, copy, BSI_NEW_STMT);
4145       copy_virtual_operands (copy, stmt);
4146       region = lookup_stmt_eh_region (stmt);
4147       if (region >= 0)
4148         add_stmt_to_eh_region (copy, region);
4149
4150       /* Create new names for all the definitions created by COPY and
4151          add replacement mappings for each new name.  */
4152       FOR_EACH_SSA_DEF_OPERAND (def_p, copy, op_iter, SSA_OP_ALL_DEFS)
4153         create_new_def_for (DEF_FROM_PTR (def_p), copy, def_p);
4154     }
4155
4156   return new_bb;
4157 }
4158
4159
4160 /* Basic block BB_COPY was created by code duplication.  Add phi node
4161    arguments for edges going out of BB_COPY.  The blocks that were
4162    duplicated have BB_DUPLICATED set.  */
4163
4164 void
4165 add_phi_args_after_copy_bb (basic_block bb_copy)
4166 {
4167   basic_block bb, dest;
4168   edge e, e_copy;
4169   edge_iterator ei;
4170   tree phi, phi_copy, phi_next, def;
4171       
4172   bb = get_bb_original (bb_copy);
4173
4174   FOR_EACH_EDGE (e_copy, ei, bb_copy->succs)
4175     {
4176       if (!phi_nodes (e_copy->dest))
4177         continue;
4178
4179       if (e_copy->dest->flags & BB_DUPLICATED)
4180         dest = get_bb_original (e_copy->dest);
4181       else
4182         dest = e_copy->dest;
4183
4184       e = find_edge (bb, dest);
4185       if (!e)
4186         {
4187           /* During loop unrolling the target of the latch edge is copied.
4188              In this case we are not looking for edge to dest, but to
4189              duplicated block whose original was dest.  */
4190           FOR_EACH_EDGE (e, ei, bb->succs)
4191             if ((e->dest->flags & BB_DUPLICATED)
4192                 && get_bb_original (e->dest) == dest)
4193               break;
4194
4195           gcc_assert (e != NULL);
4196         }
4197
4198       for (phi = phi_nodes (e->dest), phi_copy = phi_nodes (e_copy->dest);
4199            phi;
4200            phi = phi_next, phi_copy = PHI_CHAIN (phi_copy))
4201         {
4202           phi_next = PHI_CHAIN (phi);
4203           def = PHI_ARG_DEF_FROM_EDGE (phi, e);
4204           add_phi_arg (phi_copy, def, e_copy);
4205         }
4206     }
4207 }
4208
4209 /* Blocks in REGION_COPY array of length N_REGION were created by
4210    duplication of basic blocks.  Add phi node arguments for edges
4211    going from these blocks.  */
4212
4213 void
4214 add_phi_args_after_copy (basic_block *region_copy, unsigned n_region)
4215 {
4216   unsigned i;
4217
4218   for (i = 0; i < n_region; i++)
4219     region_copy[i]->flags |= BB_DUPLICATED;
4220
4221   for (i = 0; i < n_region; i++)
4222     add_phi_args_after_copy_bb (region_copy[i]);
4223
4224   for (i = 0; i < n_region; i++)
4225     region_copy[i]->flags &= ~BB_DUPLICATED;
4226 }
4227
4228 /* Duplicates a REGION (set of N_REGION basic blocks) with just a single
4229    important exit edge EXIT.  By important we mean that no SSA name defined
4230    inside region is live over the other exit edges of the region.  All entry
4231    edges to the region must go to ENTRY->dest.  The edge ENTRY is redirected
4232    to the duplicate of the region.  SSA form, dominance and loop information
4233    is updated.  The new basic blocks are stored to REGION_COPY in the same
4234    order as they had in REGION, provided that REGION_COPY is not NULL.
4235    The function returns false if it is unable to copy the region,
4236    true otherwise.  */
4237
4238 bool
4239 tree_duplicate_sese_region (edge entry, edge exit,
4240                             basic_block *region, unsigned n_region,
4241                             basic_block *region_copy)
4242 {
4243   unsigned i, n_doms;
4244   bool free_region_copy = false, copying_header = false;
4245   struct loop *loop = entry->dest->loop_father;
4246   edge exit_copy;
4247   basic_block *doms;
4248   edge redirected;
4249   int total_freq, entry_freq;
4250
4251   if (!can_copy_bbs_p (region, n_region))
4252     return false;
4253
4254   /* Some sanity checking.  Note that we do not check for all possible
4255      missuses of the functions.  I.e. if you ask to copy something weird,
4256      it will work, but the state of structures probably will not be
4257      correct.  */
4258   for (i = 0; i < n_region; i++)
4259     {
4260       /* We do not handle subloops, i.e. all the blocks must belong to the
4261          same loop.  */
4262       if (region[i]->loop_father != loop)
4263         return false;
4264
4265       if (region[i] != entry->dest
4266           && region[i] == loop->header)
4267         return false;
4268     }
4269
4270   loop->copy = loop;
4271
4272   /* In case the function is used for loop header copying (which is the primary
4273      use), ensure that EXIT and its copy will be new latch and entry edges.  */
4274   if (loop->header == entry->dest)
4275     {
4276       copying_header = true;
4277       loop->copy = loop->outer;
4278
4279       if (!dominated_by_p (CDI_DOMINATORS, loop->latch, exit->src))
4280         return false;
4281
4282       for (i = 0; i < n_region; i++)
4283         if (region[i] != exit->src
4284             && dominated_by_p (CDI_DOMINATORS, region[i], exit->src))
4285           return false;
4286     }
4287
4288   if (!region_copy)
4289     {
4290       region_copy = xmalloc (sizeof (basic_block) * n_region);
4291       free_region_copy = true;
4292     }
4293
4294   gcc_assert (!need_ssa_update_p ());
4295
4296   /* Record blocks outside the region that are dominated by something
4297      inside.  */
4298   doms = xmalloc (sizeof (basic_block) * n_basic_blocks);
4299   initialize_original_copy_tables ();
4300
4301   n_doms = get_dominated_by_region (CDI_DOMINATORS, region, n_region, doms);
4302
4303   total_freq = entry->dest->frequency;
4304   entry_freq = EDGE_FREQUENCY (entry);
4305   /* Fix up corner cases, to avoid division by zero or creation of negative
4306      frequencies.  */
4307   if (total_freq == 0)
4308     total_freq = 1;
4309   else if (entry_freq > total_freq)
4310     entry_freq = total_freq;
4311
4312   copy_bbs (region, n_region, region_copy, &exit, 1, &exit_copy, loop);
4313   scale_bbs_frequencies_int (region, n_region, total_freq - entry_freq,
4314                              total_freq);
4315   scale_bbs_frequencies_int (region_copy, n_region, entry_freq, total_freq);
4316
4317   if (copying_header)
4318     {
4319       loop->header = exit->dest;
4320       loop->latch = exit->src;
4321     }
4322
4323   /* Redirect the entry and add the phi node arguments.  */
4324   redirected = redirect_edge_and_branch (entry, get_bb_copy (entry->dest));
4325   gcc_assert (redirected != NULL);
4326   flush_pending_stmts (entry);
4327
4328   /* Concerning updating of dominators:  We must recount dominators
4329      for entry block and its copy.  Anything that is outside of the
4330      region, but was dominated by something inside needs recounting as
4331      well.  */
4332   set_immediate_dominator (CDI_DOMINATORS, entry->dest, entry->src);
4333   doms[n_doms++] = get_bb_original (entry->dest);
4334   iterate_fix_dominators (CDI_DOMINATORS, doms, n_doms);
4335   free (doms);
4336
4337   /* Add the other PHI node arguments.  */
4338   add_phi_args_after_copy (region_copy, n_region);
4339
4340   /* Update the SSA web.  */
4341   update_ssa (TODO_update_ssa);
4342
4343   if (free_region_copy)
4344     free (region_copy);
4345
4346   free_original_copy_tables ();
4347   return true;
4348 }
4349
4350
4351 /* Dump FUNCTION_DECL FN to file FILE using FLAGS (see TDF_* in tree.h)  */
4352
4353 void
4354 dump_function_to_file (tree fn, FILE *file, int flags)
4355 {
4356   tree arg, vars, var;
4357   bool ignore_topmost_bind = false, any_var = false;
4358   basic_block bb;
4359   tree chain;
4360
4361   fprintf (file, "%s (", lang_hooks.decl_printable_name (fn, 2));
4362
4363   arg = DECL_ARGUMENTS (fn);
4364   while (arg)
4365     {
4366       print_generic_expr (file, arg, dump_flags);
4367       if (TREE_CHAIN (arg))
4368         fprintf (file, ", ");
4369       arg = TREE_CHAIN (arg);
4370     }
4371   fprintf (file, ")\n");
4372
4373   if (flags & TDF_DETAILS)
4374     dump_eh_tree (file, DECL_STRUCT_FUNCTION (fn));
4375   if (flags & TDF_RAW)
4376     {
4377       dump_node (fn, TDF_SLIM | flags, file);
4378       return;
4379     }
4380
4381   /* When GIMPLE is lowered, the variables are no longer available in
4382      BIND_EXPRs, so display them separately.  */
4383   if (cfun && cfun->decl == fn && cfun->unexpanded_var_list)
4384     {
4385       ignore_topmost_bind = true;
4386
4387       fprintf (file, "{\n");
4388       for (vars = cfun->unexpanded_var_list; vars; vars = TREE_CHAIN (vars))
4389         {
4390           var = TREE_VALUE (vars);
4391
4392           print_generic_decl (file, var, flags);
4393           fprintf (file, "\n");
4394
4395           any_var = true;
4396         }
4397     }
4398
4399   if (cfun && cfun->decl == fn && cfun->cfg && basic_block_info)
4400     {
4401       /* Make a CFG based dump.  */
4402       check_bb_profile (ENTRY_BLOCK_PTR, file);
4403       if (!ignore_topmost_bind)
4404         fprintf (file, "{\n");
4405
4406       if (any_var && n_basic_blocks)
4407         fprintf (file, "\n");
4408
4409       FOR_EACH_BB (bb)
4410         dump_generic_bb (file, bb, 2, flags);
4411         
4412       fprintf (file, "}\n");
4413       check_bb_profile (EXIT_BLOCK_PTR, file);
4414     }
4415   else
4416     {
4417       int indent;
4418
4419       /* Make a tree based dump.  */
4420       chain = DECL_SAVED_TREE (fn);
4421
4422       if (TREE_CODE (chain) == BIND_EXPR)
4423         {
4424           if (ignore_topmost_bind)
4425             {
4426               chain = BIND_EXPR_BODY (chain);
4427               indent = 2;
4428             }
4429           else
4430             indent = 0;
4431         }
4432       else
4433         {
4434           if (!ignore_topmost_bind)
4435             fprintf (file, "{\n");
4436           indent = 2;
4437         }
4438
4439       if (any_var)
4440         fprintf (file, "\n");
4441
4442       print_generic_stmt_indented (file, chain, flags, indent);
4443       if (ignore_topmost_bind)
4444         fprintf (file, "}\n");
4445     }
4446
4447   fprintf (file, "\n\n");
4448 }
4449
4450
4451 /* Pretty print of the loops intermediate representation.  */
4452 static void print_loop (FILE *, struct loop *, int);
4453 static void print_pred_bbs (FILE *, basic_block bb);
4454 static void print_succ_bbs (FILE *, basic_block bb);
4455
4456
4457 /* Print the predecessors indexes of edge E on FILE.  */
4458
4459 static void
4460 print_pred_bbs (FILE *file, basic_block bb)
4461 {
4462   edge e;
4463   edge_iterator ei;
4464
4465   FOR_EACH_EDGE (e, ei, bb->preds)
4466     fprintf (file, "bb_%d", e->src->index);
4467 }
4468
4469
4470 /* Print the successors indexes of edge E on FILE.  */
4471
4472 static void
4473 print_succ_bbs (FILE *file, basic_block bb)
4474 {
4475   edge e;
4476   edge_iterator ei;
4477
4478   FOR_EACH_EDGE (e, ei, bb->succs)
4479     fprintf (file, "bb_%d", e->src->index);
4480 }
4481
4482
4483 /* Pretty print LOOP on FILE, indented INDENT spaces.  */
4484
4485 static void
4486 print_loop (FILE *file, struct loop *loop, int indent)
4487 {
4488   char *s_indent;
4489   basic_block bb;
4490   
4491   if (loop == NULL)
4492     return;
4493
4494   s_indent = (char *) alloca ((size_t) indent + 1);
4495   memset ((void *) s_indent, ' ', (size_t) indent);
4496   s_indent[indent] = '\0';
4497
4498   /* Print the loop's header.  */
4499   fprintf (file, "%sloop_%d\n", s_indent, loop->num);
4500   
4501   /* Print the loop's body.  */
4502   fprintf (file, "%s{\n", s_indent);
4503   FOR_EACH_BB (bb)
4504     if (bb->loop_father == loop)
4505       {
4506         /* Print the basic_block's header.  */
4507         fprintf (file, "%s  bb_%d (preds = {", s_indent, bb->index);
4508         print_pred_bbs (file, bb);
4509         fprintf (file, "}, succs = {");
4510         print_succ_bbs (file, bb);
4511         fprintf (file, "})\n");
4512         
4513         /* Print the basic_block's body.  */
4514         fprintf (file, "%s  {\n", s_indent);
4515         tree_dump_bb (bb, file, indent + 4);
4516         fprintf (file, "%s  }\n", s_indent);
4517       }
4518   
4519   print_loop (file, loop->inner, indent + 2);
4520   fprintf (file, "%s}\n", s_indent);
4521   print_loop (file, loop->next, indent);
4522 }
4523
4524
4525 /* Follow a CFG edge from the entry point of the program, and on entry
4526    of a loop, pretty print the loop structure on FILE.  */
4527
4528 void 
4529 print_loop_ir (FILE *file)
4530 {
4531   basic_block bb;
4532   
4533   bb = BASIC_BLOCK (0);
4534   if (bb && bb->loop_father)
4535     print_loop (file, bb->loop_father, 0);
4536 }
4537
4538
4539 /* Debugging loops structure at tree level.  */
4540
4541 void 
4542 debug_loop_ir (void)
4543 {
4544   print_loop_ir (stderr);
4545 }
4546
4547
4548 /* Return true if BB ends with a call, possibly followed by some
4549    instructions that must stay with the call.  Return false,
4550    otherwise.  */
4551
4552 static bool
4553 tree_block_ends_with_call_p (basic_block bb)
4554 {
4555   block_stmt_iterator bsi = bsi_last (bb);
4556   return get_call_expr_in (bsi_stmt (bsi)) != NULL;
4557 }
4558
4559
4560 /* Return true if BB ends with a conditional branch.  Return false,
4561    otherwise.  */
4562
4563 static bool
4564 tree_block_ends_with_condjump_p (basic_block bb)
4565 {
4566   tree stmt = last_stmt (bb);
4567   return (stmt && TREE_CODE (stmt) == COND_EXPR);
4568 }
4569
4570
4571 /* Return true if we need to add fake edge to exit at statement T.
4572    Helper function for tree_flow_call_edges_add.  */
4573
4574 static bool
4575 need_fake_edge_p (tree t)
4576 {
4577   tree call;
4578
4579   /* NORETURN and LONGJMP calls already have an edge to exit.
4580      CONST and PURE calls do not need one.
4581      We don't currently check for CONST and PURE here, although
4582      it would be a good idea, because those attributes are
4583      figured out from the RTL in mark_constant_function, and
4584      the counter incrementation code from -fprofile-arcs
4585      leads to different results from -fbranch-probabilities.  */
4586   call = get_call_expr_in (t);
4587   if (call
4588       && !(call_expr_flags (call) & ECF_NORETURN))
4589     return true;
4590
4591   if (TREE_CODE (t) == ASM_EXPR
4592        && (ASM_VOLATILE_P (t) || ASM_INPUT_P (t)))
4593     return true;
4594
4595   return false;
4596 }
4597
4598
4599 /* Add fake edges to the function exit for any non constant and non
4600    noreturn calls, volatile inline assembly in the bitmap of blocks
4601    specified by BLOCKS or to the whole CFG if BLOCKS is zero.  Return
4602    the number of blocks that were split.
4603
4604    The goal is to expose cases in which entering a basic block does
4605    not imply that all subsequent instructions must be executed.  */
4606
4607 static int
4608 tree_flow_call_edges_add (sbitmap blocks)
4609 {
4610   int i;
4611   int blocks_split = 0;
4612   int last_bb = last_basic_block;
4613   bool check_last_block = false;
4614
4615   if (n_basic_blocks == 0)
4616     return 0;
4617
4618   if (! blocks)
4619     check_last_block = true;
4620   else
4621     check_last_block = TEST_BIT (blocks, EXIT_BLOCK_PTR->prev_bb->index);
4622
4623   /* In the last basic block, before epilogue generation, there will be
4624      a fallthru edge to EXIT.  Special care is required if the last insn
4625      of the last basic block is a call because make_edge folds duplicate
4626      edges, which would result in the fallthru edge also being marked
4627      fake, which would result in the fallthru edge being removed by
4628      remove_fake_edges, which would result in an invalid CFG.
4629
4630      Moreover, we can't elide the outgoing fake edge, since the block
4631      profiler needs to take this into account in order to solve the minimal
4632      spanning tree in the case that the call doesn't return.
4633
4634      Handle this by adding a dummy instruction in a new last basic block.  */
4635   if (check_last_block)
4636     {
4637       basic_block bb = EXIT_BLOCK_PTR->prev_bb;
4638       block_stmt_iterator bsi = bsi_last (bb);
4639       tree t = NULL_TREE;
4640       if (!bsi_end_p (bsi))
4641         t = bsi_stmt (bsi);
4642
4643       if (need_fake_edge_p (t))
4644         {
4645           edge e;
4646
4647           e = find_edge (bb, EXIT_BLOCK_PTR);
4648           if (e)
4649             {
4650               bsi_insert_on_edge (e, build_empty_stmt ());
4651               bsi_commit_edge_inserts ();
4652             }
4653         }
4654     }
4655
4656   /* Now add fake edges to the function exit for any non constant
4657      calls since there is no way that we can determine if they will
4658      return or not...  */
4659   for (i = 0; i < last_bb; i++)
4660     {
4661       basic_block bb = BASIC_BLOCK (i);
4662       block_stmt_iterator bsi;
4663       tree stmt, last_stmt;
4664
4665       if (!bb)
4666         continue;
4667
4668       if (blocks && !TEST_BIT (blocks, i))
4669         continue;
4670
4671       bsi = bsi_last (bb);
4672       if (!bsi_end_p (bsi))
4673         {
4674           last_stmt = bsi_stmt (bsi);
4675           do
4676             {
4677               stmt = bsi_stmt (bsi);
4678               if (need_fake_edge_p (stmt))
4679                 {
4680                   edge e;
4681                   /* The handling above of the final block before the
4682                      epilogue should be enough to verify that there is
4683                      no edge to the exit block in CFG already.
4684                      Calling make_edge in such case would cause us to
4685                      mark that edge as fake and remove it later.  */
4686 #ifdef ENABLE_CHECKING
4687                   if (stmt == last_stmt)
4688                     {
4689                       e = find_edge (bb, EXIT_BLOCK_PTR);
4690                       gcc_assert (e == NULL);
4691                     }
4692 #endif
4693
4694                   /* Note that the following may create a new basic block
4695                      and renumber the existing basic blocks.  */
4696                   if (stmt != last_stmt)
4697                     {
4698                       e = split_block (bb, stmt);
4699                       if (e)
4700                         blocks_split++;
4701                     }
4702                   make_edge (bb, EXIT_BLOCK_PTR, EDGE_FAKE);
4703                 }
4704               bsi_prev (&bsi);
4705             }
4706           while (!bsi_end_p (bsi));
4707         }
4708     }
4709
4710   if (blocks_split)
4711     verify_flow_info ();
4712
4713   return blocks_split;
4714 }
4715
4716 bool
4717 tree_purge_dead_eh_edges (basic_block bb)
4718 {
4719   bool changed = false;
4720   edge e;
4721   edge_iterator ei;
4722   tree stmt = last_stmt (bb);
4723
4724   if (stmt && tree_can_throw_internal (stmt))
4725     return false;
4726
4727   for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
4728     {
4729       if (e->flags & EDGE_EH)
4730         {
4731           remove_edge (e);
4732           changed = true;
4733         }
4734       else
4735         ei_next (&ei);
4736     }
4737
4738   /* Removal of dead EH edges might change dominators of not
4739      just immediate successors.  E.g. when bb1 is changed so that
4740      it no longer can throw and bb1->bb3 and bb1->bb4 are dead
4741      eh edges purged by this function in:
4742            0
4743           / \
4744          v   v
4745          1-->2
4746         / \  |
4747        v   v |
4748        3-->4 |
4749         \    v
4750          --->5
4751              |
4752              -
4753      idom(bb5) must be recomputed.  For now just free the dominance
4754      info.  */
4755   if (changed)
4756     free_dominance_info (CDI_DOMINATORS);
4757
4758   return changed;
4759 }
4760
4761 bool
4762 tree_purge_all_dead_eh_edges (bitmap blocks)
4763 {
4764   bool changed = false;
4765   unsigned i;
4766   bitmap_iterator bi;
4767
4768   EXECUTE_IF_SET_IN_BITMAP (blocks, 0, i, bi)
4769     {
4770       changed |= tree_purge_dead_eh_edges (BASIC_BLOCK (i));
4771     }
4772
4773   return changed;
4774 }
4775
4776 /* This function is called whenever a new edge is created or
4777    redirected.  */
4778
4779 static void
4780 tree_execute_on_growing_pred (edge e)
4781 {
4782   basic_block bb = e->dest;
4783
4784   if (phi_nodes (bb))
4785     reserve_phi_args_for_new_edge (bb);
4786 }
4787
4788 /* This function is called immediately before edge E is removed from
4789    the edge vector E->dest->preds.  */
4790
4791 static void
4792 tree_execute_on_shrinking_pred (edge e)
4793 {
4794   if (phi_nodes (e->dest))
4795     remove_phi_args (e);
4796 }
4797
4798 /*---------------------------------------------------------------------------
4799   Helper functions for Loop versioning
4800   ---------------------------------------------------------------------------*/
4801
4802 /* Adjust phi nodes for 'first' basic block.  'second' basic block is a copy
4803    of 'first'. Both of them are dominated by 'new_head' basic block. When
4804    'new_head' was created by 'second's incoming edge it received phi arguments
4805    on the edge by split_edge(). Later, additional edge 'e' was created to
4806    connect 'new_head' and 'first'. Now this routine adds phi args on this 
4807    additional edge 'e' that new_head to second edge received as part of edge 
4808    splitting.
4809 */
4810
4811 static void
4812 tree_lv_adjust_loop_header_phi (basic_block first, basic_block second,
4813                                 basic_block new_head, edge e)
4814 {
4815   tree phi1, phi2;
4816   edge e2 = find_edge (new_head, second);
4817
4818   /* Because NEW_HEAD has been created by splitting SECOND's incoming
4819      edge, we should always have an edge from NEW_HEAD to SECOND.  */
4820   gcc_assert (e2 != NULL);
4821
4822   /* Browse all 'second' basic block phi nodes and add phi args to
4823      edge 'e' for 'first' head. PHI args are always in correct order.  */
4824
4825   for (phi2 = phi_nodes (second), phi1 = phi_nodes (first); 
4826        phi2 && phi1; 
4827        phi2 = PHI_CHAIN (phi2),  phi1 = PHI_CHAIN (phi1))
4828     {
4829       tree def = PHI_ARG_DEF (phi2, e2->dest_idx);
4830       add_phi_arg (phi1, def, e);
4831     }
4832 }
4833
4834 /* Adds a if else statement to COND_BB with condition COND_EXPR.  
4835    SECOND_HEAD is the destination of the THEN and FIRST_HEAD is 
4836    the destination of the ELSE part.  */
4837 static void
4838 tree_lv_add_condition_to_bb (basic_block first_head, basic_block second_head,
4839                             basic_block cond_bb, void *cond_e)
4840 {
4841   block_stmt_iterator bsi;
4842   tree goto1 = NULL_TREE;
4843   tree goto2 = NULL_TREE;
4844   tree new_cond_expr = NULL_TREE;
4845   tree cond_expr = (tree) cond_e;
4846   edge e0;
4847
4848   /* Build new conditional expr */
4849   goto1 = build1 (GOTO_EXPR, void_type_node, tree_block_label (first_head));
4850   goto2 = build1 (GOTO_EXPR, void_type_node, tree_block_label (second_head));
4851   new_cond_expr = build3 (COND_EXPR, void_type_node, cond_expr, goto1, goto2);
4852
4853   /* Add new cond in cond_bb.  */ 
4854   bsi = bsi_start (cond_bb); 
4855   bsi_insert_after (&bsi, new_cond_expr, BSI_NEW_STMT);
4856   /* Adjust edges appropriately to connect new head with first head
4857      as well as second head.  */
4858   e0 = single_succ_edge (cond_bb);
4859   e0->flags &= ~EDGE_FALLTHRU;
4860   e0->flags |= EDGE_FALSE_VALUE;
4861 }
4862
4863 struct cfg_hooks tree_cfg_hooks = {
4864   "tree",
4865   tree_verify_flow_info,
4866   tree_dump_bb,                 /* dump_bb  */
4867   create_bb,                    /* create_basic_block  */
4868   tree_redirect_edge_and_branch,/* redirect_edge_and_branch  */
4869   tree_redirect_edge_and_branch_force,/* redirect_edge_and_branch_force  */
4870   remove_bb,                    /* delete_basic_block  */
4871   tree_split_block,             /* split_block  */
4872   tree_move_block_after,        /* move_block_after  */
4873   tree_can_merge_blocks_p,      /* can_merge_blocks_p  */
4874   tree_merge_blocks,            /* merge_blocks  */
4875   tree_predict_edge,            /* predict_edge  */
4876   tree_predicted_by_p,          /* predicted_by_p  */
4877   tree_can_duplicate_bb_p,      /* can_duplicate_block_p  */
4878   tree_duplicate_bb,            /* duplicate_block  */
4879   tree_split_edge,              /* split_edge  */
4880   tree_make_forwarder_block,    /* make_forward_block  */
4881   NULL,                         /* tidy_fallthru_edge  */
4882   tree_block_ends_with_call_p,  /* block_ends_with_call_p */
4883   tree_block_ends_with_condjump_p, /* block_ends_with_condjump_p */
4884   tree_flow_call_edges_add,     /* flow_call_edges_add */
4885   tree_execute_on_growing_pred, /* execute_on_growing_pred */
4886   tree_execute_on_shrinking_pred, /* execute_on_shrinking_pred */
4887   tree_duplicate_loop_to_header_edge, /* duplicate loop for trees */
4888   tree_lv_add_condition_to_bb, /* lv_add_condition_to_bb */
4889   tree_lv_adjust_loop_header_phi, /* lv_adjust_loop_header_phi*/
4890   extract_true_false_edges_from_block, /* extract_cond_bb_edges */
4891   flush_pending_stmts           /* flush_pending_stmts */  
4892 };
4893
4894
4895 /* Split all critical edges.  */
4896
4897 static void
4898 split_critical_edges (void)
4899 {
4900   basic_block bb;
4901   edge e;
4902   edge_iterator ei;
4903
4904   /* split_edge can redirect edges out of SWITCH_EXPRs, which can get
4905      expensive.  So we want to enable recording of edge to CASE_LABEL_EXPR
4906      mappings around the calls to split_edge.  */
4907   start_recording_case_labels ();
4908   FOR_ALL_BB (bb)
4909     {
4910       FOR_EACH_EDGE (e, ei, bb->succs)
4911         if (EDGE_CRITICAL_P (e) && !(e->flags & EDGE_ABNORMAL))
4912           {
4913             split_edge (e);
4914           }
4915     }
4916   end_recording_case_labels ();
4917 }
4918
4919 struct tree_opt_pass pass_split_crit_edges = 
4920 {
4921   "crited",                          /* name */
4922   NULL,                          /* gate */
4923   split_critical_edges,          /* execute */
4924   NULL,                          /* sub */
4925   NULL,                          /* next */
4926   0,                             /* static_pass_number */
4927   TV_TREE_SPLIT_EDGES,           /* tv_id */
4928   PROP_cfg,                      /* properties required */
4929   PROP_no_crit_edges,            /* properties_provided */
4930   0,                             /* properties_destroyed */
4931   0,                             /* todo_flags_start */
4932   TODO_dump_func,                /* todo_flags_finish */
4933   0                              /* letter */
4934 };
4935
4936 \f
4937 /* Return EXP if it is a valid GIMPLE rvalue, else gimplify it into
4938    a temporary, make sure and register it to be renamed if necessary,
4939    and finally return the temporary.  Put the statements to compute
4940    EXP before the current statement in BSI.  */
4941
4942 tree
4943 gimplify_val (block_stmt_iterator *bsi, tree type, tree exp)
4944 {
4945   tree t, new_stmt, orig_stmt;
4946
4947   if (is_gimple_val (exp))
4948     return exp;
4949
4950   t = make_rename_temp (type, NULL);
4951   new_stmt = build (MODIFY_EXPR, type, t, exp);
4952
4953   orig_stmt = bsi_stmt (*bsi);
4954   SET_EXPR_LOCUS (new_stmt, EXPR_LOCUS (orig_stmt));
4955   TREE_BLOCK (new_stmt) = TREE_BLOCK (orig_stmt);
4956
4957   bsi_insert_before (bsi, new_stmt, BSI_SAME_STMT);
4958
4959   return t;
4960 }
4961
4962 /* Build a ternary operation and gimplify it.  Emit code before BSI.
4963    Return the gimple_val holding the result.  */
4964
4965 tree
4966 gimplify_build3 (block_stmt_iterator *bsi, enum tree_code code,
4967                  tree type, tree a, tree b, tree c)
4968 {
4969   tree ret;
4970
4971   ret = fold_build3 (code, type, a, b, c);
4972   STRIP_NOPS (ret);
4973
4974   return gimplify_val (bsi, type, ret);
4975 }
4976
4977 /* Build a binary operation and gimplify it.  Emit code before BSI.
4978    Return the gimple_val holding the result.  */
4979
4980 tree
4981 gimplify_build2 (block_stmt_iterator *bsi, enum tree_code code,
4982                  tree type, tree a, tree b)
4983 {
4984   tree ret;
4985
4986   ret = fold_build2 (code, type, a, b);
4987   STRIP_NOPS (ret);
4988
4989   return gimplify_val (bsi, type, ret);
4990 }
4991
4992 /* Build a unary operation and gimplify it.  Emit code before BSI.
4993    Return the gimple_val holding the result.  */
4994
4995 tree
4996 gimplify_build1 (block_stmt_iterator *bsi, enum tree_code code, tree type,
4997                  tree a)
4998 {
4999   tree ret;
5000
5001   ret = fold_build1 (code, type, a);
5002   STRIP_NOPS (ret);
5003
5004   return gimplify_val (bsi, type, ret);
5005 }
5006
5007
5008 \f
5009 /* Emit return warnings.  */
5010
5011 static void
5012 execute_warn_function_return (void)
5013 {
5014 #ifdef USE_MAPPED_LOCATION
5015   source_location location;
5016 #else
5017   location_t *locus;
5018 #endif
5019   tree last;
5020   edge e;
5021   edge_iterator ei;
5022
5023   /* If we have a path to EXIT, then we do return.  */
5024   if (TREE_THIS_VOLATILE (cfun->decl)
5025       && EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0)
5026     {
5027 #ifdef USE_MAPPED_LOCATION
5028       location = UNKNOWN_LOCATION;
5029 #else
5030       locus = NULL;
5031 #endif
5032       FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
5033         {
5034           last = last_stmt (e->src);
5035           if (TREE_CODE (last) == RETURN_EXPR
5036 #ifdef USE_MAPPED_LOCATION
5037               && (location = EXPR_LOCATION (last)) != UNKNOWN_LOCATION)
5038 #else
5039               && (locus = EXPR_LOCUS (last)) != NULL)
5040 #endif
5041             break;
5042         }
5043 #ifdef USE_MAPPED_LOCATION
5044       if (location == UNKNOWN_LOCATION)
5045         location = cfun->function_end_locus;
5046       warning (0, "%H%<noreturn%> function does return", &location);
5047 #else
5048       if (!locus)
5049         locus = &cfun->function_end_locus;
5050       warning (0, "%H%<noreturn%> function does return", locus);
5051 #endif
5052     }
5053
5054   /* If we see "return;" in some basic block, then we do reach the end
5055      without returning a value.  */
5056   else if (warn_return_type
5057            && !TREE_NO_WARNING (cfun->decl)
5058            && EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0
5059            && !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (cfun->decl))))
5060     {
5061       FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
5062         {
5063           tree last = last_stmt (e->src);
5064           if (TREE_CODE (last) == RETURN_EXPR
5065               && TREE_OPERAND (last, 0) == NULL)
5066             {
5067 #ifdef USE_MAPPED_LOCATION
5068               location = EXPR_LOCATION (last);
5069               if (location == UNKNOWN_LOCATION)
5070                   location = cfun->function_end_locus;
5071               warning (0, "%Hcontrol reaches end of non-void function", &location);
5072 #else
5073               locus = EXPR_LOCUS (last);
5074               if (!locus)
5075                 locus = &cfun->function_end_locus;
5076               warning (0, "%Hcontrol reaches end of non-void function", locus);
5077 #endif
5078               TREE_NO_WARNING (cfun->decl) = 1;
5079               break;
5080             }
5081         }
5082     }
5083 }
5084
5085
5086 /* Given a basic block B which ends with a conditional and has
5087    precisely two successors, determine which of the edges is taken if
5088    the conditional is true and which is taken if the conditional is
5089    false.  Set TRUE_EDGE and FALSE_EDGE appropriately.  */
5090
5091 void
5092 extract_true_false_edges_from_block (basic_block b,
5093                                      edge *true_edge,
5094                                      edge *false_edge)
5095 {
5096   edge e = EDGE_SUCC (b, 0);
5097
5098   if (e->flags & EDGE_TRUE_VALUE)
5099     {
5100       *true_edge = e;
5101       *false_edge = EDGE_SUCC (b, 1);
5102     }
5103   else
5104     {
5105       *false_edge = e;
5106       *true_edge = EDGE_SUCC (b, 1);
5107     }
5108 }
5109
5110 struct tree_opt_pass pass_warn_function_return =
5111 {
5112   NULL,                                 /* name */
5113   NULL,                                 /* gate */
5114   execute_warn_function_return,         /* execute */
5115   NULL,                                 /* sub */
5116   NULL,                                 /* next */
5117   0,                                    /* static_pass_number */
5118   0,                                    /* tv_id */
5119   PROP_cfg,                             /* properties_required */
5120   0,                                    /* properties_provided */
5121   0,                                    /* properties_destroyed */
5122   0,                                    /* todo_flags_start */
5123   0,                                    /* todo_flags_finish */
5124   0                                     /* letter */
5125 };
5126
5127 /* Emit noreturn warnings.  */
5128
5129 static void
5130 execute_warn_function_noreturn (void)
5131 {
5132   if (warn_missing_noreturn
5133       && !TREE_THIS_VOLATILE (cfun->decl)
5134       && EDGE_COUNT (EXIT_BLOCK_PTR->preds) == 0
5135       && !lang_hooks.function.missing_noreturn_ok_p (cfun->decl))
5136     warning (OPT_Wmissing_noreturn, "%Jfunction might be possible candidate "
5137              "for attribute %<noreturn%>",
5138              cfun->decl);
5139 }
5140
5141 struct tree_opt_pass pass_warn_function_noreturn =
5142 {
5143   NULL,                                 /* name */
5144   NULL,                                 /* gate */
5145   execute_warn_function_noreturn,       /* execute */
5146   NULL,                                 /* sub */
5147   NULL,                                 /* next */
5148   0,                                    /* static_pass_number */
5149   0,                                    /* tv_id */
5150   PROP_cfg,                             /* properties_required */
5151   0,                                    /* properties_provided */
5152   0,                                    /* properties_destroyed */
5153   0,                                    /* todo_flags_start */
5154   0,                                    /* todo_flags_finish */
5155   0                                     /* letter */
5156 };