OSDN Git Service

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