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