OSDN Git Service

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