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