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