OSDN Git Service

2010-07-01 Richard Guenther <rguenther@suse.de>
[pf3gnuchains/gcc-fork.git] / gcc / tree-cfg.c
1 /* Control flow functions for trees.
2    Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
3    2010  Free Software Foundation, Inc.
4    Contributed by Diego Novillo <dnovillo@redhat.com>
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
11 any later version.
12
13 GCC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "tree.h"
27 #include "tm_p.h"
28 #include "basic-block.h"
29 #include "output.h"
30 #include "flags.h"
31 #include "function.h"
32 #include "ggc.h"
33 #include "langhooks.h"
34 #include "tree-pretty-print.h"
35 #include "gimple-pretty-print.h"
36 #include "tree-flow.h"
37 #include "timevar.h"
38 #include "tree-dump.h"
39 #include "tree-pass.h"
40 #include "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) != ALIGN_INDIRECT_REF
2854       && TREE_CODE (expr) != MISALIGNED_INDIRECT_REF
2855       && TREE_CODE (expr) != TARGET_MEM_REF
2856       && TREE_CODE (expr) != MEM_REF)
2857     {
2858       error ("invalid expression for min lvalue");
2859       return true;
2860     }
2861
2862   /* TARGET_MEM_REFs are strange beasts.  */
2863   if (TREE_CODE (expr) == TARGET_MEM_REF)
2864     return false;
2865
2866   op = TREE_OPERAND (expr, 0);
2867   if (!is_gimple_val (op))
2868     {
2869       error ("invalid operand in indirect reference");
2870       debug_generic_stmt (op);
2871       return true;
2872     }
2873   /* Memory references now generally can involve a value conversion.  */
2874
2875   return false;
2876 }
2877
2878 /* Verify if EXPR is a valid GIMPLE reference expression.  If
2879    REQUIRE_LVALUE is true verifies it is an lvalue.  Returns true
2880    if there is an error, otherwise false.  */
2881
2882 static bool
2883 verify_types_in_gimple_reference (tree expr, bool require_lvalue)
2884 {
2885   while (handled_component_p (expr))
2886     {
2887       tree op = TREE_OPERAND (expr, 0);
2888
2889       if (TREE_CODE (expr) == ARRAY_REF
2890           || TREE_CODE (expr) == ARRAY_RANGE_REF)
2891         {
2892           if (!is_gimple_val (TREE_OPERAND (expr, 1))
2893               || (TREE_OPERAND (expr, 2)
2894                   && !is_gimple_val (TREE_OPERAND (expr, 2)))
2895               || (TREE_OPERAND (expr, 3)
2896                   && !is_gimple_val (TREE_OPERAND (expr, 3))))
2897             {
2898               error ("invalid operands to array reference");
2899               debug_generic_stmt (expr);
2900               return true;
2901             }
2902         }
2903
2904       /* Verify if the reference array element types are compatible.  */
2905       if (TREE_CODE (expr) == ARRAY_REF
2906           && !useless_type_conversion_p (TREE_TYPE (expr),
2907                                          TREE_TYPE (TREE_TYPE (op))))
2908         {
2909           error ("type mismatch in array reference");
2910           debug_generic_stmt (TREE_TYPE (expr));
2911           debug_generic_stmt (TREE_TYPE (TREE_TYPE (op)));
2912           return true;
2913         }
2914       if (TREE_CODE (expr) == ARRAY_RANGE_REF
2915           && !useless_type_conversion_p (TREE_TYPE (TREE_TYPE (expr)),
2916                                          TREE_TYPE (TREE_TYPE (op))))
2917         {
2918           error ("type mismatch in array range reference");
2919           debug_generic_stmt (TREE_TYPE (TREE_TYPE (expr)));
2920           debug_generic_stmt (TREE_TYPE (TREE_TYPE (op)));
2921           return true;
2922         }
2923
2924       if ((TREE_CODE (expr) == REALPART_EXPR
2925            || TREE_CODE (expr) == IMAGPART_EXPR)
2926           && !useless_type_conversion_p (TREE_TYPE (expr),
2927                                          TREE_TYPE (TREE_TYPE (op))))
2928         {
2929           error ("type mismatch in real/imagpart reference");
2930           debug_generic_stmt (TREE_TYPE (expr));
2931           debug_generic_stmt (TREE_TYPE (TREE_TYPE (op)));
2932           return true;
2933         }
2934
2935       if (TREE_CODE (expr) == COMPONENT_REF
2936           && !useless_type_conversion_p (TREE_TYPE (expr),
2937                                          TREE_TYPE (TREE_OPERAND (expr, 1))))
2938         {
2939           error ("type mismatch in component reference");
2940           debug_generic_stmt (TREE_TYPE (expr));
2941           debug_generic_stmt (TREE_TYPE (TREE_OPERAND (expr, 1)));
2942           return true;
2943         }
2944
2945       if (TREE_CODE (expr) == VIEW_CONVERT_EXPR)
2946         {
2947           /* For VIEW_CONVERT_EXPRs which are allowed here too, we only check
2948              that their operand is not an SSA name or an invariant when
2949              requiring an lvalue (this usually means there is a SRA or IPA-SRA
2950              bug).  Otherwise there is nothing to verify, gross mismatches at
2951              most invoke undefined behavior.  */
2952           if (require_lvalue
2953               && (TREE_CODE (op) == SSA_NAME
2954                   || is_gimple_min_invariant (op)))
2955             {
2956               error ("Conversion of an SSA_NAME on the left hand side.");
2957               debug_generic_stmt (expr);
2958               return true;
2959             }
2960           else if (TREE_CODE (op) == SSA_NAME
2961                    && TYPE_SIZE (TREE_TYPE (expr)) != TYPE_SIZE (TREE_TYPE (op)))
2962             {
2963               error ("Conversion of register to a different size.");
2964               debug_generic_stmt (expr);
2965               return true;
2966             }
2967           else if (!handled_component_p (op))
2968             return false;
2969         }
2970
2971       expr = op;
2972     }
2973
2974   if (TREE_CODE (expr) == MEM_REF)
2975     {
2976       if (!is_gimple_mem_ref_addr (TREE_OPERAND (expr, 0)))
2977         {
2978           error ("Invalid address operand in MEM_REF.");
2979           debug_generic_stmt (expr);
2980           return true;
2981         }
2982       if (TREE_CODE (TREE_OPERAND (expr, 1)) != INTEGER_CST
2983           || !POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (expr, 1))))
2984         {
2985           error ("Invalid offset operand in MEM_REF.");
2986           debug_generic_stmt (expr);
2987           return true;
2988         }
2989     }
2990
2991   return ((require_lvalue || !is_gimple_min_invariant (expr))
2992           && verify_types_in_gimple_min_lval (expr));
2993 }
2994
2995 /* Returns true if there is one pointer type in TYPE_POINTER_TO (SRC_OBJ)
2996    list of pointer-to types that is trivially convertible to DEST.  */
2997
2998 static bool
2999 one_pointer_to_useless_type_conversion_p (tree dest, tree src_obj)
3000 {
3001   tree src;
3002
3003   if (!TYPE_POINTER_TO (src_obj))
3004     return true;
3005
3006   for (src = TYPE_POINTER_TO (src_obj); src; src = TYPE_NEXT_PTR_TO (src))
3007     if (useless_type_conversion_p (dest, src))
3008       return true;
3009
3010   return false;
3011 }
3012
3013 /* Return true if TYPE1 is a fixed-point type and if conversions to and
3014    from TYPE2 can be handled by FIXED_CONVERT_EXPR.  */
3015
3016 static bool
3017 valid_fixed_convert_types_p (tree type1, tree type2)
3018 {
3019   return (FIXED_POINT_TYPE_P (type1)
3020           && (INTEGRAL_TYPE_P (type2)
3021               || SCALAR_FLOAT_TYPE_P (type2)
3022               || FIXED_POINT_TYPE_P (type2)));
3023 }
3024
3025 /* Verify the contents of a GIMPLE_CALL STMT.  Returns true when there
3026    is a problem, otherwise false.  */
3027
3028 static bool
3029 verify_gimple_call (gimple stmt)
3030 {
3031   tree fn = gimple_call_fn (stmt);
3032   tree fntype;
3033   unsigned i;
3034
3035   if (TREE_CODE (fn) != OBJ_TYPE_REF
3036       && !is_gimple_val (fn))
3037     {
3038       error ("invalid function in gimple call");
3039       debug_generic_stmt (fn);
3040       return true;
3041     }
3042
3043   if (!POINTER_TYPE_P (TREE_TYPE  (fn))
3044       || (TREE_CODE (TREE_TYPE (TREE_TYPE (fn))) != FUNCTION_TYPE
3045           && TREE_CODE (TREE_TYPE (TREE_TYPE (fn))) != METHOD_TYPE))
3046     {
3047       error ("non-function in gimple call");
3048       return true;
3049     }
3050
3051   if (gimple_call_lhs (stmt)
3052       && (!is_gimple_lvalue (gimple_call_lhs (stmt))
3053           || verify_types_in_gimple_reference (gimple_call_lhs (stmt), true)))
3054     {
3055       error ("invalid LHS in gimple call");
3056       return true;
3057     }
3058
3059   if (gimple_call_lhs (stmt) && gimple_call_noreturn_p (stmt))
3060     {
3061       error ("LHS in noreturn call");
3062       return true;
3063     }
3064
3065   fntype = TREE_TYPE (TREE_TYPE (fn));
3066   if (gimple_call_lhs (stmt)
3067       && !useless_type_conversion_p (TREE_TYPE (gimple_call_lhs (stmt)),
3068                                      TREE_TYPE (fntype))
3069       /* ???  At least C++ misses conversions at assignments from
3070          void * call results.
3071          ???  Java is completely off.  Especially with functions
3072          returning java.lang.Object.
3073          For now simply allow arbitrary pointer type conversions.  */
3074       && !(POINTER_TYPE_P (TREE_TYPE (gimple_call_lhs (stmt)))
3075            && POINTER_TYPE_P (TREE_TYPE (fntype))))
3076     {
3077       error ("invalid conversion in gimple call");
3078       debug_generic_stmt (TREE_TYPE (gimple_call_lhs (stmt)));
3079       debug_generic_stmt (TREE_TYPE (fntype));
3080       return true;
3081     }
3082
3083   if (gimple_call_chain (stmt)
3084       && !is_gimple_val (gimple_call_chain (stmt)))
3085     {
3086       error ("invalid static chain in gimple call");
3087       debug_generic_stmt (gimple_call_chain (stmt));
3088       return true;
3089     }
3090
3091   /* If there is a static chain argument, this should not be an indirect
3092      call, and the decl should have DECL_STATIC_CHAIN set.  */
3093   if (gimple_call_chain (stmt))
3094     {
3095       if (TREE_CODE (fn) != ADDR_EXPR
3096           || TREE_CODE (TREE_OPERAND (fn, 0)) != FUNCTION_DECL)
3097         {
3098           error ("static chain in indirect gimple call");
3099           return true;
3100         }
3101       fn = TREE_OPERAND (fn, 0);
3102
3103       if (!DECL_STATIC_CHAIN (fn))
3104         {
3105           error ("static chain with function that doesn't use one");
3106           return true;
3107         }
3108     }
3109
3110   /* ???  The C frontend passes unpromoted arguments in case it
3111      didn't see a function declaration before the call.  So for now
3112      leave the call arguments mostly unverified.  Once we gimplify
3113      unit-at-a-time we have a chance to fix this.  */
3114
3115   for (i = 0; i < gimple_call_num_args (stmt); ++i)
3116     {
3117       tree arg = gimple_call_arg (stmt, i);
3118       if (!is_gimple_operand (arg))
3119         {
3120           error ("invalid argument to gimple call");
3121           debug_generic_expr (arg);
3122         }
3123     }
3124
3125   return false;
3126 }
3127
3128 /* Verifies the gimple comparison with the result type TYPE and
3129    the operands OP0 and OP1.  */
3130
3131 static bool
3132 verify_gimple_comparison (tree type, tree op0, tree op1)
3133 {
3134   tree op0_type = TREE_TYPE (op0);
3135   tree op1_type = TREE_TYPE (op1);
3136
3137   if (!is_gimple_val (op0) || !is_gimple_val (op1))
3138     {
3139       error ("invalid operands in gimple comparison");
3140       return true;
3141     }
3142
3143   /* For comparisons we do not have the operations type as the
3144      effective type the comparison is carried out in.  Instead
3145      we require that either the first operand is trivially
3146      convertible into the second, or the other way around.
3147      The resulting type of a comparison may be any integral type.
3148      Because we special-case pointers to void we allow
3149      comparisons of pointers with the same mode as well.  */
3150   if ((!useless_type_conversion_p (op0_type, op1_type)
3151        && !useless_type_conversion_p (op1_type, op0_type)
3152        && (!POINTER_TYPE_P (op0_type)
3153            || !POINTER_TYPE_P (op1_type)
3154            || TYPE_MODE (op0_type) != TYPE_MODE (op1_type)))
3155       || !INTEGRAL_TYPE_P (type))
3156     {
3157       error ("type mismatch in comparison expression");
3158       debug_generic_expr (type);
3159       debug_generic_expr (op0_type);
3160       debug_generic_expr (op1_type);
3161       return true;
3162     }
3163
3164   return false;
3165 }
3166
3167 /* Verify a gimple assignment statement STMT with an unary rhs.
3168    Returns true if anything is wrong.  */
3169
3170 static bool
3171 verify_gimple_assign_unary (gimple stmt)
3172 {
3173   enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
3174   tree lhs = gimple_assign_lhs (stmt);
3175   tree lhs_type = TREE_TYPE (lhs);
3176   tree rhs1 = gimple_assign_rhs1 (stmt);
3177   tree rhs1_type = TREE_TYPE (rhs1);
3178
3179   if (!is_gimple_reg (lhs)
3180       && !(optimize == 0
3181            && TREE_CODE (lhs_type) == COMPLEX_TYPE))
3182     {
3183       error ("non-register as LHS of unary operation");
3184       return true;
3185     }
3186
3187   if (!is_gimple_val (rhs1))
3188     {
3189       error ("invalid operand in unary operation");
3190       return true;
3191     }
3192
3193   /* First handle conversions.  */
3194   switch (rhs_code)
3195     {
3196     CASE_CONVERT:
3197       {
3198         /* Allow conversions between integral types and pointers only if
3199            there is no sign or zero extension involved.
3200            For targets were the precision of sizetype doesn't match that
3201            of pointers we need to allow arbitrary conversions from and
3202            to sizetype.  */
3203         if ((POINTER_TYPE_P (lhs_type)
3204              && INTEGRAL_TYPE_P (rhs1_type)
3205              && (TYPE_PRECISION (lhs_type) >= TYPE_PRECISION (rhs1_type)
3206                  || rhs1_type == sizetype))
3207             || (POINTER_TYPE_P (rhs1_type)
3208                 && INTEGRAL_TYPE_P (lhs_type)
3209                 && (TYPE_PRECISION (rhs1_type) >= TYPE_PRECISION (lhs_type)
3210                     || lhs_type == sizetype)))
3211           return false;
3212
3213         /* Allow conversion from integer to offset type and vice versa.  */
3214         if ((TREE_CODE (lhs_type) == OFFSET_TYPE
3215              && TREE_CODE (rhs1_type) == INTEGER_TYPE)
3216             || (TREE_CODE (lhs_type) == INTEGER_TYPE
3217                 && TREE_CODE (rhs1_type) == OFFSET_TYPE))
3218           return false;
3219
3220         /* Otherwise assert we are converting between types of the
3221            same kind.  */
3222         if (INTEGRAL_TYPE_P (lhs_type) != INTEGRAL_TYPE_P (rhs1_type))
3223           {
3224             error ("invalid types in nop conversion");
3225             debug_generic_expr (lhs_type);
3226             debug_generic_expr (rhs1_type);
3227             return true;
3228           }
3229
3230         return false;
3231       }
3232
3233     case ADDR_SPACE_CONVERT_EXPR:
3234       {
3235         if (!POINTER_TYPE_P (rhs1_type) || !POINTER_TYPE_P (lhs_type)
3236             || (TYPE_ADDR_SPACE (TREE_TYPE (rhs1_type))
3237                 == TYPE_ADDR_SPACE (TREE_TYPE (lhs_type))))
3238           {
3239             error ("invalid types in address space conversion");
3240             debug_generic_expr (lhs_type);
3241             debug_generic_expr (rhs1_type);
3242             return true;
3243           }
3244
3245         return false;
3246       }
3247
3248     case FIXED_CONVERT_EXPR:
3249       {
3250         if (!valid_fixed_convert_types_p (lhs_type, rhs1_type)
3251             && !valid_fixed_convert_types_p (rhs1_type, lhs_type))
3252           {
3253             error ("invalid types in fixed-point conversion");
3254             debug_generic_expr (lhs_type);
3255             debug_generic_expr (rhs1_type);
3256             return true;
3257           }
3258
3259         return false;
3260       }
3261
3262     case FLOAT_EXPR:
3263       {
3264         if (!INTEGRAL_TYPE_P (rhs1_type) || !SCALAR_FLOAT_TYPE_P (lhs_type))
3265           {
3266             error ("invalid types in conversion to floating point");
3267             debug_generic_expr (lhs_type);
3268             debug_generic_expr (rhs1_type);
3269             return true;
3270           }
3271
3272         return false;
3273       }
3274
3275     case FIX_TRUNC_EXPR:
3276       {
3277         if (!INTEGRAL_TYPE_P (lhs_type) || !SCALAR_FLOAT_TYPE_P (rhs1_type))
3278           {
3279             error ("invalid types in conversion to integer");
3280             debug_generic_expr (lhs_type);
3281             debug_generic_expr (rhs1_type);
3282             return true;
3283           }
3284
3285         return false;
3286       }
3287
3288     case VEC_UNPACK_HI_EXPR:
3289     case VEC_UNPACK_LO_EXPR:
3290     case REDUC_MAX_EXPR:
3291     case REDUC_MIN_EXPR:
3292     case REDUC_PLUS_EXPR:
3293     case VEC_UNPACK_FLOAT_HI_EXPR:
3294     case VEC_UNPACK_FLOAT_LO_EXPR:
3295       /* FIXME.  */
3296       return false;
3297
3298     case TRUTH_NOT_EXPR:
3299     case NEGATE_EXPR:
3300     case ABS_EXPR:
3301     case BIT_NOT_EXPR:
3302     case PAREN_EXPR:
3303     case NON_LVALUE_EXPR:
3304     case CONJ_EXPR:
3305       break;
3306
3307     default:
3308       gcc_unreachable ();
3309     }
3310
3311   /* For the remaining codes assert there is no conversion involved.  */
3312   if (!useless_type_conversion_p (lhs_type, rhs1_type))
3313     {
3314       error ("non-trivial conversion in unary operation");
3315       debug_generic_expr (lhs_type);
3316       debug_generic_expr (rhs1_type);
3317       return true;
3318     }
3319
3320   return false;
3321 }
3322
3323 /* Verify a gimple assignment statement STMT with a binary rhs.
3324    Returns true if anything is wrong.  */
3325
3326 static bool
3327 verify_gimple_assign_binary (gimple stmt)
3328 {
3329   enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
3330   tree lhs = gimple_assign_lhs (stmt);
3331   tree lhs_type = TREE_TYPE (lhs);
3332   tree rhs1 = gimple_assign_rhs1 (stmt);
3333   tree rhs1_type = TREE_TYPE (rhs1);
3334   tree rhs2 = gimple_assign_rhs2 (stmt);
3335   tree rhs2_type = TREE_TYPE (rhs2);
3336
3337   if (!is_gimple_reg (lhs)
3338       && !(optimize == 0
3339            && TREE_CODE (lhs_type) == COMPLEX_TYPE))
3340     {
3341       error ("non-register as LHS of binary operation");
3342       return true;
3343     }
3344
3345   if (!is_gimple_val (rhs1)
3346       || !is_gimple_val (rhs2))
3347     {
3348       error ("invalid operands in binary operation");
3349       return true;
3350     }
3351
3352   /* First handle operations that involve different types.  */
3353   switch (rhs_code)
3354     {
3355     case COMPLEX_EXPR:
3356       {
3357         if (TREE_CODE (lhs_type) != COMPLEX_TYPE
3358             || !(INTEGRAL_TYPE_P (rhs1_type)
3359                  || SCALAR_FLOAT_TYPE_P (rhs1_type))
3360             || !(INTEGRAL_TYPE_P (rhs2_type)
3361                  || SCALAR_FLOAT_TYPE_P (rhs2_type)))
3362           {
3363             error ("type mismatch in complex expression");
3364             debug_generic_expr (lhs_type);
3365             debug_generic_expr (rhs1_type);
3366             debug_generic_expr (rhs2_type);
3367             return true;
3368           }
3369
3370         return false;
3371       }
3372
3373     case LSHIFT_EXPR:
3374     case RSHIFT_EXPR:
3375     case LROTATE_EXPR:
3376     case RROTATE_EXPR:
3377       {
3378         /* Shifts and rotates are ok on integral types, fixed point
3379            types and integer vector types.  */
3380         if ((!INTEGRAL_TYPE_P (rhs1_type)
3381              && !FIXED_POINT_TYPE_P (rhs1_type)
3382              && !(TREE_CODE (rhs1_type) == VECTOR_TYPE
3383                   && INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))))
3384             || (!INTEGRAL_TYPE_P (rhs2_type)
3385                 /* Vector shifts of vectors are also ok.  */
3386                 && !(TREE_CODE (rhs1_type) == VECTOR_TYPE
3387                      && INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))
3388                      && TREE_CODE (rhs2_type) == VECTOR_TYPE
3389                      && INTEGRAL_TYPE_P (TREE_TYPE (rhs2_type))))
3390             || !useless_type_conversion_p (lhs_type, rhs1_type))
3391           {
3392             error ("type mismatch in shift expression");
3393             debug_generic_expr (lhs_type);
3394             debug_generic_expr (rhs1_type);
3395             debug_generic_expr (rhs2_type);
3396             return true;
3397           }
3398
3399         return false;
3400       }
3401
3402     case VEC_LSHIFT_EXPR:
3403     case VEC_RSHIFT_EXPR:
3404       {
3405         if (TREE_CODE (rhs1_type) != VECTOR_TYPE
3406             || !(INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))
3407                  || FIXED_POINT_TYPE_P (TREE_TYPE (rhs1_type))
3408                  || SCALAR_FLOAT_TYPE_P (TREE_TYPE (rhs1_type)))
3409             || (!INTEGRAL_TYPE_P (rhs2_type)
3410                 && (TREE_CODE (rhs2_type) != VECTOR_TYPE
3411                     || !INTEGRAL_TYPE_P (TREE_TYPE (rhs2_type))))
3412             || !useless_type_conversion_p (lhs_type, rhs1_type))
3413           {
3414             error ("type mismatch in vector shift expression");
3415             debug_generic_expr (lhs_type);
3416             debug_generic_expr (rhs1_type);
3417             debug_generic_expr (rhs2_type);
3418             return true;
3419           }
3420         /* For shifting a vector of floating point components we
3421            only allow shifting by a constant multiple of the element size.  */
3422         if (SCALAR_FLOAT_TYPE_P (TREE_TYPE (rhs1_type))
3423             && (TREE_CODE (rhs2) != INTEGER_CST
3424                 || !div_if_zero_remainder (EXACT_DIV_EXPR, rhs2,
3425                                            TYPE_SIZE (TREE_TYPE (rhs1_type)))))
3426           {
3427             error ("non-element sized vector shift of floating point vector");
3428             return true;
3429           }
3430
3431         return false;
3432       }
3433
3434     case PLUS_EXPR:
3435       {
3436         /* We use regular PLUS_EXPR for vectors.
3437            ???  This just makes the checker happy and may not be what is
3438            intended.  */
3439         if (TREE_CODE (lhs_type) == VECTOR_TYPE
3440             && POINTER_TYPE_P (TREE_TYPE (lhs_type)))
3441           {
3442             if (TREE_CODE (rhs1_type) != VECTOR_TYPE
3443                 || TREE_CODE (rhs2_type) != VECTOR_TYPE)
3444               {
3445                 error ("invalid non-vector operands to vector valued plus");
3446                 return true;
3447               }
3448             lhs_type = TREE_TYPE (lhs_type);
3449             rhs1_type = TREE_TYPE (rhs1_type);
3450             rhs2_type = TREE_TYPE (rhs2_type);
3451             /* PLUS_EXPR is commutative, so we might end up canonicalizing
3452                the pointer to 2nd place.  */
3453             if (POINTER_TYPE_P (rhs2_type))
3454               {
3455                 tree tem = rhs1_type;
3456                 rhs1_type = rhs2_type;
3457                 rhs2_type = tem;
3458               }
3459             goto do_pointer_plus_expr_check;
3460           }
3461       }
3462     /* Fallthru.  */
3463     case MINUS_EXPR:
3464       {
3465         if (POINTER_TYPE_P (lhs_type)
3466             || POINTER_TYPE_P (rhs1_type)
3467             || POINTER_TYPE_P (rhs2_type))
3468           {
3469             error ("invalid (pointer) operands to plus/minus");
3470             return true;
3471           }
3472
3473         /* Continue with generic binary expression handling.  */
3474         break;
3475       }
3476
3477     case POINTER_PLUS_EXPR:
3478       {
3479 do_pointer_plus_expr_check:
3480         if (!POINTER_TYPE_P (rhs1_type)
3481             || !useless_type_conversion_p (lhs_type, rhs1_type)
3482             || !useless_type_conversion_p (sizetype, rhs2_type))
3483           {
3484             error ("type mismatch in pointer plus expression");
3485             debug_generic_stmt (lhs_type);
3486             debug_generic_stmt (rhs1_type);
3487             debug_generic_stmt (rhs2_type);
3488             return true;
3489           }
3490
3491         return false;
3492       }
3493
3494     case TRUTH_ANDIF_EXPR:
3495     case TRUTH_ORIF_EXPR:
3496       gcc_unreachable ();
3497
3498     case TRUTH_AND_EXPR:
3499     case TRUTH_OR_EXPR:
3500     case TRUTH_XOR_EXPR:
3501       {
3502         /* We allow any kind of integral typed argument and result.  */
3503         if (!INTEGRAL_TYPE_P (rhs1_type)
3504             || !INTEGRAL_TYPE_P (rhs2_type)
3505             || !INTEGRAL_TYPE_P (lhs_type))
3506           {
3507             error ("type mismatch in binary truth expression");
3508             debug_generic_expr (lhs_type);
3509             debug_generic_expr (rhs1_type);
3510             debug_generic_expr (rhs2_type);
3511             return true;
3512           }
3513
3514         return false;
3515       }
3516
3517     case LT_EXPR:
3518     case LE_EXPR:
3519     case GT_EXPR:
3520     case GE_EXPR:
3521     case EQ_EXPR:
3522     case NE_EXPR:
3523     case UNORDERED_EXPR:
3524     case ORDERED_EXPR:
3525     case UNLT_EXPR:
3526     case UNLE_EXPR:
3527     case UNGT_EXPR:
3528     case UNGE_EXPR:
3529     case UNEQ_EXPR:
3530     case LTGT_EXPR:
3531       /* Comparisons are also binary, but the result type is not
3532          connected to the operand types.  */
3533       return verify_gimple_comparison (lhs_type, rhs1, rhs2);
3534
3535     case WIDEN_MULT_EXPR:
3536       if (TREE_CODE (lhs_type) != INTEGER_TYPE)
3537         return true;
3538       return ((2 * TYPE_PRECISION (rhs1_type) != TYPE_PRECISION (lhs_type))
3539               || (TYPE_PRECISION (rhs1_type) != TYPE_PRECISION (rhs2_type)));
3540
3541     case WIDEN_SUM_EXPR:
3542     case VEC_WIDEN_MULT_HI_EXPR:
3543     case VEC_WIDEN_MULT_LO_EXPR:
3544     case VEC_PACK_TRUNC_EXPR:
3545     case VEC_PACK_SAT_EXPR:
3546     case VEC_PACK_FIX_TRUNC_EXPR:
3547     case VEC_EXTRACT_EVEN_EXPR:
3548     case VEC_EXTRACT_ODD_EXPR:
3549     case VEC_INTERLEAVE_HIGH_EXPR:
3550     case VEC_INTERLEAVE_LOW_EXPR:
3551       /* FIXME.  */
3552       return false;
3553
3554     case MULT_EXPR:
3555     case TRUNC_DIV_EXPR:
3556     case CEIL_DIV_EXPR:
3557     case FLOOR_DIV_EXPR:
3558     case ROUND_DIV_EXPR:
3559     case TRUNC_MOD_EXPR:
3560     case CEIL_MOD_EXPR:
3561     case FLOOR_MOD_EXPR:
3562     case ROUND_MOD_EXPR:
3563     case RDIV_EXPR:
3564     case EXACT_DIV_EXPR:
3565     case MIN_EXPR:
3566     case MAX_EXPR:
3567     case BIT_IOR_EXPR:
3568     case BIT_XOR_EXPR:
3569     case BIT_AND_EXPR:
3570       /* Continue with generic binary expression handling.  */
3571       break;
3572
3573     default:
3574       gcc_unreachable ();
3575     }
3576
3577   if (!useless_type_conversion_p (lhs_type, rhs1_type)
3578       || !useless_type_conversion_p (lhs_type, rhs2_type))
3579     {
3580       error ("type mismatch in binary expression");
3581       debug_generic_stmt (lhs_type);
3582       debug_generic_stmt (rhs1_type);
3583       debug_generic_stmt (rhs2_type);
3584       return true;
3585     }
3586
3587   return false;
3588 }
3589
3590 /* Verify a gimple assignment statement STMT with a ternary rhs.
3591    Returns true if anything is wrong.  */
3592
3593 static bool
3594 verify_gimple_assign_ternary (gimple stmt)
3595 {
3596   enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
3597   tree lhs = gimple_assign_lhs (stmt);
3598   tree lhs_type = TREE_TYPE (lhs);
3599   tree rhs1 = gimple_assign_rhs1 (stmt);
3600   tree rhs1_type = TREE_TYPE (rhs1);
3601   tree rhs2 = gimple_assign_rhs2 (stmt);
3602   tree rhs2_type = TREE_TYPE (rhs2);
3603   tree rhs3 = gimple_assign_rhs3 (stmt);
3604   tree rhs3_type = TREE_TYPE (rhs3);
3605
3606   if (!is_gimple_reg (lhs)
3607       && !(optimize == 0
3608            && TREE_CODE (lhs_type) == COMPLEX_TYPE))
3609     {
3610       error ("non-register as LHS of ternary operation");
3611       return true;
3612     }
3613
3614   if (!is_gimple_val (rhs1)
3615       || !is_gimple_val (rhs2)
3616       || !is_gimple_val (rhs3))
3617     {
3618       error ("invalid operands in ternary operation");
3619       return true;
3620     }
3621
3622   /* First handle operations that involve different types.  */
3623   switch (rhs_code)
3624     {
3625     case WIDEN_MULT_PLUS_EXPR:
3626     case WIDEN_MULT_MINUS_EXPR:
3627       if ((!INTEGRAL_TYPE_P (rhs1_type)
3628            && !FIXED_POINT_TYPE_P (rhs1_type))
3629           || !useless_type_conversion_p (rhs1_type, rhs2_type)
3630           || !useless_type_conversion_p (lhs_type, rhs3_type)
3631           || 2 * TYPE_PRECISION (rhs1_type) != TYPE_PRECISION (lhs_type)
3632           || TYPE_PRECISION (rhs1_type) != TYPE_PRECISION (rhs2_type))
3633         {
3634           error ("type mismatch in widening multiply-accumulate expression");
3635           debug_generic_expr (lhs_type);
3636           debug_generic_expr (rhs1_type);
3637           debug_generic_expr (rhs2_type);
3638           debug_generic_expr (rhs3_type);
3639           return true;
3640         }
3641       break;
3642
3643     default:
3644       gcc_unreachable ();
3645     }
3646   return false;
3647 }
3648
3649 /* Verify a gimple assignment statement STMT with a single rhs.
3650    Returns true if anything is wrong.  */
3651
3652 static bool
3653 verify_gimple_assign_single (gimple stmt)
3654 {
3655   enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
3656   tree lhs = gimple_assign_lhs (stmt);
3657   tree lhs_type = TREE_TYPE (lhs);
3658   tree rhs1 = gimple_assign_rhs1 (stmt);
3659   tree rhs1_type = TREE_TYPE (rhs1);
3660   bool res = false;
3661
3662   if (!useless_type_conversion_p (lhs_type, rhs1_type))
3663     {
3664       error ("non-trivial conversion at assignment");
3665       debug_generic_expr (lhs_type);
3666       debug_generic_expr (rhs1_type);
3667       return true;
3668     }
3669
3670   if (handled_component_p (lhs))
3671     res |= verify_types_in_gimple_reference (lhs, true);
3672
3673   /* Special codes we cannot handle via their class.  */
3674   switch (rhs_code)
3675     {
3676     case ADDR_EXPR:
3677       {
3678         tree op = TREE_OPERAND (rhs1, 0);
3679         if (!is_gimple_addressable (op))
3680           {
3681             error ("invalid operand in unary expression");
3682             return true;
3683           }
3684
3685         if (!types_compatible_p (TREE_TYPE (op), TREE_TYPE (TREE_TYPE (rhs1)))
3686             && !one_pointer_to_useless_type_conversion_p (TREE_TYPE (rhs1),
3687                                                           TREE_TYPE (op)))
3688           {
3689             error ("type mismatch in address expression");
3690             debug_generic_stmt (TREE_TYPE (rhs1));
3691             debug_generic_stmt (TREE_TYPE (op));
3692             return true;
3693           }
3694
3695         return verify_types_in_gimple_reference (op, true);
3696       }
3697
3698     /* tcc_reference  */
3699     case INDIRECT_REF:
3700       error ("INDIRECT_REF in gimple IL");
3701       return true;
3702
3703     case COMPONENT_REF:
3704     case BIT_FIELD_REF:
3705     case ALIGN_INDIRECT_REF:
3706     case MISALIGNED_INDIRECT_REF:
3707     case ARRAY_REF:
3708     case ARRAY_RANGE_REF:
3709     case VIEW_CONVERT_EXPR:
3710     case REALPART_EXPR:
3711     case IMAGPART_EXPR:
3712     case TARGET_MEM_REF:
3713     case MEM_REF:
3714       if (!is_gimple_reg (lhs)
3715           && is_gimple_reg_type (TREE_TYPE (lhs)))
3716         {
3717           error ("invalid rhs for gimple memory store");
3718           debug_generic_stmt (lhs);
3719           debug_generic_stmt (rhs1);
3720           return true;
3721         }
3722       return res || verify_types_in_gimple_reference (rhs1, false);
3723
3724     /* tcc_constant  */
3725     case SSA_NAME:
3726     case INTEGER_CST:
3727     case REAL_CST:
3728     case FIXED_CST:
3729     case COMPLEX_CST:
3730     case VECTOR_CST:
3731     case STRING_CST:
3732       return res;
3733
3734     /* tcc_declaration  */
3735     case CONST_DECL:
3736       return res;
3737     case VAR_DECL:
3738     case PARM_DECL:
3739       if (!is_gimple_reg (lhs)
3740           && !is_gimple_reg (rhs1)
3741           && is_gimple_reg_type (TREE_TYPE (lhs)))
3742         {
3743           error ("invalid rhs for gimple memory store");
3744           debug_generic_stmt (lhs);
3745           debug_generic_stmt (rhs1);
3746           return true;
3747         }
3748       return res;
3749
3750     case COND_EXPR:
3751       if (!is_gimple_reg (lhs)
3752           || (!is_gimple_reg (TREE_OPERAND (rhs1, 0))
3753               && !COMPARISON_CLASS_P (TREE_OPERAND (rhs1, 0)))
3754           || (!is_gimple_reg (TREE_OPERAND (rhs1, 1))
3755               && !is_gimple_min_invariant (TREE_OPERAND (rhs1, 1)))
3756           || (!is_gimple_reg (TREE_OPERAND (rhs1, 2))
3757               && !is_gimple_min_invariant (TREE_OPERAND (rhs1, 2))))
3758         {
3759           error ("invalid COND_EXPR in gimple assignment");
3760           debug_generic_stmt (rhs1);
3761           return true;
3762         }
3763       return res;
3764
3765     case CONSTRUCTOR:
3766     case OBJ_TYPE_REF:
3767     case ASSERT_EXPR:
3768     case WITH_SIZE_EXPR:
3769     case POLYNOMIAL_CHREC:
3770     case DOT_PROD_EXPR:
3771     case VEC_COND_EXPR:
3772     case REALIGN_LOAD_EXPR:
3773       /* FIXME.  */
3774       return res;
3775
3776     default:;
3777     }
3778
3779   return res;
3780 }
3781
3782 /* Verify the contents of a GIMPLE_ASSIGN STMT.  Returns true when there
3783    is a problem, otherwise false.  */
3784
3785 static bool
3786 verify_gimple_assign (gimple stmt)
3787 {
3788   switch (gimple_assign_rhs_class (stmt))
3789     {
3790     case GIMPLE_SINGLE_RHS:
3791       return verify_gimple_assign_single (stmt);
3792
3793     case GIMPLE_UNARY_RHS:
3794       return verify_gimple_assign_unary (stmt);
3795
3796     case GIMPLE_BINARY_RHS:
3797       return verify_gimple_assign_binary (stmt);
3798
3799     case GIMPLE_TERNARY_RHS:
3800       return verify_gimple_assign_ternary (stmt);
3801
3802     default:
3803       gcc_unreachable ();
3804     }
3805 }
3806
3807 /* Verify the contents of a GIMPLE_RETURN STMT.  Returns true when there
3808    is a problem, otherwise false.  */
3809
3810 static bool
3811 verify_gimple_return (gimple stmt)
3812 {
3813   tree op = gimple_return_retval (stmt);
3814   tree restype = TREE_TYPE (TREE_TYPE (cfun->decl));
3815
3816   /* We cannot test for present return values as we do not fix up missing
3817      return values from the original source.  */
3818   if (op == NULL)
3819     return false;
3820
3821   if (!is_gimple_val (op)
3822       && TREE_CODE (op) != RESULT_DECL)
3823     {
3824       error ("invalid operand in return statement");
3825       debug_generic_stmt (op);
3826       return true;
3827     }
3828
3829   if (!useless_type_conversion_p (restype, TREE_TYPE (op))
3830       /* ???  With C++ we can have the situation that the result
3831          decl is a reference type while the return type is an aggregate.  */
3832       && !(TREE_CODE (op) == RESULT_DECL
3833            && TREE_CODE (TREE_TYPE (op)) == REFERENCE_TYPE
3834            && useless_type_conversion_p (restype, TREE_TYPE (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           f->local_decls = tree_cons (NULL_TREE, new_t, f->local_decls);
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, vars, 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 && cfun->local_decls)
6360     {
6361       ignore_topmost_bind = true;
6362
6363       fprintf (file, "{\n");
6364       for (vars = cfun->local_decls; vars; vars = TREE_CHAIN (vars))
6365         {
6366           var = TREE_VALUE (vars);
6367
6368           print_generic_decl (file, var, flags);
6369           if (flags & TDF_VERBOSE)
6370             print_node (file, "", var, 4);
6371           fprintf (file, "\n");
6372
6373           any_var = true;
6374         }
6375     }
6376
6377   if (cfun && cfun->decl == fn && cfun->cfg && basic_block_info)
6378     {
6379       /* If the CFG has been built, emit a CFG-based dump.  */
6380       check_bb_profile (ENTRY_BLOCK_PTR, file);
6381       if (!ignore_topmost_bind)
6382         fprintf (file, "{\n");
6383
6384       if (any_var && n_basic_blocks)
6385         fprintf (file, "\n");
6386
6387       FOR_EACH_BB (bb)
6388         gimple_dump_bb (bb, file, 2, flags);
6389
6390       fprintf (file, "}\n");
6391       check_bb_profile (EXIT_BLOCK_PTR, file);
6392     }
6393   else if (DECL_SAVED_TREE (fn) == NULL)
6394     {
6395       /* The function is now in GIMPLE form but the CFG has not been
6396          built yet.  Emit the single sequence of GIMPLE statements
6397          that make up its body.  */
6398       gimple_seq body = gimple_body (fn);
6399
6400       if (gimple_seq_first_stmt (body)
6401           && gimple_seq_first_stmt (body) == gimple_seq_last_stmt (body)
6402           && gimple_code (gimple_seq_first_stmt (body)) == GIMPLE_BIND)
6403         print_gimple_seq (file, body, 0, flags);
6404       else
6405         {
6406           if (!ignore_topmost_bind)
6407             fprintf (file, "{\n");
6408
6409           if (any_var)
6410             fprintf (file, "\n");
6411
6412           print_gimple_seq (file, body, 2, flags);
6413           fprintf (file, "}\n");
6414         }
6415     }
6416   else
6417     {
6418       int indent;
6419
6420       /* Make a tree based dump.  */
6421       chain = DECL_SAVED_TREE (fn);
6422
6423       if (chain && TREE_CODE (chain) == BIND_EXPR)
6424         {
6425           if (ignore_topmost_bind)
6426             {
6427               chain = BIND_EXPR_BODY (chain);
6428               indent = 2;
6429             }
6430           else
6431             indent = 0;
6432         }
6433       else
6434         {
6435           if (!ignore_topmost_bind)
6436             fprintf (file, "{\n");
6437           indent = 2;
6438         }
6439
6440       if (any_var)
6441         fprintf (file, "\n");
6442
6443       print_generic_stmt_indented (file, chain, flags, indent);
6444       if (ignore_topmost_bind)
6445         fprintf (file, "}\n");
6446     }
6447
6448   fprintf (file, "\n\n");
6449
6450   /* Restore CFUN.  */
6451   pop_cfun ();
6452 }
6453
6454
6455 /* Dump FUNCTION_DECL FN to stderr using FLAGS (see TDF_* in tree.h)  */
6456
6457 DEBUG_FUNCTION void
6458 debug_function (tree fn, int flags)
6459 {
6460   dump_function_to_file (fn, stderr, flags);
6461 }
6462
6463
6464 /* Print on FILE the indexes for the predecessors of basic_block BB.  */
6465
6466 static void
6467 print_pred_bbs (FILE *file, basic_block bb)
6468 {
6469   edge e;
6470   edge_iterator ei;
6471
6472   FOR_EACH_EDGE (e, ei, bb->preds)
6473     fprintf (file, "bb_%d ", e->src->index);
6474 }
6475
6476
6477 /* Print on FILE the indexes for the successors of basic_block BB.  */
6478
6479 static void
6480 print_succ_bbs (FILE *file, basic_block bb)
6481 {
6482   edge e;
6483   edge_iterator ei;
6484
6485   FOR_EACH_EDGE (e, ei, bb->succs)
6486     fprintf (file, "bb_%d ", e->dest->index);
6487 }
6488
6489 /* Print to FILE the basic block BB following the VERBOSITY level.  */
6490
6491 void
6492 print_loops_bb (FILE *file, basic_block bb, int indent, int verbosity)
6493 {
6494   char *s_indent = (char *) alloca ((size_t) indent + 1);
6495   memset ((void *) s_indent, ' ', (size_t) indent);
6496   s_indent[indent] = '\0';
6497
6498   /* Print basic_block's header.  */
6499   if (verbosity >= 2)
6500     {
6501       fprintf (file, "%s  bb_%d (preds = {", s_indent, bb->index);
6502       print_pred_bbs (file, bb);
6503       fprintf (file, "}, succs = {");
6504       print_succ_bbs (file, bb);
6505       fprintf (file, "})\n");
6506     }
6507
6508   /* Print basic_block's body.  */
6509   if (verbosity >= 3)
6510     {
6511       fprintf (file, "%s  {\n", s_indent);
6512       gimple_dump_bb (bb, file, indent + 4, TDF_VOPS|TDF_MEMSYMS);
6513       fprintf (file, "%s  }\n", s_indent);
6514     }
6515 }
6516
6517 static void print_loop_and_siblings (FILE *, struct loop *, int, int);
6518
6519 /* Pretty print LOOP on FILE, indented INDENT spaces.  Following
6520    VERBOSITY level this outputs the contents of the loop, or just its
6521    structure.  */
6522
6523 static void
6524 print_loop (FILE *file, struct loop *loop, int indent, int verbosity)
6525 {
6526   char *s_indent;
6527   basic_block bb;
6528
6529   if (loop == NULL)
6530     return;
6531
6532   s_indent = (char *) alloca ((size_t) indent + 1);
6533   memset ((void *) s_indent, ' ', (size_t) indent);
6534   s_indent[indent] = '\0';
6535
6536   /* Print loop's header.  */
6537   fprintf (file, "%sloop_%d (header = %d, latch = %d", s_indent,
6538            loop->num, loop->header->index, loop->latch->index);
6539   fprintf (file, ", niter = ");
6540   print_generic_expr (file, loop->nb_iterations, 0);
6541
6542   if (loop->any_upper_bound)
6543     {
6544       fprintf (file, ", upper_bound = ");
6545       dump_double_int (file, loop->nb_iterations_upper_bound, true);
6546     }
6547
6548   if (loop->any_estimate)
6549     {
6550       fprintf (file, ", estimate = ");
6551       dump_double_int (file, loop->nb_iterations_estimate, true);
6552     }
6553   fprintf (file, ")\n");
6554
6555   /* Print loop's body.  */
6556   if (verbosity >= 1)
6557     {
6558       fprintf (file, "%s{\n", s_indent);
6559       FOR_EACH_BB (bb)
6560         if (bb->loop_father == loop)
6561           print_loops_bb (file, bb, indent, verbosity);
6562
6563       print_loop_and_siblings (file, loop->inner, indent + 2, verbosity);
6564       fprintf (file, "%s}\n", s_indent);
6565     }
6566 }
6567
6568 /* Print the LOOP and its sibling loops on FILE, indented INDENT
6569    spaces.  Following VERBOSITY level this outputs the contents of the
6570    loop, or just its structure.  */
6571
6572 static void
6573 print_loop_and_siblings (FILE *file, struct loop *loop, int indent, int verbosity)
6574 {
6575   if (loop == NULL)
6576     return;
6577
6578   print_loop (file, loop, indent, verbosity);
6579   print_loop_and_siblings (file, loop->next, indent, verbosity);
6580 }
6581
6582 /* Follow a CFG edge from the entry point of the program, and on entry
6583    of a loop, pretty print the loop structure on FILE.  */
6584
6585 void
6586 print_loops (FILE *file, int verbosity)
6587 {
6588   basic_block bb;
6589
6590   bb = ENTRY_BLOCK_PTR;
6591   if (bb && bb->loop_father)
6592     print_loop_and_siblings (file, bb->loop_father, 0, verbosity);
6593 }
6594
6595
6596 /* Debugging loops structure at tree level, at some VERBOSITY level.  */
6597
6598 DEBUG_FUNCTION void
6599 debug_loops (int verbosity)
6600 {
6601   print_loops (stderr, verbosity);
6602 }
6603
6604 /* Print on stderr the code of LOOP, at some VERBOSITY level.  */
6605
6606 DEBUG_FUNCTION void
6607 debug_loop (struct loop *loop, int verbosity)
6608 {
6609   print_loop (stderr, loop, 0, verbosity);
6610 }
6611
6612 /* Print on stderr the code of loop number NUM, at some VERBOSITY
6613    level.  */
6614
6615 DEBUG_FUNCTION void
6616 debug_loop_num (unsigned num, int verbosity)
6617 {
6618   debug_loop (get_loop (num), verbosity);
6619 }
6620
6621 /* Return true if BB ends with a call, possibly followed by some
6622    instructions that must stay with the call.  Return false,
6623    otherwise.  */
6624
6625 static bool
6626 gimple_block_ends_with_call_p (basic_block bb)
6627 {
6628   gimple_stmt_iterator gsi = gsi_last_nondebug_bb (bb);
6629   return is_gimple_call (gsi_stmt (gsi));
6630 }
6631
6632
6633 /* Return true if BB ends with a conditional branch.  Return false,
6634    otherwise.  */
6635
6636 static bool
6637 gimple_block_ends_with_condjump_p (const_basic_block bb)
6638 {
6639   gimple stmt = last_stmt (CONST_CAST_BB (bb));
6640   return (stmt && gimple_code (stmt) == GIMPLE_COND);
6641 }
6642
6643
6644 /* Return true if we need to add fake edge to exit at statement T.
6645    Helper function for gimple_flow_call_edges_add.  */
6646
6647 static bool
6648 need_fake_edge_p (gimple t)
6649 {
6650   tree fndecl = NULL_TREE;
6651   int call_flags = 0;
6652
6653   /* NORETURN and LONGJMP calls already have an edge to exit.
6654      CONST and PURE calls do not need one.
6655      We don't currently check for CONST and PURE here, although
6656      it would be a good idea, because those attributes are
6657      figured out from the RTL in mark_constant_function, and
6658      the counter incrementation code from -fprofile-arcs
6659      leads to different results from -fbranch-probabilities.  */
6660   if (is_gimple_call (t))
6661     {
6662       fndecl = gimple_call_fndecl (t);
6663       call_flags = gimple_call_flags (t);
6664     }
6665
6666   if (is_gimple_call (t)
6667       && fndecl
6668       && DECL_BUILT_IN (fndecl)
6669       && (call_flags & ECF_NOTHROW)
6670       && !(call_flags & ECF_RETURNS_TWICE)
6671       /* fork() doesn't really return twice, but the effect of
6672          wrapping it in __gcov_fork() which calls __gcov_flush()
6673          and clears the counters before forking has the same
6674          effect as returning twice.  Force a fake edge.  */
6675       && !(DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
6676            && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_FORK))
6677     return false;
6678
6679   if (is_gimple_call (t)
6680       && !(call_flags & ECF_NORETURN))
6681     return true;
6682
6683   if (gimple_code (t) == GIMPLE_ASM
6684        && (gimple_asm_volatile_p (t) || gimple_asm_input_p (t)))
6685     return true;
6686
6687   return false;
6688 }
6689
6690
6691 /* Add fake edges to the function exit for any non constant and non
6692    noreturn calls, volatile inline assembly in the bitmap of blocks
6693    specified by BLOCKS or to the whole CFG if BLOCKS is zero.  Return
6694    the number of blocks that were split.
6695
6696    The goal is to expose cases in which entering a basic block does
6697    not imply that all subsequent instructions must be executed.  */
6698
6699 static int
6700 gimple_flow_call_edges_add (sbitmap blocks)
6701 {
6702   int i;
6703   int blocks_split = 0;
6704   int last_bb = last_basic_block;
6705   bool check_last_block = false;
6706
6707   if (n_basic_blocks == NUM_FIXED_BLOCKS)
6708     return 0;
6709
6710   if (! blocks)
6711     check_last_block = true;
6712   else
6713     check_last_block = TEST_BIT (blocks, EXIT_BLOCK_PTR->prev_bb->index);
6714
6715   /* In the last basic block, before epilogue generation, there will be
6716      a fallthru edge to EXIT.  Special care is required if the last insn
6717      of the last basic block is a call because make_edge folds duplicate
6718      edges, which would result in the fallthru edge also being marked
6719      fake, which would result in the fallthru edge being removed by
6720      remove_fake_edges, which would result in an invalid CFG.
6721
6722      Moreover, we can't elide the outgoing fake edge, since the block
6723      profiler needs to take this into account in order to solve the minimal
6724      spanning tree in the case that the call doesn't return.
6725
6726      Handle this by adding a dummy instruction in a new last basic block.  */
6727   if (check_last_block)
6728     {
6729       basic_block bb = EXIT_BLOCK_PTR->prev_bb;
6730       gimple_stmt_iterator gsi = gsi_last_bb (bb);
6731       gimple t = NULL;
6732
6733       if (!gsi_end_p (gsi))
6734         t = gsi_stmt (gsi);
6735
6736       if (t && need_fake_edge_p (t))
6737         {
6738           edge e;
6739
6740           e = find_edge (bb, EXIT_BLOCK_PTR);
6741           if (e)
6742             {
6743               gsi_insert_on_edge (e, gimple_build_nop ());
6744               gsi_commit_edge_inserts ();
6745             }
6746         }
6747     }
6748
6749   /* Now add fake edges to the function exit for any non constant
6750      calls since there is no way that we can determine if they will
6751      return or not...  */
6752   for (i = 0; i < last_bb; i++)
6753     {
6754       basic_block bb = BASIC_BLOCK (i);
6755       gimple_stmt_iterator gsi;
6756       gimple stmt, last_stmt;
6757
6758       if (!bb)
6759         continue;
6760
6761       if (blocks && !TEST_BIT (blocks, i))
6762         continue;
6763
6764       gsi = gsi_last_bb (bb);
6765       if (!gsi_end_p (gsi))
6766         {
6767           last_stmt = gsi_stmt (gsi);
6768           do
6769             {
6770               stmt = gsi_stmt (gsi);
6771               if (need_fake_edge_p (stmt))
6772                 {
6773                   edge e;
6774
6775                   /* The handling above of the final block before the
6776                      epilogue should be enough to verify that there is
6777                      no edge to the exit block in CFG already.
6778                      Calling make_edge in such case would cause us to
6779                      mark that edge as fake and remove it later.  */
6780 #ifdef ENABLE_CHECKING
6781                   if (stmt == last_stmt)
6782                     {
6783                       e = find_edge (bb, EXIT_BLOCK_PTR);
6784                       gcc_assert (e == NULL);
6785                     }
6786 #endif
6787
6788                   /* Note that the following may create a new basic block
6789                      and renumber the existing basic blocks.  */
6790                   if (stmt != last_stmt)
6791                     {
6792                       e = split_block (bb, stmt);
6793                       if (e)
6794                         blocks_split++;
6795                     }
6796                   make_edge (bb, EXIT_BLOCK_PTR, EDGE_FAKE);
6797                 }
6798               gsi_prev (&gsi);
6799             }
6800           while (!gsi_end_p (gsi));
6801         }
6802     }
6803
6804   if (blocks_split)
6805     verify_flow_info ();
6806
6807   return blocks_split;
6808 }
6809
6810 /* Purge dead abnormal call edges from basic block BB.  */
6811
6812 bool
6813 gimple_purge_dead_abnormal_call_edges (basic_block bb)
6814 {
6815   bool changed = gimple_purge_dead_eh_edges (bb);
6816
6817   if (cfun->has_nonlocal_label)
6818     {
6819       gimple stmt = last_stmt (bb);
6820       edge_iterator ei;
6821       edge e;
6822
6823       if (!(stmt && stmt_can_make_abnormal_goto (stmt)))
6824         for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
6825           {
6826             if (e->flags & EDGE_ABNORMAL)
6827               {
6828                 remove_edge (e);
6829                 changed = true;
6830               }
6831             else
6832               ei_next (&ei);
6833           }
6834
6835       /* See gimple_purge_dead_eh_edges below.  */
6836       if (changed)
6837         free_dominance_info (CDI_DOMINATORS);
6838     }
6839
6840   return changed;
6841 }
6842
6843 /* Removes edge E and all the blocks dominated by it, and updates dominance
6844    information.  The IL in E->src needs to be updated separately.
6845    If dominance info is not available, only the edge E is removed.*/
6846
6847 void
6848 remove_edge_and_dominated_blocks (edge e)
6849 {
6850   VEC (basic_block, heap) *bbs_to_remove = NULL;
6851   VEC (basic_block, heap) *bbs_to_fix_dom = NULL;
6852   bitmap df, df_idom;
6853   edge f;
6854   edge_iterator ei;
6855   bool none_removed = false;
6856   unsigned i;
6857   basic_block bb, dbb;
6858   bitmap_iterator bi;
6859
6860   if (!dom_info_available_p (CDI_DOMINATORS))
6861     {
6862       remove_edge (e);
6863       return;
6864     }
6865
6866   /* No updating is needed for edges to exit.  */
6867   if (e->dest == EXIT_BLOCK_PTR)
6868     {
6869       if (cfgcleanup_altered_bbs)
6870         bitmap_set_bit (cfgcleanup_altered_bbs, e->src->index);
6871       remove_edge (e);
6872       return;
6873     }
6874
6875   /* First, we find the basic blocks to remove.  If E->dest has a predecessor
6876      that is not dominated by E->dest, then this set is empty.  Otherwise,
6877      all the basic blocks dominated by E->dest are removed.
6878
6879      Also, to DF_IDOM we store the immediate dominators of the blocks in
6880      the dominance frontier of E (i.e., of the successors of the
6881      removed blocks, if there are any, and of E->dest otherwise).  */
6882   FOR_EACH_EDGE (f, ei, e->dest->preds)
6883     {
6884       if (f == e)
6885         continue;
6886
6887       if (!dominated_by_p (CDI_DOMINATORS, f->src, e->dest))
6888         {
6889           none_removed = true;
6890           break;
6891         }
6892     }
6893
6894   df = BITMAP_ALLOC (NULL);
6895   df_idom = BITMAP_ALLOC (NULL);
6896
6897   if (none_removed)
6898     bitmap_set_bit (df_idom,
6899                     get_immediate_dominator (CDI_DOMINATORS, e->dest)->index);
6900   else
6901     {
6902       bbs_to_remove = get_all_dominated_blocks (CDI_DOMINATORS, e->dest);
6903       for (i = 0; VEC_iterate (basic_block, bbs_to_remove, i, bb); i++)
6904         {
6905           FOR_EACH_EDGE (f, ei, bb->succs)
6906             {
6907               if (f->dest != EXIT_BLOCK_PTR)
6908                 bitmap_set_bit (df, f->dest->index);
6909             }
6910         }
6911       for (i = 0; VEC_iterate (basic_block, bbs_to_remove, i, bb); i++)
6912         bitmap_clear_bit (df, bb->index);
6913
6914       EXECUTE_IF_SET_IN_BITMAP (df, 0, i, bi)
6915         {
6916           bb = BASIC_BLOCK (i);
6917           bitmap_set_bit (df_idom,
6918                           get_immediate_dominator (CDI_DOMINATORS, bb)->index);
6919         }
6920     }
6921
6922   if (cfgcleanup_altered_bbs)
6923     {
6924       /* Record the set of the altered basic blocks.  */
6925       bitmap_set_bit (cfgcleanup_altered_bbs, e->src->index);
6926       bitmap_ior_into (cfgcleanup_altered_bbs, df);
6927     }
6928
6929   /* Remove E and the cancelled blocks.  */
6930   if (none_removed)
6931     remove_edge (e);
6932   else
6933     {
6934       /* Walk backwards so as to get a chance to substitute all
6935          released DEFs into debug stmts.  See
6936          eliminate_unnecessary_stmts() in tree-ssa-dce.c for more
6937          details.  */
6938       for (i = VEC_length (basic_block, bbs_to_remove); i-- > 0; )
6939         delete_basic_block (VEC_index (basic_block, bbs_to_remove, i));
6940     }
6941
6942   /* Update the dominance information.  The immediate dominator may change only
6943      for blocks whose immediate dominator belongs to DF_IDOM:
6944
6945      Suppose that idom(X) = Y before removal of E and idom(X) != Y after the
6946      removal.  Let Z the arbitrary block such that idom(Z) = Y and
6947      Z dominates X after the removal.  Before removal, there exists a path P
6948      from Y to X that avoids Z.  Let F be the last edge on P that is
6949      removed, and let W = F->dest.  Before removal, idom(W) = Y (since Y
6950      dominates W, and because of P, Z does not dominate W), and W belongs to
6951      the dominance frontier of E.  Therefore, Y belongs to DF_IDOM.  */
6952   EXECUTE_IF_SET_IN_BITMAP (df_idom, 0, i, bi)
6953     {
6954       bb = BASIC_BLOCK (i);
6955       for (dbb = first_dom_son (CDI_DOMINATORS, bb);
6956            dbb;
6957            dbb = next_dom_son (CDI_DOMINATORS, dbb))
6958         VEC_safe_push (basic_block, heap, bbs_to_fix_dom, dbb);
6959     }
6960
6961   iterate_fix_dominators (CDI_DOMINATORS, bbs_to_fix_dom, true);
6962
6963   BITMAP_FREE (df);
6964   BITMAP_FREE (df_idom);
6965   VEC_free (basic_block, heap, bbs_to_remove);
6966   VEC_free (basic_block, heap, bbs_to_fix_dom);
6967 }
6968
6969 /* Purge dead EH edges from basic block BB.  */
6970
6971 bool
6972 gimple_purge_dead_eh_edges (basic_block bb)
6973 {
6974   bool changed = false;
6975   edge e;
6976   edge_iterator ei;
6977   gimple stmt = last_stmt (bb);
6978
6979   if (stmt && stmt_can_throw_internal (stmt))
6980     return false;
6981
6982   for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
6983     {
6984       if (e->flags & EDGE_EH)
6985         {
6986           remove_edge_and_dominated_blocks (e);
6987           changed = true;
6988         }
6989       else
6990         ei_next (&ei);
6991     }
6992
6993   return changed;
6994 }
6995
6996 bool
6997 gimple_purge_all_dead_eh_edges (const_bitmap blocks)
6998 {
6999   bool changed = false;
7000   unsigned i;
7001   bitmap_iterator bi;
7002
7003   EXECUTE_IF_SET_IN_BITMAP (blocks, 0, i, bi)
7004     {
7005       basic_block bb = BASIC_BLOCK (i);
7006
7007       /* Earlier gimple_purge_dead_eh_edges could have removed
7008          this basic block already.  */
7009       gcc_assert (bb || changed);
7010       if (bb != NULL)
7011         changed |= gimple_purge_dead_eh_edges (bb);
7012     }
7013
7014   return changed;
7015 }
7016
7017 /* This function is called whenever a new edge is created or
7018    redirected.  */
7019
7020 static void
7021 gimple_execute_on_growing_pred (edge e)
7022 {
7023   basic_block bb = e->dest;
7024
7025   if (!gimple_seq_empty_p (phi_nodes (bb)))
7026     reserve_phi_args_for_new_edge (bb);
7027 }
7028
7029 /* This function is called immediately before edge E is removed from
7030    the edge vector E->dest->preds.  */
7031
7032 static void
7033 gimple_execute_on_shrinking_pred (edge e)
7034 {
7035   if (!gimple_seq_empty_p (phi_nodes (e->dest)))
7036     remove_phi_args (e);
7037 }
7038
7039 /*---------------------------------------------------------------------------
7040   Helper functions for Loop versioning
7041   ---------------------------------------------------------------------------*/
7042
7043 /* Adjust phi nodes for 'first' basic block.  'second' basic block is a copy
7044    of 'first'. Both of them are dominated by 'new_head' basic block. When
7045    'new_head' was created by 'second's incoming edge it received phi arguments
7046    on the edge by split_edge(). Later, additional edge 'e' was created to
7047    connect 'new_head' and 'first'. Now this routine adds phi args on this
7048    additional edge 'e' that new_head to second edge received as part of edge
7049    splitting.  */
7050
7051 static void
7052 gimple_lv_adjust_loop_header_phi (basic_block first, basic_block second,
7053                                   basic_block new_head, edge e)
7054 {
7055   gimple phi1, phi2;
7056   gimple_stmt_iterator psi1, psi2;
7057   tree def;
7058   edge e2 = find_edge (new_head, second);
7059
7060   /* Because NEW_HEAD has been created by splitting SECOND's incoming
7061      edge, we should always have an edge from NEW_HEAD to SECOND.  */
7062   gcc_assert (e2 != NULL);
7063
7064   /* Browse all 'second' basic block phi nodes and add phi args to
7065      edge 'e' for 'first' head. PHI args are always in correct order.  */
7066
7067   for (psi2 = gsi_start_phis (second),
7068        psi1 = gsi_start_phis (first);
7069        !gsi_end_p (psi2) && !gsi_end_p (psi1);
7070        gsi_next (&psi2),  gsi_next (&psi1))
7071     {
7072       phi1 = gsi_stmt (psi1);
7073       phi2 = gsi_stmt (psi2);
7074       def = PHI_ARG_DEF (phi2, e2->dest_idx);
7075       add_phi_arg (phi1, def, e, gimple_phi_arg_location_from_edge (phi2, e2));
7076     }
7077 }
7078
7079
7080 /* Adds a if else statement to COND_BB with condition COND_EXPR.
7081    SECOND_HEAD is the destination of the THEN and FIRST_HEAD is
7082    the destination of the ELSE part.  */
7083
7084 static void
7085 gimple_lv_add_condition_to_bb (basic_block first_head ATTRIBUTE_UNUSED,
7086                                basic_block second_head ATTRIBUTE_UNUSED,
7087                                basic_block cond_bb, void *cond_e)
7088 {
7089   gimple_stmt_iterator gsi;
7090   gimple new_cond_expr;
7091   tree cond_expr = (tree) cond_e;
7092   edge e0;
7093
7094   /* Build new conditional expr */
7095   new_cond_expr = gimple_build_cond_from_tree (cond_expr,
7096                                                NULL_TREE, NULL_TREE);
7097
7098   /* Add new cond in cond_bb.  */
7099   gsi = gsi_last_bb (cond_bb);
7100   gsi_insert_after (&gsi, new_cond_expr, GSI_NEW_STMT);
7101
7102   /* Adjust edges appropriately to connect new head with first head
7103      as well as second head.  */
7104   e0 = single_succ_edge (cond_bb);
7105   e0->flags &= ~EDGE_FALLTHRU;
7106   e0->flags |= EDGE_FALSE_VALUE;
7107 }
7108
7109 struct cfg_hooks gimple_cfg_hooks = {
7110   "gimple",
7111   gimple_verify_flow_info,
7112   gimple_dump_bb,               /* dump_bb  */
7113   create_bb,                    /* create_basic_block  */
7114   gimple_redirect_edge_and_branch, /* redirect_edge_and_branch  */
7115   gimple_redirect_edge_and_branch_force, /* redirect_edge_and_branch_force  */
7116   gimple_can_remove_branch_p,   /* can_remove_branch_p  */
7117   remove_bb,                    /* delete_basic_block  */
7118   gimple_split_block,           /* split_block  */
7119   gimple_move_block_after,      /* move_block_after  */
7120   gimple_can_merge_blocks_p,    /* can_merge_blocks_p  */
7121   gimple_merge_blocks,          /* merge_blocks  */
7122   gimple_predict_edge,          /* predict_edge  */
7123   gimple_predicted_by_p,                /* predicted_by_p  */
7124   gimple_can_duplicate_bb_p,    /* can_duplicate_block_p  */
7125   gimple_duplicate_bb,          /* duplicate_block  */
7126   gimple_split_edge,            /* split_edge  */
7127   gimple_make_forwarder_block,  /* make_forward_block  */
7128   NULL,                         /* tidy_fallthru_edge  */
7129   gimple_block_ends_with_call_p,/* block_ends_with_call_p */
7130   gimple_block_ends_with_condjump_p, /* block_ends_with_condjump_p */
7131   gimple_flow_call_edges_add,     /* flow_call_edges_add */
7132   gimple_execute_on_growing_pred,       /* execute_on_growing_pred */
7133   gimple_execute_on_shrinking_pred, /* execute_on_shrinking_pred */
7134   gimple_duplicate_loop_to_header_edge, /* duplicate loop for trees */
7135   gimple_lv_add_condition_to_bb, /* lv_add_condition_to_bb */
7136   gimple_lv_adjust_loop_header_phi, /* lv_adjust_loop_header_phi*/
7137   extract_true_false_edges_from_block, /* extract_cond_bb_edges */
7138   flush_pending_stmts           /* flush_pending_stmts */
7139 };
7140
7141
7142 /* Split all critical edges.  */
7143
7144 static unsigned int
7145 split_critical_edges (void)
7146 {
7147   basic_block bb;
7148   edge e;
7149   edge_iterator ei;
7150
7151   /* split_edge can redirect edges out of SWITCH_EXPRs, which can get
7152      expensive.  So we want to enable recording of edge to CASE_LABEL_EXPR
7153      mappings around the calls to split_edge.  */
7154   start_recording_case_labels ();
7155   FOR_ALL_BB (bb)
7156     {
7157       FOR_EACH_EDGE (e, ei, bb->succs)
7158         {
7159           if (EDGE_CRITICAL_P (e) && !(e->flags & EDGE_ABNORMAL))
7160             split_edge (e);
7161           /* PRE inserts statements to edges and expects that
7162              since split_critical_edges was done beforehand, committing edge
7163              insertions will not split more edges.  In addition to critical
7164              edges we must split edges that have multiple successors and
7165              end by control flow statements, such as RESX.
7166              Go ahead and split them too.  This matches the logic in
7167              gimple_find_edge_insert_loc.  */
7168           else if ((!single_pred_p (e->dest)
7169                     || !gimple_seq_empty_p (phi_nodes (e->dest))
7170                     || e->dest == EXIT_BLOCK_PTR)
7171                    && e->src != ENTRY_BLOCK_PTR
7172                    && !(e->flags & EDGE_ABNORMAL))
7173             {
7174               gimple_stmt_iterator gsi;
7175
7176               gsi = gsi_last_bb (e->src);
7177               if (!gsi_end_p (gsi)
7178                   && stmt_ends_bb_p (gsi_stmt (gsi))
7179                   && (gimple_code (gsi_stmt (gsi)) != GIMPLE_RETURN
7180                       && !gimple_call_builtin_p (gsi_stmt (gsi),
7181                                                  BUILT_IN_RETURN)))
7182                 split_edge (e);
7183             }
7184         }
7185     }
7186   end_recording_case_labels ();
7187   return 0;
7188 }
7189
7190 struct gimple_opt_pass pass_split_crit_edges =
7191 {
7192  {
7193   GIMPLE_PASS,
7194   "crited",                          /* name */
7195   NULL,                          /* gate */
7196   split_critical_edges,          /* execute */
7197   NULL,                          /* sub */
7198   NULL,                          /* next */
7199   0,                             /* static_pass_number */
7200   TV_TREE_SPLIT_EDGES,           /* tv_id */
7201   PROP_cfg,                      /* properties required */
7202   PROP_no_crit_edges,            /* properties_provided */
7203   0,                             /* properties_destroyed */
7204   0,                             /* todo_flags_start */
7205   TODO_dump_func | TODO_verify_flow  /* todo_flags_finish */
7206  }
7207 };
7208
7209
7210 /* Build a ternary operation and gimplify it.  Emit code before GSI.
7211    Return the gimple_val holding the result.  */
7212
7213 tree
7214 gimplify_build3 (gimple_stmt_iterator *gsi, enum tree_code code,
7215                  tree type, tree a, tree b, tree c)
7216 {
7217   tree ret;
7218   location_t loc = gimple_location (gsi_stmt (*gsi));
7219
7220   ret = fold_build3_loc (loc, code, type, a, b, c);
7221   STRIP_NOPS (ret);
7222
7223   return force_gimple_operand_gsi (gsi, ret, true, NULL, true,
7224                                    GSI_SAME_STMT);
7225 }
7226
7227 /* Build a binary operation and gimplify it.  Emit code before GSI.
7228    Return the gimple_val holding the result.  */
7229
7230 tree
7231 gimplify_build2 (gimple_stmt_iterator *gsi, enum tree_code code,
7232                  tree type, tree a, tree b)
7233 {
7234   tree ret;
7235
7236   ret = fold_build2_loc (gimple_location (gsi_stmt (*gsi)), code, type, a, b);
7237   STRIP_NOPS (ret);
7238
7239   return force_gimple_operand_gsi (gsi, ret, true, NULL, true,
7240                                    GSI_SAME_STMT);
7241 }
7242
7243 /* Build a unary operation and gimplify it.  Emit code before GSI.
7244    Return the gimple_val holding the result.  */
7245
7246 tree
7247 gimplify_build1 (gimple_stmt_iterator *gsi, enum tree_code code, tree type,
7248                  tree a)
7249 {
7250   tree ret;
7251
7252   ret = fold_build1_loc (gimple_location (gsi_stmt (*gsi)), code, type, a);
7253   STRIP_NOPS (ret);
7254
7255   return force_gimple_operand_gsi (gsi, ret, true, NULL, true,
7256                                    GSI_SAME_STMT);
7257 }
7258
7259
7260 \f
7261 /* Emit return warnings.  */
7262
7263 static unsigned int
7264 execute_warn_function_return (void)
7265 {
7266   source_location location;
7267   gimple last;
7268   edge e;
7269   edge_iterator ei;
7270
7271   /* If we have a path to EXIT, then we do return.  */
7272   if (TREE_THIS_VOLATILE (cfun->decl)
7273       && EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0)
7274     {
7275       location = UNKNOWN_LOCATION;
7276       FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
7277         {
7278           last = last_stmt (e->src);
7279           if ((gimple_code (last) == GIMPLE_RETURN
7280                || gimple_call_builtin_p (last, BUILT_IN_RETURN))
7281               && (location = gimple_location (last)) != UNKNOWN_LOCATION)
7282             break;
7283         }
7284       if (location == UNKNOWN_LOCATION)
7285         location = cfun->function_end_locus;
7286       warning_at (location, 0, "%<noreturn%> function does return");
7287     }
7288
7289   /* If we see "return;" in some basic block, then we do reach the end
7290      without returning a value.  */
7291   else if (warn_return_type
7292            && !TREE_NO_WARNING (cfun->decl)
7293            && EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0
7294            && !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (cfun->decl))))
7295     {
7296       FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
7297         {
7298           gimple last = last_stmt (e->src);
7299           if (gimple_code (last) == GIMPLE_RETURN
7300               && gimple_return_retval (last) == NULL
7301               && !gimple_no_warning_p (last))
7302             {
7303               location = gimple_location (last);
7304               if (location == UNKNOWN_LOCATION)
7305                   location = cfun->function_end_locus;
7306               warning_at (location, OPT_Wreturn_type, "control reaches end of non-void function");
7307               TREE_NO_WARNING (cfun->decl) = 1;
7308               break;
7309             }
7310         }
7311     }
7312   return 0;
7313 }
7314
7315
7316 /* Given a basic block B which ends with a conditional and has
7317    precisely two successors, determine which of the edges is taken if
7318    the conditional is true and which is taken if the conditional is
7319    false.  Set TRUE_EDGE and FALSE_EDGE appropriately.  */
7320
7321 void
7322 extract_true_false_edges_from_block (basic_block b,
7323                                      edge *true_edge,
7324                                      edge *false_edge)
7325 {
7326   edge e = EDGE_SUCC (b, 0);
7327
7328   if (e->flags & EDGE_TRUE_VALUE)
7329     {
7330       *true_edge = e;
7331       *false_edge = EDGE_SUCC (b, 1);
7332     }
7333   else
7334     {
7335       *false_edge = e;
7336       *true_edge = EDGE_SUCC (b, 1);
7337     }
7338 }
7339
7340 struct gimple_opt_pass pass_warn_function_return =
7341 {
7342  {
7343   GIMPLE_PASS,
7344   "*warn_function_return",              /* name */
7345   NULL,                                 /* gate */
7346   execute_warn_function_return,         /* execute */
7347   NULL,                                 /* sub */
7348   NULL,                                 /* next */
7349   0,                                    /* static_pass_number */
7350   TV_NONE,                              /* tv_id */
7351   PROP_cfg,                             /* properties_required */
7352   0,                                    /* properties_provided */
7353   0,                                    /* properties_destroyed */
7354   0,                                    /* todo_flags_start */
7355   0                                     /* todo_flags_finish */
7356  }
7357 };
7358
7359 /* Emit noreturn warnings.  */
7360
7361 static unsigned int
7362 execute_warn_function_noreturn (void)
7363 {
7364   if (!TREE_THIS_VOLATILE (current_function_decl)
7365       && EDGE_COUNT (EXIT_BLOCK_PTR->preds) == 0)
7366     warn_function_noreturn (current_function_decl);
7367   return 0;
7368 }
7369
7370 static bool
7371 gate_warn_function_noreturn (void)
7372 {
7373   return warn_suggest_attribute_noreturn;
7374 }
7375
7376 struct gimple_opt_pass pass_warn_function_noreturn =
7377 {
7378  {
7379   GIMPLE_PASS,
7380   "*warn_function_noreturn",            /* name */
7381   gate_warn_function_noreturn,          /* gate */
7382   execute_warn_function_noreturn,       /* execute */
7383   NULL,                                 /* sub */
7384   NULL,                                 /* next */
7385   0,                                    /* static_pass_number */
7386   TV_NONE,                              /* tv_id */
7387   PROP_cfg,                             /* properties_required */
7388   0,                                    /* properties_provided */
7389   0,                                    /* properties_destroyed */
7390   0,                                    /* todo_flags_start */
7391   0                                     /* todo_flags_finish */
7392  }
7393 };
7394
7395
7396 /* Walk a gimplified function and warn for functions whose return value is
7397    ignored and attribute((warn_unused_result)) is set.  This is done before
7398    inlining, so we don't have to worry about that.  */
7399
7400 static void
7401 do_warn_unused_result (gimple_seq seq)
7402 {
7403   tree fdecl, ftype;
7404   gimple_stmt_iterator i;
7405
7406   for (i = gsi_start (seq); !gsi_end_p (i); gsi_next (&i))
7407     {
7408       gimple g = gsi_stmt (i);
7409
7410       switch (gimple_code (g))
7411         {
7412         case GIMPLE_BIND:
7413           do_warn_unused_result (gimple_bind_body (g));
7414           break;
7415         case GIMPLE_TRY:
7416           do_warn_unused_result (gimple_try_eval (g));
7417           do_warn_unused_result (gimple_try_cleanup (g));
7418           break;
7419         case GIMPLE_CATCH:
7420           do_warn_unused_result (gimple_catch_handler (g));
7421           break;
7422         case GIMPLE_EH_FILTER:
7423           do_warn_unused_result (gimple_eh_filter_failure (g));
7424           break;
7425
7426         case GIMPLE_CALL:
7427           if (gimple_call_lhs (g))
7428             break;
7429
7430           /* This is a naked call, as opposed to a GIMPLE_CALL with an
7431              LHS.  All calls whose value is ignored should be
7432              represented like this.  Look for the attribute.  */
7433           fdecl = gimple_call_fndecl (g);
7434           ftype = TREE_TYPE (TREE_TYPE (gimple_call_fn (g)));
7435
7436           if (lookup_attribute ("warn_unused_result", TYPE_ATTRIBUTES (ftype)))
7437             {
7438               location_t loc = gimple_location (g);
7439
7440               if (fdecl)
7441                 warning_at (loc, OPT_Wunused_result,
7442                             "ignoring return value of %qD, "
7443                             "declared with attribute warn_unused_result",
7444                             fdecl);
7445               else
7446                 warning_at (loc, OPT_Wunused_result,
7447                             "ignoring return value of function "
7448                             "declared with attribute warn_unused_result");
7449             }
7450           break;
7451
7452         default:
7453           /* Not a container, not a call, or a call whose value is used.  */
7454           break;
7455         }
7456     }
7457 }
7458
7459 static unsigned int
7460 run_warn_unused_result (void)
7461 {
7462   do_warn_unused_result (gimple_body (current_function_decl));
7463   return 0;
7464 }
7465
7466 static bool
7467 gate_warn_unused_result (void)
7468 {
7469   return flag_warn_unused_result;
7470 }
7471
7472 struct gimple_opt_pass pass_warn_unused_result =
7473 {
7474   {
7475     GIMPLE_PASS,
7476     "*warn_unused_result",              /* name */
7477     gate_warn_unused_result,            /* gate */
7478     run_warn_unused_result,             /* execute */
7479     NULL,                               /* sub */
7480     NULL,                               /* next */
7481     0,                                  /* static_pass_number */
7482     TV_NONE,                            /* tv_id */
7483     PROP_gimple_any,                    /* properties_required */
7484     0,                                  /* properties_provided */
7485     0,                                  /* properties_destroyed */
7486     0,                                  /* todo_flags_start */
7487     0,                                  /* todo_flags_finish */
7488   }
7489 };
7490