OSDN Git Service

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