* config/rx/rx.c (ADD_RX_BUILTIN0): New macro, used for builtins
[official-gcc.git] / gcc / tree-cfg.c
blobd70565735355de987027fc0fe09dac26db3a6435
1 /* Control flow functions for trees.
2 Copyright (C) 2001-2013 Free Software Foundation, Inc.
3 Contributed by Diego Novillo <dnovillo@redhat.com>
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
10 any later version.
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "hash-table.h"
25 #include "tm.h"
26 #include "tree.h"
27 #include "tm_p.h"
28 #include "basic-block.h"
29 #include "flags.h"
30 #include "function.h"
31 #include "ggc.h"
32 #include "gimple-pretty-print.h"
33 #include "gimple.h"
34 #include "gimple-ssa.h"
35 #include "cgraph.h"
36 #include "tree-cfg.h"
37 #include "tree-phinodes.h"
38 #include "ssa-iterators.h"
39 #include "tree-ssanames.h"
40 #include "tree-ssa-loop-manip.h"
41 #include "tree-ssa-loop-niter.h"
42 #include "tree-into-ssa.h"
43 #include "tree-dfa.h"
44 #include "tree-ssa.h"
45 #include "tree-dump.h"
46 #include "tree-pass.h"
47 #include "diagnostic-core.h"
48 #include "except.h"
49 #include "cfgloop.h"
50 #include "tree-ssa-propagate.h"
51 #include "value-prof.h"
52 #include "pointer-set.h"
53 #include "tree-inline.h"
54 #include "target.h"
55 #include "tree-ssa-live.h"
56 #include "omp-low.h"
57 #include "tree-cfgcleanup.h"
59 /* This file contains functions for building the Control Flow Graph (CFG)
60 for a function tree. */
62 /* Local declarations. */
64 /* Initial capacity for the basic block array. */
65 static const int initial_cfg_capacity = 20;
67 /* This hash table allows us to efficiently lookup all CASE_LABEL_EXPRs
68 which use a particular edge. The CASE_LABEL_EXPRs are chained together
69 via their CASE_CHAIN field, which we clear after we're done with the
70 hash table to prevent problems with duplication of GIMPLE_SWITCHes.
72 Access to this list of CASE_LABEL_EXPRs allows us to efficiently
73 update the case vector in response to edge redirections.
75 Right now this table is set up and torn down at key points in the
76 compilation process. It would be nice if we could make the table
77 more persistent. The key is getting notification of changes to
78 the CFG (particularly edge removal, creation and redirection). */
80 static struct pointer_map_t *edge_to_cases;
82 /* If we record edge_to_cases, this bitmap will hold indexes
83 of basic blocks that end in a GIMPLE_SWITCH which we touched
84 due to edge manipulations. */
86 static bitmap touched_switch_bbs;
88 /* CFG statistics. */
89 struct cfg_stats_d
91 long num_merged_labels;
94 static struct cfg_stats_d cfg_stats;
96 /* Nonzero if we found a computed goto while building basic blocks. */
97 static bool found_computed_goto;
99 /* Hash table to store last discriminator assigned for each locus. */
100 struct locus_discrim_map
102 location_t locus;
103 int discriminator;
106 /* Hashtable helpers. */
108 struct locus_discrim_hasher : typed_free_remove <locus_discrim_map>
110 typedef locus_discrim_map value_type;
111 typedef locus_discrim_map compare_type;
112 static inline hashval_t hash (const value_type *);
113 static inline bool equal (const value_type *, const compare_type *);
116 /* Trivial hash function for a location_t. ITEM is a pointer to
117 a hash table entry that maps a location_t to a discriminator. */
119 inline hashval_t
120 locus_discrim_hasher::hash (const value_type *item)
122 return LOCATION_LINE (item->locus);
125 /* Equality function for the locus-to-discriminator map. A and B
126 point to the two hash table entries to compare. */
128 inline bool
129 locus_discrim_hasher::equal (const value_type *a, const compare_type *b)
131 return LOCATION_LINE (a->locus) == LOCATION_LINE (b->locus);
134 static hash_table <locus_discrim_hasher> discriminator_per_locus;
136 /* Basic blocks and flowgraphs. */
137 static void make_blocks (gimple_seq);
138 static void factor_computed_gotos (void);
140 /* Edges. */
141 static void make_edges (void);
142 static void assign_discriminators (void);
143 static void make_cond_expr_edges (basic_block);
144 static void make_gimple_switch_edges (basic_block);
145 static void make_goto_expr_edges (basic_block);
146 static void make_gimple_asm_edges (basic_block);
147 static edge gimple_redirect_edge_and_branch (edge, basic_block);
148 static edge gimple_try_redirect_by_replacing_jump (edge, basic_block);
149 static unsigned int split_critical_edges (void);
151 /* Various helpers. */
152 static inline bool stmt_starts_bb_p (gimple, gimple);
153 static int gimple_verify_flow_info (void);
154 static void gimple_make_forwarder_block (edge);
155 static gimple first_non_label_stmt (basic_block);
156 static bool verify_gimple_transaction (gimple);
158 /* Flowgraph optimization and cleanup. */
159 static void gimple_merge_blocks (basic_block, basic_block);
160 static bool gimple_can_merge_blocks_p (basic_block, basic_block);
161 static void remove_bb (basic_block);
162 static edge find_taken_edge_computed_goto (basic_block, tree);
163 static edge find_taken_edge_cond_expr (basic_block, tree);
164 static edge find_taken_edge_switch_expr (basic_block, tree);
165 static tree find_case_label_for_value (gimple, tree);
167 void
168 init_empty_tree_cfg_for_function (struct function *fn)
170 /* Initialize the basic block array. */
171 init_flow (fn);
172 profile_status_for_function (fn) = PROFILE_ABSENT;
173 n_basic_blocks_for_function (fn) = NUM_FIXED_BLOCKS;
174 last_basic_block_for_function (fn) = NUM_FIXED_BLOCKS;
175 vec_alloc (basic_block_info_for_function (fn), initial_cfg_capacity);
176 vec_safe_grow_cleared (basic_block_info_for_function (fn),
177 initial_cfg_capacity);
179 /* Build a mapping of labels to their associated blocks. */
180 vec_alloc (label_to_block_map_for_function (fn), initial_cfg_capacity);
181 vec_safe_grow_cleared (label_to_block_map_for_function (fn),
182 initial_cfg_capacity);
184 SET_BASIC_BLOCK_FOR_FUNCTION (fn, ENTRY_BLOCK,
185 ENTRY_BLOCK_PTR_FOR_FUNCTION (fn));
186 SET_BASIC_BLOCK_FOR_FUNCTION (fn, EXIT_BLOCK,
187 EXIT_BLOCK_PTR_FOR_FUNCTION (fn));
189 ENTRY_BLOCK_PTR_FOR_FUNCTION (fn)->next_bb
190 = EXIT_BLOCK_PTR_FOR_FUNCTION (fn);
191 EXIT_BLOCK_PTR_FOR_FUNCTION (fn)->prev_bb
192 = ENTRY_BLOCK_PTR_FOR_FUNCTION (fn);
195 void
196 init_empty_tree_cfg (void)
198 init_empty_tree_cfg_for_function (cfun);
201 /*---------------------------------------------------------------------------
202 Create basic blocks
203 ---------------------------------------------------------------------------*/
205 /* Entry point to the CFG builder for trees. SEQ is the sequence of
206 statements to be added to the flowgraph. */
208 static void
209 build_gimple_cfg (gimple_seq seq)
211 /* Register specific gimple functions. */
212 gimple_register_cfg_hooks ();
214 memset ((void *) &cfg_stats, 0, sizeof (cfg_stats));
216 init_empty_tree_cfg ();
218 found_computed_goto = 0;
219 make_blocks (seq);
221 /* Computed gotos are hell to deal with, especially if there are
222 lots of them with a large number of destinations. So we factor
223 them to a common computed goto location before we build the
224 edge list. After we convert back to normal form, we will un-factor
225 the computed gotos since factoring introduces an unwanted jump. */
226 if (found_computed_goto)
227 factor_computed_gotos ();
229 /* Make sure there is always at least one block, even if it's empty. */
230 if (n_basic_blocks == NUM_FIXED_BLOCKS)
231 create_empty_bb (ENTRY_BLOCK_PTR);
233 /* Adjust the size of the array. */
234 if (basic_block_info->length () < (size_t) n_basic_blocks)
235 vec_safe_grow_cleared (basic_block_info, n_basic_blocks);
237 /* To speed up statement iterator walks, we first purge dead labels. */
238 cleanup_dead_labels ();
240 /* Group case nodes to reduce the number of edges.
241 We do this after cleaning up dead labels because otherwise we miss
242 a lot of obvious case merging opportunities. */
243 group_case_labels ();
245 /* Create the edges of the flowgraph. */
246 discriminator_per_locus.create (13);
247 make_edges ();
248 assign_discriminators ();
249 cleanup_dead_labels ();
250 discriminator_per_locus.dispose ();
254 /* Search for ANNOTATE call with annot_expr_ivdep_kind; if found, remove
255 it and set loop->safelen to INT_MAX. We assume that the annotation
256 comes immediately before the condition. */
258 static void
259 replace_loop_annotate ()
261 struct loop *loop;
262 loop_iterator li;
263 basic_block bb;
264 gimple_stmt_iterator gsi;
265 gimple stmt;
267 FOR_EACH_LOOP (li, loop, 0)
269 gsi = gsi_last_bb (loop->header);
270 stmt = gsi_stmt (gsi);
271 if (stmt && gimple_code (stmt) == GIMPLE_COND)
273 gsi_prev_nondebug (&gsi);
274 if (gsi_end_p (gsi))
275 continue;
276 stmt = gsi_stmt (gsi);
277 if (gimple_code (stmt) != GIMPLE_CALL)
278 continue;
279 if (!gimple_call_internal_p (stmt)
280 || gimple_call_internal_fn (stmt) != IFN_ANNOTATE)
281 continue;
282 if ((annot_expr_kind) tree_low_cst (gimple_call_arg (stmt, 1), 0)
283 != annot_expr_ivdep_kind)
284 continue;
285 stmt = gimple_build_assign (gimple_call_lhs (stmt),
286 gimple_call_arg (stmt, 0));
287 gsi_replace (&gsi, stmt, true);
288 loop->safelen = INT_MAX;
292 /* Remove IFN_ANNOTATE. Safeguard for the case loop->latch == NULL. */
293 FOR_EACH_BB (bb)
295 gsi = gsi_last_bb (bb);
296 stmt = gsi_stmt (gsi);
297 if (stmt && gimple_code (stmt) == GIMPLE_COND)
298 gsi_prev_nondebug (&gsi);
299 if (gsi_end_p (gsi))
300 continue;
301 stmt = gsi_stmt (gsi);
302 if (gimple_code (stmt) != GIMPLE_CALL)
303 continue;
304 if (!gimple_call_internal_p (stmt)
305 || gimple_call_internal_fn (stmt) != IFN_ANNOTATE)
306 continue;
307 if ((annot_expr_kind) tree_low_cst (gimple_call_arg (stmt, 1), 0)
308 != annot_expr_ivdep_kind)
309 continue;
310 warning_at (gimple_location (stmt), 0, "ignoring %<GCC ivdep%> "
311 "annotation");
312 stmt = gimple_build_assign (gimple_call_lhs (stmt),
313 gimple_call_arg (stmt, 0));
314 gsi_replace (&gsi, stmt, true);
319 static unsigned int
320 execute_build_cfg (void)
322 gimple_seq body = gimple_body (current_function_decl);
324 build_gimple_cfg (body);
325 gimple_set_body (current_function_decl, NULL);
326 if (dump_file && (dump_flags & TDF_DETAILS))
328 fprintf (dump_file, "Scope blocks:\n");
329 dump_scope_blocks (dump_file, dump_flags);
331 cleanup_tree_cfg ();
332 loop_optimizer_init (AVOID_CFG_MODIFICATIONS);
333 replace_loop_annotate ();
334 return 0;
337 namespace {
339 const pass_data pass_data_build_cfg =
341 GIMPLE_PASS, /* type */
342 "cfg", /* name */
343 OPTGROUP_NONE, /* optinfo_flags */
344 false, /* has_gate */
345 true, /* has_execute */
346 TV_TREE_CFG, /* tv_id */
347 PROP_gimple_leh, /* properties_required */
348 ( PROP_cfg | PROP_loops ), /* properties_provided */
349 0, /* properties_destroyed */
350 0, /* todo_flags_start */
351 TODO_verify_stmts, /* todo_flags_finish */
354 class pass_build_cfg : public gimple_opt_pass
356 public:
357 pass_build_cfg (gcc::context *ctxt)
358 : gimple_opt_pass (pass_data_build_cfg, ctxt)
361 /* opt_pass methods: */
362 unsigned int execute () { return execute_build_cfg (); }
364 }; // class pass_build_cfg
366 } // anon namespace
368 gimple_opt_pass *
369 make_pass_build_cfg (gcc::context *ctxt)
371 return new pass_build_cfg (ctxt);
375 /* Return true if T is a computed goto. */
377 static bool
378 computed_goto_p (gimple t)
380 return (gimple_code (t) == GIMPLE_GOTO
381 && TREE_CODE (gimple_goto_dest (t)) != LABEL_DECL);
385 /* Search the CFG for any computed gotos. If found, factor them to a
386 common computed goto site. Also record the location of that site so
387 that we can un-factor the gotos after we have converted back to
388 normal form. */
390 static void
391 factor_computed_gotos (void)
393 basic_block bb;
394 tree factored_label_decl = NULL;
395 tree var = NULL;
396 gimple factored_computed_goto_label = NULL;
397 gimple factored_computed_goto = NULL;
399 /* We know there are one or more computed gotos in this function.
400 Examine the last statement in each basic block to see if the block
401 ends with a computed goto. */
403 FOR_EACH_BB (bb)
405 gimple_stmt_iterator gsi = gsi_last_bb (bb);
406 gimple last;
408 if (gsi_end_p (gsi))
409 continue;
411 last = gsi_stmt (gsi);
413 /* Ignore the computed goto we create when we factor the original
414 computed gotos. */
415 if (last == factored_computed_goto)
416 continue;
418 /* If the last statement is a computed goto, factor it. */
419 if (computed_goto_p (last))
421 gimple assignment;
423 /* The first time we find a computed goto we need to create
424 the factored goto block and the variable each original
425 computed goto will use for their goto destination. */
426 if (!factored_computed_goto)
428 basic_block new_bb = create_empty_bb (bb);
429 gimple_stmt_iterator new_gsi = gsi_start_bb (new_bb);
431 /* Create the destination of the factored goto. Each original
432 computed goto will put its desired destination into this
433 variable and jump to the label we create immediately
434 below. */
435 var = create_tmp_var (ptr_type_node, "gotovar");
437 /* Build a label for the new block which will contain the
438 factored computed goto. */
439 factored_label_decl = create_artificial_label (UNKNOWN_LOCATION);
440 factored_computed_goto_label
441 = gimple_build_label (factored_label_decl);
442 gsi_insert_after (&new_gsi, factored_computed_goto_label,
443 GSI_NEW_STMT);
445 /* Build our new computed goto. */
446 factored_computed_goto = gimple_build_goto (var);
447 gsi_insert_after (&new_gsi, factored_computed_goto, GSI_NEW_STMT);
450 /* Copy the original computed goto's destination into VAR. */
451 assignment = gimple_build_assign (var, gimple_goto_dest (last));
452 gsi_insert_before (&gsi, assignment, GSI_SAME_STMT);
454 /* And re-vector the computed goto to the new destination. */
455 gimple_goto_set_dest (last, factored_label_decl);
461 /* Build a flowgraph for the sequence of stmts SEQ. */
463 static void
464 make_blocks (gimple_seq seq)
466 gimple_stmt_iterator i = gsi_start (seq);
467 gimple stmt = NULL;
468 bool start_new_block = true;
469 bool first_stmt_of_seq = true;
470 basic_block bb = ENTRY_BLOCK_PTR;
472 while (!gsi_end_p (i))
474 gimple prev_stmt;
476 prev_stmt = stmt;
477 stmt = gsi_stmt (i);
479 /* If the statement starts a new basic block or if we have determined
480 in a previous pass that we need to create a new block for STMT, do
481 so now. */
482 if (start_new_block || stmt_starts_bb_p (stmt, prev_stmt))
484 if (!first_stmt_of_seq)
485 gsi_split_seq_before (&i, &seq);
486 bb = create_basic_block (seq, NULL, bb);
487 start_new_block = false;
490 /* Now add STMT to BB and create the subgraphs for special statement
491 codes. */
492 gimple_set_bb (stmt, bb);
494 if (computed_goto_p (stmt))
495 found_computed_goto = true;
497 /* If STMT is a basic block terminator, set START_NEW_BLOCK for the
498 next iteration. */
499 if (stmt_ends_bb_p (stmt))
501 /* If the stmt can make abnormal goto use a new temporary
502 for the assignment to the LHS. This makes sure the old value
503 of the LHS is available on the abnormal edge. Otherwise
504 we will end up with overlapping life-ranges for abnormal
505 SSA names. */
506 if (gimple_has_lhs (stmt)
507 && stmt_can_make_abnormal_goto (stmt)
508 && is_gimple_reg_type (TREE_TYPE (gimple_get_lhs (stmt))))
510 tree lhs = gimple_get_lhs (stmt);
511 tree tmp = create_tmp_var (TREE_TYPE (lhs), NULL);
512 gimple s = gimple_build_assign (lhs, tmp);
513 gimple_set_location (s, gimple_location (stmt));
514 gimple_set_block (s, gimple_block (stmt));
515 gimple_set_lhs (stmt, tmp);
516 if (TREE_CODE (TREE_TYPE (tmp)) == COMPLEX_TYPE
517 || TREE_CODE (TREE_TYPE (tmp)) == VECTOR_TYPE)
518 DECL_GIMPLE_REG_P (tmp) = 1;
519 gsi_insert_after (&i, s, GSI_SAME_STMT);
521 start_new_block = true;
524 gsi_next (&i);
525 first_stmt_of_seq = false;
530 /* Create and return a new empty basic block after bb AFTER. */
532 static basic_block
533 create_bb (void *h, void *e, basic_block after)
535 basic_block bb;
537 gcc_assert (!e);
539 /* Create and initialize a new basic block. Since alloc_block uses
540 GC allocation that clears memory to allocate a basic block, we do
541 not have to clear the newly allocated basic block here. */
542 bb = alloc_block ();
544 bb->index = last_basic_block;
545 bb->flags = BB_NEW;
546 set_bb_seq (bb, h ? (gimple_seq) h : NULL);
548 /* Add the new block to the linked list of blocks. */
549 link_block (bb, after);
551 /* Grow the basic block array if needed. */
552 if ((size_t) last_basic_block == basic_block_info->length ())
554 size_t new_size = last_basic_block + (last_basic_block + 3) / 4;
555 vec_safe_grow_cleared (basic_block_info, new_size);
558 /* Add the newly created block to the array. */
559 SET_BASIC_BLOCK (last_basic_block, bb);
561 n_basic_blocks++;
562 last_basic_block++;
564 return bb;
568 /*---------------------------------------------------------------------------
569 Edge creation
570 ---------------------------------------------------------------------------*/
572 /* Fold COND_EXPR_COND of each COND_EXPR. */
574 void
575 fold_cond_expr_cond (void)
577 basic_block bb;
579 FOR_EACH_BB (bb)
581 gimple stmt = last_stmt (bb);
583 if (stmt && gimple_code (stmt) == GIMPLE_COND)
585 location_t loc = gimple_location (stmt);
586 tree cond;
587 bool zerop, onep;
589 fold_defer_overflow_warnings ();
590 cond = fold_binary_loc (loc, gimple_cond_code (stmt), boolean_type_node,
591 gimple_cond_lhs (stmt), gimple_cond_rhs (stmt));
592 if (cond)
594 zerop = integer_zerop (cond);
595 onep = integer_onep (cond);
597 else
598 zerop = onep = false;
600 fold_undefer_overflow_warnings (zerop || onep,
601 stmt,
602 WARN_STRICT_OVERFLOW_CONDITIONAL);
603 if (zerop)
604 gimple_cond_make_false (stmt);
605 else if (onep)
606 gimple_cond_make_true (stmt);
611 /* Join all the blocks in the flowgraph. */
613 static void
614 make_edges (void)
616 basic_block bb;
617 struct omp_region *cur_region = NULL;
619 /* Create an edge from entry to the first block with executable
620 statements in it. */
621 make_edge (ENTRY_BLOCK_PTR, BASIC_BLOCK (NUM_FIXED_BLOCKS), EDGE_FALLTHRU);
623 /* Traverse the basic block array placing edges. */
624 FOR_EACH_BB (bb)
626 gimple last = last_stmt (bb);
627 bool fallthru;
629 if (last)
631 enum gimple_code code = gimple_code (last);
632 switch (code)
634 case GIMPLE_GOTO:
635 make_goto_expr_edges (bb);
636 fallthru = false;
637 break;
638 case GIMPLE_RETURN:
639 make_edge (bb, EXIT_BLOCK_PTR, 0);
640 fallthru = false;
641 break;
642 case GIMPLE_COND:
643 make_cond_expr_edges (bb);
644 fallthru = false;
645 break;
646 case GIMPLE_SWITCH:
647 make_gimple_switch_edges (bb);
648 fallthru = false;
649 break;
650 case GIMPLE_RESX:
651 make_eh_edges (last);
652 fallthru = false;
653 break;
654 case GIMPLE_EH_DISPATCH:
655 fallthru = make_eh_dispatch_edges (last);
656 break;
658 case GIMPLE_CALL:
659 /* If this function receives a nonlocal goto, then we need to
660 make edges from this call site to all the nonlocal goto
661 handlers. */
662 if (stmt_can_make_abnormal_goto (last))
663 make_abnormal_goto_edges (bb, true);
665 /* If this statement has reachable exception handlers, then
666 create abnormal edges to them. */
667 make_eh_edges (last);
669 /* BUILTIN_RETURN is really a return statement. */
670 if (gimple_call_builtin_p (last, BUILT_IN_RETURN))
671 make_edge (bb, EXIT_BLOCK_PTR, 0), fallthru = false;
672 /* Some calls are known not to return. */
673 else
674 fallthru = !(gimple_call_flags (last) & ECF_NORETURN);
675 break;
677 case GIMPLE_ASSIGN:
678 /* A GIMPLE_ASSIGN may throw internally and thus be considered
679 control-altering. */
680 if (is_ctrl_altering_stmt (last))
681 make_eh_edges (last);
682 fallthru = true;
683 break;
685 case GIMPLE_ASM:
686 make_gimple_asm_edges (bb);
687 fallthru = true;
688 break;
690 CASE_GIMPLE_OMP:
691 fallthru = make_gimple_omp_edges (bb, &cur_region);
692 break;
694 case GIMPLE_TRANSACTION:
696 tree abort_label = gimple_transaction_label (last);
697 if (abort_label)
698 make_edge (bb, label_to_block (abort_label), EDGE_TM_ABORT);
699 fallthru = true;
701 break;
703 default:
704 gcc_assert (!stmt_ends_bb_p (last));
705 fallthru = true;
708 else
709 fallthru = true;
711 if (fallthru)
712 make_edge (bb, bb->next_bb, EDGE_FALLTHRU);
715 free_omp_regions ();
717 /* Fold COND_EXPR_COND of each COND_EXPR. */
718 fold_cond_expr_cond ();
721 /* Find the next available discriminator value for LOCUS. The
722 discriminator distinguishes among several basic blocks that
723 share a common locus, allowing for more accurate sample-based
724 profiling. */
726 static int
727 next_discriminator_for_locus (location_t locus)
729 struct locus_discrim_map item;
730 struct locus_discrim_map **slot;
732 item.locus = locus;
733 item.discriminator = 0;
734 slot = discriminator_per_locus.find_slot_with_hash (
735 &item, LOCATION_LINE (locus), INSERT);
736 gcc_assert (slot);
737 if (*slot == HTAB_EMPTY_ENTRY)
739 *slot = XNEW (struct locus_discrim_map);
740 gcc_assert (*slot);
741 (*slot)->locus = locus;
742 (*slot)->discriminator = 0;
744 (*slot)->discriminator++;
745 return (*slot)->discriminator;
748 /* Return TRUE if LOCUS1 and LOCUS2 refer to the same source line. */
750 static bool
751 same_line_p (location_t locus1, location_t locus2)
753 expanded_location from, to;
755 if (locus1 == locus2)
756 return true;
758 from = expand_location (locus1);
759 to = expand_location (locus2);
761 if (from.line != to.line)
762 return false;
763 if (from.file == to.file)
764 return true;
765 return (from.file != NULL
766 && to.file != NULL
767 && filename_cmp (from.file, to.file) == 0);
770 /* Assign discriminators to each basic block. */
772 static void
773 assign_discriminators (void)
775 basic_block bb;
777 FOR_EACH_BB (bb)
779 edge e;
780 edge_iterator ei;
781 gimple last = last_stmt (bb);
782 location_t locus = last ? gimple_location (last) : UNKNOWN_LOCATION;
784 if (locus == UNKNOWN_LOCATION)
785 continue;
787 FOR_EACH_EDGE (e, ei, bb->succs)
789 gimple first = first_non_label_stmt (e->dest);
790 gimple last = last_stmt (e->dest);
791 if ((first && same_line_p (locus, gimple_location (first)))
792 || (last && same_line_p (locus, gimple_location (last))))
794 if (e->dest->discriminator != 0 && bb->discriminator == 0)
795 bb->discriminator = next_discriminator_for_locus (locus);
796 else
797 e->dest->discriminator = next_discriminator_for_locus (locus);
803 /* Create the edges for a GIMPLE_COND starting at block BB. */
805 static void
806 make_cond_expr_edges (basic_block bb)
808 gimple entry = last_stmt (bb);
809 gimple then_stmt, else_stmt;
810 basic_block then_bb, else_bb;
811 tree then_label, else_label;
812 edge e;
814 gcc_assert (entry);
815 gcc_assert (gimple_code (entry) == GIMPLE_COND);
817 /* Entry basic blocks for each component. */
818 then_label = gimple_cond_true_label (entry);
819 else_label = gimple_cond_false_label (entry);
820 then_bb = label_to_block (then_label);
821 else_bb = label_to_block (else_label);
822 then_stmt = first_stmt (then_bb);
823 else_stmt = first_stmt (else_bb);
825 e = make_edge (bb, then_bb, EDGE_TRUE_VALUE);
826 e->goto_locus = gimple_location (then_stmt);
827 e = make_edge (bb, else_bb, EDGE_FALSE_VALUE);
828 if (e)
829 e->goto_locus = gimple_location (else_stmt);
831 /* We do not need the labels anymore. */
832 gimple_cond_set_true_label (entry, NULL_TREE);
833 gimple_cond_set_false_label (entry, NULL_TREE);
837 /* Called for each element in the hash table (P) as we delete the
838 edge to cases hash table.
840 Clear all the TREE_CHAINs to prevent problems with copying of
841 SWITCH_EXPRs and structure sharing rules, then free the hash table
842 element. */
844 static bool
845 edge_to_cases_cleanup (const void *key ATTRIBUTE_UNUSED, void **value,
846 void *data ATTRIBUTE_UNUSED)
848 tree t, next;
850 for (t = (tree) *value; t; t = next)
852 next = CASE_CHAIN (t);
853 CASE_CHAIN (t) = NULL;
856 *value = NULL;
857 return true;
860 /* Start recording information mapping edges to case labels. */
862 void
863 start_recording_case_labels (void)
865 gcc_assert (edge_to_cases == NULL);
866 edge_to_cases = pointer_map_create ();
867 touched_switch_bbs = BITMAP_ALLOC (NULL);
870 /* Return nonzero if we are recording information for case labels. */
872 static bool
873 recording_case_labels_p (void)
875 return (edge_to_cases != NULL);
878 /* Stop recording information mapping edges to case labels and
879 remove any information we have recorded. */
880 void
881 end_recording_case_labels (void)
883 bitmap_iterator bi;
884 unsigned i;
885 pointer_map_traverse (edge_to_cases, edge_to_cases_cleanup, NULL);
886 pointer_map_destroy (edge_to_cases);
887 edge_to_cases = NULL;
888 EXECUTE_IF_SET_IN_BITMAP (touched_switch_bbs, 0, i, bi)
890 basic_block bb = BASIC_BLOCK (i);
891 if (bb)
893 gimple stmt = last_stmt (bb);
894 if (stmt && gimple_code (stmt) == GIMPLE_SWITCH)
895 group_case_labels_stmt (stmt);
898 BITMAP_FREE (touched_switch_bbs);
901 /* If we are inside a {start,end}_recording_cases block, then return
902 a chain of CASE_LABEL_EXPRs from T which reference E.
904 Otherwise return NULL. */
906 static tree
907 get_cases_for_edge (edge e, gimple t)
909 void **slot;
910 size_t i, n;
912 /* If we are not recording cases, then we do not have CASE_LABEL_EXPR
913 chains available. Return NULL so the caller can detect this case. */
914 if (!recording_case_labels_p ())
915 return NULL;
917 slot = pointer_map_contains (edge_to_cases, e);
918 if (slot)
919 return (tree) *slot;
921 /* If we did not find E in the hash table, then this must be the first
922 time we have been queried for information about E & T. Add all the
923 elements from T to the hash table then perform the query again. */
925 n = gimple_switch_num_labels (t);
926 for (i = 0; i < n; i++)
928 tree elt = gimple_switch_label (t, i);
929 tree lab = CASE_LABEL (elt);
930 basic_block label_bb = label_to_block (lab);
931 edge this_edge = find_edge (e->src, label_bb);
933 /* Add it to the chain of CASE_LABEL_EXPRs referencing E, or create
934 a new chain. */
935 slot = pointer_map_insert (edge_to_cases, this_edge);
936 CASE_CHAIN (elt) = (tree) *slot;
937 *slot = elt;
940 return (tree) *pointer_map_contains (edge_to_cases, e);
943 /* Create the edges for a GIMPLE_SWITCH starting at block BB. */
945 static void
946 make_gimple_switch_edges (basic_block bb)
948 gimple entry = last_stmt (bb);
949 size_t i, n;
951 n = gimple_switch_num_labels (entry);
953 for (i = 0; i < n; ++i)
955 tree lab = CASE_LABEL (gimple_switch_label (entry, i));
956 basic_block label_bb = label_to_block (lab);
957 make_edge (bb, label_bb, 0);
962 /* Return the basic block holding label DEST. */
964 basic_block
965 label_to_block_fn (struct function *ifun, tree dest)
967 int uid = LABEL_DECL_UID (dest);
969 /* We would die hard when faced by an undefined label. Emit a label to
970 the very first basic block. This will hopefully make even the dataflow
971 and undefined variable warnings quite right. */
972 if (seen_error () && uid < 0)
974 gimple_stmt_iterator gsi = gsi_start_bb (BASIC_BLOCK (NUM_FIXED_BLOCKS));
975 gimple stmt;
977 stmt = gimple_build_label (dest);
978 gsi_insert_before (&gsi, stmt, GSI_NEW_STMT);
979 uid = LABEL_DECL_UID (dest);
981 if (vec_safe_length (ifun->cfg->x_label_to_block_map) <= (unsigned int) uid)
982 return NULL;
983 return (*ifun->cfg->x_label_to_block_map)[uid];
986 /* Create edges for an abnormal goto statement at block BB. If FOR_CALL
987 is true, the source statement is a CALL_EXPR instead of a GOTO_EXPR. */
989 void
990 make_abnormal_goto_edges (basic_block bb, bool for_call)
992 basic_block target_bb;
993 gimple_stmt_iterator gsi;
995 FOR_EACH_BB (target_bb)
997 for (gsi = gsi_start_bb (target_bb); !gsi_end_p (gsi); gsi_next (&gsi))
999 gimple label_stmt = gsi_stmt (gsi);
1000 tree target;
1002 if (gimple_code (label_stmt) != GIMPLE_LABEL)
1003 break;
1005 target = gimple_label_label (label_stmt);
1007 /* Make an edge to every label block that has been marked as a
1008 potential target for a computed goto or a non-local goto. */
1009 if ((FORCED_LABEL (target) && !for_call)
1010 || (DECL_NONLOCAL (target) && for_call))
1012 make_edge (bb, target_bb, EDGE_ABNORMAL);
1013 break;
1016 if (!gsi_end_p (gsi)
1017 && is_gimple_debug (gsi_stmt (gsi)))
1018 gsi_next_nondebug (&gsi);
1019 if (!gsi_end_p (gsi))
1021 /* Make an edge to every setjmp-like call. */
1022 gimple call_stmt = gsi_stmt (gsi);
1023 if (is_gimple_call (call_stmt)
1024 && (gimple_call_flags (call_stmt) & ECF_RETURNS_TWICE))
1025 make_edge (bb, target_bb, EDGE_ABNORMAL);
1030 /* Create edges for a goto statement at block BB. */
1032 static void
1033 make_goto_expr_edges (basic_block bb)
1035 gimple_stmt_iterator last = gsi_last_bb (bb);
1036 gimple goto_t = gsi_stmt (last);
1038 /* A simple GOTO creates normal edges. */
1039 if (simple_goto_p (goto_t))
1041 tree dest = gimple_goto_dest (goto_t);
1042 basic_block label_bb = label_to_block (dest);
1043 edge e = make_edge (bb, label_bb, EDGE_FALLTHRU);
1044 e->goto_locus = gimple_location (goto_t);
1045 gsi_remove (&last, true);
1046 return;
1049 /* A computed GOTO creates abnormal edges. */
1050 make_abnormal_goto_edges (bb, false);
1053 /* Create edges for an asm statement with labels at block BB. */
1055 static void
1056 make_gimple_asm_edges (basic_block bb)
1058 gimple stmt = last_stmt (bb);
1059 int i, n = gimple_asm_nlabels (stmt);
1061 for (i = 0; i < n; ++i)
1063 tree label = TREE_VALUE (gimple_asm_label_op (stmt, i));
1064 basic_block label_bb = label_to_block (label);
1065 make_edge (bb, label_bb, 0);
1069 /*---------------------------------------------------------------------------
1070 Flowgraph analysis
1071 ---------------------------------------------------------------------------*/
1073 /* Cleanup useless labels in basic blocks. This is something we wish
1074 to do early because it allows us to group case labels before creating
1075 the edges for the CFG, and it speeds up block statement iterators in
1076 all passes later on.
1077 We rerun this pass after CFG is created, to get rid of the labels that
1078 are no longer referenced. After then we do not run it any more, since
1079 (almost) no new labels should be created. */
1081 /* A map from basic block index to the leading label of that block. */
1082 static struct label_record
1084 /* The label. */
1085 tree label;
1087 /* True if the label is referenced from somewhere. */
1088 bool used;
1089 } *label_for_bb;
1091 /* Given LABEL return the first label in the same basic block. */
1093 static tree
1094 main_block_label (tree label)
1096 basic_block bb = label_to_block (label);
1097 tree main_label = label_for_bb[bb->index].label;
1099 /* label_to_block possibly inserted undefined label into the chain. */
1100 if (!main_label)
1102 label_for_bb[bb->index].label = label;
1103 main_label = label;
1106 label_for_bb[bb->index].used = true;
1107 return main_label;
1110 /* Clean up redundant labels within the exception tree. */
1112 static void
1113 cleanup_dead_labels_eh (void)
1115 eh_landing_pad lp;
1116 eh_region r;
1117 tree lab;
1118 int i;
1120 if (cfun->eh == NULL)
1121 return;
1123 for (i = 1; vec_safe_iterate (cfun->eh->lp_array, i, &lp); ++i)
1124 if (lp && lp->post_landing_pad)
1126 lab = main_block_label (lp->post_landing_pad);
1127 if (lab != lp->post_landing_pad)
1129 EH_LANDING_PAD_NR (lp->post_landing_pad) = 0;
1130 EH_LANDING_PAD_NR (lab) = lp->index;
1134 FOR_ALL_EH_REGION (r)
1135 switch (r->type)
1137 case ERT_CLEANUP:
1138 case ERT_MUST_NOT_THROW:
1139 break;
1141 case ERT_TRY:
1143 eh_catch c;
1144 for (c = r->u.eh_try.first_catch; c ; c = c->next_catch)
1146 lab = c->label;
1147 if (lab)
1148 c->label = main_block_label (lab);
1151 break;
1153 case ERT_ALLOWED_EXCEPTIONS:
1154 lab = r->u.allowed.label;
1155 if (lab)
1156 r->u.allowed.label = main_block_label (lab);
1157 break;
1162 /* Cleanup redundant labels. This is a three-step process:
1163 1) Find the leading label for each block.
1164 2) Redirect all references to labels to the leading labels.
1165 3) Cleanup all useless labels. */
1167 void
1168 cleanup_dead_labels (void)
1170 basic_block bb;
1171 label_for_bb = XCNEWVEC (struct label_record, last_basic_block);
1173 /* Find a suitable label for each block. We use the first user-defined
1174 label if there is one, or otherwise just the first label we see. */
1175 FOR_EACH_BB (bb)
1177 gimple_stmt_iterator i;
1179 for (i = gsi_start_bb (bb); !gsi_end_p (i); gsi_next (&i))
1181 tree label;
1182 gimple stmt = gsi_stmt (i);
1184 if (gimple_code (stmt) != GIMPLE_LABEL)
1185 break;
1187 label = gimple_label_label (stmt);
1189 /* If we have not yet seen a label for the current block,
1190 remember this one and see if there are more labels. */
1191 if (!label_for_bb[bb->index].label)
1193 label_for_bb[bb->index].label = label;
1194 continue;
1197 /* If we did see a label for the current block already, but it
1198 is an artificially created label, replace it if the current
1199 label is a user defined label. */
1200 if (!DECL_ARTIFICIAL (label)
1201 && DECL_ARTIFICIAL (label_for_bb[bb->index].label))
1203 label_for_bb[bb->index].label = label;
1204 break;
1209 /* Now redirect all jumps/branches to the selected label.
1210 First do so for each block ending in a control statement. */
1211 FOR_EACH_BB (bb)
1213 gimple stmt = last_stmt (bb);
1214 tree label, new_label;
1216 if (!stmt)
1217 continue;
1219 switch (gimple_code (stmt))
1221 case GIMPLE_COND:
1222 label = gimple_cond_true_label (stmt);
1223 if (label)
1225 new_label = main_block_label (label);
1226 if (new_label != label)
1227 gimple_cond_set_true_label (stmt, new_label);
1230 label = gimple_cond_false_label (stmt);
1231 if (label)
1233 new_label = main_block_label (label);
1234 if (new_label != label)
1235 gimple_cond_set_false_label (stmt, new_label);
1237 break;
1239 case GIMPLE_SWITCH:
1241 size_t i, n = gimple_switch_num_labels (stmt);
1243 /* Replace all destination labels. */
1244 for (i = 0; i < n; ++i)
1246 tree case_label = gimple_switch_label (stmt, i);
1247 label = CASE_LABEL (case_label);
1248 new_label = main_block_label (label);
1249 if (new_label != label)
1250 CASE_LABEL (case_label) = new_label;
1252 break;
1255 case GIMPLE_ASM:
1257 int i, n = gimple_asm_nlabels (stmt);
1259 for (i = 0; i < n; ++i)
1261 tree cons = gimple_asm_label_op (stmt, i);
1262 tree label = main_block_label (TREE_VALUE (cons));
1263 TREE_VALUE (cons) = label;
1265 break;
1268 /* We have to handle gotos until they're removed, and we don't
1269 remove them until after we've created the CFG edges. */
1270 case GIMPLE_GOTO:
1271 if (!computed_goto_p (stmt))
1273 label = gimple_goto_dest (stmt);
1274 new_label = main_block_label (label);
1275 if (new_label != label)
1276 gimple_goto_set_dest (stmt, new_label);
1278 break;
1280 case GIMPLE_TRANSACTION:
1282 tree label = gimple_transaction_label (stmt);
1283 if (label)
1285 tree new_label = main_block_label (label);
1286 if (new_label != label)
1287 gimple_transaction_set_label (stmt, new_label);
1290 break;
1292 default:
1293 break;
1297 /* Do the same for the exception region tree labels. */
1298 cleanup_dead_labels_eh ();
1300 /* Finally, purge dead labels. All user-defined labels and labels that
1301 can be the target of non-local gotos and labels which have their
1302 address taken are preserved. */
1303 FOR_EACH_BB (bb)
1305 gimple_stmt_iterator i;
1306 tree label_for_this_bb = label_for_bb[bb->index].label;
1308 if (!label_for_this_bb)
1309 continue;
1311 /* If the main label of the block is unused, we may still remove it. */
1312 if (!label_for_bb[bb->index].used)
1313 label_for_this_bb = NULL;
1315 for (i = gsi_start_bb (bb); !gsi_end_p (i); )
1317 tree label;
1318 gimple stmt = gsi_stmt (i);
1320 if (gimple_code (stmt) != GIMPLE_LABEL)
1321 break;
1323 label = gimple_label_label (stmt);
1325 if (label == label_for_this_bb
1326 || !DECL_ARTIFICIAL (label)
1327 || DECL_NONLOCAL (label)
1328 || FORCED_LABEL (label))
1329 gsi_next (&i);
1330 else
1331 gsi_remove (&i, true);
1335 free (label_for_bb);
1338 /* Scan the sorted vector of cases in STMT (a GIMPLE_SWITCH) and combine
1339 the ones jumping to the same label.
1340 Eg. three separate entries 1: 2: 3: become one entry 1..3: */
1342 void
1343 group_case_labels_stmt (gimple stmt)
1345 int old_size = gimple_switch_num_labels (stmt);
1346 int i, j, new_size = old_size;
1347 basic_block default_bb = NULL;
1349 default_bb = label_to_block (CASE_LABEL (gimple_switch_default_label (stmt)));
1351 /* Look for possible opportunities to merge cases. */
1352 i = 1;
1353 while (i < old_size)
1355 tree base_case, base_high;
1356 basic_block base_bb;
1358 base_case = gimple_switch_label (stmt, i);
1360 gcc_assert (base_case);
1361 base_bb = label_to_block (CASE_LABEL (base_case));
1363 /* Discard cases that have the same destination as the
1364 default case. */
1365 if (base_bb == default_bb)
1367 gimple_switch_set_label (stmt, i, NULL_TREE);
1368 i++;
1369 new_size--;
1370 continue;
1373 base_high = CASE_HIGH (base_case)
1374 ? CASE_HIGH (base_case)
1375 : CASE_LOW (base_case);
1376 i++;
1378 /* Try to merge case labels. Break out when we reach the end
1379 of the label vector or when we cannot merge the next case
1380 label with the current one. */
1381 while (i < old_size)
1383 tree merge_case = gimple_switch_label (stmt, i);
1384 basic_block merge_bb = label_to_block (CASE_LABEL (merge_case));
1385 double_int bhp1 = tree_to_double_int (base_high) + double_int_one;
1387 /* Merge the cases if they jump to the same place,
1388 and their ranges are consecutive. */
1389 if (merge_bb == base_bb
1390 && tree_to_double_int (CASE_LOW (merge_case)) == bhp1)
1392 base_high = CASE_HIGH (merge_case) ?
1393 CASE_HIGH (merge_case) : CASE_LOW (merge_case);
1394 CASE_HIGH (base_case) = base_high;
1395 gimple_switch_set_label (stmt, i, NULL_TREE);
1396 new_size--;
1397 i++;
1399 else
1400 break;
1404 /* Compress the case labels in the label vector, and adjust the
1405 length of the vector. */
1406 for (i = 0, j = 0; i < new_size; i++)
1408 while (! gimple_switch_label (stmt, j))
1409 j++;
1410 gimple_switch_set_label (stmt, i,
1411 gimple_switch_label (stmt, j++));
1414 gcc_assert (new_size <= old_size);
1415 gimple_switch_set_num_labels (stmt, new_size);
1418 /* Look for blocks ending in a multiway branch (a GIMPLE_SWITCH),
1419 and scan the sorted vector of cases. Combine the ones jumping to the
1420 same label. */
1422 void
1423 group_case_labels (void)
1425 basic_block bb;
1427 FOR_EACH_BB (bb)
1429 gimple stmt = last_stmt (bb);
1430 if (stmt && gimple_code (stmt) == GIMPLE_SWITCH)
1431 group_case_labels_stmt (stmt);
1435 /* Checks whether we can merge block B into block A. */
1437 static bool
1438 gimple_can_merge_blocks_p (basic_block a, basic_block b)
1440 gimple stmt;
1441 gimple_stmt_iterator gsi;
1443 if (!single_succ_p (a))
1444 return false;
1446 if (single_succ_edge (a)->flags & EDGE_COMPLEX)
1447 return false;
1449 if (single_succ (a) != b)
1450 return false;
1452 if (!single_pred_p (b))
1453 return false;
1455 if (b == EXIT_BLOCK_PTR)
1456 return false;
1458 /* If A ends by a statement causing exceptions or something similar, we
1459 cannot merge the blocks. */
1460 stmt = last_stmt (a);
1461 if (stmt && stmt_ends_bb_p (stmt))
1462 return false;
1464 /* Do not allow a block with only a non-local label to be merged. */
1465 if (stmt
1466 && gimple_code (stmt) == GIMPLE_LABEL
1467 && DECL_NONLOCAL (gimple_label_label (stmt)))
1468 return false;
1470 /* Examine the labels at the beginning of B. */
1471 for (gsi = gsi_start_bb (b); !gsi_end_p (gsi); gsi_next (&gsi))
1473 tree lab;
1474 stmt = gsi_stmt (gsi);
1475 if (gimple_code (stmt) != GIMPLE_LABEL)
1476 break;
1477 lab = gimple_label_label (stmt);
1479 /* Do not remove user forced labels or for -O0 any user labels. */
1480 if (!DECL_ARTIFICIAL (lab) && (!optimize || FORCED_LABEL (lab)))
1481 return false;
1484 /* Protect the loop latches. */
1485 if (current_loops && b->loop_father->latch == b)
1486 return false;
1488 /* It must be possible to eliminate all phi nodes in B. If ssa form
1489 is not up-to-date and a name-mapping is registered, we cannot eliminate
1490 any phis. Symbols marked for renaming are never a problem though. */
1491 for (gsi = gsi_start_phis (b); !gsi_end_p (gsi); gsi_next (&gsi))
1493 gimple phi = gsi_stmt (gsi);
1494 /* Technically only new names matter. */
1495 if (name_registered_for_update_p (PHI_RESULT (phi)))
1496 return false;
1499 /* When not optimizing, don't merge if we'd lose goto_locus. */
1500 if (!optimize
1501 && single_succ_edge (a)->goto_locus != UNKNOWN_LOCATION)
1503 location_t goto_locus = single_succ_edge (a)->goto_locus;
1504 gimple_stmt_iterator prev, next;
1505 prev = gsi_last_nondebug_bb (a);
1506 next = gsi_after_labels (b);
1507 if (!gsi_end_p (next) && is_gimple_debug (gsi_stmt (next)))
1508 gsi_next_nondebug (&next);
1509 if ((gsi_end_p (prev)
1510 || gimple_location (gsi_stmt (prev)) != goto_locus)
1511 && (gsi_end_p (next)
1512 || gimple_location (gsi_stmt (next)) != goto_locus))
1513 return false;
1516 return true;
1519 /* Replaces all uses of NAME by VAL. */
1521 void
1522 replace_uses_by (tree name, tree val)
1524 imm_use_iterator imm_iter;
1525 use_operand_p use;
1526 gimple stmt;
1527 edge e;
1529 FOR_EACH_IMM_USE_STMT (stmt, imm_iter, name)
1531 FOR_EACH_IMM_USE_ON_STMT (use, imm_iter)
1533 replace_exp (use, val);
1535 if (gimple_code (stmt) == GIMPLE_PHI)
1537 e = gimple_phi_arg_edge (stmt, PHI_ARG_INDEX_FROM_USE (use));
1538 if (e->flags & EDGE_ABNORMAL)
1540 /* This can only occur for virtual operands, since
1541 for the real ones SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name))
1542 would prevent replacement. */
1543 gcc_checking_assert (virtual_operand_p (name));
1544 SSA_NAME_OCCURS_IN_ABNORMAL_PHI (val) = 1;
1549 if (gimple_code (stmt) != GIMPLE_PHI)
1551 gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
1552 gimple orig_stmt = stmt;
1553 size_t i;
1555 /* Mark the block if we changed the last stmt in it. */
1556 if (cfgcleanup_altered_bbs
1557 && stmt_ends_bb_p (stmt))
1558 bitmap_set_bit (cfgcleanup_altered_bbs, gimple_bb (stmt)->index);
1560 /* FIXME. It shouldn't be required to keep TREE_CONSTANT
1561 on ADDR_EXPRs up-to-date on GIMPLE. Propagation will
1562 only change sth from non-invariant to invariant, and only
1563 when propagating constants. */
1564 if (is_gimple_min_invariant (val))
1565 for (i = 0; i < gimple_num_ops (stmt); i++)
1567 tree op = gimple_op (stmt, i);
1568 /* Operands may be empty here. For example, the labels
1569 of a GIMPLE_COND are nulled out following the creation
1570 of the corresponding CFG edges. */
1571 if (op && TREE_CODE (op) == ADDR_EXPR)
1572 recompute_tree_invariant_for_addr_expr (op);
1575 if (fold_stmt (&gsi))
1576 stmt = gsi_stmt (gsi);
1578 if (maybe_clean_or_replace_eh_stmt (orig_stmt, stmt))
1579 gimple_purge_dead_eh_edges (gimple_bb (stmt));
1581 update_stmt (stmt);
1585 gcc_checking_assert (has_zero_uses (name));
1587 /* Also update the trees stored in loop structures. */
1588 if (current_loops)
1590 struct loop *loop;
1591 loop_iterator li;
1593 FOR_EACH_LOOP (li, loop, 0)
1595 substitute_in_loop_info (loop, name, val);
1600 /* Merge block B into block A. */
1602 static void
1603 gimple_merge_blocks (basic_block a, basic_block b)
1605 gimple_stmt_iterator last, gsi, psi;
1607 if (dump_file)
1608 fprintf (dump_file, "Merging blocks %d and %d\n", a->index, b->index);
1610 /* Remove all single-valued PHI nodes from block B of the form
1611 V_i = PHI <V_j> by propagating V_j to all the uses of V_i. */
1612 gsi = gsi_last_bb (a);
1613 for (psi = gsi_start_phis (b); !gsi_end_p (psi); )
1615 gimple phi = gsi_stmt (psi);
1616 tree def = gimple_phi_result (phi), use = gimple_phi_arg_def (phi, 0);
1617 gimple copy;
1618 bool may_replace_uses = (virtual_operand_p (def)
1619 || may_propagate_copy (def, use));
1621 /* In case we maintain loop closed ssa form, do not propagate arguments
1622 of loop exit phi nodes. */
1623 if (current_loops
1624 && loops_state_satisfies_p (LOOP_CLOSED_SSA)
1625 && !virtual_operand_p (def)
1626 && TREE_CODE (use) == SSA_NAME
1627 && a->loop_father != b->loop_father)
1628 may_replace_uses = false;
1630 if (!may_replace_uses)
1632 gcc_assert (!virtual_operand_p (def));
1634 /* Note that just emitting the copies is fine -- there is no problem
1635 with ordering of phi nodes. This is because A is the single
1636 predecessor of B, therefore results of the phi nodes cannot
1637 appear as arguments of the phi nodes. */
1638 copy = gimple_build_assign (def, use);
1639 gsi_insert_after (&gsi, copy, GSI_NEW_STMT);
1640 remove_phi_node (&psi, false);
1642 else
1644 /* If we deal with a PHI for virtual operands, we can simply
1645 propagate these without fussing with folding or updating
1646 the stmt. */
1647 if (virtual_operand_p (def))
1649 imm_use_iterator iter;
1650 use_operand_p use_p;
1651 gimple stmt;
1653 FOR_EACH_IMM_USE_STMT (stmt, iter, def)
1654 FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
1655 SET_USE (use_p, use);
1657 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (def))
1658 SSA_NAME_OCCURS_IN_ABNORMAL_PHI (use) = 1;
1660 else
1661 replace_uses_by (def, use);
1663 remove_phi_node (&psi, true);
1667 /* Ensure that B follows A. */
1668 move_block_after (b, a);
1670 gcc_assert (single_succ_edge (a)->flags & EDGE_FALLTHRU);
1671 gcc_assert (!last_stmt (a) || !stmt_ends_bb_p (last_stmt (a)));
1673 /* Remove labels from B and set gimple_bb to A for other statements. */
1674 for (gsi = gsi_start_bb (b); !gsi_end_p (gsi);)
1676 gimple stmt = gsi_stmt (gsi);
1677 if (gimple_code (stmt) == GIMPLE_LABEL)
1679 tree label = gimple_label_label (stmt);
1680 int lp_nr;
1682 gsi_remove (&gsi, false);
1684 /* Now that we can thread computed gotos, we might have
1685 a situation where we have a forced label in block B
1686 However, the label at the start of block B might still be
1687 used in other ways (think about the runtime checking for
1688 Fortran assigned gotos). So we can not just delete the
1689 label. Instead we move the label to the start of block A. */
1690 if (FORCED_LABEL (label))
1692 gimple_stmt_iterator dest_gsi = gsi_start_bb (a);
1693 gsi_insert_before (&dest_gsi, stmt, GSI_NEW_STMT);
1695 /* Other user labels keep around in a form of a debug stmt. */
1696 else if (!DECL_ARTIFICIAL (label) && MAY_HAVE_DEBUG_STMTS)
1698 gimple dbg = gimple_build_debug_bind (label,
1699 integer_zero_node,
1700 stmt);
1701 gimple_debug_bind_reset_value (dbg);
1702 gsi_insert_before (&gsi, dbg, GSI_SAME_STMT);
1705 lp_nr = EH_LANDING_PAD_NR (label);
1706 if (lp_nr)
1708 eh_landing_pad lp = get_eh_landing_pad_from_number (lp_nr);
1709 lp->post_landing_pad = NULL;
1712 else
1714 gimple_set_bb (stmt, a);
1715 gsi_next (&gsi);
1719 /* Merge the sequences. */
1720 last = gsi_last_bb (a);
1721 gsi_insert_seq_after (&last, bb_seq (b), GSI_NEW_STMT);
1722 set_bb_seq (b, NULL);
1724 if (cfgcleanup_altered_bbs)
1725 bitmap_set_bit (cfgcleanup_altered_bbs, a->index);
1729 /* Return the one of two successors of BB that is not reachable by a
1730 complex edge, if there is one. Else, return BB. We use
1731 this in optimizations that use post-dominators for their heuristics,
1732 to catch the cases in C++ where function calls are involved. */
1734 basic_block
1735 single_noncomplex_succ (basic_block bb)
1737 edge e0, e1;
1738 if (EDGE_COUNT (bb->succs) != 2)
1739 return bb;
1741 e0 = EDGE_SUCC (bb, 0);
1742 e1 = EDGE_SUCC (bb, 1);
1743 if (e0->flags & EDGE_COMPLEX)
1744 return e1->dest;
1745 if (e1->flags & EDGE_COMPLEX)
1746 return e0->dest;
1748 return bb;
1751 /* T is CALL_EXPR. Set current_function_calls_* flags. */
1753 void
1754 notice_special_calls (gimple call)
1756 int flags = gimple_call_flags (call);
1758 if (flags & ECF_MAY_BE_ALLOCA)
1759 cfun->calls_alloca = true;
1760 if (flags & ECF_RETURNS_TWICE)
1761 cfun->calls_setjmp = true;
1765 /* Clear flags set by notice_special_calls. Used by dead code removal
1766 to update the flags. */
1768 void
1769 clear_special_calls (void)
1771 cfun->calls_alloca = false;
1772 cfun->calls_setjmp = false;
1775 /* Remove PHI nodes associated with basic block BB and all edges out of BB. */
1777 static void
1778 remove_phi_nodes_and_edges_for_unreachable_block (basic_block bb)
1780 /* Since this block is no longer reachable, we can just delete all
1781 of its PHI nodes. */
1782 remove_phi_nodes (bb);
1784 /* Remove edges to BB's successors. */
1785 while (EDGE_COUNT (bb->succs) > 0)
1786 remove_edge (EDGE_SUCC (bb, 0));
1790 /* Remove statements of basic block BB. */
1792 static void
1793 remove_bb (basic_block bb)
1795 gimple_stmt_iterator i;
1797 if (dump_file)
1799 fprintf (dump_file, "Removing basic block %d\n", bb->index);
1800 if (dump_flags & TDF_DETAILS)
1802 dump_bb (dump_file, bb, 0, dump_flags);
1803 fprintf (dump_file, "\n");
1807 if (current_loops)
1809 struct loop *loop = bb->loop_father;
1811 /* If a loop gets removed, clean up the information associated
1812 with it. */
1813 if (loop->latch == bb
1814 || loop->header == bb)
1815 free_numbers_of_iterations_estimates_loop (loop);
1818 /* Remove all the instructions in the block. */
1819 if (bb_seq (bb) != NULL)
1821 /* Walk backwards so as to get a chance to substitute all
1822 released DEFs into debug stmts. See
1823 eliminate_unnecessary_stmts() in tree-ssa-dce.c for more
1824 details. */
1825 for (i = gsi_last_bb (bb); !gsi_end_p (i);)
1827 gimple stmt = gsi_stmt (i);
1828 if (gimple_code (stmt) == GIMPLE_LABEL
1829 && (FORCED_LABEL (gimple_label_label (stmt))
1830 || DECL_NONLOCAL (gimple_label_label (stmt))))
1832 basic_block new_bb;
1833 gimple_stmt_iterator new_gsi;
1835 /* A non-reachable non-local label may still be referenced.
1836 But it no longer needs to carry the extra semantics of
1837 non-locality. */
1838 if (DECL_NONLOCAL (gimple_label_label (stmt)))
1840 DECL_NONLOCAL (gimple_label_label (stmt)) = 0;
1841 FORCED_LABEL (gimple_label_label (stmt)) = 1;
1844 new_bb = bb->prev_bb;
1845 new_gsi = gsi_start_bb (new_bb);
1846 gsi_remove (&i, false);
1847 gsi_insert_before (&new_gsi, stmt, GSI_NEW_STMT);
1849 else
1851 /* Release SSA definitions if we are in SSA. Note that we
1852 may be called when not in SSA. For example,
1853 final_cleanup calls this function via
1854 cleanup_tree_cfg. */
1855 if (gimple_in_ssa_p (cfun))
1856 release_defs (stmt);
1858 gsi_remove (&i, true);
1861 if (gsi_end_p (i))
1862 i = gsi_last_bb (bb);
1863 else
1864 gsi_prev (&i);
1868 remove_phi_nodes_and_edges_for_unreachable_block (bb);
1869 bb->il.gimple.seq = NULL;
1870 bb->il.gimple.phi_nodes = NULL;
1874 /* Given a basic block BB ending with COND_EXPR or SWITCH_EXPR, and a
1875 predicate VAL, return the edge that will be taken out of the block.
1876 If VAL does not match a unique edge, NULL is returned. */
1878 edge
1879 find_taken_edge (basic_block bb, tree val)
1881 gimple stmt;
1883 stmt = last_stmt (bb);
1885 gcc_assert (stmt);
1886 gcc_assert (is_ctrl_stmt (stmt));
1888 if (val == NULL)
1889 return NULL;
1891 if (!is_gimple_min_invariant (val))
1892 return NULL;
1894 if (gimple_code (stmt) == GIMPLE_COND)
1895 return find_taken_edge_cond_expr (bb, val);
1897 if (gimple_code (stmt) == GIMPLE_SWITCH)
1898 return find_taken_edge_switch_expr (bb, val);
1900 if (computed_goto_p (stmt))
1902 /* Only optimize if the argument is a label, if the argument is
1903 not a label then we can not construct a proper CFG.
1905 It may be the case that we only need to allow the LABEL_REF to
1906 appear inside an ADDR_EXPR, but we also allow the LABEL_REF to
1907 appear inside a LABEL_EXPR just to be safe. */
1908 if ((TREE_CODE (val) == ADDR_EXPR || TREE_CODE (val) == LABEL_EXPR)
1909 && TREE_CODE (TREE_OPERAND (val, 0)) == LABEL_DECL)
1910 return find_taken_edge_computed_goto (bb, TREE_OPERAND (val, 0));
1911 return NULL;
1914 gcc_unreachable ();
1917 /* Given a constant value VAL and the entry block BB to a GOTO_EXPR
1918 statement, determine which of the outgoing edges will be taken out of the
1919 block. Return NULL if either edge may be taken. */
1921 static edge
1922 find_taken_edge_computed_goto (basic_block bb, tree val)
1924 basic_block dest;
1925 edge e = NULL;
1927 dest = label_to_block (val);
1928 if (dest)
1930 e = find_edge (bb, dest);
1931 gcc_assert (e != NULL);
1934 return e;
1937 /* Given a constant value VAL and the entry block BB to a COND_EXPR
1938 statement, determine which of the two edges will be taken out of the
1939 block. Return NULL if either edge may be taken. */
1941 static edge
1942 find_taken_edge_cond_expr (basic_block bb, tree val)
1944 edge true_edge, false_edge;
1946 extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
1948 gcc_assert (TREE_CODE (val) == INTEGER_CST);
1949 return (integer_zerop (val) ? false_edge : true_edge);
1952 /* Given an INTEGER_CST VAL and the entry block BB to a SWITCH_EXPR
1953 statement, determine which edge will be taken out of the block. Return
1954 NULL if any edge may be taken. */
1956 static edge
1957 find_taken_edge_switch_expr (basic_block bb, tree val)
1959 basic_block dest_bb;
1960 edge e;
1961 gimple switch_stmt;
1962 tree taken_case;
1964 switch_stmt = last_stmt (bb);
1965 taken_case = find_case_label_for_value (switch_stmt, val);
1966 dest_bb = label_to_block (CASE_LABEL (taken_case));
1968 e = find_edge (bb, dest_bb);
1969 gcc_assert (e);
1970 return e;
1974 /* Return the CASE_LABEL_EXPR that SWITCH_STMT will take for VAL.
1975 We can make optimal use here of the fact that the case labels are
1976 sorted: We can do a binary search for a case matching VAL. */
1978 static tree
1979 find_case_label_for_value (gimple switch_stmt, tree val)
1981 size_t low, high, n = gimple_switch_num_labels (switch_stmt);
1982 tree default_case = gimple_switch_default_label (switch_stmt);
1984 for (low = 0, high = n; high - low > 1; )
1986 size_t i = (high + low) / 2;
1987 tree t = gimple_switch_label (switch_stmt, i);
1988 int cmp;
1990 /* Cache the result of comparing CASE_LOW and val. */
1991 cmp = tree_int_cst_compare (CASE_LOW (t), val);
1993 if (cmp > 0)
1994 high = i;
1995 else
1996 low = i;
1998 if (CASE_HIGH (t) == NULL)
2000 /* A singe-valued case label. */
2001 if (cmp == 0)
2002 return t;
2004 else
2006 /* A case range. We can only handle integer ranges. */
2007 if (cmp <= 0 && tree_int_cst_compare (CASE_HIGH (t), val) >= 0)
2008 return t;
2012 return default_case;
2016 /* Dump a basic block on stderr. */
2018 void
2019 gimple_debug_bb (basic_block bb)
2021 dump_bb (stderr, bb, 0, TDF_VOPS|TDF_MEMSYMS|TDF_BLOCKS);
2025 /* Dump basic block with index N on stderr. */
2027 basic_block
2028 gimple_debug_bb_n (int n)
2030 gimple_debug_bb (BASIC_BLOCK (n));
2031 return BASIC_BLOCK (n);
2035 /* Dump the CFG on stderr.
2037 FLAGS are the same used by the tree dumping functions
2038 (see TDF_* in dumpfile.h). */
2040 void
2041 gimple_debug_cfg (int flags)
2043 gimple_dump_cfg (stderr, flags);
2047 /* Dump the program showing basic block boundaries on the given FILE.
2049 FLAGS are the same used by the tree dumping functions (see TDF_* in
2050 tree.h). */
2052 void
2053 gimple_dump_cfg (FILE *file, int flags)
2055 if (flags & TDF_DETAILS)
2057 dump_function_header (file, current_function_decl, flags);
2058 fprintf (file, ";; \n%d basic blocks, %d edges, last basic block %d.\n\n",
2059 n_basic_blocks, n_edges, last_basic_block);
2061 brief_dump_cfg (file, flags | TDF_COMMENT);
2062 fprintf (file, "\n");
2065 if (flags & TDF_STATS)
2066 dump_cfg_stats (file);
2068 dump_function_to_file (current_function_decl, file, flags | TDF_BLOCKS);
2072 /* Dump CFG statistics on FILE. */
2074 void
2075 dump_cfg_stats (FILE *file)
2077 static long max_num_merged_labels = 0;
2078 unsigned long size, total = 0;
2079 long num_edges;
2080 basic_block bb;
2081 const char * const fmt_str = "%-30s%-13s%12s\n";
2082 const char * const fmt_str_1 = "%-30s%13d%11lu%c\n";
2083 const char * const fmt_str_2 = "%-30s%13ld%11lu%c\n";
2084 const char * const fmt_str_3 = "%-43s%11lu%c\n";
2085 const char *funcname = current_function_name ();
2087 fprintf (file, "\nCFG Statistics for %s\n\n", funcname);
2089 fprintf (file, "---------------------------------------------------------\n");
2090 fprintf (file, fmt_str, "", " Number of ", "Memory");
2091 fprintf (file, fmt_str, "", " instances ", "used ");
2092 fprintf (file, "---------------------------------------------------------\n");
2094 size = n_basic_blocks * sizeof (struct basic_block_def);
2095 total += size;
2096 fprintf (file, fmt_str_1, "Basic blocks", n_basic_blocks,
2097 SCALE (size), LABEL (size));
2099 num_edges = 0;
2100 FOR_EACH_BB (bb)
2101 num_edges += EDGE_COUNT (bb->succs);
2102 size = num_edges * sizeof (struct edge_def);
2103 total += size;
2104 fprintf (file, fmt_str_2, "Edges", num_edges, SCALE (size), LABEL (size));
2106 fprintf (file, "---------------------------------------------------------\n");
2107 fprintf (file, fmt_str_3, "Total memory used by CFG data", SCALE (total),
2108 LABEL (total));
2109 fprintf (file, "---------------------------------------------------------\n");
2110 fprintf (file, "\n");
2112 if (cfg_stats.num_merged_labels > max_num_merged_labels)
2113 max_num_merged_labels = cfg_stats.num_merged_labels;
2115 fprintf (file, "Coalesced label blocks: %ld (Max so far: %ld)\n",
2116 cfg_stats.num_merged_labels, max_num_merged_labels);
2118 fprintf (file, "\n");
2122 /* Dump CFG statistics on stderr. Keep extern so that it's always
2123 linked in the final executable. */
2125 DEBUG_FUNCTION void
2126 debug_cfg_stats (void)
2128 dump_cfg_stats (stderr);
2131 /*---------------------------------------------------------------------------
2132 Miscellaneous helpers
2133 ---------------------------------------------------------------------------*/
2135 /* Return true if T, a GIMPLE_CALL, can make an abnormal transfer of control
2136 flow. Transfers of control flow associated with EH are excluded. */
2138 static bool
2139 call_can_make_abnormal_goto (gimple t)
2141 /* If the function has no non-local labels, then a call cannot make an
2142 abnormal transfer of control. */
2143 if (!cfun->has_nonlocal_label
2144 && !cfun->calls_setjmp)
2145 return false;
2147 /* Likewise if the call has no side effects. */
2148 if (!gimple_has_side_effects (t))
2149 return false;
2151 /* Likewise if the called function is leaf. */
2152 if (gimple_call_flags (t) & ECF_LEAF)
2153 return false;
2155 return true;
2159 /* Return true if T can make an abnormal transfer of control flow.
2160 Transfers of control flow associated with EH are excluded. */
2162 bool
2163 stmt_can_make_abnormal_goto (gimple t)
2165 if (computed_goto_p (t))
2166 return true;
2167 if (is_gimple_call (t))
2168 return call_can_make_abnormal_goto (t);
2169 return false;
2173 /* Return true if T represents a stmt that always transfers control. */
2175 bool
2176 is_ctrl_stmt (gimple t)
2178 switch (gimple_code (t))
2180 case GIMPLE_COND:
2181 case GIMPLE_SWITCH:
2182 case GIMPLE_GOTO:
2183 case GIMPLE_RETURN:
2184 case GIMPLE_RESX:
2185 return true;
2186 default:
2187 return false;
2192 /* Return true if T is a statement that may alter the flow of control
2193 (e.g., a call to a non-returning function). */
2195 bool
2196 is_ctrl_altering_stmt (gimple t)
2198 gcc_assert (t);
2200 switch (gimple_code (t))
2202 case GIMPLE_CALL:
2204 int flags = gimple_call_flags (t);
2206 /* A call alters control flow if it can make an abnormal goto. */
2207 if (call_can_make_abnormal_goto (t))
2208 return true;
2210 /* A call also alters control flow if it does not return. */
2211 if (flags & ECF_NORETURN)
2212 return true;
2214 /* TM ending statements have backedges out of the transaction.
2215 Return true so we split the basic block containing them.
2216 Note that the TM_BUILTIN test is merely an optimization. */
2217 if ((flags & ECF_TM_BUILTIN)
2218 && is_tm_ending_fndecl (gimple_call_fndecl (t)))
2219 return true;
2221 /* BUILT_IN_RETURN call is same as return statement. */
2222 if (gimple_call_builtin_p (t, BUILT_IN_RETURN))
2223 return true;
2225 break;
2227 case GIMPLE_EH_DISPATCH:
2228 /* EH_DISPATCH branches to the individual catch handlers at
2229 this level of a try or allowed-exceptions region. It can
2230 fallthru to the next statement as well. */
2231 return true;
2233 case GIMPLE_ASM:
2234 if (gimple_asm_nlabels (t) > 0)
2235 return true;
2236 break;
2238 CASE_GIMPLE_OMP:
2239 /* OpenMP directives alter control flow. */
2240 return true;
2242 case GIMPLE_TRANSACTION:
2243 /* A transaction start alters control flow. */
2244 return true;
2246 default:
2247 break;
2250 /* If a statement can throw, it alters control flow. */
2251 return stmt_can_throw_internal (t);
2255 /* Return true if T is a simple local goto. */
2257 bool
2258 simple_goto_p (gimple t)
2260 return (gimple_code (t) == GIMPLE_GOTO
2261 && TREE_CODE (gimple_goto_dest (t)) == LABEL_DECL);
2265 /* Return true if STMT should start a new basic block. PREV_STMT is
2266 the statement preceding STMT. It is used when STMT is a label or a
2267 case label. Labels should only start a new basic block if their
2268 previous statement wasn't a label. Otherwise, sequence of labels
2269 would generate unnecessary basic blocks that only contain a single
2270 label. */
2272 static inline bool
2273 stmt_starts_bb_p (gimple stmt, gimple prev_stmt)
2275 if (stmt == NULL)
2276 return false;
2278 /* Labels start a new basic block only if the preceding statement
2279 wasn't a label of the same type. This prevents the creation of
2280 consecutive blocks that have nothing but a single label. */
2281 if (gimple_code (stmt) == GIMPLE_LABEL)
2283 /* Nonlocal and computed GOTO targets always start a new block. */
2284 if (DECL_NONLOCAL (gimple_label_label (stmt))
2285 || FORCED_LABEL (gimple_label_label (stmt)))
2286 return true;
2288 if (prev_stmt && gimple_code (prev_stmt) == GIMPLE_LABEL)
2290 if (DECL_NONLOCAL (gimple_label_label (prev_stmt)))
2291 return true;
2293 cfg_stats.num_merged_labels++;
2294 return false;
2296 else
2297 return true;
2299 else if (gimple_code (stmt) == GIMPLE_CALL
2300 && gimple_call_flags (stmt) & ECF_RETURNS_TWICE)
2301 /* setjmp acts similar to a nonlocal GOTO target and thus should
2302 start a new block. */
2303 return true;
2305 return false;
2309 /* Return true if T should end a basic block. */
2311 bool
2312 stmt_ends_bb_p (gimple t)
2314 return is_ctrl_stmt (t) || is_ctrl_altering_stmt (t);
2317 /* Remove block annotations and other data structures. */
2319 void
2320 delete_tree_cfg_annotations (void)
2322 vec_free (label_to_block_map);
2326 /* Return the first statement in basic block BB. */
2328 gimple
2329 first_stmt (basic_block bb)
2331 gimple_stmt_iterator i = gsi_start_bb (bb);
2332 gimple stmt = NULL;
2334 while (!gsi_end_p (i) && is_gimple_debug ((stmt = gsi_stmt (i))))
2336 gsi_next (&i);
2337 stmt = NULL;
2339 return stmt;
2342 /* Return the first non-label statement in basic block BB. */
2344 static gimple
2345 first_non_label_stmt (basic_block bb)
2347 gimple_stmt_iterator i = gsi_start_bb (bb);
2348 while (!gsi_end_p (i) && gimple_code (gsi_stmt (i)) == GIMPLE_LABEL)
2349 gsi_next (&i);
2350 return !gsi_end_p (i) ? gsi_stmt (i) : NULL;
2353 /* Return the last statement in basic block BB. */
2355 gimple
2356 last_stmt (basic_block bb)
2358 gimple_stmt_iterator i = gsi_last_bb (bb);
2359 gimple stmt = NULL;
2361 while (!gsi_end_p (i) && is_gimple_debug ((stmt = gsi_stmt (i))))
2363 gsi_prev (&i);
2364 stmt = NULL;
2366 return stmt;
2369 /* Return the last statement of an otherwise empty block. Return NULL
2370 if the block is totally empty, or if it contains more than one
2371 statement. */
2373 gimple
2374 last_and_only_stmt (basic_block bb)
2376 gimple_stmt_iterator i = gsi_last_nondebug_bb (bb);
2377 gimple last, prev;
2379 if (gsi_end_p (i))
2380 return NULL;
2382 last = gsi_stmt (i);
2383 gsi_prev_nondebug (&i);
2384 if (gsi_end_p (i))
2385 return last;
2387 /* Empty statements should no longer appear in the instruction stream.
2388 Everything that might have appeared before should be deleted by
2389 remove_useless_stmts, and the optimizers should just gsi_remove
2390 instead of smashing with build_empty_stmt.
2392 Thus the only thing that should appear here in a block containing
2393 one executable statement is a label. */
2394 prev = gsi_stmt (i);
2395 if (gimple_code (prev) == GIMPLE_LABEL)
2396 return last;
2397 else
2398 return NULL;
2401 /* Reinstall those PHI arguments queued in OLD_EDGE to NEW_EDGE. */
2403 static void
2404 reinstall_phi_args (edge new_edge, edge old_edge)
2406 edge_var_map_vector *v;
2407 edge_var_map *vm;
2408 int i;
2409 gimple_stmt_iterator phis;
2411 v = redirect_edge_var_map_vector (old_edge);
2412 if (!v)
2413 return;
2415 for (i = 0, phis = gsi_start_phis (new_edge->dest);
2416 v->iterate (i, &vm) && !gsi_end_p (phis);
2417 i++, gsi_next (&phis))
2419 gimple phi = gsi_stmt (phis);
2420 tree result = redirect_edge_var_map_result (vm);
2421 tree arg = redirect_edge_var_map_def (vm);
2423 gcc_assert (result == gimple_phi_result (phi));
2425 add_phi_arg (phi, arg, new_edge, redirect_edge_var_map_location (vm));
2428 redirect_edge_var_map_clear (old_edge);
2431 /* Returns the basic block after which the new basic block created
2432 by splitting edge EDGE_IN should be placed. Tries to keep the new block
2433 near its "logical" location. This is of most help to humans looking
2434 at debugging dumps. */
2436 static basic_block
2437 split_edge_bb_loc (edge edge_in)
2439 basic_block dest = edge_in->dest;
2440 basic_block dest_prev = dest->prev_bb;
2442 if (dest_prev)
2444 edge e = find_edge (dest_prev, dest);
2445 if (e && !(e->flags & EDGE_COMPLEX))
2446 return edge_in->src;
2448 return dest_prev;
2451 /* Split a (typically critical) edge EDGE_IN. Return the new block.
2452 Abort on abnormal edges. */
2454 static basic_block
2455 gimple_split_edge (edge edge_in)
2457 basic_block new_bb, after_bb, dest;
2458 edge new_edge, e;
2460 /* Abnormal edges cannot be split. */
2461 gcc_assert (!(edge_in->flags & EDGE_ABNORMAL));
2463 dest = edge_in->dest;
2465 after_bb = split_edge_bb_loc (edge_in);
2467 new_bb = create_empty_bb (after_bb);
2468 new_bb->frequency = EDGE_FREQUENCY (edge_in);
2469 new_bb->count = edge_in->count;
2470 new_edge = make_edge (new_bb, dest, EDGE_FALLTHRU);
2471 new_edge->probability = REG_BR_PROB_BASE;
2472 new_edge->count = edge_in->count;
2474 e = redirect_edge_and_branch (edge_in, new_bb);
2475 gcc_assert (e == edge_in);
2476 reinstall_phi_args (new_edge, e);
2478 return new_bb;
2482 /* Verify properties of the address expression T with base object BASE. */
2484 static tree
2485 verify_address (tree t, tree base)
2487 bool old_constant;
2488 bool old_side_effects;
2489 bool new_constant;
2490 bool new_side_effects;
2492 old_constant = TREE_CONSTANT (t);
2493 old_side_effects = TREE_SIDE_EFFECTS (t);
2495 recompute_tree_invariant_for_addr_expr (t);
2496 new_side_effects = TREE_SIDE_EFFECTS (t);
2497 new_constant = TREE_CONSTANT (t);
2499 if (old_constant != new_constant)
2501 error ("constant not recomputed when ADDR_EXPR changed");
2502 return t;
2504 if (old_side_effects != new_side_effects)
2506 error ("side effects not recomputed when ADDR_EXPR changed");
2507 return t;
2510 if (!(TREE_CODE (base) == VAR_DECL
2511 || TREE_CODE (base) == PARM_DECL
2512 || TREE_CODE (base) == RESULT_DECL))
2513 return NULL_TREE;
2515 if (DECL_GIMPLE_REG_P (base))
2517 error ("DECL_GIMPLE_REG_P set on a variable with address taken");
2518 return base;
2521 return NULL_TREE;
2524 /* Callback for walk_tree, check that all elements with address taken are
2525 properly noticed as such. The DATA is an int* that is 1 if TP was seen
2526 inside a PHI node. */
2528 static tree
2529 verify_expr (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
2531 tree t = *tp, x;
2533 if (TYPE_P (t))
2534 *walk_subtrees = 0;
2536 /* Check operand N for being valid GIMPLE and give error MSG if not. */
2537 #define CHECK_OP(N, MSG) \
2538 do { if (!is_gimple_val (TREE_OPERAND (t, N))) \
2539 { error (MSG); return TREE_OPERAND (t, N); }} while (0)
2541 switch (TREE_CODE (t))
2543 case SSA_NAME:
2544 if (SSA_NAME_IN_FREE_LIST (t))
2546 error ("SSA name in freelist but still referenced");
2547 return *tp;
2549 break;
2551 case INDIRECT_REF:
2552 error ("INDIRECT_REF in gimple IL");
2553 return t;
2555 case MEM_REF:
2556 x = TREE_OPERAND (t, 0);
2557 if (!POINTER_TYPE_P (TREE_TYPE (x))
2558 || !is_gimple_mem_ref_addr (x))
2560 error ("invalid first operand of MEM_REF");
2561 return x;
2563 if (TREE_CODE (TREE_OPERAND (t, 1)) != INTEGER_CST
2564 || !POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (t, 1))))
2566 error ("invalid offset operand of MEM_REF");
2567 return TREE_OPERAND (t, 1);
2569 if (TREE_CODE (x) == ADDR_EXPR
2570 && (x = verify_address (x, TREE_OPERAND (x, 0))))
2571 return x;
2572 *walk_subtrees = 0;
2573 break;
2575 case ASSERT_EXPR:
2576 x = fold (ASSERT_EXPR_COND (t));
2577 if (x == boolean_false_node)
2579 error ("ASSERT_EXPR with an always-false condition");
2580 return *tp;
2582 break;
2584 case MODIFY_EXPR:
2585 error ("MODIFY_EXPR not expected while having tuples");
2586 return *tp;
2588 case ADDR_EXPR:
2590 tree tem;
2592 gcc_assert (is_gimple_address (t));
2594 /* Skip any references (they will be checked when we recurse down the
2595 tree) and ensure that any variable used as a prefix is marked
2596 addressable. */
2597 for (x = TREE_OPERAND (t, 0);
2598 handled_component_p (x);
2599 x = TREE_OPERAND (x, 0))
2602 if ((tem = verify_address (t, x)))
2603 return tem;
2605 if (!(TREE_CODE (x) == VAR_DECL
2606 || TREE_CODE (x) == PARM_DECL
2607 || TREE_CODE (x) == RESULT_DECL))
2608 return NULL;
2610 if (!TREE_ADDRESSABLE (x))
2612 error ("address taken, but ADDRESSABLE bit not set");
2613 return x;
2616 break;
2619 case COND_EXPR:
2620 x = COND_EXPR_COND (t);
2621 if (!INTEGRAL_TYPE_P (TREE_TYPE (x)))
2623 error ("non-integral used in condition");
2624 return x;
2626 if (!is_gimple_condexpr (x))
2628 error ("invalid conditional operand");
2629 return x;
2631 break;
2633 case NON_LVALUE_EXPR:
2634 case TRUTH_NOT_EXPR:
2635 gcc_unreachable ();
2637 CASE_CONVERT:
2638 case FIX_TRUNC_EXPR:
2639 case FLOAT_EXPR:
2640 case NEGATE_EXPR:
2641 case ABS_EXPR:
2642 case BIT_NOT_EXPR:
2643 CHECK_OP (0, "invalid operand to unary operator");
2644 break;
2646 case REALPART_EXPR:
2647 case IMAGPART_EXPR:
2648 case BIT_FIELD_REF:
2649 if (!is_gimple_reg_type (TREE_TYPE (t)))
2651 error ("non-scalar BIT_FIELD_REF, IMAGPART_EXPR or REALPART_EXPR");
2652 return t;
2655 if (TREE_CODE (t) == BIT_FIELD_REF)
2657 if (!host_integerp (TREE_OPERAND (t, 1), 1)
2658 || !host_integerp (TREE_OPERAND (t, 2), 1))
2660 error ("invalid position or size operand to BIT_FIELD_REF");
2661 return t;
2663 if (INTEGRAL_TYPE_P (TREE_TYPE (t))
2664 && (TYPE_PRECISION (TREE_TYPE (t))
2665 != TREE_INT_CST_LOW (TREE_OPERAND (t, 1))))
2667 error ("integral result type precision does not match "
2668 "field size of BIT_FIELD_REF");
2669 return t;
2671 else if (!INTEGRAL_TYPE_P (TREE_TYPE (t))
2672 && TYPE_MODE (TREE_TYPE (t)) != BLKmode
2673 && (GET_MODE_PRECISION (TYPE_MODE (TREE_TYPE (t)))
2674 != TREE_INT_CST_LOW (TREE_OPERAND (t, 1))))
2676 error ("mode precision of non-integral result does not "
2677 "match field size of BIT_FIELD_REF");
2678 return t;
2681 t = TREE_OPERAND (t, 0);
2683 /* Fall-through. */
2684 case COMPONENT_REF:
2685 case ARRAY_REF:
2686 case ARRAY_RANGE_REF:
2687 case VIEW_CONVERT_EXPR:
2688 /* We have a nest of references. Verify that each of the operands
2689 that determine where to reference is either a constant or a variable,
2690 verify that the base is valid, and then show we've already checked
2691 the subtrees. */
2692 while (handled_component_p (t))
2694 if (TREE_CODE (t) == COMPONENT_REF && TREE_OPERAND (t, 2))
2695 CHECK_OP (2, "invalid COMPONENT_REF offset operator");
2696 else if (TREE_CODE (t) == ARRAY_REF
2697 || TREE_CODE (t) == ARRAY_RANGE_REF)
2699 CHECK_OP (1, "invalid array index");
2700 if (TREE_OPERAND (t, 2))
2701 CHECK_OP (2, "invalid array lower bound");
2702 if (TREE_OPERAND (t, 3))
2703 CHECK_OP (3, "invalid array stride");
2705 else if (TREE_CODE (t) == BIT_FIELD_REF
2706 || TREE_CODE (t) == REALPART_EXPR
2707 || TREE_CODE (t) == IMAGPART_EXPR)
2709 error ("non-top-level BIT_FIELD_REF, IMAGPART_EXPR or "
2710 "REALPART_EXPR");
2711 return t;
2714 t = TREE_OPERAND (t, 0);
2717 if (!is_gimple_min_invariant (t) && !is_gimple_lvalue (t))
2719 error ("invalid reference prefix");
2720 return t;
2722 *walk_subtrees = 0;
2723 break;
2724 case PLUS_EXPR:
2725 case MINUS_EXPR:
2726 /* PLUS_EXPR and MINUS_EXPR don't work on pointers, they should be done using
2727 POINTER_PLUS_EXPR. */
2728 if (POINTER_TYPE_P (TREE_TYPE (t)))
2730 error ("invalid operand to plus/minus, type is a pointer");
2731 return t;
2733 CHECK_OP (0, "invalid operand to binary operator");
2734 CHECK_OP (1, "invalid operand to binary operator");
2735 break;
2737 case POINTER_PLUS_EXPR:
2738 /* Check to make sure the first operand is a pointer or reference type. */
2739 if (!POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (t, 0))))
2741 error ("invalid operand to pointer plus, first operand is not a pointer");
2742 return t;
2744 /* Check to make sure the second operand is a ptrofftype. */
2745 if (!ptrofftype_p (TREE_TYPE (TREE_OPERAND (t, 1))))
2747 error ("invalid operand to pointer plus, second operand is not an "
2748 "integer type of appropriate width");
2749 return t;
2751 /* FALLTHROUGH */
2752 case LT_EXPR:
2753 case LE_EXPR:
2754 case GT_EXPR:
2755 case GE_EXPR:
2756 case EQ_EXPR:
2757 case NE_EXPR:
2758 case UNORDERED_EXPR:
2759 case ORDERED_EXPR:
2760 case UNLT_EXPR:
2761 case UNLE_EXPR:
2762 case UNGT_EXPR:
2763 case UNGE_EXPR:
2764 case UNEQ_EXPR:
2765 case LTGT_EXPR:
2766 case MULT_EXPR:
2767 case TRUNC_DIV_EXPR:
2768 case CEIL_DIV_EXPR:
2769 case FLOOR_DIV_EXPR:
2770 case ROUND_DIV_EXPR:
2771 case TRUNC_MOD_EXPR:
2772 case CEIL_MOD_EXPR:
2773 case FLOOR_MOD_EXPR:
2774 case ROUND_MOD_EXPR:
2775 case RDIV_EXPR:
2776 case EXACT_DIV_EXPR:
2777 case MIN_EXPR:
2778 case MAX_EXPR:
2779 case LSHIFT_EXPR:
2780 case RSHIFT_EXPR:
2781 case LROTATE_EXPR:
2782 case RROTATE_EXPR:
2783 case BIT_IOR_EXPR:
2784 case BIT_XOR_EXPR:
2785 case BIT_AND_EXPR:
2786 CHECK_OP (0, "invalid operand to binary operator");
2787 CHECK_OP (1, "invalid operand to binary operator");
2788 break;
2790 case CONSTRUCTOR:
2791 if (TREE_CONSTANT (t) && TREE_CODE (TREE_TYPE (t)) == VECTOR_TYPE)
2792 *walk_subtrees = 0;
2793 break;
2795 case CASE_LABEL_EXPR:
2796 if (CASE_CHAIN (t))
2798 error ("invalid CASE_CHAIN");
2799 return t;
2801 break;
2803 default:
2804 break;
2806 return NULL;
2808 #undef CHECK_OP
2812 /* Verify if EXPR is either a GIMPLE ID or a GIMPLE indirect reference.
2813 Returns true if there is an error, otherwise false. */
2815 static bool
2816 verify_types_in_gimple_min_lval (tree expr)
2818 tree op;
2820 if (is_gimple_id (expr))
2821 return false;
2823 if (TREE_CODE (expr) != TARGET_MEM_REF
2824 && TREE_CODE (expr) != MEM_REF)
2826 error ("invalid expression for min lvalue");
2827 return true;
2830 /* TARGET_MEM_REFs are strange beasts. */
2831 if (TREE_CODE (expr) == TARGET_MEM_REF)
2832 return false;
2834 op = TREE_OPERAND (expr, 0);
2835 if (!is_gimple_val (op))
2837 error ("invalid operand in indirect reference");
2838 debug_generic_stmt (op);
2839 return true;
2841 /* Memory references now generally can involve a value conversion. */
2843 return false;
2846 /* Verify if EXPR is a valid GIMPLE reference expression. If
2847 REQUIRE_LVALUE is true verifies it is an lvalue. Returns true
2848 if there is an error, otherwise false. */
2850 static bool
2851 verify_types_in_gimple_reference (tree expr, bool require_lvalue)
2853 while (handled_component_p (expr))
2855 tree op = TREE_OPERAND (expr, 0);
2857 if (TREE_CODE (expr) == ARRAY_REF
2858 || TREE_CODE (expr) == ARRAY_RANGE_REF)
2860 if (!is_gimple_val (TREE_OPERAND (expr, 1))
2861 || (TREE_OPERAND (expr, 2)
2862 && !is_gimple_val (TREE_OPERAND (expr, 2)))
2863 || (TREE_OPERAND (expr, 3)
2864 && !is_gimple_val (TREE_OPERAND (expr, 3))))
2866 error ("invalid operands to array reference");
2867 debug_generic_stmt (expr);
2868 return true;
2872 /* Verify if the reference array element types are compatible. */
2873 if (TREE_CODE (expr) == ARRAY_REF
2874 && !useless_type_conversion_p (TREE_TYPE (expr),
2875 TREE_TYPE (TREE_TYPE (op))))
2877 error ("type mismatch in array reference");
2878 debug_generic_stmt (TREE_TYPE (expr));
2879 debug_generic_stmt (TREE_TYPE (TREE_TYPE (op)));
2880 return true;
2882 if (TREE_CODE (expr) == ARRAY_RANGE_REF
2883 && !useless_type_conversion_p (TREE_TYPE (TREE_TYPE (expr)),
2884 TREE_TYPE (TREE_TYPE (op))))
2886 error ("type mismatch in array range reference");
2887 debug_generic_stmt (TREE_TYPE (TREE_TYPE (expr)));
2888 debug_generic_stmt (TREE_TYPE (TREE_TYPE (op)));
2889 return true;
2892 if ((TREE_CODE (expr) == REALPART_EXPR
2893 || TREE_CODE (expr) == IMAGPART_EXPR)
2894 && !useless_type_conversion_p (TREE_TYPE (expr),
2895 TREE_TYPE (TREE_TYPE (op))))
2897 error ("type mismatch in real/imagpart reference");
2898 debug_generic_stmt (TREE_TYPE (expr));
2899 debug_generic_stmt (TREE_TYPE (TREE_TYPE (op)));
2900 return true;
2903 if (TREE_CODE (expr) == COMPONENT_REF
2904 && !useless_type_conversion_p (TREE_TYPE (expr),
2905 TREE_TYPE (TREE_OPERAND (expr, 1))))
2907 error ("type mismatch in component reference");
2908 debug_generic_stmt (TREE_TYPE (expr));
2909 debug_generic_stmt (TREE_TYPE (TREE_OPERAND (expr, 1)));
2910 return true;
2913 if (TREE_CODE (expr) == VIEW_CONVERT_EXPR)
2915 /* For VIEW_CONVERT_EXPRs which are allowed here too, we only check
2916 that their operand is not an SSA name or an invariant when
2917 requiring an lvalue (this usually means there is a SRA or IPA-SRA
2918 bug). Otherwise there is nothing to verify, gross mismatches at
2919 most invoke undefined behavior. */
2920 if (require_lvalue
2921 && (TREE_CODE (op) == SSA_NAME
2922 || is_gimple_min_invariant (op)))
2924 error ("conversion of an SSA_NAME on the left hand side");
2925 debug_generic_stmt (expr);
2926 return true;
2928 else if (TREE_CODE (op) == SSA_NAME
2929 && TYPE_SIZE (TREE_TYPE (expr)) != TYPE_SIZE (TREE_TYPE (op)))
2931 error ("conversion of register to a different size");
2932 debug_generic_stmt (expr);
2933 return true;
2935 else if (!handled_component_p (op))
2936 return false;
2939 expr = op;
2942 if (TREE_CODE (expr) == MEM_REF)
2944 if (!is_gimple_mem_ref_addr (TREE_OPERAND (expr, 0)))
2946 error ("invalid address operand in MEM_REF");
2947 debug_generic_stmt (expr);
2948 return true;
2950 if (TREE_CODE (TREE_OPERAND (expr, 1)) != INTEGER_CST
2951 || !POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (expr, 1))))
2953 error ("invalid offset operand in MEM_REF");
2954 debug_generic_stmt (expr);
2955 return true;
2958 else if (TREE_CODE (expr) == TARGET_MEM_REF)
2960 if (!TMR_BASE (expr)
2961 || !is_gimple_mem_ref_addr (TMR_BASE (expr)))
2963 error ("invalid address operand in TARGET_MEM_REF");
2964 return true;
2966 if (!TMR_OFFSET (expr)
2967 || TREE_CODE (TMR_OFFSET (expr)) != INTEGER_CST
2968 || !POINTER_TYPE_P (TREE_TYPE (TMR_OFFSET (expr))))
2970 error ("invalid offset operand in TARGET_MEM_REF");
2971 debug_generic_stmt (expr);
2972 return true;
2976 return ((require_lvalue || !is_gimple_min_invariant (expr))
2977 && verify_types_in_gimple_min_lval (expr));
2980 /* Returns true if there is one pointer type in TYPE_POINTER_TO (SRC_OBJ)
2981 list of pointer-to types that is trivially convertible to DEST. */
2983 static bool
2984 one_pointer_to_useless_type_conversion_p (tree dest, tree src_obj)
2986 tree src;
2988 if (!TYPE_POINTER_TO (src_obj))
2989 return true;
2991 for (src = TYPE_POINTER_TO (src_obj); src; src = TYPE_NEXT_PTR_TO (src))
2992 if (useless_type_conversion_p (dest, src))
2993 return true;
2995 return false;
2998 /* Return true if TYPE1 is a fixed-point type and if conversions to and
2999 from TYPE2 can be handled by FIXED_CONVERT_EXPR. */
3001 static bool
3002 valid_fixed_convert_types_p (tree type1, tree type2)
3004 return (FIXED_POINT_TYPE_P (type1)
3005 && (INTEGRAL_TYPE_P (type2)
3006 || SCALAR_FLOAT_TYPE_P (type2)
3007 || FIXED_POINT_TYPE_P (type2)));
3010 /* Verify the contents of a GIMPLE_CALL STMT. Returns true when there
3011 is a problem, otherwise false. */
3013 static bool
3014 verify_gimple_call (gimple stmt)
3016 tree fn = gimple_call_fn (stmt);
3017 tree fntype, fndecl;
3018 unsigned i;
3020 if (gimple_call_internal_p (stmt))
3022 if (fn)
3024 error ("gimple call has two targets");
3025 debug_generic_stmt (fn);
3026 return true;
3029 else
3031 if (!fn)
3033 error ("gimple call has no target");
3034 return true;
3038 if (fn && !is_gimple_call_addr (fn))
3040 error ("invalid function in gimple call");
3041 debug_generic_stmt (fn);
3042 return true;
3045 if (fn
3046 && (!POINTER_TYPE_P (TREE_TYPE (fn))
3047 || (TREE_CODE (TREE_TYPE (TREE_TYPE (fn))) != FUNCTION_TYPE
3048 && TREE_CODE (TREE_TYPE (TREE_TYPE (fn))) != METHOD_TYPE)))
3050 error ("non-function in gimple call");
3051 return true;
3054 fndecl = gimple_call_fndecl (stmt);
3055 if (fndecl
3056 && TREE_CODE (fndecl) == FUNCTION_DECL
3057 && DECL_LOOPING_CONST_OR_PURE_P (fndecl)
3058 && !DECL_PURE_P (fndecl)
3059 && !TREE_READONLY (fndecl))
3061 error ("invalid pure const state for function");
3062 return true;
3065 if (gimple_call_lhs (stmt)
3066 && (!is_gimple_lvalue (gimple_call_lhs (stmt))
3067 || verify_types_in_gimple_reference (gimple_call_lhs (stmt), true)))
3069 error ("invalid LHS in gimple call");
3070 return true;
3073 if (gimple_call_lhs (stmt) && gimple_call_noreturn_p (stmt))
3075 error ("LHS in noreturn call");
3076 return true;
3079 fntype = gimple_call_fntype (stmt);
3080 if (fntype
3081 && gimple_call_lhs (stmt)
3082 && !useless_type_conversion_p (TREE_TYPE (gimple_call_lhs (stmt)),
3083 TREE_TYPE (fntype))
3084 /* ??? At least C++ misses conversions at assignments from
3085 void * call results.
3086 ??? Java is completely off. Especially with functions
3087 returning java.lang.Object.
3088 For now simply allow arbitrary pointer type conversions. */
3089 && !(POINTER_TYPE_P (TREE_TYPE (gimple_call_lhs (stmt)))
3090 && POINTER_TYPE_P (TREE_TYPE (fntype))))
3092 error ("invalid conversion in gimple call");
3093 debug_generic_stmt (TREE_TYPE (gimple_call_lhs (stmt)));
3094 debug_generic_stmt (TREE_TYPE (fntype));
3095 return true;
3098 if (gimple_call_chain (stmt)
3099 && !is_gimple_val (gimple_call_chain (stmt)))
3101 error ("invalid static chain in gimple call");
3102 debug_generic_stmt (gimple_call_chain (stmt));
3103 return true;
3106 /* If there is a static chain argument, this should not be an indirect
3107 call, and the decl should have DECL_STATIC_CHAIN set. */
3108 if (gimple_call_chain (stmt))
3110 if (!gimple_call_fndecl (stmt))
3112 error ("static chain in indirect gimple call");
3113 return true;
3115 fn = TREE_OPERAND (fn, 0);
3117 if (!DECL_STATIC_CHAIN (fn))
3119 error ("static chain with function that doesn%'t use one");
3120 return true;
3124 /* ??? The C frontend passes unpromoted arguments in case it
3125 didn't see a function declaration before the call. So for now
3126 leave the call arguments mostly unverified. Once we gimplify
3127 unit-at-a-time we have a chance to fix this. */
3129 for (i = 0; i < gimple_call_num_args (stmt); ++i)
3131 tree arg = gimple_call_arg (stmt, i);
3132 if ((is_gimple_reg_type (TREE_TYPE (arg))
3133 && !is_gimple_val (arg))
3134 || (!is_gimple_reg_type (TREE_TYPE (arg))
3135 && !is_gimple_lvalue (arg)))
3137 error ("invalid argument to gimple call");
3138 debug_generic_expr (arg);
3139 return true;
3143 return false;
3146 /* Verifies the gimple comparison with the result type TYPE and
3147 the operands OP0 and OP1. */
3149 static bool
3150 verify_gimple_comparison (tree type, tree op0, tree op1)
3152 tree op0_type = TREE_TYPE (op0);
3153 tree op1_type = TREE_TYPE (op1);
3155 if (!is_gimple_val (op0) || !is_gimple_val (op1))
3157 error ("invalid operands in gimple comparison");
3158 return true;
3161 /* For comparisons we do not have the operations type as the
3162 effective type the comparison is carried out in. Instead
3163 we require that either the first operand is trivially
3164 convertible into the second, or the other way around.
3165 Because we special-case pointers to void we allow
3166 comparisons of pointers with the same mode as well. */
3167 if (!useless_type_conversion_p (op0_type, op1_type)
3168 && !useless_type_conversion_p (op1_type, op0_type)
3169 && (!POINTER_TYPE_P (op0_type)
3170 || !POINTER_TYPE_P (op1_type)
3171 || TYPE_MODE (op0_type) != TYPE_MODE (op1_type)))
3173 error ("mismatching comparison operand types");
3174 debug_generic_expr (op0_type);
3175 debug_generic_expr (op1_type);
3176 return true;
3179 /* The resulting type of a comparison may be an effective boolean type. */
3180 if (INTEGRAL_TYPE_P (type)
3181 && (TREE_CODE (type) == BOOLEAN_TYPE
3182 || TYPE_PRECISION (type) == 1))
3184 if (TREE_CODE (op0_type) == VECTOR_TYPE
3185 || TREE_CODE (op1_type) == VECTOR_TYPE)
3187 error ("vector comparison returning a boolean");
3188 debug_generic_expr (op0_type);
3189 debug_generic_expr (op1_type);
3190 return true;
3193 /* Or an integer vector type with the same size and element count
3194 as the comparison operand types. */
3195 else if (TREE_CODE (type) == VECTOR_TYPE
3196 && TREE_CODE (TREE_TYPE (type)) == INTEGER_TYPE)
3198 if (TREE_CODE (op0_type) != VECTOR_TYPE
3199 || TREE_CODE (op1_type) != VECTOR_TYPE)
3201 error ("non-vector operands in vector comparison");
3202 debug_generic_expr (op0_type);
3203 debug_generic_expr (op1_type);
3204 return true;
3207 if (TYPE_VECTOR_SUBPARTS (type) != TYPE_VECTOR_SUBPARTS (op0_type)
3208 || (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (type)))
3209 != GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0_type))))
3210 /* The result of a vector comparison is of signed
3211 integral type. */
3212 || TYPE_UNSIGNED (TREE_TYPE (type)))
3214 error ("invalid vector comparison resulting type");
3215 debug_generic_expr (type);
3216 return true;
3219 else
3221 error ("bogus comparison result type");
3222 debug_generic_expr (type);
3223 return true;
3226 return false;
3229 /* Verify a gimple assignment statement STMT with an unary rhs.
3230 Returns true if anything is wrong. */
3232 static bool
3233 verify_gimple_assign_unary (gimple stmt)
3235 enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
3236 tree lhs = gimple_assign_lhs (stmt);
3237 tree lhs_type = TREE_TYPE (lhs);
3238 tree rhs1 = gimple_assign_rhs1 (stmt);
3239 tree rhs1_type = TREE_TYPE (rhs1);
3241 if (!is_gimple_reg (lhs))
3243 error ("non-register as LHS of unary operation");
3244 return true;
3247 if (!is_gimple_val (rhs1))
3249 error ("invalid operand in unary operation");
3250 return true;
3253 /* First handle conversions. */
3254 switch (rhs_code)
3256 CASE_CONVERT:
3258 /* Allow conversions from pointer type to integral type only if
3259 there is no sign or zero extension involved.
3260 For targets were the precision of ptrofftype doesn't match that
3261 of pointers we need to allow arbitrary conversions to ptrofftype. */
3262 if ((POINTER_TYPE_P (lhs_type)
3263 && INTEGRAL_TYPE_P (rhs1_type))
3264 || (POINTER_TYPE_P (rhs1_type)
3265 && INTEGRAL_TYPE_P (lhs_type)
3266 && (TYPE_PRECISION (rhs1_type) >= TYPE_PRECISION (lhs_type)
3267 || ptrofftype_p (sizetype))))
3268 return false;
3270 /* Allow conversion from integral to offset type and vice versa. */
3271 if ((TREE_CODE (lhs_type) == OFFSET_TYPE
3272 && INTEGRAL_TYPE_P (rhs1_type))
3273 || (INTEGRAL_TYPE_P (lhs_type)
3274 && TREE_CODE (rhs1_type) == OFFSET_TYPE))
3275 return false;
3277 /* Otherwise assert we are converting between types of the
3278 same kind. */
3279 if (INTEGRAL_TYPE_P (lhs_type) != INTEGRAL_TYPE_P (rhs1_type))
3281 error ("invalid types in nop conversion");
3282 debug_generic_expr (lhs_type);
3283 debug_generic_expr (rhs1_type);
3284 return true;
3287 return false;
3290 case ADDR_SPACE_CONVERT_EXPR:
3292 if (!POINTER_TYPE_P (rhs1_type) || !POINTER_TYPE_P (lhs_type)
3293 || (TYPE_ADDR_SPACE (TREE_TYPE (rhs1_type))
3294 == TYPE_ADDR_SPACE (TREE_TYPE (lhs_type))))
3296 error ("invalid types in address space conversion");
3297 debug_generic_expr (lhs_type);
3298 debug_generic_expr (rhs1_type);
3299 return true;
3302 return false;
3305 case FIXED_CONVERT_EXPR:
3307 if (!valid_fixed_convert_types_p (lhs_type, rhs1_type)
3308 && !valid_fixed_convert_types_p (rhs1_type, lhs_type))
3310 error ("invalid types in fixed-point conversion");
3311 debug_generic_expr (lhs_type);
3312 debug_generic_expr (rhs1_type);
3313 return true;
3316 return false;
3319 case FLOAT_EXPR:
3321 if ((!INTEGRAL_TYPE_P (rhs1_type) || !SCALAR_FLOAT_TYPE_P (lhs_type))
3322 && (!VECTOR_INTEGER_TYPE_P (rhs1_type)
3323 || !VECTOR_FLOAT_TYPE_P (lhs_type)))
3325 error ("invalid types in conversion to floating point");
3326 debug_generic_expr (lhs_type);
3327 debug_generic_expr (rhs1_type);
3328 return true;
3331 return false;
3334 case FIX_TRUNC_EXPR:
3336 if ((!INTEGRAL_TYPE_P (lhs_type) || !SCALAR_FLOAT_TYPE_P (rhs1_type))
3337 && (!VECTOR_INTEGER_TYPE_P (lhs_type)
3338 || !VECTOR_FLOAT_TYPE_P (rhs1_type)))
3340 error ("invalid types in conversion to integer");
3341 debug_generic_expr (lhs_type);
3342 debug_generic_expr (rhs1_type);
3343 return true;
3346 return false;
3349 case VEC_UNPACK_HI_EXPR:
3350 case VEC_UNPACK_LO_EXPR:
3351 case REDUC_MAX_EXPR:
3352 case REDUC_MIN_EXPR:
3353 case REDUC_PLUS_EXPR:
3354 case VEC_UNPACK_FLOAT_HI_EXPR:
3355 case VEC_UNPACK_FLOAT_LO_EXPR:
3356 /* FIXME. */
3357 return false;
3359 case NEGATE_EXPR:
3360 case ABS_EXPR:
3361 case BIT_NOT_EXPR:
3362 case PAREN_EXPR:
3363 case NON_LVALUE_EXPR:
3364 case CONJ_EXPR:
3365 break;
3367 default:
3368 gcc_unreachable ();
3371 /* For the remaining codes assert there is no conversion involved. */
3372 if (!useless_type_conversion_p (lhs_type, rhs1_type))
3374 error ("non-trivial conversion in unary operation");
3375 debug_generic_expr (lhs_type);
3376 debug_generic_expr (rhs1_type);
3377 return true;
3380 return false;
3383 /* Verify a gimple assignment statement STMT with a binary rhs.
3384 Returns true if anything is wrong. */
3386 static bool
3387 verify_gimple_assign_binary (gimple stmt)
3389 enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
3390 tree lhs = gimple_assign_lhs (stmt);
3391 tree lhs_type = TREE_TYPE (lhs);
3392 tree rhs1 = gimple_assign_rhs1 (stmt);
3393 tree rhs1_type = TREE_TYPE (rhs1);
3394 tree rhs2 = gimple_assign_rhs2 (stmt);
3395 tree rhs2_type = TREE_TYPE (rhs2);
3397 if (!is_gimple_reg (lhs))
3399 error ("non-register as LHS of binary operation");
3400 return true;
3403 if (!is_gimple_val (rhs1)
3404 || !is_gimple_val (rhs2))
3406 error ("invalid operands in binary operation");
3407 return true;
3410 /* First handle operations that involve different types. */
3411 switch (rhs_code)
3413 case COMPLEX_EXPR:
3415 if (TREE_CODE (lhs_type) != COMPLEX_TYPE
3416 || !(INTEGRAL_TYPE_P (rhs1_type)
3417 || SCALAR_FLOAT_TYPE_P (rhs1_type))
3418 || !(INTEGRAL_TYPE_P (rhs2_type)
3419 || SCALAR_FLOAT_TYPE_P (rhs2_type)))
3421 error ("type mismatch in complex expression");
3422 debug_generic_expr (lhs_type);
3423 debug_generic_expr (rhs1_type);
3424 debug_generic_expr (rhs2_type);
3425 return true;
3428 return false;
3431 case LSHIFT_EXPR:
3432 case RSHIFT_EXPR:
3433 case LROTATE_EXPR:
3434 case RROTATE_EXPR:
3436 /* Shifts and rotates are ok on integral types, fixed point
3437 types and integer vector types. */
3438 if ((!INTEGRAL_TYPE_P (rhs1_type)
3439 && !FIXED_POINT_TYPE_P (rhs1_type)
3440 && !(TREE_CODE (rhs1_type) == VECTOR_TYPE
3441 && INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))))
3442 || (!INTEGRAL_TYPE_P (rhs2_type)
3443 /* Vector shifts of vectors are also ok. */
3444 && !(TREE_CODE (rhs1_type) == VECTOR_TYPE
3445 && INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))
3446 && TREE_CODE (rhs2_type) == VECTOR_TYPE
3447 && INTEGRAL_TYPE_P (TREE_TYPE (rhs2_type))))
3448 || !useless_type_conversion_p (lhs_type, rhs1_type))
3450 error ("type mismatch in shift expression");
3451 debug_generic_expr (lhs_type);
3452 debug_generic_expr (rhs1_type);
3453 debug_generic_expr (rhs2_type);
3454 return true;
3457 return false;
3460 case VEC_LSHIFT_EXPR:
3461 case VEC_RSHIFT_EXPR:
3463 if (TREE_CODE (rhs1_type) != VECTOR_TYPE
3464 || !(INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))
3465 || POINTER_TYPE_P (TREE_TYPE (rhs1_type))
3466 || FIXED_POINT_TYPE_P (TREE_TYPE (rhs1_type))
3467 || SCALAR_FLOAT_TYPE_P (TREE_TYPE (rhs1_type)))
3468 || (!INTEGRAL_TYPE_P (rhs2_type)
3469 && (TREE_CODE (rhs2_type) != VECTOR_TYPE
3470 || !INTEGRAL_TYPE_P (TREE_TYPE (rhs2_type))))
3471 || !useless_type_conversion_p (lhs_type, rhs1_type))
3473 error ("type mismatch in vector shift expression");
3474 debug_generic_expr (lhs_type);
3475 debug_generic_expr (rhs1_type);
3476 debug_generic_expr (rhs2_type);
3477 return true;
3479 /* For shifting a vector of non-integral components we
3480 only allow shifting by a constant multiple of the element size. */
3481 if (!INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))
3482 && (TREE_CODE (rhs2) != INTEGER_CST
3483 || !div_if_zero_remainder (EXACT_DIV_EXPR, rhs2,
3484 TYPE_SIZE (TREE_TYPE (rhs1_type)))))
3486 error ("non-element sized vector shift of floating point vector");
3487 return true;
3490 return false;
3493 case WIDEN_LSHIFT_EXPR:
3495 if (!INTEGRAL_TYPE_P (lhs_type)
3496 || !INTEGRAL_TYPE_P (rhs1_type)
3497 || TREE_CODE (rhs2) != INTEGER_CST
3498 || (2 * TYPE_PRECISION (rhs1_type) > TYPE_PRECISION (lhs_type)))
3500 error ("type mismatch in widening vector shift expression");
3501 debug_generic_expr (lhs_type);
3502 debug_generic_expr (rhs1_type);
3503 debug_generic_expr (rhs2_type);
3504 return true;
3507 return false;
3510 case VEC_WIDEN_LSHIFT_HI_EXPR:
3511 case VEC_WIDEN_LSHIFT_LO_EXPR:
3513 if (TREE_CODE (rhs1_type) != VECTOR_TYPE
3514 || TREE_CODE (lhs_type) != VECTOR_TYPE
3515 || !INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))
3516 || !INTEGRAL_TYPE_P (TREE_TYPE (lhs_type))
3517 || TREE_CODE (rhs2) != INTEGER_CST
3518 || (2 * TYPE_PRECISION (TREE_TYPE (rhs1_type))
3519 > TYPE_PRECISION (TREE_TYPE (lhs_type))))
3521 error ("type mismatch in widening vector shift expression");
3522 debug_generic_expr (lhs_type);
3523 debug_generic_expr (rhs1_type);
3524 debug_generic_expr (rhs2_type);
3525 return true;
3528 return false;
3531 case PLUS_EXPR:
3532 case MINUS_EXPR:
3534 tree lhs_etype = lhs_type;
3535 tree rhs1_etype = rhs1_type;
3536 tree rhs2_etype = rhs2_type;
3537 if (TREE_CODE (lhs_type) == VECTOR_TYPE)
3539 if (TREE_CODE (rhs1_type) != VECTOR_TYPE
3540 || TREE_CODE (rhs2_type) != VECTOR_TYPE)
3542 error ("invalid non-vector operands to vector valued plus");
3543 return true;
3545 lhs_etype = TREE_TYPE (lhs_type);
3546 rhs1_etype = TREE_TYPE (rhs1_type);
3547 rhs2_etype = TREE_TYPE (rhs2_type);
3549 if (POINTER_TYPE_P (lhs_etype)
3550 || POINTER_TYPE_P (rhs1_etype)
3551 || POINTER_TYPE_P (rhs2_etype))
3553 error ("invalid (pointer) operands to plus/minus");
3554 return true;
3557 /* Continue with generic binary expression handling. */
3558 break;
3561 case POINTER_PLUS_EXPR:
3563 if (!POINTER_TYPE_P (rhs1_type)
3564 || !useless_type_conversion_p (lhs_type, rhs1_type)
3565 || !ptrofftype_p (rhs2_type))
3567 error ("type mismatch in pointer plus expression");
3568 debug_generic_stmt (lhs_type);
3569 debug_generic_stmt (rhs1_type);
3570 debug_generic_stmt (rhs2_type);
3571 return true;
3574 return false;
3577 case TRUTH_ANDIF_EXPR:
3578 case TRUTH_ORIF_EXPR:
3579 case TRUTH_AND_EXPR:
3580 case TRUTH_OR_EXPR:
3581 case TRUTH_XOR_EXPR:
3583 gcc_unreachable ();
3585 case LT_EXPR:
3586 case LE_EXPR:
3587 case GT_EXPR:
3588 case GE_EXPR:
3589 case EQ_EXPR:
3590 case NE_EXPR:
3591 case UNORDERED_EXPR:
3592 case ORDERED_EXPR:
3593 case UNLT_EXPR:
3594 case UNLE_EXPR:
3595 case UNGT_EXPR:
3596 case UNGE_EXPR:
3597 case UNEQ_EXPR:
3598 case LTGT_EXPR:
3599 /* Comparisons are also binary, but the result type is not
3600 connected to the operand types. */
3601 return verify_gimple_comparison (lhs_type, rhs1, rhs2);
3603 case WIDEN_MULT_EXPR:
3604 if (TREE_CODE (lhs_type) != INTEGER_TYPE)
3605 return true;
3606 return ((2 * TYPE_PRECISION (rhs1_type) > TYPE_PRECISION (lhs_type))
3607 || (TYPE_PRECISION (rhs1_type) != TYPE_PRECISION (rhs2_type)));
3609 case WIDEN_SUM_EXPR:
3610 case VEC_WIDEN_MULT_HI_EXPR:
3611 case VEC_WIDEN_MULT_LO_EXPR:
3612 case VEC_WIDEN_MULT_EVEN_EXPR:
3613 case VEC_WIDEN_MULT_ODD_EXPR:
3614 case VEC_PACK_TRUNC_EXPR:
3615 case VEC_PACK_SAT_EXPR:
3616 case VEC_PACK_FIX_TRUNC_EXPR:
3617 /* FIXME. */
3618 return false;
3620 case MULT_EXPR:
3621 case MULT_HIGHPART_EXPR:
3622 case TRUNC_DIV_EXPR:
3623 case CEIL_DIV_EXPR:
3624 case FLOOR_DIV_EXPR:
3625 case ROUND_DIV_EXPR:
3626 case TRUNC_MOD_EXPR:
3627 case CEIL_MOD_EXPR:
3628 case FLOOR_MOD_EXPR:
3629 case ROUND_MOD_EXPR:
3630 case RDIV_EXPR:
3631 case EXACT_DIV_EXPR:
3632 case MIN_EXPR:
3633 case MAX_EXPR:
3634 case BIT_IOR_EXPR:
3635 case BIT_XOR_EXPR:
3636 case BIT_AND_EXPR:
3637 /* Continue with generic binary expression handling. */
3638 break;
3640 default:
3641 gcc_unreachable ();
3644 if (!useless_type_conversion_p (lhs_type, rhs1_type)
3645 || !useless_type_conversion_p (lhs_type, rhs2_type))
3647 error ("type mismatch in binary expression");
3648 debug_generic_stmt (lhs_type);
3649 debug_generic_stmt (rhs1_type);
3650 debug_generic_stmt (rhs2_type);
3651 return true;
3654 return false;
3657 /* Verify a gimple assignment statement STMT with a ternary rhs.
3658 Returns true if anything is wrong. */
3660 static bool
3661 verify_gimple_assign_ternary (gimple stmt)
3663 enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
3664 tree lhs = gimple_assign_lhs (stmt);
3665 tree lhs_type = TREE_TYPE (lhs);
3666 tree rhs1 = gimple_assign_rhs1 (stmt);
3667 tree rhs1_type = TREE_TYPE (rhs1);
3668 tree rhs2 = gimple_assign_rhs2 (stmt);
3669 tree rhs2_type = TREE_TYPE (rhs2);
3670 tree rhs3 = gimple_assign_rhs3 (stmt);
3671 tree rhs3_type = TREE_TYPE (rhs3);
3673 if (!is_gimple_reg (lhs))
3675 error ("non-register as LHS of ternary operation");
3676 return true;
3679 if (((rhs_code == VEC_COND_EXPR || rhs_code == COND_EXPR)
3680 ? !is_gimple_condexpr (rhs1) : !is_gimple_val (rhs1))
3681 || !is_gimple_val (rhs2)
3682 || !is_gimple_val (rhs3))
3684 error ("invalid operands in ternary operation");
3685 return true;
3688 /* First handle operations that involve different types. */
3689 switch (rhs_code)
3691 case WIDEN_MULT_PLUS_EXPR:
3692 case WIDEN_MULT_MINUS_EXPR:
3693 if ((!INTEGRAL_TYPE_P (rhs1_type)
3694 && !FIXED_POINT_TYPE_P (rhs1_type))
3695 || !useless_type_conversion_p (rhs1_type, rhs2_type)
3696 || !useless_type_conversion_p (lhs_type, rhs3_type)
3697 || 2 * TYPE_PRECISION (rhs1_type) > TYPE_PRECISION (lhs_type)
3698 || TYPE_PRECISION (rhs1_type) != TYPE_PRECISION (rhs2_type))
3700 error ("type mismatch in widening multiply-accumulate expression");
3701 debug_generic_expr (lhs_type);
3702 debug_generic_expr (rhs1_type);
3703 debug_generic_expr (rhs2_type);
3704 debug_generic_expr (rhs3_type);
3705 return true;
3707 break;
3709 case FMA_EXPR:
3710 if (!useless_type_conversion_p (lhs_type, rhs1_type)
3711 || !useless_type_conversion_p (lhs_type, rhs2_type)
3712 || !useless_type_conversion_p (lhs_type, rhs3_type))
3714 error ("type mismatch in fused multiply-add expression");
3715 debug_generic_expr (lhs_type);
3716 debug_generic_expr (rhs1_type);
3717 debug_generic_expr (rhs2_type);
3718 debug_generic_expr (rhs3_type);
3719 return true;
3721 break;
3723 case COND_EXPR:
3724 case VEC_COND_EXPR:
3725 if (!useless_type_conversion_p (lhs_type, rhs2_type)
3726 || !useless_type_conversion_p (lhs_type, rhs3_type))
3728 error ("type mismatch in conditional expression");
3729 debug_generic_expr (lhs_type);
3730 debug_generic_expr (rhs2_type);
3731 debug_generic_expr (rhs3_type);
3732 return true;
3734 break;
3736 case VEC_PERM_EXPR:
3737 if (!useless_type_conversion_p (lhs_type, rhs1_type)
3738 || !useless_type_conversion_p (lhs_type, rhs2_type))
3740 error ("type mismatch in vector permute expression");
3741 debug_generic_expr (lhs_type);
3742 debug_generic_expr (rhs1_type);
3743 debug_generic_expr (rhs2_type);
3744 debug_generic_expr (rhs3_type);
3745 return true;
3748 if (TREE_CODE (rhs1_type) != VECTOR_TYPE
3749 || TREE_CODE (rhs2_type) != VECTOR_TYPE
3750 || TREE_CODE (rhs3_type) != VECTOR_TYPE)
3752 error ("vector types expected in vector permute expression");
3753 debug_generic_expr (lhs_type);
3754 debug_generic_expr (rhs1_type);
3755 debug_generic_expr (rhs2_type);
3756 debug_generic_expr (rhs3_type);
3757 return true;
3760 if (TYPE_VECTOR_SUBPARTS (rhs1_type) != TYPE_VECTOR_SUBPARTS (rhs2_type)
3761 || TYPE_VECTOR_SUBPARTS (rhs2_type)
3762 != TYPE_VECTOR_SUBPARTS (rhs3_type)
3763 || TYPE_VECTOR_SUBPARTS (rhs3_type)
3764 != TYPE_VECTOR_SUBPARTS (lhs_type))
3766 error ("vectors with different element number found "
3767 "in vector permute expression");
3768 debug_generic_expr (lhs_type);
3769 debug_generic_expr (rhs1_type);
3770 debug_generic_expr (rhs2_type);
3771 debug_generic_expr (rhs3_type);
3772 return true;
3775 if (TREE_CODE (TREE_TYPE (rhs3_type)) != INTEGER_TYPE
3776 || GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (rhs3_type)))
3777 != GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (rhs1_type))))
3779 error ("invalid mask type in vector permute expression");
3780 debug_generic_expr (lhs_type);
3781 debug_generic_expr (rhs1_type);
3782 debug_generic_expr (rhs2_type);
3783 debug_generic_expr (rhs3_type);
3784 return true;
3787 return false;
3789 case DOT_PROD_EXPR:
3790 case REALIGN_LOAD_EXPR:
3791 /* FIXME. */
3792 return false;
3794 default:
3795 gcc_unreachable ();
3797 return false;
3800 /* Verify a gimple assignment statement STMT with a single rhs.
3801 Returns true if anything is wrong. */
3803 static bool
3804 verify_gimple_assign_single (gimple stmt)
3806 enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
3807 tree lhs = gimple_assign_lhs (stmt);
3808 tree lhs_type = TREE_TYPE (lhs);
3809 tree rhs1 = gimple_assign_rhs1 (stmt);
3810 tree rhs1_type = TREE_TYPE (rhs1);
3811 bool res = false;
3813 if (!useless_type_conversion_p (lhs_type, rhs1_type))
3815 error ("non-trivial conversion at assignment");
3816 debug_generic_expr (lhs_type);
3817 debug_generic_expr (rhs1_type);
3818 return true;
3821 if (gimple_clobber_p (stmt)
3822 && !(DECL_P (lhs) || TREE_CODE (lhs) == MEM_REF))
3824 error ("non-decl/MEM_REF LHS in clobber statement");
3825 debug_generic_expr (lhs);
3826 return true;
3829 if (handled_component_p (lhs))
3830 res |= verify_types_in_gimple_reference (lhs, true);
3832 /* Special codes we cannot handle via their class. */
3833 switch (rhs_code)
3835 case ADDR_EXPR:
3837 tree op = TREE_OPERAND (rhs1, 0);
3838 if (!is_gimple_addressable (op))
3840 error ("invalid operand in unary expression");
3841 return true;
3844 /* Technically there is no longer a need for matching types, but
3845 gimple hygiene asks for this check. In LTO we can end up
3846 combining incompatible units and thus end up with addresses
3847 of globals that change their type to a common one. */
3848 if (!in_lto_p
3849 && !types_compatible_p (TREE_TYPE (op),
3850 TREE_TYPE (TREE_TYPE (rhs1)))
3851 && !one_pointer_to_useless_type_conversion_p (TREE_TYPE (rhs1),
3852 TREE_TYPE (op)))
3854 error ("type mismatch in address expression");
3855 debug_generic_stmt (TREE_TYPE (rhs1));
3856 debug_generic_stmt (TREE_TYPE (op));
3857 return true;
3860 return verify_types_in_gimple_reference (op, true);
3863 /* tcc_reference */
3864 case INDIRECT_REF:
3865 error ("INDIRECT_REF in gimple IL");
3866 return true;
3868 case COMPONENT_REF:
3869 case BIT_FIELD_REF:
3870 case ARRAY_REF:
3871 case ARRAY_RANGE_REF:
3872 case VIEW_CONVERT_EXPR:
3873 case REALPART_EXPR:
3874 case IMAGPART_EXPR:
3875 case TARGET_MEM_REF:
3876 case MEM_REF:
3877 if (!is_gimple_reg (lhs)
3878 && is_gimple_reg_type (TREE_TYPE (lhs)))
3880 error ("invalid rhs for gimple memory store");
3881 debug_generic_stmt (lhs);
3882 debug_generic_stmt (rhs1);
3883 return true;
3885 return res || verify_types_in_gimple_reference (rhs1, false);
3887 /* tcc_constant */
3888 case SSA_NAME:
3889 case INTEGER_CST:
3890 case REAL_CST:
3891 case FIXED_CST:
3892 case COMPLEX_CST:
3893 case VECTOR_CST:
3894 case STRING_CST:
3895 return res;
3897 /* tcc_declaration */
3898 case CONST_DECL:
3899 return res;
3900 case VAR_DECL:
3901 case PARM_DECL:
3902 if (!is_gimple_reg (lhs)
3903 && !is_gimple_reg (rhs1)
3904 && is_gimple_reg_type (TREE_TYPE (lhs)))
3906 error ("invalid rhs for gimple memory store");
3907 debug_generic_stmt (lhs);
3908 debug_generic_stmt (rhs1);
3909 return true;
3911 return res;
3913 case CONSTRUCTOR:
3914 if (TREE_CODE (rhs1_type) == VECTOR_TYPE)
3916 unsigned int i;
3917 tree elt_i, elt_v, elt_t = NULL_TREE;
3919 if (CONSTRUCTOR_NELTS (rhs1) == 0)
3920 return res;
3921 /* For vector CONSTRUCTORs we require that either it is empty
3922 CONSTRUCTOR, or it is a CONSTRUCTOR of smaller vector elements
3923 (then the element count must be correct to cover the whole
3924 outer vector and index must be NULL on all elements, or it is
3925 a CONSTRUCTOR of scalar elements, where we as an exception allow
3926 smaller number of elements (assuming zero filling) and
3927 consecutive indexes as compared to NULL indexes (such
3928 CONSTRUCTORs can appear in the IL from FEs). */
3929 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (rhs1), i, elt_i, elt_v)
3931 if (elt_t == NULL_TREE)
3933 elt_t = TREE_TYPE (elt_v);
3934 if (TREE_CODE (elt_t) == VECTOR_TYPE)
3936 tree elt_t = TREE_TYPE (elt_v);
3937 if (!useless_type_conversion_p (TREE_TYPE (rhs1_type),
3938 TREE_TYPE (elt_t)))
3940 error ("incorrect type of vector CONSTRUCTOR"
3941 " elements");
3942 debug_generic_stmt (rhs1);
3943 return true;
3945 else if (CONSTRUCTOR_NELTS (rhs1)
3946 * TYPE_VECTOR_SUBPARTS (elt_t)
3947 != TYPE_VECTOR_SUBPARTS (rhs1_type))
3949 error ("incorrect number of vector CONSTRUCTOR"
3950 " elements");
3951 debug_generic_stmt (rhs1);
3952 return true;
3955 else if (!useless_type_conversion_p (TREE_TYPE (rhs1_type),
3956 elt_t))
3958 error ("incorrect type of vector CONSTRUCTOR elements");
3959 debug_generic_stmt (rhs1);
3960 return true;
3962 else if (CONSTRUCTOR_NELTS (rhs1)
3963 > TYPE_VECTOR_SUBPARTS (rhs1_type))
3965 error ("incorrect number of vector CONSTRUCTOR elements");
3966 debug_generic_stmt (rhs1);
3967 return true;
3970 else if (!useless_type_conversion_p (elt_t, TREE_TYPE (elt_v)))
3972 error ("incorrect type of vector CONSTRUCTOR elements");
3973 debug_generic_stmt (rhs1);
3974 return true;
3976 if (elt_i != NULL_TREE
3977 && (TREE_CODE (elt_t) == VECTOR_TYPE
3978 || TREE_CODE (elt_i) != INTEGER_CST
3979 || compare_tree_int (elt_i, i) != 0))
3981 error ("vector CONSTRUCTOR with non-NULL element index");
3982 debug_generic_stmt (rhs1);
3983 return true;
3987 return res;
3988 case OBJ_TYPE_REF:
3989 case ASSERT_EXPR:
3990 case WITH_SIZE_EXPR:
3991 /* FIXME. */
3992 return res;
3994 default:;
3997 return res;
4000 /* Verify the contents of a GIMPLE_ASSIGN STMT. Returns true when there
4001 is a problem, otherwise false. */
4003 static bool
4004 verify_gimple_assign (gimple stmt)
4006 switch (gimple_assign_rhs_class (stmt))
4008 case GIMPLE_SINGLE_RHS:
4009 return verify_gimple_assign_single (stmt);
4011 case GIMPLE_UNARY_RHS:
4012 return verify_gimple_assign_unary (stmt);
4014 case GIMPLE_BINARY_RHS:
4015 return verify_gimple_assign_binary (stmt);
4017 case GIMPLE_TERNARY_RHS:
4018 return verify_gimple_assign_ternary (stmt);
4020 default:
4021 gcc_unreachable ();
4025 /* Verify the contents of a GIMPLE_RETURN STMT. Returns true when there
4026 is a problem, otherwise false. */
4028 static bool
4029 verify_gimple_return (gimple stmt)
4031 tree op = gimple_return_retval (stmt);
4032 tree restype = TREE_TYPE (TREE_TYPE (cfun->decl));
4034 /* We cannot test for present return values as we do not fix up missing
4035 return values from the original source. */
4036 if (op == NULL)
4037 return false;
4039 if (!is_gimple_val (op)
4040 && TREE_CODE (op) != RESULT_DECL)
4042 error ("invalid operand in return statement");
4043 debug_generic_stmt (op);
4044 return true;
4047 if ((TREE_CODE (op) == RESULT_DECL
4048 && DECL_BY_REFERENCE (op))
4049 || (TREE_CODE (op) == SSA_NAME
4050 && SSA_NAME_VAR (op)
4051 && TREE_CODE (SSA_NAME_VAR (op)) == RESULT_DECL
4052 && DECL_BY_REFERENCE (SSA_NAME_VAR (op))))
4053 op = TREE_TYPE (op);
4055 if (!useless_type_conversion_p (restype, TREE_TYPE (op)))
4057 error ("invalid conversion in return statement");
4058 debug_generic_stmt (restype);
4059 debug_generic_stmt (TREE_TYPE (op));
4060 return true;
4063 return false;
4067 /* Verify the contents of a GIMPLE_GOTO STMT. Returns true when there
4068 is a problem, otherwise false. */
4070 static bool
4071 verify_gimple_goto (gimple stmt)
4073 tree dest = gimple_goto_dest (stmt);
4075 /* ??? We have two canonical forms of direct goto destinations, a
4076 bare LABEL_DECL and an ADDR_EXPR of a LABEL_DECL. */
4077 if (TREE_CODE (dest) != LABEL_DECL
4078 && (!is_gimple_val (dest)
4079 || !POINTER_TYPE_P (TREE_TYPE (dest))))
4081 error ("goto destination is neither a label nor a pointer");
4082 return true;
4085 return false;
4088 /* Verify the contents of a GIMPLE_SWITCH STMT. Returns true when there
4089 is a problem, otherwise false. */
4091 static bool
4092 verify_gimple_switch (gimple stmt)
4094 unsigned int i, n;
4095 tree elt, prev_upper_bound = NULL_TREE;
4096 tree index_type, elt_type = NULL_TREE;
4098 if (!is_gimple_val (gimple_switch_index (stmt)))
4100 error ("invalid operand to switch statement");
4101 debug_generic_stmt (gimple_switch_index (stmt));
4102 return true;
4105 index_type = TREE_TYPE (gimple_switch_index (stmt));
4106 if (! INTEGRAL_TYPE_P (index_type))
4108 error ("non-integral type switch statement");
4109 debug_generic_expr (index_type);
4110 return true;
4113 elt = gimple_switch_label (stmt, 0);
4114 if (CASE_LOW (elt) != NULL_TREE || CASE_HIGH (elt) != NULL_TREE)
4116 error ("invalid default case label in switch statement");
4117 debug_generic_expr (elt);
4118 return true;
4121 n = gimple_switch_num_labels (stmt);
4122 for (i = 1; i < n; i++)
4124 elt = gimple_switch_label (stmt, i);
4126 if (! CASE_LOW (elt))
4128 error ("invalid case label in switch statement");
4129 debug_generic_expr (elt);
4130 return true;
4132 if (CASE_HIGH (elt)
4133 && ! tree_int_cst_lt (CASE_LOW (elt), CASE_HIGH (elt)))
4135 error ("invalid case range in switch statement");
4136 debug_generic_expr (elt);
4137 return true;
4140 if (elt_type)
4142 if (TREE_TYPE (CASE_LOW (elt)) != elt_type
4143 || (CASE_HIGH (elt) && TREE_TYPE (CASE_HIGH (elt)) != elt_type))
4145 error ("type mismatch for case label in switch statement");
4146 debug_generic_expr (elt);
4147 return true;
4150 else
4152 elt_type = TREE_TYPE (CASE_LOW (elt));
4153 if (TYPE_PRECISION (index_type) < TYPE_PRECISION (elt_type))
4155 error ("type precision mismatch in switch statement");
4156 return true;
4160 if (prev_upper_bound)
4162 if (! tree_int_cst_lt (prev_upper_bound, CASE_LOW (elt)))
4164 error ("case labels not sorted in switch statement");
4165 return true;
4169 prev_upper_bound = CASE_HIGH (elt);
4170 if (! prev_upper_bound)
4171 prev_upper_bound = CASE_LOW (elt);
4174 return false;
4177 /* Verify a gimple debug statement STMT.
4178 Returns true if anything is wrong. */
4180 static bool
4181 verify_gimple_debug (gimple stmt ATTRIBUTE_UNUSED)
4183 /* There isn't much that could be wrong in a gimple debug stmt. A
4184 gimple debug bind stmt, for example, maps a tree, that's usually
4185 a VAR_DECL or a PARM_DECL, but that could also be some scalarized
4186 component or member of an aggregate type, to another tree, that
4187 can be an arbitrary expression. These stmts expand into debug
4188 insns, and are converted to debug notes by var-tracking.c. */
4189 return false;
4192 /* Verify a gimple label statement STMT.
4193 Returns true if anything is wrong. */
4195 static bool
4196 verify_gimple_label (gimple stmt)
4198 tree decl = gimple_label_label (stmt);
4199 int uid;
4200 bool err = false;
4202 if (TREE_CODE (decl) != LABEL_DECL)
4203 return true;
4204 if (!DECL_NONLOCAL (decl) && !FORCED_LABEL (decl)
4205 && DECL_CONTEXT (decl) != current_function_decl)
4207 error ("label's context is not the current function decl");
4208 err |= true;
4211 uid = LABEL_DECL_UID (decl);
4212 if (cfun->cfg
4213 && (uid == -1 || (*label_to_block_map)[uid] != gimple_bb (stmt)))
4215 error ("incorrect entry in label_to_block_map");
4216 err |= true;
4219 uid = EH_LANDING_PAD_NR (decl);
4220 if (uid)
4222 eh_landing_pad lp = get_eh_landing_pad_from_number (uid);
4223 if (decl != lp->post_landing_pad)
4225 error ("incorrect setting of landing pad number");
4226 err |= true;
4230 return err;
4233 /* Verify the GIMPLE statement STMT. Returns true if there is an
4234 error, otherwise false. */
4236 static bool
4237 verify_gimple_stmt (gimple stmt)
4239 switch (gimple_code (stmt))
4241 case GIMPLE_ASSIGN:
4242 return verify_gimple_assign (stmt);
4244 case GIMPLE_LABEL:
4245 return verify_gimple_label (stmt);
4247 case GIMPLE_CALL:
4248 return verify_gimple_call (stmt);
4250 case GIMPLE_COND:
4251 if (TREE_CODE_CLASS (gimple_cond_code (stmt)) != tcc_comparison)
4253 error ("invalid comparison code in gimple cond");
4254 return true;
4256 if (!(!gimple_cond_true_label (stmt)
4257 || TREE_CODE (gimple_cond_true_label (stmt)) == LABEL_DECL)
4258 || !(!gimple_cond_false_label (stmt)
4259 || TREE_CODE (gimple_cond_false_label (stmt)) == LABEL_DECL))
4261 error ("invalid labels in gimple cond");
4262 return true;
4265 return verify_gimple_comparison (boolean_type_node,
4266 gimple_cond_lhs (stmt),
4267 gimple_cond_rhs (stmt));
4269 case GIMPLE_GOTO:
4270 return verify_gimple_goto (stmt);
4272 case GIMPLE_SWITCH:
4273 return verify_gimple_switch (stmt);
4275 case GIMPLE_RETURN:
4276 return verify_gimple_return (stmt);
4278 case GIMPLE_ASM:
4279 return false;
4281 case GIMPLE_TRANSACTION:
4282 return verify_gimple_transaction (stmt);
4284 /* Tuples that do not have tree operands. */
4285 case GIMPLE_NOP:
4286 case GIMPLE_PREDICT:
4287 case GIMPLE_RESX:
4288 case GIMPLE_EH_DISPATCH:
4289 case GIMPLE_EH_MUST_NOT_THROW:
4290 return false;
4292 CASE_GIMPLE_OMP:
4293 /* OpenMP directives are validated by the FE and never operated
4294 on by the optimizers. Furthermore, GIMPLE_OMP_FOR may contain
4295 non-gimple expressions when the main index variable has had
4296 its address taken. This does not affect the loop itself
4297 because the header of an GIMPLE_OMP_FOR is merely used to determine
4298 how to setup the parallel iteration. */
4299 return false;
4301 case GIMPLE_DEBUG:
4302 return verify_gimple_debug (stmt);
4304 default:
4305 gcc_unreachable ();
4309 /* Verify the contents of a GIMPLE_PHI. Returns true if there is a problem,
4310 and false otherwise. */
4312 static bool
4313 verify_gimple_phi (gimple phi)
4315 bool err = false;
4316 unsigned i;
4317 tree phi_result = gimple_phi_result (phi);
4318 bool virtual_p;
4320 if (!phi_result)
4322 error ("invalid PHI result");
4323 return true;
4326 virtual_p = virtual_operand_p (phi_result);
4327 if (TREE_CODE (phi_result) != SSA_NAME
4328 || (virtual_p
4329 && SSA_NAME_VAR (phi_result) != gimple_vop (cfun)))
4331 error ("invalid PHI result");
4332 err = true;
4335 for (i = 0; i < gimple_phi_num_args (phi); i++)
4337 tree t = gimple_phi_arg_def (phi, i);
4339 if (!t)
4341 error ("missing PHI def");
4342 err |= true;
4343 continue;
4345 /* Addressable variables do have SSA_NAMEs but they
4346 are not considered gimple values. */
4347 else if ((TREE_CODE (t) == SSA_NAME
4348 && virtual_p != virtual_operand_p (t))
4349 || (virtual_p
4350 && (TREE_CODE (t) != SSA_NAME
4351 || SSA_NAME_VAR (t) != gimple_vop (cfun)))
4352 || (!virtual_p
4353 && !is_gimple_val (t)))
4355 error ("invalid PHI argument");
4356 debug_generic_expr (t);
4357 err |= true;
4359 #ifdef ENABLE_TYPES_CHECKING
4360 if (!useless_type_conversion_p (TREE_TYPE (phi_result), TREE_TYPE (t)))
4362 error ("incompatible types in PHI argument %u", i);
4363 debug_generic_stmt (TREE_TYPE (phi_result));
4364 debug_generic_stmt (TREE_TYPE (t));
4365 err |= true;
4367 #endif
4370 return err;
4373 /* Verify the GIMPLE statements inside the sequence STMTS. */
4375 static bool
4376 verify_gimple_in_seq_2 (gimple_seq stmts)
4378 gimple_stmt_iterator ittr;
4379 bool err = false;
4381 for (ittr = gsi_start (stmts); !gsi_end_p (ittr); gsi_next (&ittr))
4383 gimple stmt = gsi_stmt (ittr);
4385 switch (gimple_code (stmt))
4387 case GIMPLE_BIND:
4388 err |= verify_gimple_in_seq_2 (gimple_bind_body (stmt));
4389 break;
4391 case GIMPLE_TRY:
4392 err |= verify_gimple_in_seq_2 (gimple_try_eval (stmt));
4393 err |= verify_gimple_in_seq_2 (gimple_try_cleanup (stmt));
4394 break;
4396 case GIMPLE_EH_FILTER:
4397 err |= verify_gimple_in_seq_2 (gimple_eh_filter_failure (stmt));
4398 break;
4400 case GIMPLE_EH_ELSE:
4401 err |= verify_gimple_in_seq_2 (gimple_eh_else_n_body (stmt));
4402 err |= verify_gimple_in_seq_2 (gimple_eh_else_e_body (stmt));
4403 break;
4405 case GIMPLE_CATCH:
4406 err |= verify_gimple_in_seq_2 (gimple_catch_handler (stmt));
4407 break;
4409 case GIMPLE_TRANSACTION:
4410 err |= verify_gimple_transaction (stmt);
4411 break;
4413 default:
4415 bool err2 = verify_gimple_stmt (stmt);
4416 if (err2)
4417 debug_gimple_stmt (stmt);
4418 err |= err2;
4423 return err;
4426 /* Verify the contents of a GIMPLE_TRANSACTION. Returns true if there
4427 is a problem, otherwise false. */
4429 static bool
4430 verify_gimple_transaction (gimple stmt)
4432 tree lab = gimple_transaction_label (stmt);
4433 if (lab != NULL && TREE_CODE (lab) != LABEL_DECL)
4434 return true;
4435 return verify_gimple_in_seq_2 (gimple_transaction_body (stmt));
4439 /* Verify the GIMPLE statements inside the statement list STMTS. */
4441 DEBUG_FUNCTION void
4442 verify_gimple_in_seq (gimple_seq stmts)
4444 timevar_push (TV_TREE_STMT_VERIFY);
4445 if (verify_gimple_in_seq_2 (stmts))
4446 internal_error ("verify_gimple failed");
4447 timevar_pop (TV_TREE_STMT_VERIFY);
4450 /* Return true when the T can be shared. */
4452 static bool
4453 tree_node_can_be_shared (tree t)
4455 if (IS_TYPE_OR_DECL_P (t)
4456 || is_gimple_min_invariant (t)
4457 || TREE_CODE (t) == SSA_NAME
4458 || t == error_mark_node
4459 || TREE_CODE (t) == IDENTIFIER_NODE)
4460 return true;
4462 if (TREE_CODE (t) == CASE_LABEL_EXPR)
4463 return true;
4465 if (DECL_P (t))
4466 return true;
4468 return false;
4471 /* Called via walk_tree. Verify tree sharing. */
4473 static tree
4474 verify_node_sharing_1 (tree *tp, int *walk_subtrees, void *data)
4476 struct pointer_set_t *visited = (struct pointer_set_t *) data;
4478 if (tree_node_can_be_shared (*tp))
4480 *walk_subtrees = false;
4481 return NULL;
4484 if (pointer_set_insert (visited, *tp))
4485 return *tp;
4487 return NULL;
4490 /* Called via walk_gimple_stmt. Verify tree sharing. */
4492 static tree
4493 verify_node_sharing (tree *tp, int *walk_subtrees, void *data)
4495 struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
4496 return verify_node_sharing_1 (tp, walk_subtrees, wi->info);
4499 static bool eh_error_found;
4500 static int
4501 verify_eh_throw_stmt_node (void **slot, void *data)
4503 struct throw_stmt_node *node = (struct throw_stmt_node *)*slot;
4504 struct pointer_set_t *visited = (struct pointer_set_t *) data;
4506 if (!pointer_set_contains (visited, node->stmt))
4508 error ("dead STMT in EH table");
4509 debug_gimple_stmt (node->stmt);
4510 eh_error_found = true;
4512 return 1;
4515 /* Verify if the location LOCs block is in BLOCKS. */
4517 static bool
4518 verify_location (pointer_set_t *blocks, location_t loc)
4520 tree block = LOCATION_BLOCK (loc);
4521 if (block != NULL_TREE
4522 && !pointer_set_contains (blocks, block))
4524 error ("location references block not in block tree");
4525 return true;
4527 if (block != NULL_TREE)
4528 return verify_location (blocks, BLOCK_SOURCE_LOCATION (block));
4529 return false;
4532 /* Called via walk_tree. Verify that expressions have no blocks. */
4534 static tree
4535 verify_expr_no_block (tree *tp, int *walk_subtrees, void *)
4537 if (!EXPR_P (*tp))
4539 *walk_subtrees = false;
4540 return NULL;
4543 location_t loc = EXPR_LOCATION (*tp);
4544 if (LOCATION_BLOCK (loc) != NULL)
4545 return *tp;
4547 return NULL;
4550 /* Called via walk_tree. Verify locations of expressions. */
4552 static tree
4553 verify_expr_location_1 (tree *tp, int *walk_subtrees, void *data)
4555 struct pointer_set_t *blocks = (struct pointer_set_t *) data;
4557 if (TREE_CODE (*tp) == VAR_DECL
4558 && DECL_HAS_DEBUG_EXPR_P (*tp))
4560 tree t = DECL_DEBUG_EXPR (*tp);
4561 tree addr = walk_tree (&t, verify_expr_no_block, NULL, NULL);
4562 if (addr)
4563 return addr;
4565 if ((TREE_CODE (*tp) == VAR_DECL
4566 || TREE_CODE (*tp) == PARM_DECL
4567 || TREE_CODE (*tp) == RESULT_DECL)
4568 && DECL_HAS_VALUE_EXPR_P (*tp))
4570 tree t = DECL_VALUE_EXPR (*tp);
4571 tree addr = walk_tree (&t, verify_expr_no_block, NULL, NULL);
4572 if (addr)
4573 return addr;
4576 if (!EXPR_P (*tp))
4578 *walk_subtrees = false;
4579 return NULL;
4582 location_t loc = EXPR_LOCATION (*tp);
4583 if (verify_location (blocks, loc))
4584 return *tp;
4586 return NULL;
4589 /* Called via walk_gimple_op. Verify locations of expressions. */
4591 static tree
4592 verify_expr_location (tree *tp, int *walk_subtrees, void *data)
4594 struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
4595 return verify_expr_location_1 (tp, walk_subtrees, wi->info);
4598 /* Insert all subblocks of BLOCK into BLOCKS and recurse. */
4600 static void
4601 collect_subblocks (pointer_set_t *blocks, tree block)
4603 tree t;
4604 for (t = BLOCK_SUBBLOCKS (block); t; t = BLOCK_CHAIN (t))
4606 pointer_set_insert (blocks, t);
4607 collect_subblocks (blocks, t);
4611 /* Verify the GIMPLE statements in the CFG of FN. */
4613 DEBUG_FUNCTION void
4614 verify_gimple_in_cfg (struct function *fn)
4616 basic_block bb;
4617 bool err = false;
4618 struct pointer_set_t *visited, *visited_stmts, *blocks;
4620 timevar_push (TV_TREE_STMT_VERIFY);
4621 visited = pointer_set_create ();
4622 visited_stmts = pointer_set_create ();
4624 /* Collect all BLOCKs referenced by the BLOCK tree of FN. */
4625 blocks = pointer_set_create ();
4626 if (DECL_INITIAL (fn->decl))
4628 pointer_set_insert (blocks, DECL_INITIAL (fn->decl));
4629 collect_subblocks (blocks, DECL_INITIAL (fn->decl));
4632 FOR_EACH_BB_FN (bb, fn)
4634 gimple_stmt_iterator gsi;
4636 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
4638 gimple phi = gsi_stmt (gsi);
4639 bool err2 = false;
4640 unsigned i;
4642 pointer_set_insert (visited_stmts, phi);
4644 if (gimple_bb (phi) != bb)
4646 error ("gimple_bb (phi) is set to a wrong basic block");
4647 err2 = true;
4650 err2 |= verify_gimple_phi (phi);
4652 /* Only PHI arguments have locations. */
4653 if (gimple_location (phi) != UNKNOWN_LOCATION)
4655 error ("PHI node with location");
4656 err2 = true;
4659 for (i = 0; i < gimple_phi_num_args (phi); i++)
4661 tree arg = gimple_phi_arg_def (phi, i);
4662 tree addr = walk_tree (&arg, verify_node_sharing_1,
4663 visited, NULL);
4664 if (addr)
4666 error ("incorrect sharing of tree nodes");
4667 debug_generic_expr (addr);
4668 err2 |= true;
4670 location_t loc = gimple_phi_arg_location (phi, i);
4671 if (virtual_operand_p (gimple_phi_result (phi))
4672 && loc != UNKNOWN_LOCATION)
4674 error ("virtual PHI with argument locations");
4675 err2 = true;
4677 addr = walk_tree (&arg, verify_expr_location_1, blocks, NULL);
4678 if (addr)
4680 debug_generic_expr (addr);
4681 err2 = true;
4683 err2 |= verify_location (blocks, loc);
4686 if (err2)
4687 debug_gimple_stmt (phi);
4688 err |= err2;
4691 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
4693 gimple stmt = gsi_stmt (gsi);
4694 bool err2 = false;
4695 struct walk_stmt_info wi;
4696 tree addr;
4697 int lp_nr;
4699 pointer_set_insert (visited_stmts, stmt);
4701 if (gimple_bb (stmt) != bb)
4703 error ("gimple_bb (stmt) is set to a wrong basic block");
4704 err2 = true;
4707 err2 |= verify_gimple_stmt (stmt);
4708 err2 |= verify_location (blocks, gimple_location (stmt));
4710 memset (&wi, 0, sizeof (wi));
4711 wi.info = (void *) visited;
4712 addr = walk_gimple_op (stmt, verify_node_sharing, &wi);
4713 if (addr)
4715 error ("incorrect sharing of tree nodes");
4716 debug_generic_expr (addr);
4717 err2 |= true;
4720 memset (&wi, 0, sizeof (wi));
4721 wi.info = (void *) blocks;
4722 addr = walk_gimple_op (stmt, verify_expr_location, &wi);
4723 if (addr)
4725 debug_generic_expr (addr);
4726 err2 |= true;
4729 /* ??? Instead of not checking these stmts at all the walker
4730 should know its context via wi. */
4731 if (!is_gimple_debug (stmt)
4732 && !is_gimple_omp (stmt))
4734 memset (&wi, 0, sizeof (wi));
4735 addr = walk_gimple_op (stmt, verify_expr, &wi);
4736 if (addr)
4738 debug_generic_expr (addr);
4739 inform (gimple_location (stmt), "in statement");
4740 err2 |= true;
4744 /* If the statement is marked as part of an EH region, then it is
4745 expected that the statement could throw. Verify that when we
4746 have optimizations that simplify statements such that we prove
4747 that they cannot throw, that we update other data structures
4748 to match. */
4749 lp_nr = lookup_stmt_eh_lp (stmt);
4750 if (lp_nr != 0)
4752 if (!stmt_could_throw_p (stmt))
4754 error ("statement marked for throw, but doesn%'t");
4755 err2 |= true;
4757 else if (lp_nr > 0
4758 && !gsi_one_before_end_p (gsi)
4759 && stmt_can_throw_internal (stmt))
4761 error ("statement marked for throw in middle of block");
4762 err2 |= true;
4766 if (err2)
4767 debug_gimple_stmt (stmt);
4768 err |= err2;
4772 eh_error_found = false;
4773 if (get_eh_throw_stmt_table (cfun))
4774 htab_traverse (get_eh_throw_stmt_table (cfun),
4775 verify_eh_throw_stmt_node,
4776 visited_stmts);
4778 if (err || eh_error_found)
4779 internal_error ("verify_gimple failed");
4781 pointer_set_destroy (visited);
4782 pointer_set_destroy (visited_stmts);
4783 pointer_set_destroy (blocks);
4784 verify_histograms ();
4785 timevar_pop (TV_TREE_STMT_VERIFY);
4789 /* Verifies that the flow information is OK. */
4791 static int
4792 gimple_verify_flow_info (void)
4794 int err = 0;
4795 basic_block bb;
4796 gimple_stmt_iterator gsi;
4797 gimple stmt;
4798 edge e;
4799 edge_iterator ei;
4801 if (ENTRY_BLOCK_PTR->il.gimple.seq || ENTRY_BLOCK_PTR->il.gimple.phi_nodes)
4803 error ("ENTRY_BLOCK has IL associated with it");
4804 err = 1;
4807 if (EXIT_BLOCK_PTR->il.gimple.seq || EXIT_BLOCK_PTR->il.gimple.phi_nodes)
4809 error ("EXIT_BLOCK has IL associated with it");
4810 err = 1;
4813 FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
4814 if (e->flags & EDGE_FALLTHRU)
4816 error ("fallthru to exit from bb %d", e->src->index);
4817 err = 1;
4820 FOR_EACH_BB (bb)
4822 bool found_ctrl_stmt = false;
4824 stmt = NULL;
4826 /* Skip labels on the start of basic block. */
4827 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
4829 tree label;
4830 gimple prev_stmt = stmt;
4832 stmt = gsi_stmt (gsi);
4834 if (gimple_code (stmt) != GIMPLE_LABEL)
4835 break;
4837 label = gimple_label_label (stmt);
4838 if (prev_stmt && DECL_NONLOCAL (label))
4840 error ("nonlocal label ");
4841 print_generic_expr (stderr, label, 0);
4842 fprintf (stderr, " is not first in a sequence of labels in bb %d",
4843 bb->index);
4844 err = 1;
4847 if (prev_stmt && EH_LANDING_PAD_NR (label) != 0)
4849 error ("EH landing pad label ");
4850 print_generic_expr (stderr, label, 0);
4851 fprintf (stderr, " is not first in a sequence of labels in bb %d",
4852 bb->index);
4853 err = 1;
4856 if (label_to_block (label) != bb)
4858 error ("label ");
4859 print_generic_expr (stderr, label, 0);
4860 fprintf (stderr, " to block does not match in bb %d",
4861 bb->index);
4862 err = 1;
4865 if (decl_function_context (label) != current_function_decl)
4867 error ("label ");
4868 print_generic_expr (stderr, label, 0);
4869 fprintf (stderr, " has incorrect context in bb %d",
4870 bb->index);
4871 err = 1;
4875 /* Verify that body of basic block BB is free of control flow. */
4876 for (; !gsi_end_p (gsi); gsi_next (&gsi))
4878 gimple stmt = gsi_stmt (gsi);
4880 if (found_ctrl_stmt)
4882 error ("control flow in the middle of basic block %d",
4883 bb->index);
4884 err = 1;
4887 if (stmt_ends_bb_p (stmt))
4888 found_ctrl_stmt = true;
4890 if (gimple_code (stmt) == GIMPLE_LABEL)
4892 error ("label ");
4893 print_generic_expr (stderr, gimple_label_label (stmt), 0);
4894 fprintf (stderr, " in the middle of basic block %d", bb->index);
4895 err = 1;
4899 gsi = gsi_last_bb (bb);
4900 if (gsi_end_p (gsi))
4901 continue;
4903 stmt = gsi_stmt (gsi);
4905 if (gimple_code (stmt) == GIMPLE_LABEL)
4906 continue;
4908 err |= verify_eh_edges (stmt);
4910 if (is_ctrl_stmt (stmt))
4912 FOR_EACH_EDGE (e, ei, bb->succs)
4913 if (e->flags & EDGE_FALLTHRU)
4915 error ("fallthru edge after a control statement in bb %d",
4916 bb->index);
4917 err = 1;
4921 if (gimple_code (stmt) != GIMPLE_COND)
4923 /* Verify that there are no edges with EDGE_TRUE/FALSE_FLAG set
4924 after anything else but if statement. */
4925 FOR_EACH_EDGE (e, ei, bb->succs)
4926 if (e->flags & (EDGE_TRUE_VALUE | EDGE_FALSE_VALUE))
4928 error ("true/false edge after a non-GIMPLE_COND in bb %d",
4929 bb->index);
4930 err = 1;
4934 switch (gimple_code (stmt))
4936 case GIMPLE_COND:
4938 edge true_edge;
4939 edge false_edge;
4941 extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
4943 if (!true_edge
4944 || !false_edge
4945 || !(true_edge->flags & EDGE_TRUE_VALUE)
4946 || !(false_edge->flags & EDGE_FALSE_VALUE)
4947 || (true_edge->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL))
4948 || (false_edge->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL))
4949 || EDGE_COUNT (bb->succs) >= 3)
4951 error ("wrong outgoing edge flags at end of bb %d",
4952 bb->index);
4953 err = 1;
4956 break;
4958 case GIMPLE_GOTO:
4959 if (simple_goto_p (stmt))
4961 error ("explicit goto at end of bb %d", bb->index);
4962 err = 1;
4964 else
4966 /* FIXME. We should double check that the labels in the
4967 destination blocks have their address taken. */
4968 FOR_EACH_EDGE (e, ei, bb->succs)
4969 if ((e->flags & (EDGE_FALLTHRU | EDGE_TRUE_VALUE
4970 | EDGE_FALSE_VALUE))
4971 || !(e->flags & EDGE_ABNORMAL))
4973 error ("wrong outgoing edge flags at end of bb %d",
4974 bb->index);
4975 err = 1;
4978 break;
4980 case GIMPLE_CALL:
4981 if (!gimple_call_builtin_p (stmt, BUILT_IN_RETURN))
4982 break;
4983 /* ... fallthru ... */
4984 case GIMPLE_RETURN:
4985 if (!single_succ_p (bb)
4986 || (single_succ_edge (bb)->flags
4987 & (EDGE_FALLTHRU | EDGE_ABNORMAL
4988 | EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
4990 error ("wrong outgoing edge flags at end of bb %d", bb->index);
4991 err = 1;
4993 if (single_succ (bb) != EXIT_BLOCK_PTR)
4995 error ("return edge does not point to exit in bb %d",
4996 bb->index);
4997 err = 1;
4999 break;
5001 case GIMPLE_SWITCH:
5003 tree prev;
5004 edge e;
5005 size_t i, n;
5007 n = gimple_switch_num_labels (stmt);
5009 /* Mark all the destination basic blocks. */
5010 for (i = 0; i < n; ++i)
5012 tree lab = CASE_LABEL (gimple_switch_label (stmt, i));
5013 basic_block label_bb = label_to_block (lab);
5014 gcc_assert (!label_bb->aux || label_bb->aux == (void *)1);
5015 label_bb->aux = (void *)1;
5018 /* Verify that the case labels are sorted. */
5019 prev = gimple_switch_label (stmt, 0);
5020 for (i = 1; i < n; ++i)
5022 tree c = gimple_switch_label (stmt, i);
5023 if (!CASE_LOW (c))
5025 error ("found default case not at the start of "
5026 "case vector");
5027 err = 1;
5028 continue;
5030 if (CASE_LOW (prev)
5031 && !tree_int_cst_lt (CASE_LOW (prev), CASE_LOW (c)))
5033 error ("case labels not sorted: ");
5034 print_generic_expr (stderr, prev, 0);
5035 fprintf (stderr," is greater than ");
5036 print_generic_expr (stderr, c, 0);
5037 fprintf (stderr," but comes before it.\n");
5038 err = 1;
5040 prev = c;
5042 /* VRP will remove the default case if it can prove it will
5043 never be executed. So do not verify there always exists
5044 a default case here. */
5046 FOR_EACH_EDGE (e, ei, bb->succs)
5048 if (!e->dest->aux)
5050 error ("extra outgoing edge %d->%d",
5051 bb->index, e->dest->index);
5052 err = 1;
5055 e->dest->aux = (void *)2;
5056 if ((e->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL
5057 | EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
5059 error ("wrong outgoing edge flags at end of bb %d",
5060 bb->index);
5061 err = 1;
5065 /* Check that we have all of them. */
5066 for (i = 0; i < n; ++i)
5068 tree lab = CASE_LABEL (gimple_switch_label (stmt, i));
5069 basic_block label_bb = label_to_block (lab);
5071 if (label_bb->aux != (void *)2)
5073 error ("missing edge %i->%i", bb->index, label_bb->index);
5074 err = 1;
5078 FOR_EACH_EDGE (e, ei, bb->succs)
5079 e->dest->aux = (void *)0;
5081 break;
5083 case GIMPLE_EH_DISPATCH:
5084 err |= verify_eh_dispatch_edge (stmt);
5085 break;
5087 default:
5088 break;
5092 if (dom_info_state (CDI_DOMINATORS) >= DOM_NO_FAST_QUERY)
5093 verify_dominators (CDI_DOMINATORS);
5095 return err;
5099 /* Updates phi nodes after creating a forwarder block joined
5100 by edge FALLTHRU. */
5102 static void
5103 gimple_make_forwarder_block (edge fallthru)
5105 edge e;
5106 edge_iterator ei;
5107 basic_block dummy, bb;
5108 tree var;
5109 gimple_stmt_iterator gsi;
5111 dummy = fallthru->src;
5112 bb = fallthru->dest;
5114 if (single_pred_p (bb))
5115 return;
5117 /* If we redirected a branch we must create new PHI nodes at the
5118 start of BB. */
5119 for (gsi = gsi_start_phis (dummy); !gsi_end_p (gsi); gsi_next (&gsi))
5121 gimple phi, new_phi;
5123 phi = gsi_stmt (gsi);
5124 var = gimple_phi_result (phi);
5125 new_phi = create_phi_node (var, bb);
5126 gimple_phi_set_result (phi, copy_ssa_name (var, phi));
5127 add_phi_arg (new_phi, gimple_phi_result (phi), fallthru,
5128 UNKNOWN_LOCATION);
5131 /* Add the arguments we have stored on edges. */
5132 FOR_EACH_EDGE (e, ei, bb->preds)
5134 if (e == fallthru)
5135 continue;
5137 flush_pending_stmts (e);
5142 /* Return a non-special label in the head of basic block BLOCK.
5143 Create one if it doesn't exist. */
5145 tree
5146 gimple_block_label (basic_block bb)
5148 gimple_stmt_iterator i, s = gsi_start_bb (bb);
5149 bool first = true;
5150 tree label;
5151 gimple stmt;
5153 for (i = s; !gsi_end_p (i); first = false, gsi_next (&i))
5155 stmt = gsi_stmt (i);
5156 if (gimple_code (stmt) != GIMPLE_LABEL)
5157 break;
5158 label = gimple_label_label (stmt);
5159 if (!DECL_NONLOCAL (label))
5161 if (!first)
5162 gsi_move_before (&i, &s);
5163 return label;
5167 label = create_artificial_label (UNKNOWN_LOCATION);
5168 stmt = gimple_build_label (label);
5169 gsi_insert_before (&s, stmt, GSI_NEW_STMT);
5170 return label;
5174 /* Attempt to perform edge redirection by replacing a possibly complex
5175 jump instruction by a goto or by removing the jump completely.
5176 This can apply only if all edges now point to the same block. The
5177 parameters and return values are equivalent to
5178 redirect_edge_and_branch. */
5180 static edge
5181 gimple_try_redirect_by_replacing_jump (edge e, basic_block target)
5183 basic_block src = e->src;
5184 gimple_stmt_iterator i;
5185 gimple stmt;
5187 /* We can replace or remove a complex jump only when we have exactly
5188 two edges. */
5189 if (EDGE_COUNT (src->succs) != 2
5190 /* Verify that all targets will be TARGET. Specifically, the
5191 edge that is not E must also go to TARGET. */
5192 || EDGE_SUCC (src, EDGE_SUCC (src, 0) == e)->dest != target)
5193 return NULL;
5195 i = gsi_last_bb (src);
5196 if (gsi_end_p (i))
5197 return NULL;
5199 stmt = gsi_stmt (i);
5201 if (gimple_code (stmt) == GIMPLE_COND || gimple_code (stmt) == GIMPLE_SWITCH)
5203 gsi_remove (&i, true);
5204 e = ssa_redirect_edge (e, target);
5205 e->flags = EDGE_FALLTHRU;
5206 return e;
5209 return NULL;
5213 /* Redirect E to DEST. Return NULL on failure. Otherwise, return the
5214 edge representing the redirected branch. */
5216 static edge
5217 gimple_redirect_edge_and_branch (edge e, basic_block dest)
5219 basic_block bb = e->src;
5220 gimple_stmt_iterator gsi;
5221 edge ret;
5222 gimple stmt;
5224 if (e->flags & EDGE_ABNORMAL)
5225 return NULL;
5227 if (e->dest == dest)
5228 return NULL;
5230 if (e->flags & EDGE_EH)
5231 return redirect_eh_edge (e, dest);
5233 if (e->src != ENTRY_BLOCK_PTR)
5235 ret = gimple_try_redirect_by_replacing_jump (e, dest);
5236 if (ret)
5237 return ret;
5240 gsi = gsi_last_bb (bb);
5241 stmt = gsi_end_p (gsi) ? NULL : gsi_stmt (gsi);
5243 switch (stmt ? gimple_code (stmt) : GIMPLE_ERROR_MARK)
5245 case GIMPLE_COND:
5246 /* For COND_EXPR, we only need to redirect the edge. */
5247 break;
5249 case GIMPLE_GOTO:
5250 /* No non-abnormal edges should lead from a non-simple goto, and
5251 simple ones should be represented implicitly. */
5252 gcc_unreachable ();
5254 case GIMPLE_SWITCH:
5256 tree label = gimple_block_label (dest);
5257 tree cases = get_cases_for_edge (e, stmt);
5259 /* If we have a list of cases associated with E, then use it
5260 as it's a lot faster than walking the entire case vector. */
5261 if (cases)
5263 edge e2 = find_edge (e->src, dest);
5264 tree last, first;
5266 first = cases;
5267 while (cases)
5269 last = cases;
5270 CASE_LABEL (cases) = label;
5271 cases = CASE_CHAIN (cases);
5274 /* If there was already an edge in the CFG, then we need
5275 to move all the cases associated with E to E2. */
5276 if (e2)
5278 tree cases2 = get_cases_for_edge (e2, stmt);
5280 CASE_CHAIN (last) = CASE_CHAIN (cases2);
5281 CASE_CHAIN (cases2) = first;
5283 bitmap_set_bit (touched_switch_bbs, gimple_bb (stmt)->index);
5285 else
5287 size_t i, n = gimple_switch_num_labels (stmt);
5289 for (i = 0; i < n; i++)
5291 tree elt = gimple_switch_label (stmt, i);
5292 if (label_to_block (CASE_LABEL (elt)) == e->dest)
5293 CASE_LABEL (elt) = label;
5297 break;
5299 case GIMPLE_ASM:
5301 int i, n = gimple_asm_nlabels (stmt);
5302 tree label = NULL;
5304 for (i = 0; i < n; ++i)
5306 tree cons = gimple_asm_label_op (stmt, i);
5307 if (label_to_block (TREE_VALUE (cons)) == e->dest)
5309 if (!label)
5310 label = gimple_block_label (dest);
5311 TREE_VALUE (cons) = label;
5315 /* If we didn't find any label matching the former edge in the
5316 asm labels, we must be redirecting the fallthrough
5317 edge. */
5318 gcc_assert (label || (e->flags & EDGE_FALLTHRU));
5320 break;
5322 case GIMPLE_RETURN:
5323 gsi_remove (&gsi, true);
5324 e->flags |= EDGE_FALLTHRU;
5325 break;
5327 case GIMPLE_OMP_RETURN:
5328 case GIMPLE_OMP_CONTINUE:
5329 case GIMPLE_OMP_SECTIONS_SWITCH:
5330 case GIMPLE_OMP_FOR:
5331 /* The edges from OMP constructs can be simply redirected. */
5332 break;
5334 case GIMPLE_EH_DISPATCH:
5335 if (!(e->flags & EDGE_FALLTHRU))
5336 redirect_eh_dispatch_edge (stmt, e, dest);
5337 break;
5339 case GIMPLE_TRANSACTION:
5340 /* The ABORT edge has a stored label associated with it, otherwise
5341 the edges are simply redirectable. */
5342 if (e->flags == 0)
5343 gimple_transaction_set_label (stmt, gimple_block_label (dest));
5344 break;
5346 default:
5347 /* Otherwise it must be a fallthru edge, and we don't need to
5348 do anything besides redirecting it. */
5349 gcc_assert (e->flags & EDGE_FALLTHRU);
5350 break;
5353 /* Update/insert PHI nodes as necessary. */
5355 /* Now update the edges in the CFG. */
5356 e = ssa_redirect_edge (e, dest);
5358 return e;
5361 /* Returns true if it is possible to remove edge E by redirecting
5362 it to the destination of the other edge from E->src. */
5364 static bool
5365 gimple_can_remove_branch_p (const_edge e)
5367 if (e->flags & (EDGE_ABNORMAL | EDGE_EH))
5368 return false;
5370 return true;
5373 /* Simple wrapper, as we can always redirect fallthru edges. */
5375 static basic_block
5376 gimple_redirect_edge_and_branch_force (edge e, basic_block dest)
5378 e = gimple_redirect_edge_and_branch (e, dest);
5379 gcc_assert (e);
5381 return NULL;
5385 /* Splits basic block BB after statement STMT (but at least after the
5386 labels). If STMT is NULL, BB is split just after the labels. */
5388 static basic_block
5389 gimple_split_block (basic_block bb, void *stmt)
5391 gimple_stmt_iterator gsi;
5392 gimple_stmt_iterator gsi_tgt;
5393 gimple act;
5394 gimple_seq list;
5395 basic_block new_bb;
5396 edge e;
5397 edge_iterator ei;
5399 new_bb = create_empty_bb (bb);
5401 /* Redirect the outgoing edges. */
5402 new_bb->succs = bb->succs;
5403 bb->succs = NULL;
5404 FOR_EACH_EDGE (e, ei, new_bb->succs)
5405 e->src = new_bb;
5407 if (stmt && gimple_code ((gimple) stmt) == GIMPLE_LABEL)
5408 stmt = NULL;
5410 /* Move everything from GSI to the new basic block. */
5411 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
5413 act = gsi_stmt (gsi);
5414 if (gimple_code (act) == GIMPLE_LABEL)
5415 continue;
5417 if (!stmt)
5418 break;
5420 if (stmt == act)
5422 gsi_next (&gsi);
5423 break;
5427 if (gsi_end_p (gsi))
5428 return new_bb;
5430 /* Split the statement list - avoid re-creating new containers as this
5431 brings ugly quadratic memory consumption in the inliner.
5432 (We are still quadratic since we need to update stmt BB pointers,
5433 sadly.) */
5434 gsi_split_seq_before (&gsi, &list);
5435 set_bb_seq (new_bb, list);
5436 for (gsi_tgt = gsi_start (list);
5437 !gsi_end_p (gsi_tgt); gsi_next (&gsi_tgt))
5438 gimple_set_bb (gsi_stmt (gsi_tgt), new_bb);
5440 return new_bb;
5444 /* Moves basic block BB after block AFTER. */
5446 static bool
5447 gimple_move_block_after (basic_block bb, basic_block after)
5449 if (bb->prev_bb == after)
5450 return true;
5452 unlink_block (bb);
5453 link_block (bb, after);
5455 return true;
5459 /* Return TRUE if block BB has no executable statements, otherwise return
5460 FALSE. */
5462 static bool
5463 gimple_empty_block_p (basic_block bb)
5465 /* BB must have no executable statements. */
5466 gimple_stmt_iterator gsi = gsi_after_labels (bb);
5467 if (phi_nodes (bb))
5468 return false;
5469 if (gsi_end_p (gsi))
5470 return true;
5471 if (is_gimple_debug (gsi_stmt (gsi)))
5472 gsi_next_nondebug (&gsi);
5473 return gsi_end_p (gsi);
5477 /* Split a basic block if it ends with a conditional branch and if the
5478 other part of the block is not empty. */
5480 static basic_block
5481 gimple_split_block_before_cond_jump (basic_block bb)
5483 gimple last, split_point;
5484 gimple_stmt_iterator gsi = gsi_last_nondebug_bb (bb);
5485 if (gsi_end_p (gsi))
5486 return NULL;
5487 last = gsi_stmt (gsi);
5488 if (gimple_code (last) != GIMPLE_COND
5489 && gimple_code (last) != GIMPLE_SWITCH)
5490 return NULL;
5491 gsi_prev_nondebug (&gsi);
5492 split_point = gsi_stmt (gsi);
5493 return split_block (bb, split_point)->dest;
5497 /* Return true if basic_block can be duplicated. */
5499 static bool
5500 gimple_can_duplicate_bb_p (const_basic_block bb ATTRIBUTE_UNUSED)
5502 return true;
5505 /* Create a duplicate of the basic block BB. NOTE: This does not
5506 preserve SSA form. */
5508 static basic_block
5509 gimple_duplicate_bb (basic_block bb)
5511 basic_block new_bb;
5512 gimple_stmt_iterator gsi, gsi_tgt;
5513 gimple_seq phis = phi_nodes (bb);
5514 gimple phi, stmt, copy;
5516 new_bb = create_empty_bb (EXIT_BLOCK_PTR->prev_bb);
5518 /* Copy the PHI nodes. We ignore PHI node arguments here because
5519 the incoming edges have not been setup yet. */
5520 for (gsi = gsi_start (phis); !gsi_end_p (gsi); gsi_next (&gsi))
5522 phi = gsi_stmt (gsi);
5523 copy = create_phi_node (NULL_TREE, new_bb);
5524 create_new_def_for (gimple_phi_result (phi), copy,
5525 gimple_phi_result_ptr (copy));
5526 gimple_set_uid (copy, gimple_uid (phi));
5529 gsi_tgt = gsi_start_bb (new_bb);
5530 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
5532 def_operand_p def_p;
5533 ssa_op_iter op_iter;
5534 tree lhs;
5536 stmt = gsi_stmt (gsi);
5537 if (gimple_code (stmt) == GIMPLE_LABEL)
5538 continue;
5540 /* Don't duplicate label debug stmts. */
5541 if (gimple_debug_bind_p (stmt)
5542 && TREE_CODE (gimple_debug_bind_get_var (stmt))
5543 == LABEL_DECL)
5544 continue;
5546 /* Create a new copy of STMT and duplicate STMT's virtual
5547 operands. */
5548 copy = gimple_copy (stmt);
5549 gsi_insert_after (&gsi_tgt, copy, GSI_NEW_STMT);
5551 maybe_duplicate_eh_stmt (copy, stmt);
5552 gimple_duplicate_stmt_histograms (cfun, copy, cfun, stmt);
5554 /* When copying around a stmt writing into a local non-user
5555 aggregate, make sure it won't share stack slot with other
5556 vars. */
5557 lhs = gimple_get_lhs (stmt);
5558 if (lhs && TREE_CODE (lhs) != SSA_NAME)
5560 tree base = get_base_address (lhs);
5561 if (base
5562 && (TREE_CODE (base) == VAR_DECL
5563 || TREE_CODE (base) == RESULT_DECL)
5564 && DECL_IGNORED_P (base)
5565 && !TREE_STATIC (base)
5566 && !DECL_EXTERNAL (base)
5567 && (TREE_CODE (base) != VAR_DECL
5568 || !DECL_HAS_VALUE_EXPR_P (base)))
5569 DECL_NONSHAREABLE (base) = 1;
5572 /* Create new names for all the definitions created by COPY and
5573 add replacement mappings for each new name. */
5574 FOR_EACH_SSA_DEF_OPERAND (def_p, copy, op_iter, SSA_OP_ALL_DEFS)
5575 create_new_def_for (DEF_FROM_PTR (def_p), copy, def_p);
5578 return new_bb;
5581 /* Adds phi node arguments for edge E_COPY after basic block duplication. */
5583 static void
5584 add_phi_args_after_copy_edge (edge e_copy)
5586 basic_block bb, bb_copy = e_copy->src, dest;
5587 edge e;
5588 edge_iterator ei;
5589 gimple phi, phi_copy;
5590 tree def;
5591 gimple_stmt_iterator psi, psi_copy;
5593 if (gimple_seq_empty_p (phi_nodes (e_copy->dest)))
5594 return;
5596 bb = bb_copy->flags & BB_DUPLICATED ? get_bb_original (bb_copy) : bb_copy;
5598 if (e_copy->dest->flags & BB_DUPLICATED)
5599 dest = get_bb_original (e_copy->dest);
5600 else
5601 dest = e_copy->dest;
5603 e = find_edge (bb, dest);
5604 if (!e)
5606 /* During loop unrolling the target of the latch edge is copied.
5607 In this case we are not looking for edge to dest, but to
5608 duplicated block whose original was dest. */
5609 FOR_EACH_EDGE (e, ei, bb->succs)
5611 if ((e->dest->flags & BB_DUPLICATED)
5612 && get_bb_original (e->dest) == dest)
5613 break;
5616 gcc_assert (e != NULL);
5619 for (psi = gsi_start_phis (e->dest),
5620 psi_copy = gsi_start_phis (e_copy->dest);
5621 !gsi_end_p (psi);
5622 gsi_next (&psi), gsi_next (&psi_copy))
5624 phi = gsi_stmt (psi);
5625 phi_copy = gsi_stmt (psi_copy);
5626 def = PHI_ARG_DEF_FROM_EDGE (phi, e);
5627 add_phi_arg (phi_copy, def, e_copy,
5628 gimple_phi_arg_location_from_edge (phi, e));
5633 /* Basic block BB_COPY was created by code duplication. Add phi node
5634 arguments for edges going out of BB_COPY. The blocks that were
5635 duplicated have BB_DUPLICATED set. */
5637 void
5638 add_phi_args_after_copy_bb (basic_block bb_copy)
5640 edge e_copy;
5641 edge_iterator ei;
5643 FOR_EACH_EDGE (e_copy, ei, bb_copy->succs)
5645 add_phi_args_after_copy_edge (e_copy);
5649 /* Blocks in REGION_COPY array of length N_REGION were created by
5650 duplication of basic blocks. Add phi node arguments for edges
5651 going from these blocks. If E_COPY is not NULL, also add
5652 phi node arguments for its destination.*/
5654 void
5655 add_phi_args_after_copy (basic_block *region_copy, unsigned n_region,
5656 edge e_copy)
5658 unsigned i;
5660 for (i = 0; i < n_region; i++)
5661 region_copy[i]->flags |= BB_DUPLICATED;
5663 for (i = 0; i < n_region; i++)
5664 add_phi_args_after_copy_bb (region_copy[i]);
5665 if (e_copy)
5666 add_phi_args_after_copy_edge (e_copy);
5668 for (i = 0; i < n_region; i++)
5669 region_copy[i]->flags &= ~BB_DUPLICATED;
5672 /* Duplicates a REGION (set of N_REGION basic blocks) with just a single
5673 important exit edge EXIT. By important we mean that no SSA name defined
5674 inside region is live over the other exit edges of the region. All entry
5675 edges to the region must go to ENTRY->dest. The edge ENTRY is redirected
5676 to the duplicate of the region. Dominance and loop information is
5677 updated if UPDATE_DOMINANCE is true, but not the SSA web. If
5678 UPDATE_DOMINANCE is false then we assume that the caller will update the
5679 dominance information after calling this function. The new basic
5680 blocks are stored to REGION_COPY in the same order as they had in REGION,
5681 provided that REGION_COPY is not NULL.
5682 The function returns false if it is unable to copy the region,
5683 true otherwise. */
5685 bool
5686 gimple_duplicate_sese_region (edge entry, edge exit,
5687 basic_block *region, unsigned n_region,
5688 basic_block *region_copy,
5689 bool update_dominance)
5691 unsigned i;
5692 bool free_region_copy = false, copying_header = false;
5693 struct loop *loop = entry->dest->loop_father;
5694 edge exit_copy;
5695 vec<basic_block> doms;
5696 edge redirected;
5697 int total_freq = 0, entry_freq = 0;
5698 gcov_type total_count = 0, entry_count = 0;
5700 if (!can_copy_bbs_p (region, n_region))
5701 return false;
5703 /* Some sanity checking. Note that we do not check for all possible
5704 missuses of the functions. I.e. if you ask to copy something weird,
5705 it will work, but the state of structures probably will not be
5706 correct. */
5707 for (i = 0; i < n_region; i++)
5709 /* We do not handle subloops, i.e. all the blocks must belong to the
5710 same loop. */
5711 if (region[i]->loop_father != loop)
5712 return false;
5714 if (region[i] != entry->dest
5715 && region[i] == loop->header)
5716 return false;
5719 set_loop_copy (loop, loop);
5721 /* In case the function is used for loop header copying (which is the primary
5722 use), ensure that EXIT and its copy will be new latch and entry edges. */
5723 if (loop->header == entry->dest)
5725 copying_header = true;
5726 set_loop_copy (loop, loop_outer (loop));
5728 if (!dominated_by_p (CDI_DOMINATORS, loop->latch, exit->src))
5729 return false;
5731 for (i = 0; i < n_region; i++)
5732 if (region[i] != exit->src
5733 && dominated_by_p (CDI_DOMINATORS, region[i], exit->src))
5734 return false;
5737 if (!region_copy)
5739 region_copy = XNEWVEC (basic_block, n_region);
5740 free_region_copy = true;
5743 initialize_original_copy_tables ();
5745 /* Record blocks outside the region that are dominated by something
5746 inside. */
5747 if (update_dominance)
5749 doms.create (0);
5750 doms = get_dominated_by_region (CDI_DOMINATORS, region, n_region);
5753 if (entry->dest->count)
5755 total_count = entry->dest->count;
5756 entry_count = entry->count;
5757 /* Fix up corner cases, to avoid division by zero or creation of negative
5758 frequencies. */
5759 if (entry_count > total_count)
5760 entry_count = total_count;
5762 else
5764 total_freq = entry->dest->frequency;
5765 entry_freq = EDGE_FREQUENCY (entry);
5766 /* Fix up corner cases, to avoid division by zero or creation of negative
5767 frequencies. */
5768 if (total_freq == 0)
5769 total_freq = 1;
5770 else if (entry_freq > total_freq)
5771 entry_freq = total_freq;
5774 copy_bbs (region, n_region, region_copy, &exit, 1, &exit_copy, loop,
5775 split_edge_bb_loc (entry), update_dominance);
5776 if (total_count)
5778 scale_bbs_frequencies_gcov_type (region, n_region,
5779 total_count - entry_count,
5780 total_count);
5781 scale_bbs_frequencies_gcov_type (region_copy, n_region, entry_count,
5782 total_count);
5784 else
5786 scale_bbs_frequencies_int (region, n_region, total_freq - entry_freq,
5787 total_freq);
5788 scale_bbs_frequencies_int (region_copy, n_region, entry_freq, total_freq);
5791 if (copying_header)
5793 loop->header = exit->dest;
5794 loop->latch = exit->src;
5797 /* Redirect the entry and add the phi node arguments. */
5798 redirected = redirect_edge_and_branch (entry, get_bb_copy (entry->dest));
5799 gcc_assert (redirected != NULL);
5800 flush_pending_stmts (entry);
5802 /* Concerning updating of dominators: We must recount dominators
5803 for entry block and its copy. Anything that is outside of the
5804 region, but was dominated by something inside needs recounting as
5805 well. */
5806 if (update_dominance)
5808 set_immediate_dominator (CDI_DOMINATORS, entry->dest, entry->src);
5809 doms.safe_push (get_bb_original (entry->dest));
5810 iterate_fix_dominators (CDI_DOMINATORS, doms, false);
5811 doms.release ();
5814 /* Add the other PHI node arguments. */
5815 add_phi_args_after_copy (region_copy, n_region, NULL);
5817 if (free_region_copy)
5818 free (region_copy);
5820 free_original_copy_tables ();
5821 return true;
5824 /* Checks if BB is part of the region defined by N_REGION BBS. */
5825 static bool
5826 bb_part_of_region_p (basic_block bb, basic_block* bbs, unsigned n_region)
5828 unsigned int n;
5830 for (n = 0; n < n_region; n++)
5832 if (bb == bbs[n])
5833 return true;
5835 return false;
5838 /* Duplicates REGION consisting of N_REGION blocks. The new blocks
5839 are stored to REGION_COPY in the same order in that they appear
5840 in REGION, if REGION_COPY is not NULL. ENTRY is the entry to
5841 the region, EXIT an exit from it. The condition guarding EXIT
5842 is moved to ENTRY. Returns true if duplication succeeds, false
5843 otherwise.
5845 For example,
5847 some_code;
5848 if (cond)
5850 else
5853 is transformed to
5855 if (cond)
5857 some_code;
5860 else
5862 some_code;
5867 bool
5868 gimple_duplicate_sese_tail (edge entry ATTRIBUTE_UNUSED, edge exit ATTRIBUTE_UNUSED,
5869 basic_block *region ATTRIBUTE_UNUSED, unsigned n_region ATTRIBUTE_UNUSED,
5870 basic_block *region_copy ATTRIBUTE_UNUSED)
5872 unsigned i;
5873 bool free_region_copy = false;
5874 struct loop *loop = exit->dest->loop_father;
5875 struct loop *orig_loop = entry->dest->loop_father;
5876 basic_block switch_bb, entry_bb, nentry_bb;
5877 vec<basic_block> doms;
5878 int total_freq = 0, exit_freq = 0;
5879 gcov_type total_count = 0, exit_count = 0;
5880 edge exits[2], nexits[2], e;
5881 gimple_stmt_iterator gsi;
5882 gimple cond_stmt;
5883 edge sorig, snew;
5884 basic_block exit_bb;
5885 gimple_stmt_iterator psi;
5886 gimple phi;
5887 tree def;
5888 struct loop *target, *aloop, *cloop;
5890 gcc_assert (EDGE_COUNT (exit->src->succs) == 2);
5891 exits[0] = exit;
5892 exits[1] = EDGE_SUCC (exit->src, EDGE_SUCC (exit->src, 0) == exit);
5894 if (!can_copy_bbs_p (region, n_region))
5895 return false;
5897 initialize_original_copy_tables ();
5898 set_loop_copy (orig_loop, loop);
5900 target= loop;
5901 for (aloop = orig_loop->inner; aloop; aloop = aloop->next)
5903 if (bb_part_of_region_p (aloop->header, region, n_region))
5905 cloop = duplicate_loop (aloop, target);
5906 duplicate_subloops (aloop, cloop);
5910 if (!region_copy)
5912 region_copy = XNEWVEC (basic_block, n_region);
5913 free_region_copy = true;
5916 gcc_assert (!need_ssa_update_p (cfun));
5918 /* Record blocks outside the region that are dominated by something
5919 inside. */
5920 doms = get_dominated_by_region (CDI_DOMINATORS, region, n_region);
5922 if (exit->src->count)
5924 total_count = exit->src->count;
5925 exit_count = exit->count;
5926 /* Fix up corner cases, to avoid division by zero or creation of negative
5927 frequencies. */
5928 if (exit_count > total_count)
5929 exit_count = total_count;
5931 else
5933 total_freq = exit->src->frequency;
5934 exit_freq = EDGE_FREQUENCY (exit);
5935 /* Fix up corner cases, to avoid division by zero or creation of negative
5936 frequencies. */
5937 if (total_freq == 0)
5938 total_freq = 1;
5939 if (exit_freq > total_freq)
5940 exit_freq = total_freq;
5943 copy_bbs (region, n_region, region_copy, exits, 2, nexits, orig_loop,
5944 split_edge_bb_loc (exit), true);
5945 if (total_count)
5947 scale_bbs_frequencies_gcov_type (region, n_region,
5948 total_count - exit_count,
5949 total_count);
5950 scale_bbs_frequencies_gcov_type (region_copy, n_region, exit_count,
5951 total_count);
5953 else
5955 scale_bbs_frequencies_int (region, n_region, total_freq - exit_freq,
5956 total_freq);
5957 scale_bbs_frequencies_int (region_copy, n_region, exit_freq, total_freq);
5960 /* Create the switch block, and put the exit condition to it. */
5961 entry_bb = entry->dest;
5962 nentry_bb = get_bb_copy (entry_bb);
5963 if (!last_stmt (entry->src)
5964 || !stmt_ends_bb_p (last_stmt (entry->src)))
5965 switch_bb = entry->src;
5966 else
5967 switch_bb = split_edge (entry);
5968 set_immediate_dominator (CDI_DOMINATORS, nentry_bb, switch_bb);
5970 gsi = gsi_last_bb (switch_bb);
5971 cond_stmt = last_stmt (exit->src);
5972 gcc_assert (gimple_code (cond_stmt) == GIMPLE_COND);
5973 cond_stmt = gimple_copy (cond_stmt);
5975 gsi_insert_after (&gsi, cond_stmt, GSI_NEW_STMT);
5977 sorig = single_succ_edge (switch_bb);
5978 sorig->flags = exits[1]->flags;
5979 snew = make_edge (switch_bb, nentry_bb, exits[0]->flags);
5981 /* Register the new edge from SWITCH_BB in loop exit lists. */
5982 rescan_loop_exit (snew, true, false);
5984 /* Add the PHI node arguments. */
5985 add_phi_args_after_copy (region_copy, n_region, snew);
5987 /* Get rid of now superfluous conditions and associated edges (and phi node
5988 arguments). */
5989 exit_bb = exit->dest;
5991 e = redirect_edge_and_branch (exits[0], exits[1]->dest);
5992 PENDING_STMT (e) = NULL;
5994 /* The latch of ORIG_LOOP was copied, and so was the backedge
5995 to the original header. We redirect this backedge to EXIT_BB. */
5996 for (i = 0; i < n_region; i++)
5997 if (get_bb_original (region_copy[i]) == orig_loop->latch)
5999 gcc_assert (single_succ_edge (region_copy[i]));
6000 e = redirect_edge_and_branch (single_succ_edge (region_copy[i]), exit_bb);
6001 PENDING_STMT (e) = NULL;
6002 for (psi = gsi_start_phis (exit_bb);
6003 !gsi_end_p (psi);
6004 gsi_next (&psi))
6006 phi = gsi_stmt (psi);
6007 def = PHI_ARG_DEF (phi, nexits[0]->dest_idx);
6008 add_phi_arg (phi, def, e, gimple_phi_arg_location_from_edge (phi, e));
6011 e = redirect_edge_and_branch (nexits[1], nexits[0]->dest);
6012 PENDING_STMT (e) = NULL;
6014 /* Anything that is outside of the region, but was dominated by something
6015 inside needs to update dominance info. */
6016 iterate_fix_dominators (CDI_DOMINATORS, doms, false);
6017 doms.release ();
6018 /* Update the SSA web. */
6019 update_ssa (TODO_update_ssa);
6021 if (free_region_copy)
6022 free (region_copy);
6024 free_original_copy_tables ();
6025 return true;
6028 /* Add all the blocks dominated by ENTRY to the array BBS_P. Stop
6029 adding blocks when the dominator traversal reaches EXIT. This
6030 function silently assumes that ENTRY strictly dominates EXIT. */
6032 void
6033 gather_blocks_in_sese_region (basic_block entry, basic_block exit,
6034 vec<basic_block> *bbs_p)
6036 basic_block son;
6038 for (son = first_dom_son (CDI_DOMINATORS, entry);
6039 son;
6040 son = next_dom_son (CDI_DOMINATORS, son))
6042 bbs_p->safe_push (son);
6043 if (son != exit)
6044 gather_blocks_in_sese_region (son, exit, bbs_p);
6048 /* Replaces *TP with a duplicate (belonging to function TO_CONTEXT).
6049 The duplicates are recorded in VARS_MAP. */
6051 static void
6052 replace_by_duplicate_decl (tree *tp, struct pointer_map_t *vars_map,
6053 tree to_context)
6055 tree t = *tp, new_t;
6056 struct function *f = DECL_STRUCT_FUNCTION (to_context);
6057 void **loc;
6059 if (DECL_CONTEXT (t) == to_context)
6060 return;
6062 loc = pointer_map_contains (vars_map, t);
6064 if (!loc)
6066 loc = pointer_map_insert (vars_map, t);
6068 if (SSA_VAR_P (t))
6070 new_t = copy_var_decl (t, DECL_NAME (t), TREE_TYPE (t));
6071 add_local_decl (f, new_t);
6073 else
6075 gcc_assert (TREE_CODE (t) == CONST_DECL);
6076 new_t = copy_node (t);
6078 DECL_CONTEXT (new_t) = to_context;
6080 *loc = new_t;
6082 else
6083 new_t = (tree) *loc;
6085 *tp = new_t;
6089 /* Creates an ssa name in TO_CONTEXT equivalent to NAME.
6090 VARS_MAP maps old ssa names and var_decls to the new ones. */
6092 static tree
6093 replace_ssa_name (tree name, struct pointer_map_t *vars_map,
6094 tree to_context)
6096 void **loc;
6097 tree new_name;
6099 gcc_assert (!virtual_operand_p (name));
6101 loc = pointer_map_contains (vars_map, name);
6103 if (!loc)
6105 tree decl = SSA_NAME_VAR (name);
6106 if (decl)
6108 replace_by_duplicate_decl (&decl, vars_map, to_context);
6109 new_name = make_ssa_name_fn (DECL_STRUCT_FUNCTION (to_context),
6110 decl, SSA_NAME_DEF_STMT (name));
6111 if (SSA_NAME_IS_DEFAULT_DEF (name))
6112 set_ssa_default_def (DECL_STRUCT_FUNCTION (to_context),
6113 decl, new_name);
6115 else
6116 new_name = copy_ssa_name_fn (DECL_STRUCT_FUNCTION (to_context),
6117 name, SSA_NAME_DEF_STMT (name));
6119 loc = pointer_map_insert (vars_map, name);
6120 *loc = new_name;
6122 else
6123 new_name = (tree) *loc;
6125 return new_name;
6128 struct move_stmt_d
6130 tree orig_block;
6131 tree new_block;
6132 tree from_context;
6133 tree to_context;
6134 struct pointer_map_t *vars_map;
6135 htab_t new_label_map;
6136 struct pointer_map_t *eh_map;
6137 bool remap_decls_p;
6140 /* Helper for move_block_to_fn. Set TREE_BLOCK in every expression
6141 contained in *TP if it has been ORIG_BLOCK previously and change the
6142 DECL_CONTEXT of every local variable referenced in *TP. */
6144 static tree
6145 move_stmt_op (tree *tp, int *walk_subtrees, void *data)
6147 struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
6148 struct move_stmt_d *p = (struct move_stmt_d *) wi->info;
6149 tree t = *tp;
6151 if (EXPR_P (t))
6153 tree block = TREE_BLOCK (t);
6154 if (block == p->orig_block
6155 || (p->orig_block == NULL_TREE
6156 && block != NULL_TREE))
6157 TREE_SET_BLOCK (t, p->new_block);
6158 #ifdef ENABLE_CHECKING
6159 else if (block != NULL_TREE)
6161 while (block && TREE_CODE (block) == BLOCK && block != p->orig_block)
6162 block = BLOCK_SUPERCONTEXT (block);
6163 gcc_assert (block == p->orig_block);
6165 #endif
6167 else if (DECL_P (t) || TREE_CODE (t) == SSA_NAME)
6169 if (TREE_CODE (t) == SSA_NAME)
6170 *tp = replace_ssa_name (t, p->vars_map, p->to_context);
6171 else if (TREE_CODE (t) == LABEL_DECL)
6173 if (p->new_label_map)
6175 struct tree_map in, *out;
6176 in.base.from = t;
6177 out = (struct tree_map *)
6178 htab_find_with_hash (p->new_label_map, &in, DECL_UID (t));
6179 if (out)
6180 *tp = t = out->to;
6183 DECL_CONTEXT (t) = p->to_context;
6185 else if (p->remap_decls_p)
6187 /* Replace T with its duplicate. T should no longer appear in the
6188 parent function, so this looks wasteful; however, it may appear
6189 in referenced_vars, and more importantly, as virtual operands of
6190 statements, and in alias lists of other variables. It would be
6191 quite difficult to expunge it from all those places. ??? It might
6192 suffice to do this for addressable variables. */
6193 if ((TREE_CODE (t) == VAR_DECL
6194 && !is_global_var (t))
6195 || TREE_CODE (t) == CONST_DECL)
6196 replace_by_duplicate_decl (tp, p->vars_map, p->to_context);
6198 *walk_subtrees = 0;
6200 else if (TYPE_P (t))
6201 *walk_subtrees = 0;
6203 return NULL_TREE;
6206 /* Helper for move_stmt_r. Given an EH region number for the source
6207 function, map that to the duplicate EH regio number in the dest. */
6209 static int
6210 move_stmt_eh_region_nr (int old_nr, struct move_stmt_d *p)
6212 eh_region old_r, new_r;
6213 void **slot;
6215 old_r = get_eh_region_from_number (old_nr);
6216 slot = pointer_map_contains (p->eh_map, old_r);
6217 new_r = (eh_region) *slot;
6219 return new_r->index;
6222 /* Similar, but operate on INTEGER_CSTs. */
6224 static tree
6225 move_stmt_eh_region_tree_nr (tree old_t_nr, struct move_stmt_d *p)
6227 int old_nr, new_nr;
6229 old_nr = tree_low_cst (old_t_nr, 0);
6230 new_nr = move_stmt_eh_region_nr (old_nr, p);
6232 return build_int_cst (integer_type_node, new_nr);
6235 /* Like move_stmt_op, but for gimple statements.
6237 Helper for move_block_to_fn. Set GIMPLE_BLOCK in every expression
6238 contained in the current statement in *GSI_P and change the
6239 DECL_CONTEXT of every local variable referenced in the current
6240 statement. */
6242 static tree
6243 move_stmt_r (gimple_stmt_iterator *gsi_p, bool *handled_ops_p,
6244 struct walk_stmt_info *wi)
6246 struct move_stmt_d *p = (struct move_stmt_d *) wi->info;
6247 gimple stmt = gsi_stmt (*gsi_p);
6248 tree block = gimple_block (stmt);
6250 if (block == p->orig_block
6251 || (p->orig_block == NULL_TREE
6252 && block != NULL_TREE))
6253 gimple_set_block (stmt, p->new_block);
6255 switch (gimple_code (stmt))
6257 case GIMPLE_CALL:
6258 /* Remap the region numbers for __builtin_eh_{pointer,filter}. */
6260 tree r, fndecl = gimple_call_fndecl (stmt);
6261 if (fndecl && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
6262 switch (DECL_FUNCTION_CODE (fndecl))
6264 case BUILT_IN_EH_COPY_VALUES:
6265 r = gimple_call_arg (stmt, 1);
6266 r = move_stmt_eh_region_tree_nr (r, p);
6267 gimple_call_set_arg (stmt, 1, r);
6268 /* FALLTHRU */
6270 case BUILT_IN_EH_POINTER:
6271 case BUILT_IN_EH_FILTER:
6272 r = gimple_call_arg (stmt, 0);
6273 r = move_stmt_eh_region_tree_nr (r, p);
6274 gimple_call_set_arg (stmt, 0, r);
6275 break;
6277 default:
6278 break;
6281 break;
6283 case GIMPLE_RESX:
6285 int r = gimple_resx_region (stmt);
6286 r = move_stmt_eh_region_nr (r, p);
6287 gimple_resx_set_region (stmt, r);
6289 break;
6291 case GIMPLE_EH_DISPATCH:
6293 int r = gimple_eh_dispatch_region (stmt);
6294 r = move_stmt_eh_region_nr (r, p);
6295 gimple_eh_dispatch_set_region (stmt, r);
6297 break;
6299 case GIMPLE_OMP_RETURN:
6300 case GIMPLE_OMP_CONTINUE:
6301 break;
6302 default:
6303 if (is_gimple_omp (stmt))
6305 /* Do not remap variables inside OMP directives. Variables
6306 referenced in clauses and directive header belong to the
6307 parent function and should not be moved into the child
6308 function. */
6309 bool save_remap_decls_p = p->remap_decls_p;
6310 p->remap_decls_p = false;
6311 *handled_ops_p = true;
6313 walk_gimple_seq_mod (gimple_omp_body_ptr (stmt), move_stmt_r,
6314 move_stmt_op, wi);
6316 p->remap_decls_p = save_remap_decls_p;
6318 break;
6321 return NULL_TREE;
6324 /* Move basic block BB from function CFUN to function DEST_FN. The
6325 block is moved out of the original linked list and placed after
6326 block AFTER in the new list. Also, the block is removed from the
6327 original array of blocks and placed in DEST_FN's array of blocks.
6328 If UPDATE_EDGE_COUNT_P is true, the edge counts on both CFGs is
6329 updated to reflect the moved edges.
6331 The local variables are remapped to new instances, VARS_MAP is used
6332 to record the mapping. */
6334 static void
6335 move_block_to_fn (struct function *dest_cfun, basic_block bb,
6336 basic_block after, bool update_edge_count_p,
6337 struct move_stmt_d *d)
6339 struct control_flow_graph *cfg;
6340 edge_iterator ei;
6341 edge e;
6342 gimple_stmt_iterator si;
6343 unsigned old_len, new_len;
6345 /* Remove BB from dominance structures. */
6346 delete_from_dominance_info (CDI_DOMINATORS, bb);
6348 /* Move BB from its current loop to the copy in the new function. */
6349 if (current_loops)
6351 struct loop *new_loop = (struct loop *)bb->loop_father->aux;
6352 if (new_loop)
6353 bb->loop_father = new_loop;
6356 /* Link BB to the new linked list. */
6357 move_block_after (bb, after);
6359 /* Update the edge count in the corresponding flowgraphs. */
6360 if (update_edge_count_p)
6361 FOR_EACH_EDGE (e, ei, bb->succs)
6363 cfun->cfg->x_n_edges--;
6364 dest_cfun->cfg->x_n_edges++;
6367 /* Remove BB from the original basic block array. */
6368 (*cfun->cfg->x_basic_block_info)[bb->index] = NULL;
6369 cfun->cfg->x_n_basic_blocks--;
6371 /* Grow DEST_CFUN's basic block array if needed. */
6372 cfg = dest_cfun->cfg;
6373 cfg->x_n_basic_blocks++;
6374 if (bb->index >= cfg->x_last_basic_block)
6375 cfg->x_last_basic_block = bb->index + 1;
6377 old_len = vec_safe_length (cfg->x_basic_block_info);
6378 if ((unsigned) cfg->x_last_basic_block >= old_len)
6380 new_len = cfg->x_last_basic_block + (cfg->x_last_basic_block + 3) / 4;
6381 vec_safe_grow_cleared (cfg->x_basic_block_info, new_len);
6384 (*cfg->x_basic_block_info)[bb->index] = bb;
6386 /* Remap the variables in phi nodes. */
6387 for (si = gsi_start_phis (bb); !gsi_end_p (si); )
6389 gimple phi = gsi_stmt (si);
6390 use_operand_p use;
6391 tree op = PHI_RESULT (phi);
6392 ssa_op_iter oi;
6393 unsigned i;
6395 if (virtual_operand_p (op))
6397 /* Remove the phi nodes for virtual operands (alias analysis will be
6398 run for the new function, anyway). */
6399 remove_phi_node (&si, true);
6400 continue;
6403 SET_PHI_RESULT (phi,
6404 replace_ssa_name (op, d->vars_map, dest_cfun->decl));
6405 FOR_EACH_PHI_ARG (use, phi, oi, SSA_OP_USE)
6407 op = USE_FROM_PTR (use);
6408 if (TREE_CODE (op) == SSA_NAME)
6409 SET_USE (use, replace_ssa_name (op, d->vars_map, dest_cfun->decl));
6412 for (i = 0; i < EDGE_COUNT (bb->preds); i++)
6414 location_t locus = gimple_phi_arg_location (phi, i);
6415 tree block = LOCATION_BLOCK (locus);
6417 if (locus == UNKNOWN_LOCATION)
6418 continue;
6419 if (d->orig_block == NULL_TREE || block == d->orig_block)
6421 if (d->new_block == NULL_TREE)
6422 locus = LOCATION_LOCUS (locus);
6423 else
6424 locus = COMBINE_LOCATION_DATA (line_table, locus, d->new_block);
6425 gimple_phi_arg_set_location (phi, i, locus);
6429 gsi_next (&si);
6432 for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
6434 gimple stmt = gsi_stmt (si);
6435 struct walk_stmt_info wi;
6437 memset (&wi, 0, sizeof (wi));
6438 wi.info = d;
6439 walk_gimple_stmt (&si, move_stmt_r, move_stmt_op, &wi);
6441 if (gimple_code (stmt) == GIMPLE_LABEL)
6443 tree label = gimple_label_label (stmt);
6444 int uid = LABEL_DECL_UID (label);
6446 gcc_assert (uid > -1);
6448 old_len = vec_safe_length (cfg->x_label_to_block_map);
6449 if (old_len <= (unsigned) uid)
6451 new_len = 3 * uid / 2 + 1;
6452 vec_safe_grow_cleared (cfg->x_label_to_block_map, new_len);
6455 (*cfg->x_label_to_block_map)[uid] = bb;
6456 (*cfun->cfg->x_label_to_block_map)[uid] = NULL;
6458 gcc_assert (DECL_CONTEXT (label) == dest_cfun->decl);
6460 if (uid >= dest_cfun->cfg->last_label_uid)
6461 dest_cfun->cfg->last_label_uid = uid + 1;
6464 maybe_duplicate_eh_stmt_fn (dest_cfun, stmt, cfun, stmt, d->eh_map, 0);
6465 remove_stmt_from_eh_lp_fn (cfun, stmt);
6467 gimple_duplicate_stmt_histograms (dest_cfun, stmt, cfun, stmt);
6468 gimple_remove_stmt_histograms (cfun, stmt);
6470 /* We cannot leave any operands allocated from the operand caches of
6471 the current function. */
6472 free_stmt_operands (stmt);
6473 push_cfun (dest_cfun);
6474 update_stmt (stmt);
6475 pop_cfun ();
6478 FOR_EACH_EDGE (e, ei, bb->succs)
6479 if (e->goto_locus != UNKNOWN_LOCATION)
6481 tree block = LOCATION_BLOCK (e->goto_locus);
6482 if (d->orig_block == NULL_TREE
6483 || block == d->orig_block)
6484 e->goto_locus = d->new_block ?
6485 COMBINE_LOCATION_DATA (line_table, e->goto_locus, d->new_block) :
6486 LOCATION_LOCUS (e->goto_locus);
6490 /* Examine the statements in BB (which is in SRC_CFUN); find and return
6491 the outermost EH region. Use REGION as the incoming base EH region. */
6493 static eh_region
6494 find_outermost_region_in_block (struct function *src_cfun,
6495 basic_block bb, eh_region region)
6497 gimple_stmt_iterator si;
6499 for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
6501 gimple stmt = gsi_stmt (si);
6502 eh_region stmt_region;
6503 int lp_nr;
6505 lp_nr = lookup_stmt_eh_lp_fn (src_cfun, stmt);
6506 stmt_region = get_eh_region_from_lp_number_fn (src_cfun, lp_nr);
6507 if (stmt_region)
6509 if (region == NULL)
6510 region = stmt_region;
6511 else if (stmt_region != region)
6513 region = eh_region_outermost (src_cfun, stmt_region, region);
6514 gcc_assert (region != NULL);
6519 return region;
6522 static tree
6523 new_label_mapper (tree decl, void *data)
6525 htab_t hash = (htab_t) data;
6526 struct tree_map *m;
6527 void **slot;
6529 gcc_assert (TREE_CODE (decl) == LABEL_DECL);
6531 m = XNEW (struct tree_map);
6532 m->hash = DECL_UID (decl);
6533 m->base.from = decl;
6534 m->to = create_artificial_label (UNKNOWN_LOCATION);
6535 LABEL_DECL_UID (m->to) = LABEL_DECL_UID (decl);
6536 if (LABEL_DECL_UID (m->to) >= cfun->cfg->last_label_uid)
6537 cfun->cfg->last_label_uid = LABEL_DECL_UID (m->to) + 1;
6539 slot = htab_find_slot_with_hash (hash, m, m->hash, INSERT);
6540 gcc_assert (*slot == NULL);
6542 *slot = m;
6544 return m->to;
6547 /* Change DECL_CONTEXT of all BLOCK_VARS in block, including
6548 subblocks. */
6550 static void
6551 replace_block_vars_by_duplicates (tree block, struct pointer_map_t *vars_map,
6552 tree to_context)
6554 tree *tp, t;
6556 for (tp = &BLOCK_VARS (block); *tp; tp = &DECL_CHAIN (*tp))
6558 t = *tp;
6559 if (TREE_CODE (t) != VAR_DECL && TREE_CODE (t) != CONST_DECL)
6560 continue;
6561 replace_by_duplicate_decl (&t, vars_map, to_context);
6562 if (t != *tp)
6564 if (TREE_CODE (*tp) == VAR_DECL && DECL_HAS_VALUE_EXPR_P (*tp))
6566 SET_DECL_VALUE_EXPR (t, DECL_VALUE_EXPR (*tp));
6567 DECL_HAS_VALUE_EXPR_P (t) = 1;
6569 DECL_CHAIN (t) = DECL_CHAIN (*tp);
6570 *tp = t;
6574 for (block = BLOCK_SUBBLOCKS (block); block; block = BLOCK_CHAIN (block))
6575 replace_block_vars_by_duplicates (block, vars_map, to_context);
6578 /* Fixup the loop arrays and numbers after moving LOOP and its subloops
6579 from FN1 to FN2. */
6581 static void
6582 fixup_loop_arrays_after_move (struct function *fn1, struct function *fn2,
6583 struct loop *loop)
6585 /* Discard it from the old loop array. */
6586 (*get_loops (fn1))[loop->num] = NULL;
6588 /* Place it in the new loop array, assigning it a new number. */
6589 loop->num = number_of_loops (fn2);
6590 vec_safe_push (loops_for_fn (fn2)->larray, loop);
6592 /* Recurse to children. */
6593 for (loop = loop->inner; loop; loop = loop->next)
6594 fixup_loop_arrays_after_move (fn1, fn2, loop);
6597 /* Move a single-entry, single-exit region delimited by ENTRY_BB and
6598 EXIT_BB to function DEST_CFUN. The whole region is replaced by a
6599 single basic block in the original CFG and the new basic block is
6600 returned. DEST_CFUN must not have a CFG yet.
6602 Note that the region need not be a pure SESE region. Blocks inside
6603 the region may contain calls to abort/exit. The only restriction
6604 is that ENTRY_BB should be the only entry point and it must
6605 dominate EXIT_BB.
6607 Change TREE_BLOCK of all statements in ORIG_BLOCK to the new
6608 functions outermost BLOCK, move all subblocks of ORIG_BLOCK
6609 to the new function.
6611 All local variables referenced in the region are assumed to be in
6612 the corresponding BLOCK_VARS and unexpanded variable lists
6613 associated with DEST_CFUN. */
6615 basic_block
6616 move_sese_region_to_fn (struct function *dest_cfun, basic_block entry_bb,
6617 basic_block exit_bb, tree orig_block)
6619 vec<basic_block> bbs, dom_bbs;
6620 basic_block dom_entry = get_immediate_dominator (CDI_DOMINATORS, entry_bb);
6621 basic_block after, bb, *entry_pred, *exit_succ, abb;
6622 struct function *saved_cfun = cfun;
6623 int *entry_flag, *exit_flag;
6624 unsigned *entry_prob, *exit_prob;
6625 unsigned i, num_entry_edges, num_exit_edges, num_nodes;
6626 edge e;
6627 edge_iterator ei;
6628 htab_t new_label_map;
6629 struct pointer_map_t *vars_map, *eh_map;
6630 struct loop *loop = entry_bb->loop_father;
6631 struct loop *loop0 = get_loop (saved_cfun, 0);
6632 struct move_stmt_d d;
6634 /* If ENTRY does not strictly dominate EXIT, this cannot be an SESE
6635 region. */
6636 gcc_assert (entry_bb != exit_bb
6637 && (!exit_bb
6638 || dominated_by_p (CDI_DOMINATORS, exit_bb, entry_bb)));
6640 /* Collect all the blocks in the region. Manually add ENTRY_BB
6641 because it won't be added by dfs_enumerate_from. */
6642 bbs.create (0);
6643 bbs.safe_push (entry_bb);
6644 gather_blocks_in_sese_region (entry_bb, exit_bb, &bbs);
6646 /* The blocks that used to be dominated by something in BBS will now be
6647 dominated by the new block. */
6648 dom_bbs = get_dominated_by_region (CDI_DOMINATORS,
6649 bbs.address (),
6650 bbs.length ());
6652 /* Detach ENTRY_BB and EXIT_BB from CFUN->CFG. We need to remember
6653 the predecessor edges to ENTRY_BB and the successor edges to
6654 EXIT_BB so that we can re-attach them to the new basic block that
6655 will replace the region. */
6656 num_entry_edges = EDGE_COUNT (entry_bb->preds);
6657 entry_pred = XNEWVEC (basic_block, num_entry_edges);
6658 entry_flag = XNEWVEC (int, num_entry_edges);
6659 entry_prob = XNEWVEC (unsigned, num_entry_edges);
6660 i = 0;
6661 for (ei = ei_start (entry_bb->preds); (e = ei_safe_edge (ei)) != NULL;)
6663 entry_prob[i] = e->probability;
6664 entry_flag[i] = e->flags;
6665 entry_pred[i++] = e->src;
6666 remove_edge (e);
6669 if (exit_bb)
6671 num_exit_edges = EDGE_COUNT (exit_bb->succs);
6672 exit_succ = XNEWVEC (basic_block, num_exit_edges);
6673 exit_flag = XNEWVEC (int, num_exit_edges);
6674 exit_prob = XNEWVEC (unsigned, num_exit_edges);
6675 i = 0;
6676 for (ei = ei_start (exit_bb->succs); (e = ei_safe_edge (ei)) != NULL;)
6678 exit_prob[i] = e->probability;
6679 exit_flag[i] = e->flags;
6680 exit_succ[i++] = e->dest;
6681 remove_edge (e);
6684 else
6686 num_exit_edges = 0;
6687 exit_succ = NULL;
6688 exit_flag = NULL;
6689 exit_prob = NULL;
6692 /* Switch context to the child function to initialize DEST_FN's CFG. */
6693 gcc_assert (dest_cfun->cfg == NULL);
6694 push_cfun (dest_cfun);
6696 init_empty_tree_cfg ();
6698 /* Initialize EH information for the new function. */
6699 eh_map = NULL;
6700 new_label_map = NULL;
6701 if (saved_cfun->eh)
6703 eh_region region = NULL;
6705 FOR_EACH_VEC_ELT (bbs, i, bb)
6706 region = find_outermost_region_in_block (saved_cfun, bb, region);
6708 init_eh_for_function ();
6709 if (region != NULL)
6711 new_label_map = htab_create (17, tree_map_hash, tree_map_eq, free);
6712 eh_map = duplicate_eh_regions (saved_cfun, region, 0,
6713 new_label_mapper, new_label_map);
6717 /* Initialize an empty loop tree. */
6718 struct loops *loops = ggc_alloc_cleared_loops ();
6719 init_loops_structure (dest_cfun, loops, 1);
6720 loops->state = LOOPS_MAY_HAVE_MULTIPLE_LATCHES;
6721 set_loops_for_fn (dest_cfun, loops);
6723 /* Move the outlined loop tree part. */
6724 num_nodes = bbs.length ();
6725 FOR_EACH_VEC_ELT (bbs, i, bb)
6727 if (bb->loop_father->header == bb)
6729 struct loop *this_loop = bb->loop_father;
6730 struct loop *outer = loop_outer (this_loop);
6731 if (outer == loop
6732 /* If the SESE region contains some bbs ending with
6733 a noreturn call, those are considered to belong
6734 to the outermost loop in saved_cfun, rather than
6735 the entry_bb's loop_father. */
6736 || outer == loop0)
6738 if (outer != loop)
6739 num_nodes -= this_loop->num_nodes;
6740 flow_loop_tree_node_remove (bb->loop_father);
6741 flow_loop_tree_node_add (get_loop (dest_cfun, 0), this_loop);
6742 fixup_loop_arrays_after_move (saved_cfun, cfun, this_loop);
6745 else if (bb->loop_father == loop0 && loop0 != loop)
6746 num_nodes--;
6748 /* Remove loop exits from the outlined region. */
6749 if (loops_for_fn (saved_cfun)->exits)
6750 FOR_EACH_EDGE (e, ei, bb->succs)
6752 void **slot = htab_find_slot_with_hash
6753 (loops_for_fn (saved_cfun)->exits, e,
6754 htab_hash_pointer (e), NO_INSERT);
6755 if (slot)
6756 htab_clear_slot (loops_for_fn (saved_cfun)->exits, slot);
6761 /* Adjust the number of blocks in the tree root of the outlined part. */
6762 get_loop (dest_cfun, 0)->num_nodes = bbs.length () + 2;
6764 /* Setup a mapping to be used by move_block_to_fn. */
6765 loop->aux = current_loops->tree_root;
6766 loop0->aux = current_loops->tree_root;
6768 pop_cfun ();
6770 /* Move blocks from BBS into DEST_CFUN. */
6771 gcc_assert (bbs.length () >= 2);
6772 after = dest_cfun->cfg->x_entry_block_ptr;
6773 vars_map = pointer_map_create ();
6775 memset (&d, 0, sizeof (d));
6776 d.orig_block = orig_block;
6777 d.new_block = DECL_INITIAL (dest_cfun->decl);
6778 d.from_context = cfun->decl;
6779 d.to_context = dest_cfun->decl;
6780 d.vars_map = vars_map;
6781 d.new_label_map = new_label_map;
6782 d.eh_map = eh_map;
6783 d.remap_decls_p = true;
6785 FOR_EACH_VEC_ELT (bbs, i, bb)
6787 /* No need to update edge counts on the last block. It has
6788 already been updated earlier when we detached the region from
6789 the original CFG. */
6790 move_block_to_fn (dest_cfun, bb, after, bb != exit_bb, &d);
6791 after = bb;
6794 loop->aux = NULL;
6795 loop0->aux = NULL;
6796 /* Loop sizes are no longer correct, fix them up. */
6797 loop->num_nodes -= num_nodes;
6798 for (struct loop *outer = loop_outer (loop);
6799 outer; outer = loop_outer (outer))
6800 outer->num_nodes -= num_nodes;
6801 loop0->num_nodes -= bbs.length () - num_nodes;
6803 if (saved_cfun->has_simduid_loops || saved_cfun->has_force_vect_loops)
6805 struct loop *aloop;
6806 for (i = 0; vec_safe_iterate (loops->larray, i, &aloop); i++)
6807 if (aloop != NULL)
6809 if (aloop->simduid)
6811 replace_by_duplicate_decl (&aloop->simduid, d.vars_map,
6812 d.to_context);
6813 dest_cfun->has_simduid_loops = true;
6815 if (aloop->force_vect)
6816 dest_cfun->has_force_vect_loops = true;
6820 /* Rewire BLOCK_SUBBLOCKS of orig_block. */
6821 if (orig_block)
6823 tree block;
6824 gcc_assert (BLOCK_SUBBLOCKS (DECL_INITIAL (dest_cfun->decl))
6825 == NULL_TREE);
6826 BLOCK_SUBBLOCKS (DECL_INITIAL (dest_cfun->decl))
6827 = BLOCK_SUBBLOCKS (orig_block);
6828 for (block = BLOCK_SUBBLOCKS (orig_block);
6829 block; block = BLOCK_CHAIN (block))
6830 BLOCK_SUPERCONTEXT (block) = DECL_INITIAL (dest_cfun->decl);
6831 BLOCK_SUBBLOCKS (orig_block) = NULL_TREE;
6834 replace_block_vars_by_duplicates (DECL_INITIAL (dest_cfun->decl),
6835 vars_map, dest_cfun->decl);
6837 if (new_label_map)
6838 htab_delete (new_label_map);
6839 if (eh_map)
6840 pointer_map_destroy (eh_map);
6841 pointer_map_destroy (vars_map);
6843 /* Rewire the entry and exit blocks. The successor to the entry
6844 block turns into the successor of DEST_FN's ENTRY_BLOCK_PTR in
6845 the child function. Similarly, the predecessor of DEST_FN's
6846 EXIT_BLOCK_PTR turns into the predecessor of EXIT_BLOCK_PTR. We
6847 need to switch CFUN between DEST_CFUN and SAVED_CFUN so that the
6848 various CFG manipulation function get to the right CFG.
6850 FIXME, this is silly. The CFG ought to become a parameter to
6851 these helpers. */
6852 push_cfun (dest_cfun);
6853 make_edge (ENTRY_BLOCK_PTR, entry_bb, EDGE_FALLTHRU);
6854 if (exit_bb)
6855 make_edge (exit_bb, EXIT_BLOCK_PTR, 0);
6856 pop_cfun ();
6858 /* Back in the original function, the SESE region has disappeared,
6859 create a new basic block in its place. */
6860 bb = create_empty_bb (entry_pred[0]);
6861 if (current_loops)
6862 add_bb_to_loop (bb, loop);
6863 for (i = 0; i < num_entry_edges; i++)
6865 e = make_edge (entry_pred[i], bb, entry_flag[i]);
6866 e->probability = entry_prob[i];
6869 for (i = 0; i < num_exit_edges; i++)
6871 e = make_edge (bb, exit_succ[i], exit_flag[i]);
6872 e->probability = exit_prob[i];
6875 set_immediate_dominator (CDI_DOMINATORS, bb, dom_entry);
6876 FOR_EACH_VEC_ELT (dom_bbs, i, abb)
6877 set_immediate_dominator (CDI_DOMINATORS, abb, bb);
6878 dom_bbs.release ();
6880 if (exit_bb)
6882 free (exit_prob);
6883 free (exit_flag);
6884 free (exit_succ);
6886 free (entry_prob);
6887 free (entry_flag);
6888 free (entry_pred);
6889 bbs.release ();
6891 return bb;
6895 /* Dump FUNCTION_DECL FN to file FILE using FLAGS (see TDF_* in dumpfile.h)
6898 void
6899 dump_function_to_file (tree fndecl, FILE *file, int flags)
6901 tree arg, var, old_current_fndecl = current_function_decl;
6902 struct function *dsf;
6903 bool ignore_topmost_bind = false, any_var = false;
6904 basic_block bb;
6905 tree chain;
6906 bool tmclone = (TREE_CODE (fndecl) == FUNCTION_DECL
6907 && decl_is_tm_clone (fndecl));
6908 struct function *fun = DECL_STRUCT_FUNCTION (fndecl);
6910 current_function_decl = fndecl;
6911 fprintf (file, "%s %s(", function_name (fun), tmclone ? "[tm-clone] " : "");
6913 arg = DECL_ARGUMENTS (fndecl);
6914 while (arg)
6916 print_generic_expr (file, TREE_TYPE (arg), dump_flags);
6917 fprintf (file, " ");
6918 print_generic_expr (file, arg, dump_flags);
6919 if (flags & TDF_VERBOSE)
6920 print_node (file, "", arg, 4);
6921 if (DECL_CHAIN (arg))
6922 fprintf (file, ", ");
6923 arg = DECL_CHAIN (arg);
6925 fprintf (file, ")\n");
6927 if (flags & TDF_VERBOSE)
6928 print_node (file, "", fndecl, 2);
6930 dsf = DECL_STRUCT_FUNCTION (fndecl);
6931 if (dsf && (flags & TDF_EH))
6932 dump_eh_tree (file, dsf);
6934 if (flags & TDF_RAW && !gimple_has_body_p (fndecl))
6936 dump_node (fndecl, TDF_SLIM | flags, file);
6937 current_function_decl = old_current_fndecl;
6938 return;
6941 /* When GIMPLE is lowered, the variables are no longer available in
6942 BIND_EXPRs, so display them separately. */
6943 if (fun && fun->decl == fndecl && (fun->curr_properties & PROP_gimple_lcf))
6945 unsigned ix;
6946 ignore_topmost_bind = true;
6948 fprintf (file, "{\n");
6949 if (!vec_safe_is_empty (fun->local_decls))
6950 FOR_EACH_LOCAL_DECL (fun, ix, var)
6952 print_generic_decl (file, var, flags);
6953 if (flags & TDF_VERBOSE)
6954 print_node (file, "", var, 4);
6955 fprintf (file, "\n");
6957 any_var = true;
6959 if (gimple_in_ssa_p (cfun))
6960 for (ix = 1; ix < num_ssa_names; ++ix)
6962 tree name = ssa_name (ix);
6963 if (name && !SSA_NAME_VAR (name))
6965 fprintf (file, " ");
6966 print_generic_expr (file, TREE_TYPE (name), flags);
6967 fprintf (file, " ");
6968 print_generic_expr (file, name, flags);
6969 fprintf (file, ";\n");
6971 any_var = true;
6976 if (fun && fun->decl == fndecl
6977 && fun->cfg
6978 && basic_block_info_for_function (fun))
6980 /* If the CFG has been built, emit a CFG-based dump. */
6981 if (!ignore_topmost_bind)
6982 fprintf (file, "{\n");
6984 if (any_var && n_basic_blocks_for_function (fun))
6985 fprintf (file, "\n");
6987 FOR_EACH_BB_FN (bb, fun)
6988 dump_bb (file, bb, 2, flags | TDF_COMMENT);
6990 fprintf (file, "}\n");
6992 else if (DECL_SAVED_TREE (fndecl) == NULL)
6994 /* The function is now in GIMPLE form but the CFG has not been
6995 built yet. Emit the single sequence of GIMPLE statements
6996 that make up its body. */
6997 gimple_seq body = gimple_body (fndecl);
6999 if (gimple_seq_first_stmt (body)
7000 && gimple_seq_first_stmt (body) == gimple_seq_last_stmt (body)
7001 && gimple_code (gimple_seq_first_stmt (body)) == GIMPLE_BIND)
7002 print_gimple_seq (file, body, 0, flags);
7003 else
7005 if (!ignore_topmost_bind)
7006 fprintf (file, "{\n");
7008 if (any_var)
7009 fprintf (file, "\n");
7011 print_gimple_seq (file, body, 2, flags);
7012 fprintf (file, "}\n");
7015 else
7017 int indent;
7019 /* Make a tree based dump. */
7020 chain = DECL_SAVED_TREE (fndecl);
7021 if (chain && TREE_CODE (chain) == BIND_EXPR)
7023 if (ignore_topmost_bind)
7025 chain = BIND_EXPR_BODY (chain);
7026 indent = 2;
7028 else
7029 indent = 0;
7031 else
7033 if (!ignore_topmost_bind)
7034 fprintf (file, "{\n");
7035 indent = 2;
7038 if (any_var)
7039 fprintf (file, "\n");
7041 print_generic_stmt_indented (file, chain, flags, indent);
7042 if (ignore_topmost_bind)
7043 fprintf (file, "}\n");
7046 if (flags & TDF_ENUMERATE_LOCALS)
7047 dump_enumerated_decls (file, flags);
7048 fprintf (file, "\n\n");
7050 current_function_decl = old_current_fndecl;
7053 /* Dump FUNCTION_DECL FN to stderr using FLAGS (see TDF_* in tree.h) */
7055 DEBUG_FUNCTION void
7056 debug_function (tree fn, int flags)
7058 dump_function_to_file (fn, stderr, flags);
7062 /* Print on FILE the indexes for the predecessors of basic_block BB. */
7064 static void
7065 print_pred_bbs (FILE *file, basic_block bb)
7067 edge e;
7068 edge_iterator ei;
7070 FOR_EACH_EDGE (e, ei, bb->preds)
7071 fprintf (file, "bb_%d ", e->src->index);
7075 /* Print on FILE the indexes for the successors of basic_block BB. */
7077 static void
7078 print_succ_bbs (FILE *file, basic_block bb)
7080 edge e;
7081 edge_iterator ei;
7083 FOR_EACH_EDGE (e, ei, bb->succs)
7084 fprintf (file, "bb_%d ", e->dest->index);
7087 /* Print to FILE the basic block BB following the VERBOSITY level. */
7089 void
7090 print_loops_bb (FILE *file, basic_block bb, int indent, int verbosity)
7092 char *s_indent = (char *) alloca ((size_t) indent + 1);
7093 memset ((void *) s_indent, ' ', (size_t) indent);
7094 s_indent[indent] = '\0';
7096 /* Print basic_block's header. */
7097 if (verbosity >= 2)
7099 fprintf (file, "%s bb_%d (preds = {", s_indent, bb->index);
7100 print_pred_bbs (file, bb);
7101 fprintf (file, "}, succs = {");
7102 print_succ_bbs (file, bb);
7103 fprintf (file, "})\n");
7106 /* Print basic_block's body. */
7107 if (verbosity >= 3)
7109 fprintf (file, "%s {\n", s_indent);
7110 dump_bb (file, bb, indent + 4, TDF_VOPS|TDF_MEMSYMS);
7111 fprintf (file, "%s }\n", s_indent);
7115 static void print_loop_and_siblings (FILE *, struct loop *, int, int);
7117 /* Pretty print LOOP on FILE, indented INDENT spaces. Following
7118 VERBOSITY level this outputs the contents of the loop, or just its
7119 structure. */
7121 static void
7122 print_loop (FILE *file, struct loop *loop, int indent, int verbosity)
7124 char *s_indent;
7125 basic_block bb;
7127 if (loop == NULL)
7128 return;
7130 s_indent = (char *) alloca ((size_t) indent + 1);
7131 memset ((void *) s_indent, ' ', (size_t) indent);
7132 s_indent[indent] = '\0';
7134 /* Print loop's header. */
7135 fprintf (file, "%sloop_%d (", s_indent, loop->num);
7136 if (loop->header)
7137 fprintf (file, "header = %d", loop->header->index);
7138 else
7140 fprintf (file, "deleted)\n");
7141 return;
7143 if (loop->latch)
7144 fprintf (file, ", latch = %d", loop->latch->index);
7145 else
7146 fprintf (file, ", multiple latches");
7147 fprintf (file, ", niter = ");
7148 print_generic_expr (file, loop->nb_iterations, 0);
7150 if (loop->any_upper_bound)
7152 fprintf (file, ", upper_bound = ");
7153 dump_double_int (file, loop->nb_iterations_upper_bound, true);
7156 if (loop->any_estimate)
7158 fprintf (file, ", estimate = ");
7159 dump_double_int (file, loop->nb_iterations_estimate, true);
7161 fprintf (file, ")\n");
7163 /* Print loop's body. */
7164 if (verbosity >= 1)
7166 fprintf (file, "%s{\n", s_indent);
7167 FOR_EACH_BB (bb)
7168 if (bb->loop_father == loop)
7169 print_loops_bb (file, bb, indent, verbosity);
7171 print_loop_and_siblings (file, loop->inner, indent + 2, verbosity);
7172 fprintf (file, "%s}\n", s_indent);
7176 /* Print the LOOP and its sibling loops on FILE, indented INDENT
7177 spaces. Following VERBOSITY level this outputs the contents of the
7178 loop, or just its structure. */
7180 static void
7181 print_loop_and_siblings (FILE *file, struct loop *loop, int indent,
7182 int verbosity)
7184 if (loop == NULL)
7185 return;
7187 print_loop (file, loop, indent, verbosity);
7188 print_loop_and_siblings (file, loop->next, indent, verbosity);
7191 /* Follow a CFG edge from the entry point of the program, and on entry
7192 of a loop, pretty print the loop structure on FILE. */
7194 void
7195 print_loops (FILE *file, int verbosity)
7197 basic_block bb;
7199 bb = ENTRY_BLOCK_PTR;
7200 if (bb && bb->loop_father)
7201 print_loop_and_siblings (file, bb->loop_father, 0, verbosity);
7204 /* Dump a loop. */
7206 DEBUG_FUNCTION void
7207 debug (struct loop &ref)
7209 print_loop (stderr, &ref, 0, /*verbosity*/0);
7212 DEBUG_FUNCTION void
7213 debug (struct loop *ptr)
7215 if (ptr)
7216 debug (*ptr);
7217 else
7218 fprintf (stderr, "<nil>\n");
7221 /* Dump a loop verbosely. */
7223 DEBUG_FUNCTION void
7224 debug_verbose (struct loop &ref)
7226 print_loop (stderr, &ref, 0, /*verbosity*/3);
7229 DEBUG_FUNCTION void
7230 debug_verbose (struct loop *ptr)
7232 if (ptr)
7233 debug (*ptr);
7234 else
7235 fprintf (stderr, "<nil>\n");
7239 /* Debugging loops structure at tree level, at some VERBOSITY level. */
7241 DEBUG_FUNCTION void
7242 debug_loops (int verbosity)
7244 print_loops (stderr, verbosity);
7247 /* Print on stderr the code of LOOP, at some VERBOSITY level. */
7249 DEBUG_FUNCTION void
7250 debug_loop (struct loop *loop, int verbosity)
7252 print_loop (stderr, loop, 0, verbosity);
7255 /* Print on stderr the code of loop number NUM, at some VERBOSITY
7256 level. */
7258 DEBUG_FUNCTION void
7259 debug_loop_num (unsigned num, int verbosity)
7261 debug_loop (get_loop (cfun, num), verbosity);
7264 /* Return true if BB ends with a call, possibly followed by some
7265 instructions that must stay with the call. Return false,
7266 otherwise. */
7268 static bool
7269 gimple_block_ends_with_call_p (basic_block bb)
7271 gimple_stmt_iterator gsi = gsi_last_nondebug_bb (bb);
7272 return !gsi_end_p (gsi) && is_gimple_call (gsi_stmt (gsi));
7276 /* Return true if BB ends with a conditional branch. Return false,
7277 otherwise. */
7279 static bool
7280 gimple_block_ends_with_condjump_p (const_basic_block bb)
7282 gimple stmt = last_stmt (CONST_CAST_BB (bb));
7283 return (stmt && gimple_code (stmt) == GIMPLE_COND);
7287 /* Return true if we need to add fake edge to exit at statement T.
7288 Helper function for gimple_flow_call_edges_add. */
7290 static bool
7291 need_fake_edge_p (gimple t)
7293 tree fndecl = NULL_TREE;
7294 int call_flags = 0;
7296 /* NORETURN and LONGJMP calls already have an edge to exit.
7297 CONST and PURE calls do not need one.
7298 We don't currently check for CONST and PURE here, although
7299 it would be a good idea, because those attributes are
7300 figured out from the RTL in mark_constant_function, and
7301 the counter incrementation code from -fprofile-arcs
7302 leads to different results from -fbranch-probabilities. */
7303 if (is_gimple_call (t))
7305 fndecl = gimple_call_fndecl (t);
7306 call_flags = gimple_call_flags (t);
7309 if (is_gimple_call (t)
7310 && fndecl
7311 && DECL_BUILT_IN (fndecl)
7312 && (call_flags & ECF_NOTHROW)
7313 && !(call_flags & ECF_RETURNS_TWICE)
7314 /* fork() doesn't really return twice, but the effect of
7315 wrapping it in __gcov_fork() which calls __gcov_flush()
7316 and clears the counters before forking has the same
7317 effect as returning twice. Force a fake edge. */
7318 && !(DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
7319 && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_FORK))
7320 return false;
7322 if (is_gimple_call (t))
7324 edge_iterator ei;
7325 edge e;
7326 basic_block bb;
7328 if (!(call_flags & ECF_NORETURN))
7329 return true;
7331 bb = gimple_bb (t);
7332 FOR_EACH_EDGE (e, ei, bb->succs)
7333 if ((e->flags & EDGE_FAKE) == 0)
7334 return true;
7337 if (gimple_code (t) == GIMPLE_ASM
7338 && (gimple_asm_volatile_p (t) || gimple_asm_input_p (t)))
7339 return true;
7341 return false;
7345 /* Add fake edges to the function exit for any non constant and non
7346 noreturn calls (or noreturn calls with EH/abnormal edges),
7347 volatile inline assembly in the bitmap of blocks specified by BLOCKS
7348 or to the whole CFG if BLOCKS is zero. Return the number of blocks
7349 that were split.
7351 The goal is to expose cases in which entering a basic block does
7352 not imply that all subsequent instructions must be executed. */
7354 static int
7355 gimple_flow_call_edges_add (sbitmap blocks)
7357 int i;
7358 int blocks_split = 0;
7359 int last_bb = last_basic_block;
7360 bool check_last_block = false;
7362 if (n_basic_blocks == NUM_FIXED_BLOCKS)
7363 return 0;
7365 if (! blocks)
7366 check_last_block = true;
7367 else
7368 check_last_block = bitmap_bit_p (blocks, EXIT_BLOCK_PTR->prev_bb->index);
7370 /* In the last basic block, before epilogue generation, there will be
7371 a fallthru edge to EXIT. Special care is required if the last insn
7372 of the last basic block is a call because make_edge folds duplicate
7373 edges, which would result in the fallthru edge also being marked
7374 fake, which would result in the fallthru edge being removed by
7375 remove_fake_edges, which would result in an invalid CFG.
7377 Moreover, we can't elide the outgoing fake edge, since the block
7378 profiler needs to take this into account in order to solve the minimal
7379 spanning tree in the case that the call doesn't return.
7381 Handle this by adding a dummy instruction in a new last basic block. */
7382 if (check_last_block)
7384 basic_block bb = EXIT_BLOCK_PTR->prev_bb;
7385 gimple_stmt_iterator gsi = gsi_last_nondebug_bb (bb);
7386 gimple t = NULL;
7388 if (!gsi_end_p (gsi))
7389 t = gsi_stmt (gsi);
7391 if (t && need_fake_edge_p (t))
7393 edge e;
7395 e = find_edge (bb, EXIT_BLOCK_PTR);
7396 if (e)
7398 gsi_insert_on_edge (e, gimple_build_nop ());
7399 gsi_commit_edge_inserts ();
7404 /* Now add fake edges to the function exit for any non constant
7405 calls since there is no way that we can determine if they will
7406 return or not... */
7407 for (i = 0; i < last_bb; i++)
7409 basic_block bb = BASIC_BLOCK (i);
7410 gimple_stmt_iterator gsi;
7411 gimple stmt, last_stmt;
7413 if (!bb)
7414 continue;
7416 if (blocks && !bitmap_bit_p (blocks, i))
7417 continue;
7419 gsi = gsi_last_nondebug_bb (bb);
7420 if (!gsi_end_p (gsi))
7422 last_stmt = gsi_stmt (gsi);
7425 stmt = gsi_stmt (gsi);
7426 if (need_fake_edge_p (stmt))
7428 edge e;
7430 /* The handling above of the final block before the
7431 epilogue should be enough to verify that there is
7432 no edge to the exit block in CFG already.
7433 Calling make_edge in such case would cause us to
7434 mark that edge as fake and remove it later. */
7435 #ifdef ENABLE_CHECKING
7436 if (stmt == last_stmt)
7438 e = find_edge (bb, EXIT_BLOCK_PTR);
7439 gcc_assert (e == NULL);
7441 #endif
7443 /* Note that the following may create a new basic block
7444 and renumber the existing basic blocks. */
7445 if (stmt != last_stmt)
7447 e = split_block (bb, stmt);
7448 if (e)
7449 blocks_split++;
7451 make_edge (bb, EXIT_BLOCK_PTR, EDGE_FAKE);
7453 gsi_prev (&gsi);
7455 while (!gsi_end_p (gsi));
7459 if (blocks_split)
7460 verify_flow_info ();
7462 return blocks_split;
7465 /* Removes edge E and all the blocks dominated by it, and updates dominance
7466 information. The IL in E->src needs to be updated separately.
7467 If dominance info is not available, only the edge E is removed.*/
7469 void
7470 remove_edge_and_dominated_blocks (edge e)
7472 vec<basic_block> bbs_to_remove = vNULL;
7473 vec<basic_block> bbs_to_fix_dom = vNULL;
7474 bitmap df, df_idom;
7475 edge f;
7476 edge_iterator ei;
7477 bool none_removed = false;
7478 unsigned i;
7479 basic_block bb, dbb;
7480 bitmap_iterator bi;
7482 if (!dom_info_available_p (CDI_DOMINATORS))
7484 remove_edge (e);
7485 return;
7488 /* No updating is needed for edges to exit. */
7489 if (e->dest == EXIT_BLOCK_PTR)
7491 if (cfgcleanup_altered_bbs)
7492 bitmap_set_bit (cfgcleanup_altered_bbs, e->src->index);
7493 remove_edge (e);
7494 return;
7497 /* First, we find the basic blocks to remove. If E->dest has a predecessor
7498 that is not dominated by E->dest, then this set is empty. Otherwise,
7499 all the basic blocks dominated by E->dest are removed.
7501 Also, to DF_IDOM we store the immediate dominators of the blocks in
7502 the dominance frontier of E (i.e., of the successors of the
7503 removed blocks, if there are any, and of E->dest otherwise). */
7504 FOR_EACH_EDGE (f, ei, e->dest->preds)
7506 if (f == e)
7507 continue;
7509 if (!dominated_by_p (CDI_DOMINATORS, f->src, e->dest))
7511 none_removed = true;
7512 break;
7516 df = BITMAP_ALLOC (NULL);
7517 df_idom = BITMAP_ALLOC (NULL);
7519 if (none_removed)
7520 bitmap_set_bit (df_idom,
7521 get_immediate_dominator (CDI_DOMINATORS, e->dest)->index);
7522 else
7524 bbs_to_remove = get_all_dominated_blocks (CDI_DOMINATORS, e->dest);
7525 FOR_EACH_VEC_ELT (bbs_to_remove, i, bb)
7527 FOR_EACH_EDGE (f, ei, bb->succs)
7529 if (f->dest != EXIT_BLOCK_PTR)
7530 bitmap_set_bit (df, f->dest->index);
7533 FOR_EACH_VEC_ELT (bbs_to_remove, i, bb)
7534 bitmap_clear_bit (df, bb->index);
7536 EXECUTE_IF_SET_IN_BITMAP (df, 0, i, bi)
7538 bb = BASIC_BLOCK (i);
7539 bitmap_set_bit (df_idom,
7540 get_immediate_dominator (CDI_DOMINATORS, bb)->index);
7544 if (cfgcleanup_altered_bbs)
7546 /* Record the set of the altered basic blocks. */
7547 bitmap_set_bit (cfgcleanup_altered_bbs, e->src->index);
7548 bitmap_ior_into (cfgcleanup_altered_bbs, df);
7551 /* Remove E and the cancelled blocks. */
7552 if (none_removed)
7553 remove_edge (e);
7554 else
7556 /* Walk backwards so as to get a chance to substitute all
7557 released DEFs into debug stmts. See
7558 eliminate_unnecessary_stmts() in tree-ssa-dce.c for more
7559 details. */
7560 for (i = bbs_to_remove.length (); i-- > 0; )
7561 delete_basic_block (bbs_to_remove[i]);
7564 /* Update the dominance information. The immediate dominator may change only
7565 for blocks whose immediate dominator belongs to DF_IDOM:
7567 Suppose that idom(X) = Y before removal of E and idom(X) != Y after the
7568 removal. Let Z the arbitrary block such that idom(Z) = Y and
7569 Z dominates X after the removal. Before removal, there exists a path P
7570 from Y to X that avoids Z. Let F be the last edge on P that is
7571 removed, and let W = F->dest. Before removal, idom(W) = Y (since Y
7572 dominates W, and because of P, Z does not dominate W), and W belongs to
7573 the dominance frontier of E. Therefore, Y belongs to DF_IDOM. */
7574 EXECUTE_IF_SET_IN_BITMAP (df_idom, 0, i, bi)
7576 bb = BASIC_BLOCK (i);
7577 for (dbb = first_dom_son (CDI_DOMINATORS, bb);
7578 dbb;
7579 dbb = next_dom_son (CDI_DOMINATORS, dbb))
7580 bbs_to_fix_dom.safe_push (dbb);
7583 iterate_fix_dominators (CDI_DOMINATORS, bbs_to_fix_dom, true);
7585 BITMAP_FREE (df);
7586 BITMAP_FREE (df_idom);
7587 bbs_to_remove.release ();
7588 bbs_to_fix_dom.release ();
7591 /* Purge dead EH edges from basic block BB. */
7593 bool
7594 gimple_purge_dead_eh_edges (basic_block bb)
7596 bool changed = false;
7597 edge e;
7598 edge_iterator ei;
7599 gimple stmt = last_stmt (bb);
7601 if (stmt && stmt_can_throw_internal (stmt))
7602 return false;
7604 for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
7606 if (e->flags & EDGE_EH)
7608 remove_edge_and_dominated_blocks (e);
7609 changed = true;
7611 else
7612 ei_next (&ei);
7615 return changed;
7618 /* Purge dead EH edges from basic block listed in BLOCKS. */
7620 bool
7621 gimple_purge_all_dead_eh_edges (const_bitmap blocks)
7623 bool changed = false;
7624 unsigned i;
7625 bitmap_iterator bi;
7627 EXECUTE_IF_SET_IN_BITMAP (blocks, 0, i, bi)
7629 basic_block bb = BASIC_BLOCK (i);
7631 /* Earlier gimple_purge_dead_eh_edges could have removed
7632 this basic block already. */
7633 gcc_assert (bb || changed);
7634 if (bb != NULL)
7635 changed |= gimple_purge_dead_eh_edges (bb);
7638 return changed;
7641 /* Purge dead abnormal call edges from basic block BB. */
7643 bool
7644 gimple_purge_dead_abnormal_call_edges (basic_block bb)
7646 bool changed = false;
7647 edge e;
7648 edge_iterator ei;
7649 gimple stmt = last_stmt (bb);
7651 if (!cfun->has_nonlocal_label
7652 && !cfun->calls_setjmp)
7653 return false;
7655 if (stmt && stmt_can_make_abnormal_goto (stmt))
7656 return false;
7658 for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
7660 if (e->flags & EDGE_ABNORMAL)
7662 if (e->flags & EDGE_FALLTHRU)
7663 e->flags &= ~EDGE_ABNORMAL;
7664 else
7665 remove_edge_and_dominated_blocks (e);
7666 changed = true;
7668 else
7669 ei_next (&ei);
7672 return changed;
7675 /* Purge dead abnormal call edges from basic block listed in BLOCKS. */
7677 bool
7678 gimple_purge_all_dead_abnormal_call_edges (const_bitmap blocks)
7680 bool changed = false;
7681 unsigned i;
7682 bitmap_iterator bi;
7684 EXECUTE_IF_SET_IN_BITMAP (blocks, 0, i, bi)
7686 basic_block bb = BASIC_BLOCK (i);
7688 /* Earlier gimple_purge_dead_abnormal_call_edges could have removed
7689 this basic block already. */
7690 gcc_assert (bb || changed);
7691 if (bb != NULL)
7692 changed |= gimple_purge_dead_abnormal_call_edges (bb);
7695 return changed;
7698 /* This function is called whenever a new edge is created or
7699 redirected. */
7701 static void
7702 gimple_execute_on_growing_pred (edge e)
7704 basic_block bb = e->dest;
7706 if (!gimple_seq_empty_p (phi_nodes (bb)))
7707 reserve_phi_args_for_new_edge (bb);
7710 /* This function is called immediately before edge E is removed from
7711 the edge vector E->dest->preds. */
7713 static void
7714 gimple_execute_on_shrinking_pred (edge e)
7716 if (!gimple_seq_empty_p (phi_nodes (e->dest)))
7717 remove_phi_args (e);
7720 /*---------------------------------------------------------------------------
7721 Helper functions for Loop versioning
7722 ---------------------------------------------------------------------------*/
7724 /* Adjust phi nodes for 'first' basic block. 'second' basic block is a copy
7725 of 'first'. Both of them are dominated by 'new_head' basic block. When
7726 'new_head' was created by 'second's incoming edge it received phi arguments
7727 on the edge by split_edge(). Later, additional edge 'e' was created to
7728 connect 'new_head' and 'first'. Now this routine adds phi args on this
7729 additional edge 'e' that new_head to second edge received as part of edge
7730 splitting. */
7732 static void
7733 gimple_lv_adjust_loop_header_phi (basic_block first, basic_block second,
7734 basic_block new_head, edge e)
7736 gimple phi1, phi2;
7737 gimple_stmt_iterator psi1, psi2;
7738 tree def;
7739 edge e2 = find_edge (new_head, second);
7741 /* Because NEW_HEAD has been created by splitting SECOND's incoming
7742 edge, we should always have an edge from NEW_HEAD to SECOND. */
7743 gcc_assert (e2 != NULL);
7745 /* Browse all 'second' basic block phi nodes and add phi args to
7746 edge 'e' for 'first' head. PHI args are always in correct order. */
7748 for (psi2 = gsi_start_phis (second),
7749 psi1 = gsi_start_phis (first);
7750 !gsi_end_p (psi2) && !gsi_end_p (psi1);
7751 gsi_next (&psi2), gsi_next (&psi1))
7753 phi1 = gsi_stmt (psi1);
7754 phi2 = gsi_stmt (psi2);
7755 def = PHI_ARG_DEF (phi2, e2->dest_idx);
7756 add_phi_arg (phi1, def, e, gimple_phi_arg_location_from_edge (phi2, e2));
7761 /* Adds a if else statement to COND_BB with condition COND_EXPR.
7762 SECOND_HEAD is the destination of the THEN and FIRST_HEAD is
7763 the destination of the ELSE part. */
7765 static void
7766 gimple_lv_add_condition_to_bb (basic_block first_head ATTRIBUTE_UNUSED,
7767 basic_block second_head ATTRIBUTE_UNUSED,
7768 basic_block cond_bb, void *cond_e)
7770 gimple_stmt_iterator gsi;
7771 gimple new_cond_expr;
7772 tree cond_expr = (tree) cond_e;
7773 edge e0;
7775 /* Build new conditional expr */
7776 new_cond_expr = gimple_build_cond_from_tree (cond_expr,
7777 NULL_TREE, NULL_TREE);
7779 /* Add new cond in cond_bb. */
7780 gsi = gsi_last_bb (cond_bb);
7781 gsi_insert_after (&gsi, new_cond_expr, GSI_NEW_STMT);
7783 /* Adjust edges appropriately to connect new head with first head
7784 as well as second head. */
7785 e0 = single_succ_edge (cond_bb);
7786 e0->flags &= ~EDGE_FALLTHRU;
7787 e0->flags |= EDGE_FALSE_VALUE;
7791 /* Do book-keeping of basic block BB for the profile consistency checker.
7792 If AFTER_PASS is 0, do pre-pass accounting, or if AFTER_PASS is 1
7793 then do post-pass accounting. Store the counting in RECORD. */
7794 static void
7795 gimple_account_profile_record (basic_block bb, int after_pass,
7796 struct profile_record *record)
7798 gimple_stmt_iterator i;
7799 for (i = gsi_start_bb (bb); !gsi_end_p (i); gsi_next (&i))
7801 record->size[after_pass]
7802 += estimate_num_insns (gsi_stmt (i), &eni_size_weights);
7803 if (profile_status == PROFILE_READ)
7804 record->time[after_pass]
7805 += estimate_num_insns (gsi_stmt (i),
7806 &eni_time_weights) * bb->count;
7807 else if (profile_status == PROFILE_GUESSED)
7808 record->time[after_pass]
7809 += estimate_num_insns (gsi_stmt (i),
7810 &eni_time_weights) * bb->frequency;
7814 struct cfg_hooks gimple_cfg_hooks = {
7815 "gimple",
7816 gimple_verify_flow_info,
7817 gimple_dump_bb, /* dump_bb */
7818 gimple_dump_bb_for_graph, /* dump_bb_for_graph */
7819 create_bb, /* create_basic_block */
7820 gimple_redirect_edge_and_branch, /* redirect_edge_and_branch */
7821 gimple_redirect_edge_and_branch_force, /* redirect_edge_and_branch_force */
7822 gimple_can_remove_branch_p, /* can_remove_branch_p */
7823 remove_bb, /* delete_basic_block */
7824 gimple_split_block, /* split_block */
7825 gimple_move_block_after, /* move_block_after */
7826 gimple_can_merge_blocks_p, /* can_merge_blocks_p */
7827 gimple_merge_blocks, /* merge_blocks */
7828 gimple_predict_edge, /* predict_edge */
7829 gimple_predicted_by_p, /* predicted_by_p */
7830 gimple_can_duplicate_bb_p, /* can_duplicate_block_p */
7831 gimple_duplicate_bb, /* duplicate_block */
7832 gimple_split_edge, /* split_edge */
7833 gimple_make_forwarder_block, /* make_forward_block */
7834 NULL, /* tidy_fallthru_edge */
7835 NULL, /* force_nonfallthru */
7836 gimple_block_ends_with_call_p,/* block_ends_with_call_p */
7837 gimple_block_ends_with_condjump_p, /* block_ends_with_condjump_p */
7838 gimple_flow_call_edges_add, /* flow_call_edges_add */
7839 gimple_execute_on_growing_pred, /* execute_on_growing_pred */
7840 gimple_execute_on_shrinking_pred, /* execute_on_shrinking_pred */
7841 gimple_duplicate_loop_to_header_edge, /* duplicate loop for trees */
7842 gimple_lv_add_condition_to_bb, /* lv_add_condition_to_bb */
7843 gimple_lv_adjust_loop_header_phi, /* lv_adjust_loop_header_phi*/
7844 extract_true_false_edges_from_block, /* extract_cond_bb_edges */
7845 flush_pending_stmts, /* flush_pending_stmts */
7846 gimple_empty_block_p, /* block_empty_p */
7847 gimple_split_block_before_cond_jump, /* split_block_before_cond_jump */
7848 gimple_account_profile_record,
7852 /* Split all critical edges. */
7854 static unsigned int
7855 split_critical_edges (void)
7857 basic_block bb;
7858 edge e;
7859 edge_iterator ei;
7861 /* split_edge can redirect edges out of SWITCH_EXPRs, which can get
7862 expensive. So we want to enable recording of edge to CASE_LABEL_EXPR
7863 mappings around the calls to split_edge. */
7864 start_recording_case_labels ();
7865 FOR_ALL_BB (bb)
7867 FOR_EACH_EDGE (e, ei, bb->succs)
7869 if (EDGE_CRITICAL_P (e) && !(e->flags & EDGE_ABNORMAL))
7870 split_edge (e);
7871 /* PRE inserts statements to edges and expects that
7872 since split_critical_edges was done beforehand, committing edge
7873 insertions will not split more edges. In addition to critical
7874 edges we must split edges that have multiple successors and
7875 end by control flow statements, such as RESX.
7876 Go ahead and split them too. This matches the logic in
7877 gimple_find_edge_insert_loc. */
7878 else if ((!single_pred_p (e->dest)
7879 || !gimple_seq_empty_p (phi_nodes (e->dest))
7880 || e->dest == EXIT_BLOCK_PTR)
7881 && e->src != ENTRY_BLOCK_PTR
7882 && !(e->flags & EDGE_ABNORMAL))
7884 gimple_stmt_iterator gsi;
7886 gsi = gsi_last_bb (e->src);
7887 if (!gsi_end_p (gsi)
7888 && stmt_ends_bb_p (gsi_stmt (gsi))
7889 && (gimple_code (gsi_stmt (gsi)) != GIMPLE_RETURN
7890 && !gimple_call_builtin_p (gsi_stmt (gsi),
7891 BUILT_IN_RETURN)))
7892 split_edge (e);
7896 end_recording_case_labels ();
7897 return 0;
7900 namespace {
7902 const pass_data pass_data_split_crit_edges =
7904 GIMPLE_PASS, /* type */
7905 "crited", /* name */
7906 OPTGROUP_NONE, /* optinfo_flags */
7907 false, /* has_gate */
7908 true, /* has_execute */
7909 TV_TREE_SPLIT_EDGES, /* tv_id */
7910 PROP_cfg, /* properties_required */
7911 PROP_no_crit_edges, /* properties_provided */
7912 0, /* properties_destroyed */
7913 0, /* todo_flags_start */
7914 TODO_verify_flow, /* todo_flags_finish */
7917 class pass_split_crit_edges : public gimple_opt_pass
7919 public:
7920 pass_split_crit_edges (gcc::context *ctxt)
7921 : gimple_opt_pass (pass_data_split_crit_edges, ctxt)
7924 /* opt_pass methods: */
7925 unsigned int execute () { return split_critical_edges (); }
7927 opt_pass * clone () { return new pass_split_crit_edges (m_ctxt); }
7928 }; // class pass_split_crit_edges
7930 } // anon namespace
7932 gimple_opt_pass *
7933 make_pass_split_crit_edges (gcc::context *ctxt)
7935 return new pass_split_crit_edges (ctxt);
7939 /* Build a ternary operation and gimplify it. Emit code before GSI.
7940 Return the gimple_val holding the result. */
7942 tree
7943 gimplify_build3 (gimple_stmt_iterator *gsi, enum tree_code code,
7944 tree type, tree a, tree b, tree c)
7946 tree ret;
7947 location_t loc = gimple_location (gsi_stmt (*gsi));
7949 ret = fold_build3_loc (loc, code, type, a, b, c);
7950 STRIP_NOPS (ret);
7952 return force_gimple_operand_gsi (gsi, ret, true, NULL, true,
7953 GSI_SAME_STMT);
7956 /* Build a binary operation and gimplify it. Emit code before GSI.
7957 Return the gimple_val holding the result. */
7959 tree
7960 gimplify_build2 (gimple_stmt_iterator *gsi, enum tree_code code,
7961 tree type, tree a, tree b)
7963 tree ret;
7965 ret = fold_build2_loc (gimple_location (gsi_stmt (*gsi)), code, type, a, b);
7966 STRIP_NOPS (ret);
7968 return force_gimple_operand_gsi (gsi, ret, true, NULL, true,
7969 GSI_SAME_STMT);
7972 /* Build a unary operation and gimplify it. Emit code before GSI.
7973 Return the gimple_val holding the result. */
7975 tree
7976 gimplify_build1 (gimple_stmt_iterator *gsi, enum tree_code code, tree type,
7977 tree a)
7979 tree ret;
7981 ret = fold_build1_loc (gimple_location (gsi_stmt (*gsi)), code, type, a);
7982 STRIP_NOPS (ret);
7984 return force_gimple_operand_gsi (gsi, ret, true, NULL, true,
7985 GSI_SAME_STMT);
7990 /* Emit return warnings. */
7992 static unsigned int
7993 execute_warn_function_return (void)
7995 source_location location;
7996 gimple last;
7997 edge e;
7998 edge_iterator ei;
8000 if (!targetm.warn_func_return (cfun->decl))
8001 return 0;
8003 /* If we have a path to EXIT, then we do return. */
8004 if (TREE_THIS_VOLATILE (cfun->decl)
8005 && EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0)
8007 location = UNKNOWN_LOCATION;
8008 FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
8010 last = last_stmt (e->src);
8011 if ((gimple_code (last) == GIMPLE_RETURN
8012 || gimple_call_builtin_p (last, BUILT_IN_RETURN))
8013 && (location = gimple_location (last)) != UNKNOWN_LOCATION)
8014 break;
8016 if (location == UNKNOWN_LOCATION)
8017 location = cfun->function_end_locus;
8018 warning_at (location, 0, "%<noreturn%> function does return");
8021 /* If we see "return;" in some basic block, then we do reach the end
8022 without returning a value. */
8023 else if (warn_return_type
8024 && !TREE_NO_WARNING (cfun->decl)
8025 && EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0
8026 && !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (cfun->decl))))
8028 FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
8030 gimple last = last_stmt (e->src);
8031 if (gimple_code (last) == GIMPLE_RETURN
8032 && gimple_return_retval (last) == NULL
8033 && !gimple_no_warning_p (last))
8035 location = gimple_location (last);
8036 if (location == UNKNOWN_LOCATION)
8037 location = cfun->function_end_locus;
8038 warning_at (location, OPT_Wreturn_type, "control reaches end of non-void function");
8039 TREE_NO_WARNING (cfun->decl) = 1;
8040 break;
8044 return 0;
8048 /* Given a basic block B which ends with a conditional and has
8049 precisely two successors, determine which of the edges is taken if
8050 the conditional is true and which is taken if the conditional is
8051 false. Set TRUE_EDGE and FALSE_EDGE appropriately. */
8053 void
8054 extract_true_false_edges_from_block (basic_block b,
8055 edge *true_edge,
8056 edge *false_edge)
8058 edge e = EDGE_SUCC (b, 0);
8060 if (e->flags & EDGE_TRUE_VALUE)
8062 *true_edge = e;
8063 *false_edge = EDGE_SUCC (b, 1);
8065 else
8067 *false_edge = e;
8068 *true_edge = EDGE_SUCC (b, 1);
8072 namespace {
8074 const pass_data pass_data_warn_function_return =
8076 GIMPLE_PASS, /* type */
8077 "*warn_function_return", /* name */
8078 OPTGROUP_NONE, /* optinfo_flags */
8079 false, /* has_gate */
8080 true, /* has_execute */
8081 TV_NONE, /* tv_id */
8082 PROP_cfg, /* properties_required */
8083 0, /* properties_provided */
8084 0, /* properties_destroyed */
8085 0, /* todo_flags_start */
8086 0, /* todo_flags_finish */
8089 class pass_warn_function_return : public gimple_opt_pass
8091 public:
8092 pass_warn_function_return (gcc::context *ctxt)
8093 : gimple_opt_pass (pass_data_warn_function_return, ctxt)
8096 /* opt_pass methods: */
8097 unsigned int execute () { return execute_warn_function_return (); }
8099 }; // class pass_warn_function_return
8101 } // anon namespace
8103 gimple_opt_pass *
8104 make_pass_warn_function_return (gcc::context *ctxt)
8106 return new pass_warn_function_return (ctxt);
8109 /* Walk a gimplified function and warn for functions whose return value is
8110 ignored and attribute((warn_unused_result)) is set. This is done before
8111 inlining, so we don't have to worry about that. */
8113 static void
8114 do_warn_unused_result (gimple_seq seq)
8116 tree fdecl, ftype;
8117 gimple_stmt_iterator i;
8119 for (i = gsi_start (seq); !gsi_end_p (i); gsi_next (&i))
8121 gimple g = gsi_stmt (i);
8123 switch (gimple_code (g))
8125 case GIMPLE_BIND:
8126 do_warn_unused_result (gimple_bind_body (g));
8127 break;
8128 case GIMPLE_TRY:
8129 do_warn_unused_result (gimple_try_eval (g));
8130 do_warn_unused_result (gimple_try_cleanup (g));
8131 break;
8132 case GIMPLE_CATCH:
8133 do_warn_unused_result (gimple_catch_handler (g));
8134 break;
8135 case GIMPLE_EH_FILTER:
8136 do_warn_unused_result (gimple_eh_filter_failure (g));
8137 break;
8139 case GIMPLE_CALL:
8140 if (gimple_call_lhs (g))
8141 break;
8142 if (gimple_call_internal_p (g))
8143 break;
8145 /* This is a naked call, as opposed to a GIMPLE_CALL with an
8146 LHS. All calls whose value is ignored should be
8147 represented like this. Look for the attribute. */
8148 fdecl = gimple_call_fndecl (g);
8149 ftype = gimple_call_fntype (g);
8151 if (lookup_attribute ("warn_unused_result", TYPE_ATTRIBUTES (ftype)))
8153 location_t loc = gimple_location (g);
8155 if (fdecl)
8156 warning_at (loc, OPT_Wunused_result,
8157 "ignoring return value of %qD, "
8158 "declared with attribute warn_unused_result",
8159 fdecl);
8160 else
8161 warning_at (loc, OPT_Wunused_result,
8162 "ignoring return value of function "
8163 "declared with attribute warn_unused_result");
8165 break;
8167 default:
8168 /* Not a container, not a call, or a call whose value is used. */
8169 break;
8174 static unsigned int
8175 run_warn_unused_result (void)
8177 do_warn_unused_result (gimple_body (current_function_decl));
8178 return 0;
8181 static bool
8182 gate_warn_unused_result (void)
8184 return flag_warn_unused_result;
8187 namespace {
8189 const pass_data pass_data_warn_unused_result =
8191 GIMPLE_PASS, /* type */
8192 "*warn_unused_result", /* name */
8193 OPTGROUP_NONE, /* optinfo_flags */
8194 true, /* has_gate */
8195 true, /* has_execute */
8196 TV_NONE, /* tv_id */
8197 PROP_gimple_any, /* properties_required */
8198 0, /* properties_provided */
8199 0, /* properties_destroyed */
8200 0, /* todo_flags_start */
8201 0, /* todo_flags_finish */
8204 class pass_warn_unused_result : public gimple_opt_pass
8206 public:
8207 pass_warn_unused_result (gcc::context *ctxt)
8208 : gimple_opt_pass (pass_data_warn_unused_result, ctxt)
8211 /* opt_pass methods: */
8212 bool gate () { return gate_warn_unused_result (); }
8213 unsigned int execute () { return run_warn_unused_result (); }
8215 }; // class pass_warn_unused_result
8217 } // anon namespace
8219 gimple_opt_pass *
8220 make_pass_warn_unused_result (gcc::context *ctxt)
8222 return new pass_warn_unused_result (ctxt);
8225 /* IPA passes, compilation of earlier functions or inlining
8226 might have changed some properties, such as marked functions nothrow,
8227 pure, const or noreturn.
8228 Remove redundant edges and basic blocks, and create new ones if necessary.
8230 This pass can't be executed as stand alone pass from pass manager, because
8231 in between inlining and this fixup the verify_flow_info would fail. */
8233 unsigned int
8234 execute_fixup_cfg (void)
8236 basic_block bb;
8237 gimple_stmt_iterator gsi;
8238 int todo = gimple_in_ssa_p (cfun) ? TODO_verify_ssa : 0;
8239 gcov_type count_scale;
8240 edge e;
8241 edge_iterator ei;
8243 count_scale
8244 = GCOV_COMPUTE_SCALE (cgraph_get_node (current_function_decl)->count,
8245 ENTRY_BLOCK_PTR->count);
8247 ENTRY_BLOCK_PTR->count = cgraph_get_node (current_function_decl)->count;
8248 EXIT_BLOCK_PTR->count = apply_scale (EXIT_BLOCK_PTR->count,
8249 count_scale);
8251 FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
8252 e->count = apply_scale (e->count, count_scale);
8254 FOR_EACH_BB (bb)
8256 bb->count = apply_scale (bb->count, count_scale);
8257 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
8259 gimple stmt = gsi_stmt (gsi);
8260 tree decl = is_gimple_call (stmt)
8261 ? gimple_call_fndecl (stmt)
8262 : NULL;
8263 if (decl)
8265 int flags = gimple_call_flags (stmt);
8266 if (flags & (ECF_CONST | ECF_PURE | ECF_LOOPING_CONST_OR_PURE))
8268 if (gimple_purge_dead_abnormal_call_edges (bb))
8269 todo |= TODO_cleanup_cfg;
8271 if (gimple_in_ssa_p (cfun))
8273 todo |= TODO_update_ssa | TODO_cleanup_cfg;
8274 update_stmt (stmt);
8278 if (flags & ECF_NORETURN
8279 && fixup_noreturn_call (stmt))
8280 todo |= TODO_cleanup_cfg;
8283 if (maybe_clean_eh_stmt (stmt)
8284 && gimple_purge_dead_eh_edges (bb))
8285 todo |= TODO_cleanup_cfg;
8288 FOR_EACH_EDGE (e, ei, bb->succs)
8289 e->count = apply_scale (e->count, count_scale);
8291 /* If we have a basic block with no successors that does not
8292 end with a control statement or a noreturn call end it with
8293 a call to __builtin_unreachable. This situation can occur
8294 when inlining a noreturn call that does in fact return. */
8295 if (EDGE_COUNT (bb->succs) == 0)
8297 gimple stmt = last_stmt (bb);
8298 if (!stmt
8299 || (!is_ctrl_stmt (stmt)
8300 && (!is_gimple_call (stmt)
8301 || (gimple_call_flags (stmt) & ECF_NORETURN) == 0)))
8303 stmt = gimple_build_call
8304 (builtin_decl_implicit (BUILT_IN_UNREACHABLE), 0);
8305 gimple_stmt_iterator gsi = gsi_last_bb (bb);
8306 gsi_insert_after (&gsi, stmt, GSI_NEW_STMT);
8310 if (count_scale != REG_BR_PROB_BASE)
8311 compute_function_frequency ();
8313 /* We just processed all calls. */
8314 if (cfun->gimple_df)
8315 vec_free (MODIFIED_NORETURN_CALLS (cfun));
8317 /* Dump a textual representation of the flowgraph. */
8318 if (dump_file)
8319 gimple_dump_cfg (dump_file, dump_flags);
8321 if (current_loops
8322 && (todo & TODO_cleanup_cfg))
8323 loops_state_set (LOOPS_NEED_FIXUP);
8325 return todo;
8328 namespace {
8330 const pass_data pass_data_fixup_cfg =
8332 GIMPLE_PASS, /* type */
8333 "*free_cfg_annotations", /* name */
8334 OPTGROUP_NONE, /* optinfo_flags */
8335 false, /* has_gate */
8336 true, /* has_execute */
8337 TV_NONE, /* tv_id */
8338 PROP_cfg, /* properties_required */
8339 0, /* properties_provided */
8340 0, /* properties_destroyed */
8341 0, /* todo_flags_start */
8342 0, /* todo_flags_finish */
8345 class pass_fixup_cfg : public gimple_opt_pass
8347 public:
8348 pass_fixup_cfg (gcc::context *ctxt)
8349 : gimple_opt_pass (pass_data_fixup_cfg, ctxt)
8352 /* opt_pass methods: */
8353 opt_pass * clone () { return new pass_fixup_cfg (m_ctxt); }
8354 unsigned int execute () { return execute_fixup_cfg (); }
8356 }; // class pass_fixup_cfg
8358 } // anon namespace
8360 gimple_opt_pass *
8361 make_pass_fixup_cfg (gcc::context *ctxt)
8363 return new pass_fixup_cfg (ctxt);
8366 /* Garbage collection support for edge_def. */
8368 extern void gt_ggc_mx (tree&);
8369 extern void gt_ggc_mx (gimple&);
8370 extern void gt_ggc_mx (rtx&);
8371 extern void gt_ggc_mx (basic_block&);
8373 void
8374 gt_ggc_mx (edge_def *e)
8376 tree block = LOCATION_BLOCK (e->goto_locus);
8377 gt_ggc_mx (e->src);
8378 gt_ggc_mx (e->dest);
8379 if (current_ir_type () == IR_GIMPLE)
8380 gt_ggc_mx (e->insns.g);
8381 else
8382 gt_ggc_mx (e->insns.r);
8383 gt_ggc_mx (block);
8386 /* PCH support for edge_def. */
8388 extern void gt_pch_nx (tree&);
8389 extern void gt_pch_nx (gimple&);
8390 extern void gt_pch_nx (rtx&);
8391 extern void gt_pch_nx (basic_block&);
8393 void
8394 gt_pch_nx (edge_def *e)
8396 tree block = LOCATION_BLOCK (e->goto_locus);
8397 gt_pch_nx (e->src);
8398 gt_pch_nx (e->dest);
8399 if (current_ir_type () == IR_GIMPLE)
8400 gt_pch_nx (e->insns.g);
8401 else
8402 gt_pch_nx (e->insns.r);
8403 gt_pch_nx (block);
8406 void
8407 gt_pch_nx (edge_def *e, gt_pointer_operator op, void *cookie)
8409 tree block = LOCATION_BLOCK (e->goto_locus);
8410 op (&(e->src), cookie);
8411 op (&(e->dest), cookie);
8412 if (current_ir_type () == IR_GIMPLE)
8413 op (&(e->insns.g), cookie);
8414 else
8415 op (&(e->insns.r), cookie);
8416 op (&(block), cookie);