OSDN Git Service

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