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