OSDN Git Service

2013-04-12 Hristian Kirtchev <kirtchev@adacore.com>
[pf3gnuchains/gcc-fork.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           /* The result of a vector comparison is of signed
3196              integral type.  */
3197           || TYPE_UNSIGNED (TREE_TYPE (type)))
3198         {
3199           error ("invalid vector comparison resulting type");
3200           debug_generic_expr (type);
3201           return true;
3202         }
3203     }
3204   else
3205     {
3206       error ("bogus comparison result type");
3207       debug_generic_expr (type);
3208       return true;
3209     }
3210
3211   return false;
3212 }
3213
3214 /* Verify a gimple assignment statement STMT with an unary rhs.
3215    Returns true if anything is wrong.  */
3216
3217 static bool
3218 verify_gimple_assign_unary (gimple stmt)
3219 {
3220   enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
3221   tree lhs = gimple_assign_lhs (stmt);
3222   tree lhs_type = TREE_TYPE (lhs);
3223   tree rhs1 = gimple_assign_rhs1 (stmt);
3224   tree rhs1_type = TREE_TYPE (rhs1);
3225
3226   if (!is_gimple_reg (lhs))
3227     {
3228       error ("non-register as LHS of unary operation");
3229       return true;
3230     }
3231
3232   if (!is_gimple_val (rhs1))
3233     {
3234       error ("invalid operand in unary operation");
3235       return true;
3236     }
3237
3238   /* First handle conversions.  */
3239   switch (rhs_code)
3240     {
3241     CASE_CONVERT:
3242       {
3243         /* Allow conversions from pointer type to integral type only if
3244            there is no sign or zero extension involved.
3245            For targets were the precision of ptrofftype doesn't match that
3246            of pointers we need to allow arbitrary conversions to ptrofftype.  */
3247         if ((POINTER_TYPE_P (lhs_type)
3248              && INTEGRAL_TYPE_P (rhs1_type))
3249             || (POINTER_TYPE_P (rhs1_type)
3250                 && INTEGRAL_TYPE_P (lhs_type)
3251                 && (TYPE_PRECISION (rhs1_type) >= TYPE_PRECISION (lhs_type)
3252                     || ptrofftype_p (sizetype))))
3253           return false;
3254
3255         /* Allow conversion from integral to offset type and vice versa.  */
3256         if ((TREE_CODE (lhs_type) == OFFSET_TYPE
3257              && INTEGRAL_TYPE_P (rhs1_type))
3258             || (INTEGRAL_TYPE_P (lhs_type)
3259                 && TREE_CODE (rhs1_type) == OFFSET_TYPE))
3260           return false;
3261
3262         /* Otherwise assert we are converting between types of the
3263            same kind.  */
3264         if (INTEGRAL_TYPE_P (lhs_type) != INTEGRAL_TYPE_P (rhs1_type))
3265           {
3266             error ("invalid types in nop conversion");
3267             debug_generic_expr (lhs_type);
3268             debug_generic_expr (rhs1_type);
3269             return true;
3270           }
3271
3272         return false;
3273       }
3274
3275     case ADDR_SPACE_CONVERT_EXPR:
3276       {
3277         if (!POINTER_TYPE_P (rhs1_type) || !POINTER_TYPE_P (lhs_type)
3278             || (TYPE_ADDR_SPACE (TREE_TYPE (rhs1_type))
3279                 == TYPE_ADDR_SPACE (TREE_TYPE (lhs_type))))
3280           {
3281             error ("invalid types in address space conversion");
3282             debug_generic_expr (lhs_type);
3283             debug_generic_expr (rhs1_type);
3284             return true;
3285           }
3286
3287         return false;
3288       }
3289
3290     case FIXED_CONVERT_EXPR:
3291       {
3292         if (!valid_fixed_convert_types_p (lhs_type, rhs1_type)
3293             && !valid_fixed_convert_types_p (rhs1_type, lhs_type))
3294           {
3295             error ("invalid types in fixed-point conversion");
3296             debug_generic_expr (lhs_type);
3297             debug_generic_expr (rhs1_type);
3298             return true;
3299           }
3300
3301         return false;
3302       }
3303
3304     case FLOAT_EXPR:
3305       {
3306         if ((!INTEGRAL_TYPE_P (rhs1_type) || !SCALAR_FLOAT_TYPE_P (lhs_type))
3307             && (!VECTOR_INTEGER_TYPE_P (rhs1_type)
3308                 || !VECTOR_FLOAT_TYPE_P(lhs_type)))
3309           {
3310             error ("invalid types in conversion to floating point");
3311             debug_generic_expr (lhs_type);
3312             debug_generic_expr (rhs1_type);
3313             return true;
3314           }
3315
3316         return false;
3317       }
3318
3319     case FIX_TRUNC_EXPR:
3320       {
3321         if ((!INTEGRAL_TYPE_P (lhs_type) || !SCALAR_FLOAT_TYPE_P (rhs1_type))
3322             && (!VECTOR_INTEGER_TYPE_P (lhs_type)
3323                 || !VECTOR_FLOAT_TYPE_P(rhs1_type)))
3324           {
3325             error ("invalid types in conversion to integer");
3326             debug_generic_expr (lhs_type);
3327             debug_generic_expr (rhs1_type);
3328             return true;
3329           }
3330
3331         return false;
3332       }
3333
3334     case VEC_UNPACK_HI_EXPR:
3335     case VEC_UNPACK_LO_EXPR:
3336     case REDUC_MAX_EXPR:
3337     case REDUC_MIN_EXPR:
3338     case REDUC_PLUS_EXPR:
3339     case VEC_UNPACK_FLOAT_HI_EXPR:
3340     case VEC_UNPACK_FLOAT_LO_EXPR:
3341       /* FIXME.  */
3342       return false;
3343
3344     case NEGATE_EXPR:
3345     case ABS_EXPR:
3346     case BIT_NOT_EXPR:
3347     case PAREN_EXPR:
3348     case NON_LVALUE_EXPR:
3349     case CONJ_EXPR:
3350       break;
3351
3352     default:
3353       gcc_unreachable ();
3354     }
3355
3356   /* For the remaining codes assert there is no conversion involved.  */
3357   if (!useless_type_conversion_p (lhs_type, rhs1_type))
3358     {
3359       error ("non-trivial conversion in unary operation");
3360       debug_generic_expr (lhs_type);
3361       debug_generic_expr (rhs1_type);
3362       return true;
3363     }
3364
3365   return false;
3366 }
3367
3368 /* Verify a gimple assignment statement STMT with a binary rhs.
3369    Returns true if anything is wrong.  */
3370
3371 static bool
3372 verify_gimple_assign_binary (gimple stmt)
3373 {
3374   enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
3375   tree lhs = gimple_assign_lhs (stmt);
3376   tree lhs_type = TREE_TYPE (lhs);
3377   tree rhs1 = gimple_assign_rhs1 (stmt);
3378   tree rhs1_type = TREE_TYPE (rhs1);
3379   tree rhs2 = gimple_assign_rhs2 (stmt);
3380   tree rhs2_type = TREE_TYPE (rhs2);
3381
3382   if (!is_gimple_reg (lhs))
3383     {
3384       error ("non-register as LHS of binary operation");
3385       return true;
3386     }
3387
3388   if (!is_gimple_val (rhs1)
3389       || !is_gimple_val (rhs2))
3390     {
3391       error ("invalid operands in binary operation");
3392       return true;
3393     }
3394
3395   /* First handle operations that involve different types.  */
3396   switch (rhs_code)
3397     {
3398     case COMPLEX_EXPR:
3399       {
3400         if (TREE_CODE (lhs_type) != COMPLEX_TYPE
3401             || !(INTEGRAL_TYPE_P (rhs1_type)
3402                  || SCALAR_FLOAT_TYPE_P (rhs1_type))
3403             || !(INTEGRAL_TYPE_P (rhs2_type)
3404                  || SCALAR_FLOAT_TYPE_P (rhs2_type)))
3405           {
3406             error ("type mismatch in complex expression");
3407             debug_generic_expr (lhs_type);
3408             debug_generic_expr (rhs1_type);
3409             debug_generic_expr (rhs2_type);
3410             return true;
3411           }
3412
3413         return false;
3414       }
3415
3416     case LSHIFT_EXPR:
3417     case RSHIFT_EXPR:
3418     case LROTATE_EXPR:
3419     case RROTATE_EXPR:
3420       {
3421         /* Shifts and rotates are ok on integral types, fixed point
3422            types and integer vector types.  */
3423         if ((!INTEGRAL_TYPE_P (rhs1_type)
3424              && !FIXED_POINT_TYPE_P (rhs1_type)
3425              && !(TREE_CODE (rhs1_type) == VECTOR_TYPE
3426                   && INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))))
3427             || (!INTEGRAL_TYPE_P (rhs2_type)
3428                 /* Vector shifts of vectors are also ok.  */
3429                 && !(TREE_CODE (rhs1_type) == VECTOR_TYPE
3430                      && INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))
3431                      && TREE_CODE (rhs2_type) == VECTOR_TYPE
3432                      && INTEGRAL_TYPE_P (TREE_TYPE (rhs2_type))))
3433             || !useless_type_conversion_p (lhs_type, rhs1_type))
3434           {
3435             error ("type mismatch in shift expression");
3436             debug_generic_expr (lhs_type);
3437             debug_generic_expr (rhs1_type);
3438             debug_generic_expr (rhs2_type);
3439             return true;
3440           }
3441
3442         return false;
3443       }
3444
3445     case VEC_LSHIFT_EXPR:
3446     case VEC_RSHIFT_EXPR:
3447       {
3448         if (TREE_CODE (rhs1_type) != VECTOR_TYPE
3449             || !(INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))
3450                  || POINTER_TYPE_P (TREE_TYPE (rhs1_type))
3451                  || FIXED_POINT_TYPE_P (TREE_TYPE (rhs1_type))
3452                  || SCALAR_FLOAT_TYPE_P (TREE_TYPE (rhs1_type)))
3453             || (!INTEGRAL_TYPE_P (rhs2_type)
3454                 && (TREE_CODE (rhs2_type) != VECTOR_TYPE
3455                     || !INTEGRAL_TYPE_P (TREE_TYPE (rhs2_type))))
3456             || !useless_type_conversion_p (lhs_type, rhs1_type))
3457           {
3458             error ("type mismatch in vector shift expression");
3459             debug_generic_expr (lhs_type);
3460             debug_generic_expr (rhs1_type);
3461             debug_generic_expr (rhs2_type);
3462             return true;
3463           }
3464         /* For shifting a vector of non-integral components we
3465            only allow shifting by a constant multiple of the element size.  */
3466         if (!INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))
3467             && (TREE_CODE (rhs2) != INTEGER_CST
3468                 || !div_if_zero_remainder (EXACT_DIV_EXPR, rhs2,
3469                                            TYPE_SIZE (TREE_TYPE (rhs1_type)))))
3470           {
3471             error ("non-element sized vector shift of floating point vector");
3472             return true;
3473           }
3474
3475         return false;
3476       }
3477
3478     case WIDEN_LSHIFT_EXPR:
3479       {
3480         if (!INTEGRAL_TYPE_P (lhs_type)
3481             || !INTEGRAL_TYPE_P (rhs1_type)
3482             || TREE_CODE (rhs2) != INTEGER_CST
3483             || (2 * TYPE_PRECISION (rhs1_type) > TYPE_PRECISION (lhs_type)))
3484           {
3485             error ("type mismatch in widening vector shift expression");
3486             debug_generic_expr (lhs_type);
3487             debug_generic_expr (rhs1_type);
3488             debug_generic_expr (rhs2_type);
3489             return true;
3490           }
3491
3492         return false;
3493       }
3494
3495     case VEC_WIDEN_LSHIFT_HI_EXPR:
3496     case VEC_WIDEN_LSHIFT_LO_EXPR:
3497       {
3498         if (TREE_CODE (rhs1_type) != VECTOR_TYPE
3499             || TREE_CODE (lhs_type) != VECTOR_TYPE
3500             || !INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))
3501             || !INTEGRAL_TYPE_P (TREE_TYPE (lhs_type))
3502             || TREE_CODE (rhs2) != INTEGER_CST
3503             || (2 * TYPE_PRECISION (TREE_TYPE (rhs1_type))
3504                 > TYPE_PRECISION (TREE_TYPE (lhs_type))))
3505           {
3506             error ("type mismatch in widening vector shift expression");
3507             debug_generic_expr (lhs_type);
3508             debug_generic_expr (rhs1_type);
3509             debug_generic_expr (rhs2_type);
3510             return true;
3511           }
3512
3513         return false;
3514       }
3515
3516     case PLUS_EXPR:
3517     case MINUS_EXPR:
3518       {
3519         /* We use regular PLUS_EXPR and MINUS_EXPR for vectors.
3520            ???  This just makes the checker happy and may not be what is
3521            intended.  */
3522         if (TREE_CODE (lhs_type) == VECTOR_TYPE
3523             && POINTER_TYPE_P (TREE_TYPE (lhs_type)))
3524           {
3525             if (TREE_CODE (rhs1_type) != VECTOR_TYPE
3526                 || TREE_CODE (rhs2_type) != VECTOR_TYPE)
3527               {
3528                 error ("invalid non-vector operands to vector valued plus");
3529                 return true;
3530               }
3531             lhs_type = TREE_TYPE (lhs_type);
3532             rhs1_type = TREE_TYPE (rhs1_type);
3533             rhs2_type = TREE_TYPE (rhs2_type);
3534             /* PLUS_EXPR is commutative, so we might end up canonicalizing
3535                the pointer to 2nd place.  */
3536             if (POINTER_TYPE_P (rhs2_type))
3537               {
3538                 tree tem = rhs1_type;
3539                 rhs1_type = rhs2_type;
3540                 rhs2_type = tem;
3541               }
3542             goto do_pointer_plus_expr_check;
3543           }
3544         if (POINTER_TYPE_P (lhs_type)
3545             || POINTER_TYPE_P (rhs1_type)
3546             || POINTER_TYPE_P (rhs2_type))
3547           {
3548             error ("invalid (pointer) operands to plus/minus");
3549             return true;
3550           }
3551
3552         /* Continue with generic binary expression handling.  */
3553         break;
3554       }
3555
3556     case POINTER_PLUS_EXPR:
3557       {
3558 do_pointer_plus_expr_check:
3559         if (!POINTER_TYPE_P (rhs1_type)
3560             || !useless_type_conversion_p (lhs_type, rhs1_type)
3561             || !ptrofftype_p (rhs2_type))
3562           {
3563             error ("type mismatch in pointer plus expression");
3564             debug_generic_stmt (lhs_type);
3565             debug_generic_stmt (rhs1_type);
3566             debug_generic_stmt (rhs2_type);
3567             return true;
3568           }
3569
3570         return false;
3571       }
3572
3573     case TRUTH_ANDIF_EXPR:
3574     case TRUTH_ORIF_EXPR:
3575     case TRUTH_AND_EXPR:
3576     case TRUTH_OR_EXPR:
3577     case TRUTH_XOR_EXPR:
3578
3579       gcc_unreachable ();
3580
3581     case LT_EXPR:
3582     case LE_EXPR:
3583     case GT_EXPR:
3584     case GE_EXPR:
3585     case EQ_EXPR:
3586     case NE_EXPR:
3587     case UNORDERED_EXPR:
3588     case ORDERED_EXPR:
3589     case UNLT_EXPR:
3590     case UNLE_EXPR:
3591     case UNGT_EXPR:
3592     case UNGE_EXPR:
3593     case UNEQ_EXPR:
3594     case LTGT_EXPR:
3595       /* Comparisons are also binary, but the result type is not
3596          connected to the operand types.  */
3597       return verify_gimple_comparison (lhs_type, rhs1, rhs2);
3598
3599     case WIDEN_MULT_EXPR:
3600       if (TREE_CODE (lhs_type) != INTEGER_TYPE)
3601         return true;
3602       return ((2 * TYPE_PRECISION (rhs1_type) > TYPE_PRECISION (lhs_type))
3603               || (TYPE_PRECISION (rhs1_type) != TYPE_PRECISION (rhs2_type)));
3604
3605     case WIDEN_SUM_EXPR:
3606     case VEC_WIDEN_MULT_HI_EXPR:
3607     case VEC_WIDEN_MULT_LO_EXPR:
3608     case VEC_WIDEN_MULT_EVEN_EXPR:
3609     case VEC_WIDEN_MULT_ODD_EXPR:
3610     case VEC_PACK_TRUNC_EXPR:
3611     case VEC_PACK_SAT_EXPR:
3612     case VEC_PACK_FIX_TRUNC_EXPR:
3613       /* FIXME.  */
3614       return false;
3615
3616     case MULT_EXPR:
3617     case MULT_HIGHPART_EXPR:
3618     case TRUNC_DIV_EXPR:
3619     case CEIL_DIV_EXPR:
3620     case FLOOR_DIV_EXPR:
3621     case ROUND_DIV_EXPR:
3622     case TRUNC_MOD_EXPR:
3623     case CEIL_MOD_EXPR:
3624     case FLOOR_MOD_EXPR:
3625     case ROUND_MOD_EXPR:
3626     case RDIV_EXPR:
3627     case EXACT_DIV_EXPR:
3628     case MIN_EXPR:
3629     case MAX_EXPR:
3630     case BIT_IOR_EXPR:
3631     case BIT_XOR_EXPR:
3632     case BIT_AND_EXPR:
3633       /* Continue with generic binary expression handling.  */
3634       break;
3635
3636     default:
3637       gcc_unreachable ();
3638     }
3639
3640   if (!useless_type_conversion_p (lhs_type, rhs1_type)
3641       || !useless_type_conversion_p (lhs_type, rhs2_type))
3642     {
3643       error ("type mismatch in binary expression");
3644       debug_generic_stmt (lhs_type);
3645       debug_generic_stmt (rhs1_type);
3646       debug_generic_stmt (rhs2_type);
3647       return true;
3648     }
3649
3650   return false;
3651 }
3652
3653 /* Verify a gimple assignment statement STMT with a ternary rhs.
3654    Returns true if anything is wrong.  */
3655
3656 static bool
3657 verify_gimple_assign_ternary (gimple stmt)
3658 {
3659   enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
3660   tree lhs = gimple_assign_lhs (stmt);
3661   tree lhs_type = TREE_TYPE (lhs);
3662   tree rhs1 = gimple_assign_rhs1 (stmt);
3663   tree rhs1_type = TREE_TYPE (rhs1);
3664   tree rhs2 = gimple_assign_rhs2 (stmt);
3665   tree rhs2_type = TREE_TYPE (rhs2);
3666   tree rhs3 = gimple_assign_rhs3 (stmt);
3667   tree rhs3_type = TREE_TYPE (rhs3);
3668
3669   if (!is_gimple_reg (lhs))
3670     {
3671       error ("non-register as LHS of ternary operation");
3672       return true;
3673     }
3674
3675   if (((rhs_code == VEC_COND_EXPR || rhs_code == COND_EXPR)
3676        ? !is_gimple_condexpr (rhs1) : !is_gimple_val (rhs1))
3677       || !is_gimple_val (rhs2)
3678       || !is_gimple_val (rhs3))
3679     {
3680       error ("invalid operands in ternary operation");
3681       return true;
3682     }
3683
3684   /* First handle operations that involve different types.  */
3685   switch (rhs_code)
3686     {
3687     case WIDEN_MULT_PLUS_EXPR:
3688     case WIDEN_MULT_MINUS_EXPR:
3689       if ((!INTEGRAL_TYPE_P (rhs1_type)
3690            && !FIXED_POINT_TYPE_P (rhs1_type))
3691           || !useless_type_conversion_p (rhs1_type, rhs2_type)
3692           || !useless_type_conversion_p (lhs_type, rhs3_type)
3693           || 2 * TYPE_PRECISION (rhs1_type) > TYPE_PRECISION (lhs_type)
3694           || TYPE_PRECISION (rhs1_type) != TYPE_PRECISION (rhs2_type))
3695         {
3696           error ("type mismatch in widening multiply-accumulate expression");
3697           debug_generic_expr (lhs_type);
3698           debug_generic_expr (rhs1_type);
3699           debug_generic_expr (rhs2_type);
3700           debug_generic_expr (rhs3_type);
3701           return true;
3702         }
3703       break;
3704
3705     case FMA_EXPR:
3706       if (!useless_type_conversion_p (lhs_type, rhs1_type)
3707           || !useless_type_conversion_p (lhs_type, rhs2_type)
3708           || !useless_type_conversion_p (lhs_type, rhs3_type))
3709         {
3710           error ("type mismatch in fused multiply-add expression");
3711           debug_generic_expr (lhs_type);
3712           debug_generic_expr (rhs1_type);
3713           debug_generic_expr (rhs2_type);
3714           debug_generic_expr (rhs3_type);
3715           return true;
3716         }
3717       break;
3718
3719     case COND_EXPR:
3720     case VEC_COND_EXPR:
3721       if (!useless_type_conversion_p (lhs_type, rhs2_type)
3722           || !useless_type_conversion_p (lhs_type, rhs3_type))
3723         {
3724           error ("type mismatch in conditional expression");
3725           debug_generic_expr (lhs_type);
3726           debug_generic_expr (rhs2_type);
3727           debug_generic_expr (rhs3_type);
3728           return true;
3729         }
3730       break;
3731
3732     case VEC_PERM_EXPR:
3733       if (!useless_type_conversion_p (lhs_type, rhs1_type)
3734           || !useless_type_conversion_p (lhs_type, rhs2_type))
3735         {
3736           error ("type mismatch in vector permute expression");
3737           debug_generic_expr (lhs_type);
3738           debug_generic_expr (rhs1_type);
3739           debug_generic_expr (rhs2_type);
3740           debug_generic_expr (rhs3_type);
3741           return true;
3742         }
3743
3744       if (TREE_CODE (rhs1_type) != VECTOR_TYPE
3745           || TREE_CODE (rhs2_type) != VECTOR_TYPE
3746           || TREE_CODE (rhs3_type) != VECTOR_TYPE)
3747         {
3748           error ("vector types expected in vector permute expression");
3749           debug_generic_expr (lhs_type);
3750           debug_generic_expr (rhs1_type);
3751           debug_generic_expr (rhs2_type);
3752           debug_generic_expr (rhs3_type);
3753           return true;
3754         }
3755
3756       if (TYPE_VECTOR_SUBPARTS (rhs1_type) != TYPE_VECTOR_SUBPARTS (rhs2_type)
3757           || TYPE_VECTOR_SUBPARTS (rhs2_type)
3758              != TYPE_VECTOR_SUBPARTS (rhs3_type)
3759           || TYPE_VECTOR_SUBPARTS (rhs3_type)
3760              != TYPE_VECTOR_SUBPARTS (lhs_type))
3761         {
3762           error ("vectors with different element number found "
3763                  "in vector permute expression");
3764           debug_generic_expr (lhs_type);
3765           debug_generic_expr (rhs1_type);
3766           debug_generic_expr (rhs2_type);
3767           debug_generic_expr (rhs3_type);
3768           return true;
3769         }
3770
3771       if (TREE_CODE (TREE_TYPE (rhs3_type)) != INTEGER_TYPE
3772           || GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (rhs3_type)))
3773              != GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (rhs1_type))))
3774         {
3775           error ("invalid mask type in vector permute expression");
3776           debug_generic_expr (lhs_type);
3777           debug_generic_expr (rhs1_type);
3778           debug_generic_expr (rhs2_type);
3779           debug_generic_expr (rhs3_type);
3780           return true;
3781         }
3782
3783       return false;
3784
3785     case DOT_PROD_EXPR:
3786     case REALIGN_LOAD_EXPR:
3787       /* FIXME.  */
3788       return false;
3789
3790     default:
3791       gcc_unreachable ();
3792     }
3793   return false;
3794 }
3795
3796 /* Verify a gimple assignment statement STMT with a single rhs.
3797    Returns true if anything is wrong.  */
3798
3799 static bool
3800 verify_gimple_assign_single (gimple stmt)
3801 {
3802   enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
3803   tree lhs = gimple_assign_lhs (stmt);
3804   tree lhs_type = TREE_TYPE (lhs);
3805   tree rhs1 = gimple_assign_rhs1 (stmt);
3806   tree rhs1_type = TREE_TYPE (rhs1);
3807   bool res = false;
3808
3809   if (!useless_type_conversion_p (lhs_type, rhs1_type))
3810     {
3811       error ("non-trivial conversion at assignment");
3812       debug_generic_expr (lhs_type);
3813       debug_generic_expr (rhs1_type);
3814       return true;
3815     }
3816
3817   if (gimple_clobber_p (stmt)
3818       && !(DECL_P (lhs) || TREE_CODE (lhs) == MEM_REF))
3819     {
3820       error ("non-decl/MEM_REF LHS in clobber statement");
3821       debug_generic_expr (lhs);
3822       return true;
3823     }
3824
3825   if (handled_component_p (lhs))
3826     res |= verify_types_in_gimple_reference (lhs, true);
3827
3828   /* Special codes we cannot handle via their class.  */
3829   switch (rhs_code)
3830     {
3831     case ADDR_EXPR:
3832       {
3833         tree op = TREE_OPERAND (rhs1, 0);
3834         if (!is_gimple_addressable (op))
3835           {
3836             error ("invalid operand in unary expression");
3837             return true;
3838           }
3839
3840         /* Technically there is no longer a need for matching types, but
3841            gimple hygiene asks for this check.  In LTO we can end up
3842            combining incompatible units and thus end up with addresses
3843            of globals that change their type to a common one.  */
3844         if (!in_lto_p
3845             && !types_compatible_p (TREE_TYPE (op),
3846                                     TREE_TYPE (TREE_TYPE (rhs1)))
3847             && !one_pointer_to_useless_type_conversion_p (TREE_TYPE (rhs1),
3848                                                           TREE_TYPE (op)))
3849           {
3850             error ("type mismatch in address expression");
3851             debug_generic_stmt (TREE_TYPE (rhs1));
3852             debug_generic_stmt (TREE_TYPE (op));
3853             return true;
3854           }
3855
3856         return verify_types_in_gimple_reference (op, true);
3857       }
3858
3859     /* tcc_reference  */
3860     case INDIRECT_REF:
3861       error ("INDIRECT_REF in gimple IL");
3862       return true;
3863
3864     case COMPONENT_REF:
3865     case BIT_FIELD_REF:
3866     case ARRAY_REF:
3867     case ARRAY_RANGE_REF:
3868     case VIEW_CONVERT_EXPR:
3869     case REALPART_EXPR:
3870     case IMAGPART_EXPR:
3871     case TARGET_MEM_REF:
3872     case MEM_REF:
3873       if (!is_gimple_reg (lhs)
3874           && is_gimple_reg_type (TREE_TYPE (lhs)))
3875         {
3876           error ("invalid rhs for gimple memory store");
3877           debug_generic_stmt (lhs);
3878           debug_generic_stmt (rhs1);
3879           return true;
3880         }
3881       return res || verify_types_in_gimple_reference (rhs1, false);
3882
3883     /* tcc_constant  */
3884     case SSA_NAME:
3885     case INTEGER_CST:
3886     case REAL_CST:
3887     case FIXED_CST:
3888     case COMPLEX_CST:
3889     case VECTOR_CST:
3890     case STRING_CST:
3891       return res;
3892
3893     /* tcc_declaration  */
3894     case CONST_DECL:
3895       return res;
3896     case VAR_DECL:
3897     case PARM_DECL:
3898       if (!is_gimple_reg (lhs)
3899           && !is_gimple_reg (rhs1)
3900           && is_gimple_reg_type (TREE_TYPE (lhs)))
3901         {
3902           error ("invalid rhs for gimple memory store");
3903           debug_generic_stmt (lhs);
3904           debug_generic_stmt (rhs1);
3905           return true;
3906         }
3907       return res;
3908
3909     case CONSTRUCTOR:
3910       if (TREE_CODE (rhs1_type) == VECTOR_TYPE)
3911         {
3912           unsigned int i;
3913           tree elt_i, elt_v, elt_t = NULL_TREE;
3914
3915           if (CONSTRUCTOR_NELTS (rhs1) == 0)
3916             return res;
3917           /* For vector CONSTRUCTORs we require that either it is empty
3918              CONSTRUCTOR, or it is a CONSTRUCTOR of smaller vector elements
3919              (then the element count must be correct to cover the whole
3920              outer vector and index must be NULL on all elements, or it is
3921              a CONSTRUCTOR of scalar elements, where we as an exception allow
3922              smaller number of elements (assuming zero filling) and
3923              consecutive indexes as compared to NULL indexes (such
3924              CONSTRUCTORs can appear in the IL from FEs).  */
3925           FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (rhs1), i, elt_i, elt_v)
3926             {
3927               if (elt_t == NULL_TREE)
3928                 {
3929                   elt_t = TREE_TYPE (elt_v);
3930                   if (TREE_CODE (elt_t) == VECTOR_TYPE)
3931                     {
3932                       tree elt_t = TREE_TYPE (elt_v);
3933                       if (!useless_type_conversion_p (TREE_TYPE (rhs1_type),
3934                                                       TREE_TYPE (elt_t)))
3935                         {
3936                           error ("incorrect type of vector CONSTRUCTOR"
3937                                  " elements");
3938                           debug_generic_stmt (rhs1);
3939                           return true;
3940                         }
3941                       else if (CONSTRUCTOR_NELTS (rhs1)
3942                                * TYPE_VECTOR_SUBPARTS (elt_t)
3943                                != TYPE_VECTOR_SUBPARTS (rhs1_type))
3944                         {
3945                           error ("incorrect number of vector CONSTRUCTOR"
3946                                  " elements");
3947                           debug_generic_stmt (rhs1);
3948                           return true;
3949                         }
3950                     }
3951                   else if (!useless_type_conversion_p (TREE_TYPE (rhs1_type),
3952                                                        elt_t))
3953                     {
3954                       error ("incorrect type of vector CONSTRUCTOR elements");
3955                       debug_generic_stmt (rhs1);
3956                       return true;
3957                     }
3958                   else if (CONSTRUCTOR_NELTS (rhs1)
3959                            > TYPE_VECTOR_SUBPARTS (rhs1_type))
3960                     {
3961                       error ("incorrect number of vector CONSTRUCTOR elements");
3962                       debug_generic_stmt (rhs1);
3963                       return true;
3964                     }
3965                 }
3966               else if (!useless_type_conversion_p (elt_t, TREE_TYPE (elt_v)))
3967                 {
3968                   error ("incorrect type of vector CONSTRUCTOR elements");
3969                   debug_generic_stmt (rhs1);
3970                   return true;
3971                 }
3972               if (elt_i != NULL_TREE
3973                   && (TREE_CODE (elt_t) == VECTOR_TYPE
3974                       || TREE_CODE (elt_i) != INTEGER_CST
3975                       || compare_tree_int (elt_i, i) != 0))
3976                 {
3977                   error ("vector CONSTRUCTOR with non-NULL element index");
3978                   debug_generic_stmt (rhs1);
3979                   return true;
3980                 }
3981             }
3982         }
3983       return res;
3984     case OBJ_TYPE_REF:
3985     case ASSERT_EXPR:
3986     case WITH_SIZE_EXPR:
3987       /* FIXME.  */
3988       return res;
3989
3990     default:;
3991     }
3992
3993   return res;
3994 }
3995
3996 /* Verify the contents of a GIMPLE_ASSIGN STMT.  Returns true when there
3997    is a problem, otherwise false.  */
3998
3999 static bool
4000 verify_gimple_assign (gimple stmt)
4001 {
4002   switch (gimple_assign_rhs_class (stmt))
4003     {
4004     case GIMPLE_SINGLE_RHS:
4005       return verify_gimple_assign_single (stmt);
4006
4007     case GIMPLE_UNARY_RHS:
4008       return verify_gimple_assign_unary (stmt);
4009
4010     case GIMPLE_BINARY_RHS:
4011       return verify_gimple_assign_binary (stmt);
4012
4013     case GIMPLE_TERNARY_RHS:
4014       return verify_gimple_assign_ternary (stmt);
4015
4016     default:
4017       gcc_unreachable ();
4018     }
4019 }
4020
4021 /* Verify the contents of a GIMPLE_RETURN STMT.  Returns true when there
4022    is a problem, otherwise false.  */
4023
4024 static bool
4025 verify_gimple_return (gimple stmt)
4026 {
4027   tree op = gimple_return_retval (stmt);
4028   tree restype = TREE_TYPE (TREE_TYPE (cfun->decl));
4029
4030   /* We cannot test for present return values as we do not fix up missing
4031      return values from the original source.  */
4032   if (op == NULL)
4033     return false;
4034
4035   if (!is_gimple_val (op)
4036       && TREE_CODE (op) != RESULT_DECL)
4037     {
4038       error ("invalid operand in return statement");
4039       debug_generic_stmt (op);
4040       return true;
4041     }
4042
4043   if ((TREE_CODE (op) == RESULT_DECL
4044        && DECL_BY_REFERENCE (op))
4045       || (TREE_CODE (op) == SSA_NAME
4046           && SSA_NAME_VAR (op)
4047           && TREE_CODE (SSA_NAME_VAR (op)) == RESULT_DECL
4048           && DECL_BY_REFERENCE (SSA_NAME_VAR (op))))
4049     op = TREE_TYPE (op);
4050
4051   if (!useless_type_conversion_p (restype, TREE_TYPE (op)))
4052     {
4053       error ("invalid conversion in return statement");
4054       debug_generic_stmt (restype);
4055       debug_generic_stmt (TREE_TYPE (op));
4056       return true;
4057     }
4058
4059   return false;
4060 }
4061
4062
4063 /* Verify the contents of a GIMPLE_GOTO STMT.  Returns true when there
4064    is a problem, otherwise false.  */
4065
4066 static bool
4067 verify_gimple_goto (gimple stmt)
4068 {
4069   tree dest = gimple_goto_dest (stmt);
4070
4071   /* ???  We have two canonical forms of direct goto destinations, a
4072      bare LABEL_DECL and an ADDR_EXPR of a LABEL_DECL.  */
4073   if (TREE_CODE (dest) != LABEL_DECL
4074       && (!is_gimple_val (dest)
4075           || !POINTER_TYPE_P (TREE_TYPE (dest))))
4076     {
4077       error ("goto destination is neither a label nor a pointer");
4078       return true;
4079     }
4080
4081   return false;
4082 }
4083
4084 /* Verify the contents of a GIMPLE_SWITCH STMT.  Returns true when there
4085    is a problem, otherwise false.  */
4086
4087 static bool
4088 verify_gimple_switch (gimple stmt)
4089 {
4090   unsigned int i, n;
4091   tree elt, prev_upper_bound = NULL_TREE;
4092   tree index_type, elt_type = NULL_TREE;
4093
4094   if (!is_gimple_val (gimple_switch_index (stmt)))
4095     {
4096       error ("invalid operand to switch statement");
4097       debug_generic_stmt (gimple_switch_index (stmt));
4098       return true;
4099     }
4100
4101   index_type = TREE_TYPE (gimple_switch_index (stmt));
4102   if (! INTEGRAL_TYPE_P (index_type))
4103     {
4104       error ("non-integral type switch statement");
4105       debug_generic_expr (index_type);
4106       return true;
4107     }
4108
4109   elt = gimple_switch_label (stmt, 0);
4110   if (CASE_LOW (elt) != NULL_TREE || CASE_HIGH (elt) != NULL_TREE)
4111     {
4112       error ("invalid default case label in switch statement");
4113       debug_generic_expr (elt);
4114       return true;
4115     }
4116
4117   n = gimple_switch_num_labels (stmt);
4118   for (i = 1; i < n; i++)
4119     {
4120       elt = gimple_switch_label (stmt, i);
4121
4122       if (! CASE_LOW (elt))
4123         {
4124           error ("invalid case label in switch statement");
4125           debug_generic_expr (elt);
4126           return true;
4127         }
4128       if (CASE_HIGH (elt)
4129           && ! tree_int_cst_lt (CASE_LOW (elt), CASE_HIGH (elt)))
4130         {
4131           error ("invalid case range in switch statement");
4132           debug_generic_expr (elt);
4133           return true;
4134         }
4135
4136       if (elt_type)
4137         {
4138           if (TREE_TYPE (CASE_LOW (elt)) != elt_type
4139               || (CASE_HIGH (elt) && TREE_TYPE (CASE_HIGH (elt)) != elt_type))
4140             {
4141               error ("type mismatch for case label in switch statement");
4142               debug_generic_expr (elt);
4143               return true;
4144             }
4145         }
4146       else
4147         {
4148           elt_type = TREE_TYPE (CASE_LOW (elt));
4149           if (TYPE_PRECISION (index_type) < TYPE_PRECISION (elt_type))
4150             {
4151               error ("type precision mismatch in switch statement");
4152               return true;
4153             }
4154         }
4155
4156       if (prev_upper_bound)
4157         {
4158           if (! tree_int_cst_lt (prev_upper_bound, CASE_LOW (elt)))
4159             {
4160               error ("case labels not sorted in switch statement");
4161               return true;
4162             }
4163         }
4164
4165       prev_upper_bound = CASE_HIGH (elt);
4166       if (! prev_upper_bound)
4167         prev_upper_bound = CASE_LOW (elt);
4168     }
4169
4170   return false;
4171 }
4172
4173 /* Verify a gimple debug statement STMT.
4174    Returns true if anything is wrong.  */
4175
4176 static bool
4177 verify_gimple_debug (gimple stmt ATTRIBUTE_UNUSED)
4178 {
4179   /* There isn't much that could be wrong in a gimple debug stmt.  A
4180      gimple debug bind stmt, for example, maps a tree, that's usually
4181      a VAR_DECL or a PARM_DECL, but that could also be some scalarized
4182      component or member of an aggregate type, to another tree, that
4183      can be an arbitrary expression.  These stmts expand into debug
4184      insns, and are converted to debug notes by var-tracking.c.  */
4185   return false;
4186 }
4187
4188 /* Verify a gimple label statement STMT.
4189    Returns true if anything is wrong.  */
4190
4191 static bool
4192 verify_gimple_label (gimple stmt)
4193 {
4194   tree decl = gimple_label_label (stmt);
4195   int uid;
4196   bool err = false;
4197
4198   if (TREE_CODE (decl) != LABEL_DECL)
4199     return true;
4200
4201   uid = LABEL_DECL_UID (decl);
4202   if (cfun->cfg
4203       && (uid == -1 || (*label_to_block_map)[uid] != gimple_bb (stmt)))
4204     {
4205       error ("incorrect entry in label_to_block_map");
4206       err |= true;
4207     }
4208
4209   uid = EH_LANDING_PAD_NR (decl);
4210   if (uid)
4211     {
4212       eh_landing_pad lp = get_eh_landing_pad_from_number (uid);
4213       if (decl != lp->post_landing_pad)
4214         {
4215           error ("incorrect setting of landing pad number");
4216           err |= true;
4217         }
4218     }
4219
4220   return err;
4221 }
4222
4223 /* Verify the GIMPLE statement STMT.  Returns true if there is an
4224    error, otherwise false.  */
4225
4226 static bool
4227 verify_gimple_stmt (gimple stmt)
4228 {
4229   switch (gimple_code (stmt))
4230     {
4231     case GIMPLE_ASSIGN:
4232       return verify_gimple_assign (stmt);
4233
4234     case GIMPLE_LABEL:
4235       return verify_gimple_label (stmt);
4236
4237     case GIMPLE_CALL:
4238       return verify_gimple_call (stmt);
4239
4240     case GIMPLE_COND:
4241       if (TREE_CODE_CLASS (gimple_cond_code (stmt)) != tcc_comparison)
4242         {
4243           error ("invalid comparison code in gimple cond");
4244           return true;
4245         }
4246       if (!(!gimple_cond_true_label (stmt)
4247             || TREE_CODE (gimple_cond_true_label (stmt)) == LABEL_DECL)
4248           || !(!gimple_cond_false_label (stmt)
4249                || TREE_CODE (gimple_cond_false_label (stmt)) == LABEL_DECL))
4250         {
4251           error ("invalid labels in gimple cond");
4252           return true;
4253         }
4254           
4255       return verify_gimple_comparison (boolean_type_node,
4256                                        gimple_cond_lhs (stmt),
4257                                        gimple_cond_rhs (stmt));
4258
4259     case GIMPLE_GOTO:
4260       return verify_gimple_goto (stmt);
4261
4262     case GIMPLE_SWITCH:
4263       return verify_gimple_switch (stmt);
4264
4265     case GIMPLE_RETURN:
4266       return verify_gimple_return (stmt);
4267
4268     case GIMPLE_ASM:
4269       return false;
4270
4271     case GIMPLE_TRANSACTION:
4272       return verify_gimple_transaction (stmt);
4273
4274     /* Tuples that do not have tree operands.  */
4275     case GIMPLE_NOP:
4276     case GIMPLE_PREDICT:
4277     case GIMPLE_RESX:
4278     case GIMPLE_EH_DISPATCH:
4279     case GIMPLE_EH_MUST_NOT_THROW:
4280       return false;
4281
4282     CASE_GIMPLE_OMP:
4283       /* OpenMP directives are validated by the FE and never operated
4284          on by the optimizers.  Furthermore, GIMPLE_OMP_FOR may contain
4285          non-gimple expressions when the main index variable has had
4286          its address taken.  This does not affect the loop itself
4287          because the header of an GIMPLE_OMP_FOR is merely used to determine
4288          how to setup the parallel iteration.  */
4289       return false;
4290
4291     case GIMPLE_DEBUG:
4292       return verify_gimple_debug (stmt);
4293
4294     default:
4295       gcc_unreachable ();
4296     }
4297 }
4298
4299 /* Verify the contents of a GIMPLE_PHI.  Returns true if there is a problem,
4300    and false otherwise.  */
4301
4302 static bool
4303 verify_gimple_phi (gimple phi)
4304 {
4305   bool err = false;
4306   unsigned i;
4307   tree phi_result = gimple_phi_result (phi);
4308   bool virtual_p;
4309
4310   if (!phi_result)
4311     {
4312       error ("invalid PHI result");
4313       return true;
4314     }
4315
4316   virtual_p = virtual_operand_p (phi_result);
4317   if (TREE_CODE (phi_result) != SSA_NAME
4318       || (virtual_p
4319           && SSA_NAME_VAR (phi_result) != gimple_vop (cfun)))
4320     {
4321       error ("invalid PHI result");
4322       err = true;
4323     }
4324
4325   for (i = 0; i < gimple_phi_num_args (phi); i++)
4326     {
4327       tree t = gimple_phi_arg_def (phi, i);
4328
4329       if (!t)
4330         {
4331           error ("missing PHI def");
4332           err |= true;
4333           continue;
4334         }
4335       /* Addressable variables do have SSA_NAMEs but they
4336          are not considered gimple values.  */
4337       else if ((TREE_CODE (t) == SSA_NAME
4338                 && virtual_p != virtual_operand_p (t))
4339                || (virtual_p
4340                    && (TREE_CODE (t) != SSA_NAME
4341                        || SSA_NAME_VAR (t) != gimple_vop (cfun)))
4342                || (!virtual_p
4343                    && !is_gimple_val (t)))
4344         {
4345           error ("invalid PHI argument");
4346           debug_generic_expr (t);
4347           err |= true;
4348         }
4349 #ifdef ENABLE_TYPES_CHECKING
4350       if (!useless_type_conversion_p (TREE_TYPE (phi_result), TREE_TYPE (t)))
4351         {
4352           error ("incompatible types in PHI argument %u", i);
4353           debug_generic_stmt (TREE_TYPE (phi_result));
4354           debug_generic_stmt (TREE_TYPE (t));
4355           err |= true;
4356         }
4357 #endif
4358     }
4359
4360   return err;
4361 }
4362
4363 /* Verify the GIMPLE statements inside the sequence STMTS.  */
4364
4365 static bool
4366 verify_gimple_in_seq_2 (gimple_seq stmts)
4367 {
4368   gimple_stmt_iterator ittr;
4369   bool err = false;
4370
4371   for (ittr = gsi_start (stmts); !gsi_end_p (ittr); gsi_next (&ittr))
4372     {
4373       gimple stmt = gsi_stmt (ittr);
4374
4375       switch (gimple_code (stmt))
4376         {
4377         case GIMPLE_BIND:
4378           err |= verify_gimple_in_seq_2 (gimple_bind_body (stmt));
4379           break;
4380
4381         case GIMPLE_TRY:
4382           err |= verify_gimple_in_seq_2 (gimple_try_eval (stmt));
4383           err |= verify_gimple_in_seq_2 (gimple_try_cleanup (stmt));
4384           break;
4385
4386         case GIMPLE_EH_FILTER:
4387           err |= verify_gimple_in_seq_2 (gimple_eh_filter_failure (stmt));
4388           break;
4389
4390         case GIMPLE_EH_ELSE:
4391           err |= verify_gimple_in_seq_2 (gimple_eh_else_n_body (stmt));
4392           err |= verify_gimple_in_seq_2 (gimple_eh_else_e_body (stmt));
4393           break;
4394
4395         case GIMPLE_CATCH:
4396           err |= verify_gimple_in_seq_2 (gimple_catch_handler (stmt));
4397           break;
4398
4399         case GIMPLE_TRANSACTION:
4400           err |= verify_gimple_transaction (stmt);
4401           break;
4402
4403         default:
4404           {
4405             bool err2 = verify_gimple_stmt (stmt);
4406             if (err2)
4407               debug_gimple_stmt (stmt);
4408             err |= err2;
4409           }
4410         }
4411     }
4412
4413   return err;
4414 }
4415
4416 /* Verify the contents of a GIMPLE_TRANSACTION.  Returns true if there
4417    is a problem, otherwise false.  */
4418
4419 static bool
4420 verify_gimple_transaction (gimple stmt)
4421 {
4422   tree lab = gimple_transaction_label (stmt);
4423   if (lab != NULL && TREE_CODE (lab) != LABEL_DECL)
4424     return true;
4425   return verify_gimple_in_seq_2 (gimple_transaction_body (stmt));
4426 }
4427
4428
4429 /* Verify the GIMPLE statements inside the statement list STMTS.  */
4430
4431 DEBUG_FUNCTION void
4432 verify_gimple_in_seq (gimple_seq stmts)
4433 {
4434   timevar_push (TV_TREE_STMT_VERIFY);
4435   if (verify_gimple_in_seq_2 (stmts))
4436     internal_error ("verify_gimple failed");
4437   timevar_pop (TV_TREE_STMT_VERIFY);
4438 }
4439
4440 /* Return true when the T can be shared.  */
4441
4442 bool
4443 tree_node_can_be_shared (tree t)
4444 {
4445   if (IS_TYPE_OR_DECL_P (t)
4446       || is_gimple_min_invariant (t)
4447       || TREE_CODE (t) == SSA_NAME
4448       || t == error_mark_node
4449       || TREE_CODE (t) == IDENTIFIER_NODE)
4450     return true;
4451
4452   if (TREE_CODE (t) == CASE_LABEL_EXPR)
4453     return true;
4454
4455   if (DECL_P (t))
4456     return true;
4457
4458   return false;
4459 }
4460
4461 /* Called via walk_tree.  Verify tree sharing.  */
4462
4463 static tree
4464 verify_node_sharing_1 (tree *tp, int *walk_subtrees, void *data)
4465 {
4466   struct pointer_set_t *visited = (struct pointer_set_t *) data;
4467
4468   if (tree_node_can_be_shared (*tp))
4469     {
4470       *walk_subtrees = false;
4471       return NULL;
4472     }
4473
4474   if (pointer_set_insert (visited, *tp))
4475     return *tp;
4476
4477   return NULL;
4478 }
4479
4480 /* Called via walk_gimple_stmt.  Verify tree sharing.  */
4481
4482 static tree
4483 verify_node_sharing (tree *tp, int *walk_subtrees, void *data)
4484 {
4485   struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
4486   return verify_node_sharing_1 (tp, walk_subtrees, wi->info);
4487 }
4488
4489 static bool eh_error_found;
4490 static int
4491 verify_eh_throw_stmt_node (void **slot, void *data)
4492 {
4493   struct throw_stmt_node *node = (struct throw_stmt_node *)*slot;
4494   struct pointer_set_t *visited = (struct pointer_set_t *) data;
4495
4496   if (!pointer_set_contains (visited, node->stmt))
4497     {
4498       error ("dead STMT in EH table");
4499       debug_gimple_stmt (node->stmt);
4500       eh_error_found = true;
4501     }
4502   return 1;
4503 }
4504
4505 /* Verify if the location LOCs block is in BLOCKS.  */
4506
4507 static bool
4508 verify_location (pointer_set_t *blocks, location_t loc)
4509 {
4510   tree block = LOCATION_BLOCK (loc);
4511   if (block != NULL_TREE
4512       && !pointer_set_contains (blocks, block))
4513     {
4514       error ("location references block not in block tree");
4515       return true;
4516     }
4517   if (block != NULL_TREE)
4518     return verify_location (blocks, BLOCK_SOURCE_LOCATION (block));
4519   return false;
4520 }
4521
4522 /* Called via walk_tree.  Verify that expressions have no blocks.  */
4523
4524 static tree
4525 verify_expr_no_block (tree *tp, int *walk_subtrees, void *)
4526 {
4527   if (!EXPR_P (*tp))
4528     {
4529       *walk_subtrees = false;
4530       return NULL;
4531     }
4532
4533   location_t loc = EXPR_LOCATION (*tp);
4534   if (LOCATION_BLOCK (loc) != NULL)
4535     return *tp;
4536
4537   return NULL;
4538 }
4539
4540 /* Called via walk_tree.  Verify locations of expressions.  */
4541
4542 static tree
4543 verify_expr_location_1 (tree *tp, int *walk_subtrees, void *data)
4544 {
4545   struct pointer_set_t *blocks = (struct pointer_set_t *) data;
4546
4547   if (TREE_CODE (*tp) == VAR_DECL
4548       && DECL_HAS_DEBUG_EXPR_P (*tp))
4549     {
4550       tree t = DECL_DEBUG_EXPR (*tp);
4551       tree addr = walk_tree (&t, verify_expr_no_block, NULL, NULL);
4552       if (addr)
4553         return addr;
4554     }
4555   if ((TREE_CODE (*tp) == VAR_DECL
4556        || TREE_CODE (*tp) == PARM_DECL
4557        || TREE_CODE (*tp) == RESULT_DECL)
4558       && DECL_HAS_VALUE_EXPR_P (*tp))
4559     {
4560       tree t = DECL_VALUE_EXPR (*tp);
4561       tree addr = walk_tree (&t, verify_expr_no_block, NULL, NULL);
4562       if (addr)
4563         return addr;
4564     }
4565
4566   if (!EXPR_P (*tp))
4567     {
4568       *walk_subtrees = false;
4569       return NULL;
4570     }
4571
4572   location_t loc = EXPR_LOCATION (*tp);
4573   if (verify_location (blocks, loc))
4574     return *tp;
4575
4576   return NULL;
4577 }
4578
4579 /* Called via walk_gimple_op.  Verify locations of expressions.  */
4580
4581 static tree
4582 verify_expr_location (tree *tp, int *walk_subtrees, void *data)
4583 {
4584   struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
4585   return verify_expr_location_1 (tp, walk_subtrees, wi->info);
4586 }
4587
4588 /* Insert all subblocks of BLOCK into BLOCKS and recurse.  */
4589
4590 static void
4591 collect_subblocks (pointer_set_t *blocks, tree block)
4592 {
4593   tree t;
4594   for (t = BLOCK_SUBBLOCKS (block); t; t = BLOCK_CHAIN (t))
4595     {
4596       pointer_set_insert (blocks, t);
4597       collect_subblocks (blocks, t);
4598     }
4599 }
4600
4601 /* Verify the GIMPLE statements in the CFG of FN.  */
4602
4603 DEBUG_FUNCTION void
4604 verify_gimple_in_cfg (struct function *fn)
4605 {
4606   basic_block bb;
4607   bool err = false;
4608   struct pointer_set_t *visited, *visited_stmts, *blocks;
4609
4610   timevar_push (TV_TREE_STMT_VERIFY);
4611   visited = pointer_set_create ();
4612   visited_stmts = pointer_set_create ();
4613
4614   /* Collect all BLOCKs referenced by the BLOCK tree of FN.  */
4615   blocks = pointer_set_create ();
4616   if (DECL_INITIAL (fn->decl))
4617     {
4618       pointer_set_insert (blocks, DECL_INITIAL (fn->decl));
4619       collect_subblocks (blocks, DECL_INITIAL (fn->decl));
4620     }
4621
4622   FOR_EACH_BB_FN (bb, fn)
4623     {
4624       gimple_stmt_iterator gsi;
4625
4626       for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
4627         {
4628           gimple phi = gsi_stmt (gsi);
4629           bool err2 = false;
4630           unsigned i;
4631
4632           pointer_set_insert (visited_stmts, phi);
4633
4634           if (gimple_bb (phi) != bb)
4635             {
4636               error ("gimple_bb (phi) is set to a wrong basic block");
4637               err2 = true;
4638             }
4639
4640           err2 |= verify_gimple_phi (phi);
4641
4642           /* Only PHI arguments have locations.  */
4643           if (gimple_location (phi) != UNKNOWN_LOCATION)
4644             {
4645               error ("PHI node with location");
4646               err2 = true;
4647             }
4648
4649           for (i = 0; i < gimple_phi_num_args (phi); i++)
4650             {
4651               tree arg = gimple_phi_arg_def (phi, i);
4652               tree addr = walk_tree (&arg, verify_node_sharing_1,
4653                                      visited, NULL);
4654               if (addr)
4655                 {
4656                   error ("incorrect sharing of tree nodes");
4657                   debug_generic_expr (addr);
4658                   err2 |= true;
4659                 }
4660               location_t loc = gimple_phi_arg_location (phi, i);
4661               if (virtual_operand_p (gimple_phi_result (phi))
4662                   && loc != UNKNOWN_LOCATION)
4663                 {
4664                   error ("virtual PHI with argument locations");
4665                   err2 = true;
4666                 }
4667               addr = walk_tree (&arg, verify_expr_location_1, blocks, NULL);
4668               if (addr)
4669                 {
4670                   debug_generic_expr (addr);
4671                   err2 = true;
4672                 }
4673               err2 |= verify_location (blocks, loc);
4674             }
4675
4676           if (err2)
4677             debug_gimple_stmt (phi);
4678           err |= err2;
4679         }
4680
4681       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
4682         {
4683           gimple stmt = gsi_stmt (gsi);
4684           bool err2 = false;
4685           struct walk_stmt_info wi;
4686           tree addr;
4687           int lp_nr;
4688
4689           pointer_set_insert (visited_stmts, stmt);
4690
4691           if (gimple_bb (stmt) != bb)
4692             {
4693               error ("gimple_bb (stmt) is set to a wrong basic block");
4694               err2 = true;
4695             }
4696
4697           err2 |= verify_gimple_stmt (stmt);
4698           err2 |= verify_location (blocks, gimple_location (stmt));
4699
4700           memset (&wi, 0, sizeof (wi));
4701           wi.info = (void *) visited;
4702           addr = walk_gimple_op (stmt, verify_node_sharing, &wi);
4703           if (addr)
4704             {
4705               error ("incorrect sharing of tree nodes");
4706               debug_generic_expr (addr);
4707               err2 |= true;
4708             }
4709
4710           memset (&wi, 0, sizeof (wi));
4711           wi.info = (void *) blocks;
4712           addr = walk_gimple_op (stmt, verify_expr_location, &wi);
4713           if (addr)
4714             {
4715               debug_generic_expr (addr);
4716               err2 |= true;
4717             }
4718
4719           /* ???  Instead of not checking these stmts at all the walker
4720              should know its context via wi.  */
4721           if (!is_gimple_debug (stmt)
4722               && !is_gimple_omp (stmt))
4723             {
4724               memset (&wi, 0, sizeof (wi));
4725               addr = walk_gimple_op (stmt, verify_expr, &wi);
4726               if (addr)
4727                 {
4728                   debug_generic_expr (addr);
4729                   inform (gimple_location (stmt), "in statement");
4730                   err2 |= true;
4731                 }
4732             }
4733
4734           /* If the statement is marked as part of an EH region, then it is
4735              expected that the statement could throw.  Verify that when we
4736              have optimizations that simplify statements such that we prove
4737              that they cannot throw, that we update other data structures
4738              to match.  */
4739           lp_nr = lookup_stmt_eh_lp (stmt);
4740           if (lp_nr != 0)
4741             {
4742               if (!stmt_could_throw_p (stmt))
4743                 {
4744                   error ("statement marked for throw, but doesn%'t");
4745                   err2 |= true;
4746                 }
4747               else if (lp_nr > 0
4748                        && !gsi_one_before_end_p (gsi)
4749                        && stmt_can_throw_internal (stmt))
4750                 {
4751                   error ("statement marked for throw in middle of block");
4752                   err2 |= true;
4753                 }
4754             }
4755
4756           if (err2)
4757             debug_gimple_stmt (stmt);
4758           err |= err2;
4759         }
4760     }
4761
4762   eh_error_found = false;
4763   if (get_eh_throw_stmt_table (cfun))
4764     htab_traverse (get_eh_throw_stmt_table (cfun),
4765                    verify_eh_throw_stmt_node,
4766                    visited_stmts);
4767
4768   if (err || eh_error_found)
4769     internal_error ("verify_gimple failed");
4770
4771   pointer_set_destroy (visited);
4772   pointer_set_destroy (visited_stmts);
4773   pointer_set_destroy (blocks);
4774   verify_histograms ();
4775   timevar_pop (TV_TREE_STMT_VERIFY);
4776 }
4777
4778
4779 /* Verifies that the flow information is OK.  */
4780
4781 static int
4782 gimple_verify_flow_info (void)
4783 {
4784   int err = 0;
4785   basic_block bb;
4786   gimple_stmt_iterator gsi;
4787   gimple stmt;
4788   edge e;
4789   edge_iterator ei;
4790
4791   if (ENTRY_BLOCK_PTR->il.gimple.seq || ENTRY_BLOCK_PTR->il.gimple.phi_nodes)
4792     {
4793       error ("ENTRY_BLOCK has IL associated with it");
4794       err = 1;
4795     }
4796
4797   if (EXIT_BLOCK_PTR->il.gimple.seq || EXIT_BLOCK_PTR->il.gimple.phi_nodes)
4798     {
4799       error ("EXIT_BLOCK has IL associated with it");
4800       err = 1;
4801     }
4802
4803   FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
4804     if (e->flags & EDGE_FALLTHRU)
4805       {
4806         error ("fallthru to exit from bb %d", e->src->index);
4807         err = 1;
4808       }
4809
4810   FOR_EACH_BB (bb)
4811     {
4812       bool found_ctrl_stmt = false;
4813
4814       stmt = NULL;
4815
4816       /* Skip labels on the start of basic block.  */
4817       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
4818         {
4819           tree label;
4820           gimple prev_stmt = stmt;
4821
4822           stmt = gsi_stmt (gsi);
4823
4824           if (gimple_code (stmt) != GIMPLE_LABEL)
4825             break;
4826
4827           label = gimple_label_label (stmt);
4828           if (prev_stmt && DECL_NONLOCAL (label))
4829             {
4830               error ("nonlocal label ");
4831               print_generic_expr (stderr, label, 0);
4832               fprintf (stderr, " is not first in a sequence of labels in bb %d",
4833                        bb->index);
4834               err = 1;
4835             }
4836
4837           if (prev_stmt && EH_LANDING_PAD_NR (label) != 0)
4838             {
4839               error ("EH landing pad label ");
4840               print_generic_expr (stderr, label, 0);
4841               fprintf (stderr, " is not first in a sequence of labels in bb %d",
4842                        bb->index);
4843               err = 1;
4844             }
4845
4846           if (label_to_block (label) != bb)
4847             {
4848               error ("label ");
4849               print_generic_expr (stderr, label, 0);
4850               fprintf (stderr, " to block does not match in bb %d",
4851                        bb->index);
4852               err = 1;
4853             }
4854
4855           if (decl_function_context (label) != current_function_decl)
4856             {
4857               error ("label ");
4858               print_generic_expr (stderr, label, 0);
4859               fprintf (stderr, " has incorrect context in bb %d",
4860                        bb->index);
4861               err = 1;
4862             }
4863         }
4864
4865       /* Verify that body of basic block BB is free of control flow.  */
4866       for (; !gsi_end_p (gsi); gsi_next (&gsi))
4867         {
4868           gimple stmt = gsi_stmt (gsi);
4869
4870           if (found_ctrl_stmt)
4871             {
4872               error ("control flow in the middle of basic block %d",
4873                      bb->index);
4874               err = 1;
4875             }
4876
4877           if (stmt_ends_bb_p (stmt))
4878             found_ctrl_stmt = true;
4879
4880           if (gimple_code (stmt) == GIMPLE_LABEL)
4881             {
4882               error ("label ");
4883               print_generic_expr (stderr, gimple_label_label (stmt), 0);
4884               fprintf (stderr, " in the middle of basic block %d", bb->index);
4885               err = 1;
4886             }
4887         }
4888
4889       gsi = gsi_last_bb (bb);
4890       if (gsi_end_p (gsi))
4891         continue;
4892
4893       stmt = gsi_stmt (gsi);
4894
4895       if (gimple_code (stmt) == GIMPLE_LABEL)
4896         continue;
4897
4898       err |= verify_eh_edges (stmt);
4899
4900       if (is_ctrl_stmt (stmt))
4901         {
4902           FOR_EACH_EDGE (e, ei, bb->succs)
4903             if (e->flags & EDGE_FALLTHRU)
4904               {
4905                 error ("fallthru edge after a control statement in bb %d",
4906                        bb->index);
4907                 err = 1;
4908               }
4909         }
4910
4911       if (gimple_code (stmt) != GIMPLE_COND)
4912         {
4913           /* Verify that there are no edges with EDGE_TRUE/FALSE_FLAG set
4914              after anything else but if statement.  */
4915           FOR_EACH_EDGE (e, ei, bb->succs)
4916             if (e->flags & (EDGE_TRUE_VALUE | EDGE_FALSE_VALUE))
4917               {
4918                 error ("true/false edge after a non-GIMPLE_COND in bb %d",
4919                        bb->index);
4920                 err = 1;
4921               }
4922         }
4923
4924       switch (gimple_code (stmt))
4925         {
4926         case GIMPLE_COND:
4927           {
4928             edge true_edge;
4929             edge false_edge;
4930
4931             extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
4932
4933             if (!true_edge
4934                 || !false_edge
4935                 || !(true_edge->flags & EDGE_TRUE_VALUE)
4936                 || !(false_edge->flags & EDGE_FALSE_VALUE)
4937                 || (true_edge->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL))
4938                 || (false_edge->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL))
4939                 || EDGE_COUNT (bb->succs) >= 3)
4940               {
4941                 error ("wrong outgoing edge flags at end of bb %d",
4942                        bb->index);
4943                 err = 1;
4944               }
4945           }
4946           break;
4947
4948         case GIMPLE_GOTO:
4949           if (simple_goto_p (stmt))
4950             {
4951               error ("explicit goto at end of bb %d", bb->index);
4952               err = 1;
4953             }
4954           else
4955             {
4956               /* FIXME.  We should double check that the labels in the
4957                  destination blocks have their address taken.  */
4958               FOR_EACH_EDGE (e, ei, bb->succs)
4959                 if ((e->flags & (EDGE_FALLTHRU | EDGE_TRUE_VALUE
4960                                  | EDGE_FALSE_VALUE))
4961                     || !(e->flags & EDGE_ABNORMAL))
4962                   {
4963                     error ("wrong outgoing edge flags at end of bb %d",
4964                            bb->index);
4965                     err = 1;
4966                   }
4967             }
4968           break;
4969
4970         case GIMPLE_CALL:
4971           if (!gimple_call_builtin_p (stmt, BUILT_IN_RETURN))
4972             break;
4973           /* ... fallthru ... */
4974         case GIMPLE_RETURN:
4975           if (!single_succ_p (bb)
4976               || (single_succ_edge (bb)->flags
4977                   & (EDGE_FALLTHRU | EDGE_ABNORMAL
4978                      | EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
4979             {
4980               error ("wrong outgoing edge flags at end of bb %d", bb->index);
4981               err = 1;
4982             }
4983           if (single_succ (bb) != EXIT_BLOCK_PTR)
4984             {
4985               error ("return edge does not point to exit in bb %d",
4986                      bb->index);
4987               err = 1;
4988             }
4989           break;
4990
4991         case GIMPLE_SWITCH:
4992           {
4993             tree prev;
4994             edge e;
4995             size_t i, n;
4996
4997             n = gimple_switch_num_labels (stmt);
4998
4999             /* Mark all the destination basic blocks.  */
5000             for (i = 0; i < n; ++i)
5001               {
5002                 tree lab = CASE_LABEL (gimple_switch_label (stmt, i));
5003                 basic_block label_bb = label_to_block (lab);
5004                 gcc_assert (!label_bb->aux || label_bb->aux == (void *)1);
5005                 label_bb->aux = (void *)1;
5006               }
5007
5008             /* Verify that the case labels are sorted.  */
5009             prev = gimple_switch_label (stmt, 0);
5010             for (i = 1; i < n; ++i)
5011               {
5012                 tree c = gimple_switch_label (stmt, i);
5013                 if (!CASE_LOW (c))
5014                   {
5015                     error ("found default case not at the start of "
5016                            "case vector");
5017                     err = 1;
5018                     continue;
5019                   }
5020                 if (CASE_LOW (prev)
5021                     && !tree_int_cst_lt (CASE_LOW (prev), CASE_LOW (c)))
5022                   {
5023                     error ("case labels not sorted: ");
5024                     print_generic_expr (stderr, prev, 0);
5025                     fprintf (stderr," is greater than ");
5026                     print_generic_expr (stderr, c, 0);
5027                     fprintf (stderr," but comes before it.\n");
5028                     err = 1;
5029                   }
5030                 prev = c;
5031               }
5032             /* VRP will remove the default case if it can prove it will
5033                never be executed.  So do not verify there always exists
5034                a default case here.  */
5035
5036             FOR_EACH_EDGE (e, ei, bb->succs)
5037               {
5038                 if (!e->dest->aux)
5039                   {
5040                     error ("extra outgoing edge %d->%d",
5041                            bb->index, e->dest->index);
5042                     err = 1;
5043                   }
5044
5045                 e->dest->aux = (void *)2;
5046                 if ((e->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL
5047                                  | EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
5048                   {
5049                     error ("wrong outgoing edge flags at end of bb %d",
5050                            bb->index);
5051                     err = 1;
5052                   }
5053               }
5054
5055             /* Check that we have all of them.  */
5056             for (i = 0; i < n; ++i)
5057               {
5058                 tree lab = CASE_LABEL (gimple_switch_label (stmt, i));
5059                 basic_block label_bb = label_to_block (lab);
5060
5061                 if (label_bb->aux != (void *)2)
5062                   {
5063                     error ("missing edge %i->%i", bb->index, label_bb->index);
5064                     err = 1;
5065                   }
5066               }
5067
5068             FOR_EACH_EDGE (e, ei, bb->succs)
5069               e->dest->aux = (void *)0;
5070           }
5071           break;
5072
5073         case GIMPLE_EH_DISPATCH:
5074           err |= verify_eh_dispatch_edge (stmt);
5075           break;
5076
5077         default:
5078           break;
5079         }
5080     }
5081
5082   if (dom_info_state (CDI_DOMINATORS) >= DOM_NO_FAST_QUERY)
5083     verify_dominators (CDI_DOMINATORS);
5084
5085   return err;
5086 }
5087
5088
5089 /* Updates phi nodes after creating a forwarder block joined
5090    by edge FALLTHRU.  */
5091
5092 static void
5093 gimple_make_forwarder_block (edge fallthru)
5094 {
5095   edge e;
5096   edge_iterator ei;
5097   basic_block dummy, bb;
5098   tree var;
5099   gimple_stmt_iterator gsi;
5100
5101   dummy = fallthru->src;
5102   bb = fallthru->dest;
5103
5104   if (single_pred_p (bb))
5105     return;
5106
5107   /* If we redirected a branch we must create new PHI nodes at the
5108      start of BB.  */
5109   for (gsi = gsi_start_phis (dummy); !gsi_end_p (gsi); gsi_next (&gsi))
5110     {
5111       gimple phi, new_phi;
5112
5113       phi = gsi_stmt (gsi);
5114       var = gimple_phi_result (phi);
5115       new_phi = create_phi_node (var, bb);
5116       gimple_phi_set_result (phi, copy_ssa_name (var, phi));
5117       add_phi_arg (new_phi, gimple_phi_result (phi), fallthru,
5118                    UNKNOWN_LOCATION);
5119     }
5120
5121   /* Add the arguments we have stored on edges.  */
5122   FOR_EACH_EDGE (e, ei, bb->preds)
5123     {
5124       if (e == fallthru)
5125         continue;
5126
5127       flush_pending_stmts (e);
5128     }
5129 }
5130
5131
5132 /* Return a non-special label in the head of basic block BLOCK.
5133    Create one if it doesn't exist.  */
5134
5135 tree
5136 gimple_block_label (basic_block bb)
5137 {
5138   gimple_stmt_iterator i, s = gsi_start_bb (bb);
5139   bool first = true;
5140   tree label;
5141   gimple stmt;
5142
5143   for (i = s; !gsi_end_p (i); first = false, gsi_next (&i))
5144     {
5145       stmt = gsi_stmt (i);
5146       if (gimple_code (stmt) != GIMPLE_LABEL)
5147         break;
5148       label = gimple_label_label (stmt);
5149       if (!DECL_NONLOCAL (label))
5150         {
5151           if (!first)
5152             gsi_move_before (&i, &s);
5153           return label;
5154         }
5155     }
5156
5157   label = create_artificial_label (UNKNOWN_LOCATION);
5158   stmt = gimple_build_label (label);
5159   gsi_insert_before (&s, stmt, GSI_NEW_STMT);
5160   return label;
5161 }
5162
5163
5164 /* Attempt to perform edge redirection by replacing a possibly complex
5165    jump instruction by a goto or by removing the jump completely.
5166    This can apply only if all edges now point to the same block.  The
5167    parameters and return values are equivalent to
5168    redirect_edge_and_branch.  */
5169
5170 static edge
5171 gimple_try_redirect_by_replacing_jump (edge e, basic_block target)
5172 {
5173   basic_block src = e->src;
5174   gimple_stmt_iterator i;
5175   gimple stmt;
5176
5177   /* We can replace or remove a complex jump only when we have exactly
5178      two edges.  */
5179   if (EDGE_COUNT (src->succs) != 2
5180       /* Verify that all targets will be TARGET.  Specifically, the
5181          edge that is not E must also go to TARGET.  */
5182       || EDGE_SUCC (src, EDGE_SUCC (src, 0) == e)->dest != target)
5183     return NULL;
5184
5185   i = gsi_last_bb (src);
5186   if (gsi_end_p (i))
5187     return NULL;
5188
5189   stmt = gsi_stmt (i);
5190
5191   if (gimple_code (stmt) == GIMPLE_COND || gimple_code (stmt) == GIMPLE_SWITCH)
5192     {
5193       gsi_remove (&i, true);
5194       e = ssa_redirect_edge (e, target);
5195       e->flags = EDGE_FALLTHRU;
5196       return e;
5197     }
5198
5199   return NULL;
5200 }
5201
5202
5203 /* Redirect E to DEST.  Return NULL on failure.  Otherwise, return the
5204    edge representing the redirected branch.  */
5205
5206 static edge
5207 gimple_redirect_edge_and_branch (edge e, basic_block dest)
5208 {
5209   basic_block bb = e->src;
5210   gimple_stmt_iterator gsi;
5211   edge ret;
5212   gimple stmt;
5213
5214   if (e->flags & EDGE_ABNORMAL)
5215     return NULL;
5216
5217   if (e->dest == dest)
5218     return NULL;
5219
5220   if (e->flags & EDGE_EH)
5221     return redirect_eh_edge (e, dest);
5222
5223   if (e->src != ENTRY_BLOCK_PTR)
5224     {
5225       ret = gimple_try_redirect_by_replacing_jump (e, dest);
5226       if (ret)
5227         return ret;
5228     }
5229
5230   gsi = gsi_last_bb (bb);
5231   stmt = gsi_end_p (gsi) ? NULL : gsi_stmt (gsi);
5232
5233   switch (stmt ? gimple_code (stmt) : GIMPLE_ERROR_MARK)
5234     {
5235     case GIMPLE_COND:
5236       /* For COND_EXPR, we only need to redirect the edge.  */
5237       break;
5238
5239     case GIMPLE_GOTO:
5240       /* No non-abnormal edges should lead from a non-simple goto, and
5241          simple ones should be represented implicitly.  */
5242       gcc_unreachable ();
5243
5244     case GIMPLE_SWITCH:
5245       {
5246         tree label = gimple_block_label (dest);
5247         tree cases = get_cases_for_edge (e, stmt);
5248
5249         /* If we have a list of cases associated with E, then use it
5250            as it's a lot faster than walking the entire case vector.  */
5251         if (cases)
5252           {
5253             edge e2 = find_edge (e->src, dest);
5254             tree last, first;
5255
5256             first = cases;
5257             while (cases)
5258               {
5259                 last = cases;
5260                 CASE_LABEL (cases) = label;
5261                 cases = CASE_CHAIN (cases);
5262               }
5263
5264             /* If there was already an edge in the CFG, then we need
5265                to move all the cases associated with E to E2.  */
5266             if (e2)
5267               {
5268                 tree cases2 = get_cases_for_edge (e2, stmt);
5269
5270                 CASE_CHAIN (last) = CASE_CHAIN (cases2);
5271                 CASE_CHAIN (cases2) = first;
5272               }
5273             bitmap_set_bit (touched_switch_bbs, gimple_bb (stmt)->index);
5274           }
5275         else
5276           {
5277             size_t i, n = gimple_switch_num_labels (stmt);
5278
5279             for (i = 0; i < n; i++)
5280               {
5281                 tree elt = gimple_switch_label (stmt, i);
5282                 if (label_to_block (CASE_LABEL (elt)) == e->dest)
5283                   CASE_LABEL (elt) = label;
5284               }
5285           }
5286       }
5287       break;
5288
5289     case GIMPLE_ASM:
5290       {
5291         int i, n = gimple_asm_nlabels (stmt);
5292         tree label = NULL;
5293
5294         for (i = 0; i < n; ++i)
5295           {
5296             tree cons = gimple_asm_label_op (stmt, i);
5297             if (label_to_block (TREE_VALUE (cons)) == e->dest)
5298               {
5299                 if (!label)
5300                   label = gimple_block_label (dest);
5301                 TREE_VALUE (cons) = label;
5302               }
5303           }
5304
5305         /* If we didn't find any label matching the former edge in the
5306            asm labels, we must be redirecting the fallthrough
5307            edge.  */
5308         gcc_assert (label || (e->flags & EDGE_FALLTHRU));
5309       }
5310       break;
5311
5312     case GIMPLE_RETURN:
5313       gsi_remove (&gsi, true);
5314       e->flags |= EDGE_FALLTHRU;
5315       break;
5316
5317     case GIMPLE_OMP_RETURN:
5318     case GIMPLE_OMP_CONTINUE:
5319     case GIMPLE_OMP_SECTIONS_SWITCH:
5320     case GIMPLE_OMP_FOR:
5321       /* The edges from OMP constructs can be simply redirected.  */
5322       break;
5323
5324     case GIMPLE_EH_DISPATCH:
5325       if (!(e->flags & EDGE_FALLTHRU))
5326         redirect_eh_dispatch_edge (stmt, e, dest);
5327       break;
5328
5329     case GIMPLE_TRANSACTION:
5330       /* The ABORT edge has a stored label associated with it, otherwise
5331          the edges are simply redirectable.  */
5332       if (e->flags == 0)
5333         gimple_transaction_set_label (stmt, gimple_block_label (dest));
5334       break;
5335
5336     default:
5337       /* Otherwise it must be a fallthru edge, and we don't need to
5338          do anything besides redirecting it.  */
5339       gcc_assert (e->flags & EDGE_FALLTHRU);
5340       break;
5341     }
5342
5343   /* Update/insert PHI nodes as necessary.  */
5344
5345   /* Now update the edges in the CFG.  */
5346   e = ssa_redirect_edge (e, dest);
5347
5348   return e;
5349 }
5350
5351 /* Returns true if it is possible to remove edge E by redirecting
5352    it to the destination of the other edge from E->src.  */
5353
5354 static bool
5355 gimple_can_remove_branch_p (const_edge e)
5356 {
5357   if (e->flags & (EDGE_ABNORMAL | EDGE_EH))
5358     return false;
5359
5360   return true;
5361 }
5362
5363 /* Simple wrapper, as we can always redirect fallthru edges.  */
5364
5365 static basic_block
5366 gimple_redirect_edge_and_branch_force (edge e, basic_block dest)
5367 {
5368   e = gimple_redirect_edge_and_branch (e, dest);
5369   gcc_assert (e);
5370
5371   return NULL;
5372 }
5373
5374
5375 /* Splits basic block BB after statement STMT (but at least after the
5376    labels).  If STMT is NULL, BB is split just after the labels.  */
5377
5378 static basic_block
5379 gimple_split_block (basic_block bb, void *stmt)
5380 {
5381   gimple_stmt_iterator gsi;
5382   gimple_stmt_iterator gsi_tgt;
5383   gimple act;
5384   gimple_seq list;
5385   basic_block new_bb;
5386   edge e;
5387   edge_iterator ei;
5388
5389   new_bb = create_empty_bb (bb);
5390
5391   /* Redirect the outgoing edges.  */
5392   new_bb->succs = bb->succs;
5393   bb->succs = NULL;
5394   FOR_EACH_EDGE (e, ei, new_bb->succs)
5395     e->src = new_bb;
5396
5397   if (stmt && gimple_code ((gimple) stmt) == GIMPLE_LABEL)
5398     stmt = NULL;
5399
5400   /* Move everything from GSI to the new basic block.  */
5401   for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
5402     {
5403       act = gsi_stmt (gsi);
5404       if (gimple_code (act) == GIMPLE_LABEL)
5405         continue;
5406
5407       if (!stmt)
5408         break;
5409
5410       if (stmt == act)
5411         {
5412           gsi_next (&gsi);
5413           break;
5414         }
5415     }
5416
5417   if (gsi_end_p (gsi))
5418     return new_bb;
5419
5420   /* Split the statement list - avoid re-creating new containers as this
5421      brings ugly quadratic memory consumption in the inliner.
5422      (We are still quadratic since we need to update stmt BB pointers,
5423      sadly.)  */
5424   gsi_split_seq_before (&gsi, &list);
5425   set_bb_seq (new_bb, list);
5426   for (gsi_tgt = gsi_start (list);
5427        !gsi_end_p (gsi_tgt); gsi_next (&gsi_tgt))
5428     gimple_set_bb (gsi_stmt (gsi_tgt), new_bb);
5429
5430   return new_bb;
5431 }
5432
5433
5434 /* Moves basic block BB after block AFTER.  */
5435
5436 static bool
5437 gimple_move_block_after (basic_block bb, basic_block after)
5438 {
5439   if (bb->prev_bb == after)
5440     return true;
5441
5442   unlink_block (bb);
5443   link_block (bb, after);
5444
5445   return true;
5446 }
5447
5448
5449 /* Return TRUE if block BB has no executable statements, otherwise return
5450    FALSE.  */
5451
5452 bool
5453 gimple_empty_block_p (basic_block bb)
5454 {
5455   /* BB must have no executable statements.  */
5456   gimple_stmt_iterator gsi = gsi_after_labels (bb);
5457   if (phi_nodes (bb))
5458     return false;
5459   if (gsi_end_p (gsi))
5460     return true;
5461   if (is_gimple_debug (gsi_stmt (gsi)))
5462     gsi_next_nondebug (&gsi);
5463   return gsi_end_p (gsi);
5464 }
5465
5466
5467 /* Split a basic block if it ends with a conditional branch and if the
5468    other part of the block is not empty.  */
5469
5470 static basic_block
5471 gimple_split_block_before_cond_jump (basic_block bb)
5472 {
5473   gimple last, split_point;
5474   gimple_stmt_iterator gsi = gsi_last_nondebug_bb (bb);
5475   if (gsi_end_p (gsi))
5476     return NULL;
5477   last = gsi_stmt (gsi);
5478   if (gimple_code (last) != GIMPLE_COND
5479       && gimple_code (last) != GIMPLE_SWITCH)
5480     return NULL;
5481   gsi_prev_nondebug (&gsi);
5482   split_point = gsi_stmt (gsi);
5483   return split_block (bb, split_point)->dest;
5484 }
5485
5486
5487 /* Return true if basic_block can be duplicated.  */
5488
5489 static bool
5490 gimple_can_duplicate_bb_p (const_basic_block bb ATTRIBUTE_UNUSED)
5491 {
5492   return true;
5493 }
5494
5495 /* Create a duplicate of the basic block BB.  NOTE: This does not
5496    preserve SSA form.  */
5497
5498 static basic_block
5499 gimple_duplicate_bb (basic_block bb)
5500 {
5501   basic_block new_bb;
5502   gimple_stmt_iterator gsi, gsi_tgt;
5503   gimple_seq phis = phi_nodes (bb);
5504   gimple phi, stmt, copy;
5505
5506   new_bb = create_empty_bb (EXIT_BLOCK_PTR->prev_bb);
5507
5508   /* Copy the PHI nodes.  We ignore PHI node arguments here because
5509      the incoming edges have not been setup yet.  */
5510   for (gsi = gsi_start (phis); !gsi_end_p (gsi); gsi_next (&gsi))
5511     {
5512       phi = gsi_stmt (gsi);
5513       copy = create_phi_node (NULL_TREE, new_bb);
5514       create_new_def_for (gimple_phi_result (phi), copy,
5515                           gimple_phi_result_ptr (copy));
5516     }
5517
5518   gsi_tgt = gsi_start_bb (new_bb);
5519   for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
5520     {
5521       def_operand_p def_p;
5522       ssa_op_iter op_iter;
5523       tree lhs;
5524
5525       stmt = gsi_stmt (gsi);
5526       if (gimple_code (stmt) == GIMPLE_LABEL)
5527         continue;
5528
5529       /* Don't duplicate label debug stmts.  */
5530       if (gimple_debug_bind_p (stmt)
5531           && TREE_CODE (gimple_debug_bind_get_var (stmt))
5532              == LABEL_DECL)
5533         continue;
5534
5535       /* Create a new copy of STMT and duplicate STMT's virtual
5536          operands.  */
5537       copy = gimple_copy (stmt);
5538       gsi_insert_after (&gsi_tgt, copy, GSI_NEW_STMT);
5539
5540       maybe_duplicate_eh_stmt (copy, stmt);
5541       gimple_duplicate_stmt_histograms (cfun, copy, cfun, stmt);
5542
5543       /* When copying around a stmt writing into a local non-user
5544          aggregate, make sure it won't share stack slot with other
5545          vars.  */
5546       lhs = gimple_get_lhs (stmt);
5547       if (lhs && TREE_CODE (lhs) != SSA_NAME)
5548         {
5549           tree base = get_base_address (lhs);
5550           if (base
5551               && (TREE_CODE (base) == VAR_DECL
5552                   || TREE_CODE (base) == RESULT_DECL)
5553               && DECL_IGNORED_P (base)
5554               && !TREE_STATIC (base)
5555               && !DECL_EXTERNAL (base)
5556               && (TREE_CODE (base) != VAR_DECL
5557                   || !DECL_HAS_VALUE_EXPR_P (base)))
5558             DECL_NONSHAREABLE (base) = 1;
5559         }
5560
5561       /* Create new names for all the definitions created by COPY and
5562          add replacement mappings for each new name.  */
5563       FOR_EACH_SSA_DEF_OPERAND (def_p, copy, op_iter, SSA_OP_ALL_DEFS)
5564         create_new_def_for (DEF_FROM_PTR (def_p), copy, def_p);
5565     }
5566
5567   return new_bb;
5568 }
5569
5570 /* Adds phi node arguments for edge E_COPY after basic block duplication.  */
5571
5572 static void
5573 add_phi_args_after_copy_edge (edge e_copy)
5574 {
5575   basic_block bb, bb_copy = e_copy->src, dest;
5576   edge e;
5577   edge_iterator ei;
5578   gimple phi, phi_copy;
5579   tree def;
5580   gimple_stmt_iterator psi, psi_copy;
5581
5582   if (gimple_seq_empty_p (phi_nodes (e_copy->dest)))
5583     return;
5584
5585   bb = bb_copy->flags & BB_DUPLICATED ? get_bb_original (bb_copy) : bb_copy;
5586
5587   if (e_copy->dest->flags & BB_DUPLICATED)
5588     dest = get_bb_original (e_copy->dest);
5589   else
5590     dest = e_copy->dest;
5591
5592   e = find_edge (bb, dest);
5593   if (!e)
5594     {
5595       /* During loop unrolling the target of the latch edge is copied.
5596          In this case we are not looking for edge to dest, but to
5597          duplicated block whose original was dest.  */
5598       FOR_EACH_EDGE (e, ei, bb->succs)
5599         {
5600           if ((e->dest->flags & BB_DUPLICATED)
5601               && get_bb_original (e->dest) == dest)
5602             break;
5603         }
5604
5605       gcc_assert (e != NULL);
5606     }
5607
5608   for (psi = gsi_start_phis (e->dest),
5609        psi_copy = gsi_start_phis (e_copy->dest);
5610        !gsi_end_p (psi);
5611        gsi_next (&psi), gsi_next (&psi_copy))
5612     {
5613       phi = gsi_stmt (psi);
5614       phi_copy = gsi_stmt (psi_copy);
5615       def = PHI_ARG_DEF_FROM_EDGE (phi, e);
5616       add_phi_arg (phi_copy, def, e_copy,
5617                    gimple_phi_arg_location_from_edge (phi, e));
5618     }
5619 }
5620
5621
5622 /* Basic block BB_COPY was created by code duplication.  Add phi node
5623    arguments for edges going out of BB_COPY.  The blocks that were
5624    duplicated have BB_DUPLICATED set.  */
5625
5626 void
5627 add_phi_args_after_copy_bb (basic_block bb_copy)
5628 {
5629   edge e_copy;
5630   edge_iterator ei;
5631
5632   FOR_EACH_EDGE (e_copy, ei, bb_copy->succs)
5633     {
5634       add_phi_args_after_copy_edge (e_copy);
5635     }
5636 }
5637
5638 /* Blocks in REGION_COPY array of length N_REGION were created by
5639    duplication of basic blocks.  Add phi node arguments for edges
5640    going from these blocks.  If E_COPY is not NULL, also add
5641    phi node arguments for its destination.*/
5642
5643 void
5644 add_phi_args_after_copy (basic_block *region_copy, unsigned n_region,
5645                          edge e_copy)
5646 {
5647   unsigned i;
5648
5649   for (i = 0; i < n_region; i++)
5650     region_copy[i]->flags |= BB_DUPLICATED;
5651
5652   for (i = 0; i < n_region; i++)
5653     add_phi_args_after_copy_bb (region_copy[i]);
5654   if (e_copy)
5655     add_phi_args_after_copy_edge (e_copy);
5656
5657   for (i = 0; i < n_region; i++)
5658     region_copy[i]->flags &= ~BB_DUPLICATED;
5659 }
5660
5661 /* Duplicates a REGION (set of N_REGION basic blocks) with just a single
5662    important exit edge EXIT.  By important we mean that no SSA name defined
5663    inside region is live over the other exit edges of the region.  All entry
5664    edges to the region must go to ENTRY->dest.  The edge ENTRY is redirected
5665    to the duplicate of the region.  Dominance and loop information is
5666    updated, but not the SSA web.  The new basic blocks are stored to
5667    REGION_COPY in the same order as they had in REGION, provided that
5668    REGION_COPY is not NULL.
5669    The function returns false if it is unable to copy the region,
5670    true otherwise.  */
5671
5672 bool
5673 gimple_duplicate_sese_region (edge entry, edge exit,
5674                             basic_block *region, unsigned n_region,
5675                             basic_block *region_copy)
5676 {
5677   unsigned i;
5678   bool free_region_copy = false, copying_header = false;
5679   struct loop *loop = entry->dest->loop_father;
5680   edge exit_copy;
5681   vec<basic_block> doms;
5682   edge redirected;
5683   int total_freq = 0, entry_freq = 0;
5684   gcov_type total_count = 0, entry_count = 0;
5685
5686   if (!can_copy_bbs_p (region, n_region))
5687     return false;
5688
5689   /* Some sanity checking.  Note that we do not check for all possible
5690      missuses of the functions.  I.e. if you ask to copy something weird,
5691      it will work, but the state of structures probably will not be
5692      correct.  */
5693   for (i = 0; i < n_region; i++)
5694     {
5695       /* We do not handle subloops, i.e. all the blocks must belong to the
5696          same loop.  */
5697       if (region[i]->loop_father != loop)
5698         return false;
5699
5700       if (region[i] != entry->dest
5701           && region[i] == loop->header)
5702         return false;
5703     }
5704
5705   set_loop_copy (loop, loop);
5706
5707   /* In case the function is used for loop header copying (which is the primary
5708      use), ensure that EXIT and its copy will be new latch and entry edges.  */
5709   if (loop->header == entry->dest)
5710     {
5711       copying_header = true;
5712       set_loop_copy (loop, loop_outer (loop));
5713
5714       if (!dominated_by_p (CDI_DOMINATORS, loop->latch, exit->src))
5715         return false;
5716
5717       for (i = 0; i < n_region; i++)
5718         if (region[i] != exit->src
5719             && dominated_by_p (CDI_DOMINATORS, region[i], exit->src))
5720           return false;
5721     }
5722
5723   if (!region_copy)
5724     {
5725       region_copy = XNEWVEC (basic_block, n_region);
5726       free_region_copy = true;
5727     }
5728
5729   /* Record blocks outside the region that are dominated by something
5730      inside.  */
5731   doms.create (0);
5732   initialize_original_copy_tables ();
5733
5734   doms = get_dominated_by_region (CDI_DOMINATORS, region, n_region);
5735
5736   if (entry->dest->count)
5737     {
5738       total_count = entry->dest->count;
5739       entry_count = entry->count;
5740       /* Fix up corner cases, to avoid division by zero or creation of negative
5741          frequencies.  */
5742       if (entry_count > total_count)
5743         entry_count = total_count;
5744     }
5745   else
5746     {
5747       total_freq = entry->dest->frequency;
5748       entry_freq = EDGE_FREQUENCY (entry);
5749       /* Fix up corner cases, to avoid division by zero or creation of negative
5750          frequencies.  */
5751       if (total_freq == 0)
5752         total_freq = 1;
5753       else if (entry_freq > total_freq)
5754         entry_freq = total_freq;
5755     }
5756
5757   copy_bbs (region, n_region, region_copy, &exit, 1, &exit_copy, loop,
5758             split_edge_bb_loc (entry));
5759   if (total_count)
5760     {
5761       scale_bbs_frequencies_gcov_type (region, n_region,
5762                                        total_count - entry_count,
5763                                        total_count);
5764       scale_bbs_frequencies_gcov_type (region_copy, n_region, entry_count,
5765                                        total_count);
5766     }
5767   else
5768     {
5769       scale_bbs_frequencies_int (region, n_region, total_freq - entry_freq,
5770                                  total_freq);
5771       scale_bbs_frequencies_int (region_copy, n_region, entry_freq, total_freq);
5772     }
5773
5774   if (copying_header)
5775     {
5776       loop->header = exit->dest;
5777       loop->latch = exit->src;
5778     }
5779
5780   /* Redirect the entry and add the phi node arguments.  */
5781   redirected = redirect_edge_and_branch (entry, get_bb_copy (entry->dest));
5782   gcc_assert (redirected != NULL);
5783   flush_pending_stmts (entry);
5784
5785   /* Concerning updating of dominators:  We must recount dominators
5786      for entry block and its copy.  Anything that is outside of the
5787      region, but was dominated by something inside needs recounting as
5788      well.  */
5789   set_immediate_dominator (CDI_DOMINATORS, entry->dest, entry->src);
5790   doms.safe_push (get_bb_original (entry->dest));
5791   iterate_fix_dominators (CDI_DOMINATORS, doms, false);
5792   doms.release ();
5793
5794   /* Add the other PHI node arguments.  */
5795   add_phi_args_after_copy (region_copy, n_region, NULL);
5796
5797   if (free_region_copy)
5798     free (region_copy);
5799
5800   free_original_copy_tables ();
5801   return true;
5802 }
5803
5804 /* Checks if BB is part of the region defined by N_REGION BBS.  */
5805 static bool 
5806 bb_part_of_region_p (basic_block bb, basic_block* bbs, unsigned n_region)
5807 {
5808   unsigned int n;
5809
5810   for (n = 0; n < n_region; n++)
5811     {
5812      if (bb == bbs[n])
5813        return true;
5814     }
5815   return false;
5816 }
5817
5818 /* Duplicates REGION consisting of N_REGION blocks.  The new blocks
5819    are stored to REGION_COPY in the same order in that they appear
5820    in REGION, if REGION_COPY is not NULL.  ENTRY is the entry to
5821    the region, EXIT an exit from it.  The condition guarding EXIT
5822    is moved to ENTRY.  Returns true if duplication succeeds, false
5823    otherwise.
5824
5825    For example,
5826
5827    some_code;
5828    if (cond)
5829      A;
5830    else
5831      B;
5832
5833    is transformed to
5834
5835    if (cond)
5836      {
5837        some_code;
5838        A;
5839      }
5840    else
5841      {
5842        some_code;
5843        B;
5844      }
5845 */
5846
5847 bool
5848 gimple_duplicate_sese_tail (edge entry ATTRIBUTE_UNUSED, edge exit ATTRIBUTE_UNUSED,
5849                           basic_block *region ATTRIBUTE_UNUSED, unsigned n_region ATTRIBUTE_UNUSED,
5850                           basic_block *region_copy ATTRIBUTE_UNUSED)
5851 {
5852   unsigned i;
5853   bool free_region_copy = false;
5854   struct loop *loop = exit->dest->loop_father;
5855   struct loop *orig_loop = entry->dest->loop_father;
5856   basic_block switch_bb, entry_bb, nentry_bb;
5857   vec<basic_block> doms;
5858   int total_freq = 0, exit_freq = 0;
5859   gcov_type total_count = 0, exit_count = 0;
5860   edge exits[2], nexits[2], e;
5861   gimple_stmt_iterator gsi;
5862   gimple cond_stmt;
5863   edge sorig, snew;
5864   basic_block exit_bb;
5865   gimple_stmt_iterator psi;
5866   gimple phi;
5867   tree def;
5868   struct loop *target, *aloop, *cloop;
5869
5870   gcc_assert (EDGE_COUNT (exit->src->succs) == 2);
5871   exits[0] = exit;
5872   exits[1] = EDGE_SUCC (exit->src, EDGE_SUCC (exit->src, 0) == exit);
5873
5874   if (!can_copy_bbs_p (region, n_region))
5875     return false;
5876
5877   initialize_original_copy_tables ();
5878   set_loop_copy (orig_loop, loop);
5879
5880   target= loop;
5881   for (aloop = orig_loop->inner; aloop; aloop = aloop->next)
5882     {
5883       if (bb_part_of_region_p (aloop->header, region, n_region))
5884         {
5885           cloop = duplicate_loop (aloop, target);
5886           duplicate_subloops (aloop, cloop);
5887         }
5888     }
5889
5890   if (!region_copy)
5891     {
5892       region_copy = XNEWVEC (basic_block, n_region);
5893       free_region_copy = true;
5894     }
5895
5896   gcc_assert (!need_ssa_update_p (cfun));
5897
5898   /* Record blocks outside the region that are dominated by something
5899      inside.  */
5900   doms = get_dominated_by_region (CDI_DOMINATORS, region, n_region);
5901
5902   if (exit->src->count)
5903     {
5904       total_count = exit->src->count;
5905       exit_count = exit->count;
5906       /* Fix up corner cases, to avoid division by zero or creation of negative
5907          frequencies.  */
5908       if (exit_count > total_count)
5909         exit_count = total_count;
5910     }
5911   else
5912     {
5913       total_freq = exit->src->frequency;
5914       exit_freq = EDGE_FREQUENCY (exit);
5915       /* Fix up corner cases, to avoid division by zero or creation of negative
5916          frequencies.  */
5917       if (total_freq == 0)
5918         total_freq = 1;
5919       if (exit_freq > total_freq)
5920         exit_freq = total_freq;
5921     }
5922
5923   copy_bbs (region, n_region, region_copy, exits, 2, nexits, orig_loop,
5924             split_edge_bb_loc (exit));
5925   if (total_count)
5926     {
5927       scale_bbs_frequencies_gcov_type (region, n_region,
5928                                        total_count - exit_count,
5929                                        total_count);
5930       scale_bbs_frequencies_gcov_type (region_copy, n_region, exit_count,
5931                                        total_count);
5932     }
5933   else
5934     {
5935       scale_bbs_frequencies_int (region, n_region, total_freq - exit_freq,
5936                                  total_freq);
5937       scale_bbs_frequencies_int (region_copy, n_region, exit_freq, total_freq);
5938     }
5939
5940   /* Create the switch block, and put the exit condition to it.  */
5941   entry_bb = entry->dest;
5942   nentry_bb = get_bb_copy (entry_bb);
5943   if (!last_stmt (entry->src)
5944       || !stmt_ends_bb_p (last_stmt (entry->src)))
5945     switch_bb = entry->src;
5946   else
5947     switch_bb = split_edge (entry);
5948   set_immediate_dominator (CDI_DOMINATORS, nentry_bb, switch_bb);
5949
5950   gsi = gsi_last_bb (switch_bb);
5951   cond_stmt = last_stmt (exit->src);
5952   gcc_assert (gimple_code (cond_stmt) == GIMPLE_COND);
5953   cond_stmt = gimple_copy (cond_stmt);
5954
5955   gsi_insert_after (&gsi, cond_stmt, GSI_NEW_STMT);
5956
5957   sorig = single_succ_edge (switch_bb);
5958   sorig->flags = exits[1]->flags;
5959   snew = make_edge (switch_bb, nentry_bb, exits[0]->flags);
5960
5961   /* Register the new edge from SWITCH_BB in loop exit lists.  */
5962   rescan_loop_exit (snew, true, false);
5963
5964   /* Add the PHI node arguments.  */
5965   add_phi_args_after_copy (region_copy, n_region, snew);
5966
5967   /* Get rid of now superfluous conditions and associated edges (and phi node
5968      arguments).  */
5969   exit_bb = exit->dest;
5970
5971   e = redirect_edge_and_branch (exits[0], exits[1]->dest);
5972   PENDING_STMT (e) = NULL;
5973
5974   /* The latch of ORIG_LOOP was copied, and so was the backedge 
5975      to the original header.  We redirect this backedge to EXIT_BB.  */
5976   for (i = 0; i < n_region; i++)
5977     if (get_bb_original (region_copy[i]) == orig_loop->latch)
5978       {
5979         gcc_assert (single_succ_edge (region_copy[i]));
5980         e = redirect_edge_and_branch (single_succ_edge (region_copy[i]), exit_bb);
5981         PENDING_STMT (e) = NULL;
5982         for (psi = gsi_start_phis (exit_bb);
5983              !gsi_end_p (psi);
5984              gsi_next (&psi))
5985           {
5986             phi = gsi_stmt (psi);
5987             def = PHI_ARG_DEF (phi, nexits[0]->dest_idx);
5988             add_phi_arg (phi, def, e, gimple_phi_arg_location_from_edge (phi, e));
5989           }
5990       }
5991   e = redirect_edge_and_branch (nexits[1], nexits[0]->dest);
5992   PENDING_STMT (e) = NULL;
5993   
5994   /* Anything that is outside of the region, but was dominated by something
5995      inside needs to update dominance info.  */
5996   iterate_fix_dominators (CDI_DOMINATORS, doms, false);
5997   doms.release ();
5998   /* Update the SSA web.  */
5999   update_ssa (TODO_update_ssa);
6000
6001   if (free_region_copy)
6002     free (region_copy);
6003
6004   free_original_copy_tables ();
6005   return true;
6006 }
6007
6008 /* Add all the blocks dominated by ENTRY to the array BBS_P.  Stop
6009    adding blocks when the dominator traversal reaches EXIT.  This
6010    function silently assumes that ENTRY strictly dominates EXIT.  */
6011
6012 void
6013 gather_blocks_in_sese_region (basic_block entry, basic_block exit,
6014                               vec<basic_block> *bbs_p)
6015 {
6016   basic_block son;
6017
6018   for (son = first_dom_son (CDI_DOMINATORS, entry);
6019        son;
6020        son = next_dom_son (CDI_DOMINATORS, son))
6021     {
6022       bbs_p->safe_push (son);
6023       if (son != exit)
6024         gather_blocks_in_sese_region (son, exit, bbs_p);
6025     }
6026 }
6027
6028 /* Replaces *TP with a duplicate (belonging to function TO_CONTEXT).
6029    The duplicates are recorded in VARS_MAP.  */
6030
6031 static void
6032 replace_by_duplicate_decl (tree *tp, struct pointer_map_t *vars_map,
6033                            tree to_context)
6034 {
6035   tree t = *tp, new_t;
6036   struct function *f = DECL_STRUCT_FUNCTION (to_context);
6037   void **loc;
6038
6039   if (DECL_CONTEXT (t) == to_context)
6040     return;
6041
6042   loc = pointer_map_contains (vars_map, t);
6043
6044   if (!loc)
6045     {
6046       loc = pointer_map_insert (vars_map, t);
6047
6048       if (SSA_VAR_P (t))
6049         {
6050           new_t = copy_var_decl (t, DECL_NAME (t), TREE_TYPE (t));
6051           add_local_decl (f, new_t);
6052         }
6053       else
6054         {
6055           gcc_assert (TREE_CODE (t) == CONST_DECL);
6056           new_t = copy_node (t);
6057         }
6058       DECL_CONTEXT (new_t) = to_context;
6059
6060       *loc = new_t;
6061     }
6062   else
6063     new_t = (tree) *loc;
6064
6065   *tp = new_t;
6066 }
6067
6068
6069 /* Creates an ssa name in TO_CONTEXT equivalent to NAME.
6070    VARS_MAP maps old ssa names and var_decls to the new ones.  */
6071
6072 static tree
6073 replace_ssa_name (tree name, struct pointer_map_t *vars_map,
6074                   tree to_context)
6075 {
6076   void **loc;
6077   tree new_name;
6078
6079   gcc_assert (!virtual_operand_p (name));
6080
6081   loc = pointer_map_contains (vars_map, name);
6082
6083   if (!loc)
6084     {
6085       tree decl = SSA_NAME_VAR (name);
6086       if (decl)
6087         {
6088           replace_by_duplicate_decl (&decl, vars_map, to_context);
6089           new_name = make_ssa_name_fn (DECL_STRUCT_FUNCTION (to_context),
6090                                        decl, SSA_NAME_DEF_STMT (name));
6091           if (SSA_NAME_IS_DEFAULT_DEF (name))
6092             set_ssa_default_def (DECL_STRUCT_FUNCTION (to_context),
6093                                  decl, new_name);
6094         }
6095       else
6096         new_name = copy_ssa_name_fn (DECL_STRUCT_FUNCTION (to_context),
6097                                      name, SSA_NAME_DEF_STMT (name));
6098
6099       loc = pointer_map_insert (vars_map, name);
6100       *loc = new_name;
6101     }
6102   else
6103     new_name = (tree) *loc;
6104
6105   return new_name;
6106 }
6107
6108 struct move_stmt_d
6109 {
6110   tree orig_block;
6111   tree new_block;
6112   tree from_context;
6113   tree to_context;
6114   struct pointer_map_t *vars_map;
6115   htab_t new_label_map;
6116   struct pointer_map_t *eh_map;
6117   bool remap_decls_p;
6118 };
6119
6120 /* Helper for move_block_to_fn.  Set TREE_BLOCK in every expression
6121    contained in *TP if it has been ORIG_BLOCK previously and change the
6122    DECL_CONTEXT of every local variable referenced in *TP.  */
6123
6124 static tree
6125 move_stmt_op (tree *tp, int *walk_subtrees, void *data)
6126 {
6127   struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
6128   struct move_stmt_d *p = (struct move_stmt_d *) wi->info;
6129   tree t = *tp;
6130
6131   if (EXPR_P (t))
6132     {
6133       if (TREE_BLOCK (t) == p->orig_block
6134           || (p->orig_block == NULL_TREE
6135           && TREE_BLOCK (t) == NULL_TREE))
6136         TREE_SET_BLOCK (t, p->new_block);
6137     }
6138   else if (DECL_P (t) || TREE_CODE (t) == SSA_NAME)
6139     {
6140       if (TREE_CODE (t) == SSA_NAME)
6141         *tp = replace_ssa_name (t, p->vars_map, p->to_context);
6142       else if (TREE_CODE (t) == LABEL_DECL)
6143         {
6144           if (p->new_label_map)
6145             {
6146               struct tree_map in, *out;
6147               in.base.from = t;
6148               out = (struct tree_map *)
6149                 htab_find_with_hash (p->new_label_map, &in, DECL_UID (t));
6150               if (out)
6151                 *tp = t = out->to;
6152             }
6153
6154           DECL_CONTEXT (t) = p->to_context;
6155         }
6156       else if (p->remap_decls_p)
6157         {
6158           /* Replace T with its duplicate.  T should no longer appear in the
6159              parent function, so this looks wasteful; however, it may appear
6160              in referenced_vars, and more importantly, as virtual operands of
6161              statements, and in alias lists of other variables.  It would be
6162              quite difficult to expunge it from all those places.  ??? It might
6163              suffice to do this for addressable variables.  */
6164           if ((TREE_CODE (t) == VAR_DECL
6165                && !is_global_var (t))
6166               || TREE_CODE (t) == CONST_DECL)
6167             replace_by_duplicate_decl (tp, p->vars_map, p->to_context);
6168         }
6169       *walk_subtrees = 0;
6170     }
6171   else if (TYPE_P (t))
6172     *walk_subtrees = 0;
6173
6174   return NULL_TREE;
6175 }
6176
6177 /* Helper for move_stmt_r.  Given an EH region number for the source
6178    function, map that to the duplicate EH regio number in the dest.  */
6179
6180 static int
6181 move_stmt_eh_region_nr (int old_nr, struct move_stmt_d *p)
6182 {
6183   eh_region old_r, new_r;
6184   void **slot;
6185
6186   old_r = get_eh_region_from_number (old_nr);
6187   slot = pointer_map_contains (p->eh_map, old_r);
6188   new_r = (eh_region) *slot;
6189
6190   return new_r->index;
6191 }
6192
6193 /* Similar, but operate on INTEGER_CSTs.  */
6194
6195 static tree
6196 move_stmt_eh_region_tree_nr (tree old_t_nr, struct move_stmt_d *p)
6197 {
6198   int old_nr, new_nr;
6199
6200   old_nr = tree_low_cst (old_t_nr, 0);
6201   new_nr = move_stmt_eh_region_nr (old_nr, p);
6202
6203   return build_int_cst (integer_type_node, new_nr);
6204 }
6205
6206 /* Like move_stmt_op, but for gimple statements.
6207
6208    Helper for move_block_to_fn.  Set GIMPLE_BLOCK in every expression
6209    contained in the current statement in *GSI_P and change the
6210    DECL_CONTEXT of every local variable referenced in the current
6211    statement.  */
6212
6213 static tree
6214 move_stmt_r (gimple_stmt_iterator *gsi_p, bool *handled_ops_p,
6215              struct walk_stmt_info *wi)
6216 {
6217   struct move_stmt_d *p = (struct move_stmt_d *) wi->info;
6218   gimple stmt = gsi_stmt (*gsi_p);
6219   tree block = gimple_block (stmt);
6220
6221   if (p->orig_block == NULL_TREE
6222       || block == p->orig_block
6223       || block == NULL_TREE)
6224     gimple_set_block (stmt, p->new_block);
6225 #ifdef ENABLE_CHECKING
6226   else if (block != p->new_block)
6227     {
6228       while (block && block != p->orig_block)
6229         block = BLOCK_SUPERCONTEXT (block);
6230       gcc_assert (block);
6231     }
6232 #endif
6233
6234   switch (gimple_code (stmt))
6235     {
6236     case GIMPLE_CALL:
6237       /* Remap the region numbers for __builtin_eh_{pointer,filter}.  */
6238       {
6239         tree r, fndecl = gimple_call_fndecl (stmt);
6240         if (fndecl && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
6241           switch (DECL_FUNCTION_CODE (fndecl))
6242             {
6243             case BUILT_IN_EH_COPY_VALUES:
6244               r = gimple_call_arg (stmt, 1);
6245               r = move_stmt_eh_region_tree_nr (r, p);
6246               gimple_call_set_arg (stmt, 1, r);
6247               /* FALLTHRU */
6248
6249             case BUILT_IN_EH_POINTER:
6250             case BUILT_IN_EH_FILTER:
6251               r = gimple_call_arg (stmt, 0);
6252               r = move_stmt_eh_region_tree_nr (r, p);
6253               gimple_call_set_arg (stmt, 0, r);
6254               break;
6255
6256             default:
6257               break;
6258             }
6259       }
6260       break;
6261
6262     case GIMPLE_RESX:
6263       {
6264         int r = gimple_resx_region (stmt);
6265         r = move_stmt_eh_region_nr (r, p);
6266         gimple_resx_set_region (stmt, r);
6267       }
6268       break;
6269
6270     case GIMPLE_EH_DISPATCH:
6271       {
6272         int r = gimple_eh_dispatch_region (stmt);
6273         r = move_stmt_eh_region_nr (r, p);
6274         gimple_eh_dispatch_set_region (stmt, r);
6275       }
6276       break;
6277
6278     case GIMPLE_OMP_RETURN:
6279     case GIMPLE_OMP_CONTINUE:
6280       break;
6281     default:
6282       if (is_gimple_omp (stmt))
6283         {
6284           /* Do not remap variables inside OMP directives.  Variables
6285              referenced in clauses and directive header belong to the
6286              parent function and should not be moved into the child
6287              function.  */
6288           bool save_remap_decls_p = p->remap_decls_p;
6289           p->remap_decls_p = false;
6290           *handled_ops_p = true;
6291
6292           walk_gimple_seq_mod (gimple_omp_body_ptr (stmt), move_stmt_r,
6293                                move_stmt_op, wi);
6294
6295           p->remap_decls_p = save_remap_decls_p;
6296         }
6297       break;
6298     }
6299
6300   return NULL_TREE;
6301 }
6302
6303 /* Move basic block BB from function CFUN to function DEST_FN.  The
6304    block is moved out of the original linked list and placed after
6305    block AFTER in the new list.  Also, the block is removed from the
6306    original array of blocks and placed in DEST_FN's array of blocks.
6307    If UPDATE_EDGE_COUNT_P is true, the edge counts on both CFGs is
6308    updated to reflect the moved edges.
6309
6310    The local variables are remapped to new instances, VARS_MAP is used
6311    to record the mapping.  */
6312
6313 static void
6314 move_block_to_fn (struct function *dest_cfun, basic_block bb,
6315                   basic_block after, bool update_edge_count_p,
6316                   struct move_stmt_d *d)
6317 {
6318   struct control_flow_graph *cfg;
6319   edge_iterator ei;
6320   edge e;
6321   gimple_stmt_iterator si;
6322   unsigned old_len, new_len;
6323
6324   /* Remove BB from dominance structures.  */
6325   delete_from_dominance_info (CDI_DOMINATORS, bb);
6326   if (current_loops)
6327     remove_bb_from_loops (bb);
6328
6329   /* Link BB to the new linked list.  */
6330   move_block_after (bb, after);
6331
6332   /* Update the edge count in the corresponding flowgraphs.  */
6333   if (update_edge_count_p)
6334     FOR_EACH_EDGE (e, ei, bb->succs)
6335       {
6336         cfun->cfg->x_n_edges--;
6337         dest_cfun->cfg->x_n_edges++;
6338       }
6339
6340   /* Remove BB from the original basic block array.  */
6341   (*cfun->cfg->x_basic_block_info)[bb->index] = NULL;
6342   cfun->cfg->x_n_basic_blocks--;
6343
6344   /* Grow DEST_CFUN's basic block array if needed.  */
6345   cfg = dest_cfun->cfg;
6346   cfg->x_n_basic_blocks++;
6347   if (bb->index >= cfg->x_last_basic_block)
6348     cfg->x_last_basic_block = bb->index + 1;
6349
6350   old_len = vec_safe_length (cfg->x_basic_block_info);
6351   if ((unsigned) cfg->x_last_basic_block >= old_len)
6352     {
6353       new_len = cfg->x_last_basic_block + (cfg->x_last_basic_block + 3) / 4;
6354       vec_safe_grow_cleared (cfg->x_basic_block_info, new_len);
6355     }
6356
6357   (*cfg->x_basic_block_info)[bb->index] = bb;
6358
6359   /* Remap the variables in phi nodes.  */
6360   for (si = gsi_start_phis (bb); !gsi_end_p (si); )
6361     {
6362       gimple phi = gsi_stmt (si);
6363       use_operand_p use;
6364       tree op = PHI_RESULT (phi);
6365       ssa_op_iter oi;
6366       unsigned i;
6367
6368       if (virtual_operand_p (op))
6369         {
6370           /* Remove the phi nodes for virtual operands (alias analysis will be
6371              run for the new function, anyway).  */
6372           remove_phi_node (&si, true);
6373           continue;
6374         }
6375
6376       SET_PHI_RESULT (phi,
6377                       replace_ssa_name (op, d->vars_map, dest_cfun->decl));
6378       FOR_EACH_PHI_ARG (use, phi, oi, SSA_OP_USE)
6379         {
6380           op = USE_FROM_PTR (use);
6381           if (TREE_CODE (op) == SSA_NAME)
6382             SET_USE (use, replace_ssa_name (op, d->vars_map, dest_cfun->decl));
6383         }
6384
6385       for (i = 0; i < EDGE_COUNT (bb->preds); i++)
6386         {
6387           location_t locus = gimple_phi_arg_location (phi, i);
6388           tree block = LOCATION_BLOCK (locus);
6389
6390           if (locus == UNKNOWN_LOCATION)
6391             continue;
6392           if (d->orig_block == NULL_TREE || block == d->orig_block)
6393             {
6394               if (d->new_block == NULL_TREE)
6395                 locus = LOCATION_LOCUS (locus);
6396               else
6397                 locus = COMBINE_LOCATION_DATA (line_table, locus, d->new_block);
6398               gimple_phi_arg_set_location (phi, i, locus);
6399             }
6400         }
6401
6402       gsi_next (&si);
6403     }
6404
6405   for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
6406     {
6407       gimple stmt = gsi_stmt (si);
6408       struct walk_stmt_info wi;
6409
6410       memset (&wi, 0, sizeof (wi));
6411       wi.info = d;
6412       walk_gimple_stmt (&si, move_stmt_r, move_stmt_op, &wi);
6413
6414       if (gimple_code (stmt) == GIMPLE_LABEL)
6415         {
6416           tree label = gimple_label_label (stmt);
6417           int uid = LABEL_DECL_UID (label);
6418
6419           gcc_assert (uid > -1);
6420
6421           old_len = vec_safe_length (cfg->x_label_to_block_map);
6422           if (old_len <= (unsigned) uid)
6423             {
6424               new_len = 3 * uid / 2 + 1;
6425               vec_safe_grow_cleared (cfg->x_label_to_block_map, new_len);
6426             }
6427
6428           (*cfg->x_label_to_block_map)[uid] = bb;
6429           (*cfun->cfg->x_label_to_block_map)[uid] = NULL;
6430
6431           gcc_assert (DECL_CONTEXT (label) == dest_cfun->decl);
6432
6433           if (uid >= dest_cfun->cfg->last_label_uid)
6434             dest_cfun->cfg->last_label_uid = uid + 1;
6435         }
6436
6437       maybe_duplicate_eh_stmt_fn (dest_cfun, stmt, cfun, stmt, d->eh_map, 0);
6438       remove_stmt_from_eh_lp_fn (cfun, stmt);
6439
6440       gimple_duplicate_stmt_histograms (dest_cfun, stmt, cfun, stmt);
6441       gimple_remove_stmt_histograms (cfun, stmt);
6442
6443       /* We cannot leave any operands allocated from the operand caches of
6444          the current function.  */
6445       free_stmt_operands (stmt);
6446       push_cfun (dest_cfun);
6447       update_stmt (stmt);
6448       pop_cfun ();
6449     }
6450
6451   FOR_EACH_EDGE (e, ei, bb->succs)
6452     if (e->goto_locus != UNKNOWN_LOCATION)
6453       {
6454         tree block = LOCATION_BLOCK (e->goto_locus);
6455         if (d->orig_block == NULL_TREE
6456             || block == d->orig_block)
6457           e->goto_locus = d->new_block ?
6458               COMBINE_LOCATION_DATA (line_table, e->goto_locus, d->new_block) :
6459               LOCATION_LOCUS (e->goto_locus);
6460 #ifdef ENABLE_CHECKING
6461         else if (block != d->new_block)
6462           {
6463             while (block && block != d->orig_block)
6464               block = BLOCK_SUPERCONTEXT (block);
6465             gcc_assert (block);
6466           }
6467 #endif
6468       }
6469 }
6470
6471 /* Examine the statements in BB (which is in SRC_CFUN); find and return
6472    the outermost EH region.  Use REGION as the incoming base EH region.  */
6473
6474 static eh_region
6475 find_outermost_region_in_block (struct function *src_cfun,
6476                                 basic_block bb, eh_region region)
6477 {
6478   gimple_stmt_iterator si;
6479
6480   for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
6481     {
6482       gimple stmt = gsi_stmt (si);
6483       eh_region stmt_region;
6484       int lp_nr;
6485
6486       lp_nr = lookup_stmt_eh_lp_fn (src_cfun, stmt);
6487       stmt_region = get_eh_region_from_lp_number_fn (src_cfun, lp_nr);
6488       if (stmt_region)
6489         {
6490           if (region == NULL)
6491             region = stmt_region;
6492           else if (stmt_region != region)
6493             {
6494               region = eh_region_outermost (src_cfun, stmt_region, region);
6495               gcc_assert (region != NULL);
6496             }
6497         }
6498     }
6499
6500   return region;
6501 }
6502
6503 static tree
6504 new_label_mapper (tree decl, void *data)
6505 {
6506   htab_t hash = (htab_t) data;
6507   struct tree_map *m;
6508   void **slot;
6509
6510   gcc_assert (TREE_CODE (decl) == LABEL_DECL);
6511
6512   m = XNEW (struct tree_map);
6513   m->hash = DECL_UID (decl);
6514   m->base.from = decl;
6515   m->to = create_artificial_label (UNKNOWN_LOCATION);
6516   LABEL_DECL_UID (m->to) = LABEL_DECL_UID (decl);
6517   if (LABEL_DECL_UID (m->to) >= cfun->cfg->last_label_uid)
6518     cfun->cfg->last_label_uid = LABEL_DECL_UID (m->to) + 1;
6519
6520   slot = htab_find_slot_with_hash (hash, m, m->hash, INSERT);
6521   gcc_assert (*slot == NULL);
6522
6523   *slot = m;
6524
6525   return m->to;
6526 }
6527
6528 /* Change DECL_CONTEXT of all BLOCK_VARS in block, including
6529    subblocks.  */
6530
6531 static void
6532 replace_block_vars_by_duplicates (tree block, struct pointer_map_t *vars_map,
6533                                   tree to_context)
6534 {
6535   tree *tp, t;
6536
6537   for (tp = &BLOCK_VARS (block); *tp; tp = &DECL_CHAIN (*tp))
6538     {
6539       t = *tp;
6540       if (TREE_CODE (t) != VAR_DECL && TREE_CODE (t) != CONST_DECL)
6541         continue;
6542       replace_by_duplicate_decl (&t, vars_map, to_context);
6543       if (t != *tp)
6544         {
6545           if (TREE_CODE (*tp) == VAR_DECL && DECL_HAS_VALUE_EXPR_P (*tp))
6546             {
6547               SET_DECL_VALUE_EXPR (t, DECL_VALUE_EXPR (*tp));
6548               DECL_HAS_VALUE_EXPR_P (t) = 1;
6549             }
6550           DECL_CHAIN (t) = DECL_CHAIN (*tp);
6551           *tp = t;
6552         }
6553     }
6554
6555   for (block = BLOCK_SUBBLOCKS (block); block; block = BLOCK_CHAIN (block))
6556     replace_block_vars_by_duplicates (block, vars_map, to_context);
6557 }
6558
6559 /* Move a single-entry, single-exit region delimited by ENTRY_BB and
6560    EXIT_BB to function DEST_CFUN.  The whole region is replaced by a
6561    single basic block in the original CFG and the new basic block is
6562    returned.  DEST_CFUN must not have a CFG yet.
6563
6564    Note that the region need not be a pure SESE region.  Blocks inside
6565    the region may contain calls to abort/exit.  The only restriction
6566    is that ENTRY_BB should be the only entry point and it must
6567    dominate EXIT_BB.
6568
6569    Change TREE_BLOCK of all statements in ORIG_BLOCK to the new
6570    functions outermost BLOCK, move all subblocks of ORIG_BLOCK
6571    to the new function.
6572
6573    All local variables referenced in the region are assumed to be in
6574    the corresponding BLOCK_VARS and unexpanded variable lists
6575    associated with DEST_CFUN.  */
6576
6577 basic_block
6578 move_sese_region_to_fn (struct function *dest_cfun, basic_block entry_bb,
6579                         basic_block exit_bb, tree orig_block)
6580 {
6581   vec<basic_block> bbs, dom_bbs;
6582   basic_block dom_entry = get_immediate_dominator (CDI_DOMINATORS, entry_bb);
6583   basic_block after, bb, *entry_pred, *exit_succ, abb;
6584   struct function *saved_cfun = cfun;
6585   int *entry_flag, *exit_flag;
6586   unsigned *entry_prob, *exit_prob;
6587   unsigned i, num_entry_edges, num_exit_edges;
6588   edge e;
6589   edge_iterator ei;
6590   htab_t new_label_map;
6591   struct pointer_map_t *vars_map, *eh_map;
6592   struct loop *loop = entry_bb->loop_father;
6593   struct move_stmt_d d;
6594
6595   /* If ENTRY does not strictly dominate EXIT, this cannot be an SESE
6596      region.  */
6597   gcc_assert (entry_bb != exit_bb
6598               && (!exit_bb
6599                   || dominated_by_p (CDI_DOMINATORS, exit_bb, entry_bb)));
6600
6601   /* Collect all the blocks in the region.  Manually add ENTRY_BB
6602      because it won't be added by dfs_enumerate_from.  */
6603   bbs.create (0);
6604   bbs.safe_push (entry_bb);
6605   gather_blocks_in_sese_region (entry_bb, exit_bb, &bbs);
6606
6607   /* The blocks that used to be dominated by something in BBS will now be
6608      dominated by the new block.  */
6609   dom_bbs = get_dominated_by_region (CDI_DOMINATORS,
6610                                      bbs.address (),
6611                                      bbs.length ());
6612
6613   /* Detach ENTRY_BB and EXIT_BB from CFUN->CFG.  We need to remember
6614      the predecessor edges to ENTRY_BB and the successor edges to
6615      EXIT_BB so that we can re-attach them to the new basic block that
6616      will replace the region.  */
6617   num_entry_edges = EDGE_COUNT (entry_bb->preds);
6618   entry_pred = XNEWVEC (basic_block, num_entry_edges);
6619   entry_flag = XNEWVEC (int, num_entry_edges);
6620   entry_prob = XNEWVEC (unsigned, num_entry_edges);
6621   i = 0;
6622   for (ei = ei_start (entry_bb->preds); (e = ei_safe_edge (ei)) != NULL;)
6623     {
6624       entry_prob[i] = e->probability;
6625       entry_flag[i] = e->flags;
6626       entry_pred[i++] = e->src;
6627       remove_edge (e);
6628     }
6629
6630   if (exit_bb)
6631     {
6632       num_exit_edges = EDGE_COUNT (exit_bb->succs);
6633       exit_succ = XNEWVEC (basic_block, num_exit_edges);
6634       exit_flag = XNEWVEC (int, num_exit_edges);
6635       exit_prob = XNEWVEC (unsigned, num_exit_edges);
6636       i = 0;
6637       for (ei = ei_start (exit_bb->succs); (e = ei_safe_edge (ei)) != NULL;)
6638         {
6639           exit_prob[i] = e->probability;
6640           exit_flag[i] = e->flags;
6641           exit_succ[i++] = e->dest;
6642           remove_edge (e);
6643         }
6644     }
6645   else
6646     {
6647       num_exit_edges = 0;
6648       exit_succ = NULL;
6649       exit_flag = NULL;
6650       exit_prob = NULL;
6651     }
6652
6653   /* Switch context to the child function to initialize DEST_FN's CFG.  */
6654   gcc_assert (dest_cfun->cfg == NULL);
6655   push_cfun (dest_cfun);
6656
6657   init_empty_tree_cfg ();
6658
6659   /* Initialize EH information for the new function.  */
6660   eh_map = NULL;
6661   new_label_map = NULL;
6662   if (saved_cfun->eh)
6663     {
6664       eh_region region = NULL;
6665
6666       FOR_EACH_VEC_ELT (bbs, i, bb)
6667         region = find_outermost_region_in_block (saved_cfun, bb, region);
6668
6669       init_eh_for_function ();
6670       if (region != NULL)
6671         {
6672           new_label_map = htab_create (17, tree_map_hash, tree_map_eq, free);
6673           eh_map = duplicate_eh_regions (saved_cfun, region, 0,
6674                                          new_label_mapper, new_label_map);
6675         }
6676     }
6677
6678   pop_cfun ();
6679
6680   /* Move blocks from BBS into DEST_CFUN.  */
6681   gcc_assert (bbs.length () >= 2);
6682   after = dest_cfun->cfg->x_entry_block_ptr;
6683   vars_map = pointer_map_create ();
6684
6685   memset (&d, 0, sizeof (d));
6686   d.orig_block = orig_block;
6687   d.new_block = DECL_INITIAL (dest_cfun->decl);
6688   d.from_context = cfun->decl;
6689   d.to_context = dest_cfun->decl;
6690   d.vars_map = vars_map;
6691   d.new_label_map = new_label_map;
6692   d.eh_map = eh_map;
6693   d.remap_decls_p = true;
6694
6695   FOR_EACH_VEC_ELT (bbs, i, bb)
6696     {
6697       /* No need to update edge counts on the last block.  It has
6698          already been updated earlier when we detached the region from
6699          the original CFG.  */
6700       move_block_to_fn (dest_cfun, bb, after, bb != exit_bb, &d);
6701       after = bb;
6702     }
6703
6704   /* Rewire BLOCK_SUBBLOCKS of orig_block.  */
6705   if (orig_block)
6706     {
6707       tree block;
6708       gcc_assert (BLOCK_SUBBLOCKS (DECL_INITIAL (dest_cfun->decl))
6709                   == NULL_TREE);
6710       BLOCK_SUBBLOCKS (DECL_INITIAL (dest_cfun->decl))
6711         = BLOCK_SUBBLOCKS (orig_block);
6712       for (block = BLOCK_SUBBLOCKS (orig_block);
6713            block; block = BLOCK_CHAIN (block))
6714         BLOCK_SUPERCONTEXT (block) = DECL_INITIAL (dest_cfun->decl);
6715       BLOCK_SUBBLOCKS (orig_block) = NULL_TREE;
6716     }
6717
6718   replace_block_vars_by_duplicates (DECL_INITIAL (dest_cfun->decl),
6719                                     vars_map, dest_cfun->decl);
6720
6721   if (new_label_map)
6722     htab_delete (new_label_map);
6723   if (eh_map)
6724     pointer_map_destroy (eh_map);
6725   pointer_map_destroy (vars_map);
6726
6727   /* Rewire the entry and exit blocks.  The successor to the entry
6728      block turns into the successor of DEST_FN's ENTRY_BLOCK_PTR in
6729      the child function.  Similarly, the predecessor of DEST_FN's
6730      EXIT_BLOCK_PTR turns into the predecessor of EXIT_BLOCK_PTR.  We
6731      need to switch CFUN between DEST_CFUN and SAVED_CFUN so that the
6732      various CFG manipulation function get to the right CFG.
6733
6734      FIXME, this is silly.  The CFG ought to become a parameter to
6735      these helpers.  */
6736   push_cfun (dest_cfun);
6737   make_edge (ENTRY_BLOCK_PTR, entry_bb, EDGE_FALLTHRU);
6738   if (exit_bb)
6739     make_edge (exit_bb,  EXIT_BLOCK_PTR, 0);
6740   pop_cfun ();
6741
6742   /* Back in the original function, the SESE region has disappeared,
6743      create a new basic block in its place.  */
6744   bb = create_empty_bb (entry_pred[0]);
6745   if (current_loops)
6746     add_bb_to_loop (bb, loop);
6747   for (i = 0; i < num_entry_edges; i++)
6748     {
6749       e = make_edge (entry_pred[i], bb, entry_flag[i]);
6750       e->probability = entry_prob[i];
6751     }
6752
6753   for (i = 0; i < num_exit_edges; i++)
6754     {
6755       e = make_edge (bb, exit_succ[i], exit_flag[i]);
6756       e->probability = exit_prob[i];
6757     }
6758
6759   set_immediate_dominator (CDI_DOMINATORS, bb, dom_entry);
6760   FOR_EACH_VEC_ELT (dom_bbs, i, abb)
6761     set_immediate_dominator (CDI_DOMINATORS, abb, bb);
6762   dom_bbs.release ();
6763
6764   if (exit_bb)
6765     {
6766       free (exit_prob);
6767       free (exit_flag);
6768       free (exit_succ);
6769     }
6770   free (entry_prob);
6771   free (entry_flag);
6772   free (entry_pred);
6773   bbs.release ();
6774
6775   return bb;
6776 }
6777
6778
6779 /* Dump FUNCTION_DECL FN to file FILE using FLAGS (see TDF_* in dumpfile.h)
6780    */
6781
6782 void
6783 dump_function_to_file (tree fndecl, FILE *file, int flags)
6784 {
6785   tree arg, var, old_current_fndecl = current_function_decl;
6786   struct function *dsf;
6787   bool ignore_topmost_bind = false, any_var = false;
6788   basic_block bb;
6789   tree chain;
6790   bool tmclone = (TREE_CODE (fndecl) == FUNCTION_DECL
6791                   && decl_is_tm_clone (fndecl));
6792   struct function *fun = DECL_STRUCT_FUNCTION (fndecl);
6793
6794   current_function_decl = fndecl;
6795   fprintf (file, "%s %s(", function_name (fun), tmclone ? "[tm-clone] " : "");
6796
6797   arg = DECL_ARGUMENTS (fndecl);
6798   while (arg)
6799     {
6800       print_generic_expr (file, TREE_TYPE (arg), dump_flags);
6801       fprintf (file, " ");
6802       print_generic_expr (file, arg, dump_flags);
6803       if (flags & TDF_VERBOSE)
6804         print_node (file, "", arg, 4);
6805       if (DECL_CHAIN (arg))
6806         fprintf (file, ", ");
6807       arg = DECL_CHAIN (arg);
6808     }
6809   fprintf (file, ")\n");
6810
6811   if (flags & TDF_VERBOSE)
6812     print_node (file, "", fndecl, 2);
6813
6814   dsf = DECL_STRUCT_FUNCTION (fndecl);
6815   if (dsf && (flags & TDF_EH))
6816     dump_eh_tree (file, dsf);
6817
6818   if (flags & TDF_RAW && !gimple_has_body_p (fndecl))
6819     {
6820       dump_node (fndecl, TDF_SLIM | flags, file);
6821       current_function_decl = old_current_fndecl;
6822       return;
6823     }
6824
6825   /* When GIMPLE is lowered, the variables are no longer available in
6826      BIND_EXPRs, so display them separately.  */
6827   if (fun && fun->decl == fndecl && (fun->curr_properties & PROP_gimple_lcf))
6828     {
6829       unsigned ix;
6830       ignore_topmost_bind = true;
6831
6832       fprintf (file, "{\n");
6833       if (!vec_safe_is_empty (fun->local_decls))
6834         FOR_EACH_LOCAL_DECL (fun, ix, var)
6835           {
6836             print_generic_decl (file, var, flags);
6837             if (flags & TDF_VERBOSE)
6838               print_node (file, "", var, 4);
6839             fprintf (file, "\n");
6840
6841             any_var = true;
6842           }
6843       if (gimple_in_ssa_p (cfun))
6844         for (ix = 1; ix < num_ssa_names; ++ix)
6845           {
6846             tree name = ssa_name (ix);
6847             if (name && !SSA_NAME_VAR (name))
6848               {
6849                 fprintf (file, "  ");
6850                 print_generic_expr (file, TREE_TYPE (name), flags);
6851                 fprintf (file, " ");
6852                 print_generic_expr (file, name, flags);
6853                 fprintf (file, ";\n");
6854
6855                 any_var = true;
6856               }
6857           }
6858     }
6859
6860   if (fun && fun->decl == fndecl
6861       && fun->cfg
6862       && basic_block_info_for_function (fun))
6863     {
6864       /* If the CFG has been built, emit a CFG-based dump.  */
6865       if (!ignore_topmost_bind)
6866         fprintf (file, "{\n");
6867
6868       if (any_var && n_basic_blocks_for_function (fun))
6869         fprintf (file, "\n");
6870
6871       FOR_EACH_BB_FN (bb, fun)
6872         dump_bb (file, bb, 2, flags | TDF_COMMENT);
6873
6874       fprintf (file, "}\n");
6875     }
6876   else if (DECL_SAVED_TREE (fndecl) == NULL)
6877     {
6878       /* The function is now in GIMPLE form but the CFG has not been
6879          built yet.  Emit the single sequence of GIMPLE statements
6880          that make up its body.  */
6881       gimple_seq body = gimple_body (fndecl);
6882
6883       if (gimple_seq_first_stmt (body)
6884           && gimple_seq_first_stmt (body) == gimple_seq_last_stmt (body)
6885           && gimple_code (gimple_seq_first_stmt (body)) == GIMPLE_BIND)
6886         print_gimple_seq (file, body, 0, flags);
6887       else
6888         {
6889           if (!ignore_topmost_bind)
6890             fprintf (file, "{\n");
6891
6892           if (any_var)
6893             fprintf (file, "\n");
6894
6895           print_gimple_seq (file, body, 2, flags);
6896           fprintf (file, "}\n");
6897         }
6898     }
6899   else
6900     {
6901       int indent;
6902
6903       /* Make a tree based dump.  */
6904       chain = DECL_SAVED_TREE (fndecl);
6905       if (chain && TREE_CODE (chain) == BIND_EXPR)
6906         {
6907           if (ignore_topmost_bind)
6908             {
6909               chain = BIND_EXPR_BODY (chain);
6910               indent = 2;
6911             }
6912           else
6913             indent = 0;
6914         }
6915       else
6916         {
6917           if (!ignore_topmost_bind)
6918             fprintf (file, "{\n");
6919           indent = 2;
6920         }
6921
6922       if (any_var)
6923         fprintf (file, "\n");
6924
6925       print_generic_stmt_indented (file, chain, flags, indent);
6926       if (ignore_topmost_bind)
6927         fprintf (file, "}\n");
6928     }
6929
6930   if (flags & TDF_ENUMERATE_LOCALS)
6931     dump_enumerated_decls (file, flags);
6932   fprintf (file, "\n\n");
6933
6934   current_function_decl = old_current_fndecl;
6935 }
6936
6937 /* Dump FUNCTION_DECL FN to stderr using FLAGS (see TDF_* in tree.h)  */
6938
6939 DEBUG_FUNCTION void
6940 debug_function (tree fn, int flags)
6941 {
6942   dump_function_to_file (fn, stderr, flags);
6943 }
6944
6945
6946 /* Print on FILE the indexes for the predecessors of basic_block BB.  */
6947
6948 static void
6949 print_pred_bbs (FILE *file, basic_block bb)
6950 {
6951   edge e;
6952   edge_iterator ei;
6953
6954   FOR_EACH_EDGE (e, ei, bb->preds)
6955     fprintf (file, "bb_%d ", e->src->index);
6956 }
6957
6958
6959 /* Print on FILE the indexes for the successors of basic_block BB.  */
6960
6961 static void
6962 print_succ_bbs (FILE *file, basic_block bb)
6963 {
6964   edge e;
6965   edge_iterator ei;
6966
6967   FOR_EACH_EDGE (e, ei, bb->succs)
6968     fprintf (file, "bb_%d ", e->dest->index);
6969 }
6970
6971 /* Print to FILE the basic block BB following the VERBOSITY level.  */
6972
6973 void
6974 print_loops_bb (FILE *file, basic_block bb, int indent, int verbosity)
6975 {
6976   char *s_indent = (char *) alloca ((size_t) indent + 1);
6977   memset ((void *) s_indent, ' ', (size_t) indent);
6978   s_indent[indent] = '\0';
6979
6980   /* Print basic_block's header.  */
6981   if (verbosity >= 2)
6982     {
6983       fprintf (file, "%s  bb_%d (preds = {", s_indent, bb->index);
6984       print_pred_bbs (file, bb);
6985       fprintf (file, "}, succs = {");
6986       print_succ_bbs (file, bb);
6987       fprintf (file, "})\n");
6988     }
6989
6990   /* Print basic_block's body.  */
6991   if (verbosity >= 3)
6992     {
6993       fprintf (file, "%s  {\n", s_indent);
6994       dump_bb (file, bb, indent + 4, TDF_VOPS|TDF_MEMSYMS);
6995       fprintf (file, "%s  }\n", s_indent);
6996     }
6997 }
6998
6999 static void print_loop_and_siblings (FILE *, struct loop *, int, int);
7000
7001 /* Pretty print LOOP on FILE, indented INDENT spaces.  Following
7002    VERBOSITY level this outputs the contents of the loop, or just its
7003    structure.  */
7004
7005 static void
7006 print_loop (FILE *file, struct loop *loop, int indent, int verbosity)
7007 {
7008   char *s_indent;
7009   basic_block bb;
7010
7011   if (loop == NULL)
7012     return;
7013
7014   s_indent = (char *) alloca ((size_t) indent + 1);
7015   memset ((void *) s_indent, ' ', (size_t) indent);
7016   s_indent[indent] = '\0';
7017
7018   /* Print loop's header.  */
7019   fprintf (file, "%sloop_%d (", s_indent, loop->num);
7020   if (loop->header)
7021     fprintf (file, "header = %d", loop->header->index);
7022   else
7023     {
7024       fprintf (file, "deleted)\n");
7025       return;
7026     }
7027   if (loop->latch)
7028     fprintf (file, ", latch = %d", loop->latch->index);
7029   else
7030     fprintf (file, ", multiple latches");
7031   fprintf (file, ", niter = ");
7032   print_generic_expr (file, loop->nb_iterations, 0);
7033
7034   if (loop->any_upper_bound)
7035     {
7036       fprintf (file, ", upper_bound = ");
7037       dump_double_int (file, loop->nb_iterations_upper_bound, true);
7038     }
7039
7040   if (loop->any_estimate)
7041     {
7042       fprintf (file, ", estimate = ");
7043       dump_double_int (file, loop->nb_iterations_estimate, true);
7044     }
7045   fprintf (file, ")\n");
7046
7047   /* Print loop's body.  */
7048   if (verbosity >= 1)
7049     {
7050       fprintf (file, "%s{\n", s_indent);
7051       FOR_EACH_BB (bb)
7052         if (bb->loop_father == loop)
7053           print_loops_bb (file, bb, indent, verbosity);
7054
7055       print_loop_and_siblings (file, loop->inner, indent + 2, verbosity);
7056       fprintf (file, "%s}\n", s_indent);
7057     }
7058 }
7059
7060 /* Print the LOOP and its sibling loops on FILE, indented INDENT
7061    spaces.  Following VERBOSITY level this outputs the contents of the
7062    loop, or just its structure.  */
7063
7064 static void
7065 print_loop_and_siblings (FILE *file, struct loop *loop, int indent,
7066                          int verbosity)
7067 {
7068   if (loop == NULL)
7069     return;
7070
7071   print_loop (file, loop, indent, verbosity);
7072   print_loop_and_siblings (file, loop->next, indent, verbosity);
7073 }
7074
7075 /* Follow a CFG edge from the entry point of the program, and on entry
7076    of a loop, pretty print the loop structure on FILE.  */
7077
7078 void
7079 print_loops (FILE *file, int verbosity)
7080 {
7081   basic_block bb;
7082
7083   bb = ENTRY_BLOCK_PTR;
7084   if (bb && bb->loop_father)
7085     print_loop_and_siblings (file, bb->loop_father, 0, verbosity);
7086 }
7087
7088 /* Dump a loop.  */
7089
7090 DEBUG_FUNCTION void
7091 debug (struct loop &ref)
7092 {
7093   print_loop (stderr, &ref, 0, /*verbosity*/0);
7094 }
7095
7096 DEBUG_FUNCTION void
7097 debug (struct loop *ptr)
7098 {
7099   if (ptr)
7100     debug (*ptr);
7101   else
7102     fprintf (stderr, "<nil>\n");
7103 }
7104
7105 /* Dump a loop verbosely.  */
7106
7107 DEBUG_FUNCTION void
7108 debug_verbose (struct loop &ref)
7109 {
7110   print_loop (stderr, &ref, 0, /*verbosity*/3);
7111 }
7112
7113 DEBUG_FUNCTION void
7114 debug_verbose (struct loop *ptr)
7115 {
7116   if (ptr)
7117     debug (*ptr);
7118   else
7119     fprintf (stderr, "<nil>\n");
7120 }
7121
7122
7123 /* Debugging loops structure at tree level, at some VERBOSITY level.  */
7124
7125 DEBUG_FUNCTION void
7126 debug_loops (int verbosity)
7127 {
7128   print_loops (stderr, verbosity);
7129 }
7130
7131 /* Print on stderr the code of LOOP, at some VERBOSITY level.  */
7132
7133 DEBUG_FUNCTION void
7134 debug_loop (struct loop *loop, int verbosity)
7135 {
7136   print_loop (stderr, loop, 0, verbosity);
7137 }
7138
7139 /* Print on stderr the code of loop number NUM, at some VERBOSITY
7140    level.  */
7141
7142 DEBUG_FUNCTION void
7143 debug_loop_num (unsigned num, int verbosity)
7144 {
7145   debug_loop (get_loop (num), verbosity);
7146 }
7147
7148 /* Return true if BB ends with a call, possibly followed by some
7149    instructions that must stay with the call.  Return false,
7150    otherwise.  */
7151
7152 static bool
7153 gimple_block_ends_with_call_p (basic_block bb)
7154 {
7155   gimple_stmt_iterator gsi = gsi_last_nondebug_bb (bb);
7156   return !gsi_end_p (gsi) && is_gimple_call (gsi_stmt (gsi));
7157 }
7158
7159
7160 /* Return true if BB ends with a conditional branch.  Return false,
7161    otherwise.  */
7162
7163 static bool
7164 gimple_block_ends_with_condjump_p (const_basic_block bb)
7165 {
7166   gimple stmt = last_stmt (CONST_CAST_BB (bb));
7167   return (stmt && gimple_code (stmt) == GIMPLE_COND);
7168 }
7169
7170
7171 /* Return true if we need to add fake edge to exit at statement T.
7172    Helper function for gimple_flow_call_edges_add.  */
7173
7174 static bool
7175 need_fake_edge_p (gimple t)
7176 {
7177   tree fndecl = NULL_TREE;
7178   int call_flags = 0;
7179
7180   /* NORETURN and LONGJMP calls already have an edge to exit.
7181      CONST and PURE calls do not need one.
7182      We don't currently check for CONST and PURE here, although
7183      it would be a good idea, because those attributes are
7184      figured out from the RTL in mark_constant_function, and
7185      the counter incrementation code from -fprofile-arcs
7186      leads to different results from -fbranch-probabilities.  */
7187   if (is_gimple_call (t))
7188     {
7189       fndecl = gimple_call_fndecl (t);
7190       call_flags = gimple_call_flags (t);
7191     }
7192
7193   if (is_gimple_call (t)
7194       && fndecl
7195       && DECL_BUILT_IN (fndecl)
7196       && (call_flags & ECF_NOTHROW)
7197       && !(call_flags & ECF_RETURNS_TWICE)
7198       /* fork() doesn't really return twice, but the effect of
7199          wrapping it in __gcov_fork() which calls __gcov_flush()
7200          and clears the counters before forking has the same
7201          effect as returning twice.  Force a fake edge.  */
7202       && !(DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
7203            && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_FORK))
7204     return false;
7205
7206   if (is_gimple_call (t))
7207     {
7208       edge_iterator ei;
7209       edge e;
7210       basic_block bb;
7211
7212       if (!(call_flags & ECF_NORETURN))
7213         return true;
7214
7215       bb = gimple_bb (t);
7216       FOR_EACH_EDGE (e, ei, bb->succs)
7217         if ((e->flags & EDGE_FAKE) == 0)
7218           return true;
7219     }
7220
7221   if (gimple_code (t) == GIMPLE_ASM
7222        && (gimple_asm_volatile_p (t) || gimple_asm_input_p (t)))
7223     return true;
7224
7225   return false;
7226 }
7227
7228
7229 /* Add fake edges to the function exit for any non constant and non
7230    noreturn calls (or noreturn calls with EH/abnormal edges),
7231    volatile inline assembly in the bitmap of blocks specified by BLOCKS
7232    or to the whole CFG if BLOCKS is zero.  Return the number of blocks
7233    that were split.
7234
7235    The goal is to expose cases in which entering a basic block does
7236    not imply that all subsequent instructions must be executed.  */
7237
7238 static int
7239 gimple_flow_call_edges_add (sbitmap blocks)
7240 {
7241   int i;
7242   int blocks_split = 0;
7243   int last_bb = last_basic_block;
7244   bool check_last_block = false;
7245
7246   if (n_basic_blocks == NUM_FIXED_BLOCKS)
7247     return 0;
7248
7249   if (! blocks)
7250     check_last_block = true;
7251   else
7252     check_last_block = bitmap_bit_p (blocks, EXIT_BLOCK_PTR->prev_bb->index);
7253
7254   /* In the last basic block, before epilogue generation, there will be
7255      a fallthru edge to EXIT.  Special care is required if the last insn
7256      of the last basic block is a call because make_edge folds duplicate
7257      edges, which would result in the fallthru edge also being marked
7258      fake, which would result in the fallthru edge being removed by
7259      remove_fake_edges, which would result in an invalid CFG.
7260
7261      Moreover, we can't elide the outgoing fake edge, since the block
7262      profiler needs to take this into account in order to solve the minimal
7263      spanning tree in the case that the call doesn't return.
7264
7265      Handle this by adding a dummy instruction in a new last basic block.  */
7266   if (check_last_block)
7267     {
7268       basic_block bb = EXIT_BLOCK_PTR->prev_bb;
7269       gimple_stmt_iterator gsi = gsi_last_nondebug_bb (bb);
7270       gimple t = NULL;
7271
7272       if (!gsi_end_p (gsi))
7273         t = gsi_stmt (gsi);
7274
7275       if (t && need_fake_edge_p (t))
7276         {
7277           edge e;
7278
7279           e = find_edge (bb, EXIT_BLOCK_PTR);
7280           if (e)
7281             {
7282               gsi_insert_on_edge (e, gimple_build_nop ());
7283               gsi_commit_edge_inserts ();
7284             }
7285         }
7286     }
7287
7288   /* Now add fake edges to the function exit for any non constant
7289      calls since there is no way that we can determine if they will
7290      return or not...  */
7291   for (i = 0; i < last_bb; i++)
7292     {
7293       basic_block bb = BASIC_BLOCK (i);
7294       gimple_stmt_iterator gsi;
7295       gimple stmt, last_stmt;
7296
7297       if (!bb)
7298         continue;
7299
7300       if (blocks && !bitmap_bit_p (blocks, i))
7301         continue;
7302
7303       gsi = gsi_last_nondebug_bb (bb);
7304       if (!gsi_end_p (gsi))
7305         {
7306           last_stmt = gsi_stmt (gsi);
7307           do
7308             {
7309               stmt = gsi_stmt (gsi);
7310               if (need_fake_edge_p (stmt))
7311                 {
7312                   edge e;
7313
7314                   /* The handling above of the final block before the
7315                      epilogue should be enough to verify that there is
7316                      no edge to the exit block in CFG already.
7317                      Calling make_edge in such case would cause us to
7318                      mark that edge as fake and remove it later.  */
7319 #ifdef ENABLE_CHECKING
7320                   if (stmt == last_stmt)
7321                     {
7322                       e = find_edge (bb, EXIT_BLOCK_PTR);
7323                       gcc_assert (e == NULL);
7324                     }
7325 #endif
7326
7327                   /* Note that the following may create a new basic block
7328                      and renumber the existing basic blocks.  */
7329                   if (stmt != last_stmt)
7330                     {
7331                       e = split_block (bb, stmt);
7332                       if (e)
7333                         blocks_split++;
7334                     }
7335                   make_edge (bb, EXIT_BLOCK_PTR, EDGE_FAKE);
7336                 }
7337               gsi_prev (&gsi);
7338             }
7339           while (!gsi_end_p (gsi));
7340         }
7341     }
7342
7343   if (blocks_split)
7344     verify_flow_info ();
7345
7346   return blocks_split;
7347 }
7348
7349 /* Removes edge E and all the blocks dominated by it, and updates dominance
7350    information.  The IL in E->src needs to be updated separately.
7351    If dominance info is not available, only the edge E is removed.*/
7352
7353 void
7354 remove_edge_and_dominated_blocks (edge e)
7355 {
7356   vec<basic_block> bbs_to_remove = vNULL;
7357   vec<basic_block> bbs_to_fix_dom = vNULL;
7358   bitmap df, df_idom;
7359   edge f;
7360   edge_iterator ei;
7361   bool none_removed = false;
7362   unsigned i;
7363   basic_block bb, dbb;
7364   bitmap_iterator bi;
7365
7366   if (!dom_info_available_p (CDI_DOMINATORS))
7367     {
7368       remove_edge (e);
7369       return;
7370     }
7371
7372   /* No updating is needed for edges to exit.  */
7373   if (e->dest == EXIT_BLOCK_PTR)
7374     {
7375       if (cfgcleanup_altered_bbs)
7376         bitmap_set_bit (cfgcleanup_altered_bbs, e->src->index);
7377       remove_edge (e);
7378       return;
7379     }
7380
7381   /* First, we find the basic blocks to remove.  If E->dest has a predecessor
7382      that is not dominated by E->dest, then this set is empty.  Otherwise,
7383      all the basic blocks dominated by E->dest are removed.
7384
7385      Also, to DF_IDOM we store the immediate dominators of the blocks in
7386      the dominance frontier of E (i.e., of the successors of the
7387      removed blocks, if there are any, and of E->dest otherwise).  */
7388   FOR_EACH_EDGE (f, ei, e->dest->preds)
7389     {
7390       if (f == e)
7391         continue;
7392
7393       if (!dominated_by_p (CDI_DOMINATORS, f->src, e->dest))
7394         {
7395           none_removed = true;
7396           break;
7397         }
7398     }
7399
7400   df = BITMAP_ALLOC (NULL);
7401   df_idom = BITMAP_ALLOC (NULL);
7402
7403   if (none_removed)
7404     bitmap_set_bit (df_idom,
7405                     get_immediate_dominator (CDI_DOMINATORS, e->dest)->index);
7406   else
7407     {
7408       bbs_to_remove = get_all_dominated_blocks (CDI_DOMINATORS, e->dest);
7409       FOR_EACH_VEC_ELT (bbs_to_remove, i, bb)
7410         {
7411           FOR_EACH_EDGE (f, ei, bb->succs)
7412             {
7413               if (f->dest != EXIT_BLOCK_PTR)
7414                 bitmap_set_bit (df, f->dest->index);
7415             }
7416         }
7417       FOR_EACH_VEC_ELT (bbs_to_remove, i, bb)
7418         bitmap_clear_bit (df, bb->index);
7419
7420       EXECUTE_IF_SET_IN_BITMAP (df, 0, i, bi)
7421         {
7422           bb = BASIC_BLOCK (i);
7423           bitmap_set_bit (df_idom,
7424                           get_immediate_dominator (CDI_DOMINATORS, bb)->index);
7425         }
7426     }
7427
7428   if (cfgcleanup_altered_bbs)
7429     {
7430       /* Record the set of the altered basic blocks.  */
7431       bitmap_set_bit (cfgcleanup_altered_bbs, e->src->index);
7432       bitmap_ior_into (cfgcleanup_altered_bbs, df);
7433     }
7434
7435   /* Remove E and the cancelled blocks.  */
7436   if (none_removed)
7437     remove_edge (e);
7438   else
7439     {
7440       /* Walk backwards so as to get a chance to substitute all
7441          released DEFs into debug stmts.  See
7442          eliminate_unnecessary_stmts() in tree-ssa-dce.c for more
7443          details.  */
7444       for (i = bbs_to_remove.length (); i-- > 0; )
7445         delete_basic_block (bbs_to_remove[i]);
7446     }
7447
7448   /* Update the dominance information.  The immediate dominator may change only
7449      for blocks whose immediate dominator belongs to DF_IDOM:
7450
7451      Suppose that idom(X) = Y before removal of E and idom(X) != Y after the
7452      removal.  Let Z the arbitrary block such that idom(Z) = Y and
7453      Z dominates X after the removal.  Before removal, there exists a path P
7454      from Y to X that avoids Z.  Let F be the last edge on P that is
7455      removed, and let W = F->dest.  Before removal, idom(W) = Y (since Y
7456      dominates W, and because of P, Z does not dominate W), and W belongs to
7457      the dominance frontier of E.  Therefore, Y belongs to DF_IDOM.  */
7458   EXECUTE_IF_SET_IN_BITMAP (df_idom, 0, i, bi)
7459     {
7460       bb = BASIC_BLOCK (i);
7461       for (dbb = first_dom_son (CDI_DOMINATORS, bb);
7462            dbb;
7463            dbb = next_dom_son (CDI_DOMINATORS, dbb))
7464         bbs_to_fix_dom.safe_push (dbb);
7465     }
7466
7467   iterate_fix_dominators (CDI_DOMINATORS, bbs_to_fix_dom, true);
7468
7469   BITMAP_FREE (df);
7470   BITMAP_FREE (df_idom);
7471   bbs_to_remove.release ();
7472   bbs_to_fix_dom.release ();
7473 }
7474
7475 /* Purge dead EH edges from basic block BB.  */
7476
7477 bool
7478 gimple_purge_dead_eh_edges (basic_block bb)
7479 {
7480   bool changed = false;
7481   edge e;
7482   edge_iterator ei;
7483   gimple stmt = last_stmt (bb);
7484
7485   if (stmt && stmt_can_throw_internal (stmt))
7486     return false;
7487
7488   for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
7489     {
7490       if (e->flags & EDGE_EH)
7491         {
7492           remove_edge_and_dominated_blocks (e);
7493           changed = true;
7494         }
7495       else
7496         ei_next (&ei);
7497     }
7498
7499   return changed;
7500 }
7501
7502 /* Purge dead EH edges from basic block listed in BLOCKS.  */
7503
7504 bool
7505 gimple_purge_all_dead_eh_edges (const_bitmap blocks)
7506 {
7507   bool changed = false;
7508   unsigned i;
7509   bitmap_iterator bi;
7510
7511   EXECUTE_IF_SET_IN_BITMAP (blocks, 0, i, bi)
7512     {
7513       basic_block bb = BASIC_BLOCK (i);
7514
7515       /* Earlier gimple_purge_dead_eh_edges could have removed
7516          this basic block already.  */
7517       gcc_assert (bb || changed);
7518       if (bb != NULL)
7519         changed |= gimple_purge_dead_eh_edges (bb);
7520     }
7521
7522   return changed;
7523 }
7524
7525 /* Purge dead abnormal call edges from basic block BB.  */
7526
7527 bool
7528 gimple_purge_dead_abnormal_call_edges (basic_block bb)
7529 {
7530   bool changed = false;
7531   edge e;
7532   edge_iterator ei;
7533   gimple stmt = last_stmt (bb);
7534
7535   if (!cfun->has_nonlocal_label)
7536     return false;
7537
7538   if (stmt && stmt_can_make_abnormal_goto (stmt))
7539     return false;
7540
7541   for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
7542     {
7543       if (e->flags & EDGE_ABNORMAL)
7544         {
7545           remove_edge_and_dominated_blocks (e);
7546           changed = true;
7547         }
7548       else
7549         ei_next (&ei);
7550     }
7551
7552   return changed;
7553 }
7554
7555 /* Purge dead abnormal call edges from basic block listed in BLOCKS.  */
7556
7557 bool
7558 gimple_purge_all_dead_abnormal_call_edges (const_bitmap blocks)
7559 {
7560   bool changed = false;
7561   unsigned i;
7562   bitmap_iterator bi;
7563
7564   EXECUTE_IF_SET_IN_BITMAP (blocks, 0, i, bi)
7565     {
7566       basic_block bb = BASIC_BLOCK (i);
7567
7568       /* Earlier gimple_purge_dead_abnormal_call_edges could have removed
7569          this basic block already.  */
7570       gcc_assert (bb || changed);
7571       if (bb != NULL)
7572         changed |= gimple_purge_dead_abnormal_call_edges (bb);
7573     }
7574
7575   return changed;
7576 }
7577
7578 /* This function is called whenever a new edge is created or
7579    redirected.  */
7580
7581 static void
7582 gimple_execute_on_growing_pred (edge e)
7583 {
7584   basic_block bb = e->dest;
7585
7586   if (!gimple_seq_empty_p (phi_nodes (bb)))
7587     reserve_phi_args_for_new_edge (bb);
7588 }
7589
7590 /* This function is called immediately before edge E is removed from
7591    the edge vector E->dest->preds.  */
7592
7593 static void
7594 gimple_execute_on_shrinking_pred (edge e)
7595 {
7596   if (!gimple_seq_empty_p (phi_nodes (e->dest)))
7597     remove_phi_args (e);
7598 }
7599
7600 /*---------------------------------------------------------------------------
7601   Helper functions for Loop versioning
7602   ---------------------------------------------------------------------------*/
7603
7604 /* Adjust phi nodes for 'first' basic block.  'second' basic block is a copy
7605    of 'first'. Both of them are dominated by 'new_head' basic block. When
7606    'new_head' was created by 'second's incoming edge it received phi arguments
7607    on the edge by split_edge(). Later, additional edge 'e' was created to
7608    connect 'new_head' and 'first'. Now this routine adds phi args on this
7609    additional edge 'e' that new_head to second edge received as part of edge
7610    splitting.  */
7611
7612 static void
7613 gimple_lv_adjust_loop_header_phi (basic_block first, basic_block second,
7614                                   basic_block new_head, edge e)
7615 {
7616   gimple phi1, phi2;
7617   gimple_stmt_iterator psi1, psi2;
7618   tree def;
7619   edge e2 = find_edge (new_head, second);
7620
7621   /* Because NEW_HEAD has been created by splitting SECOND's incoming
7622      edge, we should always have an edge from NEW_HEAD to SECOND.  */
7623   gcc_assert (e2 != NULL);
7624
7625   /* Browse all 'second' basic block phi nodes and add phi args to
7626      edge 'e' for 'first' head. PHI args are always in correct order.  */
7627
7628   for (psi2 = gsi_start_phis (second),
7629        psi1 = gsi_start_phis (first);
7630        !gsi_end_p (psi2) && !gsi_end_p (psi1);
7631        gsi_next (&psi2),  gsi_next (&psi1))
7632     {
7633       phi1 = gsi_stmt (psi1);
7634       phi2 = gsi_stmt (psi2);
7635       def = PHI_ARG_DEF (phi2, e2->dest_idx);
7636       add_phi_arg (phi1, def, e, gimple_phi_arg_location_from_edge (phi2, e2));
7637     }
7638 }
7639
7640
7641 /* Adds a if else statement to COND_BB with condition COND_EXPR.
7642    SECOND_HEAD is the destination of the THEN and FIRST_HEAD is
7643    the destination of the ELSE part.  */
7644
7645 static void
7646 gimple_lv_add_condition_to_bb (basic_block first_head ATTRIBUTE_UNUSED,
7647                                basic_block second_head ATTRIBUTE_UNUSED,
7648                                basic_block cond_bb, void *cond_e)
7649 {
7650   gimple_stmt_iterator gsi;
7651   gimple new_cond_expr;
7652   tree cond_expr = (tree) cond_e;
7653   edge e0;
7654
7655   /* Build new conditional expr */
7656   new_cond_expr = gimple_build_cond_from_tree (cond_expr,
7657                                                NULL_TREE, NULL_TREE);
7658
7659   /* Add new cond in cond_bb.  */
7660   gsi = gsi_last_bb (cond_bb);
7661   gsi_insert_after (&gsi, new_cond_expr, GSI_NEW_STMT);
7662
7663   /* Adjust edges appropriately to connect new head with first head
7664      as well as second head.  */
7665   e0 = single_succ_edge (cond_bb);
7666   e0->flags &= ~EDGE_FALLTHRU;
7667   e0->flags |= EDGE_FALSE_VALUE;
7668 }
7669
7670
7671 /* Do book-keeping of basic block BB for the profile consistency checker.
7672    If AFTER_PASS is 0, do pre-pass accounting, or if AFTER_PASS is 1
7673    then do post-pass accounting.  Store the counting in RECORD.  */
7674 static void
7675 gimple_account_profile_record (basic_block bb, int after_pass,
7676                                struct profile_record *record)
7677 {
7678   gimple_stmt_iterator i;
7679   for (i = gsi_start_bb (bb); !gsi_end_p (i); gsi_next (&i))
7680     {
7681       record->size[after_pass]
7682         += estimate_num_insns (gsi_stmt (i), &eni_size_weights);
7683       if (profile_status == PROFILE_READ)
7684         record->time[after_pass]
7685           += estimate_num_insns (gsi_stmt (i),
7686                                  &eni_time_weights) * bb->count;
7687       else if (profile_status == PROFILE_GUESSED)
7688         record->time[after_pass]
7689           += estimate_num_insns (gsi_stmt (i),
7690                                  &eni_time_weights) * bb->frequency;
7691     }
7692 }
7693
7694 struct cfg_hooks gimple_cfg_hooks = {
7695   "gimple",
7696   gimple_verify_flow_info,
7697   gimple_dump_bb,               /* dump_bb  */
7698   gimple_dump_bb_for_graph,     /* dump_bb_for_graph  */
7699   create_bb,                    /* create_basic_block  */
7700   gimple_redirect_edge_and_branch, /* redirect_edge_and_branch  */
7701   gimple_redirect_edge_and_branch_force, /* redirect_edge_and_branch_force  */
7702   gimple_can_remove_branch_p,   /* can_remove_branch_p  */
7703   remove_bb,                    /* delete_basic_block  */
7704   gimple_split_block,           /* split_block  */
7705   gimple_move_block_after,      /* move_block_after  */
7706   gimple_can_merge_blocks_p,    /* can_merge_blocks_p  */
7707   gimple_merge_blocks,          /* merge_blocks  */
7708   gimple_predict_edge,          /* predict_edge  */
7709   gimple_predicted_by_p,        /* predicted_by_p  */
7710   gimple_can_duplicate_bb_p,    /* can_duplicate_block_p  */
7711   gimple_duplicate_bb,          /* duplicate_block  */
7712   gimple_split_edge,            /* split_edge  */
7713   gimple_make_forwarder_block,  /* make_forward_block  */
7714   NULL,                         /* tidy_fallthru_edge  */
7715   NULL,                         /* force_nonfallthru */
7716   gimple_block_ends_with_call_p,/* block_ends_with_call_p */
7717   gimple_block_ends_with_condjump_p, /* block_ends_with_condjump_p */
7718   gimple_flow_call_edges_add,   /* flow_call_edges_add */
7719   gimple_execute_on_growing_pred,       /* execute_on_growing_pred */
7720   gimple_execute_on_shrinking_pred, /* execute_on_shrinking_pred */
7721   gimple_duplicate_loop_to_header_edge, /* duplicate loop for trees */
7722   gimple_lv_add_condition_to_bb, /* lv_add_condition_to_bb */
7723   gimple_lv_adjust_loop_header_phi, /* lv_adjust_loop_header_phi*/
7724   extract_true_false_edges_from_block, /* extract_cond_bb_edges */
7725   flush_pending_stmts,          /* flush_pending_stmts */  
7726   gimple_empty_block_p,           /* block_empty_p */
7727   gimple_split_block_before_cond_jump, /* split_block_before_cond_jump */
7728   gimple_account_profile_record,
7729 };
7730
7731
7732 /* Split all critical edges.  */
7733
7734 static unsigned int
7735 split_critical_edges (void)
7736 {
7737   basic_block bb;
7738   edge e;
7739   edge_iterator ei;
7740
7741   /* split_edge can redirect edges out of SWITCH_EXPRs, which can get
7742      expensive.  So we want to enable recording of edge to CASE_LABEL_EXPR
7743      mappings around the calls to split_edge.  */
7744   start_recording_case_labels ();
7745   FOR_ALL_BB (bb)
7746     {
7747       FOR_EACH_EDGE (e, ei, bb->succs)
7748         {
7749           if (EDGE_CRITICAL_P (e) && !(e->flags & EDGE_ABNORMAL))
7750             split_edge (e);
7751           /* PRE inserts statements to edges and expects that
7752              since split_critical_edges was done beforehand, committing edge
7753              insertions will not split more edges.  In addition to critical
7754              edges we must split edges that have multiple successors and
7755              end by control flow statements, such as RESX.
7756              Go ahead and split them too.  This matches the logic in
7757              gimple_find_edge_insert_loc.  */
7758           else if ((!single_pred_p (e->dest)
7759                     || !gimple_seq_empty_p (phi_nodes (e->dest))
7760                     || e->dest == EXIT_BLOCK_PTR)
7761                    && e->src != ENTRY_BLOCK_PTR
7762                    && !(e->flags & EDGE_ABNORMAL))
7763             {
7764               gimple_stmt_iterator gsi;
7765
7766               gsi = gsi_last_bb (e->src);
7767               if (!gsi_end_p (gsi)
7768                   && stmt_ends_bb_p (gsi_stmt (gsi))
7769                   && (gimple_code (gsi_stmt (gsi)) != GIMPLE_RETURN
7770                       && !gimple_call_builtin_p (gsi_stmt (gsi),
7771                                                  BUILT_IN_RETURN)))
7772                 split_edge (e);
7773             }
7774         }
7775     }
7776   end_recording_case_labels ();
7777   return 0;
7778 }
7779
7780 struct gimple_opt_pass pass_split_crit_edges =
7781 {
7782  {
7783   GIMPLE_PASS,
7784   "crited",                          /* name */
7785   OPTGROUP_NONE,                 /* optinfo_flags */
7786   NULL,                          /* gate */
7787   split_critical_edges,          /* execute */
7788   NULL,                          /* sub */
7789   NULL,                          /* next */
7790   0,                             /* static_pass_number */
7791   TV_TREE_SPLIT_EDGES,           /* tv_id */
7792   PROP_cfg,                      /* properties required */
7793   PROP_no_crit_edges,            /* properties_provided */
7794   0,                             /* properties_destroyed */
7795   0,                             /* todo_flags_start */
7796   TODO_verify_flow               /* todo_flags_finish */
7797  }
7798 };
7799
7800
7801 /* Build a ternary operation and gimplify it.  Emit code before GSI.
7802    Return the gimple_val holding the result.  */
7803
7804 tree
7805 gimplify_build3 (gimple_stmt_iterator *gsi, enum tree_code code,
7806                  tree type, tree a, tree b, tree c)
7807 {
7808   tree ret;
7809   location_t loc = gimple_location (gsi_stmt (*gsi));
7810
7811   ret = fold_build3_loc (loc, code, type, a, b, c);
7812   STRIP_NOPS (ret);
7813
7814   return force_gimple_operand_gsi (gsi, ret, true, NULL, true,
7815                                    GSI_SAME_STMT);
7816 }
7817
7818 /* Build a binary operation and gimplify it.  Emit code before GSI.
7819    Return the gimple_val holding the result.  */
7820
7821 tree
7822 gimplify_build2 (gimple_stmt_iterator *gsi, enum tree_code code,
7823                  tree type, tree a, tree b)
7824 {
7825   tree ret;
7826
7827   ret = fold_build2_loc (gimple_location (gsi_stmt (*gsi)), code, type, a, b);
7828   STRIP_NOPS (ret);
7829
7830   return force_gimple_operand_gsi (gsi, ret, true, NULL, true,
7831                                    GSI_SAME_STMT);
7832 }
7833
7834 /* Build a unary operation and gimplify it.  Emit code before GSI.
7835    Return the gimple_val holding the result.  */
7836
7837 tree
7838 gimplify_build1 (gimple_stmt_iterator *gsi, enum tree_code code, tree type,
7839                  tree a)
7840 {
7841   tree ret;
7842
7843   ret = fold_build1_loc (gimple_location (gsi_stmt (*gsi)), code, type, a);
7844   STRIP_NOPS (ret);
7845
7846   return force_gimple_operand_gsi (gsi, ret, true, NULL, true,
7847                                    GSI_SAME_STMT);
7848 }
7849
7850
7851 \f
7852 /* Emit return warnings.  */
7853
7854 static unsigned int
7855 execute_warn_function_return (void)
7856 {
7857   source_location location;
7858   gimple last;
7859   edge e;
7860   edge_iterator ei;
7861
7862   if (!targetm.warn_func_return (cfun->decl))
7863     return 0;
7864
7865   /* If we have a path to EXIT, then we do return.  */
7866   if (TREE_THIS_VOLATILE (cfun->decl)
7867       && EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0)
7868     {
7869       location = UNKNOWN_LOCATION;
7870       FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
7871         {
7872           last = last_stmt (e->src);
7873           if ((gimple_code (last) == GIMPLE_RETURN
7874                || gimple_call_builtin_p (last, BUILT_IN_RETURN))
7875               && (location = gimple_location (last)) != UNKNOWN_LOCATION)
7876             break;
7877         }
7878       if (location == UNKNOWN_LOCATION)
7879         location = cfun->function_end_locus;
7880       warning_at (location, 0, "%<noreturn%> function does return");
7881     }
7882
7883   /* If we see "return;" in some basic block, then we do reach the end
7884      without returning a value.  */
7885   else if (warn_return_type
7886            && !TREE_NO_WARNING (cfun->decl)
7887            && EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0
7888            && !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (cfun->decl))))
7889     {
7890       FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
7891         {
7892           gimple last = last_stmt (e->src);
7893           if (gimple_code (last) == GIMPLE_RETURN
7894               && gimple_return_retval (last) == NULL
7895               && !gimple_no_warning_p (last))
7896             {
7897               location = gimple_location (last);
7898               if (location == UNKNOWN_LOCATION)
7899                   location = cfun->function_end_locus;
7900               warning_at (location, OPT_Wreturn_type, "control reaches end of non-void function");
7901               TREE_NO_WARNING (cfun->decl) = 1;
7902               break;
7903             }
7904         }
7905     }
7906   return 0;
7907 }
7908
7909
7910 /* Given a basic block B which ends with a conditional and has
7911    precisely two successors, determine which of the edges is taken if
7912    the conditional is true and which is taken if the conditional is
7913    false.  Set TRUE_EDGE and FALSE_EDGE appropriately.  */
7914
7915 void
7916 extract_true_false_edges_from_block (basic_block b,
7917                                      edge *true_edge,
7918                                      edge *false_edge)
7919 {
7920   edge e = EDGE_SUCC (b, 0);
7921
7922   if (e->flags & EDGE_TRUE_VALUE)
7923     {
7924       *true_edge = e;
7925       *false_edge = EDGE_SUCC (b, 1);
7926     }
7927   else
7928     {
7929       *false_edge = e;
7930       *true_edge = EDGE_SUCC (b, 1);
7931     }
7932 }
7933
7934 struct gimple_opt_pass pass_warn_function_return =
7935 {
7936  {
7937   GIMPLE_PASS,
7938   "*warn_function_return",              /* name */
7939   OPTGROUP_NONE,                        /* optinfo_flags */
7940   NULL,                                 /* gate */
7941   execute_warn_function_return,         /* execute */
7942   NULL,                                 /* sub */
7943   NULL,                                 /* next */
7944   0,                                    /* static_pass_number */
7945   TV_NONE,                              /* tv_id */
7946   PROP_cfg,                             /* properties_required */
7947   0,                                    /* properties_provided */
7948   0,                                    /* properties_destroyed */
7949   0,                                    /* todo_flags_start */
7950   0                                     /* todo_flags_finish */
7951  }
7952 };
7953
7954 /* Emit noreturn warnings.  */
7955
7956 static unsigned int
7957 execute_warn_function_noreturn (void)
7958 {
7959   if (!TREE_THIS_VOLATILE (current_function_decl)
7960       && EDGE_COUNT (EXIT_BLOCK_PTR->preds) == 0)
7961     warn_function_noreturn (current_function_decl);
7962   return 0;
7963 }
7964
7965 static bool
7966 gate_warn_function_noreturn (void)
7967 {
7968   return warn_suggest_attribute_noreturn;
7969 }
7970
7971 struct gimple_opt_pass pass_warn_function_noreturn =
7972 {
7973  {
7974   GIMPLE_PASS,
7975   "*warn_function_noreturn",            /* name */
7976   OPTGROUP_NONE,                        /* optinfo_flags */
7977   gate_warn_function_noreturn,          /* gate */
7978   execute_warn_function_noreturn,       /* execute */
7979   NULL,                                 /* sub */
7980   NULL,                                 /* next */
7981   0,                                    /* static_pass_number */
7982   TV_NONE,                              /* tv_id */
7983   PROP_cfg,                             /* properties_required */
7984   0,                                    /* properties_provided */
7985   0,                                    /* properties_destroyed */
7986   0,                                    /* todo_flags_start */
7987   0                                     /* todo_flags_finish */
7988  }
7989 };
7990
7991
7992 /* Walk a gimplified function and warn for functions whose return value is
7993    ignored and attribute((warn_unused_result)) is set.  This is done before
7994    inlining, so we don't have to worry about that.  */
7995
7996 static void
7997 do_warn_unused_result (gimple_seq seq)
7998 {
7999   tree fdecl, ftype;
8000   gimple_stmt_iterator i;
8001
8002   for (i = gsi_start (seq); !gsi_end_p (i); gsi_next (&i))
8003     {
8004       gimple g = gsi_stmt (i);
8005
8006       switch (gimple_code (g))
8007         {
8008         case GIMPLE_BIND:
8009           do_warn_unused_result (gimple_bind_body (g));
8010           break;
8011         case GIMPLE_TRY:
8012           do_warn_unused_result (gimple_try_eval (g));
8013           do_warn_unused_result (gimple_try_cleanup (g));
8014           break;
8015         case GIMPLE_CATCH:
8016           do_warn_unused_result (gimple_catch_handler (g));
8017           break;
8018         case GIMPLE_EH_FILTER:
8019           do_warn_unused_result (gimple_eh_filter_failure (g));
8020           break;
8021
8022         case GIMPLE_CALL:
8023           if (gimple_call_lhs (g))
8024             break;
8025           if (gimple_call_internal_p (g))
8026             break;
8027
8028           /* This is a naked call, as opposed to a GIMPLE_CALL with an
8029              LHS.  All calls whose value is ignored should be
8030              represented like this.  Look for the attribute.  */
8031           fdecl = gimple_call_fndecl (g);
8032           ftype = gimple_call_fntype (g);
8033
8034           if (lookup_attribute ("warn_unused_result", TYPE_ATTRIBUTES (ftype)))
8035             {
8036               location_t loc = gimple_location (g);
8037
8038               if (fdecl)
8039                 warning_at (loc, OPT_Wunused_result,
8040                             "ignoring return value of %qD, "
8041                             "declared with attribute warn_unused_result",
8042                             fdecl);
8043               else
8044                 warning_at (loc, OPT_Wunused_result,
8045                             "ignoring return value of function "
8046                             "declared with attribute warn_unused_result");
8047             }
8048           break;
8049
8050         default:
8051           /* Not a container, not a call, or a call whose value is used.  */
8052           break;
8053         }
8054     }
8055 }
8056
8057 static unsigned int
8058 run_warn_unused_result (void)
8059 {
8060   do_warn_unused_result (gimple_body (current_function_decl));
8061   return 0;
8062 }
8063
8064 static bool
8065 gate_warn_unused_result (void)
8066 {
8067   return flag_warn_unused_result;
8068 }
8069
8070 struct gimple_opt_pass pass_warn_unused_result =
8071 {
8072   {
8073     GIMPLE_PASS,
8074     "*warn_unused_result",              /* name */
8075     OPTGROUP_NONE,                        /* optinfo_flags */
8076     gate_warn_unused_result,            /* gate */
8077     run_warn_unused_result,             /* execute */
8078     NULL,                               /* sub */
8079     NULL,                               /* next */
8080     0,                                  /* static_pass_number */
8081     TV_NONE,                            /* tv_id */
8082     PROP_gimple_any,                    /* properties_required */
8083     0,                                  /* properties_provided */
8084     0,                                  /* properties_destroyed */
8085     0,                                  /* todo_flags_start */
8086     0,                                  /* todo_flags_finish */
8087   }
8088 };
8089
8090
8091 /* Garbage collection support for edge_def.  */
8092
8093 extern void gt_ggc_mx (tree&);
8094 extern void gt_ggc_mx (gimple&);
8095 extern void gt_ggc_mx (rtx&);
8096 extern void gt_ggc_mx (basic_block&);
8097
8098 void
8099 gt_ggc_mx (edge_def *e)
8100 {
8101   tree block = LOCATION_BLOCK (e->goto_locus);
8102   gt_ggc_mx (e->src);
8103   gt_ggc_mx (e->dest);
8104   if (current_ir_type () == IR_GIMPLE)
8105     gt_ggc_mx (e->insns.g);
8106   else
8107     gt_ggc_mx (e->insns.r);
8108   gt_ggc_mx (block);
8109 }
8110
8111 /* PCH support for edge_def.  */
8112
8113 extern void gt_pch_nx (tree&);
8114 extern void gt_pch_nx (gimple&);
8115 extern void gt_pch_nx (rtx&);
8116 extern void gt_pch_nx (basic_block&);
8117
8118 void
8119 gt_pch_nx (edge_def *e)
8120 {
8121   tree block = LOCATION_BLOCK (e->goto_locus);
8122   gt_pch_nx (e->src);
8123   gt_pch_nx (e->dest);
8124   if (current_ir_type () == IR_GIMPLE)
8125     gt_pch_nx (e->insns.g);
8126   else
8127     gt_pch_nx (e->insns.r);
8128   gt_pch_nx (block);
8129 }
8130
8131 void
8132 gt_pch_nx (edge_def *e, gt_pointer_operator op, void *cookie)
8133 {
8134   tree block = LOCATION_BLOCK (e->goto_locus);
8135   op (&(e->src), cookie);
8136   op (&(e->dest), cookie);
8137   if (current_ir_type () == IR_GIMPLE)
8138     op (&(e->insns.g), cookie);
8139   else
8140     op (&(e->insns.r), cookie);
8141   op (&(block), cookie);
8142 }