OSDN Git Service

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