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