OSDN Git Service

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