OSDN Git Service

2008-09-17 Richard Guenther <rguenther@suse.de>
[pf3gnuchains/gcc-fork.git] / gcc / tree-cfg.c
1 /* Control flow functions for trees.
2    Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
3    Free Software Foundation, Inc.
4    Contributed by Diego Novillo <dnovillo@redhat.com>
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
11 any later version.
12
13 GCC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "tree.h"
27 #include "rtl.h"
28 #include "tm_p.h"
29 #include "hard-reg-set.h"
30 #include "basic-block.h"
31 #include "output.h"
32 #include "flags.h"
33 #include "function.h"
34 #include "expr.h"
35 #include "ggc.h"
36 #include "langhooks.h"
37 #include "diagnostic.h"
38 #include "tree-flow.h"
39 #include "timevar.h"
40 #include "tree-dump.h"
41 #include "tree-pass.h"
42 #include "toplev.h"
43 #include "except.h"
44 #include "cfgloop.h"
45 #include "cfglayout.h"
46 #include "tree-ssa-propagate.h"
47 #include "value-prof.h"
48 #include "pointer-set.h"
49 #include "tree-inline.h"
50
51 /* This file contains functions for building the Control Flow Graph (CFG)
52    for a function tree.  */
53
54 /* Local declarations.  */
55
56 /* Initial capacity for the basic block array.  */
57 static const int initial_cfg_capacity = 20;
58
59 /* This hash table allows us to efficiently lookup all CASE_LABEL_EXPRs
60    which use a particular edge.  The CASE_LABEL_EXPRs are chained together
61    via their TREE_CHAIN field, which we clear after we're done with the
62    hash table to prevent problems with duplication of GIMPLE_SWITCHes.
63
64    Access to this list of CASE_LABEL_EXPRs allows us to efficiently
65    update the case vector in response to edge redirections.
66
67    Right now this table is set up and torn down at key points in the
68    compilation process.  It would be nice if we could make the table
69    more persistent.  The key is getting notification of changes to
70    the CFG (particularly edge removal, creation and redirection).  */
71
72 static struct pointer_map_t *edge_to_cases;
73
74 /* CFG statistics.  */
75 struct cfg_stats_d
76 {
77   long num_merged_labels;
78 };
79
80 static struct cfg_stats_d cfg_stats;
81
82 /* Nonzero if we found a computed goto while building basic blocks.  */
83 static bool found_computed_goto;
84
85 /* Basic blocks and flowgraphs.  */
86 static void make_blocks (gimple_seq);
87 static void factor_computed_gotos (void);
88
89 /* Edges.  */
90 static void make_edges (void);
91 static void make_cond_expr_edges (basic_block);
92 static void make_gimple_switch_edges (basic_block);
93 static void make_goto_expr_edges (basic_block);
94 static edge gimple_redirect_edge_and_branch (edge, basic_block);
95 static edge gimple_try_redirect_by_replacing_jump (edge, basic_block);
96 static unsigned int split_critical_edges (void);
97
98 /* Various helpers.  */
99 static inline bool stmt_starts_bb_p (gimple, gimple);
100 static int gimple_verify_flow_info (void);
101 static void gimple_make_forwarder_block (edge);
102 static void gimple_cfg2vcg (FILE *);
103
104 /* Flowgraph optimization and cleanup.  */
105 static void gimple_merge_blocks (basic_block, basic_block);
106 static bool gimple_can_merge_blocks_p (basic_block, basic_block);
107 static void remove_bb (basic_block);
108 static edge find_taken_edge_computed_goto (basic_block, tree);
109 static edge find_taken_edge_cond_expr (basic_block, tree);
110 static edge find_taken_edge_switch_expr (basic_block, tree);
111 static tree find_case_label_for_value (gimple, tree);
112
113 void
114 init_empty_tree_cfg_for_function (struct function *fn)
115 {
116   /* Initialize the basic block array.  */
117   init_flow (fn);
118   profile_status_for_function (fn) = PROFILE_ABSENT;
119   n_basic_blocks_for_function (fn) = NUM_FIXED_BLOCKS;
120   last_basic_block_for_function (fn) = NUM_FIXED_BLOCKS;
121   basic_block_info_for_function (fn)
122     = VEC_alloc (basic_block, gc, initial_cfg_capacity);
123   VEC_safe_grow_cleared (basic_block, gc,
124                          basic_block_info_for_function (fn),
125                          initial_cfg_capacity);
126
127   /* Build a mapping of labels to their associated blocks.  */
128   label_to_block_map_for_function (fn)
129     = VEC_alloc (basic_block, gc, initial_cfg_capacity);
130   VEC_safe_grow_cleared (basic_block, gc,
131                          label_to_block_map_for_function (fn),
132                          initial_cfg_capacity);
133
134   SET_BASIC_BLOCK_FOR_FUNCTION (fn, ENTRY_BLOCK, 
135                                 ENTRY_BLOCK_PTR_FOR_FUNCTION (fn));
136   SET_BASIC_BLOCK_FOR_FUNCTION (fn, EXIT_BLOCK, 
137                    EXIT_BLOCK_PTR_FOR_FUNCTION (fn));
138
139   ENTRY_BLOCK_PTR_FOR_FUNCTION (fn)->next_bb
140     = EXIT_BLOCK_PTR_FOR_FUNCTION (fn);
141   EXIT_BLOCK_PTR_FOR_FUNCTION (fn)->prev_bb
142     = ENTRY_BLOCK_PTR_FOR_FUNCTION (fn);
143 }
144
145 void
146 init_empty_tree_cfg (void)
147 {
148   init_empty_tree_cfg_for_function (cfun);
149 }
150
151 /*---------------------------------------------------------------------------
152                               Create basic blocks
153 ---------------------------------------------------------------------------*/
154
155 /* Entry point to the CFG builder for trees.  SEQ is the sequence of
156    statements to be added to the flowgraph.  */
157
158 static void
159 build_gimple_cfg (gimple_seq seq)
160 {
161   /* Register specific gimple functions.  */
162   gimple_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 (seq);
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     VEC_safe_grow_cleared (basic_block, gc, basic_block_info, n_basic_blocks);
186
187   /* To speed up statement iterator walks, we first purge dead labels.  */
188   cleanup_dead_labels ();
189
190   /* Group case nodes to reduce the number of edges.
191      We do this after cleaning up dead labels because otherwise we miss
192      a lot of obvious case merging opportunities.  */
193   group_case_labels ();
194
195   /* Create the edges of the flowgraph.  */
196   make_edges ();
197   cleanup_dead_labels ();
198
199   /* Debugging dumps.  */
200
201   /* Write the flowgraph to a VCG file.  */
202   {
203     int local_dump_flags;
204     FILE *vcg_file = dump_begin (TDI_vcg, &local_dump_flags);
205     if (vcg_file)
206       {
207         gimple_cfg2vcg (vcg_file);
208         dump_end (TDI_vcg, vcg_file);
209       }
210   }
211
212 #ifdef ENABLE_CHECKING
213   verify_stmts ();
214 #endif
215 }
216
217 static unsigned int
218 execute_build_cfg (void)
219 {
220   gimple_seq body = gimple_body (current_function_decl);
221
222   build_gimple_cfg (body);
223   gimple_set_body (current_function_decl, NULL);
224   return 0;
225 }
226
227 struct gimple_opt_pass pass_build_cfg =
228 {
229  {
230   GIMPLE_PASS,
231   "cfg",                                /* name */
232   NULL,                                 /* gate */
233   execute_build_cfg,                    /* execute */
234   NULL,                                 /* sub */
235   NULL,                                 /* next */
236   0,                                    /* static_pass_number */
237   TV_TREE_CFG,                          /* tv_id */
238   PROP_gimple_leh,                      /* properties_required */
239   PROP_cfg,                             /* properties_provided */
240   0,                                    /* properties_destroyed */
241   0,                                    /* todo_flags_start */
242   TODO_verify_stmts | TODO_cleanup_cfg
243   | TODO_dump_func                      /* todo_flags_finish */
244  }
245 };
246
247
248 /* Return true if T is a computed goto.  */
249
250 static bool
251 computed_goto_p (gimple t)
252 {
253   return (gimple_code (t) == GIMPLE_GOTO
254           && TREE_CODE (gimple_goto_dest (t)) != LABEL_DECL);
255 }
256
257
258 /* Search the CFG for any computed gotos.  If found, factor them to a
259    common computed goto site.  Also record the location of that site so
260    that we can un-factor the gotos after we have converted back to
261    normal form.  */
262
263 static void
264 factor_computed_gotos (void)
265 {
266   basic_block bb;
267   tree factored_label_decl = NULL;
268   tree var = NULL;
269   gimple factored_computed_goto_label = NULL;
270   gimple factored_computed_goto = NULL;
271
272   /* We know there are one or more computed gotos in this function.
273      Examine the last statement in each basic block to see if the block
274      ends with a computed goto.  */
275
276   FOR_EACH_BB (bb)
277     {
278       gimple_stmt_iterator gsi = gsi_last_bb (bb);
279       gimple last;
280
281       if (gsi_end_p (gsi))
282         continue;
283
284       last = gsi_stmt (gsi);
285
286       /* Ignore the computed goto we create when we factor the original
287          computed gotos.  */
288       if (last == factored_computed_goto)
289         continue;
290
291       /* If the last statement is a computed goto, factor it.  */
292       if (computed_goto_p (last))
293         {
294           gimple assignment;
295
296           /* The first time we find a computed goto we need to create
297              the factored goto block and the variable each original
298              computed goto will use for their goto destination.  */
299           if (!factored_computed_goto)
300             {
301               basic_block new_bb = create_empty_bb (bb);
302               gimple_stmt_iterator new_gsi = gsi_start_bb (new_bb);
303
304               /* Create the destination of the factored goto.  Each original
305                  computed goto will put its desired destination into this
306                  variable and jump to the label we create immediately
307                  below.  */
308               var = create_tmp_var (ptr_type_node, "gotovar");
309
310               /* Build a label for the new block which will contain the
311                  factored computed goto.  */
312               factored_label_decl = create_artificial_label ();
313               factored_computed_goto_label
314                 = gimple_build_label (factored_label_decl);
315               gsi_insert_after (&new_gsi, factored_computed_goto_label,
316                                 GSI_NEW_STMT);
317
318               /* Build our new computed goto.  */
319               factored_computed_goto = gimple_build_goto (var);
320               gsi_insert_after (&new_gsi, factored_computed_goto, GSI_NEW_STMT);
321             }
322
323           /* Copy the original computed goto's destination into VAR.  */
324           assignment = gimple_build_assign (var, gimple_goto_dest (last));
325           gsi_insert_before (&gsi, assignment, GSI_SAME_STMT);
326
327           /* And re-vector the computed goto to the new destination.  */
328           gimple_goto_set_dest (last, factored_label_decl);
329         }
330     }
331 }
332
333
334 /* Build a flowgraph for the sequence of stmts SEQ.  */
335
336 static void
337 make_blocks (gimple_seq seq)
338 {
339   gimple_stmt_iterator i = gsi_start (seq);
340   gimple stmt = NULL;
341   bool start_new_block = true;
342   bool first_stmt_of_seq = true;
343   basic_block bb = ENTRY_BLOCK_PTR;
344
345   while (!gsi_end_p (i))
346     {
347       gimple prev_stmt;
348
349       prev_stmt = stmt;
350       stmt = gsi_stmt (i);
351
352       /* If the statement starts a new basic block or if we have determined
353          in a previous pass that we need to create a new block for STMT, do
354          so now.  */
355       if (start_new_block || stmt_starts_bb_p (stmt, prev_stmt))
356         {
357           if (!first_stmt_of_seq)
358             seq = gsi_split_seq_before (&i);
359           bb = create_basic_block (seq, NULL, bb);
360           start_new_block = false;
361         }
362
363       /* Now add STMT to BB and create the subgraphs for special statement
364          codes.  */
365       gimple_set_bb (stmt, bb);
366
367       if (computed_goto_p (stmt))
368         found_computed_goto = true;
369
370       /* If STMT is a basic block terminator, set START_NEW_BLOCK for the
371          next iteration.  */
372       if (stmt_ends_bb_p (stmt))
373         start_new_block = true;
374
375       gsi_next (&i);
376       first_stmt_of_seq = false;
377     }
378 }
379
380
381 /* Create and return a new empty basic block after bb AFTER.  */
382
383 static basic_block
384 create_bb (void *h, void *e, basic_block after)
385 {
386   basic_block bb;
387
388   gcc_assert (!e);
389
390   /* Create and initialize a new basic block.  Since alloc_block uses
391      ggc_alloc_cleared to allocate a basic block, we do not have to
392      clear the newly allocated basic block here.  */
393   bb = alloc_block ();
394
395   bb->index = last_basic_block;
396   bb->flags = BB_NEW;
397   bb->il.gimple = GGC_CNEW (struct gimple_bb_info);
398   set_bb_seq (bb, h ? (gimple_seq) h : gimple_seq_alloc ());
399
400   /* Add the new block to the linked list of blocks.  */
401   link_block (bb, after);
402
403   /* Grow the basic block array if needed.  */
404   if ((size_t) last_basic_block == VEC_length (basic_block, basic_block_info))
405     {
406       size_t new_size = last_basic_block + (last_basic_block + 3) / 4;
407       VEC_safe_grow_cleared (basic_block, gc, basic_block_info, new_size);
408     }
409
410   /* Add the newly created block to the array.  */
411   SET_BASIC_BLOCK (last_basic_block, bb);
412
413   n_basic_blocks++;
414   last_basic_block++;
415
416   return bb;
417 }
418
419
420 /*---------------------------------------------------------------------------
421                                  Edge creation
422 ---------------------------------------------------------------------------*/
423
424 /* Fold COND_EXPR_COND of each COND_EXPR.  */
425
426 void
427 fold_cond_expr_cond (void)
428 {
429   basic_block bb;
430
431   FOR_EACH_BB (bb)
432     {
433       gimple stmt = last_stmt (bb);
434
435       if (stmt && gimple_code (stmt) == GIMPLE_COND)
436         {
437           tree cond;
438           bool zerop, onep;
439
440           fold_defer_overflow_warnings ();
441           cond = fold_binary (gimple_cond_code (stmt), boolean_type_node,
442                               gimple_cond_lhs (stmt), gimple_cond_rhs (stmt));
443           if (cond)
444             {
445               zerop = integer_zerop (cond);
446               onep = integer_onep (cond);
447             }
448           else
449             zerop = onep = false;
450
451           fold_undefer_overflow_warnings (zerop || onep,
452                                           stmt,
453                                           WARN_STRICT_OVERFLOW_CONDITIONAL);
454           if (zerop)
455             gimple_cond_make_false (stmt);
456           else if (onep)
457             gimple_cond_make_true (stmt);
458         }
459     }
460 }
461
462 /* Join all the blocks in the flowgraph.  */
463
464 static void
465 make_edges (void)
466 {
467   basic_block bb;
468   struct omp_region *cur_region = NULL;
469
470   /* Create an edge from entry to the first block with executable
471      statements in it.  */
472   make_edge (ENTRY_BLOCK_PTR, BASIC_BLOCK (NUM_FIXED_BLOCKS), EDGE_FALLTHRU);
473
474   /* Traverse the basic block array placing edges.  */
475   FOR_EACH_BB (bb)
476     {
477       gimple last = last_stmt (bb);
478       bool fallthru;
479
480       if (last)
481         {
482           enum gimple_code code = gimple_code (last);
483           switch (code)
484             {
485             case GIMPLE_GOTO:
486               make_goto_expr_edges (bb);
487               fallthru = false;
488               break;
489             case GIMPLE_RETURN:
490               make_edge (bb, EXIT_BLOCK_PTR, 0);
491               fallthru = false;
492               break;
493             case GIMPLE_COND:
494               make_cond_expr_edges (bb);
495               fallthru = false;
496               break;
497             case GIMPLE_SWITCH:
498               make_gimple_switch_edges (bb);
499               fallthru = false;
500               break;
501             case GIMPLE_RESX:
502               make_eh_edges (last);
503               fallthru = false;
504               break;
505
506             case GIMPLE_CALL:
507               /* If this function receives a nonlocal goto, then we need to
508                  make edges from this call site to all the nonlocal goto
509                  handlers.  */
510               if (stmt_can_make_abnormal_goto (last))
511                 make_abnormal_goto_edges (bb, true);
512
513               /* If this statement has reachable exception handlers, then
514                  create abnormal edges to them.  */
515               make_eh_edges (last);
516
517               /* Some calls are known not to return.  */
518               fallthru = !(gimple_call_flags (last) & ECF_NORETURN);
519               break;
520
521             case GIMPLE_ASSIGN:
522                /* A GIMPLE_ASSIGN may throw internally and thus be considered
523                   control-altering. */
524               if (is_ctrl_altering_stmt (last))
525                 {
526                   make_eh_edges (last);
527                 }
528               fallthru = true;
529               break;
530
531             case GIMPLE_OMP_PARALLEL:
532             case GIMPLE_OMP_TASK:
533             case GIMPLE_OMP_FOR:
534             case GIMPLE_OMP_SINGLE:
535             case GIMPLE_OMP_MASTER:
536             case GIMPLE_OMP_ORDERED:
537             case GIMPLE_OMP_CRITICAL:
538             case GIMPLE_OMP_SECTION:
539               cur_region = new_omp_region (bb, code, cur_region);
540               fallthru = true;
541               break;
542
543             case GIMPLE_OMP_SECTIONS:
544               cur_region = new_omp_region (bb, code, cur_region);
545               fallthru = true;
546               break;
547
548             case GIMPLE_OMP_SECTIONS_SWITCH:
549               fallthru = false;
550               break;
551
552
553             case GIMPLE_OMP_ATOMIC_LOAD:
554             case GIMPLE_OMP_ATOMIC_STORE:
555                fallthru = true;
556                break;
557
558
559             case GIMPLE_OMP_RETURN:
560               /* In the case of a GIMPLE_OMP_SECTION, the edge will go
561                  somewhere other than the next block.  This will be
562                  created later.  */
563               cur_region->exit = bb;
564               fallthru = cur_region->type != GIMPLE_OMP_SECTION;
565               cur_region = cur_region->outer;
566               break;
567
568             case GIMPLE_OMP_CONTINUE:
569               cur_region->cont = bb;
570               switch (cur_region->type)
571                 {
572                 case GIMPLE_OMP_FOR:
573                   /* Mark all GIMPLE_OMP_FOR and GIMPLE_OMP_CONTINUE
574                      succs edges as abnormal to prevent splitting
575                      them.  */
576                   single_succ_edge (cur_region->entry)->flags |= EDGE_ABNORMAL;
577                   /* Make the loopback edge.  */
578                   make_edge (bb, single_succ (cur_region->entry),
579                              EDGE_ABNORMAL);
580
581                   /* Create an edge from GIMPLE_OMP_FOR to exit, which
582                      corresponds to the case that the body of the loop
583                      is not executed at all.  */
584                   make_edge (cur_region->entry, bb->next_bb, EDGE_ABNORMAL);
585                   make_edge (bb, bb->next_bb, EDGE_FALLTHRU | EDGE_ABNORMAL);
586                   fallthru = false;
587                   break;
588
589                 case GIMPLE_OMP_SECTIONS:
590                   /* Wire up the edges into and out of the nested sections.  */
591                   {
592                     basic_block switch_bb = single_succ (cur_region->entry);
593
594                     struct omp_region *i;
595                     for (i = cur_region->inner; i ; i = i->next)
596                       {
597                         gcc_assert (i->type == GIMPLE_OMP_SECTION);
598                         make_edge (switch_bb, i->entry, 0);
599                         make_edge (i->exit, bb, EDGE_FALLTHRU);
600                       }
601
602                     /* Make the loopback edge to the block with
603                        GIMPLE_OMP_SECTIONS_SWITCH.  */
604                     make_edge (bb, switch_bb, 0);
605
606                     /* Make the edge from the switch to exit.  */
607                     make_edge (switch_bb, bb->next_bb, 0);
608                     fallthru = false;
609                   }
610                   break;
611
612                 default:
613                   gcc_unreachable ();
614                 }
615               break;
616
617             default:
618               gcc_assert (!stmt_ends_bb_p (last));
619               fallthru = true;
620             }
621         }
622       else
623         fallthru = true;
624
625       if (fallthru)
626         make_edge (bb, bb->next_bb, EDGE_FALLTHRU);
627     }
628
629   if (root_omp_region)
630     free_omp_regions ();
631
632   /* Fold COND_EXPR_COND of each COND_EXPR.  */
633   fold_cond_expr_cond ();
634 }
635
636
637 /* Create the edges for a GIMPLE_COND starting at block BB.  */
638
639 static void
640 make_cond_expr_edges (basic_block bb)
641 {
642   gimple entry = last_stmt (bb);
643   gimple then_stmt, else_stmt;
644   basic_block then_bb, else_bb;
645   tree then_label, else_label;
646   edge e;
647
648   gcc_assert (entry);
649   gcc_assert (gimple_code (entry) == GIMPLE_COND);
650
651   /* Entry basic blocks for each component.  */
652   then_label = gimple_cond_true_label (entry);
653   else_label = gimple_cond_false_label (entry);
654   then_bb = label_to_block (then_label);
655   else_bb = label_to_block (else_label);
656   then_stmt = first_stmt (then_bb);
657   else_stmt = first_stmt (else_bb);
658
659   e = make_edge (bb, then_bb, EDGE_TRUE_VALUE);
660   e->goto_locus = gimple_location (then_stmt);
661   e = make_edge (bb, else_bb, EDGE_FALSE_VALUE);
662   if (e)
663     e->goto_locus = gimple_location (else_stmt);
664
665   /* We do not need the labels anymore.  */
666   gimple_cond_set_true_label (entry, NULL_TREE);
667   gimple_cond_set_false_label (entry, NULL_TREE);
668 }
669
670
671 /* Called for each element in the hash table (P) as we delete the
672    edge to cases hash table.
673
674    Clear all the TREE_CHAINs to prevent problems with copying of
675    SWITCH_EXPRs and structure sharing rules, then free the hash table
676    element.  */
677
678 static bool
679 edge_to_cases_cleanup (const void *key ATTRIBUTE_UNUSED, void **value,
680                        void *data ATTRIBUTE_UNUSED)
681 {
682   tree t, next;
683
684   for (t = (tree) *value; t; t = next)
685     {
686       next = TREE_CHAIN (t);
687       TREE_CHAIN (t) = NULL;
688     }
689
690   *value = NULL;
691   return false;
692 }
693
694 /* Start recording information mapping edges to case labels.  */
695
696 void
697 start_recording_case_labels (void)
698 {
699   gcc_assert (edge_to_cases == NULL);
700   edge_to_cases = pointer_map_create ();
701 }
702
703 /* Return nonzero if we are recording information for case labels.  */
704
705 static bool
706 recording_case_labels_p (void)
707 {
708   return (edge_to_cases != NULL);
709 }
710
711 /* Stop recording information mapping edges to case labels and
712    remove any information we have recorded.  */
713 void
714 end_recording_case_labels (void)
715 {
716   pointer_map_traverse (edge_to_cases, edge_to_cases_cleanup, NULL);
717   pointer_map_destroy (edge_to_cases);
718   edge_to_cases = NULL;
719 }
720
721 /* If we are inside a {start,end}_recording_cases block, then return
722    a chain of CASE_LABEL_EXPRs from T which reference E.
723
724    Otherwise return NULL.  */
725
726 static tree
727 get_cases_for_edge (edge e, gimple t)
728 {
729   void **slot;
730   size_t i, n;
731
732   /* If we are not recording cases, then we do not have CASE_LABEL_EXPR
733      chains available.  Return NULL so the caller can detect this case.  */
734   if (!recording_case_labels_p ())
735     return NULL;
736
737   slot = pointer_map_contains (edge_to_cases, e);
738   if (slot)
739     return (tree) *slot;
740
741   /* If we did not find E in the hash table, then this must be the first
742      time we have been queried for information about E & T.  Add all the
743      elements from T to the hash table then perform the query again.  */
744
745   n = gimple_switch_num_labels (t);
746   for (i = 0; i < n; i++)
747     {
748       tree elt = gimple_switch_label (t, i);
749       tree lab = CASE_LABEL (elt);
750       basic_block label_bb = label_to_block (lab);
751       edge this_edge = find_edge (e->src, label_bb);
752
753       /* Add it to the chain of CASE_LABEL_EXPRs referencing E, or create
754          a new chain.  */
755       slot = pointer_map_insert (edge_to_cases, this_edge);
756       TREE_CHAIN (elt) = (tree) *slot;
757       *slot = elt;
758     }
759
760   return (tree) *pointer_map_contains (edge_to_cases, e);
761 }
762
763 /* Create the edges for a GIMPLE_SWITCH starting at block BB.  */
764
765 static void
766 make_gimple_switch_edges (basic_block bb)
767 {
768   gimple entry = last_stmt (bb);
769   size_t i, n;
770
771   n = gimple_switch_num_labels (entry);
772
773   for (i = 0; i < n; ++i)
774     {
775       tree lab = CASE_LABEL (gimple_switch_label (entry, i));
776       basic_block label_bb = label_to_block (lab);
777       make_edge (bb, label_bb, 0);
778     }
779 }
780
781
782 /* Return the basic block holding label DEST.  */
783
784 basic_block
785 label_to_block_fn (struct function *ifun, tree dest)
786 {
787   int uid = LABEL_DECL_UID (dest);
788
789   /* We would die hard when faced by an undefined label.  Emit a label to
790      the very first basic block.  This will hopefully make even the dataflow
791      and undefined variable warnings quite right.  */
792   if ((errorcount || sorrycount) && uid < 0)
793     {
794       gimple_stmt_iterator gsi = gsi_start_bb (BASIC_BLOCK (NUM_FIXED_BLOCKS));
795       gimple stmt;
796
797       stmt = gimple_build_label (dest);
798       gsi_insert_before (&gsi, stmt, GSI_NEW_STMT);
799       uid = LABEL_DECL_UID (dest);
800     }
801   if (VEC_length (basic_block, ifun->cfg->x_label_to_block_map)
802       <= (unsigned int) uid)
803     return NULL;
804   return VEC_index (basic_block, ifun->cfg->x_label_to_block_map, uid);
805 }
806
807 /* Create edges for an abnormal goto statement at block BB.  If FOR_CALL
808    is true, the source statement is a CALL_EXPR instead of a GOTO_EXPR.  */
809
810 void
811 make_abnormal_goto_edges (basic_block bb, bool for_call)
812 {
813   basic_block target_bb;
814   gimple_stmt_iterator gsi;
815
816   FOR_EACH_BB (target_bb)
817     for (gsi = gsi_start_bb (target_bb); !gsi_end_p (gsi); gsi_next (&gsi))
818       {
819         gimple label_stmt = gsi_stmt (gsi);
820         tree target;
821
822         if (gimple_code (label_stmt) != GIMPLE_LABEL)
823           break;
824
825         target = gimple_label_label (label_stmt);
826
827         /* Make an edge to every label block that has been marked as a
828            potential target for a computed goto or a non-local goto.  */
829         if ((FORCED_LABEL (target) && !for_call)
830             || (DECL_NONLOCAL (target) && for_call))
831           {
832             make_edge (bb, target_bb, EDGE_ABNORMAL);
833             break;
834           }
835       }
836 }
837
838 /* Create edges for a goto statement at block BB.  */
839
840 static void
841 make_goto_expr_edges (basic_block bb)
842 {
843   gimple_stmt_iterator last = gsi_last_bb (bb);
844   gimple goto_t = gsi_stmt (last);
845
846   /* A simple GOTO creates normal edges.  */
847   if (simple_goto_p (goto_t))
848     {
849       tree dest = gimple_goto_dest (goto_t);
850       edge e = make_edge (bb, label_to_block (dest), EDGE_FALLTHRU);
851       e->goto_locus = gimple_location (goto_t);
852       gsi_remove (&last, true);
853       return;
854     }
855
856   /* A computed GOTO creates abnormal edges.  */
857   make_abnormal_goto_edges (bb, false);
858 }
859
860
861 /*---------------------------------------------------------------------------
862                                Flowgraph analysis
863 ---------------------------------------------------------------------------*/
864
865 /* Cleanup useless labels in basic blocks.  This is something we wish
866    to do early because it allows us to group case labels before creating
867    the edges for the CFG, and it speeds up block statement iterators in
868    all passes later on.
869    We rerun this pass after CFG is created, to get rid of the labels that
870    are no longer referenced.  After then we do not run it any more, since
871    (almost) no new labels should be created.  */
872
873 /* A map from basic block index to the leading label of that block.  */
874 static struct label_record
875 {
876   /* The label.  */
877   tree label;
878
879   /* True if the label is referenced from somewhere.  */
880   bool used;
881 } *label_for_bb;
882
883 /* Callback for for_each_eh_region.  Helper for cleanup_dead_labels.  */
884 static void
885 update_eh_label (struct eh_region *region)
886 {
887   tree old_label = get_eh_region_tree_label (region);
888   if (old_label)
889     {
890       tree new_label;
891       basic_block bb = label_to_block (old_label);
892
893       /* ??? After optimizing, there may be EH regions with labels
894          that have already been removed from the function body, so
895          there is no basic block for them.  */
896       if (! bb)
897         return;
898
899       new_label = label_for_bb[bb->index].label;
900       label_for_bb[bb->index].used = true;
901       set_eh_region_tree_label (region, new_label);
902     }
903 }
904
905
906 /* Given LABEL return the first label in the same basic block.  */
907
908 static tree
909 main_block_label (tree label)
910 {
911   basic_block bb = label_to_block (label);
912   tree main_label = label_for_bb[bb->index].label;
913
914   /* label_to_block possibly inserted undefined label into the chain.  */
915   if (!main_label)
916     {
917       label_for_bb[bb->index].label = label;
918       main_label = label;
919     }
920
921   label_for_bb[bb->index].used = true;
922   return main_label;
923 }
924
925 /* Cleanup redundant labels.  This is a three-step process:
926      1) Find the leading label for each block.
927      2) Redirect all references to labels to the leading labels.
928      3) Cleanup all useless labels.  */
929
930 void
931 cleanup_dead_labels (void)
932 {
933   basic_block bb;
934   label_for_bb = XCNEWVEC (struct label_record, last_basic_block);
935
936   /* Find a suitable label for each block.  We use the first user-defined
937      label if there is one, or otherwise just the first label we see.  */
938   FOR_EACH_BB (bb)
939     {
940       gimple_stmt_iterator i;
941
942       for (i = gsi_start_bb (bb); !gsi_end_p (i); gsi_next (&i))
943         {
944           tree label;
945           gimple stmt = gsi_stmt (i);
946
947           if (gimple_code (stmt) != GIMPLE_LABEL)
948             break;
949
950           label = gimple_label_label (stmt);
951
952           /* If we have not yet seen a label for the current block,
953              remember this one and see if there are more labels.  */
954           if (!label_for_bb[bb->index].label)
955             {
956               label_for_bb[bb->index].label = label;
957               continue;
958             }
959
960           /* If we did see a label for the current block already, but it
961              is an artificially created label, replace it if the current
962              label is a user defined label.  */
963           if (!DECL_ARTIFICIAL (label)
964               && DECL_ARTIFICIAL (label_for_bb[bb->index].label))
965             {
966               label_for_bb[bb->index].label = label;
967               break;
968             }
969         }
970     }
971
972   /* Now redirect all jumps/branches to the selected label.
973      First do so for each block ending in a control statement.  */
974   FOR_EACH_BB (bb)
975     {
976       gimple stmt = last_stmt (bb);
977       if (!stmt)
978         continue;
979
980       switch (gimple_code (stmt))
981         {
982         case GIMPLE_COND:
983           {
984             tree true_label = gimple_cond_true_label (stmt);
985             tree false_label = gimple_cond_false_label (stmt);
986
987             if (true_label)
988               gimple_cond_set_true_label (stmt, main_block_label (true_label));
989             if (false_label)
990               gimple_cond_set_false_label (stmt, main_block_label (false_label));
991             break;
992           }
993
994         case GIMPLE_SWITCH:
995           {
996             size_t i, n = gimple_switch_num_labels (stmt);
997
998             /* Replace all destination labels.  */
999             for (i = 0; i < n; ++i)
1000               {
1001                 tree case_label = gimple_switch_label (stmt, i);
1002                 tree label = main_block_label (CASE_LABEL (case_label));
1003                 CASE_LABEL (case_label) = label;
1004               }
1005             break;
1006           }
1007
1008         /* We have to handle gotos until they're removed, and we don't
1009            remove them until after we've created the CFG edges.  */
1010         case GIMPLE_GOTO:
1011           if (!computed_goto_p (stmt))
1012             {
1013               tree new_dest = main_block_label (gimple_goto_dest (stmt));
1014               gimple_goto_set_dest (stmt, new_dest);
1015               break;
1016             }
1017
1018         default:
1019           break;
1020       }
1021     }
1022
1023   for_each_eh_region (update_eh_label);
1024
1025   /* Finally, purge dead labels.  All user-defined labels and labels that
1026      can be the target of non-local gotos and labels which have their
1027      address taken are preserved.  */
1028   FOR_EACH_BB (bb)
1029     {
1030       gimple_stmt_iterator i;
1031       tree label_for_this_bb = label_for_bb[bb->index].label;
1032
1033       if (!label_for_this_bb)
1034         continue;
1035
1036       /* If the main label of the block is unused, we may still remove it.  */
1037       if (!label_for_bb[bb->index].used)
1038         label_for_this_bb = NULL;
1039
1040       for (i = gsi_start_bb (bb); !gsi_end_p (i); )
1041         {
1042           tree label;
1043           gimple stmt = gsi_stmt (i);
1044
1045           if (gimple_code (stmt) != GIMPLE_LABEL)
1046             break;
1047
1048           label = gimple_label_label (stmt);
1049
1050           if (label == label_for_this_bb
1051               || !DECL_ARTIFICIAL (label)
1052               || DECL_NONLOCAL (label)
1053               || FORCED_LABEL (label))
1054             gsi_next (&i);
1055           else
1056             gsi_remove (&i, true);
1057         }
1058     }
1059
1060   free (label_for_bb);
1061 }
1062
1063 /* Look for blocks ending in a multiway branch (a SWITCH_EXPR in GIMPLE),
1064    and scan the sorted vector of cases.  Combine the ones jumping to the
1065    same label.
1066    Eg. three separate entries 1: 2: 3: become one entry 1..3:  */
1067
1068 void
1069 group_case_labels (void)
1070 {
1071   basic_block bb;
1072
1073   FOR_EACH_BB (bb)
1074     {
1075       gimple stmt = last_stmt (bb);
1076       if (stmt && gimple_code (stmt) == GIMPLE_SWITCH)
1077         {
1078           int old_size = gimple_switch_num_labels (stmt);
1079           int i, j, new_size = old_size;
1080           tree default_case = NULL_TREE;
1081           tree default_label = NULL_TREE;
1082           bool has_default;
1083
1084           /* The default label is always the first case in a switch
1085              statement after gimplification if it was not optimized
1086              away */
1087           if (!CASE_LOW (gimple_switch_default_label (stmt))
1088               && !CASE_HIGH (gimple_switch_default_label (stmt)))
1089             {
1090               default_case = gimple_switch_default_label (stmt);
1091               default_label = CASE_LABEL (default_case);
1092               has_default = true;
1093             }
1094           else
1095             has_default = false;
1096
1097           /* Look for possible opportunities to merge cases.  */
1098           if (has_default)
1099             i = 1;
1100           else
1101             i = 0;
1102           while (i < old_size)
1103             {
1104               tree base_case, base_label, base_high;
1105               base_case = gimple_switch_label (stmt, i);
1106
1107               gcc_assert (base_case);
1108               base_label = CASE_LABEL (base_case);
1109
1110               /* Discard cases that have the same destination as the
1111                  default case.  */
1112               if (base_label == default_label)
1113                 {
1114                   gimple_switch_set_label (stmt, i, NULL_TREE);
1115                   i++;
1116                   new_size--;
1117                   continue;
1118                 }
1119
1120               base_high = CASE_HIGH (base_case)
1121                           ? CASE_HIGH (base_case)
1122                           : CASE_LOW (base_case);
1123               i++;
1124
1125               /* Try to merge case labels.  Break out when we reach the end
1126                  of the label vector or when we cannot merge the next case
1127                  label with the current one.  */
1128               while (i < old_size)
1129                 {
1130                   tree merge_case = gimple_switch_label (stmt, i);
1131                   tree merge_label = CASE_LABEL (merge_case);
1132                   tree t = int_const_binop (PLUS_EXPR, base_high,
1133                                             integer_one_node, 1);
1134
1135                   /* Merge the cases if they jump to the same place,
1136                      and their ranges are consecutive.  */
1137                   if (merge_label == base_label
1138                       && tree_int_cst_equal (CASE_LOW (merge_case), t))
1139                     {
1140                       base_high = CASE_HIGH (merge_case) ?
1141                         CASE_HIGH (merge_case) : CASE_LOW (merge_case);
1142                       CASE_HIGH (base_case) = base_high;
1143                       gimple_switch_set_label (stmt, i, NULL_TREE);
1144                       new_size--;
1145                       i++;
1146                     }
1147                   else
1148                     break;
1149                 }
1150             }
1151
1152           /* Compress the case labels in the label vector, and adjust the
1153              length of the vector.  */
1154           for (i = 0, j = 0; i < new_size; i++)
1155             {
1156               while (! gimple_switch_label (stmt, j))
1157                 j++;
1158               gimple_switch_set_label (stmt, i,
1159                                        gimple_switch_label (stmt, j++));
1160             }
1161
1162           gcc_assert (new_size <= old_size);
1163           gimple_switch_set_num_labels (stmt, new_size);
1164         }
1165     }
1166 }
1167
1168 /* Checks whether we can merge block B into block A.  */
1169
1170 static bool
1171 gimple_can_merge_blocks_p (basic_block a, basic_block b)
1172 {
1173   gimple stmt;
1174   gimple_stmt_iterator gsi;
1175   gimple_seq phis;
1176
1177   if (!single_succ_p (a))
1178     return false;
1179
1180   if (single_succ_edge (a)->flags & EDGE_ABNORMAL)
1181     return false;
1182
1183   if (single_succ (a) != b)
1184     return false;
1185
1186   if (!single_pred_p (b))
1187     return false;
1188
1189   if (b == EXIT_BLOCK_PTR)
1190     return false;
1191
1192   /* If A ends by a statement causing exceptions or something similar, we
1193      cannot merge the blocks.  */
1194   stmt = last_stmt (a);
1195   if (stmt && stmt_ends_bb_p (stmt))
1196     return false;
1197
1198   /* Do not allow a block with only a non-local label to be merged.  */
1199   if (stmt
1200       && gimple_code (stmt) == GIMPLE_LABEL
1201       && DECL_NONLOCAL (gimple_label_label (stmt)))
1202     return false;
1203
1204   /* It must be possible to eliminate all phi nodes in B.  If ssa form
1205      is not up-to-date, we cannot eliminate any phis; however, if only
1206      some symbols as whole are marked for renaming, this is not a problem,
1207      as phi nodes for those symbols are irrelevant in updating anyway.  */
1208   phis = phi_nodes (b);
1209   if (!gimple_seq_empty_p (phis))
1210     {
1211       gimple_stmt_iterator i;
1212
1213       if (name_mappings_registered_p ())
1214         return false;
1215
1216       for (i = gsi_start (phis); !gsi_end_p (i); gsi_next (&i))
1217         {
1218           gimple phi = gsi_stmt (i);
1219
1220           if (!is_gimple_reg (gimple_phi_result (phi))
1221               && !may_propagate_copy (gimple_phi_result (phi),
1222                                       gimple_phi_arg_def (phi, 0)))
1223             return false;
1224         }
1225     }
1226
1227   /* Do not remove user labels.  */
1228   for (gsi = gsi_start_bb (b); !gsi_end_p (gsi); gsi_next (&gsi))
1229     {
1230       stmt = gsi_stmt (gsi);
1231       if (gimple_code (stmt) != GIMPLE_LABEL)
1232         break;
1233       if (!DECL_ARTIFICIAL (gimple_label_label (stmt)))
1234         return false;
1235     }
1236
1237   /* Protect the loop latches.  */
1238   if (current_loops
1239       && b->loop_father->latch == b)
1240     return false;
1241
1242   return true;
1243 }
1244
1245 /* Replaces all uses of NAME by VAL.  */
1246
1247 void
1248 replace_uses_by (tree name, tree val)
1249 {
1250   imm_use_iterator imm_iter;
1251   use_operand_p use;
1252   gimple stmt;
1253   edge e;
1254
1255   FOR_EACH_IMM_USE_STMT (stmt, imm_iter, name)
1256     {
1257       if (gimple_code (stmt) != GIMPLE_PHI)
1258         push_stmt_changes (&stmt);
1259
1260       FOR_EACH_IMM_USE_ON_STMT (use, imm_iter)
1261         {
1262           replace_exp (use, val);
1263
1264           if (gimple_code (stmt) == GIMPLE_PHI)
1265             {
1266               e = gimple_phi_arg_edge (stmt, PHI_ARG_INDEX_FROM_USE (use));
1267               if (e->flags & EDGE_ABNORMAL)
1268                 {
1269                   /* This can only occur for virtual operands, since
1270                      for the real ones SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name))
1271                      would prevent replacement.  */
1272                   gcc_assert (!is_gimple_reg (name));
1273                   SSA_NAME_OCCURS_IN_ABNORMAL_PHI (val) = 1;
1274                 }
1275             }
1276         }
1277
1278       if (gimple_code (stmt) != GIMPLE_PHI)
1279         {
1280           size_t i;
1281
1282           fold_stmt_inplace (stmt);
1283           if (cfgcleanup_altered_bbs)
1284             bitmap_set_bit (cfgcleanup_altered_bbs, gimple_bb (stmt)->index);
1285
1286           /* FIXME.  This should go in pop_stmt_changes.  */
1287           for (i = 0; i < gimple_num_ops (stmt); i++)
1288             {
1289               tree op = gimple_op (stmt, i);
1290               /* Operands may be empty here.  For example, the labels
1291                  of a GIMPLE_COND are nulled out following the creation
1292                  of the corresponding CFG edges.  */
1293               if (op && TREE_CODE (op) == ADDR_EXPR)
1294                 recompute_tree_invariant_for_addr_expr (op);
1295             }
1296
1297           maybe_clean_or_replace_eh_stmt (stmt, stmt);
1298
1299           pop_stmt_changes (&stmt);
1300         }
1301     }
1302
1303   gcc_assert (has_zero_uses (name));
1304
1305   /* Also update the trees stored in loop structures.  */
1306   if (current_loops)
1307     {
1308       struct loop *loop;
1309       loop_iterator li;
1310
1311       FOR_EACH_LOOP (li, loop, 0)
1312         {
1313           substitute_in_loop_info (loop, name, val);
1314         }
1315     }
1316 }
1317
1318 /* Merge block B into block A.  */
1319
1320 static void
1321 gimple_merge_blocks (basic_block a, basic_block b)
1322 {
1323   gimple_stmt_iterator last, gsi, psi;
1324   gimple_seq phis = phi_nodes (b);
1325
1326   if (dump_file)
1327     fprintf (dump_file, "Merging blocks %d and %d\n", a->index, b->index);
1328
1329   /* Remove all single-valued PHI nodes from block B of the form
1330      V_i = PHI <V_j> by propagating V_j to all the uses of V_i.  */
1331   gsi = gsi_last_bb (a);
1332   for (psi = gsi_start (phis); !gsi_end_p (psi); )
1333     {
1334       gimple phi = gsi_stmt (psi);
1335       tree def = gimple_phi_result (phi), use = gimple_phi_arg_def (phi, 0);
1336       gimple copy;
1337       bool may_replace_uses = !is_gimple_reg (def)
1338                               || may_propagate_copy (def, use);
1339
1340       /* In case we maintain loop closed ssa form, do not propagate arguments
1341          of loop exit phi nodes.  */
1342       if (current_loops
1343           && loops_state_satisfies_p (LOOP_CLOSED_SSA)
1344           && is_gimple_reg (def)
1345           && TREE_CODE (use) == SSA_NAME
1346           && a->loop_father != b->loop_father)
1347         may_replace_uses = false;
1348
1349       if (!may_replace_uses)
1350         {
1351           gcc_assert (is_gimple_reg (def));
1352
1353           /* Note that just emitting the copies is fine -- there is no problem
1354              with ordering of phi nodes.  This is because A is the single
1355              predecessor of B, therefore results of the phi nodes cannot
1356              appear as arguments of the phi nodes.  */
1357           copy = gimple_build_assign (def, use);
1358           gsi_insert_after (&gsi, copy, GSI_NEW_STMT);
1359           remove_phi_node (&psi, false);
1360         }
1361       else
1362         {
1363           /* If we deal with a PHI for virtual operands, we can simply
1364              propagate these without fussing with folding or updating
1365              the stmt.  */
1366           if (!is_gimple_reg (def))
1367             {
1368               imm_use_iterator iter;
1369               use_operand_p use_p;
1370               gimple stmt;
1371
1372               FOR_EACH_IMM_USE_STMT (stmt, iter, def)
1373                 FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
1374                   SET_USE (use_p, use);
1375             }
1376           else
1377             replace_uses_by (def, use);
1378
1379           remove_phi_node (&psi, true);
1380         }
1381     }
1382
1383   /* Ensure that B follows A.  */
1384   move_block_after (b, a);
1385
1386   gcc_assert (single_succ_edge (a)->flags & EDGE_FALLTHRU);
1387   gcc_assert (!last_stmt (a) || !stmt_ends_bb_p (last_stmt (a)));
1388
1389   /* Remove labels from B and set gimple_bb to A for other statements.  */
1390   for (gsi = gsi_start_bb (b); !gsi_end_p (gsi);)
1391     {
1392       if (gimple_code (gsi_stmt (gsi)) == GIMPLE_LABEL)
1393         {
1394           gimple label = gsi_stmt (gsi);
1395
1396           gsi_remove (&gsi, false);
1397
1398           /* Now that we can thread computed gotos, we might have
1399              a situation where we have a forced label in block B
1400              However, the label at the start of block B might still be
1401              used in other ways (think about the runtime checking for
1402              Fortran assigned gotos).  So we can not just delete the
1403              label.  Instead we move the label to the start of block A.  */
1404           if (FORCED_LABEL (gimple_label_label (label)))
1405             {
1406               gimple_stmt_iterator dest_gsi = gsi_start_bb (a);
1407               gsi_insert_before (&dest_gsi, label, GSI_NEW_STMT);
1408             }
1409         }
1410       else
1411         {
1412           gimple_set_bb (gsi_stmt (gsi), a);
1413           gsi_next (&gsi);
1414         }
1415     }
1416
1417   /* Merge the sequences.  */
1418   last = gsi_last_bb (a);
1419   gsi_insert_seq_after (&last, bb_seq (b), GSI_NEW_STMT);
1420   set_bb_seq (b, NULL);
1421
1422   if (cfgcleanup_altered_bbs)
1423     bitmap_set_bit (cfgcleanup_altered_bbs, a->index);
1424 }
1425
1426
1427 /* Return the one of two successors of BB that is not reachable by a
1428    reached by a complex edge, if there is one.  Else, return BB.  We use
1429    this in optimizations that use post-dominators for their heuristics,
1430    to catch the cases in C++ where function calls are involved.  */
1431
1432 basic_block
1433 single_noncomplex_succ (basic_block bb)
1434 {
1435   edge e0, e1;
1436   if (EDGE_COUNT (bb->succs) != 2)
1437     return bb;
1438
1439   e0 = EDGE_SUCC (bb, 0);
1440   e1 = EDGE_SUCC (bb, 1);
1441   if (e0->flags & EDGE_COMPLEX)
1442     return e1->dest;
1443   if (e1->flags & EDGE_COMPLEX)
1444     return e0->dest;
1445
1446   return bb;
1447 }
1448
1449
1450 /* Walk the function tree removing unnecessary statements.
1451
1452      * Empty statement nodes are removed
1453
1454      * Unnecessary TRY_FINALLY and TRY_CATCH blocks are removed
1455
1456      * Unnecessary COND_EXPRs are removed
1457
1458      * Some unnecessary BIND_EXPRs are removed
1459
1460      * GOTO_EXPRs immediately preceding destination are removed.
1461
1462    Clearly more work could be done.  The trick is doing the analysis
1463    and removal fast enough to be a net improvement in compile times.
1464
1465    Note that when we remove a control structure such as a COND_EXPR
1466    BIND_EXPR, or TRY block, we will need to repeat this optimization pass
1467    to ensure we eliminate all the useless code.  */
1468
1469 struct rus_data
1470 {
1471   bool repeat;
1472   bool may_throw;
1473   bool may_branch;
1474   bool has_label;
1475   bool last_was_goto;
1476   gimple_stmt_iterator last_goto_gsi;
1477 };
1478
1479
1480 static void remove_useless_stmts_1 (gimple_stmt_iterator *gsi, struct rus_data *);
1481
1482 /* Given a statement sequence, find the first executable statement with
1483    location information, and warn that it is unreachable.  When searching,
1484    descend into containers in execution order.  */
1485
1486 static bool
1487 remove_useless_stmts_warn_notreached (gimple_seq stmts)
1488 {
1489   gimple_stmt_iterator gsi;
1490
1491   for (gsi = gsi_start (stmts); !gsi_end_p (gsi); gsi_next (&gsi))
1492     {
1493       gimple stmt = gsi_stmt (gsi);
1494
1495       if (gimple_has_location (stmt))
1496         {
1497           location_t loc = gimple_location (stmt);
1498           if (LOCATION_LINE (loc) > 0)
1499             {
1500               warning (OPT_Wunreachable_code, "%Hwill never be executed", &loc);
1501               return true;
1502             }
1503         }
1504
1505       switch (gimple_code (stmt))
1506         {
1507         /* Unfortunately, we need the CFG now to detect unreachable
1508            branches in a conditional, so conditionals are not handled here.  */
1509
1510         case GIMPLE_TRY:
1511           if (remove_useless_stmts_warn_notreached (gimple_try_eval (stmt)))
1512             return true;
1513           if (remove_useless_stmts_warn_notreached (gimple_try_cleanup (stmt)))
1514             return true;
1515           break;
1516
1517         case GIMPLE_CATCH:
1518           return remove_useless_stmts_warn_notreached (gimple_catch_handler (stmt));
1519
1520         case GIMPLE_EH_FILTER:
1521           return remove_useless_stmts_warn_notreached (gimple_eh_filter_failure (stmt));
1522
1523         case GIMPLE_BIND:
1524           return remove_useless_stmts_warn_notreached (gimple_bind_body (stmt));
1525
1526         default:
1527           break;
1528         }
1529     }
1530
1531   return false;
1532 }
1533
1534 /* Helper for remove_useless_stmts_1.  Handle GIMPLE_COND statements.  */
1535
1536 static void
1537 remove_useless_stmts_cond (gimple_stmt_iterator *gsi, struct rus_data *data)
1538 {
1539   gimple stmt = gsi_stmt (*gsi);
1540
1541   /* The folded result must still be a conditional statement.  */
1542   fold_stmt_inplace (stmt);
1543
1544   data->may_branch = true;
1545
1546   /* Replace trivial conditionals with gotos. */
1547   if (gimple_cond_true_p (stmt))
1548     {
1549       /* Goto THEN label.  */
1550       tree then_label = gimple_cond_true_label (stmt);
1551
1552       gsi_replace (gsi, gimple_build_goto (then_label), false);
1553       data->last_goto_gsi = *gsi;
1554       data->last_was_goto = true;
1555       data->repeat = true;
1556     }
1557   else if (gimple_cond_false_p (stmt))
1558     {
1559       /* Goto ELSE label.  */
1560       tree else_label = gimple_cond_false_label (stmt);
1561
1562       gsi_replace (gsi, gimple_build_goto (else_label), false);
1563       data->last_goto_gsi = *gsi;
1564       data->last_was_goto = true;
1565       data->repeat = true;
1566     }
1567   else
1568     {
1569       tree then_label = gimple_cond_true_label (stmt);
1570       tree else_label = gimple_cond_false_label (stmt);
1571
1572       if (then_label == else_label)
1573         {
1574           /* Goto common destination.  */
1575           gsi_replace (gsi, gimple_build_goto (then_label), false);
1576           data->last_goto_gsi = *gsi;
1577           data->last_was_goto = true;
1578           data->repeat = true;
1579         }
1580     }
1581
1582   gsi_next (gsi);
1583
1584   data->last_was_goto = false;
1585 }
1586
1587 /* Helper for remove_useless_stmts_1. 
1588    Handle the try-finally case for GIMPLE_TRY statements.  */
1589
1590 static void
1591 remove_useless_stmts_tf (gimple_stmt_iterator *gsi, struct rus_data *data)
1592 {
1593   bool save_may_branch, save_may_throw;
1594   bool this_may_branch, this_may_throw;
1595
1596   gimple_seq eval_seq, cleanup_seq;
1597   gimple_stmt_iterator eval_gsi, cleanup_gsi;
1598
1599   gimple stmt = gsi_stmt (*gsi);
1600
1601   /* Collect may_branch and may_throw information for the body only.  */
1602   save_may_branch = data->may_branch;
1603   save_may_throw = data->may_throw;
1604   data->may_branch = false;
1605   data->may_throw = false;
1606   data->last_was_goto = false;
1607
1608   eval_seq = gimple_try_eval (stmt);
1609   eval_gsi = gsi_start (eval_seq);
1610   remove_useless_stmts_1 (&eval_gsi, data);
1611
1612   this_may_branch = data->may_branch;
1613   this_may_throw = data->may_throw;
1614   data->may_branch |= save_may_branch;
1615   data->may_throw |= save_may_throw;
1616   data->last_was_goto = false;
1617
1618   cleanup_seq = gimple_try_cleanup (stmt);
1619   cleanup_gsi = gsi_start (cleanup_seq);
1620   remove_useless_stmts_1 (&cleanup_gsi, data);
1621
1622   /* If the body is empty, then we can emit the FINALLY block without
1623      the enclosing TRY_FINALLY_EXPR.  */
1624   if (gimple_seq_empty_p (eval_seq))
1625     {
1626       gsi_insert_seq_before (gsi, cleanup_seq, GSI_SAME_STMT);
1627       gsi_remove (gsi, false);
1628       data->repeat = true;
1629     }
1630
1631   /* If the handler is empty, then we can emit the TRY block without
1632      the enclosing TRY_FINALLY_EXPR.  */
1633   else if (gimple_seq_empty_p (cleanup_seq))
1634     {
1635       gsi_insert_seq_before (gsi, eval_seq, GSI_SAME_STMT);
1636       gsi_remove (gsi, false);
1637       data->repeat = true;
1638     }
1639
1640   /* If the body neither throws, nor branches, then we can safely
1641      string the TRY and FINALLY blocks together.  */
1642   else if (!this_may_branch && !this_may_throw)
1643     {
1644       gsi_insert_seq_before (gsi, eval_seq, GSI_SAME_STMT);
1645       gsi_insert_seq_before (gsi, cleanup_seq, GSI_SAME_STMT);
1646       gsi_remove (gsi, false);
1647       data->repeat = true;
1648     }
1649   else
1650     gsi_next (gsi);
1651 }
1652
1653 /* Helper for remove_useless_stmts_1. 
1654    Handle the try-catch case for GIMPLE_TRY statements.  */
1655
1656 static void
1657 remove_useless_stmts_tc (gimple_stmt_iterator *gsi, struct rus_data *data)
1658 {
1659   bool save_may_throw, this_may_throw;
1660
1661   gimple_seq eval_seq, cleanup_seq, handler_seq, failure_seq;
1662   gimple_stmt_iterator eval_gsi, cleanup_gsi, handler_gsi, failure_gsi;
1663
1664   gimple stmt = gsi_stmt (*gsi);
1665
1666   /* Collect may_throw information for the body only.  */
1667   save_may_throw = data->may_throw;
1668   data->may_throw = false;
1669   data->last_was_goto = false;
1670
1671   eval_seq = gimple_try_eval (stmt);
1672   eval_gsi = gsi_start (eval_seq);
1673   remove_useless_stmts_1 (&eval_gsi, data);
1674
1675   this_may_throw = data->may_throw;
1676   data->may_throw = save_may_throw;
1677
1678   cleanup_seq = gimple_try_cleanup (stmt);
1679
1680   /* If the body cannot throw, then we can drop the entire TRY_CATCH_EXPR.  */
1681   if (!this_may_throw)
1682     {
1683       if (warn_notreached)
1684         {
1685           remove_useless_stmts_warn_notreached (cleanup_seq);
1686         }
1687       gsi_insert_seq_before (gsi, eval_seq, GSI_SAME_STMT);
1688       gsi_remove (gsi, false);
1689       data->repeat = true;
1690       return;
1691     }
1692
1693   /* Process the catch clause specially.  We may be able to tell that
1694      no exceptions propagate past this point.  */
1695
1696   this_may_throw = true;
1697   cleanup_gsi = gsi_start (cleanup_seq);
1698   stmt = gsi_stmt (cleanup_gsi);
1699   data->last_was_goto = false;
1700
1701   switch (gimple_code (stmt))
1702     {
1703     case GIMPLE_CATCH:
1704       /* If the first element is a catch, they all must be.  */
1705       while (!gsi_end_p (cleanup_gsi))
1706         {
1707           stmt = gsi_stmt (cleanup_gsi);
1708           /* If we catch all exceptions, then the body does not
1709              propagate exceptions past this point.  */
1710           if (gimple_catch_types (stmt) == NULL)
1711             this_may_throw = false;
1712           data->last_was_goto = false;
1713           handler_seq = gimple_catch_handler (stmt);
1714           handler_gsi = gsi_start (handler_seq);
1715           remove_useless_stmts_1 (&handler_gsi, data);
1716           gsi_next (&cleanup_gsi);
1717         }
1718       gsi_next (gsi);
1719       break;
1720
1721     case GIMPLE_EH_FILTER:
1722       /* If the first element is an eh_filter, it should stand alone.  */
1723       if (gimple_eh_filter_must_not_throw (stmt))
1724         this_may_throw = false;
1725       else if (gimple_eh_filter_types (stmt) == NULL)
1726         this_may_throw = false;
1727       failure_seq = gimple_eh_filter_failure (stmt);
1728       failure_gsi = gsi_start (failure_seq);
1729       remove_useless_stmts_1 (&failure_gsi, data);
1730       gsi_next (gsi);
1731       break;
1732
1733     default:
1734       /* Otherwise this is a list of cleanup statements.  */
1735       remove_useless_stmts_1 (&cleanup_gsi, data);
1736
1737       /* If the cleanup is empty, then we can emit the TRY block without
1738          the enclosing TRY_CATCH_EXPR.  */
1739       if (gimple_seq_empty_p (cleanup_seq))
1740         {
1741           gsi_insert_seq_before (gsi, eval_seq, GSI_SAME_STMT);
1742           gsi_remove(gsi, false);
1743           data->repeat = true;
1744         }
1745       else
1746         gsi_next (gsi);
1747       break;
1748     }
1749
1750   data->may_throw |= this_may_throw;
1751 }
1752
1753 /* Helper for remove_useless_stmts_1.  Handle GIMPLE_BIND statements.  */
1754
1755 static void
1756 remove_useless_stmts_bind (gimple_stmt_iterator *gsi, struct rus_data *data ATTRIBUTE_UNUSED)
1757 {
1758   tree block;
1759   gimple_seq body_seq, fn_body_seq;
1760   gimple_stmt_iterator body_gsi;
1761
1762   gimple stmt = gsi_stmt (*gsi);
1763
1764   /* First remove anything underneath the BIND_EXPR.  */
1765   
1766   body_seq = gimple_bind_body (stmt);
1767   body_gsi = gsi_start (body_seq);
1768   remove_useless_stmts_1 (&body_gsi, data);
1769
1770   /* If the GIMPLE_BIND has no variables, then we can pull everything
1771      up one level and remove the GIMPLE_BIND, unless this is the toplevel
1772      GIMPLE_BIND for the current function or an inlined function.
1773
1774      When this situation occurs we will want to apply this
1775      optimization again.  */
1776   block = gimple_bind_block (stmt);
1777   fn_body_seq = gimple_body (current_function_decl);
1778   if (gimple_bind_vars (stmt) == NULL_TREE
1779       && (gimple_seq_empty_p (fn_body_seq)
1780           || stmt != gimple_seq_first_stmt (fn_body_seq))
1781       && (! block
1782           || ! BLOCK_ABSTRACT_ORIGIN (block)
1783           || (TREE_CODE (BLOCK_ABSTRACT_ORIGIN (block))
1784               != FUNCTION_DECL)))
1785     {
1786       gsi_insert_seq_before (gsi, body_seq, GSI_SAME_STMT);
1787       gsi_remove (gsi, false);
1788       data->repeat = true;
1789     }
1790   else
1791     gsi_next (gsi);
1792 }
1793
1794 /* Helper for remove_useless_stmts_1.  Handle GIMPLE_GOTO statements.  */
1795
1796 static void
1797 remove_useless_stmts_goto (gimple_stmt_iterator *gsi, struct rus_data *data)
1798 {
1799   gimple stmt = gsi_stmt (*gsi);
1800
1801   tree dest = gimple_goto_dest (stmt);
1802
1803   data->may_branch = true;
1804   data->last_was_goto = false;
1805
1806   /* Record iterator for last goto expr, so that we can delete it if unnecessary.  */
1807   if (TREE_CODE (dest) == LABEL_DECL)
1808     {
1809       data->last_goto_gsi = *gsi;
1810       data->last_was_goto = true;
1811     }
1812
1813   gsi_next(gsi);
1814 }
1815
1816 /* Helper for remove_useless_stmts_1.  Handle GIMPLE_LABEL statements.  */
1817
1818 static void
1819 remove_useless_stmts_label (gimple_stmt_iterator *gsi, struct rus_data *data)
1820 {
1821   gimple stmt = gsi_stmt (*gsi);
1822
1823   tree label = gimple_label_label (stmt);
1824
1825   data->has_label = true;
1826
1827   /* We do want to jump across non-local label receiver code.  */
1828   if (DECL_NONLOCAL (label))
1829     data->last_was_goto = false;
1830
1831   else if (data->last_was_goto
1832            && gimple_goto_dest (gsi_stmt (data->last_goto_gsi)) == label)
1833     {
1834       /* Replace the preceding GIMPLE_GOTO statement with
1835          a GIMPLE_NOP, which will be subsequently removed.
1836          In this way, we avoid invalidating other iterators
1837          active on the statement sequence.  */
1838       gsi_replace(&data->last_goto_gsi, gimple_build_nop(), false);
1839       data->last_was_goto = false;
1840       data->repeat = true;
1841     }
1842
1843   /* ??? Add something here to delete unused labels.  */
1844
1845   gsi_next (gsi);
1846 }
1847
1848
1849 /* T is CALL_EXPR.  Set current_function_calls_* flags.  */
1850
1851 void
1852 notice_special_calls (gimple call)
1853 {
1854   int flags = gimple_call_flags (call);
1855
1856   if (flags & ECF_MAY_BE_ALLOCA)
1857     cfun->calls_alloca = true;
1858   if (flags & ECF_RETURNS_TWICE)
1859     cfun->calls_setjmp = true;
1860 }
1861
1862
1863 /* Clear flags set by notice_special_calls.  Used by dead code removal
1864    to update the flags.  */
1865
1866 void
1867 clear_special_calls (void)
1868 {
1869   cfun->calls_alloca = false;
1870   cfun->calls_setjmp = false;
1871 }
1872
1873 /* Remove useless statements from a statement sequence, and perform
1874    some preliminary simplifications.  */
1875
1876 static void
1877 remove_useless_stmts_1 (gimple_stmt_iterator *gsi, struct rus_data *data)
1878 {
1879   while (!gsi_end_p (*gsi))
1880     {
1881       gimple stmt = gsi_stmt (*gsi);
1882
1883       switch (gimple_code (stmt))
1884         {
1885         case GIMPLE_COND:
1886           remove_useless_stmts_cond (gsi, data);
1887           break;
1888
1889         case GIMPLE_GOTO:
1890           remove_useless_stmts_goto (gsi, data);
1891           break;
1892
1893         case GIMPLE_LABEL:
1894           remove_useless_stmts_label (gsi, data);
1895           break;
1896
1897         case GIMPLE_ASSIGN:
1898           fold_stmt (gsi);
1899           stmt = gsi_stmt (*gsi);
1900           data->last_was_goto = false;
1901           if (stmt_could_throw_p (stmt))
1902             data->may_throw = true;
1903           gsi_next (gsi);
1904           break;
1905
1906         case GIMPLE_ASM:
1907           fold_stmt (gsi);
1908           data->last_was_goto = false;
1909           gsi_next (gsi);
1910           break;
1911
1912         case GIMPLE_CALL:
1913           fold_stmt (gsi);
1914           stmt = gsi_stmt (*gsi);
1915           data->last_was_goto = false;
1916           if (is_gimple_call (stmt))
1917             notice_special_calls (stmt);
1918
1919           /* We used to call update_gimple_call_flags here,
1920              which copied side-effects and nothrows status
1921              from the function decl to the call.  In the new
1922              tuplified GIMPLE, the accessors for this information
1923              always consult the function decl, so this copying
1924              is no longer necessary.  */
1925           if (stmt_could_throw_p (stmt))
1926             data->may_throw = true;
1927           gsi_next (gsi);
1928           break;
1929
1930         case GIMPLE_RETURN:
1931           fold_stmt (gsi);
1932           data->last_was_goto = false;
1933           data->may_branch = true;
1934           gsi_next (gsi);
1935           break;
1936
1937         case GIMPLE_BIND:
1938           remove_useless_stmts_bind (gsi, data);
1939           break;
1940
1941         case GIMPLE_TRY:
1942           if (gimple_try_kind (stmt) == GIMPLE_TRY_CATCH)
1943             remove_useless_stmts_tc (gsi, data);
1944           else if (gimple_try_kind (stmt) == GIMPLE_TRY_FINALLY)
1945             remove_useless_stmts_tf (gsi, data);
1946           else
1947             gcc_unreachable ();
1948           break;
1949
1950         case GIMPLE_CATCH:
1951           gcc_unreachable ();
1952           break;
1953
1954         case GIMPLE_NOP:
1955           gsi_remove (gsi, false);
1956           break;
1957
1958         case GIMPLE_OMP_FOR:
1959           {
1960             gimple_seq pre_body_seq = gimple_omp_for_pre_body (stmt);
1961             gimple_stmt_iterator pre_body_gsi = gsi_start (pre_body_seq);
1962
1963             remove_useless_stmts_1 (&pre_body_gsi, data);
1964             data->last_was_goto = false;
1965           }
1966           /* FALLTHROUGH */
1967         case GIMPLE_OMP_CRITICAL:
1968         case GIMPLE_OMP_CONTINUE:
1969         case GIMPLE_OMP_MASTER:
1970         case GIMPLE_OMP_ORDERED:
1971         case GIMPLE_OMP_SECTION:
1972         case GIMPLE_OMP_SECTIONS:
1973         case GIMPLE_OMP_SINGLE:
1974           {
1975             gimple_seq body_seq = gimple_omp_body (stmt);
1976             gimple_stmt_iterator body_gsi = gsi_start (body_seq);
1977
1978             remove_useless_stmts_1 (&body_gsi, data);
1979             data->last_was_goto = false;
1980             gsi_next (gsi);
1981           }
1982           break;
1983
1984         case GIMPLE_OMP_PARALLEL:
1985         case GIMPLE_OMP_TASK:
1986           {
1987             /* Make sure the outermost GIMPLE_BIND isn't removed
1988                as useless.  */
1989             gimple_seq body_seq = gimple_omp_body (stmt);
1990             gimple bind = gimple_seq_first_stmt (body_seq);
1991             gimple_seq bind_seq = gimple_bind_body (bind);
1992             gimple_stmt_iterator bind_gsi = gsi_start (bind_seq);
1993
1994             remove_useless_stmts_1 (&bind_gsi, data);
1995             data->last_was_goto = false;
1996             gsi_next (gsi);
1997           }
1998           break;
1999
2000         default:
2001           data->last_was_goto = false;
2002           gsi_next (gsi);
2003           break;
2004         }
2005     }
2006 }
2007
2008 /* Walk the function tree, removing useless statements and performing
2009    some preliminary simplifications.  */
2010
2011 static unsigned int
2012 remove_useless_stmts (void)
2013 {
2014   struct rus_data data;
2015
2016   clear_special_calls ();
2017
2018   do
2019     {
2020       gimple_stmt_iterator gsi;
2021
2022       gsi = gsi_start (gimple_body (current_function_decl));
2023       memset (&data, 0, sizeof (data));
2024       remove_useless_stmts_1 (&gsi, &data);
2025     }
2026   while (data.repeat);
2027   return 0;
2028 }
2029
2030
2031 struct gimple_opt_pass pass_remove_useless_stmts =
2032 {
2033  {
2034   GIMPLE_PASS,
2035   "useless",                            /* name */
2036   NULL,                                 /* gate */
2037   remove_useless_stmts,                 /* execute */
2038   NULL,                                 /* sub */
2039   NULL,                                 /* next */
2040   0,                                    /* static_pass_number */
2041   0,                                    /* tv_id */
2042   PROP_gimple_any,                      /* properties_required */
2043   0,                                    /* properties_provided */
2044   0,                                    /* properties_destroyed */
2045   0,                                    /* todo_flags_start */
2046   TODO_dump_func                        /* todo_flags_finish */
2047  }
2048 };
2049
2050 /* Remove PHI nodes associated with basic block BB and all edges out of BB.  */
2051
2052 static void
2053 remove_phi_nodes_and_edges_for_unreachable_block (basic_block bb)
2054 {
2055   gimple_stmt_iterator gsi;
2056
2057   /* Since this block is no longer reachable, we can just delete all
2058      of its PHI nodes.  */
2059   for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); )
2060     remove_phi_node (&gsi, true);
2061
2062   set_phi_nodes (bb, NULL);
2063
2064   /* Remove edges to BB's successors.  */
2065   while (EDGE_COUNT (bb->succs) > 0)
2066     remove_edge (EDGE_SUCC (bb, 0));
2067 }
2068
2069
2070 /* Remove statements of basic block BB.  */
2071
2072 static void
2073 remove_bb (basic_block bb)
2074 {
2075   gimple_stmt_iterator i;
2076   source_location loc = UNKNOWN_LOCATION;
2077
2078   if (dump_file)
2079     {
2080       fprintf (dump_file, "Removing basic block %d\n", bb->index);
2081       if (dump_flags & TDF_DETAILS)
2082         {
2083           dump_bb (bb, dump_file, 0);
2084           fprintf (dump_file, "\n");
2085         }
2086     }
2087
2088   if (current_loops)
2089     {
2090       struct loop *loop = bb->loop_father;
2091
2092       /* If a loop gets removed, clean up the information associated
2093          with it.  */
2094       if (loop->latch == bb
2095           || loop->header == bb)
2096         free_numbers_of_iterations_estimates_loop (loop);
2097     }
2098
2099   /* Remove all the instructions in the block.  */
2100   if (bb_seq (bb) != NULL)
2101     {
2102       for (i = gsi_start_bb (bb); !gsi_end_p (i);)
2103         {
2104           gimple stmt = gsi_stmt (i);
2105           if (gimple_code (stmt) == GIMPLE_LABEL
2106               && (FORCED_LABEL (gimple_label_label (stmt))
2107                   || DECL_NONLOCAL (gimple_label_label (stmt))))
2108             {
2109               basic_block new_bb;
2110               gimple_stmt_iterator new_gsi;
2111
2112               /* A non-reachable non-local label may still be referenced.
2113                  But it no longer needs to carry the extra semantics of
2114                  non-locality.  */
2115               if (DECL_NONLOCAL (gimple_label_label (stmt)))
2116                 {
2117                   DECL_NONLOCAL (gimple_label_label (stmt)) = 0;
2118                   FORCED_LABEL (gimple_label_label (stmt)) = 1;
2119                 }
2120
2121               new_bb = bb->prev_bb;
2122               new_gsi = gsi_start_bb (new_bb);
2123               gsi_remove (&i, false);
2124               gsi_insert_before (&new_gsi, stmt, GSI_NEW_STMT);
2125             }
2126           else
2127             {
2128               /* Release SSA definitions if we are in SSA.  Note that we
2129                  may be called when not in SSA.  For example,
2130                  final_cleanup calls this function via
2131                  cleanup_tree_cfg.  */
2132               if (gimple_in_ssa_p (cfun))
2133                 release_defs (stmt);
2134
2135               gsi_remove (&i, true);
2136             }
2137
2138           /* Don't warn for removed gotos.  Gotos are often removed due to
2139              jump threading, thus resulting in bogus warnings.  Not great,
2140              since this way we lose warnings for gotos in the original
2141              program that are indeed unreachable.  */
2142           if (gimple_code (stmt) != GIMPLE_GOTO
2143               && gimple_has_location (stmt)
2144               && !loc)
2145             loc = gimple_location (stmt);
2146         }
2147     }
2148
2149   /* If requested, give a warning that the first statement in the
2150      block is unreachable.  We walk statements backwards in the
2151      loop above, so the last statement we process is the first statement
2152      in the block.  */
2153   if (loc > BUILTINS_LOCATION && LOCATION_LINE (loc) > 0)
2154     warning (OPT_Wunreachable_code, "%Hwill never be executed", &loc);
2155
2156   remove_phi_nodes_and_edges_for_unreachable_block (bb);
2157   bb->il.gimple = NULL;
2158 }
2159
2160
2161 /* Given a basic block BB ending with COND_EXPR or SWITCH_EXPR, and a
2162    predicate VAL, return the edge that will be taken out of the block.
2163    If VAL does not match a unique edge, NULL is returned.  */
2164
2165 edge
2166 find_taken_edge (basic_block bb, tree val)
2167 {
2168   gimple stmt;
2169
2170   stmt = last_stmt (bb);
2171
2172   gcc_assert (stmt);
2173   gcc_assert (is_ctrl_stmt (stmt));
2174
2175   if (val == NULL)
2176     return NULL;
2177
2178   if (!is_gimple_min_invariant (val))
2179     return NULL;
2180
2181   if (gimple_code (stmt) == GIMPLE_COND)
2182     return find_taken_edge_cond_expr (bb, val);
2183
2184   if (gimple_code (stmt) == GIMPLE_SWITCH)
2185     return find_taken_edge_switch_expr (bb, val);
2186
2187   if (computed_goto_p (stmt))
2188     {
2189       /* Only optimize if the argument is a label, if the argument is
2190          not a label then we can not construct a proper CFG.
2191
2192          It may be the case that we only need to allow the LABEL_REF to
2193          appear inside an ADDR_EXPR, but we also allow the LABEL_REF to
2194          appear inside a LABEL_EXPR just to be safe.  */
2195       if ((TREE_CODE (val) == ADDR_EXPR || TREE_CODE (val) == LABEL_EXPR)
2196           && TREE_CODE (TREE_OPERAND (val, 0)) == LABEL_DECL)
2197         return find_taken_edge_computed_goto (bb, TREE_OPERAND (val, 0));
2198       return NULL;
2199     }
2200
2201   gcc_unreachable ();
2202 }
2203
2204 /* Given a constant value VAL and the entry block BB to a GOTO_EXPR
2205    statement, determine which of the outgoing edges will be taken out of the
2206    block.  Return NULL if either edge may be taken.  */
2207
2208 static edge
2209 find_taken_edge_computed_goto (basic_block bb, tree val)
2210 {
2211   basic_block dest;
2212   edge e = NULL;
2213
2214   dest = label_to_block (val);
2215   if (dest)
2216     {
2217       e = find_edge (bb, dest);
2218       gcc_assert (e != NULL);
2219     }
2220
2221   return e;
2222 }
2223
2224 /* Given a constant value VAL and the entry block BB to a COND_EXPR
2225    statement, determine which of the two edges will be taken out of the
2226    block.  Return NULL if either edge may be taken.  */
2227
2228 static edge
2229 find_taken_edge_cond_expr (basic_block bb, tree val)
2230 {
2231   edge true_edge, false_edge;
2232
2233   extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
2234
2235   gcc_assert (TREE_CODE (val) == INTEGER_CST);
2236   return (integer_zerop (val) ? false_edge : true_edge);
2237 }
2238
2239 /* Given an INTEGER_CST VAL and the entry block BB to a SWITCH_EXPR
2240    statement, determine which edge will be taken out of the block.  Return
2241    NULL if any edge may be taken.  */
2242
2243 static edge
2244 find_taken_edge_switch_expr (basic_block bb, tree val)
2245 {
2246   basic_block dest_bb;
2247   edge e;
2248   gimple switch_stmt;
2249   tree taken_case;
2250
2251   switch_stmt = last_stmt (bb);
2252   taken_case = find_case_label_for_value (switch_stmt, val);
2253   dest_bb = label_to_block (CASE_LABEL (taken_case));
2254
2255   e = find_edge (bb, dest_bb);
2256   gcc_assert (e);
2257   return e;
2258 }
2259
2260
2261 /* Return the CASE_LABEL_EXPR that SWITCH_STMT will take for VAL.
2262    We can make optimal use here of the fact that the case labels are
2263    sorted: We can do a binary search for a case matching VAL.  */
2264
2265 static tree
2266 find_case_label_for_value (gimple switch_stmt, tree val)
2267 {
2268   size_t low, high, n = gimple_switch_num_labels (switch_stmt);
2269   tree default_case = gimple_switch_default_label (switch_stmt);
2270
2271   for (low = 0, high = n; high - low > 1; )
2272     {
2273       size_t i = (high + low) / 2;
2274       tree t = gimple_switch_label (switch_stmt, i);
2275       int cmp;
2276
2277       /* Cache the result of comparing CASE_LOW and val.  */
2278       cmp = tree_int_cst_compare (CASE_LOW (t), val);
2279
2280       if (cmp > 0)
2281         high = i;
2282       else
2283         low = i;
2284
2285       if (CASE_HIGH (t) == NULL)
2286         {
2287           /* A singe-valued case label.  */
2288           if (cmp == 0)
2289             return t;
2290         }
2291       else
2292         {
2293           /* A case range.  We can only handle integer ranges.  */
2294           if (cmp <= 0 && tree_int_cst_compare (CASE_HIGH (t), val) >= 0)
2295             return t;
2296         }
2297     }
2298
2299   return default_case;
2300 }
2301
2302
2303 /* Dump a basic block on stderr.  */
2304
2305 void
2306 gimple_debug_bb (basic_block bb)
2307 {
2308   gimple_dump_bb (bb, stderr, 0, TDF_VOPS|TDF_MEMSYMS);
2309 }
2310
2311
2312 /* Dump basic block with index N on stderr.  */
2313
2314 basic_block
2315 gimple_debug_bb_n (int n)
2316 {
2317   gimple_debug_bb (BASIC_BLOCK (n));
2318   return BASIC_BLOCK (n);
2319 }
2320
2321
2322 /* Dump the CFG on stderr.
2323
2324    FLAGS are the same used by the tree dumping functions
2325    (see TDF_* in tree-pass.h).  */
2326
2327 void
2328 gimple_debug_cfg (int flags)
2329 {
2330   gimple_dump_cfg (stderr, flags);
2331 }
2332
2333
2334 /* Dump the program showing basic block boundaries on the given FILE.
2335
2336    FLAGS are the same used by the tree dumping functions (see TDF_* in
2337    tree.h).  */
2338
2339 void
2340 gimple_dump_cfg (FILE *file, int flags)
2341 {
2342   if (flags & TDF_DETAILS)
2343     {
2344       const char *funcname
2345         = lang_hooks.decl_printable_name (current_function_decl, 2);
2346
2347       fputc ('\n', file);
2348       fprintf (file, ";; Function %s\n\n", funcname);
2349       fprintf (file, ";; \n%d basic blocks, %d edges, last basic block %d.\n\n",
2350                n_basic_blocks, n_edges, last_basic_block);
2351
2352       brief_dump_cfg (file);
2353       fprintf (file, "\n");
2354     }
2355
2356   if (flags & TDF_STATS)
2357     dump_cfg_stats (file);
2358
2359   dump_function_to_file (current_function_decl, file, flags | TDF_BLOCKS);
2360 }
2361
2362
2363 /* Dump CFG statistics on FILE.  */
2364
2365 void
2366 dump_cfg_stats (FILE *file)
2367 {
2368   static long max_num_merged_labels = 0;
2369   unsigned long size, total = 0;
2370   long num_edges;
2371   basic_block bb;
2372   const char * const fmt_str   = "%-30s%-13s%12s\n";
2373   const char * const fmt_str_1 = "%-30s%13d%11lu%c\n";
2374   const char * const fmt_str_2 = "%-30s%13ld%11lu%c\n";
2375   const char * const fmt_str_3 = "%-43s%11lu%c\n";
2376   const char *funcname
2377     = lang_hooks.decl_printable_name (current_function_decl, 2);
2378
2379
2380   fprintf (file, "\nCFG Statistics for %s\n\n", funcname);
2381
2382   fprintf (file, "---------------------------------------------------------\n");
2383   fprintf (file, fmt_str, "", "  Number of  ", "Memory");
2384   fprintf (file, fmt_str, "", "  instances  ", "used ");
2385   fprintf (file, "---------------------------------------------------------\n");
2386
2387   size = n_basic_blocks * sizeof (struct basic_block_def);
2388   total += size;
2389   fprintf (file, fmt_str_1, "Basic blocks", n_basic_blocks,
2390            SCALE (size), LABEL (size));
2391
2392   num_edges = 0;
2393   FOR_EACH_BB (bb)
2394     num_edges += EDGE_COUNT (bb->succs);
2395   size = num_edges * sizeof (struct edge_def);
2396   total += size;
2397   fprintf (file, fmt_str_2, "Edges", num_edges, SCALE (size), LABEL (size));
2398
2399   fprintf (file, "---------------------------------------------------------\n");
2400   fprintf (file, fmt_str_3, "Total memory used by CFG data", SCALE (total),
2401            LABEL (total));
2402   fprintf (file, "---------------------------------------------------------\n");
2403   fprintf (file, "\n");
2404
2405   if (cfg_stats.num_merged_labels > max_num_merged_labels)
2406     max_num_merged_labels = cfg_stats.num_merged_labels;
2407
2408   fprintf (file, "Coalesced label blocks: %ld (Max so far: %ld)\n",
2409            cfg_stats.num_merged_labels, max_num_merged_labels);
2410
2411   fprintf (file, "\n");
2412 }
2413
2414
2415 /* Dump CFG statistics on stderr.  Keep extern so that it's always
2416    linked in the final executable.  */
2417
2418 void
2419 debug_cfg_stats (void)
2420 {
2421   dump_cfg_stats (stderr);
2422 }
2423
2424
2425 /* Dump the flowgraph to a .vcg FILE.  */
2426
2427 static void
2428 gimple_cfg2vcg (FILE *file)
2429 {
2430   edge e;
2431   edge_iterator ei;
2432   basic_block bb;
2433   const char *funcname
2434     = lang_hooks.decl_printable_name (current_function_decl, 2);
2435
2436   /* Write the file header.  */
2437   fprintf (file, "graph: { title: \"%s\"\n", funcname);
2438   fprintf (file, "node: { title: \"ENTRY\" label: \"ENTRY\" }\n");
2439   fprintf (file, "node: { title: \"EXIT\" label: \"EXIT\" }\n");
2440
2441   /* Write blocks and edges.  */
2442   FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
2443     {
2444       fprintf (file, "edge: { sourcename: \"ENTRY\" targetname: \"%d\"",
2445                e->dest->index);
2446
2447       if (e->flags & EDGE_FAKE)
2448         fprintf (file, " linestyle: dotted priority: 10");
2449       else
2450         fprintf (file, " linestyle: solid priority: 100");
2451
2452       fprintf (file, " }\n");
2453     }
2454   fputc ('\n', file);
2455
2456   FOR_EACH_BB (bb)
2457     {
2458       enum gimple_code head_code, end_code;
2459       const char *head_name, *end_name;
2460       int head_line = 0;
2461       int end_line = 0;
2462       gimple first = first_stmt (bb);
2463       gimple last = last_stmt (bb);
2464
2465       if (first)
2466         {
2467           head_code = gimple_code (first);
2468           head_name = gimple_code_name[head_code];
2469           head_line = get_lineno (first);
2470         }
2471       else
2472         head_name = "no-statement";
2473
2474       if (last)
2475         {
2476           end_code = gimple_code (last);
2477           end_name = gimple_code_name[end_code];
2478           end_line = get_lineno (last);
2479         }
2480       else
2481         end_name = "no-statement";
2482
2483       fprintf (file, "node: { title: \"%d\" label: \"#%d\\n%s (%d)\\n%s (%d)\"}\n",
2484                bb->index, bb->index, head_name, head_line, end_name,
2485                end_line);
2486
2487       FOR_EACH_EDGE (e, ei, bb->succs)
2488         {
2489           if (e->dest == EXIT_BLOCK_PTR)
2490             fprintf (file, "edge: { sourcename: \"%d\" targetname: \"EXIT\"", bb->index);
2491           else
2492             fprintf (file, "edge: { sourcename: \"%d\" targetname: \"%d\"", bb->index, e->dest->index);
2493
2494           if (e->flags & EDGE_FAKE)
2495             fprintf (file, " priority: 10 linestyle: dotted");
2496           else
2497             fprintf (file, " priority: 100 linestyle: solid");
2498
2499           fprintf (file, " }\n");
2500         }
2501
2502       if (bb->next_bb != EXIT_BLOCK_PTR)
2503         fputc ('\n', file);
2504     }
2505
2506   fputs ("}\n\n", file);
2507 }
2508
2509
2510
2511 /*---------------------------------------------------------------------------
2512                              Miscellaneous helpers
2513 ---------------------------------------------------------------------------*/
2514
2515 /* Return true if T represents a stmt that always transfers control.  */
2516
2517 bool
2518 is_ctrl_stmt (gimple t)
2519 {
2520   return gimple_code (t) == GIMPLE_COND
2521     || gimple_code (t) == GIMPLE_SWITCH
2522     || gimple_code (t) == GIMPLE_GOTO
2523     || gimple_code (t) == GIMPLE_RETURN
2524     || gimple_code (t) == GIMPLE_RESX;
2525 }
2526
2527
2528 /* Return true if T is a statement that may alter the flow of control
2529    (e.g., a call to a non-returning function).  */
2530
2531 bool
2532 is_ctrl_altering_stmt (gimple t)
2533 {
2534   gcc_assert (t);
2535
2536   if (is_gimple_call (t))
2537     {
2538       int flags = gimple_call_flags (t);
2539
2540       /* A non-pure/const call alters flow control if the current
2541          function has nonlocal labels.  */
2542       if (!(flags & (ECF_CONST | ECF_PURE))
2543           && cfun->has_nonlocal_label)
2544         return true;
2545
2546       /* A call also alters control flow if it does not return.  */
2547       if (gimple_call_flags (t) & ECF_NORETURN)
2548         return true;
2549     }
2550
2551   /* OpenMP directives alter control flow.  */
2552   if (is_gimple_omp (t))
2553     return true;
2554
2555   /* If a statement can throw, it alters control flow.  */
2556   return stmt_can_throw_internal (t);
2557 }
2558
2559
2560 /* Return true if T is a simple local goto.  */
2561
2562 bool
2563 simple_goto_p (gimple t)
2564 {
2565   return (gimple_code (t) == GIMPLE_GOTO
2566           && TREE_CODE (gimple_goto_dest (t)) == LABEL_DECL);
2567 }
2568
2569
2570 /* Return true if T can make an abnormal transfer of control flow.
2571    Transfers of control flow associated with EH are excluded.  */
2572
2573 bool
2574 stmt_can_make_abnormal_goto (gimple t)
2575 {
2576   if (computed_goto_p (t))
2577     return true;
2578   if (is_gimple_call (t))
2579     return gimple_has_side_effects (t) && cfun->has_nonlocal_label;
2580   return false;
2581 }
2582
2583
2584 /* Return true if STMT should start a new basic block.  PREV_STMT is
2585    the statement preceding STMT.  It is used when STMT is a label or a
2586    case label.  Labels should only start a new basic block if their
2587    previous statement wasn't a label.  Otherwise, sequence of labels
2588    would generate unnecessary basic blocks that only contain a single
2589    label.  */
2590
2591 static inline bool
2592 stmt_starts_bb_p (gimple stmt, gimple prev_stmt)
2593 {
2594   if (stmt == NULL)
2595     return false;
2596
2597   /* Labels start a new basic block only if the preceding statement
2598      wasn't a label of the same type.  This prevents the creation of
2599      consecutive blocks that have nothing but a single label.  */
2600   if (gimple_code (stmt) == GIMPLE_LABEL)
2601     {
2602       /* Nonlocal and computed GOTO targets always start a new block.  */
2603       if (DECL_NONLOCAL (gimple_label_label (stmt))
2604           || FORCED_LABEL (gimple_label_label (stmt)))
2605         return true;
2606
2607       if (prev_stmt && gimple_code (prev_stmt) == GIMPLE_LABEL)
2608         {
2609           if (DECL_NONLOCAL (gimple_label_label (prev_stmt)))
2610             return true;
2611
2612           cfg_stats.num_merged_labels++;
2613           return false;
2614         }
2615       else
2616         return true;
2617     }
2618
2619   return false;
2620 }
2621
2622
2623 /* Return true if T should end a basic block.  */
2624
2625 bool
2626 stmt_ends_bb_p (gimple t)
2627 {
2628   return is_ctrl_stmt (t) || is_ctrl_altering_stmt (t);
2629 }
2630
2631 /* Remove block annotations and other data structures.  */
2632
2633 void
2634 delete_tree_cfg_annotations (void)
2635 {
2636   label_to_block_map = NULL;
2637 }
2638
2639
2640 /* Return the first statement in basic block BB.  */
2641
2642 gimple
2643 first_stmt (basic_block bb)
2644 {
2645   gimple_stmt_iterator i = gsi_start_bb (bb);
2646   return !gsi_end_p (i) ? gsi_stmt (i) : NULL;
2647 }
2648
2649 /* Return the last statement in basic block BB.  */
2650
2651 gimple
2652 last_stmt (basic_block bb)
2653 {
2654   gimple_stmt_iterator b = gsi_last_bb (bb);
2655   return !gsi_end_p (b) ? gsi_stmt (b) : NULL;
2656 }
2657
2658 /* Return the last statement of an otherwise empty block.  Return NULL
2659    if the block is totally empty, or if it contains more than one
2660    statement.  */
2661
2662 gimple
2663 last_and_only_stmt (basic_block bb)
2664 {
2665   gimple_stmt_iterator i = gsi_last_bb (bb);
2666   gimple last, prev;
2667
2668   if (gsi_end_p (i))
2669     return NULL;
2670
2671   last = gsi_stmt (i);
2672   gsi_prev (&i);
2673   if (gsi_end_p (i))
2674     return last;
2675
2676   /* Empty statements should no longer appear in the instruction stream.
2677      Everything that might have appeared before should be deleted by
2678      remove_useless_stmts, and the optimizers should just gsi_remove
2679      instead of smashing with build_empty_stmt.
2680
2681      Thus the only thing that should appear here in a block containing
2682      one executable statement is a label.  */
2683   prev = gsi_stmt (i);
2684   if (gimple_code (prev) == GIMPLE_LABEL)
2685     return last;
2686   else
2687     return NULL;
2688 }
2689
2690 /* Reinstall those PHI arguments queued in OLD_EDGE to NEW_EDGE.  */
2691
2692 static void
2693 reinstall_phi_args (edge new_edge, edge old_edge)
2694 {
2695   edge_var_map_vector v;
2696   edge_var_map *vm;
2697   int i;
2698   gimple_stmt_iterator phis;
2699   
2700   v = redirect_edge_var_map_vector (old_edge);
2701   if (!v)
2702     return;
2703   
2704   for (i = 0, phis = gsi_start_phis (new_edge->dest);
2705        VEC_iterate (edge_var_map, v, i, vm) && !gsi_end_p (phis);
2706        i++, gsi_next (&phis))
2707     {
2708       gimple phi = gsi_stmt (phis);
2709       tree result = redirect_edge_var_map_result (vm);
2710       tree arg = redirect_edge_var_map_def (vm);
2711  
2712       gcc_assert (result == gimple_phi_result (phi));
2713   
2714       add_phi_arg (phi, arg, new_edge);
2715     }
2716   
2717   redirect_edge_var_map_clear (old_edge);
2718 }
2719
2720 /* Returns the basic block after which the new basic block created
2721    by splitting edge EDGE_IN should be placed.  Tries to keep the new block
2722    near its "logical" location.  This is of most help to humans looking
2723    at debugging dumps.  */
2724
2725 static basic_block
2726 split_edge_bb_loc (edge edge_in)
2727 {
2728   basic_block dest = edge_in->dest;
2729
2730   if (dest->prev_bb && find_edge (dest->prev_bb, dest))
2731     return edge_in->src;
2732   else
2733     return dest->prev_bb;
2734 }
2735
2736 /* Split a (typically critical) edge EDGE_IN.  Return the new block.
2737    Abort on abnormal edges.  */
2738
2739 static basic_block
2740 gimple_split_edge (edge edge_in)
2741 {
2742   basic_block new_bb, after_bb, dest;
2743   edge new_edge, e;
2744
2745   /* Abnormal edges cannot be split.  */
2746   gcc_assert (!(edge_in->flags & EDGE_ABNORMAL));
2747
2748   dest = edge_in->dest;
2749
2750   after_bb = split_edge_bb_loc (edge_in);
2751
2752   new_bb = create_empty_bb (after_bb);
2753   new_bb->frequency = EDGE_FREQUENCY (edge_in);
2754   new_bb->count = edge_in->count;
2755   new_edge = make_edge (new_bb, dest, EDGE_FALLTHRU);
2756   new_edge->probability = REG_BR_PROB_BASE;
2757   new_edge->count = edge_in->count;
2758
2759   e = redirect_edge_and_branch (edge_in, new_bb);
2760   gcc_assert (e == edge_in);
2761   reinstall_phi_args (new_edge, e);
2762
2763   return new_bb;
2764 }
2765
2766 /* Callback for walk_tree, check that all elements with address taken are
2767    properly noticed as such.  The DATA is an int* that is 1 if TP was seen
2768    inside a PHI node.  */
2769
2770 static tree
2771 verify_expr (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
2772 {
2773   tree t = *tp, x;
2774
2775   if (TYPE_P (t))
2776     *walk_subtrees = 0;
2777
2778   /* Check operand N for being valid GIMPLE and give error MSG if not.  */
2779 #define CHECK_OP(N, MSG) \
2780   do { if (!is_gimple_val (TREE_OPERAND (t, N)))                \
2781        { error (MSG); return TREE_OPERAND (t, N); }} while (0)
2782
2783   switch (TREE_CODE (t))
2784     {
2785     case SSA_NAME:
2786       if (SSA_NAME_IN_FREE_LIST (t))
2787         {
2788           error ("SSA name in freelist but still referenced");
2789           return *tp;
2790         }
2791       break;
2792
2793     case ASSERT_EXPR:
2794       x = fold (ASSERT_EXPR_COND (t));
2795       if (x == boolean_false_node)
2796         {
2797           error ("ASSERT_EXPR with an always-false condition");
2798           return *tp;
2799         }
2800       break;
2801
2802     case MODIFY_EXPR:
2803       x = TREE_OPERAND (t, 0);
2804       if (TREE_CODE (x) == BIT_FIELD_REF
2805           && is_gimple_reg (TREE_OPERAND (x, 0)))
2806         {
2807           error ("GIMPLE register modified with BIT_FIELD_REF");
2808           return t;
2809         }
2810       break;
2811
2812     case ADDR_EXPR:
2813       {
2814         bool old_constant;
2815         bool old_side_effects;
2816         bool new_constant;
2817         bool new_side_effects;
2818
2819         gcc_assert (is_gimple_address (t));
2820
2821         old_constant = TREE_CONSTANT (t);
2822         old_side_effects = TREE_SIDE_EFFECTS (t);
2823
2824         recompute_tree_invariant_for_addr_expr (t);
2825         new_side_effects = TREE_SIDE_EFFECTS (t);
2826         new_constant = TREE_CONSTANT (t);
2827
2828         if (old_constant != new_constant)
2829           {
2830             error ("constant not recomputed when ADDR_EXPR changed");
2831             return t;
2832           }
2833         if (old_side_effects != new_side_effects)
2834           {
2835             error ("side effects not recomputed when ADDR_EXPR changed");
2836             return t;
2837           }
2838
2839         /* Skip any references (they will be checked when we recurse down the
2840            tree) and ensure that any variable used as a prefix is marked
2841            addressable.  */
2842         for (x = TREE_OPERAND (t, 0);
2843              handled_component_p (x);
2844              x = TREE_OPERAND (x, 0))
2845           ;
2846
2847         if (TREE_CODE (x) != VAR_DECL && TREE_CODE (x) != PARM_DECL)
2848           return NULL;
2849         if (!TREE_ADDRESSABLE (x))
2850           {
2851             error ("address taken, but ADDRESSABLE bit not set");
2852             return x;
2853           }
2854
2855         break;
2856       }
2857
2858     case COND_EXPR:
2859       x = COND_EXPR_COND (t);
2860       if (!INTEGRAL_TYPE_P (TREE_TYPE (x)))
2861         {
2862           error ("non-integral used in condition");
2863           return x;
2864         }
2865       if (!is_gimple_condexpr (x))
2866         {
2867           error ("invalid conditional operand");
2868           return x;
2869         }
2870       break;
2871
2872     case NON_LVALUE_EXPR:
2873         gcc_unreachable ();
2874
2875     CASE_CONVERT:
2876     case FIX_TRUNC_EXPR:
2877     case FLOAT_EXPR:
2878     case NEGATE_EXPR:
2879     case ABS_EXPR:
2880     case BIT_NOT_EXPR:
2881     case TRUTH_NOT_EXPR:
2882       CHECK_OP (0, "invalid operand to unary operator");
2883       break;
2884
2885     case REALPART_EXPR:
2886     case IMAGPART_EXPR:
2887     case COMPONENT_REF:
2888     case ARRAY_REF:
2889     case ARRAY_RANGE_REF:
2890     case BIT_FIELD_REF:
2891     case VIEW_CONVERT_EXPR:
2892       /* We have a nest of references.  Verify that each of the operands
2893          that determine where to reference is either a constant or a variable,
2894          verify that the base is valid, and then show we've already checked
2895          the subtrees.  */
2896       while (handled_component_p (t))
2897         {
2898           if (TREE_CODE (t) == COMPONENT_REF && TREE_OPERAND (t, 2))
2899             CHECK_OP (2, "invalid COMPONENT_REF offset operator");
2900           else if (TREE_CODE (t) == ARRAY_REF
2901                    || TREE_CODE (t) == ARRAY_RANGE_REF)
2902             {
2903               CHECK_OP (1, "invalid array index");
2904               if (TREE_OPERAND (t, 2))
2905                 CHECK_OP (2, "invalid array lower bound");
2906               if (TREE_OPERAND (t, 3))
2907                 CHECK_OP (3, "invalid array stride");
2908             }
2909           else if (TREE_CODE (t) == BIT_FIELD_REF)
2910             {
2911               if (!host_integerp (TREE_OPERAND (t, 1), 1)
2912                   || !host_integerp (TREE_OPERAND (t, 2), 1))
2913                 {
2914                   error ("invalid position or size operand to BIT_FIELD_REF");
2915                   return t;
2916                 }
2917               else if (INTEGRAL_TYPE_P (TREE_TYPE (t))
2918                        && (TYPE_PRECISION (TREE_TYPE (t))
2919                            != TREE_INT_CST_LOW (TREE_OPERAND (t, 1))))
2920                 {
2921                   error ("integral result type precision does not match "
2922                          "field size of BIT_FIELD_REF");
2923                   return t;
2924                 }
2925               if (!INTEGRAL_TYPE_P (TREE_TYPE (t))
2926                   && (GET_MODE_PRECISION (TYPE_MODE (TREE_TYPE (t)))
2927                       != TREE_INT_CST_LOW (TREE_OPERAND (t, 1))))
2928                 {
2929                   error ("mode precision of non-integral result does not "
2930                          "match field size of BIT_FIELD_REF");
2931                   return t;
2932                 }
2933             }
2934
2935           t = TREE_OPERAND (t, 0);
2936         }
2937
2938       if (!is_gimple_min_invariant (t) && !is_gimple_lvalue (t))
2939         {
2940           error ("invalid reference prefix");
2941           return t;
2942         }
2943       *walk_subtrees = 0;
2944       break;
2945     case PLUS_EXPR:
2946     case MINUS_EXPR:
2947       /* PLUS_EXPR and MINUS_EXPR don't work on pointers, they should be done using
2948          POINTER_PLUS_EXPR. */
2949       if (POINTER_TYPE_P (TREE_TYPE (t)))
2950         {
2951           error ("invalid operand to plus/minus, type is a pointer");
2952           return t;
2953         }
2954       CHECK_OP (0, "invalid operand to binary operator");
2955       CHECK_OP (1, "invalid operand to binary operator");
2956       break;
2957
2958     case POINTER_PLUS_EXPR:
2959       /* Check to make sure the first operand is a pointer or reference type. */
2960       if (!POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (t, 0))))
2961         {
2962           error ("invalid operand to pointer plus, first operand is not a pointer");
2963           return t;
2964         }
2965       /* Check to make sure the second operand is an integer with type of
2966          sizetype.  */
2967       if (!useless_type_conversion_p (sizetype,
2968                                      TREE_TYPE (TREE_OPERAND (t, 1))))
2969         {
2970           error ("invalid operand to pointer plus, second operand is not an "
2971                  "integer with type of sizetype.");
2972           return t;
2973         }
2974       /* FALLTHROUGH */
2975     case LT_EXPR:
2976     case LE_EXPR:
2977     case GT_EXPR:
2978     case GE_EXPR:
2979     case EQ_EXPR:
2980     case NE_EXPR:
2981     case UNORDERED_EXPR:
2982     case ORDERED_EXPR:
2983     case UNLT_EXPR:
2984     case UNLE_EXPR:
2985     case UNGT_EXPR:
2986     case UNGE_EXPR:
2987     case UNEQ_EXPR:
2988     case LTGT_EXPR:
2989     case MULT_EXPR:
2990     case TRUNC_DIV_EXPR:
2991     case CEIL_DIV_EXPR:
2992     case FLOOR_DIV_EXPR:
2993     case ROUND_DIV_EXPR:
2994     case TRUNC_MOD_EXPR:
2995     case CEIL_MOD_EXPR:
2996     case FLOOR_MOD_EXPR:
2997     case ROUND_MOD_EXPR:
2998     case RDIV_EXPR:
2999     case EXACT_DIV_EXPR:
3000     case MIN_EXPR:
3001     case MAX_EXPR:
3002     case LSHIFT_EXPR:
3003     case RSHIFT_EXPR:
3004     case LROTATE_EXPR:
3005     case RROTATE_EXPR:
3006     case BIT_IOR_EXPR:
3007     case BIT_XOR_EXPR:
3008     case BIT_AND_EXPR:
3009       CHECK_OP (0, "invalid operand to binary operator");
3010       CHECK_OP (1, "invalid operand to binary operator");
3011       break;
3012
3013     case CONSTRUCTOR:
3014       if (TREE_CONSTANT (t) && TREE_CODE (TREE_TYPE (t)) == VECTOR_TYPE)
3015         *walk_subtrees = 0;
3016       break;
3017
3018     default:
3019       break;
3020     }
3021   return NULL;
3022
3023 #undef CHECK_OP
3024 }
3025
3026
3027 /* Verify if EXPR is either a GIMPLE ID or a GIMPLE indirect reference.
3028    Returns true if there is an error, otherwise false.  */
3029
3030 static bool
3031 verify_types_in_gimple_min_lval (tree expr)
3032 {
3033   tree op;
3034
3035   if (is_gimple_id (expr))
3036     return false;
3037
3038   if (!INDIRECT_REF_P (expr)
3039       && TREE_CODE (expr) != TARGET_MEM_REF)
3040     {
3041       error ("invalid expression for min lvalue");
3042       return true;
3043     }
3044
3045   /* TARGET_MEM_REFs are strange beasts.  */
3046   if (TREE_CODE (expr) == TARGET_MEM_REF)
3047     return false;
3048
3049   op = TREE_OPERAND (expr, 0);
3050   if (!is_gimple_val (op))
3051     {
3052       error ("invalid operand in indirect reference");
3053       debug_generic_stmt (op);
3054       return true;
3055     }
3056   if (!useless_type_conversion_p (TREE_TYPE (expr),
3057                                   TREE_TYPE (TREE_TYPE (op))))
3058     {
3059       error ("type mismatch in indirect reference");
3060       debug_generic_stmt (TREE_TYPE (expr));
3061       debug_generic_stmt (TREE_TYPE (TREE_TYPE (op)));
3062       return true;
3063     }
3064
3065   return false;
3066 }
3067
3068 /* Verify if EXPR is a valid GIMPLE reference expression.  Returns true
3069    if there is an error, otherwise false.  */
3070
3071 static bool
3072 verify_types_in_gimple_reference (tree expr)
3073 {
3074   while (handled_component_p (expr))
3075     {
3076       tree op = TREE_OPERAND (expr, 0);
3077
3078       if (TREE_CODE (expr) == ARRAY_REF
3079           || TREE_CODE (expr) == ARRAY_RANGE_REF)
3080         {
3081           if (!is_gimple_val (TREE_OPERAND (expr, 1))
3082               || (TREE_OPERAND (expr, 2)
3083                   && !is_gimple_val (TREE_OPERAND (expr, 2)))
3084               || (TREE_OPERAND (expr, 3)
3085                   && !is_gimple_val (TREE_OPERAND (expr, 3))))
3086             {
3087               error ("invalid operands to array reference");
3088               debug_generic_stmt (expr);
3089               return true;
3090             }
3091         }
3092
3093       /* Verify if the reference array element types are compatible.  */
3094       if (TREE_CODE (expr) == ARRAY_REF
3095           && !useless_type_conversion_p (TREE_TYPE (expr),
3096                                          TREE_TYPE (TREE_TYPE (op))))
3097         {
3098           error ("type mismatch in array reference");
3099           debug_generic_stmt (TREE_TYPE (expr));
3100           debug_generic_stmt (TREE_TYPE (TREE_TYPE (op)));
3101           return true;
3102         }
3103       if (TREE_CODE (expr) == ARRAY_RANGE_REF
3104           && !useless_type_conversion_p (TREE_TYPE (TREE_TYPE (expr)),
3105                                          TREE_TYPE (TREE_TYPE (op))))
3106         {
3107           error ("type mismatch in array range reference");
3108           debug_generic_stmt (TREE_TYPE (TREE_TYPE (expr)));
3109           debug_generic_stmt (TREE_TYPE (TREE_TYPE (op)));
3110           return true;
3111         }
3112
3113       if ((TREE_CODE (expr) == REALPART_EXPR
3114            || TREE_CODE (expr) == IMAGPART_EXPR)
3115           && !useless_type_conversion_p (TREE_TYPE (expr),
3116                                          TREE_TYPE (TREE_TYPE (op))))
3117         {
3118           error ("type mismatch in real/imagpart reference");
3119           debug_generic_stmt (TREE_TYPE (expr));
3120           debug_generic_stmt (TREE_TYPE (TREE_TYPE (op)));
3121           return true;
3122         }
3123
3124       if (TREE_CODE (expr) == COMPONENT_REF
3125           && !useless_type_conversion_p (TREE_TYPE (expr),
3126                                          TREE_TYPE (TREE_OPERAND (expr, 1))))
3127         {
3128           error ("type mismatch in component reference");
3129           debug_generic_stmt (TREE_TYPE (expr));
3130           debug_generic_stmt (TREE_TYPE (TREE_OPERAND (expr, 1)));
3131           return true;
3132         }
3133
3134       /* For VIEW_CONVERT_EXPRs which are allowed here, too, there
3135          is nothing to verify.  Gross mismatches at most invoke
3136          undefined behavior.  */
3137       if (TREE_CODE (expr) == VIEW_CONVERT_EXPR
3138           && !handled_component_p (op))
3139         return false;
3140
3141       expr = op;
3142     }
3143
3144   return verify_types_in_gimple_min_lval (expr);
3145 }
3146
3147 /* Returns true if there is one pointer type in TYPE_POINTER_TO (SRC_OBJ)
3148    list of pointer-to types that is trivially convertible to DEST.  */
3149
3150 static bool
3151 one_pointer_to_useless_type_conversion_p (tree dest, tree src_obj)
3152 {
3153   tree src;
3154
3155   if (!TYPE_POINTER_TO (src_obj))
3156     return true;
3157
3158   for (src = TYPE_POINTER_TO (src_obj); src; src = TYPE_NEXT_PTR_TO (src))
3159     if (useless_type_conversion_p (dest, src))
3160       return true;
3161
3162   return false;
3163 }
3164
3165 /* Return true if TYPE1 is a fixed-point type and if conversions to and
3166    from TYPE2 can be handled by FIXED_CONVERT_EXPR.  */
3167
3168 static bool
3169 valid_fixed_convert_types_p (tree type1, tree type2)
3170 {
3171   return (FIXED_POINT_TYPE_P (type1)
3172           && (INTEGRAL_TYPE_P (type2)
3173               || SCALAR_FLOAT_TYPE_P (type2)
3174               || FIXED_POINT_TYPE_P (type2)));
3175 }
3176
3177 /* Verify the contents of a GIMPLE_CALL STMT.  Returns true when there
3178    is a problem, otherwise false.  */
3179
3180 static bool
3181 verify_gimple_call (gimple stmt)
3182 {
3183   tree fn = gimple_call_fn (stmt);
3184   tree fntype;
3185
3186   if (!POINTER_TYPE_P (TREE_TYPE  (fn))
3187       || (TREE_CODE (TREE_TYPE (TREE_TYPE (fn))) != FUNCTION_TYPE
3188           && TREE_CODE (TREE_TYPE (TREE_TYPE (fn))) != METHOD_TYPE))
3189     {
3190       error ("non-function in gimple call");
3191       return true;
3192     }
3193
3194   if (gimple_call_lhs (stmt)
3195       && !is_gimple_lvalue (gimple_call_lhs (stmt)))
3196     {
3197       error ("invalid LHS in gimple call");
3198       return true;
3199     }
3200
3201   fntype = TREE_TYPE (TREE_TYPE (fn));
3202   if (gimple_call_lhs (stmt)
3203       && !useless_type_conversion_p (TREE_TYPE (gimple_call_lhs (stmt)),
3204                                      TREE_TYPE (fntype))
3205       /* ???  At least C++ misses conversions at assignments from
3206          void * call results.
3207          ???  Java is completely off.  Especially with functions
3208          returning java.lang.Object.
3209          For now simply allow arbitrary pointer type conversions.  */
3210       && !(POINTER_TYPE_P (TREE_TYPE (gimple_call_lhs (stmt)))
3211            && POINTER_TYPE_P (TREE_TYPE (fntype))))
3212     {
3213       error ("invalid conversion in gimple call");
3214       debug_generic_stmt (TREE_TYPE (gimple_call_lhs (stmt)));
3215       debug_generic_stmt (TREE_TYPE (fntype));
3216       return true;
3217     }
3218
3219   /* ???  The C frontend passes unpromoted arguments in case it
3220      didn't see a function declaration before the call.  So for now
3221      leave the call arguments unverified.  Once we gimplify
3222      unit-at-a-time we have a chance to fix this.  */
3223
3224   return false;
3225 }
3226
3227 /* Verifies the gimple comparison with the result type TYPE and
3228    the operands OP0 and OP1.  */
3229
3230 static bool
3231 verify_gimple_comparison (tree type, tree op0, tree op1)
3232 {
3233   tree op0_type = TREE_TYPE (op0);
3234   tree op1_type = TREE_TYPE (op1);
3235
3236   if (!is_gimple_val (op0) || !is_gimple_val (op1))
3237     {
3238       error ("invalid operands in gimple comparison");
3239       return true;
3240     }
3241
3242   /* For comparisons we do not have the operations type as the
3243      effective type the comparison is carried out in.  Instead
3244      we require that either the first operand is trivially
3245      convertible into the second, or the other way around.
3246      The resulting type of a comparison may be any integral type.
3247      Because we special-case pointers to void we allow
3248      comparisons of pointers with the same mode as well.  */
3249   if ((!useless_type_conversion_p (op0_type, op1_type)
3250        && !useless_type_conversion_p (op1_type, op0_type)
3251        && (!POINTER_TYPE_P (op0_type)
3252            || !POINTER_TYPE_P (op1_type)
3253            || TYPE_MODE (op0_type) != TYPE_MODE (op1_type)))
3254       || !INTEGRAL_TYPE_P (type))
3255     {
3256       error ("type mismatch in comparison expression");
3257       debug_generic_expr (type);
3258       debug_generic_expr (op0_type);
3259       debug_generic_expr (op1_type);
3260       return true;
3261     }
3262
3263   return false;
3264 }
3265
3266 /* Verify a gimple assignment statement STMT with an unary rhs.
3267    Returns true if anything is wrong.  */
3268
3269 static bool
3270 verify_gimple_assign_unary (gimple stmt)
3271 {
3272   enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
3273   tree lhs = gimple_assign_lhs (stmt);
3274   tree lhs_type = TREE_TYPE (lhs);
3275   tree rhs1 = gimple_assign_rhs1 (stmt);
3276   tree rhs1_type = TREE_TYPE (rhs1);
3277
3278   if (!is_gimple_reg (lhs)
3279       && !(optimize == 0
3280            && TREE_CODE (lhs_type) == COMPLEX_TYPE))
3281     {
3282       error ("non-register as LHS of unary operation");
3283       return true;
3284     }
3285
3286   if (!is_gimple_val (rhs1))
3287     {
3288       error ("invalid operand in unary operation");
3289       return true;
3290     }
3291
3292   /* First handle conversions.  */
3293   switch (rhs_code)
3294     {
3295     CASE_CONVERT:
3296       {
3297         /* Allow conversions between integral types and pointers only if
3298            there is no sign or zero extension involved.
3299            For targets were the precision of sizetype doesn't match that
3300            of pointers we need to allow arbitrary conversions from and
3301            to sizetype.  */
3302         if ((POINTER_TYPE_P (lhs_type)
3303              && INTEGRAL_TYPE_P (rhs1_type)
3304              && (TYPE_PRECISION (lhs_type) >= TYPE_PRECISION (rhs1_type)
3305                  || rhs1_type == sizetype))
3306             || (POINTER_TYPE_P (rhs1_type)
3307                 && INTEGRAL_TYPE_P (lhs_type)
3308                 && (TYPE_PRECISION (rhs1_type) >= TYPE_PRECISION (lhs_type)
3309                     || lhs_type == sizetype)))
3310           return false;
3311
3312         /* Allow conversion from integer to offset type and vice versa.  */
3313         if ((TREE_CODE (lhs_type) == OFFSET_TYPE
3314              && TREE_CODE (rhs1_type) == INTEGER_TYPE)
3315             || (TREE_CODE (lhs_type) == INTEGER_TYPE
3316                 && TREE_CODE (rhs1_type) == OFFSET_TYPE))
3317           return false;
3318
3319         /* Otherwise assert we are converting between types of the
3320            same kind.  */
3321         if (INTEGRAL_TYPE_P (lhs_type) != INTEGRAL_TYPE_P (rhs1_type))
3322           {
3323             error ("invalid types in nop conversion");
3324             debug_generic_expr (lhs_type);
3325             debug_generic_expr (rhs1_type);
3326             return true;
3327           }
3328
3329         return false;
3330       }
3331
3332     case FIXED_CONVERT_EXPR:
3333       {
3334         if (!valid_fixed_convert_types_p (lhs_type, rhs1_type)
3335             && !valid_fixed_convert_types_p (rhs1_type, lhs_type))
3336           {
3337             error ("invalid types in fixed-point conversion");
3338             debug_generic_expr (lhs_type);
3339             debug_generic_expr (rhs1_type);
3340             return true;
3341           }
3342
3343         return false;
3344       }
3345
3346     case FLOAT_EXPR:
3347       {
3348         if (!INTEGRAL_TYPE_P (rhs1_type) || !SCALAR_FLOAT_TYPE_P (lhs_type))
3349           {
3350             error ("invalid types in conversion to floating point");
3351             debug_generic_expr (lhs_type);
3352             debug_generic_expr (rhs1_type);
3353             return true;
3354           }
3355
3356         return false;
3357       }
3358
3359     case FIX_TRUNC_EXPR:
3360       {
3361         if (!INTEGRAL_TYPE_P (lhs_type) || !SCALAR_FLOAT_TYPE_P (rhs1_type))
3362           {
3363             error ("invalid types in conversion to integer");
3364             debug_generic_expr (lhs_type);
3365             debug_generic_expr (rhs1_type);
3366             return true;
3367           }
3368
3369         return false;
3370       }
3371
3372     case TRUTH_NOT_EXPR:
3373       {
3374       }
3375
3376     case NEGATE_EXPR:
3377     case ABS_EXPR:
3378     case BIT_NOT_EXPR:
3379     case PAREN_EXPR:
3380     case NON_LVALUE_EXPR:
3381     case CONJ_EXPR:
3382     case REDUC_MAX_EXPR:
3383     case REDUC_MIN_EXPR:
3384     case REDUC_PLUS_EXPR:
3385     case VEC_UNPACK_HI_EXPR:
3386     case VEC_UNPACK_LO_EXPR:
3387     case VEC_UNPACK_FLOAT_HI_EXPR:
3388     case VEC_UNPACK_FLOAT_LO_EXPR:
3389       break;
3390
3391     default:
3392       gcc_unreachable ();
3393     }
3394
3395   /* For the remaining codes assert there is no conversion involved.  */
3396   if (!useless_type_conversion_p (lhs_type, rhs1_type))
3397     {
3398       error ("non-trivial conversion in unary operation");
3399       debug_generic_expr (lhs_type);
3400       debug_generic_expr (rhs1_type);
3401       return true;
3402     }
3403
3404   return false;
3405 }
3406
3407 /* Verify a gimple assignment statement STMT with a binary rhs.
3408    Returns true if anything is wrong.  */
3409
3410 static bool
3411 verify_gimple_assign_binary (gimple stmt)
3412 {
3413   enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
3414   tree lhs = gimple_assign_lhs (stmt);
3415   tree lhs_type = TREE_TYPE (lhs);
3416   tree rhs1 = gimple_assign_rhs1 (stmt);
3417   tree rhs1_type = TREE_TYPE (rhs1);
3418   tree rhs2 = gimple_assign_rhs2 (stmt);
3419   tree rhs2_type = TREE_TYPE (rhs2);
3420
3421   if (!is_gimple_reg (lhs)
3422       && !(optimize == 0
3423            && TREE_CODE (lhs_type) == COMPLEX_TYPE))
3424     {
3425       error ("non-register as LHS of binary operation");
3426       return true;
3427     }
3428
3429   if (!is_gimple_val (rhs1)
3430       || !is_gimple_val (rhs2))
3431     {
3432       error ("invalid operands in binary operation");
3433       return true;
3434     }
3435
3436   /* First handle operations that involve different types.  */
3437   switch (rhs_code)
3438     {
3439     case COMPLEX_EXPR:
3440       {
3441         if (TREE_CODE (lhs_type) != COMPLEX_TYPE
3442             || !(INTEGRAL_TYPE_P (rhs1_type)
3443                  || SCALAR_FLOAT_TYPE_P (rhs1_type))
3444             || !(INTEGRAL_TYPE_P (rhs2_type)
3445                  || SCALAR_FLOAT_TYPE_P (rhs2_type)))
3446           {
3447             error ("type mismatch in complex expression");
3448             debug_generic_expr (lhs_type);
3449             debug_generic_expr (rhs1_type);
3450             debug_generic_expr (rhs2_type);
3451             return true;
3452           }
3453
3454         return false;
3455       }
3456
3457     case LSHIFT_EXPR:
3458     case RSHIFT_EXPR:
3459     case LROTATE_EXPR:
3460     case RROTATE_EXPR:
3461       {
3462         if (!INTEGRAL_TYPE_P (rhs1_type)
3463             || !INTEGRAL_TYPE_P (rhs2_type)
3464             || !useless_type_conversion_p (lhs_type, rhs1_type))
3465           {
3466             error ("type mismatch in shift expression");
3467             debug_generic_expr (lhs_type);
3468             debug_generic_expr (rhs1_type);
3469             debug_generic_expr (rhs2_type);
3470             return true;
3471           }
3472
3473         return false;
3474       }
3475
3476     case VEC_LSHIFT_EXPR:
3477     case VEC_RSHIFT_EXPR:
3478       {
3479         if (TREE_CODE (rhs1_type) != VECTOR_TYPE
3480             || !INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))
3481             || (!INTEGRAL_TYPE_P (rhs2_type)
3482                 && (TREE_CODE (rhs2_type) != VECTOR_TYPE
3483                     || !INTEGRAL_TYPE_P (TREE_TYPE (rhs2_type))))
3484             || !useless_type_conversion_p (lhs_type, rhs1_type))
3485           {
3486             error ("type mismatch in vector shift expression");
3487             debug_generic_expr (lhs_type);
3488             debug_generic_expr (rhs1_type);
3489             debug_generic_expr (rhs2_type);
3490             return true;
3491           }
3492
3493         return false;
3494       }
3495
3496     case POINTER_PLUS_EXPR:
3497       {
3498         if (!POINTER_TYPE_P (rhs1_type)
3499             || !useless_type_conversion_p (lhs_type, rhs1_type)
3500             || !useless_type_conversion_p (sizetype, rhs2_type))
3501           {
3502             error ("type mismatch in pointer plus expression");
3503             debug_generic_stmt (lhs_type);
3504             debug_generic_stmt (rhs1_type);
3505             debug_generic_stmt (rhs2_type);
3506             return true;
3507           }
3508
3509         return false;
3510       } 
3511
3512     case TRUTH_ANDIF_EXPR:
3513     case TRUTH_ORIF_EXPR:
3514       gcc_unreachable ();
3515
3516     case TRUTH_AND_EXPR:
3517     case TRUTH_OR_EXPR:
3518     case TRUTH_XOR_EXPR:
3519       {
3520         /* We allow any kind of integral typed argument and result.  */
3521         if (!INTEGRAL_TYPE_P (rhs1_type)
3522             || !INTEGRAL_TYPE_P (rhs2_type)
3523             || !INTEGRAL_TYPE_P (lhs_type))
3524           {
3525             error ("type mismatch in binary truth expression");
3526             debug_generic_expr (lhs_type);
3527             debug_generic_expr (rhs1_type);
3528             debug_generic_expr (rhs2_type);
3529             return true;
3530           }
3531
3532         return false;
3533       }
3534
3535     case LT_EXPR:
3536     case LE_EXPR:
3537     case GT_EXPR:
3538     case GE_EXPR:
3539     case EQ_EXPR:
3540     case NE_EXPR:
3541     case UNORDERED_EXPR:
3542     case ORDERED_EXPR:
3543     case UNLT_EXPR:
3544     case UNLE_EXPR:
3545     case UNGT_EXPR:
3546     case UNGE_EXPR:
3547     case UNEQ_EXPR:
3548     case LTGT_EXPR:
3549       /* Comparisons are also binary, but the result type is not
3550          connected to the operand types.  */
3551       return verify_gimple_comparison (lhs_type, rhs1, rhs2);
3552
3553     case PLUS_EXPR:
3554     case MINUS_EXPR:
3555       {
3556         if (POINTER_TYPE_P (lhs_type)
3557             || POINTER_TYPE_P (rhs1_type)
3558             || POINTER_TYPE_P (rhs2_type))
3559           {
3560             error ("invalid (pointer) operands to plus/minus");
3561             return true;
3562           }
3563
3564         /* Continue with generic binary expression handling.  */
3565         break;
3566       }
3567
3568     case MULT_EXPR:
3569     case TRUNC_DIV_EXPR:
3570     case CEIL_DIV_EXPR:
3571     case FLOOR_DIV_EXPR:
3572     case ROUND_DIV_EXPR:
3573     case TRUNC_MOD_EXPR:
3574     case CEIL_MOD_EXPR:
3575     case FLOOR_MOD_EXPR:
3576     case ROUND_MOD_EXPR:
3577     case RDIV_EXPR:
3578     case EXACT_DIV_EXPR:
3579     case MIN_EXPR:
3580     case MAX_EXPR:
3581     case BIT_IOR_EXPR:
3582     case BIT_XOR_EXPR:
3583     case BIT_AND_EXPR:
3584     case WIDEN_SUM_EXPR:
3585     case WIDEN_MULT_EXPR:
3586     case VEC_WIDEN_MULT_HI_EXPR:
3587     case VEC_WIDEN_MULT_LO_EXPR:
3588     case VEC_PACK_TRUNC_EXPR:
3589     case VEC_PACK_SAT_EXPR:
3590     case VEC_PACK_FIX_TRUNC_EXPR:
3591     case VEC_EXTRACT_EVEN_EXPR:
3592     case VEC_EXTRACT_ODD_EXPR:
3593     case VEC_INTERLEAVE_HIGH_EXPR:
3594     case VEC_INTERLEAVE_LOW_EXPR:
3595       /* Continue with generic binary expression handling.  */
3596       break;
3597
3598     default:
3599       gcc_unreachable ();
3600     }
3601
3602   if (!useless_type_conversion_p (lhs_type, rhs1_type)
3603       || !useless_type_conversion_p (lhs_type, rhs2_type))
3604     {
3605       error ("type mismatch in binary expression");
3606       debug_generic_stmt (lhs_type);
3607       debug_generic_stmt (rhs1_type);
3608       debug_generic_stmt (rhs2_type);
3609       return true;
3610     }
3611
3612   return false;
3613 }
3614
3615 /* Verify a gimple assignment statement STMT with a single rhs.
3616    Returns true if anything is wrong.  */
3617
3618 static bool
3619 verify_gimple_assign_single (gimple stmt)
3620 {
3621   enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
3622   tree lhs = gimple_assign_lhs (stmt);
3623   tree lhs_type = TREE_TYPE (lhs);
3624   tree rhs1 = gimple_assign_rhs1 (stmt);
3625   tree rhs1_type = TREE_TYPE (rhs1);
3626   bool res = false;
3627
3628   if (!useless_type_conversion_p (lhs_type, rhs1_type))
3629     {
3630       error ("non-trivial conversion at assignment");
3631       debug_generic_expr (lhs_type);
3632       debug_generic_expr (rhs1_type);
3633       return true;
3634     }
3635
3636   if (handled_component_p (lhs))
3637     res |= verify_types_in_gimple_reference (lhs);
3638
3639   /* Special codes we cannot handle via their class.  */
3640   switch (rhs_code)
3641     {
3642     case ADDR_EXPR:
3643       {
3644         tree op = TREE_OPERAND (rhs1, 0);
3645         if (!is_gimple_addressable (op))
3646           {
3647             error ("invalid operand in unary expression");
3648             return true;
3649           }
3650
3651         if (!one_pointer_to_useless_type_conversion_p (lhs_type, TREE_TYPE (op))
3652             /* FIXME: a longstanding wart, &a == &a[0].  */
3653             && (TREE_CODE (TREE_TYPE (op)) != ARRAY_TYPE
3654                 || !one_pointer_to_useless_type_conversion_p (lhs_type,
3655                       TREE_TYPE (TREE_TYPE (op)))))
3656           {
3657             error ("type mismatch in address expression");
3658             debug_generic_stmt (lhs_type);
3659             debug_generic_stmt (TYPE_POINTER_TO (TREE_TYPE (op)));
3660             return true;
3661           }
3662
3663         return verify_types_in_gimple_reference (op);
3664       }
3665
3666     /* tcc_reference  */
3667     case COMPONENT_REF:
3668     case BIT_FIELD_REF:
3669     case INDIRECT_REF:
3670     case ALIGN_INDIRECT_REF:
3671     case MISALIGNED_INDIRECT_REF:
3672     case ARRAY_REF:
3673     case ARRAY_RANGE_REF:
3674     case VIEW_CONVERT_EXPR:
3675     case REALPART_EXPR:
3676     case IMAGPART_EXPR:
3677     case TARGET_MEM_REF:
3678       if (!is_gimple_reg (lhs)
3679           && is_gimple_reg_type (TREE_TYPE (lhs)))
3680         {
3681           error ("invalid rhs for gimple memory store");
3682           debug_generic_stmt (lhs);
3683           debug_generic_stmt (rhs1);
3684           return true;
3685         }
3686       return res || verify_types_in_gimple_reference (rhs1);
3687
3688     /* tcc_constant  */
3689     case SSA_NAME:
3690     case INTEGER_CST:
3691     case REAL_CST:
3692     case FIXED_CST:
3693     case COMPLEX_CST:
3694     case VECTOR_CST:
3695     case STRING_CST:
3696       return res;
3697
3698     /* tcc_declaration  */
3699     case CONST_DECL:
3700       return res;
3701     case VAR_DECL:
3702     case PARM_DECL:
3703       if (!is_gimple_reg (lhs)
3704           && !is_gimple_reg (rhs1)
3705           && is_gimple_reg_type (TREE_TYPE (lhs)))
3706         {
3707           error ("invalid rhs for gimple memory store");
3708           debug_generic_stmt (lhs);
3709           debug_generic_stmt (rhs1);
3710           return true;
3711         }
3712       return res;
3713
3714     case COND_EXPR:
3715     case CONSTRUCTOR:
3716     case OBJ_TYPE_REF:
3717     case ASSERT_EXPR:
3718     case WITH_SIZE_EXPR:
3719     case EXC_PTR_EXPR:
3720     case FILTER_EXPR:
3721     case POLYNOMIAL_CHREC:
3722     case DOT_PROD_EXPR:
3723     case VEC_COND_EXPR:
3724     case REALIGN_LOAD_EXPR:
3725       /* FIXME.  */
3726       return res;
3727
3728     default:;
3729     }
3730
3731   return res;
3732 }
3733
3734 /* Verify the contents of a GIMPLE_ASSIGN STMT.  Returns true when there
3735    is a problem, otherwise false.  */
3736
3737 static bool
3738 verify_gimple_assign (gimple stmt)
3739 {
3740   switch (gimple_assign_rhs_class (stmt))
3741     {
3742     case GIMPLE_SINGLE_RHS:
3743       return verify_gimple_assign_single (stmt);
3744
3745     case GIMPLE_UNARY_RHS:
3746       return verify_gimple_assign_unary (stmt);
3747
3748     case GIMPLE_BINARY_RHS:
3749       return verify_gimple_assign_binary (stmt);
3750
3751     default:
3752       gcc_unreachable ();
3753     }
3754 }
3755
3756 /* Verify the contents of a GIMPLE_RETURN STMT.  Returns true when there
3757    is a problem, otherwise false.  */
3758
3759 static bool
3760 verify_gimple_return (gimple stmt)
3761 {
3762   tree op = gimple_return_retval (stmt);
3763   tree restype = TREE_TYPE (TREE_TYPE (cfun->decl));
3764
3765   /* We cannot test for present return values as we do not fix up missing
3766      return values from the original source.  */
3767   if (op == NULL)
3768     return false;
3769  
3770   if (!is_gimple_val (op)
3771       && TREE_CODE (op) != RESULT_DECL)
3772     {
3773       error ("invalid operand in return statement");
3774       debug_generic_stmt (op);
3775       return true;
3776     }
3777
3778   if (!useless_type_conversion_p (restype, TREE_TYPE (op))
3779       /* ???  With C++ we can have the situation that the result
3780          decl is a reference type while the return type is an aggregate.  */
3781       && !(TREE_CODE (op) == RESULT_DECL
3782            && TREE_CODE (TREE_TYPE (op)) == REFERENCE_TYPE
3783            && useless_type_conversion_p (restype, TREE_TYPE (TREE_TYPE (op)))))
3784     {
3785       error ("invalid conversion in return statement");
3786       debug_generic_stmt (restype);
3787       debug_generic_stmt (TREE_TYPE (op));
3788       return true;
3789     }
3790
3791   return false;
3792 }
3793
3794
3795 /* Verify the contents of a GIMPLE_GOTO STMT.  Returns true when there
3796    is a problem, otherwise false.  */
3797
3798 static bool
3799 verify_gimple_goto (gimple stmt)
3800 {
3801   tree dest = gimple_goto_dest (stmt);
3802
3803   /* ???  We have two canonical forms of direct goto destinations, a
3804      bare LABEL_DECL and an ADDR_EXPR of a LABEL_DECL.  */
3805   if (TREE_CODE (dest) != LABEL_DECL
3806       && (!is_gimple_val (dest)
3807           || !POINTER_TYPE_P (TREE_TYPE (dest))))
3808     {
3809       error ("goto destination is neither a label nor a pointer");
3810       return true;
3811     }
3812
3813   return false;
3814 }
3815
3816 /* Verify the contents of a GIMPLE_SWITCH STMT.  Returns true when there
3817    is a problem, otherwise false.  */
3818
3819 static bool
3820 verify_gimple_switch (gimple stmt)
3821 {
3822   if (!is_gimple_val (gimple_switch_index (stmt)))
3823     {
3824       error ("invalid operand to switch statement");
3825       debug_generic_stmt (gimple_switch_index (stmt));
3826       return true;
3827     }
3828
3829   return false;
3830 }
3831
3832
3833 /* Verify the contents of a GIMPLE_PHI.  Returns true if there is a problem,
3834    and false otherwise.  */
3835
3836 static bool
3837 verify_gimple_phi (gimple stmt)
3838 {
3839   tree type = TREE_TYPE (gimple_phi_result (stmt));
3840   unsigned i;
3841
3842   if (!is_gimple_variable (gimple_phi_result (stmt)))
3843     {
3844       error ("Invalid PHI result");
3845       return true;
3846     }
3847
3848   for (i = 0; i < gimple_phi_num_args (stmt); i++)
3849     {
3850       tree arg = gimple_phi_arg_def (stmt, i);
3851       if ((is_gimple_reg (gimple_phi_result (stmt))
3852            && !is_gimple_val (arg))
3853           || (!is_gimple_reg (gimple_phi_result (stmt))
3854               && !is_gimple_addressable (arg)))
3855         {
3856           error ("Invalid PHI argument");
3857           debug_generic_stmt (arg);
3858           return true;
3859         }
3860       if (!useless_type_conversion_p (type, TREE_TYPE (arg)))
3861         {
3862           error ("Incompatible types in PHI argument");
3863           debug_generic_stmt (type);
3864           debug_generic_stmt (TREE_TYPE (arg));
3865           return true;
3866         }
3867     }
3868
3869   return false;
3870 }
3871
3872
3873 /* Verify the GIMPLE statement STMT.  Returns true if there is an
3874    error, otherwise false.  */
3875
3876 static bool
3877 verify_types_in_gimple_stmt (gimple stmt)
3878 {
3879   if (is_gimple_omp (stmt))
3880     {
3881       /* OpenMP directives are validated by the FE and never operated
3882          on by the optimizers.  Furthermore, GIMPLE_OMP_FOR may contain
3883          non-gimple expressions when the main index variable has had
3884          its address taken.  This does not affect the loop itself
3885          because the header of an GIMPLE_OMP_FOR is merely used to determine
3886          how to setup the parallel iteration.  */
3887       return false;
3888     }
3889
3890   switch (gimple_code (stmt))
3891     {
3892     case GIMPLE_ASSIGN:
3893       return verify_gimple_assign (stmt);
3894
3895     case GIMPLE_LABEL:
3896       return TREE_CODE (gimple_label_label (stmt)) != LABEL_DECL;
3897
3898     case GIMPLE_CALL:
3899       return verify_gimple_call (stmt);
3900
3901     case GIMPLE_COND:
3902       return verify_gimple_comparison (boolean_type_node,
3903                                        gimple_cond_lhs (stmt),
3904                                        gimple_cond_rhs (stmt));
3905
3906     case GIMPLE_GOTO:
3907       return verify_gimple_goto (stmt);
3908
3909     case GIMPLE_SWITCH:
3910       return verify_gimple_switch (stmt);
3911
3912     case GIMPLE_RETURN:
3913       return verify_gimple_return (stmt);
3914
3915     case GIMPLE_ASM:
3916       return false;
3917
3918     case GIMPLE_CHANGE_DYNAMIC_TYPE:
3919       return (!is_gimple_val (gimple_cdt_location (stmt))
3920               || !POINTER_TYPE_P (TREE_TYPE (gimple_cdt_location (stmt))));
3921
3922     case GIMPLE_PHI:
3923       return verify_gimple_phi (stmt);
3924
3925     /* Tuples that do not have tree operands.  */
3926     case GIMPLE_NOP:
3927     case GIMPLE_RESX:
3928     case GIMPLE_PREDICT:
3929       return false;
3930
3931     default:
3932       gcc_unreachable ();
3933     }
3934 }
3935
3936 /* Verify the GIMPLE statements inside the sequence STMTS.  */
3937
3938 static bool
3939 verify_types_in_gimple_seq_2 (gimple_seq stmts)
3940 {
3941   gimple_stmt_iterator ittr;
3942   bool err = false;
3943
3944   for (ittr = gsi_start (stmts); !gsi_end_p (ittr); gsi_next (&ittr))
3945     {
3946       gimple stmt = gsi_stmt (ittr);
3947
3948       switch (gimple_code (stmt))
3949         {
3950         case GIMPLE_BIND:
3951           err |= verify_types_in_gimple_seq_2 (gimple_bind_body (stmt));
3952           break;
3953
3954         case GIMPLE_TRY:
3955           err |= verify_types_in_gimple_seq_2 (gimple_try_eval (stmt));
3956           err |= verify_types_in_gimple_seq_2 (gimple_try_cleanup (stmt));
3957           break;
3958
3959         case GIMPLE_EH_FILTER:
3960           err |= verify_types_in_gimple_seq_2 (gimple_eh_filter_failure (stmt));
3961           break;
3962
3963         case GIMPLE_CATCH:
3964           err |= verify_types_in_gimple_seq_2 (gimple_catch_handler (stmt));
3965           break;
3966
3967         default:
3968           {
3969             bool err2 = verify_types_in_gimple_stmt (stmt);
3970             if (err2)
3971               debug_gimple_stmt (stmt);
3972             err |= err2;
3973           }
3974         }
3975     }
3976
3977   return err;
3978 }
3979
3980
3981 /* Verify the GIMPLE statements inside the statement list STMTS.  */
3982
3983 void
3984 verify_types_in_gimple_seq (gimple_seq stmts)
3985 {
3986   if (verify_types_in_gimple_seq_2 (stmts))
3987     internal_error ("verify_gimple failed");
3988 }
3989
3990
3991 /* Verify STMT, return true if STMT is not in GIMPLE form.
3992    TODO: Implement type checking.  */
3993
3994 static bool
3995 verify_stmt (gimple_stmt_iterator *gsi)
3996 {
3997   tree addr;
3998   struct walk_stmt_info wi;
3999   bool last_in_block = gsi_one_before_end_p (*gsi);
4000   gimple stmt = gsi_stmt (*gsi);
4001
4002   if (is_gimple_omp (stmt))
4003     {
4004       /* OpenMP directives are validated by the FE and never operated
4005          on by the optimizers.  Furthermore, GIMPLE_OMP_FOR may contain
4006          non-gimple expressions when the main index variable has had
4007          its address taken.  This does not affect the loop itself
4008          because the header of an GIMPLE_OMP_FOR is merely used to determine
4009          how to setup the parallel iteration.  */
4010       return false;
4011     }
4012
4013   /* FIXME.  The C frontend passes unpromoted arguments in case it
4014      didn't see a function declaration before the call.  */
4015   if (is_gimple_call (stmt))
4016     {
4017       tree decl;
4018
4019       if (!is_gimple_call_addr (gimple_call_fn (stmt)))
4020         {
4021           error ("invalid function in call statement");
4022           return true;
4023         }
4024
4025       decl = gimple_call_fndecl (stmt);
4026       if (decl
4027           && TREE_CODE (decl) == FUNCTION_DECL
4028           && DECL_LOOPING_CONST_OR_PURE_P (decl)
4029           && (!DECL_PURE_P (decl))
4030           && (!TREE_READONLY (decl)))
4031         {
4032           error ("invalid pure const state for function");
4033           return true;
4034         }
4035     }
4036
4037   memset (&wi, 0, sizeof (wi));
4038   addr = walk_gimple_op (gsi_stmt (*gsi), verify_expr, &wi);
4039   if (addr)
4040     {
4041       debug_generic_expr (addr);
4042       inform (input_location, "in statement");
4043       debug_gimple_stmt (stmt);
4044       return true;
4045     }
4046
4047   /* If the statement is marked as part of an EH region, then it is
4048      expected that the statement could throw.  Verify that when we
4049      have optimizations that simplify statements such that we prove
4050      that they cannot throw, that we update other data structures
4051      to match.  */
4052   if (lookup_stmt_eh_region (stmt) >= 0)
4053     {
4054       if (!stmt_could_throw_p (stmt))
4055         {
4056           error ("statement marked for throw, but doesn%'t");
4057           goto fail;
4058         }
4059       if (!last_in_block && stmt_can_throw_internal (stmt))
4060         {
4061           error ("statement marked for throw in middle of block");
4062           goto fail;
4063         }
4064     }
4065
4066   return false;
4067
4068  fail:
4069   debug_gimple_stmt (stmt);
4070   return true;
4071 }
4072
4073
4074 /* Return true when the T can be shared.  */
4075
4076 static bool
4077 tree_node_can_be_shared (tree t)
4078 {
4079   if (IS_TYPE_OR_DECL_P (t)
4080       || is_gimple_min_invariant (t)
4081       || TREE_CODE (t) == SSA_NAME
4082       || t == error_mark_node
4083       || TREE_CODE (t) == IDENTIFIER_NODE)
4084     return true;
4085
4086   if (TREE_CODE (t) == CASE_LABEL_EXPR)
4087     return true;
4088
4089   while (((TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
4090            && is_gimple_min_invariant (TREE_OPERAND (t, 1)))
4091          || TREE_CODE (t) == COMPONENT_REF
4092          || TREE_CODE (t) == REALPART_EXPR
4093          || TREE_CODE (t) == IMAGPART_EXPR)
4094     t = TREE_OPERAND (t, 0);
4095
4096   if (DECL_P (t))
4097     return true;
4098
4099   return false;
4100 }
4101
4102
4103 /* Called via walk_gimple_stmt.  Verify tree sharing.  */
4104
4105 static tree
4106 verify_node_sharing (tree *tp, int *walk_subtrees, void *data)
4107 {
4108   struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
4109   struct pointer_set_t *visited = (struct pointer_set_t *) wi->info;
4110
4111   if (tree_node_can_be_shared (*tp))
4112     {
4113       *walk_subtrees = false;
4114       return NULL;
4115     }
4116
4117   if (pointer_set_insert (visited, *tp))
4118     return *tp;
4119
4120   return NULL;
4121 }
4122
4123
4124 static bool eh_error_found;
4125 static int
4126 verify_eh_throw_stmt_node (void **slot, void *data)
4127 {
4128   struct throw_stmt_node *node = (struct throw_stmt_node *)*slot;
4129   struct pointer_set_t *visited = (struct pointer_set_t *) data;
4130
4131   if (!pointer_set_contains (visited, node->stmt))
4132     {
4133       error ("Dead STMT in EH table");
4134       debug_gimple_stmt (node->stmt);
4135       eh_error_found = true;
4136     }
4137   return 0;
4138 }
4139
4140
4141 /* Verify the GIMPLE statements in every basic block.  */
4142
4143 void
4144 verify_stmts (void)
4145 {
4146   basic_block bb;
4147   gimple_stmt_iterator gsi;
4148   bool err = false;
4149   struct pointer_set_t *visited, *visited_stmts;
4150   tree addr;
4151   struct walk_stmt_info wi;
4152
4153   timevar_push (TV_TREE_STMT_VERIFY);
4154   visited = pointer_set_create ();
4155   visited_stmts = pointer_set_create ();
4156
4157   memset (&wi, 0, sizeof (wi));
4158   wi.info = (void *) visited;
4159
4160   FOR_EACH_BB (bb)
4161     {
4162       gimple phi;
4163       size_t i;
4164
4165       for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
4166         {
4167           phi = gsi_stmt (gsi);
4168           pointer_set_insert (visited_stmts, phi);
4169           if (gimple_bb (phi) != bb)
4170             {
4171               error ("gimple_bb (phi) is set to a wrong basic block");
4172               err |= true;
4173             }
4174
4175           for (i = 0; i < gimple_phi_num_args (phi); i++)
4176             {
4177               tree t = gimple_phi_arg_def (phi, i);
4178               tree addr;
4179
4180               if (!t)
4181                 {
4182                   error ("missing PHI def");
4183                   debug_gimple_stmt (phi);
4184                   err |= true;
4185                   continue;
4186                 }
4187               /* Addressable variables do have SSA_NAMEs but they
4188                  are not considered gimple values.  */
4189               else if (TREE_CODE (t) != SSA_NAME
4190                        && TREE_CODE (t) != FUNCTION_DECL
4191                        && !is_gimple_min_invariant (t))
4192                 {
4193                   error ("PHI argument is not a GIMPLE value");
4194                   debug_gimple_stmt (phi);
4195                   debug_generic_expr (t);
4196                   err |= true;
4197                 }
4198
4199               addr = walk_tree (&t, verify_node_sharing, visited, NULL);
4200               if (addr)
4201                 {
4202                   error ("incorrect sharing of tree nodes");
4203                   debug_gimple_stmt (phi);
4204                   debug_generic_expr (addr);
4205                   err |= true;
4206                 }
4207             }
4208         }
4209
4210       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); )
4211         {
4212           gimple stmt = gsi_stmt (gsi);
4213
4214           if (gimple_code (stmt) == GIMPLE_WITH_CLEANUP_EXPR
4215               || gimple_code (stmt) == GIMPLE_BIND)
4216             {
4217               error ("invalid GIMPLE statement");
4218               debug_gimple_stmt (stmt);
4219               err |= true;
4220             }
4221
4222           pointer_set_insert (visited_stmts, stmt);
4223
4224           if (gimple_bb (stmt) != bb)
4225             {
4226               error ("gimple_bb (stmt) is set to a wrong basic block");
4227               err |= true;
4228             }
4229
4230           if (gimple_code (stmt) == GIMPLE_LABEL)
4231             {
4232               tree decl = gimple_label_label (stmt);
4233               int uid = LABEL_DECL_UID (decl);
4234
4235               if (uid == -1
4236                   || VEC_index (basic_block, label_to_block_map, uid) != bb)
4237                 {
4238                   error ("incorrect entry in label_to_block_map.\n");
4239                   err |= true;
4240                 }
4241             }
4242
4243           err |= verify_stmt (&gsi);
4244           addr = walk_gimple_op (gsi_stmt (gsi), verify_node_sharing, &wi);
4245           if (addr)
4246             {
4247               error ("incorrect sharing of tree nodes");
4248               debug_gimple_stmt (stmt);
4249               debug_generic_expr (addr);
4250               err |= true;
4251             }
4252           gsi_next (&gsi);
4253         }
4254     }
4255
4256   eh_error_found = false;
4257   if (get_eh_throw_stmt_table (cfun))
4258     htab_traverse (get_eh_throw_stmt_table (cfun),
4259                    verify_eh_throw_stmt_node,
4260                    visited_stmts);
4261
4262   if (err | eh_error_found)
4263     internal_error ("verify_stmts failed");
4264
4265   pointer_set_destroy (visited);
4266   pointer_set_destroy (visited_stmts);
4267   verify_histograms ();
4268   timevar_pop (TV_TREE_STMT_VERIFY);
4269 }
4270
4271
4272 /* Verifies that the flow information is OK.  */
4273
4274 static int
4275 gimple_verify_flow_info (void)
4276 {
4277   int err = 0;
4278   basic_block bb;
4279   gimple_stmt_iterator gsi;
4280   gimple stmt;
4281   edge e;
4282   edge_iterator ei;
4283
4284   if (ENTRY_BLOCK_PTR->il.gimple)
4285     {
4286       error ("ENTRY_BLOCK has IL associated with it");
4287       err = 1;
4288     }
4289
4290   if (EXIT_BLOCK_PTR->il.gimple)
4291     {
4292       error ("EXIT_BLOCK has IL associated with it");
4293       err = 1;
4294     }
4295
4296   FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
4297     if (e->flags & EDGE_FALLTHRU)
4298       {
4299         error ("fallthru to exit from bb %d", e->src->index);
4300         err = 1;
4301       }
4302
4303   FOR_EACH_BB (bb)
4304     {
4305       bool found_ctrl_stmt = false;
4306
4307       stmt = NULL;
4308
4309       /* Skip labels on the start of basic block.  */
4310       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
4311         {
4312           tree label;
4313           gimple prev_stmt = stmt;
4314
4315           stmt = gsi_stmt (gsi);
4316
4317           if (gimple_code (stmt) != GIMPLE_LABEL)
4318             break;
4319
4320           label = gimple_label_label (stmt);
4321           if (prev_stmt && DECL_NONLOCAL (label))
4322             {
4323               error ("nonlocal label ");
4324               print_generic_expr (stderr, label, 0);
4325               fprintf (stderr, " is not first in a sequence of labels in bb %d",
4326                        bb->index);
4327               err = 1;
4328             }
4329
4330           if (label_to_block (label) != bb)
4331             {
4332               error ("label ");
4333               print_generic_expr (stderr, label, 0);
4334               fprintf (stderr, " to block does not match in bb %d",
4335                        bb->index);
4336               err = 1;
4337             }
4338
4339           if (decl_function_context (label) != current_function_decl)
4340             {
4341               error ("label ");
4342               print_generic_expr (stderr, label, 0);
4343               fprintf (stderr, " has incorrect context in bb %d",
4344                        bb->index);
4345               err = 1;
4346             }
4347         }
4348
4349       /* Verify that body of basic block BB is free of control flow.  */
4350       for (; !gsi_end_p (gsi); gsi_next (&gsi))
4351         {
4352           gimple stmt = gsi_stmt (gsi);
4353
4354           if (found_ctrl_stmt)
4355             {
4356               error ("control flow in the middle of basic block %d",
4357                      bb->index);
4358               err = 1;
4359             }
4360
4361           if (stmt_ends_bb_p (stmt))
4362             found_ctrl_stmt = true;
4363
4364           if (gimple_code (stmt) == GIMPLE_LABEL)
4365             {
4366               error ("label ");
4367               print_generic_expr (stderr, gimple_label_label (stmt), 0);
4368               fprintf (stderr, " in the middle of basic block %d", bb->index);
4369               err = 1;
4370             }
4371         }
4372
4373       gsi = gsi_last_bb (bb);
4374       if (gsi_end_p (gsi))
4375         continue;
4376
4377       stmt = gsi_stmt (gsi);
4378
4379       err |= verify_eh_edges (stmt);
4380
4381       if (is_ctrl_stmt (stmt))
4382         {
4383           FOR_EACH_EDGE (e, ei, bb->succs)
4384             if (e->flags & EDGE_FALLTHRU)
4385               {
4386                 error ("fallthru edge after a control statement in bb %d",
4387                        bb->index);
4388                 err = 1;
4389               }
4390         }
4391
4392       if (gimple_code (stmt) != GIMPLE_COND)
4393         {
4394           /* Verify that there are no edges with EDGE_TRUE/FALSE_FLAG set
4395              after anything else but if statement.  */
4396           FOR_EACH_EDGE (e, ei, bb->succs)
4397             if (e->flags & (EDGE_TRUE_VALUE | EDGE_FALSE_VALUE))
4398               {
4399                 error ("true/false edge after a non-GIMPLE_COND in bb %d",
4400                        bb->index);
4401                 err = 1;
4402               }
4403         }
4404
4405       switch (gimple_code (stmt))
4406         {
4407         case GIMPLE_COND:
4408           {
4409             edge true_edge;
4410             edge false_edge;
4411   
4412             extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
4413
4414             if (!true_edge
4415                 || !false_edge
4416                 || !(true_edge->flags & EDGE_TRUE_VALUE)
4417                 || !(false_edge->flags & EDGE_FALSE_VALUE)
4418                 || (true_edge->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL))
4419                 || (false_edge->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL))
4420                 || EDGE_COUNT (bb->succs) >= 3)
4421               {
4422                 error ("wrong outgoing edge flags at end of bb %d",
4423                        bb->index);
4424                 err = 1;
4425               }
4426           }
4427           break;
4428
4429         case GIMPLE_GOTO:
4430           if (simple_goto_p (stmt))
4431             {
4432               error ("explicit goto at end of bb %d", bb->index);
4433               err = 1;
4434             }
4435           else
4436             {
4437               /* FIXME.  We should double check that the labels in the
4438                  destination blocks have their address taken.  */
4439               FOR_EACH_EDGE (e, ei, bb->succs)
4440                 if ((e->flags & (EDGE_FALLTHRU | EDGE_TRUE_VALUE
4441                                  | EDGE_FALSE_VALUE))
4442                     || !(e->flags & EDGE_ABNORMAL))
4443                   {
4444                     error ("wrong outgoing edge flags at end of bb %d",
4445                            bb->index);
4446                     err = 1;
4447                   }
4448             }
4449           break;
4450
4451         case GIMPLE_RETURN:
4452           if (!single_succ_p (bb)
4453               || (single_succ_edge (bb)->flags
4454                   & (EDGE_FALLTHRU | EDGE_ABNORMAL
4455                      | EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
4456             {
4457               error ("wrong outgoing edge flags at end of bb %d", bb->index);
4458               err = 1;
4459             }
4460           if (single_succ (bb) != EXIT_BLOCK_PTR)
4461             {
4462               error ("return edge does not point to exit in bb %d",
4463                      bb->index);
4464               err = 1;
4465             }
4466           break;
4467
4468         case GIMPLE_SWITCH:
4469           {
4470             tree prev;
4471             edge e;
4472             size_t i, n;
4473
4474             n = gimple_switch_num_labels (stmt);
4475
4476             /* Mark all the destination basic blocks.  */
4477             for (i = 0; i < n; ++i)
4478               {
4479                 tree lab = CASE_LABEL (gimple_switch_label (stmt, i));
4480                 basic_block label_bb = label_to_block (lab);
4481                 gcc_assert (!label_bb->aux || label_bb->aux == (void *)1);
4482                 label_bb->aux = (void *)1;
4483               }
4484
4485             /* Verify that the case labels are sorted.  */
4486             prev = gimple_switch_label (stmt, 0);
4487             for (i = 1; i < n; ++i)
4488               {
4489                 tree c = gimple_switch_label (stmt, i);
4490                 if (!CASE_LOW (c))
4491                   {
4492                     error ("found default case not at the start of "
4493                            "case vector");
4494                     err = 1;
4495                     continue;
4496                   }
4497                 if (CASE_LOW (prev)
4498                     && !tree_int_cst_lt (CASE_LOW (prev), CASE_LOW (c)))
4499                   {
4500                     error ("case labels not sorted: ");
4501                     print_generic_expr (stderr, prev, 0);
4502                     fprintf (stderr," is greater than ");
4503                     print_generic_expr (stderr, c, 0);
4504                     fprintf (stderr," but comes before it.\n");
4505                     err = 1;
4506                   }
4507                 prev = c;
4508               }
4509             /* VRP will remove the default case if it can prove it will
4510                never be executed.  So do not verify there always exists
4511                a default case here.  */
4512
4513             FOR_EACH_EDGE (e, ei, bb->succs)
4514               {
4515                 if (!e->dest->aux)
4516                   {
4517                     error ("extra outgoing edge %d->%d",
4518                            bb->index, e->dest->index);
4519                     err = 1;
4520                   }
4521
4522                 e->dest->aux = (void *)2;
4523                 if ((e->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL
4524                                  | EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
4525                   {
4526                     error ("wrong outgoing edge flags at end of bb %d",
4527                            bb->index);
4528                     err = 1;
4529                   }
4530               }
4531
4532             /* Check that we have all of them.  */
4533             for (i = 0; i < n; ++i)
4534               {
4535                 tree lab = CASE_LABEL (gimple_switch_label (stmt, i));
4536                 basic_block label_bb = label_to_block (lab);
4537
4538                 if (label_bb->aux != (void *)2)
4539                   {
4540                     error ("missing edge %i->%i", bb->index, label_bb->index);
4541                     err = 1;
4542                   }
4543               }
4544
4545             FOR_EACH_EDGE (e, ei, bb->succs)
4546               e->dest->aux = (void *)0;
4547           }
4548
4549         default: ;
4550         }
4551     }
4552
4553   if (dom_info_state (CDI_DOMINATORS) >= DOM_NO_FAST_QUERY)
4554     verify_dominators (CDI_DOMINATORS);
4555
4556   return err;
4557 }
4558
4559
4560 /* Updates phi nodes after creating a forwarder block joined
4561    by edge FALLTHRU.  */
4562
4563 static void
4564 gimple_make_forwarder_block (edge fallthru)
4565 {
4566   edge e;
4567   edge_iterator ei;
4568   basic_block dummy, bb;
4569   tree var;
4570   gimple_stmt_iterator gsi;
4571
4572   dummy = fallthru->src;
4573   bb = fallthru->dest;
4574
4575   if (single_pred_p (bb))
4576     return;
4577
4578   /* If we redirected a branch we must create new PHI nodes at the
4579      start of BB.  */
4580   for (gsi = gsi_start_phis (dummy); !gsi_end_p (gsi); gsi_next (&gsi))
4581     {
4582       gimple phi, new_phi;
4583       
4584       phi = gsi_stmt (gsi);
4585       var = gimple_phi_result (phi);
4586       new_phi = create_phi_node (var, bb);
4587       SSA_NAME_DEF_STMT (var) = new_phi;
4588       gimple_phi_set_result (phi, make_ssa_name (SSA_NAME_VAR (var), phi));
4589       add_phi_arg (new_phi, gimple_phi_result (phi), fallthru);
4590     }
4591
4592   /* Add the arguments we have stored on edges.  */
4593   FOR_EACH_EDGE (e, ei, bb->preds)
4594     {
4595       if (e == fallthru)
4596         continue;
4597
4598       flush_pending_stmts (e);
4599     }
4600 }
4601
4602
4603 /* Return a non-special label in the head of basic block BLOCK.
4604    Create one if it doesn't exist.  */
4605
4606 tree
4607 gimple_block_label (basic_block bb)
4608 {
4609   gimple_stmt_iterator i, s = gsi_start_bb (bb);
4610   bool first = true;
4611   tree label;
4612   gimple stmt;
4613
4614   for (i = s; !gsi_end_p (i); first = false, gsi_next (&i))
4615     {
4616       stmt = gsi_stmt (i);
4617       if (gimple_code (stmt) != GIMPLE_LABEL)
4618         break;
4619       label = gimple_label_label (stmt);
4620       if (!DECL_NONLOCAL (label))
4621         {
4622           if (!first)
4623             gsi_move_before (&i, &s);
4624           return label;
4625         }
4626     }
4627
4628   label = create_artificial_label ();
4629   stmt = gimple_build_label (label);
4630   gsi_insert_before (&s, stmt, GSI_NEW_STMT);
4631   return label;
4632 }
4633
4634
4635 /* Attempt to perform edge redirection by replacing a possibly complex
4636    jump instruction by a goto or by removing the jump completely.
4637    This can apply only if all edges now point to the same block.  The
4638    parameters and return values are equivalent to
4639    redirect_edge_and_branch.  */
4640
4641 static edge
4642 gimple_try_redirect_by_replacing_jump (edge e, basic_block target)
4643 {
4644   basic_block src = e->src;
4645   gimple_stmt_iterator i;
4646   gimple stmt;
4647
4648   /* We can replace or remove a complex jump only when we have exactly
4649      two edges.  */
4650   if (EDGE_COUNT (src->succs) != 2
4651       /* Verify that all targets will be TARGET.  Specifically, the
4652          edge that is not E must also go to TARGET.  */
4653       || EDGE_SUCC (src, EDGE_SUCC (src, 0) == e)->dest != target)
4654     return NULL;
4655
4656   i = gsi_last_bb (src);
4657   if (gsi_end_p (i))
4658     return NULL;
4659
4660   stmt = gsi_stmt (i);
4661
4662   if (gimple_code (stmt) == GIMPLE_COND || gimple_code (stmt) == GIMPLE_SWITCH)
4663     {
4664       gsi_remove (&i, true);
4665       e = ssa_redirect_edge (e, target);
4666       e->flags = EDGE_FALLTHRU;
4667       return e;
4668     }
4669
4670   return NULL;
4671 }
4672
4673
4674 /* Redirect E to DEST.  Return NULL on failure.  Otherwise, return the
4675    edge representing the redirected branch.  */
4676
4677 static edge
4678 gimple_redirect_edge_and_branch (edge e, basic_block dest)
4679 {
4680   basic_block bb = e->src;
4681   gimple_stmt_iterator gsi;
4682   edge ret;
4683   gimple stmt;
4684
4685   if (e->flags & EDGE_ABNORMAL)
4686     return NULL;
4687
4688   if (e->src != ENTRY_BLOCK_PTR
4689       && (ret = gimple_try_redirect_by_replacing_jump (e, dest)))
4690     return ret;
4691
4692   if (e->dest == dest)
4693     return NULL;
4694
4695   gsi = gsi_last_bb (bb);
4696   stmt = gsi_end_p (gsi) ? NULL : gsi_stmt (gsi);
4697
4698   switch (stmt ? gimple_code (stmt) : ERROR_MARK)
4699     {
4700     case GIMPLE_COND:
4701       /* For COND_EXPR, we only need to redirect the edge.  */
4702       break;
4703
4704     case GIMPLE_GOTO:
4705       /* No non-abnormal edges should lead from a non-simple goto, and
4706          simple ones should be represented implicitly.  */
4707       gcc_unreachable ();
4708
4709     case GIMPLE_SWITCH:
4710       {
4711         tree label = gimple_block_label (dest);
4712         tree cases = get_cases_for_edge (e, stmt);
4713
4714         /* If we have a list of cases associated with E, then use it
4715            as it's a lot faster than walking the entire case vector.  */
4716         if (cases)
4717           {
4718             edge e2 = find_edge (e->src, dest);
4719             tree last, first;
4720
4721             first = cases;
4722             while (cases)
4723               {
4724                 last = cases;
4725                 CASE_LABEL (cases) = label;
4726                 cases = TREE_CHAIN (cases);
4727               }
4728
4729             /* If there was already an edge in the CFG, then we need
4730                to move all the cases associated with E to E2.  */
4731             if (e2)
4732               {
4733                 tree cases2 = get_cases_for_edge (e2, stmt);
4734
4735                 TREE_CHAIN (last) = TREE_CHAIN (cases2);
4736                 TREE_CHAIN (cases2) = first;
4737               }
4738           }
4739         else
4740           {
4741             size_t i, n = gimple_switch_num_labels (stmt);
4742
4743             for (i = 0; i < n; i++)
4744               {
4745                 tree elt = gimple_switch_label (stmt, i);
4746                 if (label_to_block (CASE_LABEL (elt)) == e->dest)
4747                   CASE_LABEL (elt) = label;
4748               }
4749           }
4750
4751         break;
4752       }
4753
4754     case GIMPLE_RETURN:
4755       gsi_remove (&gsi, true);
4756       e->flags |= EDGE_FALLTHRU;
4757       break;
4758
4759     case GIMPLE_OMP_RETURN:
4760     case GIMPLE_OMP_CONTINUE:
4761     case GIMPLE_OMP_SECTIONS_SWITCH:
4762     case GIMPLE_OMP_FOR:
4763       /* The edges from OMP constructs can be simply redirected.  */
4764       break;
4765
4766     default:
4767       /* Otherwise it must be a fallthru edge, and we don't need to
4768          do anything besides redirecting it.  */
4769       gcc_assert (e->flags & EDGE_FALLTHRU);
4770       break;
4771     }
4772
4773   /* Update/insert PHI nodes as necessary.  */
4774
4775   /* Now update the edges in the CFG.  */
4776   e = ssa_redirect_edge (e, dest);
4777
4778   return e;
4779 }
4780
4781 /* Returns true if it is possible to remove edge E by redirecting
4782    it to the destination of the other edge from E->src.  */
4783
4784 static bool
4785 gimple_can_remove_branch_p (const_edge e)
4786 {
4787   if (e->flags & EDGE_ABNORMAL)
4788     return false;
4789
4790   return true;
4791 }
4792
4793 /* Simple wrapper, as we can always redirect fallthru edges.  */
4794
4795 static basic_block
4796 gimple_redirect_edge_and_branch_force (edge e, basic_block dest)
4797 {
4798   e = gimple_redirect_edge_and_branch (e, dest);
4799   gcc_assert (e);
4800
4801   return NULL;
4802 }
4803
4804
4805 /* Splits basic block BB after statement STMT (but at least after the
4806    labels).  If STMT is NULL, BB is split just after the labels.  */
4807
4808 static basic_block
4809 gimple_split_block (basic_block bb, void *stmt)
4810 {
4811   gimple_stmt_iterator gsi;
4812   gimple_stmt_iterator gsi_tgt;
4813   gimple act;
4814   gimple_seq list;
4815   basic_block new_bb;
4816   edge e;
4817   edge_iterator ei;
4818
4819   new_bb = create_empty_bb (bb);
4820
4821   /* Redirect the outgoing edges.  */
4822   new_bb->succs = bb->succs;
4823   bb->succs = NULL;
4824   FOR_EACH_EDGE (e, ei, new_bb->succs)
4825     e->src = new_bb;
4826
4827   if (stmt && gimple_code ((gimple) stmt) == GIMPLE_LABEL)
4828     stmt = NULL;
4829
4830   /* Move everything from GSI to the new basic block.  */
4831   for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
4832     {
4833       act = gsi_stmt (gsi);
4834       if (gimple_code (act) == GIMPLE_LABEL)
4835         continue;
4836
4837       if (!stmt)
4838         break;
4839
4840       if (stmt == act)
4841         {
4842           gsi_next (&gsi);
4843           break;
4844         }
4845     }
4846
4847   if (gsi_end_p (gsi))
4848     return new_bb;
4849
4850   /* Split the statement list - avoid re-creating new containers as this
4851      brings ugly quadratic memory consumption in the inliner.  
4852      (We are still quadratic since we need to update stmt BB pointers,
4853      sadly.)  */
4854   list = gsi_split_seq_before (&gsi);
4855   set_bb_seq (new_bb, list);
4856   for (gsi_tgt = gsi_start (list);
4857        !gsi_end_p (gsi_tgt); gsi_next (&gsi_tgt))
4858     gimple_set_bb (gsi_stmt (gsi_tgt), new_bb);
4859
4860   return new_bb;
4861 }
4862
4863
4864 /* Moves basic block BB after block AFTER.  */
4865
4866 static bool
4867 gimple_move_block_after (basic_block bb, basic_block after)
4868 {
4869   if (bb->prev_bb == after)
4870     return true;
4871
4872   unlink_block (bb);
4873   link_block (bb, after);
4874
4875   return true;
4876 }
4877
4878
4879 /* Return true if basic_block can be duplicated.  */
4880
4881 static bool
4882 gimple_can_duplicate_bb_p (const_basic_block bb ATTRIBUTE_UNUSED)
4883 {
4884   return true;
4885 }
4886
4887 /* Create a duplicate of the basic block BB.  NOTE: This does not
4888    preserve SSA form.  */
4889
4890 static basic_block
4891 gimple_duplicate_bb (basic_block bb)
4892 {
4893   basic_block new_bb;
4894   gimple_stmt_iterator gsi, gsi_tgt;
4895   gimple_seq phis = phi_nodes (bb);
4896   gimple phi, stmt, copy;
4897
4898   new_bb = create_empty_bb (EXIT_BLOCK_PTR->prev_bb);
4899
4900   /* Copy the PHI nodes.  We ignore PHI node arguments here because
4901      the incoming edges have not been setup yet.  */
4902   for (gsi = gsi_start (phis); !gsi_end_p (gsi); gsi_next (&gsi))
4903     {
4904       phi = gsi_stmt (gsi);
4905       copy = create_phi_node (gimple_phi_result (phi), new_bb);
4906       create_new_def_for (gimple_phi_result (copy), copy,
4907                           gimple_phi_result_ptr (copy));
4908     }
4909
4910   gsi_tgt = gsi_start_bb (new_bb);
4911   for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
4912     {
4913       def_operand_p def_p;
4914       ssa_op_iter op_iter;
4915       int region;
4916
4917       stmt = gsi_stmt (gsi);
4918       if (gimple_code (stmt) == GIMPLE_LABEL)
4919         continue;
4920
4921       /* Create a new copy of STMT and duplicate STMT's virtual
4922          operands.  */
4923       copy = gimple_copy (stmt);
4924       gsi_insert_after (&gsi_tgt, copy, GSI_NEW_STMT);
4925       copy_virtual_operands (copy, stmt);
4926       region = lookup_stmt_eh_region (stmt);
4927       if (region >= 0)
4928         add_stmt_to_eh_region (copy, region);
4929       gimple_duplicate_stmt_histograms (cfun, copy, cfun, stmt);
4930
4931       /* Create new names for all the definitions created by COPY and
4932          add replacement mappings for each new name.  */
4933       FOR_EACH_SSA_DEF_OPERAND (def_p, copy, op_iter, SSA_OP_ALL_DEFS)
4934         create_new_def_for (DEF_FROM_PTR (def_p), copy, def_p);
4935     }
4936
4937   return new_bb;
4938 }
4939
4940 /* Adds phi node arguments for edge E_COPY after basic block duplication.  */
4941
4942 static void
4943 add_phi_args_after_copy_edge (edge e_copy)
4944 {
4945   basic_block bb, bb_copy = e_copy->src, dest;
4946   edge e;
4947   edge_iterator ei;
4948   gimple phi, phi_copy;
4949   tree def;
4950   gimple_stmt_iterator psi, psi_copy;
4951
4952   if (gimple_seq_empty_p (phi_nodes (e_copy->dest)))
4953     return;
4954
4955   bb = bb_copy->flags & BB_DUPLICATED ? get_bb_original (bb_copy) : bb_copy;
4956
4957   if (e_copy->dest->flags & BB_DUPLICATED)
4958     dest = get_bb_original (e_copy->dest);
4959   else
4960     dest = e_copy->dest;
4961
4962   e = find_edge (bb, dest);
4963   if (!e)
4964     {
4965       /* During loop unrolling the target of the latch edge is copied.
4966          In this case we are not looking for edge to dest, but to
4967          duplicated block whose original was dest.  */
4968       FOR_EACH_EDGE (e, ei, bb->succs)
4969         {
4970           if ((e->dest->flags & BB_DUPLICATED)
4971               && get_bb_original (e->dest) == dest)
4972             break;
4973         }
4974
4975       gcc_assert (e != NULL);
4976     }
4977
4978   for (psi = gsi_start_phis (e->dest),
4979        psi_copy = gsi_start_phis (e_copy->dest);
4980        !gsi_end_p (psi);
4981        gsi_next (&psi), gsi_next (&psi_copy))
4982     {
4983       phi = gsi_stmt (psi);
4984       phi_copy = gsi_stmt (psi_copy);
4985       def = PHI_ARG_DEF_FROM_EDGE (phi, e);
4986       add_phi_arg (phi_copy, def, e_copy);
4987     }
4988 }
4989
4990
4991 /* Basic block BB_COPY was created by code duplication.  Add phi node
4992    arguments for edges going out of BB_COPY.  The blocks that were
4993    duplicated have BB_DUPLICATED set.  */
4994
4995 void
4996 add_phi_args_after_copy_bb (basic_block bb_copy)
4997 {
4998   edge e_copy;
4999   edge_iterator ei;
5000
5001   FOR_EACH_EDGE (e_copy, ei, bb_copy->succs)
5002     {
5003       add_phi_args_after_copy_edge (e_copy);
5004     }
5005 }
5006
5007 /* Blocks in REGION_COPY array of length N_REGION were created by
5008    duplication of basic blocks.  Add phi node arguments for edges
5009    going from these blocks.  If E_COPY is not NULL, also add
5010    phi node arguments for its destination.*/
5011
5012 void
5013 add_phi_args_after_copy (basic_block *region_copy, unsigned n_region,
5014                          edge e_copy)
5015 {
5016   unsigned i;
5017
5018   for (i = 0; i < n_region; i++)
5019     region_copy[i]->flags |= BB_DUPLICATED;
5020
5021   for (i = 0; i < n_region; i++)
5022     add_phi_args_after_copy_bb (region_copy[i]);
5023   if (e_copy)
5024     add_phi_args_after_copy_edge (e_copy);
5025
5026   for (i = 0; i < n_region; i++)
5027     region_copy[i]->flags &= ~BB_DUPLICATED;
5028 }
5029
5030 /* Duplicates a REGION (set of N_REGION basic blocks) with just a single
5031    important exit edge EXIT.  By important we mean that no SSA name defined
5032    inside region is live over the other exit edges of the region.  All entry
5033    edges to the region must go to ENTRY->dest.  The edge ENTRY is redirected
5034    to the duplicate of the region.  SSA form, dominance and loop information
5035    is updated.  The new basic blocks are stored to REGION_COPY in the same
5036    order as they had in REGION, provided that REGION_COPY is not NULL.
5037    The function returns false if it is unable to copy the region,
5038    true otherwise.  */
5039
5040 bool
5041 gimple_duplicate_sese_region (edge entry, edge exit,
5042                             basic_block *region, unsigned n_region,
5043                             basic_block *region_copy)
5044 {
5045   unsigned i;
5046   bool free_region_copy = false, copying_header = false;
5047   struct loop *loop = entry->dest->loop_father;
5048   edge exit_copy;
5049   VEC (basic_block, heap) *doms;
5050   edge redirected;
5051   int total_freq = 0, entry_freq = 0;
5052   gcov_type total_count = 0, entry_count = 0;
5053
5054   if (!can_copy_bbs_p (region, n_region))
5055     return false;
5056
5057   /* Some sanity checking.  Note that we do not check for all possible
5058      missuses of the functions.  I.e. if you ask to copy something weird,
5059      it will work, but the state of structures probably will not be
5060      correct.  */
5061   for (i = 0; i < n_region; i++)
5062     {
5063       /* We do not handle subloops, i.e. all the blocks must belong to the
5064          same loop.  */
5065       if (region[i]->loop_father != loop)
5066         return false;
5067
5068       if (region[i] != entry->dest
5069           && region[i] == loop->header)
5070         return false;
5071     }
5072
5073   set_loop_copy (loop, loop);
5074
5075   /* In case the function is used for loop header copying (which is the primary
5076      use), ensure that EXIT and its copy will be new latch and entry edges.  */
5077   if (loop->header == entry->dest)
5078     {
5079       copying_header = true;
5080       set_loop_copy (loop, loop_outer (loop));
5081
5082       if (!dominated_by_p (CDI_DOMINATORS, loop->latch, exit->src))
5083         return false;
5084
5085       for (i = 0; i < n_region; i++)
5086         if (region[i] != exit->src
5087             && dominated_by_p (CDI_DOMINATORS, region[i], exit->src))
5088           return false;
5089     }
5090
5091   if (!region_copy)
5092     {
5093       region_copy = XNEWVEC (basic_block, n_region);
5094       free_region_copy = true;
5095     }
5096
5097   gcc_assert (!need_ssa_update_p ());
5098
5099   /* Record blocks outside the region that are dominated by something
5100      inside.  */
5101   doms = NULL;
5102   initialize_original_copy_tables ();
5103
5104   doms = get_dominated_by_region (CDI_DOMINATORS, region, n_region);
5105
5106   if (entry->dest->count)
5107     {
5108       total_count = entry->dest->count;
5109       entry_count = entry->count;
5110       /* Fix up corner cases, to avoid division by zero or creation of negative
5111          frequencies.  */
5112       if (entry_count > total_count)
5113         entry_count = total_count;
5114     }
5115   else
5116     {
5117       total_freq = entry->dest->frequency;
5118       entry_freq = EDGE_FREQUENCY (entry);
5119       /* Fix up corner cases, to avoid division by zero or creation of negative
5120          frequencies.  */
5121       if (total_freq == 0)
5122         total_freq = 1;
5123       else if (entry_freq > total_freq)
5124         entry_freq = total_freq;
5125     }
5126
5127   copy_bbs (region, n_region, region_copy, &exit, 1, &exit_copy, loop,
5128             split_edge_bb_loc (entry));
5129   if (total_count)
5130     {
5131       scale_bbs_frequencies_gcov_type (region, n_region,
5132                                        total_count - entry_count,
5133                                        total_count);
5134       scale_bbs_frequencies_gcov_type (region_copy, n_region, entry_count,
5135                                        total_count);
5136     }
5137   else
5138     {
5139       scale_bbs_frequencies_int (region, n_region, total_freq - entry_freq,
5140                                  total_freq);
5141       scale_bbs_frequencies_int (region_copy, n_region, entry_freq, total_freq);
5142     }
5143
5144   if (copying_header)
5145     {
5146       loop->header = exit->dest;
5147       loop->latch = exit->src;
5148     }
5149
5150   /* Redirect the entry and add the phi node arguments.  */
5151   redirected = redirect_edge_and_branch (entry, get_bb_copy (entry->dest));
5152   gcc_assert (redirected != NULL);
5153   flush_pending_stmts (entry);
5154
5155   /* Concerning updating of dominators:  We must recount dominators
5156      for entry block and its copy.  Anything that is outside of the
5157      region, but was dominated by something inside needs recounting as
5158      well.  */
5159   set_immediate_dominator (CDI_DOMINATORS, entry->dest, entry->src);
5160   VEC_safe_push (basic_block, heap, doms, get_bb_original (entry->dest));
5161   iterate_fix_dominators (CDI_DOMINATORS, doms, false);
5162   VEC_free (basic_block, heap, doms);
5163
5164   /* Add the other PHI node arguments.  */
5165   add_phi_args_after_copy (region_copy, n_region, NULL);
5166
5167   /* Update the SSA web.  */
5168   update_ssa (TODO_update_ssa);
5169
5170   if (free_region_copy)
5171     free (region_copy);
5172
5173   free_original_copy_tables ();
5174   return true;
5175 }
5176
5177 /* Duplicates REGION consisting of N_REGION blocks.  The new blocks
5178    are stored to REGION_COPY in the same order in that they appear
5179    in REGION, if REGION_COPY is not NULL.  ENTRY is the entry to
5180    the region, EXIT an exit from it.  The condition guarding EXIT
5181    is moved to ENTRY.  Returns true if duplication succeeds, false
5182    otherwise.
5183
5184    For example, 
5185  
5186    some_code;
5187    if (cond)
5188      A;
5189    else
5190      B;
5191
5192    is transformed to
5193
5194    if (cond)
5195      {
5196        some_code;
5197        A;
5198      }
5199    else
5200      {
5201        some_code;
5202        B;
5203      }
5204 */
5205
5206 bool
5207 gimple_duplicate_sese_tail (edge entry ATTRIBUTE_UNUSED, edge exit ATTRIBUTE_UNUSED,
5208                           basic_block *region ATTRIBUTE_UNUSED, unsigned n_region ATTRIBUTE_UNUSED,
5209                           basic_block *region_copy ATTRIBUTE_UNUSED)
5210 {
5211   unsigned i;
5212   bool free_region_copy = false;
5213   struct loop *loop = exit->dest->loop_father;
5214   struct loop *orig_loop = entry->dest->loop_father;
5215   basic_block switch_bb, entry_bb, nentry_bb;
5216   VEC (basic_block, heap) *doms;
5217   int total_freq = 0, exit_freq = 0;
5218   gcov_type total_count = 0, exit_count = 0;
5219   edge exits[2], nexits[2], e;
5220   gimple_stmt_iterator gsi;
5221   gimple cond_stmt;
5222   edge sorig, snew;
5223
5224   gcc_assert (EDGE_COUNT (exit->src->succs) == 2);
5225   exits[0] = exit;
5226   exits[1] = EDGE_SUCC (exit->src, EDGE_SUCC (exit->src, 0) == exit);
5227
5228   if (!can_copy_bbs_p (region, n_region))
5229     return false;
5230
5231   /* Some sanity checking.  Note that we do not check for all possible
5232      missuses of the functions.  I.e. if you ask to copy something weird
5233      (e.g., in the example, if there is a jump from inside to the middle
5234      of some_code, or come_code defines some of the values used in cond)
5235      it will work, but the resulting code will not be correct.  */
5236   for (i = 0; i < n_region; i++)
5237     {
5238       /* We do not handle subloops, i.e. all the blocks must belong to the
5239          same loop.  */
5240       if (region[i]->loop_father != orig_loop)
5241         return false;
5242
5243       if (region[i] == orig_loop->latch)
5244         return false;
5245     }
5246
5247   initialize_original_copy_tables ();
5248   set_loop_copy (orig_loop, loop);
5249
5250   if (!region_copy)
5251     {
5252       region_copy = XNEWVEC (basic_block, n_region);
5253       free_region_copy = true;
5254     }
5255
5256   gcc_assert (!need_ssa_update_p ());
5257
5258   /* Record blocks outside the region that are dominated by something
5259      inside.  */
5260   doms = get_dominated_by_region (CDI_DOMINATORS, region, n_region);
5261
5262   if (exit->src->count)
5263     {
5264       total_count = exit->src->count;
5265       exit_count = exit->count;
5266       /* Fix up corner cases, to avoid division by zero or creation of negative
5267          frequencies.  */
5268       if (exit_count > total_count)
5269         exit_count = total_count;
5270     }
5271   else
5272     {
5273       total_freq = exit->src->frequency;
5274       exit_freq = EDGE_FREQUENCY (exit);
5275       /* Fix up corner cases, to avoid division by zero or creation of negative
5276          frequencies.  */
5277       if (total_freq == 0)
5278         total_freq = 1;
5279       if (exit_freq > total_freq)
5280         exit_freq = total_freq;
5281     }
5282
5283   copy_bbs (region, n_region, region_copy, exits, 2, nexits, orig_loop,
5284             split_edge_bb_loc (exit));
5285   if (total_count)
5286     {
5287       scale_bbs_frequencies_gcov_type (region, n_region,
5288                                        total_count - exit_count,
5289                                        total_count);
5290       scale_bbs_frequencies_gcov_type (region_copy, n_region, exit_count,
5291                                        total_count);
5292     }
5293   else
5294     {
5295       scale_bbs_frequencies_int (region, n_region, total_freq - exit_freq,
5296                                  total_freq);
5297       scale_bbs_frequencies_int (region_copy, n_region, exit_freq, total_freq);
5298     }
5299
5300   /* Create the switch block, and put the exit condition to it.  */
5301   entry_bb = entry->dest;
5302   nentry_bb = get_bb_copy (entry_bb);
5303   if (!last_stmt (entry->src)
5304       || !stmt_ends_bb_p (last_stmt (entry->src)))
5305     switch_bb = entry->src;
5306   else
5307     switch_bb = split_edge (entry);
5308   set_immediate_dominator (CDI_DOMINATORS, nentry_bb, switch_bb);
5309
5310   gsi = gsi_last_bb (switch_bb);
5311   cond_stmt = last_stmt (exit->src);
5312   gcc_assert (gimple_code (cond_stmt) == GIMPLE_COND);
5313   cond_stmt = gimple_copy (cond_stmt);
5314   gimple_cond_set_lhs (cond_stmt, unshare_expr (gimple_cond_lhs (cond_stmt)));
5315   gimple_cond_set_rhs (cond_stmt, unshare_expr (gimple_cond_rhs (cond_stmt)));
5316   gsi_insert_after (&gsi, cond_stmt, GSI_NEW_STMT);
5317
5318   sorig = single_succ_edge (switch_bb);
5319   sorig->flags = exits[1]->flags;
5320   snew = make_edge (switch_bb, nentry_bb, exits[0]->flags);
5321
5322   /* Register the new edge from SWITCH_BB in loop exit lists.  */
5323   rescan_loop_exit (snew, true, false);
5324
5325   /* Add the PHI node arguments.  */
5326   add_phi_args_after_copy (region_copy, n_region, snew);
5327
5328   /* Get rid of now superfluous conditions and associated edges (and phi node
5329      arguments).  */
5330   e = redirect_edge_and_branch (exits[0], exits[1]->dest);
5331   PENDING_STMT (e) = NULL;
5332   e = redirect_edge_and_branch (nexits[1], nexits[0]->dest);
5333   PENDING_STMT (e) = NULL;
5334
5335   /* Anything that is outside of the region, but was dominated by something
5336      inside needs to update dominance info.  */
5337   iterate_fix_dominators (CDI_DOMINATORS, doms, false);
5338   VEC_free (basic_block, heap, doms);
5339
5340   /* Update the SSA web.  */
5341   update_ssa (TODO_update_ssa);
5342
5343   if (free_region_copy)
5344     free (region_copy);
5345
5346   free_original_copy_tables ();
5347   return true;
5348 }
5349
5350 /* Add all the blocks dominated by ENTRY to the array BBS_P.  Stop
5351    adding blocks when the dominator traversal reaches EXIT.  This
5352    function silently assumes that ENTRY strictly dominates EXIT.  */
5353
5354 void
5355 gather_blocks_in_sese_region (basic_block entry, basic_block exit,
5356                               VEC(basic_block,heap) **bbs_p)
5357 {
5358   basic_block son;
5359
5360   for (son = first_dom_son (CDI_DOMINATORS, entry);
5361        son;
5362        son = next_dom_son (CDI_DOMINATORS, son))
5363     {
5364       VEC_safe_push (basic_block, heap, *bbs_p, son);
5365       if (son != exit)
5366         gather_blocks_in_sese_region (son, exit, bbs_p);
5367     }
5368 }
5369
5370 /* Replaces *TP with a duplicate (belonging to function TO_CONTEXT).
5371    The duplicates are recorded in VARS_MAP.  */
5372
5373 static void
5374 replace_by_duplicate_decl (tree *tp, struct pointer_map_t *vars_map,
5375                            tree to_context)
5376 {
5377   tree t = *tp, new_t;
5378   struct function *f = DECL_STRUCT_FUNCTION (to_context);
5379   void **loc;
5380
5381   if (DECL_CONTEXT (t) == to_context)
5382     return;
5383
5384   loc = pointer_map_contains (vars_map, t);
5385
5386   if (!loc)
5387     {
5388       loc = pointer_map_insert (vars_map, t);
5389
5390       if (SSA_VAR_P (t))
5391         {
5392           new_t = copy_var_decl (t, DECL_NAME (t), TREE_TYPE (t));
5393           f->local_decls = tree_cons (NULL_TREE, new_t, f->local_decls);
5394         }
5395       else
5396         {
5397           gcc_assert (TREE_CODE (t) == CONST_DECL);
5398           new_t = copy_node (t);
5399         }
5400       DECL_CONTEXT (new_t) = to_context;
5401
5402       *loc = new_t;
5403     }
5404   else
5405     new_t = (tree) *loc;
5406
5407   *tp = new_t;
5408 }
5409
5410
5411 /* Creates an ssa name in TO_CONTEXT equivalent to NAME.
5412    VARS_MAP maps old ssa names and var_decls to the new ones.  */
5413
5414 static tree
5415 replace_ssa_name (tree name, struct pointer_map_t *vars_map,
5416                   tree to_context)
5417 {
5418   void **loc;
5419   tree new_name, decl = SSA_NAME_VAR (name);
5420
5421   gcc_assert (is_gimple_reg (name));
5422
5423   loc = pointer_map_contains (vars_map, name);
5424
5425   if (!loc)
5426     {
5427       replace_by_duplicate_decl (&decl, vars_map, to_context);
5428
5429       push_cfun (DECL_STRUCT_FUNCTION (to_context));
5430       if (gimple_in_ssa_p (cfun))
5431         add_referenced_var (decl);
5432
5433       new_name = make_ssa_name (decl, SSA_NAME_DEF_STMT (name));
5434       if (SSA_NAME_IS_DEFAULT_DEF (name))
5435         set_default_def (decl, new_name);
5436       pop_cfun ();
5437
5438       loc = pointer_map_insert (vars_map, name);
5439       *loc = new_name;
5440     }
5441   else
5442     new_name = (tree) *loc;
5443
5444   return new_name;
5445 }
5446
5447 struct move_stmt_d
5448 {
5449   tree orig_block;
5450   tree new_block;
5451   tree from_context;
5452   tree to_context;
5453   struct pointer_map_t *vars_map;
5454   htab_t new_label_map;
5455   bool remap_decls_p;
5456 };
5457
5458 /* Helper for move_block_to_fn.  Set TREE_BLOCK in every expression
5459    contained in *TP if it has been ORIG_BLOCK previously and change the
5460    DECL_CONTEXT of every local variable referenced in *TP.  */
5461
5462 static tree
5463 move_stmt_op (tree *tp, int *walk_subtrees, void *data)
5464 {
5465   struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
5466   struct move_stmt_d *p = (struct move_stmt_d *) wi->info;
5467   tree t = *tp;
5468
5469   if (EXPR_P (t))
5470     /* We should never have TREE_BLOCK set on non-statements.  */
5471     gcc_assert (!TREE_BLOCK (t));
5472
5473   else if (DECL_P (t) || TREE_CODE (t) == SSA_NAME)
5474     {
5475       if (TREE_CODE (t) == SSA_NAME)
5476         *tp = replace_ssa_name (t, p->vars_map, p->to_context);
5477       else if (TREE_CODE (t) == LABEL_DECL)
5478         {
5479           if (p->new_label_map)
5480             {
5481               struct tree_map in, *out;
5482               in.base.from = t;
5483               out = (struct tree_map *)
5484                 htab_find_with_hash (p->new_label_map, &in, DECL_UID (t));
5485               if (out)
5486                 *tp = t = out->to;
5487             }
5488
5489           DECL_CONTEXT (t) = p->to_context;
5490         }
5491       else if (p->remap_decls_p)
5492         {
5493           /* Replace T with its duplicate.  T should no longer appear in the
5494              parent function, so this looks wasteful; however, it may appear
5495              in referenced_vars, and more importantly, as virtual operands of
5496              statements, and in alias lists of other variables.  It would be
5497              quite difficult to expunge it from all those places.  ??? It might
5498              suffice to do this for addressable variables.  */
5499           if ((TREE_CODE (t) == VAR_DECL
5500                && !is_global_var (t))
5501               || TREE_CODE (t) == CONST_DECL)
5502             replace_by_duplicate_decl (tp, p->vars_map, p->to_context);
5503           
5504           if (SSA_VAR_P (t)
5505               && gimple_in_ssa_p (cfun))
5506             {
5507               push_cfun (DECL_STRUCT_FUNCTION (p->to_context));
5508               add_referenced_var (*tp);
5509               pop_cfun ();
5510             }
5511         }
5512       *walk_subtrees = 0;
5513     }
5514   else if (TYPE_P (t))
5515     *walk_subtrees = 0;
5516
5517   return NULL_TREE;
5518 }
5519
5520 /* Like move_stmt_op, but for gimple statements.
5521
5522    Helper for move_block_to_fn.  Set GIMPLE_BLOCK in every expression
5523    contained in the current statement in *GSI_P and change the
5524    DECL_CONTEXT of every local variable referenced in the current
5525    statement.  */
5526
5527 static tree
5528 move_stmt_r (gimple_stmt_iterator *gsi_p, bool *handled_ops_p,
5529              struct walk_stmt_info *wi)
5530 {
5531   struct move_stmt_d *p = (struct move_stmt_d *) wi->info;
5532   gimple stmt = gsi_stmt (*gsi_p);
5533   tree block = gimple_block (stmt);
5534
5535   if (p->orig_block == NULL_TREE
5536       || block == p->orig_block
5537       || block == NULL_TREE)
5538     gimple_set_block (stmt, p->new_block);
5539 #ifdef ENABLE_CHECKING
5540   else if (block != p->new_block)
5541     {
5542       while (block && block != p->orig_block)
5543         block = BLOCK_SUPERCONTEXT (block);
5544       gcc_assert (block);
5545     }
5546 #endif
5547
5548   if (is_gimple_omp (stmt)
5549       && gimple_code (stmt) != GIMPLE_OMP_RETURN
5550       && gimple_code (stmt) != GIMPLE_OMP_CONTINUE)
5551     {
5552       /* Do not remap variables inside OMP directives.  Variables
5553          referenced in clauses and directive header belong to the
5554          parent function and should not be moved into the child
5555          function.  */
5556       bool save_remap_decls_p = p->remap_decls_p;
5557       p->remap_decls_p = false;
5558       *handled_ops_p = true;
5559
5560       walk_gimple_seq (gimple_omp_body (stmt), move_stmt_r, move_stmt_op, wi);
5561
5562       p->remap_decls_p = save_remap_decls_p;
5563     }
5564
5565   return NULL_TREE;
5566 }
5567
5568 /* Marks virtual operands of all statements in basic blocks BBS for
5569    renaming.  */
5570
5571 void
5572 mark_virtual_ops_in_bb (basic_block bb)
5573 {
5574   gimple_stmt_iterator gsi;
5575
5576   for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
5577     mark_virtual_ops_for_renaming (gsi_stmt (gsi));
5578
5579   for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
5580     mark_virtual_ops_for_renaming (gsi_stmt (gsi));
5581 }
5582
5583 /* Marks virtual operands of all statements in basic blocks BBS for
5584    renaming.  */
5585
5586 static void
5587 mark_virtual_ops_in_region (VEC (basic_block,heap) *bbs)
5588 {
5589   basic_block bb;
5590   unsigned i;
5591
5592   for (i = 0; VEC_iterate (basic_block, bbs, i, bb); i++)
5593     mark_virtual_ops_in_bb (bb);
5594 }
5595
5596 /* Move basic block BB from function CFUN to function DEST_FN.  The
5597    block is moved out of the original linked list and placed after
5598    block AFTER in the new list.  Also, the block is removed from the
5599    original array of blocks and placed in DEST_FN's array of blocks.
5600    If UPDATE_EDGE_COUNT_P is true, the edge counts on both CFGs is
5601    updated to reflect the moved edges.
5602
5603    The local variables are remapped to new instances, VARS_MAP is used
5604    to record the mapping.  */
5605
5606 static void
5607 move_block_to_fn (struct function *dest_cfun, basic_block bb,
5608                   basic_block after, bool update_edge_count_p,
5609                   struct move_stmt_d *d, int eh_offset)
5610 {
5611   struct control_flow_graph *cfg;
5612   edge_iterator ei;
5613   edge e;
5614   gimple_stmt_iterator si;
5615   unsigned old_len, new_len;
5616
5617   /* Remove BB from dominance structures.  */
5618   delete_from_dominance_info (CDI_DOMINATORS, bb);
5619   if (current_loops)
5620     remove_bb_from_loops (bb);
5621
5622   /* Link BB to the new linked list.  */
5623   move_block_after (bb, after);
5624
5625   /* Update the edge count in the corresponding flowgraphs.  */
5626   if (update_edge_count_p)
5627     FOR_EACH_EDGE (e, ei, bb->succs)
5628       {
5629         cfun->cfg->x_n_edges--;
5630         dest_cfun->cfg->x_n_edges++;
5631       }
5632
5633   /* Remove BB from the original basic block array.  */
5634   VEC_replace (basic_block, cfun->cfg->x_basic_block_info, bb->index, NULL);
5635   cfun->cfg->x_n_basic_blocks--;
5636
5637   /* Grow DEST_CFUN's basic block array if needed.  */
5638   cfg = dest_cfun->cfg;
5639   cfg->x_n_basic_blocks++;
5640   if (bb->index >= cfg->x_last_basic_block)
5641     cfg->x_last_basic_block = bb->index + 1;
5642
5643   old_len = VEC_length (basic_block, cfg->x_basic_block_info);
5644   if ((unsigned) cfg->x_last_basic_block >= old_len)
5645     {
5646       new_len = cfg->x_last_basic_block + (cfg->x_last_basic_block + 3) / 4;
5647       VEC_safe_grow_cleared (basic_block, gc, cfg->x_basic_block_info,
5648                              new_len);
5649     }
5650
5651   VEC_replace (basic_block, cfg->x_basic_block_info,
5652                bb->index, bb);
5653
5654   /* Remap the variables in phi nodes.  */
5655   for (si = gsi_start_phis (bb); !gsi_end_p (si); )
5656     {
5657       gimple phi = gsi_stmt (si);
5658       use_operand_p use;
5659       tree op = PHI_RESULT (phi);
5660       ssa_op_iter oi;
5661
5662       if (!is_gimple_reg (op))
5663         {
5664           /* Remove the phi nodes for virtual operands (alias analysis will be
5665              run for the new function, anyway).  */
5666           remove_phi_node (&si, true);
5667           continue;
5668         }
5669
5670       SET_PHI_RESULT (phi,
5671                       replace_ssa_name (op, d->vars_map, dest_cfun->decl));
5672       FOR_EACH_PHI_ARG (use, phi, oi, SSA_OP_USE)
5673         {
5674           op = USE_FROM_PTR (use);
5675           if (TREE_CODE (op) == SSA_NAME)
5676             SET_USE (use, replace_ssa_name (op, d->vars_map, dest_cfun->decl));
5677         }
5678
5679       gsi_next (&si);
5680     }
5681
5682   for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
5683     {
5684       gimple stmt = gsi_stmt (si);
5685       int region;
5686       struct walk_stmt_info wi;
5687
5688       memset (&wi, 0, sizeof (wi));
5689       wi.info = d;
5690       walk_gimple_stmt (&si, move_stmt_r, move_stmt_op, &wi);
5691
5692       if (gimple_code (stmt) == GIMPLE_LABEL)
5693         {
5694           tree label = gimple_label_label (stmt);
5695           int uid = LABEL_DECL_UID (label);
5696
5697           gcc_assert (uid > -1);
5698
5699           old_len = VEC_length (basic_block, cfg->x_label_to_block_map);
5700           if (old_len <= (unsigned) uid)
5701             {
5702               new_len = 3 * uid / 2;
5703               VEC_safe_grow_cleared (basic_block, gc,
5704                                      cfg->x_label_to_block_map, new_len);
5705             }
5706
5707           VEC_replace (basic_block, cfg->x_label_to_block_map, uid, bb);
5708           VEC_replace (basic_block, cfun->cfg->x_label_to_block_map, uid, NULL);
5709
5710           gcc_assert (DECL_CONTEXT (label) == dest_cfun->decl);
5711
5712           if (uid >= dest_cfun->cfg->last_label_uid)
5713             dest_cfun->cfg->last_label_uid = uid + 1;
5714         }
5715       else if (gimple_code (stmt) == GIMPLE_RESX && eh_offset != 0)
5716         gimple_resx_set_region (stmt, gimple_resx_region (stmt) + eh_offset);
5717
5718       region = lookup_stmt_eh_region (stmt);
5719       if (region >= 0)
5720         {
5721           add_stmt_to_eh_region_fn (dest_cfun, stmt, region + eh_offset);
5722           remove_stmt_from_eh_region (stmt);
5723           gimple_duplicate_stmt_histograms (dest_cfun, stmt, cfun, stmt);
5724           gimple_remove_stmt_histograms (cfun, stmt);
5725         }
5726
5727       /* We cannot leave any operands allocated from the operand caches of
5728          the current function.  */
5729       free_stmt_operands (stmt);
5730       push_cfun (dest_cfun);
5731       update_stmt (stmt);
5732       pop_cfun ();
5733     }
5734 }
5735
5736 /* Examine the statements in BB (which is in SRC_CFUN); find and return
5737    the outermost EH region.  Use REGION as the incoming base EH region.  */
5738
5739 static int
5740 find_outermost_region_in_block (struct function *src_cfun,
5741                                 basic_block bb, int region)
5742 {
5743   gimple_stmt_iterator si;
5744
5745   for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
5746     {
5747       gimple stmt = gsi_stmt (si);
5748       int stmt_region;
5749
5750       if (gimple_code (stmt) == GIMPLE_RESX)
5751         stmt_region = gimple_resx_region (stmt);
5752       else
5753         stmt_region = lookup_stmt_eh_region_fn (src_cfun, stmt);
5754       if (stmt_region > 0)
5755         {
5756           if (region < 0)
5757             region = stmt_region;
5758           else if (stmt_region != region)
5759             {
5760               region = eh_region_outermost (src_cfun, stmt_region, region);
5761               gcc_assert (region != -1);
5762             }
5763         }
5764     }
5765
5766   return region;
5767 }
5768
5769 static tree
5770 new_label_mapper (tree decl, void *data)
5771 {
5772   htab_t hash = (htab_t) data;
5773   struct tree_map *m;
5774   void **slot;
5775
5776   gcc_assert (TREE_CODE (decl) == LABEL_DECL);
5777
5778   m = XNEW (struct tree_map);
5779   m->hash = DECL_UID (decl);
5780   m->base.from = decl;
5781   m->to = create_artificial_label ();
5782   LABEL_DECL_UID (m->to) = LABEL_DECL_UID (decl);
5783   if (LABEL_DECL_UID (m->to) >= cfun->cfg->last_label_uid)
5784     cfun->cfg->last_label_uid = LABEL_DECL_UID (m->to) + 1;
5785
5786   slot = htab_find_slot_with_hash (hash, m, m->hash, INSERT);
5787   gcc_assert (*slot == NULL);
5788
5789   *slot = m;
5790
5791   return m->to;
5792 }
5793
5794 /* Change DECL_CONTEXT of all BLOCK_VARS in block, including
5795    subblocks.  */
5796
5797 static void
5798 replace_block_vars_by_duplicates (tree block, struct pointer_map_t *vars_map,
5799                                   tree to_context)
5800 {
5801   tree *tp, t;
5802
5803   for (tp = &BLOCK_VARS (block); *tp; tp = &TREE_CHAIN (*tp))
5804     {
5805       t = *tp;
5806       replace_by_duplicate_decl (&t, vars_map, to_context);
5807       if (t != *tp)
5808         {
5809           if (TREE_CODE (*tp) == VAR_DECL && DECL_HAS_VALUE_EXPR_P (*tp))
5810             {
5811               SET_DECL_VALUE_EXPR (t, DECL_VALUE_EXPR (*tp));
5812               DECL_HAS_VALUE_EXPR_P (t) = 1;
5813             }
5814           TREE_CHAIN (t) = TREE_CHAIN (*tp);
5815           *tp = t;
5816         }
5817     }
5818
5819   for (block = BLOCK_SUBBLOCKS (block); block; block = BLOCK_CHAIN (block))
5820     replace_block_vars_by_duplicates (block, vars_map, to_context);
5821 }
5822
5823 /* Move a single-entry, single-exit region delimited by ENTRY_BB and
5824    EXIT_BB to function DEST_CFUN.  The whole region is replaced by a
5825    single basic block in the original CFG and the new basic block is
5826    returned.  DEST_CFUN must not have a CFG yet.
5827
5828    Note that the region need not be a pure SESE region.  Blocks inside
5829    the region may contain calls to abort/exit.  The only restriction
5830    is that ENTRY_BB should be the only entry point and it must
5831    dominate EXIT_BB.
5832
5833    Change TREE_BLOCK of all statements in ORIG_BLOCK to the new
5834    functions outermost BLOCK, move all subblocks of ORIG_BLOCK
5835    to the new function.
5836
5837    All local variables referenced in the region are assumed to be in
5838    the corresponding BLOCK_VARS and unexpanded variable lists
5839    associated with DEST_CFUN.  */
5840
5841 basic_block
5842 move_sese_region_to_fn (struct function *dest_cfun, basic_block entry_bb,
5843                         basic_block exit_bb, tree orig_block)
5844 {
5845   VEC(basic_block,heap) *bbs, *dom_bbs;
5846   basic_block dom_entry = get_immediate_dominator (CDI_DOMINATORS, entry_bb);
5847   basic_block after, bb, *entry_pred, *exit_succ, abb;
5848   struct function *saved_cfun = cfun;
5849   int *entry_flag, *exit_flag, eh_offset;
5850   unsigned *entry_prob, *exit_prob;
5851   unsigned i, num_entry_edges, num_exit_edges;
5852   edge e;
5853   edge_iterator ei;
5854   htab_t new_label_map;
5855   struct pointer_map_t *vars_map;
5856   struct loop *loop = entry_bb->loop_father;
5857   struct move_stmt_d d;
5858
5859   /* If ENTRY does not strictly dominate EXIT, this cannot be an SESE
5860      region.  */
5861   gcc_assert (entry_bb != exit_bb
5862               && (!exit_bb
5863                   || dominated_by_p (CDI_DOMINATORS, exit_bb, entry_bb)));
5864
5865   /* Collect all the blocks in the region.  Manually add ENTRY_BB
5866      because it won't be added by dfs_enumerate_from.  */
5867   bbs = NULL;
5868   VEC_safe_push (basic_block, heap, bbs, entry_bb);
5869   gather_blocks_in_sese_region (entry_bb, exit_bb, &bbs);
5870
5871   /* The blocks that used to be dominated by something in BBS will now be
5872      dominated by the new block.  */
5873   dom_bbs = get_dominated_by_region (CDI_DOMINATORS,
5874                                      VEC_address (basic_block, bbs),
5875                                      VEC_length (basic_block, bbs));
5876
5877   /* Detach ENTRY_BB and EXIT_BB from CFUN->CFG.  We need to remember
5878      the predecessor edges to ENTRY_BB and the successor edges to
5879      EXIT_BB so that we can re-attach them to the new basic block that
5880      will replace the region.  */
5881   num_entry_edges = EDGE_COUNT (entry_bb->preds);
5882   entry_pred = (basic_block *) xcalloc (num_entry_edges, sizeof (basic_block));
5883   entry_flag = (int *) xcalloc (num_entry_edges, sizeof (int));
5884   entry_prob = XNEWVEC (unsigned, num_entry_edges);
5885   i = 0;
5886   for (ei = ei_start (entry_bb->preds); (e = ei_safe_edge (ei)) != NULL;)
5887     {
5888       entry_prob[i] = e->probability;
5889       entry_flag[i] = e->flags;
5890       entry_pred[i++] = e->src;
5891       remove_edge (e);
5892     }
5893
5894   if (exit_bb)
5895     {
5896       num_exit_edges = EDGE_COUNT (exit_bb->succs);
5897       exit_succ = (basic_block *) xcalloc (num_exit_edges,
5898                                            sizeof (basic_block));
5899       exit_flag = (int *) xcalloc (num_exit_edges, sizeof (int));
5900       exit_prob = XNEWVEC (unsigned, num_exit_edges);
5901       i = 0;
5902       for (ei = ei_start (exit_bb->succs); (e = ei_safe_edge (ei)) != NULL;)
5903         {
5904           exit_prob[i] = e->probability;
5905           exit_flag[i] = e->flags;
5906           exit_succ[i++] = e->dest;
5907           remove_edge (e);
5908         }
5909     }
5910   else
5911     {
5912       num_exit_edges = 0;
5913       exit_succ = NULL;
5914       exit_flag = NULL;
5915       exit_prob = NULL;
5916     }
5917
5918   /* Switch context to the child function to initialize DEST_FN's CFG.  */
5919   gcc_assert (dest_cfun->cfg == NULL);
5920   push_cfun (dest_cfun);
5921
5922   init_empty_tree_cfg ();
5923
5924   /* Initialize EH information for the new function.  */
5925   eh_offset = 0;
5926   new_label_map = NULL;
5927   if (saved_cfun->eh)
5928     {
5929       int region = -1;
5930
5931       for (i = 0; VEC_iterate (basic_block, bbs, i, bb); i++)
5932         region = find_outermost_region_in_block (saved_cfun, bb, region);
5933
5934       init_eh_for_function ();
5935       if (region != -1)
5936         {
5937           new_label_map = htab_create (17, tree_map_hash, tree_map_eq, free);
5938           eh_offset = duplicate_eh_regions (saved_cfun, new_label_mapper,
5939                                             new_label_map, region, 0);
5940         }
5941     }
5942
5943   pop_cfun ();
5944
5945   /* The ssa form for virtual operands in the source function will have to
5946      be repaired.  We do not care for the real operands -- the sese region
5947      must be closed with respect to those.  */
5948   mark_virtual_ops_in_region (bbs);
5949
5950   /* Move blocks from BBS into DEST_CFUN.  */
5951   gcc_assert (VEC_length (basic_block, bbs) >= 2);
5952   after = dest_cfun->cfg->x_entry_block_ptr;
5953   vars_map = pointer_map_create ();
5954
5955   memset (&d, 0, sizeof (d));
5956   d.vars_map = vars_map;
5957   d.from_context = cfun->decl;
5958   d.to_context = dest_cfun->decl;
5959   d.new_label_map = new_label_map;
5960   d.remap_decls_p = true;
5961   d.orig_block = orig_block;
5962   d.new_block = DECL_INITIAL (dest_cfun->decl);
5963
5964   for (i = 0; VEC_iterate (basic_block, bbs, i, bb); i++)
5965     {
5966       /* No need to update edge counts on the last block.  It has
5967          already been updated earlier when we detached the region from
5968          the original CFG.  */
5969       move_block_to_fn (dest_cfun, bb, after, bb != exit_bb, &d, eh_offset);
5970       after = bb;
5971     }
5972
5973   /* Rewire BLOCK_SUBBLOCKS of orig_block.  */
5974   if (orig_block)
5975     {
5976       tree block;
5977       gcc_assert (BLOCK_SUBBLOCKS (DECL_INITIAL (dest_cfun->decl))
5978                   == NULL_TREE);
5979       BLOCK_SUBBLOCKS (DECL_INITIAL (dest_cfun->decl))
5980         = BLOCK_SUBBLOCKS (orig_block);
5981       for (block = BLOCK_SUBBLOCKS (orig_block);
5982            block; block = BLOCK_CHAIN (block))
5983         BLOCK_SUPERCONTEXT (block) = DECL_INITIAL (dest_cfun->decl);
5984       BLOCK_SUBBLOCKS (orig_block) = NULL_TREE;
5985     }
5986
5987   replace_block_vars_by_duplicates (DECL_INITIAL (dest_cfun->decl),
5988                                     vars_map, dest_cfun->decl);
5989
5990   if (new_label_map)
5991     htab_delete (new_label_map);
5992   pointer_map_destroy (vars_map);
5993
5994   /* Rewire the entry and exit blocks.  The successor to the entry
5995      block turns into the successor of DEST_FN's ENTRY_BLOCK_PTR in
5996      the child function.  Similarly, the predecessor of DEST_FN's
5997      EXIT_BLOCK_PTR turns into the predecessor of EXIT_BLOCK_PTR.  We
5998      need to switch CFUN between DEST_CFUN and SAVED_CFUN so that the
5999      various CFG manipulation function get to the right CFG.
6000
6001      FIXME, this is silly.  The CFG ought to become a parameter to
6002      these helpers.  */
6003   push_cfun (dest_cfun);
6004   make_edge (ENTRY_BLOCK_PTR, entry_bb, EDGE_FALLTHRU);
6005   if (exit_bb)
6006     make_edge (exit_bb,  EXIT_BLOCK_PTR, 0);
6007   pop_cfun ();
6008
6009   /* Back in the original function, the SESE region has disappeared,
6010      create a new basic block in its place.  */
6011   bb = create_empty_bb (entry_pred[0]);
6012   if (current_loops)
6013     add_bb_to_loop (bb, loop);
6014   for (i = 0; i < num_entry_edges; i++)
6015     {
6016       e = make_edge (entry_pred[i], bb, entry_flag[i]);
6017       e->probability = entry_prob[i];
6018     }
6019
6020   for (i = 0; i < num_exit_edges; i++)
6021     {
6022       e = make_edge (bb, exit_succ[i], exit_flag[i]);
6023       e->probability = exit_prob[i];
6024     }
6025
6026   set_immediate_dominator (CDI_DOMINATORS, bb, dom_entry);
6027   for (i = 0; VEC_iterate (basic_block, dom_bbs, i, abb); i++)
6028     set_immediate_dominator (CDI_DOMINATORS, abb, bb);
6029   VEC_free (basic_block, heap, dom_bbs);
6030
6031   if (exit_bb)
6032     {
6033       free (exit_prob);
6034       free (exit_flag);
6035       free (exit_succ);
6036     }
6037   free (entry_prob);
6038   free (entry_flag);
6039   free (entry_pred);
6040   VEC_free (basic_block, heap, bbs);
6041
6042   return bb;
6043 }
6044
6045
6046 /* Dump FUNCTION_DECL FN to file FILE using FLAGS (see TDF_* in tree-pass.h)
6047    */
6048
6049 void
6050 dump_function_to_file (tree fn, FILE *file, int flags)
6051 {
6052   tree arg, vars, var;
6053   struct function *dsf;
6054   bool ignore_topmost_bind = false, any_var = false;
6055   basic_block bb;
6056   tree chain;
6057
6058   fprintf (file, "%s (", lang_hooks.decl_printable_name (fn, 2));
6059
6060   arg = DECL_ARGUMENTS (fn);
6061   while (arg)
6062     {
6063       print_generic_expr (file, TREE_TYPE (arg), dump_flags);
6064       fprintf (file, " ");
6065       print_generic_expr (file, arg, dump_flags);
6066       if (flags & TDF_VERBOSE)
6067         print_node (file, "", arg, 4);
6068       if (TREE_CHAIN (arg))
6069         fprintf (file, ", ");
6070       arg = TREE_CHAIN (arg);
6071     }
6072   fprintf (file, ")\n");
6073
6074   if (flags & TDF_VERBOSE)
6075     print_node (file, "", fn, 2);
6076
6077   dsf = DECL_STRUCT_FUNCTION (fn);
6078   if (dsf && (flags & TDF_DETAILS))
6079     dump_eh_tree (file, dsf);
6080
6081   if (flags & TDF_RAW && !gimple_has_body_p (fn))
6082     {
6083       dump_node (fn, TDF_SLIM | flags, file);
6084       return;
6085     }
6086
6087   /* Switch CFUN to point to FN.  */
6088   push_cfun (DECL_STRUCT_FUNCTION (fn));
6089
6090   /* When GIMPLE is lowered, the variables are no longer available in
6091      BIND_EXPRs, so display them separately.  */
6092   if (cfun && cfun->decl == fn && cfun->local_decls)
6093     {
6094       ignore_topmost_bind = true;
6095
6096       fprintf (file, "{\n");
6097       for (vars = cfun->local_decls; vars; vars = TREE_CHAIN (vars))
6098         {
6099           var = TREE_VALUE (vars);
6100
6101           print_generic_decl (file, var, flags);
6102           if (flags & TDF_VERBOSE)
6103             print_node (file, "", var, 4);
6104           fprintf (file, "\n");
6105
6106           any_var = true;
6107         }
6108     }
6109
6110   if (cfun && cfun->decl == fn && cfun->cfg && basic_block_info)
6111     {
6112       /* If the CFG has been built, emit a CFG-based dump.  */
6113       check_bb_profile (ENTRY_BLOCK_PTR, file);
6114       if (!ignore_topmost_bind)
6115         fprintf (file, "{\n");
6116
6117       if (any_var && n_basic_blocks)
6118         fprintf (file, "\n");
6119
6120       FOR_EACH_BB (bb)
6121         gimple_dump_bb (bb, file, 2, flags);
6122
6123       fprintf (file, "}\n");
6124       check_bb_profile (EXIT_BLOCK_PTR, file);
6125     }
6126   else if (DECL_SAVED_TREE (fn) == NULL)
6127     {
6128       /* The function is now in GIMPLE form but the CFG has not been
6129          built yet.  Emit the single sequence of GIMPLE statements
6130          that make up its body.  */
6131       gimple_seq body = gimple_body (fn);
6132
6133       if (gimple_seq_first_stmt (body)
6134           && gimple_seq_first_stmt (body) == gimple_seq_last_stmt (body)
6135           && gimple_code (gimple_seq_first_stmt (body)) == GIMPLE_BIND)
6136         print_gimple_seq (file, body, 0, flags);
6137       else
6138         {
6139           if (!ignore_topmost_bind)
6140             fprintf (file, "{\n");
6141
6142           if (any_var)
6143             fprintf (file, "\n");
6144
6145           print_gimple_seq (file, body, 2, flags);
6146           fprintf (file, "}\n");
6147         }
6148     }
6149   else
6150     {
6151       int indent;
6152
6153       /* Make a tree based dump.  */
6154       chain = DECL_SAVED_TREE (fn);
6155
6156       if (chain && TREE_CODE (chain) == BIND_EXPR)
6157         {
6158           if (ignore_topmost_bind)
6159             {
6160               chain = BIND_EXPR_BODY (chain);
6161               indent = 2;
6162             }
6163           else
6164             indent = 0;
6165         }
6166       else
6167         {
6168           if (!ignore_topmost_bind)
6169             fprintf (file, "{\n");
6170           indent = 2;
6171         }
6172
6173       if (any_var)
6174         fprintf (file, "\n");
6175
6176       print_generic_stmt_indented (file, chain, flags, indent);
6177       if (ignore_topmost_bind)
6178         fprintf (file, "}\n");
6179     }
6180
6181   fprintf (file, "\n\n");
6182
6183   /* Restore CFUN.  */
6184   pop_cfun ();
6185 }
6186
6187
6188 /* Dump FUNCTION_DECL FN to stderr using FLAGS (see TDF_* in tree.h)  */
6189
6190 void
6191 debug_function (tree fn, int flags)
6192 {
6193   dump_function_to_file (fn, stderr, flags);
6194 }
6195
6196
6197 /* Print on FILE the indexes for the predecessors of basic_block BB.  */
6198
6199 static void
6200 print_pred_bbs (FILE *file, basic_block bb)
6201 {
6202   edge e;
6203   edge_iterator ei;
6204
6205   FOR_EACH_EDGE (e, ei, bb->preds)
6206     fprintf (file, "bb_%d ", e->src->index);
6207 }
6208
6209
6210 /* Print on FILE the indexes for the successors of basic_block BB.  */
6211
6212 static void
6213 print_succ_bbs (FILE *file, basic_block bb)
6214 {
6215   edge e;
6216   edge_iterator ei;
6217
6218   FOR_EACH_EDGE (e, ei, bb->succs)
6219     fprintf (file, "bb_%d ", e->dest->index);
6220 }
6221
6222 /* Print to FILE the basic block BB following the VERBOSITY level.  */
6223
6224 void 
6225 print_loops_bb (FILE *file, basic_block bb, int indent, int verbosity)
6226 {
6227   char *s_indent = (char *) alloca ((size_t) indent + 1);
6228   memset ((void *) s_indent, ' ', (size_t) indent);
6229   s_indent[indent] = '\0';
6230
6231   /* Print basic_block's header.  */
6232   if (verbosity >= 2)
6233     {
6234       fprintf (file, "%s  bb_%d (preds = {", s_indent, bb->index);
6235       print_pred_bbs (file, bb);
6236       fprintf (file, "}, succs = {");
6237       print_succ_bbs (file, bb);
6238       fprintf (file, "})\n");
6239     }
6240
6241   /* Print basic_block's body.  */
6242   if (verbosity >= 3)
6243     {
6244       fprintf (file, "%s  {\n", s_indent);
6245       gimple_dump_bb (bb, file, indent + 4, TDF_VOPS|TDF_MEMSYMS);
6246       fprintf (file, "%s  }\n", s_indent);
6247     }
6248 }
6249
6250 static void print_loop_and_siblings (FILE *, struct loop *, int, int);
6251
6252 /* Pretty print LOOP on FILE, indented INDENT spaces.  Following
6253    VERBOSITY level this outputs the contents of the loop, or just its
6254    structure.  */
6255
6256 static void
6257 print_loop (FILE *file, struct loop *loop, int indent, int verbosity)
6258 {
6259   char *s_indent;
6260   basic_block bb;
6261
6262   if (loop == NULL)
6263     return;
6264
6265   s_indent = (char *) alloca ((size_t) indent + 1);
6266   memset ((void *) s_indent, ' ', (size_t) indent);
6267   s_indent[indent] = '\0';
6268
6269   /* Print loop's header.  */
6270   fprintf (file, "%sloop_%d (header = %d, latch = %d", s_indent, 
6271            loop->num, loop->header->index, loop->latch->index);
6272   fprintf (file, ", niter = ");
6273   print_generic_expr (file, loop->nb_iterations, 0);
6274
6275   if (loop->any_upper_bound)
6276     {
6277       fprintf (file, ", upper_bound = ");
6278       dump_double_int (file, loop->nb_iterations_upper_bound, true);
6279     }
6280
6281   if (loop->any_estimate)
6282     {
6283       fprintf (file, ", estimate = ");
6284       dump_double_int (file, loop->nb_iterations_estimate, true);
6285     }
6286   fprintf (file, ")\n");
6287
6288   /* Print loop's body.  */
6289   if (verbosity >= 1)
6290     {
6291       fprintf (file, "%s{\n", s_indent);
6292       FOR_EACH_BB (bb)
6293         if (bb->loop_father == loop)
6294           print_loops_bb (file, bb, indent, verbosity);
6295
6296       print_loop_and_siblings (file, loop->inner, indent + 2, verbosity);
6297       fprintf (file, "%s}\n", s_indent);
6298     }
6299 }
6300
6301 /* Print the LOOP and its sibling loops on FILE, indented INDENT
6302    spaces.  Following VERBOSITY level this outputs the contents of the
6303    loop, or just its structure.  */
6304
6305 static void
6306 print_loop_and_siblings (FILE *file, struct loop *loop, int indent, int verbosity)
6307 {
6308   if (loop == NULL)
6309     return;
6310
6311   print_loop (file, loop, indent, verbosity);
6312   print_loop_and_siblings (file, loop->next, indent, verbosity);
6313 }
6314
6315 /* Follow a CFG edge from the entry point of the program, and on entry
6316    of a loop, pretty print the loop structure on FILE.  */
6317
6318 void
6319 print_loops (FILE *file, int verbosity)
6320 {
6321   basic_block bb;
6322
6323   bb = ENTRY_BLOCK_PTR;
6324   if (bb && bb->loop_father)
6325     print_loop_and_siblings (file, bb->loop_father, 0, verbosity);
6326 }
6327
6328
6329 /* Debugging loops structure at tree level, at some VERBOSITY level.  */
6330
6331 void
6332 debug_loops (int verbosity)
6333 {
6334   print_loops (stderr, verbosity);
6335 }
6336
6337 /* Print on stderr the code of LOOP, at some VERBOSITY level.  */
6338
6339 void
6340 debug_loop (struct loop *loop, int verbosity)
6341 {
6342   print_loop (stderr, loop, 0, verbosity);
6343 }
6344
6345 /* Print on stderr the code of loop number NUM, at some VERBOSITY
6346    level.  */
6347
6348 void
6349 debug_loop_num (unsigned num, int verbosity)
6350 {
6351   debug_loop (get_loop (num), verbosity);
6352 }
6353
6354 /* Return true if BB ends with a call, possibly followed by some
6355    instructions that must stay with the call.  Return false,
6356    otherwise.  */
6357
6358 static bool
6359 gimple_block_ends_with_call_p (basic_block bb)
6360 {
6361   gimple_stmt_iterator gsi = gsi_last_bb (bb);
6362   return is_gimple_call (gsi_stmt (gsi));
6363 }
6364
6365
6366 /* Return true if BB ends with a conditional branch.  Return false,
6367    otherwise.  */
6368
6369 static bool
6370 gimple_block_ends_with_condjump_p (const_basic_block bb)
6371 {
6372   gimple stmt = last_stmt (CONST_CAST_BB (bb));
6373   return (stmt && gimple_code (stmt) == GIMPLE_COND);
6374 }
6375
6376
6377 /* Return true if we need to add fake edge to exit at statement T.
6378    Helper function for gimple_flow_call_edges_add.  */
6379
6380 static bool
6381 need_fake_edge_p (gimple t)
6382 {
6383   tree fndecl = NULL_TREE;
6384   int call_flags = 0;
6385
6386   /* NORETURN and LONGJMP calls already have an edge to exit.
6387      CONST and PURE calls do not need one.
6388      We don't currently check for CONST and PURE here, although
6389      it would be a good idea, because those attributes are
6390      figured out from the RTL in mark_constant_function, and
6391      the counter incrementation code from -fprofile-arcs
6392      leads to different results from -fbranch-probabilities.  */
6393   if (is_gimple_call (t))
6394     {
6395       fndecl = gimple_call_fndecl (t);
6396       call_flags = gimple_call_flags (t);
6397     }
6398
6399   if (is_gimple_call (t)
6400       && fndecl
6401       && DECL_BUILT_IN (fndecl)
6402       && (call_flags & ECF_NOTHROW)
6403       && !(call_flags & ECF_NORETURN)
6404       && !(call_flags & ECF_RETURNS_TWICE))
6405    return false;
6406
6407   if (is_gimple_call (t)
6408       && !(call_flags & ECF_NORETURN))
6409     return true;
6410
6411   if (gimple_code (t) == GIMPLE_ASM
6412        && (gimple_asm_volatile_p (t) || gimple_asm_input_p (t)))
6413     return true;
6414
6415   return false;
6416 }
6417
6418
6419 /* Add fake edges to the function exit for any non constant and non
6420    noreturn calls, volatile inline assembly in the bitmap of blocks
6421    specified by BLOCKS or to the whole CFG if BLOCKS is zero.  Return
6422    the number of blocks that were split.
6423
6424    The goal is to expose cases in which entering a basic block does
6425    not imply that all subsequent instructions must be executed.  */
6426
6427 static int
6428 gimple_flow_call_edges_add (sbitmap blocks)
6429 {
6430   int i;
6431   int blocks_split = 0;
6432   int last_bb = last_basic_block;
6433   bool check_last_block = false;
6434
6435   if (n_basic_blocks == NUM_FIXED_BLOCKS)
6436     return 0;
6437
6438   if (! blocks)
6439     check_last_block = true;
6440   else
6441     check_last_block = TEST_BIT (blocks, EXIT_BLOCK_PTR->prev_bb->index);
6442
6443   /* In the last basic block, before epilogue generation, there will be
6444      a fallthru edge to EXIT.  Special care is required if the last insn
6445      of the last basic block is a call because make_edge folds duplicate
6446      edges, which would result in the fallthru edge also being marked
6447      fake, which would result in the fallthru edge being removed by
6448      remove_fake_edges, which would result in an invalid CFG.
6449
6450      Moreover, we can't elide the outgoing fake edge, since the block
6451      profiler needs to take this into account in order to solve the minimal
6452      spanning tree in the case that the call doesn't return.
6453
6454      Handle this by adding a dummy instruction in a new last basic block.  */
6455   if (check_last_block)
6456     {
6457       basic_block bb = EXIT_BLOCK_PTR->prev_bb;
6458       gimple_stmt_iterator gsi = gsi_last_bb (bb);
6459       gimple t = NULL;
6460
6461       if (!gsi_end_p (gsi))
6462         t = gsi_stmt (gsi);
6463
6464       if (t && need_fake_edge_p (t))
6465         {
6466           edge e;
6467
6468           e = find_edge (bb, EXIT_BLOCK_PTR);
6469           if (e)
6470             {
6471               gsi_insert_on_edge (e, gimple_build_nop ());
6472               gsi_commit_edge_inserts ();
6473             }
6474         }
6475     }
6476
6477   /* Now add fake edges to the function exit for any non constant
6478      calls since there is no way that we can determine if they will
6479      return or not...  */
6480   for (i = 0; i < last_bb; i++)
6481     {
6482       basic_block bb = BASIC_BLOCK (i);
6483       gimple_stmt_iterator gsi;
6484       gimple stmt, last_stmt;
6485
6486       if (!bb)
6487         continue;
6488
6489       if (blocks && !TEST_BIT (blocks, i))
6490         continue;
6491
6492       gsi = gsi_last_bb (bb);
6493       if (!gsi_end_p (gsi))
6494         {
6495           last_stmt = gsi_stmt (gsi);
6496           do
6497             {
6498               stmt = gsi_stmt (gsi);
6499               if (need_fake_edge_p (stmt))
6500                 {
6501                   edge e;
6502
6503                   /* The handling above of the final block before the
6504                      epilogue should be enough to verify that there is
6505                      no edge to the exit block in CFG already.
6506                      Calling make_edge in such case would cause us to
6507                      mark that edge as fake and remove it later.  */
6508 #ifdef ENABLE_CHECKING
6509                   if (stmt == last_stmt)
6510                     {
6511                       e = find_edge (bb, EXIT_BLOCK_PTR);
6512                       gcc_assert (e == NULL);
6513                     }
6514 #endif
6515
6516                   /* Note that the following may create a new basic block
6517                      and renumber the existing basic blocks.  */
6518                   if (stmt != last_stmt)
6519                     {
6520                       e = split_block (bb, stmt);
6521                       if (e)
6522                         blocks_split++;
6523                     }
6524                   make_edge (bb, EXIT_BLOCK_PTR, EDGE_FAKE);
6525                 }
6526               gsi_prev (&gsi);
6527             }
6528           while (!gsi_end_p (gsi));
6529         }
6530     }
6531
6532   if (blocks_split)
6533     verify_flow_info ();
6534
6535   return blocks_split;
6536 }
6537
6538 /* Purge dead abnormal call edges from basic block BB.  */
6539
6540 bool
6541 gimple_purge_dead_abnormal_call_edges (basic_block bb)
6542 {
6543   bool changed = gimple_purge_dead_eh_edges (bb);
6544
6545   if (cfun->has_nonlocal_label)
6546     {
6547       gimple stmt = last_stmt (bb);
6548       edge_iterator ei;
6549       edge e;
6550
6551       if (!(stmt && stmt_can_make_abnormal_goto (stmt)))
6552         for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
6553           {
6554             if (e->flags & EDGE_ABNORMAL)
6555               {
6556                 remove_edge (e);
6557                 changed = true;
6558               }
6559             else
6560               ei_next (&ei);
6561           }
6562
6563       /* See gimple_purge_dead_eh_edges below.  */
6564       if (changed)
6565         free_dominance_info (CDI_DOMINATORS);
6566     }
6567
6568   return changed;
6569 }
6570
6571 /* Stores all basic blocks dominated by BB to DOM_BBS.  */
6572
6573 static void
6574 get_all_dominated_blocks (basic_block bb, VEC (basic_block, heap) **dom_bbs)
6575 {
6576   basic_block son;
6577
6578   VEC_safe_push (basic_block, heap, *dom_bbs, bb);
6579   for (son = first_dom_son (CDI_DOMINATORS, bb);
6580        son;
6581        son = next_dom_son (CDI_DOMINATORS, son))
6582     get_all_dominated_blocks (son, dom_bbs);
6583 }
6584
6585 /* Removes edge E and all the blocks dominated by it, and updates dominance
6586    information.  The IL in E->src needs to be updated separately.
6587    If dominance info is not available, only the edge E is removed.*/
6588
6589 void
6590 remove_edge_and_dominated_blocks (edge e)
6591 {
6592   VEC (basic_block, heap) *bbs_to_remove = NULL;
6593   VEC (basic_block, heap) *bbs_to_fix_dom = NULL;
6594   bitmap df, df_idom;
6595   edge f;
6596   edge_iterator ei;
6597   bool none_removed = false;
6598   unsigned i;
6599   basic_block bb, dbb;
6600   bitmap_iterator bi;
6601
6602   if (!dom_info_available_p (CDI_DOMINATORS))
6603     {
6604       remove_edge (e);
6605       return;
6606     }
6607
6608   /* No updating is needed for edges to exit.  */
6609   if (e->dest == EXIT_BLOCK_PTR)
6610     {
6611       if (cfgcleanup_altered_bbs)
6612         bitmap_set_bit (cfgcleanup_altered_bbs, e->src->index);
6613       remove_edge (e);
6614       return;
6615     }
6616
6617   /* First, we find the basic blocks to remove.  If E->dest has a predecessor
6618      that is not dominated by E->dest, then this set is empty.  Otherwise,
6619      all the basic blocks dominated by E->dest are removed.
6620
6621      Also, to DF_IDOM we store the immediate dominators of the blocks in
6622      the dominance frontier of E (i.e., of the successors of the
6623      removed blocks, if there are any, and of E->dest otherwise).  */
6624   FOR_EACH_EDGE (f, ei, e->dest->preds)
6625     {
6626       if (f == e)
6627         continue;
6628
6629       if (!dominated_by_p (CDI_DOMINATORS, f->src, e->dest))
6630         {
6631           none_removed = true;
6632           break;
6633         }
6634     }
6635
6636   df = BITMAP_ALLOC (NULL);
6637   df_idom = BITMAP_ALLOC (NULL);
6638
6639   if (none_removed)
6640     bitmap_set_bit (df_idom,
6641                     get_immediate_dominator (CDI_DOMINATORS, e->dest)->index);
6642   else
6643     {
6644       get_all_dominated_blocks (e->dest, &bbs_to_remove);
6645       for (i = 0; VEC_iterate (basic_block, bbs_to_remove, i, bb); i++)
6646         {
6647           FOR_EACH_EDGE (f, ei, bb->succs)
6648             {
6649               if (f->dest != EXIT_BLOCK_PTR)
6650                 bitmap_set_bit (df, f->dest->index);
6651             }
6652         }
6653       for (i = 0; VEC_iterate (basic_block, bbs_to_remove, i, bb); i++)
6654         bitmap_clear_bit (df, bb->index);
6655
6656       EXECUTE_IF_SET_IN_BITMAP (df, 0, i, bi)
6657         {
6658           bb = BASIC_BLOCK (i);
6659           bitmap_set_bit (df_idom,
6660                           get_immediate_dominator (CDI_DOMINATORS, bb)->index);
6661         }
6662     }
6663
6664   if (cfgcleanup_altered_bbs)
6665     {
6666       /* Record the set of the altered basic blocks.  */
6667       bitmap_set_bit (cfgcleanup_altered_bbs, e->src->index);
6668       bitmap_ior_into (cfgcleanup_altered_bbs, df);
6669     }
6670
6671   /* Remove E and the cancelled blocks.  */
6672   if (none_removed)
6673     remove_edge (e);
6674   else
6675     {
6676       for (i = 0; VEC_iterate (basic_block, bbs_to_remove, i, bb); i++)
6677         delete_basic_block (bb);
6678     }
6679
6680   /* Update the dominance information.  The immediate dominator may change only
6681      for blocks whose immediate dominator belongs to DF_IDOM:
6682    
6683      Suppose that idom(X) = Y before removal of E and idom(X) != Y after the
6684      removal.  Let Z the arbitrary block such that idom(Z) = Y and
6685      Z dominates X after the removal.  Before removal, there exists a path P
6686      from Y to X that avoids Z.  Let F be the last edge on P that is
6687      removed, and let W = F->dest.  Before removal, idom(W) = Y (since Y
6688      dominates W, and because of P, Z does not dominate W), and W belongs to
6689      the dominance frontier of E.  Therefore, Y belongs to DF_IDOM.  */ 
6690   EXECUTE_IF_SET_IN_BITMAP (df_idom, 0, i, bi)
6691     {
6692       bb = BASIC_BLOCK (i);
6693       for (dbb = first_dom_son (CDI_DOMINATORS, bb);
6694            dbb;
6695            dbb = next_dom_son (CDI_DOMINATORS, dbb))
6696         VEC_safe_push (basic_block, heap, bbs_to_fix_dom, dbb);
6697     }
6698
6699   iterate_fix_dominators (CDI_DOMINATORS, bbs_to_fix_dom, true);
6700
6701   BITMAP_FREE (df);
6702   BITMAP_FREE (df_idom);
6703   VEC_free (basic_block, heap, bbs_to_remove);
6704   VEC_free (basic_block, heap, bbs_to_fix_dom);
6705 }
6706
6707 /* Purge dead EH edges from basic block BB.  */
6708
6709 bool
6710 gimple_purge_dead_eh_edges (basic_block bb)
6711 {
6712   bool changed = false;
6713   edge e;
6714   edge_iterator ei;
6715   gimple stmt = last_stmt (bb);
6716
6717   if (stmt && stmt_can_throw_internal (stmt))
6718     return false;
6719
6720   for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
6721     {
6722       if (e->flags & EDGE_EH)
6723         {
6724           remove_edge_and_dominated_blocks (e);
6725           changed = true;
6726         }
6727       else
6728         ei_next (&ei);
6729     }
6730
6731   return changed;
6732 }
6733
6734 bool
6735 gimple_purge_all_dead_eh_edges (const_bitmap blocks)
6736 {
6737   bool changed = false;
6738   unsigned i;
6739   bitmap_iterator bi;
6740
6741   EXECUTE_IF_SET_IN_BITMAP (blocks, 0, i, bi)
6742     {
6743       basic_block bb = BASIC_BLOCK (i);
6744
6745       /* Earlier gimple_purge_dead_eh_edges could have removed
6746          this basic block already.  */
6747       gcc_assert (bb || changed);
6748       if (bb != NULL)
6749         changed |= gimple_purge_dead_eh_edges (bb);
6750     }
6751
6752   return changed;
6753 }
6754
6755 /* This function is called whenever a new edge is created or
6756    redirected.  */
6757
6758 static void
6759 gimple_execute_on_growing_pred (edge e)
6760 {
6761   basic_block bb = e->dest;
6762
6763   if (phi_nodes (bb))
6764     reserve_phi_args_for_new_edge (bb);
6765 }
6766
6767 /* This function is called immediately before edge E is removed from
6768    the edge vector E->dest->preds.  */
6769
6770 static void
6771 gimple_execute_on_shrinking_pred (edge e)
6772 {
6773   if (phi_nodes (e->dest))
6774     remove_phi_args (e);
6775 }
6776
6777 /*---------------------------------------------------------------------------
6778   Helper functions for Loop versioning
6779   ---------------------------------------------------------------------------*/
6780
6781 /* Adjust phi nodes for 'first' basic block.  'second' basic block is a copy
6782    of 'first'. Both of them are dominated by 'new_head' basic block. When
6783    'new_head' was created by 'second's incoming edge it received phi arguments
6784    on the edge by split_edge(). Later, additional edge 'e' was created to
6785    connect 'new_head' and 'first'. Now this routine adds phi args on this
6786    additional edge 'e' that new_head to second edge received as part of edge
6787    splitting.  */
6788
6789 static void
6790 gimple_lv_adjust_loop_header_phi (basic_block first, basic_block second,
6791                                   basic_block new_head, edge e)
6792 {
6793   gimple phi1, phi2;
6794   gimple_stmt_iterator psi1, psi2;
6795   tree def;
6796   edge e2 = find_edge (new_head, second);
6797
6798   /* Because NEW_HEAD has been created by splitting SECOND's incoming
6799      edge, we should always have an edge from NEW_HEAD to SECOND.  */
6800   gcc_assert (e2 != NULL);
6801
6802   /* Browse all 'second' basic block phi nodes and add phi args to
6803      edge 'e' for 'first' head. PHI args are always in correct order.  */
6804
6805   for (psi2 = gsi_start_phis (second),
6806        psi1 = gsi_start_phis (first);
6807        !gsi_end_p (psi2) && !gsi_end_p (psi1);
6808        gsi_next (&psi2),  gsi_next (&psi1))
6809     {
6810       phi1 = gsi_stmt (psi1);
6811       phi2 = gsi_stmt (psi2);
6812       def = PHI_ARG_DEF (phi2, e2->dest_idx);
6813       add_phi_arg (phi1, def, e);
6814     }
6815 }
6816
6817
6818 /* Adds a if else statement to COND_BB with condition COND_EXPR.
6819    SECOND_HEAD is the destination of the THEN and FIRST_HEAD is
6820    the destination of the ELSE part.  */
6821
6822 static void
6823 gimple_lv_add_condition_to_bb (basic_block first_head ATTRIBUTE_UNUSED,
6824                                basic_block second_head ATTRIBUTE_UNUSED,
6825                                basic_block cond_bb, void *cond_e)
6826 {
6827   gimple_stmt_iterator gsi;
6828   gimple new_cond_expr;
6829   tree cond_expr = (tree) cond_e;
6830   edge e0;
6831
6832   /* Build new conditional expr */
6833   new_cond_expr = gimple_build_cond_from_tree (cond_expr,
6834                                                NULL_TREE, NULL_TREE);
6835
6836   /* Add new cond in cond_bb.  */
6837   gsi = gsi_last_bb (cond_bb);
6838   gsi_insert_after (&gsi, new_cond_expr, GSI_NEW_STMT);
6839
6840   /* Adjust edges appropriately to connect new head with first head
6841      as well as second head.  */
6842   e0 = single_succ_edge (cond_bb);
6843   e0->flags &= ~EDGE_FALLTHRU;
6844   e0->flags |= EDGE_FALSE_VALUE;
6845 }
6846
6847 struct cfg_hooks gimple_cfg_hooks = {
6848   "gimple",
6849   gimple_verify_flow_info,
6850   gimple_dump_bb,               /* dump_bb  */
6851   create_bb,                    /* create_basic_block  */
6852   gimple_redirect_edge_and_branch, /* redirect_edge_and_branch  */
6853   gimple_redirect_edge_and_branch_force, /* redirect_edge_and_branch_force  */
6854   gimple_can_remove_branch_p,   /* can_remove_branch_p  */
6855   remove_bb,                    /* delete_basic_block  */
6856   gimple_split_block,           /* split_block  */
6857   gimple_move_block_after,      /* move_block_after  */
6858   gimple_can_merge_blocks_p,    /* can_merge_blocks_p  */
6859   gimple_merge_blocks,          /* merge_blocks  */
6860   gimple_predict_edge,          /* predict_edge  */
6861   gimple_predicted_by_p,                /* predicted_by_p  */
6862   gimple_can_duplicate_bb_p,    /* can_duplicate_block_p  */
6863   gimple_duplicate_bb,          /* duplicate_block  */
6864   gimple_split_edge,            /* split_edge  */
6865   gimple_make_forwarder_block,  /* make_forward_block  */
6866   NULL,                         /* tidy_fallthru_edge  */
6867   gimple_block_ends_with_call_p,/* block_ends_with_call_p */
6868   gimple_block_ends_with_condjump_p, /* block_ends_with_condjump_p */
6869   gimple_flow_call_edges_add,     /* flow_call_edges_add */
6870   gimple_execute_on_growing_pred,       /* execute_on_growing_pred */
6871   gimple_execute_on_shrinking_pred, /* execute_on_shrinking_pred */
6872   gimple_duplicate_loop_to_header_edge, /* duplicate loop for trees */
6873   gimple_lv_add_condition_to_bb, /* lv_add_condition_to_bb */
6874   gimple_lv_adjust_loop_header_phi, /* lv_adjust_loop_header_phi*/
6875   extract_true_false_edges_from_block, /* extract_cond_bb_edges */
6876   flush_pending_stmts           /* flush_pending_stmts */
6877 };
6878
6879
6880 /* Split all critical edges.  */
6881
6882 static unsigned int
6883 split_critical_edges (void)
6884 {
6885   basic_block bb;
6886   edge e;
6887   edge_iterator ei;
6888
6889   /* split_edge can redirect edges out of SWITCH_EXPRs, which can get
6890      expensive.  So we want to enable recording of edge to CASE_LABEL_EXPR
6891      mappings around the calls to split_edge.  */
6892   start_recording_case_labels ();
6893   FOR_ALL_BB (bb)
6894     {
6895       FOR_EACH_EDGE (e, ei, bb->succs)
6896         if (EDGE_CRITICAL_P (e) && !(e->flags & EDGE_ABNORMAL))
6897           {
6898             split_edge (e);
6899           }
6900     }
6901   end_recording_case_labels ();
6902   return 0;
6903 }
6904
6905 struct gimple_opt_pass pass_split_crit_edges =
6906 {
6907  {
6908   GIMPLE_PASS,
6909   "crited",                          /* name */
6910   NULL,                          /* gate */
6911   split_critical_edges,          /* execute */
6912   NULL,                          /* sub */
6913   NULL,                          /* next */
6914   0,                             /* static_pass_number */
6915   TV_TREE_SPLIT_EDGES,           /* tv_id */
6916   PROP_cfg,                      /* properties required */
6917   PROP_no_crit_edges,            /* properties_provided */
6918   0,                             /* properties_destroyed */
6919   0,                             /* todo_flags_start */
6920   TODO_dump_func                 /* todo_flags_finish */
6921  }
6922 };
6923
6924
6925 /* Build a ternary operation and gimplify it.  Emit code before GSI.
6926    Return the gimple_val holding the result.  */
6927
6928 tree
6929 gimplify_build3 (gimple_stmt_iterator *gsi, enum tree_code code,
6930                  tree type, tree a, tree b, tree c)
6931 {
6932   tree ret;
6933
6934   ret = fold_build3 (code, type, a, b, c);
6935   STRIP_NOPS (ret);
6936
6937   return force_gimple_operand_gsi (gsi, ret, true, NULL, true,
6938                                    GSI_SAME_STMT);
6939 }
6940
6941 /* Build a binary operation and gimplify it.  Emit code before GSI.
6942    Return the gimple_val holding the result.  */
6943
6944 tree
6945 gimplify_build2 (gimple_stmt_iterator *gsi, enum tree_code code,
6946                  tree type, tree a, tree b)
6947 {
6948   tree ret;
6949
6950   ret = fold_build2 (code, type, a, b);
6951   STRIP_NOPS (ret);
6952
6953   return force_gimple_operand_gsi (gsi, ret, true, NULL, true,
6954                                    GSI_SAME_STMT);
6955 }
6956
6957 /* Build a unary operation and gimplify it.  Emit code before GSI.
6958    Return the gimple_val holding the result.  */
6959
6960 tree
6961 gimplify_build1 (gimple_stmt_iterator *gsi, enum tree_code code, tree type,
6962                  tree a)
6963 {
6964   tree ret;
6965
6966   ret = fold_build1 (code, type, a);
6967   STRIP_NOPS (ret);
6968
6969   return force_gimple_operand_gsi (gsi, ret, true, NULL, true,
6970                                    GSI_SAME_STMT);
6971 }
6972
6973
6974 \f
6975 /* Emit return warnings.  */
6976
6977 static unsigned int
6978 execute_warn_function_return (void)
6979 {
6980   source_location location;
6981   gimple last;
6982   edge e;
6983   edge_iterator ei;
6984
6985   /* If we have a path to EXIT, then we do return.  */
6986   if (TREE_THIS_VOLATILE (cfun->decl)
6987       && EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0)
6988     {
6989       location = UNKNOWN_LOCATION;
6990       FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
6991         {
6992           last = last_stmt (e->src);
6993           if (gimple_code (last) == GIMPLE_RETURN
6994               && (location = gimple_location (last)) != UNKNOWN_LOCATION)
6995             break;
6996         }
6997       if (location == UNKNOWN_LOCATION)
6998         location = cfun->function_end_locus;
6999       warning (0, "%H%<noreturn%> function does return", &location);
7000     }
7001
7002   /* If we see "return;" in some basic block, then we do reach the end
7003      without returning a value.  */
7004   else if (warn_return_type
7005            && !TREE_NO_WARNING (cfun->decl)
7006            && EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0
7007            && !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (cfun->decl))))
7008     {
7009       FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
7010         {
7011           gimple last = last_stmt (e->src);
7012           if (gimple_code (last) == GIMPLE_RETURN
7013               && gimple_return_retval (last) == NULL
7014               && !gimple_no_warning_p (last))
7015             {
7016               location = gimple_location (last);
7017               if (location == UNKNOWN_LOCATION)
7018                   location = cfun->function_end_locus;
7019               warning_at (location, OPT_Wreturn_type, "control reaches end of non-void function");
7020               TREE_NO_WARNING (cfun->decl) = 1;
7021               break;
7022             }
7023         }
7024     }
7025   return 0;
7026 }
7027
7028
7029 /* Given a basic block B which ends with a conditional and has
7030    precisely two successors, determine which of the edges is taken if
7031    the conditional is true and which is taken if the conditional is
7032    false.  Set TRUE_EDGE and FALSE_EDGE appropriately.  */
7033
7034 void
7035 extract_true_false_edges_from_block (basic_block b,
7036                                      edge *true_edge,
7037                                      edge *false_edge)
7038 {
7039   edge e = EDGE_SUCC (b, 0);
7040
7041   if (e->flags & EDGE_TRUE_VALUE)
7042     {
7043       *true_edge = e;
7044       *false_edge = EDGE_SUCC (b, 1);
7045     }
7046   else
7047     {
7048       *false_edge = e;
7049       *true_edge = EDGE_SUCC (b, 1);
7050     }
7051 }
7052
7053 struct gimple_opt_pass pass_warn_function_return =
7054 {
7055  {
7056   GIMPLE_PASS,
7057   NULL,                                 /* name */
7058   NULL,                                 /* gate */
7059   execute_warn_function_return,         /* execute */
7060   NULL,                                 /* sub */
7061   NULL,                                 /* next */
7062   0,                                    /* static_pass_number */
7063   0,                                    /* tv_id */
7064   PROP_cfg,                             /* properties_required */
7065   0,                                    /* properties_provided */
7066   0,                                    /* properties_destroyed */
7067   0,                                    /* todo_flags_start */
7068   0                                     /* todo_flags_finish */
7069  }
7070 };
7071
7072 /* Emit noreturn warnings.  */
7073
7074 static unsigned int
7075 execute_warn_function_noreturn (void)
7076 {
7077   if (warn_missing_noreturn
7078       && !TREE_THIS_VOLATILE (cfun->decl)
7079       && EDGE_COUNT (EXIT_BLOCK_PTR->preds) == 0
7080       && !lang_hooks.missing_noreturn_ok_p (cfun->decl))
7081     warning (OPT_Wmissing_noreturn, "%Jfunction might be possible candidate "
7082              "for attribute %<noreturn%>",
7083              cfun->decl);
7084   return 0;
7085 }
7086
7087 struct gimple_opt_pass pass_warn_function_noreturn =
7088 {
7089  {
7090   GIMPLE_PASS,
7091   NULL,                                 /* name */
7092   NULL,                                 /* gate */
7093   execute_warn_function_noreturn,       /* execute */
7094   NULL,                                 /* sub */
7095   NULL,                                 /* next */
7096   0,                                    /* static_pass_number */
7097   0,                                    /* tv_id */
7098   PROP_cfg,                             /* properties_required */
7099   0,                                    /* properties_provided */
7100   0,                                    /* properties_destroyed */
7101   0,                                    /* todo_flags_start */
7102   0                                     /* todo_flags_finish */
7103  }
7104 };