OSDN Git Service

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