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