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