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