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