OSDN Git Service

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