OSDN Git Service

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