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