OSDN Git Service

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