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