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)
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. */
24 #include "coretypes.h"
29 #include "hard-reg-set.h"
30 #include "basic-block.h"
37 #include "langhooks.h"
38 #include "diagnostic.h"
39 #include "tree-flow.h"
41 #include "tree-dump.h"
42 #include "tree-pass.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
;
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);
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 /*---------------------------------------------------------------------------
113 ---------------------------------------------------------------------------*/
115 /* Entry point to the CFG builder for trees. TP points to the list of
116 statements to be added to the flowgraph. */
119 build_tree_cfg (tree
*tp
)
121 /* Register specific tree functions. */
122 tree_register_cfg_hooks ();
124 /* Initialize rbi_pool. */
127 /* Initialize the basic block array. */
129 profile_status
= PROFILE_ABSENT
;
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;
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. */
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
);
182 tree_cfg2vcg (dump_file
);
183 dump_end (TDI_vcg
, dump_file
);
187 /* Dump a textual representation of the flowgraph. */
189 dump_tree_cfg (dump_file
, dump_flags
);
193 execute_build_cfg (void)
195 build_tree_cfg (&DECL_SAVED_TREE (current_function_decl
));
198 struct tree_opt_pass pass_build_cfg
=
202 execute_build_cfg
, /* execute */
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 */
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
221 factor_computed_gotos (void)
224 tree factored_label_decl
= 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. */
235 block_stmt_iterator bsi
= bsi_last (bb
);
240 last
= bsi_stmt (bsi
);
242 /* Ignore the computed goto we create when we factor the original
244 if (last
== factored_computed_goto
)
247 /* If the last statement is a computed goto, factor it. */
248 if (computed_goto_p (last
))
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
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
,
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
,
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. */
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. */
314 clear_blocks_annotations (void)
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. */
326 make_blocks (tree stmt_list
)
328 tree_stmt_iterator i
= tsi_start (stmt_list
);
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
))
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
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
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
361 if (stmt_ends_bb_p (stmt
))
362 start_new_block
= true;
365 first_stmt_of_list
= false;
370 /* Create and return a new empty basic block after bb AFTER. */
373 create_bb (void *h
, void *e
, basic_block after
)
379 /* Create and initialize a new basic block. */
381 memset (bb
, 0, sizeof (*bb
));
383 bb
->index
= last_basic_block
;
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
);
405 initialize_bb_rbi (bb
);
410 /*---------------------------------------------------------------------------
412 ---------------------------------------------------------------------------*/
414 /* Join all the blocks in the flowgraph. */
421 /* Create an edge from entry to the first block with executable
423 make_edge (ENTRY_BLOCK_PTR
, BASIC_BLOCK (0), EDGE_FALLTHRU
);
425 /* Traverse basic block array placing edges. */
428 tree first
= first_stmt (bb
);
429 tree last
= last_stmt (bb
);
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. */
457 /* Create edges for control statement at basic block BB. */
460 make_ctrl_stmt_edges (basic_block bb
)
462 tree last
= last_stmt (bb
);
465 switch (TREE_CODE (last
))
468 make_goto_expr_edges (bb
);
472 make_edge (bb
, EXIT_BLOCK_PTR
, 0);
476 make_cond_expr_edges (bb
);
480 make_switch_expr_edges (bb
);
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
);
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. */
501 make_exit_edges (basic_block bb
)
503 tree last
= last_stmt (bb
), op
;
506 switch (TREE_CODE (last
))
509 /* If this function receives a nonlocal goto, then we need to
510 make edges from this call site to all the nonlocal goto
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
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
527 if (call_expr_flags (last
) & (ECF_NORETURN
| ECF_LONGJMP
))
529 make_edge (bb
, EXIT_BLOCK_PTR
, EDGE_FAKE
);
533 /* Don't forget the fall-thru edge. */
534 make_edge (bb
, bb
->next_bb
, EDGE_FALLTHRU
);
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
);
556 /* Create the edges for a COND_EXPR starting at block BB.
557 At this point, both clauses must contain only simple gotos. */
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
;
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. */
585 make_switch_expr_edges (basic_block bb
)
587 tree entry
= last_stmt (bb
);
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. */
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));
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. */
629 make_goto_expr_edges (basic_block bb
)
632 basic_block target_bb
;
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
;
648 dest
= GOTO_DESTINATION (goto_t
);
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
);
658 e
->goto_locus
= EXPR_LOCUS (goto_t
);
664 /* Nothing more to do for nonlocal gotos. */
665 if (TREE_CODE (dest
) == LABEL_DECL
)
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
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
)
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
692 || (DECL_NONLOCAL (LABEL_EXPR_LABEL (target
)) && for_call
== 1))
694 make_edge (bb
, target_bb
, EDGE_ABNORMAL
);
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 /*---------------------------------------------------------------------------
708 ---------------------------------------------------------------------------*/
710 /* Remove unreachable blocks and other miscellaneous clean up work. */
713 cleanup_tree_cfg (void)
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
725 while (thread_jumps ())
727 /* delete_unreachable_blocks() does its job only when
728 thread_jumps() produces more unreachable blocks. */
729 delete_unreachable_blocks ();
733 #ifdef ENABLE_CHECKING
736 gcc_assert (!cleanup_control_flow ());
737 gcc_assert (!delete_unreachable_blocks ());
741 /* Merging the blocks creates no new opportunities for the other
742 optimizations, so do it here. */
747 #ifdef ENABLE_CHECKING
750 timevar_pop (TV_TREE_CLEANUP_CFG
);
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
759 We only run this pass once, running it more than once is probably not
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. */
767 update_eh_label (struct eh_region
*region
)
769 tree old_label
= get_eh_region_tree_label (region
);
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. */
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. */
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. */
804 cleanup_dead_labels (void)
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. */
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
)
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
;
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
;
844 /* Now redirect all jumps/branches to the selected label.
845 First do so for each block ending in a control statement. */
848 tree stmt
= last_stmt (bb
);
852 switch (TREE_CODE (stmt
))
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
));
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
)));
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. */
886 if (! computed_goto_p (stmt
))
888 GOTO_DESTINATION (stmt
)
889 = main_block_label (GOTO_DESTINATION (stmt
));
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. */
904 block_stmt_iterator i
;
905 tree label_for_this_bb
= label_for_bb
[bb
->index
];
907 if (! label_for_this_bb
)
910 for (i
= bsi_start (bb
); !bsi_end_p (i
); )
912 tree label
, stmt
= bsi_stmt (i
);
914 if (TREE_CODE (stmt
) != LABEL_EXPR
)
917 label
= LABEL_EXPR_LABEL (stmt
);
919 if (label
== label_for_this_bb
920 || ! DECL_ARTIFICIAL (label
)
921 || DECL_NONLOCAL (label
))
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
934 Eg. three separate entries 1: 2: 3: become one entry 1..3: */
937 group_case_labels (void)
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);
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. */
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
970 if (base_label
== default_label
)
972 TREE_VEC_ELT (labels
, i
) = NULL_TREE
;
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
;
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
))
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. */
1024 tree_can_merge_blocks_p (basic_block a
, basic_block b
)
1027 block_stmt_iterator bsi
;
1029 if (EDGE_COUNT (a
->succs
) != 1)
1032 if (EDGE_SUCC (a
, 0)->flags
& EDGE_ABNORMAL
)
1035 if (EDGE_SUCC (a
, 0)->dest
!= b
)
1038 if (b
== EXIT_BLOCK_PTR
)
1041 if (EDGE_COUNT (b
->preds
) > 1)
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
))
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
)))
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. */
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
)
1066 if (!DECL_ARTIFICIAL (LABEL_EXPR_LABEL (stmt
)))
1074 /* Merge block B into block A. */
1077 tree_merge_blocks (basic_block a
, basic_block b
)
1079 block_stmt_iterator bsi
;
1080 tree_stmt_iterator last
;
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
)
1098 set_bb_for_stmt (bsi_stmt (bsi
), a
);
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. */
1136 static void remove_useless_stmts_1 (tree
*, struct rus_data
*);
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
);
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
)))
1160 if (remove_useless_stmts_warn_notreached (COND_EXPR_COND (stmt
)))
1162 if (remove_useless_stmts_warn_notreached (COND_EXPR_THEN (stmt
)))
1164 if (remove_useless_stmts_warn_notreached (COND_EXPR_ELSE (stmt
)))
1168 case TRY_FINALLY_EXPR
:
1169 case TRY_CATCH_EXPR
:
1170 if (remove_useless_stmts_warn_notreached (TREE_OPERAND (stmt
, 0)))
1172 if (remove_useless_stmts_warn_notreached (TREE_OPERAND (stmt
, 1)))
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
));
1181 return remove_useless_stmts_warn_notreached (BIND_EXPR_BLOCK (stmt
));
1184 /* Not a live container. */
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
;
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. */
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
)
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
));
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
;
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;
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
;
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;
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
))
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
);
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
);
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;
1415 data
->may_throw
|= this_may_throw
;
1420 remove_useless_stmts_bind (tree
*stmt_p
, struct rus_data
*data
)
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
)
1437 || ! BLOCK_ABSTRACT_ORIGIN (block
)
1438 || (TREE_CODE (BLOCK_ABSTRACT_ORIGIN (block
))
1441 *stmt_p
= BIND_EXPR_BODY (*stmt_p
);
1442 data
->repeat
= true;
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
;
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. */
1491 update_call_expr_flags (tree call
)
1493 tree decl
= get_callee_fndecl (call
);
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. */
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. */
1521 clear_special_calls (void)
1523 current_function_calls_alloca
= false;
1524 current_function_calls_setjmp
= false;
1529 remove_useless_stmts_1 (tree
*tp
, struct rus_data
*data
)
1533 switch (TREE_CODE (t
))
1536 remove_useless_stmts_cond (tp
, data
);
1539 case TRY_FINALLY_EXPR
:
1540 remove_useless_stmts_tf (tp
, data
);
1543 case TRY_CATCH_EXPR
:
1544 remove_useless_stmts_tc (tp
, data
);
1548 remove_useless_stmts_bind (tp
, data
);
1552 remove_useless_stmts_goto (tp
, data
);
1556 remove_useless_stmts_label (tp
, data
);
1561 data
->last_goto
= NULL
;
1562 data
->may_branch
= true;
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;
1575 data
->last_goto
= NULL
;
1577 op
= get_call_expr_in (t
);
1580 update_call_expr_flags (op
);
1581 notice_special_calls (op
);
1583 if (tree_could_throw_p (t
))
1584 data
->may_throw
= true;
1587 case STATEMENT_LIST
:
1589 tree_stmt_iterator i
= tsi_start (t
);
1590 while (!tsi_end_p (i
))
1593 if (IS_EMPTY_STMT (t
))
1599 remove_useless_stmts_1 (tsi_stmt_ptr (i
), data
);
1602 if (TREE_CODE (t
) == STATEMENT_LIST
)
1604 tsi_link_before (&i
, t
, TSI_SAME_STMT
);
1614 data
->last_goto
= NULL
;
1618 data
->last_goto
= NULL
;
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 */
1643 remove_useless_stmts
, /* execute */
1646 0, /* static_pass_number */
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 */
1657 /* Remove obviously useless statements in basic block BB. */
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
1669 if (EDGE_COUNT (bb
->preds
) != 1
1670 || !(EDGE_PRED (bb
, 0)->flags
& (EDGE_TRUE_VALUE
| EDGE_FALSE_VALUE
)))
1673 cond
= COND_EXPR_COND (last_stmt (EDGE_PRED (bb
, 0)->src
));
1675 if (TREE_CODE (cond
) == VAR_DECL
|| TREE_CODE (cond
) == PARM_DECL
)
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
);
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);
1707 /* Only work for normal local variables. */
1708 ann
= var_ann (var
);
1711 || TREE_ADDRESSABLE (var
))
1714 if (! TREE_CONSTANT (val
))
1716 ann
= var_ann (val
);
1719 || TREE_ADDRESSABLE (val
))
1723 /* Ignore floating point variables, since comparison behaves weird for
1725 if (FLOAT_TYPE_P (TREE_TYPE (var
)))
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))
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
)))
1758 /* A CFG-aware version of remove_useless_stmts. */
1761 cfg_remove_useless_stmts (void)
1765 #ifdef ENABLE_CHECKING
1766 verify_flow_info ();
1771 cfg_remove_useless_stmts_bb (bb
);
1776 /* Remove PHI nodes associated with basic block BB and all edges out of BB. */
1779 remove_phi_nodes_and_edges_for_unreachable_block (basic_block bb
)
1783 /* Since this block is no longer reachable, we can just delete all
1784 of its PHI nodes. */
1785 phi
= phi_nodes (bb
);
1788 tree next
= PHI_CHAIN (phi
);
1789 remove_phi_node (phi
, NULL_TREE
, bb
);
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. */
1802 remove_bb (basic_block bb
)
1804 block_stmt_iterator i
;
1805 source_locus loc
= 0;
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
);
1833 loc
= EXPR_LOCUS (stmt
);
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
1841 if (warn_notreached
&& loc
)
1842 #ifdef USE_MAPPED_LOCATION
1843 warning ("%Hwill never be executed", &loc
);
1845 warning ("%Hwill never be executed", loc
);
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. */
1857 tree_block_forwards_to (basic_block bb
)
1859 block_stmt_iterator bsi
;
1860 bb_ann_t ann
= bb_ann (bb
);
1863 /* If this block is not forwardable, then avoid useless work. */
1864 if (! ann
->forwardable
)
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
1881 || phi_nodes (EDGE_SUCC (bb
, 0)->dest
))
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
)
1892 /* If we reached the end of this block we may be able to optimize this
1894 if (bsi_end_p (bsi
))
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. */
1903 dest
= EDGE_SUCC (bb
, 0);
1905 ann
->forwardable
= 1;
1909 /* No forwarding possible. */
1914 /* Try to remove superfluous control structures. */
1917 cleanup_control_flow (void)
1920 block_stmt_iterator bsi
;
1921 bool retval
= false;
1926 bsi
= bsi_last (bb
);
1928 if (bsi_end_p (bsi
))
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
);
1940 /* Disconnect an unreachable block in the control expression starting
1944 cleanup_control_expr_graph (basic_block bb
, block_stmt_iterator bsi
)
1947 bool retval
= false;
1948 tree expr
= bsi_stmt (bsi
), val
;
1950 if (EDGE_COUNT (bb
->succs
) > 1)
1955 switch (TREE_CODE (expr
))
1958 val
= COND_EXPR_COND (expr
);
1962 val
= SWITCH_COND (expr
);
1963 if (TREE_CODE (val
) != INTEGER_CST
)
1971 taken_edge
= find_taken_edge (bb
, val
);
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
);
1988 if (taken_edge
->probability
> REG_BR_PROB_BASE
)
1989 taken_edge
->probability
= REG_BR_PROB_BASE
;
1992 taken_edge
= EDGE_SUCC (bb
, 0);
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
;
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. */
2010 find_taken_edge (basic_block bb
, tree val
)
2014 stmt
= last_stmt (bb
);
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
))
2024 /* If VAL is not a constant, we can't determine which edge might
2026 if (val
== NULL
|| !really_constant_p (val
))
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. */
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
)
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
))
2061 else if (integer_zerop (val
))
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. */
2073 find_taken_edge_switch_expr (basic_block bb
, tree val
)
2075 tree switch_expr
, taken_case
;
2076 basic_block dest_bb
;
2079 if (TREE_CODE (val
) != INTEGER_CST
)
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
);
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. */
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
);
2109 /* Cache the result of comparing CASE_LOW and val. */
2110 cmp
= tree_int_cst_compare (CASE_LOW (t
), val
);
2117 if (CASE_HIGH (t
) == NULL
)
2119 /* A singe-valued case label. */
2125 /* A case range. We can only handle integer ranges. */
2126 if (cmp
<= 0 && tree_int_cst_compare (CASE_HIGH (t
), val
) >= 0)
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. */
2140 phi_alternatives_equal (basic_block dest
, edge e1
, edge e2
)
2142 tree phi
, val1
, val2
;
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))
2164 /*---------------------------------------------------------------------------
2166 ---------------------------------------------------------------------------*/
2168 /* Dump tree-specific information of block BB to file OUTF. */
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. */
2180 debug_tree_bb (basic_block bb
)
2182 dump_bb (bb
, stderr
, 0);
2186 /* Dump basic block with index N on stderr. */
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). */
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
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);
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. */
2240 dump_cfg_stats (FILE *file
)
2242 static long max_num_merged_labels
= 0;
2243 unsigned long size
, total
= 0;
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
);
2262 fprintf (file
, fmt_str_1
, "Basic blocks", n_basic_blocks
,
2263 SCALE (size
), LABEL (size
));
2267 n_edges
+= EDGE_COUNT (bb
->succs
);
2268 size
= n_edges
* sizeof (struct edge_def
);
2270 fprintf (file
, fmt_str_1
, "Edges", n_edges
, SCALE (size
), LABEL (size
));
2272 size
= n_basic_blocks
* sizeof (struct bb_ann_d
);
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
),
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. */
2297 debug_cfg_stats (void)
2299 dump_cfg_stats (stderr
);
2303 /* Dump the flowgraph to a .vcg FILE. */
2306 tree_cfg2vcg (FILE *file
)
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\"",
2325 if (e
->flags
& EDGE_FAKE
)
2326 fprintf (file
, " linestyle: dotted priority: 10");
2328 fprintf (file
, " linestyle: solid priority: 100");
2330 fprintf (file
, " }\n");
2336 enum tree_code head_code
, end_code
;
2337 const char *head_name
, *end_name
;
2340 tree first
= first_stmt (bb
);
2341 tree last
= last_stmt (bb
);
2345 head_code
= TREE_CODE (first
);
2346 head_name
= tree_code_name
[head_code
];
2347 head_line
= get_lineno (first
);
2350 head_name
= "no-statement";
2354 end_code
= TREE_CODE (last
);
2355 end_name
= tree_code_name
[end_code
];
2356 end_line
= get_lineno (last
);
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
,
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
);
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");
2375 fprintf (file
, " priority: 100 linestyle: solid");
2377 fprintf (file
, " }\n");
2380 if (bb
->next_bb
!= EXIT_BLOCK_PTR
)
2384 fputs ("}\n\n", file
);
2389 /*---------------------------------------------------------------------------
2390 Miscellaneous helpers
2391 ---------------------------------------------------------------------------*/
2393 /* Return true if T represents a stmt that always transfers control. */
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). */
2410 is_ctrl_altering_stmt (tree t
)
2415 call
= get_call_expr_in (t
);
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
)
2423 /* A CALL_EXPR also alters control flow if it does not return. */
2424 if (call_expr_flags (call
) & (ECF_NORETURN
| ECF_LONGJMP
))
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. */
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. */
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. */
2460 stmt_starts_bb_p (tree t
, tree prev_t
)
2462 enum tree_code code
;
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
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
))))
2480 if (prev_t
&& TREE_CODE (prev_t
) == code
)
2482 if (DECL_NONLOCAL (LABEL_EXPR_LABEL (prev_t
)))
2485 cfg_stats
.num_merged_labels
++;
2496 /* Return true if T should end a basic block. */
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. */
2508 disband_implicit_edges (void)
2511 block_stmt_iterator last
;
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
)
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 ();
2538 e
->flags
|= EDGE_FALLTHRU
;
2544 if (stmt
&& TREE_CODE (stmt
) == RETURN_EXPR
)
2546 /* Remove the RETURN_EXPR if we may fall though to the exit
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))
2555 EDGE_SUCC (bb
, 0)->flags
|= EDGE_FALLTHRU
;
2560 /* There can be no fallthru edge if the last statement is a control
2562 if (stmt
&& is_ctrl_stmt (stmt
))
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
)
2570 if (!e
|| e
->dest
== bb
->next_bb
)
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
);
2580 SET_EXPR_LOCUS (stmt
, e
->goto_locus
);
2582 bsi_insert_after (&last
, stmt
, BSI_NEW_STMT
);
2583 e
->flags
&= ~EDGE_FALLTHRU
;
2587 /* Remove block annotations and other datastructures. */
2590 delete_tree_cfg_annotations (void)
2593 if (n_basic_blocks
> 0)
2594 free_blocks_annotations ();
2596 label_to_block_map
= NULL
;
2603 /* Return the first statement in basic block BB. */
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. */
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. */
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
2638 last_and_only_stmt (basic_block bb
)
2640 block_stmt_iterator i
= bsi_last (bb
);
2646 last
= bsi_stmt (i
);
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
)
2666 /* Mark BB as the basic block holding statement T. */
2669 set_bb_for_stmt (tree t
, basic_block bb
)
2671 if (TREE_CODE (t
) == PHI_NODE
)
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
);
2681 stmt_ann_t ann
= get_stmt_ann (t
);
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
)
2690 t
= LABEL_EXPR_LABEL (t
);
2691 uid
= LABEL_DECL_UID (t
);
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);
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
)
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). */
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
);
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). */
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
);
2747 /* Remove the statement pointed to by iterator I. The iterator is updated
2748 to the next statement. */
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. */
2762 bsi_move_after (block_stmt_iterator
*from
, block_stmt_iterator
*to
)
2764 tree stmt
= bsi_stmt (*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. */
2773 bsi_move_before (block_stmt_iterator
*from
, block_stmt_iterator
*to
)
2775 tree stmt
= bsi_stmt (*from
);
2777 bsi_insert_before (to
, stmt
, BSI_SAME_STMT
);
2781 /* Move the statement at FROM to the end of basic block BB. */
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
);
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. */
2801 bsi_replace (const block_stmt_iterator
*bsi
, tree stmt
, bool preserve_eh_info
)
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
);
2815 add_stmt_to_eh_region (stmt
, eh_region
);
2818 *bsi_stmt_ptr (*bsi
) = 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. */
2834 tree_find_edge_insert_loc (edge e
, block_stmt_iterator
*bsi
,
2835 basic_block
*new_bb
)
2837 basic_block dest
, src
;
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
))
2858 /* Make sure we insert after any leading labels. */
2859 tmp
= bsi_stmt (*bsi
);
2860 while (TREE_CODE (tmp
) == LABEL_EXPR
)
2863 if (bsi_end_p (*bsi
))
2865 tmp
= bsi_stmt (*bsi
);
2868 if (bsi_end_p (*bsi
))
2870 *bsi
= bsi_last (dest
);
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. */
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
))
2889 tmp
= bsi_stmt (*bsi
);
2890 if (!stmt_ends_bb_p (tmp
))
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);
2909 /* Otherwise, create a new basic block, and split this edge. */
2910 dest
= split_edge (e
);
2913 e
= EDGE_PRED (dest
, 0);
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. */
2925 bsi_commit_edge_inserts (int *new_blocks
)
2932 blocks
= n_basic_blocks
;
2934 bsi_commit_edge_inserts_1 (EDGE_SUCC (ENTRY_BLOCK_PTR
, 0));
2937 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
2938 bsi_commit_edge_inserts_1 (e
);
2941 *new_blocks
= n_basic_blocks
- blocks
;
2945 /* Commit insertions pending at edge E. */
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
);
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. */
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. */
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
);
2988 bsi_insert_before (&bsi
, stmt
, BSI_NEW_STMT
);
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. */
3001 tree_split_edge (edge edge_in
)
3003 basic_block new_bb
, after_bb
, dest
, src
;
3009 /* Abnormal edges cannot be split. */
3010 gcc_assert (!(edge_in
->flags
& EDGE_ABNORMAL
));
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
)
3022 after_bb
= dest
->prev_bb
;
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
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
;
3047 e
= redirect_edge_and_branch (edge_in
, new_bb
);
3049 gcc_assert (!PENDING_STMT (edge_in
));
3055 /* Return true when BB has label LABEL in it. */
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
)
3068 if (LABEL_EXPR_LABEL (stmt
) == label
)
3075 /* Callback for walk_tree, check that all elements with address taken are
3076 properly noticed as such. */
3079 verify_expr (tree
*tp
, int *walk_subtrees
, void *data ATTRIBUTE_UNUSED
)
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
))
3097 if (SSA_NAME_IN_FREE_LIST (t
))
3099 error ("SSA name in freelist but still referenced");
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");
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
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
)
3127 if (!TREE_ADDRESSABLE (x
))
3129 error ("address taken, but ADDRESSABLE bit not set");
3135 x
= TREE_OPERAND (t
, 0);
3136 if (TREE_CODE (TREE_TYPE (x
)) != BOOLEAN_TYPE
)
3138 error ("non-boolean used in condition");
3145 case FIX_TRUNC_EXPR
:
3147 case FIX_FLOOR_EXPR
:
3148 case FIX_ROUND_EXPR
:
3153 case NON_LVALUE_EXPR
:
3154 case TRUTH_NOT_EXPR
:
3155 CHECK_OP (0, "Invalid operand to unary operator");
3162 case ARRAY_RANGE_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
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.");
3206 case UNORDERED_EXPR
:
3217 case TRUNC_DIV_EXPR
:
3219 case FLOOR_DIV_EXPR
:
3220 case ROUND_DIV_EXPR
:
3221 case TRUNC_MOD_EXPR
:
3223 case FLOOR_MOD_EXPR
:
3224 case ROUND_MOD_EXPR
:
3226 case EXACT_DIV_EXPR
:
3236 CHECK_OP (0, "Invalid operand to binary operator");
3237 CHECK_OP (1, "Invalid operand to binary operator");
3249 /* Verify STMT, return true if STMT is not in GIMPLE form.
3250 TODO: Implement type checking. */
3253 verify_stmt (tree stmt
, bool last_in_block
)
3257 if (!is_gimple_stmt (stmt
))
3259 error ("Is not a valid GIMPLE statement.");
3263 addr
= walk_tree (&stmt
, verify_expr
, NULL
, NULL
);
3266 debug_generic_stmt (addr
);
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
3275 if (lookup_stmt_eh_region (stmt
) >= 0)
3277 if (!tree_could_throw_p (stmt
))
3279 error ("Statement marked for throw, but doesn%'t.");
3282 if (!last_in_block
&& tree_can_throw_internal (stmt
))
3284 error ("Statement marked for throw in middle of block.");
3292 debug_generic_stmt (stmt
);
3297 /* Return true when the T can be shared. */
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
)
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);
3327 /* Called via walk_trees. Verify tree sharing. */
3330 verify_node_sharing (tree
* tp
, int *walk_subtrees
, void *data
)
3332 htab_t htab
= (htab_t
) data
;
3335 if (tree_node_can_be_shared (*tp
))
3337 *walk_subtrees
= false;
3341 slot
= htab_find_slot (htab
, *tp
, INSERT
);
3350 /* Verify the GIMPLE statement chain. */
3356 block_stmt_iterator bsi
;
3361 timevar_push (TV_TREE_STMT_VERIFY
);
3362 htab
= htab_create (37, htab_hash_pointer
, htab_eq_pointer
, NULL
);
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
);
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
);
3390 addr
= walk_tree (&t
, verify_expr
, NULL
, NULL
);
3393 debug_generic_stmt (addr
);
3397 addr
= walk_tree (&t
, verify_node_sharing
, htab
, NULL
);
3400 error ("Incorrect sharing of tree nodes");
3401 debug_generic_stmt (phi
);
3402 debug_generic_stmt (addr
);
3408 for (bsi
= bsi_start (bb
); !bsi_end_p (bsi
); )
3410 tree stmt
= bsi_stmt (bsi
);
3412 err
|= verify_stmt (stmt
, bsi_end_p (bsi
));
3413 addr
= walk_tree (&stmt
, verify_node_sharing
, htab
, NULL
);
3416 error ("Incorrect sharing of tree nodes");
3417 debug_generic_stmt (stmt
);
3418 debug_generic_stmt (addr
);
3425 internal_error ("verify_stmts failed.");
3428 timevar_pop (TV_TREE_STMT_VERIFY
);
3432 /* Verifies that the flow information is OK. */
3435 tree_verify_flow_info (void)
3439 block_stmt_iterator bsi
;
3444 if (ENTRY_BLOCK_PTR
->stmt_list
)
3446 error ("ENTRY_BLOCK has a statement list associated with it\n");
3450 if (EXIT_BLOCK_PTR
->stmt_list
)
3452 error ("EXIT_BLOCK has a statement list associated with it\n");
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
);
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
)
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
))),
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
))),
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",
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
)),
3514 bsi
= bsi_last (bb
);
3515 if (bsi_end_p (bsi
))
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",
3531 switch (TREE_CODE (stmt
))
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
);
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",
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",
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",
3577 if (simple_goto_p (stmt
))
3579 error ("Explicit goto at end of bb %d\n", bb
->index
);
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",
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
);
3606 if (EDGE_SUCC (bb
, 0)->dest
!= EXIT_BLOCK_PTR
)
3608 error ("Return edge does not point to exit in bb %d\n",
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
);
3641 error ("Found default case not at end of case vector");
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");
3656 if (CASE_LOW (TREE_VEC_ELT (vec
, n
- 1)))
3658 error ("No default case found at end of case vector");
3662 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
3666 error ("Extra outgoing edge %d->%d\n",
3667 bb
->index
, e
->dest
->index
);
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",
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
);
3694 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
3695 e
->dest
->aux
= (void *)0;
3702 if (dom_computed
[CDI_DOMINATORS
] >= DOM_NO_FAST_QUERY
)
3703 verify_dominators (CDI_DOMINATORS
);
3709 /* Updates phi nodes after creating forwarder block joined
3710 by edge FALLTHRU. */
3713 tree_make_forwarder_block (edge fallthru
)
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)
3726 /* If we redirected a branch we must create new phi nodes at the
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. */
3739 for (phi
= phi_nodes (bb
); phi
; phi
= next
)
3741 next
= PHI_CHAIN (phi
);
3742 PHI_CHAIN (phi
) = prev
;
3745 set_phi_nodes (bb
, prev
);
3747 /* Add the arguments we have stored on edges. */
3748 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
3753 for (phi
= phi_nodes (bb
), var
= PENDING_STMT (e
);
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. */
3768 tree_forwarder_block_p (basic_block bb
)
3770 block_stmt_iterator bsi
;
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
)
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;
3790 /* Successors of the entry block are not forwarders. */
3791 FOR_EACH_EDGE (e
, ei
, ENTRY_BLOCK_PTR
->succs
)
3794 bb_ann (bb
)->forwardable
= 0;
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. */
3803 bb_ann (bb
)->forwardable
= 0;
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
))
3816 if (DECL_NONLOCAL (LABEL_EXPR_LABEL (stmt
)))
3821 bb_ann (bb
)->forwardable
= 0;
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. */
3839 basic_block bb
, dest
, tmp
, old_dest
, curr
, dom
;
3842 bool retval
= false;
3845 bb_ann (bb
)->forwardable
= 1;
3847 FOR_BB_BETWEEN (bb
, ENTRY_BLOCK_PTR
, EXIT_BLOCK_PTR
, next_bb
)
3851 /* Don't waste time on unreachable blocks. */
3852 if (EDGE_COUNT (bb
->preds
) == 0)
3855 /* Nor on forwarders. */
3856 if (tree_forwarder_block_p (bb
))
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
3862 bb_ann (bb
)->forwardable
= 0;
3864 /* Examine each of our block's successors to see if it is
3866 for (ei
= ei_start (bb
->succs
); (e
= ei_safe_edge (ei
)); )
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
))
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
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
)
3898 if (EDGE_SUCC (dest
, 0)->dest
== EXIT_BLOCK_PTR
)
3901 bb_ann (dest
)->forwardable
= 0;
3904 /* Reset the forwardable marks to 1. */
3907 tmp
= EDGE_SUCC (tmp
, 0)->dest
)
3908 bb_ann (tmp
)->forwardable
= 1;
3910 if (dest
== e
->dest
)
3916 old
= find_edge (bb
, dest
);
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. */
3928 /* That might mean that no forwarding at all is possible. */
3929 if (dest
== e
->dest
)
3935 old
= find_edge (bb
, dest
);
3939 /* Perform the redirection. */
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)
3954 EDGE_SUCC (curr
, 0)->count
-= count
;
3955 if (EDGE_SUCC (curr
, 0)->count
< 0)
3956 EDGE_SUCC (curr
, 0)->count
= 0;
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)
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
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;
4028 /* Return a non-special label in the head of basic block BLOCK.
4029 Create one if it doesn't exist. */
4032 tree_block_label (basic_block bb
)
4034 block_stmt_iterator i
, s
= bsi_start (bb
);
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
)
4043 label
= LABEL_EXPR_LABEL (stmt
);
4044 if (!DECL_NONLOCAL (label
))
4047 bsi_move_before (&i
, &s
);
4052 label
= create_artificial_label ();
4053 stmt
= build1 (LABEL_EXPR
, void_type_node
, label
);
4054 bsi_insert_before (&s
, stmt
, BSI_NEW_STMT
);
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. */
4066 tree_try_redirect_by_replacing_jump (edge e
, basic_block target
)
4068 basic_block src
= e
->src
;
4070 block_stmt_iterator b
;
4074 /* Verify that all targets will be TARGET. */
4075 FOR_EACH_EDGE (tmp
, ei
, src
->succs
)
4076 if (tmp
->dest
!= target
&& tmp
!= e
)
4085 stmt
= bsi_stmt (b
);
4087 if (TREE_CODE (stmt
) == COND_EXPR
4088 || TREE_CODE (stmt
) == SWITCH_EXPR
)
4091 e
= ssa_redirect_edge (e
, target
);
4092 e
->flags
= EDGE_FALLTHRU
;
4100 /* Redirect E to DEST. Return NULL on failure. Otherwise, return the
4101 edge representing the redirected branch. */
4104 tree_redirect_edge_and_branch (edge e
, basic_block dest
)
4106 basic_block bb
= e
->src
;
4107 block_stmt_iterator bsi
;
4111 if (e
->flags
& (EDGE_ABNORMAL_CALL
| EDGE_EH
))
4114 if (e
->src
!= ENTRY_BLOCK_PTR
4115 && (ret
= tree_try_redirect_by_replacing_jump (e
, dest
)))
4118 if (e
->dest
== dest
)
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
)
4129 stmt
= (e
->flags
& EDGE_TRUE_VALUE
4130 ? COND_EXPR_THEN (stmt
)
4131 : COND_EXPR_ELSE (stmt
));
4132 GOTO_DESTINATION (stmt
) = label
;
4136 /* No non-abnormal edges should lead from a non-simple goto, and
4137 simple ones should be represented implicitly. */
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
;
4156 e
->flags
|= EDGE_FALLTHRU
;
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
);
4166 /* Update/insert PHI nodes as necessary. */
4168 /* Now update the edges in the CFG. */
4169 e
= ssa_redirect_edge (e
, dest
);
4175 /* Simple wrapper, as we can always redirect fallthru edges. */
4178 tree_redirect_edge_and_branch_force (edge e
, basic_block dest
)
4180 e
= tree_redirect_edge_and_branch (e
, dest
);
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. */
4191 tree_split_block (basic_block bb
, void *stmt
)
4193 block_stmt_iterator bsi
, bsi_tgt
;
4199 new_bb
= create_empty_bb (bb
);
4201 /* Redirect the outgoing edges. */
4202 new_bb
->succs
= bb
->succs
;
4204 FOR_EACH_EDGE (e
, ei
, new_bb
->succs
)
4207 if (stmt
&& TREE_CODE ((tree
) stmt
) == LABEL_EXPR
)
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
)
4227 bsi_tgt
= bsi_start (new_bb
);
4228 while (!bsi_end_p (bsi
))
4230 act
= bsi_stmt (bsi
);
4232 bsi_insert_after (&bsi_tgt
, act
, BSI_NEW_STMT
);
4239 /* Moves basic block BB after block AFTER. */
4242 tree_move_block_after (basic_block bb
, basic_block after
)
4244 if (bb
->prev_bb
== after
)
4248 link_block (bb
, after
);
4254 /* Return true if basic_block can be duplicated. */
4257 tree_can_duplicate_bb_p (basic_block bb ATTRIBUTE_UNUSED
)
4262 /* Create a duplicate of the basic block BB. NOTE: This does not
4263 preserve SSA form. */
4266 tree_duplicate_bb (basic_block bb
)
4269 block_stmt_iterator bsi
, bsi_tgt
;
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
);
4291 if (TREE_CODE (stmt
) == LABEL_EXPR
)
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
);
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. */
4317 add_phi_args_after_copy_bb (basic_block bb_copy
)
4319 basic_block bb
, dest
;
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
))
4331 if (e_copy
->dest
->rbi
->duplicated
)
4332 dest
= e_copy
->dest
->rbi
->original
;
4334 dest
= e_copy
->dest
;
4336 e
= find_edge (bb
, dest
);
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
)
4347 gcc_assert (e
!= NULL
);
4350 for (phi
= phi_nodes (e
->dest
), phi_copy
= phi_nodes (e_copy
->dest
);
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. */
4368 add_phi_args_after_copy (basic_block
*region_copy
, unsigned n_region
)
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
4390 /* Hash function for ssa_name_map_entry. */
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. */
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
4413 allocate_ssa_names (bitmap definitions
, htab_t
*map
)
4416 struct ssa_name_map_entry
*entry
;
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
),
4433 entry
= xmalloc (sizeof (struct ssa_name_map_entry
));
4434 entry
->from_name
= name
;
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. */
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
));
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. */
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
)
4471 entry
= htab_find_with_hash (map
, name
, SSA_NAME_VERSION (name
));
4475 SET_USE (use
, entry
->to_name
);
4478 /* Rewrite the ssa names in basic block BB to new ones as specified by the
4482 rewrite_to_new_ssa_names_bb (basic_block bb
, htab_t map
)
4488 block_stmt_iterator bsi
;
4492 v_may_def_optype v_may_defs
;
4493 v_must_def_optype v_must_defs
;
4496 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
4497 if (e
->flags
& EDGE_ABNORMAL
)
4500 for (phi
= phi_nodes (bb
); phi
; phi
= TREE_CHAIN (phi
))
4502 rewrite_to_new_ssa_names_def (PHI_RESULT_PTR (phi
), phi
, map
);
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. */
4558 rewrite_to_new_ssa_names (basic_block
*region
, unsigned n_region
, htab_t map
)
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,
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
;
4588 htab_t ssa_name_map
= NULL
;
4592 if (!can_copy_bbs_p (region
, n_region
))
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
4600 for (i
= 0; i
< n_region
; i
++)
4602 /* We do not handle subloops, i.e. all the blocks must belong to the
4604 if (region
[i
]->loop_father
!= loop
)
4607 if (region
[i
] != entry
->dest
4608 && region
[i
] == loop
->header
)
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
))
4624 for (i
= 0; i
< n_region
; i
++)
4625 if (region
[i
] != exit
->src
4626 && dominated_by_p (CDI_DOMINATORS
, region
[i
], exit
->src
))
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
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 ();
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
);
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
);
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
)
4699 unmark_all_for_rewrite ();
4700 BITMAP_XFREE (definitions
);
4705 /* Dump FUNCTION_DECL FN to file FILE using FLAGS (see TDF_* in tree.h) */
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;
4715 fprintf (file
, "%s (", lang_hooks
.decl_printable_name (fn
, 2));
4717 arg
= DECL_ARGUMENTS (fn
);
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
);
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");
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");
4762 dump_generic_bb (file
, bb
, 2, flags
);
4764 fprintf (file
, "}\n");
4765 check_bb_profile (EXIT_BLOCK_PTR
, file
);
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
);
4786 if (!ignore_topmost_bind
)
4787 fprintf (file
, "{\n");
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. */
4812 print_pred_bbs (FILE *file
, basic_block bb
)
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. */
4825 print_succ_bbs (FILE *file
, basic_block bb
)
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. */
4838 print_loop (FILE *file
, struct loop
*loop
, int indent
)
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
);
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. */
4881 print_loop_ir (FILE *file
)
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. */
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,
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,
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. */
4927 need_fake_edge_p (tree t
)
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
);
4940 && !(call_expr_flags (call
) &
4941 (ECF_NORETURN
| ECF_LONGJMP
| ECF_ALWAYS_RETURN
)))
4944 if (TREE_CODE (t
) == ASM_EXPR
4945 && (ASM_VOLATILE_P (t
) || ASM_INPUT_P (t
)))
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. */
4961 tree_flow_call_edges_add (sbitmap blocks
)
4964 int blocks_split
= 0;
4965 int last_bb
= last_basic_block
;
4966 bool check_last_block
= false;
4968 if (n_basic_blocks
== 0)
4972 check_last_block
= true;
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
)
4991 basic_block bb
= EXIT_BLOCK_PTR
->prev_bb
;
4992 block_stmt_iterator bsi
= bsi_last (bb
);
4994 if (!bsi_end_p (bsi
))
4997 if (need_fake_edge_p (t
))
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
);
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
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
;
5023 if (blocks
&& !TEST_BIT (blocks
, i
))
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
))
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
)
5045 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
5046 gcc_assert (e
->dest
!= EXIT_BLOCK_PTR
);
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
);
5058 make_edge (bb
, EXIT_BLOCK_PTR
, EDGE_FAKE
);
5062 while (!bsi_end_p (bsi
));
5067 verify_flow_info ();
5069 return blocks_split
;
5073 tree_purge_dead_eh_edges (basic_block bb
)
5075 bool changed
= false;
5078 tree stmt
= last_stmt (bb
);
5080 if (stmt
&& tree_can_throw_internal (stmt
))
5083 for (ei
= ei_start (bb
->succs
); (e
= ei_safe_edge (ei
)); )
5085 if (e
->flags
& EDGE_EH
)
5087 ssa_remove_edge (e
);
5098 tree_purge_all_dead_eh_edges (bitmap blocks
)
5100 bool changed
= false;
5104 EXECUTE_IF_SET_IN_BITMAP (blocks
, 0, i
, bi
)
5106 changed
|= tree_purge_dead_eh_edges (BASIC_BLOCK (i
));
5112 struct cfg_hooks tree_cfg_hooks
= {
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. */
5140 split_critical_edges (void)
5148 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
5149 if (EDGE_CRITICAL_P (e
) && !(e
->flags
& EDGE_ABNORMAL
))
5156 struct tree_opt_pass pass_split_crit_edges
=
5158 "crited", /* name */
5160 split_critical_edges
, /* execute */
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 */
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. */
5180 gimplify_val (block_stmt_iterator
*bsi
, tree type
, tree exp
)
5182 tree t
, new_stmt
, orig_stmt
;
5184 if (is_gimple_val (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
);
5199 /* Build a ternary operation and gimplify it. Emit code before BSI.
5200 Return the gimple_val holding the result. */
5203 gimplify_build3 (block_stmt_iterator
*bsi
, enum tree_code code
,
5204 tree type
, tree a
, tree b
, tree c
)
5208 ret
= fold (build3 (code
, type
, a
, b
, c
));
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. */
5218 gimplify_build2 (block_stmt_iterator
*bsi
, enum tree_code code
,
5219 tree type
, tree a
, tree b
)
5223 ret
= fold (build2 (code
, type
, a
, b
));
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. */
5233 gimplify_build1 (block_stmt_iterator
*bsi
, enum tree_code code
, tree type
,
5238 ret
= fold (build1 (code
, type
, a
));
5241 return gimplify_val (bsi
, type
, ret
);
5246 /* Emit return warnings. */
5249 execute_warn_function_return (void)
5251 #ifdef USE_MAPPED_LOCATION
5252 source_location location
;
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%>",
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
;
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
)
5284 && (locus
= EXPR_LOCUS (last
)) != NULL
)
5288 #ifdef USE_MAPPED_LOCATION
5289 if (location
== UNKNOWN_LOCATION
)
5290 location
= cfun
->function_end_locus
;
5291 warning ("%H%<noreturn%> function does return", &location
);
5294 locus
= &cfun
->function_end_locus
;
5295 warning ("%H%<noreturn%> function does return", locus
);
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
);
5317 locus
= EXPR_LOCUS (last
);
5319 locus
= &cfun
->function_end_locus
;
5320 warning ("%Hcontrol reaches end of non-void function", locus
);
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. */
5335 extract_true_false_edges_from_block (basic_block b
,
5339 edge e
= EDGE_SUCC (b
, 0);
5341 if (e
->flags
& EDGE_TRUE_VALUE
)
5344 *false_edge
= EDGE_SUCC (b
, 1);
5349 *true_edge
= EDGE_SUCC (b
, 1);
5353 struct tree_opt_pass pass_warn_function_return
=
5357 execute_warn_function_return
, /* execute */
5360 0, /* static_pass_number */
5362 PROP_cfg
, /* properties_required */
5363 0, /* properties_provided */
5364 0, /* properties_destroyed */
5365 0, /* todo_flags_start */
5366 0, /* todo_flags_finish */
5370 #include "gt-tree-cfg.h"