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