* tree-cfg.c (cleanup_tree_cfg): Remove variable
[official-gcc.git] / gcc / tree-cfg.c
blob0c36f3e5d6aee6bdf647cc49eee3b2d90df65188
1 /* Control flow functions for trees.
2 Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
3 Contributed by Diego Novillo <dnovillo@redhat.com>
5 This file is part of GCC.
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.
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.
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. */
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 "errors.h"
33 #include "flags.h"
34 #include "function.h"
35 #include "expr.h"
36 #include "ggc.h"
37 #include "langhooks.h"
38 #include "diagnostic.h"
39 #include "tree-flow.h"
40 #include "timevar.h"
41 #include "tree-dump.h"
42 #include "tree-pass.h"
43 #include "toplev.h"
44 #include "except.h"
45 #include "cfgloop.h"
46 #include "cfglayout.h"
48 /* This file contains functions for building the Control Flow Graph (CFG)
49 for a function tree. */
51 /* Local declarations. */
53 /* Initial capacity for the basic block array. */
54 static const int initial_cfg_capacity = 20;
56 /* Mapping of labels to their associated blocks. This can greatly speed up
57 building of the CFG in code with lots of gotos. */
58 static GTY(()) varray_type label_to_block_map;
60 /* CFG statistics. */
61 struct cfg_stats_d
63 long num_merged_labels;
66 static struct cfg_stats_d cfg_stats;
68 /* Nonzero if we found a computed goto while building basic blocks. */
69 static bool found_computed_goto;
71 /* Basic blocks and flowgraphs. */
72 static basic_block create_bb (void *, void *, basic_block);
73 static void create_block_annotation (basic_block);
74 static void free_blocks_annotations (void);
75 static void clear_blocks_annotations (void);
76 static void make_blocks (tree);
77 static void factor_computed_gotos (void);
79 /* Edges. */
80 static void make_edges (void);
81 static void make_ctrl_stmt_edges (basic_block);
82 static void make_exit_edges (basic_block);
83 static void make_cond_expr_edges (basic_block);
84 static void make_switch_expr_edges (basic_block);
85 static void make_goto_expr_edges (basic_block);
86 static edge tree_redirect_edge_and_branch (edge, basic_block);
87 static edge tree_try_redirect_by_replacing_jump (edge, basic_block);
88 static void split_critical_edges (void);
90 /* Various helpers. */
91 static inline bool stmt_starts_bb_p (tree, tree);
92 static int tree_verify_flow_info (void);
93 static void tree_make_forwarder_block (edge);
94 static bool thread_jumps (void);
95 static bool tree_forwarder_block_p (basic_block);
96 static void bsi_commit_edge_inserts_1 (edge e);
97 static void tree_cfg2vcg (FILE *);
99 /* Flowgraph optimization and cleanup. */
100 static void tree_merge_blocks (basic_block, basic_block);
101 static bool tree_can_merge_blocks_p (basic_block, basic_block);
102 static void remove_bb (basic_block);
103 static bool cleanup_control_flow (void);
104 static bool cleanup_control_expr_graph (basic_block, block_stmt_iterator);
105 static edge find_taken_edge_cond_expr (basic_block, tree);
106 static edge find_taken_edge_switch_expr (basic_block, tree);
107 static tree find_case_label_for_value (tree, tree);
108 static bool phi_alternatives_equal (basic_block, edge, edge);
111 /*---------------------------------------------------------------------------
112 Create basic blocks
113 ---------------------------------------------------------------------------*/
115 /* Entry point to the CFG builder for trees. TP points to the list of
116 statements to be added to the flowgraph. */
118 static void
119 build_tree_cfg (tree *tp)
121 /* Register specific tree functions. */
122 tree_register_cfg_hooks ();
124 /* Initialize rbi_pool. */
125 alloc_rbi_pool ();
127 /* Initialize the basic block array. */
128 init_flow ();
129 profile_status = PROFILE_ABSENT;
130 n_basic_blocks = 0;
131 last_basic_block = 0;
132 VARRAY_BB_INIT (basic_block_info, initial_cfg_capacity, "basic_block_info");
133 memset ((void *) &cfg_stats, 0, sizeof (cfg_stats));
135 /* Build a mapping of labels to their associated blocks. */
136 VARRAY_BB_INIT (label_to_block_map, initial_cfg_capacity,
137 "label to block map");
139 ENTRY_BLOCK_PTR->next_bb = EXIT_BLOCK_PTR;
140 EXIT_BLOCK_PTR->prev_bb = ENTRY_BLOCK_PTR;
142 found_computed_goto = 0;
143 make_blocks (*tp);
145 /* Computed gotos are hell to deal with, especially if there are
146 lots of them with a large number of destinations. So we factor
147 them to a common computed goto location before we build the
148 edge list. After we convert back to normal form, we will un-factor
149 the computed gotos since factoring introduces an unwanted jump. */
150 if (found_computed_goto)
151 factor_computed_gotos ();
153 /* Make sure there is always at least one block, even if its empty. */
154 if (n_basic_blocks == 0)
155 create_empty_bb (ENTRY_BLOCK_PTR);
157 create_block_annotation (ENTRY_BLOCK_PTR);
158 create_block_annotation (EXIT_BLOCK_PTR);
160 /* Adjust the size of the array. */
161 VARRAY_GROW (basic_block_info, n_basic_blocks);
163 /* To speed up statement iterator walks, we first purge dead labels. */
164 cleanup_dead_labels ();
166 /* Group case nodes to reduce the number of edges.
167 We do this after cleaning up dead labels because otherwise we miss
168 a lot of obvious case merging opportunities. */
169 group_case_labels ();
171 /* Create the edges of the flowgraph. */
172 make_edges ();
174 /* Debugging dumps. */
176 /* Write the flowgraph to a VCG file. */
178 int local_dump_flags;
179 FILE *dump_file = dump_begin (TDI_vcg, &local_dump_flags);
180 if (dump_file)
182 tree_cfg2vcg (dump_file);
183 dump_end (TDI_vcg, dump_file);
187 /* Dump a textual representation of the flowgraph. */
188 if (dump_file)
189 dump_tree_cfg (dump_file, dump_flags);
192 static void
193 execute_build_cfg (void)
195 build_tree_cfg (&DECL_SAVED_TREE (current_function_decl));
198 struct tree_opt_pass pass_build_cfg =
200 "cfg", /* name */
201 NULL, /* gate */
202 execute_build_cfg, /* execute */
203 NULL, /* sub */
204 NULL, /* next */
205 0, /* static_pass_number */
206 TV_TREE_CFG, /* tv_id */
207 PROP_gimple_leh, /* properties_required */
208 PROP_cfg, /* properties_provided */
209 0, /* properties_destroyed */
210 0, /* todo_flags_start */
211 TODO_verify_stmts, /* todo_flags_finish */
212 0 /* letter */
215 /* Search the CFG for any computed gotos. If found, factor them to a
216 common computed goto site. Also record the location of that site so
217 that we can un-factor the gotos after we have converted back to
218 normal form. */
220 static void
221 factor_computed_gotos (void)
223 basic_block bb;
224 tree factored_label_decl = NULL;
225 tree var = NULL;
226 tree factored_computed_goto_label = NULL;
227 tree factored_computed_goto = NULL;
229 /* We know there are one or more computed gotos in this function.
230 Examine the last statement in each basic block to see if the block
231 ends with a computed goto. */
233 FOR_EACH_BB (bb)
235 block_stmt_iterator bsi = bsi_last (bb);
236 tree last;
238 if (bsi_end_p (bsi))
239 continue;
240 last = bsi_stmt (bsi);
242 /* Ignore the computed goto we create when we factor the original
243 computed gotos. */
244 if (last == factored_computed_goto)
245 continue;
247 /* If the last statement is a computed goto, factor it. */
248 if (computed_goto_p (last))
250 tree assignment;
252 /* The first time we find a computed goto we need to create
253 the factored goto block and the variable each original
254 computed goto will use for their goto destination. */
255 if (! factored_computed_goto)
257 basic_block new_bb = create_empty_bb (bb);
258 block_stmt_iterator new_bsi = bsi_start (new_bb);
260 /* Create the destination of the factored goto. Each original
261 computed goto will put its desired destination into this
262 variable and jump to the label we create immediately
263 below. */
264 var = create_tmp_var (ptr_type_node, "gotovar");
266 /* Build a label for the new block which will contain the
267 factored computed goto. */
268 factored_label_decl = create_artificial_label ();
269 factored_computed_goto_label
270 = build1 (LABEL_EXPR, void_type_node, factored_label_decl);
271 bsi_insert_after (&new_bsi, factored_computed_goto_label,
272 BSI_NEW_STMT);
274 /* Build our new computed goto. */
275 factored_computed_goto = build1 (GOTO_EXPR, void_type_node, var);
276 bsi_insert_after (&new_bsi, factored_computed_goto,
277 BSI_NEW_STMT);
280 /* Copy the original computed goto's destination into VAR. */
281 assignment = build (MODIFY_EXPR, ptr_type_node,
282 var, GOTO_DESTINATION (last));
283 bsi_insert_before (&bsi, assignment, BSI_SAME_STMT);
285 /* And re-vector the computed goto to the new destination. */
286 GOTO_DESTINATION (last) = factored_label_decl;
292 /* Create annotations for a single basic block. */
294 static void
295 create_block_annotation (basic_block bb)
297 /* Verify that the tree_annotations field is clear. */
298 gcc_assert (!bb->tree_annotations);
299 bb->tree_annotations = ggc_alloc_cleared (sizeof (struct bb_ann_d));
303 /* Free the annotations for all the basic blocks. */
305 static void free_blocks_annotations (void)
307 clear_blocks_annotations ();
311 /* Clear the annotations for all the basic blocks. */
313 static void
314 clear_blocks_annotations (void)
316 basic_block bb;
318 FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, NULL, next_bb)
319 bb->tree_annotations = NULL;
323 /* Build a flowgraph for the statement_list STMT_LIST. */
325 static void
326 make_blocks (tree stmt_list)
328 tree_stmt_iterator i = tsi_start (stmt_list);
329 tree stmt = NULL;
330 bool start_new_block = true;
331 bool first_stmt_of_list = true;
332 basic_block bb = ENTRY_BLOCK_PTR;
334 while (!tsi_end_p (i))
336 tree prev_stmt;
338 prev_stmt = stmt;
339 stmt = tsi_stmt (i);
341 /* If the statement starts a new basic block or if we have determined
342 in a previous pass that we need to create a new block for STMT, do
343 so now. */
344 if (start_new_block || stmt_starts_bb_p (stmt, prev_stmt))
346 if (!first_stmt_of_list)
347 stmt_list = tsi_split_statement_list_before (&i);
348 bb = create_basic_block (stmt_list, NULL, bb);
349 start_new_block = false;
352 /* Now add STMT to BB and create the subgraphs for special statement
353 codes. */
354 set_bb_for_stmt (stmt, bb);
356 if (computed_goto_p (stmt))
357 found_computed_goto = true;
359 /* If STMT is a basic block terminator, set START_NEW_BLOCK for the
360 next iteration. */
361 if (stmt_ends_bb_p (stmt))
362 start_new_block = true;
364 tsi_next (&i);
365 first_stmt_of_list = false;
370 /* Create and return a new empty basic block after bb AFTER. */
372 static basic_block
373 create_bb (void *h, void *e, basic_block after)
375 basic_block bb;
377 gcc_assert (!e);
379 /* Create and initialize a new basic block. */
380 bb = alloc_block ();
381 memset (bb, 0, sizeof (*bb));
383 bb->index = last_basic_block;
384 bb->flags = BB_NEW;
385 bb->stmt_list = h ? h : alloc_stmt_list ();
387 /* Add the new block to the linked list of blocks. */
388 link_block (bb, after);
390 /* Grow the basic block array if needed. */
391 if ((size_t) last_basic_block == VARRAY_SIZE (basic_block_info))
393 size_t new_size = last_basic_block + (last_basic_block + 3) / 4;
394 VARRAY_GROW (basic_block_info, new_size);
397 /* Add the newly created block to the array. */
398 BASIC_BLOCK (last_basic_block) = bb;
400 create_block_annotation (bb);
402 n_basic_blocks++;
403 last_basic_block++;
405 initialize_bb_rbi (bb);
406 return bb;
410 /*---------------------------------------------------------------------------
411 Edge creation
412 ---------------------------------------------------------------------------*/
414 /* Join all the blocks in the flowgraph. */
416 static void
417 make_edges (void)
419 basic_block bb;
421 /* Create an edge from entry to the first block with executable
422 statements in it. */
423 make_edge (ENTRY_BLOCK_PTR, BASIC_BLOCK (0), EDGE_FALLTHRU);
425 /* Traverse basic block array placing edges. */
426 FOR_EACH_BB (bb)
428 tree first = first_stmt (bb);
429 tree last = last_stmt (bb);
431 if (first)
433 /* Edges for statements that always alter flow control. */
434 if (is_ctrl_stmt (last))
435 make_ctrl_stmt_edges (bb);
437 /* Edges for statements that sometimes alter flow control. */
438 if (is_ctrl_altering_stmt (last))
439 make_exit_edges (bb);
442 /* Finally, if no edges were created above, this is a regular
443 basic block that only needs a fallthru edge. */
444 if (EDGE_COUNT (bb->succs) == 0)
445 make_edge (bb, bb->next_bb, EDGE_FALLTHRU);
448 /* We do not care about fake edges, so remove any that the CFG
449 builder inserted for completeness. */
450 remove_fake_exit_edges ();
452 /* Clean up the graph and warn for unreachable code. */
453 cleanup_tree_cfg ();
457 /* Create edges for control statement at basic block BB. */
459 static void
460 make_ctrl_stmt_edges (basic_block bb)
462 tree last = last_stmt (bb);
464 gcc_assert (last);
465 switch (TREE_CODE (last))
467 case GOTO_EXPR:
468 make_goto_expr_edges (bb);
469 break;
471 case RETURN_EXPR:
472 make_edge (bb, EXIT_BLOCK_PTR, 0);
473 break;
475 case COND_EXPR:
476 make_cond_expr_edges (bb);
477 break;
479 case SWITCH_EXPR:
480 make_switch_expr_edges (bb);
481 break;
483 case RESX_EXPR:
484 make_eh_edges (last);
485 /* Yet another NORETURN hack. */
486 if (EDGE_COUNT (bb->succs) == 0)
487 make_edge (bb, EXIT_BLOCK_PTR, EDGE_FAKE);
488 break;
490 default:
491 gcc_unreachable ();
496 /* Create exit edges for statements in block BB that alter the flow of
497 control. Statements that alter the control flow are 'goto', 'return'
498 and calls to non-returning functions. */
500 static void
501 make_exit_edges (basic_block bb)
503 tree last = last_stmt (bb), op;
505 gcc_assert (last);
506 switch (TREE_CODE (last))
508 case CALL_EXPR:
509 /* If this function receives a nonlocal goto, then we need to
510 make edges from this call site to all the nonlocal goto
511 handlers. */
512 if (TREE_SIDE_EFFECTS (last)
513 && current_function_has_nonlocal_label)
514 make_goto_expr_edges (bb);
516 /* If this statement has reachable exception handlers, then
517 create abnormal edges to them. */
518 make_eh_edges (last);
520 /* Some calls are known not to return. For such calls we create
521 a fake edge.
523 We really need to revamp how we build edges so that it's not
524 such a bloody pain to avoid creating edges for this case since
525 all we do is remove these edges when we're done building the
526 CFG. */
527 if (call_expr_flags (last) & (ECF_NORETURN | ECF_LONGJMP))
529 make_edge (bb, EXIT_BLOCK_PTR, EDGE_FAKE);
530 return;
533 /* Don't forget the fall-thru edge. */
534 make_edge (bb, bb->next_bb, EDGE_FALLTHRU);
535 break;
537 case MODIFY_EXPR:
538 /* A MODIFY_EXPR may have a CALL_EXPR on its RHS and the CALL_EXPR
539 may have an abnormal edge. Search the RHS for this case and
540 create any required edges. */
541 op = get_call_expr_in (last);
542 if (op && TREE_SIDE_EFFECTS (op)
543 && current_function_has_nonlocal_label)
544 make_goto_expr_edges (bb);
546 make_eh_edges (last);
547 make_edge (bb, bb->next_bb, EDGE_FALLTHRU);
548 break;
550 default:
551 gcc_unreachable ();
556 /* Create the edges for a COND_EXPR starting at block BB.
557 At this point, both clauses must contain only simple gotos. */
559 static void
560 make_cond_expr_edges (basic_block bb)
562 tree entry = last_stmt (bb);
563 basic_block then_bb, else_bb;
564 tree then_label, else_label;
566 gcc_assert (entry);
567 gcc_assert (TREE_CODE (entry) == COND_EXPR);
569 /* Entry basic blocks for each component. */
570 then_label = GOTO_DESTINATION (COND_EXPR_THEN (entry));
571 else_label = GOTO_DESTINATION (COND_EXPR_ELSE (entry));
572 then_bb = label_to_block (then_label);
573 else_bb = label_to_block (else_label);
575 make_edge (bb, then_bb, EDGE_TRUE_VALUE);
576 make_edge (bb, else_bb, EDGE_FALSE_VALUE);
580 /* Create the edges for a SWITCH_EXPR starting at block BB.
581 At this point, the switch body has been lowered and the
582 SWITCH_LABELS filled in, so this is in effect a multi-way branch. */
584 static void
585 make_switch_expr_edges (basic_block bb)
587 tree entry = last_stmt (bb);
588 size_t i, n;
589 tree vec;
591 vec = SWITCH_LABELS (entry);
592 n = TREE_VEC_LENGTH (vec);
594 for (i = 0; i < n; ++i)
596 tree lab = CASE_LABEL (TREE_VEC_ELT (vec, i));
597 basic_block label_bb = label_to_block (lab);
598 make_edge (bb, label_bb, 0);
603 /* Return the basic block holding label DEST. */
605 basic_block
606 label_to_block (tree dest)
608 int uid = LABEL_DECL_UID (dest);
610 /* We would die hard when faced by undefined label. Emit label to
611 very first basic block. This will hopefully make even the dataflow
612 and undefined variable warnings quite right. */
613 if ((errorcount || sorrycount) && uid < 0)
615 block_stmt_iterator bsi = bsi_start (BASIC_BLOCK (0));
616 tree stmt;
618 stmt = build1 (LABEL_EXPR, void_type_node, dest);
619 bsi_insert_before (&bsi, stmt, BSI_NEW_STMT);
620 uid = LABEL_DECL_UID (dest);
622 return VARRAY_BB (label_to_block_map, uid);
626 /* Create edges for a goto statement at block BB. */
628 static void
629 make_goto_expr_edges (basic_block bb)
631 tree goto_t, dest;
632 basic_block target_bb;
633 int for_call;
634 block_stmt_iterator last = bsi_last (bb);
636 goto_t = bsi_stmt (last);
638 /* If the last statement is not a GOTO (i.e., it is a RETURN_EXPR,
639 CALL_EXPR or MODIFY_EXPR), then the edge is an abnormal edge resulting
640 from a nonlocal goto. */
641 if (TREE_CODE (goto_t) != GOTO_EXPR)
643 dest = error_mark_node;
644 for_call = 1;
646 else
648 dest = GOTO_DESTINATION (goto_t);
649 for_call = 0;
651 /* A GOTO to a local label creates normal edges. */
652 if (simple_goto_p (goto_t))
654 edge e = make_edge (bb, label_to_block (dest), EDGE_FALLTHRU);
655 #ifdef USE_MAPPED_LOCATION
656 e->goto_locus = EXPR_LOCATION (goto_t);
657 #else
658 e->goto_locus = EXPR_LOCUS (goto_t);
659 #endif
660 bsi_remove (&last);
661 return;
664 /* Nothing more to do for nonlocal gotos. */
665 if (TREE_CODE (dest) == LABEL_DECL)
666 return;
668 /* Computed gotos remain. */
671 /* Look for the block starting with the destination label. In the
672 case of a computed goto, make an edge to any label block we find
673 in the CFG. */
674 FOR_EACH_BB (target_bb)
676 block_stmt_iterator bsi;
678 for (bsi = bsi_start (target_bb); !bsi_end_p (bsi); bsi_next (&bsi))
680 tree target = bsi_stmt (bsi);
682 if (TREE_CODE (target) != LABEL_EXPR)
683 break;
685 if (
686 /* Computed GOTOs. Make an edge to every label block that has
687 been marked as a potential target for a computed goto. */
688 (FORCED_LABEL (LABEL_EXPR_LABEL (target)) && for_call == 0)
689 /* Nonlocal GOTO target. Make an edge to every label block
690 that has been marked as a potential target for a nonlocal
691 goto. */
692 || (DECL_NONLOCAL (LABEL_EXPR_LABEL (target)) && for_call == 1))
694 make_edge (bb, target_bb, EDGE_ABNORMAL);
695 break;
700 /* Degenerate case of computed goto with no labels. */
701 if (!for_call && EDGE_COUNT (bb->succs) == 0)
702 make_edge (bb, EXIT_BLOCK_PTR, EDGE_FAKE);
706 /*---------------------------------------------------------------------------
707 Flowgraph analysis
708 ---------------------------------------------------------------------------*/
710 /* Remove unreachable blocks and other miscellaneous clean up work. */
712 bool
713 cleanup_tree_cfg (void)
715 bool retval = false;
717 timevar_push (TV_TREE_CLEANUP_CFG);
719 retval = cleanup_control_flow ();
720 retval |= delete_unreachable_blocks ();
722 /* thread_jumps() sometimes leaves further transformation
723 opportunities for itself, so iterate on it until nothing
724 changes. */
725 while (thread_jumps ())
727 /* delete_unreachable_blocks() does its job only when
728 thread_jumps() produces more unreachable blocks. */
729 delete_unreachable_blocks ();
730 retval = true;
733 #ifdef ENABLE_CHECKING
734 if (retval)
736 gcc_assert (!cleanup_control_flow ());
737 gcc_assert (!delete_unreachable_blocks ());
739 #endif
741 /* Merging the blocks creates no new opportunities for the other
742 optimizations, so do it here. */
743 merge_seq_blocks ();
745 compact_blocks ();
747 #ifdef ENABLE_CHECKING
748 verify_flow_info ();
749 #endif
750 timevar_pop (TV_TREE_CLEANUP_CFG);
751 return retval;
755 /* Cleanup useless labels in basic blocks. This is something we wish
756 to do early because it allows us to group case labels before creating
757 the edges for the CFG, and it speeds up block statement iterators in
758 all passes later on.
759 We only run this pass once, running it more than once is probably not
760 profitable. */
762 /* A map from basic block index to the leading label of that block. */
763 static tree *label_for_bb;
765 /* Callback for for_each_eh_region. Helper for cleanup_dead_labels. */
766 static void
767 update_eh_label (struct eh_region *region)
769 tree old_label = get_eh_region_tree_label (region);
770 if (old_label)
772 tree new_label;
773 basic_block bb = label_to_block (old_label);
775 /* ??? After optimizing, there may be EH regions with labels
776 that have already been removed from the function body, so
777 there is no basic block for them. */
778 if (! bb)
779 return;
781 new_label = label_for_bb[bb->index];
782 set_eh_region_tree_label (region, new_label);
786 /* Given LABEL return the first label in the same basic block. */
787 static tree
788 main_block_label (tree label)
790 basic_block bb = label_to_block (label);
792 /* label_to_block possibly inserted undefined label into the chain. */
793 if (!label_for_bb[bb->index])
794 label_for_bb[bb->index] = label;
795 return label_for_bb[bb->index];
798 /* Cleanup redundant labels. This is a three-steo process:
799 1) Find the leading label for each block.
800 2) Redirect all references to labels to the leading labels.
801 3) Cleanup all useless labels. */
803 void
804 cleanup_dead_labels (void)
806 basic_block bb;
807 label_for_bb = xcalloc (last_basic_block, sizeof (tree));
809 /* Find a suitable label for each block. We use the first user-defined
810 label is there is one, or otherwise just the first label we see. */
811 FOR_EACH_BB (bb)
813 block_stmt_iterator i;
815 for (i = bsi_start (bb); !bsi_end_p (i); bsi_next (&i))
817 tree label, stmt = bsi_stmt (i);
819 if (TREE_CODE (stmt) != LABEL_EXPR)
820 break;
822 label = LABEL_EXPR_LABEL (stmt);
824 /* If we have not yet seen a label for the current block,
825 remember this one and see if there are more labels. */
826 if (! label_for_bb[bb->index])
828 label_for_bb[bb->index] = label;
829 continue;
832 /* If we did see a label for the current block already, but it
833 is an artificially created label, replace it if the current
834 label is a user defined label. */
835 if (! DECL_ARTIFICIAL (label)
836 && DECL_ARTIFICIAL (label_for_bb[bb->index]))
838 label_for_bb[bb->index] = label;
839 break;
844 /* Now redirect all jumps/branches to the selected label.
845 First do so for each block ending in a control statement. */
846 FOR_EACH_BB (bb)
848 tree stmt = last_stmt (bb);
849 if (!stmt)
850 continue;
852 switch (TREE_CODE (stmt))
854 case COND_EXPR:
856 tree true_branch, false_branch;
858 true_branch = COND_EXPR_THEN (stmt);
859 false_branch = COND_EXPR_ELSE (stmt);
861 GOTO_DESTINATION (true_branch)
862 = main_block_label (GOTO_DESTINATION (true_branch));
863 GOTO_DESTINATION (false_branch)
864 = main_block_label (GOTO_DESTINATION (false_branch));
866 break;
869 case SWITCH_EXPR:
871 size_t i;
872 tree vec = SWITCH_LABELS (stmt);
873 size_t n = TREE_VEC_LENGTH (vec);
875 /* Replace all destination labels. */
876 for (i = 0; i < n; ++i)
877 CASE_LABEL (TREE_VEC_ELT (vec, i))
878 = main_block_label (CASE_LABEL (TREE_VEC_ELT (vec, i)));
880 break;
883 /* We have to handle GOTO_EXPRs until they're removed, and we don't
884 remove them until after we've created the CFG edges. */
885 case GOTO_EXPR:
886 if (! computed_goto_p (stmt))
888 GOTO_DESTINATION (stmt)
889 = main_block_label (GOTO_DESTINATION (stmt));
890 break;
893 default:
894 break;
898 for_each_eh_region (update_eh_label);
900 /* Finally, purge dead labels. All user-defined labels and labels that
901 can be the target of non-local gotos are preserved. */
902 FOR_EACH_BB (bb)
904 block_stmt_iterator i;
905 tree label_for_this_bb = label_for_bb[bb->index];
907 if (! label_for_this_bb)
908 continue;
910 for (i = bsi_start (bb); !bsi_end_p (i); )
912 tree label, stmt = bsi_stmt (i);
914 if (TREE_CODE (stmt) != LABEL_EXPR)
915 break;
917 label = LABEL_EXPR_LABEL (stmt);
919 if (label == label_for_this_bb
920 || ! DECL_ARTIFICIAL (label)
921 || DECL_NONLOCAL (label))
922 bsi_next (&i);
923 else
924 bsi_remove (&i);
928 free (label_for_bb);
931 /* Look for blocks ending in a multiway branch (a SWITCH_EXPR in GIMPLE),
932 and scan the sorted vector of cases. Combine the ones jumping to the
933 same label.
934 Eg. three separate entries 1: 2: 3: become one entry 1..3: */
936 void
937 group_case_labels (void)
939 basic_block bb;
941 FOR_EACH_BB (bb)
943 tree stmt = last_stmt (bb);
944 if (stmt && TREE_CODE (stmt) == SWITCH_EXPR)
946 tree labels = SWITCH_LABELS (stmt);
947 int old_size = TREE_VEC_LENGTH (labels);
948 int i, j, new_size = old_size;
949 tree default_case = TREE_VEC_ELT (labels, old_size - 1);
950 tree default_label;
952 /* The default label is always the last case in a switch
953 statement after gimplification. */
954 default_label = CASE_LABEL (default_case);
956 /* Look for possible opportunities to merge cases.
957 Ignore the last element of the label vector because it
958 must be the default case. */
959 i = 0;
960 while (i < old_size - 2)
962 tree base_case, base_label, base_high, type;
963 base_case = TREE_VEC_ELT (labels, i);
965 gcc_assert (base_case);
966 base_label = CASE_LABEL (base_case);
968 /* Discard cases that have the same destination as the
969 default case. */
970 if (base_label == default_label)
972 TREE_VEC_ELT (labels, i) = NULL_TREE;
973 i++;
974 new_size--;
975 continue;
978 type = TREE_TYPE (CASE_LOW (base_case));
979 base_high = CASE_HIGH (base_case) ?
980 CASE_HIGH (base_case) : CASE_LOW (base_case);
982 /* Try to merge case labels. Break out when we reach the end
983 of the label vector or when we cannot merge the next case
984 label with the current one. */
985 while (i < old_size - 2)
987 tree merge_case = TREE_VEC_ELT (labels, ++i);
988 tree merge_label = CASE_LABEL (merge_case);
989 tree t = int_const_binop (PLUS_EXPR, base_high,
990 integer_one_node, 1);
992 /* Merge the cases if they jump to the same place,
993 and their ranges are consecutive. */
994 if (merge_label == base_label
995 && tree_int_cst_equal (CASE_LOW (merge_case), t))
997 base_high = CASE_HIGH (merge_case) ?
998 CASE_HIGH (merge_case) : CASE_LOW (merge_case);
999 CASE_HIGH (base_case) = base_high;
1000 TREE_VEC_ELT (labels, i) = NULL_TREE;
1001 new_size--;
1003 else
1004 break;
1008 /* Compress the case labels in the label vector, and adjust the
1009 length of the vector. */
1010 for (i = 0, j = 0; i < new_size; i++)
1012 while (! TREE_VEC_ELT (labels, j))
1013 j++;
1014 TREE_VEC_ELT (labels, i) = TREE_VEC_ELT (labels, j++);
1016 TREE_VEC_LENGTH (labels) = new_size;
1021 /* Checks whether we can merge block B into block A. */
1023 static bool
1024 tree_can_merge_blocks_p (basic_block a, basic_block b)
1026 tree stmt;
1027 block_stmt_iterator bsi;
1029 if (EDGE_COUNT (a->succs) != 1)
1030 return false;
1032 if (EDGE_SUCC (a, 0)->flags & EDGE_ABNORMAL)
1033 return false;
1035 if (EDGE_SUCC (a, 0)->dest != b)
1036 return false;
1038 if (b == EXIT_BLOCK_PTR)
1039 return false;
1041 if (EDGE_COUNT (b->preds) > 1)
1042 return false;
1044 /* If A ends by a statement causing exceptions or something similar, we
1045 cannot merge the blocks. */
1046 stmt = last_stmt (a);
1047 if (stmt && stmt_ends_bb_p (stmt))
1048 return false;
1050 /* Do not allow a block with only a non-local label to be merged. */
1051 if (stmt && TREE_CODE (stmt) == LABEL_EXPR
1052 && DECL_NONLOCAL (LABEL_EXPR_LABEL (stmt)))
1053 return false;
1055 /* There may be no phi nodes at the start of b. Most of these degenerate
1056 phi nodes should be cleaned up by kill_redundant_phi_nodes. */
1057 if (phi_nodes (b))
1058 return false;
1060 /* Do not remove user labels. */
1061 for (bsi = bsi_start (b); !bsi_end_p (bsi); bsi_next (&bsi))
1063 stmt = bsi_stmt (bsi);
1064 if (TREE_CODE (stmt) != LABEL_EXPR)
1065 break;
1066 if (!DECL_ARTIFICIAL (LABEL_EXPR_LABEL (stmt)))
1067 return false;
1070 return true;
1074 /* Merge block B into block A. */
1076 static void
1077 tree_merge_blocks (basic_block a, basic_block b)
1079 block_stmt_iterator bsi;
1080 tree_stmt_iterator last;
1082 if (dump_file)
1083 fprintf (dump_file, "Merging blocks %d and %d\n", a->index, b->index);
1085 /* Ensure that B follows A. */
1086 move_block_after (b, a);
1088 gcc_assert (EDGE_SUCC (a, 0)->flags & EDGE_FALLTHRU);
1089 gcc_assert (!last_stmt (a) || !stmt_ends_bb_p (last_stmt (a)));
1091 /* Remove labels from B and set bb_for_stmt to A for other statements. */
1092 for (bsi = bsi_start (b); !bsi_end_p (bsi);)
1094 if (TREE_CODE (bsi_stmt (bsi)) == LABEL_EXPR)
1095 bsi_remove (&bsi);
1096 else
1098 set_bb_for_stmt (bsi_stmt (bsi), a);
1099 bsi_next (&bsi);
1103 /* Merge the chains. */
1104 last = tsi_last (a->stmt_list);
1105 tsi_link_after (&last, b->stmt_list, TSI_NEW_STMT);
1106 b->stmt_list = NULL;
1110 /* Walk the function tree removing unnecessary statements.
1112 * Empty statement nodes are removed
1114 * Unnecessary TRY_FINALLY and TRY_CATCH blocks are removed
1116 * Unnecessary COND_EXPRs are removed
1118 * Some unnecessary BIND_EXPRs are removed
1120 Clearly more work could be done. The trick is doing the analysis
1121 and removal fast enough to be a net improvement in compile times.
1123 Note that when we remove a control structure such as a COND_EXPR
1124 BIND_EXPR, or TRY block, we will need to repeat this optimization pass
1125 to ensure we eliminate all the useless code. */
1127 struct rus_data
1129 tree *last_goto;
1130 bool repeat;
1131 bool may_throw;
1132 bool may_branch;
1133 bool has_label;
1136 static void remove_useless_stmts_1 (tree *, struct rus_data *);
1138 static bool
1139 remove_useless_stmts_warn_notreached (tree stmt)
1141 if (EXPR_HAS_LOCATION (stmt))
1143 location_t loc = EXPR_LOCATION (stmt);
1144 warning ("%Hwill never be executed", &loc);
1145 return true;
1148 switch (TREE_CODE (stmt))
1150 case STATEMENT_LIST:
1152 tree_stmt_iterator i;
1153 for (i = tsi_start (stmt); !tsi_end_p (i); tsi_next (&i))
1154 if (remove_useless_stmts_warn_notreached (tsi_stmt (i)))
1155 return true;
1157 break;
1159 case COND_EXPR:
1160 if (remove_useless_stmts_warn_notreached (COND_EXPR_COND (stmt)))
1161 return true;
1162 if (remove_useless_stmts_warn_notreached (COND_EXPR_THEN (stmt)))
1163 return true;
1164 if (remove_useless_stmts_warn_notreached (COND_EXPR_ELSE (stmt)))
1165 return true;
1166 break;
1168 case TRY_FINALLY_EXPR:
1169 case TRY_CATCH_EXPR:
1170 if (remove_useless_stmts_warn_notreached (TREE_OPERAND (stmt, 0)))
1171 return true;
1172 if (remove_useless_stmts_warn_notreached (TREE_OPERAND (stmt, 1)))
1173 return true;
1174 break;
1176 case CATCH_EXPR:
1177 return remove_useless_stmts_warn_notreached (CATCH_BODY (stmt));
1178 case EH_FILTER_EXPR:
1179 return remove_useless_stmts_warn_notreached (EH_FILTER_FAILURE (stmt));
1180 case BIND_EXPR:
1181 return remove_useless_stmts_warn_notreached (BIND_EXPR_BLOCK (stmt));
1183 default:
1184 /* Not a live container. */
1185 break;
1188 return false;
1191 static void
1192 remove_useless_stmts_cond (tree *stmt_p, struct rus_data *data)
1194 tree then_clause, else_clause, cond;
1195 bool save_has_label, then_has_label, else_has_label;
1197 save_has_label = data->has_label;
1198 data->has_label = false;
1199 data->last_goto = NULL;
1201 remove_useless_stmts_1 (&COND_EXPR_THEN (*stmt_p), data);
1203 then_has_label = data->has_label;
1204 data->has_label = false;
1205 data->last_goto = NULL;
1207 remove_useless_stmts_1 (&COND_EXPR_ELSE (*stmt_p), data);
1209 else_has_label = data->has_label;
1210 data->has_label = save_has_label | then_has_label | else_has_label;
1212 fold_stmt (stmt_p);
1213 then_clause = COND_EXPR_THEN (*stmt_p);
1214 else_clause = COND_EXPR_ELSE (*stmt_p);
1215 cond = COND_EXPR_COND (*stmt_p);
1217 /* If neither arm does anything at all, we can remove the whole IF. */
1218 if (!TREE_SIDE_EFFECTS (then_clause) && !TREE_SIDE_EFFECTS (else_clause))
1220 *stmt_p = build_empty_stmt ();
1221 data->repeat = true;
1224 /* If there are no reachable statements in an arm, then we can
1225 zap the entire conditional. */
1226 else if (integer_nonzerop (cond) && !else_has_label)
1228 if (warn_notreached)
1229 remove_useless_stmts_warn_notreached (else_clause);
1230 *stmt_p = then_clause;
1231 data->repeat = true;
1233 else if (integer_zerop (cond) && !then_has_label)
1235 if (warn_notreached)
1236 remove_useless_stmts_warn_notreached (then_clause);
1237 *stmt_p = else_clause;
1238 data->repeat = true;
1241 /* Check a couple of simple things on then/else with single stmts. */
1242 else
1244 tree then_stmt = expr_only (then_clause);
1245 tree else_stmt = expr_only (else_clause);
1247 /* Notice branches to a common destination. */
1248 if (then_stmt && else_stmt
1249 && TREE_CODE (then_stmt) == GOTO_EXPR
1250 && TREE_CODE (else_stmt) == GOTO_EXPR
1251 && (GOTO_DESTINATION (then_stmt) == GOTO_DESTINATION (else_stmt)))
1253 *stmt_p = then_stmt;
1254 data->repeat = true;
1257 /* If the THEN/ELSE clause merely assigns a value to a variable or
1258 parameter which is already known to contain that value, then
1259 remove the useless THEN/ELSE clause. */
1260 else if (TREE_CODE (cond) == VAR_DECL || TREE_CODE (cond) == PARM_DECL)
1262 if (else_stmt
1263 && TREE_CODE (else_stmt) == MODIFY_EXPR
1264 && TREE_OPERAND (else_stmt, 0) == cond
1265 && integer_zerop (TREE_OPERAND (else_stmt, 1)))
1266 COND_EXPR_ELSE (*stmt_p) = alloc_stmt_list ();
1268 else if ((TREE_CODE (cond) == EQ_EXPR || TREE_CODE (cond) == NE_EXPR)
1269 && (TREE_CODE (TREE_OPERAND (cond, 0)) == VAR_DECL
1270 || TREE_CODE (TREE_OPERAND (cond, 0)) == PARM_DECL)
1271 && TREE_CONSTANT (TREE_OPERAND (cond, 1)))
1273 tree stmt = (TREE_CODE (cond) == EQ_EXPR
1274 ? then_stmt : else_stmt);
1275 tree *location = (TREE_CODE (cond) == EQ_EXPR
1276 ? &COND_EXPR_THEN (*stmt_p)
1277 : &COND_EXPR_ELSE (*stmt_p));
1279 if (stmt
1280 && TREE_CODE (stmt) == MODIFY_EXPR
1281 && TREE_OPERAND (stmt, 0) == TREE_OPERAND (cond, 0)
1282 && TREE_OPERAND (stmt, 1) == TREE_OPERAND (cond, 1))
1283 *location = alloc_stmt_list ();
1287 /* Protect GOTOs in the arm of COND_EXPRs from being removed. They
1288 would be re-introduced during lowering. */
1289 data->last_goto = NULL;
1293 static void
1294 remove_useless_stmts_tf (tree *stmt_p, struct rus_data *data)
1296 bool save_may_branch, save_may_throw;
1297 bool this_may_branch, this_may_throw;
1299 /* Collect may_branch and may_throw information for the body only. */
1300 save_may_branch = data->may_branch;
1301 save_may_throw = data->may_throw;
1302 data->may_branch = false;
1303 data->may_throw = false;
1304 data->last_goto = NULL;
1306 remove_useless_stmts_1 (&TREE_OPERAND (*stmt_p, 0), data);
1308 this_may_branch = data->may_branch;
1309 this_may_throw = data->may_throw;
1310 data->may_branch |= save_may_branch;
1311 data->may_throw |= save_may_throw;
1312 data->last_goto = NULL;
1314 remove_useless_stmts_1 (&TREE_OPERAND (*stmt_p, 1), data);
1316 /* If the body is empty, then we can emit the FINALLY block without
1317 the enclosing TRY_FINALLY_EXPR. */
1318 if (!TREE_SIDE_EFFECTS (TREE_OPERAND (*stmt_p, 0)))
1320 *stmt_p = TREE_OPERAND (*stmt_p, 1);
1321 data->repeat = true;
1324 /* If the handler is empty, then we can emit the TRY block without
1325 the enclosing TRY_FINALLY_EXPR. */
1326 else if (!TREE_SIDE_EFFECTS (TREE_OPERAND (*stmt_p, 1)))
1328 *stmt_p = TREE_OPERAND (*stmt_p, 0);
1329 data->repeat = true;
1332 /* If the body neither throws, nor branches, then we can safely
1333 string the TRY and FINALLY blocks together. */
1334 else if (!this_may_branch && !this_may_throw)
1336 tree stmt = *stmt_p;
1337 *stmt_p = TREE_OPERAND (stmt, 0);
1338 append_to_statement_list (TREE_OPERAND (stmt, 1), stmt_p);
1339 data->repeat = true;
1344 static void
1345 remove_useless_stmts_tc (tree *stmt_p, struct rus_data *data)
1347 bool save_may_throw, this_may_throw;
1348 tree_stmt_iterator i;
1349 tree stmt;
1351 /* Collect may_throw information for the body only. */
1352 save_may_throw = data->may_throw;
1353 data->may_throw = false;
1354 data->last_goto = NULL;
1356 remove_useless_stmts_1 (&TREE_OPERAND (*stmt_p, 0), data);
1358 this_may_throw = data->may_throw;
1359 data->may_throw = save_may_throw;
1361 /* If the body cannot throw, then we can drop the entire TRY_CATCH_EXPR. */
1362 if (!this_may_throw)
1364 if (warn_notreached)
1365 remove_useless_stmts_warn_notreached (TREE_OPERAND (*stmt_p, 1));
1366 *stmt_p = TREE_OPERAND (*stmt_p, 0);
1367 data->repeat = true;
1368 return;
1371 /* Process the catch clause specially. We may be able to tell that
1372 no exceptions propagate past this point. */
1374 this_may_throw = true;
1375 i = tsi_start (TREE_OPERAND (*stmt_p, 1));
1376 stmt = tsi_stmt (i);
1377 data->last_goto = NULL;
1379 switch (TREE_CODE (stmt))
1381 case CATCH_EXPR:
1382 for (; !tsi_end_p (i); tsi_next (&i))
1384 stmt = tsi_stmt (i);
1385 /* If we catch all exceptions, then the body does not
1386 propagate exceptions past this point. */
1387 if (CATCH_TYPES (stmt) == NULL)
1388 this_may_throw = false;
1389 data->last_goto = NULL;
1390 remove_useless_stmts_1 (&CATCH_BODY (stmt), data);
1392 break;
1394 case EH_FILTER_EXPR:
1395 if (EH_FILTER_MUST_NOT_THROW (stmt))
1396 this_may_throw = false;
1397 else if (EH_FILTER_TYPES (stmt) == NULL)
1398 this_may_throw = false;
1399 remove_useless_stmts_1 (&EH_FILTER_FAILURE (stmt), data);
1400 break;
1402 default:
1403 /* Otherwise this is a cleanup. */
1404 remove_useless_stmts_1 (&TREE_OPERAND (*stmt_p, 1), data);
1406 /* If the cleanup is empty, then we can emit the TRY block without
1407 the enclosing TRY_CATCH_EXPR. */
1408 if (!TREE_SIDE_EFFECTS (TREE_OPERAND (*stmt_p, 1)))
1410 *stmt_p = TREE_OPERAND (*stmt_p, 0);
1411 data->repeat = true;
1413 break;
1415 data->may_throw |= this_may_throw;
1419 static void
1420 remove_useless_stmts_bind (tree *stmt_p, struct rus_data *data)
1422 tree block;
1424 /* First remove anything underneath the BIND_EXPR. */
1425 remove_useless_stmts_1 (&BIND_EXPR_BODY (*stmt_p), data);
1427 /* If the BIND_EXPR has no variables, then we can pull everything
1428 up one level and remove the BIND_EXPR, unless this is the toplevel
1429 BIND_EXPR for the current function or an inlined function.
1431 When this situation occurs we will want to apply this
1432 optimization again. */
1433 block = BIND_EXPR_BLOCK (*stmt_p);
1434 if (BIND_EXPR_VARS (*stmt_p) == NULL_TREE
1435 && *stmt_p != DECL_SAVED_TREE (current_function_decl)
1436 && (! block
1437 || ! BLOCK_ABSTRACT_ORIGIN (block)
1438 || (TREE_CODE (BLOCK_ABSTRACT_ORIGIN (block))
1439 != FUNCTION_DECL)))
1441 *stmt_p = BIND_EXPR_BODY (*stmt_p);
1442 data->repeat = true;
1447 static void
1448 remove_useless_stmts_goto (tree *stmt_p, struct rus_data *data)
1450 tree dest = GOTO_DESTINATION (*stmt_p);
1452 data->may_branch = true;
1453 data->last_goto = NULL;
1455 /* Record the last goto expr, so that we can delete it if unnecessary. */
1456 if (TREE_CODE (dest) == LABEL_DECL)
1457 data->last_goto = stmt_p;
1461 static void
1462 remove_useless_stmts_label (tree *stmt_p, struct rus_data *data)
1464 tree label = LABEL_EXPR_LABEL (*stmt_p);
1466 data->has_label = true;
1468 /* We do want to jump across non-local label receiver code. */
1469 if (DECL_NONLOCAL (label))
1470 data->last_goto = NULL;
1472 else if (data->last_goto && GOTO_DESTINATION (*data->last_goto) == label)
1474 *data->last_goto = build_empty_stmt ();
1475 data->repeat = true;
1478 /* ??? Add something here to delete unused labels. */
1482 /* If the function is "const" or "pure", then clear TREE_SIDE_EFFECTS on its
1483 decl. This allows us to eliminate redundant or useless
1484 calls to "const" functions.
1486 Gimplifier already does the same operation, but we may notice functions
1487 being const and pure once their calls has been gimplified, so we need
1488 to update the flag. */
1490 static void
1491 update_call_expr_flags (tree call)
1493 tree decl = get_callee_fndecl (call);
1494 if (!decl)
1495 return;
1496 if (call_expr_flags (call) & (ECF_CONST | ECF_PURE))
1497 TREE_SIDE_EFFECTS (call) = 0;
1498 if (TREE_NOTHROW (decl))
1499 TREE_NOTHROW (call) = 1;
1503 /* T is CALL_EXPR. Set current_function_calls_* flags. */
1505 void
1506 notice_special_calls (tree t)
1508 int flags = call_expr_flags (t);
1510 if (flags & ECF_MAY_BE_ALLOCA)
1511 current_function_calls_alloca = true;
1512 if (flags & ECF_RETURNS_TWICE)
1513 current_function_calls_setjmp = true;
1517 /* Clear flags set by notice_special_calls. Used by dead code removal
1518 to update the flags. */
1520 void
1521 clear_special_calls (void)
1523 current_function_calls_alloca = false;
1524 current_function_calls_setjmp = false;
1528 static void
1529 remove_useless_stmts_1 (tree *tp, struct rus_data *data)
1531 tree t = *tp, op;
1533 switch (TREE_CODE (t))
1535 case COND_EXPR:
1536 remove_useless_stmts_cond (tp, data);
1537 break;
1539 case TRY_FINALLY_EXPR:
1540 remove_useless_stmts_tf (tp, data);
1541 break;
1543 case TRY_CATCH_EXPR:
1544 remove_useless_stmts_tc (tp, data);
1545 break;
1547 case BIND_EXPR:
1548 remove_useless_stmts_bind (tp, data);
1549 break;
1551 case GOTO_EXPR:
1552 remove_useless_stmts_goto (tp, data);
1553 break;
1555 case LABEL_EXPR:
1556 remove_useless_stmts_label (tp, data);
1557 break;
1559 case RETURN_EXPR:
1560 fold_stmt (tp);
1561 data->last_goto = NULL;
1562 data->may_branch = true;
1563 break;
1565 case CALL_EXPR:
1566 fold_stmt (tp);
1567 data->last_goto = NULL;
1568 notice_special_calls (t);
1569 update_call_expr_flags (t);
1570 if (tree_could_throw_p (t))
1571 data->may_throw = true;
1572 break;
1574 case MODIFY_EXPR:
1575 data->last_goto = NULL;
1576 fold_stmt (tp);
1577 op = get_call_expr_in (t);
1578 if (op)
1580 update_call_expr_flags (op);
1581 notice_special_calls (op);
1583 if (tree_could_throw_p (t))
1584 data->may_throw = true;
1585 break;
1587 case STATEMENT_LIST:
1589 tree_stmt_iterator i = tsi_start (t);
1590 while (!tsi_end_p (i))
1592 t = tsi_stmt (i);
1593 if (IS_EMPTY_STMT (t))
1595 tsi_delink (&i);
1596 continue;
1599 remove_useless_stmts_1 (tsi_stmt_ptr (i), data);
1601 t = tsi_stmt (i);
1602 if (TREE_CODE (t) == STATEMENT_LIST)
1604 tsi_link_before (&i, t, TSI_SAME_STMT);
1605 tsi_delink (&i);
1607 else
1608 tsi_next (&i);
1611 break;
1612 case SWITCH_EXPR:
1613 fold_stmt (tp);
1614 data->last_goto = NULL;
1615 break;
1617 default:
1618 data->last_goto = NULL;
1619 break;
1623 static void
1624 remove_useless_stmts (void)
1626 struct rus_data data;
1628 clear_special_calls ();
1632 memset (&data, 0, sizeof (data));
1633 remove_useless_stmts_1 (&DECL_SAVED_TREE (current_function_decl), &data);
1635 while (data.repeat);
1639 struct tree_opt_pass pass_remove_useless_stmts =
1641 "useless", /* name */
1642 NULL, /* gate */
1643 remove_useless_stmts, /* execute */
1644 NULL, /* sub */
1645 NULL, /* next */
1646 0, /* static_pass_number */
1647 0, /* tv_id */
1648 PROP_gimple_any, /* properties_required */
1649 0, /* properties_provided */
1650 0, /* properties_destroyed */
1651 0, /* todo_flags_start */
1652 TODO_dump_func, /* todo_flags_finish */
1653 0 /* letter */
1657 /* Remove obviously useless statements in basic block BB. */
1659 static void
1660 cfg_remove_useless_stmts_bb (basic_block bb)
1662 block_stmt_iterator bsi;
1663 tree stmt = NULL_TREE;
1664 tree cond, var = NULL_TREE, val = NULL_TREE;
1665 struct var_ann_d *ann;
1667 /* Check whether we come here from a condition, and if so, get the
1668 condition. */
1669 if (EDGE_COUNT (bb->preds) != 1
1670 || !(EDGE_PRED (bb, 0)->flags & (EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
1671 return;
1673 cond = COND_EXPR_COND (last_stmt (EDGE_PRED (bb, 0)->src));
1675 if (TREE_CODE (cond) == VAR_DECL || TREE_CODE (cond) == PARM_DECL)
1677 var = cond;
1678 val = (EDGE_PRED (bb, 0)->flags & EDGE_FALSE_VALUE
1679 ? boolean_false_node : boolean_true_node);
1681 else if (TREE_CODE (cond) == TRUTH_NOT_EXPR
1682 && (TREE_CODE (TREE_OPERAND (cond, 0)) == VAR_DECL
1683 || TREE_CODE (TREE_OPERAND (cond, 0)) == PARM_DECL))
1685 var = TREE_OPERAND (cond, 0);
1686 val = (EDGE_PRED (bb, 0)->flags & EDGE_FALSE_VALUE
1687 ? boolean_true_node : boolean_false_node);
1689 else
1691 if (EDGE_PRED (bb, 0)->flags & EDGE_FALSE_VALUE)
1692 cond = invert_truthvalue (cond);
1693 if (TREE_CODE (cond) == EQ_EXPR
1694 && (TREE_CODE (TREE_OPERAND (cond, 0)) == VAR_DECL
1695 || TREE_CODE (TREE_OPERAND (cond, 0)) == PARM_DECL)
1696 && (TREE_CODE (TREE_OPERAND (cond, 1)) == VAR_DECL
1697 || TREE_CODE (TREE_OPERAND (cond, 1)) == PARM_DECL
1698 || TREE_CONSTANT (TREE_OPERAND (cond, 1))))
1700 var = TREE_OPERAND (cond, 0);
1701 val = TREE_OPERAND (cond, 1);
1703 else
1704 return;
1707 /* Only work for normal local variables. */
1708 ann = var_ann (var);
1709 if (!ann
1710 || ann->may_aliases
1711 || TREE_ADDRESSABLE (var))
1712 return;
1714 if (! TREE_CONSTANT (val))
1716 ann = var_ann (val);
1717 if (!ann
1718 || ann->may_aliases
1719 || TREE_ADDRESSABLE (val))
1720 return;
1723 /* Ignore floating point variables, since comparison behaves weird for
1724 them. */
1725 if (FLOAT_TYPE_P (TREE_TYPE (var)))
1726 return;
1728 for (bsi = bsi_start (bb); !bsi_end_p (bsi);)
1730 stmt = bsi_stmt (bsi);
1732 /* If the THEN/ELSE clause merely assigns a value to a variable/parameter
1733 which is already known to contain that value, then remove the useless
1734 THEN/ELSE clause. */
1735 if (TREE_CODE (stmt) == MODIFY_EXPR
1736 && TREE_OPERAND (stmt, 0) == var
1737 && operand_equal_p (val, TREE_OPERAND (stmt, 1), 0))
1739 bsi_remove (&bsi);
1740 continue;
1743 /* Invalidate the var if we encounter something that could modify it.
1744 Likewise for the value it was previously set to. Note that we only
1745 consider values that are either a VAR_DECL or PARM_DECL so we
1746 can test for conflict very simply. */
1747 if (TREE_CODE (stmt) == ASM_EXPR
1748 || (TREE_CODE (stmt) == MODIFY_EXPR
1749 && (TREE_OPERAND (stmt, 0) == var
1750 || TREE_OPERAND (stmt, 0) == val)))
1751 return;
1753 bsi_next (&bsi);
1758 /* A CFG-aware version of remove_useless_stmts. */
1760 void
1761 cfg_remove_useless_stmts (void)
1763 basic_block bb;
1765 #ifdef ENABLE_CHECKING
1766 verify_flow_info ();
1767 #endif
1769 FOR_EACH_BB (bb)
1771 cfg_remove_useless_stmts_bb (bb);
1776 /* Remove PHI nodes associated with basic block BB and all edges out of BB. */
1778 static void
1779 remove_phi_nodes_and_edges_for_unreachable_block (basic_block bb)
1781 tree phi;
1783 /* Since this block is no longer reachable, we can just delete all
1784 of its PHI nodes. */
1785 phi = phi_nodes (bb);
1786 while (phi)
1788 tree next = PHI_CHAIN (phi);
1789 remove_phi_node (phi, NULL_TREE, bb);
1790 phi = next;
1793 /* Remove edges to BB's successors. */
1794 while (EDGE_COUNT (bb->succs) > 0)
1795 ssa_remove_edge (EDGE_SUCC (bb, 0));
1799 /* Remove statements of basic block BB. */
1801 static void
1802 remove_bb (basic_block bb)
1804 block_stmt_iterator i;
1805 source_locus loc = 0;
1807 if (dump_file)
1809 fprintf (dump_file, "Removing basic block %d\n", bb->index);
1810 if (dump_flags & TDF_DETAILS)
1812 dump_bb (bb, dump_file, 0);
1813 fprintf (dump_file, "\n");
1817 /* Remove all the instructions in the block. */
1818 for (i = bsi_start (bb); !bsi_end_p (i); bsi_remove (&i))
1820 tree stmt = bsi_stmt (i);
1821 release_defs (stmt);
1823 set_bb_for_stmt (stmt, NULL);
1825 /* Don't warn for removed gotos. Gotos are often removed due to
1826 jump threading, thus resulting in bogus warnings. Not great,
1827 since this way we lose warnings for gotos in the original
1828 program that are indeed unreachable. */
1829 if (TREE_CODE (stmt) != GOTO_EXPR && EXPR_HAS_LOCATION (stmt) && !loc)
1830 #ifdef USE_MAPPED_LOCATION
1831 loc = EXPR_LOCATION (stmt);
1832 #else
1833 loc = EXPR_LOCUS (stmt);
1834 #endif
1837 /* If requested, give a warning that the first statement in the
1838 block is unreachable. We walk statements backwards in the
1839 loop above, so the last statement we process is the first statement
1840 in the block. */
1841 if (warn_notreached && loc)
1842 #ifdef USE_MAPPED_LOCATION
1843 warning ("%Hwill never be executed", &loc);
1844 #else
1845 warning ("%Hwill never be executed", loc);
1846 #endif
1848 remove_phi_nodes_and_edges_for_unreachable_block (bb);
1852 /* Examine BB to determine if it is a forwarding block (a block which only
1853 transfers control to a new destination). If BB is a forwarding block,
1854 then return the edge leading to the ultimate destination. */
1856 edge
1857 tree_block_forwards_to (basic_block bb)
1859 block_stmt_iterator bsi;
1860 bb_ann_t ann = bb_ann (bb);
1861 tree stmt;
1863 /* If this block is not forwardable, then avoid useless work. */
1864 if (! ann->forwardable)
1865 return NULL;
1867 /* Set this block to not be forwardable. This prevents infinite loops since
1868 any block currently under examination is considered non-forwardable. */
1869 ann->forwardable = 0;
1871 /* No forwarding is possible if this block is a special block (ENTRY/EXIT),
1872 this block has more than one successor, this block's single successor is
1873 reached via an abnormal edge, this block has phi nodes, or this block's
1874 single successor has phi nodes. */
1875 if (bb == EXIT_BLOCK_PTR
1876 || bb == ENTRY_BLOCK_PTR
1877 || EDGE_COUNT (bb->succs) != 1
1878 || EDGE_SUCC (bb, 0)->dest == EXIT_BLOCK_PTR
1879 || (EDGE_SUCC (bb, 0)->flags & EDGE_ABNORMAL) != 0
1880 || phi_nodes (bb)
1881 || phi_nodes (EDGE_SUCC (bb, 0)->dest))
1882 return NULL;
1884 /* Walk past any labels at the start of this block. */
1885 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
1887 stmt = bsi_stmt (bsi);
1888 if (TREE_CODE (stmt) != LABEL_EXPR)
1889 break;
1892 /* If we reached the end of this block we may be able to optimize this
1893 case. */
1894 if (bsi_end_p (bsi))
1896 edge dest;
1898 /* Recursive call to pick up chains of forwarding blocks. */
1899 dest = tree_block_forwards_to (EDGE_SUCC (bb, 0)->dest);
1901 /* If none found, we forward to bb->succs[0] at minimum. */
1902 if (!dest)
1903 dest = EDGE_SUCC (bb, 0);
1905 ann->forwardable = 1;
1906 return dest;
1909 /* No forwarding possible. */
1910 return NULL;
1914 /* Try to remove superfluous control structures. */
1916 static bool
1917 cleanup_control_flow (void)
1919 basic_block bb;
1920 block_stmt_iterator bsi;
1921 bool retval = false;
1922 tree stmt;
1924 FOR_EACH_BB (bb)
1926 bsi = bsi_last (bb);
1928 if (bsi_end_p (bsi))
1929 continue;
1931 stmt = bsi_stmt (bsi);
1932 if (TREE_CODE (stmt) == COND_EXPR
1933 || TREE_CODE (stmt) == SWITCH_EXPR)
1934 retval |= cleanup_control_expr_graph (bb, bsi);
1936 return retval;
1940 /* Disconnect an unreachable block in the control expression starting
1941 at block BB. */
1943 static bool
1944 cleanup_control_expr_graph (basic_block bb, block_stmt_iterator bsi)
1946 edge taken_edge;
1947 bool retval = false;
1948 tree expr = bsi_stmt (bsi), val;
1950 if (EDGE_COUNT (bb->succs) > 1)
1952 edge e;
1953 edge_iterator ei;
1955 switch (TREE_CODE (expr))
1957 case COND_EXPR:
1958 val = COND_EXPR_COND (expr);
1959 break;
1961 case SWITCH_EXPR:
1962 val = SWITCH_COND (expr);
1963 if (TREE_CODE (val) != INTEGER_CST)
1964 return false;
1965 break;
1967 default:
1968 gcc_unreachable ();
1971 taken_edge = find_taken_edge (bb, val);
1972 if (!taken_edge)
1973 return false;
1975 /* Remove all the edges except the one that is always executed. */
1976 for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
1978 if (e != taken_edge)
1980 taken_edge->probability += e->probability;
1981 taken_edge->count += e->count;
1982 ssa_remove_edge (e);
1983 retval = true;
1985 else
1986 ei_next (&ei);
1988 if (taken_edge->probability > REG_BR_PROB_BASE)
1989 taken_edge->probability = REG_BR_PROB_BASE;
1991 else
1992 taken_edge = EDGE_SUCC (bb, 0);
1994 bsi_remove (&bsi);
1995 taken_edge->flags = EDGE_FALLTHRU;
1997 /* We removed some paths from the cfg. */
1998 if (dom_computed[CDI_DOMINATORS] >= DOM_CONS_OK)
1999 dom_computed[CDI_DOMINATORS] = DOM_CONS_OK;
2001 return retval;
2005 /* Given a control block BB and a predicate VAL, return the edge that
2006 will be taken out of the block. If VAL does not match a unique
2007 edge, NULL is returned. */
2009 edge
2010 find_taken_edge (basic_block bb, tree val)
2012 tree stmt;
2014 stmt = last_stmt (bb);
2016 gcc_assert (stmt);
2017 gcc_assert (is_ctrl_stmt (stmt));
2019 /* If VAL is a predicate of the form N RELOP N, where N is an
2020 SSA_NAME, we can usually determine its truth value. */
2021 if (val && COMPARISON_CLASS_P (val))
2022 val = fold (val);
2024 /* If VAL is not a constant, we can't determine which edge might
2025 be taken. */
2026 if (val == NULL || !really_constant_p (val))
2027 return NULL;
2029 if (TREE_CODE (stmt) == COND_EXPR)
2030 return find_taken_edge_cond_expr (bb, val);
2032 if (TREE_CODE (stmt) == SWITCH_EXPR)
2033 return find_taken_edge_switch_expr (bb, val);
2035 return EDGE_SUCC (bb, 0);
2039 /* Given a constant value VAL and the entry block BB to a COND_EXPR
2040 statement, determine which of the two edges will be taken out of the
2041 block. Return NULL if either edge may be taken. */
2043 static edge
2044 find_taken_edge_cond_expr (basic_block bb, tree val)
2046 edge true_edge, false_edge;
2048 extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
2050 /* If both edges of the branch lead to the same basic block, it doesn't
2051 matter which edge is taken. */
2052 if (true_edge->dest == false_edge->dest)
2053 return true_edge;
2055 /* Otherwise, try to determine which branch of the if() will be taken.
2056 If VAL is a constant but it can't be reduced to a 0 or a 1, then
2057 we don't really know which edge will be taken at runtime. This
2058 may happen when comparing addresses (e.g., if (&var1 == 4)). */
2059 if (integer_nonzerop (val))
2060 return true_edge;
2061 else if (integer_zerop (val))
2062 return false_edge;
2063 else
2064 return NULL;
2068 /* Given a constant value VAL and the entry block BB to a SWITCH_EXPR
2069 statement, determine which edge will be taken out of the block. Return
2070 NULL if any edge may be taken. */
2072 static edge
2073 find_taken_edge_switch_expr (basic_block bb, tree val)
2075 tree switch_expr, taken_case;
2076 basic_block dest_bb;
2077 edge e;
2079 if (TREE_CODE (val) != INTEGER_CST)
2080 return NULL;
2082 switch_expr = last_stmt (bb);
2083 taken_case = find_case_label_for_value (switch_expr, val);
2084 dest_bb = label_to_block (CASE_LABEL (taken_case));
2086 e = find_edge (bb, dest_bb);
2087 gcc_assert (e);
2088 return e;
2092 /* Return the CASE_LABEL_EXPR that SWITCH_EXPR will take for VAL.
2093 We can make optimal use here of the fact that the case labels are
2094 sorted: We can do a binary search for a case matching VAL. */
2096 static tree
2097 find_case_label_for_value (tree switch_expr, tree val)
2099 tree vec = SWITCH_LABELS (switch_expr);
2100 size_t low, high, n = TREE_VEC_LENGTH (vec);
2101 tree default_case = TREE_VEC_ELT (vec, n - 1);
2103 for (low = -1, high = n - 1; high - low > 1; )
2105 size_t i = (high + low) / 2;
2106 tree t = TREE_VEC_ELT (vec, i);
2107 int cmp;
2109 /* Cache the result of comparing CASE_LOW and val. */
2110 cmp = tree_int_cst_compare (CASE_LOW (t), val);
2112 if (cmp > 0)
2113 high = i;
2114 else
2115 low = i;
2117 if (CASE_HIGH (t) == NULL)
2119 /* A singe-valued case label. */
2120 if (cmp == 0)
2121 return t;
2123 else
2125 /* A case range. We can only handle integer ranges. */
2126 if (cmp <= 0 && tree_int_cst_compare (CASE_HIGH (t), val) >= 0)
2127 return t;
2131 return default_case;
2135 /* If all the PHI nodes in DEST have alternatives for E1 and E2 and
2136 those alternatives are equal in each of the PHI nodes, then return
2137 true, else return false. */
2139 static bool
2140 phi_alternatives_equal (basic_block dest, edge e1, edge e2)
2142 tree phi, val1, val2;
2143 int n1, n2;
2145 for (phi = phi_nodes (dest); phi; phi = PHI_CHAIN (phi))
2147 n1 = phi_arg_from_edge (phi, e1);
2148 n2 = phi_arg_from_edge (phi, e2);
2150 gcc_assert (n1 >= 0);
2151 gcc_assert (n2 >= 0);
2153 val1 = PHI_ARG_DEF (phi, n1);
2154 val2 = PHI_ARG_DEF (phi, n2);
2156 if (!operand_equal_p (val1, val2, 0))
2157 return false;
2160 return true;
2164 /*---------------------------------------------------------------------------
2165 Debugging functions
2166 ---------------------------------------------------------------------------*/
2168 /* Dump tree-specific information of block BB to file OUTF. */
2170 void
2171 tree_dump_bb (basic_block bb, FILE *outf, int indent)
2173 dump_generic_bb (outf, bb, indent, TDF_VOPS);
2177 /* Dump a basic block on stderr. */
2179 void
2180 debug_tree_bb (basic_block bb)
2182 dump_bb (bb, stderr, 0);
2186 /* Dump basic block with index N on stderr. */
2188 basic_block
2189 debug_tree_bb_n (int n)
2191 debug_tree_bb (BASIC_BLOCK (n));
2192 return BASIC_BLOCK (n);
2196 /* Dump the CFG on stderr.
2198 FLAGS are the same used by the tree dumping functions
2199 (see TDF_* in tree.h). */
2201 void
2202 debug_tree_cfg (int flags)
2204 dump_tree_cfg (stderr, flags);
2208 /* Dump the program showing basic block boundaries on the given FILE.
2210 FLAGS are the same used by the tree dumping functions (see TDF_* in
2211 tree.h). */
2213 void
2214 dump_tree_cfg (FILE *file, int flags)
2216 if (flags & TDF_DETAILS)
2218 const char *funcname
2219 = lang_hooks.decl_printable_name (current_function_decl, 2);
2221 fputc ('\n', file);
2222 fprintf (file, ";; Function %s\n\n", funcname);
2223 fprintf (file, ";; \n%d basic blocks, %d edges, last basic block %d.\n\n",
2224 n_basic_blocks, n_edges, last_basic_block);
2226 brief_dump_cfg (file);
2227 fprintf (file, "\n");
2230 if (flags & TDF_STATS)
2231 dump_cfg_stats (file);
2233 dump_function_to_file (current_function_decl, file, flags | TDF_BLOCKS);
2237 /* Dump CFG statistics on FILE. */
2239 void
2240 dump_cfg_stats (FILE *file)
2242 static long max_num_merged_labels = 0;
2243 unsigned long size, total = 0;
2244 int n_edges;
2245 basic_block bb;
2246 const char * const fmt_str = "%-30s%-13s%12s\n";
2247 const char * const fmt_str_1 = "%-30s%13d%11lu%c\n";
2248 const char * const fmt_str_3 = "%-43s%11lu%c\n";
2249 const char *funcname
2250 = lang_hooks.decl_printable_name (current_function_decl, 2);
2253 fprintf (file, "\nCFG Statistics for %s\n\n", funcname);
2255 fprintf (file, "---------------------------------------------------------\n");
2256 fprintf (file, fmt_str, "", " Number of ", "Memory");
2257 fprintf (file, fmt_str, "", " instances ", "used ");
2258 fprintf (file, "---------------------------------------------------------\n");
2260 size = n_basic_blocks * sizeof (struct basic_block_def);
2261 total += size;
2262 fprintf (file, fmt_str_1, "Basic blocks", n_basic_blocks,
2263 SCALE (size), LABEL (size));
2265 n_edges = 0;
2266 FOR_EACH_BB (bb)
2267 n_edges += EDGE_COUNT (bb->succs);
2268 size = n_edges * sizeof (struct edge_def);
2269 total += size;
2270 fprintf (file, fmt_str_1, "Edges", n_edges, SCALE (size), LABEL (size));
2272 size = n_basic_blocks * sizeof (struct bb_ann_d);
2273 total += size;
2274 fprintf (file, fmt_str_1, "Basic block annotations", n_basic_blocks,
2275 SCALE (size), LABEL (size));
2277 fprintf (file, "---------------------------------------------------------\n");
2278 fprintf (file, fmt_str_3, "Total memory used by CFG data", SCALE (total),
2279 LABEL (total));
2280 fprintf (file, "---------------------------------------------------------\n");
2281 fprintf (file, "\n");
2283 if (cfg_stats.num_merged_labels > max_num_merged_labels)
2284 max_num_merged_labels = cfg_stats.num_merged_labels;
2286 fprintf (file, "Coalesced label blocks: %ld (Max so far: %ld)\n",
2287 cfg_stats.num_merged_labels, max_num_merged_labels);
2289 fprintf (file, "\n");
2293 /* Dump CFG statistics on stderr. Keep extern so that it's always
2294 linked in the final executable. */
2296 void
2297 debug_cfg_stats (void)
2299 dump_cfg_stats (stderr);
2303 /* Dump the flowgraph to a .vcg FILE. */
2305 static void
2306 tree_cfg2vcg (FILE *file)
2308 edge e;
2309 edge_iterator ei;
2310 basic_block bb;
2311 const char *funcname
2312 = lang_hooks.decl_printable_name (current_function_decl, 2);
2314 /* Write the file header. */
2315 fprintf (file, "graph: { title: \"%s\"\n", funcname);
2316 fprintf (file, "node: { title: \"ENTRY\" label: \"ENTRY\" }\n");
2317 fprintf (file, "node: { title: \"EXIT\" label: \"EXIT\" }\n");
2319 /* Write blocks and edges. */
2320 FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
2322 fprintf (file, "edge: { sourcename: \"ENTRY\" targetname: \"%d\"",
2323 e->dest->index);
2325 if (e->flags & EDGE_FAKE)
2326 fprintf (file, " linestyle: dotted priority: 10");
2327 else
2328 fprintf (file, " linestyle: solid priority: 100");
2330 fprintf (file, " }\n");
2332 fputc ('\n', file);
2334 FOR_EACH_BB (bb)
2336 enum tree_code head_code, end_code;
2337 const char *head_name, *end_name;
2338 int head_line = 0;
2339 int end_line = 0;
2340 tree first = first_stmt (bb);
2341 tree last = last_stmt (bb);
2343 if (first)
2345 head_code = TREE_CODE (first);
2346 head_name = tree_code_name[head_code];
2347 head_line = get_lineno (first);
2349 else
2350 head_name = "no-statement";
2352 if (last)
2354 end_code = TREE_CODE (last);
2355 end_name = tree_code_name[end_code];
2356 end_line = get_lineno (last);
2358 else
2359 end_name = "no-statement";
2361 fprintf (file, "node: { title: \"%d\" label: \"#%d\\n%s (%d)\\n%s (%d)\"}\n",
2362 bb->index, bb->index, head_name, head_line, end_name,
2363 end_line);
2365 FOR_EACH_EDGE (e, ei, bb->succs)
2367 if (e->dest == EXIT_BLOCK_PTR)
2368 fprintf (file, "edge: { sourcename: \"%d\" targetname: \"EXIT\"", bb->index);
2369 else
2370 fprintf (file, "edge: { sourcename: \"%d\" targetname: \"%d\"", bb->index, e->dest->index);
2372 if (e->flags & EDGE_FAKE)
2373 fprintf (file, " priority: 10 linestyle: dotted");
2374 else
2375 fprintf (file, " priority: 100 linestyle: solid");
2377 fprintf (file, " }\n");
2380 if (bb->next_bb != EXIT_BLOCK_PTR)
2381 fputc ('\n', file);
2384 fputs ("}\n\n", file);
2389 /*---------------------------------------------------------------------------
2390 Miscellaneous helpers
2391 ---------------------------------------------------------------------------*/
2393 /* Return true if T represents a stmt that always transfers control. */
2395 bool
2396 is_ctrl_stmt (tree t)
2398 return (TREE_CODE (t) == COND_EXPR
2399 || TREE_CODE (t) == SWITCH_EXPR
2400 || TREE_CODE (t) == GOTO_EXPR
2401 || TREE_CODE (t) == RETURN_EXPR
2402 || TREE_CODE (t) == RESX_EXPR);
2406 /* Return true if T is a statement that may alter the flow of control
2407 (e.g., a call to a non-returning function). */
2409 bool
2410 is_ctrl_altering_stmt (tree t)
2412 tree call;
2414 gcc_assert (t);
2415 call = get_call_expr_in (t);
2416 if (call)
2418 /* A non-pure/const CALL_EXPR alters flow control if the current
2419 function has nonlocal labels. */
2420 if (TREE_SIDE_EFFECTS (call) && current_function_has_nonlocal_label)
2421 return true;
2423 /* A CALL_EXPR also alters control flow if it does not return. */
2424 if (call_expr_flags (call) & (ECF_NORETURN | ECF_LONGJMP))
2425 return true;
2428 /* If a statement can throw, it alters control flow. */
2429 return tree_can_throw_internal (t);
2433 /* Return true if T is a computed goto. */
2435 bool
2436 computed_goto_p (tree t)
2438 return (TREE_CODE (t) == GOTO_EXPR
2439 && TREE_CODE (GOTO_DESTINATION (t)) != LABEL_DECL);
2443 /* Checks whether EXPR is a simple local goto. */
2445 bool
2446 simple_goto_p (tree expr)
2448 return (TREE_CODE (expr) == GOTO_EXPR
2449 && TREE_CODE (GOTO_DESTINATION (expr)) == LABEL_DECL);
2453 /* Return true if T should start a new basic block. PREV_T is the
2454 statement preceding T. It is used when T is a label or a case label.
2455 Labels should only start a new basic block if their previous statement
2456 wasn't a label. Otherwise, sequence of labels would generate
2457 unnecessary basic blocks that only contain a single label. */
2459 static inline bool
2460 stmt_starts_bb_p (tree t, tree prev_t)
2462 enum tree_code code;
2464 if (t == NULL_TREE)
2465 return false;
2467 /* LABEL_EXPRs start a new basic block only if the preceding
2468 statement wasn't a label of the same type. This prevents the
2469 creation of consecutive blocks that have nothing but a single
2470 label. */
2471 code = TREE_CODE (t);
2472 if (code == LABEL_EXPR)
2474 /* Nonlocal and computed GOTO targets always start a new block. */
2475 if (code == LABEL_EXPR
2476 && (DECL_NONLOCAL (LABEL_EXPR_LABEL (t))
2477 || FORCED_LABEL (LABEL_EXPR_LABEL (t))))
2478 return true;
2480 if (prev_t && TREE_CODE (prev_t) == code)
2482 if (DECL_NONLOCAL (LABEL_EXPR_LABEL (prev_t)))
2483 return true;
2485 cfg_stats.num_merged_labels++;
2486 return false;
2488 else
2489 return true;
2492 return false;
2496 /* Return true if T should end a basic block. */
2498 bool
2499 stmt_ends_bb_p (tree t)
2501 return is_ctrl_stmt (t) || is_ctrl_altering_stmt (t);
2505 /* Add gotos that used to be represented implicitly in the CFG. */
2507 void
2508 disband_implicit_edges (void)
2510 basic_block bb;
2511 block_stmt_iterator last;
2512 edge e;
2513 edge_iterator ei;
2514 tree stmt, label;
2516 FOR_EACH_BB (bb)
2518 last = bsi_last (bb);
2519 stmt = last_stmt (bb);
2521 if (stmt && TREE_CODE (stmt) == COND_EXPR)
2523 /* Remove superfluous gotos from COND_EXPR branches. Moved
2524 from cfg_remove_useless_stmts here since it violates the
2525 invariants for tree--cfg correspondence and thus fits better
2526 here where we do it anyway. */
2527 FOR_EACH_EDGE (e, ei, bb->succs)
2529 if (e->dest != bb->next_bb)
2530 continue;
2532 if (e->flags & EDGE_TRUE_VALUE)
2533 COND_EXPR_THEN (stmt) = build_empty_stmt ();
2534 else if (e->flags & EDGE_FALSE_VALUE)
2535 COND_EXPR_ELSE (stmt) = build_empty_stmt ();
2536 else
2537 gcc_unreachable ();
2538 e->flags |= EDGE_FALLTHRU;
2541 continue;
2544 if (stmt && TREE_CODE (stmt) == RETURN_EXPR)
2546 /* Remove the RETURN_EXPR if we may fall though to the exit
2547 instead. */
2548 gcc_assert (EDGE_COUNT (bb->succs) == 1);
2549 gcc_assert (EDGE_SUCC (bb, 0)->dest == EXIT_BLOCK_PTR);
2551 if (bb->next_bb == EXIT_BLOCK_PTR
2552 && !TREE_OPERAND (stmt, 0))
2554 bsi_remove (&last);
2555 EDGE_SUCC (bb, 0)->flags |= EDGE_FALLTHRU;
2557 continue;
2560 /* There can be no fallthru edge if the last statement is a control
2561 one. */
2562 if (stmt && is_ctrl_stmt (stmt))
2563 continue;
2565 /* Find a fallthru edge and emit the goto if necessary. */
2566 FOR_EACH_EDGE (e, ei, bb->succs)
2567 if (e->flags & EDGE_FALLTHRU)
2568 break;
2570 if (!e || e->dest == bb->next_bb)
2571 continue;
2573 gcc_assert (e->dest != EXIT_BLOCK_PTR);
2574 label = tree_block_label (e->dest);
2576 stmt = build1 (GOTO_EXPR, void_type_node, label);
2577 #ifdef USE_MAPPED_LOCATION
2578 SET_EXPR_LOCATION (stmt, e->goto_locus);
2579 #else
2580 SET_EXPR_LOCUS (stmt, e->goto_locus);
2581 #endif
2582 bsi_insert_after (&last, stmt, BSI_NEW_STMT);
2583 e->flags &= ~EDGE_FALLTHRU;
2587 /* Remove block annotations and other datastructures. */
2589 void
2590 delete_tree_cfg_annotations (void)
2592 basic_block bb;
2593 if (n_basic_blocks > 0)
2594 free_blocks_annotations ();
2596 label_to_block_map = NULL;
2597 free_rbi_pool ();
2598 FOR_EACH_BB (bb)
2599 bb->rbi = NULL;
2603 /* Return the first statement in basic block BB. */
2605 tree
2606 first_stmt (basic_block bb)
2608 block_stmt_iterator i = bsi_start (bb);
2609 return !bsi_end_p (i) ? bsi_stmt (i) : NULL_TREE;
2613 /* Return the last statement in basic block BB. */
2615 tree
2616 last_stmt (basic_block bb)
2618 block_stmt_iterator b = bsi_last (bb);
2619 return !bsi_end_p (b) ? bsi_stmt (b) : NULL_TREE;
2623 /* Return a pointer to the last statement in block BB. */
2625 tree *
2626 last_stmt_ptr (basic_block bb)
2628 block_stmt_iterator last = bsi_last (bb);
2629 return !bsi_end_p (last) ? bsi_stmt_ptr (last) : NULL;
2633 /* Return the last statement of an otherwise empty block. Return NULL
2634 if the block is totally empty, or if it contains more than one
2635 statement. */
2637 tree
2638 last_and_only_stmt (basic_block bb)
2640 block_stmt_iterator i = bsi_last (bb);
2641 tree last, prev;
2643 if (bsi_end_p (i))
2644 return NULL_TREE;
2646 last = bsi_stmt (i);
2647 bsi_prev (&i);
2648 if (bsi_end_p (i))
2649 return last;
2651 /* Empty statements should no longer appear in the instruction stream.
2652 Everything that might have appeared before should be deleted by
2653 remove_useless_stmts, and the optimizers should just bsi_remove
2654 instead of smashing with build_empty_stmt.
2656 Thus the only thing that should appear here in a block containing
2657 one executable statement is a label. */
2658 prev = bsi_stmt (i);
2659 if (TREE_CODE (prev) == LABEL_EXPR)
2660 return last;
2661 else
2662 return NULL_TREE;
2666 /* Mark BB as the basic block holding statement T. */
2668 void
2669 set_bb_for_stmt (tree t, basic_block bb)
2671 if (TREE_CODE (t) == PHI_NODE)
2672 PHI_BB (t) = bb;
2673 else if (TREE_CODE (t) == STATEMENT_LIST)
2675 tree_stmt_iterator i;
2676 for (i = tsi_start (t); !tsi_end_p (i); tsi_next (&i))
2677 set_bb_for_stmt (tsi_stmt (i), bb);
2679 else
2681 stmt_ann_t ann = get_stmt_ann (t);
2682 ann->bb = bb;
2684 /* If the statement is a label, add the label to block-to-labels map
2685 so that we can speed up edge creation for GOTO_EXPRs. */
2686 if (TREE_CODE (t) == LABEL_EXPR)
2688 int uid;
2690 t = LABEL_EXPR_LABEL (t);
2691 uid = LABEL_DECL_UID (t);
2692 if (uid == -1)
2694 LABEL_DECL_UID (t) = uid = cfun->last_label_uid++;
2695 if (VARRAY_SIZE (label_to_block_map) <= (unsigned) uid)
2696 VARRAY_GROW (label_to_block_map, 3 * uid / 2);
2698 else
2699 /* We're moving an existing label. Make sure that we've
2700 removed it from the old block. */
2701 gcc_assert (!bb || !VARRAY_BB (label_to_block_map, uid));
2702 VARRAY_BB (label_to_block_map, uid) = bb;
2707 /* Finds iterator for STMT. */
2709 extern block_stmt_iterator
2710 stmt_for_bsi (tree stmt)
2712 block_stmt_iterator bsi;
2714 for (bsi = bsi_start (bb_for_stmt (stmt)); !bsi_end_p (bsi); bsi_next (&bsi))
2715 if (bsi_stmt (bsi) == stmt)
2716 return bsi;
2718 gcc_unreachable ();
2721 /* Insert statement (or statement list) T before the statement
2722 pointed-to by iterator I. M specifies how to update iterator I
2723 after insertion (see enum bsi_iterator_update). */
2725 void
2726 bsi_insert_before (block_stmt_iterator *i, tree t, enum bsi_iterator_update m)
2728 set_bb_for_stmt (t, i->bb);
2729 tsi_link_before (&i->tsi, t, m);
2730 modify_stmt (t);
2734 /* Insert statement (or statement list) T after the statement
2735 pointed-to by iterator I. M specifies how to update iterator I
2736 after insertion (see enum bsi_iterator_update). */
2738 void
2739 bsi_insert_after (block_stmt_iterator *i, tree t, enum bsi_iterator_update m)
2741 set_bb_for_stmt (t, i->bb);
2742 tsi_link_after (&i->tsi, t, m);
2743 modify_stmt (t);
2747 /* Remove the statement pointed to by iterator I. The iterator is updated
2748 to the next statement. */
2750 void
2751 bsi_remove (block_stmt_iterator *i)
2753 tree t = bsi_stmt (*i);
2754 set_bb_for_stmt (t, NULL);
2755 tsi_delink (&i->tsi);
2759 /* Move the statement at FROM so it comes right after the statement at TO. */
2761 void
2762 bsi_move_after (block_stmt_iterator *from, block_stmt_iterator *to)
2764 tree stmt = bsi_stmt (*from);
2765 bsi_remove (from);
2766 bsi_insert_after (to, stmt, BSI_SAME_STMT);
2770 /* Move the statement at FROM so it comes right before the statement at TO. */
2772 void
2773 bsi_move_before (block_stmt_iterator *from, block_stmt_iterator *to)
2775 tree stmt = bsi_stmt (*from);
2776 bsi_remove (from);
2777 bsi_insert_before (to, stmt, BSI_SAME_STMT);
2781 /* Move the statement at FROM to the end of basic block BB. */
2783 void
2784 bsi_move_to_bb_end (block_stmt_iterator *from, basic_block bb)
2786 block_stmt_iterator last = bsi_last (bb);
2788 /* Have to check bsi_end_p because it could be an empty block. */
2789 if (!bsi_end_p (last) && is_ctrl_stmt (bsi_stmt (last)))
2790 bsi_move_before (from, &last);
2791 else
2792 bsi_move_after (from, &last);
2796 /* Replace the contents of the statement pointed to by iterator BSI
2797 with STMT. If PRESERVE_EH_INFO is true, the exception handling
2798 information of the original statement is preserved. */
2800 void
2801 bsi_replace (const block_stmt_iterator *bsi, tree stmt, bool preserve_eh_info)
2803 int eh_region;
2804 tree orig_stmt = bsi_stmt (*bsi);
2806 SET_EXPR_LOCUS (stmt, EXPR_LOCUS (orig_stmt));
2807 set_bb_for_stmt (stmt, bsi->bb);
2809 /* Preserve EH region information from the original statement, if
2810 requested by the caller. */
2811 if (preserve_eh_info)
2813 eh_region = lookup_stmt_eh_region (orig_stmt);
2814 if (eh_region >= 0)
2815 add_stmt_to_eh_region (stmt, eh_region);
2818 *bsi_stmt_ptr (*bsi) = stmt;
2819 modify_stmt (stmt);
2823 /* Insert the statement pointed-to by BSI into edge E. Every attempt
2824 is made to place the statement in an existing basic block, but
2825 sometimes that isn't possible. When it isn't possible, the edge is
2826 split and the statement is added to the new block.
2828 In all cases, the returned *BSI points to the correct location. The
2829 return value is true if insertion should be done after the location,
2830 or false if it should be done before the location. If new basic block
2831 has to be created, it is stored in *NEW_BB. */
2833 static bool
2834 tree_find_edge_insert_loc (edge e, block_stmt_iterator *bsi,
2835 basic_block *new_bb)
2837 basic_block dest, src;
2838 tree tmp;
2840 dest = e->dest;
2841 restart:
2843 /* If the destination has one predecessor which has no PHI nodes,
2844 insert there. Except for the exit block.
2846 The requirement for no PHI nodes could be relaxed. Basically we
2847 would have to examine the PHIs to prove that none of them used
2848 the value set by the statement we want to insert on E. That
2849 hardly seems worth the effort. */
2850 if (EDGE_COUNT (dest->preds) == 1
2851 && ! phi_nodes (dest)
2852 && dest != EXIT_BLOCK_PTR)
2854 *bsi = bsi_start (dest);
2855 if (bsi_end_p (*bsi))
2856 return true;
2858 /* Make sure we insert after any leading labels. */
2859 tmp = bsi_stmt (*bsi);
2860 while (TREE_CODE (tmp) == LABEL_EXPR)
2862 bsi_next (bsi);
2863 if (bsi_end_p (*bsi))
2864 break;
2865 tmp = bsi_stmt (*bsi);
2868 if (bsi_end_p (*bsi))
2870 *bsi = bsi_last (dest);
2871 return true;
2873 else
2874 return false;
2877 /* If the source has one successor, the edge is not abnormal and
2878 the last statement does not end a basic block, insert there.
2879 Except for the entry block. */
2880 src = e->src;
2881 if ((e->flags & EDGE_ABNORMAL) == 0
2882 && EDGE_COUNT (src->succs) == 1
2883 && src != ENTRY_BLOCK_PTR)
2885 *bsi = bsi_last (src);
2886 if (bsi_end_p (*bsi))
2887 return true;
2889 tmp = bsi_stmt (*bsi);
2890 if (!stmt_ends_bb_p (tmp))
2891 return true;
2893 /* Insert code just before returning the value. We may need to decompose
2894 the return in the case it contains non-trivial operand. */
2895 if (TREE_CODE (tmp) == RETURN_EXPR)
2897 tree op = TREE_OPERAND (tmp, 0);
2898 if (!is_gimple_val (op))
2900 gcc_assert (TREE_CODE (op) == MODIFY_EXPR);
2901 bsi_insert_before (bsi, op, BSI_NEW_STMT);
2902 TREE_OPERAND (tmp, 0) = TREE_OPERAND (op, 0);
2904 bsi_prev (bsi);
2905 return true;
2909 /* Otherwise, create a new basic block, and split this edge. */
2910 dest = split_edge (e);
2911 if (new_bb)
2912 *new_bb = dest;
2913 e = EDGE_PRED (dest, 0);
2914 goto restart;
2918 /* This routine will commit all pending edge insertions, creating any new
2919 basic blocks which are necessary.
2921 If specified, NEW_BLOCKS returns a count of the number of new basic
2922 blocks which were created. */
2924 void
2925 bsi_commit_edge_inserts (int *new_blocks)
2927 basic_block bb;
2928 edge e;
2929 int blocks;
2930 edge_iterator ei;
2932 blocks = n_basic_blocks;
2934 bsi_commit_edge_inserts_1 (EDGE_SUCC (ENTRY_BLOCK_PTR, 0));
2936 FOR_EACH_BB (bb)
2937 FOR_EACH_EDGE (e, ei, bb->succs)
2938 bsi_commit_edge_inserts_1 (e);
2940 if (new_blocks)
2941 *new_blocks = n_basic_blocks - blocks;
2945 /* Commit insertions pending at edge E. */
2947 static void
2948 bsi_commit_edge_inserts_1 (edge e)
2950 if (PENDING_STMT (e))
2952 block_stmt_iterator bsi;
2953 tree stmt = PENDING_STMT (e);
2955 PENDING_STMT (e) = NULL_TREE;
2957 if (tree_find_edge_insert_loc (e, &bsi, NULL))
2958 bsi_insert_after (&bsi, stmt, BSI_NEW_STMT);
2959 else
2960 bsi_insert_before (&bsi, stmt, BSI_NEW_STMT);
2965 /* Add STMT to the pending list of edge E. No actual insertion is
2966 made until a call to bsi_commit_edge_inserts () is made. */
2968 void
2969 bsi_insert_on_edge (edge e, tree stmt)
2971 append_to_statement_list (stmt, &PENDING_STMT (e));
2974 /* Similar to bsi_insert_on_edge+bsi_commit_edge_inserts. If new block has to
2975 be created, it is returned. */
2977 basic_block
2978 bsi_insert_on_edge_immediate (edge e, tree stmt)
2980 block_stmt_iterator bsi;
2981 basic_block new_bb = NULL;
2983 gcc_assert (!PENDING_STMT (e));
2985 if (tree_find_edge_insert_loc (e, &bsi, &new_bb))
2986 bsi_insert_after (&bsi, stmt, BSI_NEW_STMT);
2987 else
2988 bsi_insert_before (&bsi, stmt, BSI_NEW_STMT);
2990 return new_bb;
2993 /*---------------------------------------------------------------------------
2994 Tree specific functions for CFG manipulation
2995 ---------------------------------------------------------------------------*/
2997 /* Split a (typically critical) edge EDGE_IN. Return the new block.
2998 Abort on abnormal edges. */
3000 static basic_block
3001 tree_split_edge (edge edge_in)
3003 basic_block new_bb, after_bb, dest, src;
3004 edge new_edge, e;
3005 tree phi;
3006 int i, num_elem;
3007 edge_iterator ei;
3009 /* Abnormal edges cannot be split. */
3010 gcc_assert (!(edge_in->flags & EDGE_ABNORMAL));
3012 src = edge_in->src;
3013 dest = edge_in->dest;
3015 /* Place the new block in the block list. Try to keep the new block
3016 near its "logical" location. This is of most help to humans looking
3017 at debugging dumps. */
3018 FOR_EACH_EDGE (e, ei, dest->preds)
3019 if (e->src->next_bb == dest)
3020 break;
3021 if (!e)
3022 after_bb = dest->prev_bb;
3023 else
3024 after_bb = edge_in->src;
3026 new_bb = create_empty_bb (after_bb);
3027 new_bb->frequency = EDGE_FREQUENCY (edge_in);
3028 new_bb->count = edge_in->count;
3029 new_edge = make_edge (new_bb, dest, EDGE_FALLTHRU);
3030 new_edge->probability = REG_BR_PROB_BASE;
3031 new_edge->count = edge_in->count;
3033 /* Find all the PHI arguments on the original edge, and change them to
3034 the new edge. Do it before redirection, so that the argument does not
3035 get removed. */
3036 for (phi = phi_nodes (dest); phi; phi = PHI_CHAIN (phi))
3038 num_elem = PHI_NUM_ARGS (phi);
3039 for (i = 0; i < num_elem; i++)
3040 if (PHI_ARG_EDGE (phi, i) == edge_in)
3042 PHI_ARG_EDGE (phi, i) = new_edge;
3043 break;
3047 e = redirect_edge_and_branch (edge_in, new_bb);
3048 gcc_assert (e);
3049 gcc_assert (!PENDING_STMT (edge_in));
3051 return new_bb;
3055 /* Return true when BB has label LABEL in it. */
3057 static bool
3058 has_label_p (basic_block bb, tree label)
3060 block_stmt_iterator bsi;
3062 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
3064 tree stmt = bsi_stmt (bsi);
3066 if (TREE_CODE (stmt) != LABEL_EXPR)
3067 return false;
3068 if (LABEL_EXPR_LABEL (stmt) == label)
3069 return true;
3071 return false;
3075 /* Callback for walk_tree, check that all elements with address taken are
3076 properly noticed as such. */
3078 static tree
3079 verify_expr (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
3081 tree t = *tp, x;
3083 if (TYPE_P (t))
3084 *walk_subtrees = 0;
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)
3094 switch (TREE_CODE (t))
3096 case SSA_NAME:
3097 if (SSA_NAME_IN_FREE_LIST (t))
3099 error ("SSA name in freelist but still referenced");
3100 return *tp;
3102 break;
3104 case MODIFY_EXPR:
3105 x = TREE_OPERAND (t, 0);
3106 if (TREE_CODE (x) == BIT_FIELD_REF
3107 && is_gimple_reg (TREE_OPERAND (x, 0)))
3109 error ("GIMPLE register modified with BIT_FIELD_REF");
3110 return t;
3112 break;
3114 case ADDR_EXPR:
3115 /* Skip any references (they will be checked when we recurse down the
3116 tree) and ensure that any variable used as a prefix is marked
3117 addressable. */
3118 for (x = TREE_OPERAND (t, 0);
3119 (handled_component_p (x)
3120 || TREE_CODE (x) == REALPART_EXPR
3121 || TREE_CODE (x) == IMAGPART_EXPR);
3122 x = TREE_OPERAND (x, 0))
3125 if (TREE_CODE (x) != VAR_DECL && TREE_CODE (x) != PARM_DECL)
3126 return NULL;
3127 if (!TREE_ADDRESSABLE (x))
3129 error ("address taken, but ADDRESSABLE bit not set");
3130 return x;
3132 break;
3134 case COND_EXPR:
3135 x = TREE_OPERAND (t, 0);
3136 if (TREE_CODE (TREE_TYPE (x)) != BOOLEAN_TYPE)
3138 error ("non-boolean used in condition");
3139 return x;
3141 break;
3143 case NOP_EXPR:
3144 case CONVERT_EXPR:
3145 case FIX_TRUNC_EXPR:
3146 case FIX_CEIL_EXPR:
3147 case FIX_FLOOR_EXPR:
3148 case FIX_ROUND_EXPR:
3149 case FLOAT_EXPR:
3150 case NEGATE_EXPR:
3151 case ABS_EXPR:
3152 case BIT_NOT_EXPR:
3153 case NON_LVALUE_EXPR:
3154 case TRUTH_NOT_EXPR:
3155 CHECK_OP (0, "Invalid operand to unary operator");
3156 break;
3158 case REALPART_EXPR:
3159 case IMAGPART_EXPR:
3160 case COMPONENT_REF:
3161 case ARRAY_REF:
3162 case ARRAY_RANGE_REF:
3163 case BIT_FIELD_REF:
3164 case VIEW_CONVERT_EXPR:
3165 /* We have a nest of references. Verify that each of the operands
3166 that determine where to reference is either a constant or a variable,
3167 verify that the base is valid, and then show we've already checked
3168 the subtrees. */
3169 while (TREE_CODE (t) == REALPART_EXPR || TREE_CODE (t) == IMAGPART_EXPR
3170 || handled_component_p (t))
3172 if (TREE_CODE (t) == COMPONENT_REF && TREE_OPERAND (t, 2))
3173 CHECK_OP (2, "Invalid COMPONENT_REF offset operator");
3174 else if (TREE_CODE (t) == ARRAY_REF
3175 || TREE_CODE (t) == ARRAY_RANGE_REF)
3177 CHECK_OP (1, "Invalid array index.");
3178 if (TREE_OPERAND (t, 2))
3179 CHECK_OP (2, "Invalid array lower bound.");
3180 if (TREE_OPERAND (t, 3))
3181 CHECK_OP (3, "Invalid array stride.");
3183 else if (TREE_CODE (t) == BIT_FIELD_REF)
3185 CHECK_OP (1, "Invalid operand to BIT_FIELD_REF");
3186 CHECK_OP (2, "Invalid operand to BIT_FIELD_REF");
3189 t = TREE_OPERAND (t, 0);
3192 if (!CONSTANT_CLASS_P (t) && !is_gimple_lvalue (t))
3194 error ("Invalid reference prefix.");
3195 return t;
3197 *walk_subtrees = 0;
3198 break;
3200 case LT_EXPR:
3201 case LE_EXPR:
3202 case GT_EXPR:
3203 case GE_EXPR:
3204 case EQ_EXPR:
3205 case NE_EXPR:
3206 case UNORDERED_EXPR:
3207 case ORDERED_EXPR:
3208 case UNLT_EXPR:
3209 case UNLE_EXPR:
3210 case UNGT_EXPR:
3211 case UNGE_EXPR:
3212 case UNEQ_EXPR:
3213 case LTGT_EXPR:
3214 case PLUS_EXPR:
3215 case MINUS_EXPR:
3216 case MULT_EXPR:
3217 case TRUNC_DIV_EXPR:
3218 case CEIL_DIV_EXPR:
3219 case FLOOR_DIV_EXPR:
3220 case ROUND_DIV_EXPR:
3221 case TRUNC_MOD_EXPR:
3222 case CEIL_MOD_EXPR:
3223 case FLOOR_MOD_EXPR:
3224 case ROUND_MOD_EXPR:
3225 case RDIV_EXPR:
3226 case EXACT_DIV_EXPR:
3227 case MIN_EXPR:
3228 case MAX_EXPR:
3229 case LSHIFT_EXPR:
3230 case RSHIFT_EXPR:
3231 case LROTATE_EXPR:
3232 case RROTATE_EXPR:
3233 case BIT_IOR_EXPR:
3234 case BIT_XOR_EXPR:
3235 case BIT_AND_EXPR:
3236 CHECK_OP (0, "Invalid operand to binary operator");
3237 CHECK_OP (1, "Invalid operand to binary operator");
3238 break;
3240 default:
3241 break;
3243 return NULL;
3245 #undef CHECK_OP
3249 /* Verify STMT, return true if STMT is not in GIMPLE form.
3250 TODO: Implement type checking. */
3252 static bool
3253 verify_stmt (tree stmt, bool last_in_block)
3255 tree addr;
3257 if (!is_gimple_stmt (stmt))
3259 error ("Is not a valid GIMPLE statement.");
3260 goto fail;
3263 addr = walk_tree (&stmt, verify_expr, NULL, NULL);
3264 if (addr)
3266 debug_generic_stmt (addr);
3267 return true;
3270 /* If the statement is marked as part of an EH region, then it is
3271 expected that the statement could throw. Verify that when we
3272 have optimizations that simplify statements such that we prove
3273 that they cannot throw, that we update other data structures
3274 to match. */
3275 if (lookup_stmt_eh_region (stmt) >= 0)
3277 if (!tree_could_throw_p (stmt))
3279 error ("Statement marked for throw, but doesn%'t.");
3280 goto fail;
3282 if (!last_in_block && tree_can_throw_internal (stmt))
3284 error ("Statement marked for throw in middle of block.");
3285 goto fail;
3289 return false;
3291 fail:
3292 debug_generic_stmt (stmt);
3293 return true;
3297 /* Return true when the T can be shared. */
3299 static bool
3300 tree_node_can_be_shared (tree t)
3302 if (IS_TYPE_OR_DECL_P (t)
3303 /* We check for constants explicitly since they are not considered
3304 gimple invariants if they overflowed. */
3305 || CONSTANT_CLASS_P (t)
3306 || is_gimple_min_invariant (t)
3307 || TREE_CODE (t) == SSA_NAME)
3308 return true;
3310 while (((TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
3311 /* We check for constants explicitly since they are not considered
3312 gimple invariants if they overflowed. */
3313 && (CONSTANT_CLASS_P (TREE_OPERAND (t, 1))
3314 || is_gimple_min_invariant (TREE_OPERAND (t, 1))))
3315 || (TREE_CODE (t) == COMPONENT_REF
3316 || TREE_CODE (t) == REALPART_EXPR
3317 || TREE_CODE (t) == IMAGPART_EXPR))
3318 t = TREE_OPERAND (t, 0);
3320 if (DECL_P (t))
3321 return true;
3323 return false;
3327 /* Called via walk_trees. Verify tree sharing. */
3329 static tree
3330 verify_node_sharing (tree * tp, int *walk_subtrees, void *data)
3332 htab_t htab = (htab_t) data;
3333 void **slot;
3335 if (tree_node_can_be_shared (*tp))
3337 *walk_subtrees = false;
3338 return NULL;
3341 slot = htab_find_slot (htab, *tp, INSERT);
3342 if (*slot)
3343 return *slot;
3344 *slot = *tp;
3346 return NULL;
3350 /* Verify the GIMPLE statement chain. */
3352 void
3353 verify_stmts (void)
3355 basic_block bb;
3356 block_stmt_iterator bsi;
3357 bool err = false;
3358 htab_t htab;
3359 tree addr;
3361 timevar_push (TV_TREE_STMT_VERIFY);
3362 htab = htab_create (37, htab_hash_pointer, htab_eq_pointer, NULL);
3364 FOR_EACH_BB (bb)
3366 tree phi;
3367 int i;
3369 for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
3371 int phi_num_args = PHI_NUM_ARGS (phi);
3373 for (i = 0; i < phi_num_args; i++)
3375 tree t = PHI_ARG_DEF (phi, i);
3376 tree addr;
3378 /* Addressable variables do have SSA_NAMEs but they
3379 are not considered gimple values. */
3380 if (TREE_CODE (t) != SSA_NAME
3381 && TREE_CODE (t) != FUNCTION_DECL
3382 && !is_gimple_val (t))
3384 error ("PHI def is not a GIMPLE value");
3385 debug_generic_stmt (phi);
3386 debug_generic_stmt (t);
3387 err |= true;
3390 addr = walk_tree (&t, verify_expr, NULL, NULL);
3391 if (addr)
3393 debug_generic_stmt (addr);
3394 err |= true;
3397 addr = walk_tree (&t, verify_node_sharing, htab, NULL);
3398 if (addr)
3400 error ("Incorrect sharing of tree nodes");
3401 debug_generic_stmt (phi);
3402 debug_generic_stmt (addr);
3403 err |= true;
3408 for (bsi = bsi_start (bb); !bsi_end_p (bsi); )
3410 tree stmt = bsi_stmt (bsi);
3411 bsi_next (&bsi);
3412 err |= verify_stmt (stmt, bsi_end_p (bsi));
3413 addr = walk_tree (&stmt, verify_node_sharing, htab, NULL);
3414 if (addr)
3416 error ("Incorrect sharing of tree nodes");
3417 debug_generic_stmt (stmt);
3418 debug_generic_stmt (addr);
3419 err |= true;
3424 if (err)
3425 internal_error ("verify_stmts failed.");
3427 htab_delete (htab);
3428 timevar_pop (TV_TREE_STMT_VERIFY);
3432 /* Verifies that the flow information is OK. */
3434 static int
3435 tree_verify_flow_info (void)
3437 int err = 0;
3438 basic_block bb;
3439 block_stmt_iterator bsi;
3440 tree stmt;
3441 edge e;
3442 edge_iterator ei;
3444 if (ENTRY_BLOCK_PTR->stmt_list)
3446 error ("ENTRY_BLOCK has a statement list associated with it\n");
3447 err = 1;
3450 if (EXIT_BLOCK_PTR->stmt_list)
3452 error ("EXIT_BLOCK has a statement list associated with it\n");
3453 err = 1;
3456 FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
3457 if (e->flags & EDGE_FALLTHRU)
3459 error ("Fallthru to exit from bb %d\n", e->src->index);
3460 err = 1;
3463 FOR_EACH_BB (bb)
3465 bool found_ctrl_stmt = false;
3467 /* Skip labels on the start of basic block. */
3468 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
3470 if (TREE_CODE (bsi_stmt (bsi)) != LABEL_EXPR)
3471 break;
3473 if (label_to_block (LABEL_EXPR_LABEL (bsi_stmt (bsi))) != bb)
3475 error ("Label %s to block does not match in bb %d\n",
3476 IDENTIFIER_POINTER (DECL_NAME (bsi_stmt (bsi))),
3477 bb->index);
3478 err = 1;
3481 if (decl_function_context (LABEL_EXPR_LABEL (bsi_stmt (bsi)))
3482 != current_function_decl)
3484 error ("Label %s has incorrect context in bb %d\n",
3485 IDENTIFIER_POINTER (DECL_NAME (bsi_stmt (bsi))),
3486 bb->index);
3487 err = 1;
3491 /* Verify that body of basic block BB is free of control flow. */
3492 for (; !bsi_end_p (bsi); bsi_next (&bsi))
3494 tree stmt = bsi_stmt (bsi);
3496 if (found_ctrl_stmt)
3498 error ("Control flow in the middle of basic block %d\n",
3499 bb->index);
3500 err = 1;
3503 if (stmt_ends_bb_p (stmt))
3504 found_ctrl_stmt = true;
3506 if (TREE_CODE (stmt) == LABEL_EXPR)
3508 error ("Label %s in the middle of basic block %d\n",
3509 IDENTIFIER_POINTER (DECL_NAME (stmt)),
3510 bb->index);
3511 err = 1;
3514 bsi = bsi_last (bb);
3515 if (bsi_end_p (bsi))
3516 continue;
3518 stmt = bsi_stmt (bsi);
3520 if (is_ctrl_stmt (stmt))
3522 FOR_EACH_EDGE (e, ei, bb->succs)
3523 if (e->flags & EDGE_FALLTHRU)
3525 error ("Fallthru edge after a control statement in bb %d \n",
3526 bb->index);
3527 err = 1;
3531 switch (TREE_CODE (stmt))
3533 case COND_EXPR:
3535 edge true_edge;
3536 edge false_edge;
3537 if (TREE_CODE (COND_EXPR_THEN (stmt)) != GOTO_EXPR
3538 || TREE_CODE (COND_EXPR_ELSE (stmt)) != GOTO_EXPR)
3540 error ("Structured COND_EXPR at the end of bb %d\n", bb->index);
3541 err = 1;
3544 extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
3546 if (!true_edge || !false_edge
3547 || !(true_edge->flags & EDGE_TRUE_VALUE)
3548 || !(false_edge->flags & EDGE_FALSE_VALUE)
3549 || (true_edge->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL))
3550 || (false_edge->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL))
3551 || EDGE_COUNT (bb->succs) >= 3)
3553 error ("Wrong outgoing edge flags at end of bb %d\n",
3554 bb->index);
3555 err = 1;
3558 if (!has_label_p (true_edge->dest,
3559 GOTO_DESTINATION (COND_EXPR_THEN (stmt))))
3561 error ("%<then%> label does not match edge at end of bb %d\n",
3562 bb->index);
3563 err = 1;
3566 if (!has_label_p (false_edge->dest,
3567 GOTO_DESTINATION (COND_EXPR_ELSE (stmt))))
3569 error ("%<else%> label does not match edge at end of bb %d\n",
3570 bb->index);
3571 err = 1;
3574 break;
3576 case GOTO_EXPR:
3577 if (simple_goto_p (stmt))
3579 error ("Explicit goto at end of bb %d\n", bb->index);
3580 err = 1;
3582 else
3584 /* FIXME. We should double check that the labels in the
3585 destination blocks have their address taken. */
3586 FOR_EACH_EDGE (e, ei, bb->succs)
3587 if ((e->flags & (EDGE_FALLTHRU | EDGE_TRUE_VALUE
3588 | EDGE_FALSE_VALUE))
3589 || !(e->flags & EDGE_ABNORMAL))
3591 error ("Wrong outgoing edge flags at end of bb %d\n",
3592 bb->index);
3593 err = 1;
3596 break;
3598 case RETURN_EXPR:
3599 if (EDGE_COUNT (bb->succs) != 1
3600 || (EDGE_SUCC (bb, 0)->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL
3601 | EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
3603 error ("Wrong outgoing edge flags at end of bb %d\n", bb->index);
3604 err = 1;
3606 if (EDGE_SUCC (bb, 0)->dest != EXIT_BLOCK_PTR)
3608 error ("Return edge does not point to exit in bb %d\n",
3609 bb->index);
3610 err = 1;
3612 break;
3614 case SWITCH_EXPR:
3616 tree prev;
3617 edge e;
3618 size_t i, n;
3619 tree vec;
3621 vec = SWITCH_LABELS (stmt);
3622 n = TREE_VEC_LENGTH (vec);
3624 /* Mark all the destination basic blocks. */
3625 for (i = 0; i < n; ++i)
3627 tree lab = CASE_LABEL (TREE_VEC_ELT (vec, i));
3628 basic_block label_bb = label_to_block (lab);
3630 gcc_assert (!label_bb->aux || label_bb->aux == (void *)1);
3631 label_bb->aux = (void *)1;
3634 /* Verify that the case labels are sorted. */
3635 prev = TREE_VEC_ELT (vec, 0);
3636 for (i = 1; i < n - 1; ++i)
3638 tree c = TREE_VEC_ELT (vec, i);
3639 if (! CASE_LOW (c))
3641 error ("Found default case not at end of case vector");
3642 err = 1;
3643 continue;
3645 if (! tree_int_cst_lt (CASE_LOW (prev), CASE_LOW (c)))
3647 error ("Case labels not sorted:\n ");
3648 print_generic_expr (stderr, prev, 0);
3649 fprintf (stderr," is greater than ");
3650 print_generic_expr (stderr, c, 0);
3651 fprintf (stderr," but comes before it.\n");
3652 err = 1;
3654 prev = c;
3656 if (CASE_LOW (TREE_VEC_ELT (vec, n - 1)))
3658 error ("No default case found at end of case vector");
3659 err = 1;
3662 FOR_EACH_EDGE (e, ei, bb->succs)
3664 if (!e->dest->aux)
3666 error ("Extra outgoing edge %d->%d\n",
3667 bb->index, e->dest->index);
3668 err = 1;
3670 e->dest->aux = (void *)2;
3671 if ((e->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL
3672 | EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
3674 error ("Wrong outgoing edge flags at end of bb %d\n",
3675 bb->index);
3676 err = 1;
3680 /* Check that we have all of them. */
3681 for (i = 0; i < n; ++i)
3683 tree lab = CASE_LABEL (TREE_VEC_ELT (vec, i));
3684 basic_block label_bb = label_to_block (lab);
3686 if (label_bb->aux != (void *)2)
3688 error ("Missing edge %i->%i\n",
3689 bb->index, label_bb->index);
3690 err = 1;
3694 FOR_EACH_EDGE (e, ei, bb->succs)
3695 e->dest->aux = (void *)0;
3698 default: ;
3702 if (dom_computed[CDI_DOMINATORS] >= DOM_NO_FAST_QUERY)
3703 verify_dominators (CDI_DOMINATORS);
3705 return err;
3709 /* Updates phi nodes after creating forwarder block joined
3710 by edge FALLTHRU. */
3712 static void
3713 tree_make_forwarder_block (edge fallthru)
3715 edge e;
3716 edge_iterator ei;
3717 basic_block dummy, bb;
3718 tree phi, new_phi, var, prev, next;
3720 dummy = fallthru->src;
3721 bb = fallthru->dest;
3723 if (EDGE_COUNT (bb->preds) == 1)
3724 return;
3726 /* If we redirected a branch we must create new phi nodes at the
3727 start of BB. */
3728 for (phi = phi_nodes (dummy); phi; phi = PHI_CHAIN (phi))
3730 var = PHI_RESULT (phi);
3731 new_phi = create_phi_node (var, bb);
3732 SSA_NAME_DEF_STMT (var) = new_phi;
3733 SET_PHI_RESULT (phi, make_ssa_name (SSA_NAME_VAR (var), phi));
3734 add_phi_arg (&new_phi, PHI_RESULT (phi), fallthru);
3737 /* Ensure that the PHI node chain is in the same order. */
3738 prev = NULL;
3739 for (phi = phi_nodes (bb); phi; phi = next)
3741 next = PHI_CHAIN (phi);
3742 PHI_CHAIN (phi) = prev;
3743 prev = phi;
3745 set_phi_nodes (bb, prev);
3747 /* Add the arguments we have stored on edges. */
3748 FOR_EACH_EDGE (e, ei, bb->preds)
3750 if (e == fallthru)
3751 continue;
3753 for (phi = phi_nodes (bb), var = PENDING_STMT (e);
3754 phi;
3755 phi = PHI_CHAIN (phi), var = TREE_CHAIN (var))
3756 add_phi_arg (&phi, TREE_VALUE (var), e);
3758 PENDING_STMT (e) = NULL;
3763 /* Return true if basic block BB does nothing except pass control
3764 flow to another block and that we can safely insert a label at
3765 the start of the successor block. */
3767 static bool
3768 tree_forwarder_block_p (basic_block bb)
3770 block_stmt_iterator bsi;
3771 edge e;
3772 edge_iterator ei;
3774 /* If we have already determined that this block is not forwardable,
3775 then no further checks are necessary. */
3776 if (! bb_ann (bb)->forwardable)
3777 return false;
3779 /* BB must have a single outgoing normal edge. Otherwise it can not be
3780 a forwarder block. */
3781 if (EDGE_COUNT (bb->succs) != 1
3782 || EDGE_SUCC (bb, 0)->dest == EXIT_BLOCK_PTR
3783 || (EDGE_SUCC (bb, 0)->flags & EDGE_ABNORMAL)
3784 || bb == ENTRY_BLOCK_PTR)
3786 bb_ann (bb)->forwardable = 0;
3787 return false;
3790 /* Successors of the entry block are not forwarders. */
3791 FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
3792 if (e->dest == bb)
3794 bb_ann (bb)->forwardable = 0;
3795 return false;
3798 /* BB can not have any PHI nodes. This could potentially be relaxed
3799 early in compilation if we re-rewrote the variables appearing in
3800 any PHI nodes in forwarder blocks. */
3801 if (phi_nodes (bb))
3803 bb_ann (bb)->forwardable = 0;
3804 return false;
3807 /* Now walk through the statements. We can ignore labels, anything else
3808 means this is not a forwarder block. */
3809 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
3811 tree stmt = bsi_stmt (bsi);
3813 switch (TREE_CODE (stmt))
3815 case LABEL_EXPR:
3816 if (DECL_NONLOCAL (LABEL_EXPR_LABEL (stmt)))
3817 return false;
3818 break;
3820 default:
3821 bb_ann (bb)->forwardable = 0;
3822 return false;
3826 return true;
3830 /* Thread jumps over empty statements.
3832 This code should _not_ thread over obviously equivalent conditions
3833 as that requires nontrivial updates to the SSA graph. */
3835 static bool
3836 thread_jumps (void)
3838 edge e, last, old;
3839 basic_block bb, dest, tmp, old_dest, curr, dom;
3840 tree phi;
3841 int arg;
3842 bool retval = false;
3844 FOR_EACH_BB (bb)
3845 bb_ann (bb)->forwardable = 1;
3847 FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR, next_bb)
3849 edge_iterator ei;
3851 /* Don't waste time on unreachable blocks. */
3852 if (EDGE_COUNT (bb->preds) == 0)
3853 continue;
3855 /* Nor on forwarders. */
3856 if (tree_forwarder_block_p (bb))
3857 continue;
3859 /* This block is now part of a forwarding path, mark it as not
3860 forwardable so that we can detect loops. This bit will be
3861 reset below. */
3862 bb_ann (bb)->forwardable = 0;
3864 /* Examine each of our block's successors to see if it is
3865 forwardable. */
3866 for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
3868 int freq;
3869 gcov_type count;
3871 /* If the edge is abnormal or its destination is not
3872 forwardable, then there's nothing to do. */
3873 if ((e->flags & EDGE_ABNORMAL)
3874 || !tree_forwarder_block_p (e->dest))
3876 ei_next (&ei);
3877 continue;
3880 count = e->count;
3881 freq = EDGE_FREQUENCY (e);
3883 /* Now walk through as many forwarder blocks as possible to
3884 find the ultimate destination we want to thread our jump
3885 to. */
3886 last = EDGE_SUCC (e->dest, 0);
3887 bb_ann (e->dest)->forwardable = 0;
3888 for (dest = EDGE_SUCC (e->dest, 0)->dest;
3889 tree_forwarder_block_p (dest);
3890 last = EDGE_SUCC (dest, 0),
3891 dest = EDGE_SUCC (dest, 0)->dest)
3893 /* An infinite loop detected. We redirect the edge anyway, so
3894 that the loop is shrunk into single basic block. */
3895 if (!bb_ann (dest)->forwardable)
3896 break;
3898 if (EDGE_SUCC (dest, 0)->dest == EXIT_BLOCK_PTR)
3899 break;
3901 bb_ann (dest)->forwardable = 0;
3904 /* Reset the forwardable marks to 1. */
3905 for (tmp = e->dest;
3906 tmp != dest;
3907 tmp = EDGE_SUCC (tmp, 0)->dest)
3908 bb_ann (tmp)->forwardable = 1;
3910 if (dest == e->dest)
3912 ei_next (&ei);
3913 continue;
3916 old = find_edge (bb, dest);
3917 if (old)
3919 /* If there already is an edge, check whether the values
3920 in phi nodes differ. */
3921 if (!phi_alternatives_equal (dest, last, old))
3923 /* The previous block is forwarder. Redirect our jump
3924 to that target instead since we know it has no PHI
3925 nodes that will need updating. */
3926 dest = last->src;
3928 /* That might mean that no forwarding at all is possible. */
3929 if (dest == e->dest)
3931 ei_next (&ei);
3932 continue;
3935 old = find_edge (bb, dest);
3939 /* Perform the redirection. */
3940 retval = true;
3941 old_dest = e->dest;
3942 e = redirect_edge_and_branch (e, dest);
3944 /* Update the profile. */
3945 if (profile_status != PROFILE_ABSENT)
3946 for (curr = old_dest; curr != dest; curr = EDGE_SUCC (curr, 0)->dest)
3948 curr->frequency -= freq;
3949 if (curr->frequency < 0)
3950 curr->frequency = 0;
3951 curr->count -= count;
3952 if (curr->count < 0)
3953 curr->count = 0;
3954 EDGE_SUCC (curr, 0)->count -= count;
3955 if (EDGE_SUCC (curr, 0)->count < 0)
3956 EDGE_SUCC (curr, 0)->count = 0;
3959 if (!old)
3961 /* Update PHI nodes. We know that the new argument should
3962 have the same value as the argument associated with LAST.
3963 Otherwise we would have changed our target block above. */
3964 for (phi = phi_nodes (dest); phi; phi = PHI_CHAIN (phi))
3966 arg = phi_arg_from_edge (phi, last);
3967 gcc_assert (arg >= 0);
3968 add_phi_arg (&phi, PHI_ARG_DEF (phi, arg), e);
3972 /* Update the dominators. */
3973 if (dom_computed[CDI_DOMINATORS] >= DOM_CONS_OK)
3975 /* Remove the unreachable blocks (observe that if all blocks
3976 were reachable before, only those in the path we threaded
3977 over and did not have any predecessor outside of the path
3978 become unreachable). */
3979 for (; old_dest != dest; old_dest = tmp)
3981 tmp = EDGE_SUCC (old_dest, 0)->dest;
3983 if (EDGE_COUNT (old_dest->preds) > 0)
3984 break;
3986 delete_basic_block (old_dest);
3988 /* If the dominator of the destination was in the path, set its
3989 dominator to the start of the redirected edge. */
3990 if (get_immediate_dominator (CDI_DOMINATORS, old_dest) == NULL)
3991 set_immediate_dominator (CDI_DOMINATORS, old_dest, bb);
3993 /* Now proceed like if we forwarded just over one edge at a time.
3994 Algorithm for forwarding edge S --> A over edge A --> B then
3997 if (idom (B) == A
3998 && !dominated_by (S, B))
3999 idom (B) = idom (A);
4000 recount_idom (A); */
4002 for (; old_dest != dest; old_dest = tmp)
4004 tmp = EDGE_SUCC (old_dest, 0)->dest;
4006 if (get_immediate_dominator (CDI_DOMINATORS, tmp) == old_dest
4007 && !dominated_by_p (CDI_DOMINATORS, bb, tmp))
4009 dom = get_immediate_dominator (CDI_DOMINATORS, old_dest);
4010 set_immediate_dominator (CDI_DOMINATORS, tmp, dom);
4013 dom = recount_dominator (CDI_DOMINATORS, old_dest);
4014 set_immediate_dominator (CDI_DOMINATORS, old_dest, dom);
4019 /* Reset the forwardable bit on our block since it's no longer in
4020 a forwarding chain path. */
4021 bb_ann (bb)->forwardable = 1;
4024 return retval;
4028 /* Return a non-special label in the head of basic block BLOCK.
4029 Create one if it doesn't exist. */
4031 tree
4032 tree_block_label (basic_block bb)
4034 block_stmt_iterator i, s = bsi_start (bb);
4035 bool first = true;
4036 tree label, stmt;
4038 for (i = s; !bsi_end_p (i); first = false, bsi_next (&i))
4040 stmt = bsi_stmt (i);
4041 if (TREE_CODE (stmt) != LABEL_EXPR)
4042 break;
4043 label = LABEL_EXPR_LABEL (stmt);
4044 if (!DECL_NONLOCAL (label))
4046 if (!first)
4047 bsi_move_before (&i, &s);
4048 return label;
4052 label = create_artificial_label ();
4053 stmt = build1 (LABEL_EXPR, void_type_node, label);
4054 bsi_insert_before (&s, stmt, BSI_NEW_STMT);
4055 return label;
4059 /* Attempt to perform edge redirection by replacing a possibly complex
4060 jump instruction by a goto or by removing the jump completely.
4061 This can apply only if all edges now point to the same block. The
4062 parameters and return values are equivalent to
4063 redirect_edge_and_branch. */
4065 static edge
4066 tree_try_redirect_by_replacing_jump (edge e, basic_block target)
4068 basic_block src = e->src;
4069 edge tmp;
4070 block_stmt_iterator b;
4071 tree stmt;
4072 edge_iterator ei;
4074 /* Verify that all targets will be TARGET. */
4075 FOR_EACH_EDGE (tmp, ei, src->succs)
4076 if (tmp->dest != target && tmp != e)
4077 break;
4079 if (tmp)
4080 return NULL;
4082 b = bsi_last (src);
4083 if (bsi_end_p (b))
4084 return NULL;
4085 stmt = bsi_stmt (b);
4087 if (TREE_CODE (stmt) == COND_EXPR
4088 || TREE_CODE (stmt) == SWITCH_EXPR)
4090 bsi_remove (&b);
4091 e = ssa_redirect_edge (e, target);
4092 e->flags = EDGE_FALLTHRU;
4093 return e;
4096 return NULL;
4100 /* Redirect E to DEST. Return NULL on failure. Otherwise, return the
4101 edge representing the redirected branch. */
4103 static edge
4104 tree_redirect_edge_and_branch (edge e, basic_block dest)
4106 basic_block bb = e->src;
4107 block_stmt_iterator bsi;
4108 edge ret;
4109 tree label, stmt;
4111 if (e->flags & (EDGE_ABNORMAL_CALL | EDGE_EH))
4112 return NULL;
4114 if (e->src != ENTRY_BLOCK_PTR
4115 && (ret = tree_try_redirect_by_replacing_jump (e, dest)))
4116 return ret;
4118 if (e->dest == dest)
4119 return NULL;
4121 label = tree_block_label (dest);
4123 bsi = bsi_last (bb);
4124 stmt = bsi_end_p (bsi) ? NULL : bsi_stmt (bsi);
4126 switch (stmt ? TREE_CODE (stmt) : ERROR_MARK)
4128 case COND_EXPR:
4129 stmt = (e->flags & EDGE_TRUE_VALUE
4130 ? COND_EXPR_THEN (stmt)
4131 : COND_EXPR_ELSE (stmt));
4132 GOTO_DESTINATION (stmt) = label;
4133 break;
4135 case GOTO_EXPR:
4136 /* No non-abnormal edges should lead from a non-simple goto, and
4137 simple ones should be represented implicitly. */
4138 gcc_unreachable ();
4140 case SWITCH_EXPR:
4142 tree vec = SWITCH_LABELS (stmt);
4143 size_t i, n = TREE_VEC_LENGTH (vec);
4145 for (i = 0; i < n; ++i)
4147 tree elt = TREE_VEC_ELT (vec, i);
4148 if (label_to_block (CASE_LABEL (elt)) == e->dest)
4149 CASE_LABEL (elt) = label;
4152 break;
4154 case RETURN_EXPR:
4155 bsi_remove (&bsi);
4156 e->flags |= EDGE_FALLTHRU;
4157 break;
4159 default:
4160 /* Otherwise it must be a fallthru edge, and we don't need to
4161 do anything besides redirecting it. */
4162 gcc_assert (e->flags & EDGE_FALLTHRU);
4163 break;
4166 /* Update/insert PHI nodes as necessary. */
4168 /* Now update the edges in the CFG. */
4169 e = ssa_redirect_edge (e, dest);
4171 return e;
4175 /* Simple wrapper, as we can always redirect fallthru edges. */
4177 static basic_block
4178 tree_redirect_edge_and_branch_force (edge e, basic_block dest)
4180 e = tree_redirect_edge_and_branch (e, dest);
4181 gcc_assert (e);
4183 return NULL;
4187 /* Splits basic block BB after statement STMT (but at least after the
4188 labels). If STMT is NULL, BB is split just after the labels. */
4190 static basic_block
4191 tree_split_block (basic_block bb, void *stmt)
4193 block_stmt_iterator bsi, bsi_tgt;
4194 tree act;
4195 basic_block new_bb;
4196 edge e;
4197 edge_iterator ei;
4199 new_bb = create_empty_bb (bb);
4201 /* Redirect the outgoing edges. */
4202 new_bb->succs = bb->succs;
4203 bb->succs = NULL;
4204 FOR_EACH_EDGE (e, ei, new_bb->succs)
4205 e->src = new_bb;
4207 if (stmt && TREE_CODE ((tree) stmt) == LABEL_EXPR)
4208 stmt = NULL;
4210 /* Move everything from BSI to the new basic block. */
4211 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
4213 act = bsi_stmt (bsi);
4214 if (TREE_CODE (act) == LABEL_EXPR)
4215 continue;
4217 if (!stmt)
4218 break;
4220 if (stmt == act)
4222 bsi_next (&bsi);
4223 break;
4227 bsi_tgt = bsi_start (new_bb);
4228 while (!bsi_end_p (bsi))
4230 act = bsi_stmt (bsi);
4231 bsi_remove (&bsi);
4232 bsi_insert_after (&bsi_tgt, act, BSI_NEW_STMT);
4235 return new_bb;
4239 /* Moves basic block BB after block AFTER. */
4241 static bool
4242 tree_move_block_after (basic_block bb, basic_block after)
4244 if (bb->prev_bb == after)
4245 return true;
4247 unlink_block (bb);
4248 link_block (bb, after);
4250 return true;
4254 /* Return true if basic_block can be duplicated. */
4256 static bool
4257 tree_can_duplicate_bb_p (basic_block bb ATTRIBUTE_UNUSED)
4259 return true;
4262 /* Create a duplicate of the basic block BB. NOTE: This does not
4263 preserve SSA form. */
4265 static basic_block
4266 tree_duplicate_bb (basic_block bb)
4268 basic_block new_bb;
4269 block_stmt_iterator bsi, bsi_tgt;
4270 tree phi, val;
4271 ssa_op_iter op_iter;
4273 new_bb = create_empty_bb (EXIT_BLOCK_PTR->prev_bb);
4275 /* First copy the phi nodes. We do not copy phi node arguments here,
4276 since the edges are not ready yet. Keep the chain of phi nodes in
4277 the same order, so that we can add them later. */
4278 for (phi = phi_nodes (bb); phi; phi = TREE_CHAIN (phi))
4280 mark_for_rewrite (PHI_RESULT (phi));
4281 create_phi_node (PHI_RESULT (phi), new_bb);
4283 set_phi_nodes (new_bb, nreverse (phi_nodes (new_bb)));
4285 bsi_tgt = bsi_start (new_bb);
4286 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
4288 tree stmt = bsi_stmt (bsi);
4289 tree copy;
4291 if (TREE_CODE (stmt) == LABEL_EXPR)
4292 continue;
4294 /* Record the definitions. */
4295 get_stmt_operands (stmt);
4297 FOR_EACH_SSA_TREE_OPERAND (val, stmt, op_iter, SSA_OP_ALL_DEFS)
4298 mark_for_rewrite (val);
4300 copy = unshare_expr (stmt);
4302 /* Copy also the virtual operands. */
4303 get_stmt_ann (copy);
4304 copy_virtual_operands (copy, stmt);
4306 bsi_insert_after (&bsi_tgt, copy, BSI_NEW_STMT);
4309 return new_bb;
4312 /* Basic block BB_COPY was created by code duplication. Add phi node
4313 arguments for edges going out of BB_COPY. The blocks that were
4314 duplicated have rbi->duplicated set to one. */
4316 void
4317 add_phi_args_after_copy_bb (basic_block bb_copy)
4319 basic_block bb, dest;
4320 edge e, e_copy;
4321 edge_iterator ei;
4322 tree phi, phi_copy, phi_next, def;
4324 bb = bb_copy->rbi->original;
4326 FOR_EACH_EDGE (e_copy, ei, bb_copy->succs)
4328 if (!phi_nodes (e_copy->dest))
4329 continue;
4331 if (e_copy->dest->rbi->duplicated)
4332 dest = e_copy->dest->rbi->original;
4333 else
4334 dest = e_copy->dest;
4336 e = find_edge (bb, dest);
4337 if (!e)
4339 /* During loop unrolling the target of the latch edge is copied.
4340 In this case we are not looking for edge to dest, but to
4341 duplicated block whose original was dest. */
4342 FOR_EACH_EDGE (e, ei, bb->succs)
4343 if (e->dest->rbi->duplicated
4344 && e->dest->rbi->original == dest)
4345 break;
4347 gcc_assert (e != NULL);
4350 for (phi = phi_nodes (e->dest), phi_copy = phi_nodes (e_copy->dest);
4351 phi;
4352 phi = phi_next, phi_copy = TREE_CHAIN (phi_copy))
4354 phi_next = TREE_CHAIN (phi);
4356 gcc_assert (PHI_RESULT (phi) == PHI_RESULT (phi_copy));
4357 def = PHI_ARG_DEF_FROM_EDGE (phi, e);
4358 add_phi_arg (&phi_copy, def, e_copy);
4363 /* Blocks in REGION_COPY array of length N_REGION were created by
4364 duplication of basic blocks. Add phi node arguments for edges
4365 going from these blocks. */
4367 void
4368 add_phi_args_after_copy (basic_block *region_copy, unsigned n_region)
4370 unsigned i;
4372 for (i = 0; i < n_region; i++)
4373 region_copy[i]->rbi->duplicated = 1;
4375 for (i = 0; i < n_region; i++)
4376 add_phi_args_after_copy_bb (region_copy[i]);
4378 for (i = 0; i < n_region; i++)
4379 region_copy[i]->rbi->duplicated = 0;
4382 /* Maps the old ssa name FROM_NAME to TO_NAME. */
4384 struct ssa_name_map_entry
4386 tree from_name;
4387 tree to_name;
4390 /* Hash function for ssa_name_map_entry. */
4392 static hashval_t
4393 ssa_name_map_entry_hash (const void *entry)
4395 const struct ssa_name_map_entry *en = entry;
4396 return SSA_NAME_VERSION (en->from_name);
4399 /* Equality function for ssa_name_map_entry. */
4401 static int
4402 ssa_name_map_entry_eq (const void *in_table, const void *ssa_name)
4404 const struct ssa_name_map_entry *en = in_table;
4406 return en->from_name == ssa_name;
4409 /* Allocate duplicates of ssa names in list DEFINITIONS and store the mapping
4410 to MAP. */
4412 void
4413 allocate_ssa_names (bitmap definitions, htab_t *map)
4415 tree name;
4416 struct ssa_name_map_entry *entry;
4417 PTR *slot;
4418 unsigned ver;
4419 bitmap_iterator bi;
4421 if (!*map)
4422 *map = htab_create (10, ssa_name_map_entry_hash,
4423 ssa_name_map_entry_eq, free);
4424 EXECUTE_IF_SET_IN_BITMAP (definitions, 0, ver, bi)
4426 name = ssa_name (ver);
4427 slot = htab_find_slot_with_hash (*map, name, SSA_NAME_VERSION (name),
4428 INSERT);
4429 if (*slot)
4430 entry = *slot;
4431 else
4433 entry = xmalloc (sizeof (struct ssa_name_map_entry));
4434 entry->from_name = name;
4435 *slot = entry;
4437 entry->to_name = duplicate_ssa_name (name, SSA_NAME_DEF_STMT (name));
4441 /* Rewrite the definition DEF in statement STMT to new ssa name as specified
4442 by the mapping MAP. */
4444 static void
4445 rewrite_to_new_ssa_names_def (def_operand_p def, tree stmt, htab_t map)
4447 tree name = DEF_FROM_PTR (def);
4448 struct ssa_name_map_entry *entry;
4450 gcc_assert (TREE_CODE (name) == SSA_NAME);
4452 entry = htab_find_with_hash (map, name, SSA_NAME_VERSION (name));
4453 if (!entry)
4454 return;
4456 SET_DEF (def, entry->to_name);
4457 SSA_NAME_DEF_STMT (entry->to_name) = stmt;
4460 /* Rewrite the USE to new ssa name as specified by the mapping MAP. */
4462 static void
4463 rewrite_to_new_ssa_names_use (use_operand_p use, htab_t map)
4465 tree name = USE_FROM_PTR (use);
4466 struct ssa_name_map_entry *entry;
4468 if (TREE_CODE (name) != SSA_NAME)
4469 return;
4471 entry = htab_find_with_hash (map, name, SSA_NAME_VERSION (name));
4472 if (!entry)
4473 return;
4475 SET_USE (use, entry->to_name);
4478 /* Rewrite the ssa names in basic block BB to new ones as specified by the
4479 mapping MAP. */
4481 void
4482 rewrite_to_new_ssa_names_bb (basic_block bb, htab_t map)
4484 unsigned i;
4485 edge e;
4486 edge_iterator ei;
4487 tree phi, stmt;
4488 block_stmt_iterator bsi;
4489 use_optype uses;
4490 vuse_optype vuses;
4491 def_optype defs;
4492 v_may_def_optype v_may_defs;
4493 v_must_def_optype v_must_defs;
4494 stmt_ann_t ann;
4496 FOR_EACH_EDGE (e, ei, bb->preds)
4497 if (e->flags & EDGE_ABNORMAL)
4498 break;
4500 for (phi = phi_nodes (bb); phi; phi = TREE_CHAIN (phi))
4502 rewrite_to_new_ssa_names_def (PHI_RESULT_PTR (phi), phi, map);
4503 if (e)
4504 SSA_NAME_OCCURS_IN_ABNORMAL_PHI (PHI_RESULT (phi)) = 1;
4507 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
4509 stmt = bsi_stmt (bsi);
4510 get_stmt_operands (stmt);
4511 ann = stmt_ann (stmt);
4513 uses = USE_OPS (ann);
4514 for (i = 0; i < NUM_USES (uses); i++)
4515 rewrite_to_new_ssa_names_use (USE_OP_PTR (uses, i), map);
4517 defs = DEF_OPS (ann);
4518 for (i = 0; i < NUM_DEFS (defs); i++)
4519 rewrite_to_new_ssa_names_def (DEF_OP_PTR (defs, i), stmt, map);
4521 vuses = VUSE_OPS (ann);
4522 for (i = 0; i < NUM_VUSES (vuses); i++)
4523 rewrite_to_new_ssa_names_use (VUSE_OP_PTR (vuses, i), map);
4525 v_may_defs = V_MAY_DEF_OPS (ann);
4526 for (i = 0; i < NUM_V_MAY_DEFS (v_may_defs); i++)
4528 rewrite_to_new_ssa_names_use
4529 (V_MAY_DEF_OP_PTR (v_may_defs, i), map);
4530 rewrite_to_new_ssa_names_def
4531 (V_MAY_DEF_RESULT_PTR (v_may_defs, i), stmt, map);
4534 v_must_defs = V_MUST_DEF_OPS (ann);
4535 for (i = 0; i < NUM_V_MUST_DEFS (v_must_defs); i++)
4536 rewrite_to_new_ssa_names_def
4537 (V_MUST_DEF_OP_PTR (v_must_defs, i), stmt, map);
4540 FOR_EACH_EDGE (e, ei, bb->succs)
4541 for (phi = phi_nodes (e->dest); phi; phi = TREE_CHAIN (phi))
4543 rewrite_to_new_ssa_names_use
4544 (PHI_ARG_DEF_PTR_FROM_EDGE (phi, e), map);
4546 if (e->flags & EDGE_ABNORMAL)
4548 tree op = PHI_ARG_DEF_FROM_EDGE (phi, e);
4549 SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op) = 1;
4554 /* Rewrite the ssa names in N_REGION blocks REGION to the new ones as specified
4555 by the mapping MAP. */
4557 void
4558 rewrite_to_new_ssa_names (basic_block *region, unsigned n_region, htab_t map)
4560 unsigned r;
4562 for (r = 0; r < n_region; r++)
4563 rewrite_to_new_ssa_names_bb (region[r], map);
4566 /* Duplicates a REGION (set of N_REGION basic blocks) with just a single
4567 important exit edge EXIT. By important we mean that no SSA name defined
4568 inside region is live over the other exit edges of the region. All entry
4569 edges to the region must go to ENTRY->dest. The edge ENTRY is redirected
4570 to the duplicate of the region. SSA form, dominance and loop information
4571 is updated. The new basic blocks are stored to REGION_COPY in the same
4572 order as they had in REGION, provided that REGION_COPY is not NULL.
4573 The function returns false if it is unable to copy the region,
4574 true otherwise. */
4576 bool
4577 tree_duplicate_sese_region (edge entry, edge exit,
4578 basic_block *region, unsigned n_region,
4579 basic_block *region_copy)
4581 unsigned i, n_doms, ver;
4582 bool free_region_copy = false, copying_header = false;
4583 struct loop *loop = entry->dest->loop_father;
4584 edge exit_copy;
4585 bitmap definitions;
4586 tree phi, var;
4587 basic_block *doms;
4588 htab_t ssa_name_map = NULL;
4589 edge redirected;
4590 bitmap_iterator bi;
4592 if (!can_copy_bbs_p (region, n_region))
4593 return false;
4595 /* Some sanity checking. Note that we do not check for all possible
4596 missuses of the functions. I.e. if you ask to copy something weird,
4597 it will work, but the state of structures probably will not be
4598 correct. */
4600 for (i = 0; i < n_region; i++)
4602 /* We do not handle subloops, i.e. all the blocks must belong to the
4603 same loop. */
4604 if (region[i]->loop_father != loop)
4605 return false;
4607 if (region[i] != entry->dest
4608 && region[i] == loop->header)
4609 return false;
4612 loop->copy = loop;
4614 /* In case the function is used for loop header copying (which is the primary
4615 use), ensure that EXIT and its copy will be new latch and entry edges. */
4616 if (loop->header == entry->dest)
4618 copying_header = true;
4619 loop->copy = loop->outer;
4621 if (!dominated_by_p (CDI_DOMINATORS, loop->latch, exit->src))
4622 return false;
4624 for (i = 0; i < n_region; i++)
4625 if (region[i] != exit->src
4626 && dominated_by_p (CDI_DOMINATORS, region[i], exit->src))
4627 return false;
4630 if (!region_copy)
4632 region_copy = xmalloc (sizeof (basic_block) * n_region);
4633 free_region_copy = true;
4636 gcc_assert (!any_marked_for_rewrite_p ());
4638 /* Record blocks outside the region that are duplicated by something
4639 inside. */
4640 doms = xmalloc (sizeof (basic_block) * n_basic_blocks);
4641 n_doms = get_dominated_by_region (CDI_DOMINATORS, region, n_region, doms);
4643 copy_bbs (region, n_region, region_copy, &exit, 1, &exit_copy, loop);
4644 definitions = marked_ssa_names ();
4646 if (copying_header)
4648 loop->header = exit->dest;
4649 loop->latch = exit->src;
4652 /* Redirect the entry and add the phi node arguments. */
4653 redirected = redirect_edge_and_branch (entry, entry->dest->rbi->copy);
4654 gcc_assert (redirected != NULL);
4655 for (phi = phi_nodes (entry->dest), var = PENDING_STMT (entry);
4656 phi;
4657 phi = TREE_CHAIN (phi), var = TREE_CHAIN (var))
4658 add_phi_arg (&phi, TREE_VALUE (var), entry);
4659 PENDING_STMT (entry) = NULL;
4661 /* Concerning updating of dominators: We must recount dominators
4662 for entry block and its copy. Anything that is outside of the region, but
4663 was dominated by something inside needs recounting as well. */
4664 set_immediate_dominator (CDI_DOMINATORS, entry->dest, entry->src);
4665 doms[n_doms++] = entry->dest->rbi->original;
4666 iterate_fix_dominators (CDI_DOMINATORS, doms, n_doms);
4667 free (doms);
4669 /* Add the other phi node arguments. */
4670 add_phi_args_after_copy (region_copy, n_region);
4672 /* Add phi nodes for definitions at exit. TODO -- once we have immediate
4673 uses, it should be possible to emit phi nodes just for definitions that
4674 are used outside region. */
4675 EXECUTE_IF_SET_IN_BITMAP (definitions, 0, ver, bi)
4677 tree name = ssa_name (ver);
4679 phi = create_phi_node (name, exit->dest);
4680 add_phi_arg (&phi, name, exit);
4681 add_phi_arg (&phi, name, exit_copy);
4683 SSA_NAME_DEF_STMT (name) = phi;
4686 /* And create new definitions inside region and its copy. TODO -- once we
4687 have immediate uses, it might be better to leave definitions in region
4688 unchanged, create new ssa names for phi nodes on exit, and rewrite
4689 the uses, to avoid changing the copied region. */
4690 allocate_ssa_names (definitions, &ssa_name_map);
4691 rewrite_to_new_ssa_names (region, n_region, ssa_name_map);
4692 allocate_ssa_names (definitions, &ssa_name_map);
4693 rewrite_to_new_ssa_names (region_copy, n_region, ssa_name_map);
4694 htab_delete (ssa_name_map);
4696 if (free_region_copy)
4697 free (region_copy);
4699 unmark_all_for_rewrite ();
4700 BITMAP_XFREE (definitions);
4702 return true;
4705 /* Dump FUNCTION_DECL FN to file FILE using FLAGS (see TDF_* in tree.h) */
4707 void
4708 dump_function_to_file (tree fn, FILE *file, int flags)
4710 tree arg, vars, var;
4711 bool ignore_topmost_bind = false, any_var = false;
4712 basic_block bb;
4713 tree chain;
4715 fprintf (file, "%s (", lang_hooks.decl_printable_name (fn, 2));
4717 arg = DECL_ARGUMENTS (fn);
4718 while (arg)
4720 print_generic_expr (file, arg, dump_flags);
4721 if (TREE_CHAIN (arg))
4722 fprintf (file, ", ");
4723 arg = TREE_CHAIN (arg);
4725 fprintf (file, ")\n");
4727 if (flags & TDF_RAW)
4729 dump_node (fn, TDF_SLIM | flags, file);
4730 return;
4733 /* When GIMPLE is lowered, the variables are no longer available in
4734 BIND_EXPRs, so display them separately. */
4735 if (cfun && cfun->unexpanded_var_list)
4737 ignore_topmost_bind = true;
4739 fprintf (file, "{\n");
4740 for (vars = cfun->unexpanded_var_list; vars; vars = TREE_CHAIN (vars))
4742 var = TREE_VALUE (vars);
4744 print_generic_decl (file, var, flags);
4745 fprintf (file, "\n");
4747 any_var = true;
4751 if (basic_block_info)
4753 /* Make a CFG based dump. */
4754 check_bb_profile (ENTRY_BLOCK_PTR, file);
4755 if (!ignore_topmost_bind)
4756 fprintf (file, "{\n");
4758 if (any_var && n_basic_blocks)
4759 fprintf (file, "\n");
4761 FOR_EACH_BB (bb)
4762 dump_generic_bb (file, bb, 2, flags);
4764 fprintf (file, "}\n");
4765 check_bb_profile (EXIT_BLOCK_PTR, file);
4767 else
4769 int indent;
4771 /* Make a tree based dump. */
4772 chain = DECL_SAVED_TREE (fn);
4774 if (TREE_CODE (chain) == BIND_EXPR)
4776 if (ignore_topmost_bind)
4778 chain = BIND_EXPR_BODY (chain);
4779 indent = 2;
4781 else
4782 indent = 0;
4784 else
4786 if (!ignore_topmost_bind)
4787 fprintf (file, "{\n");
4788 indent = 2;
4791 if (any_var)
4792 fprintf (file, "\n");
4794 print_generic_stmt_indented (file, chain, flags, indent);
4795 if (ignore_topmost_bind)
4796 fprintf (file, "}\n");
4799 fprintf (file, "\n\n");
4803 /* Pretty print of the loops intermediate representation. */
4804 static void print_loop (FILE *, struct loop *, int);
4805 static void print_pred_bbs (FILE *, basic_block bb);
4806 static void print_succ_bbs (FILE *, basic_block bb);
4809 /* Print the predecessors indexes of edge E on FILE. */
4811 static void
4812 print_pred_bbs (FILE *file, basic_block bb)
4814 edge e;
4815 edge_iterator ei;
4817 FOR_EACH_EDGE (e, ei, bb->preds)
4818 fprintf (file, "bb_%d", e->src->index);
4822 /* Print the successors indexes of edge E on FILE. */
4824 static void
4825 print_succ_bbs (FILE *file, basic_block bb)
4827 edge e;
4828 edge_iterator ei;
4830 FOR_EACH_EDGE (e, ei, bb->succs)
4831 fprintf (file, "bb_%d", e->src->index);
4835 /* Pretty print LOOP on FILE, indented INDENT spaces. */
4837 static void
4838 print_loop (FILE *file, struct loop *loop, int indent)
4840 char *s_indent;
4841 basic_block bb;
4843 if (loop == NULL)
4844 return;
4846 s_indent = (char *) alloca ((size_t) indent + 1);
4847 memset ((void *) s_indent, ' ', (size_t) indent);
4848 s_indent[indent] = '\0';
4850 /* Print the loop's header. */
4851 fprintf (file, "%sloop_%d\n", s_indent, loop->num);
4853 /* Print the loop's body. */
4854 fprintf (file, "%s{\n", s_indent);
4855 FOR_EACH_BB (bb)
4856 if (bb->loop_father == loop)
4858 /* Print the basic_block's header. */
4859 fprintf (file, "%s bb_%d (preds = {", s_indent, bb->index);
4860 print_pred_bbs (file, bb);
4861 fprintf (file, "}, succs = {");
4862 print_succ_bbs (file, bb);
4863 fprintf (file, "})\n");
4865 /* Print the basic_block's body. */
4866 fprintf (file, "%s {\n", s_indent);
4867 tree_dump_bb (bb, file, indent + 4);
4868 fprintf (file, "%s }\n", s_indent);
4871 print_loop (file, loop->inner, indent + 2);
4872 fprintf (file, "%s}\n", s_indent);
4873 print_loop (file, loop->next, indent);
4877 /* Follow a CFG edge from the entry point of the program, and on entry
4878 of a loop, pretty print the loop structure on FILE. */
4880 void
4881 print_loop_ir (FILE *file)
4883 basic_block bb;
4885 bb = BASIC_BLOCK (0);
4886 if (bb && bb->loop_father)
4887 print_loop (file, bb->loop_father, 0);
4891 /* Debugging loops structure at tree level. */
4893 void
4894 debug_loop_ir (void)
4896 print_loop_ir (stderr);
4900 /* Return true if BB ends with a call, possibly followed by some
4901 instructions that must stay with the call. Return false,
4902 otherwise. */
4904 static bool
4905 tree_block_ends_with_call_p (basic_block bb)
4907 block_stmt_iterator bsi = bsi_last (bb);
4908 return get_call_expr_in (bsi_stmt (bsi)) != NULL;
4912 /* Return true if BB ends with a conditional branch. Return false,
4913 otherwise. */
4915 static bool
4916 tree_block_ends_with_condjump_p (basic_block bb)
4918 tree stmt = tsi_stmt (bsi_last (bb).tsi);
4919 return (TREE_CODE (stmt) == COND_EXPR);
4923 /* Return true if we need to add fake edge to exit at statement T.
4924 Helper function for tree_flow_call_edges_add. */
4926 static bool
4927 need_fake_edge_p (tree t)
4929 tree call;
4931 /* NORETURN and LONGJMP calls already have an edge to exit.
4932 CONST, PURE and ALWAYS_RETURN calls do not need one.
4933 We don't currently check for CONST and PURE here, although
4934 it would be a good idea, because those attributes are
4935 figured out from the RTL in mark_constant_function, and
4936 the counter incrementation code from -fprofile-arcs
4937 leads to different results from -fbranch-probabilities. */
4938 call = get_call_expr_in (t);
4939 if (call
4940 && !(call_expr_flags (call) &
4941 (ECF_NORETURN | ECF_LONGJMP | ECF_ALWAYS_RETURN)))
4942 return true;
4944 if (TREE_CODE (t) == ASM_EXPR
4945 && (ASM_VOLATILE_P (t) || ASM_INPUT_P (t)))
4946 return true;
4948 return false;
4952 /* Add fake edges to the function exit for any non constant and non
4953 noreturn calls, volatile inline assembly in the bitmap of blocks
4954 specified by BLOCKS or to the whole CFG if BLOCKS is zero. Return
4955 the number of blocks that were split.
4957 The goal is to expose cases in which entering a basic block does
4958 not imply that all subsequent instructions must be executed. */
4960 static int
4961 tree_flow_call_edges_add (sbitmap blocks)
4963 int i;
4964 int blocks_split = 0;
4965 int last_bb = last_basic_block;
4966 bool check_last_block = false;
4968 if (n_basic_blocks == 0)
4969 return 0;
4971 if (! blocks)
4972 check_last_block = true;
4973 else
4974 check_last_block = TEST_BIT (blocks, EXIT_BLOCK_PTR->prev_bb->index);
4976 /* In the last basic block, before epilogue generation, there will be
4977 a fallthru edge to EXIT. Special care is required if the last insn
4978 of the last basic block is a call because make_edge folds duplicate
4979 edges, which would result in the fallthru edge also being marked
4980 fake, which would result in the fallthru edge being removed by
4981 remove_fake_edges, which would result in an invalid CFG.
4983 Moreover, we can't elide the outgoing fake edge, since the block
4984 profiler needs to take this into account in order to solve the minimal
4985 spanning tree in the case that the call doesn't return.
4987 Handle this by adding a dummy instruction in a new last basic block. */
4988 if (check_last_block)
4990 edge_iterator ei;
4991 basic_block bb = EXIT_BLOCK_PTR->prev_bb;
4992 block_stmt_iterator bsi = bsi_last (bb);
4993 tree t = NULL_TREE;
4994 if (!bsi_end_p (bsi))
4995 t = bsi_stmt (bsi);
4997 if (need_fake_edge_p (t))
4999 edge e;
5001 FOR_EACH_EDGE (e, ei, bb->succs)
5002 if (e->dest == EXIT_BLOCK_PTR)
5004 bsi_insert_on_edge (e, build_empty_stmt ());
5005 bsi_commit_edge_inserts ((int *)NULL);
5006 break;
5011 /* Now add fake edges to the function exit for any non constant
5012 calls since there is no way that we can determine if they will
5013 return or not... */
5014 for (i = 0; i < last_bb; i++)
5016 basic_block bb = BASIC_BLOCK (i);
5017 block_stmt_iterator bsi;
5018 tree stmt, last_stmt;
5020 if (!bb)
5021 continue;
5023 if (blocks && !TEST_BIT (blocks, i))
5024 continue;
5026 bsi = bsi_last (bb);
5027 if (!bsi_end_p (bsi))
5029 last_stmt = bsi_stmt (bsi);
5032 stmt = bsi_stmt (bsi);
5033 if (need_fake_edge_p (stmt))
5035 edge e;
5036 /* The handling above of the final block before the
5037 epilogue should be enough to verify that there is
5038 no edge to the exit block in CFG already.
5039 Calling make_edge in such case would cause us to
5040 mark that edge as fake and remove it later. */
5041 #ifdef ENABLE_CHECKING
5042 if (stmt == last_stmt)
5044 edge_iterator ei;
5045 FOR_EACH_EDGE (e, ei, bb->succs)
5046 gcc_assert (e->dest != EXIT_BLOCK_PTR);
5048 #endif
5050 /* Note that the following may create a new basic block
5051 and renumber the existing basic blocks. */
5052 if (stmt != last_stmt)
5054 e = split_block (bb, stmt);
5055 if (e)
5056 blocks_split++;
5058 make_edge (bb, EXIT_BLOCK_PTR, EDGE_FAKE);
5060 bsi_prev (&bsi);
5062 while (!bsi_end_p (bsi));
5066 if (blocks_split)
5067 verify_flow_info ();
5069 return blocks_split;
5072 bool
5073 tree_purge_dead_eh_edges (basic_block bb)
5075 bool changed = false;
5076 edge e;
5077 edge_iterator ei;
5078 tree stmt = last_stmt (bb);
5080 if (stmt && tree_can_throw_internal (stmt))
5081 return false;
5083 for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
5085 if (e->flags & EDGE_EH)
5087 ssa_remove_edge (e);
5088 changed = true;
5090 else
5091 ei_next (&ei);
5094 return changed;
5097 bool
5098 tree_purge_all_dead_eh_edges (bitmap blocks)
5100 bool changed = false;
5101 size_t i;
5102 bitmap_iterator bi;
5104 EXECUTE_IF_SET_IN_BITMAP (blocks, 0, i, bi)
5106 changed |= tree_purge_dead_eh_edges (BASIC_BLOCK (i));
5109 return changed;
5112 struct cfg_hooks tree_cfg_hooks = {
5113 "tree",
5114 tree_verify_flow_info,
5115 tree_dump_bb, /* dump_bb */
5116 create_bb, /* create_basic_block */
5117 tree_redirect_edge_and_branch,/* redirect_edge_and_branch */
5118 tree_redirect_edge_and_branch_force,/* redirect_edge_and_branch_force */
5119 remove_bb, /* delete_basic_block */
5120 tree_split_block, /* split_block */
5121 tree_move_block_after, /* move_block_after */
5122 tree_can_merge_blocks_p, /* can_merge_blocks_p */
5123 tree_merge_blocks, /* merge_blocks */
5124 tree_predict_edge, /* predict_edge */
5125 tree_predicted_by_p, /* predicted_by_p */
5126 tree_can_duplicate_bb_p, /* can_duplicate_block_p */
5127 tree_duplicate_bb, /* duplicate_block */
5128 tree_split_edge, /* split_edge */
5129 tree_make_forwarder_block, /* make_forward_block */
5130 NULL, /* tidy_fallthru_edge */
5131 tree_block_ends_with_call_p, /* block_ends_with_call_p */
5132 tree_block_ends_with_condjump_p, /* block_ends_with_condjump_p */
5133 tree_flow_call_edges_add /* flow_call_edges_add */
5137 /* Split all critical edges. */
5139 static void
5140 split_critical_edges (void)
5142 basic_block bb;
5143 edge e;
5144 edge_iterator ei;
5146 FOR_ALL_BB (bb)
5148 FOR_EACH_EDGE (e, ei, bb->succs)
5149 if (EDGE_CRITICAL_P (e) && !(e->flags & EDGE_ABNORMAL))
5151 split_edge (e);
5156 struct tree_opt_pass pass_split_crit_edges =
5158 "crited", /* name */
5159 NULL, /* gate */
5160 split_critical_edges, /* execute */
5161 NULL, /* sub */
5162 NULL, /* next */
5163 0, /* static_pass_number */
5164 TV_TREE_SPLIT_EDGES, /* tv_id */
5165 PROP_cfg, /* properties required */
5166 PROP_no_crit_edges, /* properties_provided */
5167 0, /* properties_destroyed */
5168 0, /* todo_flags_start */
5169 TODO_dump_func, /* todo_flags_finish */
5170 0 /* letter */
5174 /* Return EXP if it is a valid GIMPLE rvalue, else gimplify it into
5175 a temporary, make sure and register it to be renamed if necessary,
5176 and finally return the temporary. Put the statements to compute
5177 EXP before the current statement in BSI. */
5179 tree
5180 gimplify_val (block_stmt_iterator *bsi, tree type, tree exp)
5182 tree t, new_stmt, orig_stmt;
5184 if (is_gimple_val (exp))
5185 return exp;
5187 t = make_rename_temp (type, NULL);
5188 new_stmt = build (MODIFY_EXPR, type, t, exp);
5190 orig_stmt = bsi_stmt (*bsi);
5191 SET_EXPR_LOCUS (new_stmt, EXPR_LOCUS (orig_stmt));
5192 TREE_BLOCK (new_stmt) = TREE_BLOCK (orig_stmt);
5194 bsi_insert_before (bsi, new_stmt, BSI_SAME_STMT);
5196 return t;
5199 /* Build a ternary operation and gimplify it. Emit code before BSI.
5200 Return the gimple_val holding the result. */
5202 tree
5203 gimplify_build3 (block_stmt_iterator *bsi, enum tree_code code,
5204 tree type, tree a, tree b, tree c)
5206 tree ret;
5208 ret = fold (build3 (code, type, a, b, c));
5209 STRIP_NOPS (ret);
5211 return gimplify_val (bsi, type, ret);
5214 /* Build a binary operation and gimplify it. Emit code before BSI.
5215 Return the gimple_val holding the result. */
5217 tree
5218 gimplify_build2 (block_stmt_iterator *bsi, enum tree_code code,
5219 tree type, tree a, tree b)
5221 tree ret;
5223 ret = fold (build2 (code, type, a, b));
5224 STRIP_NOPS (ret);
5226 return gimplify_val (bsi, type, ret);
5229 /* Build a unary operation and gimplify it. Emit code before BSI.
5230 Return the gimple_val holding the result. */
5232 tree
5233 gimplify_build1 (block_stmt_iterator *bsi, enum tree_code code, tree type,
5234 tree a)
5236 tree ret;
5238 ret = fold (build1 (code, type, a));
5239 STRIP_NOPS (ret);
5241 return gimplify_val (bsi, type, ret);
5246 /* Emit return warnings. */
5248 static void
5249 execute_warn_function_return (void)
5251 #ifdef USE_MAPPED_LOCATION
5252 source_location location;
5253 #else
5254 location_t *locus;
5255 #endif
5256 tree last;
5257 edge e;
5258 edge_iterator ei;
5260 if (warn_missing_noreturn
5261 && !TREE_THIS_VOLATILE (cfun->decl)
5262 && EDGE_COUNT (EXIT_BLOCK_PTR->preds) == 0
5263 && !lang_hooks.function.missing_noreturn_ok_p (cfun->decl))
5264 warning ("%Jfunction might be possible candidate for "
5265 "attribute %<noreturn%>",
5266 cfun->decl);
5268 /* If we have a path to EXIT, then we do return. */
5269 if (TREE_THIS_VOLATILE (cfun->decl)
5270 && EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0)
5272 #ifdef USE_MAPPED_LOCATION
5273 location = UNKNOWN_LOCATION;
5274 #else
5275 locus = NULL;
5276 #endif
5277 FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
5279 last = last_stmt (e->src);
5280 if (TREE_CODE (last) == RETURN_EXPR
5281 #ifdef USE_MAPPED_LOCATION
5282 && (location = EXPR_LOCATION (last)) != UNKNOWN_LOCATION)
5283 #else
5284 && (locus = EXPR_LOCUS (last)) != NULL)
5285 #endif
5286 break;
5288 #ifdef USE_MAPPED_LOCATION
5289 if (location == UNKNOWN_LOCATION)
5290 location = cfun->function_end_locus;
5291 warning ("%H%<noreturn%> function does return", &location);
5292 #else
5293 if (!locus)
5294 locus = &cfun->function_end_locus;
5295 warning ("%H%<noreturn%> function does return", locus);
5296 #endif
5299 /* If we see "return;" in some basic block, then we do reach the end
5300 without returning a value. */
5301 else if (warn_return_type
5302 && EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0
5303 && !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (cfun->decl))))
5305 FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
5307 tree last = last_stmt (e->src);
5308 if (TREE_CODE (last) == RETURN_EXPR
5309 && TREE_OPERAND (last, 0) == NULL)
5311 #ifdef USE_MAPPED_LOCATION
5312 location = EXPR_LOCATION (last);
5313 if (location == UNKNOWN_LOCATION)
5314 location = cfun->function_end_locus;
5315 warning ("%Hcontrol reaches end of non-void function", &location);
5316 #else
5317 locus = EXPR_LOCUS (last);
5318 if (!locus)
5319 locus = &cfun->function_end_locus;
5320 warning ("%Hcontrol reaches end of non-void function", locus);
5321 #endif
5322 break;
5329 /* Given a basic block B which ends with a conditional and has
5330 precisely two successors, determine which of the edges is taken if
5331 the conditional is true and which is taken if the conditional is
5332 false. Set TRUE_EDGE and FALSE_EDGE appropriately. */
5334 void
5335 extract_true_false_edges_from_block (basic_block b,
5336 edge *true_edge,
5337 edge *false_edge)
5339 edge e = EDGE_SUCC (b, 0);
5341 if (e->flags & EDGE_TRUE_VALUE)
5343 *true_edge = e;
5344 *false_edge = EDGE_SUCC (b, 1);
5346 else
5348 *false_edge = e;
5349 *true_edge = EDGE_SUCC (b, 1);
5353 struct tree_opt_pass pass_warn_function_return =
5355 NULL, /* name */
5356 NULL, /* gate */
5357 execute_warn_function_return, /* execute */
5358 NULL, /* sub */
5359 NULL, /* next */
5360 0, /* static_pass_number */
5361 0, /* tv_id */
5362 PROP_cfg, /* properties_required */
5363 0, /* properties_provided */
5364 0, /* properties_destroyed */
5365 0, /* todo_flags_start */
5366 0, /* todo_flags_finish */
5367 0 /* letter */
5370 #include "gt-tree-cfg.h"