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