OSDN Git Service

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