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