OSDN Git Service

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