OSDN Git Service

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