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