OSDN Git Service

* basic-block.h (control_flow_graph): Change the type of
[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 map
2750          so that we can speed up edge creation for GOTO_EXPRs.  */
2751       if (TREE_CODE (t) == LABEL_EXPR)
2752         {
2753           int uid;
2754
2755           t = LABEL_EXPR_LABEL (t);
2756           uid = LABEL_DECL_UID (t);
2757           if (uid == -1)
2758             {
2759               unsigned old_len = VEC_length (basic_block, label_to_block_map);
2760               LABEL_DECL_UID (t) = uid = cfun->last_label_uid++;
2761               if (old_len <= (unsigned) uid)
2762                 {
2763                   basic_block *addr;
2764                   unsigned new_len = 3 * uid / 2;
2765
2766                   VEC_safe_grow (basic_block, gc, label_to_block_map,
2767                                  new_len);
2768                   addr = VEC_address (basic_block, label_to_block_map);
2769                   memset (&addr[old_len],
2770                           0, sizeof (basic_block) * (new_len - old_len));
2771                 }
2772             }
2773           else
2774             /* We're moving an existing label.  Make sure that we've
2775                 removed it from the old block.  */
2776             gcc_assert (!bb
2777                         || !VEC_index (basic_block, label_to_block_map, uid));
2778           VEC_replace (basic_block, label_to_block_map, uid, bb);
2779         }
2780     }
2781 }
2782
2783 /* Finds iterator for STMT.  */
2784
2785 extern block_stmt_iterator
2786 bsi_for_stmt (tree stmt)
2787 {
2788   block_stmt_iterator bsi;
2789
2790   for (bsi = bsi_start (bb_for_stmt (stmt)); !bsi_end_p (bsi); bsi_next (&bsi))
2791     if (bsi_stmt (bsi) == stmt)
2792       return bsi;
2793
2794   gcc_unreachable ();
2795 }
2796
2797 /* Mark statement T as modified, and update it.  */
2798 static inline void
2799 update_modified_stmts (tree t)
2800 {
2801   if (TREE_CODE (t) == STATEMENT_LIST)
2802     {
2803       tree_stmt_iterator i;
2804       tree stmt;
2805       for (i = tsi_start (t); !tsi_end_p (i); tsi_next (&i))
2806         {
2807           stmt = tsi_stmt (i);
2808           update_stmt_if_modified (stmt);
2809         }
2810     }
2811   else
2812     update_stmt_if_modified (t);
2813 }
2814
2815 /* Insert statement (or statement list) T before the statement
2816    pointed-to by iterator I.  M specifies how to update iterator I
2817    after insertion (see enum bsi_iterator_update).  */
2818
2819 void
2820 bsi_insert_before (block_stmt_iterator *i, tree t, enum bsi_iterator_update m)
2821 {
2822   set_bb_for_stmt (t, i->bb);
2823   update_modified_stmts (t);
2824   tsi_link_before (&i->tsi, t, m);
2825 }
2826
2827
2828 /* Insert statement (or statement list) T after the statement
2829    pointed-to by iterator I.  M specifies how to update iterator I
2830    after insertion (see enum bsi_iterator_update).  */
2831
2832 void
2833 bsi_insert_after (block_stmt_iterator *i, tree t, enum bsi_iterator_update m)
2834 {
2835   set_bb_for_stmt (t, i->bb);
2836   update_modified_stmts (t);
2837   tsi_link_after (&i->tsi, t, m);
2838 }
2839
2840
2841 /* Remove the statement pointed to by iterator I.  The iterator is updated
2842    to the next statement. 
2843
2844    When REMOVE_EH_INFO is true we remove the statement pointed to by
2845    iterator I from the EH tables.  Otherwise we do not modify the EH
2846    tables.
2847
2848    Generally, REMOVE_EH_INFO should be true when the statement is going to
2849    be removed from the IL and not reinserted elsewhere.  */
2850
2851 void
2852 bsi_remove (block_stmt_iterator *i, bool remove_eh_info)
2853 {
2854   tree t = bsi_stmt (*i);
2855   set_bb_for_stmt (t, NULL);
2856   delink_stmt_imm_use (t);
2857   tsi_delink (&i->tsi);
2858   mark_stmt_modified (t);
2859   if (remove_eh_info)
2860     remove_stmt_from_eh_region (t);
2861 }
2862
2863
2864 /* Move the statement at FROM so it comes right after the statement at TO.  */
2865
2866 void 
2867 bsi_move_after (block_stmt_iterator *from, block_stmt_iterator *to)
2868 {
2869   tree stmt = bsi_stmt (*from);
2870   bsi_remove (from, false);
2871   bsi_insert_after (to, stmt, BSI_SAME_STMT);
2872
2873
2874
2875 /* Move the statement at FROM so it comes right before the statement at TO.  */
2876
2877 void 
2878 bsi_move_before (block_stmt_iterator *from, block_stmt_iterator *to)
2879 {
2880   tree stmt = bsi_stmt (*from);
2881   bsi_remove (from, false);
2882   bsi_insert_before (to, stmt, BSI_SAME_STMT);
2883 }
2884
2885
2886 /* Move the statement at FROM to the end of basic block BB.  */
2887
2888 void
2889 bsi_move_to_bb_end (block_stmt_iterator *from, basic_block bb)
2890 {
2891   block_stmt_iterator last = bsi_last (bb);
2892   
2893   /* Have to check bsi_end_p because it could be an empty block.  */
2894   if (!bsi_end_p (last) && is_ctrl_stmt (bsi_stmt (last)))
2895     bsi_move_before (from, &last);
2896   else
2897     bsi_move_after (from, &last);
2898 }
2899
2900
2901 /* Replace the contents of the statement pointed to by iterator BSI
2902    with STMT.  If UPDATE_EH_INFO is true, the exception handling
2903    information of the original statement is moved to the new statement.  */
2904   
2905
2906 void
2907 bsi_replace (const block_stmt_iterator *bsi, tree stmt, bool update_eh_info)
2908 {
2909   int eh_region;
2910   tree orig_stmt = bsi_stmt (*bsi);
2911
2912   SET_EXPR_LOCUS (stmt, EXPR_LOCUS (orig_stmt));
2913   set_bb_for_stmt (stmt, bsi->bb);
2914
2915   /* Preserve EH region information from the original statement, if
2916      requested by the caller.  */
2917   if (update_eh_info)
2918     {
2919       eh_region = lookup_stmt_eh_region (orig_stmt);
2920       if (eh_region >= 0)
2921         {
2922           remove_stmt_from_eh_region (orig_stmt);
2923           add_stmt_to_eh_region (stmt, eh_region);
2924         }
2925     }
2926
2927   delink_stmt_imm_use (orig_stmt);
2928   *bsi_stmt_ptr (*bsi) = stmt;
2929   mark_stmt_modified (stmt);
2930   update_modified_stmts (stmt);
2931 }
2932
2933
2934 /* Insert the statement pointed-to by BSI into edge E.  Every attempt
2935    is made to place the statement in an existing basic block, but
2936    sometimes that isn't possible.  When it isn't possible, the edge is
2937    split and the statement is added to the new block.
2938
2939    In all cases, the returned *BSI points to the correct location.  The
2940    return value is true if insertion should be done after the location,
2941    or false if it should be done before the location.  If new basic block
2942    has to be created, it is stored in *NEW_BB.  */
2943
2944 static bool
2945 tree_find_edge_insert_loc (edge e, block_stmt_iterator *bsi,
2946                            basic_block *new_bb)
2947 {
2948   basic_block dest, src;
2949   tree tmp;
2950
2951   dest = e->dest;
2952  restart:
2953
2954   /* If the destination has one predecessor which has no PHI nodes,
2955      insert there.  Except for the exit block. 
2956
2957      The requirement for no PHI nodes could be relaxed.  Basically we
2958      would have to examine the PHIs to prove that none of them used
2959      the value set by the statement we want to insert on E.  That
2960      hardly seems worth the effort.  */
2961   if (single_pred_p (dest)
2962       && ! phi_nodes (dest)
2963       && dest != EXIT_BLOCK_PTR)
2964     {
2965       *bsi = bsi_start (dest);
2966       if (bsi_end_p (*bsi))
2967         return true;
2968
2969       /* Make sure we insert after any leading labels.  */
2970       tmp = bsi_stmt (*bsi);
2971       while (TREE_CODE (tmp) == LABEL_EXPR)
2972         {
2973           bsi_next (bsi);
2974           if (bsi_end_p (*bsi))
2975             break;
2976           tmp = bsi_stmt (*bsi);
2977         }
2978
2979       if (bsi_end_p (*bsi))
2980         {
2981           *bsi = bsi_last (dest);
2982           return true;
2983         }
2984       else
2985         return false;
2986     }
2987
2988   /* If the source has one successor, the edge is not abnormal and
2989      the last statement does not end a basic block, insert there.
2990      Except for the entry block.  */
2991   src = e->src;
2992   if ((e->flags & EDGE_ABNORMAL) == 0
2993       && single_succ_p (src)
2994       && src != ENTRY_BLOCK_PTR)
2995     {
2996       *bsi = bsi_last (src);
2997       if (bsi_end_p (*bsi))
2998         return true;
2999
3000       tmp = bsi_stmt (*bsi);
3001       if (!stmt_ends_bb_p (tmp))
3002         return true;
3003
3004       /* Insert code just before returning the value.  We may need to decompose
3005          the return in the case it contains non-trivial operand.  */
3006       if (TREE_CODE (tmp) == RETURN_EXPR)
3007         {
3008           tree op = TREE_OPERAND (tmp, 0);
3009           if (op && !is_gimple_val (op))
3010             {
3011               gcc_assert (TREE_CODE (op) == MODIFY_EXPR);
3012               bsi_insert_before (bsi, op, BSI_NEW_STMT);
3013               TREE_OPERAND (tmp, 0) = TREE_OPERAND (op, 0);
3014             }
3015           bsi_prev (bsi);
3016           return true;
3017         }
3018     }
3019
3020   /* Otherwise, create a new basic block, and split this edge.  */
3021   dest = split_edge (e);
3022   if (new_bb)
3023     *new_bb = dest;
3024   e = single_pred_edge (dest);
3025   goto restart;
3026 }
3027
3028
3029 /* This routine will commit all pending edge insertions, creating any new
3030    basic blocks which are necessary.  */
3031
3032 void
3033 bsi_commit_edge_inserts (void)
3034 {
3035   basic_block bb;
3036   edge e;
3037   edge_iterator ei;
3038
3039   bsi_commit_one_edge_insert (single_succ_edge (ENTRY_BLOCK_PTR), NULL);
3040
3041   FOR_EACH_BB (bb)
3042     FOR_EACH_EDGE (e, ei, bb->succs)
3043       bsi_commit_one_edge_insert (e, NULL);
3044 }
3045
3046
3047 /* Commit insertions pending at edge E. If a new block is created, set NEW_BB
3048    to this block, otherwise set it to NULL.  */
3049
3050 void
3051 bsi_commit_one_edge_insert (edge e, basic_block *new_bb)
3052 {
3053   if (new_bb)
3054     *new_bb = NULL;
3055   if (PENDING_STMT (e))
3056     {
3057       block_stmt_iterator bsi;
3058       tree stmt = PENDING_STMT (e);
3059
3060       PENDING_STMT (e) = NULL_TREE;
3061
3062       if (tree_find_edge_insert_loc (e, &bsi, new_bb))
3063         bsi_insert_after (&bsi, stmt, BSI_NEW_STMT);
3064       else
3065         bsi_insert_before (&bsi, stmt, BSI_NEW_STMT);
3066     }
3067 }
3068
3069
3070 /* Add STMT to the pending list of edge E.  No actual insertion is
3071    made until a call to bsi_commit_edge_inserts () is made.  */
3072
3073 void
3074 bsi_insert_on_edge (edge e, tree stmt)
3075 {
3076   append_to_statement_list (stmt, &PENDING_STMT (e));
3077 }
3078
3079 /* Similar to bsi_insert_on_edge+bsi_commit_edge_inserts.  If a new
3080    block has to be created, it is returned.  */
3081
3082 basic_block
3083 bsi_insert_on_edge_immediate (edge e, tree stmt)
3084 {
3085   block_stmt_iterator bsi;
3086   basic_block new_bb = NULL;
3087
3088   gcc_assert (!PENDING_STMT (e));
3089
3090   if (tree_find_edge_insert_loc (e, &bsi, &new_bb))
3091     bsi_insert_after (&bsi, stmt, BSI_NEW_STMT);
3092   else
3093     bsi_insert_before (&bsi, stmt, BSI_NEW_STMT);
3094
3095   return new_bb;
3096 }
3097
3098 /*---------------------------------------------------------------------------
3099              Tree specific functions for CFG manipulation
3100 ---------------------------------------------------------------------------*/
3101
3102 /* Reinstall those PHI arguments queued in OLD_EDGE to NEW_EDGE.  */
3103
3104 static void
3105 reinstall_phi_args (edge new_edge, edge old_edge)
3106 {
3107   tree var, phi;
3108
3109   if (!PENDING_STMT (old_edge))
3110     return;
3111   
3112   for (var = PENDING_STMT (old_edge), phi = phi_nodes (new_edge->dest);
3113        var && phi;
3114        var = TREE_CHAIN (var), phi = PHI_CHAIN (phi))
3115     {
3116       tree result = TREE_PURPOSE (var);
3117       tree arg = TREE_VALUE (var);
3118
3119       gcc_assert (result == PHI_RESULT (phi));
3120
3121       add_phi_arg (phi, arg, new_edge);
3122     }
3123
3124   PENDING_STMT (old_edge) = NULL;
3125 }
3126
3127 /* Returns the basic block after that the new basic block created
3128    by splitting edge EDGE_IN should be placed.  Tries to keep the new block
3129    near its "logical" location.  This is of most help to humans looking
3130    at debugging dumps.  */
3131
3132 static basic_block
3133 split_edge_bb_loc (edge edge_in)
3134 {
3135   basic_block dest = edge_in->dest;
3136
3137   if (dest->prev_bb && find_edge (dest->prev_bb, dest))
3138     return edge_in->src;
3139   else
3140     return dest->prev_bb;
3141 }
3142
3143 /* Split a (typically critical) edge EDGE_IN.  Return the new block.
3144    Abort on abnormal edges.  */
3145
3146 static basic_block
3147 tree_split_edge (edge edge_in)
3148 {
3149   basic_block new_bb, after_bb, dest, src;
3150   edge new_edge, e;
3151
3152   /* Abnormal edges cannot be split.  */
3153   gcc_assert (!(edge_in->flags & EDGE_ABNORMAL));
3154
3155   src = edge_in->src;
3156   dest = edge_in->dest;
3157
3158   after_bb = split_edge_bb_loc (edge_in);
3159
3160   new_bb = create_empty_bb (after_bb);
3161   new_bb->frequency = EDGE_FREQUENCY (edge_in);
3162   new_bb->count = edge_in->count;
3163   new_edge = make_edge (new_bb, dest, EDGE_FALLTHRU);
3164   new_edge->probability = REG_BR_PROB_BASE;
3165   new_edge->count = edge_in->count;
3166
3167   e = redirect_edge_and_branch (edge_in, new_bb);
3168   gcc_assert (e);
3169   reinstall_phi_args (new_edge, e);
3170
3171   return new_bb;
3172 }
3173
3174
3175 /* Return true when BB has label LABEL in it.  */
3176
3177 static bool
3178 has_label_p (basic_block bb, tree label)
3179 {
3180   block_stmt_iterator bsi;
3181
3182   for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
3183     {
3184       tree stmt = bsi_stmt (bsi);
3185
3186       if (TREE_CODE (stmt) != LABEL_EXPR)
3187         return false;
3188       if (LABEL_EXPR_LABEL (stmt) == label)
3189         return true;
3190     }
3191   return false;
3192 }
3193
3194
3195 /* Callback for walk_tree, check that all elements with address taken are
3196    properly noticed as such.  The DATA is an int* that is 1 if TP was seen
3197    inside a PHI node.  */
3198
3199 static tree
3200 verify_expr (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
3201 {
3202   tree t = *tp, x;
3203   bool in_phi = (data != NULL);
3204
3205   if (TYPE_P (t))
3206     *walk_subtrees = 0;
3207   
3208   /* Check operand N for being valid GIMPLE and give error MSG if not.  */
3209 #define CHECK_OP(N, MSG) \
3210   do { if (!is_gimple_val (TREE_OPERAND (t, N)))                \
3211        { error (MSG); return TREE_OPERAND (t, N); }} while (0)
3212
3213   switch (TREE_CODE (t))
3214     {
3215     case SSA_NAME:
3216       if (SSA_NAME_IN_FREE_LIST (t))
3217         {
3218           error ("SSA name in freelist but still referenced");
3219           return *tp;
3220         }
3221       break;
3222
3223     case ASSERT_EXPR:
3224       x = fold (ASSERT_EXPR_COND (t));
3225       if (x == boolean_false_node)
3226         {
3227           error ("ASSERT_EXPR with an always-false condition");
3228           return *tp;
3229         }
3230       break;
3231
3232     case MODIFY_EXPR:
3233       x = TREE_OPERAND (t, 0);
3234       if (TREE_CODE (x) == BIT_FIELD_REF
3235           && is_gimple_reg (TREE_OPERAND (x, 0)))
3236         {
3237           error ("GIMPLE register modified with BIT_FIELD_REF");
3238           return t;
3239         }
3240       break;
3241
3242     case ADDR_EXPR:
3243       {
3244         bool old_invariant;
3245         bool old_constant;
3246         bool old_side_effects;
3247         bool new_invariant;
3248         bool new_constant;
3249         bool new_side_effects;
3250
3251         /* ??? tree-ssa-alias.c may have overlooked dead PHI nodes, missing
3252            dead PHIs that take the address of something.  But if the PHI
3253            result is dead, the fact that it takes the address of anything
3254            is irrelevant.  Because we can not tell from here if a PHI result
3255            is dead, we just skip this check for PHIs altogether.  This means
3256            we may be missing "valid" checks, but what can you do?
3257            This was PR19217.  */
3258         if (in_phi)
3259           break;
3260
3261         old_invariant = TREE_INVARIANT (t);
3262         old_constant = TREE_CONSTANT (t);
3263         old_side_effects = TREE_SIDE_EFFECTS (t);
3264
3265         recompute_tree_invariant_for_addr_expr (t);
3266         new_invariant = TREE_INVARIANT (t);
3267         new_side_effects = TREE_SIDE_EFFECTS (t);
3268         new_constant = TREE_CONSTANT (t);
3269
3270         if (old_invariant != new_invariant)
3271           {
3272             error ("invariant not recomputed when ADDR_EXPR changed");
3273             return t;
3274           }
3275
3276         if (old_constant != new_constant)
3277           {
3278             error ("constant not recomputed when ADDR_EXPR changed");
3279             return t;
3280           }
3281         if (old_side_effects != new_side_effects)
3282           {
3283             error ("side effects not recomputed when ADDR_EXPR changed");
3284             return t;
3285           }
3286
3287         /* Skip any references (they will be checked when we recurse down the
3288            tree) and ensure that any variable used as a prefix is marked
3289            addressable.  */
3290         for (x = TREE_OPERAND (t, 0);
3291              handled_component_p (x);
3292              x = TREE_OPERAND (x, 0))
3293           ;
3294
3295         if (TREE_CODE (x) != VAR_DECL && TREE_CODE (x) != PARM_DECL)
3296           return NULL;
3297         if (!TREE_ADDRESSABLE (x))
3298           {
3299             error ("address taken, but ADDRESSABLE bit not set");
3300             return x;
3301           }
3302         break;
3303       }
3304
3305     case COND_EXPR:
3306       x = COND_EXPR_COND (t);
3307       if (TREE_CODE (TREE_TYPE (x)) != BOOLEAN_TYPE)
3308         {
3309           error ("non-boolean used in condition");
3310           return x;
3311         }
3312       if (!is_gimple_condexpr (x))
3313         {
3314           error ("invalid conditional operand");
3315           return x;
3316         }
3317       break;
3318
3319     case NOP_EXPR:
3320     case CONVERT_EXPR:
3321     case FIX_TRUNC_EXPR:
3322     case FIX_CEIL_EXPR:
3323     case FIX_FLOOR_EXPR:
3324     case FIX_ROUND_EXPR:
3325     case FLOAT_EXPR:
3326     case NEGATE_EXPR:
3327     case ABS_EXPR:
3328     case BIT_NOT_EXPR:
3329     case NON_LVALUE_EXPR:
3330     case TRUTH_NOT_EXPR:
3331       CHECK_OP (0, "invalid operand to unary operator");
3332       break;
3333
3334     case REALPART_EXPR:
3335     case IMAGPART_EXPR:
3336     case COMPONENT_REF:
3337     case ARRAY_REF:
3338     case ARRAY_RANGE_REF:
3339     case BIT_FIELD_REF:
3340     case VIEW_CONVERT_EXPR:
3341       /* We have a nest of references.  Verify that each of the operands
3342          that determine where to reference is either a constant or a variable,
3343          verify that the base is valid, and then show we've already checked
3344          the subtrees.  */
3345       while (handled_component_p (t))
3346         {
3347           if (TREE_CODE (t) == COMPONENT_REF && TREE_OPERAND (t, 2))
3348             CHECK_OP (2, "invalid COMPONENT_REF offset operator");
3349           else if (TREE_CODE (t) == ARRAY_REF
3350                    || TREE_CODE (t) == ARRAY_RANGE_REF)
3351             {
3352               CHECK_OP (1, "invalid array index");
3353               if (TREE_OPERAND (t, 2))
3354                 CHECK_OP (2, "invalid array lower bound");
3355               if (TREE_OPERAND (t, 3))
3356                 CHECK_OP (3, "invalid array stride");
3357             }
3358           else if (TREE_CODE (t) == BIT_FIELD_REF)
3359             {
3360               CHECK_OP (1, "invalid operand to BIT_FIELD_REF");
3361               CHECK_OP (2, "invalid operand to BIT_FIELD_REF");
3362             }
3363
3364           t = TREE_OPERAND (t, 0);
3365         }
3366
3367       if (!CONSTANT_CLASS_P (t) && !is_gimple_lvalue (t))
3368         {
3369           error ("invalid reference prefix");
3370           return t;
3371         }
3372       *walk_subtrees = 0;
3373       break;
3374
3375     case LT_EXPR:
3376     case LE_EXPR:
3377     case GT_EXPR:
3378     case GE_EXPR:
3379     case EQ_EXPR:
3380     case NE_EXPR:
3381     case UNORDERED_EXPR:
3382     case ORDERED_EXPR:
3383     case UNLT_EXPR:
3384     case UNLE_EXPR:
3385     case UNGT_EXPR:
3386     case UNGE_EXPR:
3387     case UNEQ_EXPR:
3388     case LTGT_EXPR:
3389     case PLUS_EXPR:
3390     case MINUS_EXPR:
3391     case MULT_EXPR:
3392     case TRUNC_DIV_EXPR:
3393     case CEIL_DIV_EXPR:
3394     case FLOOR_DIV_EXPR:
3395     case ROUND_DIV_EXPR:
3396     case TRUNC_MOD_EXPR:
3397     case CEIL_MOD_EXPR:
3398     case FLOOR_MOD_EXPR:
3399     case ROUND_MOD_EXPR:
3400     case RDIV_EXPR:
3401     case EXACT_DIV_EXPR:
3402     case MIN_EXPR:
3403     case MAX_EXPR:
3404     case LSHIFT_EXPR:
3405     case RSHIFT_EXPR:
3406     case LROTATE_EXPR:
3407     case RROTATE_EXPR:
3408     case BIT_IOR_EXPR:
3409     case BIT_XOR_EXPR:
3410     case BIT_AND_EXPR:
3411       CHECK_OP (0, "invalid operand to binary operator");
3412       CHECK_OP (1, "invalid operand to binary operator");
3413       break;
3414
3415     default:
3416       break;
3417     }
3418   return NULL;
3419
3420 #undef CHECK_OP
3421 }
3422
3423
3424 /* Verify STMT, return true if STMT is not in GIMPLE form.
3425    TODO: Implement type checking.  */
3426
3427 static bool
3428 verify_stmt (tree stmt, bool last_in_block)
3429 {
3430   tree addr;
3431
3432   if (!is_gimple_stmt (stmt))
3433     {
3434       error ("is not a valid GIMPLE statement");
3435       goto fail;
3436     }
3437
3438   addr = walk_tree (&stmt, verify_expr, NULL, NULL);
3439   if (addr)
3440     {
3441       debug_generic_stmt (addr);
3442       return true;
3443     }
3444
3445   /* If the statement is marked as part of an EH region, then it is
3446      expected that the statement could throw.  Verify that when we
3447      have optimizations that simplify statements such that we prove
3448      that they cannot throw, that we update other data structures
3449      to match.  */
3450   if (lookup_stmt_eh_region (stmt) >= 0)
3451     {
3452       if (!tree_could_throw_p (stmt))
3453         {
3454           error ("statement marked for throw, but doesn%'t");
3455           goto fail;
3456         }
3457       if (!last_in_block && tree_can_throw_internal (stmt))
3458         {
3459           error ("statement marked for throw in middle of block");
3460           goto fail;
3461         }
3462     }
3463
3464   return false;
3465
3466  fail:
3467   debug_generic_stmt (stmt);
3468   return true;
3469 }
3470
3471
3472 /* Return true when the T can be shared.  */
3473
3474 static bool
3475 tree_node_can_be_shared (tree t)
3476 {
3477   if (IS_TYPE_OR_DECL_P (t)
3478       /* We check for constants explicitly since they are not considered
3479          gimple invariants if they overflowed.  */
3480       || CONSTANT_CLASS_P (t)
3481       || is_gimple_min_invariant (t)
3482       || TREE_CODE (t) == SSA_NAME
3483       || t == error_mark_node)
3484     return true;
3485
3486   if (TREE_CODE (t) == CASE_LABEL_EXPR)
3487     return true;
3488
3489   while (((TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
3490           /* We check for constants explicitly since they are not considered
3491              gimple invariants if they overflowed.  */
3492           && (CONSTANT_CLASS_P (TREE_OPERAND (t, 1))
3493               || is_gimple_min_invariant (TREE_OPERAND (t, 1))))
3494          || (TREE_CODE (t) == COMPONENT_REF
3495              || TREE_CODE (t) == REALPART_EXPR
3496              || TREE_CODE (t) == IMAGPART_EXPR))
3497     t = TREE_OPERAND (t, 0);
3498
3499   if (DECL_P (t))
3500     return true;
3501
3502   return false;
3503 }
3504
3505
3506 /* Called via walk_trees.  Verify tree sharing.  */
3507
3508 static tree
3509 verify_node_sharing (tree * tp, int *walk_subtrees, void *data)
3510 {
3511   htab_t htab = (htab_t) data;
3512   void **slot;
3513
3514   if (tree_node_can_be_shared (*tp))
3515     {
3516       *walk_subtrees = false;
3517       return NULL;
3518     }
3519
3520   slot = htab_find_slot (htab, *tp, INSERT);
3521   if (*slot)
3522     return (tree) *slot;
3523   *slot = *tp;
3524
3525   return NULL;
3526 }
3527
3528
3529 /* Verify the GIMPLE statement chain.  */
3530
3531 void
3532 verify_stmts (void)
3533 {
3534   basic_block bb;
3535   block_stmt_iterator bsi;
3536   bool err = false;
3537   htab_t htab;
3538   tree addr;
3539
3540   timevar_push (TV_TREE_STMT_VERIFY);
3541   htab = htab_create (37, htab_hash_pointer, htab_eq_pointer, NULL);
3542
3543   FOR_EACH_BB (bb)
3544     {
3545       tree phi;
3546       int i;
3547
3548       for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
3549         {
3550           int phi_num_args = PHI_NUM_ARGS (phi);
3551
3552           if (bb_for_stmt (phi) != bb)
3553             {
3554               error ("bb_for_stmt (phi) is set to a wrong basic block");
3555               err |= true;
3556             }
3557
3558           for (i = 0; i < phi_num_args; i++)
3559             {
3560               tree t = PHI_ARG_DEF (phi, i);
3561               tree addr;
3562
3563               /* Addressable variables do have SSA_NAMEs but they
3564                  are not considered gimple values.  */
3565               if (TREE_CODE (t) != SSA_NAME
3566                   && TREE_CODE (t) != FUNCTION_DECL
3567                   && !is_gimple_val (t))
3568                 {
3569                   error ("PHI def is not a GIMPLE value");
3570                   debug_generic_stmt (phi);
3571                   debug_generic_stmt (t);
3572                   err |= true;
3573                 }
3574
3575               addr = walk_tree (&t, verify_expr, (void *) 1, NULL);
3576               if (addr)
3577                 {
3578                   debug_generic_stmt (addr);
3579                   err |= true;
3580                 }
3581
3582               addr = walk_tree (&t, verify_node_sharing, htab, NULL);
3583               if (addr)
3584                 {
3585                   error ("incorrect sharing of tree nodes");
3586                   debug_generic_stmt (phi);
3587                   debug_generic_stmt (addr);
3588                   err |= true;
3589                 }
3590             }
3591         }
3592
3593       for (bsi = bsi_start (bb); !bsi_end_p (bsi); )
3594         {
3595           tree stmt = bsi_stmt (bsi);
3596
3597           if (bb_for_stmt (stmt) != bb)
3598             {
3599               error ("bb_for_stmt (stmt) is set to a wrong basic block");
3600               err |= true;
3601             }
3602
3603           bsi_next (&bsi);
3604           err |= verify_stmt (stmt, bsi_end_p (bsi));
3605           addr = walk_tree (&stmt, verify_node_sharing, htab, NULL);
3606           if (addr)
3607             {
3608               error ("incorrect sharing of tree nodes");
3609               debug_generic_stmt (stmt);
3610               debug_generic_stmt (addr);
3611               err |= true;
3612             }
3613         }
3614     }
3615
3616   if (err)
3617     internal_error ("verify_stmts failed");
3618
3619   htab_delete (htab);
3620   timevar_pop (TV_TREE_STMT_VERIFY);
3621 }
3622
3623
3624 /* Verifies that the flow information is OK.  */
3625
3626 static int
3627 tree_verify_flow_info (void)
3628 {
3629   int err = 0;
3630   basic_block bb;
3631   block_stmt_iterator bsi;
3632   tree stmt;
3633   edge e;
3634   edge_iterator ei;
3635
3636   if (ENTRY_BLOCK_PTR->stmt_list)
3637     {
3638       error ("ENTRY_BLOCK has a statement list associated with it");
3639       err = 1;
3640     }
3641
3642   if (EXIT_BLOCK_PTR->stmt_list)
3643     {
3644       error ("EXIT_BLOCK has a statement list associated with it");
3645       err = 1;
3646     }
3647
3648   FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
3649     if (e->flags & EDGE_FALLTHRU)
3650       {
3651         error ("fallthru to exit from bb %d", e->src->index);
3652         err = 1;
3653       }
3654
3655   FOR_EACH_BB (bb)
3656     {
3657       bool found_ctrl_stmt = false;
3658
3659       stmt = NULL_TREE;
3660
3661       /* Skip labels on the start of basic block.  */
3662       for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
3663         {
3664           tree prev_stmt = stmt;
3665
3666           stmt = bsi_stmt (bsi);
3667
3668           if (TREE_CODE (stmt) != LABEL_EXPR)
3669             break;
3670
3671           if (prev_stmt && DECL_NONLOCAL (LABEL_EXPR_LABEL (stmt)))
3672             {
3673               error ("nonlocal label %s is not first "
3674                      "in a sequence of labels in bb %d",
3675                      IDENTIFIER_POINTER (DECL_NAME (LABEL_EXPR_LABEL (stmt))),
3676                      bb->index);
3677               err = 1;
3678             }
3679
3680           if (label_to_block (LABEL_EXPR_LABEL (stmt)) != bb)
3681             {
3682               error ("label %s to block does not match in bb %d",
3683                      IDENTIFIER_POINTER (DECL_NAME (LABEL_EXPR_LABEL (stmt))),
3684                      bb->index);
3685               err = 1;
3686             }
3687
3688           if (decl_function_context (LABEL_EXPR_LABEL (stmt))
3689               != current_function_decl)
3690             {
3691               error ("label %s has incorrect context in bb %d",
3692                      IDENTIFIER_POINTER (DECL_NAME (LABEL_EXPR_LABEL (stmt))),
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 %s in the middle of basic block %d",
3716                      IDENTIFIER_POINTER (DECL_NAME (LABEL_EXPR_LABEL (stmt))),
3717                      bb->index);
3718               err = 1;
3719             }
3720         }
3721       bsi = bsi_last (bb);
3722       if (bsi_end_p (bsi))
3723         continue;
3724
3725       stmt = bsi_stmt (bsi);
3726
3727       err |= verify_eh_edges (stmt);
3728
3729       if (is_ctrl_stmt (stmt))
3730         {
3731           FOR_EACH_EDGE (e, ei, bb->succs)
3732             if (e->flags & EDGE_FALLTHRU)
3733               {
3734                 error ("fallthru edge after a control statement in bb %d",
3735                        bb->index);
3736                 err = 1;
3737               }
3738         }
3739
3740       switch (TREE_CODE (stmt))
3741         {
3742         case COND_EXPR:
3743           {
3744             edge true_edge;
3745             edge false_edge;
3746             if (TREE_CODE (COND_EXPR_THEN (stmt)) != GOTO_EXPR
3747                 || TREE_CODE (COND_EXPR_ELSE (stmt)) != GOTO_EXPR)
3748               {
3749                 error ("structured COND_EXPR at the end of bb %d", bb->index);
3750                 err = 1;
3751               }
3752
3753             extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
3754
3755             if (!true_edge || !false_edge
3756                 || !(true_edge->flags & EDGE_TRUE_VALUE)
3757                 || !(false_edge->flags & EDGE_FALSE_VALUE)
3758                 || (true_edge->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL))
3759                 || (false_edge->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL))
3760                 || EDGE_COUNT (bb->succs) >= 3)
3761               {
3762                 error ("wrong outgoing edge flags at end of bb %d",
3763                        bb->index);
3764                 err = 1;
3765               }
3766
3767             if (!has_label_p (true_edge->dest,
3768                               GOTO_DESTINATION (COND_EXPR_THEN (stmt))))
3769               {
3770                 error ("%<then%> label does not match edge at end of bb %d",
3771                        bb->index);
3772                 err = 1;
3773               }
3774
3775             if (!has_label_p (false_edge->dest,
3776                               GOTO_DESTINATION (COND_EXPR_ELSE (stmt))))
3777               {
3778                 error ("%<else%> label does not match edge at end of bb %d",
3779                        bb->index);
3780                 err = 1;
3781               }
3782           }
3783           break;
3784
3785         case GOTO_EXPR:
3786           if (simple_goto_p (stmt))
3787             {
3788               error ("explicit goto at end of bb %d", bb->index);
3789               err = 1;
3790             }
3791           else
3792             {
3793               /* FIXME.  We should double check that the labels in the 
3794                  destination blocks have their address taken.  */
3795               FOR_EACH_EDGE (e, ei, bb->succs)
3796                 if ((e->flags & (EDGE_FALLTHRU | EDGE_TRUE_VALUE
3797                                  | EDGE_FALSE_VALUE))
3798                     || !(e->flags & EDGE_ABNORMAL))
3799                   {
3800                     error ("wrong outgoing edge flags at end of bb %d",
3801                            bb->index);
3802                     err = 1;
3803                   }
3804             }
3805           break;
3806
3807         case RETURN_EXPR:
3808           if (!single_succ_p (bb)
3809               || (single_succ_edge (bb)->flags
3810                   & (EDGE_FALLTHRU | EDGE_ABNORMAL
3811                      | EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
3812             {
3813               error ("wrong outgoing edge flags at end of bb %d", bb->index);
3814               err = 1;
3815             }
3816           if (single_succ (bb) != EXIT_BLOCK_PTR)
3817             {
3818               error ("return edge does not point to exit in bb %d",
3819                      bb->index);
3820               err = 1;
3821             }
3822           break;
3823
3824         case SWITCH_EXPR:
3825           {
3826             tree prev;
3827             edge e;
3828             size_t i, n;
3829             tree vec;
3830
3831             vec = SWITCH_LABELS (stmt);
3832             n = TREE_VEC_LENGTH (vec);
3833
3834             /* Mark all the destination basic blocks.  */
3835             for (i = 0; i < n; ++i)
3836               {
3837                 tree lab = CASE_LABEL (TREE_VEC_ELT (vec, i));
3838                 basic_block label_bb = label_to_block (lab);
3839
3840                 gcc_assert (!label_bb->aux || label_bb->aux == (void *)1);
3841                 label_bb->aux = (void *)1;
3842               }
3843
3844             /* Verify that the case labels are sorted.  */
3845             prev = TREE_VEC_ELT (vec, 0);
3846             for (i = 1; i < n - 1; ++i)
3847               {
3848                 tree c = TREE_VEC_ELT (vec, i);
3849                 if (! CASE_LOW (c))
3850                   {
3851                     error ("found default case not at end of case vector");
3852                     err = 1;
3853                     continue;
3854                   }
3855                 if (! tree_int_cst_lt (CASE_LOW (prev), CASE_LOW (c)))
3856                   {
3857                     error ("case labels not sorted:");
3858                     print_generic_expr (stderr, prev, 0);
3859                     fprintf (stderr," is greater than ");
3860                     print_generic_expr (stderr, c, 0);
3861                     fprintf (stderr," but comes before it.\n");
3862                     err = 1;
3863                   }
3864                 prev = c;
3865               }
3866             if (CASE_LOW (TREE_VEC_ELT (vec, n - 1)))
3867               {
3868                 error ("no default case found at end of case vector");
3869                 err = 1;
3870               }
3871
3872             FOR_EACH_EDGE (e, ei, bb->succs)
3873               {
3874                 if (!e->dest->aux)
3875                   {
3876                     error ("extra outgoing edge %d->%d",
3877                            bb->index, e->dest->index);
3878                     err = 1;
3879                   }
3880                 e->dest->aux = (void *)2;
3881                 if ((e->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL
3882                                  | EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
3883                   {
3884                     error ("wrong outgoing edge flags at end of bb %d",
3885                            bb->index);
3886                     err = 1;
3887                   }
3888               }
3889
3890             /* Check that we have all of them.  */
3891             for (i = 0; i < n; ++i)
3892               {
3893                 tree lab = CASE_LABEL (TREE_VEC_ELT (vec, i));
3894                 basic_block label_bb = label_to_block (lab);
3895
3896                 if (label_bb->aux != (void *)2)
3897                   {
3898                     error ("missing edge %i->%i",
3899                            bb->index, label_bb->index);
3900                     err = 1;
3901                   }
3902               }
3903
3904             FOR_EACH_EDGE (e, ei, bb->succs)
3905               e->dest->aux = (void *)0;
3906           }
3907
3908         default: ;
3909         }
3910     }
3911
3912   if (dom_computed[CDI_DOMINATORS] >= DOM_NO_FAST_QUERY)
3913     verify_dominators (CDI_DOMINATORS);
3914
3915   return err;
3916 }
3917
3918
3919 /* Updates phi nodes after creating a forwarder block joined
3920    by edge FALLTHRU.  */
3921
3922 static void
3923 tree_make_forwarder_block (edge fallthru)
3924 {
3925   edge e;
3926   edge_iterator ei;
3927   basic_block dummy, bb;
3928   tree phi, new_phi, var;
3929
3930   dummy = fallthru->src;
3931   bb = fallthru->dest;
3932
3933   if (single_pred_p (bb))
3934     return;
3935
3936   /* If we redirected a branch we must create new phi nodes at the
3937      start of BB.  */
3938   for (phi = phi_nodes (dummy); phi; phi = PHI_CHAIN (phi))
3939     {
3940       var = PHI_RESULT (phi);
3941       new_phi = create_phi_node (var, bb);
3942       SSA_NAME_DEF_STMT (var) = new_phi;
3943       SET_PHI_RESULT (phi, make_ssa_name (SSA_NAME_VAR (var), phi));
3944       add_phi_arg (new_phi, PHI_RESULT (phi), fallthru);
3945     }
3946
3947   /* Ensure that the PHI node chain is in the same order.  */
3948   set_phi_nodes (bb, phi_reverse (phi_nodes (bb)));
3949
3950   /* Add the arguments we have stored on edges.  */
3951   FOR_EACH_EDGE (e, ei, bb->preds)
3952     {
3953       if (e == fallthru)
3954         continue;
3955
3956       flush_pending_stmts (e);
3957     }
3958 }
3959
3960
3961 /* Return a non-special label in the head of basic block BLOCK.
3962    Create one if it doesn't exist.  */
3963
3964 tree
3965 tree_block_label (basic_block bb)
3966 {
3967   block_stmt_iterator i, s = bsi_start (bb);
3968   bool first = true;
3969   tree label, stmt;
3970
3971   for (i = s; !bsi_end_p (i); first = false, bsi_next (&i))
3972     {
3973       stmt = bsi_stmt (i);
3974       if (TREE_CODE (stmt) != LABEL_EXPR)
3975         break;
3976       label = LABEL_EXPR_LABEL (stmt);
3977       if (!DECL_NONLOCAL (label))
3978         {
3979           if (!first)
3980             bsi_move_before (&i, &s);
3981           return label;
3982         }
3983     }
3984
3985   label = create_artificial_label ();
3986   stmt = build1 (LABEL_EXPR, void_type_node, label);
3987   bsi_insert_before (&s, stmt, BSI_NEW_STMT);
3988   return label;
3989 }
3990
3991
3992 /* Attempt to perform edge redirection by replacing a possibly complex
3993    jump instruction by a goto or by removing the jump completely.
3994    This can apply only if all edges now point to the same block.  The
3995    parameters and return values are equivalent to
3996    redirect_edge_and_branch.  */
3997
3998 static edge
3999 tree_try_redirect_by_replacing_jump (edge e, basic_block target)
4000 {
4001   basic_block src = e->src;
4002   block_stmt_iterator b;
4003   tree stmt;
4004
4005   /* We can replace or remove a complex jump only when we have exactly
4006      two edges.  */
4007   if (EDGE_COUNT (src->succs) != 2
4008       /* Verify that all targets will be TARGET.  Specifically, the
4009          edge that is not E must also go to TARGET.  */
4010       || EDGE_SUCC (src, EDGE_SUCC (src, 0) == e)->dest != target)
4011     return NULL;
4012
4013   b = bsi_last (src);
4014   if (bsi_end_p (b))
4015     return NULL;
4016   stmt = bsi_stmt (b);
4017
4018   if (TREE_CODE (stmt) == COND_EXPR
4019       || TREE_CODE (stmt) == SWITCH_EXPR)
4020     {
4021       bsi_remove (&b, true);
4022       e = ssa_redirect_edge (e, target);
4023       e->flags = EDGE_FALLTHRU;
4024       return e;
4025     }
4026
4027   return NULL;
4028 }
4029
4030
4031 /* Redirect E to DEST.  Return NULL on failure.  Otherwise, return the
4032    edge representing the redirected branch.  */
4033
4034 static edge
4035 tree_redirect_edge_and_branch (edge e, basic_block dest)
4036 {
4037   basic_block bb = e->src;
4038   block_stmt_iterator bsi;
4039   edge ret;
4040   tree label, stmt;
4041
4042   if (e->flags & (EDGE_ABNORMAL_CALL | EDGE_EH))
4043     return NULL;
4044
4045   if (e->src != ENTRY_BLOCK_PTR 
4046       && (ret = tree_try_redirect_by_replacing_jump (e, dest)))
4047     return ret;
4048
4049   if (e->dest == dest)
4050     return NULL;
4051
4052   label = tree_block_label (dest);
4053
4054   bsi = bsi_last (bb);
4055   stmt = bsi_end_p (bsi) ? NULL : bsi_stmt (bsi);
4056
4057   switch (stmt ? TREE_CODE (stmt) : ERROR_MARK)
4058     {
4059     case COND_EXPR:
4060       stmt = (e->flags & EDGE_TRUE_VALUE
4061               ? COND_EXPR_THEN (stmt)
4062               : COND_EXPR_ELSE (stmt));
4063       GOTO_DESTINATION (stmt) = label;
4064       break;
4065
4066     case GOTO_EXPR:
4067       /* No non-abnormal edges should lead from a non-simple goto, and
4068          simple ones should be represented implicitly.  */
4069       gcc_unreachable ();
4070
4071     case SWITCH_EXPR:
4072       {
4073         tree cases = get_cases_for_edge (e, stmt);
4074
4075         /* If we have a list of cases associated with E, then use it
4076            as it's a lot faster than walking the entire case vector.  */
4077         if (cases)
4078           {
4079             edge e2 = find_edge (e->src, dest);
4080             tree last, first;
4081
4082             first = cases;
4083             while (cases)
4084               {
4085                 last = cases;
4086                 CASE_LABEL (cases) = label;
4087                 cases = TREE_CHAIN (cases);
4088               }
4089
4090             /* If there was already an edge in the CFG, then we need
4091                to move all the cases associated with E to E2.  */
4092             if (e2)
4093               {
4094                 tree cases2 = get_cases_for_edge (e2, stmt);
4095
4096                 TREE_CHAIN (last) = TREE_CHAIN (cases2);
4097                 TREE_CHAIN (cases2) = first;
4098               }
4099           }
4100         else
4101           {
4102             tree vec = SWITCH_LABELS (stmt);
4103             size_t i, n = TREE_VEC_LENGTH (vec);
4104
4105             for (i = 0; i < n; i++)
4106               {
4107                 tree elt = TREE_VEC_ELT (vec, i);
4108
4109                 if (label_to_block (CASE_LABEL (elt)) == e->dest)
4110                   CASE_LABEL (elt) = label;
4111               }
4112           }
4113
4114         break;
4115       }
4116
4117     case RETURN_EXPR:
4118       bsi_remove (&bsi, true);
4119       e->flags |= EDGE_FALLTHRU;
4120       break;
4121
4122     default:
4123       /* Otherwise it must be a fallthru edge, and we don't need to
4124          do anything besides redirecting it.  */
4125       gcc_assert (e->flags & EDGE_FALLTHRU);
4126       break;
4127     }
4128
4129   /* Update/insert PHI nodes as necessary.  */
4130
4131   /* Now update the edges in the CFG.  */
4132   e = ssa_redirect_edge (e, dest);
4133
4134   return e;
4135 }
4136
4137
4138 /* Simple wrapper, as we can always redirect fallthru edges.  */
4139
4140 static basic_block
4141 tree_redirect_edge_and_branch_force (edge e, basic_block dest)
4142 {
4143   e = tree_redirect_edge_and_branch (e, dest);
4144   gcc_assert (e);
4145
4146   return NULL;
4147 }
4148
4149
4150 /* Splits basic block BB after statement STMT (but at least after the
4151    labels).  If STMT is NULL, BB is split just after the labels.  */
4152
4153 static basic_block
4154 tree_split_block (basic_block bb, void *stmt)
4155 {
4156   block_stmt_iterator bsi, bsi_tgt;
4157   tree act;
4158   basic_block new_bb;
4159   edge e;
4160   edge_iterator ei;
4161
4162   new_bb = create_empty_bb (bb);
4163
4164   /* Redirect the outgoing edges.  */
4165   new_bb->succs = bb->succs;
4166   bb->succs = NULL;
4167   FOR_EACH_EDGE (e, ei, new_bb->succs)
4168     e->src = new_bb;
4169
4170   if (stmt && TREE_CODE ((tree) stmt) == LABEL_EXPR)
4171     stmt = NULL;
4172
4173   /* Move everything from BSI to the new basic block.  */
4174   for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
4175     {
4176       act = bsi_stmt (bsi);
4177       if (TREE_CODE (act) == LABEL_EXPR)
4178         continue;
4179
4180       if (!stmt)
4181         break;
4182
4183       if (stmt == act)
4184         {
4185           bsi_next (&bsi);
4186           break;
4187         }
4188     }
4189
4190   bsi_tgt = bsi_start (new_bb);
4191   while (!bsi_end_p (bsi))
4192     {
4193       act = bsi_stmt (bsi);
4194       bsi_remove (&bsi, false);
4195       bsi_insert_after (&bsi_tgt, act, BSI_NEW_STMT);
4196     }
4197
4198   return new_bb;
4199 }
4200
4201
4202 /* Moves basic block BB after block AFTER.  */
4203
4204 static bool
4205 tree_move_block_after (basic_block bb, basic_block after)
4206 {
4207   if (bb->prev_bb == after)
4208     return true;
4209
4210   unlink_block (bb);
4211   link_block (bb, after);
4212
4213   return true;
4214 }
4215
4216
4217 /* Return true if basic_block can be duplicated.  */
4218
4219 static bool
4220 tree_can_duplicate_bb_p (basic_block bb ATTRIBUTE_UNUSED)
4221 {
4222   return true;
4223 }
4224
4225
4226 /* Create a duplicate of the basic block BB.  NOTE: This does not
4227    preserve SSA form.  */
4228
4229 static basic_block
4230 tree_duplicate_bb (basic_block bb)
4231 {
4232   basic_block new_bb;
4233   block_stmt_iterator bsi, bsi_tgt;
4234   tree phi;
4235
4236   new_bb = create_empty_bb (EXIT_BLOCK_PTR->prev_bb);
4237
4238   /* Copy the PHI nodes.  We ignore PHI node arguments here because
4239      the incoming edges have not been setup yet.  */
4240   for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
4241     {
4242       tree copy = create_phi_node (PHI_RESULT (phi), new_bb);
4243       create_new_def_for (PHI_RESULT (copy), copy, PHI_RESULT_PTR (copy));
4244     }
4245
4246   /* Keep the chain of PHI nodes in the same order so that they can be
4247      updated by ssa_redirect_edge.  */
4248   set_phi_nodes (new_bb, phi_reverse (phi_nodes (new_bb)));
4249
4250   bsi_tgt = bsi_start (new_bb);
4251   for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
4252     {
4253       def_operand_p def_p;
4254       ssa_op_iter op_iter;
4255       tree stmt, copy;
4256       int region;
4257
4258       stmt = bsi_stmt (bsi);
4259       if (TREE_CODE (stmt) == LABEL_EXPR)
4260         continue;
4261
4262       /* Create a new copy of STMT and duplicate STMT's virtual
4263          operands.  */
4264       copy = unshare_expr (stmt);
4265       bsi_insert_after (&bsi_tgt, copy, BSI_NEW_STMT);
4266       copy_virtual_operands (copy, stmt);
4267       region = lookup_stmt_eh_region (stmt);
4268       if (region >= 0)
4269         add_stmt_to_eh_region (copy, region);
4270
4271       /* Create new names for all the definitions created by COPY and
4272          add replacement mappings for each new name.  */
4273       FOR_EACH_SSA_DEF_OPERAND (def_p, copy, op_iter, SSA_OP_ALL_DEFS)
4274         create_new_def_for (DEF_FROM_PTR (def_p), copy, def_p);
4275     }
4276
4277   return new_bb;
4278 }
4279
4280
4281 /* Basic block BB_COPY was created by code duplication.  Add phi node
4282    arguments for edges going out of BB_COPY.  The blocks that were
4283    duplicated have BB_DUPLICATED set.  */
4284
4285 void
4286 add_phi_args_after_copy_bb (basic_block bb_copy)
4287 {
4288   basic_block bb, dest;
4289   edge e, e_copy;
4290   edge_iterator ei;
4291   tree phi, phi_copy, phi_next, def;
4292       
4293   bb = get_bb_original (bb_copy);
4294
4295   FOR_EACH_EDGE (e_copy, ei, bb_copy->succs)
4296     {
4297       if (!phi_nodes (e_copy->dest))
4298         continue;
4299
4300       if (e_copy->dest->flags & BB_DUPLICATED)
4301         dest = get_bb_original (e_copy->dest);
4302       else
4303         dest = e_copy->dest;
4304
4305       e = find_edge (bb, dest);
4306       if (!e)
4307         {
4308           /* During loop unrolling the target of the latch edge is copied.
4309              In this case we are not looking for edge to dest, but to
4310              duplicated block whose original was dest.  */
4311           FOR_EACH_EDGE (e, ei, bb->succs)
4312             if ((e->dest->flags & BB_DUPLICATED)
4313                 && get_bb_original (e->dest) == dest)
4314               break;
4315
4316           gcc_assert (e != NULL);
4317         }
4318
4319       for (phi = phi_nodes (e->dest), phi_copy = phi_nodes (e_copy->dest);
4320            phi;
4321            phi = phi_next, phi_copy = PHI_CHAIN (phi_copy))
4322         {
4323           phi_next = PHI_CHAIN (phi);
4324           def = PHI_ARG_DEF_FROM_EDGE (phi, e);
4325           add_phi_arg (phi_copy, def, e_copy);
4326         }
4327     }
4328 }
4329
4330 /* Blocks in REGION_COPY array of length N_REGION were created by
4331    duplication of basic blocks.  Add phi node arguments for edges
4332    going from these blocks.  */
4333
4334 void
4335 add_phi_args_after_copy (basic_block *region_copy, unsigned n_region)
4336 {
4337   unsigned i;
4338
4339   for (i = 0; i < n_region; i++)
4340     region_copy[i]->flags |= BB_DUPLICATED;
4341
4342   for (i = 0; i < n_region; i++)
4343     add_phi_args_after_copy_bb (region_copy[i]);
4344
4345   for (i = 0; i < n_region; i++)
4346     region_copy[i]->flags &= ~BB_DUPLICATED;
4347 }
4348
4349 /* Duplicates a REGION (set of N_REGION basic blocks) with just a single
4350    important exit edge EXIT.  By important we mean that no SSA name defined
4351    inside region is live over the other exit edges of the region.  All entry
4352    edges to the region must go to ENTRY->dest.  The edge ENTRY is redirected
4353    to the duplicate of the region.  SSA form, dominance and loop information
4354    is updated.  The new basic blocks are stored to REGION_COPY in the same
4355    order as they had in REGION, provided that REGION_COPY is not NULL.
4356    The function returns false if it is unable to copy the region,
4357    true otherwise.  */
4358
4359 bool
4360 tree_duplicate_sese_region (edge entry, edge exit,
4361                             basic_block *region, unsigned n_region,
4362                             basic_block *region_copy)
4363 {
4364   unsigned i, n_doms;
4365   bool free_region_copy = false, copying_header = false;
4366   struct loop *loop = entry->dest->loop_father;
4367   edge exit_copy;
4368   basic_block *doms;
4369   edge redirected;
4370   int total_freq = 0, entry_freq = 0;
4371   gcov_type total_count = 0, entry_count = 0;
4372
4373   if (!can_copy_bbs_p (region, n_region))
4374     return false;
4375
4376   /* Some sanity checking.  Note that we do not check for all possible
4377      missuses of the functions.  I.e. if you ask to copy something weird,
4378      it will work, but the state of structures probably will not be
4379      correct.  */
4380   for (i = 0; i < n_region; i++)
4381     {
4382       /* We do not handle subloops, i.e. all the blocks must belong to the
4383          same loop.  */
4384       if (region[i]->loop_father != loop)
4385         return false;
4386
4387       if (region[i] != entry->dest
4388           && region[i] == loop->header)
4389         return false;
4390     }
4391
4392   loop->copy = loop;
4393
4394   /* In case the function is used for loop header copying (which is the primary
4395      use), ensure that EXIT and its copy will be new latch and entry edges.  */
4396   if (loop->header == entry->dest)
4397     {
4398       copying_header = true;
4399       loop->copy = loop->outer;
4400
4401       if (!dominated_by_p (CDI_DOMINATORS, loop->latch, exit->src))
4402         return false;
4403
4404       for (i = 0; i < n_region; i++)
4405         if (region[i] != exit->src
4406             && dominated_by_p (CDI_DOMINATORS, region[i], exit->src))
4407           return false;
4408     }
4409
4410   if (!region_copy)
4411     {
4412       region_copy = XNEWVEC (basic_block, n_region);
4413       free_region_copy = true;
4414     }
4415
4416   gcc_assert (!need_ssa_update_p ());
4417
4418   /* Record blocks outside the region that are dominated by something
4419      inside.  */
4420   doms = XNEWVEC (basic_block, n_basic_blocks);
4421   initialize_original_copy_tables ();
4422
4423   n_doms = get_dominated_by_region (CDI_DOMINATORS, region, n_region, doms);
4424
4425   if (entry->dest->count)
4426     {
4427       total_count = entry->dest->count;
4428       entry_count = entry->count;
4429       /* Fix up corner cases, to avoid division by zero or creation of negative
4430          frequencies.  */
4431       if (entry_count > total_count)
4432         entry_count = total_count;
4433     }
4434   else
4435     {
4436       total_freq = entry->dest->frequency;
4437       entry_freq = EDGE_FREQUENCY (entry);
4438       /* Fix up corner cases, to avoid division by zero or creation of negative
4439          frequencies.  */
4440       if (total_freq == 0)
4441         total_freq = 1;
4442       else if (entry_freq > total_freq)
4443         entry_freq = total_freq;
4444     }
4445
4446   copy_bbs (region, n_region, region_copy, &exit, 1, &exit_copy, loop,
4447             split_edge_bb_loc (entry));
4448   if (total_count)
4449     {
4450       scale_bbs_frequencies_gcov_type (region, n_region,
4451                                        total_count - entry_count,
4452                                        total_count);
4453       scale_bbs_frequencies_gcov_type (region_copy, n_region, entry_count,
4454                                        total_count);
4455     }
4456   else
4457     {
4458       scale_bbs_frequencies_int (region, n_region, total_freq - entry_freq,
4459                                  total_freq);
4460       scale_bbs_frequencies_int (region_copy, n_region, entry_freq, total_freq);
4461     }
4462
4463   if (copying_header)
4464     {
4465       loop->header = exit->dest;
4466       loop->latch = exit->src;
4467     }
4468
4469   /* Redirect the entry and add the phi node arguments.  */
4470   redirected = redirect_edge_and_branch (entry, get_bb_copy (entry->dest));
4471   gcc_assert (redirected != NULL);
4472   flush_pending_stmts (entry);
4473
4474   /* Concerning updating of dominators:  We must recount dominators
4475      for entry block and its copy.  Anything that is outside of the
4476      region, but was dominated by something inside needs recounting as
4477      well.  */
4478   set_immediate_dominator (CDI_DOMINATORS, entry->dest, entry->src);
4479   doms[n_doms++] = get_bb_original (entry->dest);
4480   iterate_fix_dominators (CDI_DOMINATORS, doms, n_doms);
4481   free (doms);
4482
4483   /* Add the other PHI node arguments.  */
4484   add_phi_args_after_copy (region_copy, n_region);
4485
4486   /* Update the SSA web.  */
4487   update_ssa (TODO_update_ssa);
4488
4489   if (free_region_copy)
4490     free (region_copy);
4491
4492   free_original_copy_tables ();
4493   return true;
4494 }
4495
4496
4497 /* Dump FUNCTION_DECL FN to file FILE using FLAGS (see TDF_* in tree.h)  */
4498
4499 void
4500 dump_function_to_file (tree fn, FILE *file, int flags)
4501 {
4502   tree arg, vars, var;
4503   bool ignore_topmost_bind = false, any_var = false;
4504   basic_block bb;
4505   tree chain;
4506
4507   fprintf (file, "%s (", lang_hooks.decl_printable_name (fn, 2));
4508
4509   arg = DECL_ARGUMENTS (fn);
4510   while (arg)
4511     {
4512       print_generic_expr (file, arg, dump_flags);
4513       if (TREE_CHAIN (arg))
4514         fprintf (file, ", ");
4515       arg = TREE_CHAIN (arg);
4516     }
4517   fprintf (file, ")\n");
4518
4519   if (flags & TDF_DETAILS)
4520     dump_eh_tree (file, DECL_STRUCT_FUNCTION (fn));
4521   if (flags & TDF_RAW)
4522     {
4523       dump_node (fn, TDF_SLIM | flags, file);
4524       return;
4525     }
4526
4527   /* When GIMPLE is lowered, the variables are no longer available in
4528      BIND_EXPRs, so display them separately.  */
4529   if (cfun && cfun->decl == fn && cfun->unexpanded_var_list)
4530     {
4531       ignore_topmost_bind = true;
4532
4533       fprintf (file, "{\n");
4534       for (vars = cfun->unexpanded_var_list; vars; vars = TREE_CHAIN (vars))
4535         {
4536           var = TREE_VALUE (vars);
4537
4538           print_generic_decl (file, var, flags);
4539           fprintf (file, "\n");
4540
4541           any_var = true;
4542         }
4543     }
4544
4545   if (cfun && cfun->decl == fn && cfun->cfg && basic_block_info)
4546     {
4547       /* Make a CFG based dump.  */
4548       check_bb_profile (ENTRY_BLOCK_PTR, file);
4549       if (!ignore_topmost_bind)
4550         fprintf (file, "{\n");
4551
4552       if (any_var && n_basic_blocks)
4553         fprintf (file, "\n");
4554
4555       FOR_EACH_BB (bb)
4556         dump_generic_bb (file, bb, 2, flags);
4557         
4558       fprintf (file, "}\n");
4559       check_bb_profile (EXIT_BLOCK_PTR, file);
4560     }
4561   else
4562     {
4563       int indent;
4564
4565       /* Make a tree based dump.  */
4566       chain = DECL_SAVED_TREE (fn);
4567
4568       if (TREE_CODE (chain) == BIND_EXPR)
4569         {
4570           if (ignore_topmost_bind)
4571             {
4572               chain = BIND_EXPR_BODY (chain);
4573               indent = 2;
4574             }
4575           else
4576             indent = 0;
4577         }
4578       else
4579         {
4580           if (!ignore_topmost_bind)
4581             fprintf (file, "{\n");
4582           indent = 2;
4583         }
4584
4585       if (any_var)
4586         fprintf (file, "\n");
4587
4588       print_generic_stmt_indented (file, chain, flags, indent);
4589       if (ignore_topmost_bind)
4590         fprintf (file, "}\n");
4591     }
4592
4593   fprintf (file, "\n\n");
4594 }
4595
4596
4597 /* Pretty print of the loops intermediate representation.  */
4598 static void print_loop (FILE *, struct loop *, int);
4599 static void print_pred_bbs (FILE *, basic_block bb);
4600 static void print_succ_bbs (FILE *, basic_block bb);
4601
4602
4603 /* Print on FILE the indexes for the predecessors of basic_block BB.  */
4604
4605 static void
4606 print_pred_bbs (FILE *file, basic_block bb)
4607 {
4608   edge e;
4609   edge_iterator ei;
4610
4611   FOR_EACH_EDGE (e, ei, bb->preds)
4612     fprintf (file, "bb_%d ", e->src->index);
4613 }
4614
4615
4616 /* Print on FILE the indexes for the successors of basic_block BB.  */
4617
4618 static void
4619 print_succ_bbs (FILE *file, basic_block bb)
4620 {
4621   edge e;
4622   edge_iterator ei;
4623
4624   FOR_EACH_EDGE (e, ei, bb->succs)
4625     fprintf (file, "bb_%d ", e->dest->index);
4626 }
4627
4628
4629 /* Pretty print LOOP on FILE, indented INDENT spaces.  */
4630
4631 static void
4632 print_loop (FILE *file, struct loop *loop, int indent)
4633 {
4634   char *s_indent;
4635   basic_block bb;
4636   
4637   if (loop == NULL)
4638     return;
4639
4640   s_indent = (char *) alloca ((size_t) indent + 1);
4641   memset ((void *) s_indent, ' ', (size_t) indent);
4642   s_indent[indent] = '\0';
4643
4644   /* Print the loop's header.  */
4645   fprintf (file, "%sloop_%d\n", s_indent, loop->num);
4646   
4647   /* Print the loop's body.  */
4648   fprintf (file, "%s{\n", s_indent);
4649   FOR_EACH_BB (bb)
4650     if (bb->loop_father == loop)
4651       {
4652         /* Print the basic_block's header.  */
4653         fprintf (file, "%s  bb_%d (preds = {", s_indent, bb->index);
4654         print_pred_bbs (file, bb);
4655         fprintf (file, "}, succs = {");
4656         print_succ_bbs (file, bb);
4657         fprintf (file, "})\n");
4658         
4659         /* Print the basic_block's body.  */
4660         fprintf (file, "%s  {\n", s_indent);
4661         tree_dump_bb (bb, file, indent + 4);
4662         fprintf (file, "%s  }\n", s_indent);
4663       }
4664   
4665   print_loop (file, loop->inner, indent + 2);
4666   fprintf (file, "%s}\n", s_indent);
4667   print_loop (file, loop->next, indent);
4668 }
4669
4670
4671 /* Follow a CFG edge from the entry point of the program, and on entry
4672    of a loop, pretty print the loop structure on FILE.  */
4673
4674 void 
4675 print_loop_ir (FILE *file)
4676 {
4677   basic_block bb;
4678   
4679   bb = BASIC_BLOCK (NUM_FIXED_BLOCKS);
4680   if (bb && bb->loop_father)
4681     print_loop (file, bb->loop_father, 0);
4682 }
4683
4684
4685 /* Debugging loops structure at tree level.  */
4686
4687 void 
4688 debug_loop_ir (void)
4689 {
4690   print_loop_ir (stderr);
4691 }
4692
4693
4694 /* Return true if BB ends with a call, possibly followed by some
4695    instructions that must stay with the call.  Return false,
4696    otherwise.  */
4697
4698 static bool
4699 tree_block_ends_with_call_p (basic_block bb)
4700 {
4701   block_stmt_iterator bsi = bsi_last (bb);
4702   return get_call_expr_in (bsi_stmt (bsi)) != NULL;
4703 }
4704
4705
4706 /* Return true if BB ends with a conditional branch.  Return false,
4707    otherwise.  */
4708
4709 static bool
4710 tree_block_ends_with_condjump_p (basic_block bb)
4711 {
4712   tree stmt = last_stmt (bb);
4713   return (stmt && TREE_CODE (stmt) == COND_EXPR);
4714 }
4715
4716
4717 /* Return true if we need to add fake edge to exit at statement T.
4718    Helper function for tree_flow_call_edges_add.  */
4719
4720 static bool
4721 need_fake_edge_p (tree t)
4722 {
4723   tree call;
4724
4725   /* NORETURN and LONGJMP calls already have an edge to exit.
4726      CONST and PURE calls do not need one.
4727      We don't currently check for CONST and PURE here, although
4728      it would be a good idea, because those attributes are
4729      figured out from the RTL in mark_constant_function, and
4730      the counter incrementation code from -fprofile-arcs
4731      leads to different results from -fbranch-probabilities.  */
4732   call = get_call_expr_in (t);
4733   if (call
4734       && !(call_expr_flags (call) & ECF_NORETURN))
4735     return true;
4736
4737   if (TREE_CODE (t) == ASM_EXPR
4738        && (ASM_VOLATILE_P (t) || ASM_INPUT_P (t)))
4739     return true;
4740
4741   return false;
4742 }
4743
4744
4745 /* Add fake edges to the function exit for any non constant and non
4746    noreturn calls, volatile inline assembly in the bitmap of blocks
4747    specified by BLOCKS or to the whole CFG if BLOCKS is zero.  Return
4748    the number of blocks that were split.
4749
4750    The goal is to expose cases in which entering a basic block does
4751    not imply that all subsequent instructions must be executed.  */
4752
4753 static int
4754 tree_flow_call_edges_add (sbitmap blocks)
4755 {
4756   int i;
4757   int blocks_split = 0;
4758   int last_bb = last_basic_block;
4759   bool check_last_block = false;
4760
4761   if (n_basic_blocks == NUM_FIXED_BLOCKS)
4762     return 0;
4763
4764   if (! blocks)
4765     check_last_block = true;
4766   else
4767     check_last_block = TEST_BIT (blocks, EXIT_BLOCK_PTR->prev_bb->index);
4768
4769   /* In the last basic block, before epilogue generation, there will be
4770      a fallthru edge to EXIT.  Special care is required if the last insn
4771      of the last basic block is a call because make_edge folds duplicate
4772      edges, which would result in the fallthru edge also being marked
4773      fake, which would result in the fallthru edge being removed by
4774      remove_fake_edges, which would result in an invalid CFG.
4775
4776      Moreover, we can't elide the outgoing fake edge, since the block
4777      profiler needs to take this into account in order to solve the minimal
4778      spanning tree in the case that the call doesn't return.
4779
4780      Handle this by adding a dummy instruction in a new last basic block.  */
4781   if (check_last_block)
4782     {
4783       basic_block bb = EXIT_BLOCK_PTR->prev_bb;
4784       block_stmt_iterator bsi = bsi_last (bb);
4785       tree t = NULL_TREE;
4786       if (!bsi_end_p (bsi))
4787         t = bsi_stmt (bsi);
4788
4789       if (t && need_fake_edge_p (t))
4790         {
4791           edge e;
4792
4793           e = find_edge (bb, EXIT_BLOCK_PTR);
4794           if (e)
4795             {
4796               bsi_insert_on_edge (e, build_empty_stmt ());
4797               bsi_commit_edge_inserts ();
4798             }
4799         }
4800     }
4801
4802   /* Now add fake edges to the function exit for any non constant
4803      calls since there is no way that we can determine if they will
4804      return or not...  */
4805   for (i = 0; i < last_bb; i++)
4806     {
4807       basic_block bb = BASIC_BLOCK (i);
4808       block_stmt_iterator bsi;
4809       tree stmt, last_stmt;
4810
4811       if (!bb)
4812         continue;
4813
4814       if (blocks && !TEST_BIT (blocks, i))
4815         continue;
4816
4817       bsi = bsi_last (bb);
4818       if (!bsi_end_p (bsi))
4819         {
4820           last_stmt = bsi_stmt (bsi);
4821           do
4822             {
4823               stmt = bsi_stmt (bsi);
4824               if (need_fake_edge_p (stmt))
4825                 {
4826                   edge e;
4827                   /* The handling above of the final block before the
4828                      epilogue should be enough to verify that there is
4829                      no edge to the exit block in CFG already.
4830                      Calling make_edge in such case would cause us to
4831                      mark that edge as fake and remove it later.  */
4832 #ifdef ENABLE_CHECKING
4833                   if (stmt == last_stmt)
4834                     {
4835                       e = find_edge (bb, EXIT_BLOCK_PTR);
4836                       gcc_assert (e == NULL);
4837                     }
4838 #endif
4839
4840                   /* Note that the following may create a new basic block
4841                      and renumber the existing basic blocks.  */
4842                   if (stmt != last_stmt)
4843                     {
4844                       e = split_block (bb, stmt);
4845                       if (e)
4846                         blocks_split++;
4847                     }
4848                   make_edge (bb, EXIT_BLOCK_PTR, EDGE_FAKE);
4849                 }
4850               bsi_prev (&bsi);
4851             }
4852           while (!bsi_end_p (bsi));
4853         }
4854     }
4855
4856   if (blocks_split)
4857     verify_flow_info ();
4858
4859   return blocks_split;
4860 }
4861
4862 bool
4863 tree_purge_dead_eh_edges (basic_block bb)
4864 {
4865   bool changed = false;
4866   edge e;
4867   edge_iterator ei;
4868   tree stmt = last_stmt (bb);
4869
4870   if (stmt && tree_can_throw_internal (stmt))
4871     return false;
4872
4873   for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
4874     {
4875       if (e->flags & EDGE_EH)
4876         {
4877           remove_edge (e);
4878           changed = true;
4879         }
4880       else
4881         ei_next (&ei);
4882     }
4883
4884   /* Removal of dead EH edges might change dominators of not
4885      just immediate successors.  E.g. when bb1 is changed so that
4886      it no longer can throw and bb1->bb3 and bb1->bb4 are dead
4887      eh edges purged by this function in:
4888            0
4889           / \
4890          v   v
4891          1-->2
4892         / \  |
4893        v   v |
4894        3-->4 |
4895         \    v
4896          --->5
4897              |
4898              -
4899      idom(bb5) must be recomputed.  For now just free the dominance
4900      info.  */
4901   if (changed)
4902     free_dominance_info (CDI_DOMINATORS);
4903
4904   return changed;
4905 }
4906
4907 bool
4908 tree_purge_all_dead_eh_edges (bitmap blocks)
4909 {
4910   bool changed = false;
4911   unsigned i;
4912   bitmap_iterator bi;
4913
4914   EXECUTE_IF_SET_IN_BITMAP (blocks, 0, i, bi)
4915     {
4916       changed |= tree_purge_dead_eh_edges (BASIC_BLOCK (i));
4917     }
4918
4919   return changed;
4920 }
4921
4922 /* This function is called whenever a new edge is created or
4923    redirected.  */
4924
4925 static void
4926 tree_execute_on_growing_pred (edge e)
4927 {
4928   basic_block bb = e->dest;
4929
4930   if (phi_nodes (bb))
4931     reserve_phi_args_for_new_edge (bb);
4932 }
4933
4934 /* This function is called immediately before edge E is removed from
4935    the edge vector E->dest->preds.  */
4936
4937 static void
4938 tree_execute_on_shrinking_pred (edge e)
4939 {
4940   if (phi_nodes (e->dest))
4941     remove_phi_args (e);
4942 }
4943
4944 /*---------------------------------------------------------------------------
4945   Helper functions for Loop versioning
4946   ---------------------------------------------------------------------------*/
4947
4948 /* Adjust phi nodes for 'first' basic block.  'second' basic block is a copy
4949    of 'first'. Both of them are dominated by 'new_head' basic block. When
4950    'new_head' was created by 'second's incoming edge it received phi arguments
4951    on the edge by split_edge(). Later, additional edge 'e' was created to
4952    connect 'new_head' and 'first'. Now this routine adds phi args on this 
4953    additional edge 'e' that new_head to second edge received as part of edge 
4954    splitting.
4955 */
4956
4957 static void
4958 tree_lv_adjust_loop_header_phi (basic_block first, basic_block second,
4959                                 basic_block new_head, edge e)
4960 {
4961   tree phi1, phi2;
4962   edge e2 = find_edge (new_head, second);
4963
4964   /* Because NEW_HEAD has been created by splitting SECOND's incoming
4965      edge, we should always have an edge from NEW_HEAD to SECOND.  */
4966   gcc_assert (e2 != NULL);
4967
4968   /* Browse all 'second' basic block phi nodes and add phi args to
4969      edge 'e' for 'first' head. PHI args are always in correct order.  */
4970
4971   for (phi2 = phi_nodes (second), phi1 = phi_nodes (first); 
4972        phi2 && phi1; 
4973        phi2 = PHI_CHAIN (phi2),  phi1 = PHI_CHAIN (phi1))
4974     {
4975       tree def = PHI_ARG_DEF (phi2, e2->dest_idx);
4976       add_phi_arg (phi1, def, e);
4977     }
4978 }
4979
4980 /* Adds a if else statement to COND_BB with condition COND_EXPR.  
4981    SECOND_HEAD is the destination of the THEN and FIRST_HEAD is 
4982    the destination of the ELSE part.  */
4983 static void
4984 tree_lv_add_condition_to_bb (basic_block first_head, basic_block second_head,
4985                             basic_block cond_bb, void *cond_e)
4986 {
4987   block_stmt_iterator bsi;
4988   tree goto1 = NULL_TREE;
4989   tree goto2 = NULL_TREE;
4990   tree new_cond_expr = NULL_TREE;
4991   tree cond_expr = (tree) cond_e;
4992   edge e0;
4993
4994   /* Build new conditional expr */
4995   goto1 = build1 (GOTO_EXPR, void_type_node, tree_block_label (first_head));
4996   goto2 = build1 (GOTO_EXPR, void_type_node, tree_block_label (second_head));
4997   new_cond_expr = build3 (COND_EXPR, void_type_node, cond_expr, goto1, goto2);
4998
4999   /* Add new cond in cond_bb.  */ 
5000   bsi = bsi_start (cond_bb); 
5001   bsi_insert_after (&bsi, new_cond_expr, BSI_NEW_STMT);
5002   /* Adjust edges appropriately to connect new head with first head
5003      as well as second head.  */
5004   e0 = single_succ_edge (cond_bb);
5005   e0->flags &= ~EDGE_FALLTHRU;
5006   e0->flags |= EDGE_FALSE_VALUE;
5007 }
5008
5009 struct cfg_hooks tree_cfg_hooks = {
5010   "tree",
5011   tree_verify_flow_info,
5012   tree_dump_bb,                 /* dump_bb  */
5013   create_bb,                    /* create_basic_block  */
5014   tree_redirect_edge_and_branch,/* redirect_edge_and_branch  */
5015   tree_redirect_edge_and_branch_force,/* redirect_edge_and_branch_force  */
5016   remove_bb,                    /* delete_basic_block  */
5017   tree_split_block,             /* split_block  */
5018   tree_move_block_after,        /* move_block_after  */
5019   tree_can_merge_blocks_p,      /* can_merge_blocks_p  */
5020   tree_merge_blocks,            /* merge_blocks  */
5021   tree_predict_edge,            /* predict_edge  */
5022   tree_predicted_by_p,          /* predicted_by_p  */
5023   tree_can_duplicate_bb_p,      /* can_duplicate_block_p  */
5024   tree_duplicate_bb,            /* duplicate_block  */
5025   tree_split_edge,              /* split_edge  */
5026   tree_make_forwarder_block,    /* make_forward_block  */
5027   NULL,                         /* tidy_fallthru_edge  */
5028   tree_block_ends_with_call_p,  /* block_ends_with_call_p */
5029   tree_block_ends_with_condjump_p, /* block_ends_with_condjump_p */
5030   tree_flow_call_edges_add,     /* flow_call_edges_add */
5031   tree_execute_on_growing_pred, /* execute_on_growing_pred */
5032   tree_execute_on_shrinking_pred, /* execute_on_shrinking_pred */
5033   tree_duplicate_loop_to_header_edge, /* duplicate loop for trees */
5034   tree_lv_add_condition_to_bb, /* lv_add_condition_to_bb */
5035   tree_lv_adjust_loop_header_phi, /* lv_adjust_loop_header_phi*/
5036   extract_true_false_edges_from_block, /* extract_cond_bb_edges */
5037   flush_pending_stmts           /* flush_pending_stmts */  
5038 };
5039
5040
5041 /* Split all critical edges.  */
5042
5043 static void
5044 split_critical_edges (void)
5045 {
5046   basic_block bb;
5047   edge e;
5048   edge_iterator ei;
5049
5050   /* split_edge can redirect edges out of SWITCH_EXPRs, which can get
5051      expensive.  So we want to enable recording of edge to CASE_LABEL_EXPR
5052      mappings around the calls to split_edge.  */
5053   start_recording_case_labels ();
5054   FOR_ALL_BB (bb)
5055     {
5056       FOR_EACH_EDGE (e, ei, bb->succs)
5057         if (EDGE_CRITICAL_P (e) && !(e->flags & EDGE_ABNORMAL))
5058           {
5059             split_edge (e);
5060           }
5061     }
5062   end_recording_case_labels ();
5063 }
5064
5065 struct tree_opt_pass pass_split_crit_edges = 
5066 {
5067   "crited",                          /* name */
5068   NULL,                          /* gate */
5069   split_critical_edges,          /* execute */
5070   NULL,                          /* sub */
5071   NULL,                          /* next */
5072   0,                             /* static_pass_number */
5073   TV_TREE_SPLIT_EDGES,           /* tv_id */
5074   PROP_cfg,                      /* properties required */
5075   PROP_no_crit_edges,            /* properties_provided */
5076   0,                             /* properties_destroyed */
5077   0,                             /* todo_flags_start */
5078   TODO_dump_func,                /* todo_flags_finish */
5079   0                              /* letter */
5080 };
5081
5082 \f
5083 /* Return EXP if it is a valid GIMPLE rvalue, else gimplify it into
5084    a temporary, make sure and register it to be renamed if necessary,
5085    and finally return the temporary.  Put the statements to compute
5086    EXP before the current statement in BSI.  */
5087
5088 tree
5089 gimplify_val (block_stmt_iterator *bsi, tree type, tree exp)
5090 {
5091   tree t, new_stmt, orig_stmt;
5092
5093   if (is_gimple_val (exp))
5094     return exp;
5095
5096   t = make_rename_temp (type, NULL);
5097   new_stmt = build2 (MODIFY_EXPR, type, t, exp);
5098
5099   orig_stmt = bsi_stmt (*bsi);
5100   SET_EXPR_LOCUS (new_stmt, EXPR_LOCUS (orig_stmt));
5101   TREE_BLOCK (new_stmt) = TREE_BLOCK (orig_stmt);
5102
5103   bsi_insert_before (bsi, new_stmt, BSI_SAME_STMT);
5104
5105   return t;
5106 }
5107
5108 /* Build a ternary operation and gimplify it.  Emit code before BSI.
5109    Return the gimple_val holding the result.  */
5110
5111 tree
5112 gimplify_build3 (block_stmt_iterator *bsi, enum tree_code code,
5113                  tree type, tree a, tree b, tree c)
5114 {
5115   tree ret;
5116
5117   ret = fold_build3 (code, type, a, b, c);
5118   STRIP_NOPS (ret);
5119
5120   return gimplify_val (bsi, type, ret);
5121 }
5122
5123 /* Build a binary operation and gimplify it.  Emit code before BSI.
5124    Return the gimple_val holding the result.  */
5125
5126 tree
5127 gimplify_build2 (block_stmt_iterator *bsi, enum tree_code code,
5128                  tree type, tree a, tree b)
5129 {
5130   tree ret;
5131
5132   ret = fold_build2 (code, type, a, b);
5133   STRIP_NOPS (ret);
5134
5135   return gimplify_val (bsi, type, ret);
5136 }
5137
5138 /* Build a unary operation and gimplify it.  Emit code before BSI.
5139    Return the gimple_val holding the result.  */
5140
5141 tree
5142 gimplify_build1 (block_stmt_iterator *bsi, enum tree_code code, tree type,
5143                  tree a)
5144 {
5145   tree ret;
5146
5147   ret = fold_build1 (code, type, a);
5148   STRIP_NOPS (ret);
5149
5150   return gimplify_val (bsi, type, ret);
5151 }
5152
5153
5154 \f
5155 /* Emit return warnings.  */
5156
5157 static void
5158 execute_warn_function_return (void)
5159 {
5160 #ifdef USE_MAPPED_LOCATION
5161   source_location location;
5162 #else
5163   location_t *locus;
5164 #endif
5165   tree last;
5166   edge e;
5167   edge_iterator ei;
5168
5169   /* If we have a path to EXIT, then we do return.  */
5170   if (TREE_THIS_VOLATILE (cfun->decl)
5171       && EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0)
5172     {
5173 #ifdef USE_MAPPED_LOCATION
5174       location = UNKNOWN_LOCATION;
5175 #else
5176       locus = NULL;
5177 #endif
5178       FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
5179         {
5180           last = last_stmt (e->src);
5181           if (TREE_CODE (last) == RETURN_EXPR
5182 #ifdef USE_MAPPED_LOCATION
5183               && (location = EXPR_LOCATION (last)) != UNKNOWN_LOCATION)
5184 #else
5185               && (locus = EXPR_LOCUS (last)) != NULL)
5186 #endif
5187             break;
5188         }
5189 #ifdef USE_MAPPED_LOCATION
5190       if (location == UNKNOWN_LOCATION)
5191         location = cfun->function_end_locus;
5192       warning (0, "%H%<noreturn%> function does return", &location);
5193 #else
5194       if (!locus)
5195         locus = &cfun->function_end_locus;
5196       warning (0, "%H%<noreturn%> function does return", locus);
5197 #endif
5198     }
5199
5200   /* If we see "return;" in some basic block, then we do reach the end
5201      without returning a value.  */
5202   else if (warn_return_type
5203            && !TREE_NO_WARNING (cfun->decl)
5204            && EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0
5205            && !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (cfun->decl))))
5206     {
5207       FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
5208         {
5209           tree last = last_stmt (e->src);
5210           if (TREE_CODE (last) == RETURN_EXPR
5211               && TREE_OPERAND (last, 0) == NULL
5212               && !TREE_NO_WARNING (last))
5213             {
5214 #ifdef USE_MAPPED_LOCATION
5215               location = EXPR_LOCATION (last);
5216               if (location == UNKNOWN_LOCATION)
5217                   location = cfun->function_end_locus;
5218               warning (0, "%Hcontrol reaches end of non-void function", &location);
5219 #else
5220               locus = EXPR_LOCUS (last);
5221               if (!locus)
5222                 locus = &cfun->function_end_locus;
5223               warning (0, "%Hcontrol reaches end of non-void function", locus);
5224 #endif
5225               TREE_NO_WARNING (cfun->decl) = 1;
5226               break;
5227             }
5228         }
5229     }
5230 }
5231
5232
5233 /* Given a basic block B which ends with a conditional and has
5234    precisely two successors, determine which of the edges is taken if
5235    the conditional is true and which is taken if the conditional is
5236    false.  Set TRUE_EDGE and FALSE_EDGE appropriately.  */
5237
5238 void
5239 extract_true_false_edges_from_block (basic_block b,
5240                                      edge *true_edge,
5241                                      edge *false_edge)
5242 {
5243   edge e = EDGE_SUCC (b, 0);
5244
5245   if (e->flags & EDGE_TRUE_VALUE)
5246     {
5247       *true_edge = e;
5248       *false_edge = EDGE_SUCC (b, 1);
5249     }
5250   else
5251     {
5252       *false_edge = e;
5253       *true_edge = EDGE_SUCC (b, 1);
5254     }
5255 }
5256
5257 struct tree_opt_pass pass_warn_function_return =
5258 {
5259   NULL,                                 /* name */
5260   NULL,                                 /* gate */
5261   execute_warn_function_return,         /* execute */
5262   NULL,                                 /* sub */
5263   NULL,                                 /* next */
5264   0,                                    /* static_pass_number */
5265   0,                                    /* tv_id */
5266   PROP_cfg,                             /* properties_required */
5267   0,                                    /* properties_provided */
5268   0,                                    /* properties_destroyed */
5269   0,                                    /* todo_flags_start */
5270   0,                                    /* todo_flags_finish */
5271   0                                     /* letter */
5272 };
5273
5274 /* Emit noreturn warnings.  */
5275
5276 static void
5277 execute_warn_function_noreturn (void)
5278 {
5279   if (warn_missing_noreturn
5280       && !TREE_THIS_VOLATILE (cfun->decl)
5281       && EDGE_COUNT (EXIT_BLOCK_PTR->preds) == 0
5282       && !lang_hooks.function.missing_noreturn_ok_p (cfun->decl))
5283     warning (OPT_Wmissing_noreturn, "%Jfunction might be possible candidate "
5284              "for attribute %<noreturn%>",
5285              cfun->decl);
5286 }
5287
5288 struct tree_opt_pass pass_warn_function_noreturn =
5289 {
5290   NULL,                                 /* name */
5291   NULL,                                 /* gate */
5292   execute_warn_function_noreturn,       /* execute */
5293   NULL,                                 /* sub */
5294   NULL,                                 /* next */
5295   0,                                    /* static_pass_number */
5296   0,                                    /* tv_id */
5297   PROP_cfg,                             /* properties_required */
5298   0,                                    /* properties_provided */
5299   0,                                    /* properties_destroyed */
5300   0,                                    /* todo_flags_start */
5301   0,                                    /* todo_flags_finish */
5302   0                                     /* letter */
5303 };