OSDN Git Service

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