1/* Control flow functions for trees.
2   Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006
3   Free Software Foundation, Inc.
4   Contributed by Diego Novillo <dnovillo@redhat.com>
5
6This file is part of GCC.
7
8GCC is free software; you can redistribute it and/or modify
9it under the terms of the GNU General Public License as published by
10the Free Software Foundation; either version 2, or (at your option)
11any later version.
12
13GCC is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
19along with GCC; see the file COPYING.  If not, write to
20the Free Software Foundation, 51 Franklin Street, Fifth Floor,
21Boston, MA 02110-1301, USA.  */
22
23#include "config.h"
24#include "system.h"
25#include "coretypes.h"
26#include "tm.h"
27#include "tree.h"
28#include "rtl.h"
29#include "tm_p.h"
30#include "hard-reg-set.h"
31#include "basic-block.h"
32#include "output.h"
33#include "flags.h"
34#include "function.h"
35#include "expr.h"
36#include "ggc.h"
37#include "langhooks.h"
38#include "diagnostic.h"
39#include "tree-flow.h"
40#include "timevar.h"
41#include "tree-dump.h"
42#include "tree-pass.h"
43#include "toplev.h"
44#include "except.h"
45#include "cfgloop.h"
46#include "cfglayout.h"
47#include "hashtab.h"
48#include "tree-ssa-propagate.h"
49
50/* This file contains functions for building the Control Flow Graph (CFG)
51   for a function tree.  */
52
53/* Local declarations.  */
54
55/* Initial capacity for the basic block array.  */
56static const int initial_cfg_capacity = 20;
57
58/* This hash table allows us to efficiently lookup all CASE_LABEL_EXPRs
59   which use a particular edge.  The CASE_LABEL_EXPRs are chained together
60   via their TREE_CHAIN field, which we clear after we're done with the
61   hash table to prevent problems with duplication of SWITCH_EXPRs.
62
63   Access to this list of CASE_LABEL_EXPRs allows us to efficiently
64   update the case vector in response to edge redirections.
65
66   Right now this table is set up and torn down at key points in the
67   compilation process.  It would be nice if we could make the table
68   more persistent.  The key is getting notification of changes to
69   the CFG (particularly edge removal, creation and redirection).  */
70
71struct edge_to_cases_elt
72{
73  /* The edge itself.  Necessary for hashing and equality tests.  */
74  edge e;
75
76  /* The case labels associated with this edge.  We link these up via
77     their TREE_CHAIN field, then we wipe out the TREE_CHAIN fields
78     when we destroy the hash table.  This prevents problems when copying
79     SWITCH_EXPRs.  */
80  tree case_labels;
81};
82
83static htab_t edge_to_cases;
84
85/* CFG statistics.  */
86struct cfg_stats_d
87{
88  long num_merged_labels;
89};
90
91static struct cfg_stats_d cfg_stats;
92
93/* Nonzero if we found a computed goto while building basic blocks.  */
94static bool found_computed_goto;
95
96/* Basic blocks and flowgraphs.  */
97static basic_block create_bb (void *, void *, basic_block);
98static void make_blocks (tree);
99static void factor_computed_gotos (void);
100
101/* Edges.  */
102static void make_edges (void);
103static void make_cond_expr_edges (basic_block);
104static void make_switch_expr_edges (basic_block);
105static void make_goto_expr_edges (basic_block);
106static edge tree_redirect_edge_and_branch (edge, basic_block);
107static edge tree_try_redirect_by_replacing_jump (edge, basic_block);
108static unsigned int split_critical_edges (void);
109
110/* Various helpers.  */
111static inline bool stmt_starts_bb_p (tree, tree);
112static int tree_verify_flow_info (void);
113static void tree_make_forwarder_block (edge);
114static void tree_cfg2vcg (FILE *);
115static inline void change_bb_for_stmt (tree t, basic_block bb);
116
117/* Flowgraph optimization and cleanup.  */
118static void tree_merge_blocks (basic_block, basic_block);
119static bool tree_can_merge_blocks_p (basic_block, basic_block);
120static void remove_bb (basic_block);
121static edge find_taken_edge_computed_goto (basic_block, tree);
122static edge find_taken_edge_cond_expr (basic_block, tree);
123static edge find_taken_edge_switch_expr (basic_block, tree);
124static tree find_case_label_for_value (tree, tree);
125
126void
127init_empty_tree_cfg (void)
128{
129  /* Initialize the basic block array.  */
130  init_flow ();
131  profile_status = PROFILE_ABSENT;
132  n_basic_blocks = NUM_FIXED_BLOCKS;
133  last_basic_block = NUM_FIXED_BLOCKS;
134  basic_block_info = VEC_alloc (basic_block, gc, initial_cfg_capacity);
135  VEC_safe_grow (basic_block, gc, basic_block_info, initial_cfg_capacity);
136  memset (VEC_address (basic_block, basic_block_info), 0,
137	  sizeof (basic_block) * initial_cfg_capacity);
138
139  /* Build a mapping of labels to their associated blocks.  */
140  label_to_block_map = VEC_alloc (basic_block, gc, initial_cfg_capacity);
141  VEC_safe_grow (basic_block, gc, label_to_block_map, initial_cfg_capacity);
142  memset (VEC_address (basic_block, label_to_block_map),
143	  0, sizeof (basic_block) * initial_cfg_capacity);
144
145  SET_BASIC_BLOCK (ENTRY_BLOCK, ENTRY_BLOCK_PTR);
146  SET_BASIC_BLOCK (EXIT_BLOCK, EXIT_BLOCK_PTR);
147  ENTRY_BLOCK_PTR->next_bb = EXIT_BLOCK_PTR;
148  EXIT_BLOCK_PTR->prev_bb = ENTRY_BLOCK_PTR;
149}
150
151/*---------------------------------------------------------------------------
152			      Create basic blocks
153---------------------------------------------------------------------------*/
154
155/* Entry point to the CFG builder for trees.  TP points to the list of
156   statements to be added to the flowgraph.  */
157
158static void
159build_tree_cfg (tree *tp)
160{
161  /* Register specific tree functions.  */
162  tree_register_cfg_hooks ();
163
164  memset ((void *) &cfg_stats, 0, sizeof (cfg_stats));
165
166  init_empty_tree_cfg ();
167
168  found_computed_goto = 0;
169  make_blocks (*tp);
170
171  /* Computed gotos are hell to deal with, especially if there are
172     lots of them with a large number of destinations.  So we factor
173     them to a common computed goto location before we build the
174     edge list.  After we convert back to normal form, we will un-factor
175     the computed gotos since factoring introduces an unwanted jump.  */
176  if (found_computed_goto)
177    factor_computed_gotos ();
178
179  /* Make sure there is always at least one block, even if it's empty.  */
180  if (n_basic_blocks == NUM_FIXED_BLOCKS)
181    create_empty_bb (ENTRY_BLOCK_PTR);
182
183  /* Adjust the size of the array.  */
184  if (VEC_length (basic_block, basic_block_info) < (size_t) n_basic_blocks)
185    {
186      size_t old_size = VEC_length (basic_block, basic_block_info);
187      basic_block *p;
188      VEC_safe_grow (basic_block, gc, basic_block_info, n_basic_blocks);
189      p = VEC_address (basic_block, basic_block_info);
190      memset (&p[old_size], 0,
191	      sizeof (basic_block) * (n_basic_blocks - old_size));
192    }
193
194  /* To speed up statement iterator walks, we first purge dead labels.  */
195  cleanup_dead_labels ();
196
197  /* Group case nodes to reduce the number of edges.
198     We do this after cleaning up dead labels because otherwise we miss
199     a lot of obvious case merging opportunities.  */
200  group_case_labels ();
201
202  /* Create the edges of the flowgraph.  */
203  make_edges ();
204
205  /* Debugging dumps.  */
206
207  /* Write the flowgraph to a VCG file.  */
208  {
209    int local_dump_flags;
210    FILE *vcg_file = dump_begin (TDI_vcg, &local_dump_flags);
211    if (vcg_file)
212      {
213	tree_cfg2vcg (vcg_file);
214	dump_end (TDI_vcg, vcg_file);
215      }
216  }
217
218#ifdef ENABLE_CHECKING
219  verify_stmts ();
220#endif
221
222  /* Dump a textual representation of the flowgraph.  */
223  if (dump_file)
224    dump_tree_cfg (dump_file, dump_flags);
225}
226
227static unsigned int
228execute_build_cfg (void)
229{
230  build_tree_cfg (&DECL_SAVED_TREE (current_function_decl));
231  return 0;
232}
233
234struct tree_opt_pass pass_build_cfg =
235{
236  "cfg",				/* name */
237  NULL,					/* gate */
238  execute_build_cfg,			/* execute */
239  NULL,					/* sub */
240  NULL,					/* next */
241  0,					/* static_pass_number */
242  TV_TREE_CFG,				/* tv_id */
243  PROP_gimple_leh,			/* properties_required */
244  PROP_cfg,				/* properties_provided */
245  0,					/* properties_destroyed */
246  0,					/* todo_flags_start */
247  TODO_verify_stmts,			/* todo_flags_finish */
248  0					/* letter */
249};
250
251/* Search the CFG for any computed gotos.  If found, factor them to a
252   common computed goto site.  Also record the location of that site so
253   that we can un-factor the gotos after we have converted back to
254   normal form.  */
255
256static void
257factor_computed_gotos (void)
258{
259  basic_block bb;
260  tree factored_label_decl = NULL;
261  tree var = NULL;
262  tree factored_computed_goto_label = NULL;
263  tree factored_computed_goto = NULL;
264
265  /* We know there are one or more computed gotos in this function.
266     Examine the last statement in each basic block to see if the block
267     ends with a computed goto.  */
268
269  FOR_EACH_BB (bb)
270    {
271      block_stmt_iterator bsi = bsi_last (bb);
272      tree last;
273
274      if (bsi_end_p (bsi))
275	continue;
276      last = bsi_stmt (bsi);
277
278      /* Ignore the computed goto we create when we factor the original
279	 computed gotos.  */
280      if (last == factored_computed_goto)
281	continue;
282
283      /* If the last statement is a computed goto, factor it.  */
284      if (computed_goto_p (last))
285	{
286	  tree assignment;
287
288	  /* The first time we find a computed goto we need to create
289	     the factored goto block and the variable each original
290	     computed goto will use for their goto destination.  */
291	  if (! factored_computed_goto)
292	    {
293	      basic_block new_bb = create_empty_bb (bb);
294	      block_stmt_iterator new_bsi = bsi_start (new_bb);
295
296	      /* Create the destination of the factored goto.  Each original
297		 computed goto will put its desired destination into this
298		 variable and jump to the label we create immediately
299		 below.  */
300	      var = create_tmp_var (ptr_type_node, "gotovar");
301
302	      /* Build a label for the new block which will contain the
303		 factored computed goto.  */
304	      factored_label_decl = create_artificial_label ();
305	      factored_computed_goto_label
306		= build1 (LABEL_EXPR, void_type_node, factored_label_decl);
307	      bsi_insert_after (&new_bsi, factored_computed_goto_label,
308				BSI_NEW_STMT);
309
310	      /* Build our new computed goto.  */
311	      factored_computed_goto = build1 (GOTO_EXPR, void_type_node, var);
312	      bsi_insert_after (&new_bsi, factored_computed_goto,
313				BSI_NEW_STMT);
314	    }
315
316	  /* Copy the original computed goto's destination into VAR.  */
317	  assignment = build2 (MODIFY_EXPR, ptr_type_node,
318			       var, GOTO_DESTINATION (last));
319	  bsi_insert_before (&bsi, assignment, BSI_SAME_STMT);
320
321	  /* And re-vector the computed goto to the new destination.  */
322	  GOTO_DESTINATION (last) = factored_label_decl;
323	}
324    }
325}
326
327
328/* Build a flowgraph for the statement_list STMT_LIST.  */
329
330static void
331make_blocks (tree stmt_list)
332{
333  tree_stmt_iterator i = tsi_start (stmt_list);
334  tree stmt = NULL;
335  bool start_new_block = true;
336  bool first_stmt_of_list = true;
337  basic_block bb = ENTRY_BLOCK_PTR;
338
339  while (!tsi_end_p (i))
340    {
341      tree prev_stmt;
342
343      prev_stmt = stmt;
344      stmt = tsi_stmt (i);
345
346      /* If the statement starts a new basic block or if we have determined
347	 in a previous pass that we need to create a new block for STMT, do
348	 so now.  */
349      if (start_new_block || stmt_starts_bb_p (stmt, prev_stmt))
350	{
351	  if (!first_stmt_of_list)
352	    stmt_list = tsi_split_statement_list_before (&i);
353	  bb = create_basic_block (stmt_list, NULL, bb);
354	  start_new_block = false;
355	}
356
357      /* Now add STMT to BB and create the subgraphs for special statement
358	 codes.  */
359      set_bb_for_stmt (stmt, bb);
360
361      if (computed_goto_p (stmt))
362	found_computed_goto = true;
363
364      /* If STMT is a basic block terminator, set START_NEW_BLOCK for the
365	 next iteration.  */
366      if (stmt_ends_bb_p (stmt))
367	start_new_block = true;
368
369      tsi_next (&i);
370      first_stmt_of_list = false;
371    }
372}
373
374
375/* Create and return a new empty basic block after bb AFTER.  */
376
377static basic_block
378create_bb (void *h, void *e, basic_block after)
379{
380  basic_block bb;
381
382  gcc_assert (!e);
383
384  /* Create and initialize a new basic block.  Since alloc_block uses
385     ggc_alloc_cleared to allocate a basic block, we do not have to
386     clear the newly allocated basic block here.  */
387  bb = alloc_block ();
388
389  bb->index = last_basic_block;
390  bb->flags = BB_NEW;
391  bb->stmt_list = h ? (tree) h : alloc_stmt_list ();
392
393  /* Add the new block to the linked list of blocks.  */
394  link_block (bb, after);
395
396  /* Grow the basic block array if needed.  */
397  if ((size_t) last_basic_block == VEC_length (basic_block, basic_block_info))
398    {
399      size_t old_size = VEC_length (basic_block, basic_block_info);
400      size_t new_size = last_basic_block + (last_basic_block + 3) / 4;
401      basic_block *p;
402      VEC_safe_grow (basic_block, gc, basic_block_info, new_size);
403      p = VEC_address (basic_block, basic_block_info);
404      memset (&p[old_size], 0, sizeof (basic_block) * (new_size - old_size));
405    }
406
407  /* Add the newly created block to the array.  */
408  SET_BASIC_BLOCK (last_basic_block, bb);
409
410  n_basic_blocks++;
411  last_basic_block++;
412
413  return bb;
414}
415
416
417/*---------------------------------------------------------------------------
418				 Edge creation
419---------------------------------------------------------------------------*/
420
421/* Fold COND_EXPR_COND of each COND_EXPR.  */
422
423void
424fold_cond_expr_cond (void)
425{
426  basic_block bb;
427
428  FOR_EACH_BB (bb)
429    {
430      tree stmt = last_stmt (bb);
431
432      if (stmt
433	  && TREE_CODE (stmt) == COND_EXPR)
434	{
435	  tree cond;
436	  bool zerop, onep;
437
438	  fold_defer_overflow_warnings ();
439	  cond = fold (COND_EXPR_COND (stmt));
440	  zerop = integer_zerop (cond);
441	  onep = integer_onep (cond);
442	  fold_undefer_overflow_warnings (((zerop || onep)
443					   && !TREE_NO_WARNING (stmt)),
444					  stmt,
445					  WARN_STRICT_OVERFLOW_CONDITIONAL);
446	  if (zerop)
447	    COND_EXPR_COND (stmt) = boolean_false_node;
448	  else if (onep)
449	    COND_EXPR_COND (stmt) = boolean_true_node;
450	}
451    }
452}
453
454/* Join all the blocks in the flowgraph.  */
455
456static void
457make_edges (void)
458{
459  basic_block bb;
460  struct omp_region *cur_region = NULL;
461
462  /* Create an edge from entry to the first block with executable
463     statements in it.  */
464  make_edge (ENTRY_BLOCK_PTR, BASIC_BLOCK (NUM_FIXED_BLOCKS), EDGE_FALLTHRU);
465
466  /* Traverse the basic block array placing edges.  */
467  FOR_EACH_BB (bb)
468    {
469      tree last = last_stmt (bb);
470      bool fallthru;
471
472      if (last)
473	{
474	  enum tree_code code = TREE_CODE (last);
475	  switch (code)
476	    {
477	    case GOTO_EXPR:
478	      make_goto_expr_edges (bb);
479	      fallthru = false;
480	      break;
481	    case RETURN_EXPR:
482	      make_edge (bb, EXIT_BLOCK_PTR, 0);
483	      fallthru = false;
484	      break;
485	    case COND_EXPR:
486	      make_cond_expr_edges (bb);
487	      fallthru = false;
488	      break;
489	    case SWITCH_EXPR:
490	      make_switch_expr_edges (bb);
491	      fallthru = false;
492	      break;
493	    case RESX_EXPR:
494	      make_eh_edges (last);
495	      fallthru = false;
496	      break;
497
498	    case CALL_EXPR:
499	      /* If this function receives a nonlocal goto, then we need to
500		 make edges from this call site to all the nonlocal goto
501		 handlers.  */
502	      if (tree_can_make_abnormal_goto (last))
503		make_abnormal_goto_edges (bb, true);
504
505	      /* If this statement has reachable exception handlers, then
506		 create abnormal edges to them.  */
507	      make_eh_edges (last);
508
509	      /* Some calls are known not to return.  */
510	      fallthru = !(call_expr_flags (last) & ECF_NORETURN);
511	      break;
512
513	    case MODIFY_EXPR:
514	      if (is_ctrl_altering_stmt (last))
515		{
516		  /* A MODIFY_EXPR may have a CALL_EXPR on its RHS and the
517		     CALL_EXPR may have an abnormal edge.  Search the RHS for
518		     this case and create any required edges.  */
519		  if (tree_can_make_abnormal_goto (last))
520		    make_abnormal_goto_edges (bb, true);
521
522		  make_eh_edges (last);
523		}
524	      fallthru = true;
525	      break;
526
527	    case OMP_PARALLEL:
528	    case OMP_FOR:
529	    case OMP_SINGLE:
530	    case OMP_MASTER:
531	    case OMP_ORDERED:
532	    case OMP_CRITICAL:
533	    case OMP_SECTION:
534	      cur_region = new_omp_region (bb, code, cur_region);
535	      fallthru = true;
536	      break;
537
538	    case OMP_SECTIONS:
539	      cur_region = new_omp_region (bb, code, cur_region);
540	      fallthru = false;
541	      break;
542
543	    case OMP_RETURN:
544	      /* In the case of an OMP_SECTION, the edge will go somewhere
545		 other than the next block.  This will be created later.  */
546	      cur_region->exit = bb;
547	      fallthru = cur_region->type != OMP_SECTION;
548	      cur_region = cur_region->outer;
549	      break;
550
551	    case OMP_CONTINUE:
552	      cur_region->cont = bb;
553	      switch (cur_region->type)
554		{
555		case OMP_FOR:
556		  /* ??? Technically there should be a some sort of loopback
557		     edge here, but it goes to a block that doesn't exist yet,
558		     and without it, updating the ssa form would be a real
559		     bear.  Fortunately, we don't yet do ssa before expanding
560		     these nodes.  */
561		  break;
562
563		case OMP_SECTIONS:
564		  /* Wire up the edges into and out of the nested sections.  */
565		  /* ??? Similarly wrt loopback.  */
566		  {
567		    struct omp_region *i;
568		    for (i = cur_region->inner; i ; i = i->next)
569		      {
570			gcc_assert (i->type == OMP_SECTION);
571			make_edge (cur_region->entry, i->entry, 0);
572			make_edge (i->exit, bb, EDGE_FALLTHRU);
573		      }
574		  }
575		  break;
576
577		default:
578		  gcc_unreachable ();
579		}
580	      fallthru = true;
581	      break;
582
583	    default:
584	      gcc_assert (!stmt_ends_bb_p (last));
585	      fallthru = true;
586	    }
587	}
588      else
589	fallthru = true;
590
591      if (fallthru)
592	make_edge (bb, bb->next_bb, EDGE_FALLTHRU);
593    }
594
595  if (root_omp_region)
596    free_omp_regions ();
597
598  /* Fold COND_EXPR_COND of each COND_EXPR.  */
599  fold_cond_expr_cond ();
600
601  /* Clean up the graph and warn for unreachable code.  */
602  cleanup_tree_cfg ();
603}
604
605
606/* Create the edges for a COND_EXPR starting at block BB.
607   At this point, both clauses must contain only simple gotos.  */
608
609static void
610make_cond_expr_edges (basic_block bb)
611{
612  tree entry = last_stmt (bb);
613  basic_block then_bb, else_bb;
614  tree then_label, else_label;
615  edge e;
616
617  gcc_assert (entry);
618  gcc_assert (TREE_CODE (entry) == COND_EXPR);
619
620  /* Entry basic blocks for each component.  */
621  then_label = GOTO_DESTINATION (COND_EXPR_THEN (entry));
622  else_label = GOTO_DESTINATION (COND_EXPR_ELSE (entry));
623  then_bb = label_to_block (then_label);
624  else_bb = label_to_block (else_label);
625
626  e = make_edge (bb, then_bb, EDGE_TRUE_VALUE);
627#ifdef USE_MAPPED_LOCATION
628  e->goto_locus = EXPR_LOCATION (COND_EXPR_THEN (entry));
629#else
630  e->goto_locus = EXPR_LOCUS (COND_EXPR_THEN (entry));
631#endif
632  e = make_edge (bb, else_bb, EDGE_FALSE_VALUE);
633  if (e)
634    {
635#ifdef USE_MAPPED_LOCATION
636      e->goto_locus = EXPR_LOCATION (COND_EXPR_ELSE (entry));
637#else
638      e->goto_locus = EXPR_LOCUS (COND_EXPR_ELSE (entry));
639#endif
640    }
641}
642
643/* Hashing routine for EDGE_TO_CASES.  */
644
645static hashval_t
646edge_to_cases_hash (const void *p)
647{
648  edge e = ((struct edge_to_cases_elt *)p)->e;
649
650  /* Hash on the edge itself (which is a pointer).  */
651  return htab_hash_pointer (e);
652}
653
654/* Equality routine for EDGE_TO_CASES, edges are unique, so testing
655   for equality is just a pointer comparison.  */
656
657static int
658edge_to_cases_eq (const void *p1, const void *p2)
659{
660  edge e1 = ((struct edge_to_cases_elt *)p1)->e;
661  edge e2 = ((struct edge_to_cases_elt *)p2)->e;
662
663  return e1 == e2;
664}
665
666/* Called for each element in the hash table (P) as we delete the
667   edge to cases hash table.
668
669   Clear all the TREE_CHAINs to prevent problems with copying of
670   SWITCH_EXPRs and structure sharing rules, then free the hash table
671   element.  */
672
673static void
674edge_to_cases_cleanup (void *p)
675{
676  struct edge_to_cases_elt *elt = (struct edge_to_cases_elt *) p;
677  tree t, next;
678
679  for (t = elt->case_labels; t; t = next)
680    {
681      next = TREE_CHAIN (t);
682      TREE_CHAIN (t) = NULL;
683    }
684  free (p);
685}
686
687/* Start recording information mapping edges to case labels.  */
688
689void
690start_recording_case_labels (void)
691{
692  gcc_assert (edge_to_cases == NULL);
693
694  edge_to_cases = htab_create (37,
695			       edge_to_cases_hash,
696			       edge_to_cases_eq,
697			       edge_to_cases_cleanup);
698}
699
700/* Return nonzero if we are recording information for case labels.  */
701
702static bool
703recording_case_labels_p (void)
704{
705  return (edge_to_cases != NULL);
706}
707
708/* Stop recording information mapping edges to case labels and
709   remove any information we have recorded.  */
710void
711end_recording_case_labels (void)
712{
713  htab_delete (edge_to_cases);
714  edge_to_cases = NULL;
715}
716
717/* Record that CASE_LABEL (a CASE_LABEL_EXPR) references edge E.  */
718
719static void
720record_switch_edge (edge e, tree case_label)
721{
722  struct edge_to_cases_elt *elt;
723  void **slot;
724
725  /* Build a hash table element so we can see if E is already
726     in the table.  */
727  elt = XNEW (struct edge_to_cases_elt);
728  elt->e = e;
729  elt->case_labels = case_label;
730
731  slot = htab_find_slot (edge_to_cases, elt, INSERT);
732
733  if (*slot == NULL)
734    {
735      /* E was not in the hash table.  Install E into the hash table.  */
736      *slot = (void *)elt;
737    }
738  else
739    {
740      /* E was already in the hash table.  Free ELT as we do not need it
741	 anymore.  */
742      free (elt);
743
744      /* Get the entry stored in the hash table.  */
745      elt = (struct edge_to_cases_elt *) *slot;
746
747      /* Add it to the chain of CASE_LABEL_EXPRs referencing E.  */
748      TREE_CHAIN (case_label) = elt->case_labels;
749      elt->case_labels = case_label;
750    }
751}
752
753/* If we are inside a {start,end}_recording_cases block, then return
754   a chain of CASE_LABEL_EXPRs from T which reference E.
755
756   Otherwise return NULL.  */
757
758static tree
759get_cases_for_edge (edge e, tree t)
760{
761  struct edge_to_cases_elt elt, *elt_p;
762  void **slot;
763  size_t i, n;
764  tree vec;
765
766  /* If we are not recording cases, then we do not have CASE_LABEL_EXPR
767     chains available.  Return NULL so the caller can detect this case.  */
768  if (!recording_case_labels_p ())
769    return NULL;
770
771restart:
772  elt.e = e;
773  elt.case_labels = NULL;
774  slot = htab_find_slot (edge_to_cases, &elt, NO_INSERT);
775
776  if (slot)
777    {
778      elt_p = (struct edge_to_cases_elt *)*slot;
779      return elt_p->case_labels;
780    }
781
782  /* If we did not find E in the hash table, then this must be the first
783     time we have been queried for information about E & T.  Add all the
784     elements from T to the hash table then perform the query again.  */
785
786  vec = SWITCH_LABELS (t);
787  n = TREE_VEC_LENGTH (vec);
788  for (i = 0; i < n; i++)
789    {
790      tree lab = CASE_LABEL (TREE_VEC_ELT (vec, i));
791      basic_block label_bb = label_to_block (lab);
792      record_switch_edge (find_edge (e->src, label_bb), TREE_VEC_ELT (vec, i));
793    }
794  goto restart;
795}
796
797/* Create the edges for a SWITCH_EXPR starting at block BB.
798   At this point, the switch body has been lowered and the
799   SWITCH_LABELS filled in, so this is in effect a multi-way branch.  */
800
801static void
802make_switch_expr_edges (basic_block bb)
803{
804  tree entry = last_stmt (bb);
805  size_t i, n;
806  tree vec;
807
808  vec = SWITCH_LABELS (entry);
809  n = TREE_VEC_LENGTH (vec);
810
811  for (i = 0; i < n; ++i)
812    {
813      tree lab = CASE_LABEL (TREE_VEC_ELT (vec, i));
814      basic_block label_bb = label_to_block (lab);
815      make_edge (bb, label_bb, 0);
816    }
817}
818
819
820/* Return the basic block holding label DEST.  */
821
822basic_block
823label_to_block_fn (struct function *ifun, tree dest)
824{
825  int uid = LABEL_DECL_UID (dest);
826
827  /* We would die hard when faced by an undefined label.  Emit a label to
828     the very first basic block.  This will hopefully make even the dataflow
829     and undefined variable warnings quite right.  */
830  if ((errorcount || sorrycount) && uid < 0)
831    {
832      block_stmt_iterator bsi =
833	bsi_start (BASIC_BLOCK (NUM_FIXED_BLOCKS));
834      tree stmt;
835
836      stmt = build1 (LABEL_EXPR, void_type_node, dest);
837      bsi_insert_before (&bsi, stmt, BSI_NEW_STMT);
838      uid = LABEL_DECL_UID (dest);
839    }
840  if (VEC_length (basic_block, ifun->cfg->x_label_to_block_map)
841      <= (unsigned int) uid)
842    return NULL;
843  return VEC_index (basic_block, ifun->cfg->x_label_to_block_map, uid);
844}
845
846/* Create edges for an abnormal goto statement at block BB.  If FOR_CALL
847   is true, the source statement is a CALL_EXPR instead of a GOTO_EXPR.  */
848
849void
850make_abnormal_goto_edges (basic_block bb, bool for_call)
851{
852  basic_block target_bb;
853  block_stmt_iterator bsi;
854
855  FOR_EACH_BB (target_bb)
856    for (bsi = bsi_start (target_bb); !bsi_end_p (bsi); bsi_next (&bsi))
857      {
858	tree target = bsi_stmt (bsi);
859
860	if (TREE_CODE (target) != LABEL_EXPR)
861	  break;
862
863	target = LABEL_EXPR_LABEL (target);
864
865	/* Make an edge to every label block that has been marked as a
866	   potential target for a computed goto or a non-local goto.  */
867	if ((FORCED_LABEL (target) && !for_call)
868	    || (DECL_NONLOCAL (target) && for_call))
869	  {
870	    make_edge (bb, target_bb, EDGE_ABNORMAL);
871	    break;
872	  }
873      }
874}
875
876/* Create edges for a goto statement at block BB.  */
877
878static void
879make_goto_expr_edges (basic_block bb)
880{
881  block_stmt_iterator last = bsi_last (bb);
882  tree goto_t = bsi_stmt (last);
883
884  /* A simple GOTO creates normal edges.  */
885  if (simple_goto_p (goto_t))
886    {
887      tree dest = GOTO_DESTINATION (goto_t);
888      edge e = make_edge (bb, label_to_block (dest), EDGE_FALLTHRU);
889#ifdef USE_MAPPED_LOCATION
890      e->goto_locus = EXPR_LOCATION (goto_t);
891#else
892      e->goto_locus = EXPR_LOCUS (goto_t);
893#endif
894      bsi_remove (&last, true);
895      return;
896    }
897
898  /* A computed GOTO creates abnormal edges.  */
899  make_abnormal_goto_edges (bb, false);
900}
901
902
903/*---------------------------------------------------------------------------
904			       Flowgraph analysis
905---------------------------------------------------------------------------*/
906
907/* Cleanup useless labels in basic blocks.  This is something we wish
908   to do early because it allows us to group case labels before creating
909   the edges for the CFG, and it speeds up block statement iterators in
910   all passes later on.
911   We only run this pass once, running it more than once is probably not
912   profitable.  */
913
914/* A map from basic block index to the leading label of that block.  */
915static tree *label_for_bb;
916
917/* Callback for for_each_eh_region.  Helper for cleanup_dead_labels.  */
918static void
919update_eh_label (struct eh_region *region)
920{
921  tree old_label = get_eh_region_tree_label (region);
922  if (old_label)
923    {
924      tree new_label;
925      basic_block bb = label_to_block (old_label);
926
927      /* ??? After optimizing, there may be EH regions with labels
928	 that have already been removed from the function body, so
929	 there is no basic block for them.  */
930      if (! bb)
931	return;
932
933      new_label = label_for_bb[bb->index];
934      set_eh_region_tree_label (region, new_label);
935    }
936}
937
938/* Given LABEL return the first label in the same basic block.  */
939static tree
940main_block_label (tree label)
941{
942  basic_block bb = label_to_block (label);
943
944  /* label_to_block possibly inserted undefined label into the chain.  */
945  if (!label_for_bb[bb->index])
946    label_for_bb[bb->index] = label;
947  return label_for_bb[bb->index];
948}
949
950/* Cleanup redundant labels.  This is a three-step process:
951     1) Find the leading label for each block.
952     2) Redirect all references to labels to the leading labels.
953     3) Cleanup all useless labels.  */
954
955void
956cleanup_dead_labels (void)
957{
958  basic_block bb;
959  label_for_bb = XCNEWVEC (tree, last_basic_block);
960
961  /* Find a suitable label for each block.  We use the first user-defined
962     label if there is one, or otherwise just the first label we see.  */
963  FOR_EACH_BB (bb)
964    {
965      block_stmt_iterator i;
966
967      for (i = bsi_start (bb); !bsi_end_p (i); bsi_next (&i))
968	{
969	  tree label, stmt = bsi_stmt (i);
970
971	  if (TREE_CODE (stmt) != LABEL_EXPR)
972	    break;
973
974	  label = LABEL_EXPR_LABEL (stmt);
975
976	  /* If we have not yet seen a label for the current block,
977	     remember this one and see if there are more labels.  */
978	  if (! label_for_bb[bb->index])
979	    {
980	      label_for_bb[bb->index] = label;
981	      continue;
982	    }
983
984	  /* If we did see a label for the current block already, but it
985	     is an artificially created label, replace it if the current
986	     label is a user defined label.  */
987	  if (! DECL_ARTIFICIAL (label)
988	      && DECL_ARTIFICIAL (label_for_bb[bb->index]))
989	    {
990	      label_for_bb[bb->index] = label;
991	      break;
992	    }
993	}
994    }
995
996  /* Now redirect all jumps/branches to the selected label.
997     First do so for each block ending in a control statement.  */
998  FOR_EACH_BB (bb)
999    {
1000      tree stmt = last_stmt (bb);
1001      if (!stmt)
1002	continue;
1003
1004      switch (TREE_CODE (stmt))
1005	{
1006	case COND_EXPR:
1007	  {
1008	    tree true_branch, false_branch;
1009
1010	    true_branch = COND_EXPR_THEN (stmt);
1011	    false_branch = COND_EXPR_ELSE (stmt);
1012
1013	    GOTO_DESTINATION (true_branch)
1014	      = main_block_label (GOTO_DESTINATION (true_branch));
1015	    GOTO_DESTINATION (false_branch)
1016	      = main_block_label (GOTO_DESTINATION (false_branch));
1017
1018	    break;
1019	  }
1020
1021	case SWITCH_EXPR:
1022	  {
1023	    size_t i;
1024	    tree vec = SWITCH_LABELS (stmt);
1025	    size_t n = TREE_VEC_LENGTH (vec);
1026
1027	    /* Replace all destination labels.  */
1028	    for (i = 0; i < n; ++i)
1029	      {
1030		tree elt = TREE_VEC_ELT (vec, i);
1031		tree label = main_block_label (CASE_LABEL (elt));
1032		CASE_LABEL (elt) = label;
1033	      }
1034	    break;
1035	  }
1036
1037	/* We have to handle GOTO_EXPRs until they're removed, and we don't
1038	   remove them until after we've created the CFG edges.  */
1039	case GOTO_EXPR:
1040          if (! computed_goto_p (stmt))
1041	    {
1042	      GOTO_DESTINATION (stmt)
1043		= main_block_label (GOTO_DESTINATION (stmt));
1044	      break;
1045	    }
1046
1047	default:
1048	  break;
1049      }
1050    }
1051
1052  for_each_eh_region (update_eh_label);
1053
1054/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \
1055  /* Finally, purge dead labels.  All user-defined labels, labels that
1056     can be the target of non-local gotos, labels which have their
1057     address taken and labels which have attributes or alignment are
1058     preserved.  */
1059/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \
1060  FOR_EACH_BB (bb)
1061    {
1062      block_stmt_iterator i;
1063      tree label_for_this_bb = label_for_bb[bb->index];
1064
1065      if (! label_for_this_bb)
1066	continue;
1067
1068      for (i = bsi_start (bb); !bsi_end_p (i); )
1069	{
1070	  tree label, stmt = bsi_stmt (i);
1071
1072	  if (TREE_CODE (stmt) != LABEL_EXPR)
1073	    break;
1074
1075	  label = LABEL_EXPR_LABEL (stmt);
1076
1077	  if (label == label_for_this_bb
1078	      || ! DECL_ARTIFICIAL (label)
1079/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \
1080	      || DECL_ATTRIBUTES (label)
1081	      || DECL_USER_ALIGN (label)
1082/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \
1083	      || DECL_NONLOCAL (label)
1084	      || FORCED_LABEL (label))
1085	    bsi_next (&i);
1086	  else
1087	    bsi_remove (&i, true);
1088	}
1089    }
1090
1091  free (label_for_bb);
1092}
1093
1094/* Look for blocks ending in a multiway branch (a SWITCH_EXPR in GIMPLE),
1095   and scan the sorted vector of cases.  Combine the ones jumping to the
1096   same label.
1097   Eg. three separate entries 1: 2: 3: become one entry 1..3:  */
1098
1099void
1100group_case_labels (void)
1101{
1102  basic_block bb;
1103
1104  FOR_EACH_BB (bb)
1105    {
1106      tree stmt = last_stmt (bb);
1107      if (stmt && TREE_CODE (stmt) == SWITCH_EXPR)
1108	{
1109	  tree labels = SWITCH_LABELS (stmt);
1110	  int old_size = TREE_VEC_LENGTH (labels);
1111	  int i, j, new_size = old_size;
1112	  tree default_case = TREE_VEC_ELT (labels, old_size - 1);
1113	  tree default_label;
1114
1115	  /* The default label is always the last case in a switch
1116	     statement after gimplification.  */
1117	  default_label = CASE_LABEL (default_case);
1118
1119	  /* Look for possible opportunities to merge cases.
1120	     Ignore the last element of the label vector because it
1121	     must be the default case.  */
1122          i = 0;
1123	  while (i < old_size - 1)
1124	    {
1125	      tree base_case, base_label, base_high;
1126	      base_case = TREE_VEC_ELT (labels, i);
1127
1128	      gcc_assert (base_case);
1129	      base_label = CASE_LABEL (base_case);
1130
1131	      /* Discard cases that have the same destination as the
1132		 default case.  */
1133	      if (base_label == default_label)
1134		{
1135		  TREE_VEC_ELT (labels, i) = NULL_TREE;
1136		  i++;
1137		  new_size--;
1138		  continue;
1139		}
1140
1141	      base_high = CASE_HIGH (base_case) ?
1142		CASE_HIGH (base_case) : CASE_LOW (base_case);
1143	      i++;
1144	      /* Try to merge case labels.  Break out when we reach the end
1145		 of the label vector or when we cannot merge the next case
1146		 label with the current one.  */
1147	      while (i < old_size - 1)
1148		{
1149		  tree merge_case = TREE_VEC_ELT (labels, i);
1150	          tree merge_label = CASE_LABEL (merge_case);
1151		  tree t = int_const_binop (PLUS_EXPR, base_high,
1152					    integer_one_node, 1);
1153
1154		  /* Merge the cases if they jump to the same place,
1155		     and their ranges are consecutive.  */
1156		  if (merge_label == base_label
1157		      && tree_int_cst_equal (CASE_LOW (merge_case), t))
1158		    {
1159		      base_high = CASE_HIGH (merge_case) ?
1160			CASE_HIGH (merge_case) : CASE_LOW (merge_case);
1161		      CASE_HIGH (base_case) = base_high;
1162		      TREE_VEC_ELT (labels, i) = NULL_TREE;
1163		      new_size--;
1164		      i++;
1165		    }
1166		  else
1167		    break;
1168		}
1169	    }
1170
1171	  /* Compress the case labels in the label vector, and adjust the
1172	     length of the vector.  */
1173	  for (i = 0, j = 0; i < new_size; i++)
1174	    {
1175	      while (! TREE_VEC_ELT (labels, j))
1176		j++;
1177	      TREE_VEC_ELT (labels, i) = TREE_VEC_ELT (labels, j++);
1178	    }
1179	  TREE_VEC_LENGTH (labels) = new_size;
1180	}
1181    }
1182}
1183
1184/* Checks whether we can merge block B into block A.  */
1185
1186static bool
1187tree_can_merge_blocks_p (basic_block a, basic_block b)
1188{
1189  tree stmt;
1190  block_stmt_iterator bsi;
1191  tree phi;
1192
1193  if (!single_succ_p (a))
1194    return false;
1195
1196  if (single_succ_edge (a)->flags & EDGE_ABNORMAL)
1197    return false;
1198
1199  if (single_succ (a) != b)
1200    return false;
1201
1202  if (!single_pred_p (b))
1203    return false;
1204
1205  if (b == EXIT_BLOCK_PTR)
1206    return false;
1207
1208  /* If A ends by a statement causing exceptions or something similar, we
1209     cannot merge the blocks.  */
1210  stmt = last_stmt (a);
1211  if (stmt && stmt_ends_bb_p (stmt))
1212    return false;
1213
1214  /* Do not allow a block with only a non-local label to be merged.  */
1215  if (stmt && TREE_CODE (stmt) == LABEL_EXPR
1216      && DECL_NONLOCAL (LABEL_EXPR_LABEL (stmt)))
1217    return false;
1218
1219  /* It must be possible to eliminate all phi nodes in B.  If ssa form
1220     is not up-to-date, we cannot eliminate any phis.  */
1221  phi = phi_nodes (b);
1222  if (phi)
1223    {
1224      if (need_ssa_update_p ())
1225	return false;
1226
1227      for (; phi; phi = PHI_CHAIN (phi))
1228	if (!is_gimple_reg (PHI_RESULT (phi))
1229	    && !may_propagate_copy (PHI_RESULT (phi), PHI_ARG_DEF (phi, 0)))
1230	  return false;
1231    }
1232
1233  /* Do not remove user labels.  */
1234  for (bsi = bsi_start (b); !bsi_end_p (bsi); bsi_next (&bsi))
1235    {
1236      stmt = bsi_stmt (bsi);
1237      if (TREE_CODE (stmt) != LABEL_EXPR)
1238	break;
1239      if (!DECL_ARTIFICIAL (LABEL_EXPR_LABEL (stmt)))
1240	return false;
1241    }
1242
1243  /* Protect the loop latches.  */
1244  if (current_loops
1245      && b->loop_father->latch == b)
1246    return false;
1247
1248  return true;
1249}
1250
1251/* Replaces all uses of NAME by VAL.  */
1252
1253void
1254replace_uses_by (tree name, tree val)
1255{
1256  imm_use_iterator imm_iter;
1257  use_operand_p use;
1258  tree stmt;
1259  edge e;
1260  unsigned i;
1261
1262
1263  FOR_EACH_IMM_USE_STMT (stmt, imm_iter, name)
1264    {
1265      FOR_EACH_IMM_USE_ON_STMT (use, imm_iter)
1266        {
1267	  replace_exp (use, val);
1268
1269	  if (TREE_CODE (stmt) == PHI_NODE)
1270	    {
1271	      e = PHI_ARG_EDGE (stmt, PHI_ARG_INDEX_FROM_USE (use));
1272	      if (e->flags & EDGE_ABNORMAL)
1273		{
1274		  /* This can only occur for virtual operands, since
1275		     for the real ones SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name))
1276		     would prevent replacement.  */
1277		  gcc_assert (!is_gimple_reg (name));
1278		  SSA_NAME_OCCURS_IN_ABNORMAL_PHI (val) = 1;
1279		}
1280	    }
1281	}
1282      if (TREE_CODE (stmt) != PHI_NODE)
1283	{
1284	  tree rhs;
1285
1286	  fold_stmt_inplace (stmt);
1287	  rhs = get_rhs (stmt);
1288	  if (TREE_CODE (rhs) == ADDR_EXPR)
1289	    recompute_tree_invariant_for_addr_expr (rhs);
1290
1291	  maybe_clean_or_replace_eh_stmt (stmt, stmt);
1292	  mark_new_vars_to_rename (stmt);
1293	}
1294    }
1295
1296  gcc_assert (num_imm_uses (name) == 0);
1297
1298  /* Also update the trees stored in loop structures.  */
1299  if (current_loops)
1300    {
1301      struct loop *loop;
1302
1303      for (i = 0; i < current_loops->num; i++)
1304	{
1305	  loop = current_loops->parray[i];
1306	  if (loop)
1307	    substitute_in_loop_info (loop, name, val);
1308	}
1309    }
1310}
1311
1312/* Merge block B into block A.  */
1313
1314static void
1315tree_merge_blocks (basic_block a, basic_block b)
1316{
1317  block_stmt_iterator bsi;
1318  tree_stmt_iterator last;
1319  tree phi;
1320
1321  if (dump_file)
1322    fprintf (dump_file, "Merging blocks %d and %d\n", a->index, b->index);
1323
1324  /* Remove all single-valued PHI nodes from block B of the form
1325     V_i = PHI <V_j> by propagating V_j to all the uses of V_i.  */
1326  bsi = bsi_last (a);
1327  for (phi = phi_nodes (b); phi; phi = phi_nodes (b))
1328    {
1329      tree def = PHI_RESULT (phi), use = PHI_ARG_DEF (phi, 0);
1330      tree copy;
1331      bool may_replace_uses = may_propagate_copy (def, use);
1332
1333      /* In case we have loops to care about, do not propagate arguments of
1334	 loop closed ssa phi nodes.  */
1335      if (current_loops
1336	  && is_gimple_reg (def)
1337	  && TREE_CODE (use) == SSA_NAME
1338	  && a->loop_father != b->loop_father)
1339	may_replace_uses = false;
1340
1341      if (!may_replace_uses)
1342	{
1343	  gcc_assert (is_gimple_reg (def));
1344
1345	  /* Note that just emitting the copies is fine -- there is no problem
1346	     with ordering of phi nodes.  This is because A is the single
1347	     predecessor of B, therefore results of the phi nodes cannot
1348	     appear as arguments of the phi nodes.  */
1349	  copy = build2 (MODIFY_EXPR, void_type_node, def, use);
1350	  bsi_insert_after (&bsi, copy, BSI_NEW_STMT);
1351	  SET_PHI_RESULT (phi, NULL_TREE);
1352	  SSA_NAME_DEF_STMT (def) = copy;
1353	}
1354      else
1355	replace_uses_by (def, use);
1356
1357      remove_phi_node (phi, NULL);
1358    }
1359
1360  /* Ensure that B follows A.  */
1361  move_block_after (b, a);
1362
1363  gcc_assert (single_succ_edge (a)->flags & EDGE_FALLTHRU);
1364  gcc_assert (!last_stmt (a) || !stmt_ends_bb_p (last_stmt (a)));
1365
1366  /* Remove labels from B and set bb_for_stmt to A for other statements.  */
1367  for (bsi = bsi_start (b); !bsi_end_p (bsi);)
1368    {
1369      if (TREE_CODE (bsi_stmt (bsi)) == LABEL_EXPR)
1370	{
1371	  tree label = bsi_stmt (bsi);
1372
1373	  bsi_remove (&bsi, false);
1374	  /* Now that we can thread computed gotos, we might have
1375	     a situation where we have a forced label in block B
1376	     However, the label at the start of block B might still be
1377	     used in other ways (think about the runtime checking for
1378	     Fortran assigned gotos).  So we can not just delete the
1379	     label.  Instead we move the label to the start of block A.  */
1380	  if (FORCED_LABEL (LABEL_EXPR_LABEL (label)))
1381	    {
1382	      block_stmt_iterator dest_bsi = bsi_start (a);
1383	      bsi_insert_before (&dest_bsi, label, BSI_NEW_STMT);
1384	    }
1385	}
1386      else
1387	{
1388	  change_bb_for_stmt (bsi_stmt (bsi), a);
1389	  bsi_next (&bsi);
1390	}
1391    }
1392
1393  /* Merge the chains.  */
1394  last = tsi_last (a->stmt_list);
1395  tsi_link_after (&last, b->stmt_list, TSI_NEW_STMT);
1396  b->stmt_list = NULL;
1397}
1398
1399
1400/* Return the one of two successors of BB that is not reachable by a
1401   reached by a complex edge, if there is one.  Else, return BB.  We use
1402   this in optimizations that use post-dominators for their heuristics,
1403   to catch the cases in C++ where function calls are involved.  */
1404
1405basic_block
1406single_noncomplex_succ (basic_block bb)
1407{
1408  edge e0, e1;
1409  if (EDGE_COUNT (bb->succs) != 2)
1410    return bb;
1411
1412  e0 = EDGE_SUCC (bb, 0);
1413  e1 = EDGE_SUCC (bb, 1);
1414  if (e0->flags & EDGE_COMPLEX)
1415    return e1->dest;
1416  if (e1->flags & EDGE_COMPLEX)
1417    return e0->dest;
1418
1419  return bb;
1420}
1421
1422
1423/* Walk the function tree removing unnecessary statements.
1424
1425     * Empty statement nodes are removed
1426
1427     * Unnecessary TRY_FINALLY and TRY_CATCH blocks are removed
1428
1429     * Unnecessary COND_EXPRs are removed
1430
1431     * Some unnecessary BIND_EXPRs are removed
1432
1433   Clearly more work could be done.  The trick is doing the analysis
1434   and removal fast enough to be a net improvement in compile times.
1435
1436   Note that when we remove a control structure such as a COND_EXPR
1437   BIND_EXPR, or TRY block, we will need to repeat this optimization pass
1438   to ensure we eliminate all the useless code.  */
1439
1440struct rus_data
1441{
1442  tree *last_goto;
1443  bool repeat;
1444  bool may_throw;
1445  bool may_branch;
1446  bool has_label;
1447};
1448
1449static void remove_useless_stmts_1 (tree *, struct rus_data *);
1450
1451static bool
1452remove_useless_stmts_warn_notreached (tree stmt)
1453{
1454  if (EXPR_HAS_LOCATION (stmt))
1455    {
1456      location_t loc = EXPR_LOCATION (stmt);
1457      if (LOCATION_LINE (loc) > 0)
1458	{
1459	  warning (0, "%Hwill never be executed", &loc);
1460	  return true;
1461	}
1462    }
1463
1464  switch (TREE_CODE (stmt))
1465    {
1466    case STATEMENT_LIST:
1467      {
1468	tree_stmt_iterator i;
1469	for (i = tsi_start (stmt); !tsi_end_p (i); tsi_next (&i))
1470	  if (remove_useless_stmts_warn_notreached (tsi_stmt (i)))
1471	    return true;
1472      }
1473      break;
1474
1475    case COND_EXPR:
1476      if (remove_useless_stmts_warn_notreached (COND_EXPR_COND (stmt)))
1477	return true;
1478      if (remove_useless_stmts_warn_notreached (COND_EXPR_THEN (stmt)))
1479	return true;
1480      if (remove_useless_stmts_warn_notreached (COND_EXPR_ELSE (stmt)))
1481	return true;
1482      break;
1483
1484    case TRY_FINALLY_EXPR:
1485    case TRY_CATCH_EXPR:
1486      if (remove_useless_stmts_warn_notreached (TREE_OPERAND (stmt, 0)))
1487	return true;
1488      if (remove_useless_stmts_warn_notreached (TREE_OPERAND (stmt, 1)))
1489	return true;
1490      break;
1491
1492    case CATCH_EXPR:
1493      return remove_useless_stmts_warn_notreached (CATCH_BODY (stmt));
1494    case EH_FILTER_EXPR:
1495      return remove_useless_stmts_warn_notreached (EH_FILTER_FAILURE (stmt));
1496    case BIND_EXPR:
1497      return remove_useless_stmts_warn_notreached (BIND_EXPR_BLOCK (stmt));
1498
1499    default:
1500      /* Not a live container.  */
1501      break;
1502    }
1503
1504  return false;
1505}
1506
1507static void
1508remove_useless_stmts_cond (tree *stmt_p, struct rus_data *data)
1509{
1510  tree then_clause, else_clause, cond;
1511  bool save_has_label, then_has_label, else_has_label;
1512
1513  save_has_label = data->has_label;
1514  data->has_label = false;
1515  data->last_goto = NULL;
1516
1517  remove_useless_stmts_1 (&COND_EXPR_THEN (*stmt_p), data);
1518
1519  then_has_label = data->has_label;
1520  data->has_label = false;
1521  data->last_goto = NULL;
1522
1523  remove_useless_stmts_1 (&COND_EXPR_ELSE (*stmt_p), data);
1524
1525  else_has_label = data->has_label;
1526  data->has_label = save_has_label | then_has_label | else_has_label;
1527
1528  then_clause = COND_EXPR_THEN (*stmt_p);
1529  else_clause = COND_EXPR_ELSE (*stmt_p);
1530  cond = fold (COND_EXPR_COND (*stmt_p));
1531
1532  /* If neither arm does anything at all, we can remove the whole IF.  */
1533  if (!TREE_SIDE_EFFECTS (then_clause) && !TREE_SIDE_EFFECTS (else_clause))
1534    {
1535      *stmt_p = build_empty_stmt ();
1536      data->repeat = true;
1537    }
1538
1539  /* If there are no reachable statements in an arm, then we can
1540     zap the entire conditional.  */
1541  else if (integer_nonzerop (cond) && !else_has_label)
1542    {
1543      if (warn_notreached)
1544	remove_useless_stmts_warn_notreached (else_clause);
1545      *stmt_p = then_clause;
1546      data->repeat = true;
1547    }
1548  else if (integer_zerop (cond) && !then_has_label)
1549    {
1550      if (warn_notreached)
1551	remove_useless_stmts_warn_notreached (then_clause);
1552      *stmt_p = else_clause;
1553      data->repeat = true;
1554    }
1555
1556  /* Check a couple of simple things on then/else with single stmts.  */
1557  else
1558    {
1559      tree then_stmt = expr_only (then_clause);
1560      tree else_stmt = expr_only (else_clause);
1561
1562      /* Notice branches to a common destination.  */
1563      if (then_stmt && else_stmt
1564	  && TREE_CODE (then_stmt) == GOTO_EXPR
1565	  && TREE_CODE (else_stmt) == GOTO_EXPR
1566	  && (GOTO_DESTINATION (then_stmt) == GOTO_DESTINATION (else_stmt)))
1567	{
1568	  *stmt_p = then_stmt;
1569	  data->repeat = true;
1570	}
1571
1572      /* If the THEN/ELSE clause merely assigns a value to a variable or
1573	 parameter which is already known to contain that value, then
1574	 remove the useless THEN/ELSE clause.  */
1575      else if (TREE_CODE (cond) == VAR_DECL || TREE_CODE (cond) == PARM_DECL)
1576	{
1577	  if (else_stmt
1578	      && TREE_CODE (else_stmt) == MODIFY_EXPR
1579	      && TREE_OPERAND (else_stmt, 0) == cond
1580	      && integer_zerop (TREE_OPERAND (else_stmt, 1)))
1581	    COND_EXPR_ELSE (*stmt_p) = alloc_stmt_list ();
1582	}
1583      else if ((TREE_CODE (cond) == EQ_EXPR || TREE_CODE (cond) == NE_EXPR)
1584	       && (TREE_CODE (TREE_OPERAND (cond, 0)) == VAR_DECL
1585		   || TREE_CODE (TREE_OPERAND (cond, 0)) == PARM_DECL)
1586	       && TREE_CONSTANT (TREE_OPERAND (cond, 1)))
1587	{
1588	  tree stmt = (TREE_CODE (cond) == EQ_EXPR
1589		       ? then_stmt : else_stmt);
1590	  tree *location = (TREE_CODE (cond) == EQ_EXPR
1591			    ? &COND_EXPR_THEN (*stmt_p)
1592			    : &COND_EXPR_ELSE (*stmt_p));
1593
1594	  if (stmt
1595	      && TREE_CODE (stmt) == MODIFY_EXPR
1596	      && TREE_OPERAND (stmt, 0) == TREE_OPERAND (cond, 0)
1597	      && TREE_OPERAND (stmt, 1) == TREE_OPERAND (cond, 1))
1598	    *location = alloc_stmt_list ();
1599	}
1600    }
1601
1602  /* Protect GOTOs in the arm of COND_EXPRs from being removed.  They
1603     would be re-introduced during lowering.  */
1604  data->last_goto = NULL;
1605}
1606
1607
1608static void
1609remove_useless_stmts_tf (tree *stmt_p, struct rus_data *data)
1610{
1611  bool save_may_branch, save_may_throw;
1612  bool this_may_branch, this_may_throw;
1613
1614  /* Collect may_branch and may_throw information for the body only.  */
1615  save_may_branch = data->may_branch;
1616  save_may_throw = data->may_throw;
1617  data->may_branch = false;
1618  data->may_throw = false;
1619  data->last_goto = NULL;
1620
1621  remove_useless_stmts_1 (&TREE_OPERAND (*stmt_p, 0), data);
1622
1623  this_may_branch = data->may_branch;
1624  this_may_throw = data->may_throw;
1625  data->may_branch |= save_may_branch;
1626  data->may_throw |= save_may_throw;
1627  data->last_goto = NULL;
1628
1629  remove_useless_stmts_1 (&TREE_OPERAND (*stmt_p, 1), data);
1630
1631  /* If the body is empty, then we can emit the FINALLY block without
1632     the enclosing TRY_FINALLY_EXPR.  */
1633  if (!TREE_SIDE_EFFECTS (TREE_OPERAND (*stmt_p, 0)))
1634    {
1635      *stmt_p = TREE_OPERAND (*stmt_p, 1);
1636      data->repeat = true;
1637    }
1638
1639  /* If the handler is empty, then we can emit the TRY block without
1640     the enclosing TRY_FINALLY_EXPR.  */
1641  else if (!TREE_SIDE_EFFECTS (TREE_OPERAND (*stmt_p, 1)))
1642    {
1643      *stmt_p = TREE_OPERAND (*stmt_p, 0);
1644      data->repeat = true;
1645    }
1646
1647  /* If the body neither throws, nor branches, then we can safely
1648     string the TRY and FINALLY blocks together.  */
1649  else if (!this_may_branch && !this_may_throw)
1650    {
1651      tree stmt = *stmt_p;
1652      *stmt_p = TREE_OPERAND (stmt, 0);
1653      append_to_statement_list (TREE_OPERAND (stmt, 1), stmt_p);
1654      data->repeat = true;
1655    }
1656}
1657
1658
1659static void
1660remove_useless_stmts_tc (tree *stmt_p, struct rus_data *data)
1661{
1662  bool save_may_throw, this_may_throw;
1663  tree_stmt_iterator i;
1664  tree stmt;
1665
1666  /* Collect may_throw information for the body only.  */
1667  save_may_throw = data->may_throw;
1668  data->may_throw = false;
1669  data->last_goto = NULL;
1670
1671  remove_useless_stmts_1 (&TREE_OPERAND (*stmt_p, 0), data);
1672
1673  this_may_throw = data->may_throw;
1674  data->may_throw = save_may_throw;
1675
1676  /* If the body cannot throw, then we can drop the entire TRY_CATCH_EXPR.  */
1677  if (!this_may_throw)
1678    {
1679      if (warn_notreached)
1680	remove_useless_stmts_warn_notreached (TREE_OPERAND (*stmt_p, 1));
1681      *stmt_p = TREE_OPERAND (*stmt_p, 0);
1682      data->repeat = true;
1683      return;
1684    }
1685
1686  /* Process the catch clause specially.  We may be able to tell that
1687     no exceptions propagate past this point.  */
1688
1689  this_may_throw = true;
1690  i = tsi_start (TREE_OPERAND (*stmt_p, 1));
1691  stmt = tsi_stmt (i);
1692  data->last_goto = NULL;
1693
1694  switch (TREE_CODE (stmt))
1695    {
1696    case CATCH_EXPR:
1697      for (; !tsi_end_p (i); tsi_next (&i))
1698	{
1699	  stmt = tsi_stmt (i);
1700	  /* If we catch all exceptions, then the body does not
1701	     propagate exceptions past this point.  */
1702	  if (CATCH_TYPES (stmt) == NULL)
1703	    this_may_throw = false;
1704	  data->last_goto = NULL;
1705	  remove_useless_stmts_1 (&CATCH_BODY (stmt), data);
1706	}
1707      break;
1708
1709    case EH_FILTER_EXPR:
1710      if (EH_FILTER_MUST_NOT_THROW (stmt))
1711	this_may_throw = false;
1712      else if (EH_FILTER_TYPES (stmt) == NULL)
1713	this_may_throw = false;
1714      remove_useless_stmts_1 (&EH_FILTER_FAILURE (stmt), data);
1715      break;
1716
1717    default:
1718      /* Otherwise this is a cleanup.  */
1719      remove_useless_stmts_1 (&TREE_OPERAND (*stmt_p, 1), data);
1720
1721      /* If the cleanup is empty, then we can emit the TRY block without
1722	 the enclosing TRY_CATCH_EXPR.  */
1723      if (!TREE_SIDE_EFFECTS (TREE_OPERAND (*stmt_p, 1)))
1724	{
1725	  *stmt_p = TREE_OPERAND (*stmt_p, 0);
1726	  data->repeat = true;
1727	}
1728      break;
1729    }
1730  data->may_throw |= this_may_throw;
1731}
1732
1733
1734static void
1735remove_useless_stmts_bind (tree *stmt_p, struct rus_data *data)
1736{
1737  tree block;
1738
1739  /* First remove anything underneath the BIND_EXPR.  */
1740  remove_useless_stmts_1 (&BIND_EXPR_BODY (*stmt_p), data);
1741
1742  /* If the BIND_EXPR has no variables, then we can pull everything
1743     up one level and remove the BIND_EXPR, unless this is the toplevel
1744     BIND_EXPR for the current function or an inlined function.
1745
1746     When this situation occurs we will want to apply this
1747     optimization again.  */
1748  block = BIND_EXPR_BLOCK (*stmt_p);
1749  if (BIND_EXPR_VARS (*stmt_p) == NULL_TREE
1750      && *stmt_p != DECL_SAVED_TREE (current_function_decl)
1751      && (! block
1752	  || ! BLOCK_ABSTRACT_ORIGIN (block)
1753	  || (TREE_CODE (BLOCK_ABSTRACT_ORIGIN (block))
1754	      != FUNCTION_DECL)))
1755    {
1756      *stmt_p = BIND_EXPR_BODY (*stmt_p);
1757      data->repeat = true;
1758    }
1759}
1760
1761
1762static void
1763remove_useless_stmts_goto (tree *stmt_p, struct rus_data *data)
1764{
1765  tree dest = GOTO_DESTINATION (*stmt_p);
1766
1767  data->may_branch = true;
1768  data->last_goto = NULL;
1769
1770  /* Record the last goto expr, so that we can delete it if unnecessary.  */
1771  if (TREE_CODE (dest) == LABEL_DECL)
1772    data->last_goto = stmt_p;
1773}
1774
1775
1776static void
1777remove_useless_stmts_label (tree *stmt_p, struct rus_data *data)
1778{
1779  tree label = LABEL_EXPR_LABEL (*stmt_p);
1780
1781  data->has_label = true;
1782
1783  /* We do want to jump across non-local label receiver code.  */
1784  if (DECL_NONLOCAL (label))
1785    data->last_goto = NULL;
1786
1787  else if (data->last_goto && GOTO_DESTINATION (*data->last_goto) == label)
1788    {
1789      *data->last_goto = build_empty_stmt ();
1790      data->repeat = true;
1791    }
1792
1793  /* ??? Add something here to delete unused labels.  */
1794}
1795
1796
1797/* If the function is "const" or "pure", then clear TREE_SIDE_EFFECTS on its
1798   decl.  This allows us to eliminate redundant or useless
1799   calls to "const" functions.
1800
1801   Gimplifier already does the same operation, but we may notice functions
1802   being const and pure once their calls has been gimplified, so we need
1803   to update the flag.  */
1804
1805static void
1806update_call_expr_flags (tree call)
1807{
1808  tree decl = get_callee_fndecl (call);
1809  if (!decl)
1810    return;
1811  if (call_expr_flags (call) & (ECF_CONST | ECF_PURE))
1812    TREE_SIDE_EFFECTS (call) = 0;
1813  if (TREE_NOTHROW (decl))
1814    TREE_NOTHROW (call) = 1;
1815}
1816
1817
1818/* T is CALL_EXPR.  Set current_function_calls_* flags.  */
1819
1820void
1821notice_special_calls (tree t)
1822{
1823  int flags = call_expr_flags (t);
1824
1825  if (flags & ECF_MAY_BE_ALLOCA)
1826    current_function_calls_alloca = true;
1827  if (flags & ECF_RETURNS_TWICE)
1828    current_function_calls_setjmp = true;
1829}
1830
1831
1832/* Clear flags set by notice_special_calls.  Used by dead code removal
1833   to update the flags.  */
1834
1835void
1836clear_special_calls (void)
1837{
1838  current_function_calls_alloca = false;
1839  current_function_calls_setjmp = false;
1840}
1841
1842
1843static void
1844remove_useless_stmts_1 (tree *tp, struct rus_data *data)
1845{
1846  tree t = *tp, op;
1847
1848  switch (TREE_CODE (t))
1849    {
1850    case COND_EXPR:
1851      remove_useless_stmts_cond (tp, data);
1852      break;
1853
1854    case TRY_FINALLY_EXPR:
1855      remove_useless_stmts_tf (tp, data);
1856      break;
1857
1858    case TRY_CATCH_EXPR:
1859      remove_useless_stmts_tc (tp, data);
1860      break;
1861
1862    case BIND_EXPR:
1863      remove_useless_stmts_bind (tp, data);
1864      break;
1865
1866    case GOTO_EXPR:
1867      remove_useless_stmts_goto (tp, data);
1868      break;
1869
1870    case LABEL_EXPR:
1871      remove_useless_stmts_label (tp, data);
1872      break;
1873
1874    case RETURN_EXPR:
1875      fold_stmt (tp);
1876      data->last_goto = NULL;
1877      data->may_branch = true;
1878      break;
1879
1880    case CALL_EXPR:
1881      fold_stmt (tp);
1882      data->last_goto = NULL;
1883      notice_special_calls (t);
1884      update_call_expr_flags (t);
1885      if (tree_could_throw_p (t))
1886	data->may_throw = true;
1887      break;
1888
1889    case MODIFY_EXPR:
1890      data->last_goto = NULL;
1891      fold_stmt (tp);
1892      op = get_call_expr_in (t);
1893      if (op)
1894	{
1895	  update_call_expr_flags (op);
1896	  notice_special_calls (op);
1897	}
1898      if (tree_could_throw_p (t))
1899	data->may_throw = true;
1900      break;
1901
1902    case STATEMENT_LIST:
1903      {
1904	tree_stmt_iterator i = tsi_start (t);
1905	while (!tsi_end_p (i))
1906	  {
1907	    t = tsi_stmt (i);
1908	    if (IS_EMPTY_STMT (t))
1909	      {
1910		tsi_delink (&i);
1911		continue;
1912	      }
1913
1914	    remove_useless_stmts_1 (tsi_stmt_ptr (i), data);
1915
1916	    t = tsi_stmt (i);
1917	    if (TREE_CODE (t) == STATEMENT_LIST)
1918	      {
1919		tsi_link_before (&i, t, TSI_SAME_STMT);
1920		tsi_delink (&i);
1921	      }
1922	    else
1923	      tsi_next (&i);
1924	  }
1925      }
1926      break;
1927    case ASM_EXPR:
1928      fold_stmt (tp);
1929      data->last_goto = NULL;
1930      break;
1931
1932    default:
1933      data->last_goto = NULL;
1934      break;
1935    }
1936}
1937
1938static unsigned int
1939remove_useless_stmts (void)
1940{
1941  struct rus_data data;
1942
1943  clear_special_calls ();
1944
1945  do
1946    {
1947      memset (&data, 0, sizeof (data));
1948      remove_useless_stmts_1 (&DECL_SAVED_TREE (current_function_decl), &data);
1949    }
1950  while (data.repeat);
1951  return 0;
1952}
1953
1954
1955struct tree_opt_pass pass_remove_useless_stmts =
1956{
1957  "useless",				/* name */
1958  NULL,					/* gate */
1959  remove_useless_stmts,			/* execute */
1960  NULL,					/* sub */
1961  NULL,					/* next */
1962  0,					/* static_pass_number */
1963  0,					/* tv_id */
1964  PROP_gimple_any,			/* properties_required */
1965  0,					/* properties_provided */
1966  0,					/* properties_destroyed */
1967  0,					/* todo_flags_start */
1968  TODO_dump_func,			/* todo_flags_finish */
1969  0					/* letter */
1970};
1971
1972/* Remove PHI nodes associated with basic block BB and all edges out of BB.  */
1973
1974static void
1975remove_phi_nodes_and_edges_for_unreachable_block (basic_block bb)
1976{
1977  tree phi;
1978
1979  /* Since this block is no longer reachable, we can just delete all
1980     of its PHI nodes.  */
1981  phi = phi_nodes (bb);
1982  while (phi)
1983    {
1984      tree next = PHI_CHAIN (phi);
1985      remove_phi_node (phi, NULL_TREE);
1986      phi = next;
1987    }
1988
1989  /* Remove edges to BB's successors.  */
1990  while (EDGE_COUNT (bb->succs) > 0)
1991    remove_edge (EDGE_SUCC (bb, 0));
1992}
1993
1994
1995/* Remove statements of basic block BB.  */
1996
1997static void
1998remove_bb (basic_block bb)
1999{
2000  block_stmt_iterator i;
2001#ifdef USE_MAPPED_LOCATION
2002  source_location loc = UNKNOWN_LOCATION;
2003#else
2004  source_locus loc = 0;
2005#endif
2006
2007  if (dump_file)
2008    {
2009      fprintf (dump_file, "Removing basic block %d\n", bb->index);
2010      if (dump_flags & TDF_DETAILS)
2011	{
2012	  dump_bb (bb, dump_file, 0);
2013	  fprintf (dump_file, "\n");
2014	}
2015    }
2016
2017  /* If we remove the header or the latch of a loop, mark the loop for
2018     removal by setting its header and latch to NULL.  */
2019  if (current_loops)
2020    {
2021      struct loop *loop = bb->loop_father;
2022
2023      if (loop->latch == bb
2024	  || loop->header == bb)
2025	{
2026	  loop->latch = NULL;
2027	  loop->header = NULL;
2028
2029	  /* Also clean up the information associated with the loop.  Updating
2030	     it would waste time. More importantly, it may refer to ssa
2031	     names that were defined in other removed basic block -- these
2032	     ssa names are now removed and invalid.  */
2033	  free_numbers_of_iterations_estimates_loop (loop);
2034	}
2035    }
2036
2037  /* Remove all the instructions in the block.  */
2038  for (i = bsi_start (bb); !bsi_end_p (i);)
2039    {
2040      tree stmt = bsi_stmt (i);
2041      if (TREE_CODE (stmt) == LABEL_EXPR
2042          && (FORCED_LABEL (LABEL_EXPR_LABEL (stmt))
2043	      || DECL_NONLOCAL (LABEL_EXPR_LABEL (stmt))))
2044	{
2045	  basic_block new_bb;
2046	  block_stmt_iterator new_bsi;
2047
2048	  /* A non-reachable non-local label may still be referenced.
2049	     But it no longer needs to carry the extra semantics of
2050	     non-locality.  */
2051	  if (DECL_NONLOCAL (LABEL_EXPR_LABEL (stmt)))
2052	    {
2053	      DECL_NONLOCAL (LABEL_EXPR_LABEL (stmt)) = 0;
2054	      FORCED_LABEL (LABEL_EXPR_LABEL (stmt)) = 1;
2055	    }
2056
2057	  new_bb = bb->prev_bb;
2058	  new_bsi = bsi_start (new_bb);
2059	  bsi_remove (&i, false);
2060	  bsi_insert_before (&new_bsi, stmt, BSI_NEW_STMT);
2061	}
2062      else
2063        {
2064	  /* Release SSA definitions if we are in SSA.  Note that we
2065	     may be called when not in SSA.  For example,
2066	     final_cleanup calls this function via
2067	     cleanup_tree_cfg.  */
2068	  if (in_ssa_p)
2069	    release_defs (stmt);
2070
2071	  bsi_remove (&i, true);
2072	}
2073
2074      /* Don't warn for removed gotos.  Gotos are often removed due to
2075	 jump threading, thus resulting in bogus warnings.  Not great,
2076	 since this way we lose warnings for gotos in the original
2077	 program that are indeed unreachable.  */
2078      if (TREE_CODE (stmt) != GOTO_EXPR && EXPR_HAS_LOCATION (stmt) && !loc)
2079	{
2080#ifdef USE_MAPPED_LOCATION
2081	  if (EXPR_HAS_LOCATION (stmt))
2082	    loc = EXPR_LOCATION (stmt);
2083#else
2084	  source_locus t;
2085	  t = EXPR_LOCUS (stmt);
2086	  if (t && LOCATION_LINE (*t) > 0)
2087	    loc = t;
2088#endif
2089	}
2090    }
2091
2092  /* If requested, give a warning that the first statement in the
2093     block is unreachable.  We walk statements backwards in the
2094     loop above, so the last statement we process is the first statement
2095     in the block.  */
2096#ifdef USE_MAPPED_LOCATION
2097  if (loc > BUILTINS_LOCATION)
2098    warning (OPT_Wunreachable_code, "%Hwill never be executed", &loc);
2099#else
2100  if (loc)
2101    warning (OPT_Wunreachable_code, "%Hwill never be executed", loc);
2102#endif
2103
2104  remove_phi_nodes_and_edges_for_unreachable_block (bb);
2105}
2106
2107
2108/* Given a basic block BB ending with COND_EXPR or SWITCH_EXPR, and a
2109   predicate VAL, return the edge that will be taken out of the block.
2110   If VAL does not match a unique edge, NULL is returned.  */
2111
2112edge
2113find_taken_edge (basic_block bb, tree val)
2114{
2115  tree stmt;
2116
2117  stmt = last_stmt (bb);
2118
2119  gcc_assert (stmt);
2120  gcc_assert (is_ctrl_stmt (stmt));
2121  gcc_assert (val);
2122
2123  if (! is_gimple_min_invariant (val))
2124    return NULL;
2125
2126  if (TREE_CODE (stmt) == COND_EXPR)
2127    return find_taken_edge_cond_expr (bb, val);
2128
2129  if (TREE_CODE (stmt) == SWITCH_EXPR)
2130    return find_taken_edge_switch_expr (bb, val);
2131
2132  if (computed_goto_p (stmt))
2133    {
2134      /* Only optimize if the argument is a label, if the argument is
2135	 not a label then we can not construct a proper CFG.
2136
2137         It may be the case that we only need to allow the LABEL_REF to
2138         appear inside an ADDR_EXPR, but we also allow the LABEL_REF to
2139         appear inside a LABEL_EXPR just to be safe.  */
2140      if ((TREE_CODE (val) == ADDR_EXPR || TREE_CODE (val) == LABEL_EXPR)
2141	  && TREE_CODE (TREE_OPERAND (val, 0)) == LABEL_DECL)
2142	return find_taken_edge_computed_goto (bb, TREE_OPERAND (val, 0));
2143      return NULL;
2144    }
2145
2146  gcc_unreachable ();
2147}
2148
2149/* Given a constant value VAL and the entry block BB to a GOTO_EXPR
2150   statement, determine which of the outgoing edges will be taken out of the
2151   block.  Return NULL if either edge may be taken.  */
2152
2153static edge
2154find_taken_edge_computed_goto (basic_block bb, tree val)
2155{
2156  basic_block dest;
2157  edge e = NULL;
2158
2159  dest = label_to_block (val);
2160  if (dest)
2161    {
2162      e = find_edge (bb, dest);
2163      gcc_assert (e != NULL);
2164    }
2165
2166  return e;
2167}
2168
2169/* Given a constant value VAL and the entry block BB to a COND_EXPR
2170   statement, determine which of the two edges will be taken out of the
2171   block.  Return NULL if either edge may be taken.  */
2172
2173static edge
2174find_taken_edge_cond_expr (basic_block bb, tree val)
2175{
2176  edge true_edge, false_edge;
2177
2178  extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
2179
2180  gcc_assert (TREE_CODE (val) == INTEGER_CST);
2181  return (zero_p (val) ? false_edge : true_edge);
2182}
2183
2184/* Given an INTEGER_CST VAL and the entry block BB to a SWITCH_EXPR
2185   statement, determine which edge will be taken out of the block.  Return
2186   NULL if any edge may be taken.  */
2187
2188static edge
2189find_taken_edge_switch_expr (basic_block bb, tree val)
2190{
2191  tree switch_expr, taken_case;
2192  basic_block dest_bb;
2193  edge e;
2194
2195  switch_expr = last_stmt (bb);
2196  taken_case = find_case_label_for_value (switch_expr, val);
2197  dest_bb = label_to_block (CASE_LABEL (taken_case));
2198
2199  e = find_edge (bb, dest_bb);
2200  gcc_assert (e);
2201  return e;
2202}
2203
2204
2205/* Return the CASE_LABEL_EXPR that SWITCH_EXPR will take for VAL.
2206   We can make optimal use here of the fact that the case labels are
2207   sorted: We can do a binary search for a case matching VAL.  */
2208
2209static tree
2210find_case_label_for_value (tree switch_expr, tree val)
2211{
2212  tree vec = SWITCH_LABELS (switch_expr);
2213  size_t low, high, n = TREE_VEC_LENGTH (vec);
2214  tree default_case = TREE_VEC_ELT (vec, n - 1);
2215
2216  for (low = -1, high = n - 1; high - low > 1; )
2217    {
2218      size_t i = (high + low) / 2;
2219      tree t = TREE_VEC_ELT (vec, i);
2220      int cmp;
2221
2222      /* Cache the result of comparing CASE_LOW and val.  */
2223      cmp = tree_int_cst_compare (CASE_LOW (t), val);
2224
2225      if (cmp > 0)
2226	high = i;
2227      else
2228	low = i;
2229
2230      if (CASE_HIGH (t) == NULL)
2231	{
2232	  /* A singe-valued case label.  */
2233	  if (cmp == 0)
2234	    return t;
2235	}
2236      else
2237	{
2238	  /* A case range.  We can only handle integer ranges.  */
2239	  if (cmp <= 0 && tree_int_cst_compare (CASE_HIGH (t), val) >= 0)
2240	    return t;
2241	}
2242    }
2243
2244  return default_case;
2245}
2246
2247
2248
2249
2250/*---------------------------------------------------------------------------
2251			      Debugging functions
2252---------------------------------------------------------------------------*/
2253
2254/* Dump tree-specific information of block BB to file OUTF.  */
2255
2256void
2257tree_dump_bb (basic_block bb, FILE *outf, int indent)
2258{
2259  dump_generic_bb (outf, bb, indent, TDF_VOPS);
2260}
2261
2262
2263/* Dump a basic block on stderr.  */
2264
2265void
2266debug_tree_bb (basic_block bb)
2267{
2268  dump_bb (bb, stderr, 0);
2269}
2270
2271
2272/* Dump basic block with index N on stderr.  */
2273
2274basic_block
2275debug_tree_bb_n (int n)
2276{
2277  debug_tree_bb (BASIC_BLOCK (n));
2278  return BASIC_BLOCK (n);
2279}
2280
2281
2282/* Dump the CFG on stderr.
2283
2284   FLAGS are the same used by the tree dumping functions
2285   (see TDF_* in tree-pass.h).  */
2286
2287void
2288debug_tree_cfg (int flags)
2289{
2290  dump_tree_cfg (stderr, flags);
2291}
2292
2293
2294/* Dump the program showing basic block boundaries on the given FILE.
2295
2296   FLAGS are the same used by the tree dumping functions (see TDF_* in
2297   tree.h).  */
2298
2299void
2300dump_tree_cfg (FILE *file, int flags)
2301{
2302  if (flags & TDF_DETAILS)
2303    {
2304      const char *funcname
2305	= lang_hooks.decl_printable_name (current_function_decl, 2);
2306
2307      fputc ('\n', file);
2308      fprintf (file, ";; Function %s\n\n", funcname);
2309      fprintf (file, ";; \n%d basic blocks, %d edges, last basic block %d.\n\n",
2310	       n_basic_blocks, n_edges, last_basic_block);
2311
2312      brief_dump_cfg (file);
2313      fprintf (file, "\n");
2314    }
2315
2316  if (flags & TDF_STATS)
2317    dump_cfg_stats (file);
2318
2319  dump_function_to_file (current_function_decl, file, flags | TDF_BLOCKS);
2320}
2321
2322
2323/* Dump CFG statistics on FILE.  */
2324
2325void
2326dump_cfg_stats (FILE *file)
2327{
2328  static long max_num_merged_labels = 0;
2329  unsigned long size, total = 0;
2330  long num_edges;
2331  basic_block bb;
2332  const char * const fmt_str   = "%-30s%-13s%12s\n";
2333  const char * const fmt_str_1 = "%-30s%13d%11lu%c\n";
2334  const char * const fmt_str_2 = "%-30s%13ld%11lu%c\n";
2335  const char * const fmt_str_3 = "%-43s%11lu%c\n";
2336  const char *funcname
2337    = lang_hooks.decl_printable_name (current_function_decl, 2);
2338
2339
2340  fprintf (file, "\nCFG Statistics for %s\n\n", funcname);
2341
2342  fprintf (file, "---------------------------------------------------------\n");
2343  fprintf (file, fmt_str, "", "  Number of  ", "Memory");
2344  fprintf (file, fmt_str, "", "  instances  ", "used ");
2345  fprintf (file, "---------------------------------------------------------\n");
2346
2347  size = n_basic_blocks * sizeof (struct basic_block_def);
2348  total += size;
2349  fprintf (file, fmt_str_1, "Basic blocks", n_basic_blocks,
2350	   SCALE (size), LABEL (size));
2351
2352  num_edges = 0;
2353  FOR_EACH_BB (bb)
2354    num_edges += EDGE_COUNT (bb->succs);
2355  size = num_edges * sizeof (struct edge_def);
2356  total += size;
2357  fprintf (file, fmt_str_2, "Edges", num_edges, SCALE (size), LABEL (size));
2358
2359  fprintf (file, "---------------------------------------------------------\n");
2360  fprintf (file, fmt_str_3, "Total memory used by CFG data", SCALE (total),
2361	   LABEL (total));
2362  fprintf (file, "---------------------------------------------------------\n");
2363  fprintf (file, "\n");
2364
2365  if (cfg_stats.num_merged_labels > max_num_merged_labels)
2366    max_num_merged_labels = cfg_stats.num_merged_labels;
2367
2368  fprintf (file, "Coalesced label blocks: %ld (Max so far: %ld)\n",
2369	   cfg_stats.num_merged_labels, max_num_merged_labels);
2370
2371  fprintf (file, "\n");
2372}
2373
2374
2375/* Dump CFG statistics on stderr.  Keep extern so that it's always
2376   linked in the final executable.  */
2377
2378void
2379debug_cfg_stats (void)
2380{
2381  dump_cfg_stats (stderr);
2382}
2383
2384
2385/* Dump the flowgraph to a .vcg FILE.  */
2386
2387static void
2388tree_cfg2vcg (FILE *file)
2389{
2390  edge e;
2391  edge_iterator ei;
2392  basic_block bb;
2393  const char *funcname
2394    = lang_hooks.decl_printable_name (current_function_decl, 2);
2395
2396  /* Write the file header.  */
2397  fprintf (file, "graph: { title: \"%s\"\n", funcname);
2398  fprintf (file, "node: { title: \"ENTRY\" label: \"ENTRY\" }\n");
2399  fprintf (file, "node: { title: \"EXIT\" label: \"EXIT\" }\n");
2400
2401  /* Write blocks and edges.  */
2402  FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
2403    {
2404      fprintf (file, "edge: { sourcename: \"ENTRY\" targetname: \"%d\"",
2405	       e->dest->index);
2406
2407      if (e->flags & EDGE_FAKE)
2408	fprintf (file, " linestyle: dotted priority: 10");
2409      else
2410	fprintf (file, " linestyle: solid priority: 100");
2411
2412      fprintf (file, " }\n");
2413    }
2414  fputc ('\n', file);
2415
2416  FOR_EACH_BB (bb)
2417    {
2418      enum tree_code head_code, end_code;
2419      const char *head_name, *end_name;
2420      int head_line = 0;
2421      int end_line = 0;
2422      tree first = first_stmt (bb);
2423      tree last = last_stmt (bb);
2424
2425      if (first)
2426	{
2427	  head_code = TREE_CODE (first);
2428	  head_name = tree_code_name[head_code];
2429	  head_line = get_lineno (first);
2430	}
2431      else
2432	head_name = "no-statement";
2433
2434      if (last)
2435	{
2436	  end_code = TREE_CODE (last);
2437	  end_name = tree_code_name[end_code];
2438	  end_line = get_lineno (last);
2439	}
2440      else
2441	end_name = "no-statement";
2442
2443      fprintf (file, "node: { title: \"%d\" label: \"#%d\\n%s (%d)\\n%s (%d)\"}\n",
2444	       bb->index, bb->index, head_name, head_line, end_name,
2445	       end_line);
2446
2447      FOR_EACH_EDGE (e, ei, bb->succs)
2448	{
2449	  if (e->dest == EXIT_BLOCK_PTR)
2450	    fprintf (file, "edge: { sourcename: \"%d\" targetname: \"EXIT\"", bb->index);
2451	  else
2452	    fprintf (file, "edge: { sourcename: \"%d\" targetname: \"%d\"", bb->index, e->dest->index);
2453
2454	  if (e->flags & EDGE_FAKE)
2455	    fprintf (file, " priority: 10 linestyle: dotted");
2456	  else
2457	    fprintf (file, " priority: 100 linestyle: solid");
2458
2459	  fprintf (file, " }\n");
2460	}
2461
2462      if (bb->next_bb != EXIT_BLOCK_PTR)
2463	fputc ('\n', file);
2464    }
2465
2466  fputs ("}\n\n", file);
2467}
2468
2469
2470
2471/*---------------------------------------------------------------------------
2472			     Miscellaneous helpers
2473---------------------------------------------------------------------------*/
2474
2475/* Return true if T represents a stmt that always transfers control.  */
2476
2477bool
2478is_ctrl_stmt (tree t)
2479{
2480  return (TREE_CODE (t) == COND_EXPR
2481	  || TREE_CODE (t) == SWITCH_EXPR
2482	  || TREE_CODE (t) == GOTO_EXPR
2483	  || TREE_CODE (t) == RETURN_EXPR
2484	  || TREE_CODE (t) == RESX_EXPR);
2485}
2486
2487
2488/* Return true if T is a statement that may alter the flow of control
2489   (e.g., a call to a non-returning function).  */
2490
2491bool
2492is_ctrl_altering_stmt (tree t)
2493{
2494  tree call;
2495
2496  gcc_assert (t);
2497  call = get_call_expr_in (t);
2498  if (call)
2499    {
2500      /* A non-pure/const CALL_EXPR alters flow control if the current
2501	 function has nonlocal labels.  */
2502      if (TREE_SIDE_EFFECTS (call) && current_function_has_nonlocal_label)
2503	return true;
2504
2505      /* A CALL_EXPR also alters control flow if it does not return.  */
2506      if (call_expr_flags (call) & ECF_NORETURN)
2507	return true;
2508    }
2509
2510  /* OpenMP directives alter control flow.  */
2511  if (OMP_DIRECTIVE_P (t))
2512    return true;
2513
2514  /* If a statement can throw, it alters control flow.  */
2515  return tree_can_throw_internal (t);
2516}
2517
2518
2519/* Return true if T is a computed goto.  */
2520
2521bool
2522computed_goto_p (tree t)
2523{
2524  return (TREE_CODE (t) == GOTO_EXPR
2525	  && TREE_CODE (GOTO_DESTINATION (t)) != LABEL_DECL);
2526}
2527
2528
2529/* Return true if T is a simple local goto.  */
2530
2531bool
2532simple_goto_p (tree t)
2533{
2534  return (TREE_CODE (t) == GOTO_EXPR
2535	  && TREE_CODE (GOTO_DESTINATION (t)) == LABEL_DECL);
2536}
2537
2538
2539/* Return true if T can make an abnormal transfer of control flow.
2540   Transfers of control flow associated with EH are excluded.  */
2541
2542bool
2543tree_can_make_abnormal_goto (tree t)
2544{
2545  if (computed_goto_p (t))
2546    return true;
2547  if (TREE_CODE (t) == MODIFY_EXPR)
2548    t = TREE_OPERAND (t, 1);
2549  if (TREE_CODE (t) == WITH_SIZE_EXPR)
2550    t = TREE_OPERAND (t, 0);
2551  if (TREE_CODE (t) == CALL_EXPR)
2552    return TREE_SIDE_EFFECTS (t) && current_function_has_nonlocal_label;
2553  return false;
2554}
2555
2556
2557/* Return true if T should start a new basic block.  PREV_T is the
2558   statement preceding T.  It is used when T is a label or a case label.
2559   Labels should only start a new basic block if their previous statement
2560   wasn't a label.  Otherwise, sequence of labels would generate
2561   unnecessary basic blocks that only contain a single label.  */
2562
2563static inline bool
2564stmt_starts_bb_p (tree t, tree prev_t)
2565{
2566  if (t == NULL_TREE)
2567    return false;
2568
2569  /* LABEL_EXPRs start a new basic block only if the preceding
2570     statement wasn't a label of the same type.  This prevents the
2571     creation of consecutive blocks that have nothing but a single
2572     label.  */
2573  if (TREE_CODE (t) == LABEL_EXPR)
2574    {
2575      /* Nonlocal and computed GOTO targets always start a new block.  */
2576      if (DECL_NONLOCAL (LABEL_EXPR_LABEL (t))
2577	  || FORCED_LABEL (LABEL_EXPR_LABEL (t)))
2578	return true;
2579
2580      if (prev_t && TREE_CODE (prev_t) == LABEL_EXPR)
2581	{
2582	  if (DECL_NONLOCAL (LABEL_EXPR_LABEL (prev_t)))
2583	    return true;
2584
2585	  cfg_stats.num_merged_labels++;
2586	  return false;
2587	}
2588      else
2589	return true;
2590    }
2591
2592  return false;
2593}
2594
2595
2596/* Return true if T should end a basic block.  */
2597
2598bool
2599stmt_ends_bb_p (tree t)
2600{
2601  return is_ctrl_stmt (t) || is_ctrl_altering_stmt (t);
2602}
2603
2604
2605/* Add gotos that used to be represented implicitly in the CFG.  */
2606
2607void
2608disband_implicit_edges (void)
2609{
2610  basic_block bb;
2611  block_stmt_iterator last;
2612  edge e;
2613  edge_iterator ei;
2614  tree stmt, label;
2615
2616  FOR_EACH_BB (bb)
2617    {
2618      last = bsi_last (bb);
2619      stmt = last_stmt (bb);
2620
2621      if (stmt && TREE_CODE (stmt) == COND_EXPR)
2622	{
2623	  /* Remove superfluous gotos from COND_EXPR branches.  Moved
2624	     from cfg_remove_useless_stmts here since it violates the
2625	     invariants for tree--cfg correspondence and thus fits better
2626	     here where we do it anyway.  */
2627	  e = find_edge (bb, bb->next_bb);
2628	  if (e)
2629	    {
2630	      if (e->flags & EDGE_TRUE_VALUE)
2631		COND_EXPR_THEN (stmt) = build_empty_stmt ();
2632	      else if (e->flags & EDGE_FALSE_VALUE)
2633		COND_EXPR_ELSE (stmt) = build_empty_stmt ();
2634	      else
2635		gcc_unreachable ();
2636	      e->flags |= EDGE_FALLTHRU;
2637	    }
2638
2639	  continue;
2640	}
2641
2642      if (stmt && TREE_CODE (stmt) == RETURN_EXPR)
2643	{
2644	  /* Remove the RETURN_EXPR if we may fall though to the exit
2645	     instead.  */
2646	  gcc_assert (single_succ_p (bb));
2647	  gcc_assert (single_succ (bb) == EXIT_BLOCK_PTR);
2648
2649	  if (bb->next_bb == EXIT_BLOCK_PTR
2650	      && !TREE_OPERAND (stmt, 0))
2651	    {
2652	      bsi_remove (&last, true);
2653	      single_succ_edge (bb)->flags |= EDGE_FALLTHRU;
2654	    }
2655	  continue;
2656	}
2657
2658      /* There can be no fallthru edge if the last statement is a control
2659	 one.  */
2660      if (stmt && is_ctrl_stmt (stmt))
2661	continue;
2662
2663      /* Find a fallthru edge and emit the goto if necessary.  */
2664      FOR_EACH_EDGE (e, ei, bb->succs)
2665	if (e->flags & EDGE_FALLTHRU)
2666	  break;
2667
2668      if (!e || e->dest == bb->next_bb)
2669	continue;
2670
2671      gcc_assert (e->dest != EXIT_BLOCK_PTR);
2672      label = tree_block_label (e->dest);
2673
2674      stmt = build1 (GOTO_EXPR, void_type_node, label);
2675#ifdef USE_MAPPED_LOCATION
2676      SET_EXPR_LOCATION (stmt, e->goto_locus);
2677#else
2678      SET_EXPR_LOCUS (stmt, e->goto_locus);
2679#endif
2680      bsi_insert_after (&last, stmt, BSI_NEW_STMT);
2681      e->flags &= ~EDGE_FALLTHRU;
2682    }
2683}
2684
2685/* Remove block annotations and other datastructures.  */
2686
2687void
2688delete_tree_cfg_annotations (void)
2689{
2690  label_to_block_map = NULL;
2691}
2692
2693
2694/* Return the first statement in basic block BB.  */
2695
2696tree
2697first_stmt (basic_block bb)
2698{
2699  block_stmt_iterator i = bsi_start (bb);
2700  return !bsi_end_p (i) ? bsi_stmt (i) : NULL_TREE;
2701}
2702
2703
2704/* Return the last statement in basic block BB.  */
2705
2706tree
2707last_stmt (basic_block bb)
2708{
2709  block_stmt_iterator b = bsi_last (bb);
2710  return !bsi_end_p (b) ? bsi_stmt (b) : NULL_TREE;
2711}
2712
2713
2714/* Return a pointer to the last statement in block BB.  */
2715
2716tree *
2717last_stmt_ptr (basic_block bb)
2718{
2719  block_stmt_iterator last = bsi_last (bb);
2720  return !bsi_end_p (last) ? bsi_stmt_ptr (last) : NULL;
2721}
2722
2723
2724/* Return the last statement of an otherwise empty block.  Return NULL
2725   if the block is totally empty, or if it contains more than one
2726   statement.  */
2727
2728tree
2729last_and_only_stmt (basic_block bb)
2730{
2731  block_stmt_iterator i = bsi_last (bb);
2732  tree last, prev;
2733
2734  if (bsi_end_p (i))
2735    return NULL_TREE;
2736
2737  last = bsi_stmt (i);
2738  bsi_prev (&i);
2739  if (bsi_end_p (i))
2740    return last;
2741
2742  /* Empty statements should no longer appear in the instruction stream.
2743     Everything that might have appeared before should be deleted by
2744     remove_useless_stmts, and the optimizers should just bsi_remove
2745     instead of smashing with build_empty_stmt.
2746
2747     Thus the only thing that should appear here in a block containing
2748     one executable statement is a label.  */
2749  prev = bsi_stmt (i);
2750  if (TREE_CODE (prev) == LABEL_EXPR)
2751    return last;
2752  else
2753    return NULL_TREE;
2754}
2755
2756
2757/* Mark BB as the basic block holding statement T.  */
2758
2759void
2760set_bb_for_stmt (tree t, basic_block bb)
2761{
2762  if (TREE_CODE (t) == PHI_NODE)
2763    PHI_BB (t) = bb;
2764  else if (TREE_CODE (t) == STATEMENT_LIST)
2765    {
2766      tree_stmt_iterator i;
2767      for (i = tsi_start (t); !tsi_end_p (i); tsi_next (&i))
2768	set_bb_for_stmt (tsi_stmt (i), bb);
2769    }
2770  else
2771    {
2772      stmt_ann_t ann = get_stmt_ann (t);
2773      ann->bb = bb;
2774
2775      /* If the statement is a label, add the label to block-to-labels map
2776        so that we can speed up edge creation for GOTO_EXPRs.  */
2777      if (TREE_CODE (t) == LABEL_EXPR)
2778	{
2779	  int uid;
2780
2781	  t = LABEL_EXPR_LABEL (t);
2782	  uid = LABEL_DECL_UID (t);
2783	  if (uid == -1)
2784	    {
2785	      unsigned old_len = VEC_length (basic_block, label_to_block_map);
2786	      LABEL_DECL_UID (t) = uid = cfun->last_label_uid++;
2787	      if (old_len <= (unsigned) uid)
2788		{
2789		  basic_block *addr;
2790		  unsigned new_len = 3 * uid / 2;
2791
2792		  VEC_safe_grow (basic_block, gc, label_to_block_map,
2793				 new_len);
2794		  addr = VEC_address (basic_block, label_to_block_map);
2795		  memset (&addr[old_len],
2796			  0, sizeof (basic_block) * (new_len - old_len));
2797		}
2798	    }
2799	  else
2800	    /* We're moving an existing label.  Make sure that we've
2801		removed it from the old block.  */
2802	    gcc_assert (!bb
2803			|| !VEC_index (basic_block, label_to_block_map, uid));
2804	  VEC_replace (basic_block, label_to_block_map, uid, bb);
2805	}
2806    }
2807}
2808
2809/* Faster version of set_bb_for_stmt that assume that statement is being moved
2810   from one basic block to another.
2811   For BB splitting we can run into quadratic case, so performance is quite
2812   important and knowing that the tables are big enough, change_bb_for_stmt
2813   can inline as leaf function.  */
2814static inline void
2815change_bb_for_stmt (tree t, basic_block bb)
2816{
2817  get_stmt_ann (t)->bb = bb;
2818  if (TREE_CODE (t) == LABEL_EXPR)
2819    VEC_replace (basic_block, label_to_block_map,
2820		 LABEL_DECL_UID (LABEL_EXPR_LABEL (t)), bb);
2821}
2822
2823/* Finds iterator for STMT.  */
2824
2825extern block_stmt_iterator
2826bsi_for_stmt (tree stmt)
2827{
2828  block_stmt_iterator bsi;
2829
2830  for (bsi = bsi_start (bb_for_stmt (stmt)); !bsi_end_p (bsi); bsi_next (&bsi))
2831    if (bsi_stmt (bsi) == stmt)
2832      return bsi;
2833
2834  gcc_unreachable ();
2835}
2836
2837/* Mark statement T as modified, and update it.  */
2838static inline void
2839update_modified_stmts (tree t)
2840{
2841  if (TREE_CODE (t) == STATEMENT_LIST)
2842    {
2843      tree_stmt_iterator i;
2844      tree stmt;
2845      for (i = tsi_start (t); !tsi_end_p (i); tsi_next (&i))
2846        {
2847	  stmt = tsi_stmt (i);
2848	  update_stmt_if_modified (stmt);
2849	}
2850    }
2851  else
2852    update_stmt_if_modified (t);
2853}
2854
2855/* Insert statement (or statement list) T before the statement
2856   pointed-to by iterator I.  M specifies how to update iterator I
2857   after insertion (see enum bsi_iterator_update).  */
2858
2859void
2860bsi_insert_before (block_stmt_iterator *i, tree t, enum bsi_iterator_update m)
2861{
2862  set_bb_for_stmt (t, i->bb);
2863  update_modified_stmts (t);
2864  tsi_link_before (&i->tsi, t, (enum tsi_iterator_update) m);
2865}
2866
2867
2868/* Insert statement (or statement list) T after the statement
2869   pointed-to by iterator I.  M specifies how to update iterator I
2870   after insertion (see enum bsi_iterator_update).  */
2871
2872void
2873bsi_insert_after (block_stmt_iterator *i, tree t, enum bsi_iterator_update m)
2874{
2875  set_bb_for_stmt (t, i->bb);
2876  update_modified_stmts (t);
2877  tsi_link_after (&i->tsi, t, (enum tsi_iterator_update) m);
2878}
2879
2880
2881/* Remove the statement pointed to by iterator I.  The iterator is updated
2882   to the next statement.
2883
2884   When REMOVE_EH_INFO is true we remove the statement pointed to by
2885   iterator I from the EH tables.  Otherwise we do not modify the EH
2886   tables.
2887
2888   Generally, REMOVE_EH_INFO should be true when the statement is going to
2889   be removed from the IL and not reinserted elsewhere.  */
2890
2891void
2892bsi_remove (block_stmt_iterator *i, bool remove_eh_info)
2893{
2894  tree t = bsi_stmt (*i);
2895  set_bb_for_stmt (t, NULL);
2896  delink_stmt_imm_use (t);
2897  tsi_delink (&i->tsi);
2898  mark_stmt_modified (t);
2899  if (remove_eh_info)
2900    remove_stmt_from_eh_region (t);
2901}
2902
2903
2904/* Move the statement at FROM so it comes right after the statement at TO.  */
2905
2906void
2907bsi_move_after (block_stmt_iterator *from, block_stmt_iterator *to)
2908{
2909  tree stmt = bsi_stmt (*from);
2910  bsi_remove (from, false);
2911  bsi_insert_after (to, stmt, BSI_SAME_STMT);
2912}
2913
2914
2915/* Move the statement at FROM so it comes right before the statement at TO.  */
2916
2917void
2918bsi_move_before (block_stmt_iterator *from, block_stmt_iterator *to)
2919{
2920  tree stmt = bsi_stmt (*from);
2921  bsi_remove (from, false);
2922  bsi_insert_before (to, stmt, BSI_SAME_STMT);
2923}
2924
2925
2926/* Move the statement at FROM to the end of basic block BB.  */
2927
2928void
2929bsi_move_to_bb_end (block_stmt_iterator *from, basic_block bb)
2930{
2931  block_stmt_iterator last = bsi_last (bb);
2932
2933  /* Have to check bsi_end_p because it could be an empty block.  */
2934  if (!bsi_end_p (last) && is_ctrl_stmt (bsi_stmt (last)))
2935    bsi_move_before (from, &last);
2936  else
2937    bsi_move_after (from, &last);
2938}
2939
2940
2941/* Replace the contents of the statement pointed to by iterator BSI
2942   with STMT.  If UPDATE_EH_INFO is true, the exception handling
2943   information of the original statement is moved to the new statement.  */
2944
2945void
2946bsi_replace (const block_stmt_iterator *bsi, tree stmt, bool update_eh_info)
2947{
2948  int eh_region;
2949  tree orig_stmt = bsi_stmt (*bsi);
2950
2951  SET_EXPR_LOCUS (stmt, EXPR_LOCUS (orig_stmt));
2952  set_bb_for_stmt (stmt, bsi->bb);
2953
2954  /* Preserve EH region information from the original statement, if
2955     requested by the caller.  */
2956  if (update_eh_info)
2957    {
2958      eh_region = lookup_stmt_eh_region (orig_stmt);
2959      if (eh_region >= 0)
2960	{
2961	  remove_stmt_from_eh_region (orig_stmt);
2962	  add_stmt_to_eh_region (stmt, eh_region);
2963	}
2964    }
2965
2966  delink_stmt_imm_use (orig_stmt);
2967  *bsi_stmt_ptr (*bsi) = stmt;
2968  mark_stmt_modified (stmt);
2969  update_modified_stmts (stmt);
2970}
2971
2972
2973/* Insert the statement pointed-to by BSI into edge E.  Every attempt
2974   is made to place the statement in an existing basic block, but
2975   sometimes that isn't possible.  When it isn't possible, the edge is
2976   split and the statement is added to the new block.
2977
2978   In all cases, the returned *BSI points to the correct location.  The
2979   return value is true if insertion should be done after the location,
2980   or false if it should be done before the location.  If new basic block
2981   has to be created, it is stored in *NEW_BB.  */
2982
2983static bool
2984tree_find_edge_insert_loc (edge e, block_stmt_iterator *bsi,
2985			   basic_block *new_bb)
2986{
2987  basic_block dest, src;
2988  tree tmp;
2989
2990  dest = e->dest;
2991 restart:
2992
2993  /* If the destination has one predecessor which has no PHI nodes,
2994     insert there.  Except for the exit block.
2995
2996     The requirement for no PHI nodes could be relaxed.  Basically we
2997     would have to examine the PHIs to prove that none of them used
2998     the value set by the statement we want to insert on E.  That
2999     hardly seems worth the effort.  */
3000  if (single_pred_p (dest)
3001      && ! phi_nodes (dest)
3002      && dest != EXIT_BLOCK_PTR)
3003    {
3004      *bsi = bsi_start (dest);
3005      if (bsi_end_p (*bsi))
3006	return true;
3007
3008      /* Make sure we insert after any leading labels.  */
3009      tmp = bsi_stmt (*bsi);
3010      while (TREE_CODE (tmp) == LABEL_EXPR)
3011	{
3012	  bsi_next (bsi);
3013	  if (bsi_end_p (*bsi))
3014	    break;
3015	  tmp = bsi_stmt (*bsi);
3016	}
3017
3018      if (bsi_end_p (*bsi))
3019	{
3020	  *bsi = bsi_last (dest);
3021	  return true;
3022	}
3023      else
3024	return false;
3025    }
3026
3027  /* If the source has one successor, the edge is not abnormal and
3028     the last statement does not end a basic block, insert there.
3029     Except for the entry block.  */
3030  src = e->src;
3031  if ((e->flags & EDGE_ABNORMAL) == 0
3032      && single_succ_p (src)
3033      && src != ENTRY_BLOCK_PTR)
3034    {
3035      *bsi = bsi_last (src);
3036      if (bsi_end_p (*bsi))
3037	return true;
3038
3039      tmp = bsi_stmt (*bsi);
3040      if (!stmt_ends_bb_p (tmp))
3041	return true;
3042
3043      /* Insert code just before returning the value.  We may need to decompose
3044         the return in the case it contains non-trivial operand.  */
3045      if (TREE_CODE (tmp) == RETURN_EXPR)
3046        {
3047	  tree op = TREE_OPERAND (tmp, 0);
3048	  if (op && !is_gimple_val (op))
3049	    {
3050	      gcc_assert (TREE_CODE (op) == MODIFY_EXPR);
3051	      bsi_insert_before (bsi, op, BSI_NEW_STMT);
3052	      TREE_OPERAND (tmp, 0) = TREE_OPERAND (op, 0);
3053	    }
3054	  bsi_prev (bsi);
3055	  return true;
3056        }
3057    }
3058
3059  /* Otherwise, create a new basic block, and split this edge.  */
3060  dest = split_edge (e);
3061  if (new_bb)
3062    *new_bb = dest;
3063  e = single_pred_edge (dest);
3064  goto restart;
3065}
3066
3067
3068/* This routine will commit all pending edge insertions, creating any new
3069   basic blocks which are necessary.  */
3070
3071void
3072bsi_commit_edge_inserts (void)
3073{
3074  basic_block bb;
3075  edge e;
3076  edge_iterator ei;
3077
3078  bsi_commit_one_edge_insert (single_succ_edge (ENTRY_BLOCK_PTR), NULL);
3079
3080  FOR_EACH_BB (bb)
3081    FOR_EACH_EDGE (e, ei, bb->succs)
3082      bsi_commit_one_edge_insert (e, NULL);
3083}
3084
3085
3086/* Commit insertions pending at edge E. If a new block is created, set NEW_BB
3087   to this block, otherwise set it to NULL.  */
3088
3089void
3090bsi_commit_one_edge_insert (edge e, basic_block *new_bb)
3091{
3092  if (new_bb)
3093    *new_bb = NULL;
3094  if (PENDING_STMT (e))
3095    {
3096      block_stmt_iterator bsi;
3097      tree stmt = PENDING_STMT (e);
3098
3099      PENDING_STMT (e) = NULL_TREE;
3100
3101      if (tree_find_edge_insert_loc (e, &bsi, new_bb))
3102	bsi_insert_after (&bsi, stmt, BSI_NEW_STMT);
3103      else
3104	bsi_insert_before (&bsi, stmt, BSI_NEW_STMT);
3105    }
3106}
3107
3108
3109/* Add STMT to the pending list of edge E.  No actual insertion is
3110   made until a call to bsi_commit_edge_inserts () is made.  */
3111
3112void
3113bsi_insert_on_edge (edge e, tree stmt)
3114{
3115  append_to_statement_list (stmt, &PENDING_STMT (e));
3116}
3117
3118/* Similar to bsi_insert_on_edge+bsi_commit_edge_inserts.  If a new
3119   block has to be created, it is returned.  */
3120
3121basic_block
3122bsi_insert_on_edge_immediate (edge e, tree stmt)
3123{
3124  block_stmt_iterator bsi;
3125  basic_block new_bb = NULL;
3126
3127  gcc_assert (!PENDING_STMT (e));
3128
3129  if (tree_find_edge_insert_loc (e, &bsi, &new_bb))
3130    bsi_insert_after (&bsi, stmt, BSI_NEW_STMT);
3131  else
3132    bsi_insert_before (&bsi, stmt, BSI_NEW_STMT);
3133
3134  return new_bb;
3135}
3136
3137/*---------------------------------------------------------------------------
3138	     Tree specific functions for CFG manipulation
3139---------------------------------------------------------------------------*/
3140
3141/* Reinstall those PHI arguments queued in OLD_EDGE to NEW_EDGE.  */
3142
3143static void
3144reinstall_phi_args (edge new_edge, edge old_edge)
3145{
3146  tree var, phi;
3147
3148  if (!PENDING_STMT (old_edge))
3149    return;
3150
3151  for (var = PENDING_STMT (old_edge), phi = phi_nodes (new_edge->dest);
3152       var && phi;
3153       var = TREE_CHAIN (var), phi = PHI_CHAIN (phi))
3154    {
3155      tree result = TREE_PURPOSE (var);
3156      tree arg = TREE_VALUE (var);
3157
3158      gcc_assert (result == PHI_RESULT (phi));
3159
3160      add_phi_arg (phi, arg, new_edge);
3161    }
3162
3163  PENDING_STMT (old_edge) = NULL;
3164}
3165
3166/* Returns the basic block after which the new basic block created
3167   by splitting edge EDGE_IN should be placed.  Tries to keep the new block
3168   near its "logical" location.  This is of most help to humans looking
3169   at debugging dumps.  */
3170
3171static basic_block
3172split_edge_bb_loc (edge edge_in)
3173{
3174  basic_block dest = edge_in->dest;
3175
3176  if (dest->prev_bb && find_edge (dest->prev_bb, dest))
3177    return edge_in->src;
3178  else
3179    return dest->prev_bb;
3180}
3181
3182/* Split a (typically critical) edge EDGE_IN.  Return the new block.
3183   Abort on abnormal edges.  */
3184
3185static basic_block
3186tree_split_edge (edge edge_in)
3187{
3188  basic_block new_bb, after_bb, dest;
3189  edge new_edge, e;
3190
3191  /* Abnormal edges cannot be split.  */
3192  gcc_assert (!(edge_in->flags & EDGE_ABNORMAL));
3193
3194  dest = edge_in->dest;
3195
3196  after_bb = split_edge_bb_loc (edge_in);
3197
3198  new_bb = create_empty_bb (after_bb);
3199  new_bb->frequency = EDGE_FREQUENCY (edge_in);
3200  new_bb->count = edge_in->count;
3201  new_edge = make_edge (new_bb, dest, EDGE_FALLTHRU);
3202  new_edge->probability = REG_BR_PROB_BASE;
3203  new_edge->count = edge_in->count;
3204
3205  e = redirect_edge_and_branch (edge_in, new_bb);
3206  gcc_assert (e);
3207  reinstall_phi_args (new_edge, e);
3208
3209  return new_bb;
3210}
3211
3212
3213/* Return true when BB has label LABEL in it.  */
3214
3215static bool
3216has_label_p (basic_block bb, tree label)
3217{
3218  block_stmt_iterator bsi;
3219
3220  for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
3221    {
3222      tree stmt = bsi_stmt (bsi);
3223
3224      if (TREE_CODE (stmt) != LABEL_EXPR)
3225	return false;
3226      if (LABEL_EXPR_LABEL (stmt) == label)
3227	return true;
3228    }
3229  return false;
3230}
3231
3232
3233/* Callback for walk_tree, check that all elements with address taken are
3234   properly noticed as such.  The DATA is an int* that is 1 if TP was seen
3235   inside a PHI node.  */
3236
3237static tree
3238verify_expr (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
3239{
3240  tree t = *tp, x;
3241  bool in_phi = (data != NULL);
3242
3243  if (TYPE_P (t))
3244    *walk_subtrees = 0;
3245
3246  /* Check operand N for being valid GIMPLE and give error MSG if not.  */
3247#define CHECK_OP(N, MSG) \
3248  do { if (!is_gimple_val (TREE_OPERAND (t, N)))		\
3249       { error (MSG); return TREE_OPERAND (t, N); }} while (0)
3250
3251  switch (TREE_CODE (t))
3252    {
3253    case SSA_NAME:
3254      if (SSA_NAME_IN_FREE_LIST (t))
3255	{
3256	  error ("SSA name in freelist but still referenced");
3257	  return *tp;
3258	}
3259      break;
3260
3261    case ASSERT_EXPR:
3262      x = fold (ASSERT_EXPR_COND (t));
3263      if (x == boolean_false_node)
3264	{
3265	  error ("ASSERT_EXPR with an always-false condition");
3266	  return *tp;
3267	}
3268      break;
3269
3270    case MODIFY_EXPR:
3271      x = TREE_OPERAND (t, 0);
3272      if (TREE_CODE (x) == BIT_FIELD_REF
3273	  && is_gimple_reg (TREE_OPERAND (x, 0)))
3274	{
3275	  error ("GIMPLE register modified with BIT_FIELD_REF");
3276	  return t;
3277	}
3278      break;
3279
3280    case ADDR_EXPR:
3281      {
3282	bool old_invariant;
3283	bool old_constant;
3284	bool old_side_effects;
3285	bool new_invariant;
3286	bool new_constant;
3287	bool new_side_effects;
3288
3289        /* ??? tree-ssa-alias.c may have overlooked dead PHI nodes, missing
3290	   dead PHIs that take the address of something.  But if the PHI
3291	   result is dead, the fact that it takes the address of anything
3292	   is irrelevant.  Because we can not tell from here if a PHI result
3293	   is dead, we just skip this check for PHIs altogether.  This means
3294	   we may be missing "valid" checks, but what can you do?
3295	   This was PR19217.  */
3296        if (in_phi)
3297	  break;
3298
3299	old_invariant = TREE_INVARIANT (t);
3300	old_constant = TREE_CONSTANT (t);
3301	old_side_effects = TREE_SIDE_EFFECTS (t);
3302
3303	recompute_tree_invariant_for_addr_expr (t);
3304	new_invariant = TREE_INVARIANT (t);
3305	new_side_effects = TREE_SIDE_EFFECTS (t);
3306	new_constant = TREE_CONSTANT (t);
3307
3308	if (old_invariant != new_invariant)
3309	  {
3310	    error ("invariant not recomputed when ADDR_EXPR changed");
3311	    return t;
3312	  }
3313
3314        if (old_constant != new_constant)
3315	  {
3316	    error ("constant not recomputed when ADDR_EXPR changed");
3317	    return t;
3318	  }
3319	if (old_side_effects != new_side_effects)
3320	  {
3321	    error ("side effects not recomputed when ADDR_EXPR changed");
3322	    return t;
3323	  }
3324
3325	/* Skip any references (they will be checked when we recurse down the
3326	   tree) and ensure that any variable used as a prefix is marked
3327	   addressable.  */
3328	for (x = TREE_OPERAND (t, 0);
3329	     handled_component_p (x);
3330	     x = TREE_OPERAND (x, 0))
3331	  ;
3332
3333	if (TREE_CODE (x) != VAR_DECL && TREE_CODE (x) != PARM_DECL)
3334	  return NULL;
3335	if (!TREE_ADDRESSABLE (x))
3336	  {
3337	    error ("address taken, but ADDRESSABLE bit not set");
3338	    return x;
3339	  }
3340	break;
3341      }
3342
3343    case COND_EXPR:
3344      x = COND_EXPR_COND (t);
3345      if (TREE_CODE (TREE_TYPE (x)) != BOOLEAN_TYPE)
3346	{
3347	  error ("non-boolean used in condition");
3348	  return x;
3349	}
3350      if (!is_gimple_condexpr (x))
3351        {
3352	  error ("invalid conditional operand");
3353	  return x;
3354	}
3355      break;
3356
3357    case NOP_EXPR:
3358    case CONVERT_EXPR:
3359    case FIX_TRUNC_EXPR:
3360    case FIX_CEIL_EXPR:
3361    case FIX_FLOOR_EXPR:
3362    case FIX_ROUND_EXPR:
3363    case FLOAT_EXPR:
3364    case NEGATE_EXPR:
3365    case ABS_EXPR:
3366    case BIT_NOT_EXPR:
3367    case NON_LVALUE_EXPR:
3368    case TRUTH_NOT_EXPR:
3369      CHECK_OP (0, "invalid operand to unary operator");
3370      break;
3371
3372    case REALPART_EXPR:
3373    case IMAGPART_EXPR:
3374    case COMPONENT_REF:
3375    case ARRAY_REF:
3376    case ARRAY_RANGE_REF:
3377    case BIT_FIELD_REF:
3378    case VIEW_CONVERT_EXPR:
3379      /* We have a nest of references.  Verify that each of the operands
3380	 that determine where to reference is either a constant or a variable,
3381	 verify that the base is valid, and then show we've already checked
3382	 the subtrees.  */
3383      while (handled_component_p (t))
3384	{
3385	  if (TREE_CODE (t) == COMPONENT_REF && TREE_OPERAND (t, 2))
3386	    CHECK_OP (2, "invalid COMPONENT_REF offset operator");
3387	  else if (TREE_CODE (t) == ARRAY_REF
3388		   || TREE_CODE (t) == ARRAY_RANGE_REF)
3389	    {
3390	      CHECK_OP (1, "invalid array index");
3391	      if (TREE_OPERAND (t, 2))
3392		CHECK_OP (2, "invalid array lower bound");
3393	      if (TREE_OPERAND (t, 3))
3394		CHECK_OP (3, "invalid array stride");
3395	    }
3396	  else if (TREE_CODE (t) == BIT_FIELD_REF)
3397	    {
3398	      CHECK_OP (1, "invalid operand to BIT_FIELD_REF");
3399	      CHECK_OP (2, "invalid operand to BIT_FIELD_REF");
3400	    }
3401
3402	  t = TREE_OPERAND (t, 0);
3403	}
3404
3405      if (!CONSTANT_CLASS_P (t) && !is_gimple_lvalue (t))
3406	{
3407	  error ("invalid reference prefix");
3408	  return t;
3409	}
3410      *walk_subtrees = 0;
3411      break;
3412
3413    case LT_EXPR:
3414    case LE_EXPR:
3415    case GT_EXPR:
3416    case GE_EXPR:
3417    case EQ_EXPR:
3418    case NE_EXPR:
3419    case UNORDERED_EXPR:
3420    case ORDERED_EXPR:
3421    case UNLT_EXPR:
3422    case UNLE_EXPR:
3423    case UNGT_EXPR:
3424    case UNGE_EXPR:
3425    case UNEQ_EXPR:
3426    case LTGT_EXPR:
3427    case PLUS_EXPR:
3428    case MINUS_EXPR:
3429    case MULT_EXPR:
3430    case TRUNC_DIV_EXPR:
3431    case CEIL_DIV_EXPR:
3432    case FLOOR_DIV_EXPR:
3433    case ROUND_DIV_EXPR:
3434    case TRUNC_MOD_EXPR:
3435    case CEIL_MOD_EXPR:
3436    case FLOOR_MOD_EXPR:
3437    case ROUND_MOD_EXPR:
3438    case RDIV_EXPR:
3439    case EXACT_DIV_EXPR:
3440    case MIN_EXPR:
3441    case MAX_EXPR:
3442    case LSHIFT_EXPR:
3443    case RSHIFT_EXPR:
3444    case LROTATE_EXPR:
3445    case RROTATE_EXPR:
3446    case BIT_IOR_EXPR:
3447    case BIT_XOR_EXPR:
3448    case BIT_AND_EXPR:
3449      CHECK_OP (0, "invalid operand to binary operator");
3450      CHECK_OP (1, "invalid operand to binary operator");
3451      break;
3452
3453    case CONSTRUCTOR:
3454      if (TREE_CONSTANT (t) && TREE_CODE (TREE_TYPE (t)) == VECTOR_TYPE)
3455	*walk_subtrees = 0;
3456      break;
3457
3458    default:
3459      break;
3460    }
3461  return NULL;
3462
3463#undef CHECK_OP
3464}
3465
3466
3467/* Verify STMT, return true if STMT is not in GIMPLE form.
3468   TODO: Implement type checking.  */
3469
3470static bool
3471verify_stmt (tree stmt, bool last_in_block)
3472{
3473  tree addr;
3474
3475  if (OMP_DIRECTIVE_P (stmt))
3476    {
3477      /* OpenMP directives are validated by the FE and never operated
3478	 on by the optimizers.  Furthermore, OMP_FOR may contain
3479	 non-gimple expressions when the main index variable has had
3480	 its address taken.  This does not affect the loop itself
3481	 because the header of an OMP_FOR is merely used to determine
3482	 how to setup the parallel iteration.  */
3483      return false;
3484    }
3485
3486  if (!is_gimple_stmt (stmt))
3487    {
3488      error ("is not a valid GIMPLE statement");
3489      goto fail;
3490    }
3491
3492  addr = walk_tree (&stmt, verify_expr, NULL, NULL);
3493  if (addr)
3494    {
3495      debug_generic_stmt (addr);
3496      return true;
3497    }
3498
3499  /* If the statement is marked as part of an EH region, then it is
3500     expected that the statement could throw.  Verify that when we
3501     have optimizations that simplify statements such that we prove
3502     that they cannot throw, that we update other data structures
3503     to match.  */
3504  if (lookup_stmt_eh_region (stmt) >= 0)
3505    {
3506      if (!tree_could_throw_p (stmt))
3507	{
3508	  error ("statement marked for throw, but doesn%'t");
3509	  goto fail;
3510	}
3511      if (!last_in_block && tree_can_throw_internal (stmt))
3512	{
3513	  error ("statement marked for throw in middle of block");
3514	  goto fail;
3515	}
3516    }
3517
3518  return false;
3519
3520 fail:
3521  debug_generic_stmt (stmt);
3522  return true;
3523}
3524
3525
3526/* Return true when the T can be shared.  */
3527
3528static bool
3529tree_node_can_be_shared (tree t)
3530{
3531  if (IS_TYPE_OR_DECL_P (t)
3532      || is_gimple_min_invariant (t)
3533      || TREE_CODE (t) == SSA_NAME
3534      || t == error_mark_node
3535      || TREE_CODE (t) == IDENTIFIER_NODE)
3536    return true;
3537
3538  if (TREE_CODE (t) == CASE_LABEL_EXPR)
3539    return true;
3540
3541  while (((TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
3542	   && is_gimple_min_invariant (TREE_OPERAND (t, 1)))
3543	 || TREE_CODE (t) == COMPONENT_REF
3544	 || TREE_CODE (t) == REALPART_EXPR
3545	 || TREE_CODE (t) == IMAGPART_EXPR)
3546    t = TREE_OPERAND (t, 0);
3547
3548  if (DECL_P (t))
3549    return true;
3550
3551  return false;
3552}
3553
3554
3555/* Called via walk_trees.  Verify tree sharing.  */
3556
3557static tree
3558verify_node_sharing (tree * tp, int *walk_subtrees, void *data)
3559{
3560  htab_t htab = (htab_t) data;
3561  void **slot;
3562
3563  if (tree_node_can_be_shared (*tp))
3564    {
3565      *walk_subtrees = false;
3566      return NULL;
3567    }
3568
3569  slot = htab_find_slot (htab, *tp, INSERT);
3570  if (*slot)
3571    return (tree) *slot;
3572  *slot = *tp;
3573
3574  return NULL;
3575}
3576
3577
3578/* Verify the GIMPLE statement chain.  */
3579
3580void
3581verify_stmts (void)
3582{
3583  basic_block bb;
3584  block_stmt_iterator bsi;
3585  bool err = false;
3586  htab_t htab;
3587  tree addr;
3588
3589  timevar_push (TV_TREE_STMT_VERIFY);
3590  htab = htab_create (37, htab_hash_pointer, htab_eq_pointer, NULL);
3591
3592  FOR_EACH_BB (bb)
3593    {
3594      tree phi;
3595      int i;
3596
3597      for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
3598	{
3599	  int phi_num_args = PHI_NUM_ARGS (phi);
3600
3601	  if (bb_for_stmt (phi) != bb)
3602	    {
3603	      error ("bb_for_stmt (phi) is set to a wrong basic block");
3604	      err |= true;
3605	    }
3606
3607	  for (i = 0; i < phi_num_args; i++)
3608	    {
3609	      tree t = PHI_ARG_DEF (phi, i);
3610	      tree addr;
3611
3612	      /* Addressable variables do have SSA_NAMEs but they
3613		 are not considered gimple values.  */
3614	      if (TREE_CODE (t) != SSA_NAME
3615		  && TREE_CODE (t) != FUNCTION_DECL
3616		  && !is_gimple_val (t))
3617		{
3618		  error ("PHI def is not a GIMPLE value");
3619		  debug_generic_stmt (phi);
3620		  debug_generic_stmt (t);
3621		  err |= true;
3622		}
3623
3624	      addr = walk_tree (&t, verify_expr, (void *) 1, NULL);
3625	      if (addr)
3626		{
3627		  debug_generic_stmt (addr);
3628		  err |= true;
3629		}
3630
3631	      addr = walk_tree (&t, verify_node_sharing, htab, NULL);
3632	      if (addr)
3633		{
3634		  error ("incorrect sharing of tree nodes");
3635		  debug_generic_stmt (phi);
3636		  debug_generic_stmt (addr);
3637		  err |= true;
3638		}
3639	    }
3640	}
3641
3642      for (bsi = bsi_start (bb); !bsi_end_p (bsi); )
3643	{
3644	  tree stmt = bsi_stmt (bsi);
3645
3646	  if (bb_for_stmt (stmt) != bb)
3647	    {
3648	      error ("bb_for_stmt (stmt) is set to a wrong basic block");
3649	      err |= true;
3650	    }
3651
3652	  bsi_next (&bsi);
3653	  err |= verify_stmt (stmt, bsi_end_p (bsi));
3654	  addr = walk_tree (&stmt, verify_node_sharing, htab, NULL);
3655	  if (addr)
3656	    {
3657	      error ("incorrect sharing of tree nodes");
3658	      debug_generic_stmt (stmt);
3659	      debug_generic_stmt (addr);
3660	      err |= true;
3661	    }
3662	}
3663    }
3664
3665  if (err)
3666    internal_error ("verify_stmts failed");
3667
3668  htab_delete (htab);
3669  timevar_pop (TV_TREE_STMT_VERIFY);
3670}
3671
3672
3673/* Verifies that the flow information is OK.  */
3674
3675static int
3676tree_verify_flow_info (void)
3677{
3678  int err = 0;
3679  basic_block bb;
3680  block_stmt_iterator bsi;
3681  tree stmt;
3682  edge e;
3683  edge_iterator ei;
3684
3685  if (ENTRY_BLOCK_PTR->stmt_list)
3686    {
3687      error ("ENTRY_BLOCK has a statement list associated with it");
3688      err = 1;
3689    }
3690
3691  if (EXIT_BLOCK_PTR->stmt_list)
3692    {
3693      error ("EXIT_BLOCK has a statement list associated with it");
3694      err = 1;
3695    }
3696
3697  FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
3698    if (e->flags & EDGE_FALLTHRU)
3699      {
3700	error ("fallthru to exit from bb %d", e->src->index);
3701	err = 1;
3702      }
3703
3704  FOR_EACH_BB (bb)
3705    {
3706      bool found_ctrl_stmt = false;
3707
3708      stmt = NULL_TREE;
3709
3710      /* Skip labels on the start of basic block.  */
3711      for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
3712	{
3713	  tree prev_stmt = stmt;
3714
3715	  stmt = bsi_stmt (bsi);
3716
3717	  if (TREE_CODE (stmt) != LABEL_EXPR)
3718	    break;
3719
3720	  if (prev_stmt && DECL_NONLOCAL (LABEL_EXPR_LABEL (stmt)))
3721	    {
3722	      error ("nonlocal label ");
3723	      print_generic_expr (stderr, LABEL_EXPR_LABEL (stmt), 0);
3724	      fprintf (stderr, " is not first in a sequence of labels in bb %d",
3725		       bb->index);
3726	      err = 1;
3727	    }
3728
3729	  if (label_to_block (LABEL_EXPR_LABEL (stmt)) != bb)
3730	    {
3731	      error ("label ");
3732	      print_generic_expr (stderr, LABEL_EXPR_LABEL (stmt), 0);
3733	      fprintf (stderr, " to block does not match in bb %d",
3734		       bb->index);
3735	      err = 1;
3736	    }
3737
3738	  if (decl_function_context (LABEL_EXPR_LABEL (stmt))
3739	      != current_function_decl)
3740	    {
3741	      error ("label ");
3742	      print_generic_expr (stderr, LABEL_EXPR_LABEL (stmt), 0);
3743	      fprintf (stderr, " has incorrect context in bb %d",
3744		       bb->index);
3745	      err = 1;
3746	    }
3747	}
3748
3749      /* Verify that body of basic block BB is free of control flow.  */
3750      for (; !bsi_end_p (bsi); bsi_next (&bsi))
3751	{
3752	  tree stmt = bsi_stmt (bsi);
3753
3754	  if (found_ctrl_stmt)
3755	    {
3756	      error ("control flow in the middle of basic block %d",
3757		     bb->index);
3758	      err = 1;
3759	    }
3760
3761	  if (stmt_ends_bb_p (stmt))
3762	    found_ctrl_stmt = true;
3763
3764	  if (TREE_CODE (stmt) == LABEL_EXPR)
3765	    {
3766	      error ("label ");
3767	      print_generic_expr (stderr, LABEL_EXPR_LABEL (stmt), 0);
3768	      fprintf (stderr, " in the middle of basic block %d", bb->index);
3769	      err = 1;
3770	    }
3771	}
3772
3773      bsi = bsi_last (bb);
3774      if (bsi_end_p (bsi))
3775	continue;
3776
3777      stmt = bsi_stmt (bsi);
3778
3779      err |= verify_eh_edges (stmt);
3780
3781      if (is_ctrl_stmt (stmt))
3782	{
3783	  FOR_EACH_EDGE (e, ei, bb->succs)
3784	    if (e->flags & EDGE_FALLTHRU)
3785	      {
3786		error ("fallthru edge after a control statement in bb %d",
3787		       bb->index);
3788		err = 1;
3789	      }
3790	}
3791
3792      if (TREE_CODE (stmt) != COND_EXPR)
3793	{
3794	  /* Verify that there are no edges with EDGE_TRUE/FALSE_FLAG set
3795	     after anything else but if statement.  */
3796	  FOR_EACH_EDGE (e, ei, bb->succs)
3797	    if (e->flags & (EDGE_TRUE_VALUE | EDGE_FALSE_VALUE))
3798	      {
3799		error ("true/false edge after a non-COND_EXPR in bb %d",
3800		       bb->index);
3801		err = 1;
3802	      }
3803	}
3804
3805      switch (TREE_CODE (stmt))
3806	{
3807	case COND_EXPR:
3808	  {
3809	    edge true_edge;
3810	    edge false_edge;
3811	    if (TREE_CODE (COND_EXPR_THEN (stmt)) != GOTO_EXPR
3812		|| TREE_CODE (COND_EXPR_ELSE (stmt)) != GOTO_EXPR)
3813	      {
3814		error ("structured COND_EXPR at the end of bb %d", bb->index);
3815		err = 1;
3816	      }
3817
3818	    extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
3819
3820	    if (!true_edge || !false_edge
3821		|| !(true_edge->flags & EDGE_TRUE_VALUE)
3822		|| !(false_edge->flags & EDGE_FALSE_VALUE)
3823		|| (true_edge->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL))
3824		|| (false_edge->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL))
3825		|| EDGE_COUNT (bb->succs) >= 3)
3826	      {
3827		error ("wrong outgoing edge flags at end of bb %d",
3828		       bb->index);
3829		err = 1;
3830	      }
3831
3832	    if (!has_label_p (true_edge->dest,
3833			      GOTO_DESTINATION (COND_EXPR_THEN (stmt))))
3834	      {
3835		error ("%<then%> label does not match edge at end of bb %d",
3836		       bb->index);
3837		err = 1;
3838	      }
3839
3840	    if (!has_label_p (false_edge->dest,
3841			      GOTO_DESTINATION (COND_EXPR_ELSE (stmt))))
3842	      {
3843		error ("%<else%> label does not match edge at end of bb %d",
3844		       bb->index);
3845		err = 1;
3846	      }
3847	  }
3848	  break;
3849
3850	case GOTO_EXPR:
3851	  if (simple_goto_p (stmt))
3852	    {
3853	      error ("explicit goto at end of bb %d", bb->index);
3854	      err = 1;
3855	    }
3856	  else
3857	    {
3858	      /* FIXME.  We should double check that the labels in the
3859		 destination blocks have their address taken.  */
3860	      FOR_EACH_EDGE (e, ei, bb->succs)
3861		if ((e->flags & (EDGE_FALLTHRU | EDGE_TRUE_VALUE
3862				 | EDGE_FALSE_VALUE))
3863		    || !(e->flags & EDGE_ABNORMAL))
3864		  {
3865		    error ("wrong outgoing edge flags at end of bb %d",
3866			   bb->index);
3867		    err = 1;
3868		  }
3869	    }
3870	  break;
3871
3872	case RETURN_EXPR:
3873	  if (!single_succ_p (bb)
3874	      || (single_succ_edge (bb)->flags
3875		  & (EDGE_FALLTHRU | EDGE_ABNORMAL
3876		     | EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
3877	    {
3878	      error ("wrong outgoing edge flags at end of bb %d", bb->index);
3879	      err = 1;
3880	    }
3881	  if (single_succ (bb) != EXIT_BLOCK_PTR)
3882	    {
3883	      error ("return edge does not point to exit in bb %d",
3884		     bb->index);
3885	      err = 1;
3886	    }
3887	  break;
3888
3889	case SWITCH_EXPR:
3890	  {
3891	    tree prev;
3892	    edge e;
3893	    size_t i, n;
3894	    tree vec;
3895
3896	    vec = SWITCH_LABELS (stmt);
3897	    n = TREE_VEC_LENGTH (vec);
3898
3899	    /* Mark all the destination basic blocks.  */
3900	    for (i = 0; i < n; ++i)
3901	      {
3902		tree lab = CASE_LABEL (TREE_VEC_ELT (vec, i));
3903		basic_block label_bb = label_to_block (lab);
3904
3905		gcc_assert (!label_bb->aux || label_bb->aux == (void *)1);
3906		label_bb->aux = (void *)1;
3907	      }
3908
3909	    /* Verify that the case labels are sorted.  */
3910	    prev = TREE_VEC_ELT (vec, 0);
3911	    for (i = 1; i < n - 1; ++i)
3912	      {
3913		tree c = TREE_VEC_ELT (vec, i);
3914		if (! CASE_LOW (c))
3915		  {
3916		    error ("found default case not at end of case vector");
3917		    err = 1;
3918		    continue;
3919		  }
3920		if (! tree_int_cst_lt (CASE_LOW (prev), CASE_LOW (c)))
3921		  {
3922		    error ("case labels not sorted: ");
3923		    print_generic_expr (stderr, prev, 0);
3924		    fprintf (stderr," is greater than ");
3925		    print_generic_expr (stderr, c, 0);
3926		    fprintf (stderr," but comes before it.\n");
3927		    err = 1;
3928		  }
3929		prev = c;
3930	      }
3931	    if (CASE_LOW (TREE_VEC_ELT (vec, n - 1)))
3932	      {
3933		error ("no default case found at end of case vector");
3934		err = 1;
3935	      }
3936
3937	    FOR_EACH_EDGE (e, ei, bb->succs)
3938	      {
3939		if (!e->dest->aux)
3940		  {
3941		    error ("extra outgoing edge %d->%d",
3942			   bb->index, e->dest->index);
3943		    err = 1;
3944		  }
3945		e->dest->aux = (void *)2;
3946		if ((e->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL
3947				 | EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
3948		  {
3949		    error ("wrong outgoing edge flags at end of bb %d",
3950			   bb->index);
3951		    err = 1;
3952		  }
3953	      }
3954
3955	    /* Check that we have all of them.  */
3956	    for (i = 0; i < n; ++i)
3957	      {
3958		tree lab = CASE_LABEL (TREE_VEC_ELT (vec, i));
3959		basic_block label_bb = label_to_block (lab);
3960
3961		if (label_bb->aux != (void *)2)
3962		  {
3963		    error ("missing edge %i->%i",
3964			   bb->index, label_bb->index);
3965		    err = 1;
3966		  }
3967	      }
3968
3969	    FOR_EACH_EDGE (e, ei, bb->succs)
3970	      e->dest->aux = (void *)0;
3971	  }
3972
3973	default: ;
3974	}
3975    }
3976
3977  if (dom_computed[CDI_DOMINATORS] >= DOM_NO_FAST_QUERY)
3978    verify_dominators (CDI_DOMINATORS);
3979
3980  return err;
3981}
3982
3983
3984/* Updates phi nodes after creating a forwarder block joined
3985   by edge FALLTHRU.  */
3986
3987static void
3988tree_make_forwarder_block (edge fallthru)
3989{
3990  edge e;
3991  edge_iterator ei;
3992  basic_block dummy, bb;
3993  tree phi, new_phi, var;
3994
3995  dummy = fallthru->src;
3996  bb = fallthru->dest;
3997
3998  if (single_pred_p (bb))
3999    return;
4000
4001  /* If we redirected a branch we must create new phi nodes at the
4002     start of BB.  */
4003  for (phi = phi_nodes (dummy); phi; phi = PHI_CHAIN (phi))
4004    {
4005      var = PHI_RESULT (phi);
4006      new_phi = create_phi_node (var, bb);
4007      SSA_NAME_DEF_STMT (var) = new_phi;
4008      SET_PHI_RESULT (phi, make_ssa_name (SSA_NAME_VAR (var), phi));
4009      add_phi_arg (new_phi, PHI_RESULT (phi), fallthru);
4010    }
4011
4012  /* Ensure that the PHI node chain is in the same order.  */
4013  set_phi_nodes (bb, phi_reverse (phi_nodes (bb)));
4014
4015  /* Add the arguments we have stored on edges.  */
4016  FOR_EACH_EDGE (e, ei, bb->preds)
4017    {
4018      if (e == fallthru)
4019	continue;
4020
4021      flush_pending_stmts (e);
4022    }
4023}
4024
4025
4026/* Return a non-special label in the head of basic block BLOCK.
4027   Create one if it doesn't exist.  */
4028
4029tree
4030tree_block_label (basic_block bb)
4031{
4032  block_stmt_iterator i, s = bsi_start (bb);
4033  bool first = true;
4034  tree label, stmt;
4035
4036  for (i = s; !bsi_end_p (i); first = false, bsi_next (&i))
4037    {
4038      stmt = bsi_stmt (i);
4039      if (TREE_CODE (stmt) != LABEL_EXPR)
4040	break;
4041      label = LABEL_EXPR_LABEL (stmt);
4042      if (!DECL_NONLOCAL (label))
4043	{
4044	  if (!first)
4045	    bsi_move_before (&i, &s);
4046	  return label;
4047	}
4048    }
4049
4050  label = create_artificial_label ();
4051  stmt = build1 (LABEL_EXPR, void_type_node, label);
4052  bsi_insert_before (&s, stmt, BSI_NEW_STMT);
4053  return label;
4054}
4055
4056
4057/* Attempt to perform edge redirection by replacing a possibly complex
4058   jump instruction by a goto or by removing the jump completely.
4059   This can apply only if all edges now point to the same block.  The
4060   parameters and return values are equivalent to
4061   redirect_edge_and_branch.  */
4062
4063static edge
4064tree_try_redirect_by_replacing_jump (edge e, basic_block target)
4065{
4066  basic_block src = e->src;
4067  block_stmt_iterator b;
4068  tree stmt;
4069
4070  /* We can replace or remove a complex jump only when we have exactly
4071     two edges.  */
4072  if (EDGE_COUNT (src->succs) != 2
4073      /* Verify that all targets will be TARGET.  Specifically, the
4074	 edge that is not E must also go to TARGET.  */
4075      || EDGE_SUCC (src, EDGE_SUCC (src, 0) == e)->dest != target)
4076    return NULL;
4077
4078  b = bsi_last (src);
4079  if (bsi_end_p (b))
4080    return NULL;
4081  stmt = bsi_stmt (b);
4082
4083  if (TREE_CODE (stmt) == COND_EXPR
4084      || TREE_CODE (stmt) == SWITCH_EXPR)
4085    {
4086      bsi_remove (&b, true);
4087      e = ssa_redirect_edge (e, target);
4088      e->flags = EDGE_FALLTHRU;
4089      return e;
4090    }
4091
4092  return NULL;
4093}
4094
4095
4096/* Redirect E to DEST.  Return NULL on failure.  Otherwise, return the
4097   edge representing the redirected branch.  */
4098
4099static edge
4100tree_redirect_edge_and_branch (edge e, basic_block dest)
4101{
4102  basic_block bb = e->src;
4103  block_stmt_iterator bsi;
4104  edge ret;
4105  tree label, stmt;
4106
4107  if (e->flags & EDGE_ABNORMAL)
4108    return NULL;
4109
4110  if (e->src != ENTRY_BLOCK_PTR
4111      && (ret = tree_try_redirect_by_replacing_jump (e, dest)))
4112    return ret;
4113
4114  if (e->dest == dest)
4115    return NULL;
4116
4117  label = tree_block_label (dest);
4118
4119  bsi = bsi_last (bb);
4120  stmt = bsi_end_p (bsi) ? NULL : bsi_stmt (bsi);
4121
4122  switch (stmt ? TREE_CODE (stmt) : ERROR_MARK)
4123    {
4124    case COND_EXPR:
4125      stmt = (e->flags & EDGE_TRUE_VALUE
4126	      ? COND_EXPR_THEN (stmt)
4127	      : COND_EXPR_ELSE (stmt));
4128      GOTO_DESTINATION (stmt) = label;
4129      break;
4130
4131    case GOTO_EXPR:
4132      /* No non-abnormal edges should lead from a non-simple goto, and
4133	 simple ones should be represented implicitly.  */
4134      gcc_unreachable ();
4135
4136    case SWITCH_EXPR:
4137      {
4138        tree cases = get_cases_for_edge (e, stmt);
4139
4140	/* If we have a list of cases associated with E, then use it
4141	   as it's a lot faster than walking the entire case vector.  */
4142	if (cases)
4143	  {
4144	    edge e2 = find_edge (e->src, dest);
4145	    tree last, first;
4146
4147	    first = cases;
4148	    while (cases)
4149	      {
4150		last = cases;
4151		CASE_LABEL (cases) = label;
4152		cases = TREE_CHAIN (cases);
4153	      }
4154
4155	    /* If there was already an edge in the CFG, then we need
4156	       to move all the cases associated with E to E2.  */
4157	    if (e2)
4158	      {
4159		tree cases2 = get_cases_for_edge (e2, stmt);
4160
4161		TREE_CHAIN (last) = TREE_CHAIN (cases2);
4162		TREE_CHAIN (cases2) = first;
4163	      }
4164	  }
4165	else
4166	  {
4167	    tree vec = SWITCH_LABELS (stmt);
4168	    size_t i, n = TREE_VEC_LENGTH (vec);
4169
4170	    for (i = 0; i < n; i++)
4171	      {
4172		tree elt = TREE_VEC_ELT (vec, i);
4173
4174		if (label_to_block (CASE_LABEL (elt)) == e->dest)
4175		  CASE_LABEL (elt) = label;
4176	      }
4177	  }
4178
4179	break;
4180      }
4181
4182    case RETURN_EXPR:
4183      bsi_remove (&bsi, true);
4184      e->flags |= EDGE_FALLTHRU;
4185      break;
4186
4187    default:
4188      /* Otherwise it must be a fallthru edge, and we don't need to
4189	 do anything besides redirecting it.  */
4190      gcc_assert (e->flags & EDGE_FALLTHRU);
4191      break;
4192    }
4193
4194  /* Update/insert PHI nodes as necessary.  */
4195
4196  /* Now update the edges in the CFG.  */
4197  e = ssa_redirect_edge (e, dest);
4198
4199  return e;
4200}
4201
4202
4203/* Simple wrapper, as we can always redirect fallthru edges.  */
4204
4205static basic_block
4206tree_redirect_edge_and_branch_force (edge e, basic_block dest)
4207{
4208  e = tree_redirect_edge_and_branch (e, dest);
4209  gcc_assert (e);
4210
4211  return NULL;
4212}
4213
4214
4215/* Splits basic block BB after statement STMT (but at least after the
4216   labels).  If STMT is NULL, BB is split just after the labels.  */
4217
4218static basic_block
4219tree_split_block (basic_block bb, void *stmt)
4220{
4221  block_stmt_iterator bsi;
4222  tree_stmt_iterator tsi_tgt;
4223  tree act;
4224  basic_block new_bb;
4225  edge e;
4226  edge_iterator ei;
4227
4228  new_bb = create_empty_bb (bb);
4229
4230  /* Redirect the outgoing edges.  */
4231  new_bb->succs = bb->succs;
4232  bb->succs = NULL;
4233  FOR_EACH_EDGE (e, ei, new_bb->succs)
4234    e->src = new_bb;
4235
4236  if (stmt && TREE_CODE ((tree) stmt) == LABEL_EXPR)
4237    stmt = NULL;
4238
4239  /* Move everything from BSI to the new basic block.  */
4240  for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
4241    {
4242      act = bsi_stmt (bsi);
4243      if (TREE_CODE (act) == LABEL_EXPR)
4244	continue;
4245
4246      if (!stmt)
4247	break;
4248
4249      if (stmt == act)
4250	{
4251	  bsi_next (&bsi);
4252	  break;
4253	}
4254    }
4255
4256  if (bsi_end_p (bsi))
4257    return new_bb;
4258
4259  /* Split the statement list - avoid re-creating new containers as this
4260     brings ugly quadratic memory consumption in the inliner.
4261     (We are still quadratic since we need to update stmt BB pointers,
4262     sadly.)  */
4263  new_bb->stmt_list = tsi_split_statement_list_before (&bsi.tsi);
4264  for (tsi_tgt = tsi_start (new_bb->stmt_list);
4265       !tsi_end_p (tsi_tgt); tsi_next (&tsi_tgt))
4266    change_bb_for_stmt (tsi_stmt (tsi_tgt), new_bb);
4267
4268  return new_bb;
4269}
4270
4271
4272/* Moves basic block BB after block AFTER.  */
4273
4274static bool
4275tree_move_block_after (basic_block bb, basic_block after)
4276{
4277  if (bb->prev_bb == after)
4278    return true;
4279
4280  unlink_block (bb);
4281  link_block (bb, after);
4282
4283  return true;
4284}
4285
4286
4287/* Return true if basic_block can be duplicated.  */
4288
4289static bool
4290tree_can_duplicate_bb_p (basic_block bb ATTRIBUTE_UNUSED)
4291{
4292  return true;
4293}
4294
4295
4296/* Create a duplicate of the basic block BB.  NOTE: This does not
4297   preserve SSA form.  */
4298
4299static basic_block
4300tree_duplicate_bb (basic_block bb)
4301{
4302  basic_block new_bb;
4303  block_stmt_iterator bsi, bsi_tgt;
4304  tree phi;
4305
4306  new_bb = create_empty_bb (EXIT_BLOCK_PTR->prev_bb);
4307
4308  /* Copy the PHI nodes.  We ignore PHI node arguments here because
4309     the incoming edges have not been setup yet.  */
4310  for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
4311    {
4312      tree copy = create_phi_node (PHI_RESULT (phi), new_bb);
4313      create_new_def_for (PHI_RESULT (copy), copy, PHI_RESULT_PTR (copy));
4314    }
4315
4316  /* Keep the chain of PHI nodes in the same order so that they can be
4317     updated by ssa_redirect_edge.  */
4318  set_phi_nodes (new_bb, phi_reverse (phi_nodes (new_bb)));
4319
4320  bsi_tgt = bsi_start (new_bb);
4321  for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
4322    {
4323      def_operand_p def_p;
4324      ssa_op_iter op_iter;
4325      tree stmt, copy;
4326      int region;
4327
4328      stmt = bsi_stmt (bsi);
4329      if (TREE_CODE (stmt) == LABEL_EXPR)
4330	continue;
4331
4332      /* Create a new copy of STMT and duplicate STMT's virtual
4333	 operands.  */
4334      copy = unshare_expr (stmt);
4335      bsi_insert_after (&bsi_tgt, copy, BSI_NEW_STMT);
4336      copy_virtual_operands (copy, stmt);
4337      region = lookup_stmt_eh_region (stmt);
4338      if (region >= 0)
4339	add_stmt_to_eh_region (copy, region);
4340
4341      /* Create new names for all the definitions created by COPY and
4342	 add replacement mappings for each new name.  */
4343      FOR_EACH_SSA_DEF_OPERAND (def_p, copy, op_iter, SSA_OP_ALL_DEFS)
4344	create_new_def_for (DEF_FROM_PTR (def_p), copy, def_p);
4345    }
4346
4347  return new_bb;
4348}
4349
4350
4351/* Basic block BB_COPY was created by code duplication.  Add phi node
4352   arguments for edges going out of BB_COPY.  The blocks that were
4353   duplicated have BB_DUPLICATED set.  */
4354
4355void
4356add_phi_args_after_copy_bb (basic_block bb_copy)
4357{
4358  basic_block bb, dest;
4359  edge e, e_copy;
4360  edge_iterator ei;
4361  tree phi, phi_copy, phi_next, def;
4362
4363  bb = get_bb_original (bb_copy);
4364
4365  FOR_EACH_EDGE (e_copy, ei, bb_copy->succs)
4366    {
4367      if (!phi_nodes (e_copy->dest))
4368	continue;
4369
4370      if (e_copy->dest->flags & BB_DUPLICATED)
4371	dest = get_bb_original (e_copy->dest);
4372      else
4373	dest = e_copy->dest;
4374
4375      e = find_edge (bb, dest);
4376      if (!e)
4377	{
4378	  /* During loop unrolling the target of the latch edge is copied.
4379	     In this case we are not looking for edge to dest, but to
4380	     duplicated block whose original was dest.  */
4381	  FOR_EACH_EDGE (e, ei, bb->succs)
4382	    if ((e->dest->flags & BB_DUPLICATED)
4383		&& get_bb_original (e->dest) == dest)
4384	      break;
4385
4386	  gcc_assert (e != NULL);
4387	}
4388
4389      for (phi = phi_nodes (e->dest), phi_copy = phi_nodes (e_copy->dest);
4390	   phi;
4391	   phi = phi_next, phi_copy = PHI_CHAIN (phi_copy))
4392	{
4393	  phi_next = PHI_CHAIN (phi);
4394	  def = PHI_ARG_DEF_FROM_EDGE (phi, e);
4395	  add_phi_arg (phi_copy, def, e_copy);
4396	}
4397    }
4398}
4399
4400/* Blocks in REGION_COPY array of length N_REGION were created by
4401   duplication of basic blocks.  Add phi node arguments for edges
4402   going from these blocks.  */
4403
4404void
4405add_phi_args_after_copy (basic_block *region_copy, unsigned n_region)
4406{
4407  unsigned i;
4408
4409  for (i = 0; i < n_region; i++)
4410    region_copy[i]->flags |= BB_DUPLICATED;
4411
4412  for (i = 0; i < n_region; i++)
4413    add_phi_args_after_copy_bb (region_copy[i]);
4414
4415  for (i = 0; i < n_region; i++)
4416    region_copy[i]->flags &= ~BB_DUPLICATED;
4417}
4418
4419/* Duplicates a REGION (set of N_REGION basic blocks) with just a single
4420   important exit edge EXIT.  By important we mean that no SSA name defined
4421   inside region is live over the other exit edges of the region.  All entry
4422   edges to the region must go to ENTRY->dest.  The edge ENTRY is redirected
4423   to the duplicate of the region.  SSA form, dominance and loop information
4424   is updated.  The new basic blocks are stored to REGION_COPY in the same
4425   order as they had in REGION, provided that REGION_COPY is not NULL.
4426   The function returns false if it is unable to copy the region,
4427   true otherwise.  */
4428
4429bool
4430tree_duplicate_sese_region (edge entry, edge exit,
4431			    basic_block *region, unsigned n_region,
4432			    basic_block *region_copy)
4433{
4434  unsigned i, n_doms;
4435  bool free_region_copy = false, copying_header = false;
4436  struct loop *loop = entry->dest->loop_father;
4437  edge exit_copy;
4438  basic_block *doms;
4439  edge redirected;
4440  int total_freq = 0, entry_freq = 0;
4441  gcov_type total_count = 0, entry_count = 0;
4442
4443  if (!can_copy_bbs_p (region, n_region))
4444    return false;
4445
4446  /* Some sanity checking.  Note that we do not check for all possible
4447     missuses of the functions.  I.e. if you ask to copy something weird,
4448     it will work, but the state of structures probably will not be
4449     correct.  */
4450  for (i = 0; i < n_region; i++)
4451    {
4452      /* We do not handle subloops, i.e. all the blocks must belong to the
4453	 same loop.  */
4454      if (region[i]->loop_father != loop)
4455	return false;
4456
4457      if (region[i] != entry->dest
4458	  && region[i] == loop->header)
4459	return false;
4460    }
4461
4462  loop->copy = loop;
4463
4464  /* In case the function is used for loop header copying (which is the primary
4465     use), ensure that EXIT and its copy will be new latch and entry edges.  */
4466  if (loop->header == entry->dest)
4467    {
4468      copying_header = true;
4469      loop->copy = loop->outer;
4470
4471      if (!dominated_by_p (CDI_DOMINATORS, loop->latch, exit->src))
4472	return false;
4473
4474      for (i = 0; i < n_region; i++)
4475	if (region[i] != exit->src
4476	    && dominated_by_p (CDI_DOMINATORS, region[i], exit->src))
4477	  return false;
4478    }
4479
4480  if (!region_copy)
4481    {
4482      region_copy = XNEWVEC (basic_block, n_region);
4483      free_region_copy = true;
4484    }
4485
4486  gcc_assert (!need_ssa_update_p ());
4487
4488  /* Record blocks outside the region that are dominated by something
4489     inside.  */
4490  doms = XNEWVEC (basic_block, n_basic_blocks);
4491  initialize_original_copy_tables ();
4492
4493  n_doms = get_dominated_by_region (CDI_DOMINATORS, region, n_region, doms);
4494
4495  if (entry->dest->count)
4496    {
4497      total_count = entry->dest->count;
4498      entry_count = entry->count;
4499      /* Fix up corner cases, to avoid division by zero or creation of negative
4500	 frequencies.  */
4501      if (entry_count > total_count)
4502	entry_count = total_count;
4503    }
4504  else
4505    {
4506      total_freq = entry->dest->frequency;
4507      entry_freq = EDGE_FREQUENCY (entry);
4508      /* Fix up corner cases, to avoid division by zero or creation of negative
4509	 frequencies.  */
4510      if (total_freq == 0)
4511	total_freq = 1;
4512      else if (entry_freq > total_freq)
4513	entry_freq = total_freq;
4514    }
4515
4516  copy_bbs (region, n_region, region_copy, &exit, 1, &exit_copy, loop,
4517	    split_edge_bb_loc (entry));
4518  if (total_count)
4519    {
4520      scale_bbs_frequencies_gcov_type (region, n_region,
4521				       total_count - entry_count,
4522				       total_count);
4523      scale_bbs_frequencies_gcov_type (region_copy, n_region, entry_count,
4524				       total_count);
4525    }
4526  else
4527    {
4528      scale_bbs_frequencies_int (region, n_region, total_freq - entry_freq,
4529				 total_freq);
4530      scale_bbs_frequencies_int (region_copy, n_region, entry_freq, total_freq);
4531    }
4532
4533  if (copying_header)
4534    {
4535      loop->header = exit->dest;
4536      loop->latch = exit->src;
4537    }
4538
4539  /* Redirect the entry and add the phi node arguments.  */
4540  redirected = redirect_edge_and_branch (entry, get_bb_copy (entry->dest));
4541  gcc_assert (redirected != NULL);
4542  flush_pending_stmts (entry);
4543
4544  /* Concerning updating of dominators:  We must recount dominators
4545     for entry block and its copy.  Anything that is outside of the
4546     region, but was dominated by something inside needs recounting as
4547     well.  */
4548  set_immediate_dominator (CDI_DOMINATORS, entry->dest, entry->src);
4549  doms[n_doms++] = get_bb_original (entry->dest);
4550  iterate_fix_dominators (CDI_DOMINATORS, doms, n_doms);
4551  free (doms);
4552
4553  /* Add the other PHI node arguments.  */
4554  add_phi_args_after_copy (region_copy, n_region);
4555
4556  /* Update the SSA web.  */
4557  update_ssa (TODO_update_ssa);
4558
4559  if (free_region_copy)
4560    free (region_copy);
4561
4562  free_original_copy_tables ();
4563  return true;
4564}
4565
4566/*
4567DEF_VEC_P(basic_block);
4568DEF_VEC_ALLOC_P(basic_block,heap);
4569*/
4570
4571/* Add all the blocks dominated by ENTRY to the array BBS_P.  Stop
4572   adding blocks when the dominator traversal reaches EXIT.  This
4573   function silently assumes that ENTRY strictly dominates EXIT.  */
4574
4575static void
4576gather_blocks_in_sese_region (basic_block entry, basic_block exit,
4577			      VEC(basic_block,heap) **bbs_p)
4578{
4579  basic_block son;
4580
4581  for (son = first_dom_son (CDI_DOMINATORS, entry);
4582       son;
4583       son = next_dom_son (CDI_DOMINATORS, son))
4584    {
4585      VEC_safe_push (basic_block, heap, *bbs_p, son);
4586      if (son != exit)
4587	gather_blocks_in_sese_region (son, exit, bbs_p);
4588    }
4589}
4590
4591
4592struct move_stmt_d
4593{
4594  tree block;
4595  tree from_context;
4596  tree to_context;
4597  bitmap vars_to_remove;
4598  htab_t new_label_map;
4599  bool remap_decls_p;
4600};
4601
4602/* Helper for move_block_to_fn.  Set TREE_BLOCK in every expression
4603   contained in *TP and change the DECL_CONTEXT of every local
4604   variable referenced in *TP.  */
4605
4606static tree
4607move_stmt_r (tree *tp, int *walk_subtrees, void *data)
4608{
4609  struct move_stmt_d *p = (struct move_stmt_d *) data;
4610  tree t = *tp;
4611
4612  if (p->block && IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (t))))
4613    TREE_BLOCK (t) = p->block;
4614
4615  if (OMP_DIRECTIVE_P (t)
4616      && TREE_CODE (t) != OMP_RETURN
4617      && TREE_CODE (t) != OMP_CONTINUE)
4618    {
4619      /* Do not remap variables inside OMP directives.  Variables
4620	 referenced in clauses and directive header belong to the
4621	 parent function and should not be moved into the child
4622	 function.  */
4623      bool save_remap_decls_p = p->remap_decls_p;
4624      p->remap_decls_p = false;
4625      *walk_subtrees = 0;
4626
4627      walk_tree (&OMP_BODY (t), move_stmt_r, p, NULL);
4628
4629      p->remap_decls_p = save_remap_decls_p;
4630    }
4631  else if (DECL_P (t) && DECL_CONTEXT (t) == p->from_context)
4632    {
4633      if (TREE_CODE (t) == LABEL_DECL)
4634	{
4635	  if (p->new_label_map)
4636	    {
4637	      struct tree_map in, *out;
4638	      in.from = t;
4639	      out = htab_find_with_hash (p->new_label_map, &in, DECL_UID (t));
4640	      if (out)
4641		*tp = t = out->to;
4642	    }
4643
4644	  DECL_CONTEXT (t) = p->to_context;
4645	}
4646      else if (p->remap_decls_p)
4647	{
4648	  DECL_CONTEXT (t) = p->to_context;
4649
4650	  if (TREE_CODE (t) == VAR_DECL)
4651	    {
4652	      struct function *f = DECL_STRUCT_FUNCTION (p->to_context);
4653	      f->unexpanded_var_list
4654		= tree_cons (0, t, f->unexpanded_var_list);
4655
4656	      /* Mark T to be removed from the original function,
4657	         otherwise it will be given a DECL_RTL when the
4658		 original function is expanded.  */
4659	      bitmap_set_bit (p->vars_to_remove, DECL_UID (t));
4660	    }
4661	}
4662    }
4663  else if (TYPE_P (t))
4664    *walk_subtrees = 0;
4665
4666  return NULL_TREE;
4667}
4668
4669
4670/* Move basic block BB from function CFUN to function DEST_FN.  The
4671   block is moved out of the original linked list and placed after
4672   block AFTER in the new list.  Also, the block is removed from the
4673   original array of blocks and placed in DEST_FN's array of blocks.
4674   If UPDATE_EDGE_COUNT_P is true, the edge counts on both CFGs is
4675   updated to reflect the moved edges.
4676
4677   On exit, local variables that need to be removed from
4678   CFUN->UNEXPANDED_VAR_LIST will have been added to VARS_TO_REMOVE.  */
4679
4680static void
4681move_block_to_fn (struct function *dest_cfun, basic_block bb,
4682		  basic_block after, bool update_edge_count_p,
4683		  bitmap vars_to_remove, htab_t new_label_map, int eh_offset)
4684{
4685  struct control_flow_graph *cfg;
4686  edge_iterator ei;
4687  edge e;
4688  block_stmt_iterator si;
4689  struct move_stmt_d d;
4690  unsigned old_len, new_len;
4691  basic_block *addr;
4692
4693  /* Link BB to the new linked list.  */
4694  move_block_after (bb, after);
4695
4696  /* Update the edge count in the corresponding flowgraphs.  */
4697  if (update_edge_count_p)
4698    FOR_EACH_EDGE (e, ei, bb->succs)
4699      {
4700	cfun->cfg->x_n_edges--;
4701	dest_cfun->cfg->x_n_edges++;
4702      }
4703
4704  /* Remove BB from the original basic block array.  */
4705  VEC_replace (basic_block, cfun->cfg->x_basic_block_info, bb->index, NULL);
4706  cfun->cfg->x_n_basic_blocks--;
4707
4708  /* Grow DEST_CFUN's basic block array if needed.  */
4709  cfg = dest_cfun->cfg;
4710  cfg->x_n_basic_blocks++;
4711  if (bb->index > cfg->x_last_basic_block)
4712    cfg->x_last_basic_block = bb->index;
4713
4714  old_len = VEC_length (basic_block, cfg->x_basic_block_info);
4715  if ((unsigned) cfg->x_last_basic_block >= old_len)
4716    {
4717      new_len = cfg->x_last_basic_block + (cfg->x_last_basic_block + 3) / 4;
4718      VEC_safe_grow (basic_block, gc, cfg->x_basic_block_info, new_len);
4719      addr = VEC_address (basic_block, cfg->x_basic_block_info);
4720      memset (&addr[old_len], 0, sizeof (basic_block) * (new_len - old_len));
4721    }
4722
4723  VEC_replace (basic_block, cfg->x_basic_block_info,
4724               cfg->x_last_basic_block, bb);
4725
4726  /* The statements in BB need to be associated with a new TREE_BLOCK.
4727     Labels need to be associated with a new label-to-block map.  */
4728  memset (&d, 0, sizeof (d));
4729  d.vars_to_remove = vars_to_remove;
4730
4731  for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
4732    {
4733      tree stmt = bsi_stmt (si);
4734      int region;
4735
4736      d.from_context = cfun->decl;
4737      d.to_context = dest_cfun->decl;
4738      d.remap_decls_p = true;
4739      d.new_label_map = new_label_map;
4740      if (TREE_BLOCK (stmt))
4741	d.block = DECL_INITIAL (dest_cfun->decl);
4742
4743      walk_tree (&stmt, move_stmt_r, &d, NULL);
4744
4745      if (TREE_CODE (stmt) == LABEL_EXPR)
4746	{
4747	  tree label = LABEL_EXPR_LABEL (stmt);
4748	  int uid = LABEL_DECL_UID (label);
4749
4750	  gcc_assert (uid > -1);
4751
4752	  old_len = VEC_length (basic_block, cfg->x_label_to_block_map);
4753	  if (old_len <= (unsigned) uid)
4754	    {
4755	      new_len = 3 * uid / 2;
4756	      VEC_safe_grow (basic_block, gc, cfg->x_label_to_block_map,
4757			     new_len);
4758	      addr = VEC_address (basic_block, cfg->x_label_to_block_map);
4759	      memset (&addr[old_len], 0,
4760		      sizeof (basic_block) * (new_len - old_len));
4761	    }
4762
4763	  VEC_replace (basic_block, cfg->x_label_to_block_map, uid, bb);
4764	  VEC_replace (basic_block, cfun->cfg->x_label_to_block_map, uid, NULL);
4765
4766	  gcc_assert (DECL_CONTEXT (label) == dest_cfun->decl);
4767
4768	  if (uid >= dest_cfun->last_label_uid)
4769	    dest_cfun->last_label_uid = uid + 1;
4770	}
4771      else if (TREE_CODE (stmt) == RESX_EXPR && eh_offset != 0)
4772	TREE_OPERAND (stmt, 0) =
4773	  build_int_cst (NULL_TREE,
4774			 TREE_INT_CST_LOW (TREE_OPERAND (stmt, 0))
4775			 + eh_offset);
4776
4777      region = lookup_stmt_eh_region (stmt);
4778      if (region >= 0)
4779	{
4780	  add_stmt_to_eh_region_fn (dest_cfun, stmt, region + eh_offset);
4781	  remove_stmt_from_eh_region (stmt);
4782	}
4783    }
4784}
4785
4786/* Examine the statements in BB (which is in SRC_CFUN); find and return
4787   the outermost EH region.  Use REGION as the incoming base EH region.  */
4788
4789static int
4790find_outermost_region_in_block (struct function *src_cfun,
4791				basic_block bb, int region)
4792{
4793  block_stmt_iterator si;
4794
4795  for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
4796    {
4797      tree stmt = bsi_stmt (si);
4798      int stmt_region;
4799
4800      if (TREE_CODE (stmt) == RESX_EXPR)
4801	stmt_region = TREE_INT_CST_LOW (TREE_OPERAND (stmt, 0));
4802      else
4803	stmt_region = lookup_stmt_eh_region_fn (src_cfun, stmt);
4804      if (stmt_region > 0)
4805	{
4806	  if (region < 0)
4807	    region = stmt_region;
4808	  else if (stmt_region != region)
4809	    {
4810	      region = eh_region_outermost (src_cfun, stmt_region, region);
4811	      gcc_assert (region != -1);
4812	    }
4813	}
4814    }
4815
4816  return region;
4817}
4818
4819static tree
4820new_label_mapper (tree decl, void *data)
4821{
4822  htab_t hash = (htab_t) data;
4823  struct tree_map *m;
4824  void **slot;
4825
4826  gcc_assert (TREE_CODE (decl) == LABEL_DECL);
4827
4828  m = xmalloc (sizeof (struct tree_map));
4829  m->hash = DECL_UID (decl);
4830  m->from = decl;
4831  m->to = create_artificial_label ();
4832  LABEL_DECL_UID (m->to) = LABEL_DECL_UID (decl);
4833
4834  slot = htab_find_slot_with_hash (hash, m, m->hash, INSERT);
4835  gcc_assert (*slot == NULL);
4836
4837  *slot = m;
4838
4839  return m->to;
4840}
4841
4842/* Move a single-entry, single-exit region delimited by ENTRY_BB and
4843   EXIT_BB to function DEST_CFUN.  The whole region is replaced by a
4844   single basic block in the original CFG and the new basic block is
4845   returned.  DEST_CFUN must not have a CFG yet.
4846
4847   Note that the region need not be a pure SESE region.  Blocks inside
4848   the region may contain calls to abort/exit.  The only restriction
4849   is that ENTRY_BB should be the only entry point and it must
4850   dominate EXIT_BB.
4851
4852   All local variables referenced in the region are assumed to be in
4853   the corresponding BLOCK_VARS and unexpanded variable lists
4854   associated with DEST_CFUN.  */
4855
4856basic_block
4857move_sese_region_to_fn (struct function *dest_cfun, basic_block entry_bb,
4858		        basic_block exit_bb)
4859{
4860  VEC(basic_block,heap) *bbs;
4861  basic_block after, bb, *entry_pred, *exit_succ;
4862  struct function *saved_cfun;
4863  int *entry_flag, *exit_flag, eh_offset;
4864  unsigned i, num_entry_edges, num_exit_edges;
4865  edge e;
4866  edge_iterator ei;
4867  bitmap vars_to_remove;
4868  htab_t new_label_map;
4869
4870  saved_cfun = cfun;
4871
4872  /* Collect all the blocks in the region.  Manually add ENTRY_BB
4873     because it won't be added by dfs_enumerate_from.  */
4874  calculate_dominance_info (CDI_DOMINATORS);
4875
4876  /* If ENTRY does not strictly dominate EXIT, this cannot be an SESE
4877     region.  */
4878  gcc_assert (entry_bb != exit_bb
4879              && (!exit_bb
4880		  || dominated_by_p (CDI_DOMINATORS, exit_bb, entry_bb)));
4881
4882  bbs = NULL;
4883  VEC_safe_push (basic_block, heap, bbs, entry_bb);
4884  gather_blocks_in_sese_region (entry_bb, exit_bb, &bbs);
4885
4886  /* Detach ENTRY_BB and EXIT_BB from CFUN->CFG.  We need to remember
4887     the predecessor edges to ENTRY_BB and the successor edges to
4888     EXIT_BB so that we can re-attach them to the new basic block that
4889     will replace the region.  */
4890  num_entry_edges = EDGE_COUNT (entry_bb->preds);
4891  entry_pred = (basic_block *) xcalloc (num_entry_edges, sizeof (basic_block));
4892  entry_flag = (int *) xcalloc (num_entry_edges, sizeof (int));
4893  i = 0;
4894  for (ei = ei_start (entry_bb->preds); (e = ei_safe_edge (ei)) != NULL;)
4895    {
4896      entry_flag[i] = e->flags;
4897      entry_pred[i++] = e->src;
4898      remove_edge (e);
4899    }
4900
4901  if (exit_bb)
4902    {
4903      num_exit_edges = EDGE_COUNT (exit_bb->succs);
4904      exit_succ = (basic_block *) xcalloc (num_exit_edges,
4905					   sizeof (basic_block));
4906      exit_flag = (int *) xcalloc (num_exit_edges, sizeof (int));
4907      i = 0;
4908      for (ei = ei_start (exit_bb->succs); (e = ei_safe_edge (ei)) != NULL;)
4909	{
4910	  exit_flag[i] = e->flags;
4911	  exit_succ[i++] = e->dest;
4912	  remove_edge (e);
4913	}
4914    }
4915  else
4916    {
4917      num_exit_edges = 0;
4918      exit_succ = NULL;
4919      exit_flag = NULL;
4920    }
4921
4922  /* Switch context to the child function to initialize DEST_FN's CFG.  */
4923  gcc_assert (dest_cfun->cfg == NULL);
4924  cfun = dest_cfun;
4925
4926  init_empty_tree_cfg ();
4927
4928  /* Initialize EH information for the new function.  */
4929  eh_offset = 0;
4930  new_label_map = NULL;
4931  if (saved_cfun->eh)
4932    {
4933      int region = -1;
4934
4935      for (i = 0; VEC_iterate (basic_block, bbs, i, bb); i++)
4936	region = find_outermost_region_in_block (saved_cfun, bb, region);
4937
4938      init_eh_for_function ();
4939      if (region != -1)
4940	{
4941	  new_label_map = htab_create (17, tree_map_hash, tree_map_eq, free);
4942	  eh_offset = duplicate_eh_regions (saved_cfun, new_label_mapper,
4943					    new_label_map, region, 0);
4944	}
4945    }
4946
4947  cfun = saved_cfun;
4948
4949  /* Move blocks from BBS into DEST_CFUN.  */
4950  gcc_assert (VEC_length (basic_block, bbs) >= 2);
4951  after = dest_cfun->cfg->x_entry_block_ptr;
4952  vars_to_remove = BITMAP_ALLOC (NULL);
4953  for (i = 0; VEC_iterate (basic_block, bbs, i, bb); i++)
4954    {
4955      /* No need to update edge counts on the last block.  It has
4956	 already been updated earlier when we detached the region from
4957	 the original CFG.  */
4958      move_block_to_fn (dest_cfun, bb, after, bb != exit_bb, vars_to_remove,
4959	                new_label_map, eh_offset);
4960      after = bb;
4961    }
4962
4963  if (new_label_map)
4964    htab_delete (new_label_map);
4965
4966  /* Remove the variables marked in VARS_TO_REMOVE from
4967     CFUN->UNEXPANDED_VAR_LIST.  Otherwise, they will be given a
4968     DECL_RTL in the context of CFUN.  */
4969  if (!bitmap_empty_p (vars_to_remove))
4970    {
4971      tree *p;
4972
4973      for (p = &cfun->unexpanded_var_list; *p; )
4974	{
4975	  tree var = TREE_VALUE (*p);
4976	  if (bitmap_bit_p (vars_to_remove, DECL_UID (var)))
4977	    {
4978	      *p = TREE_CHAIN (*p);
4979	      continue;
4980	    }
4981
4982	  p = &TREE_CHAIN (*p);
4983	}
4984    }
4985
4986  BITMAP_FREE (vars_to_remove);
4987
4988  /* Rewire the entry and exit blocks.  The successor to the entry
4989     block turns into the successor of DEST_FN's ENTRY_BLOCK_PTR in
4990     the child function.  Similarly, the predecessor of DEST_FN's
4991     EXIT_BLOCK_PTR turns into the predecessor of EXIT_BLOCK_PTR.  We
4992     need to switch CFUN between DEST_CFUN and SAVED_CFUN so that the
4993     various CFG manipulation function get to the right CFG.
4994
4995     FIXME, this is silly.  The CFG ought to become a parameter to
4996     these helpers.  */
4997  cfun = dest_cfun;
4998  make_edge (ENTRY_BLOCK_PTR, entry_bb, EDGE_FALLTHRU);
4999  if (exit_bb)
5000    make_edge (exit_bb,  EXIT_BLOCK_PTR, 0);
5001  cfun = saved_cfun;
5002
5003  /* Back in the original function, the SESE region has disappeared,
5004     create a new basic block in its place.  */
5005  bb = create_empty_bb (entry_pred[0]);
5006  for (i = 0; i < num_entry_edges; i++)
5007    make_edge (entry_pred[i], bb, entry_flag[i]);
5008
5009  for (i = 0; i < num_exit_edges; i++)
5010    make_edge (bb, exit_succ[i], exit_flag[i]);
5011
5012  if (exit_bb)
5013    {
5014      free (exit_flag);
5015      free (exit_succ);
5016    }
5017  free (entry_flag);
5018  free (entry_pred);
5019  free_dominance_info (CDI_DOMINATORS);
5020  free_dominance_info (CDI_POST_DOMINATORS);
5021  VEC_free (basic_block, heap, bbs);
5022
5023  return bb;
5024}
5025
5026
5027/* Dump FUNCTION_DECL FN to file FILE using FLAGS (see TDF_* in tree.h)  */
5028
5029void
5030dump_function_to_file (tree fn, FILE *file, int flags)
5031{
5032  tree arg, vars, var;
5033  bool ignore_topmost_bind = false, any_var = false;
5034  basic_block bb;
5035  tree chain;
5036  struct function *saved_cfun;
5037
5038  fprintf (file, "%s (", lang_hooks.decl_printable_name (fn, 2));
5039
5040  arg = DECL_ARGUMENTS (fn);
5041  while (arg)
5042    {
5043      print_generic_expr (file, arg, dump_flags);
5044      if (TREE_CHAIN (arg))
5045	fprintf (file, ", ");
5046      arg = TREE_CHAIN (arg);
5047    }
5048  fprintf (file, ")\n");
5049
5050  if (flags & TDF_DETAILS)
5051    dump_eh_tree (file, DECL_STRUCT_FUNCTION (fn));
5052  if (flags & TDF_RAW)
5053    {
5054      dump_node (fn, TDF_SLIM | flags, file);
5055      return;
5056    }
5057
5058  /* Switch CFUN to point to FN.  */
5059  saved_cfun = cfun;
5060  cfun = DECL_STRUCT_FUNCTION (fn);
5061
5062  /* When GIMPLE is lowered, the variables are no longer available in
5063     BIND_EXPRs, so display them separately.  */
5064  if (cfun && cfun->decl == fn && cfun->unexpanded_var_list)
5065    {
5066      ignore_topmost_bind = true;
5067
5068      fprintf (file, "{\n");
5069      for (vars = cfun->unexpanded_var_list; vars; vars = TREE_CHAIN (vars))
5070	{
5071	  var = TREE_VALUE (vars);
5072
5073	  print_generic_decl (file, var, flags);
5074	  fprintf (file, "\n");
5075
5076	  any_var = true;
5077	}
5078    }
5079
5080  if (cfun && cfun->decl == fn && cfun->cfg && basic_block_info)
5081    {
5082      /* Make a CFG based dump.  */
5083      check_bb_profile (ENTRY_BLOCK_PTR, file);
5084      if (!ignore_topmost_bind)
5085	fprintf (file, "{\n");
5086
5087      if (any_var && n_basic_blocks)
5088	fprintf (file, "\n");
5089
5090      FOR_EACH_BB (bb)
5091	dump_generic_bb (file, bb, 2, flags);
5092
5093      fprintf (file, "}\n");
5094      check_bb_profile (EXIT_BLOCK_PTR, file);
5095    }
5096  else
5097    {
5098      int indent;
5099
5100      /* Make a tree based dump.  */
5101      chain = DECL_SAVED_TREE (fn);
5102
5103      if (chain && TREE_CODE (chain) == BIND_EXPR)
5104	{
5105	  if (ignore_topmost_bind)
5106	    {
5107	      chain = BIND_EXPR_BODY (chain);
5108	      indent = 2;
5109	    }
5110	  else
5111	    indent = 0;
5112	}
5113      else
5114	{
5115	  if (!ignore_topmost_bind)
5116	    fprintf (file, "{\n");
5117	  indent = 2;
5118	}
5119
5120      if (any_var)
5121	fprintf (file, "\n");
5122
5123      print_generic_stmt_indented (file, chain, flags, indent);
5124      if (ignore_topmost_bind)
5125	fprintf (file, "}\n");
5126    }
5127
5128  fprintf (file, "\n\n");
5129
5130  /* Restore CFUN.  */
5131  cfun = saved_cfun;
5132}
5133
5134
5135/* Dump FUNCTION_DECL FN to stderr using FLAGS (see TDF_* in tree.h)  */
5136
5137void
5138debug_function (tree fn, int flags)
5139{
5140  dump_function_to_file (fn, stderr, flags);
5141}
5142
5143
5144/* Pretty print of the loops intermediate representation.  */
5145static void print_loop (FILE *, struct loop *, int);
5146static void print_pred_bbs (FILE *, basic_block bb);
5147static void print_succ_bbs (FILE *, basic_block bb);
5148
5149
5150/* Print on FILE the indexes for the predecessors of basic_block BB.  */
5151
5152static void
5153print_pred_bbs (FILE *file, basic_block bb)
5154{
5155  edge e;
5156  edge_iterator ei;
5157
5158  FOR_EACH_EDGE (e, ei, bb->preds)
5159    fprintf (file, "bb_%d ", e->src->index);
5160}
5161
5162
5163/* Print on FILE the indexes for the successors of basic_block BB.  */
5164
5165static void
5166print_succ_bbs (FILE *file, basic_block bb)
5167{
5168  edge e;
5169  edge_iterator ei;
5170
5171  FOR_EACH_EDGE (e, ei, bb->succs)
5172    fprintf (file, "bb_%d ", e->dest->index);
5173}
5174
5175
5176/* Pretty print LOOP on FILE, indented INDENT spaces.  */
5177
5178static void
5179print_loop (FILE *file, struct loop *loop, int indent)
5180{
5181  char *s_indent;
5182  basic_block bb;
5183
5184  if (loop == NULL)
5185    return;
5186
5187  s_indent = (char *) alloca ((size_t) indent + 1);
5188  memset ((void *) s_indent, ' ', (size_t) indent);
5189  s_indent[indent] = '\0';
5190
5191  /* Print the loop's header.  */
5192  fprintf (file, "%sloop_%d\n", s_indent, loop->num);
5193
5194  /* Print the loop's body.  */
5195  fprintf (file, "%s{\n", s_indent);
5196  FOR_EACH_BB (bb)
5197    if (bb->loop_father == loop)
5198      {
5199	/* Print the basic_block's header.  */
5200	fprintf (file, "%s  bb_%d (preds = {", s_indent, bb->index);
5201	print_pred_bbs (file, bb);
5202	fprintf (file, "}, succs = {");
5203	print_succ_bbs (file, bb);
5204	fprintf (file, "})\n");
5205
5206	/* Print the basic_block's body.  */
5207	fprintf (file, "%s  {\n", s_indent);
5208	tree_dump_bb (bb, file, indent + 4);
5209	fprintf (file, "%s  }\n", s_indent);
5210      }
5211
5212  print_loop (file, loop->inner, indent + 2);
5213  fprintf (file, "%s}\n", s_indent);
5214  print_loop (file, loop->next, indent);
5215}
5216
5217
5218/* Follow a CFG edge from the entry point of the program, and on entry
5219   of a loop, pretty print the loop structure on FILE.  */
5220
5221void
5222print_loop_ir (FILE *file)
5223{
5224  basic_block bb;
5225
5226  bb = BASIC_BLOCK (NUM_FIXED_BLOCKS);
5227  if (bb && bb->loop_father)
5228    print_loop (file, bb->loop_father, 0);
5229}
5230
5231
5232/* Debugging loops structure at tree level.  */
5233
5234void
5235debug_loop_ir (void)
5236{
5237  print_loop_ir (stderr);
5238}
5239
5240
5241/* Return true if BB ends with a call, possibly followed by some
5242   instructions that must stay with the call.  Return false,
5243   otherwise.  */
5244
5245static bool
5246tree_block_ends_with_call_p (basic_block bb)
5247{
5248  block_stmt_iterator bsi = bsi_last (bb);
5249  return get_call_expr_in (bsi_stmt (bsi)) != NULL;
5250}
5251
5252
5253/* Return true if BB ends with a conditional branch.  Return false,
5254   otherwise.  */
5255
5256static bool
5257tree_block_ends_with_condjump_p (basic_block bb)
5258{
5259  tree stmt = last_stmt (bb);
5260  return (stmt && TREE_CODE (stmt) == COND_EXPR);
5261}
5262
5263
5264/* Return true if we need to add fake edge to exit at statement T.
5265   Helper function for tree_flow_call_edges_add.  */
5266
5267static bool
5268need_fake_edge_p (tree t)
5269{
5270  tree call;
5271
5272  /* NORETURN and LONGJMP calls already have an edge to exit.
5273     CONST and PURE calls do not need one.
5274     We don't currently check for CONST and PURE here, although
5275     it would be a good idea, because those attributes are
5276     figured out from the RTL in mark_constant_function, and
5277     the counter incrementation code from -fprofile-arcs
5278     leads to different results from -fbranch-probabilities.  */
5279  call = get_call_expr_in (t);
5280  if (call
5281      && !(call_expr_flags (call) & ECF_NORETURN))
5282    return true;
5283
5284  if (TREE_CODE (t) == ASM_EXPR
5285       && (ASM_VOLATILE_P (t) || ASM_INPUT_P (t)))
5286    return true;
5287
5288  return false;
5289}
5290
5291
5292/* Add fake edges to the function exit for any non constant and non
5293   noreturn calls, volatile inline assembly in the bitmap of blocks
5294   specified by BLOCKS or to the whole CFG if BLOCKS is zero.  Return
5295   the number of blocks that were split.
5296
5297   The goal is to expose cases in which entering a basic block does
5298   not imply that all subsequent instructions must be executed.  */
5299
5300static int
5301tree_flow_call_edges_add (sbitmap blocks)
5302{
5303  int i;
5304  int blocks_split = 0;
5305  int last_bb = last_basic_block;
5306  bool check_last_block = false;
5307
5308  if (n_basic_blocks == NUM_FIXED_BLOCKS)
5309    return 0;
5310
5311  if (! blocks)
5312    check_last_block = true;
5313  else
5314    check_last_block = TEST_BIT (blocks, EXIT_BLOCK_PTR->prev_bb->index);
5315
5316  /* In the last basic block, before epilogue generation, there will be
5317     a fallthru edge to EXIT.  Special care is required if the last insn
5318     of the last basic block is a call because make_edge folds duplicate
5319     edges, which would result in the fallthru edge also being marked
5320     fake, which would result in the fallthru edge being removed by
5321     remove_fake_edges, which would result in an invalid CFG.
5322
5323     Moreover, we can't elide the outgoing fake edge, since the block
5324     profiler needs to take this into account in order to solve the minimal
5325     spanning tree in the case that the call doesn't return.
5326
5327     Handle this by adding a dummy instruction in a new last basic block.  */
5328  if (check_last_block)
5329    {
5330      basic_block bb = EXIT_BLOCK_PTR->prev_bb;
5331      block_stmt_iterator bsi = bsi_last (bb);
5332      tree t = NULL_TREE;
5333      if (!bsi_end_p (bsi))
5334	t = bsi_stmt (bsi);
5335
5336      if (t && need_fake_edge_p (t))
5337	{
5338	  edge e;
5339
5340	  e = find_edge (bb, EXIT_BLOCK_PTR);
5341	  if (e)
5342	    {
5343	      bsi_insert_on_edge (e, build_empty_stmt ());
5344	      bsi_commit_edge_inserts ();
5345	    }
5346	}
5347    }
5348
5349  /* Now add fake edges to the function exit for any non constant
5350     calls since there is no way that we can determine if they will
5351     return or not...  */
5352  for (i = 0; i < last_bb; i++)
5353    {
5354      basic_block bb = BASIC_BLOCK (i);
5355      block_stmt_iterator bsi;
5356      tree stmt, last_stmt;
5357
5358      if (!bb)
5359	continue;
5360
5361      if (blocks && !TEST_BIT (blocks, i))
5362	continue;
5363
5364      bsi = bsi_last (bb);
5365      if (!bsi_end_p (bsi))
5366	{
5367	  last_stmt = bsi_stmt (bsi);
5368	  do
5369	    {
5370	      stmt = bsi_stmt (bsi);
5371	      if (need_fake_edge_p (stmt))
5372		{
5373		  edge e;
5374		  /* The handling above of the final block before the
5375		     epilogue should be enough to verify that there is
5376		     no edge to the exit block in CFG already.
5377		     Calling make_edge in such case would cause us to
5378		     mark that edge as fake and remove it later.  */
5379#ifdef ENABLE_CHECKING
5380		  if (stmt == last_stmt)
5381		    {
5382		      e = find_edge (bb, EXIT_BLOCK_PTR);
5383		      gcc_assert (e == NULL);
5384		    }
5385#endif
5386
5387		  /* Note that the following may create a new basic block
5388		     and renumber the existing basic blocks.  */
5389		  if (stmt != last_stmt)
5390		    {
5391		      e = split_block (bb, stmt);
5392		      if (e)
5393			blocks_split++;
5394		    }
5395		  make_edge (bb, EXIT_BLOCK_PTR, EDGE_FAKE);
5396		}
5397	      bsi_prev (&bsi);
5398	    }
5399	  while (!bsi_end_p (bsi));
5400	}
5401    }
5402
5403  if (blocks_split)
5404    verify_flow_info ();
5405
5406  return blocks_split;
5407}
5408
5409/* Purge dead abnormal call edges from basic block BB.  */
5410
5411bool
5412tree_purge_dead_abnormal_call_edges (basic_block bb)
5413{
5414  bool changed = tree_purge_dead_eh_edges (bb);
5415
5416  if (current_function_has_nonlocal_label)
5417    {
5418      tree stmt = last_stmt (bb);
5419      edge_iterator ei;
5420      edge e;
5421
5422      if (!(stmt && tree_can_make_abnormal_goto (stmt)))
5423	for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
5424	  {
5425	    if (e->flags & EDGE_ABNORMAL)
5426	      {
5427		remove_edge (e);
5428		changed = true;
5429	      }
5430	    else
5431	      ei_next (&ei);
5432	  }
5433
5434      /* See tree_purge_dead_eh_edges below.  */
5435      if (changed)
5436	free_dominance_info (CDI_DOMINATORS);
5437    }
5438
5439  return changed;
5440}
5441
5442/* Purge dead EH edges from basic block BB.  */
5443
5444bool
5445tree_purge_dead_eh_edges (basic_block bb)
5446{
5447  bool changed = false;
5448  edge e;
5449  edge_iterator ei;
5450  tree stmt = last_stmt (bb);
5451
5452  if (stmt && tree_can_throw_internal (stmt))
5453    return false;
5454
5455  for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
5456    {
5457      if (e->flags & EDGE_EH)
5458	{
5459	  remove_edge (e);
5460	  changed = true;
5461	}
5462      else
5463	ei_next (&ei);
5464    }
5465
5466  /* Removal of dead EH edges might change dominators of not
5467     just immediate successors.  E.g. when bb1 is changed so that
5468     it no longer can throw and bb1->bb3 and bb1->bb4 are dead
5469     eh edges purged by this function in:
5470           0
5471	  / \
5472	 v   v
5473	 1-->2
5474        / \  |
5475       v   v |
5476       3-->4 |
5477        \    v
5478	 --->5
5479	     |
5480	     -
5481     idom(bb5) must be recomputed.  For now just free the dominance
5482     info.  */
5483  if (changed)
5484    free_dominance_info (CDI_DOMINATORS);
5485
5486  return changed;
5487}
5488
5489bool
5490tree_purge_all_dead_eh_edges (bitmap blocks)
5491{
5492  bool changed = false;
5493  unsigned i;
5494  bitmap_iterator bi;
5495
5496  EXECUTE_IF_SET_IN_BITMAP (blocks, 0, i, bi)
5497    {
5498      changed |= tree_purge_dead_eh_edges (BASIC_BLOCK (i));
5499    }
5500
5501  return changed;
5502}
5503
5504/* This function is called whenever a new edge is created or
5505   redirected.  */
5506
5507static void
5508tree_execute_on_growing_pred (edge e)
5509{
5510  basic_block bb = e->dest;
5511
5512  if (phi_nodes (bb))
5513    reserve_phi_args_for_new_edge (bb);
5514}
5515
5516/* This function is called immediately before edge E is removed from
5517   the edge vector E->dest->preds.  */
5518
5519static void
5520tree_execute_on_shrinking_pred (edge e)
5521{
5522  if (phi_nodes (e->dest))
5523    remove_phi_args (e);
5524}
5525
5526/*---------------------------------------------------------------------------
5527  Helper functions for Loop versioning
5528  ---------------------------------------------------------------------------*/
5529
5530/* Adjust phi nodes for 'first' basic block.  'second' basic block is a copy
5531   of 'first'. Both of them are dominated by 'new_head' basic block. When
5532   'new_head' was created by 'second's incoming edge it received phi arguments
5533   on the edge by split_edge(). Later, additional edge 'e' was created to
5534   connect 'new_head' and 'first'. Now this routine adds phi args on this
5535   additional edge 'e' that new_head to second edge received as part of edge
5536   splitting.
5537*/
5538
5539static void
5540tree_lv_adjust_loop_header_phi (basic_block first, basic_block second,
5541				basic_block new_head, edge e)
5542{
5543  tree phi1, phi2;
5544  edge e2 = find_edge (new_head, second);
5545
5546  /* Because NEW_HEAD has been created by splitting SECOND's incoming
5547     edge, we should always have an edge from NEW_HEAD to SECOND.  */
5548  gcc_assert (e2 != NULL);
5549
5550  /* Browse all 'second' basic block phi nodes and add phi args to
5551     edge 'e' for 'first' head. PHI args are always in correct order.  */
5552
5553  for (phi2 = phi_nodes (second), phi1 = phi_nodes (first);
5554       phi2 && phi1;
5555       phi2 = PHI_CHAIN (phi2),  phi1 = PHI_CHAIN (phi1))
5556    {
5557      tree def = PHI_ARG_DEF (phi2, e2->dest_idx);
5558      add_phi_arg (phi1, def, e);
5559    }
5560}
5561
5562/* Adds a if else statement to COND_BB with condition COND_EXPR.
5563   SECOND_HEAD is the destination of the THEN and FIRST_HEAD is
5564   the destination of the ELSE part.  */
5565static void
5566tree_lv_add_condition_to_bb (basic_block first_head, basic_block second_head,
5567                            basic_block cond_bb, void *cond_e)
5568{
5569  block_stmt_iterator bsi;
5570  tree goto1 = NULL_TREE;
5571  tree goto2 = NULL_TREE;
5572  tree new_cond_expr = NULL_TREE;
5573  tree cond_expr = (tree) cond_e;
5574  edge e0;
5575
5576  /* Build new conditional expr */
5577  goto1 = build1 (GOTO_EXPR, void_type_node, tree_block_label (first_head));
5578  goto2 = build1 (GOTO_EXPR, void_type_node, tree_block_label (second_head));
5579  new_cond_expr = build3 (COND_EXPR, void_type_node, cond_expr, goto1, goto2);
5580
5581  /* Add new cond in cond_bb.  */
5582  bsi = bsi_start (cond_bb);
5583  bsi_insert_after (&bsi, new_cond_expr, BSI_NEW_STMT);
5584  /* Adjust edges appropriately to connect new head with first head
5585     as well as second head.  */
5586  e0 = single_succ_edge (cond_bb);
5587  e0->flags &= ~EDGE_FALLTHRU;
5588  e0->flags |= EDGE_FALSE_VALUE;
5589}
5590
5591struct cfg_hooks tree_cfg_hooks = {
5592  "tree",
5593  tree_verify_flow_info,
5594  tree_dump_bb,			/* dump_bb  */
5595  create_bb,			/* create_basic_block  */
5596  tree_redirect_edge_and_branch,/* redirect_edge_and_branch  */
5597  tree_redirect_edge_and_branch_force,/* redirect_edge_and_branch_force  */
5598  remove_bb,			/* delete_basic_block  */
5599  tree_split_block,		/* split_block  */
5600  tree_move_block_after,	/* move_block_after  */
5601  tree_can_merge_blocks_p,	/* can_merge_blocks_p  */
5602  tree_merge_blocks,		/* merge_blocks  */
5603  tree_predict_edge,		/* predict_edge  */
5604  tree_predicted_by_p,		/* predicted_by_p  */
5605  tree_can_duplicate_bb_p,	/* can_duplicate_block_p  */
5606  tree_duplicate_bb,		/* duplicate_block  */
5607  tree_split_edge,		/* split_edge  */
5608  tree_make_forwarder_block,	/* make_forward_block  */
5609  NULL,				/* tidy_fallthru_edge  */
5610  tree_block_ends_with_call_p,	/* block_ends_with_call_p */
5611  tree_block_ends_with_condjump_p, /* block_ends_with_condjump_p */
5612  tree_flow_call_edges_add,     /* flow_call_edges_add */
5613  tree_execute_on_growing_pred,	/* execute_on_growing_pred */
5614  tree_execute_on_shrinking_pred, /* execute_on_shrinking_pred */
5615  tree_duplicate_loop_to_header_edge, /* duplicate loop for trees */
5616  tree_lv_add_condition_to_bb, /* lv_add_condition_to_bb */
5617  tree_lv_adjust_loop_header_phi, /* lv_adjust_loop_header_phi*/
5618  extract_true_false_edges_from_block, /* extract_cond_bb_edges */
5619  flush_pending_stmts		/* flush_pending_stmts */
5620};
5621
5622
5623/* Split all critical edges.  */
5624
5625static unsigned int
5626split_critical_edges (void)
5627{
5628  basic_block bb;
5629  edge e;
5630  edge_iterator ei;
5631
5632  /* split_edge can redirect edges out of SWITCH_EXPRs, which can get
5633     expensive.  So we want to enable recording of edge to CASE_LABEL_EXPR
5634     mappings around the calls to split_edge.  */
5635  start_recording_case_labels ();
5636  FOR_ALL_BB (bb)
5637    {
5638      FOR_EACH_EDGE (e, ei, bb->succs)
5639	if (EDGE_CRITICAL_P (e) && !(e->flags & EDGE_ABNORMAL))
5640	  {
5641	    split_edge (e);
5642	  }
5643    }
5644  end_recording_case_labels ();
5645  return 0;
5646}
5647
5648struct tree_opt_pass pass_split_crit_edges =
5649{
5650  "crited",                          /* name */
5651  NULL,                          /* gate */
5652  split_critical_edges,          /* execute */
5653  NULL,                          /* sub */
5654  NULL,                          /* next */
5655  0,                             /* static_pass_number */
5656  TV_TREE_SPLIT_EDGES,           /* tv_id */
5657  PROP_cfg,                      /* properties required */
5658  PROP_no_crit_edges,            /* properties_provided */
5659  0,                             /* properties_destroyed */
5660  0,                             /* todo_flags_start */
5661  TODO_dump_func,                /* todo_flags_finish */
5662  0                              /* letter */
5663};
5664
5665
5666/* Return EXP if it is a valid GIMPLE rvalue, else gimplify it into
5667   a temporary, make sure and register it to be renamed if necessary,
5668   and finally return the temporary.  Put the statements to compute
5669   EXP before the current statement in BSI.  */
5670
5671tree
5672gimplify_val (block_stmt_iterator *bsi, tree type, tree exp)
5673{
5674  tree t, new_stmt, orig_stmt;
5675
5676  if (is_gimple_val (exp))
5677    return exp;
5678
5679  t = make_rename_temp (type, NULL);
5680  new_stmt = build2 (MODIFY_EXPR, type, t, exp);
5681
5682  orig_stmt = bsi_stmt (*bsi);
5683  SET_EXPR_LOCUS (new_stmt, EXPR_LOCUS (orig_stmt));
5684  TREE_BLOCK (new_stmt) = TREE_BLOCK (orig_stmt);
5685
5686  bsi_insert_before (bsi, new_stmt, BSI_SAME_STMT);
5687  if (in_ssa_p)
5688    mark_new_vars_to_rename (new_stmt);
5689
5690  return t;
5691}
5692
5693/* Build a ternary operation and gimplify it.  Emit code before BSI.
5694   Return the gimple_val holding the result.  */
5695
5696tree
5697gimplify_build3 (block_stmt_iterator *bsi, enum tree_code code,
5698		 tree type, tree a, tree b, tree c)
5699{
5700  tree ret;
5701
5702  ret = fold_build3 (code, type, a, b, c);
5703  STRIP_NOPS (ret);
5704
5705  return gimplify_val (bsi, type, ret);
5706}
5707
5708/* Build a binary operation and gimplify it.  Emit code before BSI.
5709   Return the gimple_val holding the result.  */
5710
5711tree
5712gimplify_build2 (block_stmt_iterator *bsi, enum tree_code code,
5713		 tree type, tree a, tree b)
5714{
5715  tree ret;
5716
5717  ret = fold_build2 (code, type, a, b);
5718  STRIP_NOPS (ret);
5719
5720  return gimplify_val (bsi, type, ret);
5721}
5722
5723/* Build a unary operation and gimplify it.  Emit code before BSI.
5724   Return the gimple_val holding the result.  */
5725
5726tree
5727gimplify_build1 (block_stmt_iterator *bsi, enum tree_code code, tree type,
5728		 tree a)
5729{
5730  tree ret;
5731
5732  ret = fold_build1 (code, type, a);
5733  STRIP_NOPS (ret);
5734
5735  return gimplify_val (bsi, type, ret);
5736}
5737
5738
5739
5740/* Emit return warnings.  */
5741
5742static unsigned int
5743execute_warn_function_return (void)
5744{
5745#ifdef USE_MAPPED_LOCATION
5746  source_location location;
5747#else
5748  location_t *locus;
5749#endif
5750  tree last;
5751  edge e;
5752  edge_iterator ei;
5753
5754  /* If we have a path to EXIT, then we do return.  */
5755  if (TREE_THIS_VOLATILE (cfun->decl)
5756      && EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0)
5757    {
5758#ifdef USE_MAPPED_LOCATION
5759      location = UNKNOWN_LOCATION;
5760#else
5761      locus = NULL;
5762#endif
5763      FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
5764	{
5765	  last = last_stmt (e->src);
5766	  if (TREE_CODE (last) == RETURN_EXPR
5767#ifdef USE_MAPPED_LOCATION
5768	      && (location = EXPR_LOCATION (last)) != UNKNOWN_LOCATION)
5769#else
5770	      && (locus = EXPR_LOCUS (last)) != NULL)
5771#endif
5772	    break;
5773	}
5774#ifdef USE_MAPPED_LOCATION
5775      if (location == UNKNOWN_LOCATION)
5776	location = cfun->function_end_locus;
5777      warning (0, "%H%<noreturn%> function does return", &location);
5778#else
5779      if (!locus)
5780	locus = &cfun->function_end_locus;
5781      warning (0, "%H%<noreturn%> function does return", locus);
5782#endif
5783    }
5784
5785  /* If we see "return;" in some basic block, then we do reach the end
5786     without returning a value.  */
5787  else if (warn_return_type
5788	   && !TREE_NO_WARNING (cfun->decl)
5789	   && EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0
5790	   && !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (cfun->decl))))
5791    {
5792      FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
5793	{
5794	  tree last = last_stmt (e->src);
5795	  if (TREE_CODE (last) == RETURN_EXPR
5796	      && TREE_OPERAND (last, 0) == NULL
5797	      && !TREE_NO_WARNING (last))
5798	    {
5799#ifdef USE_MAPPED_LOCATION
5800	      location = EXPR_LOCATION (last);
5801	      if (location == UNKNOWN_LOCATION)
5802		  location = cfun->function_end_locus;
5803	      warning (0, "%Hcontrol reaches end of non-void function", &location);
5804#else
5805	      locus = EXPR_LOCUS (last);
5806	      if (!locus)
5807		locus = &cfun->function_end_locus;
5808	      warning (0, "%Hcontrol reaches end of non-void function", locus);
5809#endif
5810	      TREE_NO_WARNING (cfun->decl) = 1;
5811	      break;
5812	    }
5813	}
5814    }
5815  return 0;
5816}
5817
5818
5819/* Given a basic block B which ends with a conditional and has
5820   precisely two successors, determine which of the edges is taken if
5821   the conditional is true and which is taken if the conditional is
5822   false.  Set TRUE_EDGE and FALSE_EDGE appropriately.  */
5823
5824void
5825extract_true_false_edges_from_block (basic_block b,
5826				     edge *true_edge,
5827				     edge *false_edge)
5828{
5829  edge e = EDGE_SUCC (b, 0);
5830
5831  if (e->flags & EDGE_TRUE_VALUE)
5832    {
5833      *true_edge = e;
5834      *false_edge = EDGE_SUCC (b, 1);
5835    }
5836  else
5837    {
5838      *false_edge = e;
5839      *true_edge = EDGE_SUCC (b, 1);
5840    }
5841}
5842
5843struct tree_opt_pass pass_warn_function_return =
5844{
5845  NULL,					/* name */
5846  NULL,					/* gate */
5847  execute_warn_function_return,		/* execute */
5848  NULL,					/* sub */
5849  NULL,					/* next */
5850  0,					/* static_pass_number */
5851  0,					/* tv_id */
5852  PROP_cfg,				/* properties_required */
5853  0,					/* properties_provided */
5854  0,					/* properties_destroyed */
5855  0,					/* todo_flags_start */
5856  0,					/* todo_flags_finish */
5857  0					/* letter */
5858};
5859
5860/* Emit noreturn warnings.  */
5861
5862static unsigned int
5863execute_warn_function_noreturn (void)
5864{
5865  if (warn_missing_noreturn
5866      && !TREE_THIS_VOLATILE (cfun->decl)
5867      && EDGE_COUNT (EXIT_BLOCK_PTR->preds) == 0
5868      && !lang_hooks.function.missing_noreturn_ok_p (cfun->decl))
5869    warning (OPT_Wmissing_noreturn, "%Jfunction might be possible candidate "
5870	     "for attribute %<noreturn%>",
5871	     cfun->decl);
5872  return 0;
5873}
5874
5875struct tree_opt_pass pass_warn_function_noreturn =
5876{
5877  NULL,					/* name */
5878  NULL,					/* gate */
5879  execute_warn_function_noreturn,	/* execute */
5880  NULL,					/* sub */
5881  NULL,					/* next */
5882  0,					/* static_pass_number */
5883  0,					/* tv_id */
5884  PROP_cfg,				/* properties_required */
5885  0,					/* properties_provided */
5886  0,					/* properties_destroyed */
5887  0,					/* todo_flags_start */
5888  0,					/* todo_flags_finish */
5889  0					/* letter */
5890};
5891