OSDN Git Service

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