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