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