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