OSDN Git Service

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