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