OSDN Git Service

gcc/
[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 (const_tree, const_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 (const_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 (const_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 (const_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 (const_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 (const_tree t, const_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 /* Verifies if EXPR is a valid GIMPLE unary expression.  Returns true
3349    if there is an error, otherwise false.  */
3350
3351 static bool
3352 verify_gimple_unary_expr (tree expr)
3353 {
3354   tree op = TREE_OPERAND (expr, 0);
3355   tree type = TREE_TYPE (expr);
3356
3357   if (!is_gimple_val (op))
3358     {
3359       error ("invalid operand in unary expression");
3360       return true;
3361     }
3362
3363   /* For general unary expressions we have the operations type
3364      as the effective type the operation is carried out on.  So all
3365      we need to require is that the operand is trivially convertible
3366      to that type.  */
3367   if (!useless_type_conversion_p (type, TREE_TYPE (op)))
3368     {
3369       error ("type mismatch in unary expression");
3370       debug_generic_expr (type);
3371       debug_generic_expr (TREE_TYPE (op));
3372       return true;
3373     }
3374
3375   return false;
3376 }
3377
3378 /* Verifies if EXPR is a valid GIMPLE binary expression.  Returns true
3379    if there is an error, otherwise false.  */
3380
3381 static bool
3382 verify_gimple_binary_expr (tree expr)
3383 {
3384   tree op0 = TREE_OPERAND (expr, 0);
3385   tree op1 = TREE_OPERAND (expr, 1);
3386   tree type = TREE_TYPE (expr);
3387
3388   if (!is_gimple_val (op0) || !is_gimple_val (op1))
3389     {
3390       error ("invalid operands in binary expression");
3391       return true;
3392     }
3393
3394   /* For general binary expressions we have the operations type
3395      as the effective type the operation is carried out on.  So all
3396      we need to require is that both operands are trivially convertible
3397      to that type.  */
3398   if (!useless_type_conversion_p (type, TREE_TYPE (op0))
3399       || !useless_type_conversion_p (type, TREE_TYPE (op1)))
3400     {
3401       error ("type mismatch in binary expression");
3402       debug_generic_stmt (type);
3403       debug_generic_stmt (TREE_TYPE (op0));
3404       debug_generic_stmt (TREE_TYPE (op1));
3405       return true;
3406     }
3407
3408   return false;
3409 }
3410
3411 /* Verify if EXPR is either a GIMPLE ID or a GIMPLE indirect reference.
3412    Returns true if there is an error, otherwise false.  */
3413
3414 static bool
3415 verify_gimple_min_lval (tree expr)
3416 {
3417   tree op;
3418
3419   if (is_gimple_id (expr))
3420     return false;
3421
3422   if (TREE_CODE (expr) != INDIRECT_REF
3423       && TREE_CODE (expr) != ALIGN_INDIRECT_REF
3424       && TREE_CODE (expr) != MISALIGNED_INDIRECT_REF)
3425     {
3426       error ("invalid expression for min lvalue");
3427       return true;
3428     }
3429
3430   op = TREE_OPERAND (expr, 0);
3431   if (!is_gimple_val (op))
3432     {
3433       error ("invalid operand in indirect reference");
3434       debug_generic_stmt (op);
3435       return true;
3436     }
3437   if (!useless_type_conversion_p (TREE_TYPE (expr),
3438                                   TREE_TYPE (TREE_TYPE (op))))
3439     {
3440       error ("type mismatch in indirect reference");
3441       debug_generic_stmt (TREE_TYPE (expr));
3442       debug_generic_stmt (TREE_TYPE (TREE_TYPE (op)));
3443       return true;
3444     }
3445
3446   return false;
3447 }
3448
3449 /* Verify if EXPR is a valid GIMPLE reference expression.  Returns true
3450    if there is an error, otherwise false.  */
3451
3452 static bool
3453 verify_gimple_reference (tree expr)
3454 {
3455   while (handled_component_p (expr))
3456     {
3457       tree op = TREE_OPERAND (expr, 0);
3458
3459       if (TREE_CODE (expr) == ARRAY_REF
3460           || TREE_CODE (expr) == ARRAY_RANGE_REF)
3461         {
3462           if (!is_gimple_val (TREE_OPERAND (expr, 1))
3463               || (TREE_OPERAND (expr, 2)
3464                   && !is_gimple_val (TREE_OPERAND (expr, 2)))
3465               || (TREE_OPERAND (expr, 3)
3466                   && !is_gimple_val (TREE_OPERAND (expr, 3))))
3467             {
3468               error ("invalid operands to array reference");
3469               debug_generic_stmt (expr);
3470               return true;
3471             }
3472         }
3473
3474       /* Verify if the reference array element types are compatible.  */
3475       if (TREE_CODE (expr) == ARRAY_REF
3476           && !useless_type_conversion_p (TREE_TYPE (expr),
3477                                          TREE_TYPE (TREE_TYPE (op))))
3478         {
3479           error ("type mismatch in array reference");
3480           debug_generic_stmt (TREE_TYPE (expr));
3481           debug_generic_stmt (TREE_TYPE (TREE_TYPE (op)));
3482           return true;
3483         }
3484       if (TREE_CODE (expr) == ARRAY_RANGE_REF
3485           && !useless_type_conversion_p (TREE_TYPE (TREE_TYPE (expr)),
3486                                          TREE_TYPE (TREE_TYPE (op))))
3487         {
3488           error ("type mismatch in array range reference");
3489           debug_generic_stmt (TREE_TYPE (TREE_TYPE (expr)));
3490           debug_generic_stmt (TREE_TYPE (TREE_TYPE (op)));
3491           return true;
3492         }
3493
3494       if ((TREE_CODE (expr) == REALPART_EXPR
3495            || TREE_CODE (expr) == IMAGPART_EXPR)
3496           && !useless_type_conversion_p (TREE_TYPE (expr),
3497                                          TREE_TYPE (TREE_TYPE (op))))
3498         {
3499           error ("type mismatch in real/imagpart reference");
3500           debug_generic_stmt (TREE_TYPE (expr));
3501           debug_generic_stmt (TREE_TYPE (TREE_TYPE (op)));
3502           return true;
3503         }
3504
3505       if (TREE_CODE (expr) == COMPONENT_REF
3506           && !useless_type_conversion_p (TREE_TYPE (expr),
3507                                          TREE_TYPE (TREE_OPERAND (expr, 1))))
3508         {
3509           error ("type mismatch in component reference");
3510           debug_generic_stmt (TREE_TYPE (expr));
3511           debug_generic_stmt (TREE_TYPE (TREE_OPERAND (expr, 1)));
3512           return true;
3513         }
3514
3515       /* For VIEW_CONVERT_EXPRs which are allowed here, too, there
3516          is nothing to verify.  Gross mismatches at most invoke
3517          undefined behavior.  */
3518
3519       expr = op;
3520     }
3521
3522   return verify_gimple_min_lval (expr);
3523 }
3524
3525 /* Verify the GIMPLE expression EXPR.  Returns true if there is an
3526    error, otherwise false.  */
3527
3528 static bool
3529 verify_gimple_expr (tree expr)
3530 {
3531   tree type = TREE_TYPE (expr);
3532
3533   if (is_gimple_val (expr))
3534     return false;
3535
3536   /* Special codes we cannot handle via their class.  */
3537   switch (TREE_CODE (expr))
3538     {
3539     case NOP_EXPR:
3540     case CONVERT_EXPR:
3541       {
3542         tree op = TREE_OPERAND (expr, 0);
3543         if (!is_gimple_val (op))
3544           {
3545             error ("invalid operand in conversion");
3546             return true;
3547           }
3548
3549         /* Allow conversions between integral types.  */
3550         if (INTEGRAL_TYPE_P (type) == INTEGRAL_TYPE_P (TREE_TYPE (op)))
3551           return false;
3552
3553         /* Allow conversions between integral types and pointers only if
3554            there is no sign or zero extension involved.  */
3555         if (((POINTER_TYPE_P (type) && INTEGRAL_TYPE_P (TREE_TYPE (op)))
3556              || (POINTER_TYPE_P (TREE_TYPE (op)) && INTEGRAL_TYPE_P (type)))
3557             && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (op)))
3558           return false;
3559
3560         /* Allow conversion from integer to offset type and vice versa.  */
3561         if ((TREE_CODE (type) == OFFSET_TYPE
3562              && TREE_CODE (TREE_TYPE (op)) == INTEGER_TYPE)
3563             || (TREE_CODE (type) == INTEGER_TYPE
3564                 && TREE_CODE (TREE_TYPE (op)) == OFFSET_TYPE))
3565           return false;
3566
3567         /* Otherwise assert we are converting between types of the
3568            same kind.  */
3569         if (TREE_CODE (type) != TREE_CODE (TREE_TYPE (op)))
3570           {
3571             error ("invalid types in nop conversion");
3572             debug_generic_expr (type);
3573             debug_generic_expr (TREE_TYPE (op));
3574             return true;
3575           }
3576
3577         return false;
3578       }
3579
3580     case FLOAT_EXPR:
3581       {
3582         tree op = TREE_OPERAND (expr, 0);
3583         if (!is_gimple_val (op))
3584           {
3585             error ("invalid operand in int to float conversion");
3586             return true;
3587           }
3588         if (!INTEGRAL_TYPE_P (TREE_TYPE (op))
3589             || !SCALAR_FLOAT_TYPE_P (type))
3590           {
3591             error ("invalid types in conversion to floating point");
3592             debug_generic_expr (type);
3593             debug_generic_expr (TREE_TYPE (op));
3594             return true;
3595           }
3596         return false;
3597       }
3598
3599     case FIX_TRUNC_EXPR:
3600       {
3601         tree op = TREE_OPERAND (expr, 0);
3602         if (!is_gimple_val (op))
3603           {
3604             error ("invalid operand in float to int conversion");
3605             return true;
3606           }
3607         if (!INTEGRAL_TYPE_P (type)
3608             || !SCALAR_FLOAT_TYPE_P (TREE_TYPE (op)))
3609           {
3610             error ("invalid types in conversion to integer");
3611             debug_generic_expr (type);
3612             debug_generic_expr (TREE_TYPE (op));
3613             return true;
3614           }
3615         return false;
3616       }
3617
3618     case COMPLEX_EXPR:
3619       {
3620         tree op0 = TREE_OPERAND (expr, 0);
3621         tree op1 = TREE_OPERAND (expr, 1);
3622         if (!is_gimple_val (op0) || !is_gimple_val (op1))
3623           {
3624             error ("invalid operands in complex expression");
3625             return true;
3626           }
3627         if (!TREE_CODE (type) == COMPLEX_TYPE
3628             || !(TREE_CODE (TREE_TYPE (op0)) == INTEGER_TYPE
3629                  || SCALAR_FLOAT_TYPE_P (TREE_TYPE (op0)))
3630             || !(TREE_CODE (TREE_TYPE (op1)) == INTEGER_TYPE
3631                  || SCALAR_FLOAT_TYPE_P (TREE_TYPE (op1)))
3632             || !useless_type_conversion_p (TREE_TYPE (type),
3633                                            TREE_TYPE (op0))
3634             || !useless_type_conversion_p (TREE_TYPE (type),
3635                                            TREE_TYPE (op1)))
3636           {
3637             error ("type mismatch in complex expression");
3638             debug_generic_stmt (TREE_TYPE (expr));
3639             debug_generic_stmt (TREE_TYPE (op0));
3640             debug_generic_stmt (TREE_TYPE (op1));
3641             return true;
3642           }
3643         return false;
3644       }
3645
3646     case CONSTRUCTOR:
3647       {
3648         /* This is used like COMPLEX_EXPR but for vectors.  */
3649         if (TREE_CODE (type) != VECTOR_TYPE)
3650           {
3651             error ("constructor not allowed for non-vector types");
3652             debug_generic_stmt (type);
3653             return true;
3654           }
3655         /* FIXME: verify constructor arguments.  */
3656         return false;
3657       }
3658
3659     case LSHIFT_EXPR:
3660     case RSHIFT_EXPR:
3661     case LROTATE_EXPR:
3662     case RROTATE_EXPR:
3663       {
3664         tree op0 = TREE_OPERAND (expr, 0);
3665         tree op1 = TREE_OPERAND (expr, 1);
3666         if (!is_gimple_val (op0) || !is_gimple_val (op1))
3667           {
3668             error ("invalid operands in shift expression");
3669             return true;
3670           }
3671         if (!TREE_CODE (TREE_TYPE (op1)) == INTEGER_TYPE
3672             || !useless_type_conversion_p (type, TREE_TYPE (op0)))
3673           {
3674             error ("type mismatch in shift expression");
3675             debug_generic_stmt (TREE_TYPE (expr));
3676             debug_generic_stmt (TREE_TYPE (op0));
3677             debug_generic_stmt (TREE_TYPE (op1));
3678             return true;
3679           }
3680         return false;
3681       }
3682
3683     case PLUS_EXPR:
3684     case MINUS_EXPR:
3685       {
3686         tree op0 = TREE_OPERAND (expr, 0);
3687         tree op1 = TREE_OPERAND (expr, 1);
3688         if (POINTER_TYPE_P (type)
3689             || POINTER_TYPE_P (TREE_TYPE (op0))
3690             || POINTER_TYPE_P (TREE_TYPE (op1)))
3691           {
3692             error ("invalid (pointer) operands to plus/minus");
3693             return true;
3694           }
3695         /* Continue with generic binary expression handling.  */
3696         break;
3697       }
3698
3699     case POINTER_PLUS_EXPR:
3700       {
3701         tree op0 = TREE_OPERAND (expr, 0);
3702         tree op1 = TREE_OPERAND (expr, 1);
3703         if (!is_gimple_val (op0) || !is_gimple_val (op1))
3704           {
3705             error ("invalid operands in pointer plus expression");
3706             return true;
3707           }
3708         if (!POINTER_TYPE_P (TREE_TYPE (op0))
3709             || TREE_CODE (TREE_TYPE (op1)) != INTEGER_TYPE
3710             || !useless_type_conversion_p (type, TREE_TYPE (op0))
3711             || !useless_type_conversion_p (sizetype, TREE_TYPE (op1)))
3712           {
3713             error ("type mismatch in pointer plus expression");
3714             debug_generic_stmt (type);
3715             debug_generic_stmt (TREE_TYPE (op0));
3716             debug_generic_stmt (TREE_TYPE (op1));
3717             return true;
3718           }
3719         return false;
3720       }
3721
3722     case COND_EXPR:
3723       {
3724         tree op0 = TREE_OPERAND (expr, 0);
3725         tree op1 = TREE_OPERAND (expr, 1);
3726         tree op2 = TREE_OPERAND (expr, 2);
3727         if ((!is_gimple_val (op1)
3728              && TREE_CODE (TREE_TYPE (op1)) != VOID_TYPE)
3729             || (!is_gimple_val (op2)
3730                 && TREE_CODE (TREE_TYPE (op2)) != VOID_TYPE))
3731           {
3732             error ("invalid operands in conditional expression");
3733             return true;
3734           }
3735         if (!INTEGRAL_TYPE_P (TREE_TYPE (op0))
3736             || (TREE_CODE (TREE_TYPE (op1)) != VOID_TYPE
3737                 && !useless_type_conversion_p (type, TREE_TYPE (op1)))
3738             || (TREE_CODE (TREE_TYPE (op2)) != VOID_TYPE
3739                 && !useless_type_conversion_p (type, TREE_TYPE (op2))))
3740           {
3741             error ("type mismatch in conditional expression");
3742             debug_generic_stmt (type);
3743             debug_generic_stmt (TREE_TYPE (op0));
3744             debug_generic_stmt (TREE_TYPE (op1));
3745             debug_generic_stmt (TREE_TYPE (op2));
3746             return true;
3747           }
3748         return verify_gimple_expr (op0);
3749       }
3750
3751     case ADDR_EXPR:
3752       {
3753         tree op = TREE_OPERAND (expr, 0);
3754         tree ptr_type;
3755         if (!is_gimple_addressable (op))
3756           {
3757             error ("invalid operand in unary expression");
3758             return true;
3759           }
3760         ptr_type = build_pointer_type (TREE_TYPE (op));
3761         if (!useless_type_conversion_p (type, ptr_type)
3762             /* FIXME: a longstanding wart, &a == &a[0].  */
3763             && (TREE_CODE (TREE_TYPE (op)) != ARRAY_TYPE
3764                 || !useless_type_conversion_p (type,
3765                         build_pointer_type (TREE_TYPE (TREE_TYPE (op))))))
3766           {
3767             error ("type mismatch in address expression");
3768             debug_generic_stmt (TREE_TYPE (expr));
3769             debug_generic_stmt (ptr_type);
3770             return true;
3771           }
3772
3773         return verify_gimple_reference (op);
3774       }
3775
3776     case TRUTH_ANDIF_EXPR:
3777     case TRUTH_ORIF_EXPR:
3778     case TRUTH_AND_EXPR:
3779     case TRUTH_OR_EXPR:
3780     case TRUTH_XOR_EXPR:
3781       {
3782         tree op0 = TREE_OPERAND (expr, 0);
3783         tree op1 = TREE_OPERAND (expr, 1);
3784
3785         if (!is_gimple_val (op0) || !is_gimple_val (op1))
3786           {
3787             error ("invalid operands in truth expression");
3788             return true;
3789           }
3790
3791         /* We allow any kind of integral typed argument and result.  */
3792         if (!INTEGRAL_TYPE_P (TREE_TYPE (op0))
3793             || !INTEGRAL_TYPE_P (TREE_TYPE (op1))
3794             || !INTEGRAL_TYPE_P (type))
3795           {
3796             error ("type mismatch in binary truth expression");
3797             debug_generic_stmt (type);
3798             debug_generic_stmt (TREE_TYPE (op0));
3799             debug_generic_stmt (TREE_TYPE (op1));
3800             return true;
3801           }
3802
3803         return false;
3804       }
3805
3806     case TRUTH_NOT_EXPR:
3807       {
3808         tree op = TREE_OPERAND (expr, 0);
3809
3810         if (!is_gimple_val (op))
3811           {
3812             error ("invalid operand in unary not");
3813             return true;
3814           }
3815
3816         /* For TRUTH_NOT_EXPR we can have any kind of integral
3817            typed arguments and results.  */
3818         if (!INTEGRAL_TYPE_P (TREE_TYPE (op))
3819             || !INTEGRAL_TYPE_P (type))
3820           {
3821             error ("type mismatch in not expression");
3822             debug_generic_expr (TREE_TYPE (expr));
3823             debug_generic_expr (TREE_TYPE (op));
3824             return true;
3825           }
3826
3827         return false;
3828       }
3829
3830     case CALL_EXPR:
3831       /* FIXME.  The C frontend passes unpromoted arguments in case it
3832          didn't see a function declaration before the call.  */
3833       return false;
3834
3835     default:;
3836     }
3837
3838   /* Generic handling via classes.  */
3839   switch (TREE_CODE_CLASS (TREE_CODE (expr)))
3840     {
3841     case tcc_unary:
3842       return verify_gimple_unary_expr (expr);
3843
3844     case tcc_binary:
3845       return verify_gimple_binary_expr (expr);
3846
3847     case tcc_reference:
3848       return verify_gimple_reference (expr);
3849
3850     case tcc_comparison:
3851       {
3852         tree op0 = TREE_OPERAND (expr, 0);
3853         tree op1 = TREE_OPERAND (expr, 1);
3854         if (!is_gimple_val (op0) || !is_gimple_val (op1))
3855           {
3856             error ("invalid operands in comparison expression");
3857             return true;
3858           }
3859         /* For comparisons we do not have the operations type as the
3860            effective type the comparison is carried out in.  Instead
3861            we require that either the first operand is trivially
3862            convertible into the second, or the other way around.
3863            The resulting type of a comparison may be any integral type.
3864            Because we special-case pointers to void we allow
3865            comparisons of pointers with the same mode as well.  */
3866         if ((!useless_type_conversion_p (TREE_TYPE (op0), TREE_TYPE (op1))
3867              && !useless_type_conversion_p (TREE_TYPE (op1), TREE_TYPE (op0))
3868              && (!POINTER_TYPE_P (TREE_TYPE (op0))
3869                  || !POINTER_TYPE_P (TREE_TYPE (op1))
3870                  || TYPE_MODE (TREE_TYPE (op0)) != TYPE_MODE (TREE_TYPE (op1))))
3871             || !INTEGRAL_TYPE_P (type))
3872           {
3873             error ("type mismatch in comparison expression");
3874             debug_generic_stmt (TREE_TYPE (expr));
3875             debug_generic_stmt (TREE_TYPE (op0));
3876             debug_generic_stmt (TREE_TYPE (op1));
3877             return true;
3878           }
3879         break;
3880       }
3881
3882     default:
3883       gcc_unreachable ();
3884     }
3885
3886   return false;
3887 }
3888
3889 /* Verify the GIMPLE assignment statement STMT.  Returns true if there
3890    is an error, otherwise false.  */
3891
3892 static bool
3893 verify_gimple_modify_stmt (tree stmt)
3894 {
3895   tree lhs = GIMPLE_STMT_OPERAND (stmt, 0);
3896   tree rhs = GIMPLE_STMT_OPERAND (stmt, 1);
3897
3898   gcc_assert (TREE_CODE (stmt) == GIMPLE_MODIFY_STMT);
3899
3900   if (!useless_type_conversion_p (TREE_TYPE (lhs),
3901                                   TREE_TYPE (rhs)))
3902     {
3903       error ("non-trivial conversion at assignment");
3904       debug_generic_expr (TREE_TYPE (lhs));
3905       debug_generic_expr (TREE_TYPE (rhs));
3906       return true;
3907     }
3908
3909   /* Loads/stores from/to a variable are ok.  */
3910   if ((is_gimple_val (lhs)
3911        && is_gimple_variable (rhs))
3912       || (is_gimple_val (rhs)
3913           && is_gimple_variable (lhs)))
3914     return false;
3915
3916   /* Aggregate copies are ok.  */
3917   if (!is_gimple_reg_type (TREE_TYPE (lhs))
3918       && !is_gimple_reg_type (TREE_TYPE (rhs)))
3919     return false;
3920
3921   /* We might get 'loads' from a parameter which is not a gimple value.  */
3922   if (TREE_CODE (rhs) == PARM_DECL)
3923     return verify_gimple_expr (lhs);
3924
3925   if (!is_gimple_variable (lhs)
3926       && verify_gimple_expr (lhs))
3927     return true;
3928
3929   if (!is_gimple_variable (rhs)
3930       && verify_gimple_expr (rhs))
3931     return true;
3932
3933   return false;
3934 }
3935
3936 /* Verify the GIMPLE statement STMT.  Returns true if there is an
3937    error, otherwise false.  */
3938
3939 static bool
3940 verify_gimple_stmt (tree stmt)
3941 {
3942   if (!is_gimple_stmt (stmt))
3943     {
3944       error ("is not a valid GIMPLE statement");
3945       return true;
3946     }
3947
3948   if (OMP_DIRECTIVE_P (stmt))
3949     {
3950       /* OpenMP directives are validated by the FE and never operated
3951          on by the optimizers.  Furthermore, OMP_FOR may contain
3952          non-gimple expressions when the main index variable has had
3953          its address taken.  This does not affect the loop itself
3954          because the header of an OMP_FOR is merely used to determine
3955          how to setup the parallel iteration.  */
3956       return false;
3957     }
3958
3959   switch (TREE_CODE (stmt))
3960     {
3961     case GIMPLE_MODIFY_STMT:
3962       return verify_gimple_modify_stmt (stmt);
3963
3964     case GOTO_EXPR:
3965     case LABEL_EXPR:
3966       return false;
3967
3968     case SWITCH_EXPR:
3969       if (!is_gimple_val (TREE_OPERAND (stmt, 0)))
3970         {
3971           error ("invalid operand to switch statement");
3972           debug_generic_expr (TREE_OPERAND (stmt, 0));
3973         }
3974       return false;
3975
3976     case RETURN_EXPR:
3977       {
3978         tree op = TREE_OPERAND (stmt, 0);
3979
3980         if (TREE_CODE (TREE_TYPE (stmt)) != VOID_TYPE)
3981           {
3982             error ("type error in return expression");
3983             return true;
3984           }
3985
3986         if (op == NULL_TREE
3987             || TREE_CODE (op) == RESULT_DECL)
3988           return false;
3989
3990         return verify_gimple_modify_stmt (op);
3991       }
3992
3993     case CALL_EXPR:
3994     case COND_EXPR:
3995       return verify_gimple_expr (stmt);
3996
3997     case NOP_EXPR:
3998     case CHANGE_DYNAMIC_TYPE_EXPR:
3999     case ASM_EXPR:
4000       return false;
4001
4002     default:
4003       gcc_unreachable ();
4004     }
4005 }
4006
4007 /* Verify the GIMPLE statements inside the statement list STMTS.  */
4008
4009 void
4010 verify_gimple_1 (tree stmts)
4011 {
4012   tree_stmt_iterator tsi;
4013
4014   for (tsi = tsi_start (stmts); !tsi_end_p (tsi); tsi_next (&tsi))
4015     {
4016       tree stmt = tsi_stmt (tsi);
4017
4018       switch (TREE_CODE (stmt))
4019         {
4020         case BIND_EXPR:
4021           verify_gimple_1 (BIND_EXPR_BODY (stmt));
4022           break;
4023
4024         case TRY_CATCH_EXPR:
4025         case TRY_FINALLY_EXPR:
4026           verify_gimple_1 (TREE_OPERAND (stmt, 0));
4027           verify_gimple_1 (TREE_OPERAND (stmt, 1));
4028           break;
4029
4030         case CATCH_EXPR:
4031           verify_gimple_1 (CATCH_BODY (stmt));
4032           break;
4033
4034         case EH_FILTER_EXPR:
4035           verify_gimple_1 (EH_FILTER_FAILURE (stmt));
4036           break;
4037
4038         default:
4039           if (verify_gimple_stmt (stmt))
4040             debug_generic_expr (stmt);
4041         }
4042     }
4043 }
4044
4045 /* Verify the GIMPLE statements inside the current function.  */
4046
4047 void
4048 verify_gimple (void)
4049 {
4050   verify_gimple_1 (BIND_EXPR_BODY (DECL_SAVED_TREE (cfun->decl)));
4051 }
4052
4053 /* Verify STMT, return true if STMT is not in GIMPLE form.
4054    TODO: Implement type checking.  */
4055
4056 static bool
4057 verify_stmt (tree stmt, bool last_in_block)
4058 {
4059   tree addr;
4060
4061   if (OMP_DIRECTIVE_P (stmt))
4062     {
4063       /* OpenMP directives are validated by the FE and never operated
4064          on by the optimizers.  Furthermore, OMP_FOR may contain
4065          non-gimple expressions when the main index variable has had
4066          its address taken.  This does not affect the loop itself
4067          because the header of an OMP_FOR is merely used to determine
4068          how to setup the parallel iteration.  */
4069       return false;
4070     }
4071
4072   if (!is_gimple_stmt (stmt))
4073     {
4074       error ("is not a valid GIMPLE statement");
4075       goto fail;
4076     }
4077
4078   addr = walk_tree (&stmt, verify_expr, NULL, NULL);
4079   if (addr)
4080     {
4081       debug_generic_stmt (addr);
4082       return true;
4083     }
4084
4085   /* If the statement is marked as part of an EH region, then it is
4086      expected that the statement could throw.  Verify that when we
4087      have optimizations that simplify statements such that we prove
4088      that they cannot throw, that we update other data structures
4089      to match.  */
4090   if (lookup_stmt_eh_region (stmt) >= 0)
4091     {
4092       if (!tree_could_throw_p (stmt))
4093         {
4094           error ("statement marked for throw, but doesn%'t");
4095           goto fail;
4096         }
4097       if (!last_in_block && tree_can_throw_internal (stmt))
4098         {
4099           error ("statement marked for throw in middle of block");
4100           goto fail;
4101         }
4102     }
4103
4104   return false;
4105
4106  fail:
4107   debug_generic_stmt (stmt);
4108   return true;
4109 }
4110
4111
4112 /* Return true when the T can be shared.  */
4113
4114 static bool
4115 tree_node_can_be_shared (tree t)
4116 {
4117   if (IS_TYPE_OR_DECL_P (t)
4118       || is_gimple_min_invariant (t)
4119       || TREE_CODE (t) == SSA_NAME
4120       || t == error_mark_node
4121       || TREE_CODE (t) == IDENTIFIER_NODE)
4122     return true;
4123
4124   if (TREE_CODE (t) == CASE_LABEL_EXPR)
4125     return true;
4126
4127   while (((TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
4128            && is_gimple_min_invariant (TREE_OPERAND (t, 1)))
4129          || TREE_CODE (t) == COMPONENT_REF
4130          || TREE_CODE (t) == REALPART_EXPR
4131          || TREE_CODE (t) == IMAGPART_EXPR)
4132     t = TREE_OPERAND (t, 0);
4133
4134   if (DECL_P (t))
4135     return true;
4136
4137   return false;
4138 }
4139
4140
4141 /* Called via walk_trees.  Verify tree sharing.  */
4142
4143 static tree
4144 verify_node_sharing (tree * tp, int *walk_subtrees, void *data)
4145 {
4146   struct pointer_set_t *visited = (struct pointer_set_t *) data;
4147
4148   if (tree_node_can_be_shared (*tp))
4149     {
4150       *walk_subtrees = false;
4151       return NULL;
4152     }
4153
4154   if (pointer_set_insert (visited, *tp))
4155     return *tp;
4156
4157   return NULL;
4158 }
4159
4160
4161 /* Helper function for verify_gimple_tuples.  */
4162
4163 static tree
4164 verify_gimple_tuples_1 (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
4165                          void *data ATTRIBUTE_UNUSED)
4166 {
4167   switch (TREE_CODE (*tp))
4168     {
4169     case MODIFY_EXPR:
4170       error ("unexpected non-tuple");
4171       debug_tree (*tp);
4172       gcc_unreachable ();
4173       return NULL_TREE;
4174
4175     default:
4176       return NULL_TREE;
4177     }
4178 }
4179
4180 /* Verify that there are no trees that should have been converted to
4181    gimple tuples.  Return true if T contains a node that should have
4182    been converted to a gimple tuple, but hasn't.  */
4183
4184 static bool
4185 verify_gimple_tuples (tree t)
4186 {
4187   return walk_tree (&t, verify_gimple_tuples_1, NULL, NULL) != NULL;
4188 }
4189
4190 static bool eh_error_found;
4191 static int
4192 verify_eh_throw_stmt_node (void **slot, void *data)
4193 {
4194   struct throw_stmt_node *node = (struct throw_stmt_node *)*slot;
4195   struct pointer_set_t *visited = (struct pointer_set_t *) data;
4196
4197   if (!pointer_set_contains (visited, node->stmt))
4198     {
4199       error ("Dead STMT in EH table");
4200       debug_generic_stmt (node->stmt);
4201       eh_error_found = true;
4202     }
4203   return 0;
4204 }
4205
4206 /* Verify the GIMPLE statement chain.  */
4207
4208 void
4209 verify_stmts (void)
4210 {
4211   basic_block bb;
4212   block_stmt_iterator bsi;
4213   bool err = false;
4214   struct pointer_set_t *visited, *visited_stmts;
4215   tree addr;
4216
4217   timevar_push (TV_TREE_STMT_VERIFY);
4218   visited = pointer_set_create ();
4219   visited_stmts = pointer_set_create ();
4220
4221   FOR_EACH_BB (bb)
4222     {
4223       tree phi;
4224       int i;
4225
4226       for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
4227         {
4228           int phi_num_args = PHI_NUM_ARGS (phi);
4229
4230           pointer_set_insert (visited_stmts, phi);
4231           if (bb_for_stmt (phi) != bb)
4232             {
4233               error ("bb_for_stmt (phi) is set to a wrong basic block");
4234               err |= true;
4235             }
4236
4237           for (i = 0; i < phi_num_args; i++)
4238             {
4239               tree t = PHI_ARG_DEF (phi, i);
4240               tree addr;
4241
4242               /* Addressable variables do have SSA_NAMEs but they
4243                  are not considered gimple values.  */
4244               if (TREE_CODE (t) != SSA_NAME
4245                   && TREE_CODE (t) != FUNCTION_DECL
4246                   && !is_gimple_val (t))
4247                 {
4248                   error ("PHI def is not a GIMPLE value");
4249                   debug_generic_stmt (phi);
4250                   debug_generic_stmt (t);
4251                   err |= true;
4252                 }
4253
4254               addr = walk_tree (&t, verify_expr, (void *) 1, NULL);
4255               if (addr)
4256                 {
4257                   debug_generic_stmt (addr);
4258                   err |= true;
4259                 }
4260
4261               addr = walk_tree (&t, verify_node_sharing, visited, NULL);
4262               if (addr)
4263                 {
4264                   error ("incorrect sharing of tree nodes");
4265                   debug_generic_stmt (phi);
4266                   debug_generic_stmt (addr);
4267                   err |= true;
4268                 }
4269             }
4270         }
4271
4272       for (bsi = bsi_start (bb); !bsi_end_p (bsi); )
4273         {
4274           tree stmt = bsi_stmt (bsi);
4275
4276           pointer_set_insert (visited_stmts, stmt);
4277           err |= verify_gimple_tuples (stmt);
4278
4279           if (bb_for_stmt (stmt) != bb)
4280             {
4281               error ("bb_for_stmt (stmt) is set to a wrong basic block");
4282               err |= true;
4283             }
4284
4285           bsi_next (&bsi);
4286           err |= verify_stmt (stmt, bsi_end_p (bsi));
4287           addr = walk_tree (&stmt, verify_node_sharing, visited, NULL);
4288           if (addr)
4289             {
4290               error ("incorrect sharing of tree nodes");
4291               debug_generic_stmt (stmt);
4292               debug_generic_stmt (addr);
4293               err |= true;
4294             }
4295         }
4296     }
4297   eh_error_found = false;
4298   if (get_eh_throw_stmt_table (cfun))
4299     htab_traverse (get_eh_throw_stmt_table (cfun),
4300                    verify_eh_throw_stmt_node,
4301                    visited_stmts);
4302
4303   if (err | eh_error_found)
4304     internal_error ("verify_stmts failed");
4305
4306   pointer_set_destroy (visited);
4307   pointer_set_destroy (visited_stmts);
4308   verify_histograms ();
4309   timevar_pop (TV_TREE_STMT_VERIFY);
4310 }
4311
4312
4313 /* Verifies that the flow information is OK.  */
4314
4315 static int
4316 tree_verify_flow_info (void)
4317 {
4318   int err = 0;
4319   basic_block bb;
4320   block_stmt_iterator bsi;
4321   tree stmt;
4322   edge e;
4323   edge_iterator ei;
4324
4325   if (ENTRY_BLOCK_PTR->il.tree)
4326     {
4327       error ("ENTRY_BLOCK has IL associated with it");
4328       err = 1;
4329     }
4330
4331   if (EXIT_BLOCK_PTR->il.tree)
4332     {
4333       error ("EXIT_BLOCK has IL associated with it");
4334       err = 1;
4335     }
4336
4337   FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
4338     if (e->flags & EDGE_FALLTHRU)
4339       {
4340         error ("fallthru to exit from bb %d", e->src->index);
4341         err = 1;
4342       }
4343
4344   FOR_EACH_BB (bb)
4345     {
4346       bool found_ctrl_stmt = false;
4347
4348       stmt = NULL_TREE;
4349
4350       /* Skip labels on the start of basic block.  */
4351       for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
4352         {
4353           tree prev_stmt = stmt;
4354
4355           stmt = bsi_stmt (bsi);
4356
4357           if (TREE_CODE (stmt) != LABEL_EXPR)
4358             break;
4359
4360           if (prev_stmt && DECL_NONLOCAL (LABEL_EXPR_LABEL (stmt)))
4361             {
4362               error ("nonlocal label ");
4363               print_generic_expr (stderr, LABEL_EXPR_LABEL (stmt), 0);
4364               fprintf (stderr, " is not first in a sequence of labels in bb %d",
4365                        bb->index);
4366               err = 1;
4367             }
4368
4369           if (label_to_block (LABEL_EXPR_LABEL (stmt)) != bb)
4370             {
4371               error ("label ");
4372               print_generic_expr (stderr, LABEL_EXPR_LABEL (stmt), 0);
4373               fprintf (stderr, " to block does not match in bb %d",
4374                        bb->index);
4375               err = 1;
4376             }
4377
4378           if (decl_function_context (LABEL_EXPR_LABEL (stmt))
4379               != current_function_decl)
4380             {
4381               error ("label ");
4382               print_generic_expr (stderr, LABEL_EXPR_LABEL (stmt), 0);
4383               fprintf (stderr, " has incorrect context in bb %d",
4384                        bb->index);
4385               err = 1;
4386             }
4387         }
4388
4389       /* Verify that body of basic block BB is free of control flow.  */
4390       for (; !bsi_end_p (bsi); bsi_next (&bsi))
4391         {
4392           tree stmt = bsi_stmt (bsi);
4393
4394           if (found_ctrl_stmt)
4395             {
4396               error ("control flow in the middle of basic block %d",
4397                      bb->index);
4398               err = 1;
4399             }
4400
4401           if (stmt_ends_bb_p (stmt))
4402             found_ctrl_stmt = true;
4403
4404           if (TREE_CODE (stmt) == LABEL_EXPR)
4405             {
4406               error ("label ");
4407               print_generic_expr (stderr, LABEL_EXPR_LABEL (stmt), 0);
4408               fprintf (stderr, " in the middle of basic block %d", bb->index);
4409               err = 1;
4410             }
4411         }
4412
4413       bsi = bsi_last (bb);
4414       if (bsi_end_p (bsi))
4415         continue;
4416
4417       stmt = bsi_stmt (bsi);
4418
4419       err |= verify_eh_edges (stmt);
4420
4421       if (is_ctrl_stmt (stmt))
4422         {
4423           FOR_EACH_EDGE (e, ei, bb->succs)
4424             if (e->flags & EDGE_FALLTHRU)
4425               {
4426                 error ("fallthru edge after a control statement in bb %d",
4427                        bb->index);
4428                 err = 1;
4429               }
4430         }
4431
4432       if (TREE_CODE (stmt) != COND_EXPR)
4433         {
4434           /* Verify that there are no edges with EDGE_TRUE/FALSE_FLAG set
4435              after anything else but if statement.  */
4436           FOR_EACH_EDGE (e, ei, bb->succs)
4437             if (e->flags & (EDGE_TRUE_VALUE | EDGE_FALSE_VALUE))
4438               {
4439                 error ("true/false edge after a non-COND_EXPR in bb %d",
4440                        bb->index);
4441                 err = 1;
4442               }
4443         }
4444
4445       switch (TREE_CODE (stmt))
4446         {
4447         case COND_EXPR:
4448           {
4449             edge true_edge;
4450             edge false_edge;
4451   
4452             if (COND_EXPR_THEN (stmt) != NULL_TREE
4453                 || COND_EXPR_ELSE (stmt) != NULL_TREE)
4454               {
4455                 error ("COND_EXPR with code in branches at the end of bb %d",
4456                        bb->index);
4457                 err = 1;
4458               }
4459
4460             extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
4461
4462             if (!true_edge || !false_edge
4463                 || !(true_edge->flags & EDGE_TRUE_VALUE)
4464                 || !(false_edge->flags & EDGE_FALSE_VALUE)
4465                 || (true_edge->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL))
4466                 || (false_edge->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL))
4467                 || EDGE_COUNT (bb->succs) >= 3)
4468               {
4469                 error ("wrong outgoing edge flags at end of bb %d",
4470                        bb->index);
4471                 err = 1;
4472               }
4473           }
4474           break;
4475
4476         case GOTO_EXPR:
4477           if (simple_goto_p (stmt))
4478             {
4479               error ("explicit goto at end of bb %d", bb->index);
4480               err = 1;
4481             }
4482           else
4483             {
4484               /* FIXME.  We should double check that the labels in the
4485                  destination blocks have their address taken.  */
4486               FOR_EACH_EDGE (e, ei, bb->succs)
4487                 if ((e->flags & (EDGE_FALLTHRU | EDGE_TRUE_VALUE
4488                                  | EDGE_FALSE_VALUE))
4489                     || !(e->flags & EDGE_ABNORMAL))
4490                   {
4491                     error ("wrong outgoing edge flags at end of bb %d",
4492                            bb->index);
4493                     err = 1;
4494                   }
4495             }
4496           break;
4497
4498         case RETURN_EXPR:
4499           if (!single_succ_p (bb)
4500               || (single_succ_edge (bb)->flags
4501                   & (EDGE_FALLTHRU | EDGE_ABNORMAL
4502                      | EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
4503             {
4504               error ("wrong outgoing edge flags at end of bb %d", bb->index);
4505               err = 1;
4506             }
4507           if (single_succ (bb) != EXIT_BLOCK_PTR)
4508             {
4509               error ("return edge does not point to exit in bb %d",
4510                      bb->index);
4511               err = 1;
4512             }
4513           break;
4514
4515         case SWITCH_EXPR:
4516           {
4517             tree prev;
4518             edge e;
4519             size_t i, n;
4520             tree vec;
4521
4522             vec = SWITCH_LABELS (stmt);
4523             n = TREE_VEC_LENGTH (vec);
4524
4525             /* Mark all the destination basic blocks.  */
4526             for (i = 0; i < n; ++i)
4527               {
4528                 tree lab = CASE_LABEL (TREE_VEC_ELT (vec, i));
4529                 basic_block label_bb = label_to_block (lab);
4530
4531                 gcc_assert (!label_bb->aux || label_bb->aux == (void *)1);
4532                 label_bb->aux = (void *)1;
4533               }
4534
4535             /* Verify that the case labels are sorted.  */
4536             prev = TREE_VEC_ELT (vec, 0);
4537             for (i = 1; i < n - 1; ++i)
4538               {
4539                 tree c = TREE_VEC_ELT (vec, i);
4540                 if (! CASE_LOW (c))
4541                   {
4542                     error ("found default case not at end of case vector");
4543                     err = 1;
4544                     continue;
4545                   }
4546                 if (! tree_int_cst_lt (CASE_LOW (prev), CASE_LOW (c)))
4547                   {
4548                     error ("case labels not sorted: ");
4549                     print_generic_expr (stderr, prev, 0);
4550                     fprintf (stderr," is greater than ");
4551                     print_generic_expr (stderr, c, 0);
4552                     fprintf (stderr," but comes before it.\n");
4553                     err = 1;
4554                   }
4555                 prev = c;
4556               }
4557             if (CASE_LOW (TREE_VEC_ELT (vec, n - 1)))
4558               {
4559                 error ("no default case found at end of case vector");
4560                 err = 1;
4561               }
4562
4563             FOR_EACH_EDGE (e, ei, bb->succs)
4564               {
4565                 if (!e->dest->aux)
4566                   {
4567                     error ("extra outgoing edge %d->%d",
4568                            bb->index, e->dest->index);
4569                     err = 1;
4570                   }
4571                 e->dest->aux = (void *)2;
4572                 if ((e->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL
4573                                  | EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
4574                   {
4575                     error ("wrong outgoing edge flags at end of bb %d",
4576                            bb->index);
4577                     err = 1;
4578                   }
4579               }
4580
4581             /* Check that we have all of them.  */
4582             for (i = 0; i < n; ++i)
4583               {
4584                 tree lab = CASE_LABEL (TREE_VEC_ELT (vec, i));
4585                 basic_block label_bb = label_to_block (lab);
4586
4587                 if (label_bb->aux != (void *)2)
4588                   {
4589                     error ("missing edge %i->%i",
4590                            bb->index, label_bb->index);
4591                     err = 1;
4592                   }
4593               }
4594
4595             FOR_EACH_EDGE (e, ei, bb->succs)
4596               e->dest->aux = (void *)0;
4597           }
4598
4599         default: ;
4600         }
4601     }
4602
4603   if (dom_info_state (CDI_DOMINATORS) >= DOM_NO_FAST_QUERY)
4604     verify_dominators (CDI_DOMINATORS);
4605
4606   return err;
4607 }
4608
4609
4610 /* Updates phi nodes after creating a forwarder block joined
4611    by edge FALLTHRU.  */
4612
4613 static void
4614 tree_make_forwarder_block (edge fallthru)
4615 {
4616   edge e;
4617   edge_iterator ei;
4618   basic_block dummy, bb;
4619   tree phi, new_phi, var;
4620
4621   dummy = fallthru->src;
4622   bb = fallthru->dest;
4623
4624   if (single_pred_p (bb))
4625     return;
4626
4627   /* If we redirected a branch we must create new PHI nodes at the
4628      start of BB.  */
4629   for (phi = phi_nodes (dummy); phi; phi = PHI_CHAIN (phi))
4630     {
4631       var = PHI_RESULT (phi);
4632       new_phi = create_phi_node (var, bb);
4633       SSA_NAME_DEF_STMT (var) = new_phi;
4634       SET_PHI_RESULT (phi, make_ssa_name (SSA_NAME_VAR (var), phi));
4635       add_phi_arg (new_phi, PHI_RESULT (phi), fallthru);
4636     }
4637
4638   /* Ensure that the PHI node chain is in the same order.  */
4639   set_phi_nodes (bb, phi_reverse (phi_nodes (bb)));
4640
4641   /* Add the arguments we have stored on edges.  */
4642   FOR_EACH_EDGE (e, ei, bb->preds)
4643     {
4644       if (e == fallthru)
4645         continue;
4646
4647       flush_pending_stmts (e);
4648     }
4649 }
4650
4651
4652 /* Return a non-special label in the head of basic block BLOCK.
4653    Create one if it doesn't exist.  */
4654
4655 tree
4656 tree_block_label (basic_block bb)
4657 {
4658   block_stmt_iterator i, s = bsi_start (bb);
4659   bool first = true;
4660   tree label, stmt;
4661
4662   for (i = s; !bsi_end_p (i); first = false, bsi_next (&i))
4663     {
4664       stmt = bsi_stmt (i);
4665       if (TREE_CODE (stmt) != LABEL_EXPR)
4666         break;
4667       label = LABEL_EXPR_LABEL (stmt);
4668       if (!DECL_NONLOCAL (label))
4669         {
4670           if (!first)
4671             bsi_move_before (&i, &s);
4672           return label;
4673         }
4674     }
4675
4676   label = create_artificial_label ();
4677   stmt = build1 (LABEL_EXPR, void_type_node, label);
4678   bsi_insert_before (&s, stmt, BSI_NEW_STMT);
4679   return label;
4680 }
4681
4682
4683 /* Attempt to perform edge redirection by replacing a possibly complex
4684    jump instruction by a goto or by removing the jump completely.
4685    This can apply only if all edges now point to the same block.  The
4686    parameters and return values are equivalent to
4687    redirect_edge_and_branch.  */
4688
4689 static edge
4690 tree_try_redirect_by_replacing_jump (edge e, basic_block target)
4691 {
4692   basic_block src = e->src;
4693   block_stmt_iterator b;
4694   tree stmt;
4695
4696   /* We can replace or remove a complex jump only when we have exactly
4697      two edges.  */
4698   if (EDGE_COUNT (src->succs) != 2
4699       /* Verify that all targets will be TARGET.  Specifically, the
4700          edge that is not E must also go to TARGET.  */
4701       || EDGE_SUCC (src, EDGE_SUCC (src, 0) == e)->dest != target)
4702     return NULL;
4703
4704   b = bsi_last (src);
4705   if (bsi_end_p (b))
4706     return NULL;
4707   stmt = bsi_stmt (b);
4708
4709   if (TREE_CODE (stmt) == COND_EXPR
4710       || TREE_CODE (stmt) == SWITCH_EXPR)
4711     {
4712       bsi_remove (&b, true);
4713       e = ssa_redirect_edge (e, target);
4714       e->flags = EDGE_FALLTHRU;
4715       return e;
4716     }
4717
4718   return NULL;
4719 }
4720
4721
4722 /* Redirect E to DEST.  Return NULL on failure.  Otherwise, return the
4723    edge representing the redirected branch.  */
4724
4725 static edge
4726 tree_redirect_edge_and_branch (edge e, basic_block dest)
4727 {
4728   basic_block bb = e->src;
4729   block_stmt_iterator bsi;
4730   edge ret;
4731   tree stmt;
4732
4733   if (e->flags & EDGE_ABNORMAL)
4734     return NULL;
4735
4736   if (e->src != ENTRY_BLOCK_PTR
4737       && (ret = tree_try_redirect_by_replacing_jump (e, dest)))
4738     return ret;
4739
4740   if (e->dest == dest)
4741     return NULL;
4742
4743   bsi = bsi_last (bb);
4744   stmt = bsi_end_p (bsi) ? NULL : bsi_stmt (bsi);
4745
4746   switch (stmt ? TREE_CODE (stmt) : ERROR_MARK)
4747     {
4748     case COND_EXPR:
4749       /* For COND_EXPR, we only need to redirect the edge.  */
4750       break;
4751
4752     case GOTO_EXPR:
4753       /* No non-abnormal edges should lead from a non-simple goto, and
4754          simple ones should be represented implicitly.  */
4755       gcc_unreachable ();
4756
4757     case SWITCH_EXPR:
4758       {
4759         tree cases = get_cases_for_edge (e, stmt);
4760         tree label = tree_block_label (dest);
4761
4762         /* If we have a list of cases associated with E, then use it
4763            as it's a lot faster than walking the entire case vector.  */
4764         if (cases)
4765           {
4766             edge e2 = find_edge (e->src, dest);
4767             tree last, first;
4768
4769             first = cases;
4770             while (cases)
4771               {
4772                 last = cases;
4773                 CASE_LABEL (cases) = label;
4774                 cases = TREE_CHAIN (cases);
4775               }
4776
4777             /* If there was already an edge in the CFG, then we need
4778                to move all the cases associated with E to E2.  */
4779             if (e2)
4780               {
4781                 tree cases2 = get_cases_for_edge (e2, stmt);
4782
4783                 TREE_CHAIN (last) = TREE_CHAIN (cases2);
4784                 TREE_CHAIN (cases2) = first;
4785               }
4786           }
4787         else
4788           {
4789             tree vec = SWITCH_LABELS (stmt);
4790             size_t i, n = TREE_VEC_LENGTH (vec);
4791
4792             for (i = 0; i < n; i++)
4793               {
4794                 tree elt = TREE_VEC_ELT (vec, i);
4795
4796                 if (label_to_block (CASE_LABEL (elt)) == e->dest)
4797                   CASE_LABEL (elt) = label;
4798               }
4799           }
4800
4801         break;
4802       }
4803
4804     case RETURN_EXPR:
4805       bsi_remove (&bsi, true);
4806       e->flags |= EDGE_FALLTHRU;
4807       break;
4808
4809     default:
4810       /* Otherwise it must be a fallthru edge, and we don't need to
4811          do anything besides redirecting it.  */
4812       gcc_assert (e->flags & EDGE_FALLTHRU);
4813       break;
4814     }
4815
4816   /* Update/insert PHI nodes as necessary.  */
4817
4818   /* Now update the edges in the CFG.  */
4819   e = ssa_redirect_edge (e, dest);
4820
4821   return e;
4822 }
4823
4824 /* Returns true if it is possible to remove edge E by redirecting
4825    it to the destination of the other edge from E->src.  */
4826
4827 static bool
4828 tree_can_remove_branch_p (edge e)
4829 {
4830   if (e->flags & EDGE_ABNORMAL)
4831     return false;
4832
4833   return true;
4834 }
4835
4836 /* Simple wrapper, as we can always redirect fallthru edges.  */
4837
4838 static basic_block
4839 tree_redirect_edge_and_branch_force (edge e, basic_block dest)
4840 {
4841   e = tree_redirect_edge_and_branch (e, dest);
4842   gcc_assert (e);
4843
4844   return NULL;
4845 }
4846
4847
4848 /* Splits basic block BB after statement STMT (but at least after the
4849    labels).  If STMT is NULL, BB is split just after the labels.  */
4850
4851 static basic_block
4852 tree_split_block (basic_block bb, void *stmt)
4853 {
4854   block_stmt_iterator bsi;
4855   tree_stmt_iterator tsi_tgt;
4856   tree act, list;
4857   basic_block new_bb;
4858   edge e;
4859   edge_iterator ei;
4860
4861   new_bb = create_empty_bb (bb);
4862
4863   /* Redirect the outgoing edges.  */
4864   new_bb->succs = bb->succs;
4865   bb->succs = NULL;
4866   FOR_EACH_EDGE (e, ei, new_bb->succs)
4867     e->src = new_bb;
4868
4869   if (stmt && TREE_CODE ((tree) stmt) == LABEL_EXPR)
4870     stmt = NULL;
4871
4872   /* Move everything from BSI to the new basic block.  */
4873   for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
4874     {
4875       act = bsi_stmt (bsi);
4876       if (TREE_CODE (act) == LABEL_EXPR)
4877         continue;
4878
4879       if (!stmt)
4880         break;
4881
4882       if (stmt == act)
4883         {
4884           bsi_next (&bsi);
4885           break;
4886         }
4887     }
4888
4889   if (bsi_end_p (bsi))
4890     return new_bb;
4891
4892   /* Split the statement list - avoid re-creating new containers as this
4893      brings ugly quadratic memory consumption in the inliner.  
4894      (We are still quadratic since we need to update stmt BB pointers,
4895      sadly.)  */
4896   list = tsi_split_statement_list_before (&bsi.tsi);
4897   set_bb_stmt_list (new_bb, list);
4898   for (tsi_tgt = tsi_start (list);
4899        !tsi_end_p (tsi_tgt); tsi_next (&tsi_tgt))
4900     change_bb_for_stmt (tsi_stmt (tsi_tgt), new_bb);
4901
4902   return new_bb;
4903 }
4904
4905
4906 /* Moves basic block BB after block AFTER.  */
4907
4908 static bool
4909 tree_move_block_after (basic_block bb, basic_block after)
4910 {
4911   if (bb->prev_bb == after)
4912     return true;
4913
4914   unlink_block (bb);
4915   link_block (bb, after);
4916
4917   return true;
4918 }
4919
4920
4921 /* Return true if basic_block can be duplicated.  */
4922
4923 static bool
4924 tree_can_duplicate_bb_p (basic_block bb ATTRIBUTE_UNUSED)
4925 {
4926   return true;
4927 }
4928
4929
4930 /* Create a duplicate of the basic block BB.  NOTE: This does not
4931    preserve SSA form.  */
4932
4933 static basic_block
4934 tree_duplicate_bb (basic_block bb)
4935 {
4936   basic_block new_bb;
4937   block_stmt_iterator bsi, bsi_tgt;
4938   tree phi;
4939
4940   new_bb = create_empty_bb (EXIT_BLOCK_PTR->prev_bb);
4941
4942   /* Copy the PHI nodes.  We ignore PHI node arguments here because
4943      the incoming edges have not been setup yet.  */
4944   for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
4945     {
4946       tree copy = create_phi_node (PHI_RESULT (phi), new_bb);
4947       create_new_def_for (PHI_RESULT (copy), copy, PHI_RESULT_PTR (copy));
4948     }
4949
4950   /* Keep the chain of PHI nodes in the same order so that they can be
4951      updated by ssa_redirect_edge.  */
4952   set_phi_nodes (new_bb, phi_reverse (phi_nodes (new_bb)));
4953
4954   bsi_tgt = bsi_start (new_bb);
4955   for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
4956     {
4957       def_operand_p def_p;
4958       ssa_op_iter op_iter;
4959       tree stmt, copy;
4960       int region;
4961
4962       stmt = bsi_stmt (bsi);
4963       if (TREE_CODE (stmt) == LABEL_EXPR)
4964         continue;
4965
4966       /* Create a new copy of STMT and duplicate STMT's virtual
4967          operands.  */
4968       copy = unshare_expr (stmt);
4969       bsi_insert_after (&bsi_tgt, copy, BSI_NEW_STMT);
4970       copy_virtual_operands (copy, stmt);
4971       region = lookup_stmt_eh_region (stmt);
4972       if (region >= 0)
4973         add_stmt_to_eh_region (copy, region);
4974       gimple_duplicate_stmt_histograms (cfun, copy, cfun, stmt);
4975
4976       /* Create new names for all the definitions created by COPY and
4977          add replacement mappings for each new name.  */
4978       FOR_EACH_SSA_DEF_OPERAND (def_p, copy, op_iter, SSA_OP_ALL_DEFS)
4979         create_new_def_for (DEF_FROM_PTR (def_p), copy, def_p);
4980     }
4981
4982   return new_bb;
4983 }
4984
4985
4986 /* Basic block BB_COPY was created by code duplication.  Add phi node
4987    arguments for edges going out of BB_COPY.  The blocks that were
4988    duplicated have BB_DUPLICATED set.  */
4989
4990 void
4991 add_phi_args_after_copy_bb (basic_block bb_copy)
4992 {
4993   basic_block bb, dest;
4994   edge e, e_copy;
4995   edge_iterator ei;
4996   tree phi, phi_copy, phi_next, def;
4997
4998   bb = get_bb_original (bb_copy);
4999
5000   FOR_EACH_EDGE (e_copy, ei, bb_copy->succs)
5001     {
5002       if (!phi_nodes (e_copy->dest))
5003         continue;
5004
5005       if (e_copy->dest->flags & BB_DUPLICATED)
5006         dest = get_bb_original (e_copy->dest);
5007       else
5008         dest = e_copy->dest;
5009
5010       e = find_edge (bb, dest);
5011       if (!e)
5012         {
5013           /* During loop unrolling the target of the latch edge is copied.
5014              In this case we are not looking for edge to dest, but to
5015              duplicated block whose original was dest.  */
5016           FOR_EACH_EDGE (e, ei, bb->succs)
5017             if ((e->dest->flags & BB_DUPLICATED)
5018                 && get_bb_original (e->dest) == dest)
5019               break;
5020
5021           gcc_assert (e != NULL);
5022         }
5023
5024       for (phi = phi_nodes (e->dest), phi_copy = phi_nodes (e_copy->dest);
5025            phi;
5026            phi = phi_next, phi_copy = PHI_CHAIN (phi_copy))
5027         {
5028           phi_next = PHI_CHAIN (phi);
5029           def = PHI_ARG_DEF_FROM_EDGE (phi, e);
5030           add_phi_arg (phi_copy, def, e_copy);
5031         }
5032     }
5033 }
5034
5035 /* Blocks in REGION_COPY array of length N_REGION were created by
5036    duplication of basic blocks.  Add phi node arguments for edges
5037    going from these blocks.  */
5038
5039 void
5040 add_phi_args_after_copy (basic_block *region_copy, unsigned n_region)
5041 {
5042   unsigned i;
5043
5044   for (i = 0; i < n_region; i++)
5045     region_copy[i]->flags |= BB_DUPLICATED;
5046
5047   for (i = 0; i < n_region; i++)
5048     add_phi_args_after_copy_bb (region_copy[i]);
5049
5050   for (i = 0; i < n_region; i++)
5051     region_copy[i]->flags &= ~BB_DUPLICATED;
5052 }
5053
5054 /* Duplicates a REGION (set of N_REGION basic blocks) with just a single
5055    important exit edge EXIT.  By important we mean that no SSA name defined
5056    inside region is live over the other exit edges of the region.  All entry
5057    edges to the region must go to ENTRY->dest.  The edge ENTRY is redirected
5058    to the duplicate of the region.  SSA form, dominance and loop information
5059    is updated.  The new basic blocks are stored to REGION_COPY in the same
5060    order as they had in REGION, provided that REGION_COPY is not NULL.
5061    The function returns false if it is unable to copy the region,
5062    true otherwise.  */
5063
5064 bool
5065 tree_duplicate_sese_region (edge entry, edge exit,
5066                             basic_block *region, unsigned n_region,
5067                             basic_block *region_copy)
5068 {
5069   unsigned i;
5070   bool free_region_copy = false, copying_header = false;
5071   struct loop *loop = entry->dest->loop_father;
5072   edge exit_copy;
5073   VEC (basic_block, heap) *doms;
5074   edge redirected;
5075   int total_freq = 0, entry_freq = 0;
5076   gcov_type total_count = 0, entry_count = 0;
5077
5078   if (!can_copy_bbs_p (region, n_region))
5079     return false;
5080
5081   /* Some sanity checking.  Note that we do not check for all possible
5082      missuses of the functions.  I.e. if you ask to copy something weird,
5083      it will work, but the state of structures probably will not be
5084      correct.  */
5085   for (i = 0; i < n_region; i++)
5086     {
5087       /* We do not handle subloops, i.e. all the blocks must belong to the
5088          same loop.  */
5089       if (region[i]->loop_father != loop)
5090         return false;
5091
5092       if (region[i] != entry->dest
5093           && region[i] == loop->header)
5094         return false;
5095     }
5096
5097   set_loop_copy (loop, loop);
5098
5099   /* In case the function is used for loop header copying (which is the primary
5100      use), ensure that EXIT and its copy will be new latch and entry edges.  */
5101   if (loop->header == entry->dest)
5102     {
5103       copying_header = true;
5104       set_loop_copy (loop, loop_outer (loop));
5105
5106       if (!dominated_by_p (CDI_DOMINATORS, loop->latch, exit->src))
5107         return false;
5108
5109       for (i = 0; i < n_region; i++)
5110         if (region[i] != exit->src
5111             && dominated_by_p (CDI_DOMINATORS, region[i], exit->src))
5112           return false;
5113     }
5114
5115   if (!region_copy)
5116     {
5117       region_copy = XNEWVEC (basic_block, n_region);
5118       free_region_copy = true;
5119     }
5120
5121   gcc_assert (!need_ssa_update_p ());
5122
5123   /* Record blocks outside the region that are dominated by something
5124      inside.  */
5125   doms = NULL;
5126   initialize_original_copy_tables ();
5127
5128   doms = get_dominated_by_region (CDI_DOMINATORS, region, n_region);
5129
5130   if (entry->dest->count)
5131     {
5132       total_count = entry->dest->count;
5133       entry_count = entry->count;
5134       /* Fix up corner cases, to avoid division by zero or creation of negative
5135          frequencies.  */
5136       if (entry_count > total_count)
5137         entry_count = total_count;
5138     }
5139   else
5140     {
5141       total_freq = entry->dest->frequency;
5142       entry_freq = EDGE_FREQUENCY (entry);
5143       /* Fix up corner cases, to avoid division by zero or creation of negative
5144          frequencies.  */
5145       if (total_freq == 0)
5146         total_freq = 1;
5147       else if (entry_freq > total_freq)
5148         entry_freq = total_freq;
5149     }
5150
5151   copy_bbs (region, n_region, region_copy, &exit, 1, &exit_copy, loop,
5152             split_edge_bb_loc (entry));
5153   if (total_count)
5154     {
5155       scale_bbs_frequencies_gcov_type (region, n_region,
5156                                        total_count - entry_count,
5157                                        total_count);
5158       scale_bbs_frequencies_gcov_type (region_copy, n_region, entry_count,
5159                                        total_count);
5160     }
5161   else
5162     {
5163       scale_bbs_frequencies_int (region, n_region, total_freq - entry_freq,
5164                                  total_freq);
5165       scale_bbs_frequencies_int (region_copy, n_region, entry_freq, total_freq);
5166     }
5167
5168   if (copying_header)
5169     {
5170       loop->header = exit->dest;
5171       loop->latch = exit->src;
5172     }
5173
5174   /* Redirect the entry and add the phi node arguments.  */
5175   redirected = redirect_edge_and_branch (entry, get_bb_copy (entry->dest));
5176   gcc_assert (redirected != NULL);
5177   flush_pending_stmts (entry);
5178
5179   /* Concerning updating of dominators:  We must recount dominators
5180      for entry block and its copy.  Anything that is outside of the
5181      region, but was dominated by something inside needs recounting as
5182      well.  */
5183   set_immediate_dominator (CDI_DOMINATORS, entry->dest, entry->src);
5184   VEC_safe_push (basic_block, heap, doms, get_bb_original (entry->dest));
5185   iterate_fix_dominators (CDI_DOMINATORS, doms, false);
5186   free (doms);
5187
5188   /* Add the other PHI node arguments.  */
5189   add_phi_args_after_copy (region_copy, n_region);
5190
5191   /* Update the SSA web.  */
5192   update_ssa (TODO_update_ssa);
5193
5194   if (free_region_copy)
5195     free (region_copy);
5196
5197   free_original_copy_tables ();
5198   return true;
5199 }
5200
5201 /*
5202 DEF_VEC_P(basic_block);
5203 DEF_VEC_ALLOC_P(basic_block,heap);
5204 */
5205
5206 /* Add all the blocks dominated by ENTRY to the array BBS_P.  Stop
5207    adding blocks when the dominator traversal reaches EXIT.  This
5208    function silently assumes that ENTRY strictly dominates EXIT.  */
5209
5210 static void
5211 gather_blocks_in_sese_region (basic_block entry, basic_block exit,
5212                               VEC(basic_block,heap) **bbs_p)
5213 {
5214   basic_block son;
5215
5216   for (son = first_dom_son (CDI_DOMINATORS, entry);
5217        son;
5218        son = next_dom_son (CDI_DOMINATORS, son))
5219     {
5220       VEC_safe_push (basic_block, heap, *bbs_p, son);
5221       if (son != exit)
5222         gather_blocks_in_sese_region (son, exit, bbs_p);
5223     }
5224 }
5225
5226
5227 struct move_stmt_d
5228 {
5229   tree block;
5230   tree from_context;
5231   tree to_context;
5232   bitmap vars_to_remove;
5233   htab_t new_label_map;
5234   bool remap_decls_p;
5235 };
5236
5237 /* Helper for move_block_to_fn.  Set TREE_BLOCK in every expression
5238    contained in *TP and change the DECL_CONTEXT of every local
5239    variable referenced in *TP.  */
5240
5241 static tree
5242 move_stmt_r (tree *tp, int *walk_subtrees, void *data)
5243 {
5244   struct move_stmt_d *p = (struct move_stmt_d *) data;
5245   tree t = *tp;
5246
5247   if (p->block
5248       && (EXPR_P (t) || GIMPLE_STMT_P (t)))
5249     TREE_BLOCK (t) = p->block;
5250
5251   if (OMP_DIRECTIVE_P (t)
5252       && TREE_CODE (t) != OMP_RETURN
5253       && TREE_CODE (t) != OMP_CONTINUE)
5254     {
5255       /* Do not remap variables inside OMP directives.  Variables
5256          referenced in clauses and directive header belong to the
5257          parent function and should not be moved into the child
5258          function.  */
5259       bool save_remap_decls_p = p->remap_decls_p;
5260       p->remap_decls_p = false;
5261       *walk_subtrees = 0;
5262
5263       walk_tree (&OMP_BODY (t), move_stmt_r, p, NULL);
5264
5265       p->remap_decls_p = save_remap_decls_p;
5266     }
5267   else if (DECL_P (t) && DECL_CONTEXT (t) == p->from_context)
5268     {
5269       if (TREE_CODE (t) == LABEL_DECL)
5270         {
5271           if (p->new_label_map)
5272             {
5273               struct tree_map in, *out;
5274               in.base.from = t;
5275               out = htab_find_with_hash (p->new_label_map, &in, DECL_UID (t));
5276               if (out)
5277                 *tp = t = out->to;
5278             }
5279
5280           DECL_CONTEXT (t) = p->to_context;
5281         }
5282       else if (p->remap_decls_p)
5283         {
5284           DECL_CONTEXT (t) = p->to_context;
5285
5286           if (TREE_CODE (t) == VAR_DECL)
5287             {
5288               struct function *f = DECL_STRUCT_FUNCTION (p->to_context);
5289               f->unexpanded_var_list
5290                 = tree_cons (0, t, f->unexpanded_var_list);
5291
5292               /* Mark T to be removed from the original function,
5293                  otherwise it will be given a DECL_RTL when the
5294                  original function is expanded.  */
5295               bitmap_set_bit (p->vars_to_remove, DECL_UID (t));
5296             }
5297         }
5298     }
5299   else if (TYPE_P (t))
5300     *walk_subtrees = 0;
5301
5302   return NULL_TREE;
5303 }
5304
5305
5306 /* Move basic block BB from function CFUN to function DEST_FN.  The
5307    block is moved out of the original linked list and placed after
5308    block AFTER in the new list.  Also, the block is removed from the
5309    original array of blocks and placed in DEST_FN's array of blocks.
5310    If UPDATE_EDGE_COUNT_P is true, the edge counts on both CFGs is
5311    updated to reflect the moved edges.
5312
5313    On exit, local variables that need to be removed from
5314    CFUN->UNEXPANDED_VAR_LIST will have been added to VARS_TO_REMOVE.  */
5315
5316 static void
5317 move_block_to_fn (struct function *dest_cfun, basic_block bb,
5318                   basic_block after, bool update_edge_count_p,
5319                   bitmap vars_to_remove, htab_t new_label_map, int eh_offset)
5320 {
5321   struct control_flow_graph *cfg;
5322   edge_iterator ei;
5323   edge e;
5324   block_stmt_iterator si;
5325   struct move_stmt_d d;
5326   unsigned old_len, new_len;
5327
5328   /* Remove BB from dominance structures.  */
5329   delete_from_dominance_info (CDI_DOMINATORS, bb);
5330
5331   /* Link BB to the new linked list.  */
5332   move_block_after (bb, after);
5333
5334   /* Update the edge count in the corresponding flowgraphs.  */
5335   if (update_edge_count_p)
5336     FOR_EACH_EDGE (e, ei, bb->succs)
5337       {
5338         cfun->cfg->x_n_edges--;
5339         dest_cfun->cfg->x_n_edges++;
5340       }
5341
5342   /* Remove BB from the original basic block array.  */
5343   VEC_replace (basic_block, cfun->cfg->x_basic_block_info, bb->index, NULL);
5344   cfun->cfg->x_n_basic_blocks--;
5345
5346   /* Grow DEST_CFUN's basic block array if needed.  */
5347   cfg = dest_cfun->cfg;
5348   cfg->x_n_basic_blocks++;
5349   if (bb->index >= cfg->x_last_basic_block)
5350     cfg->x_last_basic_block = bb->index + 1;
5351
5352   old_len = VEC_length (basic_block, cfg->x_basic_block_info);
5353   if ((unsigned) cfg->x_last_basic_block >= old_len)
5354     {
5355       new_len = cfg->x_last_basic_block + (cfg->x_last_basic_block + 3) / 4;
5356       VEC_safe_grow_cleared (basic_block, gc, cfg->x_basic_block_info,
5357                              new_len);
5358     }
5359
5360   VEC_replace (basic_block, cfg->x_basic_block_info,
5361                bb->index, bb);
5362
5363   /* The statements in BB need to be associated with a new TREE_BLOCK.
5364      Labels need to be associated with a new label-to-block map.  */
5365   memset (&d, 0, sizeof (d));
5366   d.vars_to_remove = vars_to_remove;
5367
5368   for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
5369     {
5370       tree stmt = bsi_stmt (si);
5371       int region;
5372
5373       d.from_context = cfun->decl;
5374       d.to_context = dest_cfun->decl;
5375       d.remap_decls_p = true;
5376       d.new_label_map = new_label_map;
5377       if (TREE_BLOCK (stmt))
5378         d.block = DECL_INITIAL (dest_cfun->decl);
5379
5380       walk_tree (&stmt, move_stmt_r, &d, NULL);
5381
5382       if (TREE_CODE (stmt) == LABEL_EXPR)
5383         {
5384           tree label = LABEL_EXPR_LABEL (stmt);
5385           int uid = LABEL_DECL_UID (label);
5386
5387           gcc_assert (uid > -1);
5388
5389           old_len = VEC_length (basic_block, cfg->x_label_to_block_map);
5390           if (old_len <= (unsigned) uid)
5391             {
5392               new_len = 3 * uid / 2;
5393               VEC_safe_grow_cleared (basic_block, gc,
5394                                      cfg->x_label_to_block_map, new_len);
5395             }
5396
5397           VEC_replace (basic_block, cfg->x_label_to_block_map, uid, bb);
5398           VEC_replace (basic_block, cfun->cfg->x_label_to_block_map, uid, NULL);
5399
5400           gcc_assert (DECL_CONTEXT (label) == dest_cfun->decl);
5401
5402           if (uid >= dest_cfun->last_label_uid)
5403             dest_cfun->last_label_uid = uid + 1;
5404         }
5405       else if (TREE_CODE (stmt) == RESX_EXPR && eh_offset != 0)
5406         TREE_OPERAND (stmt, 0) =
5407           build_int_cst (NULL_TREE,
5408                          TREE_INT_CST_LOW (TREE_OPERAND (stmt, 0))
5409                          + eh_offset);
5410
5411       region = lookup_stmt_eh_region (stmt);
5412       if (region >= 0)
5413         {
5414           add_stmt_to_eh_region_fn (dest_cfun, stmt, region + eh_offset);
5415           remove_stmt_from_eh_region (stmt);
5416           gimple_duplicate_stmt_histograms (dest_cfun, stmt, cfun, stmt);
5417           gimple_remove_stmt_histograms (cfun, stmt);
5418         }
5419     }
5420 }
5421
5422 /* Examine the statements in BB (which is in SRC_CFUN); find and return
5423    the outermost EH region.  Use REGION as the incoming base EH region.  */
5424
5425 static int
5426 find_outermost_region_in_block (struct function *src_cfun,
5427                                 basic_block bb, int region)
5428 {
5429   block_stmt_iterator si;
5430
5431   for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
5432     {
5433       tree stmt = bsi_stmt (si);
5434       int stmt_region;
5435
5436       if (TREE_CODE (stmt) == RESX_EXPR)
5437         stmt_region = TREE_INT_CST_LOW (TREE_OPERAND (stmt, 0));
5438       else
5439         stmt_region = lookup_stmt_eh_region_fn (src_cfun, stmt);
5440       if (stmt_region > 0)
5441         {
5442           if (region < 0)
5443             region = stmt_region;
5444           else if (stmt_region != region)
5445             {
5446               region = eh_region_outermost (src_cfun, stmt_region, region);
5447               gcc_assert (region != -1);
5448             }
5449         }
5450     }
5451
5452   return region;
5453 }
5454
5455 static tree
5456 new_label_mapper (tree decl, void *data)
5457 {
5458   htab_t hash = (htab_t) data;
5459   struct tree_map *m;
5460   void **slot;
5461
5462   gcc_assert (TREE_CODE (decl) == LABEL_DECL);
5463
5464   m = xmalloc (sizeof (struct tree_map));
5465   m->hash = DECL_UID (decl);
5466   m->base.from = decl;
5467   m->to = create_artificial_label ();
5468   LABEL_DECL_UID (m->to) = LABEL_DECL_UID (decl);
5469
5470   slot = htab_find_slot_with_hash (hash, m, m->hash, INSERT);
5471   gcc_assert (*slot == NULL);
5472
5473   *slot = m;
5474
5475   return m->to;
5476 }
5477
5478 /* Move a single-entry, single-exit region delimited by ENTRY_BB and
5479    EXIT_BB to function DEST_CFUN.  The whole region is replaced by a
5480    single basic block in the original CFG and the new basic block is
5481    returned.  DEST_CFUN must not have a CFG yet.
5482
5483    Note that the region need not be a pure SESE region.  Blocks inside
5484    the region may contain calls to abort/exit.  The only restriction
5485    is that ENTRY_BB should be the only entry point and it must
5486    dominate EXIT_BB.
5487
5488    All local variables referenced in the region are assumed to be in
5489    the corresponding BLOCK_VARS and unexpanded variable lists
5490    associated with DEST_CFUN.  */
5491
5492 basic_block
5493 move_sese_region_to_fn (struct function *dest_cfun, basic_block entry_bb,
5494                         basic_block exit_bb)
5495 {
5496   VEC(basic_block,heap) *bbs;
5497   basic_block after, bb, *entry_pred, *exit_succ;
5498   struct function *saved_cfun;
5499   int *entry_flag, *exit_flag, eh_offset;
5500   unsigned i, num_entry_edges, num_exit_edges;
5501   edge e;
5502   edge_iterator ei;
5503   bitmap vars_to_remove;
5504   htab_t new_label_map;
5505
5506   saved_cfun = cfun;
5507
5508   /* Collect all the blocks in the region.  Manually add ENTRY_BB
5509      because it won't be added by dfs_enumerate_from.  */
5510   calculate_dominance_info (CDI_DOMINATORS);
5511
5512   /* If ENTRY does not strictly dominate EXIT, this cannot be an SESE
5513      region.  */
5514   gcc_assert (entry_bb != exit_bb
5515               && (!exit_bb
5516                   || dominated_by_p (CDI_DOMINATORS, exit_bb, entry_bb)));
5517
5518   bbs = NULL;
5519   VEC_safe_push (basic_block, heap, bbs, entry_bb);
5520   gather_blocks_in_sese_region (entry_bb, exit_bb, &bbs);
5521
5522   /* Detach ENTRY_BB and EXIT_BB from CFUN->CFG.  We need to remember
5523      the predecessor edges to ENTRY_BB and the successor edges to
5524      EXIT_BB so that we can re-attach them to the new basic block that
5525      will replace the region.  */
5526   num_entry_edges = EDGE_COUNT (entry_bb->preds);
5527   entry_pred = (basic_block *) xcalloc (num_entry_edges, sizeof (basic_block));
5528   entry_flag = (int *) xcalloc (num_entry_edges, sizeof (int));
5529   i = 0;
5530   for (ei = ei_start (entry_bb->preds); (e = ei_safe_edge (ei)) != NULL;)
5531     {
5532       entry_flag[i] = e->flags;
5533       entry_pred[i++] = e->src;
5534       remove_edge (e);
5535     }
5536
5537   if (exit_bb)
5538     {
5539       num_exit_edges = EDGE_COUNT (exit_bb->succs);
5540       exit_succ = (basic_block *) xcalloc (num_exit_edges,
5541                                            sizeof (basic_block));
5542       exit_flag = (int *) xcalloc (num_exit_edges, sizeof (int));
5543       i = 0;
5544       for (ei = ei_start (exit_bb->succs); (e = ei_safe_edge (ei)) != NULL;)
5545         {
5546           exit_flag[i] = e->flags;
5547           exit_succ[i++] = e->dest;
5548           remove_edge (e);
5549         }
5550     }
5551   else
5552     {
5553       num_exit_edges = 0;
5554       exit_succ = NULL;
5555       exit_flag = NULL;
5556     }
5557
5558   /* Switch context to the child function to initialize DEST_FN's CFG.  */
5559   gcc_assert (dest_cfun->cfg == NULL);
5560   cfun = dest_cfun;
5561
5562   init_empty_tree_cfg ();
5563
5564   /* Initialize EH information for the new function.  */
5565   eh_offset = 0;
5566   new_label_map = NULL;
5567   if (saved_cfun->eh)
5568     {
5569       int region = -1;
5570
5571       for (i = 0; VEC_iterate (basic_block, bbs, i, bb); i++)
5572         region = find_outermost_region_in_block (saved_cfun, bb, region);
5573
5574       init_eh_for_function ();
5575       if (region != -1)
5576         {
5577           new_label_map = htab_create (17, tree_map_hash, tree_map_eq, free);
5578           eh_offset = duplicate_eh_regions (saved_cfun, new_label_mapper,
5579                                             new_label_map, region, 0);
5580         }
5581     }
5582
5583   cfun = saved_cfun;
5584
5585   /* Move blocks from BBS into DEST_CFUN.  */
5586   gcc_assert (VEC_length (basic_block, bbs) >= 2);
5587   after = dest_cfun->cfg->x_entry_block_ptr;
5588   vars_to_remove = BITMAP_ALLOC (NULL);
5589   for (i = 0; VEC_iterate (basic_block, bbs, i, bb); i++)
5590     {
5591       /* No need to update edge counts on the last block.  It has
5592          already been updated earlier when we detached the region from
5593          the original CFG.  */
5594       move_block_to_fn (dest_cfun, bb, after, bb != exit_bb, vars_to_remove,
5595                         new_label_map, eh_offset);
5596       after = bb;
5597     }
5598
5599   if (new_label_map)
5600     htab_delete (new_label_map);
5601
5602   /* Remove the variables marked in VARS_TO_REMOVE from
5603      CFUN->UNEXPANDED_VAR_LIST.  Otherwise, they will be given a
5604      DECL_RTL in the context of CFUN.  */
5605   if (!bitmap_empty_p (vars_to_remove))
5606     {
5607       tree *p;
5608
5609       for (p = &cfun->unexpanded_var_list; *p; )
5610         {
5611           tree var = TREE_VALUE (*p);
5612           if (bitmap_bit_p (vars_to_remove, DECL_UID (var)))
5613             {
5614               *p = TREE_CHAIN (*p);
5615               continue;
5616             }
5617
5618           p = &TREE_CHAIN (*p);
5619         }
5620     }
5621
5622   BITMAP_FREE (vars_to_remove);
5623
5624   /* Rewire the entry and exit blocks.  The successor to the entry
5625      block turns into the successor of DEST_FN's ENTRY_BLOCK_PTR in
5626      the child function.  Similarly, the predecessor of DEST_FN's
5627      EXIT_BLOCK_PTR turns into the predecessor of EXIT_BLOCK_PTR.  We
5628      need to switch CFUN between DEST_CFUN and SAVED_CFUN so that the
5629      various CFG manipulation function get to the right CFG.
5630
5631      FIXME, this is silly.  The CFG ought to become a parameter to
5632      these helpers.  */
5633   cfun = dest_cfun;
5634   make_edge (ENTRY_BLOCK_PTR, entry_bb, EDGE_FALLTHRU);
5635   if (exit_bb)
5636     make_edge (exit_bb,  EXIT_BLOCK_PTR, 0);
5637   cfun = saved_cfun;
5638
5639   /* Back in the original function, the SESE region has disappeared,
5640      create a new basic block in its place.  */
5641   bb = create_empty_bb (entry_pred[0]);
5642   for (i = 0; i < num_entry_edges; i++)
5643     make_edge (entry_pred[i], bb, entry_flag[i]);
5644
5645   for (i = 0; i < num_exit_edges; i++)
5646     make_edge (bb, exit_succ[i], exit_flag[i]);
5647
5648   if (exit_bb)
5649     {
5650       free (exit_flag);
5651       free (exit_succ);
5652     }
5653   free (entry_flag);
5654   free (entry_pred);
5655   free_dominance_info (CDI_DOMINATORS);
5656   free_dominance_info (CDI_POST_DOMINATORS);
5657   VEC_free (basic_block, heap, bbs);
5658
5659   return bb;
5660 }
5661
5662
5663 /* Dump FUNCTION_DECL FN to file FILE using FLAGS (see TDF_* in tree.h)  */
5664
5665 void
5666 dump_function_to_file (tree fn, FILE *file, int flags)
5667 {
5668   tree arg, vars, var;
5669   struct function *dsf;
5670   bool ignore_topmost_bind = false, any_var = false;
5671   basic_block bb;
5672   tree chain;
5673   struct function *saved_cfun;
5674
5675   fprintf (file, "%s (", lang_hooks.decl_printable_name (fn, 2));
5676
5677   arg = DECL_ARGUMENTS (fn);
5678   while (arg)
5679     {
5680       print_generic_expr (file, arg, dump_flags);
5681       if (TREE_CHAIN (arg))
5682         fprintf (file, ", ");
5683       arg = TREE_CHAIN (arg);
5684     }
5685   fprintf (file, ")\n");
5686
5687   dsf = DECL_STRUCT_FUNCTION (fn);
5688   if (dsf && (flags & TDF_DETAILS))
5689     dump_eh_tree (file, dsf);
5690
5691   if (flags & TDF_RAW)
5692     {
5693       dump_node (fn, TDF_SLIM | flags, file);
5694       return;
5695     }
5696
5697   /* Switch CFUN to point to FN.  */
5698   saved_cfun = cfun;
5699   cfun = DECL_STRUCT_FUNCTION (fn);
5700
5701   /* When GIMPLE is lowered, the variables are no longer available in
5702      BIND_EXPRs, so display them separately.  */
5703   if (cfun && cfun->decl == fn && cfun->unexpanded_var_list)
5704     {
5705       ignore_topmost_bind = true;
5706
5707       fprintf (file, "{\n");
5708       for (vars = cfun->unexpanded_var_list; vars; vars = TREE_CHAIN (vars))
5709         {
5710           var = TREE_VALUE (vars);
5711
5712           print_generic_decl (file, var, flags);
5713           fprintf (file, "\n");
5714
5715           any_var = true;
5716         }
5717     }
5718
5719   if (cfun && cfun->decl == fn && cfun->cfg && basic_block_info)
5720     {
5721       /* Make a CFG based dump.  */
5722       check_bb_profile (ENTRY_BLOCK_PTR, file);
5723       if (!ignore_topmost_bind)
5724         fprintf (file, "{\n");
5725
5726       if (any_var && n_basic_blocks)
5727         fprintf (file, "\n");
5728
5729       FOR_EACH_BB (bb)
5730         dump_generic_bb (file, bb, 2, flags);
5731
5732       fprintf (file, "}\n");
5733       check_bb_profile (EXIT_BLOCK_PTR, file);
5734     }
5735   else
5736     {
5737       int indent;
5738
5739       /* Make a tree based dump.  */
5740       chain = DECL_SAVED_TREE (fn);
5741
5742       if (chain && TREE_CODE (chain) == BIND_EXPR)
5743         {
5744           if (ignore_topmost_bind)
5745             {
5746               chain = BIND_EXPR_BODY (chain);
5747               indent = 2;
5748             }
5749           else
5750             indent = 0;
5751         }
5752       else
5753         {
5754           if (!ignore_topmost_bind)
5755             fprintf (file, "{\n");
5756           indent = 2;
5757         }
5758
5759       if (any_var)
5760         fprintf (file, "\n");
5761
5762       print_generic_stmt_indented (file, chain, flags, indent);
5763       if (ignore_topmost_bind)
5764         fprintf (file, "}\n");
5765     }
5766
5767   fprintf (file, "\n\n");
5768
5769   /* Restore CFUN.  */
5770   cfun = saved_cfun;
5771 }
5772
5773
5774 /* Dump FUNCTION_DECL FN to stderr using FLAGS (see TDF_* in tree.h)  */
5775
5776 void
5777 debug_function (tree fn, int flags)
5778 {
5779   dump_function_to_file (fn, stderr, flags);
5780 }
5781
5782
5783 /* Pretty print of the loops intermediate representation.  */
5784 static void print_loop (FILE *, struct loop *, int);
5785 static void print_pred_bbs (FILE *, basic_block bb);
5786 static void print_succ_bbs (FILE *, basic_block bb);
5787
5788
5789 /* Print on FILE the indexes for the predecessors of basic_block BB.  */
5790
5791 static void
5792 print_pred_bbs (FILE *file, basic_block bb)
5793 {
5794   edge e;
5795   edge_iterator ei;
5796
5797   FOR_EACH_EDGE (e, ei, bb->preds)
5798     fprintf (file, "bb_%d ", e->src->index);
5799 }
5800
5801
5802 /* Print on FILE the indexes for the successors of basic_block BB.  */
5803
5804 static void
5805 print_succ_bbs (FILE *file, basic_block bb)
5806 {
5807   edge e;
5808   edge_iterator ei;
5809
5810   FOR_EACH_EDGE (e, ei, bb->succs)
5811     fprintf (file, "bb_%d ", e->dest->index);
5812 }
5813
5814
5815 /* Pretty print LOOP on FILE, indented INDENT spaces.  */
5816
5817 static void
5818 print_loop (FILE *file, struct loop *loop, int indent)
5819 {
5820   char *s_indent;
5821   basic_block bb;
5822
5823   if (loop == NULL)
5824     return;
5825
5826   s_indent = (char *) alloca ((size_t) indent + 1);
5827   memset ((void *) s_indent, ' ', (size_t) indent);
5828   s_indent[indent] = '\0';
5829
5830   /* Print the loop's header.  */
5831   fprintf (file, "%sloop_%d\n", s_indent, loop->num);
5832
5833   /* Print the loop's body.  */
5834   fprintf (file, "%s{\n", s_indent);
5835   FOR_EACH_BB (bb)
5836     if (bb->loop_father == loop)
5837       {
5838         /* Print the basic_block's header.  */
5839         fprintf (file, "%s  bb_%d (preds = {", s_indent, bb->index);
5840         print_pred_bbs (file, bb);
5841         fprintf (file, "}, succs = {");
5842         print_succ_bbs (file, bb);
5843         fprintf (file, "})\n");
5844
5845         /* Print the basic_block's body.  */
5846         fprintf (file, "%s  {\n", s_indent);
5847         tree_dump_bb (bb, file, indent + 4);
5848         fprintf (file, "%s  }\n", s_indent);
5849       }
5850
5851   print_loop (file, loop->inner, indent + 2);
5852   fprintf (file, "%s}\n", s_indent);
5853   print_loop (file, loop->next, indent);
5854 }
5855
5856
5857 /* Follow a CFG edge from the entry point of the program, and on entry
5858    of a loop, pretty print the loop structure on FILE.  */
5859
5860 void
5861 print_loop_ir (FILE *file)
5862 {
5863   basic_block bb;
5864
5865   bb = BASIC_BLOCK (NUM_FIXED_BLOCKS);
5866   if (bb && bb->loop_father)
5867     print_loop (file, bb->loop_father, 0);
5868 }
5869
5870
5871 /* Debugging loops structure at tree level.  */
5872
5873 void
5874 debug_loop_ir (void)
5875 {
5876   print_loop_ir (stderr);
5877 }
5878
5879
5880 /* Return true if BB ends with a call, possibly followed by some
5881    instructions that must stay with the call.  Return false,
5882    otherwise.  */
5883
5884 static bool
5885 tree_block_ends_with_call_p (basic_block bb)
5886 {
5887   block_stmt_iterator bsi = bsi_last (bb);
5888   return get_call_expr_in (bsi_stmt (bsi)) != NULL;
5889 }
5890
5891
5892 /* Return true if BB ends with a conditional branch.  Return false,
5893    otherwise.  */
5894
5895 static bool
5896 tree_block_ends_with_condjump_p (basic_block bb)
5897 {
5898   tree stmt = last_stmt (bb);
5899   return (stmt && TREE_CODE (stmt) == COND_EXPR);
5900 }
5901
5902
5903 /* Return true if we need to add fake edge to exit at statement T.
5904    Helper function for tree_flow_call_edges_add.  */
5905
5906 static bool
5907 need_fake_edge_p (tree t)
5908 {
5909   tree call;
5910
5911   /* NORETURN and LONGJMP calls already have an edge to exit.
5912      CONST and PURE calls do not need one.
5913      We don't currently check for CONST and PURE here, although
5914      it would be a good idea, because those attributes are
5915      figured out from the RTL in mark_constant_function, and
5916      the counter incrementation code from -fprofile-arcs
5917      leads to different results from -fbranch-probabilities.  */
5918   call = get_call_expr_in (t);
5919   if (call
5920       && !(call_expr_flags (call) & ECF_NORETURN))
5921     return true;
5922
5923   if (TREE_CODE (t) == ASM_EXPR
5924        && (ASM_VOLATILE_P (t) || ASM_INPUT_P (t)))
5925     return true;
5926
5927   return false;
5928 }
5929
5930
5931 /* Add fake edges to the function exit for any non constant and non
5932    noreturn calls, volatile inline assembly in the bitmap of blocks
5933    specified by BLOCKS or to the whole CFG if BLOCKS is zero.  Return
5934    the number of blocks that were split.
5935
5936    The goal is to expose cases in which entering a basic block does
5937    not imply that all subsequent instructions must be executed.  */
5938
5939 static int
5940 tree_flow_call_edges_add (sbitmap blocks)
5941 {
5942   int i;
5943   int blocks_split = 0;
5944   int last_bb = last_basic_block;
5945   bool check_last_block = false;
5946
5947   if (n_basic_blocks == NUM_FIXED_BLOCKS)
5948     return 0;
5949
5950   if (! blocks)
5951     check_last_block = true;
5952   else
5953     check_last_block = TEST_BIT (blocks, EXIT_BLOCK_PTR->prev_bb->index);
5954
5955   /* In the last basic block, before epilogue generation, there will be
5956      a fallthru edge to EXIT.  Special care is required if the last insn
5957      of the last basic block is a call because make_edge folds duplicate
5958      edges, which would result in the fallthru edge also being marked
5959      fake, which would result in the fallthru edge being removed by
5960      remove_fake_edges, which would result in an invalid CFG.
5961
5962      Moreover, we can't elide the outgoing fake edge, since the block
5963      profiler needs to take this into account in order to solve the minimal
5964      spanning tree in the case that the call doesn't return.
5965
5966      Handle this by adding a dummy instruction in a new last basic block.  */
5967   if (check_last_block)
5968     {
5969       basic_block bb = EXIT_BLOCK_PTR->prev_bb;
5970       block_stmt_iterator bsi = bsi_last (bb);
5971       tree t = NULL_TREE;
5972       if (!bsi_end_p (bsi))
5973         t = bsi_stmt (bsi);
5974
5975       if (t && need_fake_edge_p (t))
5976         {
5977           edge e;
5978
5979           e = find_edge (bb, EXIT_BLOCK_PTR);
5980           if (e)
5981             {
5982               bsi_insert_on_edge (e, build_empty_stmt ());
5983               bsi_commit_edge_inserts ();
5984             }
5985         }
5986     }
5987
5988   /* Now add fake edges to the function exit for any non constant
5989      calls since there is no way that we can determine if they will
5990      return or not...  */
5991   for (i = 0; i < last_bb; i++)
5992     {
5993       basic_block bb = BASIC_BLOCK (i);
5994       block_stmt_iterator bsi;
5995       tree stmt, last_stmt;
5996
5997       if (!bb)
5998         continue;
5999
6000       if (blocks && !TEST_BIT (blocks, i))
6001         continue;
6002
6003       bsi = bsi_last (bb);
6004       if (!bsi_end_p (bsi))
6005         {
6006           last_stmt = bsi_stmt (bsi);
6007           do
6008             {
6009               stmt = bsi_stmt (bsi);
6010               if (need_fake_edge_p (stmt))
6011                 {
6012                   edge e;
6013                   /* The handling above of the final block before the
6014                      epilogue should be enough to verify that there is
6015                      no edge to the exit block in CFG already.
6016                      Calling make_edge in such case would cause us to
6017                      mark that edge as fake and remove it later.  */
6018 #ifdef ENABLE_CHECKING
6019                   if (stmt == last_stmt)
6020                     {
6021                       e = find_edge (bb, EXIT_BLOCK_PTR);
6022                       gcc_assert (e == NULL);
6023                     }
6024 #endif
6025
6026                   /* Note that the following may create a new basic block
6027                      and renumber the existing basic blocks.  */
6028                   if (stmt != last_stmt)
6029                     {
6030                       e = split_block (bb, stmt);
6031                       if (e)
6032                         blocks_split++;
6033                     }
6034                   make_edge (bb, EXIT_BLOCK_PTR, EDGE_FAKE);
6035                 }
6036               bsi_prev (&bsi);
6037             }
6038           while (!bsi_end_p (bsi));
6039         }
6040     }
6041
6042   if (blocks_split)
6043     verify_flow_info ();
6044
6045   return blocks_split;
6046 }
6047
6048 /* Purge dead abnormal call edges from basic block BB.  */
6049
6050 bool
6051 tree_purge_dead_abnormal_call_edges (basic_block bb)
6052 {
6053   bool changed = tree_purge_dead_eh_edges (bb);
6054
6055   if (current_function_has_nonlocal_label)
6056     {
6057       tree stmt = last_stmt (bb);
6058       edge_iterator ei;
6059       edge e;
6060
6061       if (!(stmt && tree_can_make_abnormal_goto (stmt)))
6062         for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
6063           {
6064             if (e->flags & EDGE_ABNORMAL)
6065               {
6066                 remove_edge (e);
6067                 changed = true;
6068               }
6069             else
6070               ei_next (&ei);
6071           }
6072
6073       /* See tree_purge_dead_eh_edges below.  */
6074       if (changed)
6075         free_dominance_info (CDI_DOMINATORS);
6076     }
6077
6078   return changed;
6079 }
6080
6081 /* Stores all basic blocks dominated by BB to DOM_BBS.  */
6082
6083 static void
6084 get_all_dominated_blocks (basic_block bb, VEC (basic_block, heap) **dom_bbs)
6085 {
6086   basic_block son;
6087
6088   VEC_safe_push (basic_block, heap, *dom_bbs, bb);
6089   for (son = first_dom_son (CDI_DOMINATORS, bb);
6090        son;
6091        son = next_dom_son (CDI_DOMINATORS, son))
6092     get_all_dominated_blocks (son, dom_bbs);
6093 }
6094
6095 /* Removes edge E and all the blocks dominated by it, and updates dominance
6096    information.  The IL in E->src needs to be updated separately.
6097    If dominance info is not available, only the edge E is removed.*/
6098
6099 void
6100 remove_edge_and_dominated_blocks (edge e)
6101 {
6102   VEC (basic_block, heap) *bbs_to_remove = NULL;
6103   VEC (basic_block, heap) *bbs_to_fix_dom = NULL;
6104   bitmap df, df_idom;
6105   edge f;
6106   edge_iterator ei;
6107   bool none_removed = false;
6108   unsigned i;
6109   basic_block bb, dbb;
6110   bitmap_iterator bi;
6111
6112   if (!dom_info_available_p (CDI_DOMINATORS))
6113     {
6114       remove_edge (e);
6115       return;
6116     }
6117
6118   /* No updating is needed for edges to exit.  */
6119   if (e->dest == EXIT_BLOCK_PTR)
6120     {
6121       if (cfgcleanup_altered_bbs)
6122         bitmap_set_bit (cfgcleanup_altered_bbs, e->src->index);
6123       remove_edge (e);
6124       return;
6125     }
6126
6127   /* First, we find the basic blocks to remove.  If E->dest has a predecessor
6128      that is not dominated by E->dest, then this set is empty.  Otherwise,
6129      all the basic blocks dominated by E->dest are removed.
6130
6131      Also, to DF_IDOM we store the immediate dominators of the blocks in
6132      the dominance frontier of E (i.e., of the successors of the
6133      removed blocks, if there are any, and of E->dest otherwise).  */
6134   FOR_EACH_EDGE (f, ei, e->dest->preds)
6135     {
6136       if (f == e)
6137         continue;
6138
6139       if (!dominated_by_p (CDI_DOMINATORS, f->src, e->dest))
6140         {
6141           none_removed = true;
6142           break;
6143         }
6144     }
6145
6146   df = BITMAP_ALLOC (NULL);
6147   df_idom = BITMAP_ALLOC (NULL);
6148
6149   if (none_removed)
6150     bitmap_set_bit (df_idom,
6151                     get_immediate_dominator (CDI_DOMINATORS, e->dest)->index);
6152   else
6153     {
6154       get_all_dominated_blocks (e->dest, &bbs_to_remove);
6155       for (i = 0; VEC_iterate (basic_block, bbs_to_remove, i, bb); i++)
6156         {
6157           FOR_EACH_EDGE (f, ei, bb->succs)
6158             {
6159               if (f->dest != EXIT_BLOCK_PTR)
6160                 bitmap_set_bit (df, f->dest->index);
6161             }
6162         }
6163       for (i = 0; VEC_iterate (basic_block, bbs_to_remove, i, bb); i++)
6164         bitmap_clear_bit (df, bb->index);
6165
6166       EXECUTE_IF_SET_IN_BITMAP (df, 0, i, bi)
6167         {
6168           bb = BASIC_BLOCK (i);
6169           bitmap_set_bit (df_idom,
6170                           get_immediate_dominator (CDI_DOMINATORS, bb)->index);
6171         }
6172     }
6173
6174   if (cfgcleanup_altered_bbs)
6175     {
6176       /* Record the set of the altered basic blocks.  */
6177       bitmap_set_bit (cfgcleanup_altered_bbs, e->src->index);
6178       bitmap_ior_into (cfgcleanup_altered_bbs, df);
6179     }
6180
6181   /* Remove E and the cancelled blocks.  */
6182   if (none_removed)
6183     remove_edge (e);
6184   else
6185     {
6186       for (i = 0; VEC_iterate (basic_block, bbs_to_remove, i, bb); i++)
6187         delete_basic_block (bb);
6188     }
6189
6190   /* Update the dominance information.  The immediate dominator may change only
6191      for blocks whose immediate dominator belongs to DF_IDOM:
6192    
6193      Suppose that idom(X) = Y before removal of E and idom(X) != Y after the
6194      removal.  Let Z the arbitrary block such that idom(Z) = Y and
6195      Z dominates X after the removal.  Before removal, there exists a path P
6196      from Y to X that avoids Z.  Let F be the last edge on P that is
6197      removed, and let W = F->dest.  Before removal, idom(W) = Y (since Y
6198      dominates W, and because of P, Z does not dominate W), and W belongs to
6199      the dominance frontier of E.  Therefore, Y belongs to DF_IDOM.  */ 
6200   EXECUTE_IF_SET_IN_BITMAP (df_idom, 0, i, bi)
6201     {
6202       bb = BASIC_BLOCK (i);
6203       for (dbb = first_dom_son (CDI_DOMINATORS, bb);
6204            dbb;
6205            dbb = next_dom_son (CDI_DOMINATORS, dbb))
6206         VEC_safe_push (basic_block, heap, bbs_to_fix_dom, dbb);
6207     }
6208
6209   iterate_fix_dominators (CDI_DOMINATORS, bbs_to_fix_dom, true);
6210
6211   BITMAP_FREE (df);
6212   BITMAP_FREE (df_idom);
6213   VEC_free (basic_block, heap, bbs_to_remove);
6214   VEC_free (basic_block, heap, bbs_to_fix_dom);
6215 }
6216
6217 /* Purge dead EH edges from basic block BB.  */
6218
6219 bool
6220 tree_purge_dead_eh_edges (basic_block bb)
6221 {
6222   bool changed = false;
6223   edge e;
6224   edge_iterator ei;
6225   tree stmt = last_stmt (bb);
6226
6227   if (stmt && tree_can_throw_internal (stmt))
6228     return false;
6229
6230   for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
6231     {
6232       if (e->flags & EDGE_EH)
6233         {
6234           remove_edge_and_dominated_blocks (e);
6235           changed = true;
6236         }
6237       else
6238         ei_next (&ei);
6239     }
6240
6241   return changed;
6242 }
6243
6244 bool
6245 tree_purge_all_dead_eh_edges (const_bitmap blocks)
6246 {
6247   bool changed = false;
6248   unsigned i;
6249   bitmap_iterator bi;
6250
6251   EXECUTE_IF_SET_IN_BITMAP (blocks, 0, i, bi)
6252     {
6253       changed |= tree_purge_dead_eh_edges (BASIC_BLOCK (i));
6254     }
6255
6256   return changed;
6257 }
6258
6259 /* This function is called whenever a new edge is created or
6260    redirected.  */
6261
6262 static void
6263 tree_execute_on_growing_pred (edge e)
6264 {
6265   basic_block bb = e->dest;
6266
6267   if (phi_nodes (bb))
6268     reserve_phi_args_for_new_edge (bb);
6269 }
6270
6271 /* This function is called immediately before edge E is removed from
6272    the edge vector E->dest->preds.  */
6273
6274 static void
6275 tree_execute_on_shrinking_pred (edge e)
6276 {
6277   if (phi_nodes (e->dest))
6278     remove_phi_args (e);
6279 }
6280
6281 /*---------------------------------------------------------------------------
6282   Helper functions for Loop versioning
6283   ---------------------------------------------------------------------------*/
6284
6285 /* Adjust phi nodes for 'first' basic block.  'second' basic block is a copy
6286    of 'first'. Both of them are dominated by 'new_head' basic block. When
6287    'new_head' was created by 'second's incoming edge it received phi arguments
6288    on the edge by split_edge(). Later, additional edge 'e' was created to
6289    connect 'new_head' and 'first'. Now this routine adds phi args on this
6290    additional edge 'e' that new_head to second edge received as part of edge
6291    splitting.
6292 */
6293
6294 static void
6295 tree_lv_adjust_loop_header_phi (basic_block first, basic_block second,
6296                                 basic_block new_head, edge e)
6297 {
6298   tree phi1, phi2;
6299   edge e2 = find_edge (new_head, second);
6300
6301   /* Because NEW_HEAD has been created by splitting SECOND's incoming
6302      edge, we should always have an edge from NEW_HEAD to SECOND.  */
6303   gcc_assert (e2 != NULL);
6304
6305   /* Browse all 'second' basic block phi nodes and add phi args to
6306      edge 'e' for 'first' head. PHI args are always in correct order.  */
6307
6308   for (phi2 = phi_nodes (second), phi1 = phi_nodes (first);
6309        phi2 && phi1;
6310        phi2 = PHI_CHAIN (phi2),  phi1 = PHI_CHAIN (phi1))
6311     {
6312       tree def = PHI_ARG_DEF (phi2, e2->dest_idx);
6313       add_phi_arg (phi1, def, e);
6314     }
6315 }
6316
6317 /* Adds a if else statement to COND_BB with condition COND_EXPR.
6318    SECOND_HEAD is the destination of the THEN and FIRST_HEAD is
6319    the destination of the ELSE part.  */
6320 static void
6321 tree_lv_add_condition_to_bb (basic_block first_head ATTRIBUTE_UNUSED,
6322                              basic_block second_head ATTRIBUTE_UNUSED,
6323                              basic_block cond_bb, void *cond_e)
6324 {
6325   block_stmt_iterator bsi;
6326   tree new_cond_expr = NULL_TREE;
6327   tree cond_expr = (tree) cond_e;
6328   edge e0;
6329
6330   /* Build new conditional expr */
6331   new_cond_expr = build3 (COND_EXPR, void_type_node, cond_expr,
6332                           NULL_TREE, NULL_TREE);
6333
6334   /* Add new cond in cond_bb.  */
6335   bsi = bsi_start (cond_bb);
6336   bsi_insert_after (&bsi, new_cond_expr, BSI_NEW_STMT);
6337   /* Adjust edges appropriately to connect new head with first head
6338      as well as second head.  */
6339   e0 = single_succ_edge (cond_bb);
6340   e0->flags &= ~EDGE_FALLTHRU;
6341   e0->flags |= EDGE_FALSE_VALUE;
6342 }
6343
6344 struct cfg_hooks tree_cfg_hooks = {
6345   "tree",
6346   tree_verify_flow_info,
6347   tree_dump_bb,                 /* dump_bb  */
6348   create_bb,                    /* create_basic_block  */
6349   tree_redirect_edge_and_branch,/* redirect_edge_and_branch  */
6350   tree_redirect_edge_and_branch_force,/* redirect_edge_and_branch_force  */
6351   tree_can_remove_branch_p,     /* can_remove_branch_p  */
6352   remove_bb,                    /* delete_basic_block  */
6353   tree_split_block,             /* split_block  */
6354   tree_move_block_after,        /* move_block_after  */
6355   tree_can_merge_blocks_p,      /* can_merge_blocks_p  */
6356   tree_merge_blocks,            /* merge_blocks  */
6357   tree_predict_edge,            /* predict_edge  */
6358   tree_predicted_by_p,          /* predicted_by_p  */
6359   tree_can_duplicate_bb_p,      /* can_duplicate_block_p  */
6360   tree_duplicate_bb,            /* duplicate_block  */
6361   tree_split_edge,              /* split_edge  */
6362   tree_make_forwarder_block,    /* make_forward_block  */
6363   NULL,                         /* tidy_fallthru_edge  */
6364   tree_block_ends_with_call_p,  /* block_ends_with_call_p */
6365   tree_block_ends_with_condjump_p, /* block_ends_with_condjump_p */
6366   tree_flow_call_edges_add,     /* flow_call_edges_add */
6367   tree_execute_on_growing_pred, /* execute_on_growing_pred */
6368   tree_execute_on_shrinking_pred, /* execute_on_shrinking_pred */
6369   tree_duplicate_loop_to_header_edge, /* duplicate loop for trees */
6370   tree_lv_add_condition_to_bb, /* lv_add_condition_to_bb */
6371   tree_lv_adjust_loop_header_phi, /* lv_adjust_loop_header_phi*/
6372   extract_true_false_edges_from_block, /* extract_cond_bb_edges */
6373   flush_pending_stmts           /* flush_pending_stmts */
6374 };
6375
6376
6377 /* Split all critical edges.  */
6378
6379 static unsigned int
6380 split_critical_edges (void)
6381 {
6382   basic_block bb;
6383   edge e;
6384   edge_iterator ei;
6385
6386   /* split_edge can redirect edges out of SWITCH_EXPRs, which can get
6387      expensive.  So we want to enable recording of edge to CASE_LABEL_EXPR
6388      mappings around the calls to split_edge.  */
6389   start_recording_case_labels ();
6390   FOR_ALL_BB (bb)
6391     {
6392       FOR_EACH_EDGE (e, ei, bb->succs)
6393         if (EDGE_CRITICAL_P (e) && !(e->flags & EDGE_ABNORMAL))
6394           {
6395             split_edge (e);
6396           }
6397     }
6398   end_recording_case_labels ();
6399   return 0;
6400 }
6401
6402 struct tree_opt_pass pass_split_crit_edges =
6403 {
6404   "crited",                          /* name */
6405   NULL,                          /* gate */
6406   split_critical_edges,          /* execute */
6407   NULL,                          /* sub */
6408   NULL,                          /* next */
6409   0,                             /* static_pass_number */
6410   TV_TREE_SPLIT_EDGES,           /* tv_id */
6411   PROP_cfg,                      /* properties required */
6412   PROP_no_crit_edges,            /* properties_provided */
6413   0,                             /* properties_destroyed */
6414   0,                             /* todo_flags_start */
6415   TODO_dump_func,                /* todo_flags_finish */
6416   0                              /* letter */
6417 };
6418
6419 \f
6420 /* Return EXP if it is a valid GIMPLE rvalue, else gimplify it into
6421    a temporary, make sure and register it to be renamed if necessary,
6422    and finally return the temporary.  Put the statements to compute
6423    EXP before the current statement in BSI.  */
6424
6425 tree
6426 gimplify_val (block_stmt_iterator *bsi, tree type, tree exp)
6427 {
6428   tree t, new_stmt, orig_stmt;
6429
6430   if (is_gimple_val (exp))
6431     return exp;
6432
6433   t = make_rename_temp (type, NULL);
6434   new_stmt = build_gimple_modify_stmt (t, exp);
6435
6436   orig_stmt = bsi_stmt (*bsi);
6437   SET_EXPR_LOCUS (new_stmt, EXPR_LOCUS (orig_stmt));
6438   TREE_BLOCK (new_stmt) = TREE_BLOCK (orig_stmt);
6439
6440   bsi_insert_before (bsi, new_stmt, BSI_SAME_STMT);
6441   if (gimple_in_ssa_p (cfun))
6442     mark_symbols_for_renaming (new_stmt);
6443
6444   return t;
6445 }
6446
6447 /* Build a ternary operation and gimplify it.  Emit code before BSI.
6448    Return the gimple_val holding the result.  */
6449
6450 tree
6451 gimplify_build3 (block_stmt_iterator *bsi, enum tree_code code,
6452                  tree type, tree a, tree b, tree c)
6453 {
6454   tree ret;
6455
6456   ret = fold_build3 (code, type, a, b, c);
6457   STRIP_NOPS (ret);
6458
6459   return gimplify_val (bsi, type, ret);
6460 }
6461
6462 /* Build a binary operation and gimplify it.  Emit code before BSI.
6463    Return the gimple_val holding the result.  */
6464
6465 tree
6466 gimplify_build2 (block_stmt_iterator *bsi, enum tree_code code,
6467                  tree type, tree a, tree b)
6468 {
6469   tree ret;
6470
6471   ret = fold_build2 (code, type, a, b);
6472   STRIP_NOPS (ret);
6473
6474   return gimplify_val (bsi, type, ret);
6475 }
6476
6477 /* Build a unary operation and gimplify it.  Emit code before BSI.
6478    Return the gimple_val holding the result.  */
6479
6480 tree
6481 gimplify_build1 (block_stmt_iterator *bsi, enum tree_code code, tree type,
6482                  tree a)
6483 {
6484   tree ret;
6485
6486   ret = fold_build1 (code, type, a);
6487   STRIP_NOPS (ret);
6488
6489   return gimplify_val (bsi, type, ret);
6490 }
6491
6492
6493 \f
6494 /* Emit return warnings.  */
6495
6496 static unsigned int
6497 execute_warn_function_return (void)
6498 {
6499 #ifdef USE_MAPPED_LOCATION
6500   source_location location;
6501 #else
6502   location_t *locus;
6503 #endif
6504   tree last;
6505   edge e;
6506   edge_iterator ei;
6507
6508   /* If we have a path to EXIT, then we do return.  */
6509   if (TREE_THIS_VOLATILE (cfun->decl)
6510       && EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0)
6511     {
6512 #ifdef USE_MAPPED_LOCATION
6513       location = UNKNOWN_LOCATION;
6514 #else
6515       locus = NULL;
6516 #endif
6517       FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
6518         {
6519           last = last_stmt (e->src);
6520           if (TREE_CODE (last) == RETURN_EXPR
6521 #ifdef USE_MAPPED_LOCATION
6522               && (location = EXPR_LOCATION (last)) != UNKNOWN_LOCATION)
6523 #else
6524               && (locus = EXPR_LOCUS (last)) != NULL)
6525 #endif
6526             break;
6527         }
6528 #ifdef USE_MAPPED_LOCATION
6529       if (location == UNKNOWN_LOCATION)
6530         location = cfun->function_end_locus;
6531       warning (0, "%H%<noreturn%> function does return", &location);
6532 #else
6533       if (!locus)
6534         locus = &cfun->function_end_locus;
6535       warning (0, "%H%<noreturn%> function does return", locus);
6536 #endif
6537     }
6538
6539   /* If we see "return;" in some basic block, then we do reach the end
6540      without returning a value.  */
6541   else if (warn_return_type
6542            && !TREE_NO_WARNING (cfun->decl)
6543            && EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0
6544            && !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (cfun->decl))))
6545     {
6546       FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
6547         {
6548           tree last = last_stmt (e->src);
6549           if (TREE_CODE (last) == RETURN_EXPR
6550               && TREE_OPERAND (last, 0) == NULL
6551               && !TREE_NO_WARNING (last))
6552             {
6553 #ifdef USE_MAPPED_LOCATION
6554               location = EXPR_LOCATION (last);
6555               if (location == UNKNOWN_LOCATION)
6556                   location = cfun->function_end_locus;
6557               warning (0, "%Hcontrol reaches end of non-void function", &location);
6558 #else
6559               locus = EXPR_LOCUS (last);
6560               if (!locus)
6561                 locus = &cfun->function_end_locus;
6562               warning (0, "%Hcontrol reaches end of non-void function", locus);
6563 #endif
6564               TREE_NO_WARNING (cfun->decl) = 1;
6565               break;
6566             }
6567         }
6568     }
6569   return 0;
6570 }
6571
6572
6573 /* Given a basic block B which ends with a conditional and has
6574    precisely two successors, determine which of the edges is taken if
6575    the conditional is true and which is taken if the conditional is
6576    false.  Set TRUE_EDGE and FALSE_EDGE appropriately.  */
6577
6578 void
6579 extract_true_false_edges_from_block (basic_block b,
6580                                      edge *true_edge,
6581                                      edge *false_edge)
6582 {
6583   edge e = EDGE_SUCC (b, 0);
6584
6585   if (e->flags & EDGE_TRUE_VALUE)
6586     {
6587       *true_edge = e;
6588       *false_edge = EDGE_SUCC (b, 1);
6589     }
6590   else
6591     {
6592       *false_edge = e;
6593       *true_edge = EDGE_SUCC (b, 1);
6594     }
6595 }
6596
6597 struct tree_opt_pass pass_warn_function_return =
6598 {
6599   NULL,                                 /* name */
6600   NULL,                                 /* gate */
6601   execute_warn_function_return,         /* execute */
6602   NULL,                                 /* sub */
6603   NULL,                                 /* next */
6604   0,                                    /* static_pass_number */
6605   0,                                    /* tv_id */
6606   PROP_cfg,                             /* properties_required */
6607   0,                                    /* properties_provided */
6608   0,                                    /* properties_destroyed */
6609   0,                                    /* todo_flags_start */
6610   0,                                    /* todo_flags_finish */
6611   0                                     /* letter */
6612 };
6613
6614 /* Emit noreturn warnings.  */
6615
6616 static unsigned int
6617 execute_warn_function_noreturn (void)
6618 {
6619   if (warn_missing_noreturn
6620       && !TREE_THIS_VOLATILE (cfun->decl)
6621       && EDGE_COUNT (EXIT_BLOCK_PTR->preds) == 0
6622       && !lang_hooks.function.missing_noreturn_ok_p (cfun->decl))
6623     warning (OPT_Wmissing_noreturn, "%Jfunction might be possible candidate "
6624              "for attribute %<noreturn%>",
6625              cfun->decl);
6626   return 0;
6627 }
6628
6629 struct tree_opt_pass pass_warn_function_noreturn =
6630 {
6631   NULL,                                 /* name */
6632   NULL,                                 /* gate */
6633   execute_warn_function_noreturn,       /* execute */
6634   NULL,                                 /* sub */
6635   NULL,                                 /* next */
6636   0,                                    /* static_pass_number */
6637   0,                                    /* tv_id */
6638   PROP_cfg,                             /* properties_required */
6639   0,                                    /* properties_provided */
6640   0,                                    /* properties_destroyed */
6641   0,                                    /* todo_flags_start */
6642   0,                                    /* todo_flags_finish */
6643   0                                     /* letter */
6644 };