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