OSDN Git Service

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