OSDN Git Service

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