OSDN Git Service

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