OSDN Git Service

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