Daily bump.
[official-gcc.git] / gcc / tree-cfg.cc
blobd98b68d678716602afbfada4b9a761f0beeee231
1 /* Control flow functions for trees.
2 Copyright (C) 2001-2024 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 "backend.h"
25 #include "target.h"
26 #include "rtl.h"
27 #include "tree.h"
28 #include "gimple.h"
29 #include "cfghooks.h"
30 #include "tree-pass.h"
31 #include "ssa.h"
32 #include "cgraph.h"
33 #include "gimple-pretty-print.h"
34 #include "diagnostic-core.h"
35 #include "fold-const.h"
36 #include "trans-mem.h"
37 #include "stor-layout.h"
38 #include "print-tree.h"
39 #include "cfganal.h"
40 #include "gimple-iterator.h"
41 #include "gimple-fold.h"
42 #include "tree-eh.h"
43 #include "gimplify-me.h"
44 #include "gimple-walk.h"
45 #include "tree-cfg.h"
46 #include "tree-ssa-loop-manip.h"
47 #include "tree-ssa-loop-niter.h"
48 #include "tree-into-ssa.h"
49 #include "tree-dfa.h"
50 #include "tree-ssa.h"
51 #include "except.h"
52 #include "cfgloop.h"
53 #include "tree-ssa-propagate.h"
54 #include "value-prof.h"
55 #include "tree-inline.h"
56 #include "tree-ssa-live.h"
57 #include "tree-ssa-dce.h"
58 #include "omp-general.h"
59 #include "omp-expand.h"
60 #include "tree-cfgcleanup.h"
61 #include "gimplify.h"
62 #include "attribs.h"
63 #include "selftest.h"
64 #include "opts.h"
65 #include "asan.h"
66 #include "profile.h"
67 #include "sreal.h"
69 /* This file contains functions for building the Control Flow Graph (CFG)
70 for a function tree. */
72 /* Local declarations. */
74 /* Initial capacity for the basic block array. */
75 static const int initial_cfg_capacity = 20;
77 /* This hash table allows us to efficiently lookup all CASE_LABEL_EXPRs
78 which use a particular edge. The CASE_LABEL_EXPRs are chained together
79 via their CASE_CHAIN field, which we clear after we're done with the
80 hash table to prevent problems with duplication of GIMPLE_SWITCHes.
82 Access to this list of CASE_LABEL_EXPRs allows us to efficiently
83 update the case vector in response to edge redirections.
85 Right now this table is set up and torn down at key points in the
86 compilation process. It would be nice if we could make the table
87 more persistent. The key is getting notification of changes to
88 the CFG (particularly edge removal, creation and redirection). */
90 static hash_map<edge, tree> *edge_to_cases;
92 /* If we record edge_to_cases, this bitmap will hold indexes
93 of basic blocks that end in a GIMPLE_SWITCH which we touched
94 due to edge manipulations. */
96 static bitmap touched_switch_bbs;
98 /* OpenMP region idxs for blocks during cfg pass. */
99 static vec<int> bb_to_omp_idx;
101 /* CFG statistics. */
102 struct cfg_stats_d
104 long num_merged_labels;
107 static struct cfg_stats_d cfg_stats;
109 /* Data to pass to replace_block_vars_by_duplicates_1. */
110 struct replace_decls_d
112 hash_map<tree, tree> *vars_map;
113 tree to_context;
116 /* Hash table to store last discriminator assigned for each locus. */
117 struct locus_discrim_map
119 int location_line;
120 int discriminator;
123 /* Hashtable helpers. */
125 struct locus_discrim_hasher : free_ptr_hash <locus_discrim_map>
127 static inline hashval_t hash (const locus_discrim_map *);
128 static inline bool equal (const locus_discrim_map *,
129 const locus_discrim_map *);
132 /* Trivial hash function for a location_t. ITEM is a pointer to
133 a hash table entry that maps a location_t to a discriminator. */
135 inline hashval_t
136 locus_discrim_hasher::hash (const locus_discrim_map *item)
138 return item->location_line;
141 /* Equality function for the locus-to-discriminator map. A and B
142 point to the two hash table entries to compare. */
144 inline bool
145 locus_discrim_hasher::equal (const locus_discrim_map *a,
146 const locus_discrim_map *b)
148 return a->location_line == b->location_line;
151 static hash_table<locus_discrim_hasher> *discriminator_per_locus;
153 /* Basic blocks and flowgraphs. */
154 static void make_blocks (gimple_seq);
156 /* Edges. */
157 static void make_edges (void);
158 static void assign_discriminators (void);
159 static void make_cond_expr_edges (basic_block);
160 static void make_gimple_switch_edges (gswitch *, basic_block);
161 static bool make_goto_expr_edges (basic_block);
162 static void make_gimple_asm_edges (basic_block);
163 static edge gimple_redirect_edge_and_branch (edge, basic_block);
164 static edge gimple_try_redirect_by_replacing_jump (edge, basic_block);
166 /* Various helpers. */
167 static inline bool stmt_starts_bb_p (gimple *, gimple *);
168 static bool gimple_verify_flow_info (void);
169 static void gimple_make_forwarder_block (edge);
170 static gimple *first_non_label_stmt (basic_block);
171 static bool verify_gimple_transaction (gtransaction *);
172 static bool call_can_make_abnormal_goto (gimple *);
174 /* Flowgraph optimization and cleanup. */
175 static void gimple_merge_blocks (basic_block, basic_block);
176 static bool gimple_can_merge_blocks_p (basic_block, basic_block);
177 static void remove_bb (basic_block);
178 static edge find_taken_edge_computed_goto (basic_block, tree);
179 static edge find_taken_edge_cond_expr (const gcond *, tree);
181 void
182 init_empty_tree_cfg_for_function (struct function *fn)
184 /* Initialize the basic block array. */
185 init_flow (fn);
186 profile_status_for_fn (fn) = PROFILE_ABSENT;
187 n_basic_blocks_for_fn (fn) = NUM_FIXED_BLOCKS;
188 last_basic_block_for_fn (fn) = NUM_FIXED_BLOCKS;
189 vec_safe_grow_cleared (basic_block_info_for_fn (fn),
190 initial_cfg_capacity, true);
192 /* Build a mapping of labels to their associated blocks. */
193 vec_safe_grow_cleared (label_to_block_map_for_fn (fn),
194 initial_cfg_capacity, true);
196 SET_BASIC_BLOCK_FOR_FN (fn, ENTRY_BLOCK, ENTRY_BLOCK_PTR_FOR_FN (fn));
197 SET_BASIC_BLOCK_FOR_FN (fn, EXIT_BLOCK, EXIT_BLOCK_PTR_FOR_FN (fn));
199 ENTRY_BLOCK_PTR_FOR_FN (fn)->next_bb
200 = EXIT_BLOCK_PTR_FOR_FN (fn);
201 EXIT_BLOCK_PTR_FOR_FN (fn)->prev_bb
202 = ENTRY_BLOCK_PTR_FOR_FN (fn);
205 void
206 init_empty_tree_cfg (void)
208 init_empty_tree_cfg_for_function (cfun);
211 /*---------------------------------------------------------------------------
212 Create basic blocks
213 ---------------------------------------------------------------------------*/
215 /* Entry point to the CFG builder for trees. SEQ is the sequence of
216 statements to be added to the flowgraph. */
218 static void
219 build_gimple_cfg (gimple_seq seq)
221 /* Register specific gimple functions. */
222 gimple_register_cfg_hooks ();
224 memset ((void *) &cfg_stats, 0, sizeof (cfg_stats));
226 init_empty_tree_cfg ();
228 make_blocks (seq);
230 /* Make sure there is always at least one block, even if it's empty. */
231 if (n_basic_blocks_for_fn (cfun) == NUM_FIXED_BLOCKS)
232 create_empty_bb (ENTRY_BLOCK_PTR_FOR_FN (cfun));
234 /* Adjust the size of the array. */
235 if (basic_block_info_for_fn (cfun)->length ()
236 < (size_t) n_basic_blocks_for_fn (cfun))
237 vec_safe_grow_cleared (basic_block_info_for_fn (cfun),
238 n_basic_blocks_for_fn (cfun));
240 /* To speed up statement iterator walks, we first purge dead labels. */
241 cleanup_dead_labels ();
243 /* Group case nodes to reduce the number of edges.
244 We do this after cleaning up dead labels because otherwise we miss
245 a lot of obvious case merging opportunities. */
246 group_case_labels ();
248 /* Create the edges of the flowgraph. */
249 discriminator_per_locus = new hash_table<locus_discrim_hasher> (13);
250 make_edges ();
251 assign_discriminators ();
252 cleanup_dead_labels ();
253 delete discriminator_per_locus;
254 discriminator_per_locus = NULL;
257 /* Look for ANNOTATE calls with loop annotation kind in BB; if found, remove
258 them and propagate the information to LOOP. We assume that the annotations
259 come immediately before the condition in BB, if any. */
261 static void
262 replace_loop_annotate_in_block (basic_block bb, class loop *loop)
264 gimple_stmt_iterator gsi = gsi_last_bb (bb);
265 gimple *stmt = gsi_stmt (gsi);
267 if (!(stmt && gimple_code (stmt) == GIMPLE_COND))
268 return;
270 for (gsi_prev_nondebug (&gsi); !gsi_end_p (gsi); gsi_prev (&gsi))
272 stmt = gsi_stmt (gsi);
273 if (gimple_code (stmt) != GIMPLE_CALL)
274 break;
275 if (!gimple_call_internal_p (stmt)
276 || gimple_call_internal_fn (stmt) != IFN_ANNOTATE)
277 break;
279 switch ((annot_expr_kind) tree_to_shwi (gimple_call_arg (stmt, 1)))
281 case annot_expr_ivdep_kind:
282 loop->safelen = INT_MAX;
283 break;
284 case annot_expr_unroll_kind:
285 loop->unroll
286 = (unsigned short) tree_to_shwi (gimple_call_arg (stmt, 2));
287 cfun->has_unroll = true;
288 break;
289 case annot_expr_no_vector_kind:
290 loop->dont_vectorize = true;
291 break;
292 case annot_expr_vector_kind:
293 loop->force_vectorize = true;
294 cfun->has_force_vectorize_loops = true;
295 break;
296 case annot_expr_parallel_kind:
297 loop->can_be_parallel = true;
298 loop->safelen = INT_MAX;
299 break;
300 case annot_expr_maybe_infinite_kind:
301 loop->finite_p = false;
302 break;
303 default:
304 gcc_unreachable ();
307 stmt = gimple_build_assign (gimple_call_lhs (stmt),
308 gimple_call_arg (stmt, 0));
309 gsi_replace (&gsi, stmt, true);
313 /* Look for ANNOTATE calls with loop annotation kind; if found, remove
314 them and propagate the information to the loop. We assume that the
315 annotations come immediately before the condition of the loop. */
317 static void
318 replace_loop_annotate (void)
320 basic_block bb;
321 gimple_stmt_iterator gsi;
322 gimple *stmt;
324 for (auto loop : loops_list (cfun, 0))
326 /* Push the global flag_finite_loops state down to individual loops. */
327 loop->finite_p = flag_finite_loops;
329 /* Check all exit source blocks for annotations. */
330 for (auto e : get_loop_exit_edges (loop))
331 replace_loop_annotate_in_block (e->src, loop);
334 /* Remove IFN_ANNOTATE. Safeguard for the case loop->latch == NULL. */
335 FOR_EACH_BB_FN (bb, cfun)
337 for (gsi = gsi_last_bb (bb); !gsi_end_p (gsi); gsi_prev (&gsi))
339 stmt = gsi_stmt (gsi);
340 if (gimple_code (stmt) != GIMPLE_CALL)
341 continue;
342 if (!gimple_call_internal_p (stmt)
343 || gimple_call_internal_fn (stmt) != IFN_ANNOTATE)
344 continue;
346 switch ((annot_expr_kind) tree_to_shwi (gimple_call_arg (stmt, 1)))
348 case annot_expr_ivdep_kind:
349 case annot_expr_unroll_kind:
350 case annot_expr_no_vector_kind:
351 case annot_expr_vector_kind:
352 case annot_expr_parallel_kind:
353 case annot_expr_maybe_infinite_kind:
354 break;
355 default:
356 gcc_unreachable ();
359 warning_at (gimple_location (stmt), 0, "ignoring loop annotation");
360 stmt = gimple_build_assign (gimple_call_lhs (stmt),
361 gimple_call_arg (stmt, 0));
362 gsi_replace (&gsi, stmt, true);
367 static unsigned int
368 execute_build_cfg (void)
370 gimple_seq body = gimple_body (current_function_decl);
372 build_gimple_cfg (body);
373 gimple_set_body (current_function_decl, NULL);
374 if (dump_file && (dump_flags & TDF_DETAILS))
376 fprintf (dump_file, "Scope blocks:\n");
377 dump_scope_blocks (dump_file, dump_flags);
379 cleanup_tree_cfg ();
381 bb_to_omp_idx.release ();
383 loop_optimizer_init (AVOID_CFG_MODIFICATIONS);
384 replace_loop_annotate ();
385 return 0;
388 namespace {
390 const pass_data pass_data_build_cfg =
392 GIMPLE_PASS, /* type */
393 "cfg", /* name */
394 OPTGROUP_NONE, /* optinfo_flags */
395 TV_TREE_CFG, /* tv_id */
396 PROP_gimple_leh, /* properties_required */
397 ( PROP_cfg | PROP_loops ), /* properties_provided */
398 0, /* properties_destroyed */
399 0, /* todo_flags_start */
400 0, /* todo_flags_finish */
403 class pass_build_cfg : public gimple_opt_pass
405 public:
406 pass_build_cfg (gcc::context *ctxt)
407 : gimple_opt_pass (pass_data_build_cfg, ctxt)
410 /* opt_pass methods: */
411 unsigned int execute (function *) final override
413 return execute_build_cfg ();
416 }; // class pass_build_cfg
418 } // anon namespace
420 gimple_opt_pass *
421 make_pass_build_cfg (gcc::context *ctxt)
423 return new pass_build_cfg (ctxt);
427 /* Return true if T is a computed goto. */
429 bool
430 computed_goto_p (gimple *t)
432 return (gimple_code (t) == GIMPLE_GOTO
433 && TREE_CODE (gimple_goto_dest (t)) != LABEL_DECL);
436 /* Returns true if the sequence of statements STMTS only contains
437 a call to __builtin_unreachable (). */
439 bool
440 gimple_seq_unreachable_p (gimple_seq stmts)
442 if (stmts == NULL
443 /* Return false if -fsanitize=unreachable, we don't want to
444 optimize away those calls, but rather turn them into
445 __ubsan_handle_builtin_unreachable () or __builtin_trap ()
446 later. */
447 || sanitize_flags_p (SANITIZE_UNREACHABLE))
448 return false;
450 gimple_stmt_iterator gsi = gsi_last (stmts);
452 if (!gimple_call_builtin_p (gsi_stmt (gsi), BUILT_IN_UNREACHABLE))
453 return false;
455 for (gsi_prev (&gsi); !gsi_end_p (gsi); gsi_prev (&gsi))
457 gimple *stmt = gsi_stmt (gsi);
458 if (gimple_code (stmt) != GIMPLE_LABEL
459 && !is_gimple_debug (stmt)
460 && !gimple_clobber_p (stmt))
461 return false;
463 return true;
466 /* Returns true for edge E where e->src ends with a GIMPLE_COND and
467 the other edge points to a bb with just __builtin_unreachable ().
468 I.e. return true for C->M edge in:
469 <bb C>:
471 if (something)
472 goto <bb N>;
473 else
474 goto <bb M>;
475 <bb N>:
476 __builtin_unreachable ();
477 <bb M>: */
479 bool
480 assert_unreachable_fallthru_edge_p (edge e)
482 basic_block pred_bb = e->src;
483 if (safe_is_a <gcond *> (*gsi_last_bb (pred_bb)))
485 basic_block other_bb = EDGE_SUCC (pred_bb, 0)->dest;
486 if (other_bb == e->dest)
487 other_bb = EDGE_SUCC (pred_bb, 1)->dest;
488 if (EDGE_COUNT (other_bb->succs) == 0)
489 return gimple_seq_unreachable_p (bb_seq (other_bb));
491 return false;
495 /* Initialize GF_CALL_CTRL_ALTERING flag, which indicates the call
496 could alter control flow except via eh. We initialize the flag at
497 CFG build time and only ever clear it later. */
499 static void
500 gimple_call_initialize_ctrl_altering (gimple *stmt)
502 int flags = gimple_call_flags (stmt);
504 /* A call alters control flow if it can make an abnormal goto. */
505 if (call_can_make_abnormal_goto (stmt)
506 /* A call also alters control flow if it does not return. */
507 || flags & ECF_NORETURN
508 /* TM ending statements have backedges out of the transaction.
509 Return true so we split the basic block containing them.
510 Note that the TM_BUILTIN test is merely an optimization. */
511 || ((flags & ECF_TM_BUILTIN)
512 && is_tm_ending_fndecl (gimple_call_fndecl (stmt)))
513 /* BUILT_IN_RETURN call is same as return statement. */
514 || gimple_call_builtin_p (stmt, BUILT_IN_RETURN)
515 /* IFN_UNIQUE should be the last insn, to make checking for it
516 as cheap as possible. */
517 || (gimple_call_internal_p (stmt)
518 && gimple_call_internal_unique_p (stmt)))
519 gimple_call_set_ctrl_altering (stmt, true);
520 else
521 gimple_call_set_ctrl_altering (stmt, false);
525 /* Insert SEQ after BB and build a flowgraph. */
527 static basic_block
528 make_blocks_1 (gimple_seq seq, basic_block bb)
530 gimple_stmt_iterator i = gsi_start (seq);
531 gimple *stmt = NULL;
532 gimple *prev_stmt = NULL;
533 bool start_new_block = true;
534 bool first_stmt_of_seq = true;
536 while (!gsi_end_p (i))
538 /* PREV_STMT should only be set to a debug stmt if the debug
539 stmt is before nondebug stmts. Once stmt reaches a nondebug
540 nonlabel, prev_stmt will be set to it, so that
541 stmt_starts_bb_p will know to start a new block if a label is
542 found. However, if stmt was a label after debug stmts only,
543 keep the label in prev_stmt even if we find further debug
544 stmts, for there may be other labels after them, and they
545 should land in the same block. */
546 if (!prev_stmt || !stmt || !is_gimple_debug (stmt))
547 prev_stmt = stmt;
548 stmt = gsi_stmt (i);
550 if (stmt && is_gimple_call (stmt))
551 gimple_call_initialize_ctrl_altering (stmt);
553 /* If the statement starts a new basic block or if we have determined
554 in a previous pass that we need to create a new block for STMT, do
555 so now. */
556 if (start_new_block || stmt_starts_bb_p (stmt, prev_stmt))
558 if (!first_stmt_of_seq)
559 gsi_split_seq_before (&i, &seq);
560 bb = create_basic_block (seq, bb);
561 start_new_block = false;
562 prev_stmt = NULL;
565 /* Now add STMT to BB and create the subgraphs for special statement
566 codes. */
567 gimple_set_bb (stmt, bb);
569 /* If STMT is a basic block terminator, set START_NEW_BLOCK for the
570 next iteration. */
571 if (stmt_ends_bb_p (stmt))
573 /* If the stmt can make abnormal goto use a new temporary
574 for the assignment to the LHS. This makes sure the old value
575 of the LHS is available on the abnormal edge. Otherwise
576 we will end up with overlapping life-ranges for abnormal
577 SSA names. */
578 if (gimple_has_lhs (stmt)
579 && stmt_can_make_abnormal_goto (stmt)
580 && is_gimple_reg_type (TREE_TYPE (gimple_get_lhs (stmt))))
582 tree lhs = gimple_get_lhs (stmt);
583 tree tmp = create_tmp_var (TREE_TYPE (lhs));
584 gimple *s = gimple_build_assign (lhs, tmp);
585 gimple_set_location (s, gimple_location (stmt));
586 gimple_set_block (s, gimple_block (stmt));
587 gimple_set_lhs (stmt, tmp);
588 gsi_insert_after (&i, s, GSI_SAME_STMT);
590 start_new_block = true;
593 gsi_next (&i);
594 first_stmt_of_seq = false;
596 return bb;
599 /* Build a flowgraph for the sequence of stmts SEQ. */
601 static void
602 make_blocks (gimple_seq seq)
604 /* Look for debug markers right before labels, and move the debug
605 stmts after the labels. Accepting labels among debug markers
606 adds no value, just complexity; if we wanted to annotate labels
607 with view numbers (so sequencing among markers would matter) or
608 somesuch, we're probably better off still moving the labels, but
609 adding other debug annotations in their original positions or
610 emitting nonbind or bind markers associated with the labels in
611 the original position of the labels.
613 Moving labels would probably be simpler, but we can't do that:
614 moving labels assigns label ids to them, and doing so because of
615 debug markers makes for -fcompare-debug and possibly even codegen
616 differences. So, we have to move the debug stmts instead. To
617 that end, we scan SEQ backwards, marking the position of the
618 latest (earliest we find) label, and moving debug stmts that are
619 not separated from it by nondebug nonlabel stmts after the
620 label. */
621 if (MAY_HAVE_DEBUG_MARKER_STMTS)
623 gimple_stmt_iterator label = gsi_none ();
625 for (gimple_stmt_iterator i = gsi_last (seq); !gsi_end_p (i); gsi_prev (&i))
627 gimple *stmt = gsi_stmt (i);
629 /* If this is the first label we encounter (latest in SEQ)
630 before nondebug stmts, record its position. */
631 if (is_a <glabel *> (stmt))
633 if (gsi_end_p (label))
634 label = i;
635 continue;
638 /* Without a recorded label position to move debug stmts to,
639 there's nothing to do. */
640 if (gsi_end_p (label))
641 continue;
643 /* Move the debug stmt at I after LABEL. */
644 if (is_gimple_debug (stmt))
646 gcc_assert (gimple_debug_nonbind_marker_p (stmt));
647 /* As STMT is removed, I advances to the stmt after
648 STMT, so the gsi_prev in the for "increment"
649 expression gets us to the stmt we're to visit after
650 STMT. LABEL, however, would advance to the moved
651 stmt if we passed it to gsi_move_after, so pass it a
652 copy instead, so as to keep LABEL pointing to the
653 LABEL. */
654 gimple_stmt_iterator copy = label;
655 gsi_move_after (&i, &copy);
656 continue;
659 /* There aren't any (more?) debug stmts before label, so
660 there isn't anything else to move after it. */
661 label = gsi_none ();
665 make_blocks_1 (seq, ENTRY_BLOCK_PTR_FOR_FN (cfun));
668 /* Create and return a new empty basic block after bb AFTER. */
670 static basic_block
671 create_bb (void *h, void *e, basic_block after)
673 basic_block bb;
675 gcc_assert (!e);
677 /* Create and initialize a new basic block. Since alloc_block uses
678 GC allocation that clears memory to allocate a basic block, we do
679 not have to clear the newly allocated basic block here. */
680 bb = alloc_block ();
682 bb->index = last_basic_block_for_fn (cfun);
683 bb->flags = BB_NEW;
684 set_bb_seq (bb, h ? (gimple_seq) h : NULL);
686 /* Add the new block to the linked list of blocks. */
687 link_block (bb, after);
689 /* Grow the basic block array if needed. */
690 if ((size_t) last_basic_block_for_fn (cfun)
691 == basic_block_info_for_fn (cfun)->length ())
692 vec_safe_grow_cleared (basic_block_info_for_fn (cfun),
693 last_basic_block_for_fn (cfun) + 1);
695 /* Add the newly created block to the array. */
696 SET_BASIC_BLOCK_FOR_FN (cfun, last_basic_block_for_fn (cfun), bb);
698 n_basic_blocks_for_fn (cfun)++;
699 last_basic_block_for_fn (cfun)++;
701 return bb;
705 /*---------------------------------------------------------------------------
706 Edge creation
707 ---------------------------------------------------------------------------*/
709 /* If basic block BB has an abnormal edge to a basic block
710 containing IFN_ABNORMAL_DISPATCHER internal call, return
711 that the dispatcher's basic block, otherwise return NULL. */
713 basic_block
714 get_abnormal_succ_dispatcher (basic_block bb)
716 edge e;
717 edge_iterator ei;
719 FOR_EACH_EDGE (e, ei, bb->succs)
720 if ((e->flags & (EDGE_ABNORMAL | EDGE_EH)) == EDGE_ABNORMAL)
722 gimple_stmt_iterator gsi
723 = gsi_start_nondebug_after_labels_bb (e->dest);
724 gimple *g = gsi_stmt (gsi);
725 if (g && gimple_call_internal_p (g, IFN_ABNORMAL_DISPATCHER))
726 return e->dest;
728 return NULL;
731 /* Helper function for make_edges. Create a basic block with
732 with ABNORMAL_DISPATCHER internal call in it if needed, and
733 create abnormal edges from BBS to it and from it to FOR_BB
734 if COMPUTED_GOTO is false, otherwise factor the computed gotos. */
736 static void
737 handle_abnormal_edges (basic_block *dispatcher_bbs, basic_block for_bb,
738 auto_vec<basic_block> *bbs, bool computed_goto)
740 basic_block *dispatcher = dispatcher_bbs + (computed_goto ? 1 : 0);
741 unsigned int idx = 0;
742 basic_block bb;
743 bool inner = false;
745 if (!bb_to_omp_idx.is_empty ())
747 dispatcher = dispatcher_bbs + 2 * bb_to_omp_idx[for_bb->index];
748 if (bb_to_omp_idx[for_bb->index] != 0)
749 inner = true;
752 /* If the dispatcher has been created already, then there are basic
753 blocks with abnormal edges to it, so just make a new edge to
754 for_bb. */
755 if (*dispatcher == NULL)
757 /* Check if there are any basic blocks that need to have
758 abnormal edges to this dispatcher. If there are none, return
759 early. */
760 if (bb_to_omp_idx.is_empty ())
762 if (bbs->is_empty ())
763 return;
765 else
767 FOR_EACH_VEC_ELT (*bbs, idx, bb)
768 if (bb_to_omp_idx[bb->index] == bb_to_omp_idx[for_bb->index])
769 break;
770 if (bb == NULL)
771 return;
774 /* Create the dispatcher bb. */
775 *dispatcher = create_basic_block (NULL, for_bb);
776 if (computed_goto)
778 /* Factor computed gotos into a common computed goto site. Also
779 record the location of that site so that we can un-factor the
780 gotos after we have converted back to normal form. */
781 gimple_stmt_iterator gsi = gsi_start_bb (*dispatcher);
783 /* Create the destination of the factored goto. Each original
784 computed goto will put its desired destination into this
785 variable and jump to the label we create immediately below. */
786 tree var = create_tmp_var (ptr_type_node, "gotovar");
788 /* Build a label for the new block which will contain the
789 factored computed goto. */
790 tree factored_label_decl
791 = create_artificial_label (UNKNOWN_LOCATION);
792 gimple *factored_computed_goto_label
793 = gimple_build_label (factored_label_decl);
794 gsi_insert_after (&gsi, factored_computed_goto_label, GSI_NEW_STMT);
796 /* Build our new computed goto. */
797 gimple *factored_computed_goto = gimple_build_goto (var);
798 gsi_insert_after (&gsi, factored_computed_goto, GSI_NEW_STMT);
800 FOR_EACH_VEC_ELT (*bbs, idx, bb)
802 if (!bb_to_omp_idx.is_empty ()
803 && bb_to_omp_idx[bb->index] != bb_to_omp_idx[for_bb->index])
804 continue;
806 gsi = gsi_last_bb (bb);
807 gimple *last = gsi_stmt (gsi);
809 gcc_assert (computed_goto_p (last));
811 /* Copy the original computed goto's destination into VAR. */
812 gimple *assignment
813 = gimple_build_assign (var, gimple_goto_dest (last));
814 gsi_insert_before (&gsi, assignment, GSI_SAME_STMT);
816 edge e = make_edge (bb, *dispatcher, EDGE_FALLTHRU);
817 e->goto_locus = gimple_location (last);
818 gsi_remove (&gsi, true);
821 else
823 tree arg = inner ? boolean_true_node : boolean_false_node;
824 gcall *g = gimple_build_call_internal (IFN_ABNORMAL_DISPATCHER,
825 1, arg);
826 gimple_call_set_ctrl_altering (g, true);
827 gimple_stmt_iterator gsi = gsi_after_labels (*dispatcher);
828 gsi_insert_after (&gsi, g, GSI_NEW_STMT);
830 /* Create predecessor edges of the dispatcher. */
831 FOR_EACH_VEC_ELT (*bbs, idx, bb)
833 if (!bb_to_omp_idx.is_empty ()
834 && bb_to_omp_idx[bb->index] != bb_to_omp_idx[for_bb->index])
835 continue;
836 make_edge (bb, *dispatcher, EDGE_ABNORMAL);
841 make_edge (*dispatcher, for_bb, EDGE_ABNORMAL);
844 /* Creates outgoing edges for BB. Returns 1 when it ends with an
845 computed goto, returns 2 when it ends with a statement that
846 might return to this function via an nonlocal goto, otherwise
847 return 0. Updates *PCUR_REGION with the OMP region this BB is in. */
849 static int
850 make_edges_bb (basic_block bb, struct omp_region **pcur_region, int *pomp_index)
852 gimple *last = *gsi_last_bb (bb);
853 bool fallthru = false;
854 int ret = 0;
856 if (!last)
857 return ret;
859 switch (gimple_code (last))
861 case GIMPLE_GOTO:
862 if (make_goto_expr_edges (bb))
863 ret = 1;
864 fallthru = false;
865 break;
866 case GIMPLE_RETURN:
868 edge e = make_edge (bb, EXIT_BLOCK_PTR_FOR_FN (cfun), 0);
869 e->goto_locus = gimple_location (last);
870 fallthru = false;
872 break;
873 case GIMPLE_COND:
874 make_cond_expr_edges (bb);
875 fallthru = false;
876 break;
877 case GIMPLE_SWITCH:
878 make_gimple_switch_edges (as_a <gswitch *> (last), bb);
879 fallthru = false;
880 break;
881 case GIMPLE_RESX:
882 make_eh_edge (last);
883 fallthru = false;
884 break;
885 case GIMPLE_EH_DISPATCH:
886 fallthru = make_eh_dispatch_edges (as_a <geh_dispatch *> (last));
887 break;
889 case GIMPLE_CALL:
890 /* If this function receives a nonlocal goto, then we need to
891 make edges from this call site to all the nonlocal goto
892 handlers. */
893 if (stmt_can_make_abnormal_goto (last))
894 ret = 2;
896 /* If this statement has reachable exception handlers, then
897 create abnormal edges to them. */
898 make_eh_edge (last);
900 /* BUILTIN_RETURN is really a return statement. */
901 if (gimple_call_builtin_p (last, BUILT_IN_RETURN))
903 make_edge (bb, EXIT_BLOCK_PTR_FOR_FN (cfun), 0);
904 fallthru = false;
906 /* Some calls are known not to return. */
907 else
908 fallthru = !gimple_call_noreturn_p (last);
909 break;
911 case GIMPLE_ASSIGN:
912 /* A GIMPLE_ASSIGN may throw internally and thus be considered
913 control-altering. */
914 if (is_ctrl_altering_stmt (last))
915 make_eh_edge (last);
916 fallthru = true;
917 break;
919 case GIMPLE_ASM:
920 make_gimple_asm_edges (bb);
921 fallthru = true;
922 break;
924 CASE_GIMPLE_OMP:
925 fallthru = omp_make_gimple_edges (bb, pcur_region, pomp_index);
926 break;
928 case GIMPLE_TRANSACTION:
930 gtransaction *txn = as_a <gtransaction *> (last);
931 tree label1 = gimple_transaction_label_norm (txn);
932 tree label2 = gimple_transaction_label_uninst (txn);
934 if (label1)
935 make_edge (bb, label_to_block (cfun, label1), EDGE_FALLTHRU);
936 if (label2)
937 make_edge (bb, label_to_block (cfun, label2),
938 EDGE_TM_UNINSTRUMENTED | (label1 ? 0 : EDGE_FALLTHRU));
940 tree label3 = gimple_transaction_label_over (txn);
941 if (gimple_transaction_subcode (txn)
942 & (GTMA_HAVE_ABORT | GTMA_IS_OUTER))
943 make_edge (bb, label_to_block (cfun, label3), EDGE_TM_ABORT);
945 fallthru = false;
947 break;
949 default:
950 gcc_assert (!stmt_ends_bb_p (last));
951 fallthru = true;
952 break;
955 if (fallthru)
956 make_edge (bb, bb->next_bb, EDGE_FALLTHRU);
958 return ret;
961 /* Join all the blocks in the flowgraph. */
963 static void
964 make_edges (void)
966 basic_block bb;
967 struct omp_region *cur_region = NULL;
968 auto_vec<basic_block> ab_edge_goto;
969 auto_vec<basic_block> ab_edge_call;
970 int cur_omp_region_idx = 0;
972 /* Create an edge from entry to the first block with executable
973 statements in it. */
974 make_edge (ENTRY_BLOCK_PTR_FOR_FN (cfun),
975 BASIC_BLOCK_FOR_FN (cfun, NUM_FIXED_BLOCKS),
976 EDGE_FALLTHRU);
978 /* Traverse the basic block array placing edges. */
979 FOR_EACH_BB_FN (bb, cfun)
981 int mer;
983 if (!bb_to_omp_idx.is_empty ())
984 bb_to_omp_idx[bb->index] = cur_omp_region_idx;
986 mer = make_edges_bb (bb, &cur_region, &cur_omp_region_idx);
987 if (mer == 1)
988 ab_edge_goto.safe_push (bb);
989 else if (mer == 2)
990 ab_edge_call.safe_push (bb);
992 if (cur_region && bb_to_omp_idx.is_empty ())
993 bb_to_omp_idx.safe_grow_cleared (n_basic_blocks_for_fn (cfun), true);
996 /* Computed gotos are hell to deal with, especially if there are
997 lots of them with a large number of destinations. So we factor
998 them to a common computed goto location before we build the
999 edge list. After we convert back to normal form, we will un-factor
1000 the computed gotos since factoring introduces an unwanted jump.
1001 For non-local gotos and abnormal edges from calls to calls that return
1002 twice or forced labels, factor the abnormal edges too, by having all
1003 abnormal edges from the calls go to a common artificial basic block
1004 with ABNORMAL_DISPATCHER internal call and abnormal edges from that
1005 basic block to all forced labels and calls returning twice.
1006 We do this per-OpenMP structured block, because those regions
1007 are guaranteed to be single entry single exit by the standard,
1008 so it is not allowed to enter or exit such regions abnormally this way,
1009 thus all computed gotos, non-local gotos and setjmp/longjmp calls
1010 must not transfer control across SESE region boundaries. */
1011 if (!ab_edge_goto.is_empty () || !ab_edge_call.is_empty ())
1013 gimple_stmt_iterator gsi;
1014 basic_block dispatcher_bb_array[2] = { NULL, NULL };
1015 basic_block *dispatcher_bbs = dispatcher_bb_array;
1016 int count = n_basic_blocks_for_fn (cfun);
1018 if (!bb_to_omp_idx.is_empty ())
1019 dispatcher_bbs = XCNEWVEC (basic_block, 2 * count);
1021 FOR_EACH_BB_FN (bb, cfun)
1023 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1025 glabel *label_stmt = dyn_cast <glabel *> (gsi_stmt (gsi));
1026 tree target;
1028 if (!label_stmt)
1029 break;
1031 target = gimple_label_label (label_stmt);
1033 /* Make an edge to every label block that has been marked as a
1034 potential target for a computed goto or a non-local goto. */
1035 if (FORCED_LABEL (target))
1036 handle_abnormal_edges (dispatcher_bbs, bb, &ab_edge_goto,
1037 true);
1038 if (DECL_NONLOCAL (target))
1040 handle_abnormal_edges (dispatcher_bbs, bb, &ab_edge_call,
1041 false);
1042 break;
1046 if (!gsi_end_p (gsi) && is_gimple_debug (gsi_stmt (gsi)))
1047 gsi_next_nondebug (&gsi);
1048 if (!gsi_end_p (gsi))
1050 /* Make an edge to every setjmp-like call. */
1051 gimple *call_stmt = gsi_stmt (gsi);
1052 if (is_gimple_call (call_stmt)
1053 && ((gimple_call_flags (call_stmt) & ECF_RETURNS_TWICE)
1054 || gimple_call_builtin_p (call_stmt,
1055 BUILT_IN_SETJMP_RECEIVER)))
1056 handle_abnormal_edges (dispatcher_bbs, bb, &ab_edge_call,
1057 false);
1061 if (!bb_to_omp_idx.is_empty ())
1062 XDELETE (dispatcher_bbs);
1065 omp_free_regions ();
1068 /* Add SEQ after GSI. Start new bb after GSI, and created further bbs as
1069 needed. Returns true if new bbs were created.
1070 Note: This is transitional code, and should not be used for new code. We
1071 should be able to get rid of this by rewriting all target va-arg
1072 gimplification hooks to use an interface gimple_build_cond_value as described
1073 in https://gcc.gnu.org/ml/gcc-patches/2015-02/msg01194.html. */
1075 bool
1076 gimple_find_sub_bbs (gimple_seq seq, gimple_stmt_iterator *gsi)
1078 gimple *stmt = gsi_stmt (*gsi);
1079 basic_block bb = gimple_bb (stmt);
1080 basic_block lastbb, afterbb;
1081 int old_num_bbs = n_basic_blocks_for_fn (cfun);
1082 edge e;
1083 lastbb = make_blocks_1 (seq, bb);
1084 if (old_num_bbs == n_basic_blocks_for_fn (cfun))
1085 return false;
1086 e = split_block (bb, stmt);
1087 /* Move e->dest to come after the new basic blocks. */
1088 afterbb = e->dest;
1089 unlink_block (afterbb);
1090 link_block (afterbb, lastbb);
1091 redirect_edge_succ (e, bb->next_bb);
1092 bb = bb->next_bb;
1093 while (bb != afterbb)
1095 struct omp_region *cur_region = NULL;
1096 profile_count cnt = profile_count::zero ();
1097 bool all = true;
1099 int cur_omp_region_idx = 0;
1100 int mer = make_edges_bb (bb, &cur_region, &cur_omp_region_idx);
1101 gcc_assert (!mer && !cur_region);
1102 add_bb_to_loop (bb, afterbb->loop_father);
1104 edge e;
1105 edge_iterator ei;
1106 FOR_EACH_EDGE (e, ei, bb->preds)
1108 if (e->count ().initialized_p ())
1109 cnt += e->count ();
1110 else
1111 all = false;
1113 tree_guess_outgoing_edge_probabilities (bb);
1114 if (all || profile_status_for_fn (cfun) == PROFILE_READ)
1115 bb->count = cnt;
1117 bb = bb->next_bb;
1119 return true;
1122 /* Find the next available discriminator value for LOCUS. The
1123 discriminator distinguishes among several basic blocks that
1124 share a common locus, allowing for more accurate sample-based
1125 profiling. */
1127 static int
1128 next_discriminator_for_locus (int line)
1130 struct locus_discrim_map item;
1131 struct locus_discrim_map **slot;
1133 item.location_line = line;
1134 item.discriminator = 0;
1135 slot = discriminator_per_locus->find_slot_with_hash (&item, line, INSERT);
1136 gcc_assert (slot);
1137 if (*slot == HTAB_EMPTY_ENTRY)
1139 *slot = XNEW (struct locus_discrim_map);
1140 gcc_assert (*slot);
1141 (*slot)->location_line = line;
1142 (*slot)->discriminator = 0;
1144 (*slot)->discriminator++;
1145 return (*slot)->discriminator;
1148 /* Return TRUE if LOCUS1 and LOCUS2 refer to the same source line. */
1150 static bool
1151 same_line_p (location_t locus1, expanded_location *from, location_t locus2)
1153 expanded_location to;
1155 if (locus1 == locus2)
1156 return true;
1158 to = expand_location (locus2);
1160 if (from->line != to.line)
1161 return false;
1162 if (from->file == to.file)
1163 return true;
1164 return (from->file != NULL
1165 && to.file != NULL
1166 && filename_cmp (from->file, to.file) == 0);
1169 /* Assign a unique discriminator value to all statements in block bb that
1170 have the same line number as locus. */
1172 static void
1173 assign_discriminator (location_t locus, basic_block bb)
1175 gimple_stmt_iterator gsi;
1176 int discriminator;
1178 if (locus == UNKNOWN_LOCATION)
1179 return;
1181 expanded_location locus_e = expand_location (locus);
1183 discriminator = next_discriminator_for_locus (locus_e.line);
1185 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1187 gimple *stmt = gsi_stmt (gsi);
1188 location_t stmt_locus = gimple_location (stmt);
1189 if (same_line_p (locus, &locus_e, stmt_locus))
1190 gimple_set_location (stmt,
1191 location_with_discriminator (stmt_locus, discriminator));
1195 /* Assign discriminators to statement locations. */
1197 static void
1198 assign_discriminators (void)
1200 basic_block bb;
1202 FOR_EACH_BB_FN (bb, cfun)
1204 edge e;
1205 edge_iterator ei;
1206 gimple_stmt_iterator gsi;
1207 location_t curr_locus = UNKNOWN_LOCATION;
1208 expanded_location curr_locus_e = {};
1209 int curr_discr = 0;
1211 /* Traverse the basic block, if two function calls within a basic block
1212 are mapped to the same line, assign a new discriminator because a call
1213 stmt could be a split point of a basic block. */
1214 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1216 gimple *stmt = gsi_stmt (gsi);
1218 /* Don't allow debug stmts to affect discriminators, but
1219 allow them to take discriminators when they're on the
1220 same line as the preceding nondebug stmt. */
1221 if (is_gimple_debug (stmt))
1223 if (curr_locus != UNKNOWN_LOCATION
1224 && same_line_p (curr_locus, &curr_locus_e,
1225 gimple_location (stmt)))
1227 location_t loc = gimple_location (stmt);
1228 location_t dloc = location_with_discriminator (loc,
1229 curr_discr);
1230 gimple_set_location (stmt, dloc);
1232 continue;
1234 if (curr_locus == UNKNOWN_LOCATION)
1236 curr_locus = gimple_location (stmt);
1237 curr_locus_e = expand_location (curr_locus);
1239 else if (!same_line_p (curr_locus, &curr_locus_e, gimple_location (stmt)))
1241 curr_locus = gimple_location (stmt);
1242 curr_locus_e = expand_location (curr_locus);
1243 curr_discr = 0;
1245 else if (curr_discr != 0)
1247 location_t loc = gimple_location (stmt);
1248 location_t dloc = location_with_discriminator (loc, curr_discr);
1249 gimple_set_location (stmt, dloc);
1251 /* Allocate a new discriminator for CALL stmt. */
1252 if (gimple_code (stmt) == GIMPLE_CALL)
1253 curr_discr = next_discriminator_for_locus (curr_locus);
1256 gimple *last = last_nondebug_stmt (bb);
1257 location_t locus = last ? gimple_location (last) : UNKNOWN_LOCATION;
1258 if (locus == UNKNOWN_LOCATION)
1259 continue;
1261 expanded_location locus_e = expand_location (locus);
1263 FOR_EACH_EDGE (e, ei, bb->succs)
1265 gimple *first = first_non_label_stmt (e->dest);
1266 gimple *last = last_nondebug_stmt (e->dest);
1268 gimple *stmt_on_same_line = NULL;
1269 if (first && same_line_p (locus, &locus_e,
1270 gimple_location (first)))
1271 stmt_on_same_line = first;
1272 else if (last && same_line_p (locus, &locus_e,
1273 gimple_location (last)))
1274 stmt_on_same_line = last;
1276 if (stmt_on_same_line)
1278 if (has_discriminator (gimple_location (stmt_on_same_line))
1279 && !has_discriminator (locus))
1280 assign_discriminator (locus, bb);
1281 else
1282 assign_discriminator (locus, e->dest);
1288 /* Create the edges for a GIMPLE_COND starting at block BB. */
1290 static void
1291 make_cond_expr_edges (basic_block bb)
1293 gcond *entry = as_a <gcond *> (*gsi_last_bb (bb));
1294 gimple *then_stmt, *else_stmt;
1295 basic_block then_bb, else_bb;
1296 tree then_label, else_label;
1297 edge e;
1299 gcc_assert (entry);
1301 /* Entry basic blocks for each component. */
1302 then_label = gimple_cond_true_label (entry);
1303 else_label = gimple_cond_false_label (entry);
1304 then_bb = label_to_block (cfun, then_label);
1305 else_bb = label_to_block (cfun, else_label);
1306 then_stmt = first_stmt (then_bb);
1307 else_stmt = first_stmt (else_bb);
1309 e = make_edge (bb, then_bb, EDGE_TRUE_VALUE);
1310 e->goto_locus = gimple_location (then_stmt);
1311 e = make_edge (bb, else_bb, EDGE_FALSE_VALUE);
1312 if (e)
1313 e->goto_locus = gimple_location (else_stmt);
1315 /* We do not need the labels anymore. */
1316 gimple_cond_set_true_label (entry, NULL_TREE);
1317 gimple_cond_set_false_label (entry, NULL_TREE);
1321 /* Called for each element in the hash table (P) as we delete the
1322 edge to cases hash table.
1324 Clear all the CASE_CHAINs to prevent problems with copying of
1325 SWITCH_EXPRs and structure sharing rules, then free the hash table
1326 element. */
1328 bool
1329 edge_to_cases_cleanup (edge const &, tree const &value, void *)
1331 tree t, next;
1333 for (t = value; t; t = next)
1335 next = CASE_CHAIN (t);
1336 CASE_CHAIN (t) = NULL;
1339 return true;
1342 /* Start recording information mapping edges to case labels. */
1344 void
1345 start_recording_case_labels (void)
1347 gcc_assert (edge_to_cases == NULL);
1348 edge_to_cases = new hash_map<edge, tree>;
1349 touched_switch_bbs = BITMAP_ALLOC (NULL);
1352 /* Return nonzero if we are recording information for case labels. */
1354 static bool
1355 recording_case_labels_p (void)
1357 return (edge_to_cases != NULL);
1360 /* Stop recording information mapping edges to case labels and
1361 remove any information we have recorded. */
1362 void
1363 end_recording_case_labels (void)
1365 bitmap_iterator bi;
1366 unsigned i;
1367 edge_to_cases->traverse<void *, edge_to_cases_cleanup> (NULL);
1368 delete edge_to_cases;
1369 edge_to_cases = NULL;
1370 EXECUTE_IF_SET_IN_BITMAP (touched_switch_bbs, 0, i, bi)
1372 basic_block bb = BASIC_BLOCK_FOR_FN (cfun, i);
1373 if (bb)
1375 if (gswitch *stmt = safe_dyn_cast <gswitch *> (*gsi_last_bb (bb)))
1376 group_case_labels_stmt (stmt);
1379 BITMAP_FREE (touched_switch_bbs);
1382 /* If we are inside a {start,end}_recording_cases block, then return
1383 a chain of CASE_LABEL_EXPRs from T which reference E.
1385 Otherwise return NULL. */
1387 tree
1388 get_cases_for_edge (edge e, gswitch *t)
1390 tree *slot;
1391 size_t i, n;
1393 /* If we are not recording cases, then we do not have CASE_LABEL_EXPR
1394 chains available. Return NULL so the caller can detect this case. */
1395 if (!recording_case_labels_p ())
1396 return NULL;
1398 slot = edge_to_cases->get (e);
1399 if (slot)
1400 return *slot;
1402 /* If we did not find E in the hash table, then this must be the first
1403 time we have been queried for information about E & T. Add all the
1404 elements from T to the hash table then perform the query again. */
1406 n = gimple_switch_num_labels (t);
1407 for (i = 0; i < n; i++)
1409 tree elt = gimple_switch_label (t, i);
1410 tree lab = CASE_LABEL (elt);
1411 basic_block label_bb = label_to_block (cfun, lab);
1412 edge this_edge = find_edge (e->src, label_bb);
1414 /* Add it to the chain of CASE_LABEL_EXPRs referencing E, or create
1415 a new chain. */
1416 tree &s = edge_to_cases->get_or_insert (this_edge);
1417 CASE_CHAIN (elt) = s;
1418 s = elt;
1421 return *edge_to_cases->get (e);
1424 /* Create the edges for a GIMPLE_SWITCH starting at block BB. */
1426 static void
1427 make_gimple_switch_edges (gswitch *entry, basic_block bb)
1429 size_t i, n;
1431 n = gimple_switch_num_labels (entry);
1433 for (i = 0; i < n; ++i)
1435 basic_block label_bb = gimple_switch_label_bb (cfun, entry, i);
1436 make_edge (bb, label_bb, 0);
1441 /* Return the basic block holding label DEST. */
1443 basic_block
1444 label_to_block (struct function *ifun, tree dest)
1446 int uid = LABEL_DECL_UID (dest);
1448 /* We would die hard when faced by an undefined label. Emit a label to
1449 the very first basic block. This will hopefully make even the dataflow
1450 and undefined variable warnings quite right. */
1451 if (seen_error () && uid < 0)
1453 gimple_stmt_iterator gsi =
1454 gsi_start_bb (BASIC_BLOCK_FOR_FN (cfun, NUM_FIXED_BLOCKS));
1455 gimple *stmt;
1457 stmt = gimple_build_label (dest);
1458 gsi_insert_before (&gsi, stmt, GSI_NEW_STMT);
1459 uid = LABEL_DECL_UID (dest);
1461 if (vec_safe_length (ifun->cfg->x_label_to_block_map) <= (unsigned int) uid)
1462 return NULL;
1463 return (*ifun->cfg->x_label_to_block_map)[uid];
1466 /* Create edges for a goto statement at block BB. Returns true
1467 if abnormal edges should be created. */
1469 static bool
1470 make_goto_expr_edges (basic_block bb)
1472 gimple_stmt_iterator last = gsi_last_bb (bb);
1473 gimple *goto_t = gsi_stmt (last);
1475 /* A simple GOTO creates normal edges. */
1476 if (simple_goto_p (goto_t))
1478 tree dest = gimple_goto_dest (goto_t);
1479 basic_block label_bb = label_to_block (cfun, dest);
1480 edge e = make_edge (bb, label_bb, EDGE_FALLTHRU);
1481 e->goto_locus = gimple_location (goto_t);
1482 gsi_remove (&last, true);
1483 return false;
1486 /* A computed GOTO creates abnormal edges. */
1487 return true;
1490 /* Create edges for an asm statement with labels at block BB. */
1492 static void
1493 make_gimple_asm_edges (basic_block bb)
1495 gasm *stmt = as_a <gasm *> (*gsi_last_bb (bb));
1496 int i, n = gimple_asm_nlabels (stmt);
1498 for (i = 0; i < n; ++i)
1500 tree label = TREE_VALUE (gimple_asm_label_op (stmt, i));
1501 basic_block label_bb = label_to_block (cfun, label);
1502 make_edge (bb, label_bb, 0);
1506 /*---------------------------------------------------------------------------
1507 Flowgraph analysis
1508 ---------------------------------------------------------------------------*/
1510 /* Cleanup useless labels in basic blocks. This is something we wish
1511 to do early because it allows us to group case labels before creating
1512 the edges for the CFG, and it speeds up block statement iterators in
1513 all passes later on.
1514 We rerun this pass after CFG is created, to get rid of the labels that
1515 are no longer referenced. After then we do not run it any more, since
1516 (almost) no new labels should be created. */
1518 /* A map from basic block index to the leading label of that block. */
1519 struct label_record
1521 /* The label. */
1522 tree label;
1524 /* True if the label is referenced from somewhere. */
1525 bool used;
1528 /* Given LABEL return the first label in the same basic block. */
1530 static tree
1531 main_block_label (tree label, label_record *label_for_bb)
1533 basic_block bb = label_to_block (cfun, label);
1534 tree main_label = label_for_bb[bb->index].label;
1536 /* label_to_block possibly inserted undefined label into the chain. */
1537 if (!main_label)
1539 label_for_bb[bb->index].label = label;
1540 main_label = label;
1543 label_for_bb[bb->index].used = true;
1544 return main_label;
1547 /* Clean up redundant labels within the exception tree. */
1549 static void
1550 cleanup_dead_labels_eh (label_record *label_for_bb)
1552 eh_landing_pad lp;
1553 eh_region r;
1554 tree lab;
1555 int i;
1557 if (cfun->eh == NULL)
1558 return;
1560 for (i = 1; vec_safe_iterate (cfun->eh->lp_array, i, &lp); ++i)
1561 if (lp && lp->post_landing_pad)
1563 lab = main_block_label (lp->post_landing_pad, label_for_bb);
1564 if (lab != lp->post_landing_pad)
1566 EH_LANDING_PAD_NR (lp->post_landing_pad) = 0;
1567 lp->post_landing_pad = lab;
1568 EH_LANDING_PAD_NR (lab) = lp->index;
1572 FOR_ALL_EH_REGION (r)
1573 switch (r->type)
1575 case ERT_CLEANUP:
1576 case ERT_MUST_NOT_THROW:
1577 break;
1579 case ERT_TRY:
1581 eh_catch c;
1582 for (c = r->u.eh_try.first_catch; c ; c = c->next_catch)
1584 lab = c->label;
1585 if (lab)
1586 c->label = main_block_label (lab, label_for_bb);
1589 break;
1591 case ERT_ALLOWED_EXCEPTIONS:
1592 lab = r->u.allowed.label;
1593 if (lab)
1594 r->u.allowed.label = main_block_label (lab, label_for_bb);
1595 break;
1600 /* Cleanup redundant labels. This is a three-step process:
1601 1) Find the leading label for each block.
1602 2) Redirect all references to labels to the leading labels.
1603 3) Cleanup all useless labels. */
1605 void
1606 cleanup_dead_labels (void)
1608 basic_block bb;
1609 label_record *label_for_bb = XCNEWVEC (struct label_record,
1610 last_basic_block_for_fn (cfun));
1612 /* Find a suitable label for each block. We use the first user-defined
1613 label if there is one, or otherwise just the first label we see. */
1614 FOR_EACH_BB_FN (bb, cfun)
1616 gimple_stmt_iterator i;
1618 for (i = gsi_start_bb (bb); !gsi_end_p (i); gsi_next (&i))
1620 tree label;
1621 glabel *label_stmt = dyn_cast <glabel *> (gsi_stmt (i));
1623 if (!label_stmt)
1624 break;
1626 label = gimple_label_label (label_stmt);
1628 /* If we have not yet seen a label for the current block,
1629 remember this one and see if there are more labels. */
1630 if (!label_for_bb[bb->index].label)
1632 label_for_bb[bb->index].label = label;
1633 continue;
1636 /* If we did see a label for the current block already, but it
1637 is an artificially created label, replace it if the current
1638 label is a user defined label. */
1639 if (!DECL_ARTIFICIAL (label)
1640 && DECL_ARTIFICIAL (label_for_bb[bb->index].label))
1642 label_for_bb[bb->index].label = label;
1643 break;
1648 /* Now redirect all jumps/branches to the selected label.
1649 First do so for each block ending in a control statement. */
1650 FOR_EACH_BB_FN (bb, cfun)
1652 gimple *stmt = *gsi_last_bb (bb);
1653 tree label, new_label;
1655 if (!stmt)
1656 continue;
1658 switch (gimple_code (stmt))
1660 case GIMPLE_COND:
1662 gcond *cond_stmt = as_a <gcond *> (stmt);
1663 label = gimple_cond_true_label (cond_stmt);
1664 if (label)
1666 new_label = main_block_label (label, label_for_bb);
1667 if (new_label != label)
1668 gimple_cond_set_true_label (cond_stmt, new_label);
1671 label = gimple_cond_false_label (cond_stmt);
1672 if (label)
1674 new_label = main_block_label (label, label_for_bb);
1675 if (new_label != label)
1676 gimple_cond_set_false_label (cond_stmt, new_label);
1679 break;
1681 case GIMPLE_SWITCH:
1683 gswitch *switch_stmt = as_a <gswitch *> (stmt);
1684 size_t i, n = gimple_switch_num_labels (switch_stmt);
1686 /* Replace all destination labels. */
1687 for (i = 0; i < n; ++i)
1689 tree case_label = gimple_switch_label (switch_stmt, i);
1690 label = CASE_LABEL (case_label);
1691 new_label = main_block_label (label, label_for_bb);
1692 if (new_label != label)
1693 CASE_LABEL (case_label) = new_label;
1695 break;
1698 case GIMPLE_ASM:
1700 gasm *asm_stmt = as_a <gasm *> (stmt);
1701 int i, n = gimple_asm_nlabels (asm_stmt);
1703 for (i = 0; i < n; ++i)
1705 tree cons = gimple_asm_label_op (asm_stmt, i);
1706 tree label = main_block_label (TREE_VALUE (cons), label_for_bb);
1707 TREE_VALUE (cons) = label;
1709 break;
1712 /* We have to handle gotos until they're removed, and we don't
1713 remove them until after we've created the CFG edges. */
1714 case GIMPLE_GOTO:
1715 if (!computed_goto_p (stmt))
1717 ggoto *goto_stmt = as_a <ggoto *> (stmt);
1718 label = gimple_goto_dest (goto_stmt);
1719 new_label = main_block_label (label, label_for_bb);
1720 if (new_label != label)
1721 gimple_goto_set_dest (goto_stmt, new_label);
1723 break;
1725 case GIMPLE_TRANSACTION:
1727 gtransaction *txn = as_a <gtransaction *> (stmt);
1729 label = gimple_transaction_label_norm (txn);
1730 if (label)
1732 new_label = main_block_label (label, label_for_bb);
1733 if (new_label != label)
1734 gimple_transaction_set_label_norm (txn, new_label);
1737 label = gimple_transaction_label_uninst (txn);
1738 if (label)
1740 new_label = main_block_label (label, label_for_bb);
1741 if (new_label != label)
1742 gimple_transaction_set_label_uninst (txn, new_label);
1745 label = gimple_transaction_label_over (txn);
1746 if (label)
1748 new_label = main_block_label (label, label_for_bb);
1749 if (new_label != label)
1750 gimple_transaction_set_label_over (txn, new_label);
1753 break;
1755 default:
1756 break;
1760 /* Do the same for the exception region tree labels. */
1761 cleanup_dead_labels_eh (label_for_bb);
1763 /* Finally, purge dead labels. All user-defined labels and labels that
1764 can be the target of non-local gotos and labels which have their
1765 address taken are preserved. */
1766 FOR_EACH_BB_FN (bb, cfun)
1768 gimple_stmt_iterator i;
1769 tree label_for_this_bb = label_for_bb[bb->index].label;
1771 if (!label_for_this_bb)
1772 continue;
1774 /* If the main label of the block is unused, we may still remove it. */
1775 if (!label_for_bb[bb->index].used)
1776 label_for_this_bb = NULL;
1778 for (i = gsi_start_bb (bb); !gsi_end_p (i); )
1780 tree label;
1781 glabel *label_stmt = dyn_cast <glabel *> (gsi_stmt (i));
1783 if (!label_stmt)
1784 break;
1786 label = gimple_label_label (label_stmt);
1788 if (label == label_for_this_bb
1789 || !DECL_ARTIFICIAL (label)
1790 || DECL_NONLOCAL (label)
1791 || FORCED_LABEL (label))
1792 gsi_next (&i);
1793 else
1795 gcc_checking_assert (EH_LANDING_PAD_NR (label) == 0);
1796 gsi_remove (&i, true);
1801 free (label_for_bb);
1804 /* Scan the sorted vector of cases in STMT (a GIMPLE_SWITCH) and combine
1805 the ones jumping to the same label.
1806 Eg. three separate entries 1: 2: 3: become one entry 1..3: */
1808 bool
1809 group_case_labels_stmt (gswitch *stmt)
1811 int old_size = gimple_switch_num_labels (stmt);
1812 int i, next_index, new_size;
1813 basic_block default_bb = NULL;
1814 hash_set<tree> *removed_labels = NULL;
1816 default_bb = gimple_switch_default_bb (cfun, stmt);
1818 /* Look for possible opportunities to merge cases. */
1819 new_size = i = 1;
1820 while (i < old_size)
1822 tree base_case, base_high;
1823 basic_block base_bb;
1825 base_case = gimple_switch_label (stmt, i);
1827 gcc_assert (base_case);
1828 base_bb = label_to_block (cfun, CASE_LABEL (base_case));
1830 /* Discard cases that have the same destination as the default case or
1831 whose destination blocks have already been removed as unreachable. */
1832 if (base_bb == NULL
1833 || base_bb == default_bb
1834 || (removed_labels
1835 && removed_labels->contains (CASE_LABEL (base_case))))
1837 i++;
1838 continue;
1841 base_high = CASE_HIGH (base_case)
1842 ? CASE_HIGH (base_case)
1843 : CASE_LOW (base_case);
1844 next_index = i + 1;
1846 /* Try to merge case labels. Break out when we reach the end
1847 of the label vector or when we cannot merge the next case
1848 label with the current one. */
1849 while (next_index < old_size)
1851 tree merge_case = gimple_switch_label (stmt, next_index);
1852 basic_block merge_bb = label_to_block (cfun, CASE_LABEL (merge_case));
1853 wide_int bhp1 = wi::to_wide (base_high) + 1;
1855 /* Merge the cases if they jump to the same place,
1856 and their ranges are consecutive. */
1857 if (merge_bb == base_bb
1858 && (removed_labels == NULL
1859 || !removed_labels->contains (CASE_LABEL (merge_case)))
1860 && wi::to_wide (CASE_LOW (merge_case)) == bhp1)
1862 base_high
1863 = (CASE_HIGH (merge_case)
1864 ? CASE_HIGH (merge_case) : CASE_LOW (merge_case));
1865 CASE_HIGH (base_case) = base_high;
1866 next_index++;
1868 else
1869 break;
1872 /* Discard cases that have an unreachable destination block. */
1873 if (EDGE_COUNT (base_bb->succs) == 0
1874 && gimple_seq_unreachable_p (bb_seq (base_bb))
1875 /* Don't optimize this if __builtin_unreachable () is the
1876 implicitly added one by the C++ FE too early, before
1877 -Wreturn-type can be diagnosed. We'll optimize it later
1878 during switchconv pass or any other cfg cleanup. */
1879 && (gimple_in_ssa_p (cfun)
1880 || (LOCATION_LOCUS (gimple_location (last_nondebug_stmt (base_bb)))
1881 != BUILTINS_LOCATION)))
1883 edge base_edge = find_edge (gimple_bb (stmt), base_bb);
1884 if (base_edge != NULL)
1886 for (gimple_stmt_iterator gsi = gsi_start_bb (base_bb);
1887 !gsi_end_p (gsi); gsi_next (&gsi))
1888 if (glabel *stmt = dyn_cast <glabel *> (gsi_stmt (gsi)))
1890 if (FORCED_LABEL (gimple_label_label (stmt))
1891 || DECL_NONLOCAL (gimple_label_label (stmt)))
1893 /* Forced/non-local labels aren't going to be removed,
1894 but they will be moved to some neighbouring basic
1895 block. If some later case label refers to one of
1896 those labels, we should throw that case away rather
1897 than keeping it around and refering to some random
1898 other basic block without an edge to it. */
1899 if (removed_labels == NULL)
1900 removed_labels = new hash_set<tree>;
1901 removed_labels->add (gimple_label_label (stmt));
1904 else
1905 break;
1906 remove_edge_and_dominated_blocks (base_edge);
1908 i = next_index;
1909 continue;
1912 if (new_size < i)
1913 gimple_switch_set_label (stmt, new_size,
1914 gimple_switch_label (stmt, i));
1915 i = next_index;
1916 new_size++;
1919 gcc_assert (new_size <= old_size);
1921 if (new_size < old_size)
1922 gimple_switch_set_num_labels (stmt, new_size);
1924 delete removed_labels;
1925 return new_size < old_size;
1928 /* Look for blocks ending in a multiway branch (a GIMPLE_SWITCH),
1929 and scan the sorted vector of cases. Combine the ones jumping to the
1930 same label. */
1932 bool
1933 group_case_labels (void)
1935 basic_block bb;
1936 bool changed = false;
1938 FOR_EACH_BB_FN (bb, cfun)
1940 if (gswitch *stmt = safe_dyn_cast <gswitch *> (*gsi_last_bb (bb)))
1941 changed |= group_case_labels_stmt (stmt);
1944 return changed;
1947 /* Checks whether we can merge block B into block A. */
1949 static bool
1950 gimple_can_merge_blocks_p (basic_block a, basic_block b)
1952 gimple *stmt;
1954 if (!single_succ_p (a))
1955 return false;
1957 if (single_succ_edge (a)->flags & EDGE_COMPLEX)
1958 return false;
1960 if (single_succ (a) != b)
1961 return false;
1963 if (!single_pred_p (b))
1964 return false;
1966 if (a == ENTRY_BLOCK_PTR_FOR_FN (cfun)
1967 || b == EXIT_BLOCK_PTR_FOR_FN (cfun))
1968 return false;
1970 /* If A ends by a statement causing exceptions or something similar, we
1971 cannot merge the blocks. */
1972 stmt = *gsi_last_bb (a);
1973 if (stmt && stmt_ends_bb_p (stmt))
1974 return false;
1976 /* Examine the labels at the beginning of B. */
1977 for (gimple_stmt_iterator gsi = gsi_start_bb (b); !gsi_end_p (gsi);
1978 gsi_next (&gsi))
1980 tree lab;
1981 glabel *label_stmt = dyn_cast <glabel *> (gsi_stmt (gsi));
1982 if (!label_stmt)
1983 break;
1984 lab = gimple_label_label (label_stmt);
1986 /* Do not remove user forced labels or for -O0 any user labels. */
1987 if (!DECL_ARTIFICIAL (lab) && (!optimize || FORCED_LABEL (lab)))
1988 return false;
1991 /* Protect simple loop latches. We only want to avoid merging
1992 the latch with the loop header or with a block in another
1993 loop in this case. */
1994 if (current_loops
1995 && b->loop_father->latch == b
1996 && loops_state_satisfies_p (LOOPS_HAVE_SIMPLE_LATCHES)
1997 && (b->loop_father->header == a
1998 || b->loop_father != a->loop_father))
1999 return false;
2001 /* It must be possible to eliminate all phi nodes in B. If ssa form
2002 is not up-to-date and a name-mapping is registered, we cannot eliminate
2003 any phis. Symbols marked for renaming are never a problem though. */
2004 for (gphi_iterator gsi = gsi_start_phis (b); !gsi_end_p (gsi);
2005 gsi_next (&gsi))
2007 gphi *phi = gsi.phi ();
2008 /* Technically only new names matter. */
2009 if (name_registered_for_update_p (PHI_RESULT (phi)))
2010 return false;
2013 /* When not optimizing, don't merge if we'd lose goto_locus. */
2014 if (!optimize
2015 && single_succ_edge (a)->goto_locus != UNKNOWN_LOCATION)
2017 location_t goto_locus = single_succ_edge (a)->goto_locus;
2018 gimple_stmt_iterator prev, next;
2019 prev = gsi_last_nondebug_bb (a);
2020 next = gsi_after_labels (b);
2021 if (!gsi_end_p (next) && is_gimple_debug (gsi_stmt (next)))
2022 gsi_next_nondebug (&next);
2023 if ((gsi_end_p (prev)
2024 || gimple_location (gsi_stmt (prev)) != goto_locus)
2025 && (gsi_end_p (next)
2026 || gimple_location (gsi_stmt (next)) != goto_locus))
2027 return false;
2030 return true;
2033 /* Replaces all uses of NAME by VAL. */
2035 void
2036 replace_uses_by (tree name, tree val)
2038 imm_use_iterator imm_iter;
2039 use_operand_p use;
2040 gimple *stmt;
2041 edge e;
2043 FOR_EACH_IMM_USE_STMT (stmt, imm_iter, name)
2045 /* Mark the block if we change the last stmt in it. */
2046 if (cfgcleanup_altered_bbs
2047 && stmt_ends_bb_p (stmt))
2048 bitmap_set_bit (cfgcleanup_altered_bbs, gimple_bb (stmt)->index);
2050 FOR_EACH_IMM_USE_ON_STMT (use, imm_iter)
2052 replace_exp (use, val);
2054 if (gimple_code (stmt) == GIMPLE_PHI)
2056 e = gimple_phi_arg_edge (as_a <gphi *> (stmt),
2057 PHI_ARG_INDEX_FROM_USE (use));
2058 if (e->flags & EDGE_ABNORMAL
2059 && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (val))
2061 /* This can only occur for virtual operands, since
2062 for the real ones SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name))
2063 would prevent replacement. */
2064 gcc_checking_assert (virtual_operand_p (name));
2065 SSA_NAME_OCCURS_IN_ABNORMAL_PHI (val) = 1;
2070 if (gimple_code (stmt) != GIMPLE_PHI)
2072 gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
2073 gimple *orig_stmt = stmt;
2074 size_t i;
2076 /* FIXME. It shouldn't be required to keep TREE_CONSTANT
2077 on ADDR_EXPRs up-to-date on GIMPLE. Propagation will
2078 only change sth from non-invariant to invariant, and only
2079 when propagating constants. */
2080 if (is_gimple_min_invariant (val))
2081 for (i = 0; i < gimple_num_ops (stmt); i++)
2083 tree op = gimple_op (stmt, i);
2084 /* Operands may be empty here. For example, the labels
2085 of a GIMPLE_COND are nulled out following the creation
2086 of the corresponding CFG edges. */
2087 if (op && TREE_CODE (op) == ADDR_EXPR)
2088 recompute_tree_invariant_for_addr_expr (op);
2091 if (fold_stmt (&gsi))
2092 stmt = gsi_stmt (gsi);
2094 if (maybe_clean_or_replace_eh_stmt (orig_stmt, stmt))
2095 gimple_purge_dead_eh_edges (gimple_bb (stmt));
2097 update_stmt (stmt);
2101 gcc_checking_assert (has_zero_uses (name));
2103 /* Also update the trees stored in loop structures. */
2104 if (current_loops)
2106 for (auto loop : loops_list (cfun, 0))
2107 substitute_in_loop_info (loop, name, val);
2111 /* Merge block B into block A. */
2113 static void
2114 gimple_merge_blocks (basic_block a, basic_block b)
2116 gimple_stmt_iterator last, gsi;
2117 gphi_iterator psi;
2119 if (dump_file)
2120 fprintf (dump_file, "Merging blocks %d and %d\n", a->index, b->index);
2122 /* Remove all single-valued PHI nodes from block B of the form
2123 V_i = PHI <V_j> by propagating V_j to all the uses of V_i. */
2124 gsi = gsi_last_bb (a);
2125 for (psi = gsi_start_phis (b); !gsi_end_p (psi); )
2127 gimple *phi = gsi_stmt (psi);
2128 tree def = gimple_phi_result (phi), use = gimple_phi_arg_def (phi, 0);
2129 gimple *copy;
2130 bool may_replace_uses = (virtual_operand_p (def)
2131 || may_propagate_copy (def, use));
2133 /* In case we maintain loop closed ssa form, do not propagate arguments
2134 of loop exit phi nodes. */
2135 if (current_loops
2136 && loops_state_satisfies_p (LOOP_CLOSED_SSA)
2137 && !virtual_operand_p (def)
2138 && TREE_CODE (use) == SSA_NAME
2139 && a->loop_father != b->loop_father)
2140 may_replace_uses = false;
2142 if (!may_replace_uses)
2144 gcc_assert (!virtual_operand_p (def));
2146 /* Note that just emitting the copies is fine -- there is no problem
2147 with ordering of phi nodes. This is because A is the single
2148 predecessor of B, therefore results of the phi nodes cannot
2149 appear as arguments of the phi nodes. */
2150 copy = gimple_build_assign (def, use);
2151 gsi_insert_after (&gsi, copy, GSI_NEW_STMT);
2152 remove_phi_node (&psi, false);
2154 else
2156 /* If we deal with a PHI for virtual operands, we can simply
2157 propagate these without fussing with folding or updating
2158 the stmt. */
2159 if (virtual_operand_p (def))
2161 imm_use_iterator iter;
2162 use_operand_p use_p;
2163 gimple *stmt;
2165 FOR_EACH_IMM_USE_STMT (stmt, iter, def)
2166 FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
2167 SET_USE (use_p, use);
2169 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (def))
2170 SSA_NAME_OCCURS_IN_ABNORMAL_PHI (use) = 1;
2172 else
2173 replace_uses_by (def, use);
2175 remove_phi_node (&psi, true);
2179 /* Ensure that B follows A. */
2180 move_block_after (b, a);
2182 gcc_assert (single_succ_edge (a)->flags & EDGE_FALLTHRU);
2183 gcc_assert (!*gsi_last_bb (a)
2184 || !stmt_ends_bb_p (*gsi_last_bb (a)));
2186 /* Remove labels from B and set gimple_bb to A for other statements. */
2187 for (gsi = gsi_start_bb (b); !gsi_end_p (gsi);)
2189 gimple *stmt = gsi_stmt (gsi);
2190 if (glabel *label_stmt = dyn_cast <glabel *> (stmt))
2192 tree label = gimple_label_label (label_stmt);
2193 int lp_nr;
2195 gsi_remove (&gsi, false);
2197 /* Now that we can thread computed gotos, we might have
2198 a situation where we have a forced label in block B
2199 However, the label at the start of block B might still be
2200 used in other ways (think about the runtime checking for
2201 Fortran assigned gotos). So we cannot just delete the
2202 label. Instead we move the label to the start of block A. */
2203 if (FORCED_LABEL (label))
2205 gimple_stmt_iterator dest_gsi = gsi_start_bb (a);
2206 tree first_label = NULL_TREE;
2207 if (!gsi_end_p (dest_gsi))
2208 if (glabel *first_label_stmt
2209 = dyn_cast <glabel *> (gsi_stmt (dest_gsi)))
2210 first_label = gimple_label_label (first_label_stmt);
2211 if (first_label
2212 && (DECL_NONLOCAL (first_label)
2213 || EH_LANDING_PAD_NR (first_label) != 0))
2214 gsi_insert_after (&dest_gsi, stmt, GSI_NEW_STMT);
2215 else
2216 gsi_insert_before (&dest_gsi, stmt, GSI_NEW_STMT);
2218 /* Other user labels keep around in a form of a debug stmt. */
2219 else if (!DECL_ARTIFICIAL (label) && MAY_HAVE_DEBUG_BIND_STMTS)
2221 gimple *dbg = gimple_build_debug_bind (label,
2222 integer_zero_node,
2223 stmt);
2224 gimple_debug_bind_reset_value (dbg);
2225 gsi_insert_before (&gsi, dbg, GSI_SAME_STMT);
2228 lp_nr = EH_LANDING_PAD_NR (label);
2229 if (lp_nr)
2231 eh_landing_pad lp = get_eh_landing_pad_from_number (lp_nr);
2232 lp->post_landing_pad = NULL;
2235 else
2237 gimple_set_bb (stmt, a);
2238 gsi_next (&gsi);
2242 /* When merging two BBs, if their counts are different, the larger count
2243 is selected as the new bb count. This is to handle inconsistent
2244 profiles. */
2245 if (a->loop_father == b->loop_father)
2247 a->count = a->count.merge (b->count);
2250 /* Merge the sequences. */
2251 last = gsi_last_bb (a);
2252 gsi_insert_seq_after (&last, bb_seq (b), GSI_NEW_STMT);
2253 set_bb_seq (b, NULL);
2255 if (cfgcleanup_altered_bbs)
2256 bitmap_set_bit (cfgcleanup_altered_bbs, a->index);
2260 /* Return the one of two successors of BB that is not reachable by a
2261 complex edge, if there is one. Else, return BB. We use
2262 this in optimizations that use post-dominators for their heuristics,
2263 to catch the cases in C++ where function calls are involved. */
2265 basic_block
2266 single_noncomplex_succ (basic_block bb)
2268 edge e0, e1;
2269 if (EDGE_COUNT (bb->succs) != 2)
2270 return bb;
2272 e0 = EDGE_SUCC (bb, 0);
2273 e1 = EDGE_SUCC (bb, 1);
2274 if (e0->flags & EDGE_COMPLEX)
2275 return e1->dest;
2276 if (e1->flags & EDGE_COMPLEX)
2277 return e0->dest;
2279 return bb;
2282 /* T is CALL_EXPR. Set current_function_calls_* flags. */
2284 void
2285 notice_special_calls (gcall *call)
2287 int flags = gimple_call_flags (call);
2289 if (flags & ECF_MAY_BE_ALLOCA)
2290 cfun->calls_alloca = true;
2291 if (flags & ECF_RETURNS_TWICE)
2292 cfun->calls_setjmp = true;
2296 /* Clear flags set by notice_special_calls. Used by dead code removal
2297 to update the flags. */
2299 void
2300 clear_special_calls (void)
2302 cfun->calls_alloca = false;
2303 cfun->calls_setjmp = false;
2306 /* Remove PHI nodes associated with basic block BB and all edges out of BB. */
2308 static void
2309 remove_phi_nodes_and_edges_for_unreachable_block (basic_block bb)
2311 /* Since this block is no longer reachable, we can just delete all
2312 of its PHI nodes. */
2313 remove_phi_nodes (bb);
2315 /* Remove edges to BB's successors. */
2316 while (EDGE_COUNT (bb->succs) > 0)
2317 remove_edge (EDGE_SUCC (bb, 0));
2321 /* Remove statements of basic block BB. */
2323 static void
2324 remove_bb (basic_block bb)
2326 gimple_stmt_iterator i;
2328 if (dump_file)
2330 fprintf (dump_file, "Removing basic block %d\n", bb->index);
2331 if (dump_flags & TDF_DETAILS)
2333 dump_bb (dump_file, bb, 0, TDF_BLOCKS);
2334 fprintf (dump_file, "\n");
2338 if (current_loops)
2340 class loop *loop = bb->loop_father;
2342 /* If a loop gets removed, clean up the information associated
2343 with it. */
2344 if (loop->latch == bb
2345 || loop->header == bb)
2346 free_numbers_of_iterations_estimates (loop);
2349 /* Remove all the instructions in the block. */
2350 if (bb_seq (bb) != NULL)
2352 /* Walk backwards so as to get a chance to substitute all
2353 released DEFs into debug stmts. See
2354 eliminate_unnecessary_stmts() in tree-ssa-dce.cc for more
2355 details. */
2356 for (i = gsi_last_bb (bb); !gsi_end_p (i);)
2358 gimple *stmt = gsi_stmt (i);
2359 glabel *label_stmt = dyn_cast <glabel *> (stmt);
2360 if (label_stmt
2361 && (FORCED_LABEL (gimple_label_label (label_stmt))
2362 || DECL_NONLOCAL (gimple_label_label (label_stmt))))
2364 basic_block new_bb;
2365 gimple_stmt_iterator new_gsi;
2367 /* A non-reachable non-local label may still be referenced.
2368 But it no longer needs to carry the extra semantics of
2369 non-locality. */
2370 if (DECL_NONLOCAL (gimple_label_label (label_stmt)))
2372 DECL_NONLOCAL (gimple_label_label (label_stmt)) = 0;
2373 FORCED_LABEL (gimple_label_label (label_stmt)) = 1;
2376 new_bb = bb->prev_bb;
2377 /* Don't move any labels into ENTRY block. */
2378 if (new_bb == ENTRY_BLOCK_PTR_FOR_FN (cfun))
2380 new_bb = single_succ (new_bb);
2381 gcc_assert (new_bb != bb);
2383 if ((unsigned) bb->index < bb_to_omp_idx.length ()
2384 && ((unsigned) new_bb->index >= bb_to_omp_idx.length ()
2385 || (bb_to_omp_idx[bb->index]
2386 != bb_to_omp_idx[new_bb->index])))
2388 /* During cfg pass make sure to put orphaned labels
2389 into the right OMP region. */
2390 unsigned int i;
2391 int idx;
2392 new_bb = NULL;
2393 FOR_EACH_VEC_ELT (bb_to_omp_idx, i, idx)
2394 if (i >= NUM_FIXED_BLOCKS
2395 && idx == bb_to_omp_idx[bb->index]
2396 && i != (unsigned) bb->index)
2398 new_bb = BASIC_BLOCK_FOR_FN (cfun, i);
2399 break;
2401 if (new_bb == NULL)
2403 new_bb = single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun));
2404 gcc_assert (new_bb != bb);
2407 new_gsi = gsi_after_labels (new_bb);
2408 gsi_remove (&i, false);
2409 gsi_insert_before (&new_gsi, stmt, GSI_NEW_STMT);
2411 else
2413 /* Release SSA definitions. */
2414 release_defs (stmt);
2415 gsi_remove (&i, true);
2418 if (gsi_end_p (i))
2419 i = gsi_last_bb (bb);
2420 else
2421 gsi_prev (&i);
2425 if ((unsigned) bb->index < bb_to_omp_idx.length ())
2426 bb_to_omp_idx[bb->index] = -1;
2427 remove_phi_nodes_and_edges_for_unreachable_block (bb);
2428 bb->il.gimple.seq = NULL;
2429 bb->il.gimple.phi_nodes = NULL;
2433 /* Given a basic block BB and a value VAL for use in the final statement
2434 of the block (if a GIMPLE_COND, GIMPLE_SWITCH, or computed goto), return
2435 the edge that will be taken out of the block.
2436 If VAL is NULL_TREE, then the current value of the final statement's
2437 predicate or index is used.
2438 If the value does not match a unique edge, NULL is returned. */
2440 edge
2441 find_taken_edge (basic_block bb, tree val)
2443 gimple *stmt;
2445 stmt = *gsi_last_bb (bb);
2447 /* Handle ENTRY and EXIT. */
2448 if (!stmt)
2451 else if (gimple_code (stmt) == GIMPLE_COND)
2452 return find_taken_edge_cond_expr (as_a <gcond *> (stmt), val);
2454 else if (gimple_code (stmt) == GIMPLE_SWITCH)
2455 return find_taken_edge_switch_expr (as_a <gswitch *> (stmt), val);
2457 else if (computed_goto_p (stmt))
2459 /* Only optimize if the argument is a label, if the argument is
2460 not a label then we cannot construct a proper CFG.
2462 It may be the case that we only need to allow the LABEL_REF to
2463 appear inside an ADDR_EXPR, but we also allow the LABEL_REF to
2464 appear inside a LABEL_EXPR just to be safe. */
2465 if (val
2466 && (TREE_CODE (val) == ADDR_EXPR || TREE_CODE (val) == LABEL_EXPR)
2467 && TREE_CODE (TREE_OPERAND (val, 0)) == LABEL_DECL)
2468 return find_taken_edge_computed_goto (bb, TREE_OPERAND (val, 0));
2471 /* Otherwise we only know the taken successor edge if it's unique. */
2472 return single_succ_p (bb) ? single_succ_edge (bb) : NULL;
2475 /* Given a constant value VAL and the entry block BB to a GOTO_EXPR
2476 statement, determine which of the outgoing edges will be taken out of the
2477 block. Return NULL if either edge may be taken. */
2479 static edge
2480 find_taken_edge_computed_goto (basic_block bb, tree val)
2482 basic_block dest;
2483 edge e = NULL;
2485 dest = label_to_block (cfun, val);
2486 if (dest)
2487 e = find_edge (bb, dest);
2489 /* It's possible for find_edge to return NULL here on invalid code
2490 that abuses the labels-as-values extension (e.g. code that attempts to
2491 jump *between* functions via stored labels-as-values; PR 84136).
2492 If so, then we simply return that NULL for the edge.
2493 We don't currently have a way of detecting such invalid code, so we
2494 can't assert that it was the case when a NULL edge occurs here. */
2496 return e;
2499 /* Given COND_STMT and a constant value VAL for use as the predicate,
2500 determine which of the two edges will be taken out of
2501 the statement's block. Return NULL if either edge may be taken.
2502 If VAL is NULL_TREE, then the current value of COND_STMT's predicate
2503 is used. */
2505 static edge
2506 find_taken_edge_cond_expr (const gcond *cond_stmt, tree val)
2508 edge true_edge, false_edge;
2510 if (val == NULL_TREE)
2512 /* Use the current value of the predicate. */
2513 if (gimple_cond_true_p (cond_stmt))
2514 val = integer_one_node;
2515 else if (gimple_cond_false_p (cond_stmt))
2516 val = integer_zero_node;
2517 else
2518 return NULL;
2520 else if (TREE_CODE (val) != INTEGER_CST)
2521 return NULL;
2523 extract_true_false_edges_from_block (gimple_bb (cond_stmt),
2524 &true_edge, &false_edge);
2526 return (integer_zerop (val) ? false_edge : true_edge);
2529 /* Given SWITCH_STMT and an INTEGER_CST VAL for use as the index, determine
2530 which edge will be taken out of the statement's block. Return NULL if any
2531 edge may be taken.
2532 If VAL is NULL_TREE, then the current value of SWITCH_STMT's index
2533 is used. */
2535 edge
2536 find_taken_edge_switch_expr (const gswitch *switch_stmt, tree val)
2538 basic_block dest_bb;
2539 edge e;
2540 tree taken_case;
2542 if (gimple_switch_num_labels (switch_stmt) == 1)
2543 taken_case = gimple_switch_default_label (switch_stmt);
2544 else
2546 if (val == NULL_TREE)
2547 val = gimple_switch_index (switch_stmt);
2548 if (TREE_CODE (val) != INTEGER_CST)
2549 return NULL;
2550 else
2551 taken_case = find_case_label_for_value (switch_stmt, val);
2553 dest_bb = label_to_block (cfun, CASE_LABEL (taken_case));
2555 e = find_edge (gimple_bb (switch_stmt), dest_bb);
2556 gcc_assert (e);
2557 return e;
2561 /* Return the CASE_LABEL_EXPR that SWITCH_STMT will take for VAL.
2562 We can make optimal use here of the fact that the case labels are
2563 sorted: We can do a binary search for a case matching VAL. */
2565 tree
2566 find_case_label_for_value (const gswitch *switch_stmt, tree val)
2568 size_t low, high, n = gimple_switch_num_labels (switch_stmt);
2569 tree default_case = gimple_switch_default_label (switch_stmt);
2571 for (low = 0, high = n; high - low > 1; )
2573 size_t i = (high + low) / 2;
2574 tree t = gimple_switch_label (switch_stmt, i);
2575 int cmp;
2577 /* Cache the result of comparing CASE_LOW and val. */
2578 cmp = tree_int_cst_compare (CASE_LOW (t), val);
2580 if (cmp > 0)
2581 high = i;
2582 else
2583 low = i;
2585 if (CASE_HIGH (t) == NULL)
2587 /* A singe-valued case label. */
2588 if (cmp == 0)
2589 return t;
2591 else
2593 /* A case range. We can only handle integer ranges. */
2594 if (cmp <= 0 && tree_int_cst_compare (CASE_HIGH (t), val) >= 0)
2595 return t;
2599 return default_case;
2603 /* Dump a basic block on stderr. */
2605 void
2606 gimple_debug_bb (basic_block bb)
2608 dump_bb (stderr, bb, 0, TDF_VOPS|TDF_MEMSYMS|TDF_BLOCKS);
2612 /* Dump basic block with index N on stderr. */
2614 basic_block
2615 gimple_debug_bb_n (int n)
2617 gimple_debug_bb (BASIC_BLOCK_FOR_FN (cfun, n));
2618 return BASIC_BLOCK_FOR_FN (cfun, n);
2622 /* Dump the CFG on stderr.
2624 FLAGS are the same used by the tree dumping functions
2625 (see TDF_* in dumpfile.h). */
2627 void
2628 gimple_debug_cfg (dump_flags_t flags)
2630 gimple_dump_cfg (stderr, flags);
2634 /* Dump the program showing basic block boundaries on the given FILE.
2636 FLAGS are the same used by the tree dumping functions (see TDF_* in
2637 tree.h). */
2639 void
2640 gimple_dump_cfg (FILE *file, dump_flags_t flags)
2642 if (flags & TDF_DETAILS)
2644 dump_function_header (file, current_function_decl, flags);
2645 fprintf (file, ";; \n%d basic blocks, %d edges, last basic block %d.\n\n",
2646 n_basic_blocks_for_fn (cfun), n_edges_for_fn (cfun),
2647 last_basic_block_for_fn (cfun));
2649 brief_dump_cfg (file, flags);
2650 fprintf (file, "\n");
2653 if (flags & TDF_STATS)
2654 dump_cfg_stats (file);
2656 dump_function_to_file (current_function_decl, file, flags | TDF_BLOCKS);
2660 /* Dump CFG statistics on FILE. */
2662 void
2663 dump_cfg_stats (FILE *file)
2665 static long max_num_merged_labels = 0;
2666 unsigned long size, total = 0;
2667 long num_edges;
2668 basic_block bb;
2669 const char * const fmt_str = "%-30s%-13s%12s\n";
2670 const char * const fmt_str_1 = "%-30s%13d" PRsa (11) "\n";
2671 const char * const fmt_str_2 = "%-30s%13ld" PRsa (11) "\n";
2672 const char * const fmt_str_3 = "%-43s" PRsa (11) "\n";
2673 const char *funcname = current_function_name ();
2675 fprintf (file, "\nCFG Statistics for %s\n\n", funcname);
2677 fprintf (file, "---------------------------------------------------------\n");
2678 fprintf (file, fmt_str, "", " Number of ", "Memory");
2679 fprintf (file, fmt_str, "", " instances ", "used ");
2680 fprintf (file, "---------------------------------------------------------\n");
2682 size = n_basic_blocks_for_fn (cfun) * sizeof (struct basic_block_def);
2683 total += size;
2684 fprintf (file, fmt_str_1, "Basic blocks", n_basic_blocks_for_fn (cfun),
2685 SIZE_AMOUNT (size));
2687 num_edges = 0;
2688 FOR_EACH_BB_FN (bb, cfun)
2689 num_edges += EDGE_COUNT (bb->succs);
2690 size = num_edges * sizeof (class edge_def);
2691 total += size;
2692 fprintf (file, fmt_str_2, "Edges", num_edges, SIZE_AMOUNT (size));
2694 fprintf (file, "---------------------------------------------------------\n");
2695 fprintf (file, fmt_str_3, "Total memory used by CFG data",
2696 SIZE_AMOUNT (total));
2697 fprintf (file, "---------------------------------------------------------\n");
2698 fprintf (file, "\n");
2700 if (cfg_stats.num_merged_labels > max_num_merged_labels)
2701 max_num_merged_labels = cfg_stats.num_merged_labels;
2703 fprintf (file, "Coalesced label blocks: %ld (Max so far: %ld)\n",
2704 cfg_stats.num_merged_labels, max_num_merged_labels);
2706 fprintf (file, "\n");
2710 /* Dump CFG statistics on stderr. Keep extern so that it's always
2711 linked in the final executable. */
2713 DEBUG_FUNCTION void
2714 debug_cfg_stats (void)
2716 dump_cfg_stats (stderr);
2719 /*---------------------------------------------------------------------------
2720 Miscellaneous helpers
2721 ---------------------------------------------------------------------------*/
2723 /* Return true if T, a GIMPLE_CALL, can make an abnormal transfer of control
2724 flow. Transfers of control flow associated with EH are excluded. */
2726 static bool
2727 call_can_make_abnormal_goto (gimple *t)
2729 /* If the function has no non-local labels, then a call cannot make an
2730 abnormal transfer of control. */
2731 if (!cfun->has_nonlocal_label
2732 && !cfun->calls_setjmp)
2733 return false;
2735 /* Likewise if the call has no side effects. */
2736 if (!gimple_has_side_effects (t))
2737 return false;
2739 /* Likewise if the called function is leaf. */
2740 if (gimple_call_flags (t) & ECF_LEAF)
2741 return false;
2743 return true;
2747 /* Return true if T can make an abnormal transfer of control flow.
2748 Transfers of control flow associated with EH are excluded. */
2750 bool
2751 stmt_can_make_abnormal_goto (gimple *t)
2753 if (computed_goto_p (t))
2754 return true;
2755 if (is_gimple_call (t))
2756 return call_can_make_abnormal_goto (t);
2757 return false;
2761 /* Return true if T represents a stmt that always transfers control. */
2763 bool
2764 is_ctrl_stmt (gimple *t)
2766 switch (gimple_code (t))
2768 case GIMPLE_COND:
2769 case GIMPLE_SWITCH:
2770 case GIMPLE_GOTO:
2771 case GIMPLE_RETURN:
2772 case GIMPLE_RESX:
2773 return true;
2774 default:
2775 return false;
2780 /* Return true if T is a statement that may alter the flow of control
2781 (e.g., a call to a non-returning function). */
2783 bool
2784 is_ctrl_altering_stmt (gimple *t)
2786 gcc_assert (t);
2788 switch (gimple_code (t))
2790 case GIMPLE_CALL:
2791 /* Per stmt call flag indicates whether the call could alter
2792 controlflow. */
2793 if (gimple_call_ctrl_altering_p (t))
2794 return true;
2795 break;
2797 case GIMPLE_EH_DISPATCH:
2798 /* EH_DISPATCH branches to the individual catch handlers at
2799 this level of a try or allowed-exceptions region. It can
2800 fallthru to the next statement as well. */
2801 return true;
2803 case GIMPLE_ASM:
2804 if (gimple_asm_nlabels (as_a <gasm *> (t)) > 0)
2805 return true;
2806 break;
2808 CASE_GIMPLE_OMP:
2809 /* OpenMP directives alter control flow. */
2810 return true;
2812 case GIMPLE_TRANSACTION:
2813 /* A transaction start alters control flow. */
2814 return true;
2816 default:
2817 break;
2820 /* If a statement can throw, it alters control flow. */
2821 return stmt_can_throw_internal (cfun, t);
2825 /* Return true if T is a simple local goto. */
2827 bool
2828 simple_goto_p (gimple *t)
2830 return (gimple_code (t) == GIMPLE_GOTO
2831 && TREE_CODE (gimple_goto_dest (t)) == LABEL_DECL);
2835 /* Return true if STMT should start a new basic block. PREV_STMT is
2836 the statement preceding STMT. It is used when STMT is a label or a
2837 case label. Labels should only start a new basic block if their
2838 previous statement wasn't a label. Otherwise, sequence of labels
2839 would generate unnecessary basic blocks that only contain a single
2840 label. */
2842 static inline bool
2843 stmt_starts_bb_p (gimple *stmt, gimple *prev_stmt)
2845 if (stmt == NULL)
2846 return false;
2848 /* PREV_STMT is only set to a debug stmt if the debug stmt is before
2849 any nondebug stmts in the block. We don't want to start another
2850 block in this case: the debug stmt will already have started the
2851 one STMT would start if we weren't outputting debug stmts. */
2852 if (prev_stmt && is_gimple_debug (prev_stmt))
2853 return false;
2855 /* Labels start a new basic block only if the preceding statement
2856 wasn't a label of the same type. This prevents the creation of
2857 consecutive blocks that have nothing but a single label. */
2858 if (glabel *label_stmt = dyn_cast <glabel *> (stmt))
2860 /* Nonlocal and computed GOTO targets always start a new block. */
2861 if (DECL_NONLOCAL (gimple_label_label (label_stmt))
2862 || FORCED_LABEL (gimple_label_label (label_stmt)))
2863 return true;
2865 if (glabel *plabel = safe_dyn_cast <glabel *> (prev_stmt))
2867 if (DECL_NONLOCAL (gimple_label_label (plabel))
2868 || !DECL_ARTIFICIAL (gimple_label_label (plabel)))
2869 return true;
2871 cfg_stats.num_merged_labels++;
2872 return false;
2874 else
2875 return true;
2877 else if (gimple_code (stmt) == GIMPLE_CALL)
2879 if (gimple_call_flags (stmt) & ECF_RETURNS_TWICE)
2880 /* setjmp acts similar to a nonlocal GOTO target and thus should
2881 start a new block. */
2882 return true;
2883 if (gimple_call_internal_p (stmt, IFN_PHI)
2884 && prev_stmt
2885 && gimple_code (prev_stmt) != GIMPLE_LABEL
2886 && (gimple_code (prev_stmt) != GIMPLE_CALL
2887 || ! gimple_call_internal_p (prev_stmt, IFN_PHI)))
2888 /* PHI nodes start a new block unless preceeded by a label
2889 or another PHI. */
2890 return true;
2893 return false;
2897 /* Return true if T should end a basic block. */
2899 bool
2900 stmt_ends_bb_p (gimple *t)
2902 return is_ctrl_stmt (t) || is_ctrl_altering_stmt (t);
2905 /* Remove block annotations and other data structures. */
2907 void
2908 delete_tree_cfg_annotations (struct function *fn)
2910 vec_free (label_to_block_map_for_fn (fn));
2913 /* Return the virtual phi in BB. */
2915 gphi *
2916 get_virtual_phi (basic_block bb)
2918 for (gphi_iterator gsi = gsi_start_phis (bb);
2919 !gsi_end_p (gsi);
2920 gsi_next (&gsi))
2922 gphi *phi = gsi.phi ();
2924 if (virtual_operand_p (PHI_RESULT (phi)))
2925 return phi;
2928 return NULL;
2931 /* Return the first statement in basic block BB. */
2933 gimple *
2934 first_stmt (basic_block bb)
2936 gimple_stmt_iterator i = gsi_start_bb (bb);
2937 gimple *stmt = NULL;
2939 while (!gsi_end_p (i) && is_gimple_debug ((stmt = gsi_stmt (i))))
2941 gsi_next (&i);
2942 stmt = NULL;
2944 return stmt;
2947 /* Return the first non-label statement in basic block BB. */
2949 static gimple *
2950 first_non_label_stmt (basic_block bb)
2952 gimple_stmt_iterator i = gsi_start_bb (bb);
2953 while (!gsi_end_p (i) && gimple_code (gsi_stmt (i)) == GIMPLE_LABEL)
2954 gsi_next (&i);
2955 return !gsi_end_p (i) ? gsi_stmt (i) : NULL;
2958 /* Return the last statement in basic block BB. */
2960 gimple *
2961 last_nondebug_stmt (basic_block bb)
2963 gimple_stmt_iterator i = gsi_last_bb (bb);
2964 gimple *stmt = NULL;
2966 while (!gsi_end_p (i) && is_gimple_debug ((stmt = gsi_stmt (i))))
2968 gsi_prev (&i);
2969 stmt = NULL;
2971 return stmt;
2974 /* Return the last statement of an otherwise empty block. Return NULL
2975 if the block is totally empty, or if it contains more than one
2976 statement. */
2978 gimple *
2979 last_and_only_stmt (basic_block bb)
2981 gimple_stmt_iterator i = gsi_last_nondebug_bb (bb);
2982 gimple *last, *prev;
2984 if (gsi_end_p (i))
2985 return NULL;
2987 last = gsi_stmt (i);
2988 gsi_prev_nondebug (&i);
2989 if (gsi_end_p (i))
2990 return last;
2992 /* Empty statements should no longer appear in the instruction stream.
2993 Everything that might have appeared before should be deleted by
2994 remove_useless_stmts, and the optimizers should just gsi_remove
2995 instead of smashing with build_empty_stmt.
2997 Thus the only thing that should appear here in a block containing
2998 one executable statement is a label. */
2999 prev = gsi_stmt (i);
3000 if (gimple_code (prev) == GIMPLE_LABEL)
3001 return last;
3002 else
3003 return NULL;
3006 /* Returns the basic block after which the new basic block created
3007 by splitting edge EDGE_IN should be placed. Tries to keep the new block
3008 near its "logical" location. This is of most help to humans looking
3009 at debugging dumps. */
3011 basic_block
3012 split_edge_bb_loc (edge edge_in)
3014 basic_block dest = edge_in->dest;
3015 basic_block dest_prev = dest->prev_bb;
3017 if (dest_prev)
3019 edge e = find_edge (dest_prev, dest);
3020 if (e && !(e->flags & EDGE_COMPLEX))
3021 return edge_in->src;
3023 return dest_prev;
3026 /* Split a (typically critical) edge EDGE_IN. Return the new block.
3027 Abort on abnormal edges. */
3029 static basic_block
3030 gimple_split_edge (edge edge_in)
3032 basic_block new_bb, after_bb, dest;
3033 edge new_edge, e;
3035 /* Abnormal edges cannot be split. */
3036 gcc_assert (!(edge_in->flags & EDGE_ABNORMAL));
3038 dest = edge_in->dest;
3040 after_bb = split_edge_bb_loc (edge_in);
3042 new_bb = create_empty_bb (after_bb);
3043 new_bb->count = edge_in->count ();
3045 /* We want to avoid re-allocating PHIs when we first
3046 add the fallthru edge from new_bb to dest but we also
3047 want to avoid changing PHI argument order when
3048 first redirecting edge_in away from dest. The former
3049 avoids changing PHI argument order by adding them
3050 last and then the redirection swapping it back into
3051 place by means of unordered remove.
3052 So hack around things by temporarily removing all PHIs
3053 from the destination during the edge redirection and then
3054 making sure the edges stay in order. */
3055 gimple_seq saved_phis = phi_nodes (dest);
3056 unsigned old_dest_idx = edge_in->dest_idx;
3057 set_phi_nodes (dest, NULL);
3058 new_edge = make_single_succ_edge (new_bb, dest, EDGE_FALLTHRU);
3059 e = redirect_edge_and_branch (edge_in, new_bb);
3060 gcc_assert (e == edge_in && new_edge->dest_idx == old_dest_idx);
3061 /* set_phi_nodes sets the BB of the PHI nodes, so do it manually here. */
3062 dest->il.gimple.phi_nodes = saved_phis;
3064 return new_bb;
3068 /* Verify properties of the address expression T whose base should be
3069 TREE_ADDRESSABLE if VERIFY_ADDRESSABLE is true. */
3071 static bool
3072 verify_address (tree t, bool verify_addressable)
3074 bool old_constant;
3075 bool old_side_effects;
3076 bool new_constant;
3077 bool new_side_effects;
3079 old_constant = TREE_CONSTANT (t);
3080 old_side_effects = TREE_SIDE_EFFECTS (t);
3082 recompute_tree_invariant_for_addr_expr (t);
3083 new_side_effects = TREE_SIDE_EFFECTS (t);
3084 new_constant = TREE_CONSTANT (t);
3086 if (old_constant != new_constant)
3088 error ("constant not recomputed when %<ADDR_EXPR%> changed");
3089 return true;
3091 if (old_side_effects != new_side_effects)
3093 error ("side effects not recomputed when %<ADDR_EXPR%> changed");
3094 return true;
3097 tree base = TREE_OPERAND (t, 0);
3098 while (handled_component_p (base))
3099 base = TREE_OPERAND (base, 0);
3101 if (!(VAR_P (base)
3102 || TREE_CODE (base) == PARM_DECL
3103 || TREE_CODE (base) == RESULT_DECL))
3104 return false;
3106 if (verify_addressable && !TREE_ADDRESSABLE (base))
3108 error ("address taken but %<TREE_ADDRESSABLE%> bit not set");
3109 return true;
3112 return false;
3116 /* Verify if EXPR is a valid GIMPLE reference expression. If
3117 REQUIRE_LVALUE is true verifies it is an lvalue. Returns true
3118 if there is an error, otherwise false. */
3120 static bool
3121 verify_types_in_gimple_reference (tree expr, bool require_lvalue)
3123 const char *code_name = get_tree_code_name (TREE_CODE (expr));
3125 if (TREE_CODE (expr) == REALPART_EXPR
3126 || TREE_CODE (expr) == IMAGPART_EXPR
3127 || TREE_CODE (expr) == BIT_FIELD_REF
3128 || TREE_CODE (expr) == VIEW_CONVERT_EXPR)
3130 tree op = TREE_OPERAND (expr, 0);
3131 if (TREE_CODE (expr) != VIEW_CONVERT_EXPR
3132 && !is_gimple_reg_type (TREE_TYPE (expr)))
3134 error ("non-scalar %qs", code_name);
3135 return true;
3138 if (TREE_CODE (expr) == BIT_FIELD_REF)
3140 tree t1 = TREE_OPERAND (expr, 1);
3141 tree t2 = TREE_OPERAND (expr, 2);
3142 poly_uint64 size, bitpos;
3143 if (!poly_int_tree_p (t1, &size)
3144 || !poly_int_tree_p (t2, &bitpos)
3145 || !types_compatible_p (bitsizetype, TREE_TYPE (t1))
3146 || !types_compatible_p (bitsizetype, TREE_TYPE (t2)))
3148 error ("invalid position or size operand to %qs", code_name);
3149 return true;
3151 if (INTEGRAL_TYPE_P (TREE_TYPE (expr))
3152 && maybe_ne (TYPE_PRECISION (TREE_TYPE (expr)), size))
3154 error ("integral result type precision does not match "
3155 "field size of %qs", code_name);
3156 return true;
3158 else if (!INTEGRAL_TYPE_P (TREE_TYPE (expr))
3159 && TYPE_MODE (TREE_TYPE (expr)) != BLKmode
3160 && maybe_ne (GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (expr))),
3161 size))
3163 error ("mode size of non-integral result does not "
3164 "match field size of %qs",
3165 code_name);
3166 return true;
3168 if (INTEGRAL_TYPE_P (TREE_TYPE (op))
3169 && !type_has_mode_precision_p (TREE_TYPE (op)))
3171 error ("%qs of non-mode-precision operand", code_name);
3172 return true;
3174 if (!AGGREGATE_TYPE_P (TREE_TYPE (op))
3175 && maybe_gt (size + bitpos,
3176 tree_to_poly_uint64 (TYPE_SIZE (TREE_TYPE (op)))))
3178 error ("position plus size exceeds size of referenced object in "
3179 "%qs", code_name);
3180 return true;
3184 if ((TREE_CODE (expr) == REALPART_EXPR
3185 || TREE_CODE (expr) == IMAGPART_EXPR)
3186 && !useless_type_conversion_p (TREE_TYPE (expr),
3187 TREE_TYPE (TREE_TYPE (op))))
3189 error ("type mismatch in %qs reference", code_name);
3190 debug_generic_stmt (TREE_TYPE (expr));
3191 debug_generic_stmt (TREE_TYPE (TREE_TYPE (op)));
3192 return true;
3195 if (TREE_CODE (expr) == VIEW_CONVERT_EXPR)
3197 /* For VIEW_CONVERT_EXPRs which are allowed here too, we only check
3198 that their operand is not a register an invariant when
3199 requiring an lvalue (this usually means there is a SRA or IPA-SRA
3200 bug). Otherwise there is nothing to verify, gross mismatches at
3201 most invoke undefined behavior. */
3202 if (require_lvalue
3203 && (is_gimple_reg (op) || is_gimple_min_invariant (op)))
3205 error ("conversion of %qs on the left hand side of %qs",
3206 get_tree_code_name (TREE_CODE (op)), code_name);
3207 debug_generic_stmt (expr);
3208 return true;
3210 else if (is_gimple_reg (op)
3211 && TYPE_SIZE (TREE_TYPE (expr)) != TYPE_SIZE (TREE_TYPE (op)))
3213 error ("conversion of register to a different size in %qs",
3214 code_name);
3215 debug_generic_stmt (expr);
3216 return true;
3220 expr = op;
3223 bool require_non_reg = false;
3224 while (handled_component_p (expr))
3226 require_non_reg = true;
3227 code_name = get_tree_code_name (TREE_CODE (expr));
3229 if (TREE_CODE (expr) == REALPART_EXPR
3230 || TREE_CODE (expr) == IMAGPART_EXPR
3231 || TREE_CODE (expr) == BIT_FIELD_REF)
3233 error ("non-top-level %qs", code_name);
3234 return true;
3237 tree op = TREE_OPERAND (expr, 0);
3239 if (TREE_CODE (expr) == ARRAY_REF
3240 || TREE_CODE (expr) == ARRAY_RANGE_REF)
3242 if (!is_gimple_val (TREE_OPERAND (expr, 1))
3243 || (TREE_OPERAND (expr, 2)
3244 && !is_gimple_val (TREE_OPERAND (expr, 2)))
3245 || (TREE_OPERAND (expr, 3)
3246 && !is_gimple_val (TREE_OPERAND (expr, 3))))
3248 error ("invalid operands to %qs", code_name);
3249 debug_generic_stmt (expr);
3250 return true;
3254 /* Verify if the reference array element types are compatible. */
3255 if (TREE_CODE (expr) == ARRAY_REF
3256 && !useless_type_conversion_p (TREE_TYPE (expr),
3257 TREE_TYPE (TREE_TYPE (op))))
3259 error ("type mismatch in %qs", code_name);
3260 debug_generic_stmt (TREE_TYPE (expr));
3261 debug_generic_stmt (TREE_TYPE (TREE_TYPE (op)));
3262 return true;
3264 if (TREE_CODE (expr) == ARRAY_RANGE_REF
3265 && !useless_type_conversion_p (TREE_TYPE (TREE_TYPE (expr)),
3266 TREE_TYPE (TREE_TYPE (op))))
3268 error ("type mismatch in %qs", code_name);
3269 debug_generic_stmt (TREE_TYPE (TREE_TYPE (expr)));
3270 debug_generic_stmt (TREE_TYPE (TREE_TYPE (op)));
3271 return true;
3274 if (TREE_CODE (expr) == COMPONENT_REF)
3276 if (TREE_OPERAND (expr, 2)
3277 && !is_gimple_val (TREE_OPERAND (expr, 2)))
3279 error ("invalid %qs offset operator", code_name);
3280 return true;
3282 if (!useless_type_conversion_p (TREE_TYPE (expr),
3283 TREE_TYPE (TREE_OPERAND (expr, 1))))
3285 error ("type mismatch in %qs", code_name);
3286 debug_generic_stmt (TREE_TYPE (expr));
3287 debug_generic_stmt (TREE_TYPE (TREE_OPERAND (expr, 1)));
3288 return true;
3292 expr = op;
3295 code_name = get_tree_code_name (TREE_CODE (expr));
3297 if (TREE_CODE (expr) == MEM_REF)
3299 if (!is_gimple_mem_ref_addr (TREE_OPERAND (expr, 0))
3300 || (TREE_CODE (TREE_OPERAND (expr, 0)) == ADDR_EXPR
3301 && verify_address (TREE_OPERAND (expr, 0), false)))
3303 error ("invalid address operand in %qs", code_name);
3304 debug_generic_stmt (expr);
3305 return true;
3307 if (!poly_int_tree_p (TREE_OPERAND (expr, 1))
3308 || !POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (expr, 1))))
3310 error ("invalid offset operand in %qs", code_name);
3311 debug_generic_stmt (expr);
3312 return true;
3314 if (MR_DEPENDENCE_CLIQUE (expr) != 0
3315 && MR_DEPENDENCE_CLIQUE (expr) > cfun->last_clique)
3317 error ("invalid clique in %qs", code_name);
3318 debug_generic_stmt (expr);
3319 return true;
3322 else if (TREE_CODE (expr) == TARGET_MEM_REF)
3324 if (!TMR_BASE (expr)
3325 || !is_gimple_mem_ref_addr (TMR_BASE (expr))
3326 || (TREE_CODE (TMR_BASE (expr)) == ADDR_EXPR
3327 && verify_address (TMR_BASE (expr), false)))
3329 error ("invalid address operand in %qs", code_name);
3330 return true;
3332 if (!TMR_OFFSET (expr)
3333 || !poly_int_tree_p (TMR_OFFSET (expr))
3334 || !POINTER_TYPE_P (TREE_TYPE (TMR_OFFSET (expr))))
3336 error ("invalid offset operand in %qs", code_name);
3337 debug_generic_stmt (expr);
3338 return true;
3340 if (MR_DEPENDENCE_CLIQUE (expr) != 0
3341 && MR_DEPENDENCE_CLIQUE (expr) > cfun->last_clique)
3343 error ("invalid clique in %qs", code_name);
3344 debug_generic_stmt (expr);
3345 return true;
3348 else if (INDIRECT_REF_P (expr))
3350 error ("%qs in gimple IL", code_name);
3351 debug_generic_stmt (expr);
3352 return true;
3354 else if (require_non_reg
3355 && (is_gimple_reg (expr)
3356 || (is_gimple_min_invariant (expr)
3357 /* STRING_CSTs are representatives of the string table
3358 entry which lives in memory. */
3359 && TREE_CODE (expr) != STRING_CST)))
3361 error ("%qs as base where non-register is required", code_name);
3362 debug_generic_stmt (expr);
3363 return true;
3366 if (!require_lvalue
3367 && (is_gimple_reg (expr) || is_gimple_min_invariant (expr)))
3368 return false;
3370 if (TREE_CODE (expr) != SSA_NAME && is_gimple_id (expr))
3371 return false;
3373 if (TREE_CODE (expr) != TARGET_MEM_REF
3374 && TREE_CODE (expr) != MEM_REF)
3376 error ("invalid expression for min lvalue");
3377 return true;
3380 return false;
3383 /* Returns true if there is one pointer type in TYPE_POINTER_TO (SRC_OBJ)
3384 list of pointer-to types that is trivially convertible to DEST. */
3386 static bool
3387 one_pointer_to_useless_type_conversion_p (tree dest, tree src_obj)
3389 tree src;
3391 if (!TYPE_POINTER_TO (src_obj))
3392 return true;
3394 for (src = TYPE_POINTER_TO (src_obj); src; src = TYPE_NEXT_PTR_TO (src))
3395 if (useless_type_conversion_p (dest, src))
3396 return true;
3398 return false;
3401 /* Return true if TYPE1 is a fixed-point type and if conversions to and
3402 from TYPE2 can be handled by FIXED_CONVERT_EXPR. */
3404 static bool
3405 valid_fixed_convert_types_p (tree type1, tree type2)
3407 return (FIXED_POINT_TYPE_P (type1)
3408 && (INTEGRAL_TYPE_P (type2)
3409 || SCALAR_FLOAT_TYPE_P (type2)
3410 || FIXED_POINT_TYPE_P (type2)));
3413 /* Verify the contents of a GIMPLE_CALL STMT. Returns true when there
3414 is a problem, otherwise false. */
3416 static bool
3417 verify_gimple_call (gcall *stmt)
3419 tree fn = gimple_call_fn (stmt);
3420 tree fntype, fndecl;
3421 unsigned i;
3423 if (gimple_call_internal_p (stmt))
3425 if (fn)
3427 error ("gimple call has two targets");
3428 debug_generic_stmt (fn);
3429 return true;
3432 else
3434 if (!fn)
3436 error ("gimple call has no target");
3437 return true;
3441 if (fn && !is_gimple_call_addr (fn))
3443 error ("invalid function in gimple call");
3444 debug_generic_stmt (fn);
3445 return true;
3448 if (fn
3449 && (!POINTER_TYPE_P (TREE_TYPE (fn))
3450 || (TREE_CODE (TREE_TYPE (TREE_TYPE (fn))) != FUNCTION_TYPE
3451 && TREE_CODE (TREE_TYPE (TREE_TYPE (fn))) != METHOD_TYPE)))
3453 error ("non-function in gimple call");
3454 return true;
3457 fndecl = gimple_call_fndecl (stmt);
3458 if (fndecl
3459 && TREE_CODE (fndecl) == FUNCTION_DECL
3460 && DECL_LOOPING_CONST_OR_PURE_P (fndecl)
3461 && !DECL_PURE_P (fndecl)
3462 && !TREE_READONLY (fndecl))
3464 error ("invalid pure const state for function");
3465 return true;
3468 tree lhs = gimple_call_lhs (stmt);
3469 if (lhs
3470 && (!is_gimple_reg (lhs)
3471 && (!is_gimple_lvalue (lhs)
3472 || verify_types_in_gimple_reference
3473 (TREE_CODE (lhs) == WITH_SIZE_EXPR
3474 ? TREE_OPERAND (lhs, 0) : lhs, true))))
3476 error ("invalid LHS in gimple call");
3477 return true;
3480 if (gimple_call_ctrl_altering_p (stmt)
3481 && gimple_call_noreturn_p (stmt)
3482 && should_remove_lhs_p (lhs))
3484 error ("LHS in %<noreturn%> call");
3485 return true;
3488 fntype = gimple_call_fntype (stmt);
3489 if (fntype
3490 && lhs
3491 && !useless_type_conversion_p (TREE_TYPE (lhs), TREE_TYPE (fntype))
3492 /* ??? At least C++ misses conversions at assignments from
3493 void * call results.
3494 For now simply allow arbitrary pointer type conversions. */
3495 && !(POINTER_TYPE_P (TREE_TYPE (lhs))
3496 && POINTER_TYPE_P (TREE_TYPE (fntype))))
3498 error ("invalid conversion in gimple call");
3499 debug_generic_stmt (TREE_TYPE (lhs));
3500 debug_generic_stmt (TREE_TYPE (fntype));
3501 return true;
3504 if (gimple_call_chain (stmt)
3505 && !is_gimple_val (gimple_call_chain (stmt)))
3507 error ("invalid static chain in gimple call");
3508 debug_generic_stmt (gimple_call_chain (stmt));
3509 return true;
3512 /* If there is a static chain argument, the call should either be
3513 indirect, or the decl should have DECL_STATIC_CHAIN set. */
3514 if (gimple_call_chain (stmt)
3515 && fndecl
3516 && !DECL_STATIC_CHAIN (fndecl))
3518 error ("static chain with function that doesn%'t use one");
3519 return true;
3522 if (fndecl && fndecl_built_in_p (fndecl, BUILT_IN_NORMAL))
3524 switch (DECL_FUNCTION_CODE (fndecl))
3526 case BUILT_IN_UNREACHABLE:
3527 case BUILT_IN_UNREACHABLE_TRAP:
3528 case BUILT_IN_TRAP:
3529 if (gimple_call_num_args (stmt) > 0)
3531 /* Built-in unreachable with parameters might not be caught by
3532 undefined behavior sanitizer. Front-ends do check users do not
3533 call them that way but we also produce calls to
3534 __builtin_unreachable internally, for example when IPA figures
3535 out a call cannot happen in a legal program. In such cases,
3536 we must make sure arguments are stripped off. */
3537 error ("%<__builtin_unreachable%> or %<__builtin_trap%> call "
3538 "with arguments");
3539 return true;
3541 break;
3542 default:
3543 break;
3547 /* For a call to .DEFERRED_INIT,
3548 LHS = DEFERRED_INIT (SIZE of the DECL, INIT_TYPE, NAME of the DECL)
3549 we should guarantee that when the 1st argument is a constant, it should
3550 be the same as the size of the LHS. */
3552 if (gimple_call_internal_p (stmt, IFN_DEFERRED_INIT))
3554 tree size_of_arg0 = gimple_call_arg (stmt, 0);
3555 tree size_of_lhs = TYPE_SIZE_UNIT (TREE_TYPE (lhs));
3557 if (TREE_CODE (lhs) == SSA_NAME)
3558 lhs = SSA_NAME_VAR (lhs);
3560 poly_uint64 size_from_arg0, size_from_lhs;
3561 bool is_constant_size_arg0 = poly_int_tree_p (size_of_arg0,
3562 &size_from_arg0);
3563 bool is_constant_size_lhs = poly_int_tree_p (size_of_lhs,
3564 &size_from_lhs);
3565 if (is_constant_size_arg0 && is_constant_size_lhs)
3566 if (maybe_ne (size_from_arg0, size_from_lhs))
3568 error ("%<DEFERRED_INIT%> calls should have same "
3569 "constant size for the first argument and LHS");
3570 return true;
3574 /* ??? The C frontend passes unpromoted arguments in case it
3575 didn't see a function declaration before the call. So for now
3576 leave the call arguments mostly unverified. Once we gimplify
3577 unit-at-a-time we have a chance to fix this. */
3578 for (i = 0; i < gimple_call_num_args (stmt); ++i)
3580 tree arg = gimple_call_arg (stmt, i);
3581 if ((is_gimple_reg_type (TREE_TYPE (arg))
3582 && !is_gimple_val (arg))
3583 || (!is_gimple_reg_type (TREE_TYPE (arg))
3584 && !is_gimple_lvalue (arg)))
3586 error ("invalid argument to gimple call");
3587 debug_generic_expr (arg);
3588 return true;
3590 if (!is_gimple_reg (arg))
3592 if (TREE_CODE (arg) == WITH_SIZE_EXPR)
3593 arg = TREE_OPERAND (arg, 0);
3594 if (verify_types_in_gimple_reference (arg, false))
3595 return true;
3599 return false;
3602 /* Verifies the gimple comparison with the result type TYPE and
3603 the operands OP0 and OP1, comparison code is CODE. */
3605 static bool
3606 verify_gimple_comparison (tree type, tree op0, tree op1, enum tree_code code)
3608 tree op0_type = TREE_TYPE (op0);
3609 tree op1_type = TREE_TYPE (op1);
3611 if (!is_gimple_val (op0) || !is_gimple_val (op1))
3613 error ("invalid operands in gimple comparison");
3614 return true;
3617 /* For comparisons we do not have the operations type as the
3618 effective type the comparison is carried out in. Instead
3619 we require that either the first operand is trivially
3620 convertible into the second, or the other way around. */
3621 if (!useless_type_conversion_p (op0_type, op1_type)
3622 && !useless_type_conversion_p (op1_type, op0_type))
3624 error ("mismatching comparison operand types");
3625 debug_generic_expr (op0_type);
3626 debug_generic_expr (op1_type);
3627 return true;
3630 /* The resulting type of a comparison may be an effective boolean type. */
3631 if (INTEGRAL_TYPE_P (type)
3632 && (TREE_CODE (type) == BOOLEAN_TYPE
3633 || TYPE_PRECISION (type) == 1))
3635 if ((VECTOR_TYPE_P (op0_type)
3636 || VECTOR_TYPE_P (op1_type))
3637 && code != EQ_EXPR && code != NE_EXPR
3638 && !VECTOR_BOOLEAN_TYPE_P (op0_type)
3639 && !VECTOR_INTEGER_TYPE_P (op0_type))
3641 error ("unsupported operation or type for vector comparison"
3642 " returning a boolean");
3643 debug_generic_expr (op0_type);
3644 debug_generic_expr (op1_type);
3645 return true;
3648 /* Or a boolean vector type with the same element count
3649 as the comparison operand types. */
3650 else if (VECTOR_TYPE_P (type)
3651 && TREE_CODE (TREE_TYPE (type)) == BOOLEAN_TYPE)
3653 if (TREE_CODE (op0_type) != VECTOR_TYPE
3654 || TREE_CODE (op1_type) != VECTOR_TYPE)
3656 error ("non-vector operands in vector comparison");
3657 debug_generic_expr (op0_type);
3658 debug_generic_expr (op1_type);
3659 return true;
3662 if (maybe_ne (TYPE_VECTOR_SUBPARTS (type),
3663 TYPE_VECTOR_SUBPARTS (op0_type)))
3665 error ("invalid vector comparison resulting type");
3666 debug_generic_expr (type);
3667 return true;
3670 else
3672 error ("bogus comparison result type");
3673 debug_generic_expr (type);
3674 return true;
3677 return false;
3680 /* Verify a gimple assignment statement STMT with an unary rhs.
3681 Returns true if anything is wrong. */
3683 static bool
3684 verify_gimple_assign_unary (gassign *stmt)
3686 enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
3687 tree lhs = gimple_assign_lhs (stmt);
3688 tree lhs_type = TREE_TYPE (lhs);
3689 tree rhs1 = gimple_assign_rhs1 (stmt);
3690 tree rhs1_type = TREE_TYPE (rhs1);
3692 if (!is_gimple_reg (lhs))
3694 error ("non-register as LHS of unary operation");
3695 return true;
3698 if (!is_gimple_val (rhs1))
3700 error ("invalid operand in unary operation");
3701 return true;
3704 const char* const code_name = get_tree_code_name (rhs_code);
3706 /* First handle conversions. */
3707 switch (rhs_code)
3709 CASE_CONVERT:
3711 /* Allow conversions between vectors with the same number of elements,
3712 provided that the conversion is OK for the element types too. */
3713 if (VECTOR_TYPE_P (lhs_type)
3714 && VECTOR_TYPE_P (rhs1_type)
3715 && known_eq (TYPE_VECTOR_SUBPARTS (lhs_type),
3716 TYPE_VECTOR_SUBPARTS (rhs1_type)))
3718 lhs_type = TREE_TYPE (lhs_type);
3719 rhs1_type = TREE_TYPE (rhs1_type);
3721 else if (VECTOR_TYPE_P (lhs_type) || VECTOR_TYPE_P (rhs1_type))
3723 error ("invalid vector types in nop conversion");
3724 debug_generic_expr (lhs_type);
3725 debug_generic_expr (rhs1_type);
3726 return true;
3729 /* Allow conversions from pointer type to integral type only if
3730 there is no sign or zero extension involved.
3731 For targets were the precision of ptrofftype doesn't match that
3732 of pointers we allow conversions to types where
3733 POINTERS_EXTEND_UNSIGNED specifies how that works. */
3734 if ((POINTER_TYPE_P (lhs_type)
3735 && INTEGRAL_TYPE_P (rhs1_type))
3736 || (POINTER_TYPE_P (rhs1_type)
3737 && INTEGRAL_TYPE_P (lhs_type)
3738 && (TYPE_PRECISION (rhs1_type) >= TYPE_PRECISION (lhs_type)
3739 #if defined(POINTERS_EXTEND_UNSIGNED)
3740 || (TYPE_MODE (rhs1_type) == ptr_mode
3741 && (TYPE_PRECISION (lhs_type)
3742 == BITS_PER_WORD /* word_mode */
3743 || (TYPE_PRECISION (lhs_type)
3744 == GET_MODE_PRECISION (Pmode))))
3745 #endif
3747 return false;
3749 /* Allow conversion from integral to offset type and vice versa. */
3750 if ((TREE_CODE (lhs_type) == OFFSET_TYPE
3751 && INTEGRAL_TYPE_P (rhs1_type))
3752 || (INTEGRAL_TYPE_P (lhs_type)
3753 && TREE_CODE (rhs1_type) == OFFSET_TYPE))
3754 return false;
3756 /* Otherwise assert we are converting between types of the
3757 same kind. */
3758 if (INTEGRAL_TYPE_P (lhs_type) != INTEGRAL_TYPE_P (rhs1_type))
3760 error ("invalid types in nop conversion");
3761 debug_generic_expr (lhs_type);
3762 debug_generic_expr (rhs1_type);
3763 return true;
3766 return false;
3769 case ADDR_SPACE_CONVERT_EXPR:
3771 if (!POINTER_TYPE_P (rhs1_type) || !POINTER_TYPE_P (lhs_type)
3772 || (TYPE_ADDR_SPACE (TREE_TYPE (rhs1_type))
3773 == TYPE_ADDR_SPACE (TREE_TYPE (lhs_type))))
3775 error ("invalid types in address space conversion");
3776 debug_generic_expr (lhs_type);
3777 debug_generic_expr (rhs1_type);
3778 return true;
3781 return false;
3784 case FIXED_CONVERT_EXPR:
3786 if (!valid_fixed_convert_types_p (lhs_type, rhs1_type)
3787 && !valid_fixed_convert_types_p (rhs1_type, lhs_type))
3789 error ("invalid types in fixed-point conversion");
3790 debug_generic_expr (lhs_type);
3791 debug_generic_expr (rhs1_type);
3792 return true;
3795 return false;
3798 case FLOAT_EXPR:
3800 if ((!INTEGRAL_TYPE_P (rhs1_type) || !SCALAR_FLOAT_TYPE_P (lhs_type))
3801 && (!VECTOR_INTEGER_TYPE_P (rhs1_type)
3802 || !VECTOR_FLOAT_TYPE_P (lhs_type)))
3804 error ("invalid types in conversion to floating-point");
3805 debug_generic_expr (lhs_type);
3806 debug_generic_expr (rhs1_type);
3807 return true;
3810 return false;
3813 case FIX_TRUNC_EXPR:
3815 if ((!INTEGRAL_TYPE_P (lhs_type) || !SCALAR_FLOAT_TYPE_P (rhs1_type))
3816 && (!VECTOR_INTEGER_TYPE_P (lhs_type)
3817 || !VECTOR_FLOAT_TYPE_P (rhs1_type)))
3819 error ("invalid types in conversion to integer");
3820 debug_generic_expr (lhs_type);
3821 debug_generic_expr (rhs1_type);
3822 return true;
3825 return false;
3828 case VEC_UNPACK_HI_EXPR:
3829 case VEC_UNPACK_LO_EXPR:
3830 case VEC_UNPACK_FLOAT_HI_EXPR:
3831 case VEC_UNPACK_FLOAT_LO_EXPR:
3832 case VEC_UNPACK_FIX_TRUNC_HI_EXPR:
3833 case VEC_UNPACK_FIX_TRUNC_LO_EXPR:
3834 if (TREE_CODE (rhs1_type) != VECTOR_TYPE
3835 || TREE_CODE (lhs_type) != VECTOR_TYPE
3836 || (!INTEGRAL_TYPE_P (TREE_TYPE (lhs_type))
3837 && !SCALAR_FLOAT_TYPE_P (TREE_TYPE (lhs_type)))
3838 || (!INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))
3839 && !SCALAR_FLOAT_TYPE_P (TREE_TYPE (rhs1_type)))
3840 || ((rhs_code == VEC_UNPACK_HI_EXPR
3841 || rhs_code == VEC_UNPACK_LO_EXPR)
3842 && (INTEGRAL_TYPE_P (TREE_TYPE (lhs_type))
3843 != INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))))
3844 || ((rhs_code == VEC_UNPACK_FLOAT_HI_EXPR
3845 || rhs_code == VEC_UNPACK_FLOAT_LO_EXPR)
3846 && (INTEGRAL_TYPE_P (TREE_TYPE (lhs_type))
3847 || SCALAR_FLOAT_TYPE_P (TREE_TYPE (rhs1_type))))
3848 || ((rhs_code == VEC_UNPACK_FIX_TRUNC_HI_EXPR
3849 || rhs_code == VEC_UNPACK_FIX_TRUNC_LO_EXPR)
3850 && (INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))
3851 || SCALAR_FLOAT_TYPE_P (TREE_TYPE (lhs_type))))
3852 || (maybe_ne (GET_MODE_SIZE (element_mode (lhs_type)),
3853 2 * GET_MODE_SIZE (element_mode (rhs1_type)))
3854 && (!VECTOR_BOOLEAN_TYPE_P (lhs_type)
3855 || !VECTOR_BOOLEAN_TYPE_P (rhs1_type)))
3856 || maybe_ne (2 * TYPE_VECTOR_SUBPARTS (lhs_type),
3857 TYPE_VECTOR_SUBPARTS (rhs1_type)))
3859 error ("type mismatch in %qs expression", code_name);
3860 debug_generic_expr (lhs_type);
3861 debug_generic_expr (rhs1_type);
3862 return true;
3865 return false;
3867 case NEGATE_EXPR:
3868 case ABS_EXPR:
3869 case BIT_NOT_EXPR:
3870 case PAREN_EXPR:
3871 case CONJ_EXPR:
3872 /* Disallow pointer and offset types for many of the unary gimple. */
3873 if (POINTER_TYPE_P (lhs_type)
3874 || TREE_CODE (lhs_type) == OFFSET_TYPE)
3876 error ("invalid types for %qs", code_name);
3877 debug_generic_expr (lhs_type);
3878 debug_generic_expr (rhs1_type);
3879 return true;
3881 break;
3883 case ABSU_EXPR:
3884 if (!ANY_INTEGRAL_TYPE_P (lhs_type)
3885 || !TYPE_UNSIGNED (lhs_type)
3886 || !ANY_INTEGRAL_TYPE_P (rhs1_type)
3887 || TYPE_UNSIGNED (rhs1_type)
3888 || element_precision (lhs_type) != element_precision (rhs1_type))
3890 error ("invalid types for %qs", code_name);
3891 debug_generic_expr (lhs_type);
3892 debug_generic_expr (rhs1_type);
3893 return true;
3895 return false;
3897 case VEC_DUPLICATE_EXPR:
3898 if (TREE_CODE (lhs_type) != VECTOR_TYPE
3899 || !useless_type_conversion_p (TREE_TYPE (lhs_type), rhs1_type))
3901 error ("%qs should be from a scalar to a like vector", code_name);
3902 debug_generic_expr (lhs_type);
3903 debug_generic_expr (rhs1_type);
3904 return true;
3906 return false;
3908 default:
3909 gcc_unreachable ();
3912 /* For the remaining codes assert there is no conversion involved. */
3913 if (!useless_type_conversion_p (lhs_type, rhs1_type))
3915 error ("non-trivial conversion in unary operation");
3916 debug_generic_expr (lhs_type);
3917 debug_generic_expr (rhs1_type);
3918 return true;
3921 return false;
3924 /* Verify a gimple assignment statement STMT with a binary rhs.
3925 Returns true if anything is wrong. */
3927 static bool
3928 verify_gimple_assign_binary (gassign *stmt)
3930 enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
3931 tree lhs = gimple_assign_lhs (stmt);
3932 tree lhs_type = TREE_TYPE (lhs);
3933 tree rhs1 = gimple_assign_rhs1 (stmt);
3934 tree rhs1_type = TREE_TYPE (rhs1);
3935 tree rhs2 = gimple_assign_rhs2 (stmt);
3936 tree rhs2_type = TREE_TYPE (rhs2);
3938 if (!is_gimple_reg (lhs))
3940 error ("non-register as LHS of binary operation");
3941 return true;
3944 if (!is_gimple_val (rhs1)
3945 || !is_gimple_val (rhs2))
3947 error ("invalid operands in binary operation");
3948 return true;
3951 const char* const code_name = get_tree_code_name (rhs_code);
3953 /* First handle operations that involve different types. */
3954 switch (rhs_code)
3956 case COMPLEX_EXPR:
3958 if (TREE_CODE (lhs_type) != COMPLEX_TYPE
3959 || !(INTEGRAL_TYPE_P (rhs1_type)
3960 || SCALAR_FLOAT_TYPE_P (rhs1_type))
3961 || !(INTEGRAL_TYPE_P (rhs2_type)
3962 || SCALAR_FLOAT_TYPE_P (rhs2_type)))
3964 error ("type mismatch in %qs", code_name);
3965 debug_generic_expr (lhs_type);
3966 debug_generic_expr (rhs1_type);
3967 debug_generic_expr (rhs2_type);
3968 return true;
3971 return false;
3974 case LSHIFT_EXPR:
3975 case RSHIFT_EXPR:
3976 case LROTATE_EXPR:
3977 case RROTATE_EXPR:
3979 /* Shifts and rotates are ok on integral types, fixed point
3980 types and integer vector types. */
3981 if ((!INTEGRAL_TYPE_P (rhs1_type)
3982 && !FIXED_POINT_TYPE_P (rhs1_type)
3983 && ! (VECTOR_TYPE_P (rhs1_type)
3984 && INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))))
3985 || (!INTEGRAL_TYPE_P (rhs2_type)
3986 /* Vector shifts of vectors are also ok. */
3987 && ! (VECTOR_TYPE_P (rhs1_type)
3988 && INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))
3989 && VECTOR_TYPE_P (rhs2_type)
3990 && INTEGRAL_TYPE_P (TREE_TYPE (rhs2_type))))
3991 || !useless_type_conversion_p (lhs_type, rhs1_type))
3993 error ("type mismatch in %qs", code_name);
3994 debug_generic_expr (lhs_type);
3995 debug_generic_expr (rhs1_type);
3996 debug_generic_expr (rhs2_type);
3997 return true;
4000 return false;
4003 case WIDEN_LSHIFT_EXPR:
4005 if (!INTEGRAL_TYPE_P (lhs_type)
4006 || !INTEGRAL_TYPE_P (rhs1_type)
4007 || TREE_CODE (rhs2) != INTEGER_CST
4008 || (2 * TYPE_PRECISION (rhs1_type) > TYPE_PRECISION (lhs_type)))
4010 error ("type mismatch in %qs", code_name);
4011 debug_generic_expr (lhs_type);
4012 debug_generic_expr (rhs1_type);
4013 debug_generic_expr (rhs2_type);
4014 return true;
4017 return false;
4020 case VEC_WIDEN_LSHIFT_HI_EXPR:
4021 case VEC_WIDEN_LSHIFT_LO_EXPR:
4023 if (TREE_CODE (rhs1_type) != VECTOR_TYPE
4024 || TREE_CODE (lhs_type) != VECTOR_TYPE
4025 || !INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))
4026 || !INTEGRAL_TYPE_P (TREE_TYPE (lhs_type))
4027 || TREE_CODE (rhs2) != INTEGER_CST
4028 || (2 * TYPE_PRECISION (TREE_TYPE (rhs1_type))
4029 > TYPE_PRECISION (TREE_TYPE (lhs_type))))
4031 error ("type mismatch in %qs", code_name);
4032 debug_generic_expr (lhs_type);
4033 debug_generic_expr (rhs1_type);
4034 debug_generic_expr (rhs2_type);
4035 return true;
4038 return false;
4041 case PLUS_EXPR:
4042 case MINUS_EXPR:
4044 tree lhs_etype = lhs_type;
4045 tree rhs1_etype = rhs1_type;
4046 tree rhs2_etype = rhs2_type;
4047 if (VECTOR_TYPE_P (lhs_type))
4049 if (TREE_CODE (rhs1_type) != VECTOR_TYPE
4050 || TREE_CODE (rhs2_type) != VECTOR_TYPE)
4052 error ("invalid non-vector operands to %qs", code_name);
4053 return true;
4055 lhs_etype = TREE_TYPE (lhs_type);
4056 rhs1_etype = TREE_TYPE (rhs1_type);
4057 rhs2_etype = TREE_TYPE (rhs2_type);
4059 if (POINTER_TYPE_P (lhs_etype)
4060 || POINTER_TYPE_P (rhs1_etype)
4061 || POINTER_TYPE_P (rhs2_etype))
4063 error ("invalid (pointer) operands %qs", code_name);
4064 return true;
4067 /* Continue with generic binary expression handling. */
4068 break;
4071 case POINTER_PLUS_EXPR:
4073 if (!POINTER_TYPE_P (rhs1_type)
4074 || !useless_type_conversion_p (lhs_type, rhs1_type)
4075 || !ptrofftype_p (rhs2_type))
4077 error ("type mismatch in %qs", code_name);
4078 debug_generic_stmt (lhs_type);
4079 debug_generic_stmt (rhs1_type);
4080 debug_generic_stmt (rhs2_type);
4081 return true;
4084 return false;
4087 case POINTER_DIFF_EXPR:
4089 if (!POINTER_TYPE_P (rhs1_type)
4090 || !POINTER_TYPE_P (rhs2_type)
4091 /* Because we special-case pointers to void we allow difference
4092 of arbitrary pointers with the same mode. */
4093 || TYPE_MODE (rhs1_type) != TYPE_MODE (rhs2_type)
4094 || !INTEGRAL_TYPE_P (lhs_type)
4095 || TYPE_UNSIGNED (lhs_type)
4096 || TYPE_PRECISION (lhs_type) != TYPE_PRECISION (rhs1_type))
4098 error ("type mismatch in %qs", code_name);
4099 debug_generic_stmt (lhs_type);
4100 debug_generic_stmt (rhs1_type);
4101 debug_generic_stmt (rhs2_type);
4102 return true;
4105 return false;
4108 case TRUTH_ANDIF_EXPR:
4109 case TRUTH_ORIF_EXPR:
4110 case TRUTH_AND_EXPR:
4111 case TRUTH_OR_EXPR:
4112 case TRUTH_XOR_EXPR:
4114 gcc_unreachable ();
4116 case LT_EXPR:
4117 case LE_EXPR:
4118 case GT_EXPR:
4119 case GE_EXPR:
4120 case EQ_EXPR:
4121 case NE_EXPR:
4122 case UNORDERED_EXPR:
4123 case ORDERED_EXPR:
4124 case UNLT_EXPR:
4125 case UNLE_EXPR:
4126 case UNGT_EXPR:
4127 case UNGE_EXPR:
4128 case UNEQ_EXPR:
4129 case LTGT_EXPR:
4130 /* Comparisons are also binary, but the result type is not
4131 connected to the operand types. */
4132 return verify_gimple_comparison (lhs_type, rhs1, rhs2, rhs_code);
4134 case WIDEN_MULT_EXPR:
4135 if (TREE_CODE (lhs_type) != INTEGER_TYPE)
4136 return true;
4137 return ((2 * TYPE_PRECISION (rhs1_type) > TYPE_PRECISION (lhs_type))
4138 || (TYPE_PRECISION (rhs1_type) != TYPE_PRECISION (rhs2_type)));
4140 case WIDEN_SUM_EXPR:
4142 if (((TREE_CODE (rhs1_type) != VECTOR_TYPE
4143 || TREE_CODE (lhs_type) != VECTOR_TYPE)
4144 && ((!INTEGRAL_TYPE_P (rhs1_type)
4145 && !SCALAR_FLOAT_TYPE_P (rhs1_type))
4146 || (!INTEGRAL_TYPE_P (lhs_type)
4147 && !SCALAR_FLOAT_TYPE_P (lhs_type))))
4148 || !useless_type_conversion_p (lhs_type, rhs2_type)
4149 || maybe_lt (GET_MODE_SIZE (element_mode (rhs2_type)),
4150 2 * GET_MODE_SIZE (element_mode (rhs1_type))))
4152 error ("type mismatch in %qs", code_name);
4153 debug_generic_expr (lhs_type);
4154 debug_generic_expr (rhs1_type);
4155 debug_generic_expr (rhs2_type);
4156 return true;
4158 return false;
4161 case VEC_WIDEN_MULT_HI_EXPR:
4162 case VEC_WIDEN_MULT_LO_EXPR:
4163 case VEC_WIDEN_MULT_EVEN_EXPR:
4164 case VEC_WIDEN_MULT_ODD_EXPR:
4166 if (TREE_CODE (rhs1_type) != VECTOR_TYPE
4167 || TREE_CODE (lhs_type) != VECTOR_TYPE
4168 || !types_compatible_p (rhs1_type, rhs2_type)
4169 || maybe_ne (GET_MODE_SIZE (element_mode (lhs_type)),
4170 2 * GET_MODE_SIZE (element_mode (rhs1_type))))
4172 error ("type mismatch in %qs", code_name);
4173 debug_generic_expr (lhs_type);
4174 debug_generic_expr (rhs1_type);
4175 debug_generic_expr (rhs2_type);
4176 return true;
4178 return false;
4181 case VEC_PACK_TRUNC_EXPR:
4182 /* ??? We currently use VEC_PACK_TRUNC_EXPR to simply concat
4183 vector boolean types. */
4184 if (VECTOR_BOOLEAN_TYPE_P (lhs_type)
4185 && VECTOR_BOOLEAN_TYPE_P (rhs1_type)
4186 && types_compatible_p (rhs1_type, rhs2_type)
4187 && known_eq (TYPE_VECTOR_SUBPARTS (lhs_type),
4188 2 * TYPE_VECTOR_SUBPARTS (rhs1_type)))
4189 return false;
4191 /* Fallthru. */
4192 case VEC_PACK_SAT_EXPR:
4193 case VEC_PACK_FIX_TRUNC_EXPR:
4195 if (TREE_CODE (rhs1_type) != VECTOR_TYPE
4196 || TREE_CODE (lhs_type) != VECTOR_TYPE
4197 || !((rhs_code == VEC_PACK_FIX_TRUNC_EXPR
4198 && SCALAR_FLOAT_TYPE_P (TREE_TYPE (rhs1_type))
4199 && INTEGRAL_TYPE_P (TREE_TYPE (lhs_type)))
4200 || (INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))
4201 == INTEGRAL_TYPE_P (TREE_TYPE (lhs_type))))
4202 || !types_compatible_p (rhs1_type, rhs2_type)
4203 || maybe_ne (GET_MODE_SIZE (element_mode (rhs1_type)),
4204 2 * GET_MODE_SIZE (element_mode (lhs_type)))
4205 || maybe_ne (2 * TYPE_VECTOR_SUBPARTS (rhs1_type),
4206 TYPE_VECTOR_SUBPARTS (lhs_type)))
4208 error ("type mismatch in %qs", code_name);
4209 debug_generic_expr (lhs_type);
4210 debug_generic_expr (rhs1_type);
4211 debug_generic_expr (rhs2_type);
4212 return true;
4215 return false;
4218 case VEC_PACK_FLOAT_EXPR:
4219 if (TREE_CODE (rhs1_type) != VECTOR_TYPE
4220 || TREE_CODE (lhs_type) != VECTOR_TYPE
4221 || !INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))
4222 || !SCALAR_FLOAT_TYPE_P (TREE_TYPE (lhs_type))
4223 || !types_compatible_p (rhs1_type, rhs2_type)
4224 || maybe_ne (GET_MODE_SIZE (element_mode (rhs1_type)),
4225 2 * GET_MODE_SIZE (element_mode (lhs_type)))
4226 || maybe_ne (2 * TYPE_VECTOR_SUBPARTS (rhs1_type),
4227 TYPE_VECTOR_SUBPARTS (lhs_type)))
4229 error ("type mismatch in %qs", code_name);
4230 debug_generic_expr (lhs_type);
4231 debug_generic_expr (rhs1_type);
4232 debug_generic_expr (rhs2_type);
4233 return true;
4236 return false;
4238 case MULT_EXPR:
4239 case MULT_HIGHPART_EXPR:
4240 case TRUNC_DIV_EXPR:
4241 case CEIL_DIV_EXPR:
4242 case FLOOR_DIV_EXPR:
4243 case ROUND_DIV_EXPR:
4244 case TRUNC_MOD_EXPR:
4245 case CEIL_MOD_EXPR:
4246 case FLOOR_MOD_EXPR:
4247 case ROUND_MOD_EXPR:
4248 case RDIV_EXPR:
4249 case EXACT_DIV_EXPR:
4250 case BIT_IOR_EXPR:
4251 case BIT_XOR_EXPR:
4252 /* Disallow pointer and offset types for many of the binary gimple. */
4253 if (POINTER_TYPE_P (lhs_type)
4254 || TREE_CODE (lhs_type) == OFFSET_TYPE)
4256 error ("invalid types for %qs", code_name);
4257 debug_generic_expr (lhs_type);
4258 debug_generic_expr (rhs1_type);
4259 debug_generic_expr (rhs2_type);
4260 return true;
4262 /* Continue with generic binary expression handling. */
4263 break;
4265 case MIN_EXPR:
4266 case MAX_EXPR:
4267 /* Continue with generic binary expression handling. */
4268 break;
4270 case BIT_AND_EXPR:
4271 if (POINTER_TYPE_P (lhs_type)
4272 && TREE_CODE (rhs2) == INTEGER_CST)
4273 break;
4274 /* Disallow pointer and offset types for many of the binary gimple. */
4275 if (POINTER_TYPE_P (lhs_type)
4276 || TREE_CODE (lhs_type) == OFFSET_TYPE)
4278 error ("invalid types for %qs", code_name);
4279 debug_generic_expr (lhs_type);
4280 debug_generic_expr (rhs1_type);
4281 debug_generic_expr (rhs2_type);
4282 return true;
4284 /* Continue with generic binary expression handling. */
4285 break;
4287 case VEC_SERIES_EXPR:
4288 if (!useless_type_conversion_p (rhs1_type, rhs2_type))
4290 error ("type mismatch in %qs", code_name);
4291 debug_generic_expr (rhs1_type);
4292 debug_generic_expr (rhs2_type);
4293 return true;
4295 if (TREE_CODE (lhs_type) != VECTOR_TYPE
4296 || !useless_type_conversion_p (TREE_TYPE (lhs_type), rhs1_type))
4298 error ("vector type expected in %qs", code_name);
4299 debug_generic_expr (lhs_type);
4300 return true;
4302 return false;
4304 default:
4305 gcc_unreachable ();
4308 if (!useless_type_conversion_p (lhs_type, rhs1_type)
4309 || !useless_type_conversion_p (lhs_type, rhs2_type))
4311 error ("type mismatch in binary expression");
4312 debug_generic_stmt (lhs_type);
4313 debug_generic_stmt (rhs1_type);
4314 debug_generic_stmt (rhs2_type);
4315 return true;
4318 return false;
4321 /* Verify a gimple assignment statement STMT with a ternary rhs.
4322 Returns true if anything is wrong. */
4324 static bool
4325 verify_gimple_assign_ternary (gassign *stmt)
4327 enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
4328 tree lhs = gimple_assign_lhs (stmt);
4329 tree lhs_type = TREE_TYPE (lhs);
4330 tree rhs1 = gimple_assign_rhs1 (stmt);
4331 tree rhs1_type = TREE_TYPE (rhs1);
4332 tree rhs2 = gimple_assign_rhs2 (stmt);
4333 tree rhs2_type = TREE_TYPE (rhs2);
4334 tree rhs3 = gimple_assign_rhs3 (stmt);
4335 tree rhs3_type = TREE_TYPE (rhs3);
4337 if (!is_gimple_reg (lhs))
4339 error ("non-register as LHS of ternary operation");
4340 return true;
4343 if (!is_gimple_val (rhs1)
4344 || !is_gimple_val (rhs2)
4345 || !is_gimple_val (rhs3))
4347 error ("invalid operands in ternary operation");
4348 return true;
4351 const char* const code_name = get_tree_code_name (rhs_code);
4353 /* First handle operations that involve different types. */
4354 switch (rhs_code)
4356 case WIDEN_MULT_PLUS_EXPR:
4357 case WIDEN_MULT_MINUS_EXPR:
4358 if ((!INTEGRAL_TYPE_P (rhs1_type)
4359 && !FIXED_POINT_TYPE_P (rhs1_type))
4360 || !useless_type_conversion_p (rhs1_type, rhs2_type)
4361 || !useless_type_conversion_p (lhs_type, rhs3_type)
4362 || 2 * TYPE_PRECISION (rhs1_type) > TYPE_PRECISION (lhs_type)
4363 || TYPE_PRECISION (rhs1_type) != TYPE_PRECISION (rhs2_type))
4365 error ("type mismatch in %qs", code_name);
4366 debug_generic_expr (lhs_type);
4367 debug_generic_expr (rhs1_type);
4368 debug_generic_expr (rhs2_type);
4369 debug_generic_expr (rhs3_type);
4370 return true;
4372 break;
4374 case VEC_COND_EXPR:
4375 if (!VECTOR_BOOLEAN_TYPE_P (rhs1_type)
4376 || maybe_ne (TYPE_VECTOR_SUBPARTS (rhs1_type),
4377 TYPE_VECTOR_SUBPARTS (lhs_type)))
4379 error ("the first argument of a %qs must be of a "
4380 "boolean vector type of the same number of elements "
4381 "as the result", code_name);
4382 debug_generic_expr (lhs_type);
4383 debug_generic_expr (rhs1_type);
4384 return true;
4386 /* Fallthrough. */
4387 case COND_EXPR:
4388 if (!useless_type_conversion_p (lhs_type, rhs2_type)
4389 || !useless_type_conversion_p (lhs_type, rhs3_type))
4391 error ("type mismatch in %qs", code_name);
4392 debug_generic_expr (lhs_type);
4393 debug_generic_expr (rhs2_type);
4394 debug_generic_expr (rhs3_type);
4395 return true;
4397 break;
4399 case VEC_PERM_EXPR:
4400 /* If permute is constant, then we allow for lhs and rhs
4401 to have different vector types, provided:
4402 (1) lhs, rhs1, rhs2 have same element type.
4403 (2) rhs3 vector is constant and has integer element type.
4404 (3) len(lhs) == len(rhs3) && len(rhs1) == len(rhs2). */
4406 if (TREE_CODE (lhs_type) != VECTOR_TYPE
4407 || TREE_CODE (rhs1_type) != VECTOR_TYPE
4408 || TREE_CODE (rhs2_type) != VECTOR_TYPE
4409 || TREE_CODE (rhs3_type) != VECTOR_TYPE)
4411 error ("vector types expected in %qs", code_name);
4412 debug_generic_expr (lhs_type);
4413 debug_generic_expr (rhs1_type);
4414 debug_generic_expr (rhs2_type);
4415 debug_generic_expr (rhs3_type);
4416 return true;
4419 /* If rhs3 is constant, we allow lhs, rhs1 and rhs2 to be different vector types,
4420 as long as lhs, rhs1 and rhs2 have same element type. */
4421 if (TREE_CONSTANT (rhs3)
4422 ? (!useless_type_conversion_p (TREE_TYPE (lhs_type), TREE_TYPE (rhs1_type))
4423 || !useless_type_conversion_p (TREE_TYPE (lhs_type), TREE_TYPE (rhs2_type)))
4424 : (!useless_type_conversion_p (lhs_type, rhs1_type)
4425 || !useless_type_conversion_p (lhs_type, rhs2_type)))
4427 error ("type mismatch in %qs", code_name);
4428 debug_generic_expr (lhs_type);
4429 debug_generic_expr (rhs1_type);
4430 debug_generic_expr (rhs2_type);
4431 debug_generic_expr (rhs3_type);
4432 return true;
4435 /* If rhs3 is constant, relax the check len(rhs2) == len(rhs3). */
4436 if (maybe_ne (TYPE_VECTOR_SUBPARTS (rhs1_type),
4437 TYPE_VECTOR_SUBPARTS (rhs2_type))
4438 || (!TREE_CONSTANT(rhs3)
4439 && maybe_ne (TYPE_VECTOR_SUBPARTS (rhs2_type),
4440 TYPE_VECTOR_SUBPARTS (rhs3_type)))
4441 || maybe_ne (TYPE_VECTOR_SUBPARTS (rhs3_type),
4442 TYPE_VECTOR_SUBPARTS (lhs_type)))
4444 error ("vectors with different element number found in %qs",
4445 code_name);
4446 debug_generic_expr (lhs_type);
4447 debug_generic_expr (rhs1_type);
4448 debug_generic_expr (rhs2_type);
4449 debug_generic_expr (rhs3_type);
4450 return true;
4453 if (TREE_CODE (TREE_TYPE (rhs3_type)) != INTEGER_TYPE
4454 || (TREE_CODE (rhs3) != VECTOR_CST
4455 && (GET_MODE_BITSIZE (SCALAR_INT_TYPE_MODE
4456 (TREE_TYPE (rhs3_type)))
4457 != GET_MODE_BITSIZE (SCALAR_TYPE_MODE
4458 (TREE_TYPE (rhs1_type))))))
4460 error ("invalid mask type in %qs", code_name);
4461 debug_generic_expr (lhs_type);
4462 debug_generic_expr (rhs1_type);
4463 debug_generic_expr (rhs2_type);
4464 debug_generic_expr (rhs3_type);
4465 return true;
4468 return false;
4470 case SAD_EXPR:
4471 if (!useless_type_conversion_p (rhs1_type, rhs2_type)
4472 || !useless_type_conversion_p (lhs_type, rhs3_type)
4473 || 2 * GET_MODE_UNIT_BITSIZE (TYPE_MODE (TREE_TYPE (rhs1_type)))
4474 > GET_MODE_UNIT_BITSIZE (TYPE_MODE (TREE_TYPE (lhs_type))))
4476 error ("type mismatch in %qs", code_name);
4477 debug_generic_expr (lhs_type);
4478 debug_generic_expr (rhs1_type);
4479 debug_generic_expr (rhs2_type);
4480 debug_generic_expr (rhs3_type);
4481 return true;
4484 if (TREE_CODE (rhs1_type) != VECTOR_TYPE
4485 || TREE_CODE (rhs2_type) != VECTOR_TYPE
4486 || TREE_CODE (rhs3_type) != VECTOR_TYPE)
4488 error ("vector types expected in %qs", code_name);
4489 debug_generic_expr (lhs_type);
4490 debug_generic_expr (rhs1_type);
4491 debug_generic_expr (rhs2_type);
4492 debug_generic_expr (rhs3_type);
4493 return true;
4496 return false;
4498 case BIT_INSERT_EXPR:
4499 if (! useless_type_conversion_p (lhs_type, rhs1_type))
4501 error ("type mismatch in %qs", code_name);
4502 debug_generic_expr (lhs_type);
4503 debug_generic_expr (rhs1_type);
4504 return true;
4506 if (! ((INTEGRAL_TYPE_P (rhs1_type)
4507 && INTEGRAL_TYPE_P (rhs2_type))
4508 /* Vector element insert. */
4509 || (VECTOR_TYPE_P (rhs1_type)
4510 && types_compatible_p (TREE_TYPE (rhs1_type), rhs2_type))
4511 /* Aligned sub-vector insert. */
4512 || (VECTOR_TYPE_P (rhs1_type)
4513 && VECTOR_TYPE_P (rhs2_type)
4514 && types_compatible_p (TREE_TYPE (rhs1_type),
4515 TREE_TYPE (rhs2_type))
4516 && multiple_p (TYPE_VECTOR_SUBPARTS (rhs1_type),
4517 TYPE_VECTOR_SUBPARTS (rhs2_type))
4518 && multiple_p (wi::to_poly_offset (rhs3),
4519 wi::to_poly_offset (TYPE_SIZE (rhs2_type))))))
4521 error ("not allowed type combination in %qs", code_name);
4522 debug_generic_expr (rhs1_type);
4523 debug_generic_expr (rhs2_type);
4524 return true;
4526 if (! tree_fits_uhwi_p (rhs3)
4527 || ! types_compatible_p (bitsizetype, TREE_TYPE (rhs3))
4528 || ! tree_fits_uhwi_p (TYPE_SIZE (rhs2_type)))
4530 error ("invalid position or size in %qs", code_name);
4531 return true;
4533 if (INTEGRAL_TYPE_P (rhs1_type)
4534 && !type_has_mode_precision_p (rhs1_type))
4536 error ("%qs into non-mode-precision operand", code_name);
4537 return true;
4539 if (INTEGRAL_TYPE_P (rhs1_type))
4541 unsigned HOST_WIDE_INT bitpos = tree_to_uhwi (rhs3);
4542 if (bitpos >= TYPE_PRECISION (rhs1_type)
4543 || (bitpos + TYPE_PRECISION (rhs2_type)
4544 > TYPE_PRECISION (rhs1_type)))
4546 error ("insertion out of range in %qs", code_name);
4547 return true;
4550 else if (VECTOR_TYPE_P (rhs1_type))
4552 unsigned HOST_WIDE_INT bitpos = tree_to_uhwi (rhs3);
4553 unsigned HOST_WIDE_INT bitsize = tree_to_uhwi (TYPE_SIZE (rhs2_type));
4554 if (bitpos % bitsize != 0)
4556 error ("%qs not at element boundary", code_name);
4557 return true;
4560 return false;
4562 case DOT_PROD_EXPR:
4564 if (((TREE_CODE (rhs1_type) != VECTOR_TYPE
4565 || TREE_CODE (lhs_type) != VECTOR_TYPE)
4566 && ((!INTEGRAL_TYPE_P (rhs1_type)
4567 && !SCALAR_FLOAT_TYPE_P (rhs1_type))
4568 || (!INTEGRAL_TYPE_P (lhs_type)
4569 && !SCALAR_FLOAT_TYPE_P (lhs_type))))
4570 /* rhs1_type and rhs2_type may differ in sign. */
4571 || !tree_nop_conversion_p (rhs1_type, rhs2_type)
4572 || !useless_type_conversion_p (lhs_type, rhs3_type)
4573 || maybe_lt (GET_MODE_SIZE (element_mode (rhs3_type)),
4574 2 * GET_MODE_SIZE (element_mode (rhs1_type))))
4576 error ("type mismatch in %qs", code_name);
4577 debug_generic_expr (lhs_type);
4578 debug_generic_expr (rhs1_type);
4579 debug_generic_expr (rhs2_type);
4580 return true;
4582 return false;
4585 case REALIGN_LOAD_EXPR:
4586 /* FIXME. */
4587 return false;
4589 default:
4590 gcc_unreachable ();
4592 return false;
4595 /* Verify a gimple assignment statement STMT with a single rhs.
4596 Returns true if anything is wrong. */
4598 static bool
4599 verify_gimple_assign_single (gassign *stmt)
4601 enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
4602 tree lhs = gimple_assign_lhs (stmt);
4603 tree lhs_type = TREE_TYPE (lhs);
4604 tree rhs1 = gimple_assign_rhs1 (stmt);
4605 tree rhs1_type = TREE_TYPE (rhs1);
4606 bool res = false;
4608 const char* const code_name = get_tree_code_name (rhs_code);
4610 if (!useless_type_conversion_p (lhs_type, rhs1_type))
4612 error ("non-trivial conversion in %qs", code_name);
4613 debug_generic_expr (lhs_type);
4614 debug_generic_expr (rhs1_type);
4615 return true;
4618 if (gimple_clobber_p (stmt)
4619 && !(DECL_P (lhs) || TREE_CODE (lhs) == MEM_REF))
4621 error ("%qs LHS in clobber statement",
4622 get_tree_code_name (TREE_CODE (lhs)));
4623 debug_generic_expr (lhs);
4624 return true;
4627 if (TREE_CODE (lhs) == WITH_SIZE_EXPR)
4629 error ("%qs LHS in assignment statement",
4630 get_tree_code_name (TREE_CODE (lhs)));
4631 debug_generic_expr (lhs);
4632 return true;
4635 if (handled_component_p (lhs)
4636 || TREE_CODE (lhs) == MEM_REF
4637 || TREE_CODE (lhs) == TARGET_MEM_REF)
4638 res |= verify_types_in_gimple_reference (lhs, true);
4640 /* Special codes we cannot handle via their class. */
4641 switch (rhs_code)
4643 case ADDR_EXPR:
4645 tree op = TREE_OPERAND (rhs1, 0);
4646 if (!is_gimple_addressable (op))
4648 error ("invalid operand in %qs", code_name);
4649 return true;
4652 /* Technically there is no longer a need for matching types, but
4653 gimple hygiene asks for this check. In LTO we can end up
4654 combining incompatible units and thus end up with addresses
4655 of globals that change their type to a common one. */
4656 if (!in_lto_p
4657 && !types_compatible_p (TREE_TYPE (op),
4658 TREE_TYPE (TREE_TYPE (rhs1)))
4659 && !one_pointer_to_useless_type_conversion_p (TREE_TYPE (rhs1),
4660 TREE_TYPE (op)))
4662 error ("type mismatch in %qs", code_name);
4663 debug_generic_stmt (TREE_TYPE (rhs1));
4664 debug_generic_stmt (TREE_TYPE (op));
4665 return true;
4668 return (verify_address (rhs1, true)
4669 || verify_types_in_gimple_reference (op, true));
4672 /* tcc_reference */
4673 case INDIRECT_REF:
4674 error ("%qs in gimple IL", code_name);
4675 return true;
4677 case WITH_SIZE_EXPR:
4678 if (!is_gimple_val (TREE_OPERAND (rhs1, 1)))
4680 error ("invalid %qs size argument in load", code_name);
4681 debug_generic_stmt (lhs);
4682 debug_generic_stmt (rhs1);
4683 return true;
4685 rhs1 = TREE_OPERAND (rhs1, 0);
4686 /* Fallthru. */
4687 case COMPONENT_REF:
4688 case BIT_FIELD_REF:
4689 case ARRAY_REF:
4690 case ARRAY_RANGE_REF:
4691 case VIEW_CONVERT_EXPR:
4692 case REALPART_EXPR:
4693 case IMAGPART_EXPR:
4694 case TARGET_MEM_REF:
4695 case MEM_REF:
4696 if (!is_gimple_reg (lhs)
4697 && is_gimple_reg_type (TREE_TYPE (lhs)))
4699 error ("invalid RHS for gimple memory store: %qs", code_name);
4700 debug_generic_stmt (lhs);
4701 debug_generic_stmt (rhs1);
4702 return true;
4704 return res || verify_types_in_gimple_reference (rhs1, false);
4706 /* tcc_constant */
4707 case SSA_NAME:
4708 case INTEGER_CST:
4709 case REAL_CST:
4710 case FIXED_CST:
4711 case COMPLEX_CST:
4712 case VECTOR_CST:
4713 case STRING_CST:
4714 return res;
4716 /* tcc_declaration */
4717 case CONST_DECL:
4718 return res;
4719 case VAR_DECL:
4720 case PARM_DECL:
4721 if (!is_gimple_reg (lhs)
4722 && !is_gimple_reg (rhs1)
4723 && is_gimple_reg_type (TREE_TYPE (lhs)))
4725 error ("invalid RHS for gimple memory store: %qs", code_name);
4726 debug_generic_stmt (lhs);
4727 debug_generic_stmt (rhs1);
4728 return true;
4730 return res;
4732 case CONSTRUCTOR:
4733 if (VECTOR_TYPE_P (rhs1_type))
4735 unsigned int i;
4736 tree elt_i, elt_v, elt_t = NULL_TREE;
4738 if (CONSTRUCTOR_NELTS (rhs1) == 0)
4739 return res;
4740 /* For vector CONSTRUCTORs we require that either it is empty
4741 CONSTRUCTOR, or it is a CONSTRUCTOR of smaller vector elements
4742 (then the element count must be correct to cover the whole
4743 outer vector and index must be NULL on all elements, or it is
4744 a CONSTRUCTOR of scalar elements, where we as an exception allow
4745 smaller number of elements (assuming zero filling) and
4746 consecutive indexes as compared to NULL indexes (such
4747 CONSTRUCTORs can appear in the IL from FEs). */
4748 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (rhs1), i, elt_i, elt_v)
4750 if (elt_t == NULL_TREE)
4752 elt_t = TREE_TYPE (elt_v);
4753 if (VECTOR_TYPE_P (elt_t))
4755 tree elt_t = TREE_TYPE (elt_v);
4756 if (!useless_type_conversion_p (TREE_TYPE (rhs1_type),
4757 TREE_TYPE (elt_t)))
4759 error ("incorrect type of vector %qs elements",
4760 code_name);
4761 debug_generic_stmt (rhs1);
4762 return true;
4764 else if (maybe_ne (CONSTRUCTOR_NELTS (rhs1)
4765 * TYPE_VECTOR_SUBPARTS (elt_t),
4766 TYPE_VECTOR_SUBPARTS (rhs1_type)))
4768 error ("incorrect number of vector %qs elements",
4769 code_name);
4770 debug_generic_stmt (rhs1);
4771 return true;
4774 else if (!useless_type_conversion_p (TREE_TYPE (rhs1_type),
4775 elt_t))
4777 error ("incorrect type of vector %qs elements",
4778 code_name);
4779 debug_generic_stmt (rhs1);
4780 return true;
4782 else if (maybe_gt (CONSTRUCTOR_NELTS (rhs1),
4783 TYPE_VECTOR_SUBPARTS (rhs1_type)))
4785 error ("incorrect number of vector %qs elements",
4786 code_name);
4787 debug_generic_stmt (rhs1);
4788 return true;
4791 else if (!useless_type_conversion_p (elt_t, TREE_TYPE (elt_v)))
4793 error ("incorrect type of vector CONSTRUCTOR elements");
4794 debug_generic_stmt (rhs1);
4795 return true;
4797 if (elt_i != NULL_TREE
4798 && (VECTOR_TYPE_P (elt_t)
4799 || TREE_CODE (elt_i) != INTEGER_CST
4800 || compare_tree_int (elt_i, i) != 0))
4802 error ("vector %qs with non-NULL element index",
4803 code_name);
4804 debug_generic_stmt (rhs1);
4805 return true;
4807 if (!is_gimple_val (elt_v))
4809 error ("vector %qs element is not a GIMPLE value",
4810 code_name);
4811 debug_generic_stmt (rhs1);
4812 return true;
4816 else if (CONSTRUCTOR_NELTS (rhs1) != 0)
4818 error ("non-vector %qs with elements", code_name);
4819 debug_generic_stmt (rhs1);
4820 return true;
4822 return res;
4824 case OBJ_TYPE_REF:
4825 /* FIXME. */
4826 return res;
4828 default:;
4831 return res;
4834 /* Verify the contents of a GIMPLE_ASSIGN STMT. Returns true when there
4835 is a problem, otherwise false. */
4837 static bool
4838 verify_gimple_assign (gassign *stmt)
4840 switch (gimple_assign_rhs_class (stmt))
4842 case GIMPLE_SINGLE_RHS:
4843 return verify_gimple_assign_single (stmt);
4845 case GIMPLE_UNARY_RHS:
4846 return verify_gimple_assign_unary (stmt);
4848 case GIMPLE_BINARY_RHS:
4849 return verify_gimple_assign_binary (stmt);
4851 case GIMPLE_TERNARY_RHS:
4852 return verify_gimple_assign_ternary (stmt);
4854 default:
4855 gcc_unreachable ();
4859 /* Verify the contents of a GIMPLE_RETURN STMT. Returns true when there
4860 is a problem, otherwise false. */
4862 static bool
4863 verify_gimple_return (greturn *stmt)
4865 tree op = gimple_return_retval (stmt);
4866 tree restype = TREE_TYPE (TREE_TYPE (cfun->decl));
4868 /* We cannot test for present return values as we do not fix up missing
4869 return values from the original source. */
4870 if (op == NULL)
4871 return false;
4873 if (!is_gimple_val (op)
4874 && TREE_CODE (op) != RESULT_DECL)
4876 error ("invalid operand in return statement");
4877 debug_generic_stmt (op);
4878 return true;
4881 if ((TREE_CODE (op) == RESULT_DECL
4882 && DECL_BY_REFERENCE (op))
4883 || (TREE_CODE (op) == SSA_NAME
4884 && SSA_NAME_VAR (op)
4885 && TREE_CODE (SSA_NAME_VAR (op)) == RESULT_DECL
4886 && DECL_BY_REFERENCE (SSA_NAME_VAR (op))))
4887 op = TREE_TYPE (op);
4889 if (!useless_type_conversion_p (restype, TREE_TYPE (op)))
4891 error ("invalid conversion in return statement");
4892 debug_generic_stmt (restype);
4893 debug_generic_stmt (TREE_TYPE (op));
4894 return true;
4897 return false;
4901 /* Verify the contents of a GIMPLE_GOTO STMT. Returns true when there
4902 is a problem, otherwise false. */
4904 static bool
4905 verify_gimple_goto (ggoto *stmt)
4907 tree dest = gimple_goto_dest (stmt);
4909 /* ??? We have two canonical forms of direct goto destinations, a
4910 bare LABEL_DECL and an ADDR_EXPR of a LABEL_DECL. */
4911 if (TREE_CODE (dest) != LABEL_DECL
4912 && (!is_gimple_val (dest)
4913 || !POINTER_TYPE_P (TREE_TYPE (dest))))
4915 error ("goto destination is neither a label nor a pointer");
4916 return true;
4919 return false;
4922 /* Verify the contents of a GIMPLE_SWITCH STMT. Returns true when there
4923 is a problem, otherwise false. */
4925 static bool
4926 verify_gimple_switch (gswitch *stmt)
4928 unsigned int i, n;
4929 tree elt, prev_upper_bound = NULL_TREE;
4930 tree index_type, elt_type = NULL_TREE;
4932 if (!is_gimple_val (gimple_switch_index (stmt)))
4934 error ("invalid operand to switch statement");
4935 debug_generic_stmt (gimple_switch_index (stmt));
4936 return true;
4939 index_type = TREE_TYPE (gimple_switch_index (stmt));
4940 if (! INTEGRAL_TYPE_P (index_type))
4942 error ("non-integral type switch statement");
4943 debug_generic_expr (index_type);
4944 return true;
4947 elt = gimple_switch_label (stmt, 0);
4948 if (CASE_LOW (elt) != NULL_TREE
4949 || CASE_HIGH (elt) != NULL_TREE
4950 || CASE_CHAIN (elt) != NULL_TREE)
4952 error ("invalid default case label in switch statement");
4953 debug_generic_expr (elt);
4954 return true;
4957 n = gimple_switch_num_labels (stmt);
4958 for (i = 1; i < n; i++)
4960 elt = gimple_switch_label (stmt, i);
4962 if (CASE_CHAIN (elt))
4964 error ("invalid %<CASE_CHAIN%>");
4965 debug_generic_expr (elt);
4966 return true;
4968 if (! CASE_LOW (elt))
4970 error ("invalid case label in switch statement");
4971 debug_generic_expr (elt);
4972 return true;
4974 if (CASE_HIGH (elt)
4975 && ! tree_int_cst_lt (CASE_LOW (elt), CASE_HIGH (elt)))
4977 error ("invalid case range in switch statement");
4978 debug_generic_expr (elt);
4979 return true;
4982 if (! elt_type)
4984 elt_type = TREE_TYPE (CASE_LOW (elt));
4985 if (TYPE_PRECISION (index_type) < TYPE_PRECISION (elt_type))
4987 error ("type precision mismatch in switch statement");
4988 return true;
4991 if (TREE_TYPE (CASE_LOW (elt)) != elt_type
4992 || (CASE_HIGH (elt) && TREE_TYPE (CASE_HIGH (elt)) != elt_type))
4994 error ("type mismatch for case label in switch statement");
4995 debug_generic_expr (elt);
4996 return true;
4999 if (prev_upper_bound)
5001 if (! tree_int_cst_lt (prev_upper_bound, CASE_LOW (elt)))
5003 error ("case labels not sorted in switch statement");
5004 return true;
5008 prev_upper_bound = CASE_HIGH (elt);
5009 if (! prev_upper_bound)
5010 prev_upper_bound = CASE_LOW (elt);
5013 return false;
5016 /* Verify a gimple debug statement STMT.
5017 Returns true if anything is wrong. */
5019 static bool
5020 verify_gimple_debug (gimple *stmt ATTRIBUTE_UNUSED)
5022 /* There isn't much that could be wrong in a gimple debug stmt. A
5023 gimple debug bind stmt, for example, maps a tree, that's usually
5024 a VAR_DECL or a PARM_DECL, but that could also be some scalarized
5025 component or member of an aggregate type, to another tree, that
5026 can be an arbitrary expression. These stmts expand into debug
5027 insns, and are converted to debug notes by var-tracking.cc. */
5028 return false;
5031 /* Verify a gimple label statement STMT.
5032 Returns true if anything is wrong. */
5034 static bool
5035 verify_gimple_label (glabel *stmt)
5037 tree decl = gimple_label_label (stmt);
5038 int uid;
5039 bool err = false;
5041 if (TREE_CODE (decl) != LABEL_DECL)
5042 return true;
5043 if (!DECL_NONLOCAL (decl) && !FORCED_LABEL (decl)
5044 && DECL_CONTEXT (decl) != current_function_decl)
5046 error ("label context is not the current function declaration");
5047 err |= true;
5050 uid = LABEL_DECL_UID (decl);
5051 if (cfun->cfg
5052 && (uid == -1
5053 || (*label_to_block_map_for_fn (cfun))[uid] != gimple_bb (stmt)))
5055 error ("incorrect entry in %<label_to_block_map%>");
5056 err |= true;
5059 uid = EH_LANDING_PAD_NR (decl);
5060 if (uid)
5062 eh_landing_pad lp = get_eh_landing_pad_from_number (uid);
5063 if (decl != lp->post_landing_pad)
5065 error ("incorrect setting of landing pad number");
5066 err |= true;
5070 return err;
5073 /* Verify a gimple cond statement STMT.
5074 Returns true if anything is wrong. */
5076 static bool
5077 verify_gimple_cond (gcond *stmt)
5079 if (TREE_CODE_CLASS (gimple_cond_code (stmt)) != tcc_comparison)
5081 error ("invalid comparison code in gimple cond");
5082 return true;
5084 if (!(!gimple_cond_true_label (stmt)
5085 || TREE_CODE (gimple_cond_true_label (stmt)) == LABEL_DECL)
5086 || !(!gimple_cond_false_label (stmt)
5087 || TREE_CODE (gimple_cond_false_label (stmt)) == LABEL_DECL))
5089 error ("invalid labels in gimple cond");
5090 return true;
5093 return verify_gimple_comparison (boolean_type_node,
5094 gimple_cond_lhs (stmt),
5095 gimple_cond_rhs (stmt),
5096 gimple_cond_code (stmt));
5099 /* Verify the GIMPLE statement STMT. Returns true if there is an
5100 error, otherwise false. */
5102 static bool
5103 verify_gimple_stmt (gimple *stmt)
5105 switch (gimple_code (stmt))
5107 case GIMPLE_ASSIGN:
5108 return verify_gimple_assign (as_a <gassign *> (stmt));
5110 case GIMPLE_LABEL:
5111 return verify_gimple_label (as_a <glabel *> (stmt));
5113 case GIMPLE_CALL:
5114 return verify_gimple_call (as_a <gcall *> (stmt));
5116 case GIMPLE_COND:
5117 return verify_gimple_cond (as_a <gcond *> (stmt));
5119 case GIMPLE_GOTO:
5120 return verify_gimple_goto (as_a <ggoto *> (stmt));
5122 case GIMPLE_SWITCH:
5123 return verify_gimple_switch (as_a <gswitch *> (stmt));
5125 case GIMPLE_RETURN:
5126 return verify_gimple_return (as_a <greturn *> (stmt));
5128 case GIMPLE_ASM:
5129 return false;
5131 case GIMPLE_TRANSACTION:
5132 return verify_gimple_transaction (as_a <gtransaction *> (stmt));
5134 /* Tuples that do not have tree operands. */
5135 case GIMPLE_NOP:
5136 case GIMPLE_PREDICT:
5137 case GIMPLE_RESX:
5138 case GIMPLE_EH_DISPATCH:
5139 case GIMPLE_EH_MUST_NOT_THROW:
5140 return false;
5142 CASE_GIMPLE_OMP:
5143 /* OpenMP directives are validated by the FE and never operated
5144 on by the optimizers. Furthermore, GIMPLE_OMP_FOR may contain
5145 non-gimple expressions when the main index variable has had
5146 its address taken. This does not affect the loop itself
5147 because the header of an GIMPLE_OMP_FOR is merely used to determine
5148 how to setup the parallel iteration. */
5149 return false;
5151 case GIMPLE_ASSUME:
5152 return false;
5154 case GIMPLE_DEBUG:
5155 return verify_gimple_debug (stmt);
5157 default:
5158 gcc_unreachable ();
5162 /* Verify the contents of a GIMPLE_PHI. Returns true if there is a problem,
5163 and false otherwise. */
5165 static bool
5166 verify_gimple_phi (gphi *phi)
5168 bool err = false;
5169 unsigned i;
5170 tree phi_result = gimple_phi_result (phi);
5171 bool virtual_p;
5173 if (!phi_result)
5175 error ("invalid %<PHI%> result");
5176 return true;
5179 virtual_p = virtual_operand_p (phi_result);
5180 if (TREE_CODE (phi_result) != SSA_NAME
5181 || (virtual_p
5182 && SSA_NAME_VAR (phi_result) != gimple_vop (cfun)))
5184 error ("invalid %<PHI%> result");
5185 err = true;
5188 for (i = 0; i < gimple_phi_num_args (phi); i++)
5190 tree t = gimple_phi_arg_def (phi, i);
5192 if (!t)
5194 error ("missing %<PHI%> def");
5195 err |= true;
5196 continue;
5198 /* Addressable variables do have SSA_NAMEs but they
5199 are not considered gimple values. */
5200 else if ((TREE_CODE (t) == SSA_NAME
5201 && virtual_p != virtual_operand_p (t))
5202 || (virtual_p
5203 && (TREE_CODE (t) != SSA_NAME
5204 || SSA_NAME_VAR (t) != gimple_vop (cfun)))
5205 || (!virtual_p
5206 && !is_gimple_val (t)))
5208 error ("invalid %<PHI%> argument");
5209 debug_generic_expr (t);
5210 err |= true;
5212 #ifdef ENABLE_TYPES_CHECKING
5213 if (!useless_type_conversion_p (TREE_TYPE (phi_result), TREE_TYPE (t)))
5215 error ("incompatible types in %<PHI%> argument %u", i);
5216 debug_generic_stmt (TREE_TYPE (phi_result));
5217 debug_generic_stmt (TREE_TYPE (t));
5218 err |= true;
5220 #endif
5223 return err;
5226 /* Verify the GIMPLE statements inside the sequence STMTS. */
5228 static bool
5229 verify_gimple_in_seq_2 (gimple_seq stmts)
5231 gimple_stmt_iterator ittr;
5232 bool err = false;
5234 for (ittr = gsi_start (stmts); !gsi_end_p (ittr); gsi_next (&ittr))
5236 gimple *stmt = gsi_stmt (ittr);
5238 switch (gimple_code (stmt))
5240 case GIMPLE_BIND:
5241 err |= verify_gimple_in_seq_2 (
5242 gimple_bind_body (as_a <gbind *> (stmt)));
5243 break;
5245 case GIMPLE_TRY:
5246 err |= verify_gimple_in_seq_2 (gimple_try_eval (stmt));
5247 err |= verify_gimple_in_seq_2 (gimple_try_cleanup (stmt));
5248 break;
5250 case GIMPLE_EH_FILTER:
5251 err |= verify_gimple_in_seq_2 (gimple_eh_filter_failure (stmt));
5252 break;
5254 case GIMPLE_EH_ELSE:
5256 geh_else *eh_else = as_a <geh_else *> (stmt);
5257 err |= verify_gimple_in_seq_2 (gimple_eh_else_n_body (eh_else));
5258 err |= verify_gimple_in_seq_2 (gimple_eh_else_e_body (eh_else));
5260 break;
5262 case GIMPLE_CATCH:
5263 err |= verify_gimple_in_seq_2 (gimple_catch_handler (
5264 as_a <gcatch *> (stmt)));
5265 break;
5267 case GIMPLE_ASSUME:
5268 err |= verify_gimple_in_seq_2 (gimple_assume_body (stmt));
5269 break;
5271 case GIMPLE_TRANSACTION:
5272 err |= verify_gimple_transaction (as_a <gtransaction *> (stmt));
5273 break;
5275 default:
5277 bool err2 = verify_gimple_stmt (stmt);
5278 if (err2)
5279 debug_gimple_stmt (stmt);
5280 err |= err2;
5285 return err;
5288 /* Verify the contents of a GIMPLE_TRANSACTION. Returns true if there
5289 is a problem, otherwise false. */
5291 static bool
5292 verify_gimple_transaction (gtransaction *stmt)
5294 tree lab;
5296 lab = gimple_transaction_label_norm (stmt);
5297 if (lab != NULL && TREE_CODE (lab) != LABEL_DECL)
5298 return true;
5299 lab = gimple_transaction_label_uninst (stmt);
5300 if (lab != NULL && TREE_CODE (lab) != LABEL_DECL)
5301 return true;
5302 lab = gimple_transaction_label_over (stmt);
5303 if (lab != NULL && TREE_CODE (lab) != LABEL_DECL)
5304 return true;
5306 return verify_gimple_in_seq_2 (gimple_transaction_body (stmt));
5310 /* Verify the GIMPLE statements inside the statement list STMTS. */
5312 DEBUG_FUNCTION bool
5313 verify_gimple_in_seq (gimple_seq stmts, bool ice)
5315 timevar_push (TV_TREE_STMT_VERIFY);
5316 bool res = verify_gimple_in_seq_2 (stmts);
5317 if (res && ice)
5318 internal_error ("%<verify_gimple%> failed");
5319 timevar_pop (TV_TREE_STMT_VERIFY);
5320 return res;
5323 /* Return true when the T can be shared. */
5325 static bool
5326 tree_node_can_be_shared (tree t)
5328 if (IS_TYPE_OR_DECL_P (t)
5329 || TREE_CODE (t) == SSA_NAME
5330 || TREE_CODE (t) == IDENTIFIER_NODE
5331 || TREE_CODE (t) == CASE_LABEL_EXPR
5332 || is_gimple_min_invariant (t))
5333 return true;
5335 if (t == error_mark_node)
5336 return true;
5338 return false;
5341 /* Called via walk_tree. Verify tree sharing. */
5343 static tree
5344 verify_node_sharing_1 (tree *tp, int *walk_subtrees, void *data)
5346 hash_set<void *> *visited = (hash_set<void *> *) data;
5348 if (tree_node_can_be_shared (*tp))
5350 *walk_subtrees = false;
5351 return NULL;
5354 if (visited->add (*tp))
5355 return *tp;
5357 return NULL;
5360 /* Called via walk_gimple_stmt. Verify tree sharing. */
5362 static tree
5363 verify_node_sharing (tree *tp, int *walk_subtrees, void *data)
5365 struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
5366 return verify_node_sharing_1 (tp, walk_subtrees, wi->info);
5369 static bool eh_error_found;
5370 bool
5371 verify_eh_throw_stmt_node (gimple *const &stmt, const int &,
5372 hash_set<gimple *> *visited)
5374 if (!visited->contains (stmt))
5376 error ("dead statement in EH table");
5377 debug_gimple_stmt (stmt);
5378 eh_error_found = true;
5380 return true;
5383 /* Verify if the location LOCs block is in BLOCKS. */
5385 static bool
5386 verify_location (hash_set<tree> *blocks, location_t loc)
5388 tree block = LOCATION_BLOCK (loc);
5389 if (block != NULL_TREE
5390 && !blocks->contains (block))
5392 error ("location references block not in block tree");
5393 return true;
5395 if (block != NULL_TREE)
5396 return verify_location (blocks, BLOCK_SOURCE_LOCATION (block));
5397 return false;
5400 /* Called via walk_tree. Verify that expressions have no blocks. */
5402 static tree
5403 verify_expr_no_block (tree *tp, int *walk_subtrees, void *)
5405 if (!EXPR_P (*tp))
5407 *walk_subtrees = false;
5408 return NULL;
5411 location_t loc = EXPR_LOCATION (*tp);
5412 if (LOCATION_BLOCK (loc) != NULL)
5413 return *tp;
5415 return NULL;
5418 /* Called via walk_tree. Verify locations of expressions. */
5420 static tree
5421 verify_expr_location_1 (tree *tp, int *walk_subtrees, void *data)
5423 hash_set<tree> *blocks = (hash_set<tree> *) data;
5424 tree t = *tp;
5426 /* ??? This doesn't really belong here but there's no good place to
5427 stick this remainder of old verify_expr. */
5428 /* ??? This barfs on debug stmts which contain binds to vars with
5429 different function context. */
5430 #if 0
5431 if (VAR_P (t)
5432 || TREE_CODE (t) == PARM_DECL
5433 || TREE_CODE (t) == RESULT_DECL)
5435 tree context = decl_function_context (t);
5436 if (context != cfun->decl
5437 && !SCOPE_FILE_SCOPE_P (context)
5438 && !TREE_STATIC (t)
5439 && !DECL_EXTERNAL (t))
5441 error ("local declaration from a different function");
5442 return t;
5445 #endif
5447 if (VAR_P (t) && DECL_HAS_DEBUG_EXPR_P (t))
5449 tree x = DECL_DEBUG_EXPR (t);
5450 tree addr = walk_tree (&x, verify_expr_no_block, NULL, NULL);
5451 if (addr)
5452 return addr;
5454 if ((VAR_P (t)
5455 || TREE_CODE (t) == PARM_DECL
5456 || TREE_CODE (t) == RESULT_DECL)
5457 && DECL_HAS_VALUE_EXPR_P (t))
5459 tree x = DECL_VALUE_EXPR (t);
5460 tree addr = walk_tree (&x, verify_expr_no_block, NULL, NULL);
5461 if (addr)
5462 return addr;
5465 if (!EXPR_P (t))
5467 *walk_subtrees = false;
5468 return NULL;
5471 location_t loc = EXPR_LOCATION (t);
5472 if (verify_location (blocks, loc))
5473 return t;
5475 return NULL;
5478 /* Called via walk_gimple_op. Verify locations of expressions. */
5480 static tree
5481 verify_expr_location (tree *tp, int *walk_subtrees, void *data)
5483 struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
5484 return verify_expr_location_1 (tp, walk_subtrees, wi->info);
5487 /* Insert all subblocks of BLOCK into BLOCKS and recurse. */
5489 static void
5490 collect_subblocks (hash_set<tree> *blocks, tree block)
5492 tree t;
5493 for (t = BLOCK_SUBBLOCKS (block); t; t = BLOCK_CHAIN (t))
5495 blocks->add (t);
5496 collect_subblocks (blocks, t);
5500 /* Disable warnings about missing quoting in GCC diagnostics for
5501 the verification errors. Their format strings don't follow
5502 GCC diagnostic conventions and trigger an ICE in the end. */
5503 #if __GNUC__ >= 10
5504 # pragma GCC diagnostic push
5505 # pragma GCC diagnostic ignored "-Wformat-diag"
5506 #endif
5508 /* Verify the GIMPLE statements in the CFG of FN. */
5510 DEBUG_FUNCTION bool
5511 verify_gimple_in_cfg (struct function *fn, bool verify_nothrow, bool ice)
5513 basic_block bb;
5514 bool err = false;
5516 timevar_push (TV_TREE_STMT_VERIFY);
5517 hash_set<void *> visited;
5518 hash_set<gimple *> visited_throwing_stmts;
5520 /* Collect all BLOCKs referenced by the BLOCK tree of FN. */
5521 hash_set<tree> blocks;
5522 if (DECL_INITIAL (fn->decl))
5524 blocks.add (DECL_INITIAL (fn->decl));
5525 collect_subblocks (&blocks, DECL_INITIAL (fn->decl));
5528 FOR_EACH_BB_FN (bb, fn)
5530 gimple_stmt_iterator gsi;
5531 edge_iterator ei;
5532 edge e;
5534 for (gphi_iterator gpi = gsi_start_phis (bb);
5535 !gsi_end_p (gpi);
5536 gsi_next (&gpi))
5538 gphi *phi = gpi.phi ();
5539 bool err2 = false;
5540 unsigned i;
5542 if (gimple_bb (phi) != bb)
5544 error ("gimple_bb (phi) is set to a wrong basic block");
5545 err2 = true;
5548 err2 |= verify_gimple_phi (phi);
5550 /* Only PHI arguments have locations. */
5551 if (gimple_location (phi) != UNKNOWN_LOCATION)
5553 error ("PHI node with location");
5554 err2 = true;
5557 for (i = 0; i < gimple_phi_num_args (phi); i++)
5559 tree arg = gimple_phi_arg_def (phi, i);
5560 tree addr = walk_tree (&arg, verify_node_sharing_1,
5561 &visited, NULL);
5562 if (addr)
5564 error ("incorrect sharing of tree nodes");
5565 debug_generic_expr (addr);
5566 err2 |= true;
5568 location_t loc = gimple_phi_arg_location (phi, i);
5569 if (virtual_operand_p (gimple_phi_result (phi))
5570 && loc != UNKNOWN_LOCATION)
5572 error ("virtual PHI with argument locations");
5573 err2 = true;
5575 addr = walk_tree (&arg, verify_expr_location_1, &blocks, NULL);
5576 if (addr)
5578 debug_generic_expr (addr);
5579 err2 = true;
5581 err2 |= verify_location (&blocks, loc);
5584 if (err2)
5585 debug_gimple_stmt (phi);
5586 err |= err2;
5589 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
5591 gimple *stmt = gsi_stmt (gsi);
5592 bool err2 = false;
5593 struct walk_stmt_info wi;
5594 tree addr;
5595 int lp_nr;
5597 if (gimple_bb (stmt) != bb)
5599 error ("gimple_bb (stmt) is set to a wrong basic block");
5600 err2 = true;
5603 err2 |= verify_gimple_stmt (stmt);
5604 err2 |= verify_location (&blocks, gimple_location (stmt));
5606 memset (&wi, 0, sizeof (wi));
5607 wi.info = (void *) &visited;
5608 addr = walk_gimple_op (stmt, verify_node_sharing, &wi);
5609 if (addr)
5611 error ("incorrect sharing of tree nodes");
5612 debug_generic_expr (addr);
5613 err2 |= true;
5616 memset (&wi, 0, sizeof (wi));
5617 wi.info = (void *) &blocks;
5618 addr = walk_gimple_op (stmt, verify_expr_location, &wi);
5619 if (addr)
5621 debug_generic_expr (addr);
5622 err2 |= true;
5625 /* If the statement is marked as part of an EH region, then it is
5626 expected that the statement could throw. Verify that when we
5627 have optimizations that simplify statements such that we prove
5628 that they cannot throw, that we update other data structures
5629 to match. */
5630 lp_nr = lookup_stmt_eh_lp (stmt);
5631 if (lp_nr != 0)
5632 visited_throwing_stmts.add (stmt);
5633 if (lp_nr > 0)
5635 if (!stmt_could_throw_p (cfun, stmt))
5637 if (verify_nothrow)
5639 error ("statement marked for throw, but doesn%'t");
5640 err2 |= true;
5643 else if (!gsi_one_before_end_p (gsi))
5645 error ("statement marked for throw in middle of block");
5646 err2 |= true;
5650 if (err2)
5651 debug_gimple_stmt (stmt);
5652 err |= err2;
5655 FOR_EACH_EDGE (e, ei, bb->succs)
5656 if (e->goto_locus != UNKNOWN_LOCATION)
5657 err |= verify_location (&blocks, e->goto_locus);
5660 hash_map<gimple *, int> *eh_table = get_eh_throw_stmt_table (cfun);
5661 eh_error_found = false;
5662 if (eh_table)
5663 eh_table->traverse<hash_set<gimple *> *, verify_eh_throw_stmt_node>
5664 (&visited_throwing_stmts);
5666 if (ice && (err || eh_error_found))
5667 internal_error ("verify_gimple failed");
5669 verify_histograms ();
5670 timevar_pop (TV_TREE_STMT_VERIFY);
5672 return (err || eh_error_found);
5676 /* Verifies that the flow information is OK. */
5678 static bool
5679 gimple_verify_flow_info (void)
5681 bool err = false;
5682 basic_block bb;
5683 gimple_stmt_iterator gsi;
5684 gimple *stmt;
5685 edge e;
5686 edge_iterator ei;
5688 if (ENTRY_BLOCK_PTR_FOR_FN (cfun)->il.gimple.seq
5689 || ENTRY_BLOCK_PTR_FOR_FN (cfun)->il.gimple.phi_nodes)
5691 error ("ENTRY_BLOCK has IL associated with it");
5692 err = true;
5695 if (EXIT_BLOCK_PTR_FOR_FN (cfun)->il.gimple.seq
5696 || EXIT_BLOCK_PTR_FOR_FN (cfun)->il.gimple.phi_nodes)
5698 error ("EXIT_BLOCK has IL associated with it");
5699 err = true;
5702 FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR_FOR_FN (cfun)->preds)
5703 if (e->flags & EDGE_FALLTHRU)
5705 error ("fallthru to exit from bb %d", e->src->index);
5706 err = true;
5708 if (cfun->cfg->full_profile
5709 && !ENTRY_BLOCK_PTR_FOR_FN (cfun)->count.initialized_p ())
5711 error ("entry block count not initialized");
5712 err = true;
5714 if (cfun->cfg->full_profile
5715 && !EXIT_BLOCK_PTR_FOR_FN (cfun)->count.initialized_p ())
5717 error ("exit block count not initialized");
5718 err = true;
5720 if (cfun->cfg->full_profile
5721 && !single_succ_edge
5722 (ENTRY_BLOCK_PTR_FOR_FN (cfun))->probability.initialized_p ())
5724 error ("probability of edge from entry block not initialized");
5725 err = true;
5729 FOR_EACH_BB_FN (bb, cfun)
5731 bool found_ctrl_stmt = false;
5733 stmt = NULL;
5735 if (cfun->cfg->full_profile)
5737 if (!bb->count.initialized_p ())
5739 error ("count of bb %d not initialized", bb->index);
5740 err = true;
5742 FOR_EACH_EDGE (e, ei, bb->succs)
5743 if (!e->probability.initialized_p ())
5745 error ("probability of edge %d->%d not initialized",
5746 bb->index, e->dest->index);
5747 err = true;
5751 /* Skip labels on the start of basic block. */
5752 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
5754 tree label;
5755 gimple *prev_stmt = stmt;
5757 stmt = gsi_stmt (gsi);
5759 if (gimple_code (stmt) != GIMPLE_LABEL)
5760 break;
5762 label = gimple_label_label (as_a <glabel *> (stmt));
5763 if (prev_stmt && DECL_NONLOCAL (label))
5765 error ("nonlocal label %qD is not first in a sequence "
5766 "of labels in bb %d", label, bb->index);
5767 err = true;
5770 if (prev_stmt && EH_LANDING_PAD_NR (label) != 0)
5772 error ("EH landing pad label %qD is not first in a sequence "
5773 "of labels in bb %d", label, bb->index);
5774 err = true;
5777 if (label_to_block (cfun, label) != bb)
5779 error ("label %qD to block does not match in bb %d",
5780 label, bb->index);
5781 err = true;
5784 if (decl_function_context (label) != current_function_decl)
5786 error ("label %qD has incorrect context in bb %d",
5787 label, bb->index);
5788 err = true;
5792 /* Verify that body of basic block BB is free of control flow. */
5793 bool seen_nondebug_stmt = false;
5794 for (; !gsi_end_p (gsi); gsi_next (&gsi))
5796 gimple *stmt = gsi_stmt (gsi);
5798 /* Do NOT disregard debug stmts after found_ctrl_stmt. */
5799 if (found_ctrl_stmt)
5801 error ("control flow in the middle of basic block %d",
5802 bb->index);
5803 err = true;
5806 if (stmt_ends_bb_p (stmt))
5807 found_ctrl_stmt = true;
5809 if (glabel *label_stmt = dyn_cast <glabel *> (stmt))
5811 error ("label %qD in the middle of basic block %d",
5812 gimple_label_label (label_stmt), bb->index);
5813 err = true;
5816 /* Check that no statements appear between a returns_twice call
5817 and its associated abnormal edge. */
5818 if (gimple_code (stmt) == GIMPLE_CALL
5819 && gimple_call_flags (stmt) & ECF_RETURNS_TWICE)
5821 bool misplaced = false;
5822 /* TM is an exception: it points abnormal edges just after the
5823 call that starts a transaction, i.e. it must end the BB. */
5824 if (gimple_call_builtin_p (stmt, BUILT_IN_TM_START))
5826 if (single_succ_p (bb)
5827 && bb_has_abnormal_pred (single_succ (bb))
5828 && !gsi_one_nondebug_before_end_p (gsi))
5830 error ("returns_twice call is not last in basic block "
5831 "%d", bb->index);
5832 misplaced = true;
5835 else
5837 if (seen_nondebug_stmt && bb_has_abnormal_pred (bb))
5839 error ("returns_twice call is not first in basic block "
5840 "%d", bb->index);
5841 misplaced = true;
5844 if (misplaced)
5846 print_gimple_stmt (stderr, stmt, 0, TDF_SLIM);
5847 err = true;
5850 if (!is_gimple_debug (stmt))
5851 seen_nondebug_stmt = true;
5854 gsi = gsi_last_nondebug_bb (bb);
5855 if (gsi_end_p (gsi))
5856 continue;
5858 stmt = gsi_stmt (gsi);
5860 if (gimple_code (stmt) == GIMPLE_LABEL)
5861 continue;
5863 if (verify_eh_edges (stmt))
5864 err = true;
5866 if (is_ctrl_stmt (stmt))
5868 FOR_EACH_EDGE (e, ei, bb->succs)
5869 if (e->flags & EDGE_FALLTHRU)
5871 error ("fallthru edge after a control statement in bb %d",
5872 bb->index);
5873 err = true;
5877 if (gimple_code (stmt) != GIMPLE_COND)
5879 /* Verify that there are no edges with EDGE_TRUE/FALSE_FLAG set
5880 after anything else but if statement. */
5881 FOR_EACH_EDGE (e, ei, bb->succs)
5882 if (e->flags & (EDGE_TRUE_VALUE | EDGE_FALSE_VALUE))
5884 error ("true/false edge after a non-GIMPLE_COND in bb %d",
5885 bb->index);
5886 err = true;
5890 switch (gimple_code (stmt))
5892 case GIMPLE_COND:
5894 edge true_edge;
5895 edge false_edge;
5897 extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
5899 if (!true_edge
5900 || !false_edge
5901 || !(true_edge->flags & EDGE_TRUE_VALUE)
5902 || !(false_edge->flags & EDGE_FALSE_VALUE)
5903 || (true_edge->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL))
5904 || (false_edge->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL))
5905 || EDGE_COUNT (bb->succs) >= 3)
5907 error ("wrong outgoing edge flags at end of bb %d",
5908 bb->index);
5909 err = true;
5912 break;
5914 case GIMPLE_GOTO:
5915 if (simple_goto_p (stmt))
5917 error ("explicit goto at end of bb %d", bb->index);
5918 err = true;
5920 else
5922 /* FIXME. We should double check that the labels in the
5923 destination blocks have their address taken. */
5924 FOR_EACH_EDGE (e, ei, bb->succs)
5925 if ((e->flags & (EDGE_FALLTHRU | EDGE_TRUE_VALUE
5926 | EDGE_FALSE_VALUE))
5927 || !(e->flags & EDGE_ABNORMAL))
5929 error ("wrong outgoing edge flags at end of bb %d",
5930 bb->index);
5931 err = true;
5934 break;
5936 case GIMPLE_CALL:
5937 if (!gimple_call_builtin_p (stmt, BUILT_IN_RETURN))
5938 break;
5939 /* fallthru */
5940 case GIMPLE_RETURN:
5941 if (!single_succ_p (bb)
5942 || (single_succ_edge (bb)->flags
5943 & (EDGE_FALLTHRU | EDGE_ABNORMAL
5944 | EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
5946 error ("wrong outgoing edge flags at end of bb %d", bb->index);
5947 err = true;
5949 if (single_succ (bb) != EXIT_BLOCK_PTR_FOR_FN (cfun))
5951 error ("return edge does not point to exit in bb %d",
5952 bb->index);
5953 err = true;
5955 break;
5957 case GIMPLE_SWITCH:
5959 gswitch *switch_stmt = as_a <gswitch *> (stmt);
5960 tree prev;
5961 edge e;
5962 size_t i, n;
5964 n = gimple_switch_num_labels (switch_stmt);
5966 /* Mark all the destination basic blocks. */
5967 for (i = 0; i < n; ++i)
5969 basic_block label_bb = gimple_switch_label_bb (cfun, switch_stmt, i);
5970 gcc_assert (!label_bb->aux || label_bb->aux == (void *)1);
5971 label_bb->aux = (void *)1;
5974 /* Verify that the case labels are sorted. */
5975 prev = gimple_switch_label (switch_stmt, 0);
5976 for (i = 1; i < n; ++i)
5978 tree c = gimple_switch_label (switch_stmt, i);
5979 if (!CASE_LOW (c))
5981 error ("found default case not at the start of "
5982 "case vector");
5983 err = true;
5984 continue;
5986 if (CASE_LOW (prev)
5987 && !tree_int_cst_lt (CASE_LOW (prev), CASE_LOW (c)))
5989 error ("case labels not sorted: ");
5990 print_generic_expr (stderr, prev);
5991 fprintf (stderr," is greater than ");
5992 print_generic_expr (stderr, c);
5993 fprintf (stderr," but comes before it.\n");
5994 err = true;
5996 prev = c;
5998 /* VRP will remove the default case if it can prove it will
5999 never be executed. So do not verify there always exists
6000 a default case here. */
6002 FOR_EACH_EDGE (e, ei, bb->succs)
6004 if (!e->dest->aux)
6006 error ("extra outgoing edge %d->%d",
6007 bb->index, e->dest->index);
6008 err = true;
6011 e->dest->aux = (void *)2;
6012 if ((e->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL
6013 | EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
6015 error ("wrong outgoing edge flags at end of bb %d",
6016 bb->index);
6017 err = true;
6021 /* Check that we have all of them. */
6022 for (i = 0; i < n; ++i)
6024 basic_block label_bb = gimple_switch_label_bb (cfun,
6025 switch_stmt, i);
6027 if (label_bb->aux != (void *)2)
6029 error ("missing edge %i->%i", bb->index, label_bb->index);
6030 err = true;
6034 FOR_EACH_EDGE (e, ei, bb->succs)
6035 e->dest->aux = (void *)0;
6037 break;
6039 case GIMPLE_EH_DISPATCH:
6040 if (verify_eh_dispatch_edge (as_a <geh_dispatch *> (stmt)))
6041 err = true;
6042 break;
6044 default:
6045 break;
6049 if (dom_info_state (CDI_DOMINATORS) >= DOM_NO_FAST_QUERY)
6050 verify_dominators (CDI_DOMINATORS);
6052 return err;
6055 #if __GNUC__ >= 10
6056 # pragma GCC diagnostic pop
6057 #endif
6059 /* Updates phi nodes after creating a forwarder block joined
6060 by edge FALLTHRU. */
6062 static void
6063 gimple_make_forwarder_block (edge fallthru)
6065 edge e;
6066 edge_iterator ei;
6067 basic_block dummy, bb;
6068 tree var;
6069 gphi_iterator gsi;
6070 bool forward_location_p;
6072 dummy = fallthru->src;
6073 bb = fallthru->dest;
6075 if (single_pred_p (bb))
6076 return;
6078 /* We can forward location info if we have only one predecessor. */
6079 forward_location_p = single_pred_p (dummy);
6081 /* If we redirected a branch we must create new PHI nodes at the
6082 start of BB. */
6083 for (gsi = gsi_start_phis (dummy); !gsi_end_p (gsi); gsi_next (&gsi))
6085 gphi *phi, *new_phi;
6087 phi = gsi.phi ();
6088 var = gimple_phi_result (phi);
6089 new_phi = create_phi_node (var, bb);
6090 gimple_phi_set_result (phi, copy_ssa_name (var, phi));
6091 add_phi_arg (new_phi, gimple_phi_result (phi), fallthru,
6092 forward_location_p
6093 ? gimple_phi_arg_location (phi, 0) : UNKNOWN_LOCATION);
6096 /* Add the arguments we have stored on edges. */
6097 FOR_EACH_EDGE (e, ei, bb->preds)
6099 if (e == fallthru)
6100 continue;
6102 flush_pending_stmts (e);
6107 /* Return a non-special label in the head of basic block BLOCK.
6108 Create one if it doesn't exist. */
6110 tree
6111 gimple_block_label (basic_block bb)
6113 gimple_stmt_iterator i, s = gsi_start_bb (bb);
6114 bool first = true;
6115 tree label;
6116 glabel *stmt;
6118 for (i = s; !gsi_end_p (i); first = false, gsi_next (&i))
6120 stmt = dyn_cast <glabel *> (gsi_stmt (i));
6121 if (!stmt)
6122 break;
6123 label = gimple_label_label (stmt);
6124 if (!DECL_NONLOCAL (label))
6126 if (!first)
6127 gsi_move_before (&i, &s);
6128 return label;
6132 label = create_artificial_label (UNKNOWN_LOCATION);
6133 stmt = gimple_build_label (label);
6134 gsi_insert_before (&s, stmt, GSI_NEW_STMT);
6135 return label;
6139 /* Attempt to perform edge redirection by replacing a possibly complex
6140 jump instruction by a goto or by removing the jump completely.
6141 This can apply only if all edges now point to the same block. The
6142 parameters and return values are equivalent to
6143 redirect_edge_and_branch. */
6145 static edge
6146 gimple_try_redirect_by_replacing_jump (edge e, basic_block target)
6148 basic_block src = e->src;
6149 gimple_stmt_iterator i;
6150 gimple *stmt;
6152 /* We can replace or remove a complex jump only when we have exactly
6153 two edges. */
6154 if (EDGE_COUNT (src->succs) != 2
6155 /* Verify that all targets will be TARGET. Specifically, the
6156 edge that is not E must also go to TARGET. */
6157 || EDGE_SUCC (src, EDGE_SUCC (src, 0) == e)->dest != target)
6158 return NULL;
6160 i = gsi_last_bb (src);
6161 if (gsi_end_p (i))
6162 return NULL;
6164 stmt = gsi_stmt (i);
6166 if (gimple_code (stmt) == GIMPLE_COND || gimple_code (stmt) == GIMPLE_SWITCH)
6168 gsi_remove (&i, true);
6169 e = ssa_redirect_edge (e, target);
6170 e->flags = EDGE_FALLTHRU;
6171 return e;
6174 return NULL;
6178 /* Redirect E to DEST. Return NULL on failure. Otherwise, return the
6179 edge representing the redirected branch. */
6181 static edge
6182 gimple_redirect_edge_and_branch (edge e, basic_block dest)
6184 basic_block bb = e->src;
6185 gimple_stmt_iterator gsi;
6186 edge ret;
6187 gimple *stmt;
6189 if (e->flags & EDGE_ABNORMAL)
6190 return NULL;
6192 if (e->dest == dest)
6193 return NULL;
6195 if (e->flags & EDGE_EH)
6196 return redirect_eh_edge (e, dest);
6198 if (e->src != ENTRY_BLOCK_PTR_FOR_FN (cfun))
6200 ret = gimple_try_redirect_by_replacing_jump (e, dest);
6201 if (ret)
6202 return ret;
6205 gsi = gsi_last_nondebug_bb (bb);
6206 stmt = gsi_end_p (gsi) ? NULL : gsi_stmt (gsi);
6208 switch (stmt ? gimple_code (stmt) : GIMPLE_ERROR_MARK)
6210 case GIMPLE_COND:
6211 /* For COND_EXPR, we only need to redirect the edge. */
6212 break;
6214 case GIMPLE_GOTO:
6215 /* No non-abnormal edges should lead from a non-simple goto, and
6216 simple ones should be represented implicitly. */
6217 gcc_unreachable ();
6219 case GIMPLE_SWITCH:
6221 gswitch *switch_stmt = as_a <gswitch *> (stmt);
6222 tree label = gimple_block_label (dest);
6223 tree cases = get_cases_for_edge (e, switch_stmt);
6225 /* If we have a list of cases associated with E, then use it
6226 as it's a lot faster than walking the entire case vector. */
6227 if (cases)
6229 edge e2 = find_edge (e->src, dest);
6230 tree last, first;
6232 first = cases;
6233 while (cases)
6235 last = cases;
6236 CASE_LABEL (cases) = label;
6237 cases = CASE_CHAIN (cases);
6240 /* If there was already an edge in the CFG, then we need
6241 to move all the cases associated with E to E2. */
6242 if (e2)
6244 tree cases2 = get_cases_for_edge (e2, switch_stmt);
6246 CASE_CHAIN (last) = CASE_CHAIN (cases2);
6247 CASE_CHAIN (cases2) = first;
6249 bitmap_set_bit (touched_switch_bbs, gimple_bb (stmt)->index);
6251 else
6253 size_t i, n = gimple_switch_num_labels (switch_stmt);
6255 for (i = 0; i < n; i++)
6257 tree elt = gimple_switch_label (switch_stmt, i);
6258 if (label_to_block (cfun, CASE_LABEL (elt)) == e->dest)
6259 CASE_LABEL (elt) = label;
6263 break;
6265 case GIMPLE_ASM:
6267 gasm *asm_stmt = as_a <gasm *> (stmt);
6268 int i, n = gimple_asm_nlabels (asm_stmt);
6269 tree label = NULL;
6271 for (i = 0; i < n; ++i)
6273 tree cons = gimple_asm_label_op (asm_stmt, i);
6274 if (label_to_block (cfun, TREE_VALUE (cons)) == e->dest)
6276 if (!label)
6277 label = gimple_block_label (dest);
6278 TREE_VALUE (cons) = label;
6282 /* If we didn't find any label matching the former edge in the
6283 asm labels, we must be redirecting the fallthrough
6284 edge. */
6285 gcc_assert (label || (e->flags & EDGE_FALLTHRU));
6287 break;
6289 case GIMPLE_RETURN:
6290 gsi_remove (&gsi, true);
6291 e->flags |= EDGE_FALLTHRU;
6292 break;
6294 case GIMPLE_OMP_RETURN:
6295 case GIMPLE_OMP_CONTINUE:
6296 case GIMPLE_OMP_SECTIONS_SWITCH:
6297 case GIMPLE_OMP_FOR:
6298 /* The edges from OMP constructs can be simply redirected. */
6299 break;
6301 case GIMPLE_EH_DISPATCH:
6302 if (!(e->flags & EDGE_FALLTHRU))
6303 redirect_eh_dispatch_edge (as_a <geh_dispatch *> (stmt), e, dest);
6304 break;
6306 case GIMPLE_TRANSACTION:
6307 if (e->flags & EDGE_TM_ABORT)
6308 gimple_transaction_set_label_over (as_a <gtransaction *> (stmt),
6309 gimple_block_label (dest));
6310 else if (e->flags & EDGE_TM_UNINSTRUMENTED)
6311 gimple_transaction_set_label_uninst (as_a <gtransaction *> (stmt),
6312 gimple_block_label (dest));
6313 else
6314 gimple_transaction_set_label_norm (as_a <gtransaction *> (stmt),
6315 gimple_block_label (dest));
6316 break;
6318 default:
6319 /* Otherwise it must be a fallthru edge, and we don't need to
6320 do anything besides redirecting it. */
6321 gcc_assert (e->flags & EDGE_FALLTHRU);
6322 break;
6325 /* Update/insert PHI nodes as necessary. */
6327 /* Now update the edges in the CFG. */
6328 e = ssa_redirect_edge (e, dest);
6330 return e;
6333 /* Returns true if it is possible to remove edge E by redirecting
6334 it to the destination of the other edge from E->src. */
6336 static bool
6337 gimple_can_remove_branch_p (const_edge e)
6339 if (e->flags & (EDGE_ABNORMAL | EDGE_EH))
6340 return false;
6342 return true;
6345 /* Simple wrapper, as we can always redirect fallthru edges. */
6347 static basic_block
6348 gimple_redirect_edge_and_branch_force (edge e, basic_block dest)
6350 e = gimple_redirect_edge_and_branch (e, dest);
6351 gcc_assert (e);
6353 return NULL;
6357 /* Splits basic block BB after statement STMT (but at least after the
6358 labels). If STMT is NULL, BB is split just after the labels. */
6360 static basic_block
6361 gimple_split_block (basic_block bb, void *stmt)
6363 gimple_stmt_iterator gsi;
6364 gimple_stmt_iterator gsi_tgt;
6365 gimple_seq list;
6366 basic_block new_bb;
6367 edge e;
6368 edge_iterator ei;
6370 new_bb = create_empty_bb (bb);
6372 /* Redirect the outgoing edges. */
6373 new_bb->succs = bb->succs;
6374 bb->succs = NULL;
6375 FOR_EACH_EDGE (e, ei, new_bb->succs)
6376 e->src = new_bb;
6378 /* Get a stmt iterator pointing to the first stmt to move. */
6379 if (!stmt || gimple_code ((gimple *) stmt) == GIMPLE_LABEL)
6380 gsi = gsi_after_labels (bb);
6381 else
6383 gsi = gsi_for_stmt ((gimple *) stmt);
6384 gsi_next (&gsi);
6387 /* Move everything from GSI to the new basic block. */
6388 if (gsi_end_p (gsi))
6389 return new_bb;
6391 /* Split the statement list - avoid re-creating new containers as this
6392 brings ugly quadratic memory consumption in the inliner.
6393 (We are still quadratic since we need to update stmt BB pointers,
6394 sadly.) */
6395 gsi_split_seq_before (&gsi, &list);
6396 set_bb_seq (new_bb, list);
6397 for (gsi_tgt = gsi_start (list);
6398 !gsi_end_p (gsi_tgt); gsi_next (&gsi_tgt))
6399 gimple_set_bb (gsi_stmt (gsi_tgt), new_bb);
6401 return new_bb;
6405 /* Moves basic block BB after block AFTER. */
6407 static bool
6408 gimple_move_block_after (basic_block bb, basic_block after)
6410 if (bb->prev_bb == after)
6411 return true;
6413 unlink_block (bb);
6414 link_block (bb, after);
6416 return true;
6420 /* Return TRUE if block BB has no executable statements, otherwise return
6421 FALSE. */
6423 static bool
6424 gimple_empty_block_p (basic_block bb)
6426 /* BB must have no executable statements. */
6427 gimple_stmt_iterator gsi = gsi_after_labels (bb);
6428 if (phi_nodes (bb))
6429 return false;
6430 while (!gsi_end_p (gsi))
6432 gimple *stmt = gsi_stmt (gsi);
6433 if (is_gimple_debug (stmt))
6435 else if (gimple_code (stmt) == GIMPLE_NOP
6436 || gimple_code (stmt) == GIMPLE_PREDICT)
6438 else
6439 return false;
6440 gsi_next (&gsi);
6442 return true;
6446 /* Split a basic block if it ends with a conditional branch and if the
6447 other part of the block is not empty. */
6449 static basic_block
6450 gimple_split_block_before_cond_jump (basic_block bb)
6452 gimple *last, *split_point;
6453 gimple_stmt_iterator gsi = gsi_last_nondebug_bb (bb);
6454 if (gsi_end_p (gsi))
6455 return NULL;
6456 last = gsi_stmt (gsi);
6457 if (gimple_code (last) != GIMPLE_COND
6458 && gimple_code (last) != GIMPLE_SWITCH)
6459 return NULL;
6460 gsi_prev (&gsi);
6461 split_point = gsi_stmt (gsi);
6462 return split_block (bb, split_point)->dest;
6466 /* Return true if basic_block can be duplicated. */
6468 static bool
6469 gimple_can_duplicate_bb_p (const_basic_block bb)
6471 gimple *last = last_nondebug_stmt (CONST_CAST_BB (bb));
6473 /* Do checks that can only fail for the last stmt, to minimize the work in the
6474 stmt loop. */
6475 if (last) {
6476 /* A transaction is a single entry multiple exit region. It
6477 must be duplicated in its entirety or not at all. */
6478 if (gimple_code (last) == GIMPLE_TRANSACTION)
6479 return false;
6481 /* An IFN_UNIQUE call must be duplicated as part of its group,
6482 or not at all. */
6483 if (is_gimple_call (last)
6484 && gimple_call_internal_p (last)
6485 && gimple_call_internal_unique_p (last))
6486 return false;
6489 for (gimple_stmt_iterator gsi = gsi_start_bb (CONST_CAST_BB (bb));
6490 !gsi_end_p (gsi); gsi_next (&gsi))
6492 gimple *g = gsi_stmt (gsi);
6494 /* Prohibit duplication of returns_twice calls, otherwise associated
6495 abnormal edges also need to be duplicated properly.
6496 An IFN_GOMP_SIMT_ENTER_ALLOC/IFN_GOMP_SIMT_EXIT call must be
6497 duplicated as part of its group, or not at all.
6498 The IFN_GOMP_SIMT_VOTE_ANY and IFN_GOMP_SIMT_XCHG_* are part of such a
6499 group, so the same holds there. */
6500 if (is_gimple_call (g)
6501 && (gimple_call_flags (g) & ECF_RETURNS_TWICE
6502 || gimple_call_internal_p (g, IFN_GOMP_SIMT_ENTER_ALLOC)
6503 || gimple_call_internal_p (g, IFN_GOMP_SIMT_EXIT)
6504 || gimple_call_internal_p (g, IFN_GOMP_SIMT_VOTE_ANY)
6505 || gimple_call_internal_p (g, IFN_GOMP_SIMT_XCHG_BFLY)
6506 || gimple_call_internal_p (g, IFN_GOMP_SIMT_XCHG_IDX)))
6507 return false;
6510 return true;
6513 /* Create a duplicate of the basic block BB. NOTE: This does not
6514 preserve SSA form. */
6516 static basic_block
6517 gimple_duplicate_bb (basic_block bb, copy_bb_data *id)
6519 basic_block new_bb;
6520 gimple_stmt_iterator gsi_tgt;
6522 new_bb = create_empty_bb (EXIT_BLOCK_PTR_FOR_FN (cfun)->prev_bb);
6524 /* Copy the PHI nodes. We ignore PHI node arguments here because
6525 the incoming edges have not been setup yet. */
6526 for (gphi_iterator gpi = gsi_start_phis (bb);
6527 !gsi_end_p (gpi);
6528 gsi_next (&gpi))
6530 gphi *phi, *copy;
6531 phi = gpi.phi ();
6532 copy = create_phi_node (NULL_TREE, new_bb);
6533 create_new_def_for (gimple_phi_result (phi), copy,
6534 gimple_phi_result_ptr (copy));
6535 gimple_set_uid (copy, gimple_uid (phi));
6538 gsi_tgt = gsi_start_bb (new_bb);
6539 for (gimple_stmt_iterator gsi = gsi_start_bb (bb);
6540 !gsi_end_p (gsi);
6541 gsi_next (&gsi))
6543 def_operand_p def_p;
6544 ssa_op_iter op_iter;
6545 tree lhs;
6546 gimple *stmt, *copy;
6548 stmt = gsi_stmt (gsi);
6549 if (gimple_code (stmt) == GIMPLE_LABEL)
6550 continue;
6552 /* Don't duplicate label debug stmts. */
6553 if (gimple_debug_bind_p (stmt)
6554 && TREE_CODE (gimple_debug_bind_get_var (stmt))
6555 == LABEL_DECL)
6556 continue;
6558 /* Create a new copy of STMT and duplicate STMT's virtual
6559 operands. */
6560 copy = gimple_copy (stmt);
6561 gsi_insert_after (&gsi_tgt, copy, GSI_NEW_STMT);
6563 maybe_duplicate_eh_stmt (copy, stmt);
6564 gimple_duplicate_stmt_histograms (cfun, copy, cfun, stmt);
6566 /* When copying around a stmt writing into a local non-user
6567 aggregate, make sure it won't share stack slot with other
6568 vars. */
6569 lhs = gimple_get_lhs (stmt);
6570 if (lhs && TREE_CODE (lhs) != SSA_NAME)
6572 tree base = get_base_address (lhs);
6573 if (base
6574 && (VAR_P (base) || TREE_CODE (base) == RESULT_DECL)
6575 && DECL_IGNORED_P (base)
6576 && !TREE_STATIC (base)
6577 && !DECL_EXTERNAL (base)
6578 && (!VAR_P (base) || !DECL_HAS_VALUE_EXPR_P (base)))
6579 DECL_NONSHAREABLE (base) = 1;
6582 /* If requested remap dependence info of cliques brought in
6583 via inlining. */
6584 if (id)
6585 for (unsigned i = 0; i < gimple_num_ops (copy); ++i)
6587 tree op = gimple_op (copy, i);
6588 if (!op)
6589 continue;
6590 if (TREE_CODE (op) == ADDR_EXPR
6591 || TREE_CODE (op) == WITH_SIZE_EXPR)
6592 op = TREE_OPERAND (op, 0);
6593 while (handled_component_p (op))
6594 op = TREE_OPERAND (op, 0);
6595 if ((TREE_CODE (op) == MEM_REF
6596 || TREE_CODE (op) == TARGET_MEM_REF)
6597 && MR_DEPENDENCE_CLIQUE (op) > 1
6598 && MR_DEPENDENCE_CLIQUE (op) != bb->loop_father->owned_clique)
6600 if (!id->dependence_map)
6601 id->dependence_map = new hash_map<dependence_hash,
6602 unsigned short>;
6603 bool existed;
6604 unsigned short &newc = id->dependence_map->get_or_insert
6605 (MR_DEPENDENCE_CLIQUE (op), &existed);
6606 if (!existed)
6608 gcc_assert (MR_DEPENDENCE_CLIQUE (op) <= cfun->last_clique);
6609 newc = get_new_clique (cfun);
6611 MR_DEPENDENCE_CLIQUE (op) = newc;
6615 /* Create new names for all the definitions created by COPY and
6616 add replacement mappings for each new name. */
6617 FOR_EACH_SSA_DEF_OPERAND (def_p, copy, op_iter, SSA_OP_ALL_DEFS)
6618 create_new_def_for (DEF_FROM_PTR (def_p), copy, def_p);
6621 return new_bb;
6624 /* Adds phi node arguments for edge E_COPY after basic block duplication. */
6626 static void
6627 add_phi_args_after_copy_edge (edge e_copy)
6629 basic_block bb, bb_copy = e_copy->src, dest;
6630 edge e;
6631 edge_iterator ei;
6632 gphi *phi, *phi_copy;
6633 tree def;
6634 gphi_iterator psi, psi_copy;
6636 if (gimple_seq_empty_p (phi_nodes (e_copy->dest)))
6637 return;
6639 bb = bb_copy->flags & BB_DUPLICATED ? get_bb_original (bb_copy) : bb_copy;
6641 if (e_copy->dest->flags & BB_DUPLICATED)
6642 dest = get_bb_original (e_copy->dest);
6643 else
6644 dest = e_copy->dest;
6646 e = find_edge (bb, dest);
6647 if (!e)
6649 /* During loop unrolling the target of the latch edge is copied.
6650 In this case we are not looking for edge to dest, but to
6651 duplicated block whose original was dest. */
6652 FOR_EACH_EDGE (e, ei, bb->succs)
6654 if ((e->dest->flags & BB_DUPLICATED)
6655 && get_bb_original (e->dest) == dest)
6656 break;
6659 gcc_assert (e != NULL);
6662 for (psi = gsi_start_phis (e->dest),
6663 psi_copy = gsi_start_phis (e_copy->dest);
6664 !gsi_end_p (psi);
6665 gsi_next (&psi), gsi_next (&psi_copy))
6667 phi = psi.phi ();
6668 phi_copy = psi_copy.phi ();
6669 def = PHI_ARG_DEF_FROM_EDGE (phi, e);
6670 add_phi_arg (phi_copy, def, e_copy,
6671 gimple_phi_arg_location_from_edge (phi, e));
6676 /* Basic block BB_COPY was created by code duplication. Add phi node
6677 arguments for edges going out of BB_COPY. The blocks that were
6678 duplicated have BB_DUPLICATED set. */
6680 void
6681 add_phi_args_after_copy_bb (basic_block bb_copy)
6683 edge e_copy;
6684 edge_iterator ei;
6686 FOR_EACH_EDGE (e_copy, ei, bb_copy->succs)
6688 add_phi_args_after_copy_edge (e_copy);
6692 /* Blocks in REGION_COPY array of length N_REGION were created by
6693 duplication of basic blocks. Add phi node arguments for edges
6694 going from these blocks. If E_COPY is not NULL, also add
6695 phi node arguments for its destination.*/
6697 void
6698 add_phi_args_after_copy (basic_block *region_copy, unsigned n_region,
6699 edge e_copy)
6701 unsigned i;
6703 for (i = 0; i < n_region; i++)
6704 region_copy[i]->flags |= BB_DUPLICATED;
6706 for (i = 0; i < n_region; i++)
6707 add_phi_args_after_copy_bb (region_copy[i]);
6708 if (e_copy)
6709 add_phi_args_after_copy_edge (e_copy);
6711 for (i = 0; i < n_region; i++)
6712 region_copy[i]->flags &= ~BB_DUPLICATED;
6715 /* Duplicates a REGION (set of N_REGION basic blocks) with just a single
6716 important exit edge EXIT. By important we mean that no SSA name defined
6717 inside region is live over the other exit edges of the region. All entry
6718 edges to the region must go to ENTRY->dest. The edge ENTRY is redirected
6719 to the duplicate of the region. Dominance and loop information is
6720 updated if UPDATE_DOMINANCE is true, but not the SSA web. If
6721 UPDATE_DOMINANCE is false then we assume that the caller will update the
6722 dominance information after calling this function. The new basic
6723 blocks are stored to REGION_COPY in the same order as they had in REGION,
6724 provided that REGION_COPY is not NULL.
6725 The function returns false if it is unable to copy the region,
6726 true otherwise.
6728 It is callers responsibility to update profile. */
6730 bool
6731 gimple_duplicate_seme_region (edge entry, edge exit,
6732 basic_block *region, unsigned n_region,
6733 basic_block *region_copy,
6734 bool update_dominance)
6736 unsigned i;
6737 bool free_region_copy = false, copying_header = false;
6738 class loop *loop = entry->dest->loop_father;
6739 edge exit_copy;
6740 edge redirected;
6742 if (!can_copy_bbs_p (region, n_region))
6743 return false;
6745 /* Some sanity checking. Note that we do not check for all possible
6746 missuses of the functions. I.e. if you ask to copy something weird,
6747 it will work, but the state of structures probably will not be
6748 correct. */
6749 for (i = 0; i < n_region; i++)
6751 /* We do not handle subloops, i.e. all the blocks must belong to the
6752 same loop. */
6753 if (region[i]->loop_father != loop)
6754 return false;
6756 if (region[i] != entry->dest
6757 && region[i] == loop->header)
6758 return false;
6761 /* In case the function is used for loop header copying (which is the primary
6762 use), ensure that EXIT and its copy will be new latch and entry edges. */
6763 if (loop->header == entry->dest)
6765 copying_header = true;
6767 if (!dominated_by_p (CDI_DOMINATORS, loop->latch, exit->src))
6768 return false;
6770 for (i = 0; i < n_region; i++)
6771 if (region[i] != exit->src
6772 && dominated_by_p (CDI_DOMINATORS, region[i], exit->src))
6773 return false;
6776 initialize_original_copy_tables ();
6778 if (copying_header)
6779 set_loop_copy (loop, loop_outer (loop));
6780 else
6781 set_loop_copy (loop, loop);
6783 if (!region_copy)
6785 region_copy = XNEWVEC (basic_block, n_region);
6786 free_region_copy = true;
6789 /* Record blocks outside the region that are dominated by something
6790 inside. */
6791 auto_vec<basic_block> doms;
6792 if (update_dominance)
6793 doms = get_dominated_by_region (CDI_DOMINATORS, region, n_region);
6795 copy_bbs (region, n_region, region_copy, &exit, 1, &exit_copy, loop,
6796 split_edge_bb_loc (entry), update_dominance);
6798 if (copying_header)
6800 loop->header = exit->dest;
6801 loop->latch = exit->src;
6804 /* Redirect the entry and add the phi node arguments. */
6805 redirected = redirect_edge_and_branch (entry, get_bb_copy (entry->dest));
6806 gcc_assert (redirected != NULL);
6807 flush_pending_stmts (entry);
6809 /* Concerning updating of dominators: We must recount dominators
6810 for entry block and its copy. Anything that is outside of the
6811 region, but was dominated by something inside needs recounting as
6812 well. */
6813 if (update_dominance)
6815 set_immediate_dominator (CDI_DOMINATORS, entry->dest, entry->src);
6816 doms.safe_push (get_bb_original (entry->dest));
6817 iterate_fix_dominators (CDI_DOMINATORS, doms, false);
6820 /* Add the other PHI node arguments. */
6821 add_phi_args_after_copy (region_copy, n_region, NULL);
6823 if (free_region_copy)
6824 free (region_copy);
6826 free_original_copy_tables ();
6827 return true;
6830 /* Checks if BB is part of the region defined by N_REGION BBS. */
6831 static bool
6832 bb_part_of_region_p (basic_block bb, basic_block* bbs, unsigned n_region)
6834 unsigned int n;
6836 for (n = 0; n < n_region; n++)
6838 if (bb == bbs[n])
6839 return true;
6841 return false;
6845 /* For each PHI in BB, copy the argument associated with SRC_E to TGT_E.
6846 Assuming the argument exists, just does not have a value. */
6848 void
6849 copy_phi_arg_into_existing_phi (edge src_e, edge tgt_e)
6851 int src_idx = src_e->dest_idx;
6852 int tgt_idx = tgt_e->dest_idx;
6854 /* Iterate over each PHI in e->dest. */
6855 for (gphi_iterator gsi = gsi_start_phis (src_e->dest),
6856 gsi2 = gsi_start_phis (tgt_e->dest);
6857 !gsi_end_p (gsi);
6858 gsi_next (&gsi), gsi_next (&gsi2))
6860 gphi *src_phi = gsi.phi ();
6861 gphi *dest_phi = gsi2.phi ();
6862 tree val = gimple_phi_arg_def (src_phi, src_idx);
6863 location_t locus = gimple_phi_arg_location (src_phi, src_idx);
6865 SET_PHI_ARG_DEF (dest_phi, tgt_idx, val);
6866 gimple_phi_arg_set_location (dest_phi, tgt_idx, locus);
6870 /* Duplicates REGION consisting of N_REGION blocks. The new blocks
6871 are stored to REGION_COPY in the same order in that they appear
6872 in REGION, if REGION_COPY is not NULL. ENTRY is the entry to
6873 the region, EXIT an exit from it. The condition guarding EXIT
6874 is moved to ENTRY. Returns true if duplication succeeds, false
6875 otherwise.
6877 For example,
6879 some_code;
6880 if (cond)
6882 else
6885 is transformed to
6887 if (cond)
6889 some_code;
6892 else
6894 some_code;
6899 bool
6900 gimple_duplicate_sese_tail (edge entry, edge exit,
6901 basic_block *region, unsigned n_region,
6902 basic_block *region_copy)
6904 unsigned i;
6905 bool free_region_copy = false;
6906 class loop *loop = exit->dest->loop_father;
6907 class loop *orig_loop = entry->dest->loop_father;
6908 basic_block switch_bb, entry_bb, nentry_bb;
6909 profile_count total_count = profile_count::uninitialized (),
6910 exit_count = profile_count::uninitialized ();
6911 edge exits[2], nexits[2], e;
6912 gimple_stmt_iterator gsi;
6913 edge sorig, snew;
6914 basic_block exit_bb;
6915 class loop *target, *aloop, *cloop;
6917 gcc_assert (EDGE_COUNT (exit->src->succs) == 2);
6918 exits[0] = exit;
6919 exits[1] = EDGE_SUCC (exit->src, EDGE_SUCC (exit->src, 0) == exit);
6921 if (!can_copy_bbs_p (region, n_region))
6922 return false;
6924 initialize_original_copy_tables ();
6925 set_loop_copy (orig_loop, loop);
6927 target= loop;
6928 for (aloop = orig_loop->inner; aloop; aloop = aloop->next)
6930 if (bb_part_of_region_p (aloop->header, region, n_region))
6932 cloop = duplicate_loop (aloop, target);
6933 duplicate_subloops (aloop, cloop);
6937 if (!region_copy)
6939 region_copy = XNEWVEC (basic_block, n_region);
6940 free_region_copy = true;
6943 gcc_assert (!need_ssa_update_p (cfun));
6945 /* Record blocks outside the region that are dominated by something
6946 inside. */
6947 auto_vec<basic_block> doms = get_dominated_by_region (CDI_DOMINATORS, region,
6948 n_region);
6950 total_count = exit->src->count;
6951 exit_count = exit->count ();
6952 /* Fix up corner cases, to avoid division by zero or creation of negative
6953 frequencies. */
6954 if (exit_count > total_count)
6955 exit_count = total_count;
6957 copy_bbs (region, n_region, region_copy, exits, 2, nexits, orig_loop,
6958 split_edge_bb_loc (exit), true);
6959 if (total_count.initialized_p () && exit_count.initialized_p ())
6961 scale_bbs_frequencies_profile_count (region, n_region,
6962 total_count - exit_count,
6963 total_count);
6964 scale_bbs_frequencies_profile_count (region_copy, n_region, exit_count,
6965 total_count);
6968 /* Create the switch block, and put the exit condition to it. */
6969 entry_bb = entry->dest;
6970 nentry_bb = get_bb_copy (entry_bb);
6971 if (!*gsi_last_bb (entry->src)
6972 || !stmt_ends_bb_p (*gsi_last_bb (entry->src)))
6973 switch_bb = entry->src;
6974 else
6975 switch_bb = split_edge (entry);
6976 set_immediate_dominator (CDI_DOMINATORS, nentry_bb, switch_bb);
6978 gcond *cond_stmt = as_a <gcond *> (*gsi_last_bb (exit->src));
6979 cond_stmt = as_a <gcond *> (gimple_copy (cond_stmt));
6981 gsi = gsi_last_bb (switch_bb);
6982 gsi_insert_after (&gsi, cond_stmt, GSI_NEW_STMT);
6984 sorig = single_succ_edge (switch_bb);
6985 sorig->flags = exits[1]->flags;
6986 sorig->probability = exits[1]->probability;
6987 snew = make_edge (switch_bb, nentry_bb, exits[0]->flags);
6988 snew->probability = exits[0]->probability;
6991 /* Register the new edge from SWITCH_BB in loop exit lists. */
6992 rescan_loop_exit (snew, true, false);
6994 /* Add the PHI node arguments. */
6995 add_phi_args_after_copy (region_copy, n_region, snew);
6997 /* Get rid of now superfluous conditions and associated edges (and phi node
6998 arguments). */
6999 exit_bb = exit->dest;
7001 e = redirect_edge_and_branch (exits[0], exits[1]->dest);
7002 PENDING_STMT (e) = NULL;
7004 /* The latch of ORIG_LOOP was copied, and so was the backedge
7005 to the original header. We redirect this backedge to EXIT_BB. */
7006 for (i = 0; i < n_region; i++)
7007 if (get_bb_original (region_copy[i]) == orig_loop->latch)
7009 gcc_assert (single_succ_edge (region_copy[i]));
7010 e = redirect_edge_and_branch (single_succ_edge (region_copy[i]), exit_bb);
7011 PENDING_STMT (e) = NULL;
7012 copy_phi_arg_into_existing_phi (nexits[0], e);
7014 e = redirect_edge_and_branch (nexits[1], nexits[0]->dest);
7015 PENDING_STMT (e) = NULL;
7017 /* Anything that is outside of the region, but was dominated by something
7018 inside needs to update dominance info. */
7019 iterate_fix_dominators (CDI_DOMINATORS, doms, false);
7021 if (free_region_copy)
7022 free (region_copy);
7024 free_original_copy_tables ();
7025 return true;
7028 /* Add all the blocks dominated by ENTRY to the array BBS_P. Stop
7029 adding blocks when the dominator traversal reaches EXIT. This
7030 function silently assumes that ENTRY strictly dominates EXIT. */
7032 void
7033 gather_blocks_in_sese_region (basic_block entry, basic_block exit,
7034 vec<basic_block> *bbs_p)
7036 basic_block son;
7038 for (son = first_dom_son (CDI_DOMINATORS, entry);
7039 son;
7040 son = next_dom_son (CDI_DOMINATORS, son))
7042 bbs_p->safe_push (son);
7043 if (son != exit)
7044 gather_blocks_in_sese_region (son, exit, bbs_p);
7048 /* Replaces *TP with a duplicate (belonging to function TO_CONTEXT).
7049 The duplicates are recorded in VARS_MAP. */
7051 static void
7052 replace_by_duplicate_decl (tree *tp, hash_map<tree, tree> *vars_map,
7053 tree to_context)
7055 tree t = *tp, new_t;
7056 struct function *f = DECL_STRUCT_FUNCTION (to_context);
7058 if (DECL_CONTEXT (t) == to_context)
7059 return;
7061 bool existed;
7062 tree &loc = vars_map->get_or_insert (t, &existed);
7064 if (!existed)
7066 if (SSA_VAR_P (t))
7068 new_t = copy_var_decl (t, DECL_NAME (t), TREE_TYPE (t));
7069 add_local_decl (f, new_t);
7071 else
7073 gcc_assert (TREE_CODE (t) == CONST_DECL);
7074 new_t = copy_node (t);
7076 DECL_CONTEXT (new_t) = to_context;
7078 loc = new_t;
7080 else
7081 new_t = loc;
7083 *tp = new_t;
7087 /* Creates an ssa name in TO_CONTEXT equivalent to NAME.
7088 VARS_MAP maps old ssa names and var_decls to the new ones. */
7090 static tree
7091 replace_ssa_name (tree name, hash_map<tree, tree> *vars_map,
7092 tree to_context)
7094 tree new_name;
7096 gcc_assert (!virtual_operand_p (name));
7098 tree *loc = vars_map->get (name);
7100 if (!loc)
7102 tree decl = SSA_NAME_VAR (name);
7103 if (decl)
7105 gcc_assert (!SSA_NAME_IS_DEFAULT_DEF (name));
7106 replace_by_duplicate_decl (&decl, vars_map, to_context);
7107 new_name = make_ssa_name_fn (DECL_STRUCT_FUNCTION (to_context),
7108 decl, SSA_NAME_DEF_STMT (name));
7110 else
7111 new_name = copy_ssa_name_fn (DECL_STRUCT_FUNCTION (to_context),
7112 name, SSA_NAME_DEF_STMT (name));
7114 /* Now that we've used the def stmt to define new_name, make sure it
7115 doesn't define name anymore. */
7116 SSA_NAME_DEF_STMT (name) = NULL;
7118 vars_map->put (name, new_name);
7120 else
7121 new_name = *loc;
7123 return new_name;
7126 struct move_stmt_d
7128 tree orig_block;
7129 tree new_block;
7130 tree from_context;
7131 tree to_context;
7132 hash_map<tree, tree> *vars_map;
7133 htab_t new_label_map;
7134 hash_map<void *, void *> *eh_map;
7135 bool remap_decls_p;
7138 /* Helper for move_block_to_fn. Set TREE_BLOCK in every expression
7139 contained in *TP if it has been ORIG_BLOCK previously and change the
7140 DECL_CONTEXT of every local variable referenced in *TP. */
7142 static tree
7143 move_stmt_op (tree *tp, int *walk_subtrees, void *data)
7145 struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
7146 struct move_stmt_d *p = (struct move_stmt_d *) wi->info;
7147 tree t = *tp;
7149 if (EXPR_P (t))
7151 tree block = TREE_BLOCK (t);
7152 if (block == NULL_TREE)
7154 else if (block == p->orig_block
7155 || p->orig_block == NULL_TREE)
7157 /* tree_node_can_be_shared says we can share invariant
7158 addresses but unshare_expr copies them anyways. Make sure
7159 to unshare before adjusting the block in place - we do not
7160 always see a copy here. */
7161 if (TREE_CODE (t) == ADDR_EXPR
7162 && is_gimple_min_invariant (t))
7163 *tp = t = unshare_expr (t);
7164 TREE_SET_BLOCK (t, p->new_block);
7166 else if (flag_checking)
7168 while (block && TREE_CODE (block) == BLOCK && block != p->orig_block)
7169 block = BLOCK_SUPERCONTEXT (block);
7170 gcc_assert (block == p->orig_block);
7173 else if (DECL_P (t) || TREE_CODE (t) == SSA_NAME)
7175 if (TREE_CODE (t) == SSA_NAME)
7176 *tp = replace_ssa_name (t, p->vars_map, p->to_context);
7177 else if (TREE_CODE (t) == PARM_DECL
7178 && gimple_in_ssa_p (cfun))
7179 *tp = *(p->vars_map->get (t));
7180 else if (TREE_CODE (t) == LABEL_DECL)
7182 if (p->new_label_map)
7184 struct tree_map in, *out;
7185 in.base.from = t;
7186 out = (struct tree_map *)
7187 htab_find_with_hash (p->new_label_map, &in, DECL_UID (t));
7188 if (out)
7189 *tp = t = out->to;
7192 /* For FORCED_LABELs we can end up with references from other
7193 functions if some SESE regions are outlined. It is UB to
7194 jump in between them, but they could be used just for printing
7195 addresses etc. In that case, DECL_CONTEXT on the label should
7196 be the function containing the glabel stmt with that LABEL_DECL,
7197 rather than whatever function a reference to the label was seen
7198 last time. */
7199 if (!FORCED_LABEL (t) && !DECL_NONLOCAL (t))
7200 DECL_CONTEXT (t) = p->to_context;
7202 else if (p->remap_decls_p)
7204 /* Replace T with its duplicate. T should no longer appear in the
7205 parent function, so this looks wasteful; however, it may appear
7206 in referenced_vars, and more importantly, as virtual operands of
7207 statements, and in alias lists of other variables. It would be
7208 quite difficult to expunge it from all those places. ??? It might
7209 suffice to do this for addressable variables. */
7210 if ((VAR_P (t) && !is_global_var (t))
7211 || TREE_CODE (t) == CONST_DECL)
7212 replace_by_duplicate_decl (tp, p->vars_map, p->to_context);
7214 *walk_subtrees = 0;
7216 else if (TYPE_P (t))
7217 *walk_subtrees = 0;
7219 return NULL_TREE;
7222 /* Helper for move_stmt_r. Given an EH region number for the source
7223 function, map that to the duplicate EH regio number in the dest. */
7225 static int
7226 move_stmt_eh_region_nr (int old_nr, struct move_stmt_d *p)
7228 eh_region old_r, new_r;
7230 old_r = get_eh_region_from_number (old_nr);
7231 new_r = static_cast<eh_region> (*p->eh_map->get (old_r));
7233 return new_r->index;
7236 /* Similar, but operate on INTEGER_CSTs. */
7238 static tree
7239 move_stmt_eh_region_tree_nr (tree old_t_nr, struct move_stmt_d *p)
7241 int old_nr, new_nr;
7243 old_nr = tree_to_shwi (old_t_nr);
7244 new_nr = move_stmt_eh_region_nr (old_nr, p);
7246 return build_int_cst (integer_type_node, new_nr);
7249 /* Like move_stmt_op, but for gimple statements.
7251 Helper for move_block_to_fn. Set GIMPLE_BLOCK in every expression
7252 contained in the current statement in *GSI_P and change the
7253 DECL_CONTEXT of every local variable referenced in the current
7254 statement. */
7256 static tree
7257 move_stmt_r (gimple_stmt_iterator *gsi_p, bool *handled_ops_p,
7258 struct walk_stmt_info *wi)
7260 struct move_stmt_d *p = (struct move_stmt_d *) wi->info;
7261 gimple *stmt = gsi_stmt (*gsi_p);
7262 tree block = gimple_block (stmt);
7264 if (block == p->orig_block
7265 || (p->orig_block == NULL_TREE
7266 && block != NULL_TREE))
7267 gimple_set_block (stmt, p->new_block);
7269 switch (gimple_code (stmt))
7271 case GIMPLE_CALL:
7272 /* Remap the region numbers for __builtin_eh_{pointer,filter}. */
7274 tree r, fndecl = gimple_call_fndecl (stmt);
7275 if (fndecl && fndecl_built_in_p (fndecl, BUILT_IN_NORMAL))
7276 switch (DECL_FUNCTION_CODE (fndecl))
7278 case BUILT_IN_EH_COPY_VALUES:
7279 r = gimple_call_arg (stmt, 1);
7280 r = move_stmt_eh_region_tree_nr (r, p);
7281 gimple_call_set_arg (stmt, 1, r);
7282 /* FALLTHRU */
7284 case BUILT_IN_EH_POINTER:
7285 case BUILT_IN_EH_FILTER:
7286 r = gimple_call_arg (stmt, 0);
7287 r = move_stmt_eh_region_tree_nr (r, p);
7288 gimple_call_set_arg (stmt, 0, r);
7289 break;
7291 default:
7292 break;
7295 break;
7297 case GIMPLE_RESX:
7299 gresx *resx_stmt = as_a <gresx *> (stmt);
7300 int r = gimple_resx_region (resx_stmt);
7301 r = move_stmt_eh_region_nr (r, p);
7302 gimple_resx_set_region (resx_stmt, r);
7304 break;
7306 case GIMPLE_EH_DISPATCH:
7308 geh_dispatch *eh_dispatch_stmt = as_a <geh_dispatch *> (stmt);
7309 int r = gimple_eh_dispatch_region (eh_dispatch_stmt);
7310 r = move_stmt_eh_region_nr (r, p);
7311 gimple_eh_dispatch_set_region (eh_dispatch_stmt, r);
7313 break;
7315 case GIMPLE_OMP_RETURN:
7316 case GIMPLE_OMP_CONTINUE:
7317 break;
7319 case GIMPLE_LABEL:
7321 /* For FORCED_LABEL, move_stmt_op doesn't adjust DECL_CONTEXT,
7322 so that such labels can be referenced from other regions.
7323 Make sure to update it when seeing a GIMPLE_LABEL though,
7324 that is the owner of the label. */
7325 walk_gimple_op (stmt, move_stmt_op, wi);
7326 *handled_ops_p = true;
7327 tree label = gimple_label_label (as_a <glabel *> (stmt));
7328 if (FORCED_LABEL (label) || DECL_NONLOCAL (label))
7329 DECL_CONTEXT (label) = p->to_context;
7331 break;
7333 default:
7334 if (is_gimple_omp (stmt))
7336 /* Do not remap variables inside OMP directives. Variables
7337 referenced in clauses and directive header belong to the
7338 parent function and should not be moved into the child
7339 function. */
7340 bool save_remap_decls_p = p->remap_decls_p;
7341 p->remap_decls_p = false;
7342 *handled_ops_p = true;
7344 walk_gimple_seq_mod (gimple_omp_body_ptr (stmt), move_stmt_r,
7345 move_stmt_op, wi);
7347 p->remap_decls_p = save_remap_decls_p;
7349 break;
7352 return NULL_TREE;
7355 /* Move basic block BB from function CFUN to function DEST_FN. The
7356 block is moved out of the original linked list and placed after
7357 block AFTER in the new list. Also, the block is removed from the
7358 original array of blocks and placed in DEST_FN's array of blocks.
7359 If UPDATE_EDGE_COUNT_P is true, the edge counts on both CFGs is
7360 updated to reflect the moved edges.
7362 The local variables are remapped to new instances, VARS_MAP is used
7363 to record the mapping. */
7365 static void
7366 move_block_to_fn (struct function *dest_cfun, basic_block bb,
7367 basic_block after, bool update_edge_count_p,
7368 struct move_stmt_d *d)
7370 struct control_flow_graph *cfg;
7371 edge_iterator ei;
7372 edge e;
7373 gimple_stmt_iterator si;
7374 unsigned old_len;
7376 /* Remove BB from dominance structures. */
7377 delete_from_dominance_info (CDI_DOMINATORS, bb);
7379 /* Move BB from its current loop to the copy in the new function. */
7380 if (current_loops)
7382 class loop *new_loop = (class loop *)bb->loop_father->aux;
7383 if (new_loop)
7384 bb->loop_father = new_loop;
7387 /* Link BB to the new linked list. */
7388 move_block_after (bb, after);
7390 /* Update the edge count in the corresponding flowgraphs. */
7391 if (update_edge_count_p)
7392 FOR_EACH_EDGE (e, ei, bb->succs)
7394 cfun->cfg->x_n_edges--;
7395 dest_cfun->cfg->x_n_edges++;
7398 /* Remove BB from the original basic block array. */
7399 (*cfun->cfg->x_basic_block_info)[bb->index] = NULL;
7400 cfun->cfg->x_n_basic_blocks--;
7402 /* Grow DEST_CFUN's basic block array if needed. */
7403 cfg = dest_cfun->cfg;
7404 cfg->x_n_basic_blocks++;
7405 if (bb->index >= cfg->x_last_basic_block)
7406 cfg->x_last_basic_block = bb->index + 1;
7408 old_len = vec_safe_length (cfg->x_basic_block_info);
7409 if ((unsigned) cfg->x_last_basic_block >= old_len)
7410 vec_safe_grow_cleared (cfg->x_basic_block_info,
7411 cfg->x_last_basic_block + 1);
7413 (*cfg->x_basic_block_info)[bb->index] = bb;
7415 /* Remap the variables in phi nodes. */
7416 for (gphi_iterator psi = gsi_start_phis (bb);
7417 !gsi_end_p (psi); )
7419 gphi *phi = psi.phi ();
7420 use_operand_p use;
7421 tree op = PHI_RESULT (phi);
7422 ssa_op_iter oi;
7423 unsigned i;
7425 if (virtual_operand_p (op))
7427 /* Remove the phi nodes for virtual operands (alias analysis will be
7428 run for the new function, anyway). But replace all uses that
7429 might be outside of the region we move. */
7430 use_operand_p use_p;
7431 imm_use_iterator iter;
7432 gimple *use_stmt;
7433 FOR_EACH_IMM_USE_STMT (use_stmt, iter, op)
7434 FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
7435 SET_USE (use_p, SSA_NAME_VAR (op));
7436 remove_phi_node (&psi, true);
7437 continue;
7440 SET_PHI_RESULT (phi,
7441 replace_ssa_name (op, d->vars_map, dest_cfun->decl));
7442 FOR_EACH_PHI_ARG (use, phi, oi, SSA_OP_USE)
7444 op = USE_FROM_PTR (use);
7445 if (TREE_CODE (op) == SSA_NAME)
7446 SET_USE (use, replace_ssa_name (op, d->vars_map, dest_cfun->decl));
7449 for (i = 0; i < EDGE_COUNT (bb->preds); i++)
7451 location_t locus = gimple_phi_arg_location (phi, i);
7452 tree block = LOCATION_BLOCK (locus);
7454 if (locus == UNKNOWN_LOCATION)
7455 continue;
7456 if (d->orig_block == NULL_TREE || block == d->orig_block)
7458 locus = set_block (locus, d->new_block);
7459 gimple_phi_arg_set_location (phi, i, locus);
7463 gsi_next (&psi);
7466 for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
7468 gimple *stmt = gsi_stmt (si);
7469 struct walk_stmt_info wi;
7471 memset (&wi, 0, sizeof (wi));
7472 wi.info = d;
7473 walk_gimple_stmt (&si, move_stmt_r, move_stmt_op, &wi);
7475 if (glabel *label_stmt = dyn_cast <glabel *> (stmt))
7477 tree label = gimple_label_label (label_stmt);
7478 int uid = LABEL_DECL_UID (label);
7480 gcc_assert (uid > -1);
7482 old_len = vec_safe_length (cfg->x_label_to_block_map);
7483 if (old_len <= (unsigned) uid)
7484 vec_safe_grow_cleared (cfg->x_label_to_block_map, uid + 1);
7486 (*cfg->x_label_to_block_map)[uid] = bb;
7487 (*cfun->cfg->x_label_to_block_map)[uid] = NULL;
7489 gcc_assert (DECL_CONTEXT (label) == dest_cfun->decl);
7491 if (uid >= dest_cfun->cfg->last_label_uid)
7492 dest_cfun->cfg->last_label_uid = uid + 1;
7495 maybe_duplicate_eh_stmt_fn (dest_cfun, stmt, cfun, stmt, d->eh_map, 0);
7496 remove_stmt_from_eh_lp_fn (cfun, stmt);
7498 gimple_duplicate_stmt_histograms (dest_cfun, stmt, cfun, stmt);
7499 gimple_remove_stmt_histograms (cfun, stmt);
7501 /* We cannot leave any operands allocated from the operand caches of
7502 the current function. */
7503 free_stmt_operands (cfun, stmt);
7504 push_cfun (dest_cfun);
7505 update_stmt (stmt);
7506 if (is_gimple_call (stmt))
7507 notice_special_calls (as_a <gcall *> (stmt));
7508 pop_cfun ();
7511 FOR_EACH_EDGE (e, ei, bb->succs)
7512 if (e->goto_locus != UNKNOWN_LOCATION)
7514 tree block = LOCATION_BLOCK (e->goto_locus);
7515 if (d->orig_block == NULL_TREE
7516 || block == d->orig_block)
7517 e->goto_locus = set_block (e->goto_locus, d->new_block);
7521 /* Examine the statements in BB (which is in SRC_CFUN); find and return
7522 the outermost EH region. Use REGION as the incoming base EH region.
7523 If there is no single outermost region, return NULL and set *ALL to
7524 true. */
7526 static eh_region
7527 find_outermost_region_in_block (struct function *src_cfun,
7528 basic_block bb, eh_region region,
7529 bool *all)
7531 gimple_stmt_iterator si;
7533 for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
7535 gimple *stmt = gsi_stmt (si);
7536 eh_region stmt_region;
7537 int lp_nr;
7539 lp_nr = lookup_stmt_eh_lp_fn (src_cfun, stmt);
7540 stmt_region = get_eh_region_from_lp_number_fn (src_cfun, lp_nr);
7541 if (stmt_region)
7543 if (region == NULL)
7544 region = stmt_region;
7545 else if (stmt_region != region)
7547 region = eh_region_outermost (src_cfun, stmt_region, region);
7548 if (region == NULL)
7550 *all = true;
7551 return NULL;
7557 return region;
7560 static tree
7561 new_label_mapper (tree decl, void *data)
7563 htab_t hash = (htab_t) data;
7564 struct tree_map *m;
7565 void **slot;
7567 gcc_assert (TREE_CODE (decl) == LABEL_DECL);
7569 m = XNEW (struct tree_map);
7570 m->hash = DECL_UID (decl);
7571 m->base.from = decl;
7572 m->to = create_artificial_label (UNKNOWN_LOCATION);
7573 LABEL_DECL_UID (m->to) = LABEL_DECL_UID (decl);
7574 if (LABEL_DECL_UID (m->to) >= cfun->cfg->last_label_uid)
7575 cfun->cfg->last_label_uid = LABEL_DECL_UID (m->to) + 1;
7577 slot = htab_find_slot_with_hash (hash, m, m->hash, INSERT);
7578 gcc_assert (*slot == NULL);
7580 *slot = m;
7582 return m->to;
7585 /* Tree walker to replace the decls used inside value expressions by
7586 duplicates. */
7588 static tree
7589 replace_block_vars_by_duplicates_1 (tree *tp, int *walk_subtrees, void *data)
7591 struct replace_decls_d *rd = (struct replace_decls_d *)data;
7593 switch (TREE_CODE (*tp))
7595 case VAR_DECL:
7596 case PARM_DECL:
7597 case RESULT_DECL:
7598 replace_by_duplicate_decl (tp, rd->vars_map, rd->to_context);
7599 break;
7600 default:
7601 break;
7604 if (IS_TYPE_OR_DECL_P (*tp))
7605 *walk_subtrees = false;
7607 return NULL;
7610 /* Change DECL_CONTEXT of all BLOCK_VARS in block, including
7611 subblocks. */
7613 static void
7614 replace_block_vars_by_duplicates (tree block, hash_map<tree, tree> *vars_map,
7615 tree to_context)
7617 tree *tp, t;
7619 for (tp = &BLOCK_VARS (block); *tp; tp = &DECL_CHAIN (*tp))
7621 t = *tp;
7622 if (!VAR_P (t) && TREE_CODE (t) != CONST_DECL)
7623 continue;
7624 replace_by_duplicate_decl (&t, vars_map, to_context);
7625 if (t != *tp)
7627 if (VAR_P (*tp) && DECL_HAS_VALUE_EXPR_P (*tp))
7629 tree x = DECL_VALUE_EXPR (*tp);
7630 struct replace_decls_d rd = { vars_map, to_context };
7631 unshare_expr (x);
7632 walk_tree (&x, replace_block_vars_by_duplicates_1, &rd, NULL);
7633 SET_DECL_VALUE_EXPR (t, x);
7634 DECL_HAS_VALUE_EXPR_P (t) = 1;
7636 DECL_CHAIN (t) = DECL_CHAIN (*tp);
7637 *tp = t;
7641 for (block = BLOCK_SUBBLOCKS (block); block; block = BLOCK_CHAIN (block))
7642 replace_block_vars_by_duplicates (block, vars_map, to_context);
7645 /* Fixup the loop arrays and numbers after moving LOOP and its subloops
7646 from FN1 to FN2. */
7648 static void
7649 fixup_loop_arrays_after_move (struct function *fn1, struct function *fn2,
7650 class loop *loop)
7652 /* Discard it from the old loop array. */
7653 (*get_loops (fn1))[loop->num] = NULL;
7655 /* Place it in the new loop array, assigning it a new number. */
7656 loop->num = number_of_loops (fn2);
7657 vec_safe_push (loops_for_fn (fn2)->larray, loop);
7659 /* Recurse to children. */
7660 for (loop = loop->inner; loop; loop = loop->next)
7661 fixup_loop_arrays_after_move (fn1, fn2, loop);
7664 /* Verify that the blocks in BBS_P are a single-entry, single-exit region
7665 delimited by ENTRY_BB and EXIT_BB, possibly containing noreturn blocks. */
7667 DEBUG_FUNCTION void
7668 verify_sese (basic_block entry, basic_block exit, vec<basic_block> *bbs_p)
7670 basic_block bb;
7671 edge_iterator ei;
7672 edge e;
7673 bitmap bbs = BITMAP_ALLOC (NULL);
7674 int i;
7676 gcc_assert (entry != NULL);
7677 gcc_assert (entry != exit);
7678 gcc_assert (bbs_p != NULL);
7680 gcc_assert (bbs_p->length () > 0);
7682 FOR_EACH_VEC_ELT (*bbs_p, i, bb)
7683 bitmap_set_bit (bbs, bb->index);
7685 gcc_assert (bitmap_bit_p (bbs, entry->index));
7686 gcc_assert (exit == NULL || bitmap_bit_p (bbs, exit->index));
7688 FOR_EACH_VEC_ELT (*bbs_p, i, bb)
7690 if (bb == entry)
7692 gcc_assert (single_pred_p (entry));
7693 gcc_assert (!bitmap_bit_p (bbs, single_pred (entry)->index));
7695 else
7696 for (ei = ei_start (bb->preds); !ei_end_p (ei); ei_next (&ei))
7698 e = ei_edge (ei);
7699 gcc_assert (bitmap_bit_p (bbs, e->src->index));
7702 if (bb == exit)
7704 gcc_assert (single_succ_p (exit));
7705 gcc_assert (!bitmap_bit_p (bbs, single_succ (exit)->index));
7707 else
7708 for (ei = ei_start (bb->succs); !ei_end_p (ei); ei_next (&ei))
7710 e = ei_edge (ei);
7711 gcc_assert (bitmap_bit_p (bbs, e->dest->index));
7715 BITMAP_FREE (bbs);
7718 /* If FROM is an SSA_NAME, mark the version in bitmap DATA. */
7720 bool
7721 gather_ssa_name_hash_map_from (tree const &from, tree const &, void *data)
7723 bitmap release_names = (bitmap)data;
7725 if (TREE_CODE (from) != SSA_NAME)
7726 return true;
7728 bitmap_set_bit (release_names, SSA_NAME_VERSION (from));
7729 return true;
7732 /* Return LOOP_DIST_ALIAS call if present in BB. */
7734 static gimple *
7735 find_loop_dist_alias (basic_block bb)
7737 gimple_stmt_iterator gsi = gsi_last_bb (bb);
7738 if (!safe_is_a <gcond *> (*gsi))
7739 return NULL;
7741 gsi_prev (&gsi);
7742 if (gsi_end_p (gsi))
7743 return NULL;
7745 gimple *g = gsi_stmt (gsi);
7746 if (gimple_call_internal_p (g, IFN_LOOP_DIST_ALIAS))
7747 return g;
7748 return NULL;
7751 /* Fold loop internal call G like IFN_LOOP_VECTORIZED/IFN_LOOP_DIST_ALIAS
7752 to VALUE and update any immediate uses of it's LHS. */
7754 void
7755 fold_loop_internal_call (gimple *g, tree value)
7757 tree lhs = gimple_call_lhs (g);
7758 use_operand_p use_p;
7759 imm_use_iterator iter;
7760 gimple *use_stmt;
7761 gimple_stmt_iterator gsi = gsi_for_stmt (g);
7763 replace_call_with_value (&gsi, value);
7764 FOR_EACH_IMM_USE_STMT (use_stmt, iter, lhs)
7766 FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
7767 SET_USE (use_p, value);
7768 update_stmt (use_stmt);
7769 /* If we turn conditional to constant, scale profile counts.
7770 We know that the conditional was created by loop distribution
7771 and all basic blocks dominated by the taken edge are part of
7772 the loop distributed. */
7773 if (gimple_code (use_stmt) == GIMPLE_COND)
7775 edge true_edge, false_edge;
7776 extract_true_false_edges_from_block (gimple_bb (use_stmt),
7777 &true_edge, &false_edge);
7778 edge taken_edge = NULL, other_edge = NULL;
7779 if (gimple_cond_true_p (as_a <gcond *>(use_stmt)))
7781 taken_edge = true_edge;
7782 other_edge = false_edge;
7784 else if (gimple_cond_false_p (as_a <gcond *>(use_stmt)))
7786 taken_edge = false_edge;
7787 other_edge = true_edge;
7789 if (taken_edge
7790 && !(taken_edge->probability == profile_probability::always ()))
7792 profile_count old_count = taken_edge->count ();
7793 profile_count new_count = taken_edge->src->count;
7794 taken_edge->probability = profile_probability::always ();
7795 other_edge->probability = profile_probability::never ();
7796 /* If we have multiple predecessors, we can't use the dominance
7797 test. This should not happen as the guarded code should
7798 start with pre-header. */
7799 gcc_assert (single_pred_edge (taken_edge->dest));
7800 if (old_count.nonzero_p ())
7802 taken_edge->dest->count
7803 = taken_edge->dest->count.apply_scale (new_count,
7804 old_count);
7805 scale_strictly_dominated_blocks (taken_edge->dest,
7806 new_count, old_count);
7813 /* Move a single-entry, single-exit region delimited by ENTRY_BB and
7814 EXIT_BB to function DEST_CFUN. The whole region is replaced by a
7815 single basic block in the original CFG and the new basic block is
7816 returned. DEST_CFUN must not have a CFG yet.
7818 Note that the region need not be a pure SESE region. Blocks inside
7819 the region may contain calls to abort/exit. The only restriction
7820 is that ENTRY_BB should be the only entry point and it must
7821 dominate EXIT_BB.
7823 Change TREE_BLOCK of all statements in ORIG_BLOCK to the new
7824 functions outermost BLOCK, move all subblocks of ORIG_BLOCK
7825 to the new function.
7827 All local variables referenced in the region are assumed to be in
7828 the corresponding BLOCK_VARS and unexpanded variable lists
7829 associated with DEST_CFUN.
7831 TODO: investigate whether we can reuse gimple_duplicate_sese_region to
7832 reimplement move_sese_region_to_fn by duplicating the region rather than
7833 moving it. */
7835 basic_block
7836 move_sese_region_to_fn (struct function *dest_cfun, basic_block entry_bb,
7837 basic_block exit_bb, tree orig_block)
7839 vec<basic_block> bbs;
7840 basic_block dom_entry = get_immediate_dominator (CDI_DOMINATORS, entry_bb);
7841 basic_block after, bb, *entry_pred, *exit_succ, abb;
7842 struct function *saved_cfun = cfun;
7843 int *entry_flag, *exit_flag;
7844 profile_probability *entry_prob, *exit_prob;
7845 unsigned i, num_entry_edges, num_exit_edges, num_nodes;
7846 edge e;
7847 edge_iterator ei;
7848 htab_t new_label_map;
7849 hash_map<void *, void *> *eh_map;
7850 class loop *loop = entry_bb->loop_father;
7851 class loop *loop0 = get_loop (saved_cfun, 0);
7852 struct move_stmt_d d;
7854 /* If ENTRY does not strictly dominate EXIT, this cannot be an SESE
7855 region. */
7856 gcc_assert (entry_bb != exit_bb
7857 && (!exit_bb
7858 || dominated_by_p (CDI_DOMINATORS, exit_bb, entry_bb)));
7860 /* Collect all the blocks in the region. Manually add ENTRY_BB
7861 because it won't be added by dfs_enumerate_from. */
7862 bbs.create (0);
7863 bbs.safe_push (entry_bb);
7864 gather_blocks_in_sese_region (entry_bb, exit_bb, &bbs);
7866 if (flag_checking)
7867 verify_sese (entry_bb, exit_bb, &bbs);
7869 /* The blocks that used to be dominated by something in BBS will now be
7870 dominated by the new block. */
7871 auto_vec<basic_block> dom_bbs = get_dominated_by_region (CDI_DOMINATORS,
7872 bbs.address (),
7873 bbs.length ());
7875 /* Detach ENTRY_BB and EXIT_BB from CFUN->CFG. We need to remember
7876 the predecessor edges to ENTRY_BB and the successor edges to
7877 EXIT_BB so that we can re-attach them to the new basic block that
7878 will replace the region. */
7879 num_entry_edges = EDGE_COUNT (entry_bb->preds);
7880 entry_pred = XNEWVEC (basic_block, num_entry_edges);
7881 entry_flag = XNEWVEC (int, num_entry_edges);
7882 entry_prob = XNEWVEC (profile_probability, num_entry_edges);
7883 i = 0;
7884 for (ei = ei_start (entry_bb->preds); (e = ei_safe_edge (ei)) != NULL;)
7886 entry_prob[i] = e->probability;
7887 entry_flag[i] = e->flags;
7888 entry_pred[i++] = e->src;
7889 remove_edge (e);
7892 if (exit_bb)
7894 num_exit_edges = EDGE_COUNT (exit_bb->succs);
7895 exit_succ = XNEWVEC (basic_block, num_exit_edges);
7896 exit_flag = XNEWVEC (int, num_exit_edges);
7897 exit_prob = XNEWVEC (profile_probability, num_exit_edges);
7898 i = 0;
7899 for (ei = ei_start (exit_bb->succs); (e = ei_safe_edge (ei)) != NULL;)
7901 exit_prob[i] = e->probability;
7902 exit_flag[i] = e->flags;
7903 exit_succ[i++] = e->dest;
7904 remove_edge (e);
7907 else
7909 num_exit_edges = 0;
7910 exit_succ = NULL;
7911 exit_flag = NULL;
7912 exit_prob = NULL;
7915 /* Switch context to the child function to initialize DEST_FN's CFG. */
7916 gcc_assert (dest_cfun->cfg == NULL);
7917 push_cfun (dest_cfun);
7919 init_empty_tree_cfg ();
7921 /* Initialize EH information for the new function. */
7922 eh_map = NULL;
7923 new_label_map = NULL;
7924 if (saved_cfun->eh)
7926 eh_region region = NULL;
7927 bool all = false;
7929 FOR_EACH_VEC_ELT (bbs, i, bb)
7931 region = find_outermost_region_in_block (saved_cfun, bb, region, &all);
7932 if (all)
7933 break;
7936 init_eh_for_function ();
7937 if (region != NULL || all)
7939 new_label_map = htab_create (17, tree_map_hash, tree_map_eq, free);
7940 eh_map = duplicate_eh_regions (saved_cfun, region, 0,
7941 new_label_mapper, new_label_map);
7945 /* Initialize an empty loop tree. */
7946 struct loops *loops = ggc_cleared_alloc<struct loops> ();
7947 init_loops_structure (dest_cfun, loops, 1);
7948 loops->state = LOOPS_MAY_HAVE_MULTIPLE_LATCHES;
7949 set_loops_for_fn (dest_cfun, loops);
7951 vec<loop_p, va_gc> *larray = get_loops (saved_cfun)->copy ();
7953 /* Move the outlined loop tree part. */
7954 num_nodes = bbs.length ();
7955 FOR_EACH_VEC_ELT (bbs, i, bb)
7957 if (bb->loop_father->header == bb)
7959 class loop *this_loop = bb->loop_father;
7960 /* Avoid the need to remap SSA names used in nb_iterations. */
7961 free_numbers_of_iterations_estimates (this_loop);
7962 class loop *outer = loop_outer (this_loop);
7963 if (outer == loop
7964 /* If the SESE region contains some bbs ending with
7965 a noreturn call, those are considered to belong
7966 to the outermost loop in saved_cfun, rather than
7967 the entry_bb's loop_father. */
7968 || outer == loop0)
7970 if (outer != loop)
7971 num_nodes -= this_loop->num_nodes;
7972 flow_loop_tree_node_remove (bb->loop_father);
7973 flow_loop_tree_node_add (get_loop (dest_cfun, 0), this_loop);
7974 fixup_loop_arrays_after_move (saved_cfun, cfun, this_loop);
7977 else if (bb->loop_father == loop0 && loop0 != loop)
7978 num_nodes--;
7980 /* Remove loop exits from the outlined region. */
7981 if (loops_for_fn (saved_cfun)->exits)
7982 FOR_EACH_EDGE (e, ei, bb->succs)
7984 struct loops *l = loops_for_fn (saved_cfun);
7985 loop_exit **slot
7986 = l->exits->find_slot_with_hash (e, htab_hash_pointer (e),
7987 NO_INSERT);
7988 if (slot)
7989 l->exits->clear_slot (slot);
7993 /* Adjust the number of blocks in the tree root of the outlined part. */
7994 get_loop (dest_cfun, 0)->num_nodes = bbs.length () + 2;
7996 /* Setup a mapping to be used by move_block_to_fn. */
7997 loop->aux = current_loops->tree_root;
7998 loop0->aux = current_loops->tree_root;
8000 /* Fix up orig_loop_num. If the block referenced in it has been moved
8001 to dest_cfun, update orig_loop_num field, otherwise clear it. */
8002 signed char *moved_orig_loop_num = NULL;
8003 for (auto dloop : loops_list (dest_cfun, 0))
8004 if (dloop->orig_loop_num)
8006 if (moved_orig_loop_num == NULL)
8007 moved_orig_loop_num
8008 = XCNEWVEC (signed char, vec_safe_length (larray));
8009 if ((*larray)[dloop->orig_loop_num] != NULL
8010 && get_loop (saved_cfun, dloop->orig_loop_num) == NULL)
8012 if (moved_orig_loop_num[dloop->orig_loop_num] >= 0
8013 && moved_orig_loop_num[dloop->orig_loop_num] < 2)
8014 moved_orig_loop_num[dloop->orig_loop_num]++;
8015 dloop->orig_loop_num = (*larray)[dloop->orig_loop_num]->num;
8017 else
8019 moved_orig_loop_num[dloop->orig_loop_num] = -1;
8020 dloop->orig_loop_num = 0;
8023 pop_cfun ();
8025 if (moved_orig_loop_num)
8027 FOR_EACH_VEC_ELT (bbs, i, bb)
8029 gimple *g = find_loop_dist_alias (bb);
8030 if (g == NULL)
8031 continue;
8033 int orig_loop_num = tree_to_shwi (gimple_call_arg (g, 0));
8034 gcc_assert (orig_loop_num
8035 && (unsigned) orig_loop_num < vec_safe_length (larray));
8036 if (moved_orig_loop_num[orig_loop_num] == 2)
8038 /* If we have moved both loops with this orig_loop_num into
8039 dest_cfun and the LOOP_DIST_ALIAS call is being moved there
8040 too, update the first argument. */
8041 gcc_assert ((*larray)[orig_loop_num] != NULL
8042 && (get_loop (saved_cfun, orig_loop_num) == NULL));
8043 tree t = build_int_cst (integer_type_node,
8044 (*larray)[orig_loop_num]->num);
8045 gimple_call_set_arg (g, 0, t);
8046 update_stmt (g);
8047 /* Make sure the following loop will not update it. */
8048 moved_orig_loop_num[orig_loop_num] = 0;
8050 else
8051 /* Otherwise at least one of the loops stayed in saved_cfun.
8052 Remove the LOOP_DIST_ALIAS call. */
8053 fold_loop_internal_call (g, gimple_call_arg (g, 1));
8055 FOR_EACH_BB_FN (bb, saved_cfun)
8057 gimple *g = find_loop_dist_alias (bb);
8058 if (g == NULL)
8059 continue;
8060 int orig_loop_num = tree_to_shwi (gimple_call_arg (g, 0));
8061 gcc_assert (orig_loop_num
8062 && (unsigned) orig_loop_num < vec_safe_length (larray));
8063 if (moved_orig_loop_num[orig_loop_num])
8064 /* LOOP_DIST_ALIAS call remained in saved_cfun, if at least one
8065 of the corresponding loops was moved, remove it. */
8066 fold_loop_internal_call (g, gimple_call_arg (g, 1));
8068 XDELETEVEC (moved_orig_loop_num);
8070 ggc_free (larray);
8072 /* Move blocks from BBS into DEST_CFUN. */
8073 gcc_assert (bbs.length () >= 2);
8074 after = dest_cfun->cfg->x_entry_block_ptr;
8075 hash_map<tree, tree> vars_map;
8077 memset (&d, 0, sizeof (d));
8078 d.orig_block = orig_block;
8079 d.new_block = DECL_INITIAL (dest_cfun->decl);
8080 d.from_context = cfun->decl;
8081 d.to_context = dest_cfun->decl;
8082 d.vars_map = &vars_map;
8083 d.new_label_map = new_label_map;
8084 d.eh_map = eh_map;
8085 d.remap_decls_p = true;
8087 if (gimple_in_ssa_p (cfun))
8088 for (tree arg = DECL_ARGUMENTS (d.to_context); arg; arg = DECL_CHAIN (arg))
8090 tree narg = make_ssa_name_fn (dest_cfun, arg, gimple_build_nop ());
8091 set_ssa_default_def (dest_cfun, arg, narg);
8092 vars_map.put (arg, narg);
8095 FOR_EACH_VEC_ELT (bbs, i, bb)
8097 /* No need to update edge counts on the last block. It has
8098 already been updated earlier when we detached the region from
8099 the original CFG. */
8100 move_block_to_fn (dest_cfun, bb, after, bb != exit_bb, &d);
8101 after = bb;
8104 /* Adjust the maximum clique used. */
8105 dest_cfun->last_clique = saved_cfun->last_clique;
8107 loop->aux = NULL;
8108 loop0->aux = NULL;
8109 /* Loop sizes are no longer correct, fix them up. */
8110 loop->num_nodes -= num_nodes;
8111 for (class loop *outer = loop_outer (loop);
8112 outer; outer = loop_outer (outer))
8113 outer->num_nodes -= num_nodes;
8114 loop0->num_nodes -= bbs.length () - num_nodes;
8116 if (saved_cfun->has_simduid_loops || saved_cfun->has_force_vectorize_loops)
8118 class loop *aloop;
8119 for (i = 0; vec_safe_iterate (loops->larray, i, &aloop); i++)
8120 if (aloop != NULL)
8122 if (aloop->simduid)
8124 replace_by_duplicate_decl (&aloop->simduid, d.vars_map,
8125 d.to_context);
8126 dest_cfun->has_simduid_loops = true;
8128 if (aloop->force_vectorize)
8129 dest_cfun->has_force_vectorize_loops = true;
8133 /* Rewire BLOCK_SUBBLOCKS of orig_block. */
8134 if (orig_block)
8136 tree block;
8137 gcc_assert (BLOCK_SUBBLOCKS (DECL_INITIAL (dest_cfun->decl))
8138 == NULL_TREE);
8139 BLOCK_SUBBLOCKS (DECL_INITIAL (dest_cfun->decl))
8140 = BLOCK_SUBBLOCKS (orig_block);
8141 for (block = BLOCK_SUBBLOCKS (orig_block);
8142 block; block = BLOCK_CHAIN (block))
8143 BLOCK_SUPERCONTEXT (block) = DECL_INITIAL (dest_cfun->decl);
8144 BLOCK_SUBBLOCKS (orig_block) = NULL_TREE;
8147 replace_block_vars_by_duplicates (DECL_INITIAL (dest_cfun->decl),
8148 &vars_map, dest_cfun->decl);
8150 if (new_label_map)
8151 htab_delete (new_label_map);
8152 if (eh_map)
8153 delete eh_map;
8155 /* We need to release ssa-names in a defined order, so first find them,
8156 and then iterate in ascending version order. */
8157 bitmap release_names = BITMAP_ALLOC (NULL);
8158 vars_map.traverse<void *, gather_ssa_name_hash_map_from> (release_names);
8159 bitmap_iterator bi;
8160 EXECUTE_IF_SET_IN_BITMAP (release_names, 0, i, bi)
8161 release_ssa_name (ssa_name (i));
8162 BITMAP_FREE (release_names);
8164 /* Rewire the entry and exit blocks. The successor to the entry
8165 block turns into the successor of DEST_FN's ENTRY_BLOCK_PTR in
8166 the child function. Similarly, the predecessor of DEST_FN's
8167 EXIT_BLOCK_PTR turns into the predecessor of EXIT_BLOCK_PTR. We
8168 need to switch CFUN between DEST_CFUN and SAVED_CFUN so that the
8169 various CFG manipulation function get to the right CFG.
8171 FIXME, this is silly. The CFG ought to become a parameter to
8172 these helpers. */
8173 push_cfun (dest_cfun);
8174 ENTRY_BLOCK_PTR_FOR_FN (cfun)->count = entry_bb->count;
8175 make_single_succ_edge (ENTRY_BLOCK_PTR_FOR_FN (cfun), entry_bb, EDGE_FALLTHRU);
8176 if (exit_bb)
8178 make_single_succ_edge (exit_bb, EXIT_BLOCK_PTR_FOR_FN (cfun), 0);
8179 EXIT_BLOCK_PTR_FOR_FN (cfun)->count = exit_bb->count;
8181 else
8182 EXIT_BLOCK_PTR_FOR_FN (cfun)->count = profile_count::zero ();
8183 pop_cfun ();
8185 /* Back in the original function, the SESE region has disappeared,
8186 create a new basic block in its place. */
8187 bb = create_empty_bb (entry_pred[0]);
8188 if (current_loops)
8189 add_bb_to_loop (bb, loop);
8190 profile_count count = profile_count::zero ();
8191 for (i = 0; i < num_entry_edges; i++)
8193 e = make_edge (entry_pred[i], bb, entry_flag[i]);
8194 e->probability = entry_prob[i];
8195 count += e->count ();
8197 bb->count = count;
8199 for (i = 0; i < num_exit_edges; i++)
8201 e = make_edge (bb, exit_succ[i], exit_flag[i]);
8202 e->probability = exit_prob[i];
8205 set_immediate_dominator (CDI_DOMINATORS, bb, dom_entry);
8206 FOR_EACH_VEC_ELT (dom_bbs, i, abb)
8207 set_immediate_dominator (CDI_DOMINATORS, abb, bb);
8209 if (exit_bb)
8211 free (exit_prob);
8212 free (exit_flag);
8213 free (exit_succ);
8215 free (entry_prob);
8216 free (entry_flag);
8217 free (entry_pred);
8218 bbs.release ();
8220 return bb;
8223 /* Dump default def DEF to file FILE using FLAGS and indentation
8224 SPC. */
8226 static void
8227 dump_default_def (FILE *file, tree def, int spc, dump_flags_t flags)
8229 for (int i = 0; i < spc; ++i)
8230 fprintf (file, " ");
8231 dump_ssaname_info_to_file (file, def, spc);
8233 print_generic_expr (file, TREE_TYPE (def), flags);
8234 fprintf (file, " ");
8235 print_generic_expr (file, def, flags);
8236 fprintf (file, " = ");
8237 print_generic_expr (file, SSA_NAME_VAR (def), flags);
8238 fprintf (file, ";\n");
8241 /* Print no_sanitize attribute to FILE for a given attribute VALUE. */
8243 static void
8244 print_no_sanitize_attr_value (FILE *file, tree value)
8246 unsigned int flags = tree_to_uhwi (value);
8247 bool first = true;
8248 for (int i = 0; sanitizer_opts[i].name != NULL; ++i)
8250 if ((sanitizer_opts[i].flag & flags) == sanitizer_opts[i].flag)
8252 if (!first)
8253 fprintf (file, " | ");
8254 fprintf (file, "%s", sanitizer_opts[i].name);
8255 first = false;
8260 /* Dump FUNCTION_DECL FN to file FILE using FLAGS (see TDF_* in dumpfile.h)
8263 void
8264 dump_function_to_file (tree fndecl, FILE *file, dump_flags_t flags)
8266 tree arg, var, old_current_fndecl = current_function_decl;
8267 struct function *dsf;
8268 bool ignore_topmost_bind = false, any_var = false;
8269 basic_block bb;
8270 tree chain;
8271 bool tmclone = (TREE_CODE (fndecl) == FUNCTION_DECL
8272 && decl_is_tm_clone (fndecl));
8273 struct function *fun = DECL_STRUCT_FUNCTION (fndecl);
8275 tree fntype = TREE_TYPE (fndecl);
8276 tree attrs[] = { DECL_ATTRIBUTES (fndecl), TYPE_ATTRIBUTES (fntype) };
8278 for (int i = 0; i != 2; ++i)
8280 if (!attrs[i])
8281 continue;
8283 fprintf (file, "__attribute__((");
8285 bool first = true;
8286 tree chain;
8287 for (chain = attrs[i]; chain; first = false, chain = TREE_CHAIN (chain))
8289 if (!first)
8290 fprintf (file, ", ");
8292 tree name = get_attribute_name (chain);
8293 print_generic_expr (file, name, dump_flags);
8294 if (TREE_VALUE (chain) != NULL_TREE)
8296 fprintf (file, " (");
8298 if (strstr (IDENTIFIER_POINTER (name), "no_sanitize"))
8299 print_no_sanitize_attr_value (file, TREE_VALUE (chain));
8300 else if (!strcmp (IDENTIFIER_POINTER (name),
8301 "omp declare variant base"))
8303 tree a = TREE_VALUE (chain);
8304 print_generic_expr (file, TREE_PURPOSE (a), dump_flags);
8305 fprintf (file, " match ");
8306 print_omp_context_selector (file, TREE_VALUE (a),
8307 dump_flags);
8309 else
8310 print_generic_expr (file, TREE_VALUE (chain), dump_flags);
8311 fprintf (file, ")");
8315 fprintf (file, "))\n");
8318 current_function_decl = fndecl;
8319 if (flags & TDF_GIMPLE)
8321 static bool hotness_bb_param_printed = false;
8322 if (profile_info != NULL
8323 && !hotness_bb_param_printed)
8325 hotness_bb_param_printed = true;
8326 fprintf (file,
8327 "/* --param=gimple-fe-computed-hot-bb-threshold=%" PRId64
8328 " */\n", get_hot_bb_threshold ());
8331 print_generic_expr (file, TREE_TYPE (TREE_TYPE (fndecl)),
8332 dump_flags | TDF_SLIM);
8333 fprintf (file, " __GIMPLE (%s",
8334 (fun->curr_properties & PROP_ssa) ? "ssa"
8335 : (fun->curr_properties & PROP_cfg) ? "cfg"
8336 : "");
8338 if (fun && fun->cfg)
8340 basic_block bb = ENTRY_BLOCK_PTR_FOR_FN (fun);
8341 if (bb->count.initialized_p ())
8342 fprintf (file, ",%s(%" PRIu64 ")",
8343 profile_quality_as_string (bb->count.quality ()),
8344 bb->count.value ());
8345 if (dump_flags & TDF_UID)
8346 fprintf (file, ")\n%sD_%u (", function_name (fun),
8347 DECL_UID (fndecl));
8348 else
8349 fprintf (file, ")\n%s (", function_name (fun));
8352 else
8354 print_generic_expr (file, TREE_TYPE (fntype), dump_flags);
8355 if (dump_flags & TDF_UID)
8356 fprintf (file, " %sD.%u %s(", function_name (fun), DECL_UID (fndecl),
8357 tmclone ? "[tm-clone] " : "");
8358 else
8359 fprintf (file, " %s %s(", function_name (fun),
8360 tmclone ? "[tm-clone] " : "");
8363 arg = DECL_ARGUMENTS (fndecl);
8364 while (arg)
8366 print_generic_expr (file, TREE_TYPE (arg), dump_flags);
8367 fprintf (file, " ");
8368 print_generic_expr (file, arg, dump_flags);
8369 if (DECL_CHAIN (arg))
8370 fprintf (file, ", ");
8371 arg = DECL_CHAIN (arg);
8373 fprintf (file, ")\n");
8375 dsf = DECL_STRUCT_FUNCTION (fndecl);
8376 if (dsf && (flags & TDF_EH))
8377 dump_eh_tree (file, dsf);
8379 if (flags & TDF_RAW && !gimple_has_body_p (fndecl))
8381 dump_node (fndecl, TDF_SLIM | flags, file);
8382 current_function_decl = old_current_fndecl;
8383 return;
8386 /* When GIMPLE is lowered, the variables are no longer available in
8387 BIND_EXPRs, so display them separately. */
8388 if (fun && fun->decl == fndecl && (fun->curr_properties & PROP_gimple_lcf))
8390 unsigned ix;
8391 ignore_topmost_bind = true;
8393 fprintf (file, "{\n");
8394 if (gimple_in_ssa_p (fun)
8395 && (flags & TDF_ALIAS))
8397 for (arg = DECL_ARGUMENTS (fndecl); arg != NULL;
8398 arg = DECL_CHAIN (arg))
8400 tree def = ssa_default_def (fun, arg);
8401 if (def)
8402 dump_default_def (file, def, 2, flags);
8405 tree res = DECL_RESULT (fun->decl);
8406 if (res != NULL_TREE
8407 && DECL_BY_REFERENCE (res))
8409 tree def = ssa_default_def (fun, res);
8410 if (def)
8411 dump_default_def (file, def, 2, flags);
8414 tree static_chain = fun->static_chain_decl;
8415 if (static_chain != NULL_TREE)
8417 tree def = ssa_default_def (fun, static_chain);
8418 if (def)
8419 dump_default_def (file, def, 2, flags);
8423 if (!vec_safe_is_empty (fun->local_decls))
8424 FOR_EACH_LOCAL_DECL (fun, ix, var)
8426 print_generic_decl (file, var, flags);
8427 fprintf (file, "\n");
8429 any_var = true;
8432 tree name;
8434 if (gimple_in_ssa_p (fun))
8435 FOR_EACH_SSA_NAME (ix, name, fun)
8437 if (!SSA_NAME_VAR (name)
8438 /* SSA name with decls without a name still get
8439 dumped as _N, list those explicitely as well even
8440 though we've dumped the decl declaration as D.xxx
8441 above. */
8442 || !SSA_NAME_IDENTIFIER (name))
8444 fprintf (file, " ");
8445 print_generic_expr (file, TREE_TYPE (name), flags);
8446 fprintf (file, " ");
8447 print_generic_expr (file, name, flags);
8448 fprintf (file, ";\n");
8450 any_var = true;
8455 if (fun && fun->decl == fndecl
8456 && fun->cfg
8457 && basic_block_info_for_fn (fun))
8459 /* If the CFG has been built, emit a CFG-based dump. */
8460 if (!ignore_topmost_bind)
8461 fprintf (file, "{\n");
8463 if (any_var && n_basic_blocks_for_fn (fun))
8464 fprintf (file, "\n");
8466 FOR_EACH_BB_FN (bb, fun)
8467 dump_bb (file, bb, 2, flags);
8469 fprintf (file, "}\n");
8471 else if (fun && (fun->curr_properties & PROP_gimple_any))
8473 /* The function is now in GIMPLE form but the CFG has not been
8474 built yet. Emit the single sequence of GIMPLE statements
8475 that make up its body. */
8476 gimple_seq body = gimple_body (fndecl);
8478 if (gimple_seq_first_stmt (body)
8479 && gimple_seq_first_stmt (body) == gimple_seq_last_stmt (body)
8480 && gimple_code (gimple_seq_first_stmt (body)) == GIMPLE_BIND)
8481 print_gimple_seq (file, body, 0, flags);
8482 else
8484 if (!ignore_topmost_bind)
8485 fprintf (file, "{\n");
8487 if (any_var)
8488 fprintf (file, "\n");
8490 print_gimple_seq (file, body, 2, flags);
8491 fprintf (file, "}\n");
8494 else
8496 int indent;
8498 /* Make a tree based dump. */
8499 chain = DECL_SAVED_TREE (fndecl);
8500 if (chain && TREE_CODE (chain) == BIND_EXPR)
8502 if (ignore_topmost_bind)
8504 chain = BIND_EXPR_BODY (chain);
8505 indent = 2;
8507 else
8508 indent = 0;
8510 else
8512 if (!ignore_topmost_bind)
8514 fprintf (file, "{\n");
8515 /* No topmost bind, pretend it's ignored for later. */
8516 ignore_topmost_bind = true;
8518 indent = 2;
8521 if (any_var)
8522 fprintf (file, "\n");
8524 print_generic_stmt_indented (file, chain, flags, indent);
8525 if (ignore_topmost_bind)
8526 fprintf (file, "}\n");
8529 if (flags & TDF_ENUMERATE_LOCALS)
8530 dump_enumerated_decls (file, flags);
8531 fprintf (file, "\n\n");
8533 current_function_decl = old_current_fndecl;
8536 /* Dump FUNCTION_DECL FN to stderr using FLAGS (see TDF_* in tree.h) */
8538 DEBUG_FUNCTION void
8539 debug_function (tree fn, dump_flags_t flags)
8541 dump_function_to_file (fn, stderr, flags);
8545 /* Print on FILE the indexes for the predecessors of basic_block BB. */
8547 static void
8548 print_pred_bbs (FILE *file, basic_block bb)
8550 edge e;
8551 edge_iterator ei;
8553 FOR_EACH_EDGE (e, ei, bb->preds)
8554 fprintf (file, "bb_%d ", e->src->index);
8558 /* Print on FILE the indexes for the successors of basic_block BB. */
8560 static void
8561 print_succ_bbs (FILE *file, basic_block bb)
8563 edge e;
8564 edge_iterator ei;
8566 FOR_EACH_EDGE (e, ei, bb->succs)
8567 fprintf (file, "bb_%d ", e->dest->index);
8570 /* Print to FILE the basic block BB following the VERBOSITY level. */
8572 void
8573 print_loops_bb (FILE *file, basic_block bb, int indent, int verbosity)
8575 char *s_indent = (char *) alloca ((size_t) indent + 1);
8576 memset ((void *) s_indent, ' ', (size_t) indent);
8577 s_indent[indent] = '\0';
8579 /* Print basic_block's header. */
8580 if (verbosity >= 2)
8582 fprintf (file, "%s bb_%d (preds = {", s_indent, bb->index);
8583 print_pred_bbs (file, bb);
8584 fprintf (file, "}, succs = {");
8585 print_succ_bbs (file, bb);
8586 fprintf (file, "})\n");
8589 /* Print basic_block's body. */
8590 if (verbosity >= 3)
8592 fprintf (file, "%s {\n", s_indent);
8593 dump_bb (file, bb, indent + 4, TDF_VOPS|TDF_MEMSYMS);
8594 fprintf (file, "%s }\n", s_indent);
8598 /* Print loop information. */
8600 void
8601 print_loop_info (FILE *file, const class loop *loop, const char *prefix)
8603 if (loop->can_be_parallel)
8604 fprintf (file, ", can_be_parallel");
8605 if (loop->warned_aggressive_loop_optimizations)
8606 fprintf (file, ", warned_aggressive_loop_optimizations");
8607 if (loop->dont_vectorize)
8608 fprintf (file, ", dont_vectorize");
8609 if (loop->force_vectorize)
8610 fprintf (file, ", force_vectorize");
8611 if (loop->in_oacc_kernels_region)
8612 fprintf (file, ", in_oacc_kernels_region");
8613 if (loop->finite_p)
8614 fprintf (file, ", finite_p");
8615 if (loop->unroll)
8616 fprintf (file, "\n%sunroll %d", prefix, loop->unroll);
8617 if (loop->nb_iterations)
8619 fprintf (file, "\n%sniter ", prefix);
8620 print_generic_expr (file, loop->nb_iterations);
8623 if (loop->any_upper_bound)
8625 fprintf (file, "\n%supper_bound ", prefix);
8626 print_decu (loop->nb_iterations_upper_bound, file);
8628 if (loop->any_likely_upper_bound)
8630 fprintf (file, "\n%slikely_upper_bound ", prefix);
8631 print_decu (loop->nb_iterations_likely_upper_bound, file);
8634 if (loop->any_estimate)
8636 fprintf (file, "\n%sestimate ", prefix);
8637 print_decu (loop->nb_iterations_estimate, file);
8639 bool reliable;
8640 sreal iterations;
8641 if (loop->num && expected_loop_iterations_by_profile (loop, &iterations, &reliable))
8643 fprintf (file, "\n%siterations by profile: %f (%s%s) entry count:", prefix,
8644 iterations.to_double (), reliable ? "reliable" : "unreliable",
8645 maybe_flat_loop_profile (loop) ? ", maybe flat" : "");
8646 loop_count_in (loop).dump (file, cfun);
8651 static void print_loop_and_siblings (FILE *, class loop *, int, int);
8653 /* Pretty print LOOP on FILE, indented INDENT spaces. Following
8654 VERBOSITY level this outputs the contents of the loop, or just its
8655 structure. */
8657 static void
8658 print_loop (FILE *file, class loop *loop, int indent, int verbosity)
8660 char *s_indent;
8661 basic_block bb;
8663 if (loop == NULL)
8664 return;
8666 s_indent = (char *) alloca ((size_t) indent + 1);
8667 memset ((void *) s_indent, ' ', (size_t) indent);
8668 s_indent[indent] = '\0';
8670 /* Print loop's header. */
8671 fprintf (file, "%sloop_%d (", s_indent, loop->num);
8672 if (loop->header)
8673 fprintf (file, "header = %d", loop->header->index);
8674 else
8676 fprintf (file, "deleted)\n");
8677 return;
8679 if (loop->latch)
8680 fprintf (file, ", latch = %d", loop->latch->index);
8681 else
8682 fprintf (file, ", multiple latches");
8683 print_loop_info (file, loop, s_indent);
8684 fprintf (file, ")\n");
8686 /* Print loop's body. */
8687 if (verbosity >= 1)
8689 fprintf (file, "%s{\n", s_indent);
8690 FOR_EACH_BB_FN (bb, cfun)
8691 if (bb->loop_father == loop)
8692 print_loops_bb (file, bb, indent, verbosity);
8694 print_loop_and_siblings (file, loop->inner, indent + 2, verbosity);
8695 fprintf (file, "%s}\n", s_indent);
8699 /* Print the LOOP and its sibling loops on FILE, indented INDENT
8700 spaces. Following VERBOSITY level this outputs the contents of the
8701 loop, or just its structure. */
8703 static void
8704 print_loop_and_siblings (FILE *file, class loop *loop, int indent,
8705 int verbosity)
8707 if (loop == NULL)
8708 return;
8710 print_loop (file, loop, indent, verbosity);
8711 print_loop_and_siblings (file, loop->next, indent, verbosity);
8714 /* Follow a CFG edge from the entry point of the program, and on entry
8715 of a loop, pretty print the loop structure on FILE. */
8717 void
8718 print_loops (FILE *file, int verbosity)
8720 basic_block bb;
8722 bb = ENTRY_BLOCK_PTR_FOR_FN (cfun);
8723 fprintf (file, "\nLoops in function: %s\n", current_function_name ());
8724 if (bb && bb->loop_father)
8725 print_loop_and_siblings (file, bb->loop_father, 0, verbosity);
8728 /* Dump a loop. */
8730 DEBUG_FUNCTION void
8731 debug (class loop &ref)
8733 print_loop (stderr, &ref, 0, /*verbosity*/0);
8736 DEBUG_FUNCTION void
8737 debug (class loop *ptr)
8739 if (ptr)
8740 debug (*ptr);
8741 else
8742 fprintf (stderr, "<nil>\n");
8745 /* Dump a loop verbosely. */
8747 DEBUG_FUNCTION void
8748 debug_verbose (class loop &ref)
8750 print_loop (stderr, &ref, 0, /*verbosity*/3);
8753 DEBUG_FUNCTION void
8754 debug_verbose (class loop *ptr)
8756 if (ptr)
8757 debug (*ptr);
8758 else
8759 fprintf (stderr, "<nil>\n");
8763 /* Debugging loops structure at tree level, at some VERBOSITY level. */
8765 DEBUG_FUNCTION void
8766 debug_loops (int verbosity)
8768 print_loops (stderr, verbosity);
8771 /* Print on stderr the code of LOOP, at some VERBOSITY level. */
8773 DEBUG_FUNCTION void
8774 debug_loop (class loop *loop, int verbosity)
8776 print_loop (stderr, loop, 0, verbosity);
8779 /* Print on stderr the code of loop number NUM, at some VERBOSITY
8780 level. */
8782 DEBUG_FUNCTION void
8783 debug_loop_num (unsigned num, int verbosity)
8785 debug_loop (get_loop (cfun, num), verbosity);
8788 /* Return true if BB ends with a call, possibly followed by some
8789 instructions that must stay with the call. Return false,
8790 otherwise. */
8792 static bool
8793 gimple_block_ends_with_call_p (basic_block bb)
8795 gimple_stmt_iterator gsi = gsi_last_nondebug_bb (bb);
8796 return !gsi_end_p (gsi) && is_gimple_call (gsi_stmt (gsi));
8800 /* Return true if BB ends with a conditional branch. Return false,
8801 otherwise. */
8803 static bool
8804 gimple_block_ends_with_condjump_p (const_basic_block bb)
8806 return safe_is_a <gcond *> (*gsi_last_bb (const_cast <basic_block> (bb)));
8810 /* Return true if statement T may terminate execution of BB in ways not
8811 explicitly represtented in the CFG. */
8813 bool
8814 stmt_can_terminate_bb_p (gimple *t)
8816 tree fndecl = NULL_TREE;
8817 int call_flags = 0;
8819 /* Eh exception not handled internally terminates execution of the whole
8820 function. */
8821 if (stmt_can_throw_external (cfun, t))
8822 return true;
8824 /* NORETURN and LONGJMP calls already have an edge to exit.
8825 CONST and PURE calls do not need one.
8826 We don't currently check for CONST and PURE here, although
8827 it would be a good idea, because those attributes are
8828 figured out from the RTL in mark_constant_function, and
8829 the counter incrementation code from -fprofile-arcs
8830 leads to different results from -fbranch-probabilities. */
8831 if (is_gimple_call (t))
8833 fndecl = gimple_call_fndecl (t);
8834 call_flags = gimple_call_flags (t);
8837 if (is_gimple_call (t)
8838 && fndecl
8839 && fndecl_built_in_p (fndecl)
8840 && (call_flags & ECF_NOTHROW)
8841 && !(call_flags & ECF_RETURNS_TWICE)
8842 /* fork() doesn't really return twice, but the effect of
8843 wrapping it in __gcov_fork() which calls __gcov_dump() and
8844 __gcov_reset() and clears the counters before forking has the same
8845 effect as returning twice. Force a fake edge. */
8846 && !fndecl_built_in_p (fndecl, BUILT_IN_FORK))
8847 return false;
8849 if (is_gimple_call (t))
8851 edge_iterator ei;
8852 edge e;
8853 basic_block bb;
8855 if (call_flags & (ECF_PURE | ECF_CONST)
8856 && !(call_flags & ECF_LOOPING_CONST_OR_PURE))
8857 return false;
8859 /* Function call may do longjmp, terminate program or do other things.
8860 Special case noreturn that have non-abnormal edges out as in this case
8861 the fact is sufficiently represented by lack of edges out of T. */
8862 if (!(call_flags & ECF_NORETURN))
8863 return true;
8865 bb = gimple_bb (t);
8866 FOR_EACH_EDGE (e, ei, bb->succs)
8867 if ((e->flags & EDGE_FAKE) == 0)
8868 return true;
8871 if (gasm *asm_stmt = dyn_cast <gasm *> (t))
8872 if (gimple_asm_volatile_p (asm_stmt) || gimple_asm_input_p (asm_stmt))
8873 return true;
8875 return false;
8879 /* Add fake edges to the function exit for any non constant and non
8880 noreturn calls (or noreturn calls with EH/abnormal edges),
8881 volatile inline assembly in the bitmap of blocks specified by BLOCKS
8882 or to the whole CFG if BLOCKS is zero. Return the number of blocks
8883 that were split.
8885 The goal is to expose cases in which entering a basic block does
8886 not imply that all subsequent instructions must be executed. */
8888 static int
8889 gimple_flow_call_edges_add (sbitmap blocks)
8891 int i;
8892 int blocks_split = 0;
8893 int last_bb = last_basic_block_for_fn (cfun);
8894 bool check_last_block = false;
8896 if (n_basic_blocks_for_fn (cfun) == NUM_FIXED_BLOCKS)
8897 return 0;
8899 if (! blocks)
8900 check_last_block = true;
8901 else
8902 check_last_block = bitmap_bit_p (blocks,
8903 EXIT_BLOCK_PTR_FOR_FN (cfun)->prev_bb->index);
8905 /* In the last basic block, before epilogue generation, there will be
8906 a fallthru edge to EXIT. Special care is required if the last insn
8907 of the last basic block is a call because make_edge folds duplicate
8908 edges, which would result in the fallthru edge also being marked
8909 fake, which would result in the fallthru edge being removed by
8910 remove_fake_edges, which would result in an invalid CFG.
8912 Moreover, we can't elide the outgoing fake edge, since the block
8913 profiler needs to take this into account in order to solve the minimal
8914 spanning tree in the case that the call doesn't return.
8916 Handle this by adding a dummy instruction in a new last basic block. */
8917 if (check_last_block)
8919 basic_block bb = EXIT_BLOCK_PTR_FOR_FN (cfun)->prev_bb;
8920 gimple_stmt_iterator gsi = gsi_last_nondebug_bb (bb);
8921 gimple *t = NULL;
8923 if (!gsi_end_p (gsi))
8924 t = gsi_stmt (gsi);
8926 if (t && stmt_can_terminate_bb_p (t))
8928 edge e;
8930 e = find_edge (bb, EXIT_BLOCK_PTR_FOR_FN (cfun));
8931 if (e)
8933 gsi_insert_on_edge (e, gimple_build_nop ());
8934 gsi_commit_edge_inserts ();
8939 /* Now add fake edges to the function exit for any non constant
8940 calls since there is no way that we can determine if they will
8941 return or not... */
8942 for (i = 0; i < last_bb; i++)
8944 basic_block bb = BASIC_BLOCK_FOR_FN (cfun, i);
8945 gimple_stmt_iterator gsi;
8946 gimple *stmt, *last_stmt;
8948 if (!bb)
8949 continue;
8951 if (blocks && !bitmap_bit_p (blocks, i))
8952 continue;
8954 gsi = gsi_last_nondebug_bb (bb);
8955 if (!gsi_end_p (gsi))
8957 last_stmt = gsi_stmt (gsi);
8960 stmt = gsi_stmt (gsi);
8961 if (stmt_can_terminate_bb_p (stmt))
8963 edge e;
8965 /* The handling above of the final block before the
8966 epilogue should be enough to verify that there is
8967 no edge to the exit block in CFG already.
8968 Calling make_edge in such case would cause us to
8969 mark that edge as fake and remove it later. */
8970 if (flag_checking && stmt == last_stmt)
8972 e = find_edge (bb, EXIT_BLOCK_PTR_FOR_FN (cfun));
8973 gcc_assert (e == NULL);
8976 /* Note that the following may create a new basic block
8977 and renumber the existing basic blocks. */
8978 if (stmt != last_stmt)
8980 e = split_block (bb, stmt);
8981 if (e)
8982 blocks_split++;
8984 e = make_edge (bb, EXIT_BLOCK_PTR_FOR_FN (cfun), EDGE_FAKE);
8985 e->probability = profile_probability::guessed_never ();
8987 gsi_prev (&gsi);
8989 while (!gsi_end_p (gsi));
8993 if (blocks_split)
8994 checking_verify_flow_info ();
8996 return blocks_split;
8999 /* Removes edge E and all the blocks dominated by it, and updates dominance
9000 information. The IL in E->src needs to be updated separately.
9001 If dominance info is not available, only the edge E is removed.*/
9003 void
9004 remove_edge_and_dominated_blocks (edge e)
9006 vec<basic_block> bbs_to_fix_dom = vNULL;
9007 edge f;
9008 edge_iterator ei;
9009 bool none_removed = false;
9010 unsigned i;
9011 basic_block bb, dbb;
9012 bitmap_iterator bi;
9014 /* If we are removing a path inside a non-root loop that may change
9015 loop ownership of blocks or remove loops. Mark loops for fixup. */
9016 if (current_loops
9017 && loop_outer (e->src->loop_father) != NULL
9018 && e->src->loop_father == e->dest->loop_father)
9019 loops_state_set (LOOPS_NEED_FIXUP);
9021 if (!dom_info_available_p (CDI_DOMINATORS))
9023 remove_edge (e);
9024 return;
9027 /* No updating is needed for edges to exit. */
9028 if (e->dest == EXIT_BLOCK_PTR_FOR_FN (cfun))
9030 if (cfgcleanup_altered_bbs)
9031 bitmap_set_bit (cfgcleanup_altered_bbs, e->src->index);
9032 remove_edge (e);
9033 return;
9036 /* First, we find the basic blocks to remove. If E->dest has a predecessor
9037 that is not dominated by E->dest, then this set is empty. Otherwise,
9038 all the basic blocks dominated by E->dest are removed.
9040 Also, to DF_IDOM we store the immediate dominators of the blocks in
9041 the dominance frontier of E (i.e., of the successors of the
9042 removed blocks, if there are any, and of E->dest otherwise). */
9043 FOR_EACH_EDGE (f, ei, e->dest->preds)
9045 if (f == e)
9046 continue;
9048 if (!dominated_by_p (CDI_DOMINATORS, f->src, e->dest))
9050 none_removed = true;
9051 break;
9055 auto_bitmap df, df_idom;
9056 auto_vec<basic_block> bbs_to_remove;
9057 if (none_removed)
9058 bitmap_set_bit (df_idom,
9059 get_immediate_dominator (CDI_DOMINATORS, e->dest)->index);
9060 else
9062 bbs_to_remove = get_all_dominated_blocks (CDI_DOMINATORS, e->dest);
9063 FOR_EACH_VEC_ELT (bbs_to_remove, i, bb)
9065 FOR_EACH_EDGE (f, ei, bb->succs)
9067 if (f->dest != EXIT_BLOCK_PTR_FOR_FN (cfun))
9068 bitmap_set_bit (df, f->dest->index);
9071 FOR_EACH_VEC_ELT (bbs_to_remove, i, bb)
9072 bitmap_clear_bit (df, bb->index);
9074 EXECUTE_IF_SET_IN_BITMAP (df, 0, i, bi)
9076 bb = BASIC_BLOCK_FOR_FN (cfun, i);
9077 bitmap_set_bit (df_idom,
9078 get_immediate_dominator (CDI_DOMINATORS, bb)->index);
9082 if (cfgcleanup_altered_bbs)
9084 /* Record the set of the altered basic blocks. */
9085 bitmap_set_bit (cfgcleanup_altered_bbs, e->src->index);
9086 bitmap_ior_into (cfgcleanup_altered_bbs, df);
9089 /* Remove E and the cancelled blocks. */
9090 if (none_removed)
9091 remove_edge (e);
9092 else
9094 /* Walk backwards so as to get a chance to substitute all
9095 released DEFs into debug stmts. See
9096 eliminate_unnecessary_stmts() in tree-ssa-dce.cc for more
9097 details. */
9098 for (i = bbs_to_remove.length (); i-- > 0; )
9099 delete_basic_block (bbs_to_remove[i]);
9102 /* Update the dominance information. The immediate dominator may change only
9103 for blocks whose immediate dominator belongs to DF_IDOM:
9105 Suppose that idom(X) = Y before removal of E and idom(X) != Y after the
9106 removal. Let Z the arbitrary block such that idom(Z) = Y and
9107 Z dominates X after the removal. Before removal, there exists a path P
9108 from Y to X that avoids Z. Let F be the last edge on P that is
9109 removed, and let W = F->dest. Before removal, idom(W) = Y (since Y
9110 dominates W, and because of P, Z does not dominate W), and W belongs to
9111 the dominance frontier of E. Therefore, Y belongs to DF_IDOM. */
9112 EXECUTE_IF_SET_IN_BITMAP (df_idom, 0, i, bi)
9114 bb = BASIC_BLOCK_FOR_FN (cfun, i);
9115 for (dbb = first_dom_son (CDI_DOMINATORS, bb);
9116 dbb;
9117 dbb = next_dom_son (CDI_DOMINATORS, dbb))
9118 bbs_to_fix_dom.safe_push (dbb);
9121 iterate_fix_dominators (CDI_DOMINATORS, bbs_to_fix_dom, true);
9123 bbs_to_fix_dom.release ();
9126 /* Purge dead EH edges from basic block BB. */
9128 bool
9129 gimple_purge_dead_eh_edges (basic_block bb)
9131 bool changed = false;
9132 edge e;
9133 edge_iterator ei;
9134 gimple *stmt = *gsi_last_bb (bb);
9136 if (stmt && stmt_can_throw_internal (cfun, stmt))
9137 return false;
9139 for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
9141 if (e->flags & EDGE_EH)
9143 remove_edge_and_dominated_blocks (e);
9144 changed = true;
9146 else
9147 ei_next (&ei);
9150 return changed;
9153 /* Purge dead EH edges from basic block listed in BLOCKS. */
9155 bool
9156 gimple_purge_all_dead_eh_edges (const_bitmap blocks)
9158 bool changed = false;
9159 unsigned i;
9160 bitmap_iterator bi;
9162 EXECUTE_IF_SET_IN_BITMAP (blocks, 0, i, bi)
9164 basic_block bb = BASIC_BLOCK_FOR_FN (cfun, i);
9166 /* Earlier gimple_purge_dead_eh_edges could have removed
9167 this basic block already. */
9168 gcc_assert (bb || changed);
9169 if (bb != NULL)
9170 changed |= gimple_purge_dead_eh_edges (bb);
9173 return changed;
9176 /* Purge dead abnormal call edges from basic block BB. */
9178 bool
9179 gimple_purge_dead_abnormal_call_edges (basic_block bb)
9181 bool changed = false;
9182 edge e;
9183 edge_iterator ei;
9184 gimple *stmt = *gsi_last_bb (bb);
9186 if (stmt && stmt_can_make_abnormal_goto (stmt))
9187 return false;
9189 for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
9191 if (e->flags & EDGE_ABNORMAL)
9193 if (e->flags & EDGE_FALLTHRU)
9194 e->flags &= ~EDGE_ABNORMAL;
9195 else
9196 remove_edge_and_dominated_blocks (e);
9197 changed = true;
9199 else
9200 ei_next (&ei);
9203 return changed;
9206 /* Purge dead abnormal call edges from basic block listed in BLOCKS. */
9208 bool
9209 gimple_purge_all_dead_abnormal_call_edges (const_bitmap blocks)
9211 bool changed = false;
9212 unsigned i;
9213 bitmap_iterator bi;
9215 EXECUTE_IF_SET_IN_BITMAP (blocks, 0, i, bi)
9217 basic_block bb = BASIC_BLOCK_FOR_FN (cfun, i);
9219 /* Earlier gimple_purge_dead_abnormal_call_edges could have removed
9220 this basic block already. */
9221 gcc_assert (bb || changed);
9222 if (bb != NULL)
9223 changed |= gimple_purge_dead_abnormal_call_edges (bb);
9226 return changed;
9229 /* This function is called whenever a new edge is created or
9230 redirected. */
9232 static void
9233 gimple_execute_on_growing_pred (edge e)
9235 basic_block bb = e->dest;
9237 if (!gimple_seq_empty_p (phi_nodes (bb)))
9238 reserve_phi_args_for_new_edge (bb);
9241 /* This function is called immediately before edge E is removed from
9242 the edge vector E->dest->preds. */
9244 static void
9245 gimple_execute_on_shrinking_pred (edge e)
9247 if (!gimple_seq_empty_p (phi_nodes (e->dest)))
9248 remove_phi_args (e);
9251 /*---------------------------------------------------------------------------
9252 Helper functions for Loop versioning
9253 ---------------------------------------------------------------------------*/
9255 /* Adjust phi nodes for 'first' basic block. 'second' basic block is a copy
9256 of 'first'. Both of them are dominated by 'new_head' basic block. When
9257 'new_head' was created by 'second's incoming edge it received phi arguments
9258 on the edge by split_edge(). Later, additional edge 'e' was created to
9259 connect 'new_head' and 'first'. Now this routine adds phi args on this
9260 additional edge 'e' that new_head to second edge received as part of edge
9261 splitting. */
9263 static void
9264 gimple_lv_adjust_loop_header_phi (basic_block first, basic_block second,
9265 basic_block new_head, edge e)
9267 gphi *phi1, *phi2;
9268 gphi_iterator psi1, psi2;
9269 tree def;
9270 edge e2 = find_edge (new_head, second);
9272 /* Because NEW_HEAD has been created by splitting SECOND's incoming
9273 edge, we should always have an edge from NEW_HEAD to SECOND. */
9274 gcc_assert (e2 != NULL);
9276 /* Browse all 'second' basic block phi nodes and add phi args to
9277 edge 'e' for 'first' head. PHI args are always in correct order. */
9279 for (psi2 = gsi_start_phis (second),
9280 psi1 = gsi_start_phis (first);
9281 !gsi_end_p (psi2) && !gsi_end_p (psi1);
9282 gsi_next (&psi2), gsi_next (&psi1))
9284 phi1 = psi1.phi ();
9285 phi2 = psi2.phi ();
9286 def = PHI_ARG_DEF (phi2, e2->dest_idx);
9287 add_phi_arg (phi1, def, e, gimple_phi_arg_location_from_edge (phi2, e2));
9292 /* Adds a if else statement to COND_BB with condition COND_EXPR.
9293 SECOND_HEAD is the destination of the THEN and FIRST_HEAD is
9294 the destination of the ELSE part. */
9296 static void
9297 gimple_lv_add_condition_to_bb (basic_block first_head ATTRIBUTE_UNUSED,
9298 basic_block second_head ATTRIBUTE_UNUSED,
9299 basic_block cond_bb, void *cond_e)
9301 gimple_stmt_iterator gsi;
9302 gimple *new_cond_expr;
9303 tree cond_expr = (tree) cond_e;
9304 edge e0;
9306 /* Build new conditional expr */
9307 gsi = gsi_last_bb (cond_bb);
9309 cond_expr = force_gimple_operand_gsi_1 (&gsi, cond_expr,
9310 is_gimple_condexpr_for_cond,
9311 NULL_TREE, false,
9312 GSI_CONTINUE_LINKING);
9313 new_cond_expr = gimple_build_cond_from_tree (cond_expr,
9314 NULL_TREE, NULL_TREE);
9316 /* Add new cond in cond_bb. */
9317 gsi_insert_after (&gsi, new_cond_expr, GSI_NEW_STMT);
9319 /* Adjust edges appropriately to connect new head with first head
9320 as well as second head. */
9321 e0 = single_succ_edge (cond_bb);
9322 e0->flags &= ~EDGE_FALLTHRU;
9323 e0->flags |= EDGE_FALSE_VALUE;
9327 /* Do book-keeping of basic block BB for the profile consistency checker.
9328 Store the counting in RECORD. */
9329 static void
9330 gimple_account_profile_record (basic_block bb,
9331 struct profile_record *record)
9333 gimple_stmt_iterator i;
9334 for (i = gsi_start_nondebug_after_labels_bb (bb); !gsi_end_p (i);
9335 gsi_next_nondebug (&i))
9337 record->size
9338 += estimate_num_insns (gsi_stmt (i), &eni_size_weights);
9339 if (profile_info)
9341 if (ENTRY_BLOCK_PTR_FOR_FN (cfun)->count.ipa ().initialized_p ()
9342 && ENTRY_BLOCK_PTR_FOR_FN (cfun)->count.ipa ().nonzero_p ()
9343 && bb->count.ipa ().initialized_p ())
9344 record->time
9345 += estimate_num_insns (gsi_stmt (i),
9346 &eni_time_weights)
9347 * bb->count.ipa ().to_gcov_type ();
9349 else if (bb->count.initialized_p ()
9350 && ENTRY_BLOCK_PTR_FOR_FN (cfun)->count.initialized_p ())
9351 record->time
9352 += estimate_num_insns
9353 (gsi_stmt (i),
9354 &eni_time_weights)
9355 * bb->count.to_sreal_scale
9356 (ENTRY_BLOCK_PTR_FOR_FN (cfun)->count).to_double ();
9357 else
9358 record->time
9359 += estimate_num_insns (gsi_stmt (i), &eni_time_weights);
9363 struct cfg_hooks gimple_cfg_hooks = {
9364 "gimple",
9365 gimple_verify_flow_info,
9366 gimple_dump_bb, /* dump_bb */
9367 gimple_dump_bb_for_graph, /* dump_bb_for_graph */
9368 create_bb, /* create_basic_block */
9369 gimple_redirect_edge_and_branch, /* redirect_edge_and_branch */
9370 gimple_redirect_edge_and_branch_force, /* redirect_edge_and_branch_force */
9371 gimple_can_remove_branch_p, /* can_remove_branch_p */
9372 remove_bb, /* delete_basic_block */
9373 gimple_split_block, /* split_block */
9374 gimple_move_block_after, /* move_block_after */
9375 gimple_can_merge_blocks_p, /* can_merge_blocks_p */
9376 gimple_merge_blocks, /* merge_blocks */
9377 gimple_predict_edge, /* predict_edge */
9378 gimple_predicted_by_p, /* predicted_by_p */
9379 gimple_can_duplicate_bb_p, /* can_duplicate_block_p */
9380 gimple_duplicate_bb, /* duplicate_block */
9381 gimple_split_edge, /* split_edge */
9382 gimple_make_forwarder_block, /* make_forward_block */
9383 NULL, /* tidy_fallthru_edge */
9384 NULL, /* force_nonfallthru */
9385 gimple_block_ends_with_call_p,/* block_ends_with_call_p */
9386 gimple_block_ends_with_condjump_p, /* block_ends_with_condjump_p */
9387 gimple_flow_call_edges_add, /* flow_call_edges_add */
9388 gimple_execute_on_growing_pred, /* execute_on_growing_pred */
9389 gimple_execute_on_shrinking_pred, /* execute_on_shrinking_pred */
9390 gimple_duplicate_loop_body_to_header_edge, /* duplicate loop for trees */
9391 gimple_lv_add_condition_to_bb, /* lv_add_condition_to_bb */
9392 gimple_lv_adjust_loop_header_phi, /* lv_adjust_loop_header_phi*/
9393 extract_true_false_edges_from_block, /* extract_cond_bb_edges */
9394 flush_pending_stmts, /* flush_pending_stmts */
9395 gimple_empty_block_p, /* block_empty_p */
9396 gimple_split_block_before_cond_jump, /* split_block_before_cond_jump */
9397 gimple_account_profile_record,
9401 /* Split all critical edges. Split some extra (not necessarily critical) edges
9402 if FOR_EDGE_INSERTION_P is true. */
9404 unsigned int
9405 split_critical_edges (bool for_edge_insertion_p /* = false */)
9407 basic_block bb;
9408 edge e;
9409 edge_iterator ei;
9411 /* split_edge can redirect edges out of SWITCH_EXPRs, which can get
9412 expensive. So we want to enable recording of edge to CASE_LABEL_EXPR
9413 mappings around the calls to split_edge. */
9414 start_recording_case_labels ();
9415 FOR_ALL_BB_FN (bb, cfun)
9417 FOR_EACH_EDGE (e, ei, bb->succs)
9419 if (EDGE_CRITICAL_P (e) && !(e->flags & EDGE_ABNORMAL))
9420 split_edge (e);
9421 /* PRE inserts statements to edges and expects that
9422 since split_critical_edges was done beforehand, committing edge
9423 insertions will not split more edges. In addition to critical
9424 edges we must split edges that have multiple successors and
9425 end by control flow statements, such as RESX.
9426 Go ahead and split them too. This matches the logic in
9427 gimple_find_edge_insert_loc. */
9428 else if (for_edge_insertion_p
9429 && (!single_pred_p (e->dest)
9430 || !gimple_seq_empty_p (phi_nodes (e->dest))
9431 || e->dest == EXIT_BLOCK_PTR_FOR_FN (cfun))
9432 && e->src != ENTRY_BLOCK_PTR_FOR_FN (cfun)
9433 && !(e->flags & EDGE_ABNORMAL))
9435 gimple_stmt_iterator gsi;
9437 gsi = gsi_last_bb (e->src);
9438 if (!gsi_end_p (gsi)
9439 && stmt_ends_bb_p (gsi_stmt (gsi))
9440 && (gimple_code (gsi_stmt (gsi)) != GIMPLE_RETURN
9441 && !gimple_call_builtin_p (gsi_stmt (gsi),
9442 BUILT_IN_RETURN)))
9443 split_edge (e);
9447 end_recording_case_labels ();
9448 return 0;
9451 namespace {
9453 const pass_data pass_data_split_crit_edges =
9455 GIMPLE_PASS, /* type */
9456 "crited", /* name */
9457 OPTGROUP_NONE, /* optinfo_flags */
9458 TV_TREE_SPLIT_EDGES, /* tv_id */
9459 PROP_cfg, /* properties_required */
9460 PROP_no_crit_edges, /* properties_provided */
9461 0, /* properties_destroyed */
9462 0, /* todo_flags_start */
9463 0, /* todo_flags_finish */
9466 class pass_split_crit_edges : public gimple_opt_pass
9468 public:
9469 pass_split_crit_edges (gcc::context *ctxt)
9470 : gimple_opt_pass (pass_data_split_crit_edges, ctxt)
9473 /* opt_pass methods: */
9474 unsigned int execute (function *) final override
9476 return split_critical_edges ();
9479 opt_pass * clone () final override
9481 return new pass_split_crit_edges (m_ctxt);
9483 }; // class pass_split_crit_edges
9485 } // anon namespace
9487 gimple_opt_pass *
9488 make_pass_split_crit_edges (gcc::context *ctxt)
9490 return new pass_split_crit_edges (ctxt);
9494 /* Insert COND expression which is GIMPLE_COND after STMT
9495 in basic block BB with appropriate basic block split
9496 and creation of a new conditionally executed basic block.
9497 Update profile so the new bb is visited with probability PROB.
9498 Return created basic block. */
9499 basic_block
9500 insert_cond_bb (basic_block bb, gimple *stmt, gimple *cond,
9501 profile_probability prob)
9503 edge fall = split_block (bb, stmt);
9504 gimple_stmt_iterator iter = gsi_last_bb (bb);
9505 basic_block new_bb;
9507 /* Insert cond statement. */
9508 gcc_assert (gimple_code (cond) == GIMPLE_COND);
9509 if (gsi_end_p (iter))
9510 gsi_insert_before (&iter, cond, GSI_CONTINUE_LINKING);
9511 else
9512 gsi_insert_after (&iter, cond, GSI_CONTINUE_LINKING);
9514 /* Create conditionally executed block. */
9515 new_bb = create_empty_bb (bb);
9516 edge e = make_edge (bb, new_bb, EDGE_TRUE_VALUE);
9517 e->probability = prob;
9518 new_bb->count = e->count ();
9519 make_single_succ_edge (new_bb, fall->dest, EDGE_FALLTHRU);
9521 /* Fix edge for split bb. */
9522 fall->flags = EDGE_FALSE_VALUE;
9523 fall->probability -= e->probability;
9525 /* Update dominance info. */
9526 if (dom_info_available_p (CDI_DOMINATORS))
9528 set_immediate_dominator (CDI_DOMINATORS, new_bb, bb);
9529 set_immediate_dominator (CDI_DOMINATORS, fall->dest, bb);
9532 /* Update loop info. */
9533 if (current_loops)
9534 add_bb_to_loop (new_bb, bb->loop_father);
9536 return new_bb;
9541 /* Given a basic block B which ends with a conditional and has
9542 precisely two successors, determine which of the edges is taken if
9543 the conditional is true and which is taken if the conditional is
9544 false. Set TRUE_EDGE and FALSE_EDGE appropriately. */
9546 void
9547 extract_true_false_edges_from_block (basic_block b,
9548 edge *true_edge,
9549 edge *false_edge)
9551 edge e = EDGE_SUCC (b, 0);
9553 if (e->flags & EDGE_TRUE_VALUE)
9555 *true_edge = e;
9556 *false_edge = EDGE_SUCC (b, 1);
9558 else
9560 *false_edge = e;
9561 *true_edge = EDGE_SUCC (b, 1);
9566 /* From a controlling predicate in the immediate dominator DOM of
9567 PHIBLOCK determine the edges into PHIBLOCK that are chosen if the
9568 predicate evaluates to true and false and store them to
9569 *TRUE_CONTROLLED_EDGE and *FALSE_CONTROLLED_EDGE if
9570 they are non-NULL. Returns true if the edges can be determined,
9571 else return false. */
9573 bool
9574 extract_true_false_controlled_edges (basic_block dom, basic_block phiblock,
9575 edge *true_controlled_edge,
9576 edge *false_controlled_edge)
9578 basic_block bb = phiblock;
9579 edge true_edge, false_edge, tem;
9580 edge e0 = NULL, e1 = NULL;
9582 /* We have to verify that one edge into the PHI node is dominated
9583 by the true edge of the predicate block and the other edge
9584 dominated by the false edge. This ensures that the PHI argument
9585 we are going to take is completely determined by the path we
9586 take from the predicate block.
9587 We can only use BB dominance checks below if the destination of
9588 the true/false edges are dominated by their edge, thus only
9589 have a single predecessor. */
9590 extract_true_false_edges_from_block (dom, &true_edge, &false_edge);
9591 tem = EDGE_PRED (bb, 0);
9592 if (tem == true_edge
9593 || (single_pred_p (true_edge->dest)
9594 && (tem->src == true_edge->dest
9595 || dominated_by_p (CDI_DOMINATORS,
9596 tem->src, true_edge->dest))))
9597 e0 = tem;
9598 else if (tem == false_edge
9599 || (single_pred_p (false_edge->dest)
9600 && (tem->src == false_edge->dest
9601 || dominated_by_p (CDI_DOMINATORS,
9602 tem->src, false_edge->dest))))
9603 e1 = tem;
9604 else
9605 return false;
9606 tem = EDGE_PRED (bb, 1);
9607 if (tem == true_edge
9608 || (single_pred_p (true_edge->dest)
9609 && (tem->src == true_edge->dest
9610 || dominated_by_p (CDI_DOMINATORS,
9611 tem->src, true_edge->dest))))
9612 e0 = tem;
9613 else if (tem == false_edge
9614 || (single_pred_p (false_edge->dest)
9615 && (tem->src == false_edge->dest
9616 || dominated_by_p (CDI_DOMINATORS,
9617 tem->src, false_edge->dest))))
9618 e1 = tem;
9619 else
9620 return false;
9621 if (!e0 || !e1)
9622 return false;
9624 if (true_controlled_edge)
9625 *true_controlled_edge = e0;
9626 if (false_controlled_edge)
9627 *false_controlled_edge = e1;
9629 return true;
9632 /* Generate a range test LHS CODE RHS that determines whether INDEX is in the
9633 range [low, high]. Place associated stmts before *GSI. */
9635 void
9636 generate_range_test (basic_block bb, tree index, tree low, tree high,
9637 tree *lhs, tree *rhs)
9639 tree type = TREE_TYPE (index);
9640 tree utype = range_check_type (type);
9642 low = fold_convert (utype, low);
9643 high = fold_convert (utype, high);
9645 gimple_seq seq = NULL;
9646 index = gimple_convert (&seq, utype, index);
9647 *lhs = gimple_build (&seq, MINUS_EXPR, utype, index, low);
9648 *rhs = const_binop (MINUS_EXPR, utype, high, low);
9650 gimple_stmt_iterator gsi = gsi_last_bb (bb);
9651 gsi_insert_seq_before (&gsi, seq, GSI_SAME_STMT);
9654 /* Return the basic block that belongs to label numbered INDEX
9655 of a switch statement. */
9657 basic_block
9658 gimple_switch_label_bb (function *ifun, gswitch *gs, unsigned index)
9660 return label_to_block (ifun, CASE_LABEL (gimple_switch_label (gs, index)));
9663 /* Return the default basic block of a switch statement. */
9665 basic_block
9666 gimple_switch_default_bb (function *ifun, gswitch *gs)
9668 return gimple_switch_label_bb (ifun, gs, 0);
9671 /* Return the edge that belongs to label numbered INDEX
9672 of a switch statement. */
9674 edge
9675 gimple_switch_edge (function *ifun, gswitch *gs, unsigned index)
9677 return find_edge (gimple_bb (gs), gimple_switch_label_bb (ifun, gs, index));
9680 /* Return the default edge of a switch statement. */
9682 edge
9683 gimple_switch_default_edge (function *ifun, gswitch *gs)
9685 return gimple_switch_edge (ifun, gs, 0);
9688 /* Return true if the only executable statement in BB is a GIMPLE_COND. */
9690 bool
9691 cond_only_block_p (basic_block bb)
9693 /* BB must have no executable statements. */
9694 gimple_stmt_iterator gsi = gsi_after_labels (bb);
9695 if (phi_nodes (bb))
9696 return false;
9697 while (!gsi_end_p (gsi))
9699 gimple *stmt = gsi_stmt (gsi);
9700 if (is_gimple_debug (stmt))
9702 else if (gimple_code (stmt) == GIMPLE_NOP
9703 || gimple_code (stmt) == GIMPLE_PREDICT
9704 || gimple_code (stmt) == GIMPLE_COND)
9706 else
9707 return false;
9708 gsi_next (&gsi);
9710 return true;
9714 /* Emit return warnings. */
9716 namespace {
9718 const pass_data pass_data_warn_function_return =
9720 GIMPLE_PASS, /* type */
9721 "*warn_function_return", /* name */
9722 OPTGROUP_NONE, /* optinfo_flags */
9723 TV_NONE, /* tv_id */
9724 PROP_cfg, /* properties_required */
9725 0, /* properties_provided */
9726 0, /* properties_destroyed */
9727 0, /* todo_flags_start */
9728 0, /* todo_flags_finish */
9731 class pass_warn_function_return : public gimple_opt_pass
9733 public:
9734 pass_warn_function_return (gcc::context *ctxt)
9735 : gimple_opt_pass (pass_data_warn_function_return, ctxt)
9738 /* opt_pass methods: */
9739 unsigned int execute (function *) final override;
9741 }; // class pass_warn_function_return
9743 unsigned int
9744 pass_warn_function_return::execute (function *fun)
9746 location_t location;
9747 gimple *last;
9748 edge e;
9749 edge_iterator ei;
9751 if (!targetm.warn_func_return (fun->decl))
9752 return 0;
9754 /* If we have a path to EXIT, then we do return. */
9755 if (TREE_THIS_VOLATILE (fun->decl)
9756 && EDGE_COUNT (EXIT_BLOCK_PTR_FOR_FN (fun)->preds) > 0)
9758 location = UNKNOWN_LOCATION;
9759 for (ei = ei_start (EXIT_BLOCK_PTR_FOR_FN (fun)->preds);
9760 (e = ei_safe_edge (ei)); )
9762 last = *gsi_last_bb (e->src);
9763 if ((gimple_code (last) == GIMPLE_RETURN
9764 || gimple_call_builtin_p (last, BUILT_IN_RETURN))
9765 && location == UNKNOWN_LOCATION
9766 && ((location = LOCATION_LOCUS (gimple_location (last)))
9767 != UNKNOWN_LOCATION)
9768 && !optimize)
9769 break;
9770 /* When optimizing, replace return stmts in noreturn functions
9771 with __builtin_unreachable () call. */
9772 if (optimize && gimple_code (last) == GIMPLE_RETURN)
9774 location_t loc = gimple_location (last);
9775 gimple *new_stmt = gimple_build_builtin_unreachable (loc);
9776 gimple_stmt_iterator gsi = gsi_for_stmt (last);
9777 gsi_replace (&gsi, new_stmt, true);
9778 remove_edge (e);
9780 else
9781 ei_next (&ei);
9783 if (location == UNKNOWN_LOCATION)
9784 location = cfun->function_end_locus;
9785 warning_at (location, 0, "%<noreturn%> function does return");
9788 /* If we see "return;" in some basic block, then we do reach the end
9789 without returning a value. */
9790 else if (warn_return_type > 0
9791 && !warning_suppressed_p (fun->decl, OPT_Wreturn_type)
9792 && !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (fun->decl))))
9794 FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR_FOR_FN (fun)->preds)
9796 greturn *return_stmt = dyn_cast <greturn *> (*gsi_last_bb (e->src));
9797 if (return_stmt
9798 && gimple_return_retval (return_stmt) == NULL
9799 && !warning_suppressed_p (return_stmt, OPT_Wreturn_type))
9801 location = gimple_location (return_stmt);
9802 if (LOCATION_LOCUS (location) == UNKNOWN_LOCATION)
9803 location = fun->function_end_locus;
9804 if (warning_at (location, OPT_Wreturn_type,
9805 "control reaches end of non-void function"))
9806 suppress_warning (fun->decl, OPT_Wreturn_type);
9807 break;
9810 /* The C++ FE turns fallthrough from the end of non-void function
9811 into __builtin_unreachable () call with BUILTINS_LOCATION.
9812 Recognize those as well as calls from ubsan_instrument_return. */
9813 basic_block bb;
9814 if (!warning_suppressed_p (fun->decl, OPT_Wreturn_type))
9815 FOR_EACH_BB_FN (bb, fun)
9816 if (EDGE_COUNT (bb->succs) == 0)
9818 gimple *last = *gsi_last_bb (bb);
9819 const enum built_in_function ubsan_missing_ret
9820 = BUILT_IN_UBSAN_HANDLE_MISSING_RETURN;
9821 if (last
9822 && ((LOCATION_LOCUS (gimple_location (last))
9823 == BUILTINS_LOCATION
9824 && (gimple_call_builtin_p (last, BUILT_IN_UNREACHABLE)
9825 || gimple_call_builtin_p (last,
9826 BUILT_IN_UNREACHABLE_TRAP)
9827 || gimple_call_builtin_p (last, BUILT_IN_TRAP)))
9828 || gimple_call_builtin_p (last, ubsan_missing_ret)))
9830 gimple_stmt_iterator gsi = gsi_for_stmt (last);
9831 gsi_prev_nondebug (&gsi);
9832 gimple *prev = gsi_stmt (gsi);
9833 if (prev == NULL)
9834 location = UNKNOWN_LOCATION;
9835 else
9836 location = gimple_location (prev);
9837 if (LOCATION_LOCUS (location) == UNKNOWN_LOCATION)
9838 location = fun->function_end_locus;
9839 if (warning_at (location, OPT_Wreturn_type,
9840 "control reaches end of non-void function"))
9841 suppress_warning (fun->decl, OPT_Wreturn_type);
9842 break;
9846 return 0;
9849 } // anon namespace
9851 gimple_opt_pass *
9852 make_pass_warn_function_return (gcc::context *ctxt)
9854 return new pass_warn_function_return (ctxt);
9857 /* Walk a gimplified function and warn for functions whose return value is
9858 ignored and attribute((warn_unused_result)) is set. This is done before
9859 inlining, so we don't have to worry about that. */
9861 static void
9862 do_warn_unused_result (gimple_seq seq)
9864 tree fdecl, ftype;
9865 gimple_stmt_iterator i;
9867 for (i = gsi_start (seq); !gsi_end_p (i); gsi_next (&i))
9869 gimple *g = gsi_stmt (i);
9871 switch (gimple_code (g))
9873 case GIMPLE_BIND:
9874 do_warn_unused_result (gimple_bind_body (as_a <gbind *>(g)));
9875 break;
9876 case GIMPLE_TRY:
9877 do_warn_unused_result (gimple_try_eval (g));
9878 do_warn_unused_result (gimple_try_cleanup (g));
9879 break;
9880 case GIMPLE_CATCH:
9881 do_warn_unused_result (gimple_catch_handler (
9882 as_a <gcatch *> (g)));
9883 break;
9884 case GIMPLE_EH_FILTER:
9885 do_warn_unused_result (gimple_eh_filter_failure (g));
9886 break;
9888 case GIMPLE_CALL:
9889 if (gimple_call_lhs (g))
9890 break;
9891 if (gimple_call_internal_p (g))
9892 break;
9894 /* This is a naked call, as opposed to a GIMPLE_CALL with an
9895 LHS. All calls whose value is ignored should be
9896 represented like this. Look for the attribute. */
9897 fdecl = gimple_call_fndecl (g);
9898 ftype = gimple_call_fntype (g);
9900 if (lookup_attribute ("warn_unused_result", TYPE_ATTRIBUTES (ftype)))
9902 location_t loc = gimple_location (g);
9904 if (fdecl)
9905 warning_at (loc, OPT_Wunused_result,
9906 "ignoring return value of %qD "
9907 "declared with attribute %<warn_unused_result%>",
9908 fdecl);
9909 else
9910 warning_at (loc, OPT_Wunused_result,
9911 "ignoring return value of function "
9912 "declared with attribute %<warn_unused_result%>");
9914 break;
9916 default:
9917 /* Not a container, not a call, or a call whose value is used. */
9918 break;
9923 namespace {
9925 const pass_data pass_data_warn_unused_result =
9927 GIMPLE_PASS, /* type */
9928 "*warn_unused_result", /* name */
9929 OPTGROUP_NONE, /* optinfo_flags */
9930 TV_NONE, /* tv_id */
9931 PROP_gimple_any, /* properties_required */
9932 0, /* properties_provided */
9933 0, /* properties_destroyed */
9934 0, /* todo_flags_start */
9935 0, /* todo_flags_finish */
9938 class pass_warn_unused_result : public gimple_opt_pass
9940 public:
9941 pass_warn_unused_result (gcc::context *ctxt)
9942 : gimple_opt_pass (pass_data_warn_unused_result, ctxt)
9945 /* opt_pass methods: */
9946 bool gate (function *) final override { return flag_warn_unused_result; }
9947 unsigned int execute (function *) final override
9949 do_warn_unused_result (gimple_body (current_function_decl));
9950 return 0;
9953 }; // class pass_warn_unused_result
9955 } // anon namespace
9957 gimple_opt_pass *
9958 make_pass_warn_unused_result (gcc::context *ctxt)
9960 return new pass_warn_unused_result (ctxt);
9963 /* Maybe Remove stores to variables we marked write-only.
9964 Return true if a store was removed. */
9965 static bool
9966 maybe_remove_writeonly_store (gimple_stmt_iterator &gsi, gimple *stmt,
9967 bitmap dce_ssa_names)
9969 /* Keep access when store has side effect, i.e. in case when source
9970 is volatile. */
9971 if (!gimple_store_p (stmt)
9972 || gimple_has_side_effects (stmt)
9973 || optimize_debug)
9974 return false;
9976 tree lhs = get_base_address (gimple_get_lhs (stmt));
9978 if (!VAR_P (lhs)
9979 || (!TREE_STATIC (lhs) && !DECL_EXTERNAL (lhs))
9980 || !varpool_node::get (lhs)->writeonly)
9981 return false;
9983 if (dump_file && (dump_flags & TDF_DETAILS))
9985 fprintf (dump_file, "Removing statement, writes"
9986 " to write only var:\n");
9987 print_gimple_stmt (dump_file, stmt, 0,
9988 TDF_VOPS|TDF_MEMSYMS);
9991 /* Mark ssa name defining to be checked for simple dce. */
9992 if (gimple_assign_single_p (stmt))
9994 tree rhs = gimple_assign_rhs1 (stmt);
9995 if (TREE_CODE (rhs) == SSA_NAME
9996 && !SSA_NAME_IS_DEFAULT_DEF (rhs))
9997 bitmap_set_bit (dce_ssa_names, SSA_NAME_VERSION (rhs));
9999 unlink_stmt_vdef (stmt);
10000 gsi_remove (&gsi, true);
10001 release_defs (stmt);
10002 return true;
10005 /* IPA passes, compilation of earlier functions or inlining
10006 might have changed some properties, such as marked functions nothrow,
10007 pure, const or noreturn.
10008 Remove redundant edges and basic blocks, and create new ones if necessary. */
10010 unsigned int
10011 execute_fixup_cfg (void)
10013 basic_block bb;
10014 gimple_stmt_iterator gsi;
10015 int todo = 0;
10016 cgraph_node *node = cgraph_node::get (current_function_decl);
10017 /* Same scaling is also done by ipa_merge_profiles. */
10018 profile_count num = node->count;
10019 profile_count den = ENTRY_BLOCK_PTR_FOR_FN (cfun)->count;
10020 bool scale = num.initialized_p () && !(num == den);
10021 auto_bitmap dce_ssa_names;
10023 if (scale)
10025 profile_count::adjust_for_ipa_scaling (&num, &den);
10026 ENTRY_BLOCK_PTR_FOR_FN (cfun)->count = node->count;
10027 EXIT_BLOCK_PTR_FOR_FN (cfun)->count
10028 = EXIT_BLOCK_PTR_FOR_FN (cfun)->count.apply_scale (num, den);
10031 FOR_EACH_BB_FN (bb, cfun)
10033 if (scale)
10034 bb->count = bb->count.apply_scale (num, den);
10035 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi);)
10037 gimple *stmt = gsi_stmt (gsi);
10038 tree decl = is_gimple_call (stmt)
10039 ? gimple_call_fndecl (stmt)
10040 : NULL;
10041 if (decl)
10043 int flags = gimple_call_flags (stmt);
10044 if (flags & (ECF_CONST | ECF_PURE | ECF_LOOPING_CONST_OR_PURE))
10046 if (gimple_in_ssa_p (cfun))
10048 todo |= TODO_update_ssa | TODO_cleanup_cfg;
10049 update_stmt (stmt);
10052 if (flags & ECF_NORETURN
10053 && fixup_noreturn_call (stmt))
10054 todo |= TODO_cleanup_cfg;
10057 /* Remove stores to variables we marked write-only. */
10058 if (maybe_remove_writeonly_store (gsi, stmt, dce_ssa_names))
10060 todo |= TODO_update_ssa | TODO_cleanup_cfg;
10061 continue;
10064 /* For calls we can simply remove LHS when it is known
10065 to be write-only. */
10066 if (is_gimple_call (stmt)
10067 && gimple_get_lhs (stmt))
10069 tree lhs = get_base_address (gimple_get_lhs (stmt));
10071 if (VAR_P (lhs)
10072 && (TREE_STATIC (lhs) || DECL_EXTERNAL (lhs))
10073 && varpool_node::get (lhs)->writeonly)
10075 gimple_call_set_lhs (stmt, NULL);
10076 update_stmt (stmt);
10077 todo |= TODO_update_ssa | TODO_cleanup_cfg;
10081 gsi_next (&gsi);
10083 if (gimple *last = *gsi_last_bb (bb))
10085 if (maybe_clean_eh_stmt (last)
10086 && gimple_purge_dead_eh_edges (bb))
10087 todo |= TODO_cleanup_cfg;
10088 if (gimple_purge_dead_abnormal_call_edges (bb))
10089 todo |= TODO_cleanup_cfg;
10092 /* If we have a basic block with no successors that does not
10093 end with a control statement or a noreturn call end it with
10094 a call to __builtin_unreachable. This situation can occur
10095 when inlining a noreturn call that does in fact return. */
10096 if (EDGE_COUNT (bb->succs) == 0)
10098 gimple *stmt = last_nondebug_stmt (bb);
10099 if (!stmt
10100 || (!is_ctrl_stmt (stmt)
10101 && (!is_gimple_call (stmt)
10102 || !gimple_call_noreturn_p (stmt))))
10104 if (stmt && is_gimple_call (stmt))
10105 gimple_call_set_ctrl_altering (stmt, false);
10106 stmt = gimple_build_builtin_unreachable (UNKNOWN_LOCATION);
10107 gimple_stmt_iterator gsi = gsi_last_bb (bb);
10108 gsi_insert_after (&gsi, stmt, GSI_NEW_STMT);
10109 if (!cfun->after_inlining)
10110 if (tree fndecl = gimple_call_fndecl (stmt))
10112 gcall *call_stmt = dyn_cast <gcall *> (stmt);
10113 node->create_edge (cgraph_node::get_create (fndecl),
10114 call_stmt, bb->count);
10119 if (scale)
10121 update_max_bb_count ();
10122 compute_function_frequency ();
10125 if (current_loops
10126 && (todo & TODO_cleanup_cfg))
10127 loops_state_set (LOOPS_NEED_FIXUP);
10129 simple_dce_from_worklist (dce_ssa_names);
10131 return todo;
10134 namespace {
10136 const pass_data pass_data_fixup_cfg =
10138 GIMPLE_PASS, /* type */
10139 "fixup_cfg", /* name */
10140 OPTGROUP_NONE, /* optinfo_flags */
10141 TV_NONE, /* tv_id */
10142 PROP_cfg, /* properties_required */
10143 0, /* properties_provided */
10144 0, /* properties_destroyed */
10145 0, /* todo_flags_start */
10146 0, /* todo_flags_finish */
10149 class pass_fixup_cfg : public gimple_opt_pass
10151 public:
10152 pass_fixup_cfg (gcc::context *ctxt)
10153 : gimple_opt_pass (pass_data_fixup_cfg, ctxt)
10156 /* opt_pass methods: */
10157 opt_pass * clone () final override { return new pass_fixup_cfg (m_ctxt); }
10158 unsigned int execute (function *) final override
10160 return execute_fixup_cfg ();
10163 }; // class pass_fixup_cfg
10165 } // anon namespace
10167 gimple_opt_pass *
10168 make_pass_fixup_cfg (gcc::context *ctxt)
10170 return new pass_fixup_cfg (ctxt);
10173 /* Garbage collection support for edge_def. */
10175 extern void gt_ggc_mx (tree&);
10176 extern void gt_ggc_mx (gimple *&);
10177 extern void gt_ggc_mx (rtx&);
10178 extern void gt_ggc_mx (basic_block&);
10180 static void
10181 gt_ggc_mx (rtx_insn *& x)
10183 if (x)
10184 gt_ggc_mx_rtx_def ((void *) x);
10187 void
10188 gt_ggc_mx (edge_def *e)
10190 tree block = LOCATION_BLOCK (e->goto_locus);
10191 gt_ggc_mx (e->src);
10192 gt_ggc_mx (e->dest);
10193 if (current_ir_type () == IR_GIMPLE)
10194 gt_ggc_mx (e->insns.g);
10195 else
10196 gt_ggc_mx (e->insns.r);
10197 gt_ggc_mx (block);
10200 /* PCH support for edge_def. */
10202 extern void gt_pch_nx (tree&);
10203 extern void gt_pch_nx (gimple *&);
10204 extern void gt_pch_nx (rtx&);
10205 extern void gt_pch_nx (basic_block&);
10207 static void
10208 gt_pch_nx (rtx_insn *& x)
10210 if (x)
10211 gt_pch_nx_rtx_def ((void *) x);
10214 void
10215 gt_pch_nx (edge_def *e)
10217 tree block = LOCATION_BLOCK (e->goto_locus);
10218 gt_pch_nx (e->src);
10219 gt_pch_nx (e->dest);
10220 if (current_ir_type () == IR_GIMPLE)
10221 gt_pch_nx (e->insns.g);
10222 else
10223 gt_pch_nx (e->insns.r);
10224 gt_pch_nx (block);
10227 void
10228 gt_pch_nx (edge_def *e, gt_pointer_operator op, void *cookie)
10230 tree block = LOCATION_BLOCK (e->goto_locus);
10231 op (&(e->src), NULL, cookie);
10232 op (&(e->dest), NULL, cookie);
10233 if (current_ir_type () == IR_GIMPLE)
10234 op (&(e->insns.g), NULL, cookie);
10235 else
10236 op (&(e->insns.r), NULL, cookie);
10237 op (&(block), &(block), cookie);
10240 #if CHECKING_P
10242 namespace selftest {
10244 /* Helper function for CFG selftests: create a dummy function decl
10245 and push it as cfun. */
10247 static tree
10248 push_fndecl (const char *name)
10250 tree fn_type = build_function_type_array (integer_type_node, 0, NULL);
10251 /* FIXME: this uses input_location: */
10252 tree fndecl = build_fn_decl (name, fn_type);
10253 tree retval = build_decl (UNKNOWN_LOCATION, RESULT_DECL,
10254 NULL_TREE, integer_type_node);
10255 DECL_RESULT (fndecl) = retval;
10256 push_struct_function (fndecl);
10257 function *fun = DECL_STRUCT_FUNCTION (fndecl);
10258 ASSERT_TRUE (fun != NULL);
10259 init_empty_tree_cfg_for_function (fun);
10260 ASSERT_EQ (2, n_basic_blocks_for_fn (fun));
10261 ASSERT_EQ (0, n_edges_for_fn (fun));
10262 return fndecl;
10265 /* These tests directly create CFGs.
10266 Compare with the static fns within tree-cfg.cc:
10267 - build_gimple_cfg
10268 - make_blocks: calls create_basic_block (seq, bb);
10269 - make_edges. */
10271 /* Verify a simple cfg of the form:
10272 ENTRY -> A -> B -> C -> EXIT. */
10274 static void
10275 test_linear_chain ()
10277 gimple_register_cfg_hooks ();
10279 tree fndecl = push_fndecl ("cfg_test_linear_chain");
10280 function *fun = DECL_STRUCT_FUNCTION (fndecl);
10282 /* Create some empty blocks. */
10283 basic_block bb_a = create_empty_bb (ENTRY_BLOCK_PTR_FOR_FN (fun));
10284 basic_block bb_b = create_empty_bb (bb_a);
10285 basic_block bb_c = create_empty_bb (bb_b);
10287 ASSERT_EQ (5, n_basic_blocks_for_fn (fun));
10288 ASSERT_EQ (0, n_edges_for_fn (fun));
10290 /* Create some edges: a simple linear chain of BBs. */
10291 make_edge (ENTRY_BLOCK_PTR_FOR_FN (fun), bb_a, EDGE_FALLTHRU);
10292 make_edge (bb_a, bb_b, 0);
10293 make_edge (bb_b, bb_c, 0);
10294 make_edge (bb_c, EXIT_BLOCK_PTR_FOR_FN (fun), 0);
10296 /* Verify the edges. */
10297 ASSERT_EQ (4, n_edges_for_fn (fun));
10298 ASSERT_EQ (NULL, ENTRY_BLOCK_PTR_FOR_FN (fun)->preds);
10299 ASSERT_EQ (1, ENTRY_BLOCK_PTR_FOR_FN (fun)->succs->length ());
10300 ASSERT_EQ (1, bb_a->preds->length ());
10301 ASSERT_EQ (1, bb_a->succs->length ());
10302 ASSERT_EQ (1, bb_b->preds->length ());
10303 ASSERT_EQ (1, bb_b->succs->length ());
10304 ASSERT_EQ (1, bb_c->preds->length ());
10305 ASSERT_EQ (1, bb_c->succs->length ());
10306 ASSERT_EQ (1, EXIT_BLOCK_PTR_FOR_FN (fun)->preds->length ());
10307 ASSERT_EQ (NULL, EXIT_BLOCK_PTR_FOR_FN (fun)->succs);
10309 /* Verify the dominance information
10310 Each BB in our simple chain should be dominated by the one before
10311 it. */
10312 calculate_dominance_info (CDI_DOMINATORS);
10313 ASSERT_EQ (bb_a, get_immediate_dominator (CDI_DOMINATORS, bb_b));
10314 ASSERT_EQ (bb_b, get_immediate_dominator (CDI_DOMINATORS, bb_c));
10315 auto_vec<basic_block> dom_by_b = get_dominated_by (CDI_DOMINATORS, bb_b);
10316 ASSERT_EQ (1, dom_by_b.length ());
10317 ASSERT_EQ (bb_c, dom_by_b[0]);
10318 free_dominance_info (CDI_DOMINATORS);
10320 /* Similarly for post-dominance: each BB in our chain is post-dominated
10321 by the one after it. */
10322 calculate_dominance_info (CDI_POST_DOMINATORS);
10323 ASSERT_EQ (bb_b, get_immediate_dominator (CDI_POST_DOMINATORS, bb_a));
10324 ASSERT_EQ (bb_c, get_immediate_dominator (CDI_POST_DOMINATORS, bb_b));
10325 auto_vec<basic_block> postdom_by_b = get_dominated_by (CDI_POST_DOMINATORS, bb_b);
10326 ASSERT_EQ (1, postdom_by_b.length ());
10327 ASSERT_EQ (bb_a, postdom_by_b[0]);
10328 free_dominance_info (CDI_POST_DOMINATORS);
10330 pop_cfun ();
10333 /* Verify a simple CFG of the form:
10334 ENTRY
10338 /t \f
10344 EXIT. */
10346 static void
10347 test_diamond ()
10349 gimple_register_cfg_hooks ();
10351 tree fndecl = push_fndecl ("cfg_test_diamond");
10352 function *fun = DECL_STRUCT_FUNCTION (fndecl);
10354 /* Create some empty blocks. */
10355 basic_block bb_a = create_empty_bb (ENTRY_BLOCK_PTR_FOR_FN (fun));
10356 basic_block bb_b = create_empty_bb (bb_a);
10357 basic_block bb_c = create_empty_bb (bb_a);
10358 basic_block bb_d = create_empty_bb (bb_b);
10360 ASSERT_EQ (6, n_basic_blocks_for_fn (fun));
10361 ASSERT_EQ (0, n_edges_for_fn (fun));
10363 /* Create the edges. */
10364 make_edge (ENTRY_BLOCK_PTR_FOR_FN (fun), bb_a, EDGE_FALLTHRU);
10365 make_edge (bb_a, bb_b, EDGE_TRUE_VALUE);
10366 make_edge (bb_a, bb_c, EDGE_FALSE_VALUE);
10367 make_edge (bb_b, bb_d, 0);
10368 make_edge (bb_c, bb_d, 0);
10369 make_edge (bb_d, EXIT_BLOCK_PTR_FOR_FN (fun), 0);
10371 /* Verify the edges. */
10372 ASSERT_EQ (6, n_edges_for_fn (fun));
10373 ASSERT_EQ (1, bb_a->preds->length ());
10374 ASSERT_EQ (2, bb_a->succs->length ());
10375 ASSERT_EQ (1, bb_b->preds->length ());
10376 ASSERT_EQ (1, bb_b->succs->length ());
10377 ASSERT_EQ (1, bb_c->preds->length ());
10378 ASSERT_EQ (1, bb_c->succs->length ());
10379 ASSERT_EQ (2, bb_d->preds->length ());
10380 ASSERT_EQ (1, bb_d->succs->length ());
10382 /* Verify the dominance information. */
10383 calculate_dominance_info (CDI_DOMINATORS);
10384 ASSERT_EQ (bb_a, get_immediate_dominator (CDI_DOMINATORS, bb_b));
10385 ASSERT_EQ (bb_a, get_immediate_dominator (CDI_DOMINATORS, bb_c));
10386 ASSERT_EQ (bb_a, get_immediate_dominator (CDI_DOMINATORS, bb_d));
10387 auto_vec<basic_block> dom_by_a = get_dominated_by (CDI_DOMINATORS, bb_a);
10388 ASSERT_EQ (3, dom_by_a.length ()); /* B, C, D, in some order. */
10389 dom_by_a.release ();
10390 auto_vec<basic_block> dom_by_b = get_dominated_by (CDI_DOMINATORS, bb_b);
10391 ASSERT_EQ (0, dom_by_b.length ());
10392 dom_by_b.release ();
10393 free_dominance_info (CDI_DOMINATORS);
10395 /* Similarly for post-dominance. */
10396 calculate_dominance_info (CDI_POST_DOMINATORS);
10397 ASSERT_EQ (bb_d, get_immediate_dominator (CDI_POST_DOMINATORS, bb_a));
10398 ASSERT_EQ (bb_d, get_immediate_dominator (CDI_POST_DOMINATORS, bb_b));
10399 ASSERT_EQ (bb_d, get_immediate_dominator (CDI_POST_DOMINATORS, bb_c));
10400 auto_vec<basic_block> postdom_by_d = get_dominated_by (CDI_POST_DOMINATORS, bb_d);
10401 ASSERT_EQ (3, postdom_by_d.length ()); /* A, B, C in some order. */
10402 postdom_by_d.release ();
10403 auto_vec<basic_block> postdom_by_b = get_dominated_by (CDI_POST_DOMINATORS, bb_b);
10404 ASSERT_EQ (0, postdom_by_b.length ());
10405 postdom_by_b.release ();
10406 free_dominance_info (CDI_POST_DOMINATORS);
10408 pop_cfun ();
10411 /* Verify that we can handle a CFG containing a "complete" aka
10412 fully-connected subgraph (where A B C D below all have edges
10413 pointing to each other node, also to themselves).
10414 e.g.:
10415 ENTRY EXIT
10421 A<--->B
10422 ^^ ^^
10423 | \ / |
10424 | X |
10425 | / \ |
10426 VV VV
10427 C<--->D
10430 static void
10431 test_fully_connected ()
10433 gimple_register_cfg_hooks ();
10435 tree fndecl = push_fndecl ("cfg_fully_connected");
10436 function *fun = DECL_STRUCT_FUNCTION (fndecl);
10438 const int n = 4;
10440 /* Create some empty blocks. */
10441 auto_vec <basic_block> subgraph_nodes;
10442 for (int i = 0; i < n; i++)
10443 subgraph_nodes.safe_push (create_empty_bb (ENTRY_BLOCK_PTR_FOR_FN (fun)));
10445 ASSERT_EQ (n + 2, n_basic_blocks_for_fn (fun));
10446 ASSERT_EQ (0, n_edges_for_fn (fun));
10448 /* Create the edges. */
10449 make_edge (ENTRY_BLOCK_PTR_FOR_FN (fun), subgraph_nodes[0], EDGE_FALLTHRU);
10450 make_edge (subgraph_nodes[0], EXIT_BLOCK_PTR_FOR_FN (fun), 0);
10451 for (int i = 0; i < n; i++)
10452 for (int j = 0; j < n; j++)
10453 make_edge (subgraph_nodes[i], subgraph_nodes[j], 0);
10455 /* Verify the edges. */
10456 ASSERT_EQ (2 + (n * n), n_edges_for_fn (fun));
10457 /* The first one is linked to ENTRY/EXIT as well as itself and
10458 everything else. */
10459 ASSERT_EQ (n + 1, subgraph_nodes[0]->preds->length ());
10460 ASSERT_EQ (n + 1, subgraph_nodes[0]->succs->length ());
10461 /* The other ones in the subgraph are linked to everything in
10462 the subgraph (including themselves). */
10463 for (int i = 1; i < n; i++)
10465 ASSERT_EQ (n, subgraph_nodes[i]->preds->length ());
10466 ASSERT_EQ (n, subgraph_nodes[i]->succs->length ());
10469 /* Verify the dominance information. */
10470 calculate_dominance_info (CDI_DOMINATORS);
10471 /* The initial block in the subgraph should be dominated by ENTRY. */
10472 ASSERT_EQ (ENTRY_BLOCK_PTR_FOR_FN (fun),
10473 get_immediate_dominator (CDI_DOMINATORS,
10474 subgraph_nodes[0]));
10475 /* Every other block in the subgraph should be dominated by the
10476 initial block. */
10477 for (int i = 1; i < n; i++)
10478 ASSERT_EQ (subgraph_nodes[0],
10479 get_immediate_dominator (CDI_DOMINATORS,
10480 subgraph_nodes[i]));
10481 free_dominance_info (CDI_DOMINATORS);
10483 /* Similarly for post-dominance. */
10484 calculate_dominance_info (CDI_POST_DOMINATORS);
10485 /* The initial block in the subgraph should be postdominated by EXIT. */
10486 ASSERT_EQ (EXIT_BLOCK_PTR_FOR_FN (fun),
10487 get_immediate_dominator (CDI_POST_DOMINATORS,
10488 subgraph_nodes[0]));
10489 /* Every other block in the subgraph should be postdominated by the
10490 initial block, since that leads to EXIT. */
10491 for (int i = 1; i < n; i++)
10492 ASSERT_EQ (subgraph_nodes[0],
10493 get_immediate_dominator (CDI_POST_DOMINATORS,
10494 subgraph_nodes[i]));
10495 free_dominance_info (CDI_POST_DOMINATORS);
10497 pop_cfun ();
10500 /* Run all of the selftests within this file. */
10502 void
10503 tree_cfg_cc_tests ()
10505 test_linear_chain ();
10506 test_diamond ();
10507 test_fully_connected ();
10510 } // namespace selftest
10512 /* TODO: test the dominator/postdominator logic with various graphs/nodes:
10513 - loop
10514 - nested loops
10515 - switch statement (a block with many out-edges)
10516 - something that jumps to itself
10517 - etc */
10519 #endif /* CHECKING_P */