OSDN Git Service

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