OSDN Git Service

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