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