OSDN Git Service

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