2010-07-27 Paolo Carlini <paolo.carlini@oracle.com>
[official-gcc/alias-decl.git] / gcc / tree-cfg.c
blob413d7a9fb9780f71cd84b368e3e9a6e9e9bbbd0e
1 /* Control flow functions for trees.
2 Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
3 2010 Free Software Foundation, Inc.
4 Contributed by Diego Novillo <dnovillo@redhat.com>
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
11 any later version.
13 GCC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "tree.h"
27 #include "tm_p.h"
28 #include "basic-block.h"
29 #include "output.h"
30 #include "flags.h"
31 #include "function.h"
32 #include "ggc.h"
33 #include "langhooks.h"
34 #include "tree-pretty-print.h"
35 #include "gimple-pretty-print.h"
36 #include "tree-flow.h"
37 #include "timevar.h"
38 #include "tree-dump.h"
39 #include "tree-pass.h"
40 #include "diagnostic-core.h"
41 #include "toplev.h"
42 #include "except.h"
43 #include "cfgloop.h"
44 #include "cfglayout.h"
45 #include "tree-ssa-propagate.h"
46 #include "value-prof.h"
47 #include "pointer-set.h"
48 #include "tree-inline.h"
50 /* This file contains functions for building the Control Flow Graph (CFG)
51 for a function tree. */
53 /* Local declarations. */
55 /* Initial capacity for the basic block array. */
56 static const int initial_cfg_capacity = 20;
58 /* This hash table allows us to efficiently lookup all CASE_LABEL_EXPRs
59 which use a particular edge. The CASE_LABEL_EXPRs are chained together
60 via their TREE_CHAIN field, which we clear after we're done with the
61 hash table to prevent problems with duplication of GIMPLE_SWITCHes.
63 Access to this list of CASE_LABEL_EXPRs allows us to efficiently
64 update the case vector in response to edge redirections.
66 Right now this table is set up and torn down at key points in the
67 compilation process. It would be nice if we could make the table
68 more persistent. The key is getting notification of changes to
69 the CFG (particularly edge removal, creation and redirection). */
71 static struct pointer_map_t *edge_to_cases;
73 /* If we record edge_to_cases, this bitmap will hold indexes
74 of basic blocks that end in a GIMPLE_SWITCH which we touched
75 due to edge manipulations. */
77 static bitmap touched_switch_bbs;
79 /* CFG statistics. */
80 struct cfg_stats_d
82 long num_merged_labels;
85 static struct cfg_stats_d cfg_stats;
87 /* Nonzero if we found a computed goto while building basic blocks. */
88 static bool found_computed_goto;
90 /* Hash table to store last discriminator assigned for each locus. */
91 struct locus_discrim_map
93 location_t locus;
94 int discriminator;
96 static htab_t discriminator_per_locus;
98 /* Basic blocks and flowgraphs. */
99 static void make_blocks (gimple_seq);
100 static void factor_computed_gotos (void);
102 /* Edges. */
103 static void make_edges (void);
104 static void make_cond_expr_edges (basic_block);
105 static void make_gimple_switch_edges (basic_block);
106 static void make_goto_expr_edges (basic_block);
107 static void make_gimple_asm_edges (basic_block);
108 static unsigned int locus_map_hash (const void *);
109 static int locus_map_eq (const void *, const void *);
110 static void assign_discriminator (location_t, basic_block);
111 static edge gimple_redirect_edge_and_branch (edge, basic_block);
112 static edge gimple_try_redirect_by_replacing_jump (edge, basic_block);
113 static unsigned int split_critical_edges (void);
115 /* Various helpers. */
116 static inline bool stmt_starts_bb_p (gimple, gimple);
117 static int gimple_verify_flow_info (void);
118 static void gimple_make_forwarder_block (edge);
119 static void gimple_cfg2vcg (FILE *);
120 static gimple first_non_label_stmt (basic_block);
122 /* Flowgraph optimization and cleanup. */
123 static void gimple_merge_blocks (basic_block, basic_block);
124 static bool gimple_can_merge_blocks_p (basic_block, basic_block);
125 static void remove_bb (basic_block);
126 static edge find_taken_edge_computed_goto (basic_block, tree);
127 static edge find_taken_edge_cond_expr (basic_block, tree);
128 static edge find_taken_edge_switch_expr (basic_block, tree);
129 static tree find_case_label_for_value (gimple, tree);
130 static void group_case_labels_stmt (gimple);
132 void
133 init_empty_tree_cfg_for_function (struct function *fn)
135 /* Initialize the basic block array. */
136 init_flow (fn);
137 profile_status_for_function (fn) = PROFILE_ABSENT;
138 n_basic_blocks_for_function (fn) = NUM_FIXED_BLOCKS;
139 last_basic_block_for_function (fn) = NUM_FIXED_BLOCKS;
140 basic_block_info_for_function (fn)
141 = VEC_alloc (basic_block, gc, initial_cfg_capacity);
142 VEC_safe_grow_cleared (basic_block, gc,
143 basic_block_info_for_function (fn),
144 initial_cfg_capacity);
146 /* Build a mapping of labels to their associated blocks. */
147 label_to_block_map_for_function (fn)
148 = VEC_alloc (basic_block, gc, initial_cfg_capacity);
149 VEC_safe_grow_cleared (basic_block, gc,
150 label_to_block_map_for_function (fn),
151 initial_cfg_capacity);
153 SET_BASIC_BLOCK_FOR_FUNCTION (fn, ENTRY_BLOCK,
154 ENTRY_BLOCK_PTR_FOR_FUNCTION (fn));
155 SET_BASIC_BLOCK_FOR_FUNCTION (fn, EXIT_BLOCK,
156 EXIT_BLOCK_PTR_FOR_FUNCTION (fn));
158 ENTRY_BLOCK_PTR_FOR_FUNCTION (fn)->next_bb
159 = EXIT_BLOCK_PTR_FOR_FUNCTION (fn);
160 EXIT_BLOCK_PTR_FOR_FUNCTION (fn)->prev_bb
161 = ENTRY_BLOCK_PTR_FOR_FUNCTION (fn);
164 void
165 init_empty_tree_cfg (void)
167 init_empty_tree_cfg_for_function (cfun);
170 /*---------------------------------------------------------------------------
171 Create basic blocks
172 ---------------------------------------------------------------------------*/
174 /* Entry point to the CFG builder for trees. SEQ is the sequence of
175 statements to be added to the flowgraph. */
177 static void
178 build_gimple_cfg (gimple_seq seq)
180 /* Register specific gimple functions. */
181 gimple_register_cfg_hooks ();
183 memset ((void *) &cfg_stats, 0, sizeof (cfg_stats));
185 init_empty_tree_cfg ();
187 found_computed_goto = 0;
188 make_blocks (seq);
190 /* Computed gotos are hell to deal with, especially if there are
191 lots of them with a large number of destinations. So we factor
192 them to a common computed goto location before we build the
193 edge list. After we convert back to normal form, we will un-factor
194 the computed gotos since factoring introduces an unwanted jump. */
195 if (found_computed_goto)
196 factor_computed_gotos ();
198 /* Make sure there is always at least one block, even if it's empty. */
199 if (n_basic_blocks == NUM_FIXED_BLOCKS)
200 create_empty_bb (ENTRY_BLOCK_PTR);
202 /* Adjust the size of the array. */
203 if (VEC_length (basic_block, basic_block_info) < (size_t) n_basic_blocks)
204 VEC_safe_grow_cleared (basic_block, gc, basic_block_info, n_basic_blocks);
206 /* To speed up statement iterator walks, we first purge dead labels. */
207 cleanup_dead_labels ();
209 /* Group case nodes to reduce the number of edges.
210 We do this after cleaning up dead labels because otherwise we miss
211 a lot of obvious case merging opportunities. */
212 group_case_labels ();
214 /* Create the edges of the flowgraph. */
215 discriminator_per_locus = htab_create (13, locus_map_hash, locus_map_eq,
216 free);
217 make_edges ();
218 cleanup_dead_labels ();
219 htab_delete (discriminator_per_locus);
221 /* Debugging dumps. */
223 /* Write the flowgraph to a VCG file. */
225 int local_dump_flags;
226 FILE *vcg_file = dump_begin (TDI_vcg, &local_dump_flags);
227 if (vcg_file)
229 gimple_cfg2vcg (vcg_file);
230 dump_end (TDI_vcg, vcg_file);
234 #ifdef ENABLE_CHECKING
235 verify_stmts ();
236 #endif
239 static unsigned int
240 execute_build_cfg (void)
242 gimple_seq body = gimple_body (current_function_decl);
244 build_gimple_cfg (body);
245 gimple_set_body (current_function_decl, NULL);
246 if (dump_file && (dump_flags & TDF_DETAILS))
248 fprintf (dump_file, "Scope blocks:\n");
249 dump_scope_blocks (dump_file, dump_flags);
251 return 0;
254 struct gimple_opt_pass pass_build_cfg =
257 GIMPLE_PASS,
258 "cfg", /* name */
259 NULL, /* gate */
260 execute_build_cfg, /* execute */
261 NULL, /* sub */
262 NULL, /* next */
263 0, /* static_pass_number */
264 TV_TREE_CFG, /* tv_id */
265 PROP_gimple_leh, /* properties_required */
266 PROP_cfg, /* properties_provided */
267 0, /* properties_destroyed */
268 0, /* todo_flags_start */
269 TODO_verify_stmts | TODO_cleanup_cfg
270 | TODO_dump_func /* todo_flags_finish */
275 /* Return true if T is a computed goto. */
277 static bool
278 computed_goto_p (gimple t)
280 return (gimple_code (t) == GIMPLE_GOTO
281 && TREE_CODE (gimple_goto_dest (t)) != LABEL_DECL);
285 /* Search the CFG for any computed gotos. If found, factor them to a
286 common computed goto site. Also record the location of that site so
287 that we can un-factor the gotos after we have converted back to
288 normal form. */
290 static void
291 factor_computed_gotos (void)
293 basic_block bb;
294 tree factored_label_decl = NULL;
295 tree var = NULL;
296 gimple factored_computed_goto_label = NULL;
297 gimple factored_computed_goto = NULL;
299 /* We know there are one or more computed gotos in this function.
300 Examine the last statement in each basic block to see if the block
301 ends with a computed goto. */
303 FOR_EACH_BB (bb)
305 gimple_stmt_iterator gsi = gsi_last_bb (bb);
306 gimple last;
308 if (gsi_end_p (gsi))
309 continue;
311 last = gsi_stmt (gsi);
313 /* Ignore the computed goto we create when we factor the original
314 computed gotos. */
315 if (last == factored_computed_goto)
316 continue;
318 /* If the last statement is a computed goto, factor it. */
319 if (computed_goto_p (last))
321 gimple assignment;
323 /* The first time we find a computed goto we need to create
324 the factored goto block and the variable each original
325 computed goto will use for their goto destination. */
326 if (!factored_computed_goto)
328 basic_block new_bb = create_empty_bb (bb);
329 gimple_stmt_iterator new_gsi = gsi_start_bb (new_bb);
331 /* Create the destination of the factored goto. Each original
332 computed goto will put its desired destination into this
333 variable and jump to the label we create immediately
334 below. */
335 var = create_tmp_var (ptr_type_node, "gotovar");
337 /* Build a label for the new block which will contain the
338 factored computed goto. */
339 factored_label_decl = create_artificial_label (UNKNOWN_LOCATION);
340 factored_computed_goto_label
341 = gimple_build_label (factored_label_decl);
342 gsi_insert_after (&new_gsi, factored_computed_goto_label,
343 GSI_NEW_STMT);
345 /* Build our new computed goto. */
346 factored_computed_goto = gimple_build_goto (var);
347 gsi_insert_after (&new_gsi, factored_computed_goto, GSI_NEW_STMT);
350 /* Copy the original computed goto's destination into VAR. */
351 assignment = gimple_build_assign (var, gimple_goto_dest (last));
352 gsi_insert_before (&gsi, assignment, GSI_SAME_STMT);
354 /* And re-vector the computed goto to the new destination. */
355 gimple_goto_set_dest (last, factored_label_decl);
361 /* Build a flowgraph for the sequence of stmts SEQ. */
363 static void
364 make_blocks (gimple_seq seq)
366 gimple_stmt_iterator i = gsi_start (seq);
367 gimple stmt = NULL;
368 bool start_new_block = true;
369 bool first_stmt_of_seq = true;
370 basic_block bb = ENTRY_BLOCK_PTR;
372 while (!gsi_end_p (i))
374 gimple prev_stmt;
376 prev_stmt = stmt;
377 stmt = gsi_stmt (i);
379 /* If the statement starts a new basic block or if we have determined
380 in a previous pass that we need to create a new block for STMT, do
381 so now. */
382 if (start_new_block || stmt_starts_bb_p (stmt, prev_stmt))
384 if (!first_stmt_of_seq)
385 seq = gsi_split_seq_before (&i);
386 bb = create_basic_block (seq, NULL, bb);
387 start_new_block = false;
390 /* Now add STMT to BB and create the subgraphs for special statement
391 codes. */
392 gimple_set_bb (stmt, bb);
394 if (computed_goto_p (stmt))
395 found_computed_goto = true;
397 /* If STMT is a basic block terminator, set START_NEW_BLOCK for the
398 next iteration. */
399 if (stmt_ends_bb_p (stmt))
401 /* If the stmt can make abnormal goto use a new temporary
402 for the assignment to the LHS. This makes sure the old value
403 of the LHS is available on the abnormal edge. Otherwise
404 we will end up with overlapping life-ranges for abnormal
405 SSA names. */
406 if (gimple_has_lhs (stmt)
407 && stmt_can_make_abnormal_goto (stmt)
408 && is_gimple_reg_type (TREE_TYPE (gimple_get_lhs (stmt))))
410 tree lhs = gimple_get_lhs (stmt);
411 tree tmp = create_tmp_var (TREE_TYPE (lhs), NULL);
412 gimple s = gimple_build_assign (lhs, tmp);
413 gimple_set_location (s, gimple_location (stmt));
414 gimple_set_block (s, gimple_block (stmt));
415 gimple_set_lhs (stmt, tmp);
416 if (TREE_CODE (TREE_TYPE (tmp)) == COMPLEX_TYPE
417 || TREE_CODE (TREE_TYPE (tmp)) == VECTOR_TYPE)
418 DECL_GIMPLE_REG_P (tmp) = 1;
419 gsi_insert_after (&i, s, GSI_SAME_STMT);
421 start_new_block = true;
424 gsi_next (&i);
425 first_stmt_of_seq = false;
430 /* Create and return a new empty basic block after bb AFTER. */
432 static basic_block
433 create_bb (void *h, void *e, basic_block after)
435 basic_block bb;
437 gcc_assert (!e);
439 /* Create and initialize a new basic block. Since alloc_block uses
440 GC allocation that clears memory to allocate a basic block, we do
441 not have to clear the newly allocated basic block here. */
442 bb = alloc_block ();
444 bb->index = last_basic_block;
445 bb->flags = BB_NEW;
446 bb->il.gimple = ggc_alloc_cleared_gimple_bb_info ();
447 set_bb_seq (bb, h ? (gimple_seq) h : gimple_seq_alloc ());
449 /* Add the new block to the linked list of blocks. */
450 link_block (bb, after);
452 /* Grow the basic block array if needed. */
453 if ((size_t) last_basic_block == VEC_length (basic_block, basic_block_info))
455 size_t new_size = last_basic_block + (last_basic_block + 3) / 4;
456 VEC_safe_grow_cleared (basic_block, gc, basic_block_info, new_size);
459 /* Add the newly created block to the array. */
460 SET_BASIC_BLOCK (last_basic_block, bb);
462 n_basic_blocks++;
463 last_basic_block++;
465 return bb;
469 /*---------------------------------------------------------------------------
470 Edge creation
471 ---------------------------------------------------------------------------*/
473 /* Fold COND_EXPR_COND of each COND_EXPR. */
475 void
476 fold_cond_expr_cond (void)
478 basic_block bb;
480 FOR_EACH_BB (bb)
482 gimple stmt = last_stmt (bb);
484 if (stmt && gimple_code (stmt) == GIMPLE_COND)
486 location_t loc = gimple_location (stmt);
487 tree cond;
488 bool zerop, onep;
490 fold_defer_overflow_warnings ();
491 cond = fold_binary_loc (loc, gimple_cond_code (stmt), boolean_type_node,
492 gimple_cond_lhs (stmt), gimple_cond_rhs (stmt));
493 if (cond)
495 zerop = integer_zerop (cond);
496 onep = integer_onep (cond);
498 else
499 zerop = onep = false;
501 fold_undefer_overflow_warnings (zerop || onep,
502 stmt,
503 WARN_STRICT_OVERFLOW_CONDITIONAL);
504 if (zerop)
505 gimple_cond_make_false (stmt);
506 else if (onep)
507 gimple_cond_make_true (stmt);
512 /* Join all the blocks in the flowgraph. */
514 static void
515 make_edges (void)
517 basic_block bb;
518 struct omp_region *cur_region = NULL;
520 /* Create an edge from entry to the first block with executable
521 statements in it. */
522 make_edge (ENTRY_BLOCK_PTR, BASIC_BLOCK (NUM_FIXED_BLOCKS), EDGE_FALLTHRU);
524 /* Traverse the basic block array placing edges. */
525 FOR_EACH_BB (bb)
527 gimple last = last_stmt (bb);
528 bool fallthru;
530 if (last)
532 enum gimple_code code = gimple_code (last);
533 switch (code)
535 case GIMPLE_GOTO:
536 make_goto_expr_edges (bb);
537 fallthru = false;
538 break;
539 case GIMPLE_RETURN:
540 make_edge (bb, EXIT_BLOCK_PTR, 0);
541 fallthru = false;
542 break;
543 case GIMPLE_COND:
544 make_cond_expr_edges (bb);
545 fallthru = false;
546 break;
547 case GIMPLE_SWITCH:
548 make_gimple_switch_edges (bb);
549 fallthru = false;
550 break;
551 case GIMPLE_RESX:
552 make_eh_edges (last);
553 fallthru = false;
554 break;
555 case GIMPLE_EH_DISPATCH:
556 fallthru = make_eh_dispatch_edges (last);
557 break;
559 case GIMPLE_CALL:
560 /* If this function receives a nonlocal goto, then we need to
561 make edges from this call site to all the nonlocal goto
562 handlers. */
563 if (stmt_can_make_abnormal_goto (last))
564 make_abnormal_goto_edges (bb, true);
566 /* If this statement has reachable exception handlers, then
567 create abnormal edges to them. */
568 make_eh_edges (last);
570 /* BUILTIN_RETURN is really a return statement. */
571 if (gimple_call_builtin_p (last, BUILT_IN_RETURN))
572 make_edge (bb, EXIT_BLOCK_PTR, 0), fallthru = false;
573 /* Some calls are known not to return. */
574 else
575 fallthru = !(gimple_call_flags (last) & ECF_NORETURN);
576 break;
578 case GIMPLE_ASSIGN:
579 /* A GIMPLE_ASSIGN may throw internally and thus be considered
580 control-altering. */
581 if (is_ctrl_altering_stmt (last))
582 make_eh_edges (last);
583 fallthru = true;
584 break;
586 case GIMPLE_ASM:
587 make_gimple_asm_edges (bb);
588 fallthru = true;
589 break;
591 case GIMPLE_OMP_PARALLEL:
592 case GIMPLE_OMP_TASK:
593 case GIMPLE_OMP_FOR:
594 case GIMPLE_OMP_SINGLE:
595 case GIMPLE_OMP_MASTER:
596 case GIMPLE_OMP_ORDERED:
597 case GIMPLE_OMP_CRITICAL:
598 case GIMPLE_OMP_SECTION:
599 cur_region = new_omp_region (bb, code, cur_region);
600 fallthru = true;
601 break;
603 case GIMPLE_OMP_SECTIONS:
604 cur_region = new_omp_region (bb, code, cur_region);
605 fallthru = true;
606 break;
608 case GIMPLE_OMP_SECTIONS_SWITCH:
609 fallthru = false;
610 break;
612 case GIMPLE_OMP_ATOMIC_LOAD:
613 case GIMPLE_OMP_ATOMIC_STORE:
614 fallthru = true;
615 break;
617 case GIMPLE_OMP_RETURN:
618 /* In the case of a GIMPLE_OMP_SECTION, the edge will go
619 somewhere other than the next block. This will be
620 created later. */
621 cur_region->exit = bb;
622 fallthru = cur_region->type != GIMPLE_OMP_SECTION;
623 cur_region = cur_region->outer;
624 break;
626 case GIMPLE_OMP_CONTINUE:
627 cur_region->cont = bb;
628 switch (cur_region->type)
630 case GIMPLE_OMP_FOR:
631 /* Mark all GIMPLE_OMP_FOR and GIMPLE_OMP_CONTINUE
632 succs edges as abnormal to prevent splitting
633 them. */
634 single_succ_edge (cur_region->entry)->flags |= EDGE_ABNORMAL;
635 /* Make the loopback edge. */
636 make_edge (bb, single_succ (cur_region->entry),
637 EDGE_ABNORMAL);
639 /* Create an edge from GIMPLE_OMP_FOR to exit, which
640 corresponds to the case that the body of the loop
641 is not executed at all. */
642 make_edge (cur_region->entry, bb->next_bb, EDGE_ABNORMAL);
643 make_edge (bb, bb->next_bb, EDGE_FALLTHRU | EDGE_ABNORMAL);
644 fallthru = false;
645 break;
647 case GIMPLE_OMP_SECTIONS:
648 /* Wire up the edges into and out of the nested sections. */
650 basic_block switch_bb = single_succ (cur_region->entry);
652 struct omp_region *i;
653 for (i = cur_region->inner; i ; i = i->next)
655 gcc_assert (i->type == GIMPLE_OMP_SECTION);
656 make_edge (switch_bb, i->entry, 0);
657 make_edge (i->exit, bb, EDGE_FALLTHRU);
660 /* Make the loopback edge to the block with
661 GIMPLE_OMP_SECTIONS_SWITCH. */
662 make_edge (bb, switch_bb, 0);
664 /* Make the edge from the switch to exit. */
665 make_edge (switch_bb, bb->next_bb, 0);
666 fallthru = false;
668 break;
670 default:
671 gcc_unreachable ();
673 break;
675 default:
676 gcc_assert (!stmt_ends_bb_p (last));
677 fallthru = true;
680 else
681 fallthru = true;
683 if (fallthru)
685 make_edge (bb, bb->next_bb, EDGE_FALLTHRU);
686 if (last)
687 assign_discriminator (gimple_location (last), bb->next_bb);
691 if (root_omp_region)
692 free_omp_regions ();
694 /* Fold COND_EXPR_COND of each COND_EXPR. */
695 fold_cond_expr_cond ();
698 /* Trivial hash function for a location_t. ITEM is a pointer to
699 a hash table entry that maps a location_t to a discriminator. */
701 static unsigned int
702 locus_map_hash (const void *item)
704 return ((const struct locus_discrim_map *) item)->locus;
707 /* Equality function for the locus-to-discriminator map. VA and VB
708 point to the two hash table entries to compare. */
710 static int
711 locus_map_eq (const void *va, const void *vb)
713 const struct locus_discrim_map *a = (const struct locus_discrim_map *) va;
714 const struct locus_discrim_map *b = (const struct locus_discrim_map *) vb;
715 return a->locus == b->locus;
718 /* Find the next available discriminator value for LOCUS. The
719 discriminator distinguishes among several basic blocks that
720 share a common locus, allowing for more accurate sample-based
721 profiling. */
723 static int
724 next_discriminator_for_locus (location_t locus)
726 struct locus_discrim_map item;
727 struct locus_discrim_map **slot;
729 item.locus = locus;
730 item.discriminator = 0;
731 slot = (struct locus_discrim_map **)
732 htab_find_slot_with_hash (discriminator_per_locus, (void *) &item,
733 (hashval_t) locus, INSERT);
734 gcc_assert (slot);
735 if (*slot == HTAB_EMPTY_ENTRY)
737 *slot = XNEW (struct locus_discrim_map);
738 gcc_assert (*slot);
739 (*slot)->locus = locus;
740 (*slot)->discriminator = 0;
742 (*slot)->discriminator++;
743 return (*slot)->discriminator;
746 /* Return TRUE if LOCUS1 and LOCUS2 refer to the same source line. */
748 static bool
749 same_line_p (location_t locus1, location_t locus2)
751 expanded_location from, to;
753 if (locus1 == locus2)
754 return true;
756 from = expand_location (locus1);
757 to = expand_location (locus2);
759 if (from.line != to.line)
760 return false;
761 if (from.file == to.file)
762 return true;
763 return (from.file != NULL
764 && to.file != NULL
765 && strcmp (from.file, to.file) == 0);
768 /* Assign a unique discriminator value to block BB if it begins at the same
769 LOCUS as its predecessor block. */
771 static void
772 assign_discriminator (location_t locus, basic_block bb)
774 gimple first_in_to_bb, last_in_to_bb;
776 if (locus == 0 || bb->discriminator != 0)
777 return;
779 first_in_to_bb = first_non_label_stmt (bb);
780 last_in_to_bb = last_stmt (bb);
781 if ((first_in_to_bb && same_line_p (locus, gimple_location (first_in_to_bb)))
782 || (last_in_to_bb && same_line_p (locus, gimple_location (last_in_to_bb))))
783 bb->discriminator = next_discriminator_for_locus (locus);
786 /* Create the edges for a GIMPLE_COND starting at block BB. */
788 static void
789 make_cond_expr_edges (basic_block bb)
791 gimple entry = last_stmt (bb);
792 gimple then_stmt, else_stmt;
793 basic_block then_bb, else_bb;
794 tree then_label, else_label;
795 edge e;
796 location_t entry_locus;
798 gcc_assert (entry);
799 gcc_assert (gimple_code (entry) == GIMPLE_COND);
801 entry_locus = gimple_location (entry);
803 /* Entry basic blocks for each component. */
804 then_label = gimple_cond_true_label (entry);
805 else_label = gimple_cond_false_label (entry);
806 then_bb = label_to_block (then_label);
807 else_bb = label_to_block (else_label);
808 then_stmt = first_stmt (then_bb);
809 else_stmt = first_stmt (else_bb);
811 e = make_edge (bb, then_bb, EDGE_TRUE_VALUE);
812 assign_discriminator (entry_locus, then_bb);
813 e->goto_locus = gimple_location (then_stmt);
814 if (e->goto_locus)
815 e->goto_block = gimple_block (then_stmt);
816 e = make_edge (bb, else_bb, EDGE_FALSE_VALUE);
817 if (e)
819 assign_discriminator (entry_locus, else_bb);
820 e->goto_locus = gimple_location (else_stmt);
821 if (e->goto_locus)
822 e->goto_block = gimple_block (else_stmt);
825 /* We do not need the labels anymore. */
826 gimple_cond_set_true_label (entry, NULL_TREE);
827 gimple_cond_set_false_label (entry, NULL_TREE);
831 /* Called for each element in the hash table (P) as we delete the
832 edge to cases hash table.
834 Clear all the TREE_CHAINs to prevent problems with copying of
835 SWITCH_EXPRs and structure sharing rules, then free the hash table
836 element. */
838 static bool
839 edge_to_cases_cleanup (const void *key ATTRIBUTE_UNUSED, void **value,
840 void *data ATTRIBUTE_UNUSED)
842 tree t, next;
844 for (t = (tree) *value; t; t = next)
846 next = TREE_CHAIN (t);
847 TREE_CHAIN (t) = NULL;
850 *value = NULL;
851 return false;
854 /* Start recording information mapping edges to case labels. */
856 void
857 start_recording_case_labels (void)
859 gcc_assert (edge_to_cases == NULL);
860 edge_to_cases = pointer_map_create ();
861 touched_switch_bbs = BITMAP_ALLOC (NULL);
864 /* Return nonzero if we are recording information for case labels. */
866 static bool
867 recording_case_labels_p (void)
869 return (edge_to_cases != NULL);
872 /* Stop recording information mapping edges to case labels and
873 remove any information we have recorded. */
874 void
875 end_recording_case_labels (void)
877 bitmap_iterator bi;
878 unsigned i;
879 pointer_map_traverse (edge_to_cases, edge_to_cases_cleanup, NULL);
880 pointer_map_destroy (edge_to_cases);
881 edge_to_cases = NULL;
882 EXECUTE_IF_SET_IN_BITMAP (touched_switch_bbs, 0, i, bi)
884 basic_block bb = BASIC_BLOCK (i);
885 if (bb)
887 gimple stmt = last_stmt (bb);
888 if (stmt && gimple_code (stmt) == GIMPLE_SWITCH)
889 group_case_labels_stmt (stmt);
892 BITMAP_FREE (touched_switch_bbs);
895 /* If we are inside a {start,end}_recording_cases block, then return
896 a chain of CASE_LABEL_EXPRs from T which reference E.
898 Otherwise return NULL. */
900 static tree
901 get_cases_for_edge (edge e, gimple t)
903 void **slot;
904 size_t i, n;
906 /* If we are not recording cases, then we do not have CASE_LABEL_EXPR
907 chains available. Return NULL so the caller can detect this case. */
908 if (!recording_case_labels_p ())
909 return NULL;
911 slot = pointer_map_contains (edge_to_cases, e);
912 if (slot)
913 return (tree) *slot;
915 /* If we did not find E in the hash table, then this must be the first
916 time we have been queried for information about E & T. Add all the
917 elements from T to the hash table then perform the query again. */
919 n = gimple_switch_num_labels (t);
920 for (i = 0; i < n; i++)
922 tree elt = gimple_switch_label (t, i);
923 tree lab = CASE_LABEL (elt);
924 basic_block label_bb = label_to_block (lab);
925 edge this_edge = find_edge (e->src, label_bb);
927 /* Add it to the chain of CASE_LABEL_EXPRs referencing E, or create
928 a new chain. */
929 slot = pointer_map_insert (edge_to_cases, this_edge);
930 TREE_CHAIN (elt) = (tree) *slot;
931 *slot = elt;
934 return (tree) *pointer_map_contains (edge_to_cases, e);
937 /* Create the edges for a GIMPLE_SWITCH starting at block BB. */
939 static void
940 make_gimple_switch_edges (basic_block bb)
942 gimple entry = last_stmt (bb);
943 location_t entry_locus;
944 size_t i, n;
946 entry_locus = gimple_location (entry);
948 n = gimple_switch_num_labels (entry);
950 for (i = 0; i < n; ++i)
952 tree lab = CASE_LABEL (gimple_switch_label (entry, i));
953 basic_block label_bb = label_to_block (lab);
954 make_edge (bb, label_bb, 0);
955 assign_discriminator (entry_locus, label_bb);
960 /* Return the basic block holding label DEST. */
962 basic_block
963 label_to_block_fn (struct function *ifun, tree dest)
965 int uid = LABEL_DECL_UID (dest);
967 /* We would die hard when faced by an undefined label. Emit a label to
968 the very first basic block. This will hopefully make even the dataflow
969 and undefined variable warnings quite right. */
970 if (seen_error () && uid < 0)
972 gimple_stmt_iterator gsi = gsi_start_bb (BASIC_BLOCK (NUM_FIXED_BLOCKS));
973 gimple stmt;
975 stmt = gimple_build_label (dest);
976 gsi_insert_before (&gsi, stmt, GSI_NEW_STMT);
977 uid = LABEL_DECL_UID (dest);
979 if (VEC_length (basic_block, ifun->cfg->x_label_to_block_map)
980 <= (unsigned int) uid)
981 return NULL;
982 return VEC_index (basic_block, ifun->cfg->x_label_to_block_map, uid);
985 /* Create edges for an abnormal goto statement at block BB. If FOR_CALL
986 is true, the source statement is a CALL_EXPR instead of a GOTO_EXPR. */
988 void
989 make_abnormal_goto_edges (basic_block bb, bool for_call)
991 basic_block target_bb;
992 gimple_stmt_iterator gsi;
994 FOR_EACH_BB (target_bb)
995 for (gsi = gsi_start_bb (target_bb); !gsi_end_p (gsi); gsi_next (&gsi))
997 gimple label_stmt = gsi_stmt (gsi);
998 tree target;
1000 if (gimple_code (label_stmt) != GIMPLE_LABEL)
1001 break;
1003 target = gimple_label_label (label_stmt);
1005 /* Make an edge to every label block that has been marked as a
1006 potential target for a computed goto or a non-local goto. */
1007 if ((FORCED_LABEL (target) && !for_call)
1008 || (DECL_NONLOCAL (target) && for_call))
1010 make_edge (bb, target_bb, EDGE_ABNORMAL);
1011 break;
1016 /* Create edges for a goto statement at block BB. */
1018 static void
1019 make_goto_expr_edges (basic_block bb)
1021 gimple_stmt_iterator last = gsi_last_bb (bb);
1022 gimple goto_t = gsi_stmt (last);
1024 /* A simple GOTO creates normal edges. */
1025 if (simple_goto_p (goto_t))
1027 tree dest = gimple_goto_dest (goto_t);
1028 basic_block label_bb = label_to_block (dest);
1029 edge e = make_edge (bb, label_bb, EDGE_FALLTHRU);
1030 e->goto_locus = gimple_location (goto_t);
1031 assign_discriminator (e->goto_locus, label_bb);
1032 if (e->goto_locus)
1033 e->goto_block = gimple_block (goto_t);
1034 gsi_remove (&last, true);
1035 return;
1038 /* A computed GOTO creates abnormal edges. */
1039 make_abnormal_goto_edges (bb, false);
1042 /* Create edges for an asm statement with labels at block BB. */
1044 static void
1045 make_gimple_asm_edges (basic_block bb)
1047 gimple stmt = last_stmt (bb);
1048 location_t stmt_loc = gimple_location (stmt);
1049 int i, n = gimple_asm_nlabels (stmt);
1051 for (i = 0; i < n; ++i)
1053 tree label = TREE_VALUE (gimple_asm_label_op (stmt, i));
1054 basic_block label_bb = label_to_block (label);
1055 make_edge (bb, label_bb, 0);
1056 assign_discriminator (stmt_loc, label_bb);
1060 /*---------------------------------------------------------------------------
1061 Flowgraph analysis
1062 ---------------------------------------------------------------------------*/
1064 /* Cleanup useless labels in basic blocks. This is something we wish
1065 to do early because it allows us to group case labels before creating
1066 the edges for the CFG, and it speeds up block statement iterators in
1067 all passes later on.
1068 We rerun this pass after CFG is created, to get rid of the labels that
1069 are no longer referenced. After then we do not run it any more, since
1070 (almost) no new labels should be created. */
1072 /* A map from basic block index to the leading label of that block. */
1073 static struct label_record
1075 /* The label. */
1076 tree label;
1078 /* True if the label is referenced from somewhere. */
1079 bool used;
1080 } *label_for_bb;
1082 /* Given LABEL return the first label in the same basic block. */
1084 static tree
1085 main_block_label (tree label)
1087 basic_block bb = label_to_block (label);
1088 tree main_label = label_for_bb[bb->index].label;
1090 /* label_to_block possibly inserted undefined label into the chain. */
1091 if (!main_label)
1093 label_for_bb[bb->index].label = label;
1094 main_label = label;
1097 label_for_bb[bb->index].used = true;
1098 return main_label;
1101 /* Clean up redundant labels within the exception tree. */
1103 static void
1104 cleanup_dead_labels_eh (void)
1106 eh_landing_pad lp;
1107 eh_region r;
1108 tree lab;
1109 int i;
1111 if (cfun->eh == NULL)
1112 return;
1114 for (i = 1; VEC_iterate (eh_landing_pad, cfun->eh->lp_array, i, lp); ++i)
1115 if (lp && lp->post_landing_pad)
1117 lab = main_block_label (lp->post_landing_pad);
1118 if (lab != lp->post_landing_pad)
1120 EH_LANDING_PAD_NR (lp->post_landing_pad) = 0;
1121 EH_LANDING_PAD_NR (lab) = lp->index;
1125 FOR_ALL_EH_REGION (r)
1126 switch (r->type)
1128 case ERT_CLEANUP:
1129 case ERT_MUST_NOT_THROW:
1130 break;
1132 case ERT_TRY:
1134 eh_catch c;
1135 for (c = r->u.eh_try.first_catch; c ; c = c->next_catch)
1137 lab = c->label;
1138 if (lab)
1139 c->label = main_block_label (lab);
1142 break;
1144 case ERT_ALLOWED_EXCEPTIONS:
1145 lab = r->u.allowed.label;
1146 if (lab)
1147 r->u.allowed.label = main_block_label (lab);
1148 break;
1153 /* Cleanup redundant labels. This is a three-step process:
1154 1) Find the leading label for each block.
1155 2) Redirect all references to labels to the leading labels.
1156 3) Cleanup all useless labels. */
1158 void
1159 cleanup_dead_labels (void)
1161 basic_block bb;
1162 label_for_bb = XCNEWVEC (struct label_record, last_basic_block);
1164 /* Find a suitable label for each block. We use the first user-defined
1165 label if there is one, or otherwise just the first label we see. */
1166 FOR_EACH_BB (bb)
1168 gimple_stmt_iterator i;
1170 for (i = gsi_start_bb (bb); !gsi_end_p (i); gsi_next (&i))
1172 tree label;
1173 gimple stmt = gsi_stmt (i);
1175 if (gimple_code (stmt) != GIMPLE_LABEL)
1176 break;
1178 label = gimple_label_label (stmt);
1180 /* If we have not yet seen a label for the current block,
1181 remember this one and see if there are more labels. */
1182 if (!label_for_bb[bb->index].label)
1184 label_for_bb[bb->index].label = label;
1185 continue;
1188 /* If we did see a label for the current block already, but it
1189 is an artificially created label, replace it if the current
1190 label is a user defined label. */
1191 if (!DECL_ARTIFICIAL (label)
1192 && DECL_ARTIFICIAL (label_for_bb[bb->index].label))
1194 label_for_bb[bb->index].label = label;
1195 break;
1200 /* Now redirect all jumps/branches to the selected label.
1201 First do so for each block ending in a control statement. */
1202 FOR_EACH_BB (bb)
1204 gimple stmt = last_stmt (bb);
1205 if (!stmt)
1206 continue;
1208 switch (gimple_code (stmt))
1210 case GIMPLE_COND:
1212 tree true_label = gimple_cond_true_label (stmt);
1213 tree false_label = gimple_cond_false_label (stmt);
1215 if (true_label)
1216 gimple_cond_set_true_label (stmt, main_block_label (true_label));
1217 if (false_label)
1218 gimple_cond_set_false_label (stmt, main_block_label (false_label));
1219 break;
1222 case GIMPLE_SWITCH:
1224 size_t i, n = gimple_switch_num_labels (stmt);
1226 /* Replace all destination labels. */
1227 for (i = 0; i < n; ++i)
1229 tree case_label = gimple_switch_label (stmt, i);
1230 tree label = main_block_label (CASE_LABEL (case_label));
1231 CASE_LABEL (case_label) = label;
1233 break;
1236 case GIMPLE_ASM:
1238 int i, n = gimple_asm_nlabels (stmt);
1240 for (i = 0; i < n; ++i)
1242 tree cons = gimple_asm_label_op (stmt, i);
1243 tree label = main_block_label (TREE_VALUE (cons));
1244 TREE_VALUE (cons) = label;
1246 break;
1249 /* We have to handle gotos until they're removed, and we don't
1250 remove them until after we've created the CFG edges. */
1251 case GIMPLE_GOTO:
1252 if (!computed_goto_p (stmt))
1254 tree new_dest = main_block_label (gimple_goto_dest (stmt));
1255 gimple_goto_set_dest (stmt, new_dest);
1257 break;
1259 default:
1260 break;
1264 /* Do the same for the exception region tree labels. */
1265 cleanup_dead_labels_eh ();
1267 /* Finally, purge dead labels. All user-defined labels and labels that
1268 can be the target of non-local gotos and labels which have their
1269 address taken are preserved. */
1270 FOR_EACH_BB (bb)
1272 gimple_stmt_iterator i;
1273 tree label_for_this_bb = label_for_bb[bb->index].label;
1275 if (!label_for_this_bb)
1276 continue;
1278 /* If the main label of the block is unused, we may still remove it. */
1279 if (!label_for_bb[bb->index].used)
1280 label_for_this_bb = NULL;
1282 for (i = gsi_start_bb (bb); !gsi_end_p (i); )
1284 tree label;
1285 gimple stmt = gsi_stmt (i);
1287 if (gimple_code (stmt) != GIMPLE_LABEL)
1288 break;
1290 label = gimple_label_label (stmt);
1292 if (label == label_for_this_bb
1293 || !DECL_ARTIFICIAL (label)
1294 || DECL_NONLOCAL (label)
1295 || FORCED_LABEL (label))
1296 gsi_next (&i);
1297 else
1298 gsi_remove (&i, true);
1302 free (label_for_bb);
1305 /* Scan the sorted vector of cases in STMT (a GIMPLE_SWITCH) and combine
1306 the ones jumping to the same label.
1307 Eg. three separate entries 1: 2: 3: become one entry 1..3: */
1309 static void
1310 group_case_labels_stmt (gimple stmt)
1312 int old_size = gimple_switch_num_labels (stmt);
1313 int i, j, new_size = old_size;
1314 tree default_case = NULL_TREE;
1315 tree default_label = NULL_TREE;
1316 bool has_default;
1318 /* The default label is always the first case in a switch
1319 statement after gimplification if it was not optimized
1320 away */
1321 if (!CASE_LOW (gimple_switch_default_label (stmt))
1322 && !CASE_HIGH (gimple_switch_default_label (stmt)))
1324 default_case = gimple_switch_default_label (stmt);
1325 default_label = CASE_LABEL (default_case);
1326 has_default = true;
1328 else
1329 has_default = false;
1331 /* Look for possible opportunities to merge cases. */
1332 if (has_default)
1333 i = 1;
1334 else
1335 i = 0;
1336 while (i < old_size)
1338 tree base_case, base_label, base_high;
1339 base_case = gimple_switch_label (stmt, i);
1341 gcc_assert (base_case);
1342 base_label = CASE_LABEL (base_case);
1344 /* Discard cases that have the same destination as the
1345 default case. */
1346 if (base_label == default_label)
1348 gimple_switch_set_label (stmt, i, NULL_TREE);
1349 i++;
1350 new_size--;
1351 continue;
1354 base_high = CASE_HIGH (base_case)
1355 ? CASE_HIGH (base_case)
1356 : CASE_LOW (base_case);
1357 i++;
1359 /* Try to merge case labels. Break out when we reach the end
1360 of the label vector or when we cannot merge the next case
1361 label with the current one. */
1362 while (i < old_size)
1364 tree merge_case = gimple_switch_label (stmt, i);
1365 tree merge_label = CASE_LABEL (merge_case);
1366 tree t = int_const_binop (PLUS_EXPR, base_high,
1367 integer_one_node, 1);
1369 /* Merge the cases if they jump to the same place,
1370 and their ranges are consecutive. */
1371 if (merge_label == base_label
1372 && tree_int_cst_equal (CASE_LOW (merge_case), t))
1374 base_high = CASE_HIGH (merge_case) ?
1375 CASE_HIGH (merge_case) : CASE_LOW (merge_case);
1376 CASE_HIGH (base_case) = base_high;
1377 gimple_switch_set_label (stmt, i, NULL_TREE);
1378 new_size--;
1379 i++;
1381 else
1382 break;
1386 /* Compress the case labels in the label vector, and adjust the
1387 length of the vector. */
1388 for (i = 0, j = 0; i < new_size; i++)
1390 while (! gimple_switch_label (stmt, j))
1391 j++;
1392 gimple_switch_set_label (stmt, i,
1393 gimple_switch_label (stmt, j++));
1396 gcc_assert (new_size <= old_size);
1397 gimple_switch_set_num_labels (stmt, new_size);
1400 /* Look for blocks ending in a multiway branch (a GIMPLE_SWITCH),
1401 and scan the sorted vector of cases. Combine the ones jumping to the
1402 same label. */
1404 void
1405 group_case_labels (void)
1407 basic_block bb;
1409 FOR_EACH_BB (bb)
1411 gimple stmt = last_stmt (bb);
1412 if (stmt && gimple_code (stmt) == GIMPLE_SWITCH)
1413 group_case_labels_stmt (stmt);
1417 /* Checks whether we can merge block B into block A. */
1419 static bool
1420 gimple_can_merge_blocks_p (basic_block a, basic_block b)
1422 gimple stmt;
1423 gimple_stmt_iterator gsi;
1424 gimple_seq phis;
1426 if (!single_succ_p (a))
1427 return false;
1429 if (single_succ_edge (a)->flags & (EDGE_ABNORMAL | EDGE_EH))
1430 return false;
1432 if (single_succ (a) != b)
1433 return false;
1435 if (!single_pred_p (b))
1436 return false;
1438 if (b == EXIT_BLOCK_PTR)
1439 return false;
1441 /* If A ends by a statement causing exceptions or something similar, we
1442 cannot merge the blocks. */
1443 stmt = last_stmt (a);
1444 if (stmt && stmt_ends_bb_p (stmt))
1445 return false;
1447 /* Do not allow a block with only a non-local label to be merged. */
1448 if (stmt
1449 && gimple_code (stmt) == GIMPLE_LABEL
1450 && DECL_NONLOCAL (gimple_label_label (stmt)))
1451 return false;
1453 /* Examine the labels at the beginning of B. */
1454 for (gsi = gsi_start_bb (b); !gsi_end_p (gsi); gsi_next (&gsi))
1456 tree lab;
1457 stmt = gsi_stmt (gsi);
1458 if (gimple_code (stmt) != GIMPLE_LABEL)
1459 break;
1460 lab = gimple_label_label (stmt);
1462 /* Do not remove user labels. */
1463 if (!DECL_ARTIFICIAL (lab))
1464 return false;
1467 /* Protect the loop latches. */
1468 if (current_loops && b->loop_father->latch == b)
1469 return false;
1471 /* It must be possible to eliminate all phi nodes in B. If ssa form
1472 is not up-to-date and a name-mapping is registered, we cannot eliminate
1473 any phis. Symbols marked for renaming are never a problem though. */
1474 phis = phi_nodes (b);
1475 if (!gimple_seq_empty_p (phis)
1476 && name_mappings_registered_p ())
1477 return false;
1479 /* When not optimizing, don't merge if we'd lose goto_locus. */
1480 if (!optimize
1481 && single_succ_edge (a)->goto_locus != UNKNOWN_LOCATION)
1483 location_t goto_locus = single_succ_edge (a)->goto_locus;
1484 gimple_stmt_iterator prev, next;
1485 prev = gsi_last_nondebug_bb (a);
1486 next = gsi_after_labels (b);
1487 if (!gsi_end_p (next) && is_gimple_debug (gsi_stmt (next)))
1488 gsi_next_nondebug (&next);
1489 if ((gsi_end_p (prev)
1490 || gimple_location (gsi_stmt (prev)) != goto_locus)
1491 && (gsi_end_p (next)
1492 || gimple_location (gsi_stmt (next)) != goto_locus))
1493 return false;
1496 return true;
1499 /* Return true if the var whose chain of uses starts at PTR has no
1500 nondebug uses. */
1501 bool
1502 has_zero_uses_1 (const ssa_use_operand_t *head)
1504 const ssa_use_operand_t *ptr;
1506 for (ptr = head->next; ptr != head; ptr = ptr->next)
1507 if (!is_gimple_debug (USE_STMT (ptr)))
1508 return false;
1510 return true;
1513 /* Return true if the var whose chain of uses starts at PTR has a
1514 single nondebug use. Set USE_P and STMT to that single nondebug
1515 use, if so, or to NULL otherwise. */
1516 bool
1517 single_imm_use_1 (const ssa_use_operand_t *head,
1518 use_operand_p *use_p, gimple *stmt)
1520 ssa_use_operand_t *ptr, *single_use = 0;
1522 for (ptr = head->next; ptr != head; ptr = ptr->next)
1523 if (!is_gimple_debug (USE_STMT (ptr)))
1525 if (single_use)
1527 single_use = NULL;
1528 break;
1530 single_use = ptr;
1533 if (use_p)
1534 *use_p = single_use;
1536 if (stmt)
1537 *stmt = single_use ? single_use->loc.stmt : NULL;
1539 return !!single_use;
1542 /* Replaces all uses of NAME by VAL. */
1544 void
1545 replace_uses_by (tree name, tree val)
1547 imm_use_iterator imm_iter;
1548 use_operand_p use;
1549 gimple stmt;
1550 edge e;
1552 FOR_EACH_IMM_USE_STMT (stmt, imm_iter, name)
1554 FOR_EACH_IMM_USE_ON_STMT (use, imm_iter)
1556 replace_exp (use, val);
1558 if (gimple_code (stmt) == GIMPLE_PHI)
1560 e = gimple_phi_arg_edge (stmt, PHI_ARG_INDEX_FROM_USE (use));
1561 if (e->flags & EDGE_ABNORMAL)
1563 /* This can only occur for virtual operands, since
1564 for the real ones SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name))
1565 would prevent replacement. */
1566 gcc_assert (!is_gimple_reg (name));
1567 SSA_NAME_OCCURS_IN_ABNORMAL_PHI (val) = 1;
1572 if (gimple_code (stmt) != GIMPLE_PHI)
1574 size_t i;
1576 fold_stmt_inplace (stmt);
1577 if (cfgcleanup_altered_bbs)
1578 bitmap_set_bit (cfgcleanup_altered_bbs, gimple_bb (stmt)->index);
1580 /* FIXME. This should go in update_stmt. */
1581 for (i = 0; i < gimple_num_ops (stmt); i++)
1583 tree op = gimple_op (stmt, i);
1584 /* Operands may be empty here. For example, the labels
1585 of a GIMPLE_COND are nulled out following the creation
1586 of the corresponding CFG edges. */
1587 if (op && TREE_CODE (op) == ADDR_EXPR)
1588 recompute_tree_invariant_for_addr_expr (op);
1591 maybe_clean_or_replace_eh_stmt (stmt, stmt);
1592 update_stmt (stmt);
1596 gcc_assert (has_zero_uses (name));
1598 /* Also update the trees stored in loop structures. */
1599 if (current_loops)
1601 struct loop *loop;
1602 loop_iterator li;
1604 FOR_EACH_LOOP (li, loop, 0)
1606 substitute_in_loop_info (loop, name, val);
1611 /* Merge block B into block A. */
1613 static void
1614 gimple_merge_blocks (basic_block a, basic_block b)
1616 gimple_stmt_iterator last, gsi, psi;
1617 gimple_seq phis = phi_nodes (b);
1619 if (dump_file)
1620 fprintf (dump_file, "Merging blocks %d and %d\n", a->index, b->index);
1622 /* Remove all single-valued PHI nodes from block B of the form
1623 V_i = PHI <V_j> by propagating V_j to all the uses of V_i. */
1624 gsi = gsi_last_bb (a);
1625 for (psi = gsi_start (phis); !gsi_end_p (psi); )
1627 gimple phi = gsi_stmt (psi);
1628 tree def = gimple_phi_result (phi), use = gimple_phi_arg_def (phi, 0);
1629 gimple copy;
1630 bool may_replace_uses = !is_gimple_reg (def)
1631 || may_propagate_copy (def, use);
1633 /* In case we maintain loop closed ssa form, do not propagate arguments
1634 of loop exit phi nodes. */
1635 if (current_loops
1636 && loops_state_satisfies_p (LOOP_CLOSED_SSA)
1637 && is_gimple_reg (def)
1638 && TREE_CODE (use) == SSA_NAME
1639 && a->loop_father != b->loop_father)
1640 may_replace_uses = false;
1642 if (!may_replace_uses)
1644 gcc_assert (is_gimple_reg (def));
1646 /* Note that just emitting the copies is fine -- there is no problem
1647 with ordering of phi nodes. This is because A is the single
1648 predecessor of B, therefore results of the phi nodes cannot
1649 appear as arguments of the phi nodes. */
1650 copy = gimple_build_assign (def, use);
1651 gsi_insert_after (&gsi, copy, GSI_NEW_STMT);
1652 remove_phi_node (&psi, false);
1654 else
1656 /* If we deal with a PHI for virtual operands, we can simply
1657 propagate these without fussing with folding or updating
1658 the stmt. */
1659 if (!is_gimple_reg (def))
1661 imm_use_iterator iter;
1662 use_operand_p use_p;
1663 gimple stmt;
1665 FOR_EACH_IMM_USE_STMT (stmt, iter, def)
1666 FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
1667 SET_USE (use_p, use);
1669 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (def))
1670 SSA_NAME_OCCURS_IN_ABNORMAL_PHI (use) = 1;
1672 else
1673 replace_uses_by (def, use);
1675 remove_phi_node (&psi, true);
1679 /* Ensure that B follows A. */
1680 move_block_after (b, a);
1682 gcc_assert (single_succ_edge (a)->flags & EDGE_FALLTHRU);
1683 gcc_assert (!last_stmt (a) || !stmt_ends_bb_p (last_stmt (a)));
1685 /* Remove labels from B and set gimple_bb to A for other statements. */
1686 for (gsi = gsi_start_bb (b); !gsi_end_p (gsi);)
1688 gimple stmt = gsi_stmt (gsi);
1689 if (gimple_code (stmt) == GIMPLE_LABEL)
1691 tree label = gimple_label_label (stmt);
1692 int lp_nr;
1694 gsi_remove (&gsi, false);
1696 /* Now that we can thread computed gotos, we might have
1697 a situation where we have a forced label in block B
1698 However, the label at the start of block B might still be
1699 used in other ways (think about the runtime checking for
1700 Fortran assigned gotos). So we can not just delete the
1701 label. Instead we move the label to the start of block A. */
1702 if (FORCED_LABEL (label))
1704 gimple_stmt_iterator dest_gsi = gsi_start_bb (a);
1705 gsi_insert_before (&dest_gsi, stmt, GSI_NEW_STMT);
1708 lp_nr = EH_LANDING_PAD_NR (label);
1709 if (lp_nr)
1711 eh_landing_pad lp = get_eh_landing_pad_from_number (lp_nr);
1712 lp->post_landing_pad = NULL;
1715 else
1717 gimple_set_bb (stmt, a);
1718 gsi_next (&gsi);
1722 /* Merge the sequences. */
1723 last = gsi_last_bb (a);
1724 gsi_insert_seq_after (&last, bb_seq (b), GSI_NEW_STMT);
1725 set_bb_seq (b, NULL);
1727 if (cfgcleanup_altered_bbs)
1728 bitmap_set_bit (cfgcleanup_altered_bbs, a->index);
1732 /* Return the one of two successors of BB that is not reachable by a
1733 complex edge, if there is one. Else, return BB. We use
1734 this in optimizations that use post-dominators for their heuristics,
1735 to catch the cases in C++ where function calls are involved. */
1737 basic_block
1738 single_noncomplex_succ (basic_block bb)
1740 edge e0, e1;
1741 if (EDGE_COUNT (bb->succs) != 2)
1742 return bb;
1744 e0 = EDGE_SUCC (bb, 0);
1745 e1 = EDGE_SUCC (bb, 1);
1746 if (e0->flags & EDGE_COMPLEX)
1747 return e1->dest;
1748 if (e1->flags & EDGE_COMPLEX)
1749 return e0->dest;
1751 return bb;
1754 /* T is CALL_EXPR. Set current_function_calls_* flags. */
1756 void
1757 notice_special_calls (gimple call)
1759 int flags = gimple_call_flags (call);
1761 if (flags & ECF_MAY_BE_ALLOCA)
1762 cfun->calls_alloca = true;
1763 if (flags & ECF_RETURNS_TWICE)
1764 cfun->calls_setjmp = true;
1768 /* Clear flags set by notice_special_calls. Used by dead code removal
1769 to update the flags. */
1771 void
1772 clear_special_calls (void)
1774 cfun->calls_alloca = false;
1775 cfun->calls_setjmp = false;
1778 /* Remove PHI nodes associated with basic block BB and all edges out of BB. */
1780 static void
1781 remove_phi_nodes_and_edges_for_unreachable_block (basic_block bb)
1783 /* Since this block is no longer reachable, we can just delete all
1784 of its PHI nodes. */
1785 remove_phi_nodes (bb);
1787 /* Remove edges to BB's successors. */
1788 while (EDGE_COUNT (bb->succs) > 0)
1789 remove_edge (EDGE_SUCC (bb, 0));
1793 /* Remove statements of basic block BB. */
1795 static void
1796 remove_bb (basic_block bb)
1798 gimple_stmt_iterator i;
1800 if (dump_file)
1802 fprintf (dump_file, "Removing basic block %d\n", bb->index);
1803 if (dump_flags & TDF_DETAILS)
1805 dump_bb (bb, dump_file, 0);
1806 fprintf (dump_file, "\n");
1810 if (current_loops)
1812 struct loop *loop = bb->loop_father;
1814 /* If a loop gets removed, clean up the information associated
1815 with it. */
1816 if (loop->latch == bb
1817 || loop->header == bb)
1818 free_numbers_of_iterations_estimates_loop (loop);
1821 /* Remove all the instructions in the block. */
1822 if (bb_seq (bb) != NULL)
1824 /* Walk backwards so as to get a chance to substitute all
1825 released DEFs into debug stmts. See
1826 eliminate_unnecessary_stmts() in tree-ssa-dce.c for more
1827 details. */
1828 for (i = gsi_last_bb (bb); !gsi_end_p (i);)
1830 gimple stmt = gsi_stmt (i);
1831 if (gimple_code (stmt) == GIMPLE_LABEL
1832 && (FORCED_LABEL (gimple_label_label (stmt))
1833 || DECL_NONLOCAL (gimple_label_label (stmt))))
1835 basic_block new_bb;
1836 gimple_stmt_iterator new_gsi;
1838 /* A non-reachable non-local label may still be referenced.
1839 But it no longer needs to carry the extra semantics of
1840 non-locality. */
1841 if (DECL_NONLOCAL (gimple_label_label (stmt)))
1843 DECL_NONLOCAL (gimple_label_label (stmt)) = 0;
1844 FORCED_LABEL (gimple_label_label (stmt)) = 1;
1847 new_bb = bb->prev_bb;
1848 new_gsi = gsi_start_bb (new_bb);
1849 gsi_remove (&i, false);
1850 gsi_insert_before (&new_gsi, stmt, GSI_NEW_STMT);
1852 else
1854 /* Release SSA definitions if we are in SSA. Note that we
1855 may be called when not in SSA. For example,
1856 final_cleanup calls this function via
1857 cleanup_tree_cfg. */
1858 if (gimple_in_ssa_p (cfun))
1859 release_defs (stmt);
1861 gsi_remove (&i, true);
1864 if (gsi_end_p (i))
1865 i = gsi_last_bb (bb);
1866 else
1867 gsi_prev (&i);
1871 remove_phi_nodes_and_edges_for_unreachable_block (bb);
1872 bb->il.gimple = NULL;
1876 /* Given a basic block BB ending with COND_EXPR or SWITCH_EXPR, and a
1877 predicate VAL, return the edge that will be taken out of the block.
1878 If VAL does not match a unique edge, NULL is returned. */
1880 edge
1881 find_taken_edge (basic_block bb, tree val)
1883 gimple stmt;
1885 stmt = last_stmt (bb);
1887 gcc_assert (stmt);
1888 gcc_assert (is_ctrl_stmt (stmt));
1890 if (val == NULL)
1891 return NULL;
1893 if (!is_gimple_min_invariant (val))
1894 return NULL;
1896 if (gimple_code (stmt) == GIMPLE_COND)
1897 return find_taken_edge_cond_expr (bb, val);
1899 if (gimple_code (stmt) == GIMPLE_SWITCH)
1900 return find_taken_edge_switch_expr (bb, val);
1902 if (computed_goto_p (stmt))
1904 /* Only optimize if the argument is a label, if the argument is
1905 not a label then we can not construct a proper CFG.
1907 It may be the case that we only need to allow the LABEL_REF to
1908 appear inside an ADDR_EXPR, but we also allow the LABEL_REF to
1909 appear inside a LABEL_EXPR just to be safe. */
1910 if ((TREE_CODE (val) == ADDR_EXPR || TREE_CODE (val) == LABEL_EXPR)
1911 && TREE_CODE (TREE_OPERAND (val, 0)) == LABEL_DECL)
1912 return find_taken_edge_computed_goto (bb, TREE_OPERAND (val, 0));
1913 return NULL;
1916 gcc_unreachable ();
1919 /* Given a constant value VAL and the entry block BB to a GOTO_EXPR
1920 statement, determine which of the outgoing edges will be taken out of the
1921 block. Return NULL if either edge may be taken. */
1923 static edge
1924 find_taken_edge_computed_goto (basic_block bb, tree val)
1926 basic_block dest;
1927 edge e = NULL;
1929 dest = label_to_block (val);
1930 if (dest)
1932 e = find_edge (bb, dest);
1933 gcc_assert (e != NULL);
1936 return e;
1939 /* Given a constant value VAL and the entry block BB to a COND_EXPR
1940 statement, determine which of the two edges will be taken out of the
1941 block. Return NULL if either edge may be taken. */
1943 static edge
1944 find_taken_edge_cond_expr (basic_block bb, tree val)
1946 edge true_edge, false_edge;
1948 extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
1950 gcc_assert (TREE_CODE (val) == INTEGER_CST);
1951 return (integer_zerop (val) ? false_edge : true_edge);
1954 /* Given an INTEGER_CST VAL and the entry block BB to a SWITCH_EXPR
1955 statement, determine which edge will be taken out of the block. Return
1956 NULL if any edge may be taken. */
1958 static edge
1959 find_taken_edge_switch_expr (basic_block bb, tree val)
1961 basic_block dest_bb;
1962 edge e;
1963 gimple switch_stmt;
1964 tree taken_case;
1966 switch_stmt = last_stmt (bb);
1967 taken_case = find_case_label_for_value (switch_stmt, val);
1968 dest_bb = label_to_block (CASE_LABEL (taken_case));
1970 e = find_edge (bb, dest_bb);
1971 gcc_assert (e);
1972 return e;
1976 /* Return the CASE_LABEL_EXPR that SWITCH_STMT will take for VAL.
1977 We can make optimal use here of the fact that the case labels are
1978 sorted: We can do a binary search for a case matching VAL. */
1980 static tree
1981 find_case_label_for_value (gimple switch_stmt, tree val)
1983 size_t low, high, n = gimple_switch_num_labels (switch_stmt);
1984 tree default_case = gimple_switch_default_label (switch_stmt);
1986 for (low = 0, high = n; high - low > 1; )
1988 size_t i = (high + low) / 2;
1989 tree t = gimple_switch_label (switch_stmt, i);
1990 int cmp;
1992 /* Cache the result of comparing CASE_LOW and val. */
1993 cmp = tree_int_cst_compare (CASE_LOW (t), val);
1995 if (cmp > 0)
1996 high = i;
1997 else
1998 low = i;
2000 if (CASE_HIGH (t) == NULL)
2002 /* A singe-valued case label. */
2003 if (cmp == 0)
2004 return t;
2006 else
2008 /* A case range. We can only handle integer ranges. */
2009 if (cmp <= 0 && tree_int_cst_compare (CASE_HIGH (t), val) >= 0)
2010 return t;
2014 return default_case;
2018 /* Dump a basic block on stderr. */
2020 void
2021 gimple_debug_bb (basic_block bb)
2023 gimple_dump_bb (bb, stderr, 0, TDF_VOPS|TDF_MEMSYMS);
2027 /* Dump basic block with index N on stderr. */
2029 basic_block
2030 gimple_debug_bb_n (int n)
2032 gimple_debug_bb (BASIC_BLOCK (n));
2033 return BASIC_BLOCK (n);
2037 /* Dump the CFG on stderr.
2039 FLAGS are the same used by the tree dumping functions
2040 (see TDF_* in tree-pass.h). */
2042 void
2043 gimple_debug_cfg (int flags)
2045 gimple_dump_cfg (stderr, flags);
2049 /* Dump the program showing basic block boundaries on the given FILE.
2051 FLAGS are the same used by the tree dumping functions (see TDF_* in
2052 tree.h). */
2054 void
2055 gimple_dump_cfg (FILE *file, int flags)
2057 if (flags & TDF_DETAILS)
2059 const char *funcname
2060 = lang_hooks.decl_printable_name (current_function_decl, 2);
2062 fputc ('\n', file);
2063 fprintf (file, ";; Function %s\n\n", funcname);
2064 fprintf (file, ";; \n%d basic blocks, %d edges, last basic block %d.\n\n",
2065 n_basic_blocks, n_edges, last_basic_block);
2067 brief_dump_cfg (file);
2068 fprintf (file, "\n");
2071 if (flags & TDF_STATS)
2072 dump_cfg_stats (file);
2074 dump_function_to_file (current_function_decl, file, flags | TDF_BLOCKS);
2078 /* Dump CFG statistics on FILE. */
2080 void
2081 dump_cfg_stats (FILE *file)
2083 static long max_num_merged_labels = 0;
2084 unsigned long size, total = 0;
2085 long num_edges;
2086 basic_block bb;
2087 const char * const fmt_str = "%-30s%-13s%12s\n";
2088 const char * const fmt_str_1 = "%-30s%13d%11lu%c\n";
2089 const char * const fmt_str_2 = "%-30s%13ld%11lu%c\n";
2090 const char * const fmt_str_3 = "%-43s%11lu%c\n";
2091 const char *funcname
2092 = lang_hooks.decl_printable_name (current_function_decl, 2);
2095 fprintf (file, "\nCFG Statistics for %s\n\n", funcname);
2097 fprintf (file, "---------------------------------------------------------\n");
2098 fprintf (file, fmt_str, "", " Number of ", "Memory");
2099 fprintf (file, fmt_str, "", " instances ", "used ");
2100 fprintf (file, "---------------------------------------------------------\n");
2102 size = n_basic_blocks * sizeof (struct basic_block_def);
2103 total += size;
2104 fprintf (file, fmt_str_1, "Basic blocks", n_basic_blocks,
2105 SCALE (size), LABEL (size));
2107 num_edges = 0;
2108 FOR_EACH_BB (bb)
2109 num_edges += EDGE_COUNT (bb->succs);
2110 size = num_edges * sizeof (struct edge_def);
2111 total += size;
2112 fprintf (file, fmt_str_2, "Edges", num_edges, SCALE (size), LABEL (size));
2114 fprintf (file, "---------------------------------------------------------\n");
2115 fprintf (file, fmt_str_3, "Total memory used by CFG data", SCALE (total),
2116 LABEL (total));
2117 fprintf (file, "---------------------------------------------------------\n");
2118 fprintf (file, "\n");
2120 if (cfg_stats.num_merged_labels > max_num_merged_labels)
2121 max_num_merged_labels = cfg_stats.num_merged_labels;
2123 fprintf (file, "Coalesced label blocks: %ld (Max so far: %ld)\n",
2124 cfg_stats.num_merged_labels, max_num_merged_labels);
2126 fprintf (file, "\n");
2130 /* Dump CFG statistics on stderr. Keep extern so that it's always
2131 linked in the final executable. */
2133 DEBUG_FUNCTION void
2134 debug_cfg_stats (void)
2136 dump_cfg_stats (stderr);
2140 /* Dump the flowgraph to a .vcg FILE. */
2142 static void
2143 gimple_cfg2vcg (FILE *file)
2145 edge e;
2146 edge_iterator ei;
2147 basic_block bb;
2148 const char *funcname
2149 = lang_hooks.decl_printable_name (current_function_decl, 2);
2151 /* Write the file header. */
2152 fprintf (file, "graph: { title: \"%s\"\n", funcname);
2153 fprintf (file, "node: { title: \"ENTRY\" label: \"ENTRY\" }\n");
2154 fprintf (file, "node: { title: \"EXIT\" label: \"EXIT\" }\n");
2156 /* Write blocks and edges. */
2157 FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
2159 fprintf (file, "edge: { sourcename: \"ENTRY\" targetname: \"%d\"",
2160 e->dest->index);
2162 if (e->flags & EDGE_FAKE)
2163 fprintf (file, " linestyle: dotted priority: 10");
2164 else
2165 fprintf (file, " linestyle: solid priority: 100");
2167 fprintf (file, " }\n");
2169 fputc ('\n', file);
2171 FOR_EACH_BB (bb)
2173 enum gimple_code head_code, end_code;
2174 const char *head_name, *end_name;
2175 int head_line = 0;
2176 int end_line = 0;
2177 gimple first = first_stmt (bb);
2178 gimple last = last_stmt (bb);
2180 if (first)
2182 head_code = gimple_code (first);
2183 head_name = gimple_code_name[head_code];
2184 head_line = get_lineno (first);
2186 else
2187 head_name = "no-statement";
2189 if (last)
2191 end_code = gimple_code (last);
2192 end_name = gimple_code_name[end_code];
2193 end_line = get_lineno (last);
2195 else
2196 end_name = "no-statement";
2198 fprintf (file, "node: { title: \"%d\" label: \"#%d\\n%s (%d)\\n%s (%d)\"}\n",
2199 bb->index, bb->index, head_name, head_line, end_name,
2200 end_line);
2202 FOR_EACH_EDGE (e, ei, bb->succs)
2204 if (e->dest == EXIT_BLOCK_PTR)
2205 fprintf (file, "edge: { sourcename: \"%d\" targetname: \"EXIT\"", bb->index);
2206 else
2207 fprintf (file, "edge: { sourcename: \"%d\" targetname: \"%d\"", bb->index, e->dest->index);
2209 if (e->flags & EDGE_FAKE)
2210 fprintf (file, " priority: 10 linestyle: dotted");
2211 else
2212 fprintf (file, " priority: 100 linestyle: solid");
2214 fprintf (file, " }\n");
2217 if (bb->next_bb != EXIT_BLOCK_PTR)
2218 fputc ('\n', file);
2221 fputs ("}\n\n", file);
2226 /*---------------------------------------------------------------------------
2227 Miscellaneous helpers
2228 ---------------------------------------------------------------------------*/
2230 /* Return true if T represents a stmt that always transfers control. */
2232 bool
2233 is_ctrl_stmt (gimple t)
2235 switch (gimple_code (t))
2237 case GIMPLE_COND:
2238 case GIMPLE_SWITCH:
2239 case GIMPLE_GOTO:
2240 case GIMPLE_RETURN:
2241 case GIMPLE_RESX:
2242 return true;
2243 default:
2244 return false;
2249 /* Return true if T is a statement that may alter the flow of control
2250 (e.g., a call to a non-returning function). */
2252 bool
2253 is_ctrl_altering_stmt (gimple t)
2255 gcc_assert (t);
2257 switch (gimple_code (t))
2259 case GIMPLE_CALL:
2261 int flags = gimple_call_flags (t);
2263 /* A non-pure/const call alters flow control if the current
2264 function has nonlocal labels. */
2265 if (!(flags & (ECF_CONST | ECF_PURE)) && cfun->has_nonlocal_label)
2266 return true;
2268 /* A call also alters control flow if it does not return. */
2269 if (flags & ECF_NORETURN)
2270 return true;
2272 /* BUILT_IN_RETURN call is same as return statement. */
2273 if (gimple_call_builtin_p (t, BUILT_IN_RETURN))
2274 return true;
2276 break;
2278 case GIMPLE_EH_DISPATCH:
2279 /* EH_DISPATCH branches to the individual catch handlers at
2280 this level of a try or allowed-exceptions region. It can
2281 fallthru to the next statement as well. */
2282 return true;
2284 case GIMPLE_ASM:
2285 if (gimple_asm_nlabels (t) > 0)
2286 return true;
2287 break;
2289 CASE_GIMPLE_OMP:
2290 /* OpenMP directives alter control flow. */
2291 return true;
2293 default:
2294 break;
2297 /* If a statement can throw, it alters control flow. */
2298 return stmt_can_throw_internal (t);
2302 /* Return true if T is a simple local goto. */
2304 bool
2305 simple_goto_p (gimple t)
2307 return (gimple_code (t) == GIMPLE_GOTO
2308 && TREE_CODE (gimple_goto_dest (t)) == LABEL_DECL);
2312 /* Return true if T can make an abnormal transfer of control flow.
2313 Transfers of control flow associated with EH are excluded. */
2315 bool
2316 stmt_can_make_abnormal_goto (gimple t)
2318 if (computed_goto_p (t))
2319 return true;
2320 if (is_gimple_call (t))
2321 return gimple_has_side_effects (t) && cfun->has_nonlocal_label;
2322 return false;
2326 /* Return true if STMT should start a new basic block. PREV_STMT is
2327 the statement preceding STMT. It is used when STMT is a label or a
2328 case label. Labels should only start a new basic block if their
2329 previous statement wasn't a label. Otherwise, sequence of labels
2330 would generate unnecessary basic blocks that only contain a single
2331 label. */
2333 static inline bool
2334 stmt_starts_bb_p (gimple stmt, gimple prev_stmt)
2336 if (stmt == NULL)
2337 return false;
2339 /* Labels start a new basic block only if the preceding statement
2340 wasn't a label of the same type. This prevents the creation of
2341 consecutive blocks that have nothing but a single label. */
2342 if (gimple_code (stmt) == GIMPLE_LABEL)
2344 /* Nonlocal and computed GOTO targets always start a new block. */
2345 if (DECL_NONLOCAL (gimple_label_label (stmt))
2346 || FORCED_LABEL (gimple_label_label (stmt)))
2347 return true;
2349 if (prev_stmt && gimple_code (prev_stmt) == GIMPLE_LABEL)
2351 if (DECL_NONLOCAL (gimple_label_label (prev_stmt)))
2352 return true;
2354 cfg_stats.num_merged_labels++;
2355 return false;
2357 else
2358 return true;
2361 return false;
2365 /* Return true if T should end a basic block. */
2367 bool
2368 stmt_ends_bb_p (gimple t)
2370 return is_ctrl_stmt (t) || is_ctrl_altering_stmt (t);
2373 /* Remove block annotations and other data structures. */
2375 void
2376 delete_tree_cfg_annotations (void)
2378 label_to_block_map = NULL;
2382 /* Return the first statement in basic block BB. */
2384 gimple
2385 first_stmt (basic_block bb)
2387 gimple_stmt_iterator i = gsi_start_bb (bb);
2388 gimple stmt = NULL;
2390 while (!gsi_end_p (i) && is_gimple_debug ((stmt = gsi_stmt (i))))
2392 gsi_next (&i);
2393 stmt = NULL;
2395 return stmt;
2398 /* Return the first non-label statement in basic block BB. */
2400 static gimple
2401 first_non_label_stmt (basic_block bb)
2403 gimple_stmt_iterator i = gsi_start_bb (bb);
2404 while (!gsi_end_p (i) && gimple_code (gsi_stmt (i)) == GIMPLE_LABEL)
2405 gsi_next (&i);
2406 return !gsi_end_p (i) ? gsi_stmt (i) : NULL;
2409 /* Return the last statement in basic block BB. */
2411 gimple
2412 last_stmt (basic_block bb)
2414 gimple_stmt_iterator i = gsi_last_bb (bb);
2415 gimple stmt = NULL;
2417 while (!gsi_end_p (i) && is_gimple_debug ((stmt = gsi_stmt (i))))
2419 gsi_prev (&i);
2420 stmt = NULL;
2422 return stmt;
2425 /* Return the last statement of an otherwise empty block. Return NULL
2426 if the block is totally empty, or if it contains more than one
2427 statement. */
2429 gimple
2430 last_and_only_stmt (basic_block bb)
2432 gimple_stmt_iterator i = gsi_last_nondebug_bb (bb);
2433 gimple last, prev;
2435 if (gsi_end_p (i))
2436 return NULL;
2438 last = gsi_stmt (i);
2439 gsi_prev_nondebug (&i);
2440 if (gsi_end_p (i))
2441 return last;
2443 /* Empty statements should no longer appear in the instruction stream.
2444 Everything that might have appeared before should be deleted by
2445 remove_useless_stmts, and the optimizers should just gsi_remove
2446 instead of smashing with build_empty_stmt.
2448 Thus the only thing that should appear here in a block containing
2449 one executable statement is a label. */
2450 prev = gsi_stmt (i);
2451 if (gimple_code (prev) == GIMPLE_LABEL)
2452 return last;
2453 else
2454 return NULL;
2457 /* Reinstall those PHI arguments queued in OLD_EDGE to NEW_EDGE. */
2459 static void
2460 reinstall_phi_args (edge new_edge, edge old_edge)
2462 edge_var_map_vector v;
2463 edge_var_map *vm;
2464 int i;
2465 gimple_stmt_iterator phis;
2467 v = redirect_edge_var_map_vector (old_edge);
2468 if (!v)
2469 return;
2471 for (i = 0, phis = gsi_start_phis (new_edge->dest);
2472 VEC_iterate (edge_var_map, v, i, vm) && !gsi_end_p (phis);
2473 i++, gsi_next (&phis))
2475 gimple phi = gsi_stmt (phis);
2476 tree result = redirect_edge_var_map_result (vm);
2477 tree arg = redirect_edge_var_map_def (vm);
2479 gcc_assert (result == gimple_phi_result (phi));
2481 add_phi_arg (phi, arg, new_edge, redirect_edge_var_map_location (vm));
2484 redirect_edge_var_map_clear (old_edge);
2487 /* Returns the basic block after which the new basic block created
2488 by splitting edge EDGE_IN should be placed. Tries to keep the new block
2489 near its "logical" location. This is of most help to humans looking
2490 at debugging dumps. */
2492 static basic_block
2493 split_edge_bb_loc (edge edge_in)
2495 basic_block dest = edge_in->dest;
2496 basic_block dest_prev = dest->prev_bb;
2498 if (dest_prev)
2500 edge e = find_edge (dest_prev, dest);
2501 if (e && !(e->flags & EDGE_COMPLEX))
2502 return edge_in->src;
2504 return dest_prev;
2507 /* Split a (typically critical) edge EDGE_IN. Return the new block.
2508 Abort on abnormal edges. */
2510 static basic_block
2511 gimple_split_edge (edge edge_in)
2513 basic_block new_bb, after_bb, dest;
2514 edge new_edge, e;
2516 /* Abnormal edges cannot be split. */
2517 gcc_assert (!(edge_in->flags & EDGE_ABNORMAL));
2519 dest = edge_in->dest;
2521 after_bb = split_edge_bb_loc (edge_in);
2523 new_bb = create_empty_bb (after_bb);
2524 new_bb->frequency = EDGE_FREQUENCY (edge_in);
2525 new_bb->count = edge_in->count;
2526 new_edge = make_edge (new_bb, dest, EDGE_FALLTHRU);
2527 new_edge->probability = REG_BR_PROB_BASE;
2528 new_edge->count = edge_in->count;
2530 e = redirect_edge_and_branch (edge_in, new_bb);
2531 gcc_assert (e == edge_in);
2532 reinstall_phi_args (new_edge, e);
2534 return new_bb;
2538 /* Verify properties of the address expression T with base object BASE. */
2540 static tree
2541 verify_address (tree t, tree base)
2543 bool old_constant;
2544 bool old_side_effects;
2545 bool new_constant;
2546 bool new_side_effects;
2548 old_constant = TREE_CONSTANT (t);
2549 old_side_effects = TREE_SIDE_EFFECTS (t);
2551 recompute_tree_invariant_for_addr_expr (t);
2552 new_side_effects = TREE_SIDE_EFFECTS (t);
2553 new_constant = TREE_CONSTANT (t);
2555 if (old_constant != new_constant)
2557 error ("constant not recomputed when ADDR_EXPR changed");
2558 return t;
2560 if (old_side_effects != new_side_effects)
2562 error ("side effects not recomputed when ADDR_EXPR changed");
2563 return t;
2566 if (!(TREE_CODE (base) == VAR_DECL
2567 || TREE_CODE (base) == PARM_DECL
2568 || TREE_CODE (base) == RESULT_DECL))
2569 return NULL_TREE;
2571 if (DECL_GIMPLE_REG_P (base))
2573 error ("DECL_GIMPLE_REG_P set on a variable with address taken");
2574 return base;
2577 return NULL_TREE;
2580 /* Callback for walk_tree, check that all elements with address taken are
2581 properly noticed as such. The DATA is an int* that is 1 if TP was seen
2582 inside a PHI node. */
2584 static tree
2585 verify_expr (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
2587 tree t = *tp, x;
2589 if (TYPE_P (t))
2590 *walk_subtrees = 0;
2592 /* Check operand N for being valid GIMPLE and give error MSG if not. */
2593 #define CHECK_OP(N, MSG) \
2594 do { if (!is_gimple_val (TREE_OPERAND (t, N))) \
2595 { error (MSG); return TREE_OPERAND (t, N); }} while (0)
2597 switch (TREE_CODE (t))
2599 case SSA_NAME:
2600 if (SSA_NAME_IN_FREE_LIST (t))
2602 error ("SSA name in freelist but still referenced");
2603 return *tp;
2605 break;
2607 case INDIRECT_REF:
2608 error ("INDIRECT_REF in gimple IL");
2609 return t;
2611 case MEM_REF:
2612 x = TREE_OPERAND (t, 0);
2613 if (!POINTER_TYPE_P (TREE_TYPE (x))
2614 || !is_gimple_mem_ref_addr (x))
2616 error ("Invalid first operand of MEM_REF.");
2617 return x;
2619 if (TREE_CODE (TREE_OPERAND (t, 1)) != INTEGER_CST
2620 || !POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (t, 1))))
2622 error ("Invalid offset operand of MEM_REF.");
2623 return TREE_OPERAND (t, 1);
2625 if (TREE_CODE (x) == ADDR_EXPR
2626 && (x = verify_address (x, TREE_OPERAND (x, 0))))
2627 return x;
2628 *walk_subtrees = 0;
2629 break;
2631 case ASSERT_EXPR:
2632 x = fold (ASSERT_EXPR_COND (t));
2633 if (x == boolean_false_node)
2635 error ("ASSERT_EXPR with an always-false condition");
2636 return *tp;
2638 break;
2640 case MODIFY_EXPR:
2641 error ("MODIFY_EXPR not expected while having tuples.");
2642 return *tp;
2644 case ADDR_EXPR:
2646 tree tem;
2648 gcc_assert (is_gimple_address (t));
2650 /* Skip any references (they will be checked when we recurse down the
2651 tree) and ensure that any variable used as a prefix is marked
2652 addressable. */
2653 for (x = TREE_OPERAND (t, 0);
2654 handled_component_p (x);
2655 x = TREE_OPERAND (x, 0))
2658 if ((tem = verify_address (t, x)))
2659 return tem;
2661 if (!(TREE_CODE (x) == VAR_DECL
2662 || TREE_CODE (x) == PARM_DECL
2663 || TREE_CODE (x) == RESULT_DECL))
2664 return NULL;
2666 if (!TREE_ADDRESSABLE (x))
2668 error ("address taken, but ADDRESSABLE bit not set");
2669 return x;
2672 break;
2675 case COND_EXPR:
2676 x = COND_EXPR_COND (t);
2677 if (!INTEGRAL_TYPE_P (TREE_TYPE (x)))
2679 error ("non-integral used in condition");
2680 return x;
2682 if (!is_gimple_condexpr (x))
2684 error ("invalid conditional operand");
2685 return x;
2687 break;
2689 case NON_LVALUE_EXPR:
2690 gcc_unreachable ();
2692 CASE_CONVERT:
2693 case FIX_TRUNC_EXPR:
2694 case FLOAT_EXPR:
2695 case NEGATE_EXPR:
2696 case ABS_EXPR:
2697 case BIT_NOT_EXPR:
2698 case TRUTH_NOT_EXPR:
2699 CHECK_OP (0, "invalid operand to unary operator");
2700 break;
2702 case REALPART_EXPR:
2703 case IMAGPART_EXPR:
2704 case COMPONENT_REF:
2705 case ARRAY_REF:
2706 case ARRAY_RANGE_REF:
2707 case BIT_FIELD_REF:
2708 case VIEW_CONVERT_EXPR:
2709 /* We have a nest of references. Verify that each of the operands
2710 that determine where to reference is either a constant or a variable,
2711 verify that the base is valid, and then show we've already checked
2712 the subtrees. */
2713 while (handled_component_p (t))
2715 if (TREE_CODE (t) == COMPONENT_REF && TREE_OPERAND (t, 2))
2716 CHECK_OP (2, "invalid COMPONENT_REF offset operator");
2717 else if (TREE_CODE (t) == ARRAY_REF
2718 || TREE_CODE (t) == ARRAY_RANGE_REF)
2720 CHECK_OP (1, "invalid array index");
2721 if (TREE_OPERAND (t, 2))
2722 CHECK_OP (2, "invalid array lower bound");
2723 if (TREE_OPERAND (t, 3))
2724 CHECK_OP (3, "invalid array stride");
2726 else if (TREE_CODE (t) == BIT_FIELD_REF)
2728 if (!host_integerp (TREE_OPERAND (t, 1), 1)
2729 || !host_integerp (TREE_OPERAND (t, 2), 1))
2731 error ("invalid position or size operand to BIT_FIELD_REF");
2732 return t;
2734 else if (INTEGRAL_TYPE_P (TREE_TYPE (t))
2735 && (TYPE_PRECISION (TREE_TYPE (t))
2736 != TREE_INT_CST_LOW (TREE_OPERAND (t, 1))))
2738 error ("integral result type precision does not match "
2739 "field size of BIT_FIELD_REF");
2740 return t;
2742 if (!INTEGRAL_TYPE_P (TREE_TYPE (t))
2743 && (GET_MODE_PRECISION (TYPE_MODE (TREE_TYPE (t)))
2744 != TREE_INT_CST_LOW (TREE_OPERAND (t, 1))))
2746 error ("mode precision of non-integral result does not "
2747 "match field size of BIT_FIELD_REF");
2748 return t;
2752 t = TREE_OPERAND (t, 0);
2755 if (!is_gimple_min_invariant (t) && !is_gimple_lvalue (t))
2757 error ("invalid reference prefix");
2758 return t;
2760 *walk_subtrees = 0;
2761 break;
2762 case PLUS_EXPR:
2763 case MINUS_EXPR:
2764 /* PLUS_EXPR and MINUS_EXPR don't work on pointers, they should be done using
2765 POINTER_PLUS_EXPR. */
2766 if (POINTER_TYPE_P (TREE_TYPE (t)))
2768 error ("invalid operand to plus/minus, type is a pointer");
2769 return t;
2771 CHECK_OP (0, "invalid operand to binary operator");
2772 CHECK_OP (1, "invalid operand to binary operator");
2773 break;
2775 case POINTER_PLUS_EXPR:
2776 /* Check to make sure the first operand is a pointer or reference type. */
2777 if (!POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (t, 0))))
2779 error ("invalid operand to pointer plus, first operand is not a pointer");
2780 return t;
2782 /* Check to make sure the second operand is an integer with type of
2783 sizetype. */
2784 if (!useless_type_conversion_p (sizetype,
2785 TREE_TYPE (TREE_OPERAND (t, 1))))
2787 error ("invalid operand to pointer plus, second operand is not an "
2788 "integer with type of sizetype.");
2789 return t;
2791 /* FALLTHROUGH */
2792 case LT_EXPR:
2793 case LE_EXPR:
2794 case GT_EXPR:
2795 case GE_EXPR:
2796 case EQ_EXPR:
2797 case NE_EXPR:
2798 case UNORDERED_EXPR:
2799 case ORDERED_EXPR:
2800 case UNLT_EXPR:
2801 case UNLE_EXPR:
2802 case UNGT_EXPR:
2803 case UNGE_EXPR:
2804 case UNEQ_EXPR:
2805 case LTGT_EXPR:
2806 case MULT_EXPR:
2807 case TRUNC_DIV_EXPR:
2808 case CEIL_DIV_EXPR:
2809 case FLOOR_DIV_EXPR:
2810 case ROUND_DIV_EXPR:
2811 case TRUNC_MOD_EXPR:
2812 case CEIL_MOD_EXPR:
2813 case FLOOR_MOD_EXPR:
2814 case ROUND_MOD_EXPR:
2815 case RDIV_EXPR:
2816 case EXACT_DIV_EXPR:
2817 case MIN_EXPR:
2818 case MAX_EXPR:
2819 case LSHIFT_EXPR:
2820 case RSHIFT_EXPR:
2821 case LROTATE_EXPR:
2822 case RROTATE_EXPR:
2823 case BIT_IOR_EXPR:
2824 case BIT_XOR_EXPR:
2825 case BIT_AND_EXPR:
2826 CHECK_OP (0, "invalid operand to binary operator");
2827 CHECK_OP (1, "invalid operand to binary operator");
2828 break;
2830 case CONSTRUCTOR:
2831 if (TREE_CONSTANT (t) && TREE_CODE (TREE_TYPE (t)) == VECTOR_TYPE)
2832 *walk_subtrees = 0;
2833 break;
2835 default:
2836 break;
2838 return NULL;
2840 #undef CHECK_OP
2844 /* Verify if EXPR is either a GIMPLE ID or a GIMPLE indirect reference.
2845 Returns true if there is an error, otherwise false. */
2847 static bool
2848 verify_types_in_gimple_min_lval (tree expr)
2850 tree op;
2852 if (is_gimple_id (expr))
2853 return false;
2855 if (TREE_CODE (expr) != MISALIGNED_INDIRECT_REF
2856 && TREE_CODE (expr) != TARGET_MEM_REF
2857 && TREE_CODE (expr) != MEM_REF)
2859 error ("invalid expression for min lvalue");
2860 return true;
2863 /* TARGET_MEM_REFs are strange beasts. */
2864 if (TREE_CODE (expr) == TARGET_MEM_REF)
2865 return false;
2867 op = TREE_OPERAND (expr, 0);
2868 if (!is_gimple_val (op))
2870 error ("invalid operand in indirect reference");
2871 debug_generic_stmt (op);
2872 return true;
2874 /* Memory references now generally can involve a value conversion. */
2876 return false;
2879 /* Verify if EXPR is a valid GIMPLE reference expression. If
2880 REQUIRE_LVALUE is true verifies it is an lvalue. Returns true
2881 if there is an error, otherwise false. */
2883 static bool
2884 verify_types_in_gimple_reference (tree expr, bool require_lvalue)
2886 while (handled_component_p (expr))
2888 tree op = TREE_OPERAND (expr, 0);
2890 if (TREE_CODE (expr) == ARRAY_REF
2891 || TREE_CODE (expr) == ARRAY_RANGE_REF)
2893 if (!is_gimple_val (TREE_OPERAND (expr, 1))
2894 || (TREE_OPERAND (expr, 2)
2895 && !is_gimple_val (TREE_OPERAND (expr, 2)))
2896 || (TREE_OPERAND (expr, 3)
2897 && !is_gimple_val (TREE_OPERAND (expr, 3))))
2899 error ("invalid operands to array reference");
2900 debug_generic_stmt (expr);
2901 return true;
2905 /* Verify if the reference array element types are compatible. */
2906 if (TREE_CODE (expr) == ARRAY_REF
2907 && !useless_type_conversion_p (TREE_TYPE (expr),
2908 TREE_TYPE (TREE_TYPE (op))))
2910 error ("type mismatch in array reference");
2911 debug_generic_stmt (TREE_TYPE (expr));
2912 debug_generic_stmt (TREE_TYPE (TREE_TYPE (op)));
2913 return true;
2915 if (TREE_CODE (expr) == ARRAY_RANGE_REF
2916 && !useless_type_conversion_p (TREE_TYPE (TREE_TYPE (expr)),
2917 TREE_TYPE (TREE_TYPE (op))))
2919 error ("type mismatch in array range reference");
2920 debug_generic_stmt (TREE_TYPE (TREE_TYPE (expr)));
2921 debug_generic_stmt (TREE_TYPE (TREE_TYPE (op)));
2922 return true;
2925 if ((TREE_CODE (expr) == REALPART_EXPR
2926 || TREE_CODE (expr) == IMAGPART_EXPR)
2927 && !useless_type_conversion_p (TREE_TYPE (expr),
2928 TREE_TYPE (TREE_TYPE (op))))
2930 error ("type mismatch in real/imagpart reference");
2931 debug_generic_stmt (TREE_TYPE (expr));
2932 debug_generic_stmt (TREE_TYPE (TREE_TYPE (op)));
2933 return true;
2936 if (TREE_CODE (expr) == COMPONENT_REF
2937 && !useless_type_conversion_p (TREE_TYPE (expr),
2938 TREE_TYPE (TREE_OPERAND (expr, 1))))
2940 error ("type mismatch in component reference");
2941 debug_generic_stmt (TREE_TYPE (expr));
2942 debug_generic_stmt (TREE_TYPE (TREE_OPERAND (expr, 1)));
2943 return true;
2946 if (TREE_CODE (expr) == VIEW_CONVERT_EXPR)
2948 /* For VIEW_CONVERT_EXPRs which are allowed here too, we only check
2949 that their operand is not an SSA name or an invariant when
2950 requiring an lvalue (this usually means there is a SRA or IPA-SRA
2951 bug). Otherwise there is nothing to verify, gross mismatches at
2952 most invoke undefined behavior. */
2953 if (require_lvalue
2954 && (TREE_CODE (op) == SSA_NAME
2955 || is_gimple_min_invariant (op)))
2957 error ("Conversion of an SSA_NAME on the left hand side.");
2958 debug_generic_stmt (expr);
2959 return true;
2961 else if (TREE_CODE (op) == SSA_NAME
2962 && TYPE_SIZE (TREE_TYPE (expr)) != TYPE_SIZE (TREE_TYPE (op)))
2964 error ("Conversion of register to a different size.");
2965 debug_generic_stmt (expr);
2966 return true;
2968 else if (!handled_component_p (op))
2969 return false;
2972 expr = op;
2975 if (TREE_CODE (expr) == MEM_REF)
2977 if (!is_gimple_mem_ref_addr (TREE_OPERAND (expr, 0)))
2979 error ("Invalid address operand in MEM_REF.");
2980 debug_generic_stmt (expr);
2981 return true;
2983 if (TREE_CODE (TREE_OPERAND (expr, 1)) != INTEGER_CST
2984 || !POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (expr, 1))))
2986 error ("Invalid offset operand in MEM_REF.");
2987 debug_generic_stmt (expr);
2988 return true;
2992 return ((require_lvalue || !is_gimple_min_invariant (expr))
2993 && verify_types_in_gimple_min_lval (expr));
2996 /* Returns true if there is one pointer type in TYPE_POINTER_TO (SRC_OBJ)
2997 list of pointer-to types that is trivially convertible to DEST. */
2999 static bool
3000 one_pointer_to_useless_type_conversion_p (tree dest, tree src_obj)
3002 tree src;
3004 if (!TYPE_POINTER_TO (src_obj))
3005 return true;
3007 for (src = TYPE_POINTER_TO (src_obj); src; src = TYPE_NEXT_PTR_TO (src))
3008 if (useless_type_conversion_p (dest, src))
3009 return true;
3011 return false;
3014 /* Return true if TYPE1 is a fixed-point type and if conversions to and
3015 from TYPE2 can be handled by FIXED_CONVERT_EXPR. */
3017 static bool
3018 valid_fixed_convert_types_p (tree type1, tree type2)
3020 return (FIXED_POINT_TYPE_P (type1)
3021 && (INTEGRAL_TYPE_P (type2)
3022 || SCALAR_FLOAT_TYPE_P (type2)
3023 || FIXED_POINT_TYPE_P (type2)));
3026 /* Verify the contents of a GIMPLE_CALL STMT. Returns true when there
3027 is a problem, otherwise false. */
3029 static bool
3030 verify_gimple_call (gimple stmt)
3032 tree fn = gimple_call_fn (stmt);
3033 tree fntype;
3034 unsigned i;
3036 if (TREE_CODE (fn) != OBJ_TYPE_REF
3037 && !is_gimple_val (fn))
3039 error ("invalid function in gimple call");
3040 debug_generic_stmt (fn);
3041 return true;
3044 if (!POINTER_TYPE_P (TREE_TYPE (fn))
3045 || (TREE_CODE (TREE_TYPE (TREE_TYPE (fn))) != FUNCTION_TYPE
3046 && TREE_CODE (TREE_TYPE (TREE_TYPE (fn))) != METHOD_TYPE))
3048 error ("non-function in gimple call");
3049 return true;
3052 if (gimple_call_lhs (stmt)
3053 && (!is_gimple_lvalue (gimple_call_lhs (stmt))
3054 || verify_types_in_gimple_reference (gimple_call_lhs (stmt), true)))
3056 error ("invalid LHS in gimple call");
3057 return true;
3060 if (gimple_call_lhs (stmt) && gimple_call_noreturn_p (stmt))
3062 error ("LHS in noreturn call");
3063 return true;
3066 fntype = TREE_TYPE (TREE_TYPE (fn));
3067 if (gimple_call_lhs (stmt)
3068 && !useless_type_conversion_p (TREE_TYPE (gimple_call_lhs (stmt)),
3069 TREE_TYPE (fntype))
3070 /* ??? At least C++ misses conversions at assignments from
3071 void * call results.
3072 ??? Java is completely off. Especially with functions
3073 returning java.lang.Object.
3074 For now simply allow arbitrary pointer type conversions. */
3075 && !(POINTER_TYPE_P (TREE_TYPE (gimple_call_lhs (stmt)))
3076 && POINTER_TYPE_P (TREE_TYPE (fntype))))
3078 error ("invalid conversion in gimple call");
3079 debug_generic_stmt (TREE_TYPE (gimple_call_lhs (stmt)));
3080 debug_generic_stmt (TREE_TYPE (fntype));
3081 return true;
3084 if (gimple_call_chain (stmt)
3085 && !is_gimple_val (gimple_call_chain (stmt)))
3087 error ("invalid static chain in gimple call");
3088 debug_generic_stmt (gimple_call_chain (stmt));
3089 return true;
3092 /* If there is a static chain argument, this should not be an indirect
3093 call, and the decl should have DECL_STATIC_CHAIN set. */
3094 if (gimple_call_chain (stmt))
3096 if (TREE_CODE (fn) != ADDR_EXPR
3097 || TREE_CODE (TREE_OPERAND (fn, 0)) != FUNCTION_DECL)
3099 error ("static chain in indirect gimple call");
3100 return true;
3102 fn = TREE_OPERAND (fn, 0);
3104 if (!DECL_STATIC_CHAIN (fn))
3106 error ("static chain with function that doesn't use one");
3107 return true;
3111 /* ??? The C frontend passes unpromoted arguments in case it
3112 didn't see a function declaration before the call. So for now
3113 leave the call arguments mostly unverified. Once we gimplify
3114 unit-at-a-time we have a chance to fix this. */
3116 for (i = 0; i < gimple_call_num_args (stmt); ++i)
3118 tree arg = gimple_call_arg (stmt, i);
3119 if ((is_gimple_reg_type (TREE_TYPE (arg))
3120 && !is_gimple_val (arg))
3121 || (!is_gimple_reg_type (TREE_TYPE (arg))
3122 && !is_gimple_lvalue (arg)))
3124 error ("invalid argument to gimple call");
3125 debug_generic_expr (arg);
3129 return false;
3132 /* Verifies the gimple comparison with the result type TYPE and
3133 the operands OP0 and OP1. */
3135 static bool
3136 verify_gimple_comparison (tree type, tree op0, tree op1)
3138 tree op0_type = TREE_TYPE (op0);
3139 tree op1_type = TREE_TYPE (op1);
3141 if (!is_gimple_val (op0) || !is_gimple_val (op1))
3143 error ("invalid operands in gimple comparison");
3144 return true;
3147 /* For comparisons we do not have the operations type as the
3148 effective type the comparison is carried out in. Instead
3149 we require that either the first operand is trivially
3150 convertible into the second, or the other way around.
3151 The resulting type of a comparison may be any integral type.
3152 Because we special-case pointers to void we allow
3153 comparisons of pointers with the same mode as well. */
3154 if ((!useless_type_conversion_p (op0_type, op1_type)
3155 && !useless_type_conversion_p (op1_type, op0_type)
3156 && (!POINTER_TYPE_P (op0_type)
3157 || !POINTER_TYPE_P (op1_type)
3158 || TYPE_MODE (op0_type) != TYPE_MODE (op1_type)))
3159 || !INTEGRAL_TYPE_P (type))
3161 error ("type mismatch in comparison expression");
3162 debug_generic_expr (type);
3163 debug_generic_expr (op0_type);
3164 debug_generic_expr (op1_type);
3165 return true;
3168 return false;
3171 /* Verify a gimple assignment statement STMT with an unary rhs.
3172 Returns true if anything is wrong. */
3174 static bool
3175 verify_gimple_assign_unary (gimple stmt)
3177 enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
3178 tree lhs = gimple_assign_lhs (stmt);
3179 tree lhs_type = TREE_TYPE (lhs);
3180 tree rhs1 = gimple_assign_rhs1 (stmt);
3181 tree rhs1_type = TREE_TYPE (rhs1);
3183 if (!is_gimple_reg (lhs)
3184 && !(optimize == 0
3185 && TREE_CODE (lhs_type) == COMPLEX_TYPE))
3187 error ("non-register as LHS of unary operation");
3188 return true;
3191 if (!is_gimple_val (rhs1))
3193 error ("invalid operand in unary operation");
3194 return true;
3197 /* First handle conversions. */
3198 switch (rhs_code)
3200 CASE_CONVERT:
3202 /* Allow conversions between integral types and pointers only if
3203 there is no sign or zero extension involved.
3204 For targets were the precision of sizetype doesn't match that
3205 of pointers we need to allow arbitrary conversions from and
3206 to sizetype. */
3207 if ((POINTER_TYPE_P (lhs_type)
3208 && INTEGRAL_TYPE_P (rhs1_type)
3209 && (TYPE_PRECISION (lhs_type) >= TYPE_PRECISION (rhs1_type)
3210 || rhs1_type == sizetype))
3211 || (POINTER_TYPE_P (rhs1_type)
3212 && INTEGRAL_TYPE_P (lhs_type)
3213 && (TYPE_PRECISION (rhs1_type) >= TYPE_PRECISION (lhs_type)
3214 || lhs_type == sizetype)))
3215 return false;
3217 /* Allow conversion from integer to offset type and vice versa. */
3218 if ((TREE_CODE (lhs_type) == OFFSET_TYPE
3219 && TREE_CODE (rhs1_type) == INTEGER_TYPE)
3220 || (TREE_CODE (lhs_type) == INTEGER_TYPE
3221 && TREE_CODE (rhs1_type) == OFFSET_TYPE))
3222 return false;
3224 /* Otherwise assert we are converting between types of the
3225 same kind. */
3226 if (INTEGRAL_TYPE_P (lhs_type) != INTEGRAL_TYPE_P (rhs1_type))
3228 error ("invalid types in nop conversion");
3229 debug_generic_expr (lhs_type);
3230 debug_generic_expr (rhs1_type);
3231 return true;
3234 return false;
3237 case ADDR_SPACE_CONVERT_EXPR:
3239 if (!POINTER_TYPE_P (rhs1_type) || !POINTER_TYPE_P (lhs_type)
3240 || (TYPE_ADDR_SPACE (TREE_TYPE (rhs1_type))
3241 == TYPE_ADDR_SPACE (TREE_TYPE (lhs_type))))
3243 error ("invalid types in address space conversion");
3244 debug_generic_expr (lhs_type);
3245 debug_generic_expr (rhs1_type);
3246 return true;
3249 return false;
3252 case FIXED_CONVERT_EXPR:
3254 if (!valid_fixed_convert_types_p (lhs_type, rhs1_type)
3255 && !valid_fixed_convert_types_p (rhs1_type, lhs_type))
3257 error ("invalid types in fixed-point conversion");
3258 debug_generic_expr (lhs_type);
3259 debug_generic_expr (rhs1_type);
3260 return true;
3263 return false;
3266 case FLOAT_EXPR:
3268 if (!INTEGRAL_TYPE_P (rhs1_type) || !SCALAR_FLOAT_TYPE_P (lhs_type))
3270 error ("invalid types in conversion to floating point");
3271 debug_generic_expr (lhs_type);
3272 debug_generic_expr (rhs1_type);
3273 return true;
3276 return false;
3279 case FIX_TRUNC_EXPR:
3281 if (!INTEGRAL_TYPE_P (lhs_type) || !SCALAR_FLOAT_TYPE_P (rhs1_type))
3283 error ("invalid types in conversion to integer");
3284 debug_generic_expr (lhs_type);
3285 debug_generic_expr (rhs1_type);
3286 return true;
3289 return false;
3292 case VEC_UNPACK_HI_EXPR:
3293 case VEC_UNPACK_LO_EXPR:
3294 case REDUC_MAX_EXPR:
3295 case REDUC_MIN_EXPR:
3296 case REDUC_PLUS_EXPR:
3297 case VEC_UNPACK_FLOAT_HI_EXPR:
3298 case VEC_UNPACK_FLOAT_LO_EXPR:
3299 /* FIXME. */
3300 return false;
3302 case TRUTH_NOT_EXPR:
3303 case NEGATE_EXPR:
3304 case ABS_EXPR:
3305 case BIT_NOT_EXPR:
3306 case PAREN_EXPR:
3307 case NON_LVALUE_EXPR:
3308 case CONJ_EXPR:
3309 break;
3311 default:
3312 gcc_unreachable ();
3315 /* For the remaining codes assert there is no conversion involved. */
3316 if (!useless_type_conversion_p (lhs_type, rhs1_type))
3318 error ("non-trivial conversion in unary operation");
3319 debug_generic_expr (lhs_type);
3320 debug_generic_expr (rhs1_type);
3321 return true;
3324 return false;
3327 /* Verify a gimple assignment statement STMT with a binary rhs.
3328 Returns true if anything is wrong. */
3330 static bool
3331 verify_gimple_assign_binary (gimple stmt)
3333 enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
3334 tree lhs = gimple_assign_lhs (stmt);
3335 tree lhs_type = TREE_TYPE (lhs);
3336 tree rhs1 = gimple_assign_rhs1 (stmt);
3337 tree rhs1_type = TREE_TYPE (rhs1);
3338 tree rhs2 = gimple_assign_rhs2 (stmt);
3339 tree rhs2_type = TREE_TYPE (rhs2);
3341 if (!is_gimple_reg (lhs)
3342 && !(optimize == 0
3343 && TREE_CODE (lhs_type) == COMPLEX_TYPE))
3345 error ("non-register as LHS of binary operation");
3346 return true;
3349 if (!is_gimple_val (rhs1)
3350 || !is_gimple_val (rhs2))
3352 error ("invalid operands in binary operation");
3353 return true;
3356 /* First handle operations that involve different types. */
3357 switch (rhs_code)
3359 case COMPLEX_EXPR:
3361 if (TREE_CODE (lhs_type) != COMPLEX_TYPE
3362 || !(INTEGRAL_TYPE_P (rhs1_type)
3363 || SCALAR_FLOAT_TYPE_P (rhs1_type))
3364 || !(INTEGRAL_TYPE_P (rhs2_type)
3365 || SCALAR_FLOAT_TYPE_P (rhs2_type)))
3367 error ("type mismatch in complex expression");
3368 debug_generic_expr (lhs_type);
3369 debug_generic_expr (rhs1_type);
3370 debug_generic_expr (rhs2_type);
3371 return true;
3374 return false;
3377 case LSHIFT_EXPR:
3378 case RSHIFT_EXPR:
3379 case LROTATE_EXPR:
3380 case RROTATE_EXPR:
3382 /* Shifts and rotates are ok on integral types, fixed point
3383 types and integer vector types. */
3384 if ((!INTEGRAL_TYPE_P (rhs1_type)
3385 && !FIXED_POINT_TYPE_P (rhs1_type)
3386 && !(TREE_CODE (rhs1_type) == VECTOR_TYPE
3387 && INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))))
3388 || (!INTEGRAL_TYPE_P (rhs2_type)
3389 /* Vector shifts of vectors are also ok. */
3390 && !(TREE_CODE (rhs1_type) == VECTOR_TYPE
3391 && INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))
3392 && TREE_CODE (rhs2_type) == VECTOR_TYPE
3393 && INTEGRAL_TYPE_P (TREE_TYPE (rhs2_type))))
3394 || !useless_type_conversion_p (lhs_type, rhs1_type))
3396 error ("type mismatch in shift expression");
3397 debug_generic_expr (lhs_type);
3398 debug_generic_expr (rhs1_type);
3399 debug_generic_expr (rhs2_type);
3400 return true;
3403 return false;
3406 case VEC_LSHIFT_EXPR:
3407 case VEC_RSHIFT_EXPR:
3409 if (TREE_CODE (rhs1_type) != VECTOR_TYPE
3410 || !(INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))
3411 || FIXED_POINT_TYPE_P (TREE_TYPE (rhs1_type))
3412 || SCALAR_FLOAT_TYPE_P (TREE_TYPE (rhs1_type)))
3413 || (!INTEGRAL_TYPE_P (rhs2_type)
3414 && (TREE_CODE (rhs2_type) != VECTOR_TYPE
3415 || !INTEGRAL_TYPE_P (TREE_TYPE (rhs2_type))))
3416 || !useless_type_conversion_p (lhs_type, rhs1_type))
3418 error ("type mismatch in vector shift expression");
3419 debug_generic_expr (lhs_type);
3420 debug_generic_expr (rhs1_type);
3421 debug_generic_expr (rhs2_type);
3422 return true;
3424 /* For shifting a vector of floating point components we
3425 only allow shifting by a constant multiple of the element size. */
3426 if (SCALAR_FLOAT_TYPE_P (TREE_TYPE (rhs1_type))
3427 && (TREE_CODE (rhs2) != INTEGER_CST
3428 || !div_if_zero_remainder (EXACT_DIV_EXPR, rhs2,
3429 TYPE_SIZE (TREE_TYPE (rhs1_type)))))
3431 error ("non-element sized vector shift of floating point vector");
3432 return true;
3435 return false;
3438 case PLUS_EXPR:
3440 /* We use regular PLUS_EXPR for vectors.
3441 ??? This just makes the checker happy and may not be what is
3442 intended. */
3443 if (TREE_CODE (lhs_type) == VECTOR_TYPE
3444 && POINTER_TYPE_P (TREE_TYPE (lhs_type)))
3446 if (TREE_CODE (rhs1_type) != VECTOR_TYPE
3447 || TREE_CODE (rhs2_type) != VECTOR_TYPE)
3449 error ("invalid non-vector operands to vector valued plus");
3450 return true;
3452 lhs_type = TREE_TYPE (lhs_type);
3453 rhs1_type = TREE_TYPE (rhs1_type);
3454 rhs2_type = TREE_TYPE (rhs2_type);
3455 /* PLUS_EXPR is commutative, so we might end up canonicalizing
3456 the pointer to 2nd place. */
3457 if (POINTER_TYPE_P (rhs2_type))
3459 tree tem = rhs1_type;
3460 rhs1_type = rhs2_type;
3461 rhs2_type = tem;
3463 goto do_pointer_plus_expr_check;
3466 /* Fallthru. */
3467 case MINUS_EXPR:
3469 if (POINTER_TYPE_P (lhs_type)
3470 || POINTER_TYPE_P (rhs1_type)
3471 || POINTER_TYPE_P (rhs2_type))
3473 error ("invalid (pointer) operands to plus/minus");
3474 return true;
3477 /* Continue with generic binary expression handling. */
3478 break;
3481 case POINTER_PLUS_EXPR:
3483 do_pointer_plus_expr_check:
3484 if (!POINTER_TYPE_P (rhs1_type)
3485 || !useless_type_conversion_p (lhs_type, rhs1_type)
3486 || !useless_type_conversion_p (sizetype, rhs2_type))
3488 error ("type mismatch in pointer plus expression");
3489 debug_generic_stmt (lhs_type);
3490 debug_generic_stmt (rhs1_type);
3491 debug_generic_stmt (rhs2_type);
3492 return true;
3495 return false;
3498 case TRUTH_ANDIF_EXPR:
3499 case TRUTH_ORIF_EXPR:
3500 gcc_unreachable ();
3502 case TRUTH_AND_EXPR:
3503 case TRUTH_OR_EXPR:
3504 case TRUTH_XOR_EXPR:
3506 /* We allow any kind of integral typed argument and result. */
3507 if (!INTEGRAL_TYPE_P (rhs1_type)
3508 || !INTEGRAL_TYPE_P (rhs2_type)
3509 || !INTEGRAL_TYPE_P (lhs_type))
3511 error ("type mismatch in binary truth expression");
3512 debug_generic_expr (lhs_type);
3513 debug_generic_expr (rhs1_type);
3514 debug_generic_expr (rhs2_type);
3515 return true;
3518 return false;
3521 case LT_EXPR:
3522 case LE_EXPR:
3523 case GT_EXPR:
3524 case GE_EXPR:
3525 case EQ_EXPR:
3526 case NE_EXPR:
3527 case UNORDERED_EXPR:
3528 case ORDERED_EXPR:
3529 case UNLT_EXPR:
3530 case UNLE_EXPR:
3531 case UNGT_EXPR:
3532 case UNGE_EXPR:
3533 case UNEQ_EXPR:
3534 case LTGT_EXPR:
3535 /* Comparisons are also binary, but the result type is not
3536 connected to the operand types. */
3537 return verify_gimple_comparison (lhs_type, rhs1, rhs2);
3539 case WIDEN_MULT_EXPR:
3540 if (TREE_CODE (lhs_type) != INTEGER_TYPE)
3541 return true;
3542 return ((2 * TYPE_PRECISION (rhs1_type) != TYPE_PRECISION (lhs_type))
3543 || (TYPE_PRECISION (rhs1_type) != TYPE_PRECISION (rhs2_type)));
3545 case WIDEN_SUM_EXPR:
3546 case VEC_WIDEN_MULT_HI_EXPR:
3547 case VEC_WIDEN_MULT_LO_EXPR:
3548 case VEC_PACK_TRUNC_EXPR:
3549 case VEC_PACK_SAT_EXPR:
3550 case VEC_PACK_FIX_TRUNC_EXPR:
3551 case VEC_EXTRACT_EVEN_EXPR:
3552 case VEC_EXTRACT_ODD_EXPR:
3553 case VEC_INTERLEAVE_HIGH_EXPR:
3554 case VEC_INTERLEAVE_LOW_EXPR:
3555 /* FIXME. */
3556 return false;
3558 case MULT_EXPR:
3559 case TRUNC_DIV_EXPR:
3560 case CEIL_DIV_EXPR:
3561 case FLOOR_DIV_EXPR:
3562 case ROUND_DIV_EXPR:
3563 case TRUNC_MOD_EXPR:
3564 case CEIL_MOD_EXPR:
3565 case FLOOR_MOD_EXPR:
3566 case ROUND_MOD_EXPR:
3567 case RDIV_EXPR:
3568 case EXACT_DIV_EXPR:
3569 case MIN_EXPR:
3570 case MAX_EXPR:
3571 case BIT_IOR_EXPR:
3572 case BIT_XOR_EXPR:
3573 case BIT_AND_EXPR:
3574 /* Continue with generic binary expression handling. */
3575 break;
3577 default:
3578 gcc_unreachable ();
3581 if (!useless_type_conversion_p (lhs_type, rhs1_type)
3582 || !useless_type_conversion_p (lhs_type, rhs2_type))
3584 error ("type mismatch in binary expression");
3585 debug_generic_stmt (lhs_type);
3586 debug_generic_stmt (rhs1_type);
3587 debug_generic_stmt (rhs2_type);
3588 return true;
3591 return false;
3594 /* Verify a gimple assignment statement STMT with a ternary rhs.
3595 Returns true if anything is wrong. */
3597 static bool
3598 verify_gimple_assign_ternary (gimple stmt)
3600 enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
3601 tree lhs = gimple_assign_lhs (stmt);
3602 tree lhs_type = TREE_TYPE (lhs);
3603 tree rhs1 = gimple_assign_rhs1 (stmt);
3604 tree rhs1_type = TREE_TYPE (rhs1);
3605 tree rhs2 = gimple_assign_rhs2 (stmt);
3606 tree rhs2_type = TREE_TYPE (rhs2);
3607 tree rhs3 = gimple_assign_rhs3 (stmt);
3608 tree rhs3_type = TREE_TYPE (rhs3);
3610 if (!is_gimple_reg (lhs)
3611 && !(optimize == 0
3612 && TREE_CODE (lhs_type) == COMPLEX_TYPE))
3614 error ("non-register as LHS of ternary operation");
3615 return true;
3618 if (!is_gimple_val (rhs1)
3619 || !is_gimple_val (rhs2)
3620 || !is_gimple_val (rhs3))
3622 error ("invalid operands in ternary operation");
3623 return true;
3626 /* First handle operations that involve different types. */
3627 switch (rhs_code)
3629 case WIDEN_MULT_PLUS_EXPR:
3630 case WIDEN_MULT_MINUS_EXPR:
3631 if ((!INTEGRAL_TYPE_P (rhs1_type)
3632 && !FIXED_POINT_TYPE_P (rhs1_type))
3633 || !useless_type_conversion_p (rhs1_type, rhs2_type)
3634 || !useless_type_conversion_p (lhs_type, rhs3_type)
3635 || 2 * TYPE_PRECISION (rhs1_type) != TYPE_PRECISION (lhs_type)
3636 || TYPE_PRECISION (rhs1_type) != TYPE_PRECISION (rhs2_type))
3638 error ("type mismatch in widening multiply-accumulate expression");
3639 debug_generic_expr (lhs_type);
3640 debug_generic_expr (rhs1_type);
3641 debug_generic_expr (rhs2_type);
3642 debug_generic_expr (rhs3_type);
3643 return true;
3645 break;
3647 default:
3648 gcc_unreachable ();
3650 return false;
3653 /* Verify a gimple assignment statement STMT with a single rhs.
3654 Returns true if anything is wrong. */
3656 static bool
3657 verify_gimple_assign_single (gimple stmt)
3659 enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
3660 tree lhs = gimple_assign_lhs (stmt);
3661 tree lhs_type = TREE_TYPE (lhs);
3662 tree rhs1 = gimple_assign_rhs1 (stmt);
3663 tree rhs1_type = TREE_TYPE (rhs1);
3664 bool res = false;
3666 if (!useless_type_conversion_p (lhs_type, rhs1_type))
3668 error ("non-trivial conversion at assignment");
3669 debug_generic_expr (lhs_type);
3670 debug_generic_expr (rhs1_type);
3671 return true;
3674 if (handled_component_p (lhs))
3675 res |= verify_types_in_gimple_reference (lhs, true);
3677 /* Special codes we cannot handle via their class. */
3678 switch (rhs_code)
3680 case ADDR_EXPR:
3682 tree op = TREE_OPERAND (rhs1, 0);
3683 if (!is_gimple_addressable (op))
3685 error ("invalid operand in unary expression");
3686 return true;
3689 if (!types_compatible_p (TREE_TYPE (op), TREE_TYPE (TREE_TYPE (rhs1)))
3690 && !one_pointer_to_useless_type_conversion_p (TREE_TYPE (rhs1),
3691 TREE_TYPE (op)))
3693 error ("type mismatch in address expression");
3694 debug_generic_stmt (TREE_TYPE (rhs1));
3695 debug_generic_stmt (TREE_TYPE (op));
3696 return true;
3699 return verify_types_in_gimple_reference (op, true);
3702 /* tcc_reference */
3703 case INDIRECT_REF:
3704 error ("INDIRECT_REF in gimple IL");
3705 return true;
3707 case COMPONENT_REF:
3708 case BIT_FIELD_REF:
3709 case MISALIGNED_INDIRECT_REF:
3710 case ARRAY_REF:
3711 case ARRAY_RANGE_REF:
3712 case VIEW_CONVERT_EXPR:
3713 case REALPART_EXPR:
3714 case IMAGPART_EXPR:
3715 case TARGET_MEM_REF:
3716 case MEM_REF:
3717 if (!is_gimple_reg (lhs)
3718 && is_gimple_reg_type (TREE_TYPE (lhs)))
3720 error ("invalid rhs for gimple memory store");
3721 debug_generic_stmt (lhs);
3722 debug_generic_stmt (rhs1);
3723 return true;
3725 return res || verify_types_in_gimple_reference (rhs1, false);
3727 /* tcc_constant */
3728 case SSA_NAME:
3729 case INTEGER_CST:
3730 case REAL_CST:
3731 case FIXED_CST:
3732 case COMPLEX_CST:
3733 case VECTOR_CST:
3734 case STRING_CST:
3735 return res;
3737 /* tcc_declaration */
3738 case CONST_DECL:
3739 return res;
3740 case VAR_DECL:
3741 case PARM_DECL:
3742 if (!is_gimple_reg (lhs)
3743 && !is_gimple_reg (rhs1)
3744 && is_gimple_reg_type (TREE_TYPE (lhs)))
3746 error ("invalid rhs for gimple memory store");
3747 debug_generic_stmt (lhs);
3748 debug_generic_stmt (rhs1);
3749 return true;
3751 return res;
3753 case COND_EXPR:
3754 if (!is_gimple_reg (lhs)
3755 || (!is_gimple_reg (TREE_OPERAND (rhs1, 0))
3756 && !COMPARISON_CLASS_P (TREE_OPERAND (rhs1, 0)))
3757 || (!is_gimple_reg (TREE_OPERAND (rhs1, 1))
3758 && !is_gimple_min_invariant (TREE_OPERAND (rhs1, 1)))
3759 || (!is_gimple_reg (TREE_OPERAND (rhs1, 2))
3760 && !is_gimple_min_invariant (TREE_OPERAND (rhs1, 2))))
3762 error ("invalid COND_EXPR in gimple assignment");
3763 debug_generic_stmt (rhs1);
3764 return true;
3766 return res;
3768 case CONSTRUCTOR:
3769 case OBJ_TYPE_REF:
3770 case ASSERT_EXPR:
3771 case WITH_SIZE_EXPR:
3772 case POLYNOMIAL_CHREC:
3773 case DOT_PROD_EXPR:
3774 case VEC_COND_EXPR:
3775 case REALIGN_LOAD_EXPR:
3776 /* FIXME. */
3777 return res;
3779 default:;
3782 return res;
3785 /* Verify the contents of a GIMPLE_ASSIGN STMT. Returns true when there
3786 is a problem, otherwise false. */
3788 static bool
3789 verify_gimple_assign (gimple stmt)
3791 switch (gimple_assign_rhs_class (stmt))
3793 case GIMPLE_SINGLE_RHS:
3794 return verify_gimple_assign_single (stmt);
3796 case GIMPLE_UNARY_RHS:
3797 return verify_gimple_assign_unary (stmt);
3799 case GIMPLE_BINARY_RHS:
3800 return verify_gimple_assign_binary (stmt);
3802 case GIMPLE_TERNARY_RHS:
3803 return verify_gimple_assign_ternary (stmt);
3805 default:
3806 gcc_unreachable ();
3810 /* Verify the contents of a GIMPLE_RETURN STMT. Returns true when there
3811 is a problem, otherwise false. */
3813 static bool
3814 verify_gimple_return (gimple stmt)
3816 tree op = gimple_return_retval (stmt);
3817 tree restype = TREE_TYPE (TREE_TYPE (cfun->decl));
3819 /* We cannot test for present return values as we do not fix up missing
3820 return values from the original source. */
3821 if (op == NULL)
3822 return false;
3824 if (!is_gimple_val (op)
3825 && TREE_CODE (op) != RESULT_DECL)
3827 error ("invalid operand in return statement");
3828 debug_generic_stmt (op);
3829 return true;
3832 if ((TREE_CODE (op) == RESULT_DECL
3833 && DECL_BY_REFERENCE (op))
3834 || (TREE_CODE (op) == SSA_NAME
3835 && TREE_CODE (SSA_NAME_VAR (op)) == RESULT_DECL
3836 && DECL_BY_REFERENCE (SSA_NAME_VAR (op))))
3837 op = TREE_TYPE (op);
3839 if (!useless_type_conversion_p (restype, TREE_TYPE (op)))
3841 error ("invalid conversion in return statement");
3842 debug_generic_stmt (restype);
3843 debug_generic_stmt (TREE_TYPE (op));
3844 return true;
3847 return false;
3851 /* Verify the contents of a GIMPLE_GOTO STMT. Returns true when there
3852 is a problem, otherwise false. */
3854 static bool
3855 verify_gimple_goto (gimple stmt)
3857 tree dest = gimple_goto_dest (stmt);
3859 /* ??? We have two canonical forms of direct goto destinations, a
3860 bare LABEL_DECL and an ADDR_EXPR of a LABEL_DECL. */
3861 if (TREE_CODE (dest) != LABEL_DECL
3862 && (!is_gimple_val (dest)
3863 || !POINTER_TYPE_P (TREE_TYPE (dest))))
3865 error ("goto destination is neither a label nor a pointer");
3866 return true;
3869 return false;
3872 /* Verify the contents of a GIMPLE_SWITCH STMT. Returns true when there
3873 is a problem, otherwise false. */
3875 static bool
3876 verify_gimple_switch (gimple stmt)
3878 if (!is_gimple_val (gimple_switch_index (stmt)))
3880 error ("invalid operand to switch statement");
3881 debug_generic_stmt (gimple_switch_index (stmt));
3882 return true;
3885 return false;
3889 /* Verify the contents of a GIMPLE_PHI. Returns true if there is a problem,
3890 and false otherwise. */
3892 static bool
3893 verify_gimple_phi (gimple stmt)
3895 tree type = TREE_TYPE (gimple_phi_result (stmt));
3896 unsigned i;
3898 if (TREE_CODE (gimple_phi_result (stmt)) != SSA_NAME)
3900 error ("Invalid PHI result");
3901 return true;
3904 for (i = 0; i < gimple_phi_num_args (stmt); i++)
3906 tree arg = gimple_phi_arg_def (stmt, i);
3907 if ((is_gimple_reg (gimple_phi_result (stmt))
3908 && !is_gimple_val (arg))
3909 || (!is_gimple_reg (gimple_phi_result (stmt))
3910 && !is_gimple_addressable (arg)))
3912 error ("Invalid PHI argument");
3913 debug_generic_stmt (arg);
3914 return true;
3916 if (!useless_type_conversion_p (type, TREE_TYPE (arg)))
3918 error ("Incompatible types in PHI argument %u", i);
3919 debug_generic_stmt (type);
3920 debug_generic_stmt (TREE_TYPE (arg));
3921 return true;
3925 return false;
3929 /* Verify a gimple debug statement STMT.
3930 Returns true if anything is wrong. */
3932 static bool
3933 verify_gimple_debug (gimple stmt ATTRIBUTE_UNUSED)
3935 /* There isn't much that could be wrong in a gimple debug stmt. A
3936 gimple debug bind stmt, for example, maps a tree, that's usually
3937 a VAR_DECL or a PARM_DECL, but that could also be some scalarized
3938 component or member of an aggregate type, to another tree, that
3939 can be an arbitrary expression. These stmts expand into debug
3940 insns, and are converted to debug notes by var-tracking.c. */
3941 return false;
3945 /* Verify the GIMPLE statement STMT. Returns true if there is an
3946 error, otherwise false. */
3948 static bool
3949 verify_types_in_gimple_stmt (gimple stmt)
3951 switch (gimple_code (stmt))
3953 case GIMPLE_ASSIGN:
3954 return verify_gimple_assign (stmt);
3956 case GIMPLE_LABEL:
3957 return TREE_CODE (gimple_label_label (stmt)) != LABEL_DECL;
3959 case GIMPLE_CALL:
3960 return verify_gimple_call (stmt);
3962 case GIMPLE_COND:
3963 if (TREE_CODE_CLASS (gimple_cond_code (stmt)) != tcc_comparison)
3965 error ("invalid comparison code in gimple cond");
3966 return true;
3968 if (!(!gimple_cond_true_label (stmt)
3969 || TREE_CODE (gimple_cond_true_label (stmt)) == LABEL_DECL)
3970 || !(!gimple_cond_false_label (stmt)
3971 || TREE_CODE (gimple_cond_false_label (stmt)) == LABEL_DECL))
3973 error ("invalid labels in gimple cond");
3974 return true;
3977 return verify_gimple_comparison (boolean_type_node,
3978 gimple_cond_lhs (stmt),
3979 gimple_cond_rhs (stmt));
3981 case GIMPLE_GOTO:
3982 return verify_gimple_goto (stmt);
3984 case GIMPLE_SWITCH:
3985 return verify_gimple_switch (stmt);
3987 case GIMPLE_RETURN:
3988 return verify_gimple_return (stmt);
3990 case GIMPLE_ASM:
3991 return false;
3993 case GIMPLE_PHI:
3994 return verify_gimple_phi (stmt);
3996 /* Tuples that do not have tree operands. */
3997 case GIMPLE_NOP:
3998 case GIMPLE_PREDICT:
3999 case GIMPLE_RESX:
4000 case GIMPLE_EH_DISPATCH:
4001 case GIMPLE_EH_MUST_NOT_THROW:
4002 return false;
4004 CASE_GIMPLE_OMP:
4005 /* OpenMP directives are validated by the FE and never operated
4006 on by the optimizers. Furthermore, GIMPLE_OMP_FOR may contain
4007 non-gimple expressions when the main index variable has had
4008 its address taken. This does not affect the loop itself
4009 because the header of an GIMPLE_OMP_FOR is merely used to determine
4010 how to setup the parallel iteration. */
4011 return false;
4013 case GIMPLE_DEBUG:
4014 return verify_gimple_debug (stmt);
4016 default:
4017 gcc_unreachable ();
4021 /* Verify the GIMPLE statements inside the sequence STMTS. */
4023 static bool
4024 verify_types_in_gimple_seq_2 (gimple_seq stmts)
4026 gimple_stmt_iterator ittr;
4027 bool err = false;
4029 for (ittr = gsi_start (stmts); !gsi_end_p (ittr); gsi_next (&ittr))
4031 gimple stmt = gsi_stmt (ittr);
4033 switch (gimple_code (stmt))
4035 case GIMPLE_BIND:
4036 err |= verify_types_in_gimple_seq_2 (gimple_bind_body (stmt));
4037 break;
4039 case GIMPLE_TRY:
4040 err |= verify_types_in_gimple_seq_2 (gimple_try_eval (stmt));
4041 err |= verify_types_in_gimple_seq_2 (gimple_try_cleanup (stmt));
4042 break;
4044 case GIMPLE_EH_FILTER:
4045 err |= verify_types_in_gimple_seq_2 (gimple_eh_filter_failure (stmt));
4046 break;
4048 case GIMPLE_CATCH:
4049 err |= verify_types_in_gimple_seq_2 (gimple_catch_handler (stmt));
4050 break;
4052 default:
4054 bool err2 = verify_types_in_gimple_stmt (stmt);
4055 if (err2)
4056 debug_gimple_stmt (stmt);
4057 err |= err2;
4062 return err;
4066 /* Verify the GIMPLE statements inside the statement list STMTS. */
4068 void
4069 verify_types_in_gimple_seq (gimple_seq stmts)
4071 if (verify_types_in_gimple_seq_2 (stmts))
4072 internal_error ("verify_gimple failed");
4076 /* Verify STMT, return true if STMT is not in GIMPLE form.
4077 TODO: Implement type checking. */
4079 static bool
4080 verify_stmt (gimple_stmt_iterator *gsi)
4082 tree addr;
4083 struct walk_stmt_info wi;
4084 bool last_in_block = gsi_one_before_end_p (*gsi);
4085 gimple stmt = gsi_stmt (*gsi);
4086 int lp_nr;
4088 if (is_gimple_omp (stmt))
4090 /* OpenMP directives are validated by the FE and never operated
4091 on by the optimizers. Furthermore, GIMPLE_OMP_FOR may contain
4092 non-gimple expressions when the main index variable has had
4093 its address taken. This does not affect the loop itself
4094 because the header of an GIMPLE_OMP_FOR is merely used to determine
4095 how to setup the parallel iteration. */
4096 return false;
4099 /* FIXME. The C frontend passes unpromoted arguments in case it
4100 didn't see a function declaration before the call. */
4101 if (is_gimple_call (stmt))
4103 tree decl;
4105 if (!is_gimple_call_addr (gimple_call_fn (stmt)))
4107 error ("invalid function in call statement");
4108 return true;
4111 decl = gimple_call_fndecl (stmt);
4112 if (decl
4113 && TREE_CODE (decl) == FUNCTION_DECL
4114 && DECL_LOOPING_CONST_OR_PURE_P (decl)
4115 && (!DECL_PURE_P (decl))
4116 && (!TREE_READONLY (decl)))
4118 error ("invalid pure const state for function");
4119 return true;
4123 if (is_gimple_debug (stmt))
4124 return false;
4126 memset (&wi, 0, sizeof (wi));
4127 addr = walk_gimple_op (gsi_stmt (*gsi), verify_expr, &wi);
4128 if (addr)
4130 debug_generic_expr (addr);
4131 inform (gimple_location (gsi_stmt (*gsi)), "in statement");
4132 debug_gimple_stmt (stmt);
4133 return true;
4136 /* If the statement is marked as part of an EH region, then it is
4137 expected that the statement could throw. Verify that when we
4138 have optimizations that simplify statements such that we prove
4139 that they cannot throw, that we update other data structures
4140 to match. */
4141 lp_nr = lookup_stmt_eh_lp (stmt);
4142 if (lp_nr != 0)
4144 if (!stmt_could_throw_p (stmt))
4146 error ("statement marked for throw, but doesn%'t");
4147 goto fail;
4149 else if (lp_nr > 0 && !last_in_block && stmt_can_throw_internal (stmt))
4151 error ("statement marked for throw in middle of block");
4152 goto fail;
4156 return false;
4158 fail:
4159 debug_gimple_stmt (stmt);
4160 return true;
4164 /* Return true when the T can be shared. */
4166 bool
4167 tree_node_can_be_shared (tree t)
4169 if (IS_TYPE_OR_DECL_P (t)
4170 || is_gimple_min_invariant (t)
4171 || TREE_CODE (t) == SSA_NAME
4172 || t == error_mark_node
4173 || TREE_CODE (t) == IDENTIFIER_NODE)
4174 return true;
4176 if (TREE_CODE (t) == CASE_LABEL_EXPR)
4177 return true;
4179 while (((TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
4180 && is_gimple_min_invariant (TREE_OPERAND (t, 1)))
4181 || TREE_CODE (t) == COMPONENT_REF
4182 || TREE_CODE (t) == REALPART_EXPR
4183 || TREE_CODE (t) == IMAGPART_EXPR)
4184 t = TREE_OPERAND (t, 0);
4186 if (DECL_P (t))
4187 return true;
4189 return false;
4193 /* Called via walk_gimple_stmt. Verify tree sharing. */
4195 static tree
4196 verify_node_sharing (tree *tp, int *walk_subtrees, void *data)
4198 struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
4199 struct pointer_set_t *visited = (struct pointer_set_t *) wi->info;
4201 if (tree_node_can_be_shared (*tp))
4203 *walk_subtrees = false;
4204 return NULL;
4207 if (pointer_set_insert (visited, *tp))
4208 return *tp;
4210 return NULL;
4214 static bool eh_error_found;
4215 static int
4216 verify_eh_throw_stmt_node (void **slot, void *data)
4218 struct throw_stmt_node *node = (struct throw_stmt_node *)*slot;
4219 struct pointer_set_t *visited = (struct pointer_set_t *) data;
4221 if (!pointer_set_contains (visited, node->stmt))
4223 error ("Dead STMT in EH table");
4224 debug_gimple_stmt (node->stmt);
4225 eh_error_found = true;
4227 return 1;
4231 /* Verify the GIMPLE statements in every basic block. */
4233 DEBUG_FUNCTION void
4234 verify_stmts (void)
4236 basic_block bb;
4237 gimple_stmt_iterator gsi;
4238 bool err = false;
4239 struct pointer_set_t *visited, *visited_stmts;
4240 tree addr;
4241 struct walk_stmt_info wi;
4243 timevar_push (TV_TREE_STMT_VERIFY);
4244 visited = pointer_set_create ();
4245 visited_stmts = pointer_set_create ();
4247 memset (&wi, 0, sizeof (wi));
4248 wi.info = (void *) visited;
4250 FOR_EACH_BB (bb)
4252 gimple phi;
4253 size_t i;
4255 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
4257 phi = gsi_stmt (gsi);
4258 pointer_set_insert (visited_stmts, phi);
4259 if (gimple_bb (phi) != bb)
4261 error ("gimple_bb (phi) is set to a wrong basic block");
4262 err |= true;
4265 for (i = 0; i < gimple_phi_num_args (phi); i++)
4267 tree t = gimple_phi_arg_def (phi, i);
4268 tree addr;
4270 if (!t)
4272 error ("missing PHI def");
4273 debug_gimple_stmt (phi);
4274 err |= true;
4275 continue;
4277 /* Addressable variables do have SSA_NAMEs but they
4278 are not considered gimple values. */
4279 else if (TREE_CODE (t) != SSA_NAME
4280 && TREE_CODE (t) != FUNCTION_DECL
4281 && !is_gimple_min_invariant (t))
4283 error ("PHI argument is not a GIMPLE value");
4284 debug_gimple_stmt (phi);
4285 debug_generic_expr (t);
4286 err |= true;
4289 addr = walk_tree (&t, verify_node_sharing, visited, NULL);
4290 if (addr)
4292 error ("incorrect sharing of tree nodes");
4293 debug_gimple_stmt (phi);
4294 debug_generic_expr (addr);
4295 err |= true;
4299 #ifdef ENABLE_TYPES_CHECKING
4300 if (verify_gimple_phi (phi))
4302 debug_gimple_stmt (phi);
4303 err |= true;
4305 #endif
4308 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); )
4310 gimple stmt = gsi_stmt (gsi);
4312 if (gimple_code (stmt) == GIMPLE_WITH_CLEANUP_EXPR
4313 || gimple_code (stmt) == GIMPLE_BIND)
4315 error ("invalid GIMPLE statement");
4316 debug_gimple_stmt (stmt);
4317 err |= true;
4320 pointer_set_insert (visited_stmts, stmt);
4322 if (gimple_bb (stmt) != bb)
4324 error ("gimple_bb (stmt) is set to a wrong basic block");
4325 debug_gimple_stmt (stmt);
4326 err |= true;
4329 if (gimple_code (stmt) == GIMPLE_LABEL)
4331 tree decl = gimple_label_label (stmt);
4332 int uid = LABEL_DECL_UID (decl);
4334 if (uid == -1
4335 || VEC_index (basic_block, label_to_block_map, uid) != bb)
4337 error ("incorrect entry in label_to_block_map");
4338 err |= true;
4341 uid = EH_LANDING_PAD_NR (decl);
4342 if (uid)
4344 eh_landing_pad lp = get_eh_landing_pad_from_number (uid);
4345 if (decl != lp->post_landing_pad)
4347 error ("incorrect setting of landing pad number");
4348 err |= true;
4353 err |= verify_stmt (&gsi);
4355 #ifdef ENABLE_TYPES_CHECKING
4356 if (verify_types_in_gimple_stmt (gsi_stmt (gsi)))
4358 debug_gimple_stmt (stmt);
4359 err |= true;
4361 #endif
4362 addr = walk_gimple_op (gsi_stmt (gsi), verify_node_sharing, &wi);
4363 if (addr)
4365 error ("incorrect sharing of tree nodes");
4366 debug_gimple_stmt (stmt);
4367 debug_generic_expr (addr);
4368 err |= true;
4370 gsi_next (&gsi);
4374 eh_error_found = false;
4375 if (get_eh_throw_stmt_table (cfun))
4376 htab_traverse (get_eh_throw_stmt_table (cfun),
4377 verify_eh_throw_stmt_node,
4378 visited_stmts);
4380 if (err | eh_error_found)
4381 internal_error ("verify_stmts failed");
4383 pointer_set_destroy (visited);
4384 pointer_set_destroy (visited_stmts);
4385 verify_histograms ();
4386 timevar_pop (TV_TREE_STMT_VERIFY);
4390 /* Verifies that the flow information is OK. */
4392 static int
4393 gimple_verify_flow_info (void)
4395 int err = 0;
4396 basic_block bb;
4397 gimple_stmt_iterator gsi;
4398 gimple stmt;
4399 edge e;
4400 edge_iterator ei;
4402 if (ENTRY_BLOCK_PTR->il.gimple)
4404 error ("ENTRY_BLOCK has IL associated with it");
4405 err = 1;
4408 if (EXIT_BLOCK_PTR->il.gimple)
4410 error ("EXIT_BLOCK has IL associated with it");
4411 err = 1;
4414 FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
4415 if (e->flags & EDGE_FALLTHRU)
4417 error ("fallthru to exit from bb %d", e->src->index);
4418 err = 1;
4421 FOR_EACH_BB (bb)
4423 bool found_ctrl_stmt = false;
4425 stmt = NULL;
4427 /* Skip labels on the start of basic block. */
4428 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
4430 tree label;
4431 gimple prev_stmt = stmt;
4433 stmt = gsi_stmt (gsi);
4435 if (gimple_code (stmt) != GIMPLE_LABEL)
4436 break;
4438 label = gimple_label_label (stmt);
4439 if (prev_stmt && DECL_NONLOCAL (label))
4441 error ("nonlocal label ");
4442 print_generic_expr (stderr, label, 0);
4443 fprintf (stderr, " is not first in a sequence of labels in bb %d",
4444 bb->index);
4445 err = 1;
4448 if (prev_stmt && EH_LANDING_PAD_NR (label) != 0)
4450 error ("EH landing pad label ");
4451 print_generic_expr (stderr, label, 0);
4452 fprintf (stderr, " is not first in a sequence of labels in bb %d",
4453 bb->index);
4454 err = 1;
4457 if (label_to_block (label) != bb)
4459 error ("label ");
4460 print_generic_expr (stderr, label, 0);
4461 fprintf (stderr, " to block does not match in bb %d",
4462 bb->index);
4463 err = 1;
4466 if (decl_function_context (label) != current_function_decl)
4468 error ("label ");
4469 print_generic_expr (stderr, label, 0);
4470 fprintf (stderr, " has incorrect context in bb %d",
4471 bb->index);
4472 err = 1;
4476 /* Verify that body of basic block BB is free of control flow. */
4477 for (; !gsi_end_p (gsi); gsi_next (&gsi))
4479 gimple stmt = gsi_stmt (gsi);
4481 if (found_ctrl_stmt)
4483 error ("control flow in the middle of basic block %d",
4484 bb->index);
4485 err = 1;
4488 if (stmt_ends_bb_p (stmt))
4489 found_ctrl_stmt = true;
4491 if (gimple_code (stmt) == GIMPLE_LABEL)
4493 error ("label ");
4494 print_generic_expr (stderr, gimple_label_label (stmt), 0);
4495 fprintf (stderr, " in the middle of basic block %d", bb->index);
4496 err = 1;
4500 gsi = gsi_last_bb (bb);
4501 if (gsi_end_p (gsi))
4502 continue;
4504 stmt = gsi_stmt (gsi);
4506 if (gimple_code (stmt) == GIMPLE_LABEL)
4507 continue;
4509 err |= verify_eh_edges (stmt);
4511 if (is_ctrl_stmt (stmt))
4513 FOR_EACH_EDGE (e, ei, bb->succs)
4514 if (e->flags & EDGE_FALLTHRU)
4516 error ("fallthru edge after a control statement in bb %d",
4517 bb->index);
4518 err = 1;
4522 if (gimple_code (stmt) != GIMPLE_COND)
4524 /* Verify that there are no edges with EDGE_TRUE/FALSE_FLAG set
4525 after anything else but if statement. */
4526 FOR_EACH_EDGE (e, ei, bb->succs)
4527 if (e->flags & (EDGE_TRUE_VALUE | EDGE_FALSE_VALUE))
4529 error ("true/false edge after a non-GIMPLE_COND in bb %d",
4530 bb->index);
4531 err = 1;
4535 switch (gimple_code (stmt))
4537 case GIMPLE_COND:
4539 edge true_edge;
4540 edge false_edge;
4542 extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
4544 if (!true_edge
4545 || !false_edge
4546 || !(true_edge->flags & EDGE_TRUE_VALUE)
4547 || !(false_edge->flags & EDGE_FALSE_VALUE)
4548 || (true_edge->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL))
4549 || (false_edge->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL))
4550 || EDGE_COUNT (bb->succs) >= 3)
4552 error ("wrong outgoing edge flags at end of bb %d",
4553 bb->index);
4554 err = 1;
4557 break;
4559 case GIMPLE_GOTO:
4560 if (simple_goto_p (stmt))
4562 error ("explicit goto at end of bb %d", bb->index);
4563 err = 1;
4565 else
4567 /* FIXME. We should double check that the labels in the
4568 destination blocks have their address taken. */
4569 FOR_EACH_EDGE (e, ei, bb->succs)
4570 if ((e->flags & (EDGE_FALLTHRU | EDGE_TRUE_VALUE
4571 | EDGE_FALSE_VALUE))
4572 || !(e->flags & EDGE_ABNORMAL))
4574 error ("wrong outgoing edge flags at end of bb %d",
4575 bb->index);
4576 err = 1;
4579 break;
4581 case GIMPLE_CALL:
4582 if (!gimple_call_builtin_p (stmt, BUILT_IN_RETURN))
4583 break;
4584 /* ... fallthru ... */
4585 case GIMPLE_RETURN:
4586 if (!single_succ_p (bb)
4587 || (single_succ_edge (bb)->flags
4588 & (EDGE_FALLTHRU | EDGE_ABNORMAL
4589 | EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
4591 error ("wrong outgoing edge flags at end of bb %d", bb->index);
4592 err = 1;
4594 if (single_succ (bb) != EXIT_BLOCK_PTR)
4596 error ("return edge does not point to exit in bb %d",
4597 bb->index);
4598 err = 1;
4600 break;
4602 case GIMPLE_SWITCH:
4604 tree prev;
4605 edge e;
4606 size_t i, n;
4608 n = gimple_switch_num_labels (stmt);
4610 /* Mark all the destination basic blocks. */
4611 for (i = 0; i < n; ++i)
4613 tree lab = CASE_LABEL (gimple_switch_label (stmt, i));
4614 basic_block label_bb = label_to_block (lab);
4615 gcc_assert (!label_bb->aux || label_bb->aux == (void *)1);
4616 label_bb->aux = (void *)1;
4619 /* Verify that the case labels are sorted. */
4620 prev = gimple_switch_label (stmt, 0);
4621 for (i = 1; i < n; ++i)
4623 tree c = gimple_switch_label (stmt, i);
4624 if (!CASE_LOW (c))
4626 error ("found default case not at the start of "
4627 "case vector");
4628 err = 1;
4629 continue;
4631 if (CASE_LOW (prev)
4632 && !tree_int_cst_lt (CASE_LOW (prev), CASE_LOW (c)))
4634 error ("case labels not sorted: ");
4635 print_generic_expr (stderr, prev, 0);
4636 fprintf (stderr," is greater than ");
4637 print_generic_expr (stderr, c, 0);
4638 fprintf (stderr," but comes before it.\n");
4639 err = 1;
4641 prev = c;
4643 /* VRP will remove the default case if it can prove it will
4644 never be executed. So do not verify there always exists
4645 a default case here. */
4647 FOR_EACH_EDGE (e, ei, bb->succs)
4649 if (!e->dest->aux)
4651 error ("extra outgoing edge %d->%d",
4652 bb->index, e->dest->index);
4653 err = 1;
4656 e->dest->aux = (void *)2;
4657 if ((e->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL
4658 | EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
4660 error ("wrong outgoing edge flags at end of bb %d",
4661 bb->index);
4662 err = 1;
4666 /* Check that we have all of them. */
4667 for (i = 0; i < n; ++i)
4669 tree lab = CASE_LABEL (gimple_switch_label (stmt, i));
4670 basic_block label_bb = label_to_block (lab);
4672 if (label_bb->aux != (void *)2)
4674 error ("missing edge %i->%i", bb->index, label_bb->index);
4675 err = 1;
4679 FOR_EACH_EDGE (e, ei, bb->succs)
4680 e->dest->aux = (void *)0;
4682 break;
4684 case GIMPLE_EH_DISPATCH:
4685 err |= verify_eh_dispatch_edge (stmt);
4686 break;
4688 default:
4689 break;
4693 if (dom_info_state (CDI_DOMINATORS) >= DOM_NO_FAST_QUERY)
4694 verify_dominators (CDI_DOMINATORS);
4696 return err;
4700 /* Updates phi nodes after creating a forwarder block joined
4701 by edge FALLTHRU. */
4703 static void
4704 gimple_make_forwarder_block (edge fallthru)
4706 edge e;
4707 edge_iterator ei;
4708 basic_block dummy, bb;
4709 tree var;
4710 gimple_stmt_iterator gsi;
4712 dummy = fallthru->src;
4713 bb = fallthru->dest;
4715 if (single_pred_p (bb))
4716 return;
4718 /* If we redirected a branch we must create new PHI nodes at the
4719 start of BB. */
4720 for (gsi = gsi_start_phis (dummy); !gsi_end_p (gsi); gsi_next (&gsi))
4722 gimple phi, new_phi;
4724 phi = gsi_stmt (gsi);
4725 var = gimple_phi_result (phi);
4726 new_phi = create_phi_node (var, bb);
4727 SSA_NAME_DEF_STMT (var) = new_phi;
4728 gimple_phi_set_result (phi, make_ssa_name (SSA_NAME_VAR (var), phi));
4729 add_phi_arg (new_phi, gimple_phi_result (phi), fallthru,
4730 UNKNOWN_LOCATION);
4733 /* Add the arguments we have stored on edges. */
4734 FOR_EACH_EDGE (e, ei, bb->preds)
4736 if (e == fallthru)
4737 continue;
4739 flush_pending_stmts (e);
4744 /* Return a non-special label in the head of basic block BLOCK.
4745 Create one if it doesn't exist. */
4747 tree
4748 gimple_block_label (basic_block bb)
4750 gimple_stmt_iterator i, s = gsi_start_bb (bb);
4751 bool first = true;
4752 tree label;
4753 gimple stmt;
4755 for (i = s; !gsi_end_p (i); first = false, gsi_next (&i))
4757 stmt = gsi_stmt (i);
4758 if (gimple_code (stmt) != GIMPLE_LABEL)
4759 break;
4760 label = gimple_label_label (stmt);
4761 if (!DECL_NONLOCAL (label))
4763 if (!first)
4764 gsi_move_before (&i, &s);
4765 return label;
4769 label = create_artificial_label (UNKNOWN_LOCATION);
4770 stmt = gimple_build_label (label);
4771 gsi_insert_before (&s, stmt, GSI_NEW_STMT);
4772 return label;
4776 /* Attempt to perform edge redirection by replacing a possibly complex
4777 jump instruction by a goto or by removing the jump completely.
4778 This can apply only if all edges now point to the same block. The
4779 parameters and return values are equivalent to
4780 redirect_edge_and_branch. */
4782 static edge
4783 gimple_try_redirect_by_replacing_jump (edge e, basic_block target)
4785 basic_block src = e->src;
4786 gimple_stmt_iterator i;
4787 gimple stmt;
4789 /* We can replace or remove a complex jump only when we have exactly
4790 two edges. */
4791 if (EDGE_COUNT (src->succs) != 2
4792 /* Verify that all targets will be TARGET. Specifically, the
4793 edge that is not E must also go to TARGET. */
4794 || EDGE_SUCC (src, EDGE_SUCC (src, 0) == e)->dest != target)
4795 return NULL;
4797 i = gsi_last_bb (src);
4798 if (gsi_end_p (i))
4799 return NULL;
4801 stmt = gsi_stmt (i);
4803 if (gimple_code (stmt) == GIMPLE_COND || gimple_code (stmt) == GIMPLE_SWITCH)
4805 gsi_remove (&i, true);
4806 e = ssa_redirect_edge (e, target);
4807 e->flags = EDGE_FALLTHRU;
4808 return e;
4811 return NULL;
4815 /* Redirect E to DEST. Return NULL on failure. Otherwise, return the
4816 edge representing the redirected branch. */
4818 static edge
4819 gimple_redirect_edge_and_branch (edge e, basic_block dest)
4821 basic_block bb = e->src;
4822 gimple_stmt_iterator gsi;
4823 edge ret;
4824 gimple stmt;
4826 if (e->flags & EDGE_ABNORMAL)
4827 return NULL;
4829 if (e->dest == dest)
4830 return NULL;
4832 if (e->flags & EDGE_EH)
4833 return redirect_eh_edge (e, dest);
4835 if (e->src != ENTRY_BLOCK_PTR)
4837 ret = gimple_try_redirect_by_replacing_jump (e, dest);
4838 if (ret)
4839 return ret;
4842 gsi = gsi_last_bb (bb);
4843 stmt = gsi_end_p (gsi) ? NULL : gsi_stmt (gsi);
4845 switch (stmt ? gimple_code (stmt) : GIMPLE_ERROR_MARK)
4847 case GIMPLE_COND:
4848 /* For COND_EXPR, we only need to redirect the edge. */
4849 break;
4851 case GIMPLE_GOTO:
4852 /* No non-abnormal edges should lead from a non-simple goto, and
4853 simple ones should be represented implicitly. */
4854 gcc_unreachable ();
4856 case GIMPLE_SWITCH:
4858 tree label = gimple_block_label (dest);
4859 tree cases = get_cases_for_edge (e, stmt);
4861 /* If we have a list of cases associated with E, then use it
4862 as it's a lot faster than walking the entire case vector. */
4863 if (cases)
4865 edge e2 = find_edge (e->src, dest);
4866 tree last, first;
4868 first = cases;
4869 while (cases)
4871 last = cases;
4872 CASE_LABEL (cases) = label;
4873 cases = TREE_CHAIN (cases);
4876 /* If there was already an edge in the CFG, then we need
4877 to move all the cases associated with E to E2. */
4878 if (e2)
4880 tree cases2 = get_cases_for_edge (e2, stmt);
4882 TREE_CHAIN (last) = TREE_CHAIN (cases2);
4883 TREE_CHAIN (cases2) = first;
4885 bitmap_set_bit (touched_switch_bbs, gimple_bb (stmt)->index);
4887 else
4889 size_t i, n = gimple_switch_num_labels (stmt);
4891 for (i = 0; i < n; i++)
4893 tree elt = gimple_switch_label (stmt, i);
4894 if (label_to_block (CASE_LABEL (elt)) == e->dest)
4895 CASE_LABEL (elt) = label;
4899 break;
4901 case GIMPLE_ASM:
4903 int i, n = gimple_asm_nlabels (stmt);
4904 tree label = NULL;
4906 for (i = 0; i < n; ++i)
4908 tree cons = gimple_asm_label_op (stmt, i);
4909 if (label_to_block (TREE_VALUE (cons)) == e->dest)
4911 if (!label)
4912 label = gimple_block_label (dest);
4913 TREE_VALUE (cons) = label;
4917 /* If we didn't find any label matching the former edge in the
4918 asm labels, we must be redirecting the fallthrough
4919 edge. */
4920 gcc_assert (label || (e->flags & EDGE_FALLTHRU));
4922 break;
4924 case GIMPLE_RETURN:
4925 gsi_remove (&gsi, true);
4926 e->flags |= EDGE_FALLTHRU;
4927 break;
4929 case GIMPLE_OMP_RETURN:
4930 case GIMPLE_OMP_CONTINUE:
4931 case GIMPLE_OMP_SECTIONS_SWITCH:
4932 case GIMPLE_OMP_FOR:
4933 /* The edges from OMP constructs can be simply redirected. */
4934 break;
4936 case GIMPLE_EH_DISPATCH:
4937 if (!(e->flags & EDGE_FALLTHRU))
4938 redirect_eh_dispatch_edge (stmt, e, dest);
4939 break;
4941 default:
4942 /* Otherwise it must be a fallthru edge, and we don't need to
4943 do anything besides redirecting it. */
4944 gcc_assert (e->flags & EDGE_FALLTHRU);
4945 break;
4948 /* Update/insert PHI nodes as necessary. */
4950 /* Now update the edges in the CFG. */
4951 e = ssa_redirect_edge (e, dest);
4953 return e;
4956 /* Returns true if it is possible to remove edge E by redirecting
4957 it to the destination of the other edge from E->src. */
4959 static bool
4960 gimple_can_remove_branch_p (const_edge e)
4962 if (e->flags & (EDGE_ABNORMAL | EDGE_EH))
4963 return false;
4965 return true;
4968 /* Simple wrapper, as we can always redirect fallthru edges. */
4970 static basic_block
4971 gimple_redirect_edge_and_branch_force (edge e, basic_block dest)
4973 e = gimple_redirect_edge_and_branch (e, dest);
4974 gcc_assert (e);
4976 return NULL;
4980 /* Splits basic block BB after statement STMT (but at least after the
4981 labels). If STMT is NULL, BB is split just after the labels. */
4983 static basic_block
4984 gimple_split_block (basic_block bb, void *stmt)
4986 gimple_stmt_iterator gsi;
4987 gimple_stmt_iterator gsi_tgt;
4988 gimple act;
4989 gimple_seq list;
4990 basic_block new_bb;
4991 edge e;
4992 edge_iterator ei;
4994 new_bb = create_empty_bb (bb);
4996 /* Redirect the outgoing edges. */
4997 new_bb->succs = bb->succs;
4998 bb->succs = NULL;
4999 FOR_EACH_EDGE (e, ei, new_bb->succs)
5000 e->src = new_bb;
5002 if (stmt && gimple_code ((gimple) stmt) == GIMPLE_LABEL)
5003 stmt = NULL;
5005 /* Move everything from GSI to the new basic block. */
5006 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
5008 act = gsi_stmt (gsi);
5009 if (gimple_code (act) == GIMPLE_LABEL)
5010 continue;
5012 if (!stmt)
5013 break;
5015 if (stmt == act)
5017 gsi_next (&gsi);
5018 break;
5022 if (gsi_end_p (gsi))
5023 return new_bb;
5025 /* Split the statement list - avoid re-creating new containers as this
5026 brings ugly quadratic memory consumption in the inliner.
5027 (We are still quadratic since we need to update stmt BB pointers,
5028 sadly.) */
5029 list = gsi_split_seq_before (&gsi);
5030 set_bb_seq (new_bb, list);
5031 for (gsi_tgt = gsi_start (list);
5032 !gsi_end_p (gsi_tgt); gsi_next (&gsi_tgt))
5033 gimple_set_bb (gsi_stmt (gsi_tgt), new_bb);
5035 return new_bb;
5039 /* Moves basic block BB after block AFTER. */
5041 static bool
5042 gimple_move_block_after (basic_block bb, basic_block after)
5044 if (bb->prev_bb == after)
5045 return true;
5047 unlink_block (bb);
5048 link_block (bb, after);
5050 return true;
5054 /* Return true if basic_block can be duplicated. */
5056 static bool
5057 gimple_can_duplicate_bb_p (const_basic_block bb ATTRIBUTE_UNUSED)
5059 return true;
5062 /* Create a duplicate of the basic block BB. NOTE: This does not
5063 preserve SSA form. */
5065 static basic_block
5066 gimple_duplicate_bb (basic_block bb)
5068 basic_block new_bb;
5069 gimple_stmt_iterator gsi, gsi_tgt;
5070 gimple_seq phis = phi_nodes (bb);
5071 gimple phi, stmt, copy;
5073 new_bb = create_empty_bb (EXIT_BLOCK_PTR->prev_bb);
5075 /* Copy the PHI nodes. We ignore PHI node arguments here because
5076 the incoming edges have not been setup yet. */
5077 for (gsi = gsi_start (phis); !gsi_end_p (gsi); gsi_next (&gsi))
5079 phi = gsi_stmt (gsi);
5080 copy = create_phi_node (gimple_phi_result (phi), new_bb);
5081 create_new_def_for (gimple_phi_result (copy), copy,
5082 gimple_phi_result_ptr (copy));
5085 gsi_tgt = gsi_start_bb (new_bb);
5086 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
5088 def_operand_p def_p;
5089 ssa_op_iter op_iter;
5091 stmt = gsi_stmt (gsi);
5092 if (gimple_code (stmt) == GIMPLE_LABEL)
5093 continue;
5095 /* Create a new copy of STMT and duplicate STMT's virtual
5096 operands. */
5097 copy = gimple_copy (stmt);
5098 gsi_insert_after (&gsi_tgt, copy, GSI_NEW_STMT);
5100 maybe_duplicate_eh_stmt (copy, stmt);
5101 gimple_duplicate_stmt_histograms (cfun, copy, cfun, stmt);
5103 /* Create new names for all the definitions created by COPY and
5104 add replacement mappings for each new name. */
5105 FOR_EACH_SSA_DEF_OPERAND (def_p, copy, op_iter, SSA_OP_ALL_DEFS)
5106 create_new_def_for (DEF_FROM_PTR (def_p), copy, def_p);
5109 return new_bb;
5112 /* Adds phi node arguments for edge E_COPY after basic block duplication. */
5114 static void
5115 add_phi_args_after_copy_edge (edge e_copy)
5117 basic_block bb, bb_copy = e_copy->src, dest;
5118 edge e;
5119 edge_iterator ei;
5120 gimple phi, phi_copy;
5121 tree def;
5122 gimple_stmt_iterator psi, psi_copy;
5124 if (gimple_seq_empty_p (phi_nodes (e_copy->dest)))
5125 return;
5127 bb = bb_copy->flags & BB_DUPLICATED ? get_bb_original (bb_copy) : bb_copy;
5129 if (e_copy->dest->flags & BB_DUPLICATED)
5130 dest = get_bb_original (e_copy->dest);
5131 else
5132 dest = e_copy->dest;
5134 e = find_edge (bb, dest);
5135 if (!e)
5137 /* During loop unrolling the target of the latch edge is copied.
5138 In this case we are not looking for edge to dest, but to
5139 duplicated block whose original was dest. */
5140 FOR_EACH_EDGE (e, ei, bb->succs)
5142 if ((e->dest->flags & BB_DUPLICATED)
5143 && get_bb_original (e->dest) == dest)
5144 break;
5147 gcc_assert (e != NULL);
5150 for (psi = gsi_start_phis (e->dest),
5151 psi_copy = gsi_start_phis (e_copy->dest);
5152 !gsi_end_p (psi);
5153 gsi_next (&psi), gsi_next (&psi_copy))
5155 phi = gsi_stmt (psi);
5156 phi_copy = gsi_stmt (psi_copy);
5157 def = PHI_ARG_DEF_FROM_EDGE (phi, e);
5158 add_phi_arg (phi_copy, def, e_copy,
5159 gimple_phi_arg_location_from_edge (phi, e));
5164 /* Basic block BB_COPY was created by code duplication. Add phi node
5165 arguments for edges going out of BB_COPY. The blocks that were
5166 duplicated have BB_DUPLICATED set. */
5168 void
5169 add_phi_args_after_copy_bb (basic_block bb_copy)
5171 edge e_copy;
5172 edge_iterator ei;
5174 FOR_EACH_EDGE (e_copy, ei, bb_copy->succs)
5176 add_phi_args_after_copy_edge (e_copy);
5180 /* Blocks in REGION_COPY array of length N_REGION were created by
5181 duplication of basic blocks. Add phi node arguments for edges
5182 going from these blocks. If E_COPY is not NULL, also add
5183 phi node arguments for its destination.*/
5185 void
5186 add_phi_args_after_copy (basic_block *region_copy, unsigned n_region,
5187 edge e_copy)
5189 unsigned i;
5191 for (i = 0; i < n_region; i++)
5192 region_copy[i]->flags |= BB_DUPLICATED;
5194 for (i = 0; i < n_region; i++)
5195 add_phi_args_after_copy_bb (region_copy[i]);
5196 if (e_copy)
5197 add_phi_args_after_copy_edge (e_copy);
5199 for (i = 0; i < n_region; i++)
5200 region_copy[i]->flags &= ~BB_DUPLICATED;
5203 /* Duplicates a REGION (set of N_REGION basic blocks) with just a single
5204 important exit edge EXIT. By important we mean that no SSA name defined
5205 inside region is live over the other exit edges of the region. All entry
5206 edges to the region must go to ENTRY->dest. The edge ENTRY is redirected
5207 to the duplicate of the region. SSA form, dominance and loop information
5208 is updated. The new basic blocks are stored to REGION_COPY in the same
5209 order as they had in REGION, provided that REGION_COPY is not NULL.
5210 The function returns false if it is unable to copy the region,
5211 true otherwise. */
5213 bool
5214 gimple_duplicate_sese_region (edge entry, edge exit,
5215 basic_block *region, unsigned n_region,
5216 basic_block *region_copy)
5218 unsigned i;
5219 bool free_region_copy = false, copying_header = false;
5220 struct loop *loop = entry->dest->loop_father;
5221 edge exit_copy;
5222 VEC (basic_block, heap) *doms;
5223 edge redirected;
5224 int total_freq = 0, entry_freq = 0;
5225 gcov_type total_count = 0, entry_count = 0;
5227 if (!can_copy_bbs_p (region, n_region))
5228 return false;
5230 /* Some sanity checking. Note that we do not check for all possible
5231 missuses of the functions. I.e. if you ask to copy something weird,
5232 it will work, but the state of structures probably will not be
5233 correct. */
5234 for (i = 0; i < n_region; i++)
5236 /* We do not handle subloops, i.e. all the blocks must belong to the
5237 same loop. */
5238 if (region[i]->loop_father != loop)
5239 return false;
5241 if (region[i] != entry->dest
5242 && region[i] == loop->header)
5243 return false;
5246 set_loop_copy (loop, loop);
5248 /* In case the function is used for loop header copying (which is the primary
5249 use), ensure that EXIT and its copy will be new latch and entry edges. */
5250 if (loop->header == entry->dest)
5252 copying_header = true;
5253 set_loop_copy (loop, loop_outer (loop));
5255 if (!dominated_by_p (CDI_DOMINATORS, loop->latch, exit->src))
5256 return false;
5258 for (i = 0; i < n_region; i++)
5259 if (region[i] != exit->src
5260 && dominated_by_p (CDI_DOMINATORS, region[i], exit->src))
5261 return false;
5264 if (!region_copy)
5266 region_copy = XNEWVEC (basic_block, n_region);
5267 free_region_copy = true;
5270 gcc_assert (!need_ssa_update_p (cfun));
5272 /* Record blocks outside the region that are dominated by something
5273 inside. */
5274 doms = NULL;
5275 initialize_original_copy_tables ();
5277 doms = get_dominated_by_region (CDI_DOMINATORS, region, n_region);
5279 if (entry->dest->count)
5281 total_count = entry->dest->count;
5282 entry_count = entry->count;
5283 /* Fix up corner cases, to avoid division by zero or creation of negative
5284 frequencies. */
5285 if (entry_count > total_count)
5286 entry_count = total_count;
5288 else
5290 total_freq = entry->dest->frequency;
5291 entry_freq = EDGE_FREQUENCY (entry);
5292 /* Fix up corner cases, to avoid division by zero or creation of negative
5293 frequencies. */
5294 if (total_freq == 0)
5295 total_freq = 1;
5296 else if (entry_freq > total_freq)
5297 entry_freq = total_freq;
5300 copy_bbs (region, n_region, region_copy, &exit, 1, &exit_copy, loop,
5301 split_edge_bb_loc (entry));
5302 if (total_count)
5304 scale_bbs_frequencies_gcov_type (region, n_region,
5305 total_count - entry_count,
5306 total_count);
5307 scale_bbs_frequencies_gcov_type (region_copy, n_region, entry_count,
5308 total_count);
5310 else
5312 scale_bbs_frequencies_int (region, n_region, total_freq - entry_freq,
5313 total_freq);
5314 scale_bbs_frequencies_int (region_copy, n_region, entry_freq, total_freq);
5317 if (copying_header)
5319 loop->header = exit->dest;
5320 loop->latch = exit->src;
5323 /* Redirect the entry and add the phi node arguments. */
5324 redirected = redirect_edge_and_branch (entry, get_bb_copy (entry->dest));
5325 gcc_assert (redirected != NULL);
5326 flush_pending_stmts (entry);
5328 /* Concerning updating of dominators: We must recount dominators
5329 for entry block and its copy. Anything that is outside of the
5330 region, but was dominated by something inside needs recounting as
5331 well. */
5332 set_immediate_dominator (CDI_DOMINATORS, entry->dest, entry->src);
5333 VEC_safe_push (basic_block, heap, doms, get_bb_original (entry->dest));
5334 iterate_fix_dominators (CDI_DOMINATORS, doms, false);
5335 VEC_free (basic_block, heap, doms);
5337 /* Add the other PHI node arguments. */
5338 add_phi_args_after_copy (region_copy, n_region, NULL);
5340 /* Update the SSA web. */
5341 update_ssa (TODO_update_ssa);
5343 if (free_region_copy)
5344 free (region_copy);
5346 free_original_copy_tables ();
5347 return true;
5350 /* Duplicates REGION consisting of N_REGION blocks. The new blocks
5351 are stored to REGION_COPY in the same order in that they appear
5352 in REGION, if REGION_COPY is not NULL. ENTRY is the entry to
5353 the region, EXIT an exit from it. The condition guarding EXIT
5354 is moved to ENTRY. Returns true if duplication succeeds, false
5355 otherwise.
5357 For example,
5359 some_code;
5360 if (cond)
5362 else
5365 is transformed to
5367 if (cond)
5369 some_code;
5372 else
5374 some_code;
5379 bool
5380 gimple_duplicate_sese_tail (edge entry ATTRIBUTE_UNUSED, edge exit ATTRIBUTE_UNUSED,
5381 basic_block *region ATTRIBUTE_UNUSED, unsigned n_region ATTRIBUTE_UNUSED,
5382 basic_block *region_copy ATTRIBUTE_UNUSED)
5384 unsigned i;
5385 bool free_region_copy = false;
5386 struct loop *loop = exit->dest->loop_father;
5387 struct loop *orig_loop = entry->dest->loop_father;
5388 basic_block switch_bb, entry_bb, nentry_bb;
5389 VEC (basic_block, heap) *doms;
5390 int total_freq = 0, exit_freq = 0;
5391 gcov_type total_count = 0, exit_count = 0;
5392 edge exits[2], nexits[2], e;
5393 gimple_stmt_iterator gsi,gsi1;
5394 gimple cond_stmt;
5395 edge sorig, snew;
5396 basic_block exit_bb;
5397 basic_block iters_bb;
5398 tree new_rhs;
5399 gimple_stmt_iterator psi;
5400 gimple phi;
5401 tree def;
5403 gcc_assert (EDGE_COUNT (exit->src->succs) == 2);
5404 exits[0] = exit;
5405 exits[1] = EDGE_SUCC (exit->src, EDGE_SUCC (exit->src, 0) == exit);
5407 if (!can_copy_bbs_p (region, n_region))
5408 return false;
5410 initialize_original_copy_tables ();
5411 set_loop_copy (orig_loop, loop);
5412 duplicate_subloops (orig_loop, loop);
5414 if (!region_copy)
5416 region_copy = XNEWVEC (basic_block, n_region);
5417 free_region_copy = true;
5420 gcc_assert (!need_ssa_update_p (cfun));
5422 /* Record blocks outside the region that are dominated by something
5423 inside. */
5424 doms = get_dominated_by_region (CDI_DOMINATORS, region, n_region);
5426 if (exit->src->count)
5428 total_count = exit->src->count;
5429 exit_count = exit->count;
5430 /* Fix up corner cases, to avoid division by zero or creation of negative
5431 frequencies. */
5432 if (exit_count > total_count)
5433 exit_count = total_count;
5435 else
5437 total_freq = exit->src->frequency;
5438 exit_freq = EDGE_FREQUENCY (exit);
5439 /* Fix up corner cases, to avoid division by zero or creation of negative
5440 frequencies. */
5441 if (total_freq == 0)
5442 total_freq = 1;
5443 if (exit_freq > total_freq)
5444 exit_freq = total_freq;
5447 copy_bbs (region, n_region, region_copy, exits, 2, nexits, orig_loop,
5448 split_edge_bb_loc (exit));
5449 if (total_count)
5451 scale_bbs_frequencies_gcov_type (region, n_region,
5452 total_count - exit_count,
5453 total_count);
5454 scale_bbs_frequencies_gcov_type (region_copy, n_region, exit_count,
5455 total_count);
5457 else
5459 scale_bbs_frequencies_int (region, n_region, total_freq - exit_freq,
5460 total_freq);
5461 scale_bbs_frequencies_int (region_copy, n_region, exit_freq, total_freq);
5464 /* Create the switch block, and put the exit condition to it. */
5465 entry_bb = entry->dest;
5466 nentry_bb = get_bb_copy (entry_bb);
5467 if (!last_stmt (entry->src)
5468 || !stmt_ends_bb_p (last_stmt (entry->src)))
5469 switch_bb = entry->src;
5470 else
5471 switch_bb = split_edge (entry);
5472 set_immediate_dominator (CDI_DOMINATORS, nentry_bb, switch_bb);
5474 gsi = gsi_last_bb (switch_bb);
5475 cond_stmt = last_stmt (exit->src);
5476 gcc_assert (gimple_code (cond_stmt) == GIMPLE_COND);
5477 cond_stmt = gimple_copy (cond_stmt);
5479 /* If the block consisting of the exit condition has the latch as
5480 successor, then the body of the loop is executed before
5481 the exit condition is tested. In such case, moving the
5482 condition to the entry, causes that the loop will iterate
5483 one less iteration (which is the wanted outcome, since we
5484 peel out the last iteration). If the body is executed after
5485 the condition, moving the condition to the entry requires
5486 decrementing one iteration. */
5487 if (exits[1]->dest == orig_loop->latch)
5488 new_rhs = gimple_cond_rhs (cond_stmt);
5489 else
5491 new_rhs = fold_build2 (MINUS_EXPR, TREE_TYPE (gimple_cond_rhs (cond_stmt)),
5492 gimple_cond_rhs (cond_stmt),
5493 build_int_cst (TREE_TYPE (gimple_cond_rhs (cond_stmt)), 1));
5495 if (TREE_CODE (gimple_cond_rhs (cond_stmt)) == SSA_NAME)
5497 iters_bb = gimple_bb (SSA_NAME_DEF_STMT (gimple_cond_rhs (cond_stmt)));
5498 for (gsi1 = gsi_start_bb (iters_bb); !gsi_end_p (gsi1); gsi_next (&gsi1))
5499 if (gsi_stmt (gsi1) == SSA_NAME_DEF_STMT (gimple_cond_rhs (cond_stmt)))
5500 break;
5502 new_rhs = force_gimple_operand_gsi (&gsi1, new_rhs, true,
5503 NULL_TREE,false,GSI_CONTINUE_LINKING);
5506 gimple_cond_set_rhs (cond_stmt, unshare_expr (new_rhs));
5507 gimple_cond_set_lhs (cond_stmt, unshare_expr (gimple_cond_lhs (cond_stmt)));
5508 gsi_insert_after (&gsi, cond_stmt, GSI_NEW_STMT);
5510 sorig = single_succ_edge (switch_bb);
5511 sorig->flags = exits[1]->flags;
5512 snew = make_edge (switch_bb, nentry_bb, exits[0]->flags);
5514 /* Register the new edge from SWITCH_BB in loop exit lists. */
5515 rescan_loop_exit (snew, true, false);
5517 /* Add the PHI node arguments. */
5518 add_phi_args_after_copy (region_copy, n_region, snew);
5520 /* Get rid of now superfluous conditions and associated edges (and phi node
5521 arguments). */
5522 exit_bb = exit->dest;
5524 e = redirect_edge_and_branch (exits[0], exits[1]->dest);
5525 PENDING_STMT (e) = NULL;
5527 /* The latch of ORIG_LOOP was copied, and so was the backedge
5528 to the original header. We redirect this backedge to EXIT_BB. */
5529 for (i = 0; i < n_region; i++)
5530 if (get_bb_original (region_copy[i]) == orig_loop->latch)
5532 gcc_assert (single_succ_edge (region_copy[i]));
5533 e = redirect_edge_and_branch (single_succ_edge (region_copy[i]), exit_bb);
5534 PENDING_STMT (e) = NULL;
5535 for (psi = gsi_start_phis (exit_bb);
5536 !gsi_end_p (psi);
5537 gsi_next (&psi))
5539 phi = gsi_stmt (psi);
5540 def = PHI_ARG_DEF (phi, nexits[0]->dest_idx);
5541 add_phi_arg (phi, def, e, gimple_phi_arg_location_from_edge (phi, e));
5544 e = redirect_edge_and_branch (nexits[0], nexits[1]->dest);
5545 PENDING_STMT (e) = NULL;
5547 /* Anything that is outside of the region, but was dominated by something
5548 inside needs to update dominance info. */
5549 iterate_fix_dominators (CDI_DOMINATORS, doms, false);
5550 VEC_free (basic_block, heap, doms);
5551 /* Update the SSA web. */
5552 update_ssa (TODO_update_ssa);
5554 if (free_region_copy)
5555 free (region_copy);
5557 free_original_copy_tables ();
5558 return true;
5561 /* Add all the blocks dominated by ENTRY to the array BBS_P. Stop
5562 adding blocks when the dominator traversal reaches EXIT. This
5563 function silently assumes that ENTRY strictly dominates EXIT. */
5565 void
5566 gather_blocks_in_sese_region (basic_block entry, basic_block exit,
5567 VEC(basic_block,heap) **bbs_p)
5569 basic_block son;
5571 for (son = first_dom_son (CDI_DOMINATORS, entry);
5572 son;
5573 son = next_dom_son (CDI_DOMINATORS, son))
5575 VEC_safe_push (basic_block, heap, *bbs_p, son);
5576 if (son != exit)
5577 gather_blocks_in_sese_region (son, exit, bbs_p);
5581 /* Replaces *TP with a duplicate (belonging to function TO_CONTEXT).
5582 The duplicates are recorded in VARS_MAP. */
5584 static void
5585 replace_by_duplicate_decl (tree *tp, struct pointer_map_t *vars_map,
5586 tree to_context)
5588 tree t = *tp, new_t;
5589 struct function *f = DECL_STRUCT_FUNCTION (to_context);
5590 void **loc;
5592 if (DECL_CONTEXT (t) == to_context)
5593 return;
5595 loc = pointer_map_contains (vars_map, t);
5597 if (!loc)
5599 loc = pointer_map_insert (vars_map, t);
5601 if (SSA_VAR_P (t))
5603 new_t = copy_var_decl (t, DECL_NAME (t), TREE_TYPE (t));
5604 add_local_decl (f, new_t);
5606 else
5608 gcc_assert (TREE_CODE (t) == CONST_DECL);
5609 new_t = copy_node (t);
5611 DECL_CONTEXT (new_t) = to_context;
5613 *loc = new_t;
5615 else
5616 new_t = (tree) *loc;
5618 *tp = new_t;
5622 /* Creates an ssa name in TO_CONTEXT equivalent to NAME.
5623 VARS_MAP maps old ssa names and var_decls to the new ones. */
5625 static tree
5626 replace_ssa_name (tree name, struct pointer_map_t *vars_map,
5627 tree to_context)
5629 void **loc;
5630 tree new_name, decl = SSA_NAME_VAR (name);
5632 gcc_assert (is_gimple_reg (name));
5634 loc = pointer_map_contains (vars_map, name);
5636 if (!loc)
5638 replace_by_duplicate_decl (&decl, vars_map, to_context);
5640 push_cfun (DECL_STRUCT_FUNCTION (to_context));
5641 if (gimple_in_ssa_p (cfun))
5642 add_referenced_var (decl);
5644 new_name = make_ssa_name (decl, SSA_NAME_DEF_STMT (name));
5645 if (SSA_NAME_IS_DEFAULT_DEF (name))
5646 set_default_def (decl, new_name);
5647 pop_cfun ();
5649 loc = pointer_map_insert (vars_map, name);
5650 *loc = new_name;
5652 else
5653 new_name = (tree) *loc;
5655 return new_name;
5658 struct move_stmt_d
5660 tree orig_block;
5661 tree new_block;
5662 tree from_context;
5663 tree to_context;
5664 struct pointer_map_t *vars_map;
5665 htab_t new_label_map;
5666 struct pointer_map_t *eh_map;
5667 bool remap_decls_p;
5670 /* Helper for move_block_to_fn. Set TREE_BLOCK in every expression
5671 contained in *TP if it has been ORIG_BLOCK previously and change the
5672 DECL_CONTEXT of every local variable referenced in *TP. */
5674 static tree
5675 move_stmt_op (tree *tp, int *walk_subtrees, void *data)
5677 struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
5678 struct move_stmt_d *p = (struct move_stmt_d *) wi->info;
5679 tree t = *tp;
5681 if (EXPR_P (t))
5682 /* We should never have TREE_BLOCK set on non-statements. */
5683 gcc_assert (!TREE_BLOCK (t));
5685 else if (DECL_P (t) || TREE_CODE (t) == SSA_NAME)
5687 if (TREE_CODE (t) == SSA_NAME)
5688 *tp = replace_ssa_name (t, p->vars_map, p->to_context);
5689 else if (TREE_CODE (t) == LABEL_DECL)
5691 if (p->new_label_map)
5693 struct tree_map in, *out;
5694 in.base.from = t;
5695 out = (struct tree_map *)
5696 htab_find_with_hash (p->new_label_map, &in, DECL_UID (t));
5697 if (out)
5698 *tp = t = out->to;
5701 DECL_CONTEXT (t) = p->to_context;
5703 else if (p->remap_decls_p)
5705 /* Replace T with its duplicate. T should no longer appear in the
5706 parent function, so this looks wasteful; however, it may appear
5707 in referenced_vars, and more importantly, as virtual operands of
5708 statements, and in alias lists of other variables. It would be
5709 quite difficult to expunge it from all those places. ??? It might
5710 suffice to do this for addressable variables. */
5711 if ((TREE_CODE (t) == VAR_DECL
5712 && !is_global_var (t))
5713 || TREE_CODE (t) == CONST_DECL)
5714 replace_by_duplicate_decl (tp, p->vars_map, p->to_context);
5716 if (SSA_VAR_P (t)
5717 && gimple_in_ssa_p (cfun))
5719 push_cfun (DECL_STRUCT_FUNCTION (p->to_context));
5720 add_referenced_var (*tp);
5721 pop_cfun ();
5724 *walk_subtrees = 0;
5726 else if (TYPE_P (t))
5727 *walk_subtrees = 0;
5729 return NULL_TREE;
5732 /* Helper for move_stmt_r. Given an EH region number for the source
5733 function, map that to the duplicate EH regio number in the dest. */
5735 static int
5736 move_stmt_eh_region_nr (int old_nr, struct move_stmt_d *p)
5738 eh_region old_r, new_r;
5739 void **slot;
5741 old_r = get_eh_region_from_number (old_nr);
5742 slot = pointer_map_contains (p->eh_map, old_r);
5743 new_r = (eh_region) *slot;
5745 return new_r->index;
5748 /* Similar, but operate on INTEGER_CSTs. */
5750 static tree
5751 move_stmt_eh_region_tree_nr (tree old_t_nr, struct move_stmt_d *p)
5753 int old_nr, new_nr;
5755 old_nr = tree_low_cst (old_t_nr, 0);
5756 new_nr = move_stmt_eh_region_nr (old_nr, p);
5758 return build_int_cst (NULL, new_nr);
5761 /* Like move_stmt_op, but for gimple statements.
5763 Helper for move_block_to_fn. Set GIMPLE_BLOCK in every expression
5764 contained in the current statement in *GSI_P and change the
5765 DECL_CONTEXT of every local variable referenced in the current
5766 statement. */
5768 static tree
5769 move_stmt_r (gimple_stmt_iterator *gsi_p, bool *handled_ops_p,
5770 struct walk_stmt_info *wi)
5772 struct move_stmt_d *p = (struct move_stmt_d *) wi->info;
5773 gimple stmt = gsi_stmt (*gsi_p);
5774 tree block = gimple_block (stmt);
5776 if (p->orig_block == NULL_TREE
5777 || block == p->orig_block
5778 || block == NULL_TREE)
5779 gimple_set_block (stmt, p->new_block);
5780 #ifdef ENABLE_CHECKING
5781 else if (block != p->new_block)
5783 while (block && block != p->orig_block)
5784 block = BLOCK_SUPERCONTEXT (block);
5785 gcc_assert (block);
5787 #endif
5789 switch (gimple_code (stmt))
5791 case GIMPLE_CALL:
5792 /* Remap the region numbers for __builtin_eh_{pointer,filter}. */
5794 tree r, fndecl = gimple_call_fndecl (stmt);
5795 if (fndecl && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
5796 switch (DECL_FUNCTION_CODE (fndecl))
5798 case BUILT_IN_EH_COPY_VALUES:
5799 r = gimple_call_arg (stmt, 1);
5800 r = move_stmt_eh_region_tree_nr (r, p);
5801 gimple_call_set_arg (stmt, 1, r);
5802 /* FALLTHRU */
5804 case BUILT_IN_EH_POINTER:
5805 case BUILT_IN_EH_FILTER:
5806 r = gimple_call_arg (stmt, 0);
5807 r = move_stmt_eh_region_tree_nr (r, p);
5808 gimple_call_set_arg (stmt, 0, r);
5809 break;
5811 default:
5812 break;
5815 break;
5817 case GIMPLE_RESX:
5819 int r = gimple_resx_region (stmt);
5820 r = move_stmt_eh_region_nr (r, p);
5821 gimple_resx_set_region (stmt, r);
5823 break;
5825 case GIMPLE_EH_DISPATCH:
5827 int r = gimple_eh_dispatch_region (stmt);
5828 r = move_stmt_eh_region_nr (r, p);
5829 gimple_eh_dispatch_set_region (stmt, r);
5831 break;
5833 case GIMPLE_OMP_RETURN:
5834 case GIMPLE_OMP_CONTINUE:
5835 break;
5836 default:
5837 if (is_gimple_omp (stmt))
5839 /* Do not remap variables inside OMP directives. Variables
5840 referenced in clauses and directive header belong to the
5841 parent function and should not be moved into the child
5842 function. */
5843 bool save_remap_decls_p = p->remap_decls_p;
5844 p->remap_decls_p = false;
5845 *handled_ops_p = true;
5847 walk_gimple_seq (gimple_omp_body (stmt), move_stmt_r,
5848 move_stmt_op, wi);
5850 p->remap_decls_p = save_remap_decls_p;
5852 break;
5855 return NULL_TREE;
5858 /* Move basic block BB from function CFUN to function DEST_FN. The
5859 block is moved out of the original linked list and placed after
5860 block AFTER in the new list. Also, the block is removed from the
5861 original array of blocks and placed in DEST_FN's array of blocks.
5862 If UPDATE_EDGE_COUNT_P is true, the edge counts on both CFGs is
5863 updated to reflect the moved edges.
5865 The local variables are remapped to new instances, VARS_MAP is used
5866 to record the mapping. */
5868 static void
5869 move_block_to_fn (struct function *dest_cfun, basic_block bb,
5870 basic_block after, bool update_edge_count_p,
5871 struct move_stmt_d *d)
5873 struct control_flow_graph *cfg;
5874 edge_iterator ei;
5875 edge e;
5876 gimple_stmt_iterator si;
5877 unsigned old_len, new_len;
5879 /* Remove BB from dominance structures. */
5880 delete_from_dominance_info (CDI_DOMINATORS, bb);
5881 if (current_loops)
5882 remove_bb_from_loops (bb);
5884 /* Link BB to the new linked list. */
5885 move_block_after (bb, after);
5887 /* Update the edge count in the corresponding flowgraphs. */
5888 if (update_edge_count_p)
5889 FOR_EACH_EDGE (e, ei, bb->succs)
5891 cfun->cfg->x_n_edges--;
5892 dest_cfun->cfg->x_n_edges++;
5895 /* Remove BB from the original basic block array. */
5896 VEC_replace (basic_block, cfun->cfg->x_basic_block_info, bb->index, NULL);
5897 cfun->cfg->x_n_basic_blocks--;
5899 /* Grow DEST_CFUN's basic block array if needed. */
5900 cfg = dest_cfun->cfg;
5901 cfg->x_n_basic_blocks++;
5902 if (bb->index >= cfg->x_last_basic_block)
5903 cfg->x_last_basic_block = bb->index + 1;
5905 old_len = VEC_length (basic_block, cfg->x_basic_block_info);
5906 if ((unsigned) cfg->x_last_basic_block >= old_len)
5908 new_len = cfg->x_last_basic_block + (cfg->x_last_basic_block + 3) / 4;
5909 VEC_safe_grow_cleared (basic_block, gc, cfg->x_basic_block_info,
5910 new_len);
5913 VEC_replace (basic_block, cfg->x_basic_block_info,
5914 bb->index, bb);
5916 /* Remap the variables in phi nodes. */
5917 for (si = gsi_start_phis (bb); !gsi_end_p (si); )
5919 gimple phi = gsi_stmt (si);
5920 use_operand_p use;
5921 tree op = PHI_RESULT (phi);
5922 ssa_op_iter oi;
5924 if (!is_gimple_reg (op))
5926 /* Remove the phi nodes for virtual operands (alias analysis will be
5927 run for the new function, anyway). */
5928 remove_phi_node (&si, true);
5929 continue;
5932 SET_PHI_RESULT (phi,
5933 replace_ssa_name (op, d->vars_map, dest_cfun->decl));
5934 FOR_EACH_PHI_ARG (use, phi, oi, SSA_OP_USE)
5936 op = USE_FROM_PTR (use);
5937 if (TREE_CODE (op) == SSA_NAME)
5938 SET_USE (use, replace_ssa_name (op, d->vars_map, dest_cfun->decl));
5941 gsi_next (&si);
5944 for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
5946 gimple stmt = gsi_stmt (si);
5947 struct walk_stmt_info wi;
5949 memset (&wi, 0, sizeof (wi));
5950 wi.info = d;
5951 walk_gimple_stmt (&si, move_stmt_r, move_stmt_op, &wi);
5953 if (gimple_code (stmt) == GIMPLE_LABEL)
5955 tree label = gimple_label_label (stmt);
5956 int uid = LABEL_DECL_UID (label);
5958 gcc_assert (uid > -1);
5960 old_len = VEC_length (basic_block, cfg->x_label_to_block_map);
5961 if (old_len <= (unsigned) uid)
5963 new_len = 3 * uid / 2 + 1;
5964 VEC_safe_grow_cleared (basic_block, gc,
5965 cfg->x_label_to_block_map, new_len);
5968 VEC_replace (basic_block, cfg->x_label_to_block_map, uid, bb);
5969 VEC_replace (basic_block, cfun->cfg->x_label_to_block_map, uid, NULL);
5971 gcc_assert (DECL_CONTEXT (label) == dest_cfun->decl);
5973 if (uid >= dest_cfun->cfg->last_label_uid)
5974 dest_cfun->cfg->last_label_uid = uid + 1;
5977 maybe_duplicate_eh_stmt_fn (dest_cfun, stmt, cfun, stmt, d->eh_map, 0);
5978 remove_stmt_from_eh_lp_fn (cfun, stmt);
5980 gimple_duplicate_stmt_histograms (dest_cfun, stmt, cfun, stmt);
5981 gimple_remove_stmt_histograms (cfun, stmt);
5983 /* We cannot leave any operands allocated from the operand caches of
5984 the current function. */
5985 free_stmt_operands (stmt);
5986 push_cfun (dest_cfun);
5987 update_stmt (stmt);
5988 pop_cfun ();
5991 FOR_EACH_EDGE (e, ei, bb->succs)
5992 if (e->goto_locus)
5994 tree block = e->goto_block;
5995 if (d->orig_block == NULL_TREE
5996 || block == d->orig_block)
5997 e->goto_block = d->new_block;
5998 #ifdef ENABLE_CHECKING
5999 else if (block != d->new_block)
6001 while (block && block != d->orig_block)
6002 block = BLOCK_SUPERCONTEXT (block);
6003 gcc_assert (block);
6005 #endif
6009 /* Examine the statements in BB (which is in SRC_CFUN); find and return
6010 the outermost EH region. Use REGION as the incoming base EH region. */
6012 static eh_region
6013 find_outermost_region_in_block (struct function *src_cfun,
6014 basic_block bb, eh_region region)
6016 gimple_stmt_iterator si;
6018 for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
6020 gimple stmt = gsi_stmt (si);
6021 eh_region stmt_region;
6022 int lp_nr;
6024 lp_nr = lookup_stmt_eh_lp_fn (src_cfun, stmt);
6025 stmt_region = get_eh_region_from_lp_number_fn (src_cfun, lp_nr);
6026 if (stmt_region)
6028 if (region == NULL)
6029 region = stmt_region;
6030 else if (stmt_region != region)
6032 region = eh_region_outermost (src_cfun, stmt_region, region);
6033 gcc_assert (region != NULL);
6038 return region;
6041 static tree
6042 new_label_mapper (tree decl, void *data)
6044 htab_t hash = (htab_t) data;
6045 struct tree_map *m;
6046 void **slot;
6048 gcc_assert (TREE_CODE (decl) == LABEL_DECL);
6050 m = XNEW (struct tree_map);
6051 m->hash = DECL_UID (decl);
6052 m->base.from = decl;
6053 m->to = create_artificial_label (UNKNOWN_LOCATION);
6054 LABEL_DECL_UID (m->to) = LABEL_DECL_UID (decl);
6055 if (LABEL_DECL_UID (m->to) >= cfun->cfg->last_label_uid)
6056 cfun->cfg->last_label_uid = LABEL_DECL_UID (m->to) + 1;
6058 slot = htab_find_slot_with_hash (hash, m, m->hash, INSERT);
6059 gcc_assert (*slot == NULL);
6061 *slot = m;
6063 return m->to;
6066 /* Change DECL_CONTEXT of all BLOCK_VARS in block, including
6067 subblocks. */
6069 static void
6070 replace_block_vars_by_duplicates (tree block, struct pointer_map_t *vars_map,
6071 tree to_context)
6073 tree *tp, t;
6075 for (tp = &BLOCK_VARS (block); *tp; tp = &DECL_CHAIN (*tp))
6077 t = *tp;
6078 if (TREE_CODE (t) != VAR_DECL && TREE_CODE (t) != CONST_DECL)
6079 continue;
6080 replace_by_duplicate_decl (&t, vars_map, to_context);
6081 if (t != *tp)
6083 if (TREE_CODE (*tp) == VAR_DECL && DECL_HAS_VALUE_EXPR_P (*tp))
6085 SET_DECL_VALUE_EXPR (t, DECL_VALUE_EXPR (*tp));
6086 DECL_HAS_VALUE_EXPR_P (t) = 1;
6088 DECL_CHAIN (t) = DECL_CHAIN (*tp);
6089 *tp = t;
6093 for (block = BLOCK_SUBBLOCKS (block); block; block = BLOCK_CHAIN (block))
6094 replace_block_vars_by_duplicates (block, vars_map, to_context);
6097 /* Move a single-entry, single-exit region delimited by ENTRY_BB and
6098 EXIT_BB to function DEST_CFUN. The whole region is replaced by a
6099 single basic block in the original CFG and the new basic block is
6100 returned. DEST_CFUN must not have a CFG yet.
6102 Note that the region need not be a pure SESE region. Blocks inside
6103 the region may contain calls to abort/exit. The only restriction
6104 is that ENTRY_BB should be the only entry point and it must
6105 dominate EXIT_BB.
6107 Change TREE_BLOCK of all statements in ORIG_BLOCK to the new
6108 functions outermost BLOCK, move all subblocks of ORIG_BLOCK
6109 to the new function.
6111 All local variables referenced in the region are assumed to be in
6112 the corresponding BLOCK_VARS and unexpanded variable lists
6113 associated with DEST_CFUN. */
6115 basic_block
6116 move_sese_region_to_fn (struct function *dest_cfun, basic_block entry_bb,
6117 basic_block exit_bb, tree orig_block)
6119 VEC(basic_block,heap) *bbs, *dom_bbs;
6120 basic_block dom_entry = get_immediate_dominator (CDI_DOMINATORS, entry_bb);
6121 basic_block after, bb, *entry_pred, *exit_succ, abb;
6122 struct function *saved_cfun = cfun;
6123 int *entry_flag, *exit_flag;
6124 unsigned *entry_prob, *exit_prob;
6125 unsigned i, num_entry_edges, num_exit_edges;
6126 edge e;
6127 edge_iterator ei;
6128 htab_t new_label_map;
6129 struct pointer_map_t *vars_map, *eh_map;
6130 struct loop *loop = entry_bb->loop_father;
6131 struct move_stmt_d d;
6133 /* If ENTRY does not strictly dominate EXIT, this cannot be an SESE
6134 region. */
6135 gcc_assert (entry_bb != exit_bb
6136 && (!exit_bb
6137 || dominated_by_p (CDI_DOMINATORS, exit_bb, entry_bb)));
6139 /* Collect all the blocks in the region. Manually add ENTRY_BB
6140 because it won't be added by dfs_enumerate_from. */
6141 bbs = NULL;
6142 VEC_safe_push (basic_block, heap, bbs, entry_bb);
6143 gather_blocks_in_sese_region (entry_bb, exit_bb, &bbs);
6145 /* The blocks that used to be dominated by something in BBS will now be
6146 dominated by the new block. */
6147 dom_bbs = get_dominated_by_region (CDI_DOMINATORS,
6148 VEC_address (basic_block, bbs),
6149 VEC_length (basic_block, bbs));
6151 /* Detach ENTRY_BB and EXIT_BB from CFUN->CFG. We need to remember
6152 the predecessor edges to ENTRY_BB and the successor edges to
6153 EXIT_BB so that we can re-attach them to the new basic block that
6154 will replace the region. */
6155 num_entry_edges = EDGE_COUNT (entry_bb->preds);
6156 entry_pred = (basic_block *) xcalloc (num_entry_edges, sizeof (basic_block));
6157 entry_flag = (int *) xcalloc (num_entry_edges, sizeof (int));
6158 entry_prob = XNEWVEC (unsigned, num_entry_edges);
6159 i = 0;
6160 for (ei = ei_start (entry_bb->preds); (e = ei_safe_edge (ei)) != NULL;)
6162 entry_prob[i] = e->probability;
6163 entry_flag[i] = e->flags;
6164 entry_pred[i++] = e->src;
6165 remove_edge (e);
6168 if (exit_bb)
6170 num_exit_edges = EDGE_COUNT (exit_bb->succs);
6171 exit_succ = (basic_block *) xcalloc (num_exit_edges,
6172 sizeof (basic_block));
6173 exit_flag = (int *) xcalloc (num_exit_edges, sizeof (int));
6174 exit_prob = XNEWVEC (unsigned, num_exit_edges);
6175 i = 0;
6176 for (ei = ei_start (exit_bb->succs); (e = ei_safe_edge (ei)) != NULL;)
6178 exit_prob[i] = e->probability;
6179 exit_flag[i] = e->flags;
6180 exit_succ[i++] = e->dest;
6181 remove_edge (e);
6184 else
6186 num_exit_edges = 0;
6187 exit_succ = NULL;
6188 exit_flag = NULL;
6189 exit_prob = NULL;
6192 /* Switch context to the child function to initialize DEST_FN's CFG. */
6193 gcc_assert (dest_cfun->cfg == NULL);
6194 push_cfun (dest_cfun);
6196 init_empty_tree_cfg ();
6198 /* Initialize EH information for the new function. */
6199 eh_map = NULL;
6200 new_label_map = NULL;
6201 if (saved_cfun->eh)
6203 eh_region region = NULL;
6205 for (i = 0; VEC_iterate (basic_block, bbs, i, bb); i++)
6206 region = find_outermost_region_in_block (saved_cfun, bb, region);
6208 init_eh_for_function ();
6209 if (region != NULL)
6211 new_label_map = htab_create (17, tree_map_hash, tree_map_eq, free);
6212 eh_map = duplicate_eh_regions (saved_cfun, region, 0,
6213 new_label_mapper, new_label_map);
6217 pop_cfun ();
6219 /* Move blocks from BBS into DEST_CFUN. */
6220 gcc_assert (VEC_length (basic_block, bbs) >= 2);
6221 after = dest_cfun->cfg->x_entry_block_ptr;
6222 vars_map = pointer_map_create ();
6224 memset (&d, 0, sizeof (d));
6225 d.orig_block = orig_block;
6226 d.new_block = DECL_INITIAL (dest_cfun->decl);
6227 d.from_context = cfun->decl;
6228 d.to_context = dest_cfun->decl;
6229 d.vars_map = vars_map;
6230 d.new_label_map = new_label_map;
6231 d.eh_map = eh_map;
6232 d.remap_decls_p = true;
6234 for (i = 0; VEC_iterate (basic_block, bbs, i, bb); i++)
6236 /* No need to update edge counts on the last block. It has
6237 already been updated earlier when we detached the region from
6238 the original CFG. */
6239 move_block_to_fn (dest_cfun, bb, after, bb != exit_bb, &d);
6240 after = bb;
6243 /* Rewire BLOCK_SUBBLOCKS of orig_block. */
6244 if (orig_block)
6246 tree block;
6247 gcc_assert (BLOCK_SUBBLOCKS (DECL_INITIAL (dest_cfun->decl))
6248 == NULL_TREE);
6249 BLOCK_SUBBLOCKS (DECL_INITIAL (dest_cfun->decl))
6250 = BLOCK_SUBBLOCKS (orig_block);
6251 for (block = BLOCK_SUBBLOCKS (orig_block);
6252 block; block = BLOCK_CHAIN (block))
6253 BLOCK_SUPERCONTEXT (block) = DECL_INITIAL (dest_cfun->decl);
6254 BLOCK_SUBBLOCKS (orig_block) = NULL_TREE;
6257 replace_block_vars_by_duplicates (DECL_INITIAL (dest_cfun->decl),
6258 vars_map, dest_cfun->decl);
6260 if (new_label_map)
6261 htab_delete (new_label_map);
6262 if (eh_map)
6263 pointer_map_destroy (eh_map);
6264 pointer_map_destroy (vars_map);
6266 /* Rewire the entry and exit blocks. The successor to the entry
6267 block turns into the successor of DEST_FN's ENTRY_BLOCK_PTR in
6268 the child function. Similarly, the predecessor of DEST_FN's
6269 EXIT_BLOCK_PTR turns into the predecessor of EXIT_BLOCK_PTR. We
6270 need to switch CFUN between DEST_CFUN and SAVED_CFUN so that the
6271 various CFG manipulation function get to the right CFG.
6273 FIXME, this is silly. The CFG ought to become a parameter to
6274 these helpers. */
6275 push_cfun (dest_cfun);
6276 make_edge (ENTRY_BLOCK_PTR, entry_bb, EDGE_FALLTHRU);
6277 if (exit_bb)
6278 make_edge (exit_bb, EXIT_BLOCK_PTR, 0);
6279 pop_cfun ();
6281 /* Back in the original function, the SESE region has disappeared,
6282 create a new basic block in its place. */
6283 bb = create_empty_bb (entry_pred[0]);
6284 if (current_loops)
6285 add_bb_to_loop (bb, loop);
6286 for (i = 0; i < num_entry_edges; i++)
6288 e = make_edge (entry_pred[i], bb, entry_flag[i]);
6289 e->probability = entry_prob[i];
6292 for (i = 0; i < num_exit_edges; i++)
6294 e = make_edge (bb, exit_succ[i], exit_flag[i]);
6295 e->probability = exit_prob[i];
6298 set_immediate_dominator (CDI_DOMINATORS, bb, dom_entry);
6299 for (i = 0; VEC_iterate (basic_block, dom_bbs, i, abb); i++)
6300 set_immediate_dominator (CDI_DOMINATORS, abb, bb);
6301 VEC_free (basic_block, heap, dom_bbs);
6303 if (exit_bb)
6305 free (exit_prob);
6306 free (exit_flag);
6307 free (exit_succ);
6309 free (entry_prob);
6310 free (entry_flag);
6311 free (entry_pred);
6312 VEC_free (basic_block, heap, bbs);
6314 return bb;
6318 /* Dump FUNCTION_DECL FN to file FILE using FLAGS (see TDF_* in tree-pass.h)
6321 void
6322 dump_function_to_file (tree fn, FILE *file, int flags)
6324 tree arg, var;
6325 struct function *dsf;
6326 bool ignore_topmost_bind = false, any_var = false;
6327 basic_block bb;
6328 tree chain;
6330 fprintf (file, "%s (", lang_hooks.decl_printable_name (fn, 2));
6332 arg = DECL_ARGUMENTS (fn);
6333 while (arg)
6335 print_generic_expr (file, TREE_TYPE (arg), dump_flags);
6336 fprintf (file, " ");
6337 print_generic_expr (file, arg, dump_flags);
6338 if (flags & TDF_VERBOSE)
6339 print_node (file, "", arg, 4);
6340 if (DECL_CHAIN (arg))
6341 fprintf (file, ", ");
6342 arg = DECL_CHAIN (arg);
6344 fprintf (file, ")\n");
6346 if (flags & TDF_VERBOSE)
6347 print_node (file, "", fn, 2);
6349 dsf = DECL_STRUCT_FUNCTION (fn);
6350 if (dsf && (flags & TDF_EH))
6351 dump_eh_tree (file, dsf);
6353 if (flags & TDF_RAW && !gimple_has_body_p (fn))
6355 dump_node (fn, TDF_SLIM | flags, file);
6356 return;
6359 /* Switch CFUN to point to FN. */
6360 push_cfun (DECL_STRUCT_FUNCTION (fn));
6362 /* When GIMPLE is lowered, the variables are no longer available in
6363 BIND_EXPRs, so display them separately. */
6364 if (cfun && cfun->decl == fn && !VEC_empty (tree, cfun->local_decls))
6366 unsigned ix;
6367 ignore_topmost_bind = true;
6369 fprintf (file, "{\n");
6370 FOR_EACH_LOCAL_DECL (cfun, ix, var)
6372 print_generic_decl (file, var, flags);
6373 if (flags & TDF_VERBOSE)
6374 print_node (file, "", var, 4);
6375 fprintf (file, "\n");
6377 any_var = true;
6381 if (cfun && cfun->decl == fn && cfun->cfg && basic_block_info)
6383 /* If the CFG has been built, emit a CFG-based dump. */
6384 check_bb_profile (ENTRY_BLOCK_PTR, file);
6385 if (!ignore_topmost_bind)
6386 fprintf (file, "{\n");
6388 if (any_var && n_basic_blocks)
6389 fprintf (file, "\n");
6391 FOR_EACH_BB (bb)
6392 gimple_dump_bb (bb, file, 2, flags);
6394 fprintf (file, "}\n");
6395 check_bb_profile (EXIT_BLOCK_PTR, file);
6397 else if (DECL_SAVED_TREE (fn) == NULL)
6399 /* The function is now in GIMPLE form but the CFG has not been
6400 built yet. Emit the single sequence of GIMPLE statements
6401 that make up its body. */
6402 gimple_seq body = gimple_body (fn);
6404 if (gimple_seq_first_stmt (body)
6405 && gimple_seq_first_stmt (body) == gimple_seq_last_stmt (body)
6406 && gimple_code (gimple_seq_first_stmt (body)) == GIMPLE_BIND)
6407 print_gimple_seq (file, body, 0, flags);
6408 else
6410 if (!ignore_topmost_bind)
6411 fprintf (file, "{\n");
6413 if (any_var)
6414 fprintf (file, "\n");
6416 print_gimple_seq (file, body, 2, flags);
6417 fprintf (file, "}\n");
6420 else
6422 int indent;
6424 /* Make a tree based dump. */
6425 chain = DECL_SAVED_TREE (fn);
6427 if (chain && TREE_CODE (chain) == BIND_EXPR)
6429 if (ignore_topmost_bind)
6431 chain = BIND_EXPR_BODY (chain);
6432 indent = 2;
6434 else
6435 indent = 0;
6437 else
6439 if (!ignore_topmost_bind)
6440 fprintf (file, "{\n");
6441 indent = 2;
6444 if (any_var)
6445 fprintf (file, "\n");
6447 print_generic_stmt_indented (file, chain, flags, indent);
6448 if (ignore_topmost_bind)
6449 fprintf (file, "}\n");
6452 if (flags & TDF_ENUMERATE_LOCALS)
6453 dump_enumerated_decls (file, flags);
6454 fprintf (file, "\n\n");
6456 /* Restore CFUN. */
6457 pop_cfun ();
6461 /* Dump FUNCTION_DECL FN to stderr using FLAGS (see TDF_* in tree.h) */
6463 DEBUG_FUNCTION void
6464 debug_function (tree fn, int flags)
6466 dump_function_to_file (fn, stderr, flags);
6470 /* Print on FILE the indexes for the predecessors of basic_block BB. */
6472 static void
6473 print_pred_bbs (FILE *file, basic_block bb)
6475 edge e;
6476 edge_iterator ei;
6478 FOR_EACH_EDGE (e, ei, bb->preds)
6479 fprintf (file, "bb_%d ", e->src->index);
6483 /* Print on FILE the indexes for the successors of basic_block BB. */
6485 static void
6486 print_succ_bbs (FILE *file, basic_block bb)
6488 edge e;
6489 edge_iterator ei;
6491 FOR_EACH_EDGE (e, ei, bb->succs)
6492 fprintf (file, "bb_%d ", e->dest->index);
6495 /* Print to FILE the basic block BB following the VERBOSITY level. */
6497 void
6498 print_loops_bb (FILE *file, basic_block bb, int indent, int verbosity)
6500 char *s_indent = (char *) alloca ((size_t) indent + 1);
6501 memset ((void *) s_indent, ' ', (size_t) indent);
6502 s_indent[indent] = '\0';
6504 /* Print basic_block's header. */
6505 if (verbosity >= 2)
6507 fprintf (file, "%s bb_%d (preds = {", s_indent, bb->index);
6508 print_pred_bbs (file, bb);
6509 fprintf (file, "}, succs = {");
6510 print_succ_bbs (file, bb);
6511 fprintf (file, "})\n");
6514 /* Print basic_block's body. */
6515 if (verbosity >= 3)
6517 fprintf (file, "%s {\n", s_indent);
6518 gimple_dump_bb (bb, file, indent + 4, TDF_VOPS|TDF_MEMSYMS);
6519 fprintf (file, "%s }\n", s_indent);
6523 static void print_loop_and_siblings (FILE *, struct loop *, int, int);
6525 /* Pretty print LOOP on FILE, indented INDENT spaces. Following
6526 VERBOSITY level this outputs the contents of the loop, or just its
6527 structure. */
6529 static void
6530 print_loop (FILE *file, struct loop *loop, int indent, int verbosity)
6532 char *s_indent;
6533 basic_block bb;
6535 if (loop == NULL)
6536 return;
6538 s_indent = (char *) alloca ((size_t) indent + 1);
6539 memset ((void *) s_indent, ' ', (size_t) indent);
6540 s_indent[indent] = '\0';
6542 /* Print loop's header. */
6543 fprintf (file, "%sloop_%d (header = %d, latch = %d", s_indent,
6544 loop->num, loop->header->index, loop->latch->index);
6545 fprintf (file, ", niter = ");
6546 print_generic_expr (file, loop->nb_iterations, 0);
6548 if (loop->any_upper_bound)
6550 fprintf (file, ", upper_bound = ");
6551 dump_double_int (file, loop->nb_iterations_upper_bound, true);
6554 if (loop->any_estimate)
6556 fprintf (file, ", estimate = ");
6557 dump_double_int (file, loop->nb_iterations_estimate, true);
6559 fprintf (file, ")\n");
6561 /* Print loop's body. */
6562 if (verbosity >= 1)
6564 fprintf (file, "%s{\n", s_indent);
6565 FOR_EACH_BB (bb)
6566 if (bb->loop_father == loop)
6567 print_loops_bb (file, bb, indent, verbosity);
6569 print_loop_and_siblings (file, loop->inner, indent + 2, verbosity);
6570 fprintf (file, "%s}\n", s_indent);
6574 /* Print the LOOP and its sibling loops on FILE, indented INDENT
6575 spaces. Following VERBOSITY level this outputs the contents of the
6576 loop, or just its structure. */
6578 static void
6579 print_loop_and_siblings (FILE *file, struct loop *loop, int indent, int verbosity)
6581 if (loop == NULL)
6582 return;
6584 print_loop (file, loop, indent, verbosity);
6585 print_loop_and_siblings (file, loop->next, indent, verbosity);
6588 /* Follow a CFG edge from the entry point of the program, and on entry
6589 of a loop, pretty print the loop structure on FILE. */
6591 void
6592 print_loops (FILE *file, int verbosity)
6594 basic_block bb;
6596 bb = ENTRY_BLOCK_PTR;
6597 if (bb && bb->loop_father)
6598 print_loop_and_siblings (file, bb->loop_father, 0, verbosity);
6602 /* Debugging loops structure at tree level, at some VERBOSITY level. */
6604 DEBUG_FUNCTION void
6605 debug_loops (int verbosity)
6607 print_loops (stderr, verbosity);
6610 /* Print on stderr the code of LOOP, at some VERBOSITY level. */
6612 DEBUG_FUNCTION void
6613 debug_loop (struct loop *loop, int verbosity)
6615 print_loop (stderr, loop, 0, verbosity);
6618 /* Print on stderr the code of loop number NUM, at some VERBOSITY
6619 level. */
6621 DEBUG_FUNCTION void
6622 debug_loop_num (unsigned num, int verbosity)
6624 debug_loop (get_loop (num), verbosity);
6627 /* Return true if BB ends with a call, possibly followed by some
6628 instructions that must stay with the call. Return false,
6629 otherwise. */
6631 static bool
6632 gimple_block_ends_with_call_p (basic_block bb)
6634 gimple_stmt_iterator gsi = gsi_last_nondebug_bb (bb);
6635 return !gsi_end_p (gsi) && is_gimple_call (gsi_stmt (gsi));
6639 /* Return true if BB ends with a conditional branch. Return false,
6640 otherwise. */
6642 static bool
6643 gimple_block_ends_with_condjump_p (const_basic_block bb)
6645 gimple stmt = last_stmt (CONST_CAST_BB (bb));
6646 return (stmt && gimple_code (stmt) == GIMPLE_COND);
6650 /* Return true if we need to add fake edge to exit at statement T.
6651 Helper function for gimple_flow_call_edges_add. */
6653 static bool
6654 need_fake_edge_p (gimple t)
6656 tree fndecl = NULL_TREE;
6657 int call_flags = 0;
6659 /* NORETURN and LONGJMP calls already have an edge to exit.
6660 CONST and PURE calls do not need one.
6661 We don't currently check for CONST and PURE here, although
6662 it would be a good idea, because those attributes are
6663 figured out from the RTL in mark_constant_function, and
6664 the counter incrementation code from -fprofile-arcs
6665 leads to different results from -fbranch-probabilities. */
6666 if (is_gimple_call (t))
6668 fndecl = gimple_call_fndecl (t);
6669 call_flags = gimple_call_flags (t);
6672 if (is_gimple_call (t)
6673 && fndecl
6674 && DECL_BUILT_IN (fndecl)
6675 && (call_flags & ECF_NOTHROW)
6676 && !(call_flags & ECF_RETURNS_TWICE)
6677 /* fork() doesn't really return twice, but the effect of
6678 wrapping it in __gcov_fork() which calls __gcov_flush()
6679 and clears the counters before forking has the same
6680 effect as returning twice. Force a fake edge. */
6681 && !(DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
6682 && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_FORK))
6683 return false;
6685 if (is_gimple_call (t)
6686 && !(call_flags & ECF_NORETURN))
6687 return true;
6689 if (gimple_code (t) == GIMPLE_ASM
6690 && (gimple_asm_volatile_p (t) || gimple_asm_input_p (t)))
6691 return true;
6693 return false;
6697 /* Add fake edges to the function exit for any non constant and non
6698 noreturn calls, volatile inline assembly in the bitmap of blocks
6699 specified by BLOCKS or to the whole CFG if BLOCKS is zero. Return
6700 the number of blocks that were split.
6702 The goal is to expose cases in which entering a basic block does
6703 not imply that all subsequent instructions must be executed. */
6705 static int
6706 gimple_flow_call_edges_add (sbitmap blocks)
6708 int i;
6709 int blocks_split = 0;
6710 int last_bb = last_basic_block;
6711 bool check_last_block = false;
6713 if (n_basic_blocks == NUM_FIXED_BLOCKS)
6714 return 0;
6716 if (! blocks)
6717 check_last_block = true;
6718 else
6719 check_last_block = TEST_BIT (blocks, EXIT_BLOCK_PTR->prev_bb->index);
6721 /* In the last basic block, before epilogue generation, there will be
6722 a fallthru edge to EXIT. Special care is required if the last insn
6723 of the last basic block is a call because make_edge folds duplicate
6724 edges, which would result in the fallthru edge also being marked
6725 fake, which would result in the fallthru edge being removed by
6726 remove_fake_edges, which would result in an invalid CFG.
6728 Moreover, we can't elide the outgoing fake edge, since the block
6729 profiler needs to take this into account in order to solve the minimal
6730 spanning tree in the case that the call doesn't return.
6732 Handle this by adding a dummy instruction in a new last basic block. */
6733 if (check_last_block)
6735 basic_block bb = EXIT_BLOCK_PTR->prev_bb;
6736 gimple_stmt_iterator gsi = gsi_last_bb (bb);
6737 gimple t = NULL;
6739 if (!gsi_end_p (gsi))
6740 t = gsi_stmt (gsi);
6742 if (t && need_fake_edge_p (t))
6744 edge e;
6746 e = find_edge (bb, EXIT_BLOCK_PTR);
6747 if (e)
6749 gsi_insert_on_edge (e, gimple_build_nop ());
6750 gsi_commit_edge_inserts ();
6755 /* Now add fake edges to the function exit for any non constant
6756 calls since there is no way that we can determine if they will
6757 return or not... */
6758 for (i = 0; i < last_bb; i++)
6760 basic_block bb = BASIC_BLOCK (i);
6761 gimple_stmt_iterator gsi;
6762 gimple stmt, last_stmt;
6764 if (!bb)
6765 continue;
6767 if (blocks && !TEST_BIT (blocks, i))
6768 continue;
6770 gsi = gsi_last_bb (bb);
6771 if (!gsi_end_p (gsi))
6773 last_stmt = gsi_stmt (gsi);
6776 stmt = gsi_stmt (gsi);
6777 if (need_fake_edge_p (stmt))
6779 edge e;
6781 /* The handling above of the final block before the
6782 epilogue should be enough to verify that there is
6783 no edge to the exit block in CFG already.
6784 Calling make_edge in such case would cause us to
6785 mark that edge as fake and remove it later. */
6786 #ifdef ENABLE_CHECKING
6787 if (stmt == last_stmt)
6789 e = find_edge (bb, EXIT_BLOCK_PTR);
6790 gcc_assert (e == NULL);
6792 #endif
6794 /* Note that the following may create a new basic block
6795 and renumber the existing basic blocks. */
6796 if (stmt != last_stmt)
6798 e = split_block (bb, stmt);
6799 if (e)
6800 blocks_split++;
6802 make_edge (bb, EXIT_BLOCK_PTR, EDGE_FAKE);
6804 gsi_prev (&gsi);
6806 while (!gsi_end_p (gsi));
6810 if (blocks_split)
6811 verify_flow_info ();
6813 return blocks_split;
6816 /* Purge dead abnormal call edges from basic block BB. */
6818 bool
6819 gimple_purge_dead_abnormal_call_edges (basic_block bb)
6821 bool changed = gimple_purge_dead_eh_edges (bb);
6823 if (cfun->has_nonlocal_label)
6825 gimple stmt = last_stmt (bb);
6826 edge_iterator ei;
6827 edge e;
6829 if (!(stmt && stmt_can_make_abnormal_goto (stmt)))
6830 for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
6832 if (e->flags & EDGE_ABNORMAL)
6834 remove_edge (e);
6835 changed = true;
6837 else
6838 ei_next (&ei);
6841 /* See gimple_purge_dead_eh_edges below. */
6842 if (changed)
6843 free_dominance_info (CDI_DOMINATORS);
6846 return changed;
6849 /* Removes edge E and all the blocks dominated by it, and updates dominance
6850 information. The IL in E->src needs to be updated separately.
6851 If dominance info is not available, only the edge E is removed.*/
6853 void
6854 remove_edge_and_dominated_blocks (edge e)
6856 VEC (basic_block, heap) *bbs_to_remove = NULL;
6857 VEC (basic_block, heap) *bbs_to_fix_dom = NULL;
6858 bitmap df, df_idom;
6859 edge f;
6860 edge_iterator ei;
6861 bool none_removed = false;
6862 unsigned i;
6863 basic_block bb, dbb;
6864 bitmap_iterator bi;
6866 if (!dom_info_available_p (CDI_DOMINATORS))
6868 remove_edge (e);
6869 return;
6872 /* No updating is needed for edges to exit. */
6873 if (e->dest == EXIT_BLOCK_PTR)
6875 if (cfgcleanup_altered_bbs)
6876 bitmap_set_bit (cfgcleanup_altered_bbs, e->src->index);
6877 remove_edge (e);
6878 return;
6881 /* First, we find the basic blocks to remove. If E->dest has a predecessor
6882 that is not dominated by E->dest, then this set is empty. Otherwise,
6883 all the basic blocks dominated by E->dest are removed.
6885 Also, to DF_IDOM we store the immediate dominators of the blocks in
6886 the dominance frontier of E (i.e., of the successors of the
6887 removed blocks, if there are any, and of E->dest otherwise). */
6888 FOR_EACH_EDGE (f, ei, e->dest->preds)
6890 if (f == e)
6891 continue;
6893 if (!dominated_by_p (CDI_DOMINATORS, f->src, e->dest))
6895 none_removed = true;
6896 break;
6900 df = BITMAP_ALLOC (NULL);
6901 df_idom = BITMAP_ALLOC (NULL);
6903 if (none_removed)
6904 bitmap_set_bit (df_idom,
6905 get_immediate_dominator (CDI_DOMINATORS, e->dest)->index);
6906 else
6908 bbs_to_remove = get_all_dominated_blocks (CDI_DOMINATORS, e->dest);
6909 for (i = 0; VEC_iterate (basic_block, bbs_to_remove, i, bb); i++)
6911 FOR_EACH_EDGE (f, ei, bb->succs)
6913 if (f->dest != EXIT_BLOCK_PTR)
6914 bitmap_set_bit (df, f->dest->index);
6917 for (i = 0; VEC_iterate (basic_block, bbs_to_remove, i, bb); i++)
6918 bitmap_clear_bit (df, bb->index);
6920 EXECUTE_IF_SET_IN_BITMAP (df, 0, i, bi)
6922 bb = BASIC_BLOCK (i);
6923 bitmap_set_bit (df_idom,
6924 get_immediate_dominator (CDI_DOMINATORS, bb)->index);
6928 if (cfgcleanup_altered_bbs)
6930 /* Record the set of the altered basic blocks. */
6931 bitmap_set_bit (cfgcleanup_altered_bbs, e->src->index);
6932 bitmap_ior_into (cfgcleanup_altered_bbs, df);
6935 /* Remove E and the cancelled blocks. */
6936 if (none_removed)
6937 remove_edge (e);
6938 else
6940 /* Walk backwards so as to get a chance to substitute all
6941 released DEFs into debug stmts. See
6942 eliminate_unnecessary_stmts() in tree-ssa-dce.c for more
6943 details. */
6944 for (i = VEC_length (basic_block, bbs_to_remove); i-- > 0; )
6945 delete_basic_block (VEC_index (basic_block, bbs_to_remove, i));
6948 /* Update the dominance information. The immediate dominator may change only
6949 for blocks whose immediate dominator belongs to DF_IDOM:
6951 Suppose that idom(X) = Y before removal of E and idom(X) != Y after the
6952 removal. Let Z the arbitrary block such that idom(Z) = Y and
6953 Z dominates X after the removal. Before removal, there exists a path P
6954 from Y to X that avoids Z. Let F be the last edge on P that is
6955 removed, and let W = F->dest. Before removal, idom(W) = Y (since Y
6956 dominates W, and because of P, Z does not dominate W), and W belongs to
6957 the dominance frontier of E. Therefore, Y belongs to DF_IDOM. */
6958 EXECUTE_IF_SET_IN_BITMAP (df_idom, 0, i, bi)
6960 bb = BASIC_BLOCK (i);
6961 for (dbb = first_dom_son (CDI_DOMINATORS, bb);
6962 dbb;
6963 dbb = next_dom_son (CDI_DOMINATORS, dbb))
6964 VEC_safe_push (basic_block, heap, bbs_to_fix_dom, dbb);
6967 iterate_fix_dominators (CDI_DOMINATORS, bbs_to_fix_dom, true);
6969 BITMAP_FREE (df);
6970 BITMAP_FREE (df_idom);
6971 VEC_free (basic_block, heap, bbs_to_remove);
6972 VEC_free (basic_block, heap, bbs_to_fix_dom);
6975 /* Purge dead EH edges from basic block BB. */
6977 bool
6978 gimple_purge_dead_eh_edges (basic_block bb)
6980 bool changed = false;
6981 edge e;
6982 edge_iterator ei;
6983 gimple stmt = last_stmt (bb);
6985 if (stmt && stmt_can_throw_internal (stmt))
6986 return false;
6988 for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
6990 if (e->flags & EDGE_EH)
6992 remove_edge_and_dominated_blocks (e);
6993 changed = true;
6995 else
6996 ei_next (&ei);
6999 return changed;
7002 bool
7003 gimple_purge_all_dead_eh_edges (const_bitmap blocks)
7005 bool changed = false;
7006 unsigned i;
7007 bitmap_iterator bi;
7009 EXECUTE_IF_SET_IN_BITMAP (blocks, 0, i, bi)
7011 basic_block bb = BASIC_BLOCK (i);
7013 /* Earlier gimple_purge_dead_eh_edges could have removed
7014 this basic block already. */
7015 gcc_assert (bb || changed);
7016 if (bb != NULL)
7017 changed |= gimple_purge_dead_eh_edges (bb);
7020 return changed;
7023 /* This function is called whenever a new edge is created or
7024 redirected. */
7026 static void
7027 gimple_execute_on_growing_pred (edge e)
7029 basic_block bb = e->dest;
7031 if (!gimple_seq_empty_p (phi_nodes (bb)))
7032 reserve_phi_args_for_new_edge (bb);
7035 /* This function is called immediately before edge E is removed from
7036 the edge vector E->dest->preds. */
7038 static void
7039 gimple_execute_on_shrinking_pred (edge e)
7041 if (!gimple_seq_empty_p (phi_nodes (e->dest)))
7042 remove_phi_args (e);
7045 /*---------------------------------------------------------------------------
7046 Helper functions for Loop versioning
7047 ---------------------------------------------------------------------------*/
7049 /* Adjust phi nodes for 'first' basic block. 'second' basic block is a copy
7050 of 'first'. Both of them are dominated by 'new_head' basic block. When
7051 'new_head' was created by 'second's incoming edge it received phi arguments
7052 on the edge by split_edge(). Later, additional edge 'e' was created to
7053 connect 'new_head' and 'first'. Now this routine adds phi args on this
7054 additional edge 'e' that new_head to second edge received as part of edge
7055 splitting. */
7057 static void
7058 gimple_lv_adjust_loop_header_phi (basic_block first, basic_block second,
7059 basic_block new_head, edge e)
7061 gimple phi1, phi2;
7062 gimple_stmt_iterator psi1, psi2;
7063 tree def;
7064 edge e2 = find_edge (new_head, second);
7066 /* Because NEW_HEAD has been created by splitting SECOND's incoming
7067 edge, we should always have an edge from NEW_HEAD to SECOND. */
7068 gcc_assert (e2 != NULL);
7070 /* Browse all 'second' basic block phi nodes and add phi args to
7071 edge 'e' for 'first' head. PHI args are always in correct order. */
7073 for (psi2 = gsi_start_phis (second),
7074 psi1 = gsi_start_phis (first);
7075 !gsi_end_p (psi2) && !gsi_end_p (psi1);
7076 gsi_next (&psi2), gsi_next (&psi1))
7078 phi1 = gsi_stmt (psi1);
7079 phi2 = gsi_stmt (psi2);
7080 def = PHI_ARG_DEF (phi2, e2->dest_idx);
7081 add_phi_arg (phi1, def, e, gimple_phi_arg_location_from_edge (phi2, e2));
7086 /* Adds a if else statement to COND_BB with condition COND_EXPR.
7087 SECOND_HEAD is the destination of the THEN and FIRST_HEAD is
7088 the destination of the ELSE part. */
7090 static void
7091 gimple_lv_add_condition_to_bb (basic_block first_head ATTRIBUTE_UNUSED,
7092 basic_block second_head ATTRIBUTE_UNUSED,
7093 basic_block cond_bb, void *cond_e)
7095 gimple_stmt_iterator gsi;
7096 gimple new_cond_expr;
7097 tree cond_expr = (tree) cond_e;
7098 edge e0;
7100 /* Build new conditional expr */
7101 new_cond_expr = gimple_build_cond_from_tree (cond_expr,
7102 NULL_TREE, NULL_TREE);
7104 /* Add new cond in cond_bb. */
7105 gsi = gsi_last_bb (cond_bb);
7106 gsi_insert_after (&gsi, new_cond_expr, GSI_NEW_STMT);
7108 /* Adjust edges appropriately to connect new head with first head
7109 as well as second head. */
7110 e0 = single_succ_edge (cond_bb);
7111 e0->flags &= ~EDGE_FALLTHRU;
7112 e0->flags |= EDGE_FALSE_VALUE;
7115 struct cfg_hooks gimple_cfg_hooks = {
7116 "gimple",
7117 gimple_verify_flow_info,
7118 gimple_dump_bb, /* dump_bb */
7119 create_bb, /* create_basic_block */
7120 gimple_redirect_edge_and_branch, /* redirect_edge_and_branch */
7121 gimple_redirect_edge_and_branch_force, /* redirect_edge_and_branch_force */
7122 gimple_can_remove_branch_p, /* can_remove_branch_p */
7123 remove_bb, /* delete_basic_block */
7124 gimple_split_block, /* split_block */
7125 gimple_move_block_after, /* move_block_after */
7126 gimple_can_merge_blocks_p, /* can_merge_blocks_p */
7127 gimple_merge_blocks, /* merge_blocks */
7128 gimple_predict_edge, /* predict_edge */
7129 gimple_predicted_by_p, /* predicted_by_p */
7130 gimple_can_duplicate_bb_p, /* can_duplicate_block_p */
7131 gimple_duplicate_bb, /* duplicate_block */
7132 gimple_split_edge, /* split_edge */
7133 gimple_make_forwarder_block, /* make_forward_block */
7134 NULL, /* tidy_fallthru_edge */
7135 gimple_block_ends_with_call_p,/* block_ends_with_call_p */
7136 gimple_block_ends_with_condjump_p, /* block_ends_with_condjump_p */
7137 gimple_flow_call_edges_add, /* flow_call_edges_add */
7138 gimple_execute_on_growing_pred, /* execute_on_growing_pred */
7139 gimple_execute_on_shrinking_pred, /* execute_on_shrinking_pred */
7140 gimple_duplicate_loop_to_header_edge, /* duplicate loop for trees */
7141 gimple_lv_add_condition_to_bb, /* lv_add_condition_to_bb */
7142 gimple_lv_adjust_loop_header_phi, /* lv_adjust_loop_header_phi*/
7143 extract_true_false_edges_from_block, /* extract_cond_bb_edges */
7144 flush_pending_stmts /* flush_pending_stmts */
7148 /* Split all critical edges. */
7150 static unsigned int
7151 split_critical_edges (void)
7153 basic_block bb;
7154 edge e;
7155 edge_iterator ei;
7157 /* split_edge can redirect edges out of SWITCH_EXPRs, which can get
7158 expensive. So we want to enable recording of edge to CASE_LABEL_EXPR
7159 mappings around the calls to split_edge. */
7160 start_recording_case_labels ();
7161 FOR_ALL_BB (bb)
7163 FOR_EACH_EDGE (e, ei, bb->succs)
7165 if (EDGE_CRITICAL_P (e) && !(e->flags & EDGE_ABNORMAL))
7166 split_edge (e);
7167 /* PRE inserts statements to edges and expects that
7168 since split_critical_edges was done beforehand, committing edge
7169 insertions will not split more edges. In addition to critical
7170 edges we must split edges that have multiple successors and
7171 end by control flow statements, such as RESX.
7172 Go ahead and split them too. This matches the logic in
7173 gimple_find_edge_insert_loc. */
7174 else if ((!single_pred_p (e->dest)
7175 || !gimple_seq_empty_p (phi_nodes (e->dest))
7176 || e->dest == EXIT_BLOCK_PTR)
7177 && e->src != ENTRY_BLOCK_PTR
7178 && !(e->flags & EDGE_ABNORMAL))
7180 gimple_stmt_iterator gsi;
7182 gsi = gsi_last_bb (e->src);
7183 if (!gsi_end_p (gsi)
7184 && stmt_ends_bb_p (gsi_stmt (gsi))
7185 && (gimple_code (gsi_stmt (gsi)) != GIMPLE_RETURN
7186 && !gimple_call_builtin_p (gsi_stmt (gsi),
7187 BUILT_IN_RETURN)))
7188 split_edge (e);
7192 end_recording_case_labels ();
7193 return 0;
7196 struct gimple_opt_pass pass_split_crit_edges =
7199 GIMPLE_PASS,
7200 "crited", /* name */
7201 NULL, /* gate */
7202 split_critical_edges, /* execute */
7203 NULL, /* sub */
7204 NULL, /* next */
7205 0, /* static_pass_number */
7206 TV_TREE_SPLIT_EDGES, /* tv_id */
7207 PROP_cfg, /* properties required */
7208 PROP_no_crit_edges, /* properties_provided */
7209 0, /* properties_destroyed */
7210 0, /* todo_flags_start */
7211 TODO_dump_func | TODO_verify_flow /* todo_flags_finish */
7216 /* Build a ternary operation and gimplify it. Emit code before GSI.
7217 Return the gimple_val holding the result. */
7219 tree
7220 gimplify_build3 (gimple_stmt_iterator *gsi, enum tree_code code,
7221 tree type, tree a, tree b, tree c)
7223 tree ret;
7224 location_t loc = gimple_location (gsi_stmt (*gsi));
7226 ret = fold_build3_loc (loc, code, type, a, b, c);
7227 STRIP_NOPS (ret);
7229 return force_gimple_operand_gsi (gsi, ret, true, NULL, true,
7230 GSI_SAME_STMT);
7233 /* Build a binary operation and gimplify it. Emit code before GSI.
7234 Return the gimple_val holding the result. */
7236 tree
7237 gimplify_build2 (gimple_stmt_iterator *gsi, enum tree_code code,
7238 tree type, tree a, tree b)
7240 tree ret;
7242 ret = fold_build2_loc (gimple_location (gsi_stmt (*gsi)), code, type, a, b);
7243 STRIP_NOPS (ret);
7245 return force_gimple_operand_gsi (gsi, ret, true, NULL, true,
7246 GSI_SAME_STMT);
7249 /* Build a unary operation and gimplify it. Emit code before GSI.
7250 Return the gimple_val holding the result. */
7252 tree
7253 gimplify_build1 (gimple_stmt_iterator *gsi, enum tree_code code, tree type,
7254 tree a)
7256 tree ret;
7258 ret = fold_build1_loc (gimple_location (gsi_stmt (*gsi)), code, type, a);
7259 STRIP_NOPS (ret);
7261 return force_gimple_operand_gsi (gsi, ret, true, NULL, true,
7262 GSI_SAME_STMT);
7267 /* Emit return warnings. */
7269 static unsigned int
7270 execute_warn_function_return (void)
7272 source_location location;
7273 gimple last;
7274 edge e;
7275 edge_iterator ei;
7277 /* If we have a path to EXIT, then we do return. */
7278 if (TREE_THIS_VOLATILE (cfun->decl)
7279 && EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0)
7281 location = UNKNOWN_LOCATION;
7282 FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
7284 last = last_stmt (e->src);
7285 if ((gimple_code (last) == GIMPLE_RETURN
7286 || gimple_call_builtin_p (last, BUILT_IN_RETURN))
7287 && (location = gimple_location (last)) != UNKNOWN_LOCATION)
7288 break;
7290 if (location == UNKNOWN_LOCATION)
7291 location = cfun->function_end_locus;
7292 warning_at (location, 0, "%<noreturn%> function does return");
7295 /* If we see "return;" in some basic block, then we do reach the end
7296 without returning a value. */
7297 else if (warn_return_type
7298 && !TREE_NO_WARNING (cfun->decl)
7299 && EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0
7300 && !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (cfun->decl))))
7302 FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
7304 gimple last = last_stmt (e->src);
7305 if (gimple_code (last) == GIMPLE_RETURN
7306 && gimple_return_retval (last) == NULL
7307 && !gimple_no_warning_p (last))
7309 location = gimple_location (last);
7310 if (location == UNKNOWN_LOCATION)
7311 location = cfun->function_end_locus;
7312 warning_at (location, OPT_Wreturn_type, "control reaches end of non-void function");
7313 TREE_NO_WARNING (cfun->decl) = 1;
7314 break;
7318 return 0;
7322 /* Given a basic block B which ends with a conditional and has
7323 precisely two successors, determine which of the edges is taken if
7324 the conditional is true and which is taken if the conditional is
7325 false. Set TRUE_EDGE and FALSE_EDGE appropriately. */
7327 void
7328 extract_true_false_edges_from_block (basic_block b,
7329 edge *true_edge,
7330 edge *false_edge)
7332 edge e = EDGE_SUCC (b, 0);
7334 if (e->flags & EDGE_TRUE_VALUE)
7336 *true_edge = e;
7337 *false_edge = EDGE_SUCC (b, 1);
7339 else
7341 *false_edge = e;
7342 *true_edge = EDGE_SUCC (b, 1);
7346 struct gimple_opt_pass pass_warn_function_return =
7349 GIMPLE_PASS,
7350 "*warn_function_return", /* name */
7351 NULL, /* gate */
7352 execute_warn_function_return, /* execute */
7353 NULL, /* sub */
7354 NULL, /* next */
7355 0, /* static_pass_number */
7356 TV_NONE, /* tv_id */
7357 PROP_cfg, /* properties_required */
7358 0, /* properties_provided */
7359 0, /* properties_destroyed */
7360 0, /* todo_flags_start */
7361 0 /* todo_flags_finish */
7365 /* Emit noreturn warnings. */
7367 static unsigned int
7368 execute_warn_function_noreturn (void)
7370 if (!TREE_THIS_VOLATILE (current_function_decl)
7371 && EDGE_COUNT (EXIT_BLOCK_PTR->preds) == 0)
7372 warn_function_noreturn (current_function_decl);
7373 return 0;
7376 static bool
7377 gate_warn_function_noreturn (void)
7379 return warn_suggest_attribute_noreturn;
7382 struct gimple_opt_pass pass_warn_function_noreturn =
7385 GIMPLE_PASS,
7386 "*warn_function_noreturn", /* name */
7387 gate_warn_function_noreturn, /* gate */
7388 execute_warn_function_noreturn, /* execute */
7389 NULL, /* sub */
7390 NULL, /* next */
7391 0, /* static_pass_number */
7392 TV_NONE, /* tv_id */
7393 PROP_cfg, /* properties_required */
7394 0, /* properties_provided */
7395 0, /* properties_destroyed */
7396 0, /* todo_flags_start */
7397 0 /* todo_flags_finish */
7402 /* Walk a gimplified function and warn for functions whose return value is
7403 ignored and attribute((warn_unused_result)) is set. This is done before
7404 inlining, so we don't have to worry about that. */
7406 static void
7407 do_warn_unused_result (gimple_seq seq)
7409 tree fdecl, ftype;
7410 gimple_stmt_iterator i;
7412 for (i = gsi_start (seq); !gsi_end_p (i); gsi_next (&i))
7414 gimple g = gsi_stmt (i);
7416 switch (gimple_code (g))
7418 case GIMPLE_BIND:
7419 do_warn_unused_result (gimple_bind_body (g));
7420 break;
7421 case GIMPLE_TRY:
7422 do_warn_unused_result (gimple_try_eval (g));
7423 do_warn_unused_result (gimple_try_cleanup (g));
7424 break;
7425 case GIMPLE_CATCH:
7426 do_warn_unused_result (gimple_catch_handler (g));
7427 break;
7428 case GIMPLE_EH_FILTER:
7429 do_warn_unused_result (gimple_eh_filter_failure (g));
7430 break;
7432 case GIMPLE_CALL:
7433 if (gimple_call_lhs (g))
7434 break;
7436 /* This is a naked call, as opposed to a GIMPLE_CALL with an
7437 LHS. All calls whose value is ignored should be
7438 represented like this. Look for the attribute. */
7439 fdecl = gimple_call_fndecl (g);
7440 ftype = TREE_TYPE (TREE_TYPE (gimple_call_fn (g)));
7442 if (lookup_attribute ("warn_unused_result", TYPE_ATTRIBUTES (ftype)))
7444 location_t loc = gimple_location (g);
7446 if (fdecl)
7447 warning_at (loc, OPT_Wunused_result,
7448 "ignoring return value of %qD, "
7449 "declared with attribute warn_unused_result",
7450 fdecl);
7451 else
7452 warning_at (loc, OPT_Wunused_result,
7453 "ignoring return value of function "
7454 "declared with attribute warn_unused_result");
7456 break;
7458 default:
7459 /* Not a container, not a call, or a call whose value is used. */
7460 break;
7465 static unsigned int
7466 run_warn_unused_result (void)
7468 do_warn_unused_result (gimple_body (current_function_decl));
7469 return 0;
7472 static bool
7473 gate_warn_unused_result (void)
7475 return flag_warn_unused_result;
7478 struct gimple_opt_pass pass_warn_unused_result =
7481 GIMPLE_PASS,
7482 "*warn_unused_result", /* name */
7483 gate_warn_unused_result, /* gate */
7484 run_warn_unused_result, /* execute */
7485 NULL, /* sub */
7486 NULL, /* next */
7487 0, /* static_pass_number */
7488 TV_NONE, /* tv_id */
7489 PROP_gimple_any, /* properties_required */
7490 0, /* properties_provided */
7491 0, /* properties_destroyed */
7492 0, /* todo_flags_start */
7493 0, /* todo_flags_finish */