OSDN Git Service

2009-10-22 Razya Ladelsky <razya@il.ibm.com>
[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   source_location loc = UNKNOWN_LOCATION;
1764
1765   if (dump_file)
1766     {
1767       fprintf (dump_file, "Removing basic block %d\n", bb->index);
1768       if (dump_flags & TDF_DETAILS)
1769         {
1770           dump_bb (bb, dump_file, 0);
1771           fprintf (dump_file, "\n");
1772         }
1773     }
1774
1775   if (current_loops)
1776     {
1777       struct loop *loop = bb->loop_father;
1778
1779       /* If a loop gets removed, clean up the information associated
1780          with it.  */
1781       if (loop->latch == bb
1782           || loop->header == bb)
1783         free_numbers_of_iterations_estimates_loop (loop);
1784     }
1785
1786   /* Remove all the instructions in the block.  */
1787   if (bb_seq (bb) != NULL)
1788     {
1789       /* Walk backwards so as to get a chance to substitute all
1790          released DEFs into debug stmts.  See
1791          eliminate_unnecessary_stmts() in tree-ssa-dce.c for more
1792          details.  */
1793       for (i = gsi_last_bb (bb); !gsi_end_p (i);)
1794         {
1795           gimple stmt = gsi_stmt (i);
1796           if (gimple_code (stmt) == GIMPLE_LABEL
1797               && (FORCED_LABEL (gimple_label_label (stmt))
1798                   || DECL_NONLOCAL (gimple_label_label (stmt))))
1799             {
1800               basic_block new_bb;
1801               gimple_stmt_iterator new_gsi;
1802
1803               /* A non-reachable non-local label may still be referenced.
1804                  But it no longer needs to carry the extra semantics of
1805                  non-locality.  */
1806               if (DECL_NONLOCAL (gimple_label_label (stmt)))
1807                 {
1808                   DECL_NONLOCAL (gimple_label_label (stmt)) = 0;
1809                   FORCED_LABEL (gimple_label_label (stmt)) = 1;
1810                 }
1811
1812               new_bb = bb->prev_bb;
1813               new_gsi = gsi_start_bb (new_bb);
1814               gsi_remove (&i, false);
1815               gsi_insert_before (&new_gsi, stmt, GSI_NEW_STMT);
1816             }
1817           else
1818             {
1819               /* Release SSA definitions if we are in SSA.  Note that we
1820                  may be called when not in SSA.  For example,
1821                  final_cleanup calls this function via
1822                  cleanup_tree_cfg.  */
1823               if (gimple_in_ssa_p (cfun))
1824                 release_defs (stmt);
1825
1826               gsi_remove (&i, true);
1827             }
1828
1829           if (gsi_end_p (i))
1830             i = gsi_last_bb (bb);
1831           else
1832             gsi_prev (&i);
1833
1834           /* Don't warn for removed gotos.  Gotos are often removed due to
1835              jump threading, thus resulting in bogus warnings.  Not great,
1836              since this way we lose warnings for gotos in the original
1837              program that are indeed unreachable.  */
1838           if (gimple_code (stmt) != GIMPLE_GOTO
1839               && gimple_has_location (stmt))
1840             loc = gimple_location (stmt);
1841         }
1842     }
1843
1844   /* If requested, give a warning that the first statement in the
1845      block is unreachable.  We walk statements backwards in the
1846      loop above, so the last statement we process is the first statement
1847      in the block.  */
1848   if (loc > BUILTINS_LOCATION && LOCATION_LINE (loc) > 0)
1849     warning_at (loc, OPT_Wunreachable_code, "will never be executed");
1850
1851   remove_phi_nodes_and_edges_for_unreachable_block (bb);
1852   bb->il.gimple = NULL;
1853 }
1854
1855
1856 /* Given a basic block BB ending with COND_EXPR or SWITCH_EXPR, and a
1857    predicate VAL, return the edge that will be taken out of the block.
1858    If VAL does not match a unique edge, NULL is returned.  */
1859
1860 edge
1861 find_taken_edge (basic_block bb, tree val)
1862 {
1863   gimple stmt;
1864
1865   stmt = last_stmt (bb);
1866
1867   gcc_assert (stmt);
1868   gcc_assert (is_ctrl_stmt (stmt));
1869
1870   if (val == NULL)
1871     return NULL;
1872
1873   if (!is_gimple_min_invariant (val))
1874     return NULL;
1875
1876   if (gimple_code (stmt) == GIMPLE_COND)
1877     return find_taken_edge_cond_expr (bb, val);
1878
1879   if (gimple_code (stmt) == GIMPLE_SWITCH)
1880     return find_taken_edge_switch_expr (bb, val);
1881
1882   if (computed_goto_p (stmt))
1883     {
1884       /* Only optimize if the argument is a label, if the argument is
1885          not a label then we can not construct a proper CFG.
1886
1887          It may be the case that we only need to allow the LABEL_REF to
1888          appear inside an ADDR_EXPR, but we also allow the LABEL_REF to
1889          appear inside a LABEL_EXPR just to be safe.  */
1890       if ((TREE_CODE (val) == ADDR_EXPR || TREE_CODE (val) == LABEL_EXPR)
1891           && TREE_CODE (TREE_OPERAND (val, 0)) == LABEL_DECL)
1892         return find_taken_edge_computed_goto (bb, TREE_OPERAND (val, 0));
1893       return NULL;
1894     }
1895
1896   gcc_unreachable ();
1897 }
1898
1899 /* Given a constant value VAL and the entry block BB to a GOTO_EXPR
1900    statement, determine which of the outgoing edges will be taken out of the
1901    block.  Return NULL if either edge may be taken.  */
1902
1903 static edge
1904 find_taken_edge_computed_goto (basic_block bb, tree val)
1905 {
1906   basic_block dest;
1907   edge e = NULL;
1908
1909   dest = label_to_block (val);
1910   if (dest)
1911     {
1912       e = find_edge (bb, dest);
1913       gcc_assert (e != NULL);
1914     }
1915
1916   return e;
1917 }
1918
1919 /* Given a constant value VAL and the entry block BB to a COND_EXPR
1920    statement, determine which of the two edges will be taken out of the
1921    block.  Return NULL if either edge may be taken.  */
1922
1923 static edge
1924 find_taken_edge_cond_expr (basic_block bb, tree val)
1925 {
1926   edge true_edge, false_edge;
1927
1928   extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
1929
1930   gcc_assert (TREE_CODE (val) == INTEGER_CST);
1931   return (integer_zerop (val) ? false_edge : true_edge);
1932 }
1933
1934 /* Given an INTEGER_CST VAL and the entry block BB to a SWITCH_EXPR
1935    statement, determine which edge will be taken out of the block.  Return
1936    NULL if any edge may be taken.  */
1937
1938 static edge
1939 find_taken_edge_switch_expr (basic_block bb, tree val)
1940 {
1941   basic_block dest_bb;
1942   edge e;
1943   gimple switch_stmt;
1944   tree taken_case;
1945
1946   switch_stmt = last_stmt (bb);
1947   taken_case = find_case_label_for_value (switch_stmt, val);
1948   dest_bb = label_to_block (CASE_LABEL (taken_case));
1949
1950   e = find_edge (bb, dest_bb);
1951   gcc_assert (e);
1952   return e;
1953 }
1954
1955
1956 /* Return the CASE_LABEL_EXPR that SWITCH_STMT will take for VAL.
1957    We can make optimal use here of the fact that the case labels are
1958    sorted: We can do a binary search for a case matching VAL.  */
1959
1960 static tree
1961 find_case_label_for_value (gimple switch_stmt, tree val)
1962 {
1963   size_t low, high, n = gimple_switch_num_labels (switch_stmt);
1964   tree default_case = gimple_switch_default_label (switch_stmt);
1965
1966   for (low = 0, high = n; high - low > 1; )
1967     {
1968       size_t i = (high + low) / 2;
1969       tree t = gimple_switch_label (switch_stmt, i);
1970       int cmp;
1971
1972       /* Cache the result of comparing CASE_LOW and val.  */
1973       cmp = tree_int_cst_compare (CASE_LOW (t), val);
1974
1975       if (cmp > 0)
1976         high = i;
1977       else
1978         low = i;
1979
1980       if (CASE_HIGH (t) == NULL)
1981         {
1982           /* A singe-valued case label.  */
1983           if (cmp == 0)
1984             return t;
1985         }
1986       else
1987         {
1988           /* A case range.  We can only handle integer ranges.  */
1989           if (cmp <= 0 && tree_int_cst_compare (CASE_HIGH (t), val) >= 0)
1990             return t;
1991         }
1992     }
1993
1994   return default_case;
1995 }
1996
1997
1998 /* Dump a basic block on stderr.  */
1999
2000 void
2001 gimple_debug_bb (basic_block bb)
2002 {
2003   gimple_dump_bb (bb, stderr, 0, TDF_VOPS|TDF_MEMSYMS);
2004 }
2005
2006
2007 /* Dump basic block with index N on stderr.  */
2008
2009 basic_block
2010 gimple_debug_bb_n (int n)
2011 {
2012   gimple_debug_bb (BASIC_BLOCK (n));
2013   return BASIC_BLOCK (n);
2014 }
2015
2016
2017 /* Dump the CFG on stderr.
2018
2019    FLAGS are the same used by the tree dumping functions
2020    (see TDF_* in tree-pass.h).  */
2021
2022 void
2023 gimple_debug_cfg (int flags)
2024 {
2025   gimple_dump_cfg (stderr, flags);
2026 }
2027
2028
2029 /* Dump the program showing basic block boundaries on the given FILE.
2030
2031    FLAGS are the same used by the tree dumping functions (see TDF_* in
2032    tree.h).  */
2033
2034 void
2035 gimple_dump_cfg (FILE *file, int flags)
2036 {
2037   if (flags & TDF_DETAILS)
2038     {
2039       const char *funcname
2040         = lang_hooks.decl_printable_name (current_function_decl, 2);
2041
2042       fputc ('\n', file);
2043       fprintf (file, ";; Function %s\n\n", funcname);
2044       fprintf (file, ";; \n%d basic blocks, %d edges, last basic block %d.\n\n",
2045                n_basic_blocks, n_edges, last_basic_block);
2046
2047       brief_dump_cfg (file);
2048       fprintf (file, "\n");
2049     }
2050
2051   if (flags & TDF_STATS)
2052     dump_cfg_stats (file);
2053
2054   dump_function_to_file (current_function_decl, file, flags | TDF_BLOCKS);
2055 }
2056
2057
2058 /* Dump CFG statistics on FILE.  */
2059
2060 void
2061 dump_cfg_stats (FILE *file)
2062 {
2063   static long max_num_merged_labels = 0;
2064   unsigned long size, total = 0;
2065   long num_edges;
2066   basic_block bb;
2067   const char * const fmt_str   = "%-30s%-13s%12s\n";
2068   const char * const fmt_str_1 = "%-30s%13d%11lu%c\n";
2069   const char * const fmt_str_2 = "%-30s%13ld%11lu%c\n";
2070   const char * const fmt_str_3 = "%-43s%11lu%c\n";
2071   const char *funcname
2072     = lang_hooks.decl_printable_name (current_function_decl, 2);
2073
2074
2075   fprintf (file, "\nCFG Statistics for %s\n\n", funcname);
2076
2077   fprintf (file, "---------------------------------------------------------\n");
2078   fprintf (file, fmt_str, "", "  Number of  ", "Memory");
2079   fprintf (file, fmt_str, "", "  instances  ", "used ");
2080   fprintf (file, "---------------------------------------------------------\n");
2081
2082   size = n_basic_blocks * sizeof (struct basic_block_def);
2083   total += size;
2084   fprintf (file, fmt_str_1, "Basic blocks", n_basic_blocks,
2085            SCALE (size), LABEL (size));
2086
2087   num_edges = 0;
2088   FOR_EACH_BB (bb)
2089     num_edges += EDGE_COUNT (bb->succs);
2090   size = num_edges * sizeof (struct edge_def);
2091   total += size;
2092   fprintf (file, fmt_str_2, "Edges", num_edges, SCALE (size), LABEL (size));
2093
2094   fprintf (file, "---------------------------------------------------------\n");
2095   fprintf (file, fmt_str_3, "Total memory used by CFG data", SCALE (total),
2096            LABEL (total));
2097   fprintf (file, "---------------------------------------------------------\n");
2098   fprintf (file, "\n");
2099
2100   if (cfg_stats.num_merged_labels > max_num_merged_labels)
2101     max_num_merged_labels = cfg_stats.num_merged_labels;
2102
2103   fprintf (file, "Coalesced label blocks: %ld (Max so far: %ld)\n",
2104            cfg_stats.num_merged_labels, max_num_merged_labels);
2105
2106   fprintf (file, "\n");
2107 }
2108
2109
2110 /* Dump CFG statistics on stderr.  Keep extern so that it's always
2111    linked in the final executable.  */
2112
2113 void
2114 debug_cfg_stats (void)
2115 {
2116   dump_cfg_stats (stderr);
2117 }
2118
2119
2120 /* Dump the flowgraph to a .vcg FILE.  */
2121
2122 static void
2123 gimple_cfg2vcg (FILE *file)
2124 {
2125   edge e;
2126   edge_iterator ei;
2127   basic_block bb;
2128   const char *funcname
2129     = lang_hooks.decl_printable_name (current_function_decl, 2);
2130
2131   /* Write the file header.  */
2132   fprintf (file, "graph: { title: \"%s\"\n", funcname);
2133   fprintf (file, "node: { title: \"ENTRY\" label: \"ENTRY\" }\n");
2134   fprintf (file, "node: { title: \"EXIT\" label: \"EXIT\" }\n");
2135
2136   /* Write blocks and edges.  */
2137   FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
2138     {
2139       fprintf (file, "edge: { sourcename: \"ENTRY\" targetname: \"%d\"",
2140                e->dest->index);
2141
2142       if (e->flags & EDGE_FAKE)
2143         fprintf (file, " linestyle: dotted priority: 10");
2144       else
2145         fprintf (file, " linestyle: solid priority: 100");
2146
2147       fprintf (file, " }\n");
2148     }
2149   fputc ('\n', file);
2150
2151   FOR_EACH_BB (bb)
2152     {
2153       enum gimple_code head_code, end_code;
2154       const char *head_name, *end_name;
2155       int head_line = 0;
2156       int end_line = 0;
2157       gimple first = first_stmt (bb);
2158       gimple last = last_stmt (bb);
2159
2160       if (first)
2161         {
2162           head_code = gimple_code (first);
2163           head_name = gimple_code_name[head_code];
2164           head_line = get_lineno (first);
2165         }
2166       else
2167         head_name = "no-statement";
2168
2169       if (last)
2170         {
2171           end_code = gimple_code (last);
2172           end_name = gimple_code_name[end_code];
2173           end_line = get_lineno (last);
2174         }
2175       else
2176         end_name = "no-statement";
2177
2178       fprintf (file, "node: { title: \"%d\" label: \"#%d\\n%s (%d)\\n%s (%d)\"}\n",
2179                bb->index, bb->index, head_name, head_line, end_name,
2180                end_line);
2181
2182       FOR_EACH_EDGE (e, ei, bb->succs)
2183         {
2184           if (e->dest == EXIT_BLOCK_PTR)
2185             fprintf (file, "edge: { sourcename: \"%d\" targetname: \"EXIT\"", bb->index);
2186           else
2187             fprintf (file, "edge: { sourcename: \"%d\" targetname: \"%d\"", bb->index, e->dest->index);
2188
2189           if (e->flags & EDGE_FAKE)
2190             fprintf (file, " priority: 10 linestyle: dotted");
2191           else
2192             fprintf (file, " priority: 100 linestyle: solid");
2193
2194           fprintf (file, " }\n");
2195         }
2196
2197       if (bb->next_bb != EXIT_BLOCK_PTR)
2198         fputc ('\n', file);
2199     }
2200
2201   fputs ("}\n\n", file);
2202 }
2203
2204
2205
2206 /*---------------------------------------------------------------------------
2207                              Miscellaneous helpers
2208 ---------------------------------------------------------------------------*/
2209
2210 /* Return true if T represents a stmt that always transfers control.  */
2211
2212 bool
2213 is_ctrl_stmt (gimple t)
2214 {
2215   switch (gimple_code (t))
2216     {
2217     case GIMPLE_COND:
2218     case GIMPLE_SWITCH:
2219     case GIMPLE_GOTO:
2220     case GIMPLE_RETURN:
2221     case GIMPLE_RESX:
2222       return true;
2223     default:
2224       return false;
2225     }
2226 }
2227
2228
2229 /* Return true if T is a statement that may alter the flow of control
2230    (e.g., a call to a non-returning function).  */
2231
2232 bool
2233 is_ctrl_altering_stmt (gimple t)
2234 {
2235   gcc_assert (t);
2236
2237   switch (gimple_code (t))
2238     {
2239     case GIMPLE_CALL:
2240       {
2241         int flags = gimple_call_flags (t);
2242
2243         /* A non-pure/const call alters flow control if the current
2244            function has nonlocal labels.  */
2245         if (!(flags & (ECF_CONST | ECF_PURE)) && cfun->has_nonlocal_label)
2246           return true;
2247
2248         /* A call also alters control flow if it does not return.  */
2249         if (gimple_call_flags (t) & ECF_NORETURN)
2250           return true;
2251       }
2252       break;
2253
2254     case GIMPLE_EH_DISPATCH:
2255       /* EH_DISPATCH branches to the individual catch handlers at
2256          this level of a try or allowed-exceptions region.  It can
2257          fallthru to the next statement as well.  */
2258       return true;
2259
2260     case GIMPLE_ASM:
2261       if (gimple_asm_nlabels (t) > 0)
2262         return true;
2263       break;
2264
2265     CASE_GIMPLE_OMP:
2266       /* OpenMP directives alter control flow.  */
2267       return true;
2268
2269     default:
2270       break;
2271     }
2272
2273   /* If a statement can throw, it alters control flow.  */
2274   return stmt_can_throw_internal (t);
2275 }
2276
2277
2278 /* Return true if T is a simple local goto.  */
2279
2280 bool
2281 simple_goto_p (gimple t)
2282 {
2283   return (gimple_code (t) == GIMPLE_GOTO
2284           && TREE_CODE (gimple_goto_dest (t)) == LABEL_DECL);
2285 }
2286
2287
2288 /* Return true if T can make an abnormal transfer of control flow.
2289    Transfers of control flow associated with EH are excluded.  */
2290
2291 bool
2292 stmt_can_make_abnormal_goto (gimple t)
2293 {
2294   if (computed_goto_p (t))
2295     return true;
2296   if (is_gimple_call (t))
2297     return gimple_has_side_effects (t) && cfun->has_nonlocal_label;
2298   return false;
2299 }
2300
2301
2302 /* Return true if STMT should start a new basic block.  PREV_STMT is
2303    the statement preceding STMT.  It is used when STMT is a label or a
2304    case label.  Labels should only start a new basic block if their
2305    previous statement wasn't a label.  Otherwise, sequence of labels
2306    would generate unnecessary basic blocks that only contain a single
2307    label.  */
2308
2309 static inline bool
2310 stmt_starts_bb_p (gimple stmt, gimple prev_stmt)
2311 {
2312   if (stmt == NULL)
2313     return false;
2314
2315   /* Labels start a new basic block only if the preceding statement
2316      wasn't a label of the same type.  This prevents the creation of
2317      consecutive blocks that have nothing but a single label.  */
2318   if (gimple_code (stmt) == GIMPLE_LABEL)
2319     {
2320       /* Nonlocal and computed GOTO targets always start a new block.  */
2321       if (DECL_NONLOCAL (gimple_label_label (stmt))
2322           || FORCED_LABEL (gimple_label_label (stmt)))
2323         return true;
2324
2325       if (prev_stmt && gimple_code (prev_stmt) == GIMPLE_LABEL)
2326         {
2327           if (DECL_NONLOCAL (gimple_label_label (prev_stmt)))
2328             return true;
2329
2330           cfg_stats.num_merged_labels++;
2331           return false;
2332         }
2333       else
2334         return true;
2335     }
2336
2337   return false;
2338 }
2339
2340
2341 /* Return true if T should end a basic block.  */
2342
2343 bool
2344 stmt_ends_bb_p (gimple t)
2345 {
2346   return is_ctrl_stmt (t) || is_ctrl_altering_stmt (t);
2347 }
2348
2349 /* Remove block annotations and other data structures.  */
2350
2351 void
2352 delete_tree_cfg_annotations (void)
2353 {
2354   label_to_block_map = NULL;
2355 }
2356
2357
2358 /* Return the first statement in basic block BB.  */
2359
2360 gimple
2361 first_stmt (basic_block bb)
2362 {
2363   gimple_stmt_iterator i = gsi_start_bb (bb);
2364   gimple stmt = NULL;
2365
2366   while (!gsi_end_p (i) && is_gimple_debug ((stmt = gsi_stmt (i))))
2367     {
2368       gsi_next (&i);
2369       stmt = NULL;
2370     }
2371   return stmt;
2372 }
2373
2374 /* Return the first non-label statement in basic block BB.  */
2375
2376 static gimple
2377 first_non_label_stmt (basic_block bb)
2378 {
2379   gimple_stmt_iterator i = gsi_start_bb (bb);
2380   while (!gsi_end_p (i) && gimple_code (gsi_stmt (i)) == GIMPLE_LABEL)
2381     gsi_next (&i);
2382   return !gsi_end_p (i) ? gsi_stmt (i) : NULL;
2383 }
2384
2385 /* Return the last statement in basic block BB.  */
2386
2387 gimple
2388 last_stmt (basic_block bb)
2389 {
2390   gimple_stmt_iterator i = gsi_last_bb (bb);
2391   gimple stmt = NULL;
2392
2393   while (!gsi_end_p (i) && is_gimple_debug ((stmt = gsi_stmt (i))))
2394     {
2395       gsi_prev (&i);
2396       stmt = NULL;
2397     }
2398   return stmt;
2399 }
2400
2401 /* Return the last statement of an otherwise empty block.  Return NULL
2402    if the block is totally empty, or if it contains more than one
2403    statement.  */
2404
2405 gimple
2406 last_and_only_stmt (basic_block bb)
2407 {
2408   gimple_stmt_iterator i = gsi_last_nondebug_bb (bb);
2409   gimple last, prev;
2410
2411   if (gsi_end_p (i))
2412     return NULL;
2413
2414   last = gsi_stmt (i);
2415   gsi_prev_nondebug (&i);
2416   if (gsi_end_p (i))
2417     return last;
2418
2419   /* Empty statements should no longer appear in the instruction stream.
2420      Everything that might have appeared before should be deleted by
2421      remove_useless_stmts, and the optimizers should just gsi_remove
2422      instead of smashing with build_empty_stmt.
2423
2424      Thus the only thing that should appear here in a block containing
2425      one executable statement is a label.  */
2426   prev = gsi_stmt (i);
2427   if (gimple_code (prev) == GIMPLE_LABEL)
2428     return last;
2429   else
2430     return NULL;
2431 }
2432
2433 /* Reinstall those PHI arguments queued in OLD_EDGE to NEW_EDGE.  */
2434
2435 static void
2436 reinstall_phi_args (edge new_edge, edge old_edge)
2437 {
2438   edge_var_map_vector v;
2439   edge_var_map *vm;
2440   int i;
2441   gimple_stmt_iterator phis;
2442   
2443   v = redirect_edge_var_map_vector (old_edge);
2444   if (!v)
2445     return;
2446   
2447   for (i = 0, phis = gsi_start_phis (new_edge->dest);
2448        VEC_iterate (edge_var_map, v, i, vm) && !gsi_end_p (phis);
2449        i++, gsi_next (&phis))
2450     {
2451       gimple phi = gsi_stmt (phis);
2452       tree result = redirect_edge_var_map_result (vm);
2453       tree arg = redirect_edge_var_map_def (vm);
2454  
2455       gcc_assert (result == gimple_phi_result (phi));
2456   
2457       add_phi_arg (phi, arg, new_edge, redirect_edge_var_map_location (vm));
2458     }
2459   
2460   redirect_edge_var_map_clear (old_edge);
2461 }
2462
2463 /* Returns the basic block after which the new basic block created
2464    by splitting edge EDGE_IN should be placed.  Tries to keep the new block
2465    near its "logical" location.  This is of most help to humans looking
2466    at debugging dumps.  */
2467
2468 static basic_block
2469 split_edge_bb_loc (edge edge_in)
2470 {
2471   basic_block dest = edge_in->dest;
2472   basic_block dest_prev = dest->prev_bb;
2473
2474   if (dest_prev)
2475     {
2476       edge e = find_edge (dest_prev, dest);
2477       if (e && !(e->flags & EDGE_COMPLEX))
2478         return edge_in->src;
2479     }
2480   return dest_prev;
2481 }
2482
2483 /* Split a (typically critical) edge EDGE_IN.  Return the new block.
2484    Abort on abnormal edges.  */
2485
2486 static basic_block
2487 gimple_split_edge (edge edge_in)
2488 {
2489   basic_block new_bb, after_bb, dest;
2490   edge new_edge, e;
2491
2492   /* Abnormal edges cannot be split.  */
2493   gcc_assert (!(edge_in->flags & EDGE_ABNORMAL));
2494
2495   dest = edge_in->dest;
2496
2497   after_bb = split_edge_bb_loc (edge_in);
2498
2499   new_bb = create_empty_bb (after_bb);
2500   new_bb->frequency = EDGE_FREQUENCY (edge_in);
2501   new_bb->count = edge_in->count;
2502   new_edge = make_edge (new_bb, dest, EDGE_FALLTHRU);
2503   new_edge->probability = REG_BR_PROB_BASE;
2504   new_edge->count = edge_in->count;
2505
2506   e = redirect_edge_and_branch (edge_in, new_bb);
2507   gcc_assert (e == edge_in);
2508   reinstall_phi_args (new_edge, e);
2509
2510   return new_bb;
2511 }
2512
2513 /* Callback for walk_tree, check that all elements with address taken are
2514    properly noticed as such.  The DATA is an int* that is 1 if TP was seen
2515    inside a PHI node.  */
2516
2517 static tree
2518 verify_expr (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
2519 {
2520   tree t = *tp, x;
2521
2522   if (TYPE_P (t))
2523     *walk_subtrees = 0;
2524
2525   /* Check operand N for being valid GIMPLE and give error MSG if not.  */
2526 #define CHECK_OP(N, MSG) \
2527   do { if (!is_gimple_val (TREE_OPERAND (t, N)))                \
2528        { error (MSG); return TREE_OPERAND (t, N); }} while (0)
2529
2530   switch (TREE_CODE (t))
2531     {
2532     case SSA_NAME:
2533       if (SSA_NAME_IN_FREE_LIST (t))
2534         {
2535           error ("SSA name in freelist but still referenced");
2536           return *tp;
2537         }
2538       break;
2539
2540     case INDIRECT_REF:
2541       x = TREE_OPERAND (t, 0);
2542       if (!is_gimple_reg (x) && !is_gimple_min_invariant (x))
2543         {
2544           error ("Indirect reference's operand is not a register or a constant.");
2545           return x;
2546         }
2547       break;
2548
2549     case ASSERT_EXPR:
2550       x = fold (ASSERT_EXPR_COND (t));
2551       if (x == boolean_false_node)
2552         {
2553           error ("ASSERT_EXPR with an always-false condition");
2554           return *tp;
2555         }
2556       break;
2557
2558     case MODIFY_EXPR:
2559       error ("MODIFY_EXPR not expected while having tuples.");
2560       return *tp;
2561
2562     case ADDR_EXPR:
2563       {
2564         bool old_constant;
2565         bool old_side_effects;
2566         bool new_constant;
2567         bool new_side_effects;
2568
2569         gcc_assert (is_gimple_address (t));
2570
2571         old_constant = TREE_CONSTANT (t);
2572         old_side_effects = TREE_SIDE_EFFECTS (t);
2573
2574         recompute_tree_invariant_for_addr_expr (t);
2575         new_side_effects = TREE_SIDE_EFFECTS (t);
2576         new_constant = TREE_CONSTANT (t);
2577
2578         if (old_constant != new_constant)
2579           {
2580             error ("constant not recomputed when ADDR_EXPR changed");
2581             return t;
2582           }
2583         if (old_side_effects != new_side_effects)
2584           {
2585             error ("side effects not recomputed when ADDR_EXPR changed");
2586             return t;
2587           }
2588
2589         /* Skip any references (they will be checked when we recurse down the
2590            tree) and ensure that any variable used as a prefix is marked
2591            addressable.  */
2592         for (x = TREE_OPERAND (t, 0);
2593              handled_component_p (x);
2594              x = TREE_OPERAND (x, 0))
2595           ;
2596
2597         if (!(TREE_CODE (x) == VAR_DECL
2598               || TREE_CODE (x) == PARM_DECL
2599               || TREE_CODE (x) == RESULT_DECL))
2600           return NULL;
2601         if (!TREE_ADDRESSABLE (x))
2602           {
2603             error ("address taken, but ADDRESSABLE bit not set");
2604             return x;
2605           }
2606         if (DECL_GIMPLE_REG_P (x))
2607           {
2608             error ("DECL_GIMPLE_REG_P set on a variable with address taken");
2609             return x;
2610           }
2611
2612         break;
2613       }
2614
2615     case COND_EXPR:
2616       x = COND_EXPR_COND (t);
2617       if (!INTEGRAL_TYPE_P (TREE_TYPE (x)))
2618         {
2619           error ("non-integral used in condition");
2620           return x;
2621         }
2622       if (!is_gimple_condexpr (x))
2623         {
2624           error ("invalid conditional operand");
2625           return x;
2626         }
2627       break;
2628
2629     case NON_LVALUE_EXPR:
2630         gcc_unreachable ();
2631
2632     CASE_CONVERT:
2633     case FIX_TRUNC_EXPR:
2634     case FLOAT_EXPR:
2635     case NEGATE_EXPR:
2636     case ABS_EXPR:
2637     case BIT_NOT_EXPR:
2638     case TRUTH_NOT_EXPR:
2639       CHECK_OP (0, "invalid operand to unary operator");
2640       break;
2641
2642     case REALPART_EXPR:
2643     case IMAGPART_EXPR:
2644     case COMPONENT_REF:
2645     case ARRAY_REF:
2646     case ARRAY_RANGE_REF:
2647     case BIT_FIELD_REF:
2648     case VIEW_CONVERT_EXPR:
2649       /* We have a nest of references.  Verify that each of the operands
2650          that determine where to reference is either a constant or a variable,
2651          verify that the base is valid, and then show we've already checked
2652          the subtrees.  */
2653       while (handled_component_p (t))
2654         {
2655           if (TREE_CODE (t) == COMPONENT_REF && TREE_OPERAND (t, 2))
2656             CHECK_OP (2, "invalid COMPONENT_REF offset operator");
2657           else if (TREE_CODE (t) == ARRAY_REF
2658                    || TREE_CODE (t) == ARRAY_RANGE_REF)
2659             {
2660               CHECK_OP (1, "invalid array index");
2661               if (TREE_OPERAND (t, 2))
2662                 CHECK_OP (2, "invalid array lower bound");
2663               if (TREE_OPERAND (t, 3))
2664                 CHECK_OP (3, "invalid array stride");
2665             }
2666           else if (TREE_CODE (t) == BIT_FIELD_REF)
2667             {
2668               if (!host_integerp (TREE_OPERAND (t, 1), 1)
2669                   || !host_integerp (TREE_OPERAND (t, 2), 1))
2670                 {
2671                   error ("invalid position or size operand to BIT_FIELD_REF");
2672                   return t;
2673                 }
2674               else if (INTEGRAL_TYPE_P (TREE_TYPE (t))
2675                        && (TYPE_PRECISION (TREE_TYPE (t))
2676                            != TREE_INT_CST_LOW (TREE_OPERAND (t, 1))))
2677                 {
2678                   error ("integral result type precision does not match "
2679                          "field size of BIT_FIELD_REF");
2680                   return t;
2681                 }
2682               if (!INTEGRAL_TYPE_P (TREE_TYPE (t))
2683                   && (GET_MODE_PRECISION (TYPE_MODE (TREE_TYPE (t)))
2684                       != TREE_INT_CST_LOW (TREE_OPERAND (t, 1))))
2685                 {
2686                   error ("mode precision of non-integral result does not "
2687                          "match field size of BIT_FIELD_REF");
2688                   return t;
2689                 }
2690             }
2691
2692           t = TREE_OPERAND (t, 0);
2693         }
2694
2695       if (!is_gimple_min_invariant (t) && !is_gimple_lvalue (t))
2696         {
2697           error ("invalid reference prefix");
2698           return t;
2699         }
2700       *walk_subtrees = 0;
2701       break;
2702     case PLUS_EXPR:
2703     case MINUS_EXPR:
2704       /* PLUS_EXPR and MINUS_EXPR don't work on pointers, they should be done using
2705          POINTER_PLUS_EXPR. */
2706       if (POINTER_TYPE_P (TREE_TYPE (t)))
2707         {
2708           error ("invalid operand to plus/minus, type is a pointer");
2709           return t;
2710         }
2711       CHECK_OP (0, "invalid operand to binary operator");
2712       CHECK_OP (1, "invalid operand to binary operator");
2713       break;
2714
2715     case POINTER_PLUS_EXPR:
2716       /* Check to make sure the first operand is a pointer or reference type. */
2717       if (!POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (t, 0))))
2718         {
2719           error ("invalid operand to pointer plus, first operand is not a pointer");
2720           return t;
2721         }
2722       /* Check to make sure the second operand is an integer with type of
2723          sizetype.  */
2724       if (!useless_type_conversion_p (sizetype,
2725                                      TREE_TYPE (TREE_OPERAND (t, 1))))
2726         {
2727           error ("invalid operand to pointer plus, second operand is not an "
2728                  "integer with type of sizetype.");
2729           return t;
2730         }
2731       /* FALLTHROUGH */
2732     case LT_EXPR:
2733     case LE_EXPR:
2734     case GT_EXPR:
2735     case GE_EXPR:
2736     case EQ_EXPR:
2737     case NE_EXPR:
2738     case UNORDERED_EXPR:
2739     case ORDERED_EXPR:
2740     case UNLT_EXPR:
2741     case UNLE_EXPR:
2742     case UNGT_EXPR:
2743     case UNGE_EXPR:
2744     case UNEQ_EXPR:
2745     case LTGT_EXPR:
2746     case MULT_EXPR:
2747     case TRUNC_DIV_EXPR:
2748     case CEIL_DIV_EXPR:
2749     case FLOOR_DIV_EXPR:
2750     case ROUND_DIV_EXPR:
2751     case TRUNC_MOD_EXPR:
2752     case CEIL_MOD_EXPR:
2753     case FLOOR_MOD_EXPR:
2754     case ROUND_MOD_EXPR:
2755     case RDIV_EXPR:
2756     case EXACT_DIV_EXPR:
2757     case MIN_EXPR:
2758     case MAX_EXPR:
2759     case LSHIFT_EXPR:
2760     case RSHIFT_EXPR:
2761     case LROTATE_EXPR:
2762     case RROTATE_EXPR:
2763     case BIT_IOR_EXPR:
2764     case BIT_XOR_EXPR:
2765     case BIT_AND_EXPR:
2766       CHECK_OP (0, "invalid operand to binary operator");
2767       CHECK_OP (1, "invalid operand to binary operator");
2768       break;
2769
2770     case CONSTRUCTOR:
2771       if (TREE_CONSTANT (t) && TREE_CODE (TREE_TYPE (t)) == VECTOR_TYPE)
2772         *walk_subtrees = 0;
2773       break;
2774
2775     default:
2776       break;
2777     }
2778   return NULL;
2779
2780 #undef CHECK_OP
2781 }
2782
2783
2784 /* Verify if EXPR is either a GIMPLE ID or a GIMPLE indirect reference.
2785    Returns true if there is an error, otherwise false.  */
2786
2787 static bool
2788 verify_types_in_gimple_min_lval (tree expr)
2789 {
2790   tree op;
2791
2792   if (is_gimple_id (expr))
2793     return false;
2794
2795   if (!INDIRECT_REF_P (expr)
2796       && TREE_CODE (expr) != TARGET_MEM_REF)
2797     {
2798       error ("invalid expression for min lvalue");
2799       return true;
2800     }
2801
2802   /* TARGET_MEM_REFs are strange beasts.  */
2803   if (TREE_CODE (expr) == TARGET_MEM_REF)
2804     return false;
2805
2806   op = TREE_OPERAND (expr, 0);
2807   if (!is_gimple_val (op))
2808     {
2809       error ("invalid operand in indirect reference");
2810       debug_generic_stmt (op);
2811       return true;
2812     }
2813   if (!useless_type_conversion_p (TREE_TYPE (expr),
2814                                   TREE_TYPE (TREE_TYPE (op))))
2815     {
2816       error ("type mismatch in indirect reference");
2817       debug_generic_stmt (TREE_TYPE (expr));
2818       debug_generic_stmt (TREE_TYPE (TREE_TYPE (op)));
2819       return true;
2820     }
2821
2822   return false;
2823 }
2824
2825 /* Verify if EXPR is a valid GIMPLE reference expression.  If
2826    REQUIRE_LVALUE is true verifies it is an lvalue.  Returns true
2827    if there is an error, otherwise false.  */
2828
2829 static bool
2830 verify_types_in_gimple_reference (tree expr, bool require_lvalue)
2831 {
2832   while (handled_component_p (expr))
2833     {
2834       tree op = TREE_OPERAND (expr, 0);
2835
2836       if (TREE_CODE (expr) == ARRAY_REF
2837           || TREE_CODE (expr) == ARRAY_RANGE_REF)
2838         {
2839           if (!is_gimple_val (TREE_OPERAND (expr, 1))
2840               || (TREE_OPERAND (expr, 2)
2841                   && !is_gimple_val (TREE_OPERAND (expr, 2)))
2842               || (TREE_OPERAND (expr, 3)
2843                   && !is_gimple_val (TREE_OPERAND (expr, 3))))
2844             {
2845               error ("invalid operands to array reference");
2846               debug_generic_stmt (expr);
2847               return true;
2848             }
2849         }
2850
2851       /* Verify if the reference array element types are compatible.  */
2852       if (TREE_CODE (expr) == ARRAY_REF
2853           && !useless_type_conversion_p (TREE_TYPE (expr),
2854                                          TREE_TYPE (TREE_TYPE (op))))
2855         {
2856           error ("type mismatch in array reference");
2857           debug_generic_stmt (TREE_TYPE (expr));
2858           debug_generic_stmt (TREE_TYPE (TREE_TYPE (op)));
2859           return true;
2860         }
2861       if (TREE_CODE (expr) == ARRAY_RANGE_REF
2862           && !useless_type_conversion_p (TREE_TYPE (TREE_TYPE (expr)),
2863                                          TREE_TYPE (TREE_TYPE (op))))
2864         {
2865           error ("type mismatch in array range reference");
2866           debug_generic_stmt (TREE_TYPE (TREE_TYPE (expr)));
2867           debug_generic_stmt (TREE_TYPE (TREE_TYPE (op)));
2868           return true;
2869         }
2870
2871       if ((TREE_CODE (expr) == REALPART_EXPR
2872            || TREE_CODE (expr) == IMAGPART_EXPR)
2873           && !useless_type_conversion_p (TREE_TYPE (expr),
2874                                          TREE_TYPE (TREE_TYPE (op))))
2875         {
2876           error ("type mismatch in real/imagpart reference");
2877           debug_generic_stmt (TREE_TYPE (expr));
2878           debug_generic_stmt (TREE_TYPE (TREE_TYPE (op)));
2879           return true;
2880         }
2881
2882       if (TREE_CODE (expr) == COMPONENT_REF
2883           && !useless_type_conversion_p (TREE_TYPE (expr),
2884                                          TREE_TYPE (TREE_OPERAND (expr, 1))))
2885         {
2886           error ("type mismatch in component reference");
2887           debug_generic_stmt (TREE_TYPE (expr));
2888           debug_generic_stmt (TREE_TYPE (TREE_OPERAND (expr, 1)));
2889           return true;
2890         }
2891
2892       /* For VIEW_CONVERT_EXPRs which are allowed here, too, there
2893          is nothing to verify.  Gross mismatches at most invoke
2894          undefined behavior.  */
2895       if (TREE_CODE (expr) == VIEW_CONVERT_EXPR
2896           && !handled_component_p (op))
2897         return false;
2898
2899       expr = op;
2900     }
2901
2902   return ((require_lvalue || !is_gimple_min_invariant (expr))
2903           && verify_types_in_gimple_min_lval (expr));
2904 }
2905
2906 /* Returns true if there is one pointer type in TYPE_POINTER_TO (SRC_OBJ)
2907    list of pointer-to types that is trivially convertible to DEST.  */
2908
2909 static bool
2910 one_pointer_to_useless_type_conversion_p (tree dest, tree src_obj)
2911 {
2912   tree src;
2913
2914   if (!TYPE_POINTER_TO (src_obj))
2915     return true;
2916
2917   for (src = TYPE_POINTER_TO (src_obj); src; src = TYPE_NEXT_PTR_TO (src))
2918     if (useless_type_conversion_p (dest, src))
2919       return true;
2920
2921   return false;
2922 }
2923
2924 /* Return true if TYPE1 is a fixed-point type and if conversions to and
2925    from TYPE2 can be handled by FIXED_CONVERT_EXPR.  */
2926
2927 static bool
2928 valid_fixed_convert_types_p (tree type1, tree type2)
2929 {
2930   return (FIXED_POINT_TYPE_P (type1)
2931           && (INTEGRAL_TYPE_P (type2)
2932               || SCALAR_FLOAT_TYPE_P (type2)
2933               || FIXED_POINT_TYPE_P (type2)));
2934 }
2935
2936 /* Verify the contents of a GIMPLE_CALL STMT.  Returns true when there
2937    is a problem, otherwise false.  */
2938
2939 static bool
2940 verify_gimple_call (gimple stmt)
2941 {
2942   tree fn = gimple_call_fn (stmt);
2943   tree fntype;
2944
2945   if (!POINTER_TYPE_P (TREE_TYPE  (fn))
2946       || (TREE_CODE (TREE_TYPE (TREE_TYPE (fn))) != FUNCTION_TYPE
2947           && TREE_CODE (TREE_TYPE (TREE_TYPE (fn))) != METHOD_TYPE))
2948     {
2949       error ("non-function in gimple call");
2950       return true;
2951     }
2952
2953   if (gimple_call_lhs (stmt)
2954       && !is_gimple_lvalue (gimple_call_lhs (stmt)))
2955     {
2956       error ("invalid LHS in gimple call");
2957       return true;
2958     }
2959
2960   fntype = TREE_TYPE (TREE_TYPE (fn));
2961   if (gimple_call_lhs (stmt)
2962       && !useless_type_conversion_p (TREE_TYPE (gimple_call_lhs (stmt)),
2963                                      TREE_TYPE (fntype))
2964       /* ???  At least C++ misses conversions at assignments from
2965          void * call results.
2966          ???  Java is completely off.  Especially with functions
2967          returning java.lang.Object.
2968          For now simply allow arbitrary pointer type conversions.  */
2969       && !(POINTER_TYPE_P (TREE_TYPE (gimple_call_lhs (stmt)))
2970            && POINTER_TYPE_P (TREE_TYPE (fntype))))
2971     {
2972       error ("invalid conversion in gimple call");
2973       debug_generic_stmt (TREE_TYPE (gimple_call_lhs (stmt)));
2974       debug_generic_stmt (TREE_TYPE (fntype));
2975       return true;
2976     }
2977
2978   /* If there is a static chain argument, this should not be an indirect
2979      call, and the decl should have DECL_STATIC_CHAIN set.  */
2980   if (gimple_call_chain (stmt))
2981     {
2982       if (TREE_CODE (fn) != ADDR_EXPR
2983           || TREE_CODE (TREE_OPERAND (fn, 0)) != FUNCTION_DECL)
2984         {
2985           error ("static chain in indirect gimple call");
2986           return true;
2987         }
2988       fn = TREE_OPERAND (fn, 0);
2989
2990       if (!DECL_STATIC_CHAIN (fn))
2991         {
2992           error ("static chain with function that doesn't use one");
2993           return true;
2994         }
2995     }
2996
2997   /* ???  The C frontend passes unpromoted arguments in case it
2998      didn't see a function declaration before the call.  So for now
2999      leave the call arguments unverified.  Once we gimplify
3000      unit-at-a-time we have a chance to fix this.  */
3001
3002   return false;
3003 }
3004
3005 /* Verifies the gimple comparison with the result type TYPE and
3006    the operands OP0 and OP1.  */
3007
3008 static bool
3009 verify_gimple_comparison (tree type, tree op0, tree op1)
3010 {
3011   tree op0_type = TREE_TYPE (op0);
3012   tree op1_type = TREE_TYPE (op1);
3013
3014   if (!is_gimple_val (op0) || !is_gimple_val (op1))
3015     {
3016       error ("invalid operands in gimple comparison");
3017       return true;
3018     }
3019
3020   /* For comparisons we do not have the operations type as the
3021      effective type the comparison is carried out in.  Instead
3022      we require that either the first operand is trivially
3023      convertible into the second, or the other way around.
3024      The resulting type of a comparison may be any integral type.
3025      Because we special-case pointers to void we allow
3026      comparisons of pointers with the same mode as well.  */
3027   if ((!useless_type_conversion_p (op0_type, op1_type)
3028        && !useless_type_conversion_p (op1_type, op0_type)
3029        && (!POINTER_TYPE_P (op0_type)
3030            || !POINTER_TYPE_P (op1_type)
3031            || TYPE_MODE (op0_type) != TYPE_MODE (op1_type)))
3032       || !INTEGRAL_TYPE_P (type))
3033     {
3034       error ("type mismatch in comparison expression");
3035       debug_generic_expr (type);
3036       debug_generic_expr (op0_type);
3037       debug_generic_expr (op1_type);
3038       return true;
3039     }
3040
3041   return false;
3042 }
3043
3044 /* Verify a gimple assignment statement STMT with an unary rhs.
3045    Returns true if anything is wrong.  */
3046
3047 static bool
3048 verify_gimple_assign_unary (gimple stmt)
3049 {
3050   enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
3051   tree lhs = gimple_assign_lhs (stmt);
3052   tree lhs_type = TREE_TYPE (lhs);
3053   tree rhs1 = gimple_assign_rhs1 (stmt);
3054   tree rhs1_type = TREE_TYPE (rhs1);
3055
3056   if (!is_gimple_reg (lhs)
3057       && !(optimize == 0
3058            && TREE_CODE (lhs_type) == COMPLEX_TYPE))
3059     {
3060       error ("non-register as LHS of unary operation");
3061       return true;
3062     }
3063
3064   if (!is_gimple_val (rhs1))
3065     {
3066       error ("invalid operand in unary operation");
3067       return true;
3068     }
3069
3070   /* First handle conversions.  */
3071   switch (rhs_code)
3072     {
3073     CASE_CONVERT:
3074       {
3075         /* Allow conversions between integral types and pointers only if
3076            there is no sign or zero extension involved.
3077            For targets were the precision of sizetype doesn't match that
3078            of pointers we need to allow arbitrary conversions from and
3079            to sizetype.  */
3080         if ((POINTER_TYPE_P (lhs_type)
3081              && INTEGRAL_TYPE_P (rhs1_type)
3082              && (TYPE_PRECISION (lhs_type) >= TYPE_PRECISION (rhs1_type)
3083                  || rhs1_type == sizetype))
3084             || (POINTER_TYPE_P (rhs1_type)
3085                 && INTEGRAL_TYPE_P (lhs_type)
3086                 && (TYPE_PRECISION (rhs1_type) >= TYPE_PRECISION (lhs_type)
3087                     || lhs_type == sizetype)))
3088           return false;
3089
3090         /* Allow conversion from integer to offset type and vice versa.  */
3091         if ((TREE_CODE (lhs_type) == OFFSET_TYPE
3092              && TREE_CODE (rhs1_type) == INTEGER_TYPE)
3093             || (TREE_CODE (lhs_type) == INTEGER_TYPE
3094                 && TREE_CODE (rhs1_type) == OFFSET_TYPE))
3095           return false;
3096
3097         /* Otherwise assert we are converting between types of the
3098            same kind.  */
3099         if (INTEGRAL_TYPE_P (lhs_type) != INTEGRAL_TYPE_P (rhs1_type))
3100           {
3101             error ("invalid types in nop conversion");
3102             debug_generic_expr (lhs_type);
3103             debug_generic_expr (rhs1_type);
3104             return true;
3105           }
3106
3107         return false;
3108       }
3109
3110     case FIXED_CONVERT_EXPR:
3111       {
3112         if (!valid_fixed_convert_types_p (lhs_type, rhs1_type)
3113             && !valid_fixed_convert_types_p (rhs1_type, lhs_type))
3114           {
3115             error ("invalid types in fixed-point conversion");
3116             debug_generic_expr (lhs_type);
3117             debug_generic_expr (rhs1_type);
3118             return true;
3119           }
3120
3121         return false;
3122       }
3123
3124     case FLOAT_EXPR:
3125       {
3126         if (!INTEGRAL_TYPE_P (rhs1_type) || !SCALAR_FLOAT_TYPE_P (lhs_type))
3127           {
3128             error ("invalid types in conversion to floating point");
3129             debug_generic_expr (lhs_type);
3130             debug_generic_expr (rhs1_type);
3131             return true;
3132           }
3133
3134         return false;
3135       }
3136
3137     case FIX_TRUNC_EXPR:
3138       {
3139         if (!INTEGRAL_TYPE_P (lhs_type) || !SCALAR_FLOAT_TYPE_P (rhs1_type))
3140           {
3141             error ("invalid types in conversion to integer");
3142             debug_generic_expr (lhs_type);
3143             debug_generic_expr (rhs1_type);
3144             return true;
3145           }
3146
3147         return false;
3148       }
3149
3150     case VEC_UNPACK_HI_EXPR:
3151     case VEC_UNPACK_LO_EXPR:
3152     case REDUC_MAX_EXPR:
3153     case REDUC_MIN_EXPR:
3154     case REDUC_PLUS_EXPR:
3155     case VEC_UNPACK_FLOAT_HI_EXPR:
3156     case VEC_UNPACK_FLOAT_LO_EXPR:
3157       /* FIXME.  */
3158       return false;
3159
3160     case TRUTH_NOT_EXPR:
3161     case NEGATE_EXPR:
3162     case ABS_EXPR:
3163     case BIT_NOT_EXPR:
3164     case PAREN_EXPR:
3165     case NON_LVALUE_EXPR:
3166     case CONJ_EXPR:
3167       break;
3168
3169     default:
3170       gcc_unreachable ();
3171     }
3172
3173   /* For the remaining codes assert there is no conversion involved.  */
3174   if (!useless_type_conversion_p (lhs_type, rhs1_type))
3175     {
3176       error ("non-trivial conversion in unary operation");
3177       debug_generic_expr (lhs_type);
3178       debug_generic_expr (rhs1_type);
3179       return true;
3180     }
3181
3182   return false;
3183 }
3184
3185 /* Verify a gimple assignment statement STMT with a binary rhs.
3186    Returns true if anything is wrong.  */
3187
3188 static bool
3189 verify_gimple_assign_binary (gimple stmt)
3190 {
3191   enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
3192   tree lhs = gimple_assign_lhs (stmt);
3193   tree lhs_type = TREE_TYPE (lhs);
3194   tree rhs1 = gimple_assign_rhs1 (stmt);
3195   tree rhs1_type = TREE_TYPE (rhs1);
3196   tree rhs2 = gimple_assign_rhs2 (stmt);
3197   tree rhs2_type = TREE_TYPE (rhs2);
3198
3199   if (!is_gimple_reg (lhs)
3200       && !(optimize == 0
3201            && TREE_CODE (lhs_type) == COMPLEX_TYPE))
3202     {
3203       error ("non-register as LHS of binary operation");
3204       return true;
3205     }
3206
3207   if (!is_gimple_val (rhs1)
3208       || !is_gimple_val (rhs2))
3209     {
3210       error ("invalid operands in binary operation");
3211       return true;
3212     }
3213
3214   /* First handle operations that involve different types.  */
3215   switch (rhs_code)
3216     {
3217     case COMPLEX_EXPR:
3218       {
3219         if (TREE_CODE (lhs_type) != COMPLEX_TYPE
3220             || !(INTEGRAL_TYPE_P (rhs1_type)
3221                  || SCALAR_FLOAT_TYPE_P (rhs1_type))
3222             || !(INTEGRAL_TYPE_P (rhs2_type)
3223                  || SCALAR_FLOAT_TYPE_P (rhs2_type)))
3224           {
3225             error ("type mismatch in complex expression");
3226             debug_generic_expr (lhs_type);
3227             debug_generic_expr (rhs1_type);
3228             debug_generic_expr (rhs2_type);
3229             return true;
3230           }
3231
3232         return false;
3233       }
3234
3235     case LSHIFT_EXPR:
3236     case RSHIFT_EXPR:
3237     case LROTATE_EXPR:
3238     case RROTATE_EXPR:
3239       {
3240         /* Shifts and rotates are ok on integral types, fixed point
3241            types and integer vector types.  */
3242         if ((!INTEGRAL_TYPE_P (rhs1_type)
3243              && !FIXED_POINT_TYPE_P (rhs1_type)
3244              && !(TREE_CODE (rhs1_type) == VECTOR_TYPE
3245                   && TREE_CODE (TREE_TYPE (rhs1_type)) == INTEGER_TYPE))
3246             || (!INTEGRAL_TYPE_P (rhs2_type)
3247                 /* Vector shifts of vectors are also ok.  */
3248                 && !(TREE_CODE (rhs1_type) == VECTOR_TYPE
3249                      && TREE_CODE (TREE_TYPE (rhs1_type)) == INTEGER_TYPE
3250                      && TREE_CODE (rhs2_type) == VECTOR_TYPE
3251                      && TREE_CODE (TREE_TYPE (rhs2_type)) == INTEGER_TYPE))
3252             || !useless_type_conversion_p (lhs_type, rhs1_type))
3253           {
3254             error ("type mismatch in shift expression");
3255             debug_generic_expr (lhs_type);
3256             debug_generic_expr (rhs1_type);
3257             debug_generic_expr (rhs2_type);
3258             return true;
3259           }
3260
3261         return false;
3262       }
3263
3264     case VEC_LSHIFT_EXPR:
3265     case VEC_RSHIFT_EXPR:
3266       {
3267         if (TREE_CODE (rhs1_type) != VECTOR_TYPE
3268             || !(INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))
3269                  || FIXED_POINT_TYPE_P (TREE_TYPE (rhs1_type))
3270                  || SCALAR_FLOAT_TYPE_P (TREE_TYPE (rhs1_type)))
3271             || (!INTEGRAL_TYPE_P (rhs2_type)
3272                 && (TREE_CODE (rhs2_type) != VECTOR_TYPE
3273                     || !INTEGRAL_TYPE_P (TREE_TYPE (rhs2_type))))
3274             || !useless_type_conversion_p (lhs_type, rhs1_type))
3275           {
3276             error ("type mismatch in vector shift expression");
3277             debug_generic_expr (lhs_type);
3278             debug_generic_expr (rhs1_type);
3279             debug_generic_expr (rhs2_type);
3280             return true;
3281           }
3282         /* For shifting a vector of floating point components we
3283            only allow shifting by a constant multiple of the element size.  */
3284         if (SCALAR_FLOAT_TYPE_P (TREE_TYPE (rhs1_type))
3285             && (TREE_CODE (rhs2) != INTEGER_CST
3286                 || !div_if_zero_remainder (EXACT_DIV_EXPR, rhs2,
3287                                            TYPE_SIZE (TREE_TYPE (rhs1_type)))))
3288           {
3289             error ("non-element sized vector shift of floating point vector");
3290             return true;
3291           }
3292
3293         return false;
3294       }
3295
3296     case PLUS_EXPR:
3297       {
3298         /* We use regular PLUS_EXPR for vectors.
3299            ???  This just makes the checker happy and may not be what is
3300            intended.  */
3301         if (TREE_CODE (lhs_type) == VECTOR_TYPE
3302             && POINTER_TYPE_P (TREE_TYPE (lhs_type)))
3303           {
3304             if (TREE_CODE (rhs1_type) != VECTOR_TYPE
3305                 || TREE_CODE (rhs2_type) != VECTOR_TYPE)
3306               {
3307                 error ("invalid non-vector operands to vector valued plus");
3308                 return true;
3309               }
3310             lhs_type = TREE_TYPE (lhs_type);
3311             rhs1_type = TREE_TYPE (rhs1_type);
3312             rhs2_type = TREE_TYPE (rhs2_type);
3313             /* PLUS_EXPR is commutative, so we might end up canonicalizing
3314                the pointer to 2nd place.  */
3315             if (POINTER_TYPE_P (rhs2_type))
3316               {
3317                 tree tem = rhs1_type;
3318                 rhs1_type = rhs2_type;
3319                 rhs2_type = tem;
3320               }
3321             goto do_pointer_plus_expr_check;
3322           }
3323       }
3324     /* Fallthru.  */
3325     case MINUS_EXPR:
3326       {
3327         if (POINTER_TYPE_P (lhs_type)
3328             || POINTER_TYPE_P (rhs1_type)
3329             || POINTER_TYPE_P (rhs2_type))
3330           {
3331             error ("invalid (pointer) operands to plus/minus");
3332             return true;
3333           }
3334
3335         /* Continue with generic binary expression handling.  */
3336         break;
3337       }
3338
3339     case POINTER_PLUS_EXPR:
3340       {
3341 do_pointer_plus_expr_check:
3342         if (!POINTER_TYPE_P (rhs1_type)
3343             || !useless_type_conversion_p (lhs_type, rhs1_type)
3344             || !useless_type_conversion_p (sizetype, rhs2_type))
3345           {
3346             error ("type mismatch in pointer plus expression");
3347             debug_generic_stmt (lhs_type);
3348             debug_generic_stmt (rhs1_type);
3349             debug_generic_stmt (rhs2_type);
3350             return true;
3351           }
3352
3353         return false;
3354       } 
3355
3356     case TRUTH_ANDIF_EXPR:
3357     case TRUTH_ORIF_EXPR:
3358       gcc_unreachable ();
3359
3360     case TRUTH_AND_EXPR:
3361     case TRUTH_OR_EXPR:
3362     case TRUTH_XOR_EXPR:
3363       {
3364         /* We allow any kind of integral typed argument and result.  */
3365         if (!INTEGRAL_TYPE_P (rhs1_type)
3366             || !INTEGRAL_TYPE_P (rhs2_type)
3367             || !INTEGRAL_TYPE_P (lhs_type))
3368           {
3369             error ("type mismatch in binary truth expression");
3370             debug_generic_expr (lhs_type);
3371             debug_generic_expr (rhs1_type);
3372             debug_generic_expr (rhs2_type);
3373             return true;
3374           }
3375
3376         return false;
3377       }
3378
3379     case LT_EXPR:
3380     case LE_EXPR:
3381     case GT_EXPR:
3382     case GE_EXPR:
3383     case EQ_EXPR:
3384     case NE_EXPR:
3385     case UNORDERED_EXPR:
3386     case ORDERED_EXPR:
3387     case UNLT_EXPR:
3388     case UNLE_EXPR:
3389     case UNGT_EXPR:
3390     case UNGE_EXPR:
3391     case UNEQ_EXPR:
3392     case LTGT_EXPR:
3393       /* Comparisons are also binary, but the result type is not
3394          connected to the operand types.  */
3395       return verify_gimple_comparison (lhs_type, rhs1, rhs2);
3396
3397     case WIDEN_SUM_EXPR:
3398     case WIDEN_MULT_EXPR:
3399     case VEC_WIDEN_MULT_HI_EXPR:
3400     case VEC_WIDEN_MULT_LO_EXPR:
3401     case VEC_PACK_TRUNC_EXPR:
3402     case VEC_PACK_SAT_EXPR:
3403     case VEC_PACK_FIX_TRUNC_EXPR:
3404     case VEC_EXTRACT_EVEN_EXPR:
3405     case VEC_EXTRACT_ODD_EXPR:
3406     case VEC_INTERLEAVE_HIGH_EXPR:
3407     case VEC_INTERLEAVE_LOW_EXPR:
3408       /* FIXME.  */
3409       return false;
3410
3411     case MULT_EXPR:
3412     case TRUNC_DIV_EXPR:
3413     case CEIL_DIV_EXPR:
3414     case FLOOR_DIV_EXPR:
3415     case ROUND_DIV_EXPR:
3416     case TRUNC_MOD_EXPR:
3417     case CEIL_MOD_EXPR:
3418     case FLOOR_MOD_EXPR:
3419     case ROUND_MOD_EXPR:
3420     case RDIV_EXPR:
3421     case EXACT_DIV_EXPR:
3422     case MIN_EXPR:
3423     case MAX_EXPR:
3424     case BIT_IOR_EXPR:
3425     case BIT_XOR_EXPR:
3426     case BIT_AND_EXPR:
3427       /* Continue with generic binary expression handling.  */
3428       break;
3429
3430     default:
3431       gcc_unreachable ();
3432     }
3433
3434   if (!useless_type_conversion_p (lhs_type, rhs1_type)
3435       || !useless_type_conversion_p (lhs_type, rhs2_type))
3436     {
3437       error ("type mismatch in binary expression");
3438       debug_generic_stmt (lhs_type);
3439       debug_generic_stmt (rhs1_type);
3440       debug_generic_stmt (rhs2_type);
3441       return true;
3442     }
3443
3444   return false;
3445 }
3446
3447 /* Verify a gimple assignment statement STMT with a single rhs.
3448    Returns true if anything is wrong.  */
3449
3450 static bool
3451 verify_gimple_assign_single (gimple stmt)
3452 {
3453   enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
3454   tree lhs = gimple_assign_lhs (stmt);
3455   tree lhs_type = TREE_TYPE (lhs);
3456   tree rhs1 = gimple_assign_rhs1 (stmt);
3457   tree rhs1_type = TREE_TYPE (rhs1);
3458   bool res = false;
3459
3460   if (!useless_type_conversion_p (lhs_type, rhs1_type))
3461     {
3462       error ("non-trivial conversion at assignment");
3463       debug_generic_expr (lhs_type);
3464       debug_generic_expr (rhs1_type);
3465       return true;
3466     }
3467
3468   if (handled_component_p (lhs))
3469     res |= verify_types_in_gimple_reference (lhs, true);
3470
3471   /* Special codes we cannot handle via their class.  */
3472   switch (rhs_code)
3473     {
3474     case ADDR_EXPR:
3475       {
3476         tree op = TREE_OPERAND (rhs1, 0);
3477         if (!is_gimple_addressable (op))
3478           {
3479             error ("invalid operand in unary expression");
3480             return true;
3481           }
3482
3483         if (!types_compatible_p (TREE_TYPE (op), TREE_TYPE (TREE_TYPE (rhs1)))
3484             && !one_pointer_to_useless_type_conversion_p (TREE_TYPE (rhs1),
3485                                                           TREE_TYPE (op)))
3486           {
3487             error ("type mismatch in address expression");
3488             debug_generic_stmt (TREE_TYPE (rhs1));
3489             debug_generic_stmt (TREE_TYPE (op));
3490             return true;
3491           }
3492
3493         return verify_types_in_gimple_reference (op, true);
3494       }
3495
3496     /* tcc_reference  */
3497     case COMPONENT_REF:
3498     case BIT_FIELD_REF:
3499     case INDIRECT_REF:
3500     case ALIGN_INDIRECT_REF:
3501     case MISALIGNED_INDIRECT_REF:
3502     case ARRAY_REF:
3503     case ARRAY_RANGE_REF:
3504     case VIEW_CONVERT_EXPR:
3505     case REALPART_EXPR:
3506     case IMAGPART_EXPR:
3507     case TARGET_MEM_REF:
3508       if (!is_gimple_reg (lhs)
3509           && is_gimple_reg_type (TREE_TYPE (lhs)))
3510         {
3511           error ("invalid rhs for gimple memory store");
3512           debug_generic_stmt (lhs);
3513           debug_generic_stmt (rhs1);
3514           return true;
3515         }
3516       return res || verify_types_in_gimple_reference (rhs1, false);
3517
3518     /* tcc_constant  */
3519     case SSA_NAME:
3520     case INTEGER_CST:
3521     case REAL_CST:
3522     case FIXED_CST:
3523     case COMPLEX_CST:
3524     case VECTOR_CST:
3525     case STRING_CST:
3526       return res;
3527
3528     /* tcc_declaration  */
3529     case CONST_DECL:
3530       return res;
3531     case VAR_DECL:
3532     case PARM_DECL:
3533       if (!is_gimple_reg (lhs)
3534           && !is_gimple_reg (rhs1)
3535           && is_gimple_reg_type (TREE_TYPE (lhs)))
3536         {
3537           error ("invalid rhs for gimple memory store");
3538           debug_generic_stmt (lhs);
3539           debug_generic_stmt (rhs1);
3540           return true;
3541         }
3542       return res;
3543
3544     case COND_EXPR:
3545     case CONSTRUCTOR:
3546     case OBJ_TYPE_REF:
3547     case ASSERT_EXPR:
3548     case WITH_SIZE_EXPR:
3549     case POLYNOMIAL_CHREC:
3550     case DOT_PROD_EXPR:
3551     case VEC_COND_EXPR:
3552     case REALIGN_LOAD_EXPR:
3553       /* FIXME.  */
3554       return res;
3555
3556     default:;
3557     }
3558
3559   return res;
3560 }
3561
3562 /* Verify the contents of a GIMPLE_ASSIGN STMT.  Returns true when there
3563    is a problem, otherwise false.  */
3564
3565 static bool
3566 verify_gimple_assign (gimple stmt)
3567 {
3568   switch (gimple_assign_rhs_class (stmt))
3569     {
3570     case GIMPLE_SINGLE_RHS:
3571       return verify_gimple_assign_single (stmt);
3572
3573     case GIMPLE_UNARY_RHS:
3574       return verify_gimple_assign_unary (stmt);
3575
3576     case GIMPLE_BINARY_RHS:
3577       return verify_gimple_assign_binary (stmt);
3578
3579     default:
3580       gcc_unreachable ();
3581     }
3582 }
3583
3584 /* Verify the contents of a GIMPLE_RETURN STMT.  Returns true when there
3585    is a problem, otherwise false.  */
3586
3587 static bool
3588 verify_gimple_return (gimple stmt)
3589 {
3590   tree op = gimple_return_retval (stmt);
3591   tree restype = TREE_TYPE (TREE_TYPE (cfun->decl));
3592
3593   /* We cannot test for present return values as we do not fix up missing
3594      return values from the original source.  */
3595   if (op == NULL)
3596     return false;
3597  
3598   if (!is_gimple_val (op)
3599       && TREE_CODE (op) != RESULT_DECL)
3600     {
3601       error ("invalid operand in return statement");
3602       debug_generic_stmt (op);
3603       return true;
3604     }
3605
3606   if (!useless_type_conversion_p (restype, TREE_TYPE (op))
3607       /* ???  With C++ we can have the situation that the result
3608          decl is a reference type while the return type is an aggregate.  */
3609       && !(TREE_CODE (op) == RESULT_DECL
3610            && TREE_CODE (TREE_TYPE (op)) == REFERENCE_TYPE
3611            && useless_type_conversion_p (restype, TREE_TYPE (TREE_TYPE (op)))))
3612     {
3613       error ("invalid conversion in return statement");
3614       debug_generic_stmt (restype);
3615       debug_generic_stmt (TREE_TYPE (op));
3616       return true;
3617     }
3618
3619   return false;
3620 }
3621
3622
3623 /* Verify the contents of a GIMPLE_GOTO STMT.  Returns true when there
3624    is a problem, otherwise false.  */
3625
3626 static bool
3627 verify_gimple_goto (gimple stmt)
3628 {
3629   tree dest = gimple_goto_dest (stmt);
3630
3631   /* ???  We have two canonical forms of direct goto destinations, a
3632      bare LABEL_DECL and an ADDR_EXPR of a LABEL_DECL.  */
3633   if (TREE_CODE (dest) != LABEL_DECL
3634       && (!is_gimple_val (dest)
3635           || !POINTER_TYPE_P (TREE_TYPE (dest))))
3636     {
3637       error ("goto destination is neither a label nor a pointer");
3638       return true;
3639     }
3640
3641   return false;
3642 }
3643
3644 /* Verify the contents of a GIMPLE_SWITCH STMT.  Returns true when there
3645    is a problem, otherwise false.  */
3646
3647 static bool
3648 verify_gimple_switch (gimple stmt)
3649 {
3650   if (!is_gimple_val (gimple_switch_index (stmt)))
3651     {
3652       error ("invalid operand to switch statement");
3653       debug_generic_stmt (gimple_switch_index (stmt));
3654       return true;
3655     }
3656
3657   return false;
3658 }
3659
3660
3661 /* Verify the contents of a GIMPLE_PHI.  Returns true if there is a problem,
3662    and false otherwise.  */
3663
3664 static bool
3665 verify_gimple_phi (gimple stmt)
3666 {
3667   tree type = TREE_TYPE (gimple_phi_result (stmt));
3668   unsigned i;
3669
3670   if (TREE_CODE (gimple_phi_result (stmt)) != SSA_NAME)
3671     {
3672       error ("Invalid PHI result");
3673       return true;
3674     }
3675
3676   for (i = 0; i < gimple_phi_num_args (stmt); i++)
3677     {
3678       tree arg = gimple_phi_arg_def (stmt, i);
3679       if ((is_gimple_reg (gimple_phi_result (stmt))
3680            && !is_gimple_val (arg))
3681           || (!is_gimple_reg (gimple_phi_result (stmt))
3682               && !is_gimple_addressable (arg)))
3683         {
3684           error ("Invalid PHI argument");
3685           debug_generic_stmt (arg);
3686           return true;
3687         }
3688       if (!useless_type_conversion_p (type, TREE_TYPE (arg)))
3689         {
3690           error ("Incompatible types in PHI argument %u", i);
3691           debug_generic_stmt (type);
3692           debug_generic_stmt (TREE_TYPE (arg));
3693           return true;
3694         }
3695     }
3696
3697   return false;
3698 }
3699
3700
3701 /* Verify a gimple debug statement STMT.
3702    Returns true if anything is wrong.  */
3703
3704 static bool
3705 verify_gimple_debug (gimple stmt ATTRIBUTE_UNUSED)
3706 {
3707   /* There isn't much that could be wrong in a gimple debug stmt.  A
3708      gimple debug bind stmt, for example, maps a tree, that's usually
3709      a VAR_DECL or a PARM_DECL, but that could also be some scalarized
3710      component or member of an aggregate type, to another tree, that
3711      can be an arbitrary expression.  These stmts expand into debug
3712      insns, and are converted to debug notes by var-tracking.c.  */
3713   return false;
3714 }
3715
3716
3717 /* Verify the GIMPLE statement STMT.  Returns true if there is an
3718    error, otherwise false.  */
3719
3720 static bool
3721 verify_types_in_gimple_stmt (gimple stmt)
3722 {
3723   switch (gimple_code (stmt))
3724     {
3725     case GIMPLE_ASSIGN:
3726       return verify_gimple_assign (stmt);
3727
3728     case GIMPLE_LABEL:
3729       return TREE_CODE (gimple_label_label (stmt)) != LABEL_DECL;
3730
3731     case GIMPLE_CALL:
3732       return verify_gimple_call (stmt);
3733
3734     case GIMPLE_COND:
3735       return verify_gimple_comparison (boolean_type_node,
3736                                        gimple_cond_lhs (stmt),
3737                                        gimple_cond_rhs (stmt));
3738
3739     case GIMPLE_GOTO:
3740       return verify_gimple_goto (stmt);
3741
3742     case GIMPLE_SWITCH:
3743       return verify_gimple_switch (stmt);
3744
3745     case GIMPLE_RETURN:
3746       return verify_gimple_return (stmt);
3747
3748     case GIMPLE_ASM:
3749       return false;
3750
3751     case GIMPLE_PHI:
3752       return verify_gimple_phi (stmt);
3753
3754     /* Tuples that do not have tree operands.  */
3755     case GIMPLE_NOP:
3756     case GIMPLE_PREDICT:
3757     case GIMPLE_RESX:
3758     case GIMPLE_EH_DISPATCH:
3759     case GIMPLE_EH_MUST_NOT_THROW:
3760       return false;
3761
3762     CASE_GIMPLE_OMP:
3763       /* OpenMP directives are validated by the FE and never operated
3764          on by the optimizers.  Furthermore, GIMPLE_OMP_FOR may contain
3765          non-gimple expressions when the main index variable has had
3766          its address taken.  This does not affect the loop itself
3767          because the header of an GIMPLE_OMP_FOR is merely used to determine
3768          how to setup the parallel iteration.  */
3769       return false;
3770
3771     case GIMPLE_DEBUG:
3772       return verify_gimple_debug (stmt);
3773
3774     default:
3775       gcc_unreachable ();
3776     }
3777 }
3778
3779 /* Verify the GIMPLE statements inside the sequence STMTS.  */
3780
3781 static bool
3782 verify_types_in_gimple_seq_2 (gimple_seq stmts)
3783 {
3784   gimple_stmt_iterator ittr;
3785   bool err = false;
3786
3787   for (ittr = gsi_start (stmts); !gsi_end_p (ittr); gsi_next (&ittr))
3788     {
3789       gimple stmt = gsi_stmt (ittr);
3790
3791       switch (gimple_code (stmt))
3792         {
3793         case GIMPLE_BIND:
3794           err |= verify_types_in_gimple_seq_2 (gimple_bind_body (stmt));
3795           break;
3796
3797         case GIMPLE_TRY:
3798           err |= verify_types_in_gimple_seq_2 (gimple_try_eval (stmt));
3799           err |= verify_types_in_gimple_seq_2 (gimple_try_cleanup (stmt));
3800           break;
3801
3802         case GIMPLE_EH_FILTER:
3803           err |= verify_types_in_gimple_seq_2 (gimple_eh_filter_failure (stmt));
3804           break;
3805
3806         case GIMPLE_CATCH:
3807           err |= verify_types_in_gimple_seq_2 (gimple_catch_handler (stmt));
3808           break;
3809
3810         default:
3811           {
3812             bool err2 = verify_types_in_gimple_stmt (stmt);
3813             if (err2)
3814               debug_gimple_stmt (stmt);
3815             err |= err2;
3816           }
3817         }
3818     }
3819
3820   return err;
3821 }
3822
3823
3824 /* Verify the GIMPLE statements inside the statement list STMTS.  */
3825
3826 void
3827 verify_types_in_gimple_seq (gimple_seq stmts)
3828 {
3829   if (verify_types_in_gimple_seq_2 (stmts))
3830     internal_error ("verify_gimple failed");
3831 }
3832
3833
3834 /* Verify STMT, return true if STMT is not in GIMPLE form.
3835    TODO: Implement type checking.  */
3836
3837 static bool
3838 verify_stmt (gimple_stmt_iterator *gsi)
3839 {
3840   tree addr;
3841   struct walk_stmt_info wi;
3842   bool last_in_block = gsi_one_before_end_p (*gsi);
3843   gimple stmt = gsi_stmt (*gsi);
3844   int lp_nr;
3845
3846   if (is_gimple_omp (stmt))
3847     {
3848       /* OpenMP directives are validated by the FE and never operated
3849          on by the optimizers.  Furthermore, GIMPLE_OMP_FOR may contain
3850          non-gimple expressions when the main index variable has had
3851          its address taken.  This does not affect the loop itself
3852          because the header of an GIMPLE_OMP_FOR is merely used to determine
3853          how to setup the parallel iteration.  */
3854       return false;
3855     }
3856
3857   /* FIXME.  The C frontend passes unpromoted arguments in case it
3858      didn't see a function declaration before the call.  */
3859   if (is_gimple_call (stmt))
3860     {
3861       tree decl;
3862
3863       if (!is_gimple_call_addr (gimple_call_fn (stmt)))
3864         {
3865           error ("invalid function in call statement");
3866           return true;
3867         }
3868
3869       decl = gimple_call_fndecl (stmt);
3870       if (decl
3871           && TREE_CODE (decl) == FUNCTION_DECL
3872           && DECL_LOOPING_CONST_OR_PURE_P (decl)
3873           && (!DECL_PURE_P (decl))
3874           && (!TREE_READONLY (decl)))
3875         {
3876           error ("invalid pure const state for function");
3877           return true;
3878         }
3879     }
3880
3881   if (is_gimple_debug (stmt))
3882     return false;
3883
3884   memset (&wi, 0, sizeof (wi));
3885   addr = walk_gimple_op (gsi_stmt (*gsi), verify_expr, &wi);
3886   if (addr)
3887     {
3888       debug_generic_expr (addr);
3889       inform (gimple_location (gsi_stmt (*gsi)), "in statement");
3890       debug_gimple_stmt (stmt);
3891       return true;
3892     }
3893
3894   /* If the statement is marked as part of an EH region, then it is
3895      expected that the statement could throw.  Verify that when we
3896      have optimizations that simplify statements such that we prove
3897      that they cannot throw, that we update other data structures
3898      to match.  */
3899   lp_nr = lookup_stmt_eh_lp (stmt);
3900   if (lp_nr != 0)
3901     {
3902       if (!stmt_could_throw_p (stmt))
3903         {
3904           /* During IPA passes, ipa-pure-const sets nothrow flags on calls
3905              and they are updated on statements only after fixup_cfg
3906              is executed at beggining of expansion stage.  */
3907           if (cgraph_state != CGRAPH_STATE_IPA_SSA)
3908             {
3909               error ("statement marked for throw, but doesn%'t");
3910               goto fail;
3911             }
3912         }
3913       else if (lp_nr > 0 && !last_in_block && stmt_can_throw_internal (stmt))
3914         {
3915           error ("statement marked for throw in middle of block");
3916           goto fail;
3917         }
3918     }
3919
3920   return false;
3921
3922  fail:
3923   debug_gimple_stmt (stmt);
3924   return true;
3925 }
3926
3927
3928 /* Return true when the T can be shared.  */
3929
3930 bool
3931 tree_node_can_be_shared (tree t)
3932 {
3933   if (IS_TYPE_OR_DECL_P (t)
3934       || is_gimple_min_invariant (t)
3935       || TREE_CODE (t) == SSA_NAME
3936       || t == error_mark_node
3937       || TREE_CODE (t) == IDENTIFIER_NODE)
3938     return true;
3939
3940   if (TREE_CODE (t) == CASE_LABEL_EXPR)
3941     return true;
3942
3943   while (((TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
3944            && is_gimple_min_invariant (TREE_OPERAND (t, 1)))
3945          || TREE_CODE (t) == COMPONENT_REF
3946          || TREE_CODE (t) == REALPART_EXPR
3947          || TREE_CODE (t) == IMAGPART_EXPR)
3948     t = TREE_OPERAND (t, 0);
3949
3950   if (DECL_P (t))
3951     return true;
3952
3953   return false;
3954 }
3955
3956
3957 /* Called via walk_gimple_stmt.  Verify tree sharing.  */
3958
3959 static tree
3960 verify_node_sharing (tree *tp, int *walk_subtrees, void *data)
3961 {
3962   struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
3963   struct pointer_set_t *visited = (struct pointer_set_t *) wi->info;
3964
3965   if (tree_node_can_be_shared (*tp))
3966     {
3967       *walk_subtrees = false;
3968       return NULL;
3969     }
3970
3971   if (pointer_set_insert (visited, *tp))
3972     return *tp;
3973
3974   return NULL;
3975 }
3976
3977
3978 static bool eh_error_found;
3979 static int
3980 verify_eh_throw_stmt_node (void **slot, void *data)
3981 {
3982   struct throw_stmt_node *node = (struct throw_stmt_node *)*slot;
3983   struct pointer_set_t *visited = (struct pointer_set_t *) data;
3984
3985   if (!pointer_set_contains (visited, node->stmt))
3986     {
3987       error ("Dead STMT in EH table");
3988       debug_gimple_stmt (node->stmt);
3989       eh_error_found = true;
3990     }
3991   return 1;
3992 }
3993
3994
3995 /* Verify the GIMPLE statements in every basic block.  */
3996
3997 void
3998 verify_stmts (void)
3999 {
4000   basic_block bb;
4001   gimple_stmt_iterator gsi;
4002   bool err = false;
4003   struct pointer_set_t *visited, *visited_stmts;
4004   tree addr;
4005   struct walk_stmt_info wi;
4006
4007   timevar_push (TV_TREE_STMT_VERIFY);
4008   visited = pointer_set_create ();
4009   visited_stmts = pointer_set_create ();
4010
4011   memset (&wi, 0, sizeof (wi));
4012   wi.info = (void *) visited;
4013
4014   FOR_EACH_BB (bb)
4015     {
4016       gimple phi;
4017       size_t i;
4018
4019       for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
4020         {
4021           phi = gsi_stmt (gsi);
4022           pointer_set_insert (visited_stmts, phi);
4023           if (gimple_bb (phi) != bb)
4024             {
4025               error ("gimple_bb (phi) is set to a wrong basic block");
4026               err |= true;
4027             }
4028
4029           for (i = 0; i < gimple_phi_num_args (phi); i++)
4030             {
4031               tree t = gimple_phi_arg_def (phi, i);
4032               tree addr;
4033
4034               if (!t)
4035                 {
4036                   error ("missing PHI def");
4037                   debug_gimple_stmt (phi);
4038                   err |= true;
4039                   continue;
4040                 }
4041               /* Addressable variables do have SSA_NAMEs but they
4042                  are not considered gimple values.  */
4043               else if (TREE_CODE (t) != SSA_NAME
4044                        && TREE_CODE (t) != FUNCTION_DECL
4045                        && !is_gimple_min_invariant (t))
4046                 {
4047                   error ("PHI argument is not a GIMPLE value");
4048                   debug_gimple_stmt (phi);
4049                   debug_generic_expr (t);
4050                   err |= true;
4051                 }
4052
4053               addr = walk_tree (&t, verify_node_sharing, visited, NULL);
4054               if (addr)
4055                 {
4056                   error ("incorrect sharing of tree nodes");
4057                   debug_gimple_stmt (phi);
4058                   debug_generic_expr (addr);
4059                   err |= true;
4060                 }
4061             }
4062
4063 #ifdef ENABLE_TYPES_CHECKING
4064           if (verify_gimple_phi (phi))
4065             {
4066               debug_gimple_stmt (phi);
4067               err |= true;
4068             }
4069 #endif
4070         }
4071
4072       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); )
4073         {
4074           gimple stmt = gsi_stmt (gsi);
4075
4076           if (gimple_code (stmt) == GIMPLE_WITH_CLEANUP_EXPR
4077               || gimple_code (stmt) == GIMPLE_BIND)
4078             {
4079               error ("invalid GIMPLE statement");
4080               debug_gimple_stmt (stmt);
4081               err |= true;
4082             }
4083
4084           pointer_set_insert (visited_stmts, stmt);
4085
4086           if (gimple_bb (stmt) != bb)
4087             {
4088               error ("gimple_bb (stmt) is set to a wrong basic block");
4089               debug_gimple_stmt (stmt);
4090               err |= true;
4091             }
4092
4093           if (gimple_code (stmt) == GIMPLE_LABEL)
4094             {
4095               tree decl = gimple_label_label (stmt);
4096               int uid = LABEL_DECL_UID (decl);
4097
4098               if (uid == -1
4099                   || VEC_index (basic_block, label_to_block_map, uid) != bb)
4100                 {
4101                   error ("incorrect entry in label_to_block_map");
4102                   err |= true;
4103                 }
4104
4105               uid = EH_LANDING_PAD_NR (decl);
4106               if (uid)
4107                 {
4108                   eh_landing_pad lp = get_eh_landing_pad_from_number (uid);
4109                   if (decl != lp->post_landing_pad)
4110                     {
4111                       error ("incorrect setting of landing pad number");
4112                       err |= true;
4113                     }
4114                 }
4115             }
4116
4117           err |= verify_stmt (&gsi);
4118
4119 #ifdef ENABLE_TYPES_CHECKING
4120           if (verify_types_in_gimple_stmt (gsi_stmt (gsi)))
4121             {
4122               debug_gimple_stmt (stmt);
4123               err |= true;
4124             }
4125 #endif
4126           addr = walk_gimple_op (gsi_stmt (gsi), verify_node_sharing, &wi);
4127           if (addr)
4128             {
4129               error ("incorrect sharing of tree nodes");
4130               debug_gimple_stmt (stmt);
4131               debug_generic_expr (addr);
4132               err |= true;
4133             }
4134           gsi_next (&gsi);
4135         }
4136     }
4137
4138   eh_error_found = false;
4139   if (get_eh_throw_stmt_table (cfun))
4140     htab_traverse (get_eh_throw_stmt_table (cfun),
4141                    verify_eh_throw_stmt_node,
4142                    visited_stmts);
4143
4144   if (err | eh_error_found)
4145     internal_error ("verify_stmts failed");
4146
4147   pointer_set_destroy (visited);
4148   pointer_set_destroy (visited_stmts);
4149   verify_histograms ();
4150   timevar_pop (TV_TREE_STMT_VERIFY);
4151 }
4152
4153
4154 /* Verifies that the flow information is OK.  */
4155
4156 static int
4157 gimple_verify_flow_info (void)
4158 {
4159   int err = 0;
4160   basic_block bb;
4161   gimple_stmt_iterator gsi;
4162   gimple stmt;
4163   edge e;
4164   edge_iterator ei;
4165
4166   if (ENTRY_BLOCK_PTR->il.gimple)
4167     {
4168       error ("ENTRY_BLOCK has IL associated with it");
4169       err = 1;
4170     }
4171
4172   if (EXIT_BLOCK_PTR->il.gimple)
4173     {
4174       error ("EXIT_BLOCK has IL associated with it");
4175       err = 1;
4176     }
4177
4178   FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
4179     if (e->flags & EDGE_FALLTHRU)
4180       {
4181         error ("fallthru to exit from bb %d", e->src->index);
4182         err = 1;
4183       }
4184
4185   FOR_EACH_BB (bb)
4186     {
4187       bool found_ctrl_stmt = false;
4188
4189       stmt = NULL;
4190
4191       /* Skip labels on the start of basic block.  */
4192       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
4193         {
4194           tree label;
4195           gimple prev_stmt = stmt;
4196
4197           stmt = gsi_stmt (gsi);
4198
4199           if (gimple_code (stmt) != GIMPLE_LABEL)
4200             break;
4201
4202           label = gimple_label_label (stmt);
4203           if (prev_stmt && DECL_NONLOCAL (label))
4204             {
4205               error ("nonlocal label ");
4206               print_generic_expr (stderr, label, 0);
4207               fprintf (stderr, " is not first in a sequence of labels in bb %d",
4208                        bb->index);
4209               err = 1;
4210             }
4211
4212           if (label_to_block (label) != bb)
4213             {
4214               error ("label ");
4215               print_generic_expr (stderr, label, 0);
4216               fprintf (stderr, " to block does not match in bb %d",
4217                        bb->index);
4218               err = 1;
4219             }
4220
4221           if (decl_function_context (label) != current_function_decl)
4222             {
4223               error ("label ");
4224               print_generic_expr (stderr, label, 0);
4225               fprintf (stderr, " has incorrect context in bb %d",
4226                        bb->index);
4227               err = 1;
4228             }
4229         }
4230
4231       /* Verify that body of basic block BB is free of control flow.  */
4232       for (; !gsi_end_p (gsi); gsi_next (&gsi))
4233         {
4234           gimple stmt = gsi_stmt (gsi);
4235
4236           if (found_ctrl_stmt)
4237             {
4238               error ("control flow in the middle of basic block %d",
4239                      bb->index);
4240               err = 1;
4241             }
4242
4243           if (stmt_ends_bb_p (stmt))
4244             found_ctrl_stmt = true;
4245
4246           if (gimple_code (stmt) == GIMPLE_LABEL)
4247             {
4248               error ("label ");
4249               print_generic_expr (stderr, gimple_label_label (stmt), 0);
4250               fprintf (stderr, " in the middle of basic block %d", bb->index);
4251               err = 1;
4252             }
4253         }
4254
4255       gsi = gsi_last_bb (bb);
4256       if (gsi_end_p (gsi))
4257         continue;
4258
4259       stmt = gsi_stmt (gsi);
4260
4261       if (gimple_code (stmt) == GIMPLE_LABEL)
4262         continue;
4263
4264       err |= verify_eh_edges (stmt);
4265
4266       if (is_ctrl_stmt (stmt))
4267         {
4268           FOR_EACH_EDGE (e, ei, bb->succs)
4269             if (e->flags & EDGE_FALLTHRU)
4270               {
4271                 error ("fallthru edge after a control statement in bb %d",
4272                        bb->index);
4273                 err = 1;
4274               }
4275         }
4276
4277       if (gimple_code (stmt) != GIMPLE_COND)
4278         {
4279           /* Verify that there are no edges with EDGE_TRUE/FALSE_FLAG set
4280              after anything else but if statement.  */
4281           FOR_EACH_EDGE (e, ei, bb->succs)
4282             if (e->flags & (EDGE_TRUE_VALUE | EDGE_FALSE_VALUE))
4283               {
4284                 error ("true/false edge after a non-GIMPLE_COND in bb %d",
4285                        bb->index);
4286                 err = 1;
4287               }
4288         }
4289
4290       switch (gimple_code (stmt))
4291         {
4292         case GIMPLE_COND:
4293           {
4294             edge true_edge;
4295             edge false_edge;
4296   
4297             extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
4298
4299             if (!true_edge
4300                 || !false_edge
4301                 || !(true_edge->flags & EDGE_TRUE_VALUE)
4302                 || !(false_edge->flags & EDGE_FALSE_VALUE)
4303                 || (true_edge->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL))
4304                 || (false_edge->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL))
4305                 || EDGE_COUNT (bb->succs) >= 3)
4306               {
4307                 error ("wrong outgoing edge flags at end of bb %d",
4308                        bb->index);
4309                 err = 1;
4310               }
4311           }
4312           break;
4313
4314         case GIMPLE_GOTO:
4315           if (simple_goto_p (stmt))
4316             {
4317               error ("explicit goto at end of bb %d", bb->index);
4318               err = 1;
4319             }
4320           else
4321             {
4322               /* FIXME.  We should double check that the labels in the
4323                  destination blocks have their address taken.  */
4324               FOR_EACH_EDGE (e, ei, bb->succs)
4325                 if ((e->flags & (EDGE_FALLTHRU | EDGE_TRUE_VALUE
4326                                  | EDGE_FALSE_VALUE))
4327                     || !(e->flags & EDGE_ABNORMAL))
4328                   {
4329                     error ("wrong outgoing edge flags at end of bb %d",
4330                            bb->index);
4331                     err = 1;
4332                   }
4333             }
4334           break;
4335
4336         case GIMPLE_RETURN:
4337           if (!single_succ_p (bb)
4338               || (single_succ_edge (bb)->flags
4339                   & (EDGE_FALLTHRU | EDGE_ABNORMAL
4340                      | EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
4341             {
4342               error ("wrong outgoing edge flags at end of bb %d", bb->index);
4343               err = 1;
4344             }
4345           if (single_succ (bb) != EXIT_BLOCK_PTR)
4346             {
4347               error ("return edge does not point to exit in bb %d",
4348                      bb->index);
4349               err = 1;
4350             }
4351           break;
4352
4353         case GIMPLE_SWITCH:
4354           {
4355             tree prev;
4356             edge e;
4357             size_t i, n;
4358
4359             n = gimple_switch_num_labels (stmt);
4360
4361             /* Mark all the destination basic blocks.  */
4362             for (i = 0; i < n; ++i)
4363               {
4364                 tree lab = CASE_LABEL (gimple_switch_label (stmt, i));
4365                 basic_block label_bb = label_to_block (lab);
4366                 gcc_assert (!label_bb->aux || label_bb->aux == (void *)1);
4367                 label_bb->aux = (void *)1;
4368               }
4369
4370             /* Verify that the case labels are sorted.  */
4371             prev = gimple_switch_label (stmt, 0);
4372             for (i = 1; i < n; ++i)
4373               {
4374                 tree c = gimple_switch_label (stmt, i);
4375                 if (!CASE_LOW (c))
4376                   {
4377                     error ("found default case not at the start of "
4378                            "case vector");
4379                     err = 1;
4380                     continue;
4381                   }
4382                 if (CASE_LOW (prev)
4383                     && !tree_int_cst_lt (CASE_LOW (prev), CASE_LOW (c)))
4384                   {
4385                     error ("case labels not sorted: ");
4386                     print_generic_expr (stderr, prev, 0);
4387                     fprintf (stderr," is greater than ");
4388                     print_generic_expr (stderr, c, 0);
4389                     fprintf (stderr," but comes before it.\n");
4390                     err = 1;
4391                   }
4392                 prev = c;
4393               }
4394             /* VRP will remove the default case if it can prove it will
4395                never be executed.  So do not verify there always exists
4396                a default case here.  */
4397
4398             FOR_EACH_EDGE (e, ei, bb->succs)
4399               {
4400                 if (!e->dest->aux)
4401                   {
4402                     error ("extra outgoing edge %d->%d",
4403                            bb->index, e->dest->index);
4404                     err = 1;
4405                   }
4406
4407                 e->dest->aux = (void *)2;
4408                 if ((e->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL
4409                                  | EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
4410                   {
4411                     error ("wrong outgoing edge flags at end of bb %d",
4412                            bb->index);
4413                     err = 1;
4414                   }
4415               }
4416
4417             /* Check that we have all of them.  */
4418             for (i = 0; i < n; ++i)
4419               {
4420                 tree lab = CASE_LABEL (gimple_switch_label (stmt, i));
4421                 basic_block label_bb = label_to_block (lab);
4422
4423                 if (label_bb->aux != (void *)2)
4424                   {
4425                     error ("missing edge %i->%i", bb->index, label_bb->index);
4426                     err = 1;
4427                   }
4428               }
4429
4430             FOR_EACH_EDGE (e, ei, bb->succs)
4431               e->dest->aux = (void *)0;
4432           }
4433           break;
4434
4435         case GIMPLE_EH_DISPATCH:
4436           err |= verify_eh_dispatch_edge (stmt);
4437           break;
4438
4439         default:
4440           break;
4441         }
4442     }
4443
4444   if (dom_info_state (CDI_DOMINATORS) >= DOM_NO_FAST_QUERY)
4445     verify_dominators (CDI_DOMINATORS);
4446
4447   return err;
4448 }
4449
4450
4451 /* Updates phi nodes after creating a forwarder block joined
4452    by edge FALLTHRU.  */
4453
4454 static void
4455 gimple_make_forwarder_block (edge fallthru)
4456 {
4457   edge e;
4458   edge_iterator ei;
4459   basic_block dummy, bb;
4460   tree var;
4461   gimple_stmt_iterator gsi;
4462
4463   dummy = fallthru->src;
4464   bb = fallthru->dest;
4465
4466   if (single_pred_p (bb))
4467     return;
4468
4469   /* If we redirected a branch we must create new PHI nodes at the
4470      start of BB.  */
4471   for (gsi = gsi_start_phis (dummy); !gsi_end_p (gsi); gsi_next (&gsi))
4472     {
4473       gimple phi, new_phi;
4474       
4475       phi = gsi_stmt (gsi);
4476       var = gimple_phi_result (phi);
4477       new_phi = create_phi_node (var, bb);
4478       SSA_NAME_DEF_STMT (var) = new_phi;
4479       gimple_phi_set_result (phi, make_ssa_name (SSA_NAME_VAR (var), phi));
4480       add_phi_arg (new_phi, gimple_phi_result (phi), fallthru, 
4481                    UNKNOWN_LOCATION);
4482     }
4483
4484   /* Add the arguments we have stored on edges.  */
4485   FOR_EACH_EDGE (e, ei, bb->preds)
4486     {
4487       if (e == fallthru)
4488         continue;
4489
4490       flush_pending_stmts (e);
4491     }
4492 }
4493
4494
4495 /* Return a non-special label in the head of basic block BLOCK.
4496    Create one if it doesn't exist.  */
4497
4498 tree
4499 gimple_block_label (basic_block bb)
4500 {
4501   gimple_stmt_iterator i, s = gsi_start_bb (bb);
4502   bool first = true;
4503   tree label;
4504   gimple stmt;
4505
4506   for (i = s; !gsi_end_p (i); first = false, gsi_next (&i))
4507     {
4508       stmt = gsi_stmt (i);
4509       if (gimple_code (stmt) != GIMPLE_LABEL)
4510         break;
4511       label = gimple_label_label (stmt);
4512       if (!DECL_NONLOCAL (label))
4513         {
4514           if (!first)
4515             gsi_move_before (&i, &s);
4516           return label;
4517         }
4518     }
4519
4520   label = create_artificial_label (UNKNOWN_LOCATION);
4521   stmt = gimple_build_label (label);
4522   gsi_insert_before (&s, stmt, GSI_NEW_STMT);
4523   return label;
4524 }
4525
4526
4527 /* Attempt to perform edge redirection by replacing a possibly complex
4528    jump instruction by a goto or by removing the jump completely.
4529    This can apply only if all edges now point to the same block.  The
4530    parameters and return values are equivalent to
4531    redirect_edge_and_branch.  */
4532
4533 static edge
4534 gimple_try_redirect_by_replacing_jump (edge e, basic_block target)
4535 {
4536   basic_block src = e->src;
4537   gimple_stmt_iterator i;
4538   gimple stmt;
4539
4540   /* We can replace or remove a complex jump only when we have exactly
4541      two edges.  */
4542   if (EDGE_COUNT (src->succs) != 2
4543       /* Verify that all targets will be TARGET.  Specifically, the
4544          edge that is not E must also go to TARGET.  */
4545       || EDGE_SUCC (src, EDGE_SUCC (src, 0) == e)->dest != target)
4546     return NULL;
4547
4548   i = gsi_last_bb (src);
4549   if (gsi_end_p (i))
4550     return NULL;
4551
4552   stmt = gsi_stmt (i);
4553
4554   if (gimple_code (stmt) == GIMPLE_COND || gimple_code (stmt) == GIMPLE_SWITCH)
4555     {
4556       gsi_remove (&i, true);
4557       e = ssa_redirect_edge (e, target);
4558       e->flags = EDGE_FALLTHRU;
4559       return e;
4560     }
4561
4562   return NULL;
4563 }
4564
4565
4566 /* Redirect E to DEST.  Return NULL on failure.  Otherwise, return the
4567    edge representing the redirected branch.  */
4568
4569 static edge
4570 gimple_redirect_edge_and_branch (edge e, basic_block dest)
4571 {
4572   basic_block bb = e->src;
4573   gimple_stmt_iterator gsi;
4574   edge ret;
4575   gimple stmt;
4576
4577   if (e->flags & EDGE_ABNORMAL)
4578     return NULL;
4579
4580   if (e->dest == dest)
4581     return NULL;
4582
4583   if (e->flags & EDGE_EH)
4584     return redirect_eh_edge (e, dest);
4585
4586   if (e->src != ENTRY_BLOCK_PTR)
4587     {
4588       ret = gimple_try_redirect_by_replacing_jump (e, dest);
4589       if (ret)
4590         return ret;
4591     }
4592
4593   gsi = gsi_last_bb (bb);
4594   stmt = gsi_end_p (gsi) ? NULL : gsi_stmt (gsi);
4595
4596   switch (stmt ? gimple_code (stmt) : GIMPLE_ERROR_MARK)
4597     {
4598     case GIMPLE_COND:
4599       /* For COND_EXPR, we only need to redirect the edge.  */
4600       break;
4601
4602     case GIMPLE_GOTO:
4603       /* No non-abnormal edges should lead from a non-simple goto, and
4604          simple ones should be represented implicitly.  */
4605       gcc_unreachable ();
4606
4607     case GIMPLE_SWITCH:
4608       {
4609         tree label = gimple_block_label (dest);
4610         tree cases = get_cases_for_edge (e, stmt);
4611
4612         /* If we have a list of cases associated with E, then use it
4613            as it's a lot faster than walking the entire case vector.  */
4614         if (cases)
4615           {
4616             edge e2 = find_edge (e->src, dest);
4617             tree last, first;
4618
4619             first = cases;
4620             while (cases)
4621               {
4622                 last = cases;
4623                 CASE_LABEL (cases) = label;
4624                 cases = TREE_CHAIN (cases);
4625               }
4626
4627             /* If there was already an edge in the CFG, then we need
4628                to move all the cases associated with E to E2.  */
4629             if (e2)
4630               {
4631                 tree cases2 = get_cases_for_edge (e2, stmt);
4632
4633                 TREE_CHAIN (last) = TREE_CHAIN (cases2);
4634                 TREE_CHAIN (cases2) = first;
4635               }
4636           }
4637         else
4638           {
4639             size_t i, n = gimple_switch_num_labels (stmt);
4640
4641             for (i = 0; i < n; i++)
4642               {
4643                 tree elt = gimple_switch_label (stmt, i);
4644                 if (label_to_block (CASE_LABEL (elt)) == e->dest)
4645                   CASE_LABEL (elt) = label;
4646               }
4647           }
4648       }
4649       break;
4650
4651     case GIMPLE_ASM:
4652       {
4653         int i, n = gimple_asm_nlabels (stmt);
4654         tree label = gimple_block_label (dest);
4655
4656         for (i = 0; i < n; ++i)
4657           {
4658             tree cons = gimple_asm_label_op (stmt, i);
4659             if (label_to_block (TREE_VALUE (cons)) == e->dest)
4660               TREE_VALUE (cons) = label;
4661           }
4662       }
4663       break;
4664
4665     case GIMPLE_RETURN:
4666       gsi_remove (&gsi, true);
4667       e->flags |= EDGE_FALLTHRU;
4668       break;
4669
4670     case GIMPLE_OMP_RETURN:
4671     case GIMPLE_OMP_CONTINUE:
4672     case GIMPLE_OMP_SECTIONS_SWITCH:
4673     case GIMPLE_OMP_FOR:
4674       /* The edges from OMP constructs can be simply redirected.  */
4675       break;
4676
4677     case GIMPLE_EH_DISPATCH:
4678       if (!(e->flags & EDGE_FALLTHRU))
4679         redirect_eh_dispatch_edge (stmt, e, dest);
4680       break;
4681
4682     default:
4683       /* Otherwise it must be a fallthru edge, and we don't need to
4684          do anything besides redirecting it.  */
4685       gcc_assert (e->flags & EDGE_FALLTHRU);
4686       break;
4687     }
4688
4689   /* Update/insert PHI nodes as necessary.  */
4690
4691   /* Now update the edges in the CFG.  */
4692   e = ssa_redirect_edge (e, dest);
4693
4694   return e;
4695 }
4696
4697 /* Returns true if it is possible to remove edge E by redirecting
4698    it to the destination of the other edge from E->src.  */
4699
4700 static bool
4701 gimple_can_remove_branch_p (const_edge e)
4702 {
4703   if (e->flags & (EDGE_ABNORMAL | EDGE_EH))
4704     return false;
4705
4706   return true;
4707 }
4708
4709 /* Simple wrapper, as we can always redirect fallthru edges.  */
4710
4711 static basic_block
4712 gimple_redirect_edge_and_branch_force (edge e, basic_block dest)
4713 {
4714   e = gimple_redirect_edge_and_branch (e, dest);
4715   gcc_assert (e);
4716
4717   return NULL;
4718 }
4719
4720
4721 /* Splits basic block BB after statement STMT (but at least after the
4722    labels).  If STMT is NULL, BB is split just after the labels.  */
4723
4724 static basic_block
4725 gimple_split_block (basic_block bb, void *stmt)
4726 {
4727   gimple_stmt_iterator gsi;
4728   gimple_stmt_iterator gsi_tgt;
4729   gimple act;
4730   gimple_seq list;
4731   basic_block new_bb;
4732   edge e;
4733   edge_iterator ei;
4734
4735   new_bb = create_empty_bb (bb);
4736
4737   /* Redirect the outgoing edges.  */
4738   new_bb->succs = bb->succs;
4739   bb->succs = NULL;
4740   FOR_EACH_EDGE (e, ei, new_bb->succs)
4741     e->src = new_bb;
4742
4743   if (stmt && gimple_code ((gimple) stmt) == GIMPLE_LABEL)
4744     stmt = NULL;
4745
4746   /* Move everything from GSI to the new basic block.  */
4747   for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
4748     {
4749       act = gsi_stmt (gsi);
4750       if (gimple_code (act) == GIMPLE_LABEL)
4751         continue;
4752
4753       if (!stmt)
4754         break;
4755
4756       if (stmt == act)
4757         {
4758           gsi_next (&gsi);
4759           break;
4760         }
4761     }
4762
4763   if (gsi_end_p (gsi))
4764     return new_bb;
4765
4766   /* Split the statement list - avoid re-creating new containers as this
4767      brings ugly quadratic memory consumption in the inliner.  
4768      (We are still quadratic since we need to update stmt BB pointers,
4769      sadly.)  */
4770   list = gsi_split_seq_before (&gsi);
4771   set_bb_seq (new_bb, list);
4772   for (gsi_tgt = gsi_start (list);
4773        !gsi_end_p (gsi_tgt); gsi_next (&gsi_tgt))
4774     gimple_set_bb (gsi_stmt (gsi_tgt), new_bb);
4775
4776   return new_bb;
4777 }
4778
4779
4780 /* Moves basic block BB after block AFTER.  */
4781
4782 static bool
4783 gimple_move_block_after (basic_block bb, basic_block after)
4784 {
4785   if (bb->prev_bb == after)
4786     return true;
4787
4788   unlink_block (bb);
4789   link_block (bb, after);
4790
4791   return true;
4792 }
4793
4794
4795 /* Return true if basic_block can be duplicated.  */
4796
4797 static bool
4798 gimple_can_duplicate_bb_p (const_basic_block bb ATTRIBUTE_UNUSED)
4799 {
4800   return true;
4801 }
4802
4803 /* Create a duplicate of the basic block BB.  NOTE: This does not
4804    preserve SSA form.  */
4805
4806 static basic_block
4807 gimple_duplicate_bb (basic_block bb)
4808 {
4809   basic_block new_bb;
4810   gimple_stmt_iterator gsi, gsi_tgt;
4811   gimple_seq phis = phi_nodes (bb);
4812   gimple phi, stmt, copy;
4813
4814   new_bb = create_empty_bb (EXIT_BLOCK_PTR->prev_bb);
4815
4816   /* Copy the PHI nodes.  We ignore PHI node arguments here because
4817      the incoming edges have not been setup yet.  */
4818   for (gsi = gsi_start (phis); !gsi_end_p (gsi); gsi_next (&gsi))
4819     {
4820       phi = gsi_stmt (gsi);
4821       copy = create_phi_node (gimple_phi_result (phi), new_bb);
4822       create_new_def_for (gimple_phi_result (copy), copy,
4823                           gimple_phi_result_ptr (copy));
4824     }
4825
4826   gsi_tgt = gsi_start_bb (new_bb);
4827   for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
4828     {
4829       def_operand_p def_p;
4830       ssa_op_iter op_iter;
4831
4832       stmt = gsi_stmt (gsi);
4833       if (gimple_code (stmt) == GIMPLE_LABEL)
4834         continue;
4835
4836       /* Create a new copy of STMT and duplicate STMT's virtual
4837          operands.  */
4838       copy = gimple_copy (stmt);
4839       gsi_insert_after (&gsi_tgt, copy, GSI_NEW_STMT);
4840
4841       maybe_duplicate_eh_stmt (copy, stmt);
4842       gimple_duplicate_stmt_histograms (cfun, copy, cfun, stmt);
4843
4844       /* Create new names for all the definitions created by COPY and
4845          add replacement mappings for each new name.  */
4846       FOR_EACH_SSA_DEF_OPERAND (def_p, copy, op_iter, SSA_OP_ALL_DEFS)
4847         create_new_def_for (DEF_FROM_PTR (def_p), copy, def_p);
4848     }
4849
4850   return new_bb;
4851 }
4852
4853 /* Add phi arguments to the phi nodes in E_COPY->dest according to 
4854    the phi arguments coming from the equivalent edge at
4855    the phi nodes of DEST.  */
4856
4857 static void
4858 add_phi_args_after_redirect (edge e_copy, edge orig_e)
4859 {
4860    gimple_stmt_iterator psi, psi_copy;
4861    gimple phi, phi_copy;
4862    tree def; 
4863    
4864     for (psi = gsi_start_phis (orig_e->dest),
4865        psi_copy = gsi_start_phis (e_copy->dest);
4866        !gsi_end_p (psi);
4867        gsi_next (&psi), gsi_next (&psi_copy))
4868     {
4869
4870       phi = gsi_stmt (psi);
4871       phi_copy = gsi_stmt (psi_copy);
4872       def = PHI_ARG_DEF_FROM_EDGE (phi, orig_e);
4873       add_phi_arg (phi_copy, def, e_copy,
4874                    gimple_phi_arg_location_from_edge (phi, orig_e));
4875     }
4876 }
4877
4878 /* Adds phi node arguments for edge E_COPY after basic block duplication.  */
4879
4880 static void
4881 add_phi_args_after_copy_edge (edge e_copy)
4882 {
4883   basic_block bb, bb_copy = e_copy->src, dest;
4884   edge e;
4885   edge_iterator ei;
4886   gimple phi, phi_copy;
4887   tree def;
4888   gimple_stmt_iterator psi, psi_copy;
4889
4890   if (gimple_seq_empty_p (phi_nodes (e_copy->dest)))
4891     return;
4892
4893   bb = bb_copy->flags & BB_DUPLICATED ? get_bb_original (bb_copy) : bb_copy;
4894
4895   if (e_copy->dest->flags & BB_DUPLICATED)
4896     dest = get_bb_original (e_copy->dest);
4897   else
4898     dest = e_copy->dest;
4899
4900   e = find_edge (bb, dest);
4901   if (!e)
4902     {
4903       /* During loop unrolling the target of the latch edge is copied.
4904          In this case we are not looking for edge to dest, but to
4905          duplicated block whose original was dest.  */
4906       FOR_EACH_EDGE (e, ei, bb->succs)
4907         {
4908           if ((e->dest->flags & BB_DUPLICATED)
4909               && get_bb_original (e->dest) == dest)
4910             break;
4911         }
4912
4913       gcc_assert (e != NULL);
4914     }
4915
4916   for (psi = gsi_start_phis (e->dest),
4917        psi_copy = gsi_start_phis (e_copy->dest);
4918        !gsi_end_p (psi);
4919        gsi_next (&psi), gsi_next (&psi_copy))
4920     {
4921       phi = gsi_stmt (psi);
4922       phi_copy = gsi_stmt (psi_copy);
4923       def = PHI_ARG_DEF_FROM_EDGE (phi, e);
4924       add_phi_arg (phi_copy, def, e_copy, 
4925                    gimple_phi_arg_location_from_edge (phi, e));
4926     }
4927 }
4928
4929
4930 /* Basic block BB_COPY was created by code duplication.  Add phi node
4931    arguments for edges going out of BB_COPY.  The blocks that were
4932    duplicated have BB_DUPLICATED set.  */
4933
4934 void
4935 add_phi_args_after_copy_bb (basic_block bb_copy)
4936 {
4937   edge e_copy;
4938   edge_iterator ei;
4939
4940   FOR_EACH_EDGE (e_copy, ei, bb_copy->succs)
4941     {
4942       add_phi_args_after_copy_edge (e_copy);
4943     }
4944 }
4945
4946 /* Blocks in REGION_COPY array of length N_REGION were created by
4947    duplication of basic blocks.  Add phi node arguments for edges
4948    going from these blocks.  If E_COPY is not NULL, also add
4949    phi node arguments for its destination.*/
4950
4951 void
4952 add_phi_args_after_copy (basic_block *region_copy, unsigned n_region,
4953                          edge e_copy)
4954 {
4955   unsigned i;
4956
4957   for (i = 0; i < n_region; i++)
4958     region_copy[i]->flags |= BB_DUPLICATED;
4959
4960   for (i = 0; i < n_region; i++)
4961     add_phi_args_after_copy_bb (region_copy[i]);
4962   if (e_copy)
4963     add_phi_args_after_copy_edge (e_copy);
4964
4965   for (i = 0; i < n_region; i++)
4966     region_copy[i]->flags &= ~BB_DUPLICATED;
4967 }
4968
4969 /* Duplicates a REGION (set of N_REGION basic blocks) with just a single
4970    important exit edge EXIT.  By important we mean that no SSA name defined
4971    inside region is live over the other exit edges of the region.  All entry
4972    edges to the region must go to ENTRY->dest.  The edge ENTRY is redirected
4973    to the duplicate of the region.  SSA form, dominance and loop information
4974    is updated.  The new basic blocks are stored to REGION_COPY in the same
4975    order as they had in REGION, provided that REGION_COPY is not NULL.
4976    The function returns false if it is unable to copy the region,
4977    true otherwise.  */
4978
4979 bool
4980 gimple_duplicate_sese_region (edge entry, edge exit,
4981                             basic_block *region, unsigned n_region,
4982                             basic_block *region_copy)
4983 {
4984   unsigned i;
4985   bool free_region_copy = false, copying_header = false;
4986   struct loop *loop = entry->dest->loop_father;
4987   edge exit_copy;
4988   VEC (basic_block, heap) *doms;
4989   edge redirected;
4990   int total_freq = 0, entry_freq = 0;
4991   gcov_type total_count = 0, entry_count = 0;
4992
4993   if (!can_copy_bbs_p (region, n_region))
4994     return false;
4995
4996   /* Some sanity checking.  Note that we do not check for all possible
4997      missuses of the functions.  I.e. if you ask to copy something weird,
4998      it will work, but the state of structures probably will not be
4999      correct.  */
5000   for (i = 0; i < n_region; i++)
5001     {
5002       /* We do not handle subloops, i.e. all the blocks must belong to the
5003          same loop.  */
5004       if (region[i]->loop_father != loop)
5005         return false;
5006
5007       if (region[i] != entry->dest
5008           && region[i] == loop->header)
5009         return false;
5010     }
5011
5012   set_loop_copy (loop, loop);
5013
5014   /* In case the function is used for loop header copying (which is the primary
5015      use), ensure that EXIT and its copy will be new latch and entry edges.  */
5016   if (loop->header == entry->dest)
5017     {
5018       copying_header = true;
5019       set_loop_copy (loop, loop_outer (loop));
5020
5021       if (!dominated_by_p (CDI_DOMINATORS, loop->latch, exit->src))
5022         return false;
5023
5024       for (i = 0; i < n_region; i++)
5025         if (region[i] != exit->src
5026             && dominated_by_p (CDI_DOMINATORS, region[i], exit->src))
5027           return false;
5028     }
5029
5030   if (!region_copy)
5031     {
5032       region_copy = XNEWVEC (basic_block, n_region);
5033       free_region_copy = true;
5034     }
5035
5036   gcc_assert (!need_ssa_update_p (cfun));
5037
5038   /* Record blocks outside the region that are dominated by something
5039      inside.  */
5040   doms = NULL;
5041   initialize_original_copy_tables ();
5042
5043   doms = get_dominated_by_region (CDI_DOMINATORS, region, n_region);
5044
5045   if (entry->dest->count)
5046     {
5047       total_count = entry->dest->count;
5048       entry_count = entry->count;
5049       /* Fix up corner cases, to avoid division by zero or creation of negative
5050          frequencies.  */
5051       if (entry_count > total_count)
5052         entry_count = total_count;
5053     }
5054   else
5055     {
5056       total_freq = entry->dest->frequency;
5057       entry_freq = EDGE_FREQUENCY (entry);
5058       /* Fix up corner cases, to avoid division by zero or creation of negative
5059          frequencies.  */
5060       if (total_freq == 0)
5061         total_freq = 1;
5062       else if (entry_freq > total_freq)
5063         entry_freq = total_freq;
5064     }
5065
5066   copy_bbs (region, n_region, region_copy, &exit, 1, &exit_copy, loop,
5067             split_edge_bb_loc (entry));
5068   if (total_count)
5069     {
5070       scale_bbs_frequencies_gcov_type (region, n_region,
5071                                        total_count - entry_count,
5072                                        total_count);
5073       scale_bbs_frequencies_gcov_type (region_copy, n_region, entry_count,
5074                                        total_count);
5075     }
5076   else
5077     {
5078       scale_bbs_frequencies_int (region, n_region, total_freq - entry_freq,
5079                                  total_freq);
5080       scale_bbs_frequencies_int (region_copy, n_region, entry_freq, total_freq);
5081     }
5082
5083   if (copying_header)
5084     {
5085       loop->header = exit->dest;
5086       loop->latch = exit->src;
5087     }
5088
5089   /* Redirect the entry and add the phi node arguments.  */
5090   redirected = redirect_edge_and_branch (entry, get_bb_copy (entry->dest));
5091   gcc_assert (redirected != NULL);
5092   flush_pending_stmts (entry);
5093
5094   /* Concerning updating of dominators:  We must recount dominators
5095      for entry block and its copy.  Anything that is outside of the
5096      region, but was dominated by something inside needs recounting as
5097      well.  */
5098   set_immediate_dominator (CDI_DOMINATORS, entry->dest, entry->src);
5099   VEC_safe_push (basic_block, heap, doms, get_bb_original (entry->dest));
5100   iterate_fix_dominators (CDI_DOMINATORS, doms, false);
5101   VEC_free (basic_block, heap, doms);
5102
5103   /* Add the other PHI node arguments.  */
5104   add_phi_args_after_copy (region_copy, n_region, NULL);
5105
5106   /* Update the SSA web.  */
5107   update_ssa (TODO_update_ssa);
5108
5109   if (free_region_copy)
5110     free (region_copy);
5111
5112   free_original_copy_tables ();
5113   return true;
5114 }
5115
5116 /* Duplicates REGION consisting of N_REGION blocks.  The new blocks
5117    are stored to REGION_COPY in the same order in that they appear
5118    in REGION, if REGION_COPY is not NULL.  ENTRY is the entry to
5119    the region, EXIT an exit from it.  The condition guarding EXIT
5120    is moved to ENTRY.  Returns true if duplication succeeds, false
5121    otherwise.
5122
5123    For example, 
5124  
5125    some_code;
5126    if (cond)
5127      A;
5128    else
5129      B;
5130
5131    is transformed to
5132
5133    if (cond)
5134      {
5135        some_code;
5136        A;
5137      }
5138    else
5139      {
5140        some_code;
5141        B;
5142      }
5143 */
5144
5145 bool
5146 gimple_duplicate_sese_tail (edge entry ATTRIBUTE_UNUSED, edge exit ATTRIBUTE_UNUSED,
5147                           basic_block *region ATTRIBUTE_UNUSED, unsigned n_region ATTRIBUTE_UNUSED,
5148                           basic_block *region_copy ATTRIBUTE_UNUSED)
5149 {
5150   unsigned i;
5151   bool free_region_copy = false;
5152   struct loop *loop = exit->dest->loop_father;
5153   struct loop *orig_loop = entry->dest->loop_father;
5154   basic_block switch_bb, entry_bb, nentry_bb;
5155   VEC (basic_block, heap) *doms;
5156   int total_freq = 0, exit_freq = 0;
5157   gcov_type total_count = 0, exit_count = 0;
5158   edge exits[2], nexits[2], e;
5159   gimple_stmt_iterator gsi,gsi1;
5160   gimple cond_stmt;
5161   edge sorig, snew, orig_e;
5162   basic_block exit_bb;
5163   edge_iterator ei;
5164   VEC (edge, heap) *redirect_edges;
5165   basic_block iters_bb, orig_src;
5166   tree new_rhs;
5167
5168   gcc_assert (EDGE_COUNT (exit->src->succs) == 2);
5169   exits[0] = exit;
5170   exits[1] = EDGE_SUCC (exit->src, EDGE_SUCC (exit->src, 0) == exit);
5171
5172   if (!can_copy_bbs_p (region, n_region))
5173     return false;
5174
5175   /* Some sanity checking.  Note that we do not check for all possible
5176      missuses of the functions.  I.e. if you ask to copy something weird
5177      (e.g., in the example, if there is a jump from inside to the middle
5178      of some_code, or come_code defines some of the values used in cond)
5179      it will work, but the resulting code will not be correct.  */
5180   for (i = 0; i < n_region; i++)
5181     {
5182       if (region[i] == orig_loop->latch)
5183         return false;
5184     }
5185
5186   initialize_original_copy_tables ();
5187   set_loop_copy (orig_loop, loop);
5188   duplicate_subloops (orig_loop, loop);
5189
5190   if (!region_copy)
5191     {
5192       region_copy = XNEWVEC (basic_block, n_region);
5193       free_region_copy = true;
5194     }
5195
5196   gcc_assert (!need_ssa_update_p (cfun));
5197
5198   /* Record blocks outside the region that are dominated by something
5199      inside.  */
5200   doms = get_dominated_by_region (CDI_DOMINATORS, region, n_region);
5201
5202   if (exit->src->count)
5203     {
5204       total_count = exit->src->count;
5205       exit_count = exit->count;
5206       /* Fix up corner cases, to avoid division by zero or creation of negative
5207          frequencies.  */
5208       if (exit_count > total_count)
5209         exit_count = total_count;
5210     }
5211   else
5212     {
5213       total_freq = exit->src->frequency;
5214       exit_freq = EDGE_FREQUENCY (exit);
5215       /* Fix up corner cases, to avoid division by zero or creation of negative
5216          frequencies.  */
5217       if (total_freq == 0)
5218         total_freq = 1;
5219       if (exit_freq > total_freq)
5220         exit_freq = total_freq;
5221     }
5222
5223   copy_bbs (region, n_region, region_copy, exits, 2, nexits, orig_loop,
5224             split_edge_bb_loc (exit));
5225   if (total_count)
5226     {
5227       scale_bbs_frequencies_gcov_type (region, n_region,
5228                                        total_count - exit_count,
5229                                        total_count);
5230       scale_bbs_frequencies_gcov_type (region_copy, n_region, exit_count,
5231                                        total_count);
5232     }
5233   else
5234     {
5235       scale_bbs_frequencies_int (region, n_region, total_freq - exit_freq,
5236                                  total_freq);
5237       scale_bbs_frequencies_int (region_copy, n_region, exit_freq, total_freq);
5238     }
5239
5240   /* Create the switch block, and put the exit condition to it.  */
5241   entry_bb = entry->dest;
5242   nentry_bb = get_bb_copy (entry_bb);
5243   if (!last_stmt (entry->src)
5244       || !stmt_ends_bb_p (last_stmt (entry->src)))
5245     switch_bb = entry->src;
5246   else
5247     switch_bb = split_edge (entry);
5248   set_immediate_dominator (CDI_DOMINATORS, nentry_bb, switch_bb);
5249
5250   gsi = gsi_last_bb (switch_bb);
5251   cond_stmt = last_stmt (exit->src);
5252   gcc_assert (gimple_code (cond_stmt) == GIMPLE_COND);
5253   cond_stmt = gimple_copy (cond_stmt);
5254  
5255  /* If the block consisting of the exit condition has the latch as 
5256     successor, then the body of the loop is executed before 
5257     the exit condition is tested.  In such case, moving the 
5258     condition to the entry, causes that the loop will iterate  
5259     one less iteration (which is the wanted outcome, since we 
5260     peel out the last iteration).  If the body is executed after 
5261     the condition, moving the condition to the entry requires 
5262     decrementing one iteration.  */
5263   if (exits[1]->dest == orig_loop->latch)
5264     new_rhs = gimple_cond_rhs (cond_stmt);
5265   else
5266   {
5267     new_rhs = fold_build2 (MINUS_EXPR, TREE_TYPE (gimple_cond_rhs (cond_stmt)),
5268                            gimple_cond_rhs (cond_stmt), 
5269                            build_int_cst (TREE_TYPE (gimple_cond_rhs (cond_stmt)), 1));
5270
5271     if (TREE_CODE (gimple_cond_rhs (cond_stmt)) == SSA_NAME)
5272       {
5273         iters_bb = gimple_bb (SSA_NAME_DEF_STMT (gimple_cond_rhs (cond_stmt)));
5274         for (gsi1 = gsi_start_bb (iters_bb); !gsi_end_p (gsi1); gsi_next (&gsi1))
5275           if (gsi_stmt (gsi1) == SSA_NAME_DEF_STMT (gimple_cond_rhs (cond_stmt)))
5276             break;
5277                  
5278         new_rhs = force_gimple_operand_gsi (&gsi1, new_rhs, true,
5279                                             NULL_TREE,false,GSI_CONTINUE_LINKING);
5280       }
5281   }   
5282   gimple_cond_set_rhs (cond_stmt, unshare_expr (new_rhs)); 
5283   gimple_cond_set_lhs (cond_stmt, unshare_expr (gimple_cond_lhs (cond_stmt)));
5284   gsi_insert_after (&gsi, cond_stmt, GSI_NEW_STMT);
5285
5286   sorig = single_succ_edge (switch_bb);
5287   sorig->flags = exits[1]->flags;
5288   snew = make_edge (switch_bb, nentry_bb, exits[0]->flags);
5289
5290   /* Register the new edge from SWITCH_BB in loop exit lists.  */
5291   rescan_loop_exit (snew, true, false);
5292
5293   /* Add the PHI node arguments.  */
5294   add_phi_args_after_copy (region_copy, n_region, snew);
5295   
5296   /* Get rid of now superfluous conditions and associated edges (and phi node
5297      arguments).  */
5298   exit_bb = exit->dest;
5299  
5300   e = redirect_edge_and_branch (exits[0], exits[1]->dest);
5301   PENDING_STMT (e) = NULL;
5302  
5303   /* If the block consisting of the exit condition has the latch as 
5304      successor, then the body of the loop is executed before 
5305      the exit condition is tested.  
5306      
5307      { body  }
5308      { cond  } (exit[0])  -> { latch }
5309         |      
5310         V (exit[1])
5311          
5312      { exit_bb }
5313      
5314      
5315      In such case, the equivalent copied edge nexits[1]
5316      (for the peeled iteration) needs to be redirected to exit_bb.
5317      
5318      Otherwise, 
5319      
5320      { cond  } (exit[0])  -> { body }
5321         |
5322         V (exit[1])
5323      
5324      { exit_bb }
5325     
5326      
5327      exit[0] is pointing to the body of the loop,
5328      and the equivalent nexits[0] needs to be redirected to 
5329      the copied body (of the peeled iteration).  */ 
5330     
5331   if (exits[1]->dest == orig_loop->latch)
5332     e = redirect_edge_and_branch (nexits[1], nexits[0]->dest);
5333   else
5334     e = redirect_edge_and_branch (nexits[0], nexits[1]->dest);
5335   PENDING_STMT (e) = NULL; 
5336   
5337   redirect_edges = VEC_alloc (edge, heap, 10);
5338   
5339   for (i = 0; i < n_region; i++)
5340     region_copy[i]->flags |= BB_DUPLICATED;
5341   
5342   /* Iterate all incoming edges to latch.  All those coming from 
5343      copied bbs will be redirected to exit_bb.  */
5344   FOR_EACH_EDGE (e, ei, orig_loop->latch->preds)
5345     {
5346       if (e->src->flags & BB_DUPLICATED)
5347         VEC_safe_push (edge, heap, redirect_edges, e);
5348     }
5349   
5350   for (i = 0; i < n_region; i++)
5351     region_copy[i]->flags &= ~BB_DUPLICATED;
5352   
5353   for (i = 0; VEC_iterate (edge, redirect_edges, i, e); ++i)
5354     {
5355       e = redirect_edge_and_branch (e, exit_bb);
5356       PENDING_STMT (e) = NULL;
5357       orig_src = get_bb_original (e->src);
5358       orig_e = find_edge (orig_src, orig_loop->latch);
5359       add_phi_args_after_redirect (e, orig_e);
5360     }
5361   
5362   VEC_free (edge, heap, redirect_edges);
5363
5364   /* Anything that is outside of the region, but was dominated by something
5365      inside needs to update dominance info.  */
5366   iterate_fix_dominators (CDI_DOMINATORS, doms, false);
5367   VEC_free (basic_block, heap, doms);
5368
5369   /* Update the SSA web.  */
5370   update_ssa (TODO_update_ssa);
5371
5372   if (free_region_copy)
5373     free (region_copy);
5374
5375   free_original_copy_tables ();
5376   return true;
5377 }
5378
5379 /* Add all the blocks dominated by ENTRY to the array BBS_P.  Stop
5380    adding blocks when the dominator traversal reaches EXIT.  This
5381    function silently assumes that ENTRY strictly dominates EXIT.  */
5382
5383 void
5384 gather_blocks_in_sese_region (basic_block entry, basic_block exit,
5385                               VEC(basic_block,heap) **bbs_p)
5386 {
5387   basic_block son;
5388
5389   for (son = first_dom_son (CDI_DOMINATORS, entry);
5390        son;
5391        son = next_dom_son (CDI_DOMINATORS, son))
5392     {
5393       VEC_safe_push (basic_block, heap, *bbs_p, son);
5394       if (son != exit)
5395         gather_blocks_in_sese_region (son, exit, bbs_p);
5396     }
5397 }
5398
5399 /* Replaces *TP with a duplicate (belonging to function TO_CONTEXT).
5400    The duplicates are recorded in VARS_MAP.  */
5401
5402 static void
5403 replace_by_duplicate_decl (tree *tp, struct pointer_map_t *vars_map,
5404                            tree to_context)
5405 {
5406   tree t = *tp, new_t;
5407   struct function *f = DECL_STRUCT_FUNCTION (to_context);
5408   void **loc;
5409
5410   if (DECL_CONTEXT (t) == to_context)
5411     return;
5412
5413   loc = pointer_map_contains (vars_map, t);
5414
5415   if (!loc)
5416     {
5417       loc = pointer_map_insert (vars_map, t);
5418
5419       if (SSA_VAR_P (t))
5420         {
5421           new_t = copy_var_decl (t, DECL_NAME (t), TREE_TYPE (t));
5422           f->local_decls = tree_cons (NULL_TREE, new_t, f->local_decls);
5423         }
5424       else
5425         {
5426           gcc_assert (TREE_CODE (t) == CONST_DECL);
5427           new_t = copy_node (t);
5428         }
5429       DECL_CONTEXT (new_t) = to_context;
5430
5431       *loc = new_t;
5432     }
5433   else
5434     new_t = (tree) *loc;
5435
5436   *tp = new_t;
5437 }
5438
5439
5440 /* Creates an ssa name in TO_CONTEXT equivalent to NAME.
5441    VARS_MAP maps old ssa names and var_decls to the new ones.  */
5442
5443 static tree
5444 replace_ssa_name (tree name, struct pointer_map_t *vars_map,
5445                   tree to_context)
5446 {
5447   void **loc;
5448   tree new_name, decl = SSA_NAME_VAR (name);
5449
5450   gcc_assert (is_gimple_reg (name));
5451
5452   loc = pointer_map_contains (vars_map, name);
5453
5454   if (!loc)
5455     {
5456       replace_by_duplicate_decl (&decl, vars_map, to_context);
5457
5458       push_cfun (DECL_STRUCT_FUNCTION (to_context));
5459       if (gimple_in_ssa_p (cfun))
5460         add_referenced_var (decl);
5461
5462       new_name = make_ssa_name (decl, SSA_NAME_DEF_STMT (name));
5463       if (SSA_NAME_IS_DEFAULT_DEF (name))
5464         set_default_def (decl, new_name);
5465       pop_cfun ();
5466
5467       loc = pointer_map_insert (vars_map, name);
5468       *loc = new_name;
5469     }
5470   else
5471     new_name = (tree) *loc;
5472
5473   return new_name;
5474 }
5475
5476 struct move_stmt_d
5477 {
5478   tree orig_block;
5479   tree new_block;
5480   tree from_context;
5481   tree to_context;
5482   struct pointer_map_t *vars_map;
5483   htab_t new_label_map;
5484   struct pointer_map_t *eh_map;
5485   bool remap_decls_p;
5486 };
5487
5488 /* Helper for move_block_to_fn.  Set TREE_BLOCK in every expression
5489    contained in *TP if it has been ORIG_BLOCK previously and change the
5490    DECL_CONTEXT of every local variable referenced in *TP.  */
5491
5492 static tree
5493 move_stmt_op (tree *tp, int *walk_subtrees, void *data)
5494 {
5495   struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
5496   struct move_stmt_d *p = (struct move_stmt_d *) wi->info;
5497   tree t = *tp;
5498
5499   if (EXPR_P (t))
5500     /* We should never have TREE_BLOCK set on non-statements.  */
5501     gcc_assert (!TREE_BLOCK (t));
5502
5503   else if (DECL_P (t) || TREE_CODE (t) == SSA_NAME)
5504     {
5505       if (TREE_CODE (t) == SSA_NAME)
5506         *tp = replace_ssa_name (t, p->vars_map, p->to_context);
5507       else if (TREE_CODE (t) == LABEL_DECL)
5508         {
5509           if (p->new_label_map)
5510             {
5511               struct tree_map in, *out;
5512               in.base.from = t;
5513               out = (struct tree_map *)
5514                 htab_find_with_hash (p->new_label_map, &in, DECL_UID (t));
5515               if (out)
5516                 *tp = t = out->to;
5517             }
5518
5519           DECL_CONTEXT (t) = p->to_context;
5520         }
5521       else if (p->remap_decls_p)
5522         {
5523           /* Replace T with its duplicate.  T should no longer appear in the
5524              parent function, so this looks wasteful; however, it may appear
5525              in referenced_vars, and more importantly, as virtual operands of
5526              statements, and in alias lists of other variables.  It would be
5527              quite difficult to expunge it from all those places.  ??? It might
5528              suffice to do this for addressable variables.  */
5529           if ((TREE_CODE (t) == VAR_DECL
5530                && !is_global_var (t))
5531               || TREE_CODE (t) == CONST_DECL)
5532             replace_by_duplicate_decl (tp, p->vars_map, p->to_context);
5533           
5534           if (SSA_VAR_P (t)
5535               && gimple_in_ssa_p (cfun))
5536             {
5537               push_cfun (DECL_STRUCT_FUNCTION (p->to_context));
5538               add_referenced_var (*tp);
5539               pop_cfun ();
5540             }
5541         }
5542       *walk_subtrees = 0;
5543     }
5544   else if (TYPE_P (t))
5545     *walk_subtrees = 0;
5546
5547   return NULL_TREE;
5548 }
5549
5550 /* Helper for move_stmt_r.  Given an EH region number for the source
5551    function, map that to the duplicate EH regio number in the dest.  */
5552
5553 static int
5554 move_stmt_eh_region_nr (int old_nr, struct move_stmt_d *p)
5555 {
5556   eh_region old_r, new_r;
5557   void **slot;
5558
5559   old_r = get_eh_region_from_number (old_nr);
5560   slot = pointer_map_contains (p->eh_map, old_r);
5561   new_r = (eh_region) *slot;
5562
5563   return new_r->index;
5564 }
5565
5566 /* Similar, but operate on INTEGER_CSTs.  */
5567
5568 static tree
5569 move_stmt_eh_region_tree_nr (tree old_t_nr, struct move_stmt_d *p)
5570 {
5571   int old_nr, new_nr;
5572
5573   old_nr = tree_low_cst (old_t_nr, 0);
5574   new_nr = move_stmt_eh_region_nr (old_nr, p);
5575
5576   return build_int_cst (NULL, new_nr);
5577 }
5578
5579 /* Like move_stmt_op, but for gimple statements.
5580
5581    Helper for move_block_to_fn.  Set GIMPLE_BLOCK in every expression
5582    contained in the current statement in *GSI_P and change the
5583    DECL_CONTEXT of every local variable referenced in the current
5584    statement.  */
5585
5586 static tree
5587 move_stmt_r (gimple_stmt_iterator *gsi_p, bool *handled_ops_p,
5588              struct walk_stmt_info *wi)
5589 {
5590   struct move_stmt_d *p = (struct move_stmt_d *) wi->info;
5591   gimple stmt = gsi_stmt (*gsi_p);
5592   tree block = gimple_block (stmt);
5593
5594   if (p->orig_block == NULL_TREE
5595       || block == p->orig_block
5596       || block == NULL_TREE)
5597     gimple_set_block (stmt, p->new_block);
5598 #ifdef ENABLE_CHECKING
5599   else if (block != p->new_block)
5600     {
5601       while (block && block != p->orig_block)
5602         block = BLOCK_SUPERCONTEXT (block);
5603       gcc_assert (block);
5604     }
5605 #endif
5606
5607   switch (gimple_code (stmt))
5608     {
5609     case GIMPLE_CALL:
5610       /* Remap the region numbers for __builtin_eh_{pointer,filter}.  */
5611       {
5612         tree r, fndecl = gimple_call_fndecl (stmt);
5613         if (fndecl && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
5614           switch (DECL_FUNCTION_CODE (fndecl))
5615             {
5616             case BUILT_IN_EH_COPY_VALUES:
5617               r = gimple_call_arg (stmt, 1);
5618               r = move_stmt_eh_region_tree_nr (r, p);
5619               gimple_call_set_arg (stmt, 1, r);
5620               /* FALLTHRU */
5621
5622             case BUILT_IN_EH_POINTER:
5623             case BUILT_IN_EH_FILTER:
5624               r = gimple_call_arg (stmt, 0);
5625               r = move_stmt_eh_region_tree_nr (r, p);
5626               gimple_call_set_arg (stmt, 0, r);
5627               break;
5628
5629             default:
5630               break;
5631             }
5632       }
5633       break;
5634
5635     case GIMPLE_RESX:
5636       {
5637         int r = gimple_resx_region (stmt);
5638         r = move_stmt_eh_region_nr (r, p);
5639         gimple_resx_set_region (stmt, r);
5640       }
5641       break;
5642
5643     case GIMPLE_EH_DISPATCH:
5644       {
5645         int r = gimple_eh_dispatch_region (stmt);
5646         r = move_stmt_eh_region_nr (r, p);
5647         gimple_eh_dispatch_set_region (stmt, r);
5648       }
5649       break;
5650
5651     case GIMPLE_OMP_RETURN:
5652     case GIMPLE_OMP_CONTINUE:
5653       break;
5654     default:
5655       if (is_gimple_omp (stmt))
5656         {
5657           /* Do not remap variables inside OMP directives.  Variables
5658              referenced in clauses and directive header belong to the
5659              parent function and should not be moved into the child
5660              function.  */
5661           bool save_remap_decls_p = p->remap_decls_p;
5662           p->remap_decls_p = false;
5663           *handled_ops_p = true;
5664
5665           walk_gimple_seq (gimple_omp_body (stmt), move_stmt_r,
5666                            move_stmt_op, wi);
5667
5668           p->remap_decls_p = save_remap_decls_p;
5669         }
5670       break;
5671     }
5672
5673   return NULL_TREE;
5674 }
5675
5676 /* Marks virtual operands of all statements in basic blocks BBS for
5677    renaming.  */
5678
5679 void
5680 mark_virtual_ops_in_bb (basic_block bb)
5681 {
5682   gimple_stmt_iterator gsi;
5683
5684   for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
5685     mark_virtual_ops_for_renaming (gsi_stmt (gsi));
5686
5687   for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
5688     mark_virtual_ops_for_renaming (gsi_stmt (gsi));
5689 }
5690
5691 /* Move basic block BB from function CFUN to function DEST_FN.  The
5692    block is moved out of the original linked list and placed after
5693    block AFTER in the new list.  Also, the block is removed from the
5694    original array of blocks and placed in DEST_FN's array of blocks.
5695    If UPDATE_EDGE_COUNT_P is true, the edge counts on both CFGs is
5696    updated to reflect the moved edges.
5697
5698    The local variables are remapped to new instances, VARS_MAP is used
5699    to record the mapping.  */
5700
5701 static void
5702 move_block_to_fn (struct function *dest_cfun, basic_block bb,
5703                   basic_block after, bool update_edge_count_p,
5704                   struct move_stmt_d *d)
5705 {
5706   struct control_flow_graph *cfg;
5707   edge_iterator ei;
5708   edge e;
5709   gimple_stmt_iterator si;
5710   unsigned old_len, new_len;
5711
5712   /* Remove BB from dominance structures.  */
5713   delete_from_dominance_info (CDI_DOMINATORS, bb);
5714   if (current_loops)
5715     remove_bb_from_loops (bb);
5716
5717   /* Link BB to the new linked list.  */
5718   move_block_after (bb, after);
5719
5720   /* Update the edge count in the corresponding flowgraphs.  */
5721   if (update_edge_count_p)
5722     FOR_EACH_EDGE (e, ei, bb->succs)
5723       {
5724         cfun->cfg->x_n_edges--;
5725         dest_cfun->cfg->x_n_edges++;
5726       }
5727
5728   /* Remove BB from the original basic block array.  */
5729   VEC_replace (basic_block, cfun->cfg->x_basic_block_info, bb->index, NULL);
5730   cfun->cfg->x_n_basic_blocks--;
5731
5732   /* Grow DEST_CFUN's basic block array if needed.  */
5733   cfg = dest_cfun->cfg;
5734   cfg->x_n_basic_blocks++;
5735   if (bb->index >= cfg->x_last_basic_block)
5736     cfg->x_last_basic_block = bb->index + 1;
5737
5738   old_len = VEC_length (basic_block, cfg->x_basic_block_info);
5739   if ((unsigned) cfg->x_last_basic_block >= old_len)
5740     {
5741       new_len = cfg->x_last_basic_block + (cfg->x_last_basic_block + 3) / 4;
5742       VEC_safe_grow_cleared (basic_block, gc, cfg->x_basic_block_info,
5743                              new_len);
5744     }
5745
5746   VEC_replace (basic_block, cfg->x_basic_block_info,
5747                bb->index, bb);
5748
5749   /* Remap the variables in phi nodes.  */
5750   for (si = gsi_start_phis (bb); !gsi_end_p (si); )
5751     {
5752       gimple phi = gsi_stmt (si);
5753       use_operand_p use;
5754       tree op = PHI_RESULT (phi);
5755       ssa_op_iter oi;
5756
5757       if (!is_gimple_reg (op))
5758         {
5759           /* Remove the phi nodes for virtual operands (alias analysis will be
5760              run for the new function, anyway).  */
5761           remove_phi_node (&si, true);
5762           continue;
5763         }
5764
5765       SET_PHI_RESULT (phi,
5766                       replace_ssa_name (op, d->vars_map, dest_cfun->decl));
5767       FOR_EACH_PHI_ARG (use, phi, oi, SSA_OP_USE)
5768         {
5769           op = USE_FROM_PTR (use);
5770           if (TREE_CODE (op) == SSA_NAME)
5771             SET_USE (use, replace_ssa_name (op, d->vars_map, dest_cfun->decl));
5772         }
5773
5774       gsi_next (&si);
5775     }
5776
5777   for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
5778     {
5779       gimple stmt = gsi_stmt (si);
5780       struct walk_stmt_info wi;
5781
5782       memset (&wi, 0, sizeof (wi));
5783       wi.info = d;
5784       walk_gimple_stmt (&si, move_stmt_r, move_stmt_op, &wi);
5785
5786       if (gimple_code (stmt) == GIMPLE_LABEL)
5787         {
5788           tree label = gimple_label_label (stmt);
5789           int uid = LABEL_DECL_UID (label);
5790
5791           gcc_assert (uid > -1);
5792
5793           old_len = VEC_length (basic_block, cfg->x_label_to_block_map);
5794           if (old_len <= (unsigned) uid)
5795             {
5796               new_len = 3 * uid / 2 + 1;
5797               VEC_safe_grow_cleared (basic_block, gc,
5798                                      cfg->x_label_to_block_map, new_len);
5799             }
5800
5801           VEC_replace (basic_block, cfg->x_label_to_block_map, uid, bb);
5802           VEC_replace (basic_block, cfun->cfg->x_label_to_block_map, uid, NULL);
5803
5804           gcc_assert (DECL_CONTEXT (label) == dest_cfun->decl);
5805
5806           if (uid >= dest_cfun->cfg->last_label_uid)
5807             dest_cfun->cfg->last_label_uid = uid + 1;
5808         }
5809
5810       maybe_duplicate_eh_stmt_fn (dest_cfun, stmt, cfun, stmt, d->eh_map, 0);
5811       remove_stmt_from_eh_lp_fn (cfun, stmt);
5812
5813       gimple_duplicate_stmt_histograms (dest_cfun, stmt, cfun, stmt);
5814       gimple_remove_stmt_histograms (cfun, stmt);
5815
5816       /* We cannot leave any operands allocated from the operand caches of
5817          the current function.  */
5818       free_stmt_operands (stmt);
5819       push_cfun (dest_cfun);
5820       update_stmt (stmt);
5821       pop_cfun ();
5822     }
5823
5824   FOR_EACH_EDGE (e, ei, bb->succs)
5825     if (e->goto_locus)
5826       {
5827         tree block = e->goto_block;
5828         if (d->orig_block == NULL_TREE
5829             || block == d->orig_block)
5830           e->goto_block = d->new_block;
5831 #ifdef ENABLE_CHECKING
5832         else if (block != d->new_block)
5833           {
5834             while (block && block != d->orig_block)
5835               block = BLOCK_SUPERCONTEXT (block);
5836             gcc_assert (block);
5837           }
5838 #endif
5839       }
5840 }
5841
5842 /* Examine the statements in BB (which is in SRC_CFUN); find and return
5843    the outermost EH region.  Use REGION as the incoming base EH region.  */
5844
5845 static eh_region
5846 find_outermost_region_in_block (struct function *src_cfun,
5847                                 basic_block bb, eh_region region)
5848 {
5849   gimple_stmt_iterator si;
5850
5851   for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
5852     {
5853       gimple stmt = gsi_stmt (si);
5854       eh_region stmt_region;
5855       int lp_nr;
5856
5857       lp_nr = lookup_stmt_eh_lp_fn (src_cfun, stmt);
5858       stmt_region = get_eh_region_from_lp_number_fn (src_cfun, lp_nr);
5859       if (stmt_region)
5860         {
5861           if (region == NULL)
5862             region = stmt_region;
5863           else if (stmt_region != region)
5864             {
5865               region = eh_region_outermost (src_cfun, stmt_region, region);
5866               gcc_assert (region != NULL);
5867             }
5868         }
5869     }
5870
5871   return region;
5872 }
5873
5874 static tree
5875 new_label_mapper (tree decl, void *data)
5876 {
5877   htab_t hash = (htab_t) data;
5878   struct tree_map *m;
5879   void **slot;
5880
5881   gcc_assert (TREE_CODE (decl) == LABEL_DECL);
5882
5883   m = XNEW (struct tree_map);
5884   m->hash = DECL_UID (decl);
5885   m->base.from = decl;
5886   m->to = create_artificial_label (UNKNOWN_LOCATION);
5887   LABEL_DECL_UID (m->to) = LABEL_DECL_UID (decl);
5888   if (LABEL_DECL_UID (m->to) >= cfun->cfg->last_label_uid)
5889     cfun->cfg->last_label_uid = LABEL_DECL_UID (m->to) + 1;
5890
5891   slot = htab_find_slot_with_hash (hash, m, m->hash, INSERT);
5892   gcc_assert (*slot == NULL);
5893
5894   *slot = m;
5895
5896   return m->to;
5897 }
5898
5899 /* Change DECL_CONTEXT of all BLOCK_VARS in block, including
5900    subblocks.  */
5901
5902 static void
5903 replace_block_vars_by_duplicates (tree block, struct pointer_map_t *vars_map,
5904                                   tree to_context)
5905 {
5906   tree *tp, t;
5907
5908   for (tp = &BLOCK_VARS (block); *tp; tp = &TREE_CHAIN (*tp))
5909     {
5910       t = *tp;
5911       if (TREE_CODE (t) != VAR_DECL && TREE_CODE (t) != CONST_DECL)
5912         continue;
5913       replace_by_duplicate_decl (&t, vars_map, to_context);
5914       if (t != *tp)
5915         {
5916           if (TREE_CODE (*tp) == VAR_DECL && DECL_HAS_VALUE_EXPR_P (*tp))
5917             {
5918               SET_DECL_VALUE_EXPR (t, DECL_VALUE_EXPR (*tp));
5919               DECL_HAS_VALUE_EXPR_P (t) = 1;
5920             }
5921           TREE_CHAIN (t) = TREE_CHAIN (*tp);
5922           *tp = t;
5923         }
5924     }
5925
5926   for (block = BLOCK_SUBBLOCKS (block); block; block = BLOCK_CHAIN (block))
5927     replace_block_vars_by_duplicates (block, vars_map, to_context);
5928 }
5929
5930 /* Move a single-entry, single-exit region delimited by ENTRY_BB and
5931    EXIT_BB to function DEST_CFUN.  The whole region is replaced by a
5932    single basic block in the original CFG and the new basic block is
5933    returned.  DEST_CFUN must not have a CFG yet.
5934
5935    Note that the region need not be a pure SESE region.  Blocks inside
5936    the region may contain calls to abort/exit.  The only restriction
5937    is that ENTRY_BB should be the only entry point and it must
5938    dominate EXIT_BB.
5939
5940    Change TREE_BLOCK of all statements in ORIG_BLOCK to the new
5941    functions outermost BLOCK, move all subblocks of ORIG_BLOCK
5942    to the new function.
5943
5944    All local variables referenced in the region are assumed to be in
5945    the corresponding BLOCK_VARS and unexpanded variable lists
5946    associated with DEST_CFUN.  */
5947
5948 basic_block
5949 move_sese_region_to_fn (struct function *dest_cfun, basic_block entry_bb,
5950                         basic_block exit_bb, tree orig_block)
5951 {
5952   VEC(basic_block,heap) *bbs, *dom_bbs;
5953   basic_block dom_entry = get_immediate_dominator (CDI_DOMINATORS, entry_bb);
5954   basic_block after, bb, *entry_pred, *exit_succ, abb;
5955   struct function *saved_cfun = cfun;
5956   int *entry_flag, *exit_flag;
5957   unsigned *entry_prob, *exit_prob;
5958   unsigned i, num_entry_edges, num_exit_edges;
5959   edge e;
5960   edge_iterator ei;
5961   htab_t new_label_map;
5962   struct pointer_map_t *vars_map, *eh_map;
5963   struct loop *loop = entry_bb->loop_father;
5964   struct move_stmt_d d;
5965
5966   /* If ENTRY does not strictly dominate EXIT, this cannot be an SESE
5967      region.  */
5968   gcc_assert (entry_bb != exit_bb
5969               && (!exit_bb
5970                   || dominated_by_p (CDI_DOMINATORS, exit_bb, entry_bb)));
5971
5972   /* Collect all the blocks in the region.  Manually add ENTRY_BB
5973      because it won't be added by dfs_enumerate_from.  */
5974   bbs = NULL;
5975   VEC_safe_push (basic_block, heap, bbs, entry_bb);
5976   gather_blocks_in_sese_region (entry_bb, exit_bb, &bbs);
5977
5978   /* The blocks that used to be dominated by something in BBS will now be
5979      dominated by the new block.  */
5980   dom_bbs = get_dominated_by_region (CDI_DOMINATORS,
5981                                      VEC_address (basic_block, bbs),
5982                                      VEC_length (basic_block, bbs));
5983
5984   /* Detach ENTRY_BB and EXIT_BB from CFUN->CFG.  We need to remember
5985      the predecessor edges to ENTRY_BB and the successor edges to
5986      EXIT_BB so that we can re-attach them to the new basic block that
5987      will replace the region.  */
5988   num_entry_edges = EDGE_COUNT (entry_bb->preds);
5989   entry_pred = (basic_block *) xcalloc (num_entry_edges, sizeof (basic_block));
5990   entry_flag = (int *) xcalloc (num_entry_edges, sizeof (int));
5991   entry_prob = XNEWVEC (unsigned, num_entry_edges);
5992   i = 0;
5993   for (ei = ei_start (entry_bb->preds); (e = ei_safe_edge (ei)) != NULL;)
5994     {
5995       entry_prob[i] = e->probability;
5996       entry_flag[i] = e->flags;
5997       entry_pred[i++] = e->src;
5998       remove_edge (e);
5999     }
6000
6001   if (exit_bb)
6002     {
6003       num_exit_edges = EDGE_COUNT (exit_bb->succs);
6004       exit_succ = (basic_block *) xcalloc (num_exit_edges,
6005                                            sizeof (basic_block));
6006       exit_flag = (int *) xcalloc (num_exit_edges, sizeof (int));
6007       exit_prob = XNEWVEC (unsigned, num_exit_edges);
6008       i = 0;
6009       for (ei = ei_start (exit_bb->succs); (e = ei_safe_edge (ei)) != NULL;)
6010         {
6011           exit_prob[i] = e->probability;
6012           exit_flag[i] = e->flags;
6013           exit_succ[i++] = e->dest;
6014           remove_edge (e);
6015         }
6016     }
6017   else
6018     {
6019       num_exit_edges = 0;
6020       exit_succ = NULL;
6021       exit_flag = NULL;
6022       exit_prob = NULL;
6023     }
6024
6025   /* Switch context to the child function to initialize DEST_FN's CFG.  */
6026   gcc_assert (dest_cfun->cfg == NULL);
6027   push_cfun (dest_cfun);
6028
6029   init_empty_tree_cfg ();
6030
6031   /* Initialize EH information for the new function.  */
6032   eh_map = NULL;
6033   new_label_map = NULL;
6034   if (saved_cfun->eh)
6035     {
6036       eh_region region = NULL;
6037
6038       for (i = 0; VEC_iterate (basic_block, bbs, i, bb); i++)
6039         region = find_outermost_region_in_block (saved_cfun, bb, region);
6040
6041       init_eh_for_function ();
6042       if (region != NULL)
6043         {
6044           new_label_map = htab_create (17, tree_map_hash, tree_map_eq, free);
6045           eh_map = duplicate_eh_regions (saved_cfun, region, 0,
6046                                          new_label_mapper, new_label_map);
6047         }
6048     }
6049
6050   pop_cfun ();
6051
6052   /* Move blocks from BBS into DEST_CFUN.  */
6053   gcc_assert (VEC_length (basic_block, bbs) >= 2);
6054   after = dest_cfun->cfg->x_entry_block_ptr;
6055   vars_map = pointer_map_create ();
6056
6057   memset (&d, 0, sizeof (d));
6058   d.orig_block = orig_block;
6059   d.new_block = DECL_INITIAL (dest_cfun->decl);
6060   d.from_context = cfun->decl;
6061   d.to_context = dest_cfun->decl;
6062   d.vars_map = vars_map;
6063   d.new_label_map = new_label_map;
6064   d.eh_map = eh_map;
6065   d.remap_decls_p = true;
6066
6067   for (i = 0; VEC_iterate (basic_block, bbs, i, bb); i++)
6068     {
6069       /* No need to update edge counts on the last block.  It has
6070          already been updated earlier when we detached the region from
6071          the original CFG.  */
6072       move_block_to_fn (dest_cfun, bb, after, bb != exit_bb, &d);
6073       after = bb;
6074     }
6075
6076   /* Rewire BLOCK_SUBBLOCKS of orig_block.  */
6077   if (orig_block)
6078     {
6079       tree block;
6080       gcc_assert (BLOCK_SUBBLOCKS (DECL_INITIAL (dest_cfun->decl))
6081                   == NULL_TREE);
6082       BLOCK_SUBBLOCKS (DECL_INITIAL (dest_cfun->decl))
6083         = BLOCK_SUBBLOCKS (orig_block);
6084       for (block = BLOCK_SUBBLOCKS (orig_block);
6085            block; block = BLOCK_CHAIN (block))
6086         BLOCK_SUPERCONTEXT (block) = DECL_INITIAL (dest_cfun->decl);
6087       BLOCK_SUBBLOCKS (orig_block) = NULL_TREE;
6088     }
6089
6090   replace_block_vars_by_duplicates (DECL_INITIAL (dest_cfun->decl),
6091                                     vars_map, dest_cfun->decl);
6092
6093   if (new_label_map)
6094     htab_delete (new_label_map);
6095   if (eh_map)
6096     pointer_map_destroy (eh_map);
6097   pointer_map_destroy (vars_map);
6098
6099   /* Rewire the entry and exit blocks.  The successor to the entry
6100      block turns into the successor of DEST_FN's ENTRY_BLOCK_PTR in
6101      the child function.  Similarly, the predecessor of DEST_FN's
6102      EXIT_BLOCK_PTR turns into the predecessor of EXIT_BLOCK_PTR.  We
6103      need to switch CFUN between DEST_CFUN and SAVED_CFUN so that the
6104      various CFG manipulation function get to the right CFG.
6105
6106      FIXME, this is silly.  The CFG ought to become a parameter to
6107      these helpers.  */
6108   push_cfun (dest_cfun);
6109   make_edge (ENTRY_BLOCK_PTR, entry_bb, EDGE_FALLTHRU);
6110   if (exit_bb)
6111     make_edge (exit_bb,  EXIT_BLOCK_PTR, 0);
6112   pop_cfun ();
6113
6114   /* Back in the original function, the SESE region has disappeared,
6115      create a new basic block in its place.  */
6116   bb = create_empty_bb (entry_pred[0]);
6117   if (current_loops)
6118     add_bb_to_loop (bb, loop);
6119   for (i = 0; i < num_entry_edges; i++)
6120     {
6121       e = make_edge (entry_pred[i], bb, entry_flag[i]);
6122       e->probability = entry_prob[i];
6123     }
6124
6125   for (i = 0; i < num_exit_edges; i++)
6126     {
6127       e = make_edge (bb, exit_succ[i], exit_flag[i]);
6128       e->probability = exit_prob[i];
6129     }
6130
6131   set_immediate_dominator (CDI_DOMINATORS, bb, dom_entry);
6132   for (i = 0; VEC_iterate (basic_block, dom_bbs, i, abb); i++)
6133     set_immediate_dominator (CDI_DOMINATORS, abb, bb);
6134   VEC_free (basic_block, heap, dom_bbs);
6135
6136   if (exit_bb)
6137     {
6138       free (exit_prob);
6139       free (exit_flag);
6140       free (exit_succ);
6141     }
6142   free (entry_prob);
6143   free (entry_flag);
6144   free (entry_pred);
6145   VEC_free (basic_block, heap, bbs);
6146
6147   return bb;
6148 }
6149
6150
6151 /* Dump FUNCTION_DECL FN to file FILE using FLAGS (see TDF_* in tree-pass.h)
6152    */
6153
6154 void
6155 dump_function_to_file (tree fn, FILE *file, int flags)
6156 {
6157   tree arg, vars, var;
6158   struct function *dsf;
6159   bool ignore_topmost_bind = false, any_var = false;
6160   basic_block bb;
6161   tree chain;
6162
6163   fprintf (file, "%s (", lang_hooks.decl_printable_name (fn, 2));
6164
6165   arg = DECL_ARGUMENTS (fn);
6166   while (arg)
6167     {
6168       print_generic_expr (file, TREE_TYPE (arg), dump_flags);
6169       fprintf (file, " ");
6170       print_generic_expr (file, arg, dump_flags);
6171       if (flags & TDF_VERBOSE)
6172         print_node (file, "", arg, 4);
6173       if (TREE_CHAIN (arg))
6174         fprintf (file, ", ");
6175       arg = TREE_CHAIN (arg);
6176     }
6177   fprintf (file, ")\n");
6178
6179   if (flags & TDF_VERBOSE)
6180     print_node (file, "", fn, 2);
6181
6182   dsf = DECL_STRUCT_FUNCTION (fn);
6183   if (dsf && (flags & TDF_EH))
6184     dump_eh_tree (file, dsf);
6185
6186   if (flags & TDF_RAW && !gimple_has_body_p (fn))
6187     {
6188       dump_node (fn, TDF_SLIM | flags, file);
6189       return;
6190     }
6191
6192   /* Switch CFUN to point to FN.  */
6193   push_cfun (DECL_STRUCT_FUNCTION (fn));
6194
6195   /* When GIMPLE is lowered, the variables are no longer available in
6196      BIND_EXPRs, so display them separately.  */
6197   if (cfun && cfun->decl == fn && cfun->local_decls)
6198     {
6199       ignore_topmost_bind = true;
6200
6201       fprintf (file, "{\n");
6202       for (vars = cfun->local_decls; vars; vars = TREE_CHAIN (vars))
6203         {
6204           var = TREE_VALUE (vars);
6205
6206           print_generic_decl (file, var, flags);
6207           if (flags & TDF_VERBOSE)
6208             print_node (file, "", var, 4);
6209           fprintf (file, "\n");
6210
6211           any_var = true;
6212         }
6213     }
6214
6215   if (cfun && cfun->decl == fn && cfun->cfg && basic_block_info)
6216     {
6217       /* If the CFG has been built, emit a CFG-based dump.  */
6218       check_bb_profile (ENTRY_BLOCK_PTR, file);
6219       if (!ignore_topmost_bind)
6220         fprintf (file, "{\n");
6221
6222       if (any_var && n_basic_blocks)
6223         fprintf (file, "\n");
6224
6225       FOR_EACH_BB (bb)
6226         gimple_dump_bb (bb, file, 2, flags);
6227
6228       fprintf (file, "}\n");
6229       check_bb_profile (EXIT_BLOCK_PTR, file);
6230     }
6231   else if (DECL_SAVED_TREE (fn) == NULL)
6232     {
6233       /* The function is now in GIMPLE form but the CFG has not been
6234          built yet.  Emit the single sequence of GIMPLE statements
6235          that make up its body.  */
6236       gimple_seq body = gimple_body (fn);
6237
6238       if (gimple_seq_first_stmt (body)
6239           && gimple_seq_first_stmt (body) == gimple_seq_last_stmt (body)
6240           && gimple_code (gimple_seq_first_stmt (body)) == GIMPLE_BIND)
6241         print_gimple_seq (file, body, 0, flags);
6242       else
6243         {
6244           if (!ignore_topmost_bind)
6245             fprintf (file, "{\n");
6246
6247           if (any_var)
6248             fprintf (file, "\n");
6249
6250           print_gimple_seq (file, body, 2, flags);
6251           fprintf (file, "}\n");
6252         }
6253     }
6254   else
6255     {
6256       int indent;
6257
6258       /* Make a tree based dump.  */
6259       chain = DECL_SAVED_TREE (fn);
6260
6261       if (chain && TREE_CODE (chain) == BIND_EXPR)
6262         {
6263           if (ignore_topmost_bind)
6264             {
6265               chain = BIND_EXPR_BODY (chain);
6266               indent = 2;
6267             }
6268           else
6269             indent = 0;
6270         }
6271       else
6272         {
6273           if (!ignore_topmost_bind)
6274             fprintf (file, "{\n");
6275           indent = 2;
6276         }
6277
6278       if (any_var)
6279         fprintf (file, "\n");
6280
6281       print_generic_stmt_indented (file, chain, flags, indent);
6282       if (ignore_topmost_bind)
6283         fprintf (file, "}\n");
6284     }
6285
6286   fprintf (file, "\n\n");
6287
6288   /* Restore CFUN.  */
6289   pop_cfun ();
6290 }
6291
6292
6293 /* Dump FUNCTION_DECL FN to stderr using FLAGS (see TDF_* in tree.h)  */
6294
6295 void
6296 debug_function (tree fn, int flags)
6297 {
6298   dump_function_to_file (fn, stderr, flags);
6299 }
6300
6301
6302 /* Print on FILE the indexes for the predecessors of basic_block BB.  */
6303
6304 static void
6305 print_pred_bbs (FILE *file, basic_block bb)
6306 {
6307   edge e;
6308   edge_iterator ei;
6309
6310   FOR_EACH_EDGE (e, ei, bb->preds)
6311     fprintf (file, "bb_%d ", e->src->index);
6312 }
6313
6314
6315 /* Print on FILE the indexes for the successors of basic_block BB.  */
6316
6317 static void
6318 print_succ_bbs (FILE *file, basic_block bb)
6319 {
6320   edge e;
6321   edge_iterator ei;
6322
6323   FOR_EACH_EDGE (e, ei, bb->succs)
6324     fprintf (file, "bb_%d ", e->dest->index);
6325 }
6326
6327 /* Print to FILE the basic block BB following the VERBOSITY level.  */
6328
6329 void 
6330 print_loops_bb (FILE *file, basic_block bb, int indent, int verbosity)
6331 {
6332   char *s_indent = (char *) alloca ((size_t) indent + 1);
6333   memset ((void *) s_indent, ' ', (size_t) indent);
6334   s_indent[indent] = '\0';
6335
6336   /* Print basic_block's header.  */
6337   if (verbosity >= 2)
6338     {
6339       fprintf (file, "%s  bb_%d (preds = {", s_indent, bb->index);
6340       print_pred_bbs (file, bb);
6341       fprintf (file, "}, succs = {");
6342       print_succ_bbs (file, bb);
6343       fprintf (file, "})\n");
6344     }
6345
6346   /* Print basic_block's body.  */
6347   if (verbosity >= 3)
6348     {
6349       fprintf (file, "%s  {\n", s_indent);
6350       gimple_dump_bb (bb, file, indent + 4, TDF_VOPS|TDF_MEMSYMS);
6351       fprintf (file, "%s  }\n", s_indent);
6352     }
6353 }
6354
6355 static void print_loop_and_siblings (FILE *, struct loop *, int, int);
6356
6357 /* Pretty print LOOP on FILE, indented INDENT spaces.  Following
6358    VERBOSITY level this outputs the contents of the loop, or just its
6359    structure.  */
6360
6361 static void
6362 print_loop (FILE *file, struct loop *loop, int indent, int verbosity)
6363 {
6364   char *s_indent;
6365   basic_block bb;
6366
6367   if (loop == NULL)
6368     return;
6369
6370   s_indent = (char *) alloca ((size_t) indent + 1);
6371   memset ((void *) s_indent, ' ', (size_t) indent);
6372   s_indent[indent] = '\0';
6373
6374   /* Print loop's header.  */
6375   fprintf (file, "%sloop_%d (header = %d, latch = %d", s_indent, 
6376            loop->num, loop->header->index, loop->latch->index);
6377   fprintf (file, ", niter = ");
6378   print_generic_expr (file, loop->nb_iterations, 0);
6379
6380   if (loop->any_upper_bound)
6381     {
6382       fprintf (file, ", upper_bound = ");
6383       dump_double_int (file, loop->nb_iterations_upper_bound, true);
6384     }
6385
6386   if (loop->any_estimate)
6387     {
6388       fprintf (file, ", estimate = ");
6389       dump_double_int (file, loop->nb_iterations_estimate, true);
6390     }
6391   fprintf (file, ")\n");
6392
6393   /* Print loop's body.  */
6394   if (verbosity >= 1)
6395     {
6396       fprintf (file, "%s{\n", s_indent);
6397       FOR_EACH_BB (bb)
6398         if (bb->loop_father == loop)
6399           print_loops_bb (file, bb, indent, verbosity);
6400
6401       print_loop_and_siblings (file, loop->inner, indent + 2, verbosity);
6402       fprintf (file, "%s}\n", s_indent);
6403     }
6404 }
6405
6406 /* Print the LOOP and its sibling loops on FILE, indented INDENT
6407    spaces.  Following VERBOSITY level this outputs the contents of the
6408    loop, or just its structure.  */
6409
6410 static void
6411 print_loop_and_siblings (FILE *file, struct loop *loop, int indent, int verbosity)
6412 {
6413   if (loop == NULL)
6414     return;
6415
6416   print_loop (file, loop, indent, verbosity);
6417   print_loop_and_siblings (file, loop->next, indent, verbosity);
6418 }
6419
6420 /* Follow a CFG edge from the entry point of the program, and on entry
6421    of a loop, pretty print the loop structure on FILE.  */
6422
6423 void
6424 print_loops (FILE *file, int verbosity)
6425 {
6426   basic_block bb;
6427
6428   bb = ENTRY_BLOCK_PTR;
6429   if (bb && bb->loop_father)
6430     print_loop_and_siblings (file, bb->loop_father, 0, verbosity);
6431 }
6432
6433
6434 /* Debugging loops structure at tree level, at some VERBOSITY level.  */
6435
6436 void
6437 debug_loops (int verbosity)
6438 {
6439   print_loops (stderr, verbosity);
6440 }
6441
6442 /* Print on stderr the code of LOOP, at some VERBOSITY level.  */
6443
6444 void
6445 debug_loop (struct loop *loop, int verbosity)
6446 {
6447   print_loop (stderr, loop, 0, verbosity);
6448 }
6449
6450 /* Print on stderr the code of loop number NUM, at some VERBOSITY
6451    level.  */
6452
6453 void
6454 debug_loop_num (unsigned num, int verbosity)
6455 {
6456   debug_loop (get_loop (num), verbosity);
6457 }
6458
6459 /* Return true if BB ends with a call, possibly followed by some
6460    instructions that must stay with the call.  Return false,
6461    otherwise.  */
6462
6463 static bool
6464 gimple_block_ends_with_call_p (basic_block bb)
6465 {
6466   gimple_stmt_iterator gsi = gsi_last_nondebug_bb (bb);
6467   return is_gimple_call (gsi_stmt (gsi));
6468 }
6469
6470
6471 /* Return true if BB ends with a conditional branch.  Return false,
6472    otherwise.  */
6473
6474 static bool
6475 gimple_block_ends_with_condjump_p (const_basic_block bb)
6476 {
6477   gimple stmt = last_stmt (CONST_CAST_BB (bb));
6478   return (stmt && gimple_code (stmt) == GIMPLE_COND);
6479 }
6480
6481
6482 /* Return true if we need to add fake edge to exit at statement T.
6483    Helper function for gimple_flow_call_edges_add.  */
6484
6485 static bool
6486 need_fake_edge_p (gimple t)
6487 {
6488   tree fndecl = NULL_TREE;
6489   int call_flags = 0;
6490
6491   /* NORETURN and LONGJMP calls already have an edge to exit.
6492      CONST and PURE calls do not need one.
6493      We don't currently check for CONST and PURE here, although
6494      it would be a good idea, because those attributes are
6495      figured out from the RTL in mark_constant_function, and
6496      the counter incrementation code from -fprofile-arcs
6497      leads to different results from -fbranch-probabilities.  */
6498   if (is_gimple_call (t))
6499     {
6500       fndecl = gimple_call_fndecl (t);
6501       call_flags = gimple_call_flags (t);
6502     }
6503
6504   if (is_gimple_call (t)
6505       && fndecl
6506       && DECL_BUILT_IN (fndecl)
6507       && (call_flags & ECF_NOTHROW)
6508       && !(call_flags & ECF_RETURNS_TWICE)
6509       /* fork() doesn't really return twice, but the effect of
6510          wrapping it in __gcov_fork() which calls __gcov_flush()
6511          and clears the counters before forking has the same
6512          effect as returning twice.  Force a fake edge.  */
6513       && !(DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
6514            && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_FORK))
6515     return false;
6516
6517   if (is_gimple_call (t)
6518       && !(call_flags & ECF_NORETURN))
6519     return true;
6520
6521   if (gimple_code (t) == GIMPLE_ASM
6522        && (gimple_asm_volatile_p (t) || gimple_asm_input_p (t)))
6523     return true;
6524
6525   return false;
6526 }
6527
6528
6529 /* Add fake edges to the function exit for any non constant and non
6530    noreturn calls, volatile inline assembly in the bitmap of blocks
6531    specified by BLOCKS or to the whole CFG if BLOCKS is zero.  Return
6532    the number of blocks that were split.
6533
6534    The goal is to expose cases in which entering a basic block does
6535    not imply that all subsequent instructions must be executed.  */
6536
6537 static int
6538 gimple_flow_call_edges_add (sbitmap blocks)
6539 {
6540   int i;
6541   int blocks_split = 0;
6542   int last_bb = last_basic_block;
6543   bool check_last_block = false;
6544
6545   if (n_basic_blocks == NUM_FIXED_BLOCKS)
6546     return 0;
6547
6548   if (! blocks)
6549     check_last_block = true;
6550   else
6551     check_last_block = TEST_BIT (blocks, EXIT_BLOCK_PTR->prev_bb->index);
6552
6553   /* In the last basic block, before epilogue generation, there will be
6554      a fallthru edge to EXIT.  Special care is required if the last insn
6555      of the last basic block is a call because make_edge folds duplicate
6556      edges, which would result in the fallthru edge also being marked
6557      fake, which would result in the fallthru edge being removed by
6558      remove_fake_edges, which would result in an invalid CFG.
6559
6560      Moreover, we can't elide the outgoing fake edge, since the block
6561      profiler needs to take this into account in order to solve the minimal
6562      spanning tree in the case that the call doesn't return.
6563
6564      Handle this by adding a dummy instruction in a new last basic block.  */
6565   if (check_last_block)
6566     {
6567       basic_block bb = EXIT_BLOCK_PTR->prev_bb;
6568       gimple_stmt_iterator gsi = gsi_last_bb (bb);
6569       gimple t = NULL;
6570
6571       if (!gsi_end_p (gsi))
6572         t = gsi_stmt (gsi);
6573
6574       if (t && need_fake_edge_p (t))
6575         {
6576           edge e;
6577
6578           e = find_edge (bb, EXIT_BLOCK_PTR);
6579           if (e)
6580             {
6581               gsi_insert_on_edge (e, gimple_build_nop ());
6582               gsi_commit_edge_inserts ();
6583             }
6584         }
6585     }
6586
6587   /* Now add fake edges to the function exit for any non constant
6588      calls since there is no way that we can determine if they will
6589      return or not...  */
6590   for (i = 0; i < last_bb; i++)
6591     {
6592       basic_block bb = BASIC_BLOCK (i);
6593       gimple_stmt_iterator gsi;
6594       gimple stmt, last_stmt;
6595
6596       if (!bb)
6597         continue;
6598
6599       if (blocks && !TEST_BIT (blocks, i))
6600         continue;
6601
6602       gsi = gsi_last_bb (bb);
6603       if (!gsi_end_p (gsi))
6604         {
6605           last_stmt = gsi_stmt (gsi);
6606           do
6607             {
6608               stmt = gsi_stmt (gsi);
6609               if (need_fake_edge_p (stmt))
6610                 {
6611                   edge e;
6612
6613                   /* The handling above of the final block before the
6614                      epilogue should be enough to verify that there is
6615                      no edge to the exit block in CFG already.
6616                      Calling make_edge in such case would cause us to
6617                      mark that edge as fake and remove it later.  */
6618 #ifdef ENABLE_CHECKING
6619                   if (stmt == last_stmt)
6620                     {
6621                       e = find_edge (bb, EXIT_BLOCK_PTR);
6622                       gcc_assert (e == NULL);
6623                     }
6624 #endif
6625
6626                   /* Note that the following may create a new basic block
6627                      and renumber the existing basic blocks.  */
6628                   if (stmt != last_stmt)
6629                     {
6630                       e = split_block (bb, stmt);
6631                       if (e)
6632                         blocks_split++;
6633                     }
6634                   make_edge (bb, EXIT_BLOCK_PTR, EDGE_FAKE);
6635                 }
6636               gsi_prev (&gsi);
6637             }
6638           while (!gsi_end_p (gsi));
6639         }
6640     }
6641
6642   if (blocks_split)
6643     verify_flow_info ();
6644
6645   return blocks_split;
6646 }
6647
6648 /* Purge dead abnormal call edges from basic block BB.  */
6649
6650 bool
6651 gimple_purge_dead_abnormal_call_edges (basic_block bb)
6652 {
6653   bool changed = gimple_purge_dead_eh_edges (bb);
6654
6655   if (cfun->has_nonlocal_label)
6656     {
6657       gimple stmt = last_stmt (bb);
6658       edge_iterator ei;
6659       edge e;
6660
6661       if (!(stmt && stmt_can_make_abnormal_goto (stmt)))
6662         for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
6663           {
6664             if (e->flags & EDGE_ABNORMAL)
6665               {
6666                 remove_edge (e);
6667                 changed = true;
6668               }
6669             else
6670               ei_next (&ei);
6671           }
6672
6673       /* See gimple_purge_dead_eh_edges below.  */
6674       if (changed)
6675         free_dominance_info (CDI_DOMINATORS);
6676     }
6677
6678   return changed;
6679 }
6680
6681 /* Removes edge E and all the blocks dominated by it, and updates dominance
6682    information.  The IL in E->src needs to be updated separately.
6683    If dominance info is not available, only the edge E is removed.*/
6684
6685 void
6686 remove_edge_and_dominated_blocks (edge e)
6687 {
6688   VEC (basic_block, heap) *bbs_to_remove = NULL;
6689   VEC (basic_block, heap) *bbs_to_fix_dom = NULL;
6690   bitmap df, df_idom;
6691   edge f;
6692   edge_iterator ei;
6693   bool none_removed = false;
6694   unsigned i;
6695   basic_block bb, dbb;
6696   bitmap_iterator bi;
6697
6698   if (!dom_info_available_p (CDI_DOMINATORS))
6699     {
6700       remove_edge (e);
6701       return;
6702     }
6703
6704   /* No updating is needed for edges to exit.  */
6705   if (e->dest == EXIT_BLOCK_PTR)
6706     {
6707       if (cfgcleanup_altered_bbs)
6708         bitmap_set_bit (cfgcleanup_altered_bbs, e->src->index);
6709       remove_edge (e);
6710       return;
6711     }
6712
6713   /* First, we find the basic blocks to remove.  If E->dest has a predecessor
6714      that is not dominated by E->dest, then this set is empty.  Otherwise,
6715      all the basic blocks dominated by E->dest are removed.
6716
6717      Also, to DF_IDOM we store the immediate dominators of the blocks in
6718      the dominance frontier of E (i.e., of the successors of the
6719      removed blocks, if there are any, and of E->dest otherwise).  */
6720   FOR_EACH_EDGE (f, ei, e->dest->preds)
6721     {
6722       if (f == e)
6723         continue;
6724
6725       if (!dominated_by_p (CDI_DOMINATORS, f->src, e->dest))
6726         {
6727           none_removed = true;
6728           break;
6729         }
6730     }
6731
6732   df = BITMAP_ALLOC (NULL);
6733   df_idom = BITMAP_ALLOC (NULL);
6734
6735   if (none_removed)
6736     bitmap_set_bit (df_idom,
6737                     get_immediate_dominator (CDI_DOMINATORS, e->dest)->index);
6738   else
6739     {
6740       bbs_to_remove = get_all_dominated_blocks (CDI_DOMINATORS, e->dest);
6741       for (i = 0; VEC_iterate (basic_block, bbs_to_remove, i, bb); i++)
6742         {
6743           FOR_EACH_EDGE (f, ei, bb->succs)
6744             {
6745               if (f->dest != EXIT_BLOCK_PTR)
6746                 bitmap_set_bit (df, f->dest->index);
6747             }
6748         }
6749       for (i = 0; VEC_iterate (basic_block, bbs_to_remove, i, bb); i++)
6750         bitmap_clear_bit (df, bb->index);
6751
6752       EXECUTE_IF_SET_IN_BITMAP (df, 0, i, bi)
6753         {
6754           bb = BASIC_BLOCK (i);
6755           bitmap_set_bit (df_idom,
6756                           get_immediate_dominator (CDI_DOMINATORS, bb)->index);
6757         }
6758     }
6759
6760   if (cfgcleanup_altered_bbs)
6761     {
6762       /* Record the set of the altered basic blocks.  */
6763       bitmap_set_bit (cfgcleanup_altered_bbs, e->src->index);
6764       bitmap_ior_into (cfgcleanup_altered_bbs, df);
6765     }
6766
6767   /* Remove E and the cancelled blocks.  */
6768   if (none_removed)
6769     remove_edge (e);
6770   else
6771     {
6772       /* Walk backwards so as to get a chance to substitute all
6773          released DEFs into debug stmts.  See
6774          eliminate_unnecessary_stmts() in tree-ssa-dce.c for more
6775          details.  */
6776       for (i = VEC_length (basic_block, bbs_to_remove); i-- > 0; )
6777         delete_basic_block (VEC_index (basic_block, bbs_to_remove, i));
6778     }
6779
6780   /* Update the dominance information.  The immediate dominator may change only
6781      for blocks whose immediate dominator belongs to DF_IDOM:
6782    
6783      Suppose that idom(X) = Y before removal of E and idom(X) != Y after the
6784      removal.  Let Z the arbitrary block such that idom(Z) = Y and
6785      Z dominates X after the removal.  Before removal, there exists a path P
6786      from Y to X that avoids Z.  Let F be the last edge on P that is
6787      removed, and let W = F->dest.  Before removal, idom(W) = Y (since Y
6788      dominates W, and because of P, Z does not dominate W), and W belongs to
6789      the dominance frontier of E.  Therefore, Y belongs to DF_IDOM.  */ 
6790   EXECUTE_IF_SET_IN_BITMAP (df_idom, 0, i, bi)
6791     {
6792       bb = BASIC_BLOCK (i);
6793       for (dbb = first_dom_son (CDI_DOMINATORS, bb);
6794            dbb;
6795            dbb = next_dom_son (CDI_DOMINATORS, dbb))
6796         VEC_safe_push (basic_block, heap, bbs_to_fix_dom, dbb);
6797     }
6798
6799   iterate_fix_dominators (CDI_DOMINATORS, bbs_to_fix_dom, true);
6800
6801   BITMAP_FREE (df);
6802   BITMAP_FREE (df_idom);
6803   VEC_free (basic_block, heap, bbs_to_remove);
6804   VEC_free (basic_block, heap, bbs_to_fix_dom);
6805 }
6806
6807 /* Purge dead EH edges from basic block BB.  */
6808
6809 bool
6810 gimple_purge_dead_eh_edges (basic_block bb)
6811 {
6812   bool changed = false;
6813   edge e;
6814   edge_iterator ei;
6815   gimple stmt = last_stmt (bb);
6816
6817   if (stmt && stmt_can_throw_internal (stmt))
6818     return false;
6819
6820   for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
6821     {
6822       if (e->flags & EDGE_EH)
6823         {
6824           remove_edge_and_dominated_blocks (e);
6825           changed = true;
6826         }
6827       else
6828         ei_next (&ei);
6829     }
6830
6831   return changed;
6832 }
6833
6834 bool
6835 gimple_purge_all_dead_eh_edges (const_bitmap blocks)
6836 {
6837   bool changed = false;
6838   unsigned i;
6839   bitmap_iterator bi;
6840
6841   EXECUTE_IF_SET_IN_BITMAP (blocks, 0, i, bi)
6842     {
6843       basic_block bb = BASIC_BLOCK (i);
6844
6845       /* Earlier gimple_purge_dead_eh_edges could have removed
6846          this basic block already.  */
6847       gcc_assert (bb || changed);
6848       if (bb != NULL)
6849         changed |= gimple_purge_dead_eh_edges (bb);
6850     }
6851
6852   return changed;
6853 }
6854
6855 /* This function is called whenever a new edge is created or
6856    redirected.  */
6857
6858 static void
6859 gimple_execute_on_growing_pred (edge e)
6860 {
6861   basic_block bb = e->dest;
6862
6863   if (phi_nodes (bb))
6864     reserve_phi_args_for_new_edge (bb);
6865 }
6866
6867 /* This function is called immediately before edge E is removed from
6868    the edge vector E->dest->preds.  */
6869
6870 static void
6871 gimple_execute_on_shrinking_pred (edge e)
6872 {
6873   if (phi_nodes (e->dest))
6874     remove_phi_args (e);
6875 }
6876
6877 /*---------------------------------------------------------------------------
6878   Helper functions for Loop versioning
6879   ---------------------------------------------------------------------------*/
6880
6881 /* Adjust phi nodes for 'first' basic block.  'second' basic block is a copy
6882    of 'first'. Both of them are dominated by 'new_head' basic block. When
6883    'new_head' was created by 'second's incoming edge it received phi arguments
6884    on the edge by split_edge(). Later, additional edge 'e' was created to
6885    connect 'new_head' and 'first'. Now this routine adds phi args on this
6886    additional edge 'e' that new_head to second edge received as part of edge
6887    splitting.  */
6888
6889 static void
6890 gimple_lv_adjust_loop_header_phi (basic_block first, basic_block second,
6891                                   basic_block new_head, edge e)
6892 {
6893   gimple phi1, phi2;
6894   gimple_stmt_iterator psi1, psi2;
6895   tree def;
6896   edge e2 = find_edge (new_head, second);
6897
6898   /* Because NEW_HEAD has been created by splitting SECOND's incoming
6899      edge, we should always have an edge from NEW_HEAD to SECOND.  */
6900   gcc_assert (e2 != NULL);
6901
6902   /* Browse all 'second' basic block phi nodes and add phi args to
6903      edge 'e' for 'first' head. PHI args are always in correct order.  */
6904
6905   for (psi2 = gsi_start_phis (second),
6906        psi1 = gsi_start_phis (first);
6907        !gsi_end_p (psi2) && !gsi_end_p (psi1);
6908        gsi_next (&psi2),  gsi_next (&psi1))
6909     {
6910       phi1 = gsi_stmt (psi1);
6911       phi2 = gsi_stmt (psi2);
6912       def = PHI_ARG_DEF (phi2, e2->dest_idx);
6913       add_phi_arg (phi1, def, e, gimple_phi_arg_location_from_edge (phi2, e2));
6914     }
6915 }
6916
6917
6918 /* Adds a if else statement to COND_BB with condition COND_EXPR.
6919    SECOND_HEAD is the destination of the THEN and FIRST_HEAD is
6920    the destination of the ELSE part.  */
6921
6922 static void
6923 gimple_lv_add_condition_to_bb (basic_block first_head ATTRIBUTE_UNUSED,
6924                                basic_block second_head ATTRIBUTE_UNUSED,
6925                                basic_block cond_bb, void *cond_e)
6926 {
6927   gimple_stmt_iterator gsi;
6928   gimple new_cond_expr;
6929   tree cond_expr = (tree) cond_e;
6930   edge e0;
6931
6932   /* Build new conditional expr */
6933   new_cond_expr = gimple_build_cond_from_tree (cond_expr,
6934                                                NULL_TREE, NULL_TREE);
6935
6936   /* Add new cond in cond_bb.  */
6937   gsi = gsi_last_bb (cond_bb);
6938   gsi_insert_after (&gsi, new_cond_expr, GSI_NEW_STMT);
6939
6940   /* Adjust edges appropriately to connect new head with first head
6941      as well as second head.  */
6942   e0 = single_succ_edge (cond_bb);
6943   e0->flags &= ~EDGE_FALLTHRU;
6944   e0->flags |= EDGE_FALSE_VALUE;
6945 }
6946
6947 struct cfg_hooks gimple_cfg_hooks = {
6948   "gimple",
6949   gimple_verify_flow_info,
6950   gimple_dump_bb,               /* dump_bb  */
6951   create_bb,                    /* create_basic_block  */
6952   gimple_redirect_edge_and_branch, /* redirect_edge_and_branch  */
6953   gimple_redirect_edge_and_branch_force, /* redirect_edge_and_branch_force  */
6954   gimple_can_remove_branch_p,   /* can_remove_branch_p  */
6955   remove_bb,                    /* delete_basic_block  */
6956   gimple_split_block,           /* split_block  */
6957   gimple_move_block_after,      /* move_block_after  */
6958   gimple_can_merge_blocks_p,    /* can_merge_blocks_p  */
6959   gimple_merge_blocks,          /* merge_blocks  */
6960   gimple_predict_edge,          /* predict_edge  */
6961   gimple_predicted_by_p,                /* predicted_by_p  */
6962   gimple_can_duplicate_bb_p,    /* can_duplicate_block_p  */
6963   gimple_duplicate_bb,          /* duplicate_block  */
6964   gimple_split_edge,            /* split_edge  */
6965   gimple_make_forwarder_block,  /* make_forward_block  */
6966   NULL,                         /* tidy_fallthru_edge  */
6967   gimple_block_ends_with_call_p,/* block_ends_with_call_p */
6968   gimple_block_ends_with_condjump_p, /* block_ends_with_condjump_p */
6969   gimple_flow_call_edges_add,     /* flow_call_edges_add */
6970   gimple_execute_on_growing_pred,       /* execute_on_growing_pred */
6971   gimple_execute_on_shrinking_pred, /* execute_on_shrinking_pred */
6972   gimple_duplicate_loop_to_header_edge, /* duplicate loop for trees */
6973   gimple_lv_add_condition_to_bb, /* lv_add_condition_to_bb */
6974   gimple_lv_adjust_loop_header_phi, /* lv_adjust_loop_header_phi*/
6975   extract_true_false_edges_from_block, /* extract_cond_bb_edges */
6976   flush_pending_stmts           /* flush_pending_stmts */
6977 };
6978
6979
6980 /* Split all critical edges.  */
6981
6982 static unsigned int
6983 split_critical_edges (void)
6984 {
6985   basic_block bb;
6986   edge e;
6987   edge_iterator ei;
6988
6989   /* split_edge can redirect edges out of SWITCH_EXPRs, which can get
6990      expensive.  So we want to enable recording of edge to CASE_LABEL_EXPR
6991      mappings around the calls to split_edge.  */
6992   start_recording_case_labels ();
6993   FOR_ALL_BB (bb)
6994     {
6995       FOR_EACH_EDGE (e, ei, bb->succs)
6996         {
6997           if (EDGE_CRITICAL_P (e) && !(e->flags & EDGE_ABNORMAL))
6998             split_edge (e);
6999           /* PRE inserts statements to edges and expects that 
7000              since split_critical_edges was done beforehand, committing edge
7001              insertions will not split more edges.  In addition to critical
7002              edges we must split edges that have multiple successors and
7003              end by control flow statements, such as RESX. 
7004              Go ahead and split them too.  This matches the logic in
7005              gimple_find_edge_insert_loc.  */
7006           else if ((!single_pred_p (e->dest)
7007                     || !gimple_seq_empty_p (phi_nodes (e->dest))
7008                     || e->dest == EXIT_BLOCK_PTR)
7009                    && e->src != ENTRY_BLOCK_PTR
7010                    && !(e->flags & EDGE_ABNORMAL))
7011             {
7012               gimple_stmt_iterator gsi;
7013
7014               gsi = gsi_last_bb (e->src);
7015               if (!gsi_end_p (gsi)
7016                   && stmt_ends_bb_p (gsi_stmt (gsi))
7017                   && gimple_code (gsi_stmt (gsi)) != GIMPLE_RETURN)
7018                 split_edge (e);
7019             }
7020         }
7021     }
7022   end_recording_case_labels ();
7023   return 0;
7024 }
7025
7026 struct gimple_opt_pass pass_split_crit_edges =
7027 {
7028  {
7029   GIMPLE_PASS,
7030   "crited",                          /* name */
7031   NULL,                          /* gate */
7032   split_critical_edges,          /* execute */
7033   NULL,                          /* sub */
7034   NULL,                          /* next */
7035   0,                             /* static_pass_number */
7036   TV_TREE_SPLIT_EDGES,           /* tv_id */
7037   PROP_cfg,                      /* properties required */
7038   PROP_no_crit_edges,            /* properties_provided */
7039   0,                             /* properties_destroyed */
7040   0,                             /* todo_flags_start */
7041   TODO_dump_func | TODO_verify_flow  /* todo_flags_finish */
7042  }
7043 };
7044
7045
7046 /* Build a ternary operation and gimplify it.  Emit code before GSI.
7047    Return the gimple_val holding the result.  */
7048
7049 tree
7050 gimplify_build3 (gimple_stmt_iterator *gsi, enum tree_code code,
7051                  tree type, tree a, tree b, tree c)
7052 {
7053   tree ret;
7054   location_t loc = gimple_location (gsi_stmt (*gsi));
7055
7056   ret = fold_build3_loc (loc, code, type, a, b, c);
7057   STRIP_NOPS (ret);
7058
7059   return force_gimple_operand_gsi (gsi, ret, true, NULL, true,
7060                                    GSI_SAME_STMT);
7061 }
7062
7063 /* Build a binary operation and gimplify it.  Emit code before GSI.
7064    Return the gimple_val holding the result.  */
7065
7066 tree
7067 gimplify_build2 (gimple_stmt_iterator *gsi, enum tree_code code,
7068                  tree type, tree a, tree b)
7069 {
7070   tree ret;
7071
7072   ret = fold_build2_loc (gimple_location (gsi_stmt (*gsi)), code, type, a, b);
7073   STRIP_NOPS (ret);
7074
7075   return force_gimple_operand_gsi (gsi, ret, true, NULL, true,
7076                                    GSI_SAME_STMT);
7077 }
7078
7079 /* Build a unary operation and gimplify it.  Emit code before GSI.
7080    Return the gimple_val holding the result.  */
7081
7082 tree
7083 gimplify_build1 (gimple_stmt_iterator *gsi, enum tree_code code, tree type,
7084                  tree a)
7085 {
7086   tree ret;
7087
7088   ret = fold_build1_loc (gimple_location (gsi_stmt (*gsi)), code, type, a);
7089   STRIP_NOPS (ret);
7090
7091   return force_gimple_operand_gsi (gsi, ret, true, NULL, true,
7092                                    GSI_SAME_STMT);
7093 }
7094
7095
7096 \f
7097 /* Emit return warnings.  */
7098
7099 static unsigned int
7100 execute_warn_function_return (void)
7101 {
7102   source_location location;
7103   gimple last;
7104   edge e;
7105   edge_iterator ei;
7106
7107   /* If we have a path to EXIT, then we do return.  */
7108   if (TREE_THIS_VOLATILE (cfun->decl)
7109       && EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0)
7110     {
7111       location = UNKNOWN_LOCATION;
7112       FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
7113         {
7114           last = last_stmt (e->src);
7115           if (gimple_code (last) == GIMPLE_RETURN
7116               && (location = gimple_location (last)) != UNKNOWN_LOCATION)
7117             break;
7118         }
7119       if (location == UNKNOWN_LOCATION)
7120         location = cfun->function_end_locus;
7121       warning_at (location, 0, "%<noreturn%> function does return");
7122     }
7123
7124   /* If we see "return;" in some basic block, then we do reach the end
7125      without returning a value.  */
7126   else if (warn_return_type
7127            && !TREE_NO_WARNING (cfun->decl)
7128            && EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0
7129            && !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (cfun->decl))))
7130     {
7131       FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
7132         {
7133           gimple last = last_stmt (e->src);
7134           if (gimple_code (last) == GIMPLE_RETURN
7135               && gimple_return_retval (last) == NULL
7136               && !gimple_no_warning_p (last))
7137             {
7138               location = gimple_location (last);
7139               if (location == UNKNOWN_LOCATION)
7140                   location = cfun->function_end_locus;
7141               warning_at (location, OPT_Wreturn_type, "control reaches end of non-void function");
7142               TREE_NO_WARNING (cfun->decl) = 1;
7143               break;
7144             }
7145         }
7146     }
7147   return 0;
7148 }
7149
7150
7151 /* Given a basic block B which ends with a conditional and has
7152    precisely two successors, determine which of the edges is taken if
7153    the conditional is true and which is taken if the conditional is
7154    false.  Set TRUE_EDGE and FALSE_EDGE appropriately.  */
7155
7156 void
7157 extract_true_false_edges_from_block (basic_block b,
7158                                      edge *true_edge,
7159                                      edge *false_edge)
7160 {
7161   edge e = EDGE_SUCC (b, 0);
7162
7163   if (e->flags & EDGE_TRUE_VALUE)
7164     {
7165       *true_edge = e;
7166       *false_edge = EDGE_SUCC (b, 1);
7167     }
7168   else
7169     {
7170       *false_edge = e;
7171       *true_edge = EDGE_SUCC (b, 1);
7172     }
7173 }
7174
7175 struct gimple_opt_pass pass_warn_function_return =
7176 {
7177  {
7178   GIMPLE_PASS,
7179   NULL,                                 /* name */
7180   NULL,                                 /* gate */
7181   execute_warn_function_return,         /* execute */
7182   NULL,                                 /* sub */
7183   NULL,                                 /* next */
7184   0,                                    /* static_pass_number */
7185   TV_NONE,                              /* tv_id */
7186   PROP_cfg,                             /* properties_required */
7187   0,                                    /* properties_provided */
7188   0,                                    /* properties_destroyed */
7189   0,                                    /* todo_flags_start */
7190   0                                     /* todo_flags_finish */
7191  }
7192 };
7193
7194 /* Emit noreturn warnings.  */
7195
7196 static unsigned int
7197 execute_warn_function_noreturn (void)
7198 {
7199   if (warn_missing_noreturn
7200       && !TREE_THIS_VOLATILE (cfun->decl)
7201       && EDGE_COUNT (EXIT_BLOCK_PTR->preds) == 0
7202       && !lang_hooks.missing_noreturn_ok_p (cfun->decl))
7203     warning_at (DECL_SOURCE_LOCATION (cfun->decl), OPT_Wmissing_noreturn,
7204                 "function might be possible candidate "
7205                 "for attribute %<noreturn%>");
7206   return 0;
7207 }
7208
7209 struct gimple_opt_pass pass_warn_function_noreturn =
7210 {
7211  {
7212   GIMPLE_PASS,
7213   NULL,                                 /* name */
7214   NULL,                                 /* gate */
7215   execute_warn_function_noreturn,       /* execute */
7216   NULL,                                 /* sub */
7217   NULL,                                 /* next */
7218   0,                                    /* static_pass_number */
7219   TV_NONE,                              /* tv_id */
7220   PROP_cfg,                             /* properties_required */
7221   0,                                    /* properties_provided */
7222   0,                                    /* properties_destroyed */
7223   0,                                    /* todo_flags_start */
7224   0                                     /* todo_flags_finish */
7225  }
7226 };
7227
7228
7229 /* Walk a gimplified function and warn for functions whose return value is
7230    ignored and attribute((warn_unused_result)) is set.  This is done before
7231    inlining, so we don't have to worry about that.  */
7232
7233 static void
7234 do_warn_unused_result (gimple_seq seq)
7235 {
7236   tree fdecl, ftype;
7237   gimple_stmt_iterator i;
7238
7239   for (i = gsi_start (seq); !gsi_end_p (i); gsi_next (&i))
7240     {
7241       gimple g = gsi_stmt (i);
7242
7243       switch (gimple_code (g))
7244         {
7245         case GIMPLE_BIND:
7246           do_warn_unused_result (gimple_bind_body (g));
7247           break;
7248         case GIMPLE_TRY:
7249           do_warn_unused_result (gimple_try_eval (g));
7250           do_warn_unused_result (gimple_try_cleanup (g));
7251           break;
7252         case GIMPLE_CATCH:
7253           do_warn_unused_result (gimple_catch_handler (g));
7254           break;
7255         case GIMPLE_EH_FILTER:
7256           do_warn_unused_result (gimple_eh_filter_failure (g));
7257           break;
7258
7259         case GIMPLE_CALL:
7260           if (gimple_call_lhs (g))
7261             break;
7262
7263           /* This is a naked call, as opposed to a GIMPLE_CALL with an
7264              LHS.  All calls whose value is ignored should be
7265              represented like this.  Look for the attribute.  */
7266           fdecl = gimple_call_fndecl (g);
7267           ftype = TREE_TYPE (TREE_TYPE (gimple_call_fn (g)));
7268
7269           if (lookup_attribute ("warn_unused_result", TYPE_ATTRIBUTES (ftype)))
7270             {
7271               location_t loc = gimple_location (g);
7272
7273               if (fdecl)
7274                 warning_at (loc, OPT_Wunused_result,
7275                             "ignoring return value of %qD, "
7276                             "declared with attribute warn_unused_result",
7277                             fdecl);
7278               else
7279                 warning_at (loc, OPT_Wunused_result,
7280                             "ignoring return value of function "
7281                             "declared with attribute warn_unused_result");
7282             }
7283           break;
7284
7285         default:
7286           /* Not a container, not a call, or a call whose value is used.  */
7287           break;
7288         }
7289     }
7290 }
7291
7292 static unsigned int
7293 run_warn_unused_result (void)
7294 {
7295   do_warn_unused_result (gimple_body (current_function_decl));
7296   return 0;
7297 }
7298
7299 static bool
7300 gate_warn_unused_result (void)
7301 {
7302   return flag_warn_unused_result;
7303 }
7304
7305 struct gimple_opt_pass pass_warn_unused_result =
7306 {
7307   {
7308     GIMPLE_PASS,
7309     "*warn_unused_result",              /* name */
7310     gate_warn_unused_result,            /* gate */
7311     run_warn_unused_result,             /* execute */
7312     NULL,                               /* sub */
7313     NULL,                               /* next */
7314     0,                                  /* static_pass_number */
7315     TV_NONE,                            /* tv_id */
7316     PROP_gimple_any,                    /* properties_required */
7317     0,                                  /* properties_provided */
7318     0,                                  /* properties_destroyed */
7319     0,                                  /* todo_flags_start */
7320     0,                                  /* todo_flags_finish */
7321   }
7322 };
7323