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