OSDN Git Service

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