1 /* Control flow functions for trees. 2 Copyright (C) 2001-2024 Free Software Foundation, Inc. 3 Contributed by Diego Novillo <dnovillo (at) redhat.com> 4 5 This file is part of GCC. 6 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. 11 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. 16 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/>. */ 20 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" 68 69 /* This file contains functions for building the Control Flow Graph (CFG) 70 for a function tree. */ 71 72 /* Local declarations. */ 73 74 /* Initial capacity for the basic block array. */ 75 static const int initial_cfg_capacity = 20; 76 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. 81 82 Access to this list of CASE_LABEL_EXPRs allows us to efficiently 83 update the case vector in response to edge redirections. 84 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). */ 89 90 static hash_map<edge, tree> *edge_to_cases; 91 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. */ 95 96 static bitmap touched_switch_bbs; 97 98 /* OpenMP region idxs for blocks during cfg pass. */ 99 static vec<int> bb_to_omp_idx; 100 101 /* CFG statistics. */ 102 struct cfg_stats_d 103 { 104 long num_merged_labels; 105 }; 106 107 static struct cfg_stats_d cfg_stats; 108 109 /* Data to pass to replace_block_vars_by_duplicates_1. */ 110 struct replace_decls_d 111 { 112 hash_map<tree, tree> *vars_map; 113 tree to_context; 114 }; 115 116 /* Hash table to store last discriminator assigned for each locus. */ 117 struct locus_discrim_map 118 { 119 int location_line; 120 int discriminator; 121 }; 122 123 /* Hashtable helpers. */ 124 125 struct locus_discrim_hasher : free_ptr_hash <locus_discrim_map> 126 { 127 static inline hashval_t hash (const locus_discrim_map *); 128 static inline bool equal (const locus_discrim_map *, 129 const locus_discrim_map *); 130 }; 131 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. */ 134 135 inline hashval_t 136 locus_discrim_hasher::hash (const locus_discrim_map *item) 137 { 138 return item->location_line; 139 } 140 141 /* Equality function for the locus-to-discriminator map. A and B 142 point to the two hash table entries to compare. */ 143 144 inline bool 145 locus_discrim_hasher::equal (const locus_discrim_map *a, 146 const locus_discrim_map *b) 147 { 148 return a->location_line == b->location_line; 149 } 150 151 static hash_table<locus_discrim_hasher> *discriminator_per_locus; 152 153 /* Basic blocks and flowgraphs. */ 154 static void make_blocks (gimple_seq); 155 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); 165 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_nondebug_stmt (basic_block); 171 static bool verify_gimple_transaction (gtransaction *); 172 static bool call_can_make_abnormal_goto (gimple *); 173 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); 180 181 void 182 init_empty_tree_cfg_for_function (struct function *fn) 183 { 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); 191 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); 195 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)); 198 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); 203 } 204 205 void 206 init_empty_tree_cfg (void) 207 { 208 init_empty_tree_cfg_for_function (cfun); 209 } 210 211 /*--------------------------------------------------------------------------- 212 Create basic blocks 213 ---------------------------------------------------------------------------*/ 214 215 /* Entry point to the CFG builder for trees. SEQ is the sequence of 216 statements to be added to the flowgraph. */ 217 218 static void 219 build_gimple_cfg (gimple_seq seq) 220 { 221 /* Register specific gimple functions. */ 222 gimple_register_cfg_hooks (); 223 224 memset ((void *) &cfg_stats, 0, sizeof (cfg_stats)); 225 226 init_empty_tree_cfg (); 227 228 make_blocks (seq); 229 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)); 233 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)); 239 240 /* To speed up statement iterator walks, we first purge dead labels. */ 241 cleanup_dead_labels (); 242 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 (); 247 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; 255 } 256 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. */ 260 261 static void 262 replace_loop_annotate_in_block (basic_block bb, class loop *loop) 263 { 264 gimple_stmt_iterator gsi = gsi_last_bb (bb); 265 gimple *stmt = gsi_stmt (gsi); 266 267 if (!(stmt && gimple_code (stmt) == GIMPLE_COND)) 268 return; 269 270 for (gsi_prev_nondebug (&gsi); !gsi_end_p (gsi); gsi_prev (&gsi)) 271 { 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; 278 279 switch ((annot_expr_kind) tree_to_shwi (gimple_call_arg (stmt, 1))) 280 { 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 (); 305 } 306 307 stmt = gimple_build_assign (gimple_call_lhs (stmt), 308 gimple_call_arg (stmt, 0)); 309 gsi_replace (&gsi, stmt, true); 310 } 311 } 312 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. */ 316 317 static void 318 replace_loop_annotate (void) 319 { 320 basic_block bb; 321 gimple_stmt_iterator gsi; 322 gimple *stmt; 323 324 for (auto loop : loops_list (cfun, 0)) 325 { 326 /* Push the global flag_finite_loops state down to individual loops. */ 327 loop->finite_p = flag_finite_loops; 328 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); 332 } 333 334 /* Remove IFN_ANNOTATE. Safeguard for the case loop->latch == NULL. */ 335 FOR_EACH_BB_FN (bb, cfun) 336 { 337 for (gsi = gsi_last_bb (bb); !gsi_end_p (gsi); gsi_prev (&gsi)) 338 { 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; 345 346 switch ((annot_expr_kind) tree_to_shwi (gimple_call_arg (stmt, 1))) 347 { 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 (); 357 } 358 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); 363 } 364 } 365 } 366 367 static unsigned int 368 execute_build_cfg (void) 369 { 370 gimple_seq body = gimple_body (current_function_decl); 371 372 build_gimple_cfg (body); 373 gimple_set_body (current_function_decl, NULL); 374 if (dump_file && (dump_flags & TDF_DETAILS)) 375 { 376 fprintf (dump_file, "Scope blocks:\n"); 377 dump_scope_blocks (dump_file, dump_flags); 378 } 379 cleanup_tree_cfg (); 380 381 bb_to_omp_idx.release (); 382 383 loop_optimizer_init (AVOID_CFG_MODIFICATIONS); 384 replace_loop_annotate (); 385 return 0; 386 } 387 388 namespace { 389 390 const pass_data pass_data_build_cfg = 391 { 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 */ 401 }; 402 403 class pass_build_cfg : public gimple_opt_pass 404 { 405 public: 406 pass_build_cfg (gcc::context *ctxt) 407 : gimple_opt_pass (pass_data_build_cfg, ctxt) 408 {} 409 410 /* opt_pass methods: */ 411 unsigned int execute (function *) final override 412 { 413 return execute_build_cfg (); 414 } 415 416 }; // class pass_build_cfg 417 418 } // anon namespace 419 420 gimple_opt_pass * 421 make_pass_build_cfg (gcc::context *ctxt) 422 { 423 return new pass_build_cfg (ctxt); 424 } 425 426 427 /* Return true if T is a computed goto. */ 428 429 bool 430 computed_goto_p (gimple *t) 431 { 432 return (gimple_code (t) == GIMPLE_GOTO 433 && TREE_CODE (gimple_goto_dest (t)) != LABEL_DECL); 434 } 435 436 /* Returns true if the sequence of statements STMTS only contains 437 a call to __builtin_unreachable (). */ 438 439 bool 440 gimple_seq_unreachable_p (gimple_seq stmts) 441 { 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; 449 450 gimple_stmt_iterator gsi = gsi_last (stmts); 451 452 if (!gimple_call_builtin_p (gsi_stmt (gsi), BUILT_IN_UNREACHABLE)) 453 return false; 454 455 for (gsi_prev (&gsi); !gsi_end_p (gsi); gsi_prev (&gsi)) 456 { 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; 462 } 463 return true; 464 } 465 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>: 470 ... 471 if (something) 472 goto <bb N>; 473 else 474 goto <bb M>; 475 <bb N>: 476 __builtin_unreachable (); 477 <bb M>: */ 478 479 bool 480 assert_unreachable_fallthru_edge_p (edge e) 481 { 482 basic_block pred_bb = e->src; 483 if (safe_is_a <gcond *> (*gsi_last_bb (pred_bb))) 484 { 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)); 490 } 491 return false; 492 } 493 494 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. */ 498 499 static void 500 gimple_call_initialize_ctrl_altering (gimple *stmt) 501 { 502 int flags = gimple_call_flags (stmt); 503 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); 522 } 523 524 525 /* Insert SEQ after BB and build a flowgraph. */ 526 527 static basic_block 528 make_blocks_1 (gimple_seq seq, basic_block bb) 529 { 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; 535 536 while (!gsi_end_p (i)) 537 { 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); 549 550 if (stmt && is_gimple_call (stmt)) 551 gimple_call_initialize_ctrl_altering (stmt); 552 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)) 557 { 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; 563 } 564 565 /* Now add STMT to BB and create the subgraphs for special statement 566 codes. */ 567 gimple_set_bb (stmt, bb); 568 569 /* If STMT is a basic block terminator, set START_NEW_BLOCK for the 570 next iteration. */ 571 if (stmt_ends_bb_p (stmt)) 572 { 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)))) 581 { 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); 589 } 590 start_new_block = true; 591 } 592 593 gsi_next (&i); 594 first_stmt_of_seq = false; 595 } 596 return bb; 597 } 598 599 /* Build a flowgraph for the sequence of stmts SEQ. */ 600 601 static void 602 make_blocks (gimple_seq seq) 603 { 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. 612 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) 622 { 623 gimple_stmt_iterator label = gsi_none (); 624 625 for (gimple_stmt_iterator i = gsi_last (seq); !gsi_end_p (i); gsi_prev (&i)) 626 { 627 gimple *stmt = gsi_stmt (i); 628 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)) 632 { 633 if (gsi_end_p (label)) 634 label = i; 635 continue; 636 } 637 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; 642 643 /* Move the debug stmt at I after LABEL. */ 644 if (is_gimple_debug (stmt)) 645 { 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, ©); 656 continue; 657 } 658 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 (); 662 } 663 } 664 665 make_blocks_1 (seq, ENTRY_BLOCK_PTR_FOR_FN (cfun)); 666 } 667 668 /* Create and return a new empty basic block after bb AFTER. */ 669 670 static basic_block 671 create_bb (void *h, void *e, basic_block after) 672 { 673 basic_block bb; 674 675 gcc_assert (!e); 676 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 (); 681 682 bb->index = last_basic_block_for_fn (cfun); 683 bb->flags = BB_NEW; 684 set_bb_seq (bb, h ? (gimple_seq) h : NULL); 685 686 /* Add the new block to the linked list of blocks. */ 687 link_block (bb, after); 688 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); 694 695 /* Add the newly created block to the array. */ 696 SET_BASIC_BLOCK_FOR_FN (cfun, last_basic_block_for_fn (cfun), bb); 697 698 n_basic_blocks_for_fn (cfun)++; 699 last_basic_block_for_fn (cfun)++; 700 701 return bb; 702 } 703 704 705 /*--------------------------------------------------------------------------- 706 Edge creation 707 ---------------------------------------------------------------------------*/ 708 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. */ 712 713 basic_block 714 get_abnormal_succ_dispatcher (basic_block bb) 715 { 716 edge e; 717 edge_iterator ei; 718 719 FOR_EACH_EDGE (e, ei, bb->succs) 720 if ((e->flags & (EDGE_ABNORMAL | EDGE_EH)) == EDGE_ABNORMAL) 721 { 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; 727 } 728 return NULL; 729 } 730 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. */ 735 736 static void 737 handle_abnormal_edges (basic_block *dispatcher_bbs, basic_block for_bb, 738 auto_vec<basic_block> *bbs, bool computed_goto) 739 { 740 basic_block *dispatcher = dispatcher_bbs + (computed_goto ? 1 : 0); 741 unsigned int idx = 0; 742 basic_block bb; 743 bool inner = false; 744 745 if (!bb_to_omp_idx.is_empty ()) 746 { 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; 750 } 751 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) 756 { 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 ()) 761 { 762 if (bbs->is_empty ()) 763 return; 764 } 765 else 766 { 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; 772 } 773 774 /* Create the dispatcher bb. */ 775 *dispatcher = create_basic_block (NULL, for_bb); 776 if (computed_goto) 777 { 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); 782 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"); 787 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); 795 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); 799 800 FOR_EACH_VEC_ELT (*bbs, idx, bb) 801 { 802 if (!bb_to_omp_idx.is_empty () 803 && bb_to_omp_idx[bb->index] != bb_to_omp_idx[for_bb->index]) 804 continue; 805 806 gsi = gsi_last_bb (bb); 807 gimple *last = gsi_stmt (gsi); 808 809 gcc_assert (computed_goto_p (last)); 810 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); 815 816 edge e = make_edge (bb, *dispatcher, EDGE_FALLTHRU); 817 e->goto_locus = gimple_location (last); 818 gsi_remove (&gsi, true); 819 } 820 } 821 else 822 { 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); 829 830 /* Create predecessor edges of the dispatcher. */ 831 FOR_EACH_VEC_ELT (*bbs, idx, bb) 832 { 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); 837 } 838 } 839 } 840 841 make_edge (*dispatcher, for_bb, EDGE_ABNORMAL); 842 } 843 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. */ 848 849 static int 850 make_edges_bb (basic_block bb, struct omp_region **pcur_region, int *pomp_index) 851 { 852 gimple *last = *gsi_last_bb (bb); 853 bool fallthru = false; 854 int ret = 0; 855 856 if (!last) 857 return ret; 858 859 switch (gimple_code (last)) 860 { 861 case GIMPLE_GOTO: 862 if (make_goto_expr_edges (bb)) 863 ret = 1; 864 fallthru = false; 865 break; 866 case GIMPLE_RETURN: 867 { 868 edge e = make_edge (bb, EXIT_BLOCK_PTR_FOR_FN (cfun), 0); 869 e->goto_locus = gimple_location (last); 870 fallthru = false; 871 } 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; 888 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; 895 896 /* If this statement has reachable exception handlers, then 897 create abnormal edges to them. */ 898 make_eh_edge (last); 899 900 /* BUILTIN_RETURN is really a return statement. */ 901 if (gimple_call_builtin_p (last, BUILT_IN_RETURN)) 902 { 903 make_edge (bb, EXIT_BLOCK_PTR_FOR_FN (cfun), 0); 904 fallthru = false; 905 } 906 /* Some calls are known not to return. */ 907 else 908 fallthru = !gimple_call_noreturn_p (last); 909 break; 910 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; 918 919 case GIMPLE_ASM: 920 make_gimple_asm_edges (bb); 921 fallthru = true; 922 break; 923 924 CASE_GIMPLE_OMP: 925 fallthru = omp_make_gimple_edges (bb, pcur_region, pomp_index); 926 break; 927 928 case GIMPLE_TRANSACTION: 929 { 930 gtransaction *txn = as_a <gtransaction *> (last); 931 tree label1 = gimple_transaction_label_norm (txn); 932 tree label2 = gimple_transaction_label_uninst (txn); 933 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)); 939 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); 944 945 fallthru = false; 946 } 947 break; 948 949 default: 950 gcc_assert (!stmt_ends_bb_p (last)); 951 fallthru = true; 952 break; 953 } 954 955 if (fallthru) 956 make_edge (bb, bb->next_bb, EDGE_FALLTHRU); 957 958 return ret; 959 } 960 961 /* Join all the blocks in the flowgraph. */ 962 963 static void 964 make_edges (void) 965 { 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; 971 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); 977 978 /* Traverse the basic block array placing edges. */ 979 FOR_EACH_BB_FN (bb, cfun) 980 { 981 int mer; 982 983 if (!bb_to_omp_idx.is_empty ()) 984 bb_to_omp_idx[bb->index] = cur_omp_region_idx; 985 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); 991 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); 994 } 995 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 ()) 1012 { 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); 1017 1018 if (!bb_to_omp_idx.is_empty ()) 1019 dispatcher_bbs = XCNEWVEC (basic_block, 2 * count); 1020 1021 FOR_EACH_BB_FN (bb, cfun) 1022 { 1023 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) 1024 { 1025 glabel *label_stmt = dyn_cast <glabel *> (gsi_stmt (gsi)); 1026 tree target; 1027 1028 if (!label_stmt) 1029 break; 1030 1031 target = gimple_label_label (label_stmt); 1032 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)) 1039 { 1040 handle_abnormal_edges (dispatcher_bbs, bb, &ab_edge_call, 1041 false); 1042 break; 1043 } 1044 } 1045 1046 if (!gsi_end_p (gsi) && is_gimple_debug (gsi_stmt (gsi))) 1047 gsi_next_nondebug (&gsi); 1048 if (!gsi_end_p (gsi)) 1049 { 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); 1058 } 1059 } 1060 1061 if (!bb_to_omp_idx.is_empty ()) 1062 XDELETE (dispatcher_bbs); 1063 } 1064 1065 omp_free_regions (); 1066 } 1067 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. */ 1074 1075 bool 1076 gimple_find_sub_bbs (gimple_seq seq, gimple_stmt_iterator *gsi) 1077 { 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) 1094 { 1095 struct omp_region *cur_region = NULL; 1096 profile_count cnt = profile_count::zero (); 1097 bool all = true; 1098 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); 1103 1104 edge e; 1105 edge_iterator ei; 1106 FOR_EACH_EDGE (e, ei, bb->preds) 1107 { 1108 if (e->count ().initialized_p ()) 1109 cnt += e->count (); 1110 else 1111 all = false; 1112 } 1113 tree_guess_outgoing_edge_probabilities (bb); 1114 if (all || profile_status_for_fn (cfun) == PROFILE_READ) 1115 bb->count = cnt; 1116 1117 bb = bb->next_bb; 1118 } 1119 return true; 1120 } 1121 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. */ 1126 1127 static int 1128 next_discriminator_for_locus (int line) 1129 { 1130 struct locus_discrim_map item; 1131 struct locus_discrim_map **slot; 1132 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) 1138 { 1139 *slot = XNEW (struct locus_discrim_map); 1140 gcc_assert (*slot); 1141 (*slot)->location_line = line; 1142 (*slot)->discriminator = 0; 1143 } 1144 (*slot)->discriminator++; 1145 return (*slot)->discriminator; 1146 } 1147 1148 /* Return TRUE if LOCUS1 and LOCUS2 refer to the same source line. */ 1149 1150 static bool 1151 same_line_p (location_t locus1, expanded_location *from, location_t locus2) 1152 { 1153 expanded_location to; 1154 1155 if (locus1 == locus2) 1156 return true; 1157 1158 to = expand_location (locus2); 1159 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); 1167 } 1168 1169 /* Assign a unique discriminator value to all statements in block bb that 1170 have the same line number as locus. */ 1171 1172 static void 1173 assign_discriminator (location_t locus, basic_block bb) 1174 { 1175 gimple_stmt_iterator gsi; 1176 int discriminator; 1177 1178 if (locus == UNKNOWN_LOCATION) 1179 return; 1180 1181 expanded_location locus_e = expand_location (locus); 1182 1183 discriminator = next_discriminator_for_locus (locus_e.line); 1184 1185 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) 1186 { 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)); 1192 } 1193 } 1194 1195 /* Assign discriminators to statement locations. */ 1196 1197 static void 1198 assign_discriminators (void) 1199 { 1200 basic_block bb; 1201 1202 FOR_EACH_BB_FN (bb, cfun) 1203 { 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; 1210 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)) 1215 { 1216 gimple *stmt = gsi_stmt (gsi); 1217 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)) 1222 { 1223 if (curr_locus != UNKNOWN_LOCATION 1224 && same_line_p (curr_locus, &curr_locus_e, 1225 gimple_location (stmt))) 1226 { 1227 location_t loc = gimple_location (stmt); 1228 location_t dloc = location_with_discriminator (loc, 1229 curr_discr); 1230 gimple_set_location (stmt, dloc); 1231 } 1232 continue; 1233 } 1234 if (curr_locus == UNKNOWN_LOCATION) 1235 { 1236 curr_locus = gimple_location (stmt); 1237 curr_locus_e = expand_location (curr_locus); 1238 } 1239 else if (!same_line_p (curr_locus, &curr_locus_e, gimple_location (stmt))) 1240 { 1241 curr_locus = gimple_location (stmt); 1242 curr_locus_e = expand_location (curr_locus); 1243 curr_discr = 0; 1244 } 1245 else if (curr_discr != 0) 1246 { 1247 location_t loc = gimple_location (stmt); 1248 location_t dloc = location_with_discriminator (loc, curr_discr); 1249 gimple_set_location (stmt, dloc); 1250 } 1251 /* Allocate a new discriminator for CALL stmt. */ 1252 if (gimple_code (stmt) == GIMPLE_CALL) 1253 curr_discr = next_discriminator_for_locus (curr_locus); 1254 } 1255 1256 gimple *last = last_nondebug_stmt (bb); 1257 location_t locus = last ? gimple_location (last) : UNKNOWN_LOCATION; 1258 if (locus == UNKNOWN_LOCATION) 1259 continue; 1260 1261 expanded_location locus_e = expand_location (locus); 1262 1263 FOR_EACH_EDGE (e, ei, bb->succs) 1264 { 1265 gimple *first = first_non_label_nondebug_stmt (e->dest); 1266 gimple *last = last_nondebug_stmt (e->dest); 1267 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; 1275 1276 if (stmt_on_same_line) 1277 { 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); 1283 } 1284 } 1285 } 1286 } 1287 1288 /* Create the edges for a GIMPLE_COND starting at block BB. */ 1289 1290 static void 1291 make_cond_expr_edges (basic_block bb) 1292 { 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; 1298 1299 gcc_assert (entry); 1300 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); 1308 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); 1314 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); 1318 } 1319 1320 1321 /* Called for each element in the hash table (P) as we delete the 1322 edge to cases hash table. 1323 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. */ 1327 1328 bool 1329 edge_to_cases_cleanup (edge const &, tree const &value, void *) 1330 { 1331 tree t, next; 1332 1333 for (t = value; t; t = next) 1334 { 1335 next = CASE_CHAIN (t); 1336 CASE_CHAIN (t) = NULL; 1337 } 1338 1339 return true; 1340 } 1341 1342 /* Start recording information mapping edges to case labels. */ 1343 1344 void 1345 start_recording_case_labels (void) 1346 { 1347 gcc_assert (edge_to_cases == NULL); 1348 edge_to_cases = new hash_map<edge, tree>; 1349 touched_switch_bbs = BITMAP_ALLOC (NULL); 1350 } 1351 1352 /* Return nonzero if we are recording information for case labels. */ 1353 1354 static bool 1355 recording_case_labels_p (void) 1356 { 1357 return (edge_to_cases != NULL); 1358 } 1359 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) 1364 { 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) 1371 { 1372 basic_block bb = BASIC_BLOCK_FOR_FN (cfun, i); 1373 if (bb) 1374 { 1375 if (gswitch *stmt = safe_dyn_cast <gswitch *> (*gsi_last_bb (bb))) 1376 group_case_labels_stmt (stmt); 1377 } 1378 } 1379 BITMAP_FREE (touched_switch_bbs); 1380 } 1381 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. 1384 1385 Otherwise return NULL. */ 1386 1387 tree 1388 get_cases_for_edge (edge e, gswitch *t) 1389 { 1390 tree *slot; 1391 size_t i, n; 1392 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; 1397 1398 slot = edge_to_cases->get (e); 1399 if (slot) 1400 return *slot; 1401 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. */ 1405 1406 n = gimple_switch_num_labels (t); 1407 for (i = 0; i < n; i++) 1408 { 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); 1413 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; 1419 } 1420 1421 return *edge_to_cases->get (e); 1422 } 1423 1424 /* Create the edges for a GIMPLE_SWITCH starting at block BB. */ 1425 1426 static void 1427 make_gimple_switch_edges (gswitch *entry, basic_block bb) 1428 { 1429 size_t i, n; 1430 1431 n = gimple_switch_num_labels (entry); 1432 1433 for (i = 0; i < n; ++i) 1434 { 1435 basic_block label_bb = gimple_switch_label_bb (cfun, entry, i); 1436 make_edge (bb, label_bb, 0); 1437 } 1438 } 1439 1440 1441 /* Return the basic block holding label DEST. */ 1442 1443 basic_block 1444 label_to_block (struct function *ifun, tree dest) 1445 { 1446 int uid = LABEL_DECL_UID (dest); 1447 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) 1452 { 1453 gimple_stmt_iterator gsi = 1454 gsi_start_bb (BASIC_BLOCK_FOR_FN (cfun, NUM_FIXED_BLOCKS)); 1455 gimple *stmt; 1456 1457 stmt = gimple_build_label (dest); 1458 gsi_insert_before (&gsi, stmt, GSI_NEW_STMT); 1459 uid = LABEL_DECL_UID (dest); 1460 } 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]; 1464 } 1465 1466 /* Create edges for a goto statement at block BB. Returns true 1467 if abnormal edges should be created. */ 1468 1469 static bool 1470 make_goto_expr_edges (basic_block bb) 1471 { 1472 gimple_stmt_iterator last = gsi_last_bb (bb); 1473 gimple *goto_t = gsi_stmt (last); 1474 1475 /* A simple GOTO creates normal edges. */ 1476 if (simple_goto_p (goto_t)) 1477 { 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; 1484 } 1485 1486 /* A computed GOTO creates abnormal edges. */ 1487 return true; 1488 } 1489 1490 /* Create edges for an asm statement with labels at block BB. */ 1491 1492 static void 1493 make_gimple_asm_edges (basic_block bb) 1494 { 1495 gasm *stmt = as_a <gasm *> (*gsi_last_bb (bb)); 1496 int i, n = gimple_asm_nlabels (stmt); 1497 1498 for (i = 0; i < n; ++i) 1499 { 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); 1503 } 1504 } 1505 1506 /*--------------------------------------------------------------------------- 1507 Flowgraph analysis 1508 ---------------------------------------------------------------------------*/ 1509 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. */ 1517 1518 /* A map from basic block index to the leading label of that block. */ 1519 struct label_record 1520 { 1521 /* The label. */ 1522 tree label; 1523 1524 /* True if the label is referenced from somewhere. */ 1525 bool used; 1526 }; 1527 1528 /* Given LABEL return the first label in the same basic block. */ 1529 1530 static tree 1531 main_block_label (tree label, label_record *label_for_bb) 1532 { 1533 basic_block bb = label_to_block (cfun, label); 1534 tree main_label = label_for_bb[bb->index].label; 1535 1536 /* label_to_block possibly inserted undefined label into the chain. */ 1537 if (!main_label) 1538 { 1539 label_for_bb[bb->index].label = label; 1540 main_label = label; 1541 } 1542 1543 label_for_bb[bb->index].used = true; 1544 return main_label; 1545 } 1546 1547 /* Clean up redundant labels within the exception tree. */ 1548 1549 static void 1550 cleanup_dead_labels_eh (label_record *label_for_bb) 1551 { 1552 eh_landing_pad lp; 1553 eh_region r; 1554 tree lab; 1555 int i; 1556 1557 if (cfun->eh == NULL) 1558 return; 1559 1560 for (i = 1; vec_safe_iterate (cfun->eh->lp_array, i, &lp); ++i) 1561 if (lp && lp->post_landing_pad) 1562 { 1563 lab = main_block_label (lp->post_landing_pad, label_for_bb); 1564 if (lab != lp->post_landing_pad) 1565 { 1566 EH_LANDING_PAD_NR (lp->post_landing_pad) = 0; 1567 lp->post_landing_pad = lab; 1568 EH_LANDING_PAD_NR (lab) = lp->index; 1569 } 1570 } 1571 1572 FOR_ALL_EH_REGION (r) 1573 switch (r->type) 1574 { 1575 case ERT_CLEANUP: 1576 case ERT_MUST_NOT_THROW: 1577 break; 1578 1579 case ERT_TRY: 1580 { 1581 eh_catch c; 1582 for (c = r->u.eh_try.first_catch; c ; c = c->next_catch) 1583 { 1584 lab = c->label; 1585 if (lab) 1586 c->label = main_block_label (lab, label_for_bb); 1587 } 1588 } 1589 break; 1590 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; 1596 } 1597 } 1598 1599 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. */ 1604 1605 void 1606 cleanup_dead_labels (void) 1607 { 1608 basic_block bb; 1609 label_record *label_for_bb = XCNEWVEC (struct label_record, 1610 last_basic_block_for_fn (cfun)); 1611 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) 1615 { 1616 gimple_stmt_iterator i; 1617 1618 for (i = gsi_start_bb (bb); !gsi_end_p (i); gsi_next (&i)) 1619 { 1620 tree label; 1621 glabel *label_stmt = dyn_cast <glabel *> (gsi_stmt (i)); 1622 1623 if (!label_stmt) 1624 break; 1625 1626 label = gimple_label_label (label_stmt); 1627 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) 1631 { 1632 label_for_bb[bb->index].label = label; 1633 continue; 1634 } 1635 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)) 1641 { 1642 label_for_bb[bb->index].label = label; 1643 break; 1644 } 1645 } 1646 } 1647 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) 1651 { 1652 gimple *stmt = *gsi_last_bb (bb); 1653 tree label, new_label; 1654 1655 if (!stmt) 1656 continue; 1657 1658 switch (gimple_code (stmt)) 1659 { 1660 case GIMPLE_COND: 1661 { 1662 gcond *cond_stmt = as_a <gcond *> (stmt); 1663 label = gimple_cond_true_label (cond_stmt); 1664 if (label) 1665 { 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); 1669 } 1670 1671 label = gimple_cond_false_label (cond_stmt); 1672 if (label) 1673 { 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); 1677 } 1678 } 1679 break; 1680 1681 case GIMPLE_SWITCH: 1682 { 1683 gswitch *switch_stmt = as_a <gswitch *> (stmt); 1684 size_t i, n = gimple_switch_num_labels (switch_stmt); 1685 1686 /* Replace all destination labels. */ 1687 for (i = 0; i < n; ++i) 1688 { 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; 1694 } 1695 break; 1696 } 1697 1698 case GIMPLE_ASM: 1699 { 1700 gasm *asm_stmt = as_a <gasm *> (stmt); 1701 int i, n = gimple_asm_nlabels (asm_stmt); 1702 1703 for (i = 0; i < n; ++i) 1704 { 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; 1708 } 1709 break; 1710 } 1711 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)) 1716 { 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); 1722 } 1723 break; 1724 1725 case GIMPLE_TRANSACTION: 1726 { 1727 gtransaction *txn = as_a <gtransaction *> (stmt); 1728 1729 label = gimple_transaction_label_norm (txn); 1730 if (label) 1731 { 1732 new_label = main_block_label (label, label_for_bb); 1733 if (new_label != label) 1734 gimple_transaction_set_label_norm (txn, new_label); 1735 } 1736 1737 label = gimple_transaction_label_uninst (txn); 1738 if (label) 1739 { 1740 new_label = main_block_label (label, label_for_bb); 1741 if (new_label != label) 1742 gimple_transaction_set_label_uninst (txn, new_label); 1743 } 1744 1745 label = gimple_transaction_label_over (txn); 1746 if (label) 1747 { 1748 new_label = main_block_label (label, label_for_bb); 1749 if (new_label != label) 1750 gimple_transaction_set_label_over (txn, new_label); 1751 } 1752 } 1753 break; 1754 1755 default: 1756 break; 1757 } 1758 } 1759 1760 /* Do the same for the exception region tree labels. */ 1761 cleanup_dead_labels_eh (label_for_bb); 1762 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) 1767 { 1768 gimple_stmt_iterator i; 1769 tree label_for_this_bb = label_for_bb[bb->index].label; 1770 1771 if (!label_for_this_bb) 1772 continue; 1773 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; 1777 1778 for (i = gsi_start_bb (bb); !gsi_end_p (i); ) 1779 { 1780 tree label; 1781 glabel *label_stmt = dyn_cast <glabel *> (gsi_stmt (i)); 1782 1783 if (!label_stmt) 1784 break; 1785 1786 label = gimple_label_label (label_stmt); 1787 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 1794 { 1795 gcc_checking_assert (EH_LANDING_PAD_NR (label) == 0); 1796 gsi_remove (&i, true); 1797 } 1798 } 1799 } 1800 1801 free (label_for_bb); 1802 } 1803 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: */ 1807 1808 bool 1809 group_case_labels_stmt (gswitch *stmt) 1810 { 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; 1815 1816 default_bb = gimple_switch_default_bb (cfun, stmt); 1817 1818 /* Look for possible opportunities to merge cases. */ 1819 new_size = i = 1; 1820 while (i < old_size) 1821 { 1822 tree base_case, base_high; 1823 basic_block base_bb; 1824 1825 base_case = gimple_switch_label (stmt, i); 1826 1827 gcc_assert (base_case); 1828 base_bb = label_to_block (cfun, CASE_LABEL (base_case)); 1829 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)))) 1836 { 1837 i++; 1838 continue; 1839 } 1840 1841 base_high = CASE_HIGH (base_case) 1842 ? CASE_HIGH (base_case) 1843 : CASE_LOW (base_case); 1844 next_index = i + 1; 1845 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) 1850 { 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; 1854 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) 1861 { 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++; 1867 } 1868 else 1869 break; 1870 } 1871 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))) 1882 { 1883 edge base_edge = find_edge (gimple_bb (stmt), base_bb); 1884 if (base_edge != NULL) 1885 { 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))) 1889 { 1890 if (FORCED_LABEL (gimple_label_label (stmt)) 1891 || DECL_NONLOCAL (gimple_label_label (stmt))) 1892 { 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)); 1902 } 1903 } 1904 else 1905 break; 1906 remove_edge_and_dominated_blocks (base_edge); 1907 } 1908 i = next_index; 1909 continue; 1910 } 1911 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++; 1917 } 1918 1919 gcc_assert (new_size <= old_size); 1920 1921 if (new_size < old_size) 1922 gimple_switch_set_num_labels (stmt, new_size); 1923 1924 delete removed_labels; 1925 return new_size < old_size; 1926 } 1927 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. */ 1931 1932 bool 1933 group_case_labels (void) 1934 { 1935 basic_block bb; 1936 bool changed = false; 1937 1938 FOR_EACH_BB_FN (bb, cfun) 1939 { 1940 if (gswitch *stmt = safe_dyn_cast <gswitch *> (*gsi_last_bb (bb))) 1941 changed |= group_case_labels_stmt (stmt); 1942 } 1943 1944 return changed; 1945 } 1946 1947 /* Checks whether we can merge block B into block A. */ 1948 1949 static bool 1950 gimple_can_merge_blocks_p (basic_block a, basic_block b) 1951 { 1952 gimple *stmt; 1953 1954 if (!single_succ_p (a)) 1955 return false; 1956 1957 if (single_succ_edge (a)->flags & EDGE_COMPLEX) 1958 return false; 1959 1960 if (single_succ (a) != b) 1961 return false; 1962 1963 if (!single_pred_p (b)) 1964 return false; 1965 1966 if (a == ENTRY_BLOCK_PTR_FOR_FN (cfun) 1967 || b == EXIT_BLOCK_PTR_FOR_FN (cfun)) 1968 return false; 1969 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; 1975 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)) 1979 { 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); 1985 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; 1989 } 1990 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; 2000 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)) 2006 { 2007 gphi *phi = gsi.phi (); 2008 /* Technically only new names matter. */ 2009 if (name_registered_for_update_p (PHI_RESULT (phi))) 2010 return false; 2011 } 2012 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) 2016 { 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; 2028 } 2029 2030 return true; 2031 } 2032 2033 /* Replaces all uses of NAME by VAL. */ 2034 2035 void 2036 replace_uses_by (tree name, tree val) 2037 { 2038 imm_use_iterator imm_iter; 2039 use_operand_p use; 2040 gimple *stmt; 2041 edge e; 2042 2043 FOR_EACH_IMM_USE_STMT (stmt, imm_iter, name) 2044 { 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); 2049 2050 FOR_EACH_IMM_USE_ON_STMT (use, imm_iter) 2051 { 2052 replace_exp (use, val); 2053 2054 if (gimple_code (stmt) == GIMPLE_PHI) 2055 { 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)) 2060 { 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; 2066 } 2067 } 2068 } 2069 2070 if (gimple_code (stmt) != GIMPLE_PHI) 2071 { 2072 gimple_stmt_iterator gsi = gsi_for_stmt (stmt); 2073 gimple *orig_stmt = stmt; 2074 size_t i; 2075 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++) 2082 { 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); 2089 } 2090 2091 if (fold_stmt (&gsi)) 2092 stmt = gsi_stmt (gsi); 2093 2094 if (maybe_clean_or_replace_eh_stmt (orig_stmt, stmt)) 2095 gimple_purge_dead_eh_edges (gimple_bb (stmt)); 2096 2097 update_stmt (stmt); 2098 } 2099 } 2100 2101 gcc_checking_assert (has_zero_uses (name)); 2102 2103 /* Also update the trees stored in loop structures. */ 2104 if (current_loops) 2105 { 2106 for (auto loop : loops_list (cfun, 0)) 2107 substitute_in_loop_info (loop, name, val); 2108 } 2109 } 2110 2111 /* Merge block B into block A. */ 2112 2113 static void 2114 gimple_merge_blocks (basic_block a, basic_block b) 2115 { 2116 gimple_stmt_iterator last, gsi; 2117 gphi_iterator psi; 2118 2119 if (dump_file) 2120 fprintf (dump_file, "Merging blocks %d and %d\n", a->index, b->index); 2121 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); ) 2126 { 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)); 2132 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; 2141 2142 if (!may_replace_uses) 2143 { 2144 gcc_assert (!virtual_operand_p (def)); 2145 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); 2153 } 2154 else 2155 { 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)) 2160 { 2161 imm_use_iterator iter; 2162 use_operand_p use_p; 2163 gimple *stmt; 2164 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); 2168 2169 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (def)) 2170 SSA_NAME_OCCURS_IN_ABNORMAL_PHI (use) = 1; 2171 } 2172 else 2173 replace_uses_by (def, use); 2174 2175 remove_phi_node (&psi, true); 2176 } 2177 } 2178 2179 /* Ensure that B follows A. */ 2180 move_block_after (b, a); 2181 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))); 2185 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);) 2188 { 2189 gimple *stmt = gsi_stmt (gsi); 2190 if (glabel *label_stmt = dyn_cast <glabel *> (stmt)) 2191 { 2192 tree label = gimple_label_label (label_stmt); 2193 int lp_nr; 2194 2195 gsi_remove (&gsi, false); 2196 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)) 2204 { 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); 2217 } 2218 /* Other user labels keep around in a form of a debug stmt. */ 2219 else if (!DECL_ARTIFICIAL (label) && MAY_HAVE_DEBUG_BIND_STMTS) 2220 { 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); 2226 } 2227 2228 lp_nr = EH_LANDING_PAD_NR (label); 2229 if (lp_nr) 2230 { 2231 eh_landing_pad lp = get_eh_landing_pad_from_number (lp_nr); 2232 lp->post_landing_pad = NULL; 2233 } 2234 } 2235 else 2236 { 2237 gimple_set_bb (stmt, a); 2238 gsi_next (&gsi); 2239 } 2240 } 2241 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) 2246 { 2247 a->count = a->count.merge (b->count); 2248 } 2249 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); 2254 2255 if (cfgcleanup_altered_bbs) 2256 bitmap_set_bit (cfgcleanup_altered_bbs, a->index); 2257 } 2258 2259 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. */ 2264 2265 basic_block 2266 single_noncomplex_succ (basic_block bb) 2267 { 2268 edge e0, e1; 2269 if (EDGE_COUNT (bb->succs) != 2) 2270 return bb; 2271 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; 2278 2279 return bb; 2280 } 2281 2282 /* T is CALL_EXPR. Set current_function_calls_* flags. */ 2283 2284 void 2285 notice_special_calls (gcall *call) 2286 { 2287 int flags = gimple_call_flags (call); 2288 2289 if (flags & ECF_MAY_BE_ALLOCA) 2290 cfun->calls_alloca = true; 2291 if (flags & ECF_RETURNS_TWICE) 2292 cfun->calls_setjmp = true; 2293 } 2294 2295 2296 /* Clear flags set by notice_special_calls. Used by dead code removal 2297 to update the flags. */ 2298 2299 void 2300 clear_special_calls (void) 2301 { 2302 cfun->calls_alloca = false; 2303 cfun->calls_setjmp = false; 2304 } 2305 2306 /* Remove PHI nodes associated with basic block BB and all edges out of BB. */ 2307 2308 static void 2309 remove_phi_nodes_and_edges_for_unreachable_block (basic_block bb) 2310 { 2311 /* Since this block is no longer reachable, we can just delete all 2312 of its PHI nodes. */ 2313 remove_phi_nodes (bb); 2314 2315 /* Remove edges to BB's successors. */ 2316 while (EDGE_COUNT (bb->succs) > 0) 2317 remove_edge (EDGE_SUCC (bb, 0)); 2318 } 2319 2320 2321 /* Remove statements of basic block BB. */ 2322 2323 static void 2324 remove_bb (basic_block bb) 2325 { 2326 gimple_stmt_iterator i; 2327 2328 if (dump_file) 2329 { 2330 fprintf (dump_file, "Removing basic block %d\n", bb->index); 2331 if (dump_flags & TDF_DETAILS) 2332 { 2333 dump_bb (dump_file, bb, 0, TDF_BLOCKS); 2334 fprintf (dump_file, "\n"); 2335 } 2336 } 2337 2338 if (current_loops) 2339 { 2340 class loop *loop = bb->loop_father; 2341 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); 2347 } 2348 2349 /* Remove all the instructions in the block. */ 2350 if (bb_seq (bb) != NULL) 2351 { 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);) 2357 { 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)))) 2363 { 2364 basic_block new_bb; 2365 gimple_stmt_iterator new_gsi; 2366 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))) 2371 { 2372 DECL_NONLOCAL (gimple_label_label (label_stmt)) = 0; 2373 FORCED_LABEL (gimple_label_label (label_stmt)) = 1; 2374 } 2375 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)) 2379 { 2380 new_bb = single_succ (new_bb); 2381 gcc_assert (new_bb != bb); 2382 } 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]))) 2387 { 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) 2397 { 2398 new_bb = BASIC_BLOCK_FOR_FN (cfun, i); 2399 break; 2400 } 2401 if (new_bb == NULL) 2402 { 2403 new_bb = single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun)); 2404 gcc_assert (new_bb != bb); 2405 } 2406 } 2407 new_gsi = gsi_after_labels (new_bb); 2408 gsi_remove (&i, false); 2409 gsi_insert_before (&new_gsi, stmt, GSI_NEW_STMT); 2410 } 2411 else 2412 { 2413 /* Release SSA definitions. */ 2414 release_defs (stmt); 2415 gsi_remove (&i, true); 2416 } 2417 2418 if (gsi_end_p (i)) 2419 i = gsi_last_bb (bb); 2420 else 2421 gsi_prev (&i); 2422 } 2423 } 2424 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; 2430 } 2431 2432 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. */ 2439 2440 edge 2441 find_taken_edge (basic_block bb, tree val) 2442 { 2443 gimple *stmt; 2444 2445 stmt = *gsi_last_bb (bb); 2446 2447 /* Handle ENTRY and EXIT. */ 2448 if (!stmt) 2449 ; 2450 2451 else if (gimple_code (stmt) == GIMPLE_COND) 2452 return find_taken_edge_cond_expr (as_a <gcond *> (stmt), val); 2453 2454 else if (gimple_code (stmt) == GIMPLE_SWITCH) 2455 return find_taken_edge_switch_expr (as_a <gswitch *> (stmt), val); 2456 2457 else if (computed_goto_p (stmt)) 2458 { 2459 /* Only optimize if the argument is a label, if the argument is 2460 not a label then we cannot construct a proper CFG. 2461 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)); 2469 } 2470 2471 /* Otherwise we only know the taken successor edge if it's unique. */ 2472 return single_succ_p (bb) ? single_succ_edge (bb) : NULL; 2473 } 2474 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. */ 2478 2479 static edge 2480 find_taken_edge_computed_goto (basic_block bb, tree val) 2481 { 2482 basic_block dest; 2483 edge e = NULL; 2484 2485 dest = label_to_block (cfun, val); 2486 if (dest) 2487 e = find_edge (bb, dest); 2488 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. */ 2495 2496 return e; 2497 } 2498 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. */ 2504 2505 static edge 2506 find_taken_edge_cond_expr (const gcond *cond_stmt, tree val) 2507 { 2508 edge true_edge, false_edge; 2509 2510 if (val == NULL_TREE) 2511 { 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; 2519 } 2520 else if (TREE_CODE (val) != INTEGER_CST) 2521 return NULL; 2522 2523 extract_true_false_edges_from_block (gimple_bb (cond_stmt), 2524 &true_edge, &false_edge); 2525 2526 return (integer_zerop (val) ? false_edge : true_edge); 2527 } 2528 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. */ 2534 2535 edge 2536 find_taken_edge_switch_expr (const gswitch *switch_stmt, tree val) 2537 { 2538 basic_block dest_bb; 2539 edge e; 2540 tree taken_case; 2541 2542 if (gimple_switch_num_labels (switch_stmt) == 1) 2543 taken_case = gimple_switch_default_label (switch_stmt); 2544 else 2545 { 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); 2552 } 2553 dest_bb = label_to_block (cfun, CASE_LABEL (taken_case)); 2554 2555 e = find_edge (gimple_bb (switch_stmt), dest_bb); 2556 gcc_assert (e); 2557 return e; 2558 } 2559 2560 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. */ 2564 2565 tree 2566 find_case_label_for_value (const gswitch *switch_stmt, tree val) 2567 { 2568 size_t low, high, n = gimple_switch_num_labels (switch_stmt); 2569 tree default_case = gimple_switch_default_label (switch_stmt); 2570 2571 for (low = 0, high = n; high - low > 1; ) 2572 { 2573 size_t i = (high + low) / 2; 2574 tree t = gimple_switch_label (switch_stmt, i); 2575 int cmp; 2576 2577 /* Cache the result of comparing CASE_LOW and val. */ 2578 cmp = tree_int_cst_compare (CASE_LOW (t), val); 2579 2580 if (cmp > 0) 2581 high = i; 2582 else 2583 low = i; 2584 2585 if (CASE_HIGH (t) == NULL) 2586 { 2587 /* A singe-valued case label. */ 2588 if (cmp == 0) 2589 return t; 2590 } 2591 else 2592 { 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; 2596 } 2597 } 2598 2599 return default_case; 2600 } 2601 2602 2603 /* Dump a basic block on stderr. */ 2604 2605 void 2606 gimple_debug_bb (basic_block bb) 2607 { 2608 dump_bb (stderr, bb, 0, TDF_VOPS|TDF_MEMSYMS|TDF_BLOCKS); 2609 } 2610 2611 2612 /* Dump basic block with index N on stderr. */ 2613 2614 basic_block 2615 gimple_debug_bb_n (int n) 2616 { 2617 gimple_debug_bb (BASIC_BLOCK_FOR_FN (cfun, n)); 2618 return BASIC_BLOCK_FOR_FN (cfun, n); 2619 } 2620 2621 2622 /* Dump the CFG on stderr. 2623 2624 FLAGS are the same used by the tree dumping functions 2625 (see TDF_* in dumpfile.h). */ 2626 2627 void 2628 gimple_debug_cfg (dump_flags_t flags) 2629 { 2630 gimple_dump_cfg (stderr, flags); 2631 } 2632 2633 2634 /* Dump the program showing basic block boundaries on the given FILE. 2635 2636 FLAGS are the same used by the tree dumping functions (see TDF_* in 2637 tree.h). */ 2638 2639 void 2640 gimple_dump_cfg (FILE *file, dump_flags_t flags) 2641 { 2642 if (flags & TDF_DETAILS) 2643 { 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)); 2648 2649 brief_dump_cfg (file, flags); 2650 fprintf (file, "\n"); 2651 } 2652 2653 if (flags & TDF_STATS) 2654 dump_cfg_stats (file); 2655 2656 dump_function_to_file (current_function_decl, file, flags | TDF_BLOCKS); 2657 } 2658 2659 2660 /* Dump CFG statistics on FILE. */ 2661 2662 void 2663 dump_cfg_stats (FILE *file) 2664 { 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 (); 2674 2675 fprintf (file, "\nCFG Statistics for %s\n\n", funcname); 2676 2677 fprintf (file, "---------------------------------------------------------\n"); 2678 fprintf (file, fmt_str, "", " Number of ", "Memory"); 2679 fprintf (file, fmt_str, "", " instances ", "used "); 2680 fprintf (file, "---------------------------------------------------------\n"); 2681 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)); 2686 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)); 2693 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"); 2699 2700 if (cfg_stats.num_merged_labels > max_num_merged_labels) 2701 max_num_merged_labels = cfg_stats.num_merged_labels; 2702 2703 fprintf (file, "Coalesced label blocks: %ld (Max so far: %ld)\n", 2704 cfg_stats.num_merged_labels, max_num_merged_labels); 2705 2706 fprintf (file, "\n"); 2707 } 2708 2709 2710 /* Dump CFG statistics on stderr. Keep extern so that it's always 2711 linked in the final executable. */ 2712 2713 DEBUG_FUNCTION void 2714 debug_cfg_stats (void) 2715 { 2716 dump_cfg_stats (stderr); 2717 } 2718 2719 /*--------------------------------------------------------------------------- 2720 Miscellaneous helpers 2721 ---------------------------------------------------------------------------*/ 2722 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. */ 2725 2726 static bool 2727 call_can_make_abnormal_goto (gimple *t) 2728 { 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; 2734 2735 /* Likewise if the call has no side effects. */ 2736 if (!gimple_has_side_effects (t)) 2737 return false; 2738 2739 /* Likewise if the called function is leaf. */ 2740 if (gimple_call_flags (t) & ECF_LEAF) 2741 return false; 2742 2743 return true; 2744 } 2745 2746 2747 /* Return true if T can make an abnormal transfer of control flow. 2748 Transfers of control flow associated with EH are excluded. */ 2749 2750 bool 2751 stmt_can_make_abnormal_goto (gimple *t) 2752 { 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; 2758 } 2759 2760 2761 /* Return true if T represents a stmt that always transfers control. */ 2762 2763 bool 2764 is_ctrl_stmt (gimple *t) 2765 { 2766 switch (gimple_code (t)) 2767 { 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; 2776 } 2777 } 2778 2779 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). */ 2782 2783 bool 2784 is_ctrl_altering_stmt (gimple *t) 2785 { 2786 gcc_assert (t); 2787 2788 switch (gimple_code (t)) 2789 { 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; 2796 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; 2802 2803 case GIMPLE_ASM: 2804 if (gimple_asm_nlabels (as_a <gasm *> (t)) > 0) 2805 return true; 2806 break; 2807 2808 CASE_GIMPLE_OMP: 2809 /* OpenMP directives alter control flow. */ 2810 return true; 2811 2812 case GIMPLE_TRANSACTION: 2813 /* A transaction start alters control flow. */ 2814 return true; 2815 2816 default: 2817 break; 2818 } 2819 2820 /* If a statement can throw, it alters control flow. */ 2821 return stmt_can_throw_internal (cfun, t); 2822 } 2823 2824 2825 /* Return true if T is a simple local goto. */ 2826 2827 bool 2828 simple_goto_p (gimple *t) 2829 { 2830 return (gimple_code (t) == GIMPLE_GOTO 2831 && TREE_CODE (gimple_goto_dest (t)) == LABEL_DECL); 2832 } 2833 2834 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. */ 2841 2842 static inline bool 2843 stmt_starts_bb_p (gimple *stmt, gimple *prev_stmt) 2844 { 2845 if (stmt == NULL) 2846 return false; 2847 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; 2854 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)) 2859 { 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; 2864 2865 if (glabel *plabel = safe_dyn_cast <glabel *> (prev_stmt)) 2866 { 2867 if (DECL_NONLOCAL (gimple_label_label (plabel)) 2868 || !DECL_ARTIFICIAL (gimple_label_label (plabel))) 2869 return true; 2870 2871 cfg_stats.num_merged_labels++; 2872 return false; 2873 } 2874 else 2875 return true; 2876 } 2877 else if (gimple_code (stmt) == GIMPLE_CALL) 2878 { 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; 2891 } 2892 2893 return false; 2894 } 2895 2896 2897 /* Return true if T should end a basic block. */ 2898 2899 bool 2900 stmt_ends_bb_p (gimple *t) 2901 { 2902 return is_ctrl_stmt (t) || is_ctrl_altering_stmt (t); 2903 } 2904 2905 /* Remove block annotations and other data structures. */ 2906 2907 void 2908 delete_tree_cfg_annotations (struct function *fn) 2909 { 2910 vec_free (label_to_block_map_for_fn (fn)); 2911 } 2912 2913 /* Return the virtual phi in BB. */ 2914 2915 gphi * 2916 get_virtual_phi (basic_block bb) 2917 { 2918 for (gphi_iterator gsi = gsi_start_phis (bb); 2919 !gsi_end_p (gsi); 2920 gsi_next (&gsi)) 2921 { 2922 gphi *phi = gsi.phi (); 2923 2924 if (virtual_operand_p (PHI_RESULT (phi))) 2925 return phi; 2926 } 2927 2928 return NULL; 2929 } 2930 2931 /* Return the first statement in basic block BB. */ 2932 2933 gimple * 2934 first_stmt (basic_block bb) 2935 { 2936 gimple_stmt_iterator i = gsi_start_bb (bb); 2937 gimple *stmt = NULL; 2938 2939 while (!gsi_end_p (i) && is_gimple_debug ((stmt = gsi_stmt (i)))) 2940 { 2941 gsi_next (&i); 2942 stmt = NULL; 2943 } 2944 return stmt; 2945 } 2946 2947 /* Return the first non-label/non-debug statement in basic block BB. */ 2948 2949 static gimple * 2950 first_non_label_nondebug_stmt (basic_block bb) 2951 { 2952 gimple_stmt_iterator i; 2953 i = gsi_start_nondebug_after_labels_bb (bb); 2954 return !gsi_end_p (i) ? gsi_stmt (i) : NULL; 2955 } 2956 2957 /* Return the last statement in basic block BB. */ 2958 2959 gimple * 2960 last_nondebug_stmt (basic_block bb) 2961 { 2962 gimple_stmt_iterator i = gsi_last_bb (bb); 2963 gimple *stmt = NULL; 2964 2965 while (!gsi_end_p (i) && is_gimple_debug ((stmt = gsi_stmt (i)))) 2966 { 2967 gsi_prev (&i); 2968 stmt = NULL; 2969 } 2970 return stmt; 2971 } 2972 2973 /* Return the last statement of an otherwise empty block. Return NULL 2974 if the block is totally empty, or if it contains more than one 2975 statement. */ 2976 2977 gimple * 2978 last_and_only_stmt (basic_block bb) 2979 { 2980 gimple_stmt_iterator i = gsi_last_nondebug_bb (bb); 2981 gimple *last, *prev; 2982 2983 if (gsi_end_p (i)) 2984 return NULL; 2985 2986 last = gsi_stmt (i); 2987 gsi_prev_nondebug (&i); 2988 if (gsi_end_p (i)) 2989 return last; 2990 2991 /* Empty statements should no longer appear in the instruction stream. 2992 Everything that might have appeared before should be deleted by 2993 remove_useless_stmts, and the optimizers should just gsi_remove 2994 instead of smashing with build_empty_stmt. 2995 2996 Thus the only thing that should appear here in a block containing 2997 one executable statement is a label. */ 2998 prev = gsi_stmt (i); 2999 if (gimple_code (prev) == GIMPLE_LABEL) 3000 return last; 3001 else 3002 return NULL; 3003 } 3004 3005 /* Returns the basic block after which the new basic block created 3006 by splitting edge EDGE_IN should be placed. Tries to keep the new block 3007 near its "logical" location. This is of most help to humans looking 3008 at debugging dumps. */ 3009 3010 basic_block 3011 split_edge_bb_loc (edge edge_in) 3012 { 3013 basic_block dest = edge_in->dest; 3014 basic_block dest_prev = dest->prev_bb; 3015 3016 if (dest_prev) 3017 { 3018 edge e = find_edge (dest_prev, dest); 3019 if (e && !(e->flags & EDGE_COMPLEX)) 3020 return edge_in->src; 3021 } 3022 return dest_prev; 3023 } 3024 3025 /* Split a (typically critical) edge EDGE_IN. Return the new block. 3026 Abort on abnormal edges. */ 3027 3028 static basic_block 3029 gimple_split_edge (edge edge_in) 3030 { 3031 basic_block new_bb, after_bb, dest; 3032 edge new_edge, e; 3033 3034 /* Abnormal edges cannot be split. */ 3035 gcc_assert (!(edge_in->flags & EDGE_ABNORMAL)); 3036 3037 dest = edge_in->dest; 3038 3039 after_bb = split_edge_bb_loc (edge_in); 3040 3041 new_bb = create_empty_bb (after_bb); 3042 new_bb->count = edge_in->count (); 3043 3044 /* We want to avoid re-allocating PHIs when we first 3045 add the fallthru edge from new_bb to dest but we also 3046 want to avoid changing PHI argument order when 3047 first redirecting edge_in away from dest. The former 3048 avoids changing PHI argument order by adding them 3049 last and then the redirection swapping it back into 3050 place by means of unordered remove. 3051 So hack around things by temporarily removing all PHIs 3052 from the destination during the edge redirection and then 3053 making sure the edges stay in order. */ 3054 gimple_seq saved_phis = phi_nodes (dest); 3055 unsigned old_dest_idx = edge_in->dest_idx; 3056 set_phi_nodes (dest, NULL); 3057 new_edge = make_single_succ_edge (new_bb, dest, EDGE_FALLTHRU); 3058 e = redirect_edge_and_branch (edge_in, new_bb); 3059 gcc_assert (e == edge_in && new_edge->dest_idx == old_dest_idx); 3060 /* set_phi_nodes sets the BB of the PHI nodes, so do it manually here. */ 3061 dest->il.gimple.phi_nodes = saved_phis; 3062 3063 return new_bb; 3064 } 3065 3066 3067 /* Verify properties of the address expression T whose base should be 3068 TREE_ADDRESSABLE if VERIFY_ADDRESSABLE is true. */ 3069 3070 static bool 3071 verify_address (tree t, bool verify_addressable) 3072 { 3073 bool old_constant; 3074 bool old_side_effects; 3075 bool new_constant; 3076 bool new_side_effects; 3077 3078 old_constant = TREE_CONSTANT (t); 3079 old_side_effects = TREE_SIDE_EFFECTS (t); 3080 3081 recompute_tree_invariant_for_addr_expr (t); 3082 new_side_effects = TREE_SIDE_EFFECTS (t); 3083 new_constant = TREE_CONSTANT (t); 3084 3085 if (old_constant != new_constant) 3086 { 3087 error ("constant not recomputed when %<ADDR_EXPR%> changed"); 3088 return true; 3089 } 3090 if (old_side_effects != new_side_effects) 3091 { 3092 error ("side effects not recomputed when %<ADDR_EXPR%> changed"); 3093 return true; 3094 } 3095 3096 tree base = TREE_OPERAND (t, 0); 3097 while (handled_component_p (base)) 3098 base = TREE_OPERAND (base, 0); 3099 3100 if (!(VAR_P (base) 3101 || TREE_CODE (base) == PARM_DECL 3102 || TREE_CODE (base) == RESULT_DECL)) 3103 return false; 3104 3105 if (verify_addressable && !TREE_ADDRESSABLE (base)) 3106 { 3107 error ("address taken but %<TREE_ADDRESSABLE%> bit not set"); 3108 return true; 3109 } 3110 3111 return false; 3112 } 3113 3114 3115 /* Verify if EXPR is a valid GIMPLE reference expression. If 3116 REQUIRE_LVALUE is true verifies it is an lvalue. Returns true 3117 if there is an error, otherwise false. */ 3118 3119 static bool 3120 verify_types_in_gimple_reference (tree expr, bool require_lvalue) 3121 { 3122 const char *code_name = get_tree_code_name (TREE_CODE (expr)); 3123 3124 if (TREE_CODE (expr) == REALPART_EXPR 3125 || TREE_CODE (expr) == IMAGPART_EXPR 3126 || TREE_CODE (expr) == BIT_FIELD_REF 3127 || TREE_CODE (expr) == VIEW_CONVERT_EXPR) 3128 { 3129 tree op = TREE_OPERAND (expr, 0); 3130 if (TREE_CODE (expr) != VIEW_CONVERT_EXPR 3131 && !is_gimple_reg_type (TREE_TYPE (expr))) 3132 { 3133 error ("non-scalar %qs", code_name); 3134 return true; 3135 } 3136 3137 if (TREE_CODE (expr) == BIT_FIELD_REF) 3138 { 3139 tree t1 = TREE_OPERAND (expr, 1); 3140 tree t2 = TREE_OPERAND (expr, 2); 3141 poly_uint64 size, bitpos; 3142 if (!poly_int_tree_p (t1, &size) 3143 || !poly_int_tree_p (t2, &bitpos) 3144 || !types_compatible_p (bitsizetype, TREE_TYPE (t1)) 3145 || !types_compatible_p (bitsizetype, TREE_TYPE (t2))) 3146 { 3147 error ("invalid position or size operand to %qs", code_name); 3148 return true; 3149 } 3150 if (INTEGRAL_TYPE_P (TREE_TYPE (expr)) 3151 && maybe_ne (TYPE_PRECISION (TREE_TYPE (expr)), size)) 3152 { 3153 error ("integral result type precision does not match " 3154 "field size of %qs", code_name); 3155 return true; 3156 } 3157 else if (!INTEGRAL_TYPE_P (TREE_TYPE (expr)) 3158 && TYPE_MODE (TREE_TYPE (expr)) != BLKmode 3159 && maybe_ne (GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (expr))), 3160 size)) 3161 { 3162 error ("mode size of non-integral result does not " 3163 "match field size of %qs", 3164 code_name); 3165 return true; 3166 } 3167 if (INTEGRAL_TYPE_P (TREE_TYPE (op)) 3168 && !type_has_mode_precision_p (TREE_TYPE (op))) 3169 { 3170 error ("%qs of non-mode-precision operand", code_name); 3171 return true; 3172 } 3173 if (!AGGREGATE_TYPE_P (TREE_TYPE (op)) 3174 && maybe_gt (size + bitpos, 3175 tree_to_poly_uint64 (TYPE_SIZE (TREE_TYPE (op))))) 3176 { 3177 error ("position plus size exceeds size of referenced object in " 3178 "%qs", code_name); 3179 return true; 3180 } 3181 } 3182 3183 if ((TREE_CODE (expr) == REALPART_EXPR 3184 || TREE_CODE (expr) == IMAGPART_EXPR) 3185 && !useless_type_conversion_p (TREE_TYPE (expr), 3186 TREE_TYPE (TREE_TYPE (op)))) 3187 { 3188 error ("type mismatch in %qs reference", code_name); 3189 debug_generic_stmt (TREE_TYPE (expr)); 3190 debug_generic_stmt (TREE_TYPE (TREE_TYPE (op))); 3191 return true; 3192 } 3193 3194 if (TREE_CODE (expr) == VIEW_CONVERT_EXPR) 3195 { 3196 /* For VIEW_CONVERT_EXPRs which are allowed here too, we only check 3197 that their operand is not a register an invariant when 3198 requiring an lvalue (this usually means there is a SRA or IPA-SRA 3199 bug). Otherwise there is nothing to verify, gross mismatches at 3200 most invoke undefined behavior. */ 3201 if (require_lvalue 3202 && (is_gimple_reg (op) || is_gimple_min_invariant (op))) 3203 { 3204 error ("conversion of %qs on the left hand side of %qs", 3205 get_tree_code_name (TREE_CODE (op)), code_name); 3206 debug_generic_stmt (expr); 3207 return true; 3208 } 3209 else if (is_gimple_reg (op) 3210 && TYPE_SIZE (TREE_TYPE (expr)) != TYPE_SIZE (TREE_TYPE (op))) 3211 { 3212 error ("conversion of register to a different size in %qs", 3213 code_name); 3214 debug_generic_stmt (expr); 3215 return true; 3216 } 3217 } 3218 3219 expr = op; 3220 } 3221 3222 bool require_non_reg = false; 3223 while (handled_component_p (expr)) 3224 { 3225 require_non_reg = true; 3226 code_name = get_tree_code_name (TREE_CODE (expr)); 3227 3228 if (TREE_CODE (expr) == REALPART_EXPR 3229 || TREE_CODE (expr) == IMAGPART_EXPR 3230 || TREE_CODE (expr) == BIT_FIELD_REF) 3231 { 3232 error ("non-top-level %qs", code_name); 3233 return true; 3234 } 3235 3236 tree op = TREE_OPERAND (expr, 0); 3237 3238 if (TREE_CODE (expr) == ARRAY_REF 3239 || TREE_CODE (expr) == ARRAY_RANGE_REF) 3240 { 3241 if (!is_gimple_val (TREE_OPERAND (expr, 1)) 3242 || (TREE_OPERAND (expr, 2) 3243 && !is_gimple_val (TREE_OPERAND (expr, 2))) 3244 || (TREE_OPERAND (expr, 3) 3245 && !is_gimple_val (TREE_OPERAND (expr, 3)))) 3246 { 3247 error ("invalid operands to %qs", code_name); 3248 debug_generic_stmt (expr); 3249 return true; 3250 } 3251 } 3252 3253 /* Verify if the reference array element types are compatible. */ 3254 if (TREE_CODE (expr) == ARRAY_REF 3255 && !useless_type_conversion_p (TREE_TYPE (expr), 3256 TREE_TYPE (TREE_TYPE (op)))) 3257 { 3258 error ("type mismatch in %qs", code_name); 3259 debug_generic_stmt (TREE_TYPE (expr)); 3260 debug_generic_stmt (TREE_TYPE (TREE_TYPE (op))); 3261 return true; 3262 } 3263 if (TREE_CODE (expr) == ARRAY_RANGE_REF 3264 && !useless_type_conversion_p (TREE_TYPE (TREE_TYPE (expr)), 3265 TREE_TYPE (TREE_TYPE (op)))) 3266 { 3267 error ("type mismatch in %qs", code_name); 3268 debug_generic_stmt (TREE_TYPE (TREE_TYPE (expr))); 3269 debug_generic_stmt (TREE_TYPE (TREE_TYPE (op))); 3270 return true; 3271 } 3272 3273 if (TREE_CODE (expr) == COMPONENT_REF) 3274 { 3275 if (TREE_OPERAND (expr, 2) 3276 && !is_gimple_val (TREE_OPERAND (expr, 2))) 3277 { 3278 error ("invalid %qs offset operator", code_name); 3279 return true; 3280 } 3281 if (!useless_type_conversion_p (TREE_TYPE (expr), 3282 TREE_TYPE (TREE_OPERAND (expr, 1)))) 3283 { 3284 error ("type mismatch in %qs", code_name); 3285 debug_generic_stmt (TREE_TYPE (expr)); 3286 debug_generic_stmt (TREE_TYPE (TREE_OPERAND (expr, 1))); 3287 return true; 3288 } 3289 } 3290 3291 expr = op; 3292 } 3293 3294 code_name = get_tree_code_name (TREE_CODE (expr)); 3295 3296 if (TREE_CODE (expr) == MEM_REF) 3297 { 3298 if (!is_gimple_mem_ref_addr (TREE_OPERAND (expr, 0)) 3299 || (TREE_CODE (TREE_OPERAND (expr, 0)) == ADDR_EXPR 3300 && verify_address (TREE_OPERAND (expr, 0), false))) 3301 { 3302 error ("invalid address operand in %qs", code_name); 3303 debug_generic_stmt (expr); 3304 return true; 3305 } 3306 if (!poly_int_tree_p (TREE_OPERAND (expr, 1)) 3307 || !POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (expr, 1)))) 3308 { 3309 error ("invalid offset operand in %qs", code_name); 3310 debug_generic_stmt (expr); 3311 return true; 3312 } 3313 if (MR_DEPENDENCE_CLIQUE (expr) != 0 3314 && MR_DEPENDENCE_CLIQUE (expr) > cfun->last_clique) 3315 { 3316 error ("invalid clique in %qs", code_name); 3317 debug_generic_stmt (expr); 3318 return true; 3319 } 3320 } 3321 else if (TREE_CODE (expr) == TARGET_MEM_REF) 3322 { 3323 if (!TMR_BASE (expr) 3324 || !is_gimple_mem_ref_addr (TMR_BASE (expr)) 3325 || (TREE_CODE (TMR_BASE (expr)) == ADDR_EXPR 3326 && verify_address (TMR_BASE (expr), false))) 3327 { 3328 error ("invalid address operand in %qs", code_name); 3329 return true; 3330 } 3331 if (!TMR_OFFSET (expr) 3332 || !poly_int_tree_p (TMR_OFFSET (expr)) 3333 || !POINTER_TYPE_P (TREE_TYPE (TMR_OFFSET (expr)))) 3334 { 3335 error ("invalid offset operand in %qs", code_name); 3336 debug_generic_stmt (expr); 3337 return true; 3338 } 3339 if (MR_DEPENDENCE_CLIQUE (expr) != 0 3340 && MR_DEPENDENCE_CLIQUE (expr) > cfun->last_clique) 3341 { 3342 error ("invalid clique in %qs", code_name); 3343 debug_generic_stmt (expr); 3344 return true; 3345 } 3346 } 3347 else if (INDIRECT_REF_P (expr)) 3348 { 3349 error ("%qs in gimple IL", code_name); 3350 debug_generic_stmt (expr); 3351 return true; 3352 } 3353 else if (require_non_reg 3354 && (is_gimple_reg (expr) 3355 || (is_gimple_min_invariant (expr) 3356 /* STRING_CSTs are representatives of the string table 3357 entry which lives in memory. */ 3358 && TREE_CODE (expr) != STRING_CST))) 3359 { 3360 error ("%qs as base where non-register is required", code_name); 3361 debug_generic_stmt (expr); 3362 return true; 3363 } 3364 3365 if (!require_lvalue 3366 && (is_gimple_reg (expr) || is_gimple_min_invariant (expr))) 3367 return false; 3368 3369 if (TREE_CODE (expr) != SSA_NAME && is_gimple_id (expr)) 3370 return false; 3371 3372 if (TREE_CODE (expr) != TARGET_MEM_REF 3373 && TREE_CODE (expr) != MEM_REF) 3374 { 3375 error ("invalid expression for min lvalue"); 3376 return true; 3377 } 3378 3379 return false; 3380 } 3381 3382 /* Returns true if there is one pointer type in TYPE_POINTER_TO (SRC_OBJ) 3383 list of pointer-to types that is trivially convertible to DEST. */ 3384 3385 static bool 3386 one_pointer_to_useless_type_conversion_p (tree dest, tree src_obj) 3387 { 3388 tree src; 3389 3390 if (!TYPE_POINTER_TO (src_obj)) 3391 return true; 3392 3393 for (src = TYPE_POINTER_TO (src_obj); src; src = TYPE_NEXT_PTR_TO (src)) 3394 if (useless_type_conversion_p (dest, src)) 3395 return true; 3396 3397 return false; 3398 } 3399 3400 /* Return true if TYPE1 is a fixed-point type and if conversions to and 3401 from TYPE2 can be handled by FIXED_CONVERT_EXPR. */ 3402 3403 static bool 3404 valid_fixed_convert_types_p (tree type1, tree type2) 3405 { 3406 return (FIXED_POINT_TYPE_P (type1) 3407 && (INTEGRAL_TYPE_P (type2) 3408 || SCALAR_FLOAT_TYPE_P (type2) 3409 || FIXED_POINT_TYPE_P (type2))); 3410 } 3411 3412 /* Verify the contents of a GIMPLE_CALL STMT. Returns true when there 3413 is a problem, otherwise false. */ 3414 3415 static bool 3416 verify_gimple_call (gcall *stmt) 3417 { 3418 tree fn = gimple_call_fn (stmt); 3419 tree fntype, fndecl; 3420 unsigned i; 3421 3422 if (gimple_call_internal_p (stmt)) 3423 { 3424 if (fn) 3425 { 3426 error ("gimple call has two targets"); 3427 debug_generic_stmt (fn); 3428 return true; 3429 } 3430 } 3431 else 3432 { 3433 if (!fn) 3434 { 3435 error ("gimple call has no target"); 3436 return true; 3437 } 3438 } 3439 3440 if (fn && !is_gimple_call_addr (fn)) 3441 { 3442 error ("invalid function in gimple call"); 3443 debug_generic_stmt (fn); 3444 return true; 3445 } 3446 3447 if (fn 3448 && (!POINTER_TYPE_P (TREE_TYPE (fn)) 3449 || (TREE_CODE (TREE_TYPE (TREE_TYPE (fn))) != FUNCTION_TYPE 3450 && TREE_CODE (TREE_TYPE (TREE_TYPE (fn))) != METHOD_TYPE))) 3451 { 3452 error ("non-function in gimple call"); 3453 return true; 3454 } 3455 3456 fndecl = gimple_call_fndecl (stmt); 3457 if (fndecl 3458 && TREE_CODE (fndecl) == FUNCTION_DECL 3459 && DECL_LOOPING_CONST_OR_PURE_P (fndecl) 3460 && !DECL_PURE_P (fndecl) 3461 && !TREE_READONLY (fndecl)) 3462 { 3463 error ("invalid pure const state for function"); 3464 return true; 3465 } 3466 3467 tree lhs = gimple_call_lhs (stmt); 3468 if (lhs 3469 && (!is_gimple_reg (lhs) 3470 && (!is_gimple_lvalue (lhs) 3471 || verify_types_in_gimple_reference 3472 (TREE_CODE (lhs) == WITH_SIZE_EXPR 3473 ? TREE_OPERAND (lhs, 0) : lhs, true)))) 3474 { 3475 error ("invalid LHS in gimple call"); 3476 return true; 3477 } 3478 3479 if (gimple_call_ctrl_altering_p (stmt) 3480 && gimple_call_noreturn_p (stmt) 3481 && should_remove_lhs_p (lhs)) 3482 { 3483 error ("LHS in %<noreturn%> call"); 3484 return true; 3485 } 3486 3487 fntype = gimple_call_fntype (stmt); 3488 if (fntype 3489 && lhs 3490 && !useless_type_conversion_p (TREE_TYPE (lhs), TREE_TYPE (fntype)) 3491 /* ??? At least C++ misses conversions at assignments from 3492 void * call results. 3493 For now simply allow arbitrary pointer type conversions. */ 3494 && !(POINTER_TYPE_P (TREE_TYPE (lhs)) 3495 && POINTER_TYPE_P (TREE_TYPE (fntype)))) 3496 { 3497 error ("invalid conversion in gimple call"); 3498 debug_generic_stmt (TREE_TYPE (lhs)); 3499 debug_generic_stmt (TREE_TYPE (fntype)); 3500 return true; 3501 } 3502 3503 if (gimple_call_chain (stmt) 3504 && !is_gimple_val (gimple_call_chain (stmt))) 3505 { 3506 error ("invalid static chain in gimple call"); 3507 debug_generic_stmt (gimple_call_chain (stmt)); 3508 return true; 3509 } 3510 3511 /* If there is a static chain argument, the call should either be 3512 indirect, or the decl should have DECL_STATIC_CHAIN set. */ 3513 if (gimple_call_chain (stmt) 3514 && fndecl 3515 && !DECL_STATIC_CHAIN (fndecl)) 3516 { 3517 error ("static chain with function that doesn%'t use one"); 3518 return true; 3519 } 3520 3521 if (fndecl && fndecl_built_in_p (fndecl, BUILT_IN_NORMAL)) 3522 { 3523 switch (DECL_FUNCTION_CODE (fndecl)) 3524 { 3525 case BUILT_IN_UNREACHABLE: 3526 case BUILT_IN_UNREACHABLE_TRAP: 3527 case BUILT_IN_TRAP: 3528 if (gimple_call_num_args (stmt) > 0) 3529 { 3530 /* Built-in unreachable with parameters might not be caught by 3531 undefined behavior sanitizer. Front-ends do check users do not 3532 call them that way but we also produce calls to 3533 __builtin_unreachable internally, for example when IPA figures 3534 out a call cannot happen in a legal program. In such cases, 3535 we must make sure arguments are stripped off. */ 3536 error ("%<__builtin_unreachable%> or %<__builtin_trap%> call " 3537 "with arguments"); 3538 return true; 3539 } 3540 break; 3541 default: 3542 break; 3543 } 3544 } 3545 3546 /* For a call to .DEFERRED_INIT, 3547 LHS = DEFERRED_INIT (SIZE of the DECL, INIT_TYPE, NAME of the DECL) 3548 we should guarantee that when the 1st argument is a constant, it should 3549 be the same as the size of the LHS. */ 3550 3551 if (gimple_call_internal_p (stmt, IFN_DEFERRED_INIT)) 3552 { 3553 tree size_of_arg0 = gimple_call_arg (stmt, 0); 3554 tree size_of_lhs = TYPE_SIZE_UNIT (TREE_TYPE (lhs)); 3555 3556 if (TREE_CODE (lhs) == SSA_NAME) 3557 lhs = SSA_NAME_VAR (lhs); 3558 3559 poly_uint64 size_from_arg0, size_from_lhs; 3560 bool is_constant_size_arg0 = poly_int_tree_p (size_of_arg0, 3561 &size_from_arg0); 3562 bool is_constant_size_lhs = poly_int_tree_p (size_of_lhs, 3563 &size_from_lhs); 3564 if (is_constant_size_arg0 && is_constant_size_lhs) 3565 if (maybe_ne (size_from_arg0, size_from_lhs)) 3566 { 3567 error ("%<DEFERRED_INIT%> calls should have same " 3568 "constant size for the first argument and LHS"); 3569 return true; 3570 } 3571 } 3572 3573 /* ??? The C frontend passes unpromoted arguments in case it 3574 didn't see a function declaration before the call. So for now 3575 leave the call arguments mostly unverified. Once we gimplify 3576 unit-at-a-time we have a chance to fix this. */ 3577 for (i = 0; i < gimple_call_num_args (stmt); ++i) 3578 { 3579 tree arg = gimple_call_arg (stmt, i); 3580 if ((is_gimple_reg_type (TREE_TYPE (arg)) 3581 && !is_gimple_val (arg)) 3582 || (!is_gimple_reg_type (TREE_TYPE (arg)) 3583 && !is_gimple_lvalue (arg))) 3584 { 3585 error ("invalid argument to gimple call"); 3586 debug_generic_expr (arg); 3587 return true; 3588 } 3589 if (!is_gimple_reg (arg)) 3590 { 3591 if (TREE_CODE (arg) == WITH_SIZE_EXPR) 3592 arg = TREE_OPERAND (arg, 0); 3593 if (verify_types_in_gimple_reference (arg, false)) 3594 return true; 3595 } 3596 } 3597 3598 return false; 3599 } 3600 3601 /* Verifies the gimple comparison with the result type TYPE and 3602 the operands OP0 and OP1, comparison code is CODE. */ 3603 3604 static bool 3605 verify_gimple_comparison (tree type, tree op0, tree op1, enum tree_code code) 3606 { 3607 tree op0_type = TREE_TYPE (op0); 3608 tree op1_type = TREE_TYPE (op1); 3609 3610 if (!is_gimple_val (op0) || !is_gimple_val (op1)) 3611 { 3612 error ("invalid operands in gimple comparison"); 3613 return true; 3614 } 3615 3616 /* For comparisons we do not have the operations type as the 3617 effective type the comparison is carried out in. Instead 3618 we require that either the first operand is trivially 3619 convertible into the second, or the other way around. */ 3620 if (!useless_type_conversion_p (op0_type, op1_type) 3621 && !useless_type_conversion_p (op1_type, op0_type)) 3622 { 3623 error ("mismatching comparison operand types"); 3624 debug_generic_expr (op0_type); 3625 debug_generic_expr (op1_type); 3626 return true; 3627 } 3628 3629 /* The resulting type of a comparison may be an effective boolean type. */ 3630 if (INTEGRAL_TYPE_P (type) 3631 && (TREE_CODE (type) == BOOLEAN_TYPE 3632 || TYPE_PRECISION (type) == 1)) 3633 { 3634 if ((VECTOR_TYPE_P (op0_type) 3635 || VECTOR_TYPE_P (op1_type)) 3636 && code != EQ_EXPR && code != NE_EXPR 3637 && !VECTOR_BOOLEAN_TYPE_P (op0_type) 3638 && !VECTOR_INTEGER_TYPE_P (op0_type)) 3639 { 3640 error ("unsupported operation or type for vector comparison" 3641 " returning a boolean"); 3642 debug_generic_expr (op0_type); 3643 debug_generic_expr (op1_type); 3644 return true; 3645 } 3646 } 3647 /* Or a boolean vector type with the same element count 3648 as the comparison operand types. */ 3649 else if (VECTOR_TYPE_P (type) 3650 && TREE_CODE (TREE_TYPE (type)) == BOOLEAN_TYPE) 3651 { 3652 if (TREE_CODE (op0_type) != VECTOR_TYPE 3653 || TREE_CODE (op1_type) != VECTOR_TYPE) 3654 { 3655 error ("non-vector operands in vector comparison"); 3656 debug_generic_expr (op0_type); 3657 debug_generic_expr (op1_type); 3658 return true; 3659 } 3660 3661 if (maybe_ne (TYPE_VECTOR_SUBPARTS (type), 3662 TYPE_VECTOR_SUBPARTS (op0_type))) 3663 { 3664 error ("invalid vector comparison resulting type"); 3665 debug_generic_expr (type); 3666 return true; 3667 } 3668 } 3669 else 3670 { 3671 error ("bogus comparison result type"); 3672 debug_generic_expr (type); 3673 return true; 3674 } 3675 3676 return false; 3677 } 3678 3679 /* Verify a gimple assignment statement STMT with an unary rhs. 3680 Returns true if anything is wrong. */ 3681 3682 static bool 3683 verify_gimple_assign_unary (gassign *stmt) 3684 { 3685 enum tree_code rhs_code = gimple_assign_rhs_code (stmt); 3686 tree lhs = gimple_assign_lhs (stmt); 3687 tree lhs_type = TREE_TYPE (lhs); 3688 tree rhs1 = gimple_assign_rhs1 (stmt); 3689 tree rhs1_type = TREE_TYPE (rhs1); 3690 3691 if (!is_gimple_reg (lhs)) 3692 { 3693 error ("non-register as LHS of unary operation"); 3694 return true; 3695 } 3696 3697 if (!is_gimple_val (rhs1)) 3698 { 3699 error ("invalid operand in unary operation"); 3700 return true; 3701 } 3702 3703 const char* const code_name = get_tree_code_name (rhs_code); 3704 3705 /* First handle conversions. */ 3706 switch (rhs_code) 3707 { 3708 CASE_CONVERT: 3709 { 3710 /* Allow conversions between vectors with the same number of elements, 3711 provided that the conversion is OK for the element types too. */ 3712 if (VECTOR_TYPE_P (lhs_type) 3713 && VECTOR_TYPE_P (rhs1_type) 3714 && known_eq (TYPE_VECTOR_SUBPARTS (lhs_type), 3715 TYPE_VECTOR_SUBPARTS (rhs1_type))) 3716 { 3717 lhs_type = TREE_TYPE (lhs_type); 3718 rhs1_type = TREE_TYPE (rhs1_type); 3719 } 3720 else if (VECTOR_TYPE_P (lhs_type) || VECTOR_TYPE_P (rhs1_type)) 3721 { 3722 error ("invalid vector types in nop conversion"); 3723 debug_generic_expr (lhs_type); 3724 debug_generic_expr (rhs1_type); 3725 return true; 3726 } 3727 3728 /* Allow conversions from pointer type to integral type only if 3729 there is no sign or zero extension involved. 3730 For targets were the precision of ptrofftype doesn't match that 3731 of pointers we allow conversions to types where 3732 POINTERS_EXTEND_UNSIGNED specifies how that works. */ 3733 if ((POINTER_TYPE_P (lhs_type) 3734 && INTEGRAL_TYPE_P (rhs1_type)) 3735 || (POINTER_TYPE_P (rhs1_type) 3736 && INTEGRAL_TYPE_P (lhs_type) 3737 && (TYPE_PRECISION (rhs1_type) >= TYPE_PRECISION (lhs_type) 3738 #if defined(POINTERS_EXTEND_UNSIGNED) 3739 || (TYPE_MODE (rhs1_type) == ptr_mode 3740 && (TYPE_PRECISION (lhs_type) 3741 == BITS_PER_WORD /* word_mode */ 3742 || (TYPE_PRECISION (lhs_type) 3743 == GET_MODE_PRECISION (Pmode)))) 3744 #endif 3745 ))) 3746 return false; 3747 3748 /* Allow conversion from integral to offset type and vice versa. */ 3749 if ((TREE_CODE (lhs_type) == OFFSET_TYPE 3750 && INTEGRAL_TYPE_P (rhs1_type)) 3751 || (INTEGRAL_TYPE_P (lhs_type) 3752 && TREE_CODE (rhs1_type) == OFFSET_TYPE)) 3753 return false; 3754 3755 /* Otherwise assert we are converting between types of the 3756 same kind. */ 3757 if (INTEGRAL_TYPE_P (lhs_type) != INTEGRAL_TYPE_P (rhs1_type)) 3758 { 3759 error ("invalid types in nop conversion"); 3760 debug_generic_expr (lhs_type); 3761 debug_generic_expr (rhs1_type); 3762 return true; 3763 } 3764 3765 return false; 3766 } 3767 3768 case ADDR_SPACE_CONVERT_EXPR: 3769 { 3770 if (!POINTER_TYPE_P (rhs1_type) || !POINTER_TYPE_P (lhs_type) 3771 || (TYPE_ADDR_SPACE (TREE_TYPE (rhs1_type)) 3772 == TYPE_ADDR_SPACE (TREE_TYPE (lhs_type)))) 3773 { 3774 error ("invalid types in address space conversion"); 3775 debug_generic_expr (lhs_type); 3776 debug_generic_expr (rhs1_type); 3777 return true; 3778 } 3779 3780 return false; 3781 } 3782 3783 case FIXED_CONVERT_EXPR: 3784 { 3785 if (!valid_fixed_convert_types_p (lhs_type, rhs1_type) 3786 && !valid_fixed_convert_types_p (rhs1_type, lhs_type)) 3787 { 3788 error ("invalid types in fixed-point conversion"); 3789 debug_generic_expr (lhs_type); 3790 debug_generic_expr (rhs1_type); 3791 return true; 3792 } 3793 3794 return false; 3795 } 3796 3797 case FLOAT_EXPR: 3798 { 3799 if ((!INTEGRAL_TYPE_P (rhs1_type) || !SCALAR_FLOAT_TYPE_P (lhs_type)) 3800 && (!VECTOR_INTEGER_TYPE_P (rhs1_type) 3801 || !VECTOR_FLOAT_TYPE_P (lhs_type))) 3802 { 3803 error ("invalid types in conversion to floating-point"); 3804 debug_generic_expr (lhs_type); 3805 debug_generic_expr (rhs1_type); 3806 return true; 3807 } 3808 3809 return false; 3810 } 3811 3812 case FIX_TRUNC_EXPR: 3813 { 3814 if ((!INTEGRAL_TYPE_P (lhs_type) || !SCALAR_FLOAT_TYPE_P (rhs1_type)) 3815 && (!VECTOR_INTEGER_TYPE_P (lhs_type) 3816 || !VECTOR_FLOAT_TYPE_P (rhs1_type))) 3817 { 3818 error ("invalid types in conversion to integer"); 3819 debug_generic_expr (lhs_type); 3820 debug_generic_expr (rhs1_type); 3821 return true; 3822 } 3823 3824 return false; 3825 } 3826 3827 case VEC_UNPACK_HI_EXPR: 3828 case VEC_UNPACK_LO_EXPR: 3829 case VEC_UNPACK_FLOAT_HI_EXPR: 3830 case VEC_UNPACK_FLOAT_LO_EXPR: 3831 case VEC_UNPACK_FIX_TRUNC_HI_EXPR: 3832 case VEC_UNPACK_FIX_TRUNC_LO_EXPR: 3833 if (TREE_CODE (rhs1_type) != VECTOR_TYPE 3834 || TREE_CODE (lhs_type) != VECTOR_TYPE 3835 || (!INTEGRAL_TYPE_P (TREE_TYPE (lhs_type)) 3836 && !SCALAR_FLOAT_TYPE_P (TREE_TYPE (lhs_type))) 3837 || (!INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type)) 3838 && !SCALAR_FLOAT_TYPE_P (TREE_TYPE (rhs1_type))) 3839 || ((rhs_code == VEC_UNPACK_HI_EXPR 3840 || rhs_code == VEC_UNPACK_LO_EXPR) 3841 && (INTEGRAL_TYPE_P (TREE_TYPE (lhs_type)) 3842 != INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type)))) 3843 || ((rhs_code == VEC_UNPACK_FLOAT_HI_EXPR 3844 || rhs_code == VEC_UNPACK_FLOAT_LO_EXPR) 3845 && (INTEGRAL_TYPE_P (TREE_TYPE (lhs_type)) 3846 || SCALAR_FLOAT_TYPE_P (TREE_TYPE (rhs1_type)))) 3847 || ((rhs_code == VEC_UNPACK_FIX_TRUNC_HI_EXPR 3848 || rhs_code == VEC_UNPACK_FIX_TRUNC_LO_EXPR) 3849 && (INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type)) 3850 || SCALAR_FLOAT_TYPE_P (TREE_TYPE (lhs_type)))) 3851 || (maybe_ne (GET_MODE_SIZE (element_mode (lhs_type)), 3852 2 * GET_MODE_SIZE (element_mode (rhs1_type))) 3853 && (!VECTOR_BOOLEAN_TYPE_P (lhs_type) 3854 || !VECTOR_BOOLEAN_TYPE_P (rhs1_type))) 3855 || maybe_ne (2 * TYPE_VECTOR_SUBPARTS (lhs_type), 3856 TYPE_VECTOR_SUBPARTS (rhs1_type))) 3857 { 3858 error ("type mismatch in %qs expression", code_name); 3859 debug_generic_expr (lhs_type); 3860 debug_generic_expr (rhs1_type); 3861 return true; 3862 } 3863 3864 return false; 3865 3866 case NEGATE_EXPR: 3867 case ABS_EXPR: 3868 case BIT_NOT_EXPR: 3869 case PAREN_EXPR: 3870 case CONJ_EXPR: 3871 /* Disallow pointer and offset types for many of the unary gimple. */ 3872 if (POINTER_TYPE_P (lhs_type) 3873 || TREE_CODE (lhs_type) == OFFSET_TYPE) 3874 { 3875 error ("invalid types for %qs", code_name); 3876 debug_generic_expr (lhs_type); 3877 debug_generic_expr (rhs1_type); 3878 return true; 3879 } 3880 break; 3881 3882 case ABSU_EXPR: 3883 if (!ANY_INTEGRAL_TYPE_P (lhs_type) 3884 || !TYPE_UNSIGNED (lhs_type) 3885 || !ANY_INTEGRAL_TYPE_P (rhs1_type) 3886 || TYPE_UNSIGNED (rhs1_type) 3887 || element_precision (lhs_type) != element_precision (rhs1_type)) 3888 { 3889 error ("invalid types for %qs", code_name); 3890 debug_generic_expr (lhs_type); 3891 debug_generic_expr (rhs1_type); 3892 return true; 3893 } 3894 return false; 3895 3896 case VEC_DUPLICATE_EXPR: 3897 if (TREE_CODE (lhs_type) != VECTOR_TYPE 3898 || !useless_type_conversion_p (TREE_TYPE (lhs_type), rhs1_type)) 3899 { 3900 error ("%qs should be from a scalar to a like vector", code_name); 3901 debug_generic_expr (lhs_type); 3902 debug_generic_expr (rhs1_type); 3903 return true; 3904 } 3905 return false; 3906 3907 default: 3908 gcc_unreachable (); 3909 } 3910 3911 /* For the remaining codes assert there is no conversion involved. */ 3912 if (!useless_type_conversion_p (lhs_type, rhs1_type)) 3913 { 3914 error ("non-trivial conversion in unary operation"); 3915 debug_generic_expr (lhs_type); 3916 debug_generic_expr (rhs1_type); 3917 return true; 3918 } 3919 3920 return false; 3921 } 3922 3923 /* Verify a gimple assignment statement STMT with a binary rhs. 3924 Returns true if anything is wrong. */ 3925 3926 static bool 3927 verify_gimple_assign_binary (gassign *stmt) 3928 { 3929 enum tree_code rhs_code = gimple_assign_rhs_code (stmt); 3930 tree lhs = gimple_assign_lhs (stmt); 3931 tree lhs_type = TREE_TYPE (lhs); 3932 tree rhs1 = gimple_assign_rhs1 (stmt); 3933 tree rhs1_type = TREE_TYPE (rhs1); 3934 tree rhs2 = gimple_assign_rhs2 (stmt); 3935 tree rhs2_type = TREE_TYPE (rhs2); 3936 3937 if (!is_gimple_reg (lhs)) 3938 { 3939 error ("non-register as LHS of binary operation"); 3940 return true; 3941 } 3942 3943 if (!is_gimple_val (rhs1) 3944 || !is_gimple_val (rhs2)) 3945 { 3946 error ("invalid operands in binary operation"); 3947 return true; 3948 } 3949 3950 const char* const code_name = get_tree_code_name (rhs_code); 3951 3952 /* First handle operations that involve different types. */ 3953 switch (rhs_code) 3954 { 3955 case COMPLEX_EXPR: 3956 { 3957 if (TREE_CODE (lhs_type) != COMPLEX_TYPE 3958 || !(INTEGRAL_TYPE_P (rhs1_type) 3959 || SCALAR_FLOAT_TYPE_P (rhs1_type)) 3960 || !(INTEGRAL_TYPE_P (rhs2_type) 3961 || SCALAR_FLOAT_TYPE_P (rhs2_type))) 3962 { 3963 error ("type mismatch in %qs", code_name); 3964 debug_generic_expr (lhs_type); 3965 debug_generic_expr (rhs1_type); 3966 debug_generic_expr (rhs2_type); 3967 return true; 3968 } 3969 3970 return false; 3971 } 3972 3973 case LSHIFT_EXPR: 3974 case RSHIFT_EXPR: 3975 case LROTATE_EXPR: 3976 case RROTATE_EXPR: 3977 { 3978 /* Shifts and rotates are ok on integral types, fixed point 3979 types and integer vector types. */ 3980 if ((!INTEGRAL_TYPE_P (rhs1_type) 3981 && !FIXED_POINT_TYPE_P (rhs1_type) 3982 && ! (VECTOR_TYPE_P (rhs1_type) 3983 && INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type)))) 3984 || (!INTEGRAL_TYPE_P (rhs2_type) 3985 /* Vector shifts of vectors are also ok. */ 3986 && ! (VECTOR_TYPE_P (rhs1_type) 3987 && INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type)) 3988 && VECTOR_TYPE_P (rhs2_type) 3989 && INTEGRAL_TYPE_P (TREE_TYPE (rhs2_type)))) 3990 || !useless_type_conversion_p (lhs_type, rhs1_type)) 3991 { 3992 error ("type mismatch in %qs", code_name); 3993 debug_generic_expr (lhs_type); 3994 debug_generic_expr (rhs1_type); 3995 debug_generic_expr (rhs2_type); 3996 return true; 3997 } 3998 3999 return false; 4000 } 4001 4002 case WIDEN_LSHIFT_EXPR: 4003 { 4004 if (!INTEGRAL_TYPE_P (lhs_type) 4005 || !INTEGRAL_TYPE_P (rhs1_type) 4006 || TREE_CODE (rhs2) != INTEGER_CST 4007 || (2 * TYPE_PRECISION (rhs1_type) > TYPE_PRECISION (lhs_type))) 4008 { 4009 error ("type mismatch in %qs", code_name); 4010 debug_generic_expr (lhs_type); 4011 debug_generic_expr (rhs1_type); 4012 debug_generic_expr (rhs2_type); 4013 return true; 4014 } 4015 4016 return false; 4017 } 4018 4019 case VEC_WIDEN_LSHIFT_HI_EXPR: 4020 case VEC_WIDEN_LSHIFT_LO_EXPR: 4021 { 4022 if (TREE_CODE (rhs1_type) != VECTOR_TYPE 4023 || TREE_CODE (lhs_type) != VECTOR_TYPE 4024 || !INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type)) 4025 || !INTEGRAL_TYPE_P (TREE_TYPE (lhs_type)) 4026 || TREE_CODE (rhs2) != INTEGER_CST 4027 || (2 * TYPE_PRECISION (TREE_TYPE (rhs1_type)) 4028 > TYPE_PRECISION (TREE_TYPE (lhs_type)))) 4029 { 4030 error ("type mismatch in %qs", code_name); 4031 debug_generic_expr (lhs_type); 4032 debug_generic_expr (rhs1_type); 4033 debug_generic_expr (rhs2_type); 4034 return true; 4035 } 4036 4037 return false; 4038 } 4039 4040 case PLUS_EXPR: 4041 case MINUS_EXPR: 4042 { 4043 tree lhs_etype = lhs_type; 4044 tree rhs1_etype = rhs1_type; 4045 tree rhs2_etype = rhs2_type; 4046 if (VECTOR_TYPE_P (lhs_type)) 4047 { 4048 if (TREE_CODE (rhs1_type) != VECTOR_TYPE 4049 || TREE_CODE (rhs2_type) != VECTOR_TYPE) 4050 { 4051 error ("invalid non-vector operands to %qs", code_name); 4052 return true; 4053 } 4054 lhs_etype = TREE_TYPE (lhs_type); 4055 rhs1_etype = TREE_TYPE (rhs1_type); 4056 rhs2_etype = TREE_TYPE (rhs2_type); 4057 } 4058 if (POINTER_TYPE_P (lhs_etype) 4059 || POINTER_TYPE_P (rhs1_etype) 4060 || POINTER_TYPE_P (rhs2_etype)) 4061 { 4062 error ("invalid (pointer) operands %qs", code_name); 4063 return true; 4064 } 4065 4066 /* Continue with generic binary expression handling. */ 4067 break; 4068 } 4069 4070 case POINTER_PLUS_EXPR: 4071 { 4072 if (!POINTER_TYPE_P (rhs1_type) 4073 || !useless_type_conversion_p (lhs_type, rhs1_type) 4074 || !ptrofftype_p (rhs2_type)) 4075 { 4076 error ("type mismatch in %qs", code_name); 4077 debug_generic_stmt (lhs_type); 4078 debug_generic_stmt (rhs1_type); 4079 debug_generic_stmt (rhs2_type); 4080 return true; 4081 } 4082 4083 return false; 4084 } 4085 4086 case POINTER_DIFF_EXPR: 4087 { 4088 if (!POINTER_TYPE_P (rhs1_type) 4089 || !POINTER_TYPE_P (rhs2_type) 4090 /* Because we special-case pointers to void we allow difference 4091 of arbitrary pointers with the same mode. */ 4092 || TYPE_MODE (rhs1_type) != TYPE_MODE (rhs2_type) 4093 || !INTEGRAL_TYPE_P (lhs_type) 4094 || TYPE_UNSIGNED (lhs_type) 4095 || TYPE_PRECISION (lhs_type) != TYPE_PRECISION (rhs1_type)) 4096 { 4097 error ("type mismatch in %qs", code_name); 4098 debug_generic_stmt (lhs_type); 4099 debug_generic_stmt (rhs1_type); 4100 debug_generic_stmt (rhs2_type); 4101 return true; 4102 } 4103 4104 return false; 4105 } 4106 4107 case TRUTH_ANDIF_EXPR: 4108 case TRUTH_ORIF_EXPR: 4109 case TRUTH_AND_EXPR: 4110 case TRUTH_OR_EXPR: 4111 case TRUTH_XOR_EXPR: 4112 4113 gcc_unreachable (); 4114 4115 case LT_EXPR: 4116 case LE_EXPR: 4117 case GT_EXPR: 4118 case GE_EXPR: 4119 case EQ_EXPR: 4120 case NE_EXPR: 4121 case UNORDERED_EXPR: 4122 case ORDERED_EXPR: 4123 case UNLT_EXPR: 4124 case UNLE_EXPR: 4125 case UNGT_EXPR: 4126 case UNGE_EXPR: 4127 case UNEQ_EXPR: 4128 case LTGT_EXPR: 4129 /* Comparisons are also binary, but the result type is not 4130 connected to the operand types. */ 4131 return verify_gimple_comparison (lhs_type, rhs1, rhs2, rhs_code); 4132 4133 case WIDEN_MULT_EXPR: 4134 if (TREE_CODE (lhs_type) != INTEGER_TYPE) 4135 return true; 4136 return ((2 * TYPE_PRECISION (rhs1_type) > TYPE_PRECISION (lhs_type)) 4137 || (TYPE_PRECISION (rhs1_type) != TYPE_PRECISION (rhs2_type))); 4138 4139 case WIDEN_SUM_EXPR: 4140 { 4141 if (((TREE_CODE (rhs1_type) != VECTOR_TYPE 4142 || TREE_CODE (lhs_type) != VECTOR_TYPE) 4143 && ((!INTEGRAL_TYPE_P (rhs1_type) 4144 && !SCALAR_FLOAT_TYPE_P (rhs1_type)) 4145 || (!INTEGRAL_TYPE_P (lhs_type) 4146 && !SCALAR_FLOAT_TYPE_P (lhs_type)))) 4147 || !useless_type_conversion_p (lhs_type, rhs2_type) 4148 || maybe_lt (GET_MODE_SIZE (element_mode (rhs2_type)), 4149 2 * GET_MODE_SIZE (element_mode (rhs1_type)))) 4150 { 4151 error ("type mismatch in %qs", code_name); 4152 debug_generic_expr (lhs_type); 4153 debug_generic_expr (rhs1_type); 4154 debug_generic_expr (rhs2_type); 4155 return true; 4156 } 4157 return false; 4158 } 4159 4160 case VEC_WIDEN_MULT_HI_EXPR: 4161 case VEC_WIDEN_MULT_LO_EXPR: 4162 case VEC_WIDEN_MULT_EVEN_EXPR: 4163 case VEC_WIDEN_MULT_ODD_EXPR: 4164 { 4165 if (TREE_CODE (rhs1_type) != VECTOR_TYPE 4166 || TREE_CODE (lhs_type) != VECTOR_TYPE 4167 || !types_compatible_p (rhs1_type, rhs2_type) 4168 || maybe_ne (GET_MODE_SIZE (element_mode (lhs_type)), 4169 2 * GET_MODE_SIZE (element_mode (rhs1_type)))) 4170 { 4171 error ("type mismatch in %qs", code_name); 4172 debug_generic_expr (lhs_type); 4173 debug_generic_expr (rhs1_type); 4174 debug_generic_expr (rhs2_type); 4175 return true; 4176 } 4177 return false; 4178 } 4179 4180 case VEC_PACK_TRUNC_EXPR: 4181 /* ??? We currently use VEC_PACK_TRUNC_EXPR to simply concat 4182 vector boolean types. */ 4183 if (VECTOR_BOOLEAN_TYPE_P (lhs_type) 4184 && VECTOR_BOOLEAN_TYPE_P (rhs1_type) 4185 && types_compatible_p (rhs1_type, rhs2_type) 4186 && known_eq (TYPE_VECTOR_SUBPARTS (lhs_type), 4187 2 * TYPE_VECTOR_SUBPARTS (rhs1_type))) 4188 return false; 4189 4190 /* Fallthru. */ 4191 case VEC_PACK_SAT_EXPR: 4192 case VEC_PACK_FIX_TRUNC_EXPR: 4193 { 4194 if (TREE_CODE (rhs1_type) != VECTOR_TYPE 4195 || TREE_CODE (lhs_type) != VECTOR_TYPE 4196 || !((rhs_code == VEC_PACK_FIX_TRUNC_EXPR 4197 && SCALAR_FLOAT_TYPE_P (TREE_TYPE (rhs1_type)) 4198 && INTEGRAL_TYPE_P (TREE_TYPE (lhs_type))) 4199 || (INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type)) 4200 == INTEGRAL_TYPE_P (TREE_TYPE (lhs_type)))) 4201 || !types_compatible_p (rhs1_type, rhs2_type) 4202 || maybe_ne (GET_MODE_SIZE (element_mode (rhs1_type)), 4203 2 * GET_MODE_SIZE (element_mode (lhs_type))) 4204 || maybe_ne (2 * TYPE_VECTOR_SUBPARTS (rhs1_type), 4205 TYPE_VECTOR_SUBPARTS (lhs_type))) 4206 { 4207 error ("type mismatch in %qs", code_name); 4208 debug_generic_expr (lhs_type); 4209 debug_generic_expr (rhs1_type); 4210 debug_generic_expr (rhs2_type); 4211 return true; 4212 } 4213 4214 return false; 4215 } 4216 4217 case VEC_PACK_FLOAT_EXPR: 4218 if (TREE_CODE (rhs1_type) != VECTOR_TYPE 4219 || TREE_CODE (lhs_type) != VECTOR_TYPE 4220 || !INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type)) 4221 || !SCALAR_FLOAT_TYPE_P (TREE_TYPE (lhs_type)) 4222 || !types_compatible_p (rhs1_type, rhs2_type) 4223 || maybe_ne (GET_MODE_SIZE (element_mode (rhs1_type)), 4224 2 * GET_MODE_SIZE (element_mode (lhs_type))) 4225 || maybe_ne (2 * TYPE_VECTOR_SUBPARTS (rhs1_type), 4226 TYPE_VECTOR_SUBPARTS (lhs_type))) 4227 { 4228 error ("type mismatch in %qs", code_name); 4229 debug_generic_expr (lhs_type); 4230 debug_generic_expr (rhs1_type); 4231 debug_generic_expr (rhs2_type); 4232 return true; 4233 } 4234 4235 return false; 4236 4237 case MULT_EXPR: 4238 case MULT_HIGHPART_EXPR: 4239 case TRUNC_DIV_EXPR: 4240 case CEIL_DIV_EXPR: 4241 case FLOOR_DIV_EXPR: 4242 case ROUND_DIV_EXPR: 4243 case TRUNC_MOD_EXPR: 4244 case CEIL_MOD_EXPR: 4245 case FLOOR_MOD_EXPR: 4246 case ROUND_MOD_EXPR: 4247 case RDIV_EXPR: 4248 case EXACT_DIV_EXPR: 4249 case BIT_IOR_EXPR: 4250 case BIT_XOR_EXPR: 4251 /* Disallow pointer and offset types for many of the binary gimple. */ 4252 if (POINTER_TYPE_P (lhs_type) 4253 || TREE_CODE (lhs_type) == OFFSET_TYPE) 4254 { 4255 error ("invalid types for %qs", code_name); 4256 debug_generic_expr (lhs_type); 4257 debug_generic_expr (rhs1_type); 4258 debug_generic_expr (rhs2_type); 4259 return true; 4260 } 4261 /* Continue with generic binary expression handling. */ 4262 break; 4263 4264 case MIN_EXPR: 4265 case MAX_EXPR: 4266 /* Continue with generic binary expression handling. */ 4267 break; 4268 4269 case BIT_AND_EXPR: 4270 if (POINTER_TYPE_P (lhs_type) 4271 && TREE_CODE (rhs2) == INTEGER_CST) 4272 break; 4273 /* Disallow pointer and offset types for many of the binary gimple. */ 4274 if (POINTER_TYPE_P (lhs_type) 4275 || TREE_CODE (lhs_type) == OFFSET_TYPE) 4276 { 4277 error ("invalid types for %qs", code_name); 4278 debug_generic_expr (lhs_type); 4279 debug_generic_expr (rhs1_type); 4280 debug_generic_expr (rhs2_type); 4281 return true; 4282 } 4283 /* Continue with generic binary expression handling. */ 4284 break; 4285 4286 case VEC_SERIES_EXPR: 4287 if (!useless_type_conversion_p (rhs1_type, rhs2_type)) 4288 { 4289 error ("type mismatch in %qs", code_name); 4290 debug_generic_expr (rhs1_type); 4291 debug_generic_expr (rhs2_type); 4292 return true; 4293 } 4294 if (TREE_CODE (lhs_type) != VECTOR_TYPE 4295 || !useless_type_conversion_p (TREE_TYPE (lhs_type), rhs1_type)) 4296 { 4297 error ("vector type expected in %qs", code_name); 4298 debug_generic_expr (lhs_type); 4299 return true; 4300 } 4301 return false; 4302 4303 default: 4304 gcc_unreachable (); 4305 } 4306 4307 if (!useless_type_conversion_p (lhs_type, rhs1_type) 4308 || !useless_type_conversion_p (lhs_type, rhs2_type)) 4309 { 4310 error ("type mismatch in binary expression"); 4311 debug_generic_stmt (lhs_type); 4312 debug_generic_stmt (rhs1_type); 4313 debug_generic_stmt (rhs2_type); 4314 return true; 4315 } 4316 4317 return false; 4318 } 4319 4320 /* Verify a gimple assignment statement STMT with a ternary rhs. 4321 Returns true if anything is wrong. */ 4322 4323 static bool 4324 verify_gimple_assign_ternary (gassign *stmt) 4325 { 4326 enum tree_code rhs_code = gimple_assign_rhs_code (stmt); 4327 tree lhs = gimple_assign_lhs (stmt); 4328 tree lhs_type = TREE_TYPE (lhs); 4329 tree rhs1 = gimple_assign_rhs1 (stmt); 4330 tree rhs1_type = TREE_TYPE (rhs1); 4331 tree rhs2 = gimple_assign_rhs2 (stmt); 4332 tree rhs2_type = TREE_TYPE (rhs2); 4333 tree rhs3 = gimple_assign_rhs3 (stmt); 4334 tree rhs3_type = TREE_TYPE (rhs3); 4335 4336 if (!is_gimple_reg (lhs)) 4337 { 4338 error ("non-register as LHS of ternary operation"); 4339 return true; 4340 } 4341 4342 if (!is_gimple_val (rhs1) 4343 || !is_gimple_val (rhs2) 4344 || !is_gimple_val (rhs3)) 4345 { 4346 error ("invalid operands in ternary operation"); 4347 return true; 4348 } 4349 4350 const char* const code_name = get_tree_code_name (rhs_code); 4351 4352 /* First handle operations that involve different types. */ 4353 switch (rhs_code) 4354 { 4355 case WIDEN_MULT_PLUS_EXPR: 4356 case WIDEN_MULT_MINUS_EXPR: 4357 if ((!INTEGRAL_TYPE_P (rhs1_type) 4358 && !FIXED_POINT_TYPE_P (rhs1_type)) 4359 || !useless_type_conversion_p (rhs1_type, rhs2_type) 4360 || !useless_type_conversion_p (lhs_type, rhs3_type) 4361 || 2 * TYPE_PRECISION (rhs1_type) > TYPE_PRECISION (lhs_type) 4362 || TYPE_PRECISION (rhs1_type) != TYPE_PRECISION (rhs2_type)) 4363 { 4364 error ("type mismatch in %qs", code_name); 4365 debug_generic_expr (lhs_type); 4366 debug_generic_expr (rhs1_type); 4367 debug_generic_expr (rhs2_type); 4368 debug_generic_expr (rhs3_type); 4369 return true; 4370 } 4371 break; 4372 4373 case VEC_COND_EXPR: 4374 if (!VECTOR_BOOLEAN_TYPE_P (rhs1_type) 4375 || maybe_ne (TYPE_VECTOR_SUBPARTS (rhs1_type), 4376 TYPE_VECTOR_SUBPARTS (lhs_type))) 4377 { 4378 error ("the first argument of a %qs must be of a " 4379 "boolean vector type of the same number of elements " 4380 "as the result", code_name); 4381 debug_generic_expr (lhs_type); 4382 debug_generic_expr (rhs1_type); 4383 return true; 4384 } 4385 /* Fallthrough. */ 4386 case COND_EXPR: 4387 if (!useless_type_conversion_p (lhs_type, rhs2_type) 4388 || !useless_type_conversion_p (lhs_type, rhs3_type)) 4389 { 4390 error ("type mismatch in %qs", code_name); 4391 debug_generic_expr (lhs_type); 4392 debug_generic_expr (rhs2_type); 4393 debug_generic_expr (rhs3_type); 4394 return true; 4395 } 4396 break; 4397 4398 case VEC_PERM_EXPR: 4399 /* If permute is constant, then we allow for lhs and rhs 4400 to have different vector types, provided: 4401 (1) lhs, rhs1, rhs2 have same element type. 4402 (2) rhs3 vector is constant and has integer element type. 4403 (3) len(lhs) == len(rhs3) && len(rhs1) == len(rhs2). */ 4404 4405 if (TREE_CODE (lhs_type) != VECTOR_TYPE 4406 || TREE_CODE (rhs1_type) != VECTOR_TYPE 4407 || TREE_CODE (rhs2_type) != VECTOR_TYPE 4408 || TREE_CODE (rhs3_type) != VECTOR_TYPE) 4409 { 4410 error ("vector types expected in %qs", code_name); 4411 debug_generic_expr (lhs_type); 4412 debug_generic_expr (rhs1_type); 4413 debug_generic_expr (rhs2_type); 4414 debug_generic_expr (rhs3_type); 4415 return true; 4416 } 4417 4418 /* If rhs3 is constant, we allow lhs, rhs1 and rhs2 to be different vector types, 4419 as long as lhs, rhs1 and rhs2 have same element type. */ 4420 if (TREE_CONSTANT (rhs3) 4421 ? (!useless_type_conversion_p (TREE_TYPE (lhs_type), TREE_TYPE (rhs1_type)) 4422 || !useless_type_conversion_p (TREE_TYPE (lhs_type), TREE_TYPE (rhs2_type))) 4423 : (!useless_type_conversion_p (lhs_type, rhs1_type) 4424 || !useless_type_conversion_p (lhs_type, rhs2_type))) 4425 { 4426 error ("type mismatch in %qs", code_name); 4427 debug_generic_expr (lhs_type); 4428 debug_generic_expr (rhs1_type); 4429 debug_generic_expr (rhs2_type); 4430 debug_generic_expr (rhs3_type); 4431 return true; 4432 } 4433 4434 /* If rhs3 is constant, relax the check len(rhs2) == len(rhs3). */ 4435 if (maybe_ne (TYPE_VECTOR_SUBPARTS (rhs1_type), 4436 TYPE_VECTOR_SUBPARTS (rhs2_type)) 4437 || (!TREE_CONSTANT(rhs3) 4438 && maybe_ne (TYPE_VECTOR_SUBPARTS (rhs2_type), 4439 TYPE_VECTOR_SUBPARTS (rhs3_type))) 4440 || maybe_ne (TYPE_VECTOR_SUBPARTS (rhs3_type), 4441 TYPE_VECTOR_SUBPARTS (lhs_type))) 4442 { 4443 error ("vectors with different element number found in %qs", 4444 code_name); 4445 debug_generic_expr (lhs_type); 4446 debug_generic_expr (rhs1_type); 4447 debug_generic_expr (rhs2_type); 4448 debug_generic_expr (rhs3_type); 4449 return true; 4450 } 4451 4452 if (TREE_CODE (TREE_TYPE (rhs3_type)) != INTEGER_TYPE 4453 || (TREE_CODE (rhs3) != VECTOR_CST 4454 && (GET_MODE_BITSIZE (SCALAR_INT_TYPE_MODE 4455 (TREE_TYPE (rhs3_type))) 4456 != GET_MODE_BITSIZE (SCALAR_TYPE_MODE 4457 (TREE_TYPE (rhs1_type)))))) 4458 { 4459 error ("invalid mask type in %qs", code_name); 4460 debug_generic_expr (lhs_type); 4461 debug_generic_expr (rhs1_type); 4462 debug_generic_expr (rhs2_type); 4463 debug_generic_expr (rhs3_type); 4464 return true; 4465 } 4466 4467 return false; 4468 4469 case SAD_EXPR: 4470 if (!useless_type_conversion_p (rhs1_type, rhs2_type) 4471 || !useless_type_conversion_p (lhs_type, rhs3_type) 4472 || 2 * GET_MODE_UNIT_BITSIZE (TYPE_MODE (TREE_TYPE (rhs1_type))) 4473 > GET_MODE_UNIT_BITSIZE (TYPE_MODE (TREE_TYPE (lhs_type)))) 4474 { 4475 error ("type mismatch in %qs", code_name); 4476 debug_generic_expr (lhs_type); 4477 debug_generic_expr (rhs1_type); 4478 debug_generic_expr (rhs2_type); 4479 debug_generic_expr (rhs3_type); 4480 return true; 4481 } 4482 4483 if (TREE_CODE (rhs1_type) != VECTOR_TYPE 4484 || TREE_CODE (rhs2_type) != VECTOR_TYPE 4485 || TREE_CODE (rhs3_type) != VECTOR_TYPE) 4486 { 4487 error ("vector types expected in %qs", code_name); 4488 debug_generic_expr (lhs_type); 4489 debug_generic_expr (rhs1_type); 4490 debug_generic_expr (rhs2_type); 4491 debug_generic_expr (rhs3_type); 4492 return true; 4493 } 4494 4495 return false; 4496 4497 case BIT_INSERT_EXPR: 4498 if (! useless_type_conversion_p (lhs_type, rhs1_type)) 4499 { 4500 error ("type mismatch in %qs", code_name); 4501 debug_generic_expr (lhs_type); 4502 debug_generic_expr (rhs1_type); 4503 return true; 4504 } 4505 if (! ((INTEGRAL_TYPE_P (rhs1_type) 4506 && INTEGRAL_TYPE_P (rhs2_type)) 4507 /* Vector element insert. */ 4508 || (VECTOR_TYPE_P (rhs1_type) 4509 && types_compatible_p (TREE_TYPE (rhs1_type), rhs2_type)) 4510 /* Aligned sub-vector insert. */ 4511 || (VECTOR_TYPE_P (rhs1_type) 4512 && VECTOR_TYPE_P (rhs2_type) 4513 && types_compatible_p (TREE_TYPE (rhs1_type), 4514 TREE_TYPE (rhs2_type)) 4515 && multiple_p (TYPE_VECTOR_SUBPARTS (rhs1_type), 4516 TYPE_VECTOR_SUBPARTS (rhs2_type)) 4517 && multiple_p (wi::to_poly_offset (rhs3), 4518 wi::to_poly_offset (TYPE_SIZE (rhs2_type)))))) 4519 { 4520 error ("not allowed type combination in %qs", code_name); 4521 debug_generic_expr (rhs1_type); 4522 debug_generic_expr (rhs2_type); 4523 return true; 4524 } 4525 if (! tree_fits_uhwi_p (rhs3) 4526 || ! types_compatible_p (bitsizetype, TREE_TYPE (rhs3)) 4527 || ! tree_fits_uhwi_p (TYPE_SIZE (rhs2_type))) 4528 { 4529 error ("invalid position or size in %qs", code_name); 4530 return true; 4531 } 4532 if (INTEGRAL_TYPE_P (rhs1_type) 4533 && !type_has_mode_precision_p (rhs1_type)) 4534 { 4535 error ("%qs into non-mode-precision operand", code_name); 4536 return true; 4537 } 4538 if (INTEGRAL_TYPE_P (rhs1_type)) 4539 { 4540 unsigned HOST_WIDE_INT bitpos = tree_to_uhwi (rhs3); 4541 if (bitpos >= TYPE_PRECISION (rhs1_type) 4542 || (bitpos + TYPE_PRECISION (rhs2_type) 4543 > TYPE_PRECISION (rhs1_type))) 4544 { 4545 error ("insertion out of range in %qs", code_name); 4546 return true; 4547 } 4548 } 4549 else if (VECTOR_TYPE_P (rhs1_type)) 4550 { 4551 unsigned HOST_WIDE_INT bitpos = tree_to_uhwi (rhs3); 4552 unsigned HOST_WIDE_INT bitsize = tree_to_uhwi (TYPE_SIZE (rhs2_type)); 4553 if (bitpos % bitsize != 0) 4554 { 4555 error ("%qs not at element boundary", code_name); 4556 return true; 4557 } 4558 } 4559 return false; 4560 4561 case DOT_PROD_EXPR: 4562 { 4563 if (((TREE_CODE (rhs1_type) != VECTOR_TYPE 4564 || TREE_CODE (lhs_type) != VECTOR_TYPE) 4565 && ((!INTEGRAL_TYPE_P (rhs1_type) 4566 && !SCALAR_FLOAT_TYPE_P (rhs1_type)) 4567 || (!INTEGRAL_TYPE_P (lhs_type) 4568 && !SCALAR_FLOAT_TYPE_P (lhs_type)))) 4569 /* rhs1_type and rhs2_type may differ in sign. */ 4570 || !tree_nop_conversion_p (rhs1_type, rhs2_type) 4571 || !useless_type_conversion_p (lhs_type, rhs3_type) 4572 || maybe_lt (GET_MODE_SIZE (element_mode (rhs3_type)), 4573 2 * GET_MODE_SIZE (element_mode (rhs1_type)))) 4574 { 4575 error ("type mismatch in %qs", code_name); 4576 debug_generic_expr (lhs_type); 4577 debug_generic_expr (rhs1_type); 4578 debug_generic_expr (rhs2_type); 4579 return true; 4580 } 4581 return false; 4582 } 4583 4584 case REALIGN_LOAD_EXPR: 4585 /* FIXME. */ 4586 return false; 4587 4588 default: 4589 gcc_unreachable (); 4590 } 4591 return false; 4592 } 4593 4594 /* Verify a gimple assignment statement STMT with a single rhs. 4595 Returns true if anything is wrong. */ 4596 4597 static bool 4598 verify_gimple_assign_single (gassign *stmt) 4599 { 4600 enum tree_code rhs_code = gimple_assign_rhs_code (stmt); 4601 tree lhs = gimple_assign_lhs (stmt); 4602 tree lhs_type = TREE_TYPE (lhs); 4603 tree rhs1 = gimple_assign_rhs1 (stmt); 4604 tree rhs1_type = TREE_TYPE (rhs1); 4605 bool res = false; 4606 4607 const char* const code_name = get_tree_code_name (rhs_code); 4608 4609 if (!useless_type_conversion_p (lhs_type, rhs1_type)) 4610 { 4611 error ("non-trivial conversion in %qs", code_name); 4612 debug_generic_expr (lhs_type); 4613 debug_generic_expr (rhs1_type); 4614 return true; 4615 } 4616 4617 if (gimple_clobber_p (stmt) 4618 && !(DECL_P (lhs) || TREE_CODE (lhs) == MEM_REF)) 4619 { 4620 error ("%qs LHS in clobber statement", 4621 get_tree_code_name (TREE_CODE (lhs))); 4622 debug_generic_expr (lhs); 4623 return true; 4624 } 4625 4626 if (TREE_CODE (lhs) == WITH_SIZE_EXPR) 4627 { 4628 error ("%qs LHS in assignment statement", 4629 get_tree_code_name (TREE_CODE (lhs))); 4630 debug_generic_expr (lhs); 4631 return true; 4632 } 4633 4634 if (handled_component_p (lhs) 4635 || TREE_CODE (lhs) == MEM_REF 4636 || TREE_CODE (lhs) == TARGET_MEM_REF) 4637 res |= verify_types_in_gimple_reference (lhs, true); 4638 4639 /* Special codes we cannot handle via their class. */ 4640 switch (rhs_code) 4641 { 4642 case ADDR_EXPR: 4643 { 4644 tree op = TREE_OPERAND (rhs1, 0); 4645 if (!is_gimple_addressable (op)) 4646 { 4647 error ("invalid operand in %qs", code_name); 4648 return true; 4649 } 4650 4651 /* Technically there is no longer a need for matching types, but 4652 gimple hygiene asks for this check. In LTO we can end up 4653 combining incompatible units and thus end up with addresses 4654 of globals that change their type to a common one. */ 4655 if (!in_lto_p 4656 && !types_compatible_p (TREE_TYPE (op), 4657 TREE_TYPE (TREE_TYPE (rhs1))) 4658 && !one_pointer_to_useless_type_conversion_p (TREE_TYPE (rhs1), 4659 TREE_TYPE (op))) 4660 { 4661 error ("type mismatch in %qs", code_name); 4662 debug_generic_stmt (TREE_TYPE (rhs1)); 4663 debug_generic_stmt (TREE_TYPE (op)); 4664 return true; 4665 } 4666 4667 return (verify_address (rhs1, true) 4668 || verify_types_in_gimple_reference (op, true)); 4669 } 4670 4671 /* tcc_reference */ 4672 case INDIRECT_REF: 4673 error ("%qs in gimple IL", code_name); 4674 return true; 4675 4676 case WITH_SIZE_EXPR: 4677 if (!is_gimple_val (TREE_OPERAND (rhs1, 1))) 4678 { 4679 error ("invalid %qs size argument in load", code_name); 4680 debug_generic_stmt (lhs); 4681 debug_generic_stmt (rhs1); 4682 return true; 4683 } 4684 rhs1 = TREE_OPERAND (rhs1, 0); 4685 /* Fallthru. */ 4686 case COMPONENT_REF: 4687 case BIT_FIELD_REF: 4688 case ARRAY_REF: 4689 case ARRAY_RANGE_REF: 4690 case VIEW_CONVERT_EXPR: 4691 case REALPART_EXPR: 4692 case IMAGPART_EXPR: 4693 case TARGET_MEM_REF: 4694 case MEM_REF: 4695 if (!is_gimple_reg (lhs) 4696 && is_gimple_reg_type (TREE_TYPE (lhs))) 4697 { 4698 error ("invalid RHS for gimple memory store: %qs", code_name); 4699 debug_generic_stmt (lhs); 4700 debug_generic_stmt (rhs1); 4701 return true; 4702 } 4703 return res || verify_types_in_gimple_reference (rhs1, false); 4704 4705 /* tcc_constant */ 4706 case SSA_NAME: 4707 case INTEGER_CST: 4708 case REAL_CST: 4709 case FIXED_CST: 4710 case COMPLEX_CST: 4711 case VECTOR_CST: 4712 case STRING_CST: 4713 return res; 4714 4715 /* tcc_declaration */ 4716 case CONST_DECL: 4717 return res; 4718 case VAR_DECL: 4719 case PARM_DECL: 4720 if (!is_gimple_reg (lhs) 4721 && !is_gimple_reg (rhs1) 4722 && is_gimple_reg_type (TREE_TYPE (lhs))) 4723 { 4724 error ("invalid RHS for gimple memory store: %qs", code_name); 4725 debug_generic_stmt (lhs); 4726 debug_generic_stmt (rhs1); 4727 return true; 4728 } 4729 return res; 4730 4731 case CONSTRUCTOR: 4732 if (VECTOR_TYPE_P (rhs1_type)) 4733 { 4734 unsigned int i; 4735 tree elt_i, elt_v, elt_t = NULL_TREE; 4736 4737 if (CONSTRUCTOR_NELTS (rhs1) == 0) 4738 return res; 4739 /* For vector CONSTRUCTORs we require that either it is empty 4740 CONSTRUCTOR, or it is a CONSTRUCTOR of smaller vector elements 4741 (then the element count must be correct to cover the whole 4742 outer vector and index must be NULL on all elements, or it is 4743 a CONSTRUCTOR of scalar elements, where we as an exception allow 4744 smaller number of elements (assuming zero filling) and 4745 consecutive indexes as compared to NULL indexes (such 4746 CONSTRUCTORs can appear in the IL from FEs). */ 4747 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (rhs1), i, elt_i, elt_v) 4748 { 4749 if (elt_t == NULL_TREE) 4750 { 4751 elt_t = TREE_TYPE (elt_v); 4752 if (VECTOR_TYPE_P (elt_t)) 4753 { 4754 tree elt_t = TREE_TYPE (elt_v); 4755 if (!useless_type_conversion_p (TREE_TYPE (rhs1_type), 4756 TREE_TYPE (elt_t))) 4757 { 4758 error ("incorrect type of vector %qs elements", 4759 code_name); 4760 debug_generic_stmt (rhs1); 4761 return true; 4762 } 4763 else if (maybe_ne (CONSTRUCTOR_NELTS (rhs1) 4764 * TYPE_VECTOR_SUBPARTS (elt_t), 4765 TYPE_VECTOR_SUBPARTS (rhs1_type))) 4766 { 4767 error ("incorrect number of vector %qs elements", 4768 code_name); 4769 debug_generic_stmt (rhs1); 4770 return true; 4771 } 4772 } 4773 else if (!useless_type_conversion_p (TREE_TYPE (rhs1_type), 4774 elt_t)) 4775 { 4776 error ("incorrect type of vector %qs elements", 4777 code_name); 4778 debug_generic_stmt (rhs1); 4779 return true; 4780 } 4781 else if (maybe_gt (CONSTRUCTOR_NELTS (rhs1), 4782 TYPE_VECTOR_SUBPARTS (rhs1_type))) 4783 { 4784 error ("incorrect number of vector %qs elements", 4785 code_name); 4786 debug_generic_stmt (rhs1); 4787 return true; 4788 } 4789 } 4790 else if (!useless_type_conversion_p (elt_t, TREE_TYPE (elt_v))) 4791 { 4792 error ("incorrect type of vector CONSTRUCTOR elements"); 4793 debug_generic_stmt (rhs1); 4794 return true; 4795 } 4796 if (elt_i != NULL_TREE 4797 && (VECTOR_TYPE_P (elt_t) 4798 || TREE_CODE (elt_i) != INTEGER_CST 4799 || compare_tree_int (elt_i, i) != 0)) 4800 { 4801 error ("vector %qs with non-NULL element index", 4802 code_name); 4803 debug_generic_stmt (rhs1); 4804 return true; 4805 } 4806 if (!is_gimple_val (elt_v)) 4807 { 4808 error ("vector %qs element is not a GIMPLE value", 4809 code_name); 4810 debug_generic_stmt (rhs1); 4811 return true; 4812 } 4813 } 4814 } 4815 else if (CONSTRUCTOR_NELTS (rhs1) != 0) 4816 { 4817 error ("non-vector %qs with elements", code_name); 4818 debug_generic_stmt (rhs1); 4819 return true; 4820 } 4821 return res; 4822 4823 case OBJ_TYPE_REF: 4824 /* FIXME. */ 4825 return res; 4826 4827 default:; 4828 } 4829 4830 return res; 4831 } 4832 4833 /* Verify the contents of a GIMPLE_ASSIGN STMT. Returns true when there 4834 is a problem, otherwise false. */ 4835 4836 static bool 4837 verify_gimple_assign (gassign *stmt) 4838 { 4839 switch (gimple_assign_rhs_class (stmt)) 4840 { 4841 case GIMPLE_SINGLE_RHS: 4842 return verify_gimple_assign_single (stmt); 4843 4844 case GIMPLE_UNARY_RHS: 4845 return verify_gimple_assign_unary (stmt); 4846 4847 case GIMPLE_BINARY_RHS: 4848 return verify_gimple_assign_binary (stmt); 4849 4850 case GIMPLE_TERNARY_RHS: 4851 return verify_gimple_assign_ternary (stmt); 4852 4853 default: 4854 gcc_unreachable (); 4855 } 4856 } 4857 4858 /* Verify the contents of a GIMPLE_RETURN STMT. Returns true when there 4859 is a problem, otherwise false. */ 4860 4861 static bool 4862 verify_gimple_return (greturn *stmt) 4863 { 4864 tree op = gimple_return_retval (stmt); 4865 tree restype = TREE_TYPE (TREE_TYPE (cfun->decl)); 4866 4867 /* We cannot test for present return values as we do not fix up missing 4868 return values from the original source. */ 4869 if (op == NULL) 4870 return false; 4871 4872 if (!is_gimple_val (op) 4873 && TREE_CODE (op) != RESULT_DECL) 4874 { 4875 error ("invalid operand in return statement"); 4876 debug_generic_stmt (op); 4877 return true; 4878 } 4879 4880 if ((TREE_CODE (op) == RESULT_DECL 4881 && DECL_BY_REFERENCE (op)) 4882 || (TREE_CODE (op) == SSA_NAME 4883 && SSA_NAME_VAR (op) 4884 && TREE_CODE (SSA_NAME_VAR (op)) == RESULT_DECL 4885 && DECL_BY_REFERENCE (SSA_NAME_VAR (op)))) 4886 op = TREE_TYPE (op); 4887 4888 if (!useless_type_conversion_p (restype, TREE_TYPE (op))) 4889 { 4890 error ("invalid conversion in return statement"); 4891 debug_generic_stmt (restype); 4892 debug_generic_stmt (TREE_TYPE (op)); 4893 return true; 4894 } 4895 4896 return false; 4897 } 4898 4899 4900 /* Verify the contents of a GIMPLE_GOTO STMT. Returns true when there 4901 is a problem, otherwise false. */ 4902 4903 static bool 4904 verify_gimple_goto (ggoto *stmt) 4905 { 4906 tree dest = gimple_goto_dest (stmt); 4907 4908 /* ??? We have two canonical forms of direct goto destinations, a 4909 bare LABEL_DECL and an ADDR_EXPR of a LABEL_DECL. */ 4910 if (TREE_CODE (dest) != LABEL_DECL 4911 && (!is_gimple_val (dest) 4912 || !POINTER_TYPE_P (TREE_TYPE (dest)))) 4913 { 4914 error ("goto destination is neither a label nor a pointer"); 4915 return true; 4916 } 4917 4918 return false; 4919 } 4920 4921 /* Verify the contents of a GIMPLE_SWITCH STMT. Returns true when there 4922 is a problem, otherwise false. */ 4923 4924 static bool 4925 verify_gimple_switch (gswitch *stmt) 4926 { 4927 unsigned int i, n; 4928 tree elt, prev_upper_bound = NULL_TREE; 4929 tree index_type, elt_type = NULL_TREE; 4930 4931 if (!is_gimple_val (gimple_switch_index (stmt))) 4932 { 4933 error ("invalid operand to switch statement"); 4934 debug_generic_stmt (gimple_switch_index (stmt)); 4935 return true; 4936 } 4937 4938 index_type = TREE_TYPE (gimple_switch_index (stmt)); 4939 if (! INTEGRAL_TYPE_P (index_type)) 4940 { 4941 error ("non-integral type switch statement"); 4942 debug_generic_expr (index_type); 4943 return true; 4944 } 4945 4946 elt = gimple_switch_label (stmt, 0); 4947 if (CASE_LOW (elt) != NULL_TREE 4948 || CASE_HIGH (elt) != NULL_TREE 4949 || CASE_CHAIN (elt) != NULL_TREE) 4950 { 4951 error ("invalid default case label in switch statement"); 4952 debug_generic_expr (elt); 4953 return true; 4954 } 4955 4956 n = gimple_switch_num_labels (stmt); 4957 for (i = 1; i < n; i++) 4958 { 4959 elt = gimple_switch_label (stmt, i); 4960 4961 if (CASE_CHAIN (elt)) 4962 { 4963 error ("invalid %<CASE_CHAIN%>"); 4964 debug_generic_expr (elt); 4965 return true; 4966 } 4967 if (! CASE_LOW (elt)) 4968 { 4969 error ("invalid case label in switch statement"); 4970 debug_generic_expr (elt); 4971 return true; 4972 } 4973 if (CASE_HIGH (elt) 4974 && ! tree_int_cst_lt (CASE_LOW (elt), CASE_HIGH (elt))) 4975 { 4976 error ("invalid case range in switch statement"); 4977 debug_generic_expr (elt); 4978 return true; 4979 } 4980 4981 if (! elt_type) 4982 { 4983 elt_type = TREE_TYPE (CASE_LOW (elt)); 4984 if (TYPE_PRECISION (index_type) < TYPE_PRECISION (elt_type)) 4985 { 4986 error ("type precision mismatch in switch statement"); 4987 return true; 4988 } 4989 } 4990 if (TREE_TYPE (CASE_LOW (elt)) != elt_type 4991 || (CASE_HIGH (elt) && TREE_TYPE (CASE_HIGH (elt)) != elt_type)) 4992 { 4993 error ("type mismatch for case label in switch statement"); 4994 debug_generic_expr (elt); 4995 return true; 4996 } 4997 4998 if (prev_upper_bound) 4999 { 5000 if (! tree_int_cst_lt (prev_upper_bound, CASE_LOW (elt))) 5001 { 5002 error ("case labels not sorted in switch statement"); 5003 return true; 5004 } 5005 } 5006 5007 prev_upper_bound = CASE_HIGH (elt); 5008 if (! prev_upper_bound) 5009 prev_upper_bound = CASE_LOW (elt); 5010 } 5011 5012 return false; 5013 } 5014 5015 /* Verify a gimple debug statement STMT. 5016 Returns true if anything is wrong. */ 5017 5018 static bool 5019 verify_gimple_debug (gimple *stmt ATTRIBUTE_UNUSED) 5020 { 5021 /* There isn't much that could be wrong in a gimple debug stmt. A 5022 gimple debug bind stmt, for example, maps a tree, that's usually 5023 a VAR_DECL or a PARM_DECL, but that could also be some scalarized 5024 component or member of an aggregate type, to another tree, that 5025 can be an arbitrary expression. These stmts expand into debug 5026 insns, and are converted to debug notes by var-tracking.cc. */ 5027 return false; 5028 } 5029 5030 /* Verify a gimple label statement STMT. 5031 Returns true if anything is wrong. */ 5032 5033 static bool 5034 verify_gimple_label (glabel *stmt) 5035 { 5036 tree decl = gimple_label_label (stmt); 5037 int uid; 5038 bool err = false; 5039 5040 if (TREE_CODE (decl) != LABEL_DECL) 5041 return true; 5042 if (!DECL_NONLOCAL (decl) && !FORCED_LABEL (decl) 5043 && DECL_CONTEXT (decl) != current_function_decl) 5044 { 5045 error ("label context is not the current function declaration"); 5046 err |= true; 5047 } 5048 5049 uid = LABEL_DECL_UID (decl); 5050 if (cfun->cfg 5051 && (uid == -1 5052 || (*label_to_block_map_for_fn (cfun))[uid] != gimple_bb (stmt))) 5053 { 5054 error ("incorrect entry in %<label_to_block_map%>"); 5055 err |= true; 5056 } 5057 5058 uid = EH_LANDING_PAD_NR (decl); 5059 if (uid) 5060 { 5061 eh_landing_pad lp = get_eh_landing_pad_from_number (uid); 5062 if (decl != lp->post_landing_pad) 5063 { 5064 error ("incorrect setting of landing pad number"); 5065 err |= true; 5066 } 5067 } 5068 5069 return err; 5070 } 5071 5072 /* Verify a gimple cond statement STMT. 5073 Returns true if anything is wrong. */ 5074 5075 static bool 5076 verify_gimple_cond (gcond *stmt) 5077 { 5078 if (TREE_CODE_CLASS (gimple_cond_code (stmt)) != tcc_comparison) 5079 { 5080 error ("invalid comparison code in gimple cond"); 5081 return true; 5082 } 5083 if (!(!gimple_cond_true_label (stmt) 5084 || TREE_CODE (gimple_cond_true_label (stmt)) == LABEL_DECL) 5085 || !(!gimple_cond_false_label (stmt) 5086 || TREE_CODE (gimple_cond_false_label (stmt)) == LABEL_DECL)) 5087 { 5088 error ("invalid labels in gimple cond"); 5089 return true; 5090 } 5091 5092 return verify_gimple_comparison (boolean_type_node, 5093 gimple_cond_lhs (stmt), 5094 gimple_cond_rhs (stmt), 5095 gimple_cond_code (stmt)); 5096 } 5097 5098 /* Verify the GIMPLE statement STMT. Returns true if there is an 5099 error, otherwise false. */ 5100 5101 static bool 5102 verify_gimple_stmt (gimple *stmt) 5103 { 5104 switch (gimple_code (stmt)) 5105 { 5106 case GIMPLE_ASSIGN: 5107 return verify_gimple_assign (as_a <gassign *> (stmt)); 5108 5109 case GIMPLE_LABEL: 5110 return verify_gimple_label (as_a <glabel *> (stmt)); 5111 5112 case GIMPLE_CALL: 5113 return verify_gimple_call (as_a <gcall *> (stmt)); 5114 5115 case GIMPLE_COND: 5116 return verify_gimple_cond (as_a <gcond *> (stmt)); 5117 5118 case GIMPLE_GOTO: 5119 return verify_gimple_goto (as_a <ggoto *> (stmt)); 5120 5121 case GIMPLE_SWITCH: 5122 return verify_gimple_switch (as_a <gswitch *> (stmt)); 5123 5124 case GIMPLE_RETURN: 5125 return verify_gimple_return (as_a <greturn *> (stmt)); 5126 5127 case GIMPLE_ASM: 5128 return false; 5129 5130 case GIMPLE_TRANSACTION: 5131 return verify_gimple_transaction (as_a <gtransaction *> (stmt)); 5132 5133 /* Tuples that do not have tree operands. */ 5134 case GIMPLE_NOP: 5135 case GIMPLE_PREDICT: 5136 case GIMPLE_RESX: 5137 case GIMPLE_EH_DISPATCH: 5138 case GIMPLE_EH_MUST_NOT_THROW: 5139 return false; 5140 5141 CASE_GIMPLE_OMP: 5142 /* OpenMP directives are validated by the FE and never operated 5143 on by the optimizers. Furthermore, GIMPLE_OMP_FOR may contain 5144 non-gimple expressions when the main index variable has had 5145 its address taken. This does not affect the loop itself 5146 because the header of an GIMPLE_OMP_FOR is merely used to determine 5147 how to setup the parallel iteration. */ 5148 return false; 5149 5150 case GIMPLE_ASSUME: 5151 return false; 5152 5153 case GIMPLE_DEBUG: 5154 return verify_gimple_debug (stmt); 5155 5156 default: 5157 gcc_unreachable (); 5158 } 5159 } 5160 5161 /* Verify the contents of a GIMPLE_PHI. Returns true if there is a problem, 5162 and false otherwise. */ 5163 5164 static bool 5165 verify_gimple_phi (gphi *phi) 5166 { 5167 bool err = false; 5168 unsigned i; 5169 tree phi_result = gimple_phi_result (phi); 5170 bool virtual_p; 5171 5172 if (!phi_result) 5173 { 5174 error ("invalid %<PHI%> result"); 5175 return true; 5176 } 5177 5178 virtual_p = virtual_operand_p (phi_result); 5179 if (TREE_CODE (phi_result) != SSA_NAME 5180 || (virtual_p 5181 && SSA_NAME_VAR (phi_result) != gimple_vop (cfun))) 5182 { 5183 error ("invalid %<PHI%> result"); 5184 err = true; 5185 } 5186 5187 for (i = 0; i < gimple_phi_num_args (phi); i++) 5188 { 5189 tree t = gimple_phi_arg_def (phi, i); 5190 5191 if (!t) 5192 { 5193 error ("missing %<PHI%> def"); 5194 err |= true; 5195 continue; 5196 } 5197 /* Addressable variables do have SSA_NAMEs but they 5198 are not considered gimple values. */ 5199 else if ((TREE_CODE (t) == SSA_NAME 5200 && virtual_p != virtual_operand_p (t)) 5201 || (virtual_p 5202 && (TREE_CODE (t) != SSA_NAME 5203 || SSA_NAME_VAR (t) != gimple_vop (cfun))) 5204 || (!virtual_p 5205 && !is_gimple_val (t))) 5206 { 5207 error ("invalid %<PHI%> argument"); 5208 debug_generic_expr (t); 5209 err |= true; 5210 } 5211 #ifdef ENABLE_TYPES_CHECKING 5212 if (!useless_type_conversion_p (TREE_TYPE (phi_result), TREE_TYPE (t))) 5213 { 5214 error ("incompatible types in %<PHI%> argument %u", i); 5215 debug_generic_stmt (TREE_TYPE (phi_result)); 5216 debug_generic_stmt (TREE_TYPE (t)); 5217 err |= true; 5218 } 5219 #endif 5220 } 5221 5222 return err; 5223 } 5224 5225 /* Verify the GIMPLE statements inside the sequence STMTS. */ 5226 5227 static bool 5228 verify_gimple_in_seq_2 (gimple_seq stmts) 5229 { 5230 gimple_stmt_iterator ittr; 5231 bool err = false; 5232 5233 for (ittr = gsi_start (stmts); !gsi_end_p (ittr); gsi_next (&ittr)) 5234 { 5235 gimple *stmt = gsi_stmt (ittr); 5236 5237 switch (gimple_code (stmt)) 5238 { 5239 case GIMPLE_BIND: 5240 err |= verify_gimple_in_seq_2 ( 5241 gimple_bind_body (as_a <gbind *> (stmt))); 5242 break; 5243 5244 case GIMPLE_TRY: 5245 err |= verify_gimple_in_seq_2 (gimple_try_eval (stmt)); 5246 err |= verify_gimple_in_seq_2 (gimple_try_cleanup (stmt)); 5247 break; 5248 5249 case GIMPLE_EH_FILTER: 5250 err |= verify_gimple_in_seq_2 (gimple_eh_filter_failure (stmt)); 5251 break; 5252 5253 case GIMPLE_EH_ELSE: 5254 { 5255 geh_else *eh_else = as_a <geh_else *> (stmt); 5256 err |= verify_gimple_in_seq_2 (gimple_eh_else_n_body (eh_else)); 5257 err |= verify_gimple_in_seq_2 (gimple_eh_else_e_body (eh_else)); 5258 } 5259 break; 5260 5261 case GIMPLE_CATCH: 5262 err |= verify_gimple_in_seq_2 (gimple_catch_handler ( 5263 as_a <gcatch *> (stmt))); 5264 break; 5265 5266 case GIMPLE_ASSUME: 5267 err |= verify_gimple_in_seq_2 (gimple_assume_body (stmt)); 5268 break; 5269 5270 case GIMPLE_TRANSACTION: 5271 err |= verify_gimple_transaction (as_a <gtransaction *> (stmt)); 5272 break; 5273 5274 default: 5275 { 5276 bool err2 = verify_gimple_stmt (stmt); 5277 if (err2) 5278 debug_gimple_stmt (stmt); 5279 err |= err2; 5280 } 5281 } 5282 } 5283 5284 return err; 5285 } 5286 5287 /* Verify the contents of a GIMPLE_TRANSACTION. Returns true if there 5288 is a problem, otherwise false. */ 5289 5290 static bool 5291 verify_gimple_transaction (gtransaction *stmt) 5292 { 5293 tree lab; 5294 5295 lab = gimple_transaction_label_norm (stmt); 5296 if (lab != NULL && TREE_CODE (lab) != LABEL_DECL) 5297 return true; 5298 lab = gimple_transaction_label_uninst (stmt); 5299 if (lab != NULL && TREE_CODE (lab) != LABEL_DECL) 5300 return true; 5301 lab = gimple_transaction_label_over (stmt); 5302 if (lab != NULL && TREE_CODE (lab) != LABEL_DECL) 5303 return true; 5304 5305 return verify_gimple_in_seq_2 (gimple_transaction_body (stmt)); 5306 } 5307 5308 5309 /* Verify the GIMPLE statements inside the statement list STMTS. */ 5310 5311 DEBUG_FUNCTION bool 5312 verify_gimple_in_seq (gimple_seq stmts, bool ice) 5313 { 5314 timevar_push (TV_TREE_STMT_VERIFY); 5315 bool res = verify_gimple_in_seq_2 (stmts); 5316 if (res && ice) 5317 internal_error ("%<verify_gimple%> failed"); 5318 timevar_pop (TV_TREE_STMT_VERIFY); 5319 return res; 5320 } 5321 5322 /* Return true when the T can be shared. */ 5323 5324 static bool 5325 tree_node_can_be_shared (tree t) 5326 { 5327 if (IS_TYPE_OR_DECL_P (t) 5328 || TREE_CODE (t) == SSA_NAME 5329 || TREE_CODE (t) == IDENTIFIER_NODE 5330 || TREE_CODE (t) == CASE_LABEL_EXPR 5331 || is_gimple_min_invariant (t)) 5332 return true; 5333 5334 if (t == error_mark_node) 5335 return true; 5336 5337 return false; 5338 } 5339 5340 /* Called via walk_tree. Verify tree sharing. */ 5341 5342 static tree 5343 verify_node_sharing_1 (tree *tp, int *walk_subtrees, void *data) 5344 { 5345 hash_set<void *> *visited = (hash_set<void *> *) data; 5346 5347 if (tree_node_can_be_shared (*tp)) 5348 { 5349 *walk_subtrees = false; 5350 return NULL; 5351 } 5352 5353 if (visited->add (*tp)) 5354 return *tp; 5355 5356 return NULL; 5357 } 5358 5359 /* Called via walk_gimple_stmt. Verify tree sharing. */ 5360 5361 static tree 5362 verify_node_sharing (tree *tp, int *walk_subtrees, void *data) 5363 { 5364 struct walk_stmt_info *wi = (struct walk_stmt_info *) data; 5365 return verify_node_sharing_1 (tp, walk_subtrees, wi->info); 5366 } 5367 5368 static bool eh_error_found; 5369 bool 5370 verify_eh_throw_stmt_node (gimple *const &stmt, const int &, 5371 hash_set<gimple *> *visited) 5372 { 5373 if (!visited->contains (stmt)) 5374 { 5375 error ("dead statement in EH table"); 5376 debug_gimple_stmt (stmt); 5377 eh_error_found = true; 5378 } 5379 return true; 5380 } 5381 5382 /* Verify if the location LOCs block is in BLOCKS. */ 5383 5384 static bool 5385 verify_location (hash_set<tree> *blocks, location_t loc) 5386 { 5387 tree block = LOCATION_BLOCK (loc); 5388 if (block != NULL_TREE 5389 && !blocks->contains (block)) 5390 { 5391 error ("location references block not in block tree"); 5392 return true; 5393 } 5394 if (block != NULL_TREE) 5395 return verify_location (blocks, BLOCK_SOURCE_LOCATION (block)); 5396 return false; 5397 } 5398 5399 /* Called via walk_tree. Verify that expressions have no blocks. */ 5400 5401 static tree 5402 verify_expr_no_block (tree *tp, int *walk_subtrees, void *) 5403 { 5404 if (!EXPR_P (*tp)) 5405 { 5406 *walk_subtrees = false; 5407 return NULL; 5408 } 5409 5410 location_t loc = EXPR_LOCATION (*tp); 5411 if (LOCATION_BLOCK (loc) != NULL) 5412 return *tp; 5413 5414 return NULL; 5415 } 5416 5417 /* Called via walk_tree. Verify locations of expressions. */ 5418 5419 static tree 5420 verify_expr_location_1 (tree *tp, int *walk_subtrees, void *data) 5421 { 5422 hash_set<tree> *blocks = (hash_set<tree> *) data; 5423 tree t = *tp; 5424 5425 /* ??? This doesn't really belong here but there's no good place to 5426 stick this remainder of old verify_expr. */ 5427 /* ??? This barfs on debug stmts which contain binds to vars with 5428 different function context. */ 5429 #if 0 5430 if (VAR_P (t) 5431 || TREE_CODE (t) == PARM_DECL 5432 || TREE_CODE (t) == RESULT_DECL) 5433 { 5434 tree context = decl_function_context (t); 5435 if (context != cfun->decl 5436 && !SCOPE_FILE_SCOPE_P (context) 5437 && !TREE_STATIC (t) 5438 && !DECL_EXTERNAL (t)) 5439 { 5440 error ("local declaration from a different function"); 5441 return t; 5442 } 5443 } 5444 #endif 5445 5446 if (VAR_P (t) && DECL_HAS_DEBUG_EXPR_P (t)) 5447 { 5448 tree x = DECL_DEBUG_EXPR (t); 5449 tree addr = walk_tree (&x, verify_expr_no_block, NULL, NULL); 5450 if (addr) 5451 return addr; 5452 } 5453 if ((VAR_P (t) 5454 || TREE_CODE (t) == PARM_DECL 5455 || TREE_CODE (t) == RESULT_DECL) 5456 && DECL_HAS_VALUE_EXPR_P (t)) 5457 { 5458 tree x = DECL_VALUE_EXPR (t); 5459 tree addr = walk_tree (&x, verify_expr_no_block, NULL, NULL); 5460 if (addr) 5461 return addr; 5462 } 5463 5464 if (!EXPR_P (t)) 5465 { 5466 *walk_subtrees = false; 5467 return NULL; 5468 } 5469 5470 location_t loc = EXPR_LOCATION (t); 5471 if (verify_location (blocks, loc)) 5472 return t; 5473 5474 return NULL; 5475 } 5476 5477 /* Called via walk_gimple_op. Verify locations of expressions. */ 5478 5479 static tree 5480 verify_expr_location (tree *tp, int *walk_subtrees, void *data) 5481 { 5482 struct walk_stmt_info *wi = (struct walk_stmt_info *) data; 5483 return verify_expr_location_1 (tp, walk_subtrees, wi->info); 5484 } 5485 5486 /* Insert all subblocks of BLOCK into BLOCKS and recurse. */ 5487 5488 static void 5489 collect_subblocks (hash_set<tree> *blocks, tree block) 5490 { 5491 tree t; 5492 for (t = BLOCK_SUBBLOCKS (block); t; t = BLOCK_CHAIN (t)) 5493 { 5494 blocks->add (t); 5495 collect_subblocks (blocks, t); 5496 } 5497 } 5498 5499 /* Disable warnings about missing quoting in GCC diagnostics for 5500 the verification errors. Their format strings don't follow 5501 GCC diagnostic conventions and trigger an ICE in the end. */ 5502 #if __GNUC__ >= 10 5503 # pragma GCC diagnostic push 5504 # pragma GCC diagnostic ignored "-Wformat-diag" 5505 #endif 5506 5507 /* Verify the GIMPLE statements in the CFG of FN. */ 5508 5509 DEBUG_FUNCTION bool 5510 verify_gimple_in_cfg (struct function *fn, bool verify_nothrow, bool ice) 5511 { 5512 basic_block bb; 5513 bool err = false; 5514 5515 timevar_push (TV_TREE_STMT_VERIFY); 5516 hash_set<void *> visited; 5517 hash_set<gimple *> visited_throwing_stmts; 5518 5519 /* Collect all BLOCKs referenced by the BLOCK tree of FN. */ 5520 hash_set<tree> blocks; 5521 if (DECL_INITIAL (fn->decl)) 5522 { 5523 blocks.add (DECL_INITIAL (fn->decl)); 5524 collect_subblocks (&blocks, DECL_INITIAL (fn->decl)); 5525 } 5526 5527 FOR_EACH_BB_FN (bb, fn) 5528 { 5529 gimple_stmt_iterator gsi; 5530 edge_iterator ei; 5531 edge e; 5532 5533 for (gphi_iterator gpi = gsi_start_phis (bb); 5534 !gsi_end_p (gpi); 5535 gsi_next (&gpi)) 5536 { 5537 gphi *phi = gpi.phi (); 5538 bool err2 = false; 5539 unsigned i; 5540 5541 if (gimple_bb (phi) != bb) 5542 { 5543 error ("gimple_bb (phi) is set to a wrong basic block"); 5544 err2 = true; 5545 } 5546 5547 err2 |= verify_gimple_phi (phi); 5548 5549 /* Only PHI arguments have locations. */ 5550 if (gimple_location (phi) != UNKNOWN_LOCATION) 5551 { 5552 error ("PHI node with location"); 5553 err2 = true; 5554 } 5555 5556 for (i = 0; i < gimple_phi_num_args (phi); i++) 5557 { 5558 tree arg = gimple_phi_arg_def (phi, i); 5559 tree addr = walk_tree (&arg, verify_node_sharing_1, 5560 &visited, NULL); 5561 if (addr) 5562 { 5563 error ("incorrect sharing of tree nodes"); 5564 debug_generic_expr (addr); 5565 err2 |= true; 5566 } 5567 location_t loc = gimple_phi_arg_location (phi, i); 5568 if (virtual_operand_p (gimple_phi_result (phi)) 5569 && loc != UNKNOWN_LOCATION) 5570 { 5571 error ("virtual PHI with argument locations"); 5572 err2 = true; 5573 } 5574 addr = walk_tree (&arg, verify_expr_location_1, &blocks, NULL); 5575 if (addr) 5576 { 5577 debug_generic_expr (addr); 5578 err2 = true; 5579 } 5580 err2 |= verify_location (&blocks, loc); 5581 } 5582 5583 if (err2) 5584 debug_gimple_stmt (phi); 5585 err |= err2; 5586 } 5587 5588 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) 5589 { 5590 gimple *stmt = gsi_stmt (gsi); 5591 bool err2 = false; 5592 struct walk_stmt_info wi; 5593 tree addr; 5594 int lp_nr; 5595 5596 if (gimple_bb (stmt) != bb) 5597 { 5598 error ("gimple_bb (stmt) is set to a wrong basic block"); 5599 err2 = true; 5600 } 5601 5602 err2 |= verify_gimple_stmt (stmt); 5603 err2 |= verify_location (&blocks, gimple_location (stmt)); 5604 5605 memset (&wi, 0, sizeof (wi)); 5606 wi.info = (void *) &visited; 5607 addr = walk_gimple_op (stmt, verify_node_sharing, &wi); 5608 if (addr) 5609 { 5610 error ("incorrect sharing of tree nodes"); 5611 debug_generic_expr (addr); 5612 err2 |= true; 5613 } 5614 5615 memset (&wi, 0, sizeof (wi)); 5616 wi.info = (void *) &blocks; 5617 addr = walk_gimple_op (stmt, verify_expr_location, &wi); 5618 if (addr) 5619 { 5620 debug_generic_expr (addr); 5621 err2 |= true; 5622 } 5623 5624 /* If the statement is marked as part of an EH region, then it is 5625 expected that the statement could throw. Verify that when we 5626 have optimizations that simplify statements such that we prove 5627 that they cannot throw, that we update other data structures 5628 to match. */ 5629 lp_nr = lookup_stmt_eh_lp (stmt); 5630 if (lp_nr != 0) 5631 visited_throwing_stmts.add (stmt); 5632 if (lp_nr > 0) 5633 { 5634 if (!stmt_could_throw_p (cfun, stmt)) 5635 { 5636 if (verify_nothrow) 5637 { 5638 error ("statement marked for throw, but doesn%'t"); 5639 err2 |= true; 5640 } 5641 } 5642 else if (!gsi_one_before_end_p (gsi)) 5643 { 5644 error ("statement marked for throw in middle of block"); 5645 err2 |= true; 5646 } 5647 } 5648 5649 if (err2) 5650 debug_gimple_stmt (stmt); 5651 err |= err2; 5652 } 5653 5654 FOR_EACH_EDGE (e, ei, bb->succs) 5655 if (e->goto_locus != UNKNOWN_LOCATION) 5656 err |= verify_location (&blocks, e->goto_locus); 5657 } 5658 5659 hash_map<gimple *, int> *eh_table = get_eh_throw_stmt_table (cfun); 5660 eh_error_found = false; 5661 if (eh_table) 5662 eh_table->traverse<hash_set<gimple *> *, verify_eh_throw_stmt_node> 5663 (&visited_throwing_stmts); 5664 5665 if (ice && (err || eh_error_found)) 5666 internal_error ("verify_gimple failed"); 5667 5668 verify_histograms (); 5669 timevar_pop (TV_TREE_STMT_VERIFY); 5670 5671 return (err || eh_error_found); 5672 } 5673 5674 5675 /* Verifies that the flow information is OK. */ 5676 5677 static bool 5678 gimple_verify_flow_info (void) 5679 { 5680 bool err = false; 5681 basic_block bb; 5682 gimple_stmt_iterator gsi; 5683 gimple *stmt; 5684 edge e; 5685 edge_iterator ei; 5686 5687 if (ENTRY_BLOCK_PTR_FOR_FN (cfun)->il.gimple.seq 5688 || ENTRY_BLOCK_PTR_FOR_FN (cfun)->il.gimple.phi_nodes) 5689 { 5690 error ("ENTRY_BLOCK has IL associated with it"); 5691 err = true; 5692 } 5693 5694 if (EXIT_BLOCK_PTR_FOR_FN (cfun)->il.gimple.seq 5695 || EXIT_BLOCK_PTR_FOR_FN (cfun)->il.gimple.phi_nodes) 5696 { 5697 error ("EXIT_BLOCK has IL associated with it"); 5698 err = true; 5699 } 5700 5701 FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR_FOR_FN (cfun)->preds) 5702 if (e->flags & EDGE_FALLTHRU) 5703 { 5704 error ("fallthru to exit from bb %d", e->src->index); 5705 err = true; 5706 } 5707 if (cfun->cfg->full_profile 5708 && !ENTRY_BLOCK_PTR_FOR_FN (cfun)->count.initialized_p ()) 5709 { 5710 error ("entry block count not initialized"); 5711 err = true; 5712 } 5713 if (cfun->cfg->full_profile 5714 && !EXIT_BLOCK_PTR_FOR_FN (cfun)->count.initialized_p ()) 5715 { 5716 error ("exit block count not initialized"); 5717 err = true; 5718 } 5719 if (cfun->cfg->full_profile 5720 && !single_succ_edge 5721 (ENTRY_BLOCK_PTR_FOR_FN (cfun))->probability.initialized_p ()) 5722 { 5723 error ("probability of edge from entry block not initialized"); 5724 err = true; 5725 } 5726 5727 5728 FOR_EACH_BB_FN (bb, cfun) 5729 { 5730 bool found_ctrl_stmt = false; 5731 5732 stmt = NULL; 5733 5734 if (cfun->cfg->full_profile) 5735 { 5736 if (!bb->count.initialized_p ()) 5737 { 5738 error ("count of bb %d not initialized", bb->index); 5739 err = true; 5740 } 5741 FOR_EACH_EDGE (e, ei, bb->succs) 5742 if (!e->probability.initialized_p ()) 5743 { 5744 error ("probability of edge %d->%d not initialized", 5745 bb->index, e->dest->index); 5746 err = true; 5747 } 5748 } 5749 5750 /* Skip labels on the start of basic block. */ 5751 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) 5752 { 5753 tree label; 5754 gimple *prev_stmt = stmt; 5755 5756 stmt = gsi_stmt (gsi); 5757 5758 if (gimple_code (stmt) != GIMPLE_LABEL) 5759 break; 5760 5761 label = gimple_label_label (as_a <glabel *> (stmt)); 5762 if (prev_stmt && DECL_NONLOCAL (label)) 5763 { 5764 error ("nonlocal label %qD is not first in a sequence " 5765 "of labels in bb %d", label, bb->index); 5766 err = true; 5767 } 5768 5769 if (prev_stmt && EH_LANDING_PAD_NR (label) != 0) 5770 { 5771 error ("EH landing pad label %qD is not first in a sequence " 5772 "of labels in bb %d", label, bb->index); 5773 err = true; 5774 } 5775 5776 if (label_to_block (cfun, label) != bb) 5777 { 5778 error ("label %qD to block does not match in bb %d", 5779 label, bb->index); 5780 err = true; 5781 } 5782 5783 if (decl_function_context (label) != current_function_decl) 5784 { 5785 error ("label %qD has incorrect context in bb %d", 5786 label, bb->index); 5787 err = true; 5788 } 5789 } 5790 5791 /* Verify that body of basic block BB is free of control flow. */ 5792 bool seen_nondebug_stmt = false; 5793 for (; !gsi_end_p (gsi); gsi_next (&gsi)) 5794 { 5795 gimple *stmt = gsi_stmt (gsi); 5796 5797 /* Do NOT disregard debug stmts after found_ctrl_stmt. */ 5798 if (found_ctrl_stmt) 5799 { 5800 error ("control flow in the middle of basic block %d", 5801 bb->index); 5802 err = true; 5803 } 5804 5805 if (stmt_ends_bb_p (stmt)) 5806 found_ctrl_stmt = true; 5807 5808 if (glabel *label_stmt = dyn_cast <glabel *> (stmt)) 5809 { 5810 error ("label %qD in the middle of basic block %d", 5811 gimple_label_label (label_stmt), bb->index); 5812 err = true; 5813 } 5814 5815 /* Check that no statements appear between a returns_twice call 5816 and its associated abnormal edge. */ 5817 if (gimple_code (stmt) == GIMPLE_CALL 5818 && gimple_call_flags (stmt) & ECF_RETURNS_TWICE) 5819 { 5820 bool misplaced = false; 5821 /* TM is an exception: it points abnormal edges just after the 5822 call that starts a transaction, i.e. it must end the BB. */ 5823 if (gimple_call_builtin_p (stmt, BUILT_IN_TM_START)) 5824 { 5825 if (single_succ_p (bb) 5826 && bb_has_abnormal_pred (single_succ (bb)) 5827 && !gsi_one_nondebug_before_end_p (gsi)) 5828 { 5829 error ("returns_twice call is not last in basic block " 5830 "%d", bb->index); 5831 misplaced = true; 5832 } 5833 } 5834 else 5835 { 5836 if (seen_nondebug_stmt && bb_has_abnormal_pred (bb)) 5837 { 5838 error ("returns_twice call is not first in basic block " 5839 "%d", bb->index); 5840 misplaced = true; 5841 } 5842 } 5843 if (misplaced) 5844 { 5845 print_gimple_stmt (stderr, stmt, 0, TDF_SLIM); 5846 err = true; 5847 } 5848 } 5849 if (!is_gimple_debug (stmt)) 5850 seen_nondebug_stmt = true; 5851 } 5852 5853 gsi = gsi_last_nondebug_bb (bb); 5854 if (gsi_end_p (gsi)) 5855 continue; 5856 5857 stmt = gsi_stmt (gsi); 5858 5859 if (gimple_code (stmt) == GIMPLE_LABEL) 5860 continue; 5861 5862 if (verify_eh_edges (stmt)) 5863 err = true; 5864 5865 if (is_ctrl_stmt (stmt)) 5866 { 5867 FOR_EACH_EDGE (e, ei, bb->succs) 5868 if (e->flags & EDGE_FALLTHRU) 5869 { 5870 error ("fallthru edge after a control statement in bb %d", 5871 bb->index); 5872 err = true; 5873 } 5874 } 5875 5876 if (gimple_code (stmt) != GIMPLE_COND) 5877 { 5878 /* Verify that there are no edges with EDGE_TRUE/FALSE_FLAG set 5879 after anything else but if statement. */ 5880 FOR_EACH_EDGE (e, ei, bb->succs) 5881 if (e->flags & (EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)) 5882 { 5883 error ("true/false edge after a non-GIMPLE_COND in bb %d", 5884 bb->index); 5885 err = true; 5886 } 5887 } 5888 5889 switch (gimple_code (stmt)) 5890 { 5891 case GIMPLE_COND: 5892 { 5893 edge true_edge; 5894 edge false_edge; 5895 5896 extract_true_false_edges_from_block (bb, &true_edge, &false_edge); 5897 5898 if (!true_edge 5899 || !false_edge 5900 || !(true_edge->flags & EDGE_TRUE_VALUE) 5901 || !(false_edge->flags & EDGE_FALSE_VALUE) 5902 || (true_edge->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL)) 5903 || (false_edge->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL)) 5904 || EDGE_COUNT (bb->succs) >= 3) 5905 { 5906 error ("wrong outgoing edge flags at end of bb %d", 5907 bb->index); 5908 err = true; 5909 } 5910 } 5911 break; 5912 5913 case GIMPLE_GOTO: 5914 if (simple_goto_p (stmt)) 5915 { 5916 error ("explicit goto at end of bb %d", bb->index); 5917 err = true; 5918 } 5919 else 5920 { 5921 /* FIXME. We should double check that the labels in the 5922 destination blocks have their address taken. */ 5923 FOR_EACH_EDGE (e, ei, bb->succs) 5924 if ((e->flags & (EDGE_FALLTHRU | EDGE_TRUE_VALUE 5925 | EDGE_FALSE_VALUE)) 5926 || !(e->flags & EDGE_ABNORMAL)) 5927 { 5928 error ("wrong outgoing edge flags at end of bb %d", 5929 bb->index); 5930 err = true; 5931 } 5932 } 5933 break; 5934 5935 case GIMPLE_CALL: 5936 if (!gimple_call_builtin_p (stmt, BUILT_IN_RETURN)) 5937 break; 5938 /* fallthru */ 5939 case GIMPLE_RETURN: 5940 if (!single_succ_p (bb) 5941 || (single_succ_edge (bb)->flags 5942 & (EDGE_FALLTHRU | EDGE_ABNORMAL 5943 | EDGE_TRUE_VALUE | EDGE_FALSE_VALUE))) 5944 { 5945 error ("wrong outgoing edge flags at end of bb %d", bb->index); 5946 err = true; 5947 } 5948 if (single_succ (bb) != EXIT_BLOCK_PTR_FOR_FN (cfun)) 5949 { 5950 error ("return edge does not point to exit in bb %d", 5951 bb->index); 5952 err = true; 5953 } 5954 break; 5955 5956 case GIMPLE_SWITCH: 5957 { 5958 gswitch *switch_stmt = as_a <gswitch *> (stmt); 5959 tree prev; 5960 edge e; 5961 size_t i, n; 5962 5963 n = gimple_switch_num_labels (switch_stmt); 5964 5965 /* Mark all the destination basic blocks. */ 5966 for (i = 0; i < n; ++i) 5967 { 5968 basic_block label_bb = gimple_switch_label_bb (cfun, switch_stmt, i); 5969 gcc_assert (!label_bb->aux || label_bb->aux == (void *)1); 5970 label_bb->aux = (void *)1; 5971 } 5972 5973 /* Verify that the case labels are sorted. */ 5974 prev = gimple_switch_label (switch_stmt, 0); 5975 for (i = 1; i < n; ++i) 5976 { 5977 tree c = gimple_switch_label (switch_stmt, i); 5978 if (!CASE_LOW (c)) 5979 { 5980 error ("found default case not at the start of " 5981 "case vector"); 5982 err = true; 5983 continue; 5984 } 5985 if (CASE_LOW (prev) 5986 && !tree_int_cst_lt (CASE_LOW (prev), CASE_LOW (c))) 5987 { 5988 error ("case labels not sorted: "); 5989 print_generic_expr (stderr, prev); 5990 fprintf (stderr," is greater than "); 5991 print_generic_expr (stderr, c); 5992 fprintf (stderr," but comes before it.\n"); 5993 err = true; 5994 } 5995 prev = c; 5996 } 5997 /* VRP will remove the default case if it can prove it will 5998 never be executed. So do not verify there always exists 5999 a default case here. */ 6000 6001 FOR_EACH_EDGE (e, ei, bb->succs) 6002 { 6003 if (!e->dest->aux) 6004 { 6005 error ("extra outgoing edge %d->%d", 6006 bb->index, e->dest->index); 6007 err = true; 6008 } 6009 6010 e->dest->aux = (void *)2; 6011 if ((e->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL 6012 | EDGE_TRUE_VALUE | EDGE_FALSE_VALUE))) 6013 { 6014 error ("wrong outgoing edge flags at end of bb %d", 6015 bb->index); 6016 err = true; 6017 } 6018 } 6019 6020 /* Check that we have all of them. */ 6021 for (i = 0; i < n; ++i) 6022 { 6023 basic_block label_bb = gimple_switch_label_bb (cfun, 6024 switch_stmt, i); 6025 6026 if (label_bb->aux != (void *)2) 6027 { 6028 error ("missing edge %i->%i", bb->index, label_bb->index); 6029 err = true; 6030 } 6031 } 6032 6033 FOR_EACH_EDGE (e, ei, bb->succs) 6034 e->dest->aux = (void *)0; 6035 } 6036 break; 6037 6038 case GIMPLE_EH_DISPATCH: 6039 if (verify_eh_dispatch_edge (as_a <geh_dispatch *> (stmt))) 6040 err = true; 6041 break; 6042 6043 default: 6044 break; 6045 } 6046 } 6047 6048 if (dom_info_state (CDI_DOMINATORS) >= DOM_NO_FAST_QUERY) 6049 verify_dominators (CDI_DOMINATORS); 6050 6051 return err; 6052 } 6053 6054 #if __GNUC__ >= 10 6055 # pragma GCC diagnostic pop 6056 #endif 6057 6058 /* Updates phi nodes after creating a forwarder block joined 6059 by edge FALLTHRU. */ 6060 6061 static void 6062 gimple_make_forwarder_block (edge fallthru) 6063 { 6064 edge e; 6065 edge_iterator ei; 6066 basic_block dummy, bb; 6067 tree var; 6068 gphi_iterator gsi; 6069 bool forward_location_p; 6070 6071 dummy = fallthru->src; 6072 bb = fallthru->dest; 6073 6074 if (single_pred_p (bb)) 6075 return; 6076 6077 /* We can forward location info if we have only one predecessor. */ 6078 forward_location_p = single_pred_p (dummy); 6079 6080 /* If we redirected a branch we must create new PHI nodes at the 6081 start of BB. */ 6082 for (gsi = gsi_start_phis (dummy); !gsi_end_p (gsi); gsi_next (&gsi)) 6083 { 6084 gphi *phi, *new_phi; 6085 6086 phi = gsi.phi (); 6087 var = gimple_phi_result (phi); 6088 new_phi = create_phi_node (var, bb); 6089 gimple_phi_set_result (phi, copy_ssa_name (var, phi)); 6090 add_phi_arg (new_phi, gimple_phi_result (phi), fallthru, 6091 forward_location_p 6092 ? gimple_phi_arg_location (phi, 0) : UNKNOWN_LOCATION); 6093 } 6094 6095 /* Add the arguments we have stored on edges. */ 6096 FOR_EACH_EDGE (e, ei, bb->preds) 6097 { 6098 if (e == fallthru) 6099 continue; 6100 6101 flush_pending_stmts (e); 6102 } 6103 } 6104 6105 6106 /* Return a non-special label in the head of basic block BLOCK. 6107 Create one if it doesn't exist. */ 6108 6109 tree 6110 gimple_block_label (basic_block bb) 6111 { 6112 gimple_stmt_iterator i, s = gsi_start_bb (bb); 6113 bool first = true; 6114 tree label; 6115 glabel *stmt; 6116 6117 for (i = s; !gsi_end_p (i); first = false, gsi_next (&i)) 6118 { 6119 stmt = dyn_cast <glabel *> (gsi_stmt (i)); 6120 if (!stmt) 6121 break; 6122 label = gimple_label_label (stmt); 6123 if (!DECL_NONLOCAL (label)) 6124 { 6125 if (!first) 6126 gsi_move_before (&i, &s); 6127 return label; 6128 } 6129 } 6130 6131 label = create_artificial_label (UNKNOWN_LOCATION); 6132 stmt = gimple_build_label (label); 6133 gsi_insert_before (&s, stmt, GSI_NEW_STMT); 6134 return label; 6135 } 6136 6137 6138 /* Attempt to perform edge redirection by replacing a possibly complex 6139 jump instruction by a goto or by removing the jump completely. 6140 This can apply only if all edges now point to the same block. The 6141 parameters and return values are equivalent to 6142 redirect_edge_and_branch. */ 6143 6144 static edge 6145 gimple_try_redirect_by_replacing_jump (edge e, basic_block target) 6146 { 6147 basic_block src = e->src; 6148 gimple_stmt_iterator i; 6149 gimple *stmt; 6150 6151 /* We can replace or remove a complex jump only when we have exactly 6152 two edges. */ 6153 if (EDGE_COUNT (src->succs) != 2 6154 /* Verify that all targets will be TARGET. Specifically, the 6155 edge that is not E must also go to TARGET. */ 6156 || EDGE_SUCC (src, EDGE_SUCC (src, 0) == e)->dest != target) 6157 return NULL; 6158 6159 i = gsi_last_bb (src); 6160 if (gsi_end_p (i)) 6161 return NULL; 6162 6163 stmt = gsi_stmt (i); 6164 6165 if (gimple_code (stmt) == GIMPLE_COND || gimple_code (stmt) == GIMPLE_SWITCH) 6166 { 6167 gsi_remove (&i, true); 6168 e = ssa_redirect_edge (e, target); 6169 e->flags = EDGE_FALLTHRU; 6170 return e; 6171 } 6172 6173 return NULL; 6174 } 6175 6176 6177 /* Redirect E to DEST. Return NULL on failure. Otherwise, return the 6178 edge representing the redirected branch. */ 6179 6180 static edge 6181 gimple_redirect_edge_and_branch (edge e, basic_block dest) 6182 { 6183 basic_block bb = e->src; 6184 gimple_stmt_iterator gsi; 6185 edge ret; 6186 gimple *stmt; 6187 6188 if (e->flags & EDGE_ABNORMAL) 6189 return NULL; 6190 6191 if (e->dest == dest) 6192 return NULL; 6193 6194 if (e->flags & EDGE_EH) 6195 return redirect_eh_edge (e, dest); 6196 6197 if (e->src != ENTRY_BLOCK_PTR_FOR_FN (cfun)) 6198 { 6199 ret = gimple_try_redirect_by_replacing_jump (e, dest); 6200 if (ret) 6201 return ret; 6202 } 6203 6204 gsi = gsi_last_nondebug_bb (bb); 6205 stmt = gsi_end_p (gsi) ? NULL : gsi_stmt (gsi); 6206 6207 switch (stmt ? gimple_code (stmt) : GIMPLE_ERROR_MARK) 6208 { 6209 case GIMPLE_COND: 6210 /* For COND_EXPR, we only need to redirect the edge. */ 6211 break; 6212 6213 case GIMPLE_GOTO: 6214 /* No non-abnormal edges should lead from a non-simple goto, and 6215 simple ones should be represented implicitly. */ 6216 gcc_unreachable (); 6217 6218 case GIMPLE_SWITCH: 6219 { 6220 gswitch *switch_stmt = as_a <gswitch *> (stmt); 6221 tree label = gimple_block_label (dest); 6222 tree cases = get_cases_for_edge (e, switch_stmt); 6223 6224 /* If we have a list of cases associated with E, then use it 6225 as it's a lot faster than walking the entire case vector. */ 6226 if (cases) 6227 { 6228 edge e2 = find_edge (e->src, dest); 6229 tree last, first; 6230 6231 first = cases; 6232 while (cases) 6233 { 6234 last = cases; 6235 CASE_LABEL (cases) = label; 6236 cases = CASE_CHAIN (cases); 6237 } 6238 6239 /* If there was already an edge in the CFG, then we need 6240 to move all the cases associated with E to E2. */ 6241 if (e2) 6242 { 6243 tree cases2 = get_cases_for_edge (e2, switch_stmt); 6244 6245 CASE_CHAIN (last) = CASE_CHAIN (cases2); 6246 CASE_CHAIN (cases2) = first; 6247 } 6248 bitmap_set_bit (touched_switch_bbs, gimple_bb (stmt)->index); 6249 } 6250 else 6251 { 6252 size_t i, n = gimple_switch_num_labels (switch_stmt); 6253 6254 for (i = 0; i < n; i++) 6255 { 6256 tree elt = gimple_switch_label (switch_stmt, i); 6257 if (label_to_block (cfun, CASE_LABEL (elt)) == e->dest) 6258 CASE_LABEL (elt) = label; 6259 } 6260 } 6261 } 6262 break; 6263 6264 case GIMPLE_ASM: 6265 { 6266 gasm *asm_stmt = as_a <gasm *> (stmt); 6267 int i, n = gimple_asm_nlabels (asm_stmt); 6268 tree label = NULL; 6269 6270 for (i = 0; i < n; ++i) 6271 { 6272 tree cons = gimple_asm_label_op (asm_stmt, i); 6273 if (label_to_block (cfun, TREE_VALUE (cons)) == e->dest) 6274 { 6275 if (!label) 6276 label = gimple_block_label (dest); 6277 TREE_VALUE (cons) = label; 6278 } 6279 } 6280 6281 /* If we didn't find any label matching the former edge in the 6282 asm labels, we must be redirecting the fallthrough 6283 edge. */ 6284 gcc_assert (label || (e->flags & EDGE_FALLTHRU)); 6285 } 6286 break; 6287 6288 case GIMPLE_RETURN: 6289 gsi_remove (&gsi, true); 6290 e->flags |= EDGE_FALLTHRU; 6291 break; 6292 6293 case GIMPLE_OMP_RETURN: 6294 case GIMPLE_OMP_CONTINUE: 6295 case GIMPLE_OMP_SECTIONS_SWITCH: 6296 case GIMPLE_OMP_FOR: 6297 /* The edges from OMP constructs can be simply redirected. */ 6298 break; 6299 6300 case GIMPLE_EH_DISPATCH: 6301 if (!(e->flags & EDGE_FALLTHRU)) 6302 redirect_eh_dispatch_edge (as_a <geh_dispatch *> (stmt), e, dest); 6303 break; 6304 6305 case GIMPLE_TRANSACTION: 6306 if (e->flags & EDGE_TM_ABORT) 6307 gimple_transaction_set_label_over (as_a <gtransaction *> (stmt), 6308 gimple_block_label (dest)); 6309 else if (e->flags & EDGE_TM_UNINSTRUMENTED) 6310 gimple_transaction_set_label_uninst (as_a <gtransaction *> (stmt), 6311 gimple_block_label (dest)); 6312 else 6313 gimple_transaction_set_label_norm (as_a <gtransaction *> (stmt), 6314 gimple_block_label (dest)); 6315 break; 6316 6317 default: 6318 /* Otherwise it must be a fallthru edge, and we don't need to 6319 do anything besides redirecting it. */ 6320 gcc_assert (e->flags & EDGE_FALLTHRU); 6321 break; 6322 } 6323 6324 /* Update/insert PHI nodes as necessary. */ 6325 6326 /* Now update the edges in the CFG. */ 6327 e = ssa_redirect_edge (e, dest); 6328 6329 return e; 6330 } 6331 6332 /* Returns true if it is possible to remove edge E by redirecting 6333 it to the destination of the other edge from E->src. */ 6334 6335 static bool 6336 gimple_can_remove_branch_p (const_edge e) 6337 { 6338 if (e->flags & (EDGE_ABNORMAL | EDGE_EH)) 6339 return false; 6340 6341 return true; 6342 } 6343 6344 /* Simple wrapper, as we can always redirect fallthru edges. */ 6345 6346 static basic_block 6347 gimple_redirect_edge_and_branch_force (edge e, basic_block dest) 6348 { 6349 e = gimple_redirect_edge_and_branch (e, dest); 6350 gcc_assert (e); 6351 6352 return NULL; 6353 } 6354 6355 6356 /* Splits basic block BB after statement STMT (but at least after the 6357 labels). If STMT is NULL, BB is split just after the labels. */ 6358 6359 static basic_block 6360 gimple_split_block (basic_block bb, void *stmt) 6361 { 6362 gimple_stmt_iterator gsi; 6363 gimple_stmt_iterator gsi_tgt; 6364 gimple_seq list; 6365 basic_block new_bb; 6366 edge e; 6367 edge_iterator ei; 6368 6369 new_bb = create_empty_bb (bb); 6370 6371 /* Redirect the outgoing edges. */ 6372 new_bb->succs = bb->succs; 6373 bb->succs = NULL; 6374 FOR_EACH_EDGE (e, ei, new_bb->succs) 6375 e->src = new_bb; 6376 6377 /* Get a stmt iterator pointing to the first stmt to move. */ 6378 if (!stmt || gimple_code ((gimple *) stmt) == GIMPLE_LABEL) 6379 gsi = gsi_after_labels (bb); 6380 else 6381 { 6382 gsi = gsi_for_stmt ((gimple *) stmt); 6383 gsi_next (&gsi); 6384 } 6385 6386 /* Move everything from GSI to the new basic block. */ 6387 if (gsi_end_p (gsi)) 6388 return new_bb; 6389 6390 /* Split the statement list - avoid re-creating new containers as this 6391 brings ugly quadratic memory consumption in the inliner. 6392 (We are still quadratic since we need to update stmt BB pointers, 6393 sadly.) */ 6394 gsi_split_seq_before (&gsi, &list); 6395 set_bb_seq (new_bb, list); 6396 for (gsi_tgt = gsi_start (list); 6397 !gsi_end_p (gsi_tgt); gsi_next (&gsi_tgt)) 6398 gimple_set_bb (gsi_stmt (gsi_tgt), new_bb); 6399 6400 return new_bb; 6401 } 6402 6403 6404 /* Moves basic block BB after block AFTER. */ 6405 6406 static bool 6407 gimple_move_block_after (basic_block bb, basic_block after) 6408 { 6409 if (bb->prev_bb == after) 6410 return true; 6411 6412 unlink_block (bb); 6413 link_block (bb, after); 6414 6415 return true; 6416 } 6417 6418 6419 /* Return TRUE if block BB has no executable statements, otherwise return 6420 FALSE. */ 6421 6422 static bool 6423 gimple_empty_block_p (basic_block bb) 6424 { 6425 /* BB must have no executable statements. */ 6426 gimple_stmt_iterator gsi = gsi_after_labels (bb); 6427 if (phi_nodes (bb)) 6428 return false; 6429 while (!gsi_end_p (gsi)) 6430 { 6431 gimple *stmt = gsi_stmt (gsi); 6432 if (is_gimple_debug (stmt)) 6433 ; 6434 else if (gimple_code (stmt) == GIMPLE_NOP 6435 || gimple_code (stmt) == GIMPLE_PREDICT) 6436 ; 6437 else 6438 return false; 6439 gsi_next (&gsi); 6440 } 6441 return true; 6442 } 6443 6444 6445 /* Split a basic block if it ends with a conditional branch and if the 6446 other part of the block is not empty. */ 6447 6448 static basic_block 6449 gimple_split_block_before_cond_jump (basic_block bb) 6450 { 6451 gimple *last, *split_point; 6452 gimple_stmt_iterator gsi = gsi_last_nondebug_bb (bb); 6453 if (gsi_end_p (gsi)) 6454 return NULL; 6455 last = gsi_stmt (gsi); 6456 if (gimple_code (last) != GIMPLE_COND 6457 && gimple_code (last) != GIMPLE_SWITCH) 6458 return NULL; 6459 gsi_prev (&gsi); 6460 split_point = gsi_stmt (gsi); 6461 return split_block (bb, split_point)->dest; 6462 } 6463 6464 6465 /* Return true if basic_block can be duplicated. */ 6466 6467 static bool 6468 gimple_can_duplicate_bb_p (const_basic_block bb) 6469 { 6470 gimple *last = last_nondebug_stmt (CONST_CAST_BB (bb)); 6471 6472 /* Do checks that can only fail for the last stmt, to minimize the work in the 6473 stmt loop. */ 6474 if (last) { 6475 /* A transaction is a single entry multiple exit region. It 6476 must be duplicated in its entirety or not at all. */ 6477 if (gimple_code (last) == GIMPLE_TRANSACTION) 6478 return false; 6479 6480 /* An IFN_UNIQUE call must be duplicated as part of its group, 6481 or not at all. */ 6482 if (is_gimple_call (last) 6483 && gimple_call_internal_p (last) 6484 && gimple_call_internal_unique_p (last)) 6485 return false; 6486 } 6487 6488 for (gimple_stmt_iterator gsi = gsi_start_bb (CONST_CAST_BB (bb)); 6489 !gsi_end_p (gsi); gsi_next (&gsi)) 6490 { 6491 gimple *g = gsi_stmt (gsi); 6492 6493 /* Prohibit duplication of returns_twice calls, otherwise associated 6494 abnormal edges also need to be duplicated properly. 6495 An IFN_GOMP_SIMT_ENTER_ALLOC/IFN_GOMP_SIMT_EXIT call must be 6496 duplicated as part of its group, or not at all. 6497 The IFN_GOMP_SIMT_VOTE_ANY and IFN_GOMP_SIMT_XCHG_* are part of such a 6498 group, so the same holds there. */ 6499 if (is_gimple_call (g) 6500 && (gimple_call_flags (g) & ECF_RETURNS_TWICE 6501 || gimple_call_internal_p (g, IFN_GOMP_SIMT_ENTER_ALLOC) 6502 || gimple_call_internal_p (g, IFN_GOMP_SIMT_EXIT) 6503 || gimple_call_internal_p (g, IFN_GOMP_SIMT_VOTE_ANY) 6504 || gimple_call_internal_p (g, IFN_GOMP_SIMT_XCHG_BFLY) 6505 || gimple_call_internal_p (g, IFN_GOMP_SIMT_XCHG_IDX))) 6506 return false; 6507 } 6508 6509 return true; 6510 } 6511 6512 /* Create a duplicate of the basic block BB. NOTE: This does not 6513 preserve SSA form. */ 6514 6515 static basic_block 6516 gimple_duplicate_bb (basic_block bb, copy_bb_data *id) 6517 { 6518 basic_block new_bb; 6519 gimple_stmt_iterator gsi_tgt; 6520 6521 new_bb = create_empty_bb (EXIT_BLOCK_PTR_FOR_FN (cfun)->prev_bb); 6522 6523 /* Copy the PHI nodes. We ignore PHI node arguments here because 6524 the incoming edges have not been setup yet. */ 6525 for (gphi_iterator gpi = gsi_start_phis (bb); 6526 !gsi_end_p (gpi); 6527 gsi_next (&gpi)) 6528 { 6529 gphi *phi, *copy; 6530 phi = gpi.phi (); 6531 copy = create_phi_node (NULL_TREE, new_bb); 6532 create_new_def_for (gimple_phi_result (phi), copy, 6533 gimple_phi_result_ptr (copy)); 6534 gimple_set_uid (copy, gimple_uid (phi)); 6535 } 6536 6537 gsi_tgt = gsi_start_bb (new_bb); 6538 for (gimple_stmt_iterator gsi = gsi_start_bb (bb); 6539 !gsi_end_p (gsi); 6540 gsi_next (&gsi)) 6541 { 6542 def_operand_p def_p; 6543 ssa_op_iter op_iter; 6544 tree lhs; 6545 gimple *stmt, *copy; 6546 6547 stmt = gsi_stmt (gsi); 6548 if (gimple_code (stmt) == GIMPLE_LABEL) 6549 continue; 6550 6551 /* Don't duplicate label debug stmts. */ 6552 if (gimple_debug_bind_p (stmt) 6553 && TREE_CODE (gimple_debug_bind_get_var (stmt)) 6554 == LABEL_DECL) 6555 continue; 6556 6557 /* Create a new copy of STMT and duplicate STMT's virtual 6558 operands. */ 6559 copy = gimple_copy (stmt); 6560 gsi_insert_after (&gsi_tgt, copy, GSI_NEW_STMT); 6561 6562 maybe_duplicate_eh_stmt (copy, stmt); 6563 gimple_duplicate_stmt_histograms (cfun, copy, cfun, stmt); 6564 6565 /* When copying around a stmt writing into a local non-user 6566 aggregate, make sure it won't share stack slot with other 6567 vars. */ 6568 lhs = gimple_get_lhs (stmt); 6569 if (lhs && TREE_CODE (lhs) != SSA_NAME) 6570 { 6571 tree base = get_base_address (lhs); 6572 if (base 6573 && (VAR_P (base) || TREE_CODE (base) == RESULT_DECL) 6574 && DECL_IGNORED_P (base) 6575 && !TREE_STATIC (base) 6576 && !DECL_EXTERNAL (base) 6577 && (!VAR_P (base) || !DECL_HAS_VALUE_EXPR_P (base))) 6578 DECL_NONSHAREABLE (base) = 1; 6579 } 6580 6581 /* If requested remap dependence info of cliques brought in 6582 via inlining. */ 6583 if (id) 6584 for (unsigned i = 0; i < gimple_num_ops (copy); ++i) 6585 { 6586 tree op = gimple_op (copy, i); 6587 if (!op) 6588 continue; 6589 if (TREE_CODE (op) == ADDR_EXPR 6590 || TREE_CODE (op) == WITH_SIZE_EXPR) 6591 op = TREE_OPERAND (op, 0); 6592 while (handled_component_p (op)) 6593 op = TREE_OPERAND (op, 0); 6594 if ((TREE_CODE (op) == MEM_REF 6595 || TREE_CODE (op) == TARGET_MEM_REF) 6596 && MR_DEPENDENCE_CLIQUE (op) > 1 6597 && MR_DEPENDENCE_CLIQUE (op) != bb->loop_father->owned_clique) 6598 { 6599 if (!id->dependence_map) 6600 id->dependence_map = new hash_map<dependence_hash, 6601 unsigned short>; 6602 bool existed; 6603 unsigned short &newc = id->dependence_map->get_or_insert 6604 (MR_DEPENDENCE_CLIQUE (op), &existed); 6605 if (!existed) 6606 { 6607 gcc_assert (MR_DEPENDENCE_CLIQUE (op) <= cfun->last_clique); 6608 newc = get_new_clique (cfun); 6609 } 6610 MR_DEPENDENCE_CLIQUE (op) = newc; 6611 } 6612 } 6613 6614 /* Create new names for all the definitions created by COPY and 6615 add replacement mappings for each new name. */ 6616 FOR_EACH_SSA_DEF_OPERAND (def_p, copy, op_iter, SSA_OP_ALL_DEFS) 6617 create_new_def_for (DEF_FROM_PTR (def_p), copy, def_p); 6618 } 6619 6620 return new_bb; 6621 } 6622 6623 /* Adds phi node arguments for edge E_COPY after basic block duplication. */ 6624 6625 static void 6626 add_phi_args_after_copy_edge (edge e_copy) 6627 { 6628 basic_block bb, bb_copy = e_copy->src, dest; 6629 edge e; 6630 edge_iterator ei; 6631 gphi *phi, *phi_copy; 6632 tree def; 6633 gphi_iterator psi, psi_copy; 6634 6635 if (gimple_seq_empty_p (phi_nodes (e_copy->dest))) 6636 return; 6637 6638 bb = bb_copy->flags & BB_DUPLICATED ? get_bb_original (bb_copy) : bb_copy; 6639 6640 if (e_copy->dest->flags & BB_DUPLICATED) 6641 dest = get_bb_original (e_copy->dest); 6642 else 6643 dest = e_copy->dest; 6644 6645 e = find_edge (bb, dest); 6646 if (!e) 6647 { 6648 /* During loop unrolling the target of the latch edge is copied. 6649 In this case we are not looking for edge to dest, but to 6650 duplicated block whose original was dest. */ 6651 FOR_EACH_EDGE (e, ei, bb->succs) 6652 { 6653 if ((e->dest->flags & BB_DUPLICATED) 6654 && get_bb_original (e->dest) == dest) 6655 break; 6656 } 6657 6658 gcc_assert (e != NULL); 6659 } 6660 6661 for (psi = gsi_start_phis (e->dest), 6662 psi_copy = gsi_start_phis (e_copy->dest); 6663 !gsi_end_p (psi); 6664 gsi_next (&psi), gsi_next (&psi_copy)) 6665 { 6666 phi = psi.phi (); 6667 phi_copy = psi_copy.phi (); 6668 def = PHI_ARG_DEF_FROM_EDGE (phi, e); 6669 add_phi_arg (phi_copy, def, e_copy, 6670 gimple_phi_arg_location_from_edge (phi, e)); 6671 } 6672 } 6673 6674 6675 /* Basic block BB_COPY was created by code duplication. Add phi node 6676 arguments for edges going out of BB_COPY. The blocks that were 6677 duplicated have BB_DUPLICATED set. */ 6678 6679 void 6680 add_phi_args_after_copy_bb (basic_block bb_copy) 6681 { 6682 edge e_copy; 6683 edge_iterator ei; 6684 6685 FOR_EACH_EDGE (e_copy, ei, bb_copy->succs) 6686 { 6687 add_phi_args_after_copy_edge (e_copy); 6688 } 6689 } 6690 6691 /* Blocks in REGION_COPY array of length N_REGION were created by 6692 duplication of basic blocks. Add phi node arguments for edges 6693 going from these blocks. If E_COPY is not NULL, also add 6694 phi node arguments for its destination.*/ 6695 6696 void 6697 add_phi_args_after_copy (basic_block *region_copy, unsigned n_region, 6698 edge e_copy) 6699 { 6700 unsigned i; 6701 6702 for (i = 0; i < n_region; i++) 6703 region_copy[i]->flags |= BB_DUPLICATED; 6704 6705 for (i = 0; i < n_region; i++) 6706 add_phi_args_after_copy_bb (region_copy[i]); 6707 if (e_copy) 6708 add_phi_args_after_copy_edge (e_copy); 6709 6710 for (i = 0; i < n_region; i++) 6711 region_copy[i]->flags &= ~BB_DUPLICATED; 6712 } 6713 6714 /* Duplicates a REGION (set of N_REGION basic blocks) with just a single 6715 important exit edge EXIT. By important we mean that no SSA name defined 6716 inside region is live over the other exit edges of the region. All entry 6717 edges to the region must go to ENTRY->dest. The edge ENTRY is redirected 6718 to the duplicate of the region. Dominance and loop information is 6719 updated if UPDATE_DOMINANCE is true, but not the SSA web. If 6720 UPDATE_DOMINANCE is false then we assume that the caller will update the 6721 dominance information after calling this function. The new basic 6722 blocks are stored to REGION_COPY in the same order as they had in REGION, 6723 provided that REGION_COPY is not NULL. 6724 The function returns false if it is unable to copy the region, 6725 true otherwise. 6726 6727 It is callers responsibility to update profile. */ 6728 6729 bool 6730 gimple_duplicate_seme_region (edge entry, edge exit, 6731 basic_block *region, unsigned n_region, 6732 basic_block *region_copy, 6733 bool update_dominance) 6734 { 6735 unsigned i; 6736 bool free_region_copy = false, copying_header = false; 6737 class loop *loop = entry->dest->loop_father; 6738 edge exit_copy; 6739 edge redirected; 6740 6741 if (!can_copy_bbs_p (region, n_region)) 6742 return false; 6743 6744 /* Some sanity checking. Note that we do not check for all possible 6745 missuses of the functions. I.e. if you ask to copy something weird, 6746 it will work, but the state of structures probably will not be 6747 correct. */ 6748 for (i = 0; i < n_region; i++) 6749 { 6750 /* We do not handle subloops, i.e. all the blocks must belong to the 6751 same loop. */ 6752 if (region[i]->loop_father != loop) 6753 return false; 6754 6755 if (region[i] != entry->dest 6756 && region[i] == loop->header) 6757 return false; 6758 } 6759 6760 /* In case the function is used for loop header copying (which is the primary 6761 use), ensure that EXIT and its copy will be new latch and entry edges. */ 6762 if (loop->header == entry->dest) 6763 { 6764 copying_header = true; 6765 6766 if (!dominated_by_p (CDI_DOMINATORS, loop->latch, exit->src)) 6767 return false; 6768 6769 for (i = 0; i < n_region; i++) 6770 if (region[i] != exit->src 6771 && dominated_by_p (CDI_DOMINATORS, region[i], exit->src)) 6772 return false; 6773 } 6774 6775 initialize_original_copy_tables (); 6776 6777 if (copying_header) 6778 set_loop_copy (loop, loop_outer (loop)); 6779 else 6780 set_loop_copy (loop, loop); 6781 6782 if (!region_copy) 6783 { 6784 region_copy = XNEWVEC (basic_block, n_region); 6785 free_region_copy = true; 6786 } 6787 6788 /* Record blocks outside the region that are dominated by something 6789 inside. */ 6790 auto_vec<basic_block> doms; 6791 if (update_dominance) 6792 doms = get_dominated_by_region (CDI_DOMINATORS, region, n_region); 6793 6794 copy_bbs (region, n_region, region_copy, &exit, 1, &exit_copy, loop, 6795 split_edge_bb_loc (entry), update_dominance); 6796 6797 if (copying_header) 6798 { 6799 loop->header = exit->dest; 6800 loop->latch = exit->src; 6801 } 6802 6803 /* Redirect the entry and add the phi node arguments. */ 6804 redirected = redirect_edge_and_branch (entry, get_bb_copy (entry->dest)); 6805 gcc_assert (redirected != NULL); 6806 flush_pending_stmts (entry); 6807 6808 /* Concerning updating of dominators: We must recount dominators 6809 for entry block and its copy. Anything that is outside of the 6810 region, but was dominated by something inside needs recounting as 6811 well. */ 6812 if (update_dominance) 6813 { 6814 set_immediate_dominator (CDI_DOMINATORS, entry->dest, entry->src); 6815 doms.safe_push (get_bb_original (entry->dest)); 6816 iterate_fix_dominators (CDI_DOMINATORS, doms, false); 6817 } 6818 6819 /* Add the other PHI node arguments. */ 6820 add_phi_args_after_copy (region_copy, n_region, NULL); 6821 6822 if (free_region_copy) 6823 free (region_copy); 6824 6825 free_original_copy_tables (); 6826 return true; 6827 } 6828 6829 /* Checks if BB is part of the region defined by N_REGION BBS. */ 6830 static bool 6831 bb_part_of_region_p (basic_block bb, basic_block* bbs, unsigned n_region) 6832 { 6833 unsigned int n; 6834 6835 for (n = 0; n < n_region; n++) 6836 { 6837 if (bb == bbs[n]) 6838 return true; 6839 } 6840 return false; 6841 } 6842 6843 6844 /* For each PHI in BB, copy the argument associated with SRC_E to TGT_E. 6845 Assuming the argument exists, just does not have a value. */ 6846 6847 void 6848 copy_phi_arg_into_existing_phi (edge src_e, edge tgt_e) 6849 { 6850 int src_idx = src_e->dest_idx; 6851 int tgt_idx = tgt_e->dest_idx; 6852 6853 /* Iterate over each PHI in e->dest. */ 6854 for (gphi_iterator gsi = gsi_start_phis (src_e->dest), 6855 gsi2 = gsi_start_phis (tgt_e->dest); 6856 !gsi_end_p (gsi); 6857 gsi_next (&gsi), gsi_next (&gsi2)) 6858 { 6859 gphi *src_phi = gsi.phi (); 6860 gphi *dest_phi = gsi2.phi (); 6861 tree val = gimple_phi_arg_def (src_phi, src_idx); 6862 location_t locus = gimple_phi_arg_location (src_phi, src_idx); 6863 6864 SET_PHI_ARG_DEF (dest_phi, tgt_idx, val); 6865 gimple_phi_arg_set_location (dest_phi, tgt_idx, locus); 6866 } 6867 } 6868 6869 /* Duplicates REGION consisting of N_REGION blocks. The new blocks 6870 are stored to REGION_COPY in the same order in that they appear 6871 in REGION, if REGION_COPY is not NULL. ENTRY is the entry to 6872 the region, EXIT an exit from it. The condition guarding EXIT 6873 is moved to ENTRY. Returns true if duplication succeeds, false 6874 otherwise. 6875 6876 For example, 6877 6878 some_code; 6879 if (cond) 6880 A; 6881 else 6882 B; 6883 6884 is transformed to 6885 6886 if (cond) 6887 { 6888 some_code; 6889 A; 6890 } 6891 else 6892 { 6893 some_code; 6894 B; 6895 } 6896 */ 6897 6898 bool 6899 gimple_duplicate_sese_tail (edge entry, edge exit, 6900 basic_block *region, unsigned n_region, 6901 basic_block *region_copy) 6902 { 6903 unsigned i; 6904 bool free_region_copy = false; 6905 class loop *loop = exit->dest->loop_father; 6906 class loop *orig_loop = entry->dest->loop_father; 6907 basic_block switch_bb, entry_bb, nentry_bb; 6908 profile_count total_count = profile_count::uninitialized (), 6909 exit_count = profile_count::uninitialized (); 6910 edge exits[2], nexits[2], e; 6911 gimple_stmt_iterator gsi; 6912 edge sorig, snew; 6913 basic_block exit_bb; 6914 class loop *target, *aloop, *cloop; 6915 6916 gcc_assert (EDGE_COUNT (exit->src->succs) == 2); 6917 exits[0] = exit; 6918 exits[1] = EDGE_SUCC (exit->src, EDGE_SUCC (exit->src, 0) == exit); 6919 6920 if (!can_copy_bbs_p (region, n_region)) 6921 return false; 6922 6923 initialize_original_copy_tables (); 6924 set_loop_copy (orig_loop, loop); 6925 6926 target= loop; 6927 for (aloop = orig_loop->inner; aloop; aloop = aloop->next) 6928 { 6929 if (bb_part_of_region_p (aloop->header, region, n_region)) 6930 { 6931 cloop = duplicate_loop (aloop, target); 6932 duplicate_subloops (aloop, cloop); 6933 } 6934 } 6935 6936 if (!region_copy) 6937 { 6938 region_copy = XNEWVEC (basic_block, n_region); 6939 free_region_copy = true; 6940 } 6941 6942 gcc_assert (!need_ssa_update_p (cfun)); 6943 6944 /* Record blocks outside the region that are dominated by something 6945 inside. */ 6946 auto_vec<basic_block> doms = get_dominated_by_region (CDI_DOMINATORS, region, 6947 n_region); 6948 6949 total_count = exit->src->count; 6950 exit_count = exit->count (); 6951 /* Fix up corner cases, to avoid division by zero or creation of negative 6952 frequencies. */ 6953 if (exit_count > total_count) 6954 exit_count = total_count; 6955 6956 copy_bbs (region, n_region, region_copy, exits, 2, nexits, orig_loop, 6957 split_edge_bb_loc (exit), true); 6958 if (total_count.initialized_p () && exit_count.initialized_p ()) 6959 { 6960 scale_bbs_frequencies_profile_count (region, n_region, 6961 total_count - exit_count, 6962 total_count); 6963 scale_bbs_frequencies_profile_count (region_copy, n_region, exit_count, 6964 total_count); 6965 } 6966 6967 /* Create the switch block, and put the exit condition to it. */ 6968 entry_bb = entry->dest; 6969 nentry_bb = get_bb_copy (entry_bb); 6970 if (!*gsi_last_bb (entry->src) 6971 || !stmt_ends_bb_p (*gsi_last_bb (entry->src))) 6972 switch_bb = entry->src; 6973 else 6974 switch_bb = split_edge (entry); 6975 set_immediate_dominator (CDI_DOMINATORS, nentry_bb, switch_bb); 6976 6977 gcond *cond_stmt = as_a <gcond *> (*gsi_last_bb (exit->src)); 6978 cond_stmt = as_a <gcond *> (gimple_copy (cond_stmt)); 6979 6980 gsi = gsi_last_bb (switch_bb); 6981 gsi_insert_after (&gsi, cond_stmt, GSI_NEW_STMT); 6982 6983 sorig = single_succ_edge (switch_bb); 6984 sorig->flags = exits[1]->flags; 6985 sorig->probability = exits[1]->probability; 6986 snew = make_edge (switch_bb, nentry_bb, exits[0]->flags); 6987 snew->probability = exits[0]->probability; 6988 6989 6990 /* Register the new edge from SWITCH_BB in loop exit lists. */ 6991 rescan_loop_exit (snew, true, false); 6992 6993 /* Add the PHI node arguments. */ 6994 add_phi_args_after_copy (region_copy, n_region, snew); 6995 6996 /* Get rid of now superfluous conditions and associated edges (and phi node 6997 arguments). */ 6998 exit_bb = exit->dest; 6999 7000 e = redirect_edge_and_branch (exits[0], exits[1]->dest); 7001 PENDING_STMT (e) = NULL; 7002 7003 /* The latch of ORIG_LOOP was copied, and so was the backedge 7004 to the original header. We redirect this backedge to EXIT_BB. */ 7005 for (i = 0; i < n_region; i++) 7006 if (get_bb_original (region_copy[i]) == orig_loop->latch) 7007 { 7008 gcc_assert (single_succ_edge (region_copy[i])); 7009 e = redirect_edge_and_branch (single_succ_edge (region_copy[i]), exit_bb); 7010 PENDING_STMT (e) = NULL; 7011 copy_phi_arg_into_existing_phi (nexits[0], e); 7012 } 7013 e = redirect_edge_and_branch (nexits[1], nexits[0]->dest); 7014 PENDING_STMT (e) = NULL; 7015 7016 /* Anything that is outside of the region, but was dominated by something 7017 inside needs to update dominance info. */ 7018 iterate_fix_dominators (CDI_DOMINATORS, doms, false); 7019 7020 if (free_region_copy) 7021 free (region_copy); 7022 7023 free_original_copy_tables (); 7024 return true; 7025 } 7026 7027 /* Add all the blocks dominated by ENTRY to the array BBS_P. Stop 7028 adding blocks when the dominator traversal reaches EXIT. This 7029 function silently assumes that ENTRY strictly dominates EXIT. */ 7030 7031 void 7032 gather_blocks_in_sese_region (basic_block entry, basic_block exit, 7033 vec<basic_block> *bbs_p) 7034 { 7035 basic_block son; 7036 7037 for (son = first_dom_son (CDI_DOMINATORS, entry); 7038 son; 7039 son = next_dom_son (CDI_DOMINATORS, son)) 7040 { 7041 bbs_p->safe_push (son); 7042 if (son != exit) 7043 gather_blocks_in_sese_region (son, exit, bbs_p); 7044 } 7045 } 7046 7047 /* Replaces *TP with a duplicate (belonging to function TO_CONTEXT). 7048 The duplicates are recorded in VARS_MAP. */ 7049 7050 static void 7051 replace_by_duplicate_decl (tree *tp, hash_map<tree, tree> *vars_map, 7052 tree to_context) 7053 { 7054 tree t = *tp, new_t; 7055 struct function *f = DECL_STRUCT_FUNCTION (to_context); 7056 7057 if (DECL_CONTEXT (t) == to_context) 7058 return; 7059 7060 bool existed; 7061 tree &loc = vars_map->get_or_insert (t, &existed); 7062 7063 if (!existed) 7064 { 7065 if (SSA_VAR_P (t)) 7066 { 7067 new_t = copy_var_decl (t, DECL_NAME (t), TREE_TYPE (t)); 7068 add_local_decl (f, new_t); 7069 } 7070 else 7071 { 7072 gcc_assert (TREE_CODE (t) == CONST_DECL); 7073 new_t = copy_node (t); 7074 } 7075 DECL_CONTEXT (new_t) = to_context; 7076 7077 loc = new_t; 7078 } 7079 else 7080 new_t = loc; 7081 7082 *tp = new_t; 7083 } 7084 7085 7086 /* Creates an ssa name in TO_CONTEXT equivalent to NAME. 7087 VARS_MAP maps old ssa names and var_decls to the new ones. */ 7088 7089 static tree 7090 replace_ssa_name (tree name, hash_map<tree, tree> *vars_map, 7091 tree to_context) 7092 { 7093 tree new_name; 7094 7095 gcc_assert (!virtual_operand_p (name)); 7096 7097 tree *loc = vars_map->get (name); 7098 7099 if (!loc) 7100 { 7101 tree decl = SSA_NAME_VAR (name); 7102 if (decl) 7103 { 7104 gcc_assert (!SSA_NAME_IS_DEFAULT_DEF (name)); 7105 replace_by_duplicate_decl (&decl, vars_map, to_context); 7106 new_name = make_ssa_name_fn (DECL_STRUCT_FUNCTION (to_context), 7107 decl, SSA_NAME_DEF_STMT (name)); 7108 } 7109 else 7110 new_name = copy_ssa_name_fn (DECL_STRUCT_FUNCTION (to_context), 7111 name, SSA_NAME_DEF_STMT (name)); 7112 7113 /* Now that we've used the def stmt to define new_name, make sure it 7114 doesn't define name anymore. */ 7115 SSA_NAME_DEF_STMT (name) = NULL; 7116 7117 vars_map->put (name, new_name); 7118 } 7119 else 7120 new_name = *loc; 7121 7122 return new_name; 7123 } 7124 7125 struct move_stmt_d 7126 { 7127 tree orig_block; 7128 tree new_block; 7129 tree from_context; 7130 tree to_context; 7131 hash_map<tree, tree> *vars_map; 7132 htab_t new_label_map; 7133 hash_map<void *, void *> *eh_map; 7134 bool remap_decls_p; 7135 }; 7136 7137 /* Helper for move_block_to_fn. Set TREE_BLOCK in every expression 7138 contained in *TP if it has been ORIG_BLOCK previously and change the 7139 DECL_CONTEXT of every local variable referenced in *TP. */ 7140 7141 static tree 7142 move_stmt_op (tree *tp, int *walk_subtrees, void *data) 7143 { 7144 struct walk_stmt_info *wi = (struct walk_stmt_info *) data; 7145 struct move_stmt_d *p = (struct move_stmt_d *) wi->info; 7146 tree t = *tp; 7147 7148 if (EXPR_P (t)) 7149 { 7150 tree block = TREE_BLOCK (t); 7151 if (block == NULL_TREE) 7152 ; 7153 else if (block == p->orig_block 7154 || p->orig_block == NULL_TREE) 7155 { 7156 /* tree_node_can_be_shared says we can share invariant 7157 addresses but unshare_expr copies them anyways. Make sure 7158 to unshare before adjusting the block in place - we do not 7159 always see a copy here. */ 7160 if (TREE_CODE (t) == ADDR_EXPR 7161 && is_gimple_min_invariant (t)) 7162 *tp = t = unshare_expr (t); 7163 TREE_SET_BLOCK (t, p->new_block); 7164 } 7165 else if (flag_checking) 7166 { 7167 while (block && TREE_CODE (block) == BLOCK && block != p->orig_block) 7168 block = BLOCK_SUPERCONTEXT (block); 7169 gcc_assert (block == p->orig_block); 7170 } 7171 } 7172 else if (DECL_P (t) || TREE_CODE (t) == SSA_NAME) 7173 { 7174 if (TREE_CODE (t) == SSA_NAME) 7175 *tp = replace_ssa_name (t, p->vars_map, p->to_context); 7176 else if (TREE_CODE (t) == PARM_DECL 7177 && gimple_in_ssa_p (cfun)) 7178 *tp = *(p->vars_map->get (t)); 7179 else if (TREE_CODE (t) == LABEL_DECL) 7180 { 7181 if (p->new_label_map) 7182 { 7183 struct tree_map in, *out; 7184 in.base.from = t; 7185 out = (struct tree_map *) 7186 htab_find_with_hash (p->new_label_map, &in, DECL_UID (t)); 7187 if (out) 7188 *tp = t = out->to; 7189 } 7190 7191 /* For FORCED_LABELs we can end up with references from other 7192 functions if some SESE regions are outlined. It is UB to 7193 jump in between them, but they could be used just for printing 7194 addresses etc. In that case, DECL_CONTEXT on the label should 7195 be the function containing the glabel stmt with that LABEL_DECL, 7196 rather than whatever function a reference to the label was seen 7197 last time. */ 7198 if (!FORCED_LABEL (t) && !DECL_NONLOCAL (t)) 7199 DECL_CONTEXT (t) = p->to_context; 7200 } 7201 else if (p->remap_decls_p) 7202 { 7203 /* Replace T with its duplicate. T should no longer appear in the 7204 parent function, so this looks wasteful; however, it may appear 7205 in referenced_vars, and more importantly, as virtual operands of 7206 statements, and in alias lists of other variables. It would be 7207 quite difficult to expunge it from all those places. ??? It might 7208 suffice to do this for addressable variables. */ 7209 if ((VAR_P (t) && !is_global_var (t)) 7210 || TREE_CODE (t) == CONST_DECL) 7211 replace_by_duplicate_decl (tp, p->vars_map, p->to_context); 7212 } 7213 *walk_subtrees = 0; 7214 } 7215 else if (TYPE_P (t)) 7216 *walk_subtrees = 0; 7217 7218 return NULL_TREE; 7219 } 7220 7221 /* Helper for move_stmt_r. Given an EH region number for the source 7222 function, map that to the duplicate EH regio number in the dest. */ 7223 7224 static int 7225 move_stmt_eh_region_nr (int old_nr, struct move_stmt_d *p) 7226 { 7227 eh_region old_r, new_r; 7228 7229 old_r = get_eh_region_from_number (old_nr); 7230 new_r = static_cast<eh_region> (*p->eh_map->get (old_r)); 7231 7232 return new_r->index; 7233 } 7234 7235 /* Similar, but operate on INTEGER_CSTs. */ 7236 7237 static tree 7238 move_stmt_eh_region_tree_nr (tree old_t_nr, struct move_stmt_d *p) 7239 { 7240 int old_nr, new_nr; 7241 7242 old_nr = tree_to_shwi (old_t_nr); 7243 new_nr = move_stmt_eh_region_nr (old_nr, p); 7244 7245 return build_int_cst (integer_type_node, new_nr); 7246 } 7247 7248 /* Like move_stmt_op, but for gimple statements. 7249 7250 Helper for move_block_to_fn. Set GIMPLE_BLOCK in every expression 7251 contained in the current statement in *GSI_P and change the 7252 DECL_CONTEXT of every local variable referenced in the current 7253 statement. */ 7254 7255 static tree 7256 move_stmt_r (gimple_stmt_iterator *gsi_p, bool *handled_ops_p, 7257 struct walk_stmt_info *wi) 7258 { 7259 struct move_stmt_d *p = (struct move_stmt_d *) wi->info; 7260 gimple *stmt = gsi_stmt (*gsi_p); 7261 tree block = gimple_block (stmt); 7262 7263 if (block == p->orig_block 7264 || (p->orig_block == NULL_TREE 7265 && block != NULL_TREE)) 7266 gimple_set_block (stmt, p->new_block); 7267 7268 switch (gimple_code (stmt)) 7269 { 7270 case GIMPLE_CALL: 7271 /* Remap the region numbers for __builtin_eh_{pointer,filter}. */ 7272 { 7273 tree r, fndecl = gimple_call_fndecl (stmt); 7274 if (fndecl && fndecl_built_in_p (fndecl, BUILT_IN_NORMAL)) 7275 switch (DECL_FUNCTION_CODE (fndecl)) 7276 { 7277 case BUILT_IN_EH_COPY_VALUES: 7278 r = gimple_call_arg (stmt, 1); 7279 r = move_stmt_eh_region_tree_nr (r, p); 7280 gimple_call_set_arg (stmt, 1, r); 7281 /* FALLTHRU */ 7282 7283 case BUILT_IN_EH_POINTER: 7284 case BUILT_IN_EH_FILTER: 7285 r = gimple_call_arg (stmt, 0); 7286 r = move_stmt_eh_region_tree_nr (r, p); 7287 gimple_call_set_arg (stmt, 0, r); 7288 break; 7289 7290 default: 7291 break; 7292 } 7293 } 7294 break; 7295 7296 case GIMPLE_RESX: 7297 { 7298 gresx *resx_stmt = as_a <gresx *> (stmt); 7299 int r = gimple_resx_region (resx_stmt); 7300 r = move_stmt_eh_region_nr (r, p); 7301 gimple_resx_set_region (resx_stmt, r); 7302 } 7303 break; 7304 7305 case GIMPLE_EH_DISPATCH: 7306 { 7307 geh_dispatch *eh_dispatch_stmt = as_a <geh_dispatch *> (stmt); 7308 int r = gimple_eh_dispatch_region (eh_dispatch_stmt); 7309 r = move_stmt_eh_region_nr (r, p); 7310 gimple_eh_dispatch_set_region (eh_dispatch_stmt, r); 7311 } 7312 break; 7313 7314 case GIMPLE_OMP_RETURN: 7315 case GIMPLE_OMP_CONTINUE: 7316 break; 7317 7318 case GIMPLE_LABEL: 7319 { 7320 /* For FORCED_LABEL, move_stmt_op doesn't adjust DECL_CONTEXT, 7321 so that such labels can be referenced from other regions. 7322 Make sure to update it when seeing a GIMPLE_LABEL though, 7323 that is the owner of the label. */ 7324 walk_gimple_op (stmt, move_stmt_op, wi); 7325 *handled_ops_p = true; 7326 tree label = gimple_label_label (as_a <glabel *> (stmt)); 7327 if (FORCED_LABEL (label) || DECL_NONLOCAL (label)) 7328 DECL_CONTEXT (label) = p->to_context; 7329 } 7330 break; 7331 7332 default: 7333 if (is_gimple_omp (stmt)) 7334 { 7335 /* Do not remap variables inside OMP directives. Variables 7336 referenced in clauses and directive header belong to the 7337 parent function and should not be moved into the child 7338 function. */ 7339 bool save_remap_decls_p = p->remap_decls_p; 7340 p->remap_decls_p = false; 7341 *handled_ops_p = true; 7342 7343 walk_gimple_seq_mod (gimple_omp_body_ptr (stmt), move_stmt_r, 7344 move_stmt_op, wi); 7345 7346 p->remap_decls_p = save_remap_decls_p; 7347 } 7348 break; 7349 } 7350 7351 return NULL_TREE; 7352 } 7353 7354 /* Move basic block BB from function CFUN to function DEST_FN. The 7355 block is moved out of the original linked list and placed after 7356 block AFTER in the new list. Also, the block is removed from the 7357 original array of blocks and placed in DEST_FN's array of blocks. 7358 If UPDATE_EDGE_COUNT_P is true, the edge counts on both CFGs is 7359 updated to reflect the moved edges. 7360 7361 The local variables are remapped to new instances, VARS_MAP is used 7362 to record the mapping. */ 7363 7364 static void 7365 move_block_to_fn (struct function *dest_cfun, basic_block bb, 7366 basic_block after, bool update_edge_count_p, 7367 struct move_stmt_d *d) 7368 { 7369 struct control_flow_graph *cfg; 7370 edge_iterator ei; 7371 edge e; 7372 gimple_stmt_iterator si; 7373 unsigned old_len; 7374 7375 /* Remove BB from dominance structures. */ 7376 delete_from_dominance_info (CDI_DOMINATORS, bb); 7377 7378 /* Move BB from its current loop to the copy in the new function. */ 7379 if (current_loops) 7380 { 7381 class loop *new_loop = (class loop *)bb->loop_father->aux; 7382 if (new_loop) 7383 bb->loop_father = new_loop; 7384 } 7385 7386 /* Link BB to the new linked list. */ 7387 move_block_after (bb, after); 7388 7389 /* Update the edge count in the corresponding flowgraphs. */ 7390 if (update_edge_count_p) 7391 FOR_EACH_EDGE (e, ei, bb->succs) 7392 { 7393 cfun->cfg->x_n_edges--; 7394 dest_cfun->cfg->x_n_edges++; 7395 } 7396 7397 /* Remove BB from the original basic block array. */ 7398 (*cfun->cfg->x_basic_block_info)[bb->index] = NULL; 7399 cfun->cfg->x_n_basic_blocks--; 7400 7401 /* Grow DEST_CFUN's basic block array if needed. */ 7402 cfg = dest_cfun->cfg; 7403 cfg->x_n_basic_blocks++; 7404 if (bb->index >= cfg->x_last_basic_block) 7405 cfg->x_last_basic_block = bb->index + 1; 7406 7407 old_len = vec_safe_length (cfg->x_basic_block_info); 7408 if ((unsigned) cfg->x_last_basic_block >= old_len) 7409 vec_safe_grow_cleared (cfg->x_basic_block_info, 7410 cfg->x_last_basic_block + 1); 7411 7412 (*cfg->x_basic_block_info)[bb->index] = bb; 7413 7414 /* Remap the variables in phi nodes. */ 7415 for (gphi_iterator psi = gsi_start_phis (bb); 7416 !gsi_end_p (psi); ) 7417 { 7418 gphi *phi = psi.phi (); 7419 use_operand_p use; 7420 tree op = PHI_RESULT (phi); 7421 ssa_op_iter oi; 7422 unsigned i; 7423 7424 if (virtual_operand_p (op)) 7425 { 7426 /* Remove the phi nodes for virtual operands (alias analysis will be 7427 run for the new function, anyway). But replace all uses that 7428 might be outside of the region we move. */ 7429 use_operand_p use_p; 7430 imm_use_iterator iter; 7431 gimple *use_stmt; 7432 FOR_EACH_IMM_USE_STMT (use_stmt, iter, op) 7433 FOR_EACH_IMM_USE_ON_STMT (use_p, iter) 7434 SET_USE (use_p, SSA_NAME_VAR (op)); 7435 remove_phi_node (&psi, true); 7436 continue; 7437 } 7438 7439 SET_PHI_RESULT (phi, 7440 replace_ssa_name (op, d->vars_map, dest_cfun->decl)); 7441 FOR_EACH_PHI_ARG (use, phi, oi, SSA_OP_USE) 7442 { 7443 op = USE_FROM_PTR (use); 7444 if (TREE_CODE (op) == SSA_NAME) 7445 SET_USE (use, replace_ssa_name (op, d->vars_map, dest_cfun->decl)); 7446 } 7447 7448 for (i = 0; i < EDGE_COUNT (bb->preds); i++) 7449 { 7450 location_t locus = gimple_phi_arg_location (phi, i); 7451 tree block = LOCATION_BLOCK (locus); 7452 7453 if (locus == UNKNOWN_LOCATION) 7454 continue; 7455 if (d->orig_block == NULL_TREE || block == d->orig_block) 7456 { 7457 locus = set_block (locus, d->new_block); 7458 gimple_phi_arg_set_location (phi, i, locus); 7459 } 7460 } 7461 7462 gsi_next (&psi); 7463 } 7464 7465 for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si)) 7466 { 7467 gimple *stmt = gsi_stmt (si); 7468 struct walk_stmt_info wi; 7469 7470 memset (&wi, 0, sizeof (wi)); 7471 wi.info = d; 7472 walk_gimple_stmt (&si, move_stmt_r, move_stmt_op, &wi); 7473 7474 if (glabel *label_stmt = dyn_cast <glabel *> (stmt)) 7475 { 7476 tree label = gimple_label_label (label_stmt); 7477 int uid = LABEL_DECL_UID (label); 7478 7479 gcc_assert (uid > -1); 7480 7481 old_len = vec_safe_length (cfg->x_label_to_block_map); 7482 if (old_len <= (unsigned) uid) 7483 vec_safe_grow_cleared (cfg->x_label_to_block_map, uid + 1); 7484 7485 (*cfg->x_label_to_block_map)[uid] = bb; 7486 (*cfun->cfg->x_label_to_block_map)[uid] = NULL; 7487 7488 gcc_assert (DECL_CONTEXT (label) == dest_cfun->decl); 7489 7490 if (uid >= dest_cfun->cfg->last_label_uid) 7491 dest_cfun->cfg->last_label_uid = uid + 1; 7492 } 7493 7494 maybe_duplicate_eh_stmt_fn (dest_cfun, stmt, cfun, stmt, d->eh_map, 0); 7495 remove_stmt_from_eh_lp_fn (cfun, stmt); 7496 7497 gimple_duplicate_stmt_histograms (dest_cfun, stmt, cfun, stmt); 7498 gimple_remove_stmt_histograms (cfun, stmt); 7499 7500 /* We cannot leave any operands allocated from the operand caches of 7501 the current function. */ 7502 free_stmt_operands (cfun, stmt); 7503 push_cfun (dest_cfun); 7504 update_stmt (stmt); 7505 if (is_gimple_call (stmt)) 7506 notice_special_calls (as_a <gcall *> (stmt)); 7507 pop_cfun (); 7508 } 7509 7510 FOR_EACH_EDGE (e, ei, bb->succs) 7511 if (e->goto_locus != UNKNOWN_LOCATION) 7512 { 7513 tree block = LOCATION_BLOCK (e->goto_locus); 7514 if (d->orig_block == NULL_TREE 7515 || block == d->orig_block) 7516 e->goto_locus = set_block (e->goto_locus, d->new_block); 7517 } 7518 } 7519 7520 /* Examine the statements in BB (which is in SRC_CFUN); find and return 7521 the outermost EH region. Use REGION as the incoming base EH region. 7522 If there is no single outermost region, return NULL and set *ALL to 7523 true. */ 7524 7525 static eh_region 7526 find_outermost_region_in_block (struct function *src_cfun, 7527 basic_block bb, eh_region region, 7528 bool *all) 7529 { 7530 gimple_stmt_iterator si; 7531 7532 for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si)) 7533 { 7534 gimple *stmt = gsi_stmt (si); 7535 eh_region stmt_region; 7536 int lp_nr; 7537 7538 lp_nr = lookup_stmt_eh_lp_fn (src_cfun, stmt); 7539 stmt_region = get_eh_region_from_lp_number_fn (src_cfun, lp_nr); 7540 if (stmt_region) 7541 { 7542 if (region == NULL) 7543 region = stmt_region; 7544 else if (stmt_region != region) 7545 { 7546 region = eh_region_outermost (src_cfun, stmt_region, region); 7547 if (region == NULL) 7548 { 7549 *all = true; 7550 return NULL; 7551 } 7552 } 7553 } 7554 } 7555 7556 return region; 7557 } 7558 7559 static tree 7560 new_label_mapper (tree decl, void *data) 7561 { 7562 htab_t hash = (htab_t) data; 7563 struct tree_map *m; 7564 void **slot; 7565 7566 gcc_assert (TREE_CODE (decl) == LABEL_DECL); 7567 7568 m = XNEW (struct tree_map); 7569 m->hash = DECL_UID (decl); 7570 m->base.from = decl; 7571 m->to = create_artificial_label (UNKNOWN_LOCATION); 7572 LABEL_DECL_UID (m->to) = LABEL_DECL_UID (decl); 7573 if (LABEL_DECL_UID (m->to) >= cfun->cfg->last_label_uid) 7574 cfun->cfg->last_label_uid = LABEL_DECL_UID (m->to) + 1; 7575 7576 slot = htab_find_slot_with_hash (hash, m, m->hash, INSERT); 7577 gcc_assert (*slot == NULL); 7578 7579 *slot = m; 7580 7581 return m->to; 7582 } 7583 7584 /* Tree walker to replace the decls used inside value expressions by 7585 duplicates. */ 7586 7587 static tree 7588 replace_block_vars_by_duplicates_1 (tree *tp, int *walk_subtrees, void *data) 7589 { 7590 struct replace_decls_d *rd = (struct replace_decls_d *)data; 7591 7592 switch (TREE_CODE (*tp)) 7593 { 7594 case VAR_DECL: 7595 case PARM_DECL: 7596 case RESULT_DECL: 7597 replace_by_duplicate_decl (tp, rd->vars_map, rd->to_context); 7598 break; 7599 default: 7600 break; 7601 } 7602 7603 if (IS_TYPE_OR_DECL_P (*tp)) 7604 *walk_subtrees = false; 7605 7606 return NULL; 7607 } 7608 7609 /* Change DECL_CONTEXT of all BLOCK_VARS in block, including 7610 subblocks. */ 7611 7612 static void 7613 replace_block_vars_by_duplicates (tree block, hash_map<tree, tree> *vars_map, 7614 tree to_context) 7615 { 7616 tree *tp, t; 7617 7618 for (tp = &BLOCK_VARS (block); *tp; tp = &DECL_CHAIN (*tp)) 7619 { 7620 t = *tp; 7621 if (!VAR_P (t) && TREE_CODE (t) != CONST_DECL) 7622 continue; 7623 replace_by_duplicate_decl (&t, vars_map, to_context); 7624 if (t != *tp) 7625 { 7626 if (VAR_P (*tp) && DECL_HAS_VALUE_EXPR_P (*tp)) 7627 { 7628 tree x = DECL_VALUE_EXPR (*tp); 7629 struct replace_decls_d rd = { vars_map, to_context }; 7630 unshare_expr (x); 7631 walk_tree (&x, replace_block_vars_by_duplicates_1, &rd, NULL); 7632 SET_DECL_VALUE_EXPR (t, x); 7633 DECL_HAS_VALUE_EXPR_P (t) = 1; 7634 } 7635 DECL_CHAIN (t) = DECL_CHAIN (*tp); 7636 *tp = t; 7637 } 7638 } 7639 7640 for (block = BLOCK_SUBBLOCKS (block); block; block = BLOCK_CHAIN (block)) 7641 replace_block_vars_by_duplicates (block, vars_map, to_context); 7642 } 7643 7644 /* Fixup the loop arrays and numbers after moving LOOP and its subloops 7645 from FN1 to FN2. */ 7646 7647 static void 7648 fixup_loop_arrays_after_move (struct function *fn1, struct function *fn2, 7649 class loop *loop) 7650 { 7651 /* Discard it from the old loop array. */ 7652 (*get_loops (fn1))[loop->num] = NULL; 7653 7654 /* Place it in the new loop array, assigning it a new number. */ 7655 loop->num = number_of_loops (fn2); 7656 vec_safe_push (loops_for_fn (fn2)->larray, loop); 7657 7658 /* Recurse to children. */ 7659 for (loop = loop->inner; loop; loop = loop->next) 7660 fixup_loop_arrays_after_move (fn1, fn2, loop); 7661 } 7662 7663 /* Verify that the blocks in BBS_P are a single-entry, single-exit region 7664 delimited by ENTRY_BB and EXIT_BB, possibly containing noreturn blocks. */ 7665 7666 DEBUG_FUNCTION void 7667 verify_sese (basic_block entry, basic_block exit, vec<basic_block> *bbs_p) 7668 { 7669 basic_block bb; 7670 edge_iterator ei; 7671 edge e; 7672 bitmap bbs = BITMAP_ALLOC (NULL); 7673 int i; 7674 7675 gcc_assert (entry != NULL); 7676 gcc_assert (entry != exit); 7677 gcc_assert (bbs_p != NULL); 7678 7679 gcc_assert (bbs_p->length () > 0); 7680 7681 FOR_EACH_VEC_ELT (*bbs_p, i, bb) 7682 bitmap_set_bit (bbs, bb->index); 7683 7684 gcc_assert (bitmap_bit_p (bbs, entry->index)); 7685 gcc_assert (exit == NULL || bitmap_bit_p (bbs, exit->index)); 7686 7687 FOR_EACH_VEC_ELT (*bbs_p, i, bb) 7688 { 7689 if (bb == entry) 7690 { 7691 gcc_assert (single_pred_p (entry)); 7692 gcc_assert (!bitmap_bit_p (bbs, single_pred (entry)->index)); 7693 } 7694 else 7695 for (ei = ei_start (bb->preds); !ei_end_p (ei); ei_next (&ei)) 7696 { 7697 e = ei_edge (ei); 7698 gcc_assert (bitmap_bit_p (bbs, e->src->index)); 7699 } 7700 7701 if (bb == exit) 7702 { 7703 gcc_assert (single_succ_p (exit)); 7704 gcc_assert (!bitmap_bit_p (bbs, single_succ (exit)->index)); 7705 } 7706 else 7707 for (ei = ei_start (bb->succs); !ei_end_p (ei); ei_next (&ei)) 7708 { 7709 e = ei_edge (ei); 7710 gcc_assert (bitmap_bit_p (bbs, e->dest->index)); 7711 } 7712 } 7713 7714 BITMAP_FREE (bbs); 7715 } 7716 7717 /* If FROM is an SSA_NAME, mark the version in bitmap DATA. */ 7718 7719 bool 7720 gather_ssa_name_hash_map_from (tree const &from, tree const &, void *data) 7721 { 7722 bitmap release_names = (bitmap)data; 7723 7724 if (TREE_CODE (from) != SSA_NAME) 7725 return true; 7726 7727 bitmap_set_bit (release_names, SSA_NAME_VERSION (from)); 7728 return true; 7729 } 7730 7731 /* Return LOOP_DIST_ALIAS call if present in BB. */ 7732 7733 static gimple * 7734 find_loop_dist_alias (basic_block bb) 7735 { 7736 gimple_stmt_iterator gsi = gsi_last_bb (bb); 7737 if (!safe_is_a <gcond *> (*gsi)) 7738 return NULL; 7739 7740 gsi_prev (&gsi); 7741 if (gsi_end_p (gsi)) 7742 return NULL; 7743 7744 gimple *g = gsi_stmt (gsi); 7745 if (gimple_call_internal_p (g, IFN_LOOP_DIST_ALIAS)) 7746 return g; 7747 return NULL; 7748 } 7749 7750 /* Fold loop internal call G like IFN_LOOP_VECTORIZED/IFN_LOOP_DIST_ALIAS 7751 to VALUE and update any immediate uses of it's LHS. */ 7752 7753 void 7754 fold_loop_internal_call (gimple *g, tree value) 7755 { 7756 tree lhs = gimple_call_lhs (g); 7757 use_operand_p use_p; 7758 imm_use_iterator iter; 7759 gimple *use_stmt; 7760 gimple_stmt_iterator gsi = gsi_for_stmt (g); 7761 7762 replace_call_with_value (&gsi, value); 7763 FOR_EACH_IMM_USE_STMT (use_stmt, iter, lhs) 7764 { 7765 FOR_EACH_IMM_USE_ON_STMT (use_p, iter) 7766 SET_USE (use_p, value); 7767 update_stmt (use_stmt); 7768 /* If we turn conditional to constant, scale profile counts. 7769 We know that the conditional was created by loop distribution 7770 and all basic blocks dominated by the taken edge are part of 7771 the loop distributed. */ 7772 if (gimple_code (use_stmt) == GIMPLE_COND) 7773 { 7774 edge true_edge, false_edge; 7775 extract_true_false_edges_from_block (gimple_bb (use_stmt), 7776 &true_edge, &false_edge); 7777 edge taken_edge = NULL, other_edge = NULL; 7778 if (gimple_cond_true_p (as_a <gcond *>(use_stmt))) 7779 { 7780 taken_edge = true_edge; 7781 other_edge = false_edge; 7782 } 7783 else if (gimple_cond_false_p (as_a <gcond *>(use_stmt))) 7784 { 7785 taken_edge = false_edge; 7786 other_edge = true_edge; 7787 } 7788 if (taken_edge 7789 && !(taken_edge->probability == profile_probability::always ())) 7790 { 7791 profile_count old_count = taken_edge->count (); 7792 profile_count new_count = taken_edge->src->count; 7793 taken_edge->probability = profile_probability::always (); 7794 other_edge->probability = profile_probability::never (); 7795 /* If we have multiple predecessors, we can't use the dominance 7796 test. This should not happen as the guarded code should 7797 start with pre-header. */ 7798 gcc_assert (single_pred_edge (taken_edge->dest)); 7799 if (old_count.nonzero_p ()) 7800 { 7801 taken_edge->dest->count 7802 = taken_edge->dest->count.apply_scale (new_count, 7803 old_count); 7804 scale_strictly_dominated_blocks (taken_edge->dest, 7805 new_count, old_count); 7806 } 7807 } 7808 } 7809 } 7810 } 7811 7812 /* Move a single-entry, single-exit region delimited by ENTRY_BB and 7813 EXIT_BB to function DEST_CFUN. The whole region is replaced by a 7814 single basic block in the original CFG and the new basic block is 7815 returned. DEST_CFUN must not have a CFG yet. 7816 7817 Note that the region need not be a pure SESE region. Blocks inside 7818 the region may contain calls to abort/exit. The only restriction 7819 is that ENTRY_BB should be the only entry point and it must 7820 dominate EXIT_BB. 7821 7822 Change TREE_BLOCK of all statements in ORIG_BLOCK to the new 7823 functions outermost BLOCK, move all subblocks of ORIG_BLOCK 7824 to the new function. 7825 7826 All local variables referenced in the region are assumed to be in 7827 the corresponding BLOCK_VARS and unexpanded variable lists 7828 associated with DEST_CFUN. 7829 7830 TODO: investigate whether we can reuse gimple_duplicate_sese_region to 7831 reimplement move_sese_region_to_fn by duplicating the region rather than 7832 moving it. */ 7833 7834 basic_block 7835 move_sese_region_to_fn (struct function *dest_cfun, basic_block entry_bb, 7836 basic_block exit_bb, tree orig_block) 7837 { 7838 vec<basic_block> bbs; 7839 basic_block dom_entry = get_immediate_dominator (CDI_DOMINATORS, entry_bb); 7840 basic_block after, bb, *entry_pred, *exit_succ, abb; 7841 struct function *saved_cfun = cfun; 7842 int *entry_flag, *exit_flag; 7843 profile_probability *entry_prob, *exit_prob; 7844 unsigned i, num_entry_edges, num_exit_edges, num_nodes; 7845 edge e; 7846 edge_iterator ei; 7847 htab_t new_label_map; 7848 hash_map<void *, void *> *eh_map; 7849 class loop *loop = entry_bb->loop_father; 7850 class loop *loop0 = get_loop (saved_cfun, 0); 7851 struct move_stmt_d d; 7852 7853 /* If ENTRY does not strictly dominate EXIT, this cannot be an SESE 7854 region. */ 7855 gcc_assert (entry_bb != exit_bb 7856 && (!exit_bb 7857 || dominated_by_p (CDI_DOMINATORS, exit_bb, entry_bb))); 7858 7859 /* Collect all the blocks in the region. Manually add ENTRY_BB 7860 because it won't be added by dfs_enumerate_from. */ 7861 bbs.create (0); 7862 bbs.safe_push (entry_bb); 7863 gather_blocks_in_sese_region (entry_bb, exit_bb, &bbs); 7864 7865 if (flag_checking) 7866 verify_sese (entry_bb, exit_bb, &bbs); 7867 7868 /* The blocks that used to be dominated by something in BBS will now be 7869 dominated by the new block. */ 7870 auto_vec<basic_block> dom_bbs = get_dominated_by_region (CDI_DOMINATORS, 7871 bbs.address (), 7872 bbs.length ()); 7873 7874 /* Detach ENTRY_BB and EXIT_BB from CFUN->CFG. We need to remember 7875 the predecessor edges to ENTRY_BB and the successor edges to 7876 EXIT_BB so that we can re-attach them to the new basic block that 7877 will replace the region. */ 7878 num_entry_edges = EDGE_COUNT (entry_bb->preds); 7879 entry_pred = XNEWVEC (basic_block, num_entry_edges); 7880 entry_flag = XNEWVEC (int, num_entry_edges); 7881 entry_prob = XNEWVEC (profile_probability, num_entry_edges); 7882 i = 0; 7883 for (ei = ei_start (entry_bb->preds); (e = ei_safe_edge (ei)) != NULL;) 7884 { 7885 entry_prob[i] = e->probability; 7886 entry_flag[i] = e->flags; 7887 entry_pred[i++] = e->src; 7888 remove_edge (e); 7889 } 7890 7891 if (exit_bb) 7892 { 7893 num_exit_edges = EDGE_COUNT (exit_bb->succs); 7894 exit_succ = XNEWVEC (basic_block, num_exit_edges); 7895 exit_flag = XNEWVEC (int, num_exit_edges); 7896 exit_prob = XNEWVEC (profile_probability, num_exit_edges); 7897 i = 0; 7898 for (ei = ei_start (exit_bb->succs); (e = ei_safe_edge (ei)) != NULL;) 7899 { 7900 exit_prob[i] = e->probability; 7901 exit_flag[i] = e->flags; 7902 exit_succ[i++] = e->dest; 7903 remove_edge (e); 7904 } 7905 } 7906 else 7907 { 7908 num_exit_edges = 0; 7909 exit_succ = NULL; 7910 exit_flag = NULL; 7911 exit_prob = NULL; 7912 } 7913 7914 /* Switch context to the child function to initialize DEST_FN's CFG. */ 7915 gcc_assert (dest_cfun->cfg == NULL); 7916 push_cfun (dest_cfun); 7917 7918 init_empty_tree_cfg (); 7919 7920 /* Initialize EH information for the new function. */ 7921 eh_map = NULL; 7922 new_label_map = NULL; 7923 if (saved_cfun->eh) 7924 { 7925 eh_region region = NULL; 7926 bool all = false; 7927 7928 FOR_EACH_VEC_ELT (bbs, i, bb) 7929 { 7930 region = find_outermost_region_in_block (saved_cfun, bb, region, &all); 7931 if (all) 7932 break; 7933 } 7934 7935 init_eh_for_function (); 7936 if (region != NULL || all) 7937 { 7938 new_label_map = htab_create (17, tree_map_hash, tree_map_eq, free); 7939 eh_map = duplicate_eh_regions (saved_cfun, region, 0, 7940 new_label_mapper, new_label_map); 7941 } 7942 } 7943 7944 /* Initialize an empty loop tree. */ 7945 struct loops *loops = ggc_cleared_alloc<struct loops> (); 7946 init_loops_structure (dest_cfun, loops, 1); 7947 loops->state = LOOPS_MAY_HAVE_MULTIPLE_LATCHES; 7948 set_loops_for_fn (dest_cfun, loops); 7949 7950 vec<loop_p, va_gc> *larray = get_loops (saved_cfun)->copy (); 7951 7952 /* Move the outlined loop tree part. */ 7953 num_nodes = bbs.length (); 7954 FOR_EACH_VEC_ELT (bbs, i, bb) 7955 { 7956 if (bb->loop_father->header == bb) 7957 { 7958 class loop *this_loop = bb->loop_father; 7959 /* Avoid the need to remap SSA names used in nb_iterations. */ 7960 free_numbers_of_iterations_estimates (this_loop); 7961 class loop *outer = loop_outer (this_loop); 7962 if (outer == loop 7963 /* If the SESE region contains some bbs ending with 7964 a noreturn call, those are considered to belong 7965 to the outermost loop in saved_cfun, rather than 7966 the entry_bb's loop_father. */ 7967 || outer == loop0) 7968 { 7969 if (outer != loop) 7970 num_nodes -= this_loop->num_nodes; 7971 flow_loop_tree_node_remove (bb->loop_father); 7972 flow_loop_tree_node_add (get_loop (dest_cfun, 0), this_loop); 7973 fixup_loop_arrays_after_move (saved_cfun, cfun, this_loop); 7974 } 7975 } 7976 else if (bb->loop_father == loop0 && loop0 != loop) 7977 num_nodes--; 7978 7979 /* Remove loop exits from the outlined region. */ 7980 if (loops_for_fn (saved_cfun)->exits) 7981 FOR_EACH_EDGE (e, ei, bb->succs) 7982 { 7983 struct loops *l = loops_for_fn (saved_cfun); 7984 loop_exit **slot 7985 = l->exits->find_slot_with_hash (e, htab_hash_pointer (e), 7986 NO_INSERT); 7987 if (slot) 7988 l->exits->clear_slot (slot); 7989 } 7990 } 7991 7992 /* Adjust the number of blocks in the tree root of the outlined part. */ 7993 get_loop (dest_cfun, 0)->num_nodes = bbs.length () + 2; 7994 7995 /* Setup a mapping to be used by move_block_to_fn. */ 7996 loop->aux = current_loops->tree_root; 7997 loop0->aux = current_loops->tree_root; 7998 7999 /* Fix up orig_loop_num. If the block referenced in it has been moved 8000 to dest_cfun, update orig_loop_num field, otherwise clear it. */ 8001 signed char *moved_orig_loop_num = NULL; 8002 for (auto dloop : loops_list (dest_cfun, 0)) 8003 if (dloop->orig_loop_num) 8004 { 8005 if (moved_orig_loop_num == NULL) 8006 moved_orig_loop_num 8007 = XCNEWVEC (signed char, vec_safe_length (larray)); 8008 if ((*larray)[dloop->orig_loop_num] != NULL 8009 && get_loop (saved_cfun, dloop->orig_loop_num) == NULL) 8010 { 8011 if (moved_orig_loop_num[dloop->orig_loop_num] >= 0 8012 && moved_orig_loop_num[dloop->orig_loop_num] < 2) 8013 moved_orig_loop_num[dloop->orig_loop_num]++; 8014 dloop->orig_loop_num = (*larray)[dloop->orig_loop_num]->num; 8015 } 8016 else 8017 { 8018 moved_orig_loop_num[dloop->orig_loop_num] = -1; 8019 dloop->orig_loop_num = 0; 8020 } 8021 } 8022 pop_cfun (); 8023 8024 if (moved_orig_loop_num) 8025 { 8026 FOR_EACH_VEC_ELT (bbs, i, bb) 8027 { 8028 gimple *g = find_loop_dist_alias (bb); 8029 if (g == NULL) 8030 continue; 8031 8032 int orig_loop_num = tree_to_shwi (gimple_call_arg (g, 0)); 8033 gcc_assert (orig_loop_num 8034 && (unsigned) orig_loop_num < vec_safe_length (larray)); 8035 if (moved_orig_loop_num[orig_loop_num] == 2) 8036 { 8037 /* If we have moved both loops with this orig_loop_num into 8038 dest_cfun and the LOOP_DIST_ALIAS call is being moved there 8039 too, update the first argument. */ 8040 gcc_assert ((*larray)[orig_loop_num] != NULL 8041 && (get_loop (saved_cfun, orig_loop_num) == NULL)); 8042 tree t = build_int_cst (integer_type_node, 8043 (*larray)[orig_loop_num]->num); 8044 gimple_call_set_arg (g, 0, t); 8045 update_stmt (g); 8046 /* Make sure the following loop will not update it. */ 8047 moved_orig_loop_num[orig_loop_num] = 0; 8048 } 8049 else 8050 /* Otherwise at least one of the loops stayed in saved_cfun. 8051 Remove the LOOP_DIST_ALIAS call. */ 8052 fold_loop_internal_call (g, gimple_call_arg (g, 1)); 8053 } 8054 FOR_EACH_BB_FN (bb, saved_cfun) 8055 { 8056 gimple *g = find_loop_dist_alias (bb); 8057 if (g == NULL) 8058 continue; 8059 int orig_loop_num = tree_to_shwi (gimple_call_arg (g, 0)); 8060 gcc_assert (orig_loop_num 8061 && (unsigned) orig_loop_num < vec_safe_length (larray)); 8062 if (moved_orig_loop_num[orig_loop_num]) 8063 /* LOOP_DIST_ALIAS call remained in saved_cfun, if at least one 8064 of the corresponding loops was moved, remove it. */ 8065 fold_loop_internal_call (g, gimple_call_arg (g, 1)); 8066 } 8067 XDELETEVEC (moved_orig_loop_num); 8068 } 8069 ggc_free (larray); 8070 8071 /* Move blocks from BBS into DEST_CFUN. */ 8072 gcc_assert (bbs.length () >= 2); 8073 after = dest_cfun->cfg->x_entry_block_ptr; 8074 hash_map<tree, tree> vars_map; 8075 8076 memset (&d, 0, sizeof (d)); 8077 d.orig_block = orig_block; 8078 d.new_block = DECL_INITIAL (dest_cfun->decl); 8079 d.from_context = cfun->decl; 8080 d.to_context = dest_cfun->decl; 8081 d.vars_map = &vars_map; 8082 d.new_label_map = new_label_map; 8083 d.eh_map = eh_map; 8084 d.remap_decls_p = true; 8085 8086 if (gimple_in_ssa_p (cfun)) 8087 for (tree arg = DECL_ARGUMENTS (d.to_context); arg; arg = DECL_CHAIN (arg)) 8088 { 8089 tree narg = make_ssa_name_fn (dest_cfun, arg, gimple_build_nop ()); 8090 set_ssa_default_def (dest_cfun, arg, narg); 8091 vars_map.put (arg, narg); 8092 } 8093 8094 FOR_EACH_VEC_ELT (bbs, i, bb) 8095 { 8096 /* No need to update edge counts on the last block. It has 8097 already been updated earlier when we detached the region from 8098 the original CFG. */ 8099 move_block_to_fn (dest_cfun, bb, after, bb != exit_bb, &d); 8100 after = bb; 8101 } 8102 8103 /* Adjust the maximum clique used. */ 8104 dest_cfun->last_clique = saved_cfun->last_clique; 8105 8106 loop->aux = NULL; 8107 loop0->aux = NULL; 8108 /* Loop sizes are no longer correct, fix them up. */ 8109 loop->num_nodes -= num_nodes; 8110 for (class loop *outer = loop_outer (loop); 8111 outer; outer = loop_outer (outer)) 8112 outer->num_nodes -= num_nodes; 8113 loop0->num_nodes -= bbs.length () - num_nodes; 8114 8115 if (saved_cfun->has_simduid_loops || saved_cfun->has_force_vectorize_loops) 8116 { 8117 class loop *aloop; 8118 for (i = 0; vec_safe_iterate (loops->larray, i, &aloop); i++) 8119 if (aloop != NULL) 8120 { 8121 if (aloop->simduid) 8122 { 8123 replace_by_duplicate_decl (&aloop->simduid, d.vars_map, 8124 d.to_context); 8125 dest_cfun->has_simduid_loops = true; 8126 } 8127 if (aloop->force_vectorize) 8128 dest_cfun->has_force_vectorize_loops = true; 8129 } 8130 } 8131 8132 /* Rewire BLOCK_SUBBLOCKS of orig_block. */ 8133 if (orig_block) 8134 { 8135 tree block; 8136 gcc_assert (BLOCK_SUBBLOCKS (DECL_INITIAL (dest_cfun->decl)) 8137 == NULL_TREE); 8138 BLOCK_SUBBLOCKS (DECL_INITIAL (dest_cfun->decl)) 8139 = BLOCK_SUBBLOCKS (orig_block); 8140 for (block = BLOCK_SUBBLOCKS (orig_block); 8141 block; block = BLOCK_CHAIN (block)) 8142 BLOCK_SUPERCONTEXT (block) = DECL_INITIAL (dest_cfun->decl); 8143 BLOCK_SUBBLOCKS (orig_block) = NULL_TREE; 8144 } 8145 8146 replace_block_vars_by_duplicates (DECL_INITIAL (dest_cfun->decl), 8147 &vars_map, dest_cfun->decl); 8148 8149 if (new_label_map) 8150 htab_delete (new_label_map); 8151 if (eh_map) 8152 delete eh_map; 8153 8154 /* We need to release ssa-names in a defined order, so first find them, 8155 and then iterate in ascending version order. */ 8156 bitmap release_names = BITMAP_ALLOC (NULL); 8157 vars_map.traverse<void *, gather_ssa_name_hash_map_from> (release_names); 8158 bitmap_iterator bi; 8159 EXECUTE_IF_SET_IN_BITMAP (release_names, 0, i, bi) 8160 release_ssa_name (ssa_name (i)); 8161 BITMAP_FREE (release_names); 8162 8163 /* Rewire the entry and exit blocks. The successor to the entry 8164 block turns into the successor of DEST_FN's ENTRY_BLOCK_PTR in 8165 the child function. Similarly, the predecessor of DEST_FN's 8166 EXIT_BLOCK_PTR turns into the predecessor of EXIT_BLOCK_PTR. We 8167 need to switch CFUN between DEST_CFUN and SAVED_CFUN so that the 8168 various CFG manipulation function get to the right CFG. 8169 8170 FIXME, this is silly. The CFG ought to become a parameter to 8171 these helpers. */ 8172 push_cfun (dest_cfun); 8173 ENTRY_BLOCK_PTR_FOR_FN (cfun)->count = entry_bb->count; 8174 make_single_succ_edge (ENTRY_BLOCK_PTR_FOR_FN (cfun), entry_bb, EDGE_FALLTHRU); 8175 if (exit_bb) 8176 { 8177 make_single_succ_edge (exit_bb, EXIT_BLOCK_PTR_FOR_FN (cfun), 0); 8178 EXIT_BLOCK_PTR_FOR_FN (cfun)->count = exit_bb->count; 8179 } 8180 else 8181 EXIT_BLOCK_PTR_FOR_FN (cfun)->count = profile_count::zero (); 8182 pop_cfun (); 8183 8184 /* Back in the original function, the SESE region has disappeared, 8185 create a new basic block in its place. */ 8186 bb = create_empty_bb (entry_pred[0]); 8187 if (current_loops) 8188 add_bb_to_loop (bb, loop); 8189 profile_count count = profile_count::zero (); 8190 for (i = 0; i < num_entry_edges; i++) 8191 { 8192 e = make_edge (entry_pred[i], bb, entry_flag[i]); 8193 e->probability = entry_prob[i]; 8194 count += e->count (); 8195 } 8196 bb->count = count; 8197 8198 for (i = 0; i < num_exit_edges; i++) 8199 { 8200 e = make_edge (bb, exit_succ[i], exit_flag[i]); 8201 e->probability = exit_prob[i]; 8202 } 8203 8204 set_immediate_dominator (CDI_DOMINATORS, bb, dom_entry); 8205 FOR_EACH_VEC_ELT (dom_bbs, i, abb) 8206 set_immediate_dominator (CDI_DOMINATORS, abb, bb); 8207 8208 if (exit_bb) 8209 { 8210 free (exit_prob); 8211 free (exit_flag); 8212 free (exit_succ); 8213 } 8214 free (entry_prob); 8215 free (entry_flag); 8216 free (entry_pred); 8217 bbs.release (); 8218 8219 return bb; 8220 } 8221 8222 /* Dump default def DEF to file FILE using FLAGS and indentation 8223 SPC. */ 8224 8225 static void 8226 dump_default_def (FILE *file, tree def, int spc, dump_flags_t flags) 8227 { 8228 for (int i = 0; i < spc; ++i) 8229 fprintf (file, " "); 8230 dump_ssaname_info_to_file (file, def, spc); 8231 8232 print_generic_expr (file, TREE_TYPE (def), flags); 8233 fprintf (file, " "); 8234 print_generic_expr (file, def, flags); 8235 fprintf (file, " = "); 8236 print_generic_expr (file, SSA_NAME_VAR (def), flags); 8237 fprintf (file, ";\n"); 8238 } 8239 8240 /* Print no_sanitize attribute to FILE for a given attribute VALUE. */ 8241 8242 static void 8243 print_no_sanitize_attr_value (FILE *file, tree value) 8244 { 8245 unsigned int flags = tree_to_uhwi (value); 8246 bool first = true; 8247 for (int i = 0; sanitizer_opts[i].name != NULL; ++i) 8248 { 8249 if ((sanitizer_opts[i].flag & flags) == sanitizer_opts[i].flag) 8250 { 8251 if (!first) 8252 fprintf (file, " | "); 8253 fprintf (file, "%s", sanitizer_opts[i].name); 8254 first = false; 8255 } 8256 } 8257 } 8258 8259 /* Dump FUNCTION_DECL FN to file FILE using FLAGS (see TDF_* in dumpfile.h) 8260 */ 8261 8262 void 8263 dump_function_to_file (tree fndecl, FILE *file, dump_flags_t flags) 8264 { 8265 tree arg, var, old_current_fndecl = current_function_decl; 8266 struct function *dsf; 8267 bool ignore_topmost_bind = false, any_var = false; 8268 basic_block bb; 8269 tree chain; 8270 bool tmclone = (TREE_CODE (fndecl) == FUNCTION_DECL 8271 && decl_is_tm_clone (fndecl)); 8272 struct function *fun = DECL_STRUCT_FUNCTION (fndecl); 8273 8274 tree fntype = TREE_TYPE (fndecl); 8275 tree attrs[] = { DECL_ATTRIBUTES (fndecl), TYPE_ATTRIBUTES (fntype) }; 8276 8277 for (int i = 0; i != 2; ++i) 8278 { 8279 if (!attrs[i]) 8280 continue; 8281 8282 fprintf (file, "__attribute__(("); 8283 8284 bool first = true; 8285 tree chain; 8286 for (chain = attrs[i]; chain; first = false, chain = TREE_CHAIN (chain)) 8287 { 8288 if (!first) 8289 fprintf (file, ", "); 8290 8291 tree name = get_attribute_name (chain); 8292 print_generic_expr (file, name, dump_flags); 8293 if (TREE_VALUE (chain) != NULL_TREE) 8294 { 8295 fprintf (file, " ("); 8296 8297 if (strstr (IDENTIFIER_POINTER (name), "no_sanitize")) 8298 print_no_sanitize_attr_value (file, TREE_VALUE (chain)); 8299 else if (!strcmp (IDENTIFIER_POINTER (name), 8300 "omp declare variant base")) 8301 { 8302 tree a = TREE_VALUE (chain); 8303 print_generic_expr (file, TREE_PURPOSE (a), dump_flags); 8304 fprintf (file, " match "); 8305 print_omp_context_selector (file, TREE_VALUE (a), 8306 dump_flags); 8307 } 8308 else 8309 print_generic_expr (file, TREE_VALUE (chain), dump_flags); 8310 fprintf (file, ")"); 8311 } 8312 } 8313 8314 fprintf (file, "))\n"); 8315 } 8316 8317 current_function_decl = fndecl; 8318 if (flags & TDF_GIMPLE) 8319 { 8320 static bool hotness_bb_param_printed = false; 8321 if (profile_info != NULL 8322 && !hotness_bb_param_printed) 8323 { 8324 hotness_bb_param_printed = true; 8325 fprintf (file, 8326 "/* --param=gimple-fe-computed-hot-bb-threshold=%" PRId64 8327 " */\n", get_hot_bb_threshold ()); 8328 } 8329 8330 print_generic_expr (file, TREE_TYPE (TREE_TYPE (fndecl)), 8331 dump_flags | TDF_SLIM); 8332 fprintf (file, " __GIMPLE (%s", 8333 (fun->curr_properties & PROP_ssa) ? "ssa" 8334 : (fun->curr_properties & PROP_cfg) ? "cfg" 8335 : ""); 8336 8337 if (fun && fun->cfg) 8338 { 8339 basic_block bb = ENTRY_BLOCK_PTR_FOR_FN (fun); 8340 if (bb->count.initialized_p ()) 8341 fprintf (file, ",%s(%" PRIu64 ")", 8342 profile_quality_as_string (bb->count.quality ()), 8343 bb->count.value ()); 8344 if (dump_flags & TDF_UID) 8345 fprintf (file, ")\n%sD_%u (", function_name (fun), 8346 DECL_UID (fndecl)); 8347 else 8348 fprintf (file, ")\n%s (", function_name (fun)); 8349 } 8350 } 8351 else 8352 { 8353 print_generic_expr (file, TREE_TYPE (fntype), dump_flags); 8354 if (dump_flags & TDF_UID) 8355 fprintf (file, " %sD.%u %s(", function_name (fun), DECL_UID (fndecl), 8356 tmclone ? "[tm-clone] " : ""); 8357 else 8358 fprintf (file, " %s %s(", function_name (fun), 8359 tmclone ? "[tm-clone] " : ""); 8360 } 8361 8362 arg = DECL_ARGUMENTS (fndecl); 8363 while (arg) 8364 { 8365 print_generic_expr (file, TREE_TYPE (arg), dump_flags); 8366 fprintf (file, " "); 8367 print_generic_expr (file, arg, dump_flags); 8368 if (DECL_CHAIN (arg)) 8369 fprintf (file, ", "); 8370 arg = DECL_CHAIN (arg); 8371 } 8372 fprintf (file, ")\n"); 8373 8374 dsf = DECL_STRUCT_FUNCTION (fndecl); 8375 if (dsf && (flags & TDF_EH)) 8376 dump_eh_tree (file, dsf); 8377 8378 if (flags & TDF_RAW && !gimple_has_body_p (fndecl)) 8379 { 8380 dump_node (fndecl, TDF_SLIM | flags, file); 8381 current_function_decl = old_current_fndecl; 8382 return; 8383 } 8384 8385 /* When GIMPLE is lowered, the variables are no longer available in 8386 BIND_EXPRs, so display them separately. */ 8387 if (fun && fun->decl == fndecl && (fun->curr_properties & PROP_gimple_lcf)) 8388 { 8389 unsigned ix; 8390 ignore_topmost_bind = true; 8391 8392 fprintf (file, "{\n"); 8393 if (gimple_in_ssa_p (fun) 8394 && (flags & TDF_ALIAS)) 8395 { 8396 for (arg = DECL_ARGUMENTS (fndecl); arg != NULL; 8397 arg = DECL_CHAIN (arg)) 8398 { 8399 tree def = ssa_default_def (fun, arg); 8400 if (def) 8401 dump_default_def (file, def, 2, flags); 8402 } 8403 8404 tree res = DECL_RESULT (fun->decl); 8405 if (res != NULL_TREE 8406 && DECL_BY_REFERENCE (res)) 8407 { 8408 tree def = ssa_default_def (fun, res); 8409 if (def) 8410 dump_default_def (file, def, 2, flags); 8411 } 8412 8413 tree static_chain = fun->static_chain_decl; 8414 if (static_chain != NULL_TREE) 8415 { 8416 tree def = ssa_default_def (fun, static_chain); 8417 if (def) 8418 dump_default_def (file, def, 2, flags); 8419 } 8420 } 8421 8422 if (!vec_safe_is_empty (fun->local_decls)) 8423 FOR_EACH_LOCAL_DECL (fun, ix, var) 8424 { 8425 print_generic_decl (file, var, flags); 8426 fprintf (file, "\n"); 8427 8428 any_var = true; 8429 } 8430 8431 tree name; 8432 8433 if (gimple_in_ssa_p (fun)) 8434 FOR_EACH_SSA_NAME (ix, name, fun) 8435 { 8436 if (!SSA_NAME_VAR (name) 8437 /* SSA name with decls without a name still get 8438 dumped as _N, list those explicitely as well even 8439 though we've dumped the decl declaration as D.xxx 8440 above. */ 8441 || !SSA_NAME_IDENTIFIER (name)) 8442 { 8443 fprintf (file, " "); 8444 print_generic_expr (file, TREE_TYPE (name), flags); 8445 fprintf (file, " "); 8446 print_generic_expr (file, name, flags); 8447 fprintf (file, ";\n"); 8448 8449 any_var = true; 8450 } 8451 } 8452 } 8453 8454 if (fun && fun->decl == fndecl 8455 && fun->cfg 8456 && basic_block_info_for_fn (fun)) 8457 { 8458 /* If the CFG has been built, emit a CFG-based dump. */ 8459 if (!ignore_topmost_bind) 8460 fprintf (file, "{\n"); 8461 8462 if (any_var && n_basic_blocks_for_fn (fun)) 8463 fprintf (file, "\n"); 8464 8465 FOR_EACH_BB_FN (bb, fun) 8466 dump_bb (file, bb, 2, flags); 8467 8468 fprintf (file, "}\n"); 8469 } 8470 else if (fun && (fun->curr_properties & PROP_gimple_any)) 8471 { 8472 /* The function is now in GIMPLE form but the CFG has not been 8473 built yet. Emit the single sequence of GIMPLE statements 8474 that make up its body. */ 8475 gimple_seq body = gimple_body (fndecl); 8476 8477 if (gimple_seq_first_stmt (body) 8478 && gimple_seq_first_stmt (body) == gimple_seq_last_stmt (body) 8479 && gimple_code (gimple_seq_first_stmt (body)) == GIMPLE_BIND) 8480 print_gimple_seq (file, body, 0, flags); 8481 else 8482 { 8483 if (!ignore_topmost_bind) 8484 fprintf (file, "{\n"); 8485 8486 if (any_var) 8487 fprintf (file, "\n"); 8488 8489 print_gimple_seq (file, body, 2, flags); 8490 fprintf (file, "}\n"); 8491 } 8492 } 8493 else 8494 { 8495 int indent; 8496 8497 /* Make a tree based dump. */ 8498 chain = DECL_SAVED_TREE (fndecl); 8499 if (chain && TREE_CODE (chain) == BIND_EXPR) 8500 { 8501 if (ignore_topmost_bind) 8502 { 8503 chain = BIND_EXPR_BODY (chain); 8504 indent = 2; 8505 } 8506 else 8507 indent = 0; 8508 } 8509 else 8510 { 8511 if (!ignore_topmost_bind) 8512 { 8513 fprintf (file, "{\n"); 8514 /* No topmost bind, pretend it's ignored for later. */ 8515 ignore_topmost_bind = true; 8516 } 8517 indent = 2; 8518 } 8519 8520 if (any_var) 8521 fprintf (file, "\n"); 8522 8523 print_generic_stmt_indented (file, chain, flags, indent); 8524 if (ignore_topmost_bind) 8525 fprintf (file, "}\n"); 8526 } 8527 8528 if (flags & TDF_ENUMERATE_LOCALS) 8529 dump_enumerated_decls (file, flags); 8530 fprintf (file, "\n\n"); 8531 8532 current_function_decl = old_current_fndecl; 8533 } 8534 8535 /* Dump FUNCTION_DECL FN to stderr using FLAGS (see TDF_* in tree.h) */ 8536 8537 DEBUG_FUNCTION void 8538 debug_function (tree fn, dump_flags_t flags) 8539 { 8540 dump_function_to_file (fn, stderr, flags); 8541 } 8542 8543 8544 /* Print on FILE the indexes for the predecessors of basic_block BB. */ 8545 8546 static void 8547 print_pred_bbs (FILE *file, basic_block bb) 8548 { 8549 edge e; 8550 edge_iterator ei; 8551 8552 FOR_EACH_EDGE (e, ei, bb->preds) 8553 fprintf (file, "bb_%d ", e->src->index); 8554 } 8555 8556 8557 /* Print on FILE the indexes for the successors of basic_block BB. */ 8558 8559 static void 8560 print_succ_bbs (FILE *file, basic_block bb) 8561 { 8562 edge e; 8563 edge_iterator ei; 8564 8565 FOR_EACH_EDGE (e, ei, bb->succs) 8566 fprintf (file, "bb_%d ", e->dest->index); 8567 } 8568 8569 /* Print to FILE the basic block BB following the VERBOSITY level. */ 8570 8571 void 8572 print_loops_bb (FILE *file, basic_block bb, int indent, int verbosity) 8573 { 8574 char *s_indent = (char *) alloca ((size_t) indent + 1); 8575 memset ((void *) s_indent, ' ', (size_t) indent); 8576 s_indent[indent] = '\0'; 8577 8578 /* Print basic_block's header. */ 8579 if (verbosity >= 2) 8580 { 8581 fprintf (file, "%s bb_%d (preds = {", s_indent, bb->index); 8582 print_pred_bbs (file, bb); 8583 fprintf (file, "}, succs = {"); 8584 print_succ_bbs (file, bb); 8585 fprintf (file, "})\n"); 8586 } 8587 8588 /* Print basic_block's body. */ 8589 if (verbosity >= 3) 8590 { 8591 fprintf (file, "%s {\n", s_indent); 8592 dump_bb (file, bb, indent + 4, TDF_VOPS|TDF_MEMSYMS); 8593 fprintf (file, "%s }\n", s_indent); 8594 } 8595 } 8596 8597 /* Print loop information. */ 8598 8599 void 8600 print_loop_info (FILE *file, const class loop *loop, const char *prefix) 8601 { 8602 if (loop->can_be_parallel) 8603 fprintf (file, ", can_be_parallel"); 8604 if (loop->warned_aggressive_loop_optimizations) 8605 fprintf (file, ", warned_aggressive_loop_optimizations"); 8606 if (loop->dont_vectorize) 8607 fprintf (file, ", dont_vectorize"); 8608 if (loop->force_vectorize) 8609 fprintf (file, ", force_vectorize"); 8610 if (loop->in_oacc_kernels_region) 8611 fprintf (file, ", in_oacc_kernels_region"); 8612 if (loop->finite_p) 8613 fprintf (file, ", finite_p"); 8614 if (loop->unroll) 8615 fprintf (file, "\n%sunroll %d", prefix, loop->unroll); 8616 if (loop->nb_iterations) 8617 { 8618 fprintf (file, "\n%sniter ", prefix); 8619 print_generic_expr (file, loop->nb_iterations); 8620 } 8621 8622 if (loop->any_upper_bound) 8623 { 8624 fprintf (file, "\n%supper_bound ", prefix); 8625 print_decu (loop->nb_iterations_upper_bound, file); 8626 } 8627 if (loop->any_likely_upper_bound) 8628 { 8629 fprintf (file, "\n%slikely_upper_bound ", prefix); 8630 print_decu (loop->nb_iterations_likely_upper_bound, file); 8631 } 8632 8633 if (loop->any_estimate) 8634 { 8635 fprintf (file, "\n%sestimate ", prefix); 8636 print_decu (loop->nb_iterations_estimate, file); 8637 } 8638 bool reliable; 8639 sreal iterations; 8640 if (loop->num && expected_loop_iterations_by_profile (loop, &iterations, &reliable)) 8641 { 8642 fprintf (file, "\n%siterations by profile: %f (%s%s) entry count:", prefix, 8643 iterations.to_double (), reliable ? "reliable" : "unreliable", 8644 maybe_flat_loop_profile (loop) ? ", maybe flat" : ""); 8645 loop_count_in (loop).dump (file, cfun); 8646 } 8647 8648 } 8649 8650 static void print_loop_and_siblings (FILE *, class loop *, int, int); 8651 8652 /* Pretty print LOOP on FILE, indented INDENT spaces. Following 8653 VERBOSITY level this outputs the contents of the loop, or just its 8654 structure. */ 8655 8656 static void 8657 print_loop (FILE *file, class loop *loop, int indent, int verbosity) 8658 { 8659 char *s_indent; 8660 basic_block bb; 8661 8662 if (loop == NULL) 8663 return; 8664 8665 s_indent = (char *) alloca ((size_t) indent + 1); 8666 memset ((void *) s_indent, ' ', (size_t) indent); 8667 s_indent[indent] = '\0'; 8668 8669 /* Print loop's header. */ 8670 fprintf (file, "%sloop_%d (", s_indent, loop->num); 8671 if (loop->header) 8672 fprintf (file, "header = %d", loop->header->index); 8673 else 8674 { 8675 fprintf (file, "deleted)\n"); 8676 return; 8677 } 8678 if (loop->latch) 8679 fprintf (file, ", latch = %d", loop->latch->index); 8680 else 8681 fprintf (file, ", multiple latches"); 8682 print_loop_info (file, loop, s_indent); 8683 fprintf (file, ")\n"); 8684 8685 /* Print loop's body. */ 8686 if (verbosity >= 1) 8687 { 8688 fprintf (file, "%s{\n", s_indent); 8689 FOR_EACH_BB_FN (bb, cfun) 8690 if (bb->loop_father == loop) 8691 print_loops_bb (file, bb, indent, verbosity); 8692 8693 print_loop_and_siblings (file, loop->inner, indent + 2, verbosity); 8694 fprintf (file, "%s}\n", s_indent); 8695 } 8696 } 8697 8698 /* Print the LOOP and its sibling loops on FILE, indented INDENT 8699 spaces. Following VERBOSITY level this outputs the contents of the 8700 loop, or just its structure. */ 8701 8702 static void 8703 print_loop_and_siblings (FILE *file, class loop *loop, int indent, 8704 int verbosity) 8705 { 8706 if (loop == NULL) 8707 return; 8708 8709 print_loop (file, loop, indent, verbosity); 8710 print_loop_and_siblings (file, loop->next, indent, verbosity); 8711 } 8712 8713 /* Follow a CFG edge from the entry point of the program, and on entry 8714 of a loop, pretty print the loop structure on FILE. */ 8715 8716 void 8717 print_loops (FILE *file, int verbosity) 8718 { 8719 basic_block bb; 8720 8721 bb = ENTRY_BLOCK_PTR_FOR_FN (cfun); 8722 fprintf (file, "\nLoops in function: %s\n", current_function_name ()); 8723 if (bb && bb->loop_father) 8724 print_loop_and_siblings (file, bb->loop_father, 0, verbosity); 8725 } 8726 8727 /* Dump a loop. */ 8728 8729 DEBUG_FUNCTION void 8730 debug (class loop &ref) 8731 { 8732 print_loop (stderr, &ref, 0, /*verbosity*/0); 8733 } 8734 8735 DEBUG_FUNCTION void 8736 debug (class loop *ptr) 8737 { 8738 if (ptr) 8739 debug (*ptr); 8740 else 8741 fprintf (stderr, "<nil>\n"); 8742 } 8743 8744 /* Dump a loop verbosely. */ 8745 8746 DEBUG_FUNCTION void 8747 debug_verbose (class loop &ref) 8748 { 8749 print_loop (stderr, &ref, 0, /*verbosity*/3); 8750 } 8751 8752 DEBUG_FUNCTION void 8753 debug_verbose (class loop *ptr) 8754 { 8755 if (ptr) 8756 debug (*ptr); 8757 else 8758 fprintf (stderr, "<nil>\n"); 8759 } 8760 8761 8762 /* Debugging loops structure at tree level, at some VERBOSITY level. */ 8763 8764 DEBUG_FUNCTION void 8765 debug_loops (int verbosity) 8766 { 8767 print_loops (stderr, verbosity); 8768 } 8769 8770 /* Print on stderr the code of LOOP, at some VERBOSITY level. */ 8771 8772 DEBUG_FUNCTION void 8773 debug_loop (class loop *loop, int verbosity) 8774 { 8775 print_loop (stderr, loop, 0, verbosity); 8776 } 8777 8778 /* Print on stderr the code of loop number NUM, at some VERBOSITY 8779 level. */ 8780 8781 DEBUG_FUNCTION void 8782 debug_loop_num (unsigned num, int verbosity) 8783 { 8784 debug_loop (get_loop (cfun, num), verbosity); 8785 } 8786 8787 /* Return true if BB ends with a call, possibly followed by some 8788 instructions that must stay with the call. Return false, 8789 otherwise. */ 8790 8791 static bool 8792 gimple_block_ends_with_call_p (basic_block bb) 8793 { 8794 gimple_stmt_iterator gsi = gsi_last_nondebug_bb (bb); 8795 return !gsi_end_p (gsi) && is_gimple_call (gsi_stmt (gsi)); 8796 } 8797 8798 8799 /* Return true if BB ends with a conditional branch. Return false, 8800 otherwise. */ 8801 8802 static bool 8803 gimple_block_ends_with_condjump_p (const_basic_block bb) 8804 { 8805 return safe_is_a <gcond *> (*gsi_last_bb (const_cast <basic_block> (bb))); 8806 } 8807 8808 8809 /* Return true if statement T may terminate execution of BB in ways not 8810 explicitly represtented in the CFG. */ 8811 8812 bool 8813 stmt_can_terminate_bb_p (gimple *t) 8814 { 8815 tree fndecl = NULL_TREE; 8816 int call_flags = 0; 8817 8818 /* Eh exception not handled internally terminates execution of the whole 8819 function. */ 8820 if (stmt_can_throw_external (cfun, t)) 8821 return true; 8822 8823 /* NORETURN and LONGJMP calls already have an edge to exit. 8824 CONST and PURE calls do not need one. 8825 We don't currently check for CONST and PURE here, although 8826 it would be a good idea, because those attributes are 8827 figured out from the RTL in mark_constant_function, and 8828 the counter incrementation code from -fprofile-arcs 8829 leads to different results from -fbranch-probabilities. */ 8830 if (is_gimple_call (t)) 8831 { 8832 fndecl = gimple_call_fndecl (t); 8833 call_flags = gimple_call_flags (t); 8834 } 8835 8836 if (is_gimple_call (t) 8837 && fndecl 8838 && fndecl_built_in_p (fndecl) 8839 && (call_flags & ECF_NOTHROW) 8840 && !(call_flags & ECF_RETURNS_TWICE) 8841 /* fork() doesn't really return twice, but the effect of 8842 wrapping it in __gcov_fork() which calls __gcov_dump() and 8843 __gcov_reset() and clears the counters before forking has the same 8844 effect as returning twice. Force a fake edge. */ 8845 && !fndecl_built_in_p (fndecl, BUILT_IN_FORK)) 8846 return false; 8847 8848 if (is_gimple_call (t)) 8849 { 8850 edge_iterator ei; 8851 edge e; 8852 basic_block bb; 8853 8854 if (call_flags & (ECF_PURE | ECF_CONST) 8855 && !(call_flags & ECF_LOOPING_CONST_OR_PURE)) 8856 return false; 8857 8858 /* Function call may do longjmp, terminate program or do other things. 8859 Special case noreturn that have non-abnormal edges out as in this case 8860 the fact is sufficiently represented by lack of edges out of T. */ 8861 if (!(call_flags & ECF_NORETURN)) 8862 return true; 8863 8864 bb = gimple_bb (t); 8865 FOR_EACH_EDGE (e, ei, bb->succs) 8866 if ((e->flags & EDGE_FAKE) == 0) 8867 return true; 8868 } 8869 8870 if (gasm *asm_stmt = dyn_cast <gasm *> (t)) 8871 if (gimple_asm_volatile_p (asm_stmt) || gimple_asm_input_p (asm_stmt)) 8872 return true; 8873 8874 return false; 8875 } 8876 8877 8878 /* Add fake edges to the function exit for any non constant and non 8879 noreturn calls (or noreturn calls with EH/abnormal edges), 8880 volatile inline assembly in the bitmap of blocks specified by BLOCKS 8881 or to the whole CFG if BLOCKS is zero. Return the number of blocks 8882 that were split. 8883 8884 The goal is to expose cases in which entering a basic block does 8885 not imply that all subsequent instructions must be executed. */ 8886 8887 static int 8888 gimple_flow_call_edges_add (sbitmap blocks) 8889 { 8890 int i; 8891 int blocks_split = 0; 8892 int last_bb = last_basic_block_for_fn (cfun); 8893 bool check_last_block = false; 8894 8895 if (n_basic_blocks_for_fn (cfun) == NUM_FIXED_BLOCKS) 8896 return 0; 8897 8898 if (! blocks) 8899 check_last_block = true; 8900 else 8901 check_last_block = bitmap_bit_p (blocks, 8902 EXIT_BLOCK_PTR_FOR_FN (cfun)->prev_bb->index); 8903 8904 /* In the last basic block, before epilogue generation, there will be 8905 a fallthru edge to EXIT. Special care is required if the last insn 8906 of the last basic block is a call because make_edge folds duplicate 8907 edges, which would result in the fallthru edge also being marked 8908 fake, which would result in the fallthru edge being removed by 8909 remove_fake_edges, which would result in an invalid CFG. 8910 8911 Moreover, we can't elide the outgoing fake edge, since the block 8912 profiler needs to take this into account in order to solve the minimal 8913 spanning tree in the case that the call doesn't return. 8914 8915 Handle this by adding a dummy instruction in a new last basic block. */ 8916 if (check_last_block) 8917 { 8918 basic_block bb = EXIT_BLOCK_PTR_FOR_FN (cfun)->prev_bb; 8919 gimple_stmt_iterator gsi = gsi_last_nondebug_bb (bb); 8920 gimple *t = NULL; 8921 8922 if (!gsi_end_p (gsi)) 8923 t = gsi_stmt (gsi); 8924 8925 if (t && stmt_can_terminate_bb_p (t)) 8926 { 8927 edge e; 8928 8929 e = find_edge (bb, EXIT_BLOCK_PTR_FOR_FN (cfun)); 8930 if (e) 8931 { 8932 gsi_insert_on_edge (e, gimple_build_nop ()); 8933 gsi_commit_edge_inserts (); 8934 } 8935 } 8936 } 8937 8938 /* Now add fake edges to the function exit for any non constant 8939 calls since there is no way that we can determine if they will 8940 return or not... */ 8941 for (i = 0; i < last_bb; i++) 8942 { 8943 basic_block bb = BASIC_BLOCK_FOR_FN (cfun, i); 8944 gimple_stmt_iterator gsi; 8945 gimple *stmt, *last_stmt; 8946 8947 if (!bb) 8948 continue; 8949 8950 if (blocks && !bitmap_bit_p (blocks, i)) 8951 continue; 8952 8953 gsi = gsi_last_nondebug_bb (bb); 8954 if (!gsi_end_p (gsi)) 8955 { 8956 last_stmt = gsi_stmt (gsi); 8957 do 8958 { 8959 stmt = gsi_stmt (gsi); 8960 if (stmt_can_terminate_bb_p (stmt)) 8961 { 8962 edge e; 8963 8964 /* The handling above of the final block before the 8965 epilogue should be enough to verify that there is 8966 no edge to the exit block in CFG already. 8967 Calling make_edge in such case would cause us to 8968 mark that edge as fake and remove it later. */ 8969 if (flag_checking && stmt == last_stmt) 8970 { 8971 e = find_edge (bb, EXIT_BLOCK_PTR_FOR_FN (cfun)); 8972 gcc_assert (e == NULL); 8973 } 8974 8975 /* Note that the following may create a new basic block 8976 and renumber the existing basic blocks. */ 8977 if (stmt != last_stmt) 8978 { 8979 e = split_block (bb, stmt); 8980 if (e) 8981 blocks_split++; 8982 } 8983 e = make_edge (bb, EXIT_BLOCK_PTR_FOR_FN (cfun), EDGE_FAKE); 8984 e->probability = profile_probability::guessed_never (); 8985 } 8986 gsi_prev (&gsi); 8987 } 8988 while (!gsi_end_p (gsi)); 8989 } 8990 } 8991 8992 if (blocks_split) 8993 checking_verify_flow_info (); 8994 8995 return blocks_split; 8996 } 8997 8998 /* Removes edge E and all the blocks dominated by it, and updates dominance 8999 information. The IL in E->src needs to be updated separately. 9000 If dominance info is not available, only the edge E is removed.*/ 9001 9002 void 9003 remove_edge_and_dominated_blocks (edge e) 9004 { 9005 vec<basic_block> bbs_to_fix_dom = vNULL; 9006 edge f; 9007 edge_iterator ei; 9008 bool none_removed = false; 9009 unsigned i; 9010 basic_block bb, dbb; 9011 bitmap_iterator bi; 9012 9013 /* If we are removing a path inside a non-root loop that may change 9014 loop ownership of blocks or remove loops. Mark loops for fixup. */ 9015 class loop *src_loop = e->src->loop_father; 9016 if (current_loops 9017 && loop_outer (src_loop) != NULL 9018 && src_loop == e->dest->loop_father) 9019 { 9020 loops_state_set (LOOPS_NEED_FIXUP); 9021 /* If we are removing a backedge clear the number of iterations 9022 and estimates. */ 9023 class loop *dest_loop = e->dest->loop_father; 9024 if (e->dest == src_loop->header 9025 || (e->dest == dest_loop->header 9026 && flow_loop_nested_p (dest_loop, src_loop))) 9027 { 9028 free_numbers_of_iterations_estimates (dest_loop); 9029 /* If we removed the last backedge mark the loop for removal. */ 9030 FOR_EACH_EDGE (f, ei, dest_loop->header->preds) 9031 if (f != e 9032 && (f->src->loop_father == dest_loop 9033 || flow_loop_nested_p (dest_loop, f->src->loop_father))) 9034 break; 9035 if (!f) 9036 mark_loop_for_removal (dest_loop); 9037 } 9038 } 9039 9040 if (!dom_info_available_p (CDI_DOMINATORS)) 9041 { 9042 remove_edge (e); 9043 return; 9044 } 9045 9046 /* No updating is needed for edges to exit. */ 9047 if (e->dest == EXIT_BLOCK_PTR_FOR_FN (cfun)) 9048 { 9049 if (cfgcleanup_altered_bbs) 9050 bitmap_set_bit (cfgcleanup_altered_bbs, e->src->index); 9051 remove_edge (e); 9052 return; 9053 } 9054 9055 /* First, we find the basic blocks to remove. If E->dest has a predecessor 9056 that is not dominated by E->dest, then this set is empty. Otherwise, 9057 all the basic blocks dominated by E->dest are removed. 9058 9059 Also, to DF_IDOM we store the immediate dominators of the blocks in 9060 the dominance frontier of E (i.e., of the successors of the 9061 removed blocks, if there are any, and of E->dest otherwise). */ 9062 FOR_EACH_EDGE (f, ei, e->dest->preds) 9063 { 9064 if (f == e) 9065 continue; 9066 9067 if (!dominated_by_p (CDI_DOMINATORS, f->src, e->dest)) 9068 { 9069 none_removed = true; 9070 break; 9071 } 9072 } 9073 9074 auto_bitmap df, df_idom; 9075 auto_vec<basic_block> bbs_to_remove; 9076 if (none_removed) 9077 bitmap_set_bit (df_idom, 9078 get_immediate_dominator (CDI_DOMINATORS, e->dest)->index); 9079 else 9080 { 9081 bbs_to_remove = get_all_dominated_blocks (CDI_DOMINATORS, e->dest); 9082 FOR_EACH_VEC_ELT (bbs_to_remove, i, bb) 9083 { 9084 FOR_EACH_EDGE (f, ei, bb->succs) 9085 { 9086 if (f->dest != EXIT_BLOCK_PTR_FOR_FN (cfun)) 9087 bitmap_set_bit (df, f->dest->index); 9088 } 9089 } 9090 FOR_EACH_VEC_ELT (bbs_to_remove, i, bb) 9091 bitmap_clear_bit (df, bb->index); 9092 9093 EXECUTE_IF_SET_IN_BITMAP (df, 0, i, bi) 9094 { 9095 bb = BASIC_BLOCK_FOR_FN (cfun, i); 9096 bitmap_set_bit (df_idom, 9097 get_immediate_dominator (CDI_DOMINATORS, bb)->index); 9098 } 9099 } 9100 9101 if (cfgcleanup_altered_bbs) 9102 { 9103 /* Record the set of the altered basic blocks. */ 9104 bitmap_set_bit (cfgcleanup_altered_bbs, e->src->index); 9105 bitmap_ior_into (cfgcleanup_altered_bbs, df); 9106 } 9107 9108 /* Remove E and the cancelled blocks. */ 9109 if (none_removed) 9110 remove_edge (e); 9111 else 9112 { 9113 /* Walk backwards so as to get a chance to substitute all 9114 released DEFs into debug stmts. See 9115 eliminate_unnecessary_stmts() in tree-ssa-dce.cc for more 9116 details. */ 9117 for (i = bbs_to_remove.length (); i-- > 0; ) 9118 delete_basic_block (bbs_to_remove[i]); 9119 } 9120 9121 /* Update the dominance information. The immediate dominator may change only 9122 for blocks whose immediate dominator belongs to DF_IDOM: 9123 9124 Suppose that idom(X) = Y before removal of E and idom(X) != Y after the 9125 removal. Let Z the arbitrary block such that idom(Z) = Y and 9126 Z dominates X after the removal. Before removal, there exists a path P 9127 from Y to X that avoids Z. Let F be the last edge on P that is 9128 removed, and let W = F->dest. Before removal, idom(W) = Y (since Y 9129 dominates W, and because of P, Z does not dominate W), and W belongs to 9130 the dominance frontier of E. Therefore, Y belongs to DF_IDOM. */ 9131 EXECUTE_IF_SET_IN_BITMAP (df_idom, 0, i, bi) 9132 { 9133 bb = BASIC_BLOCK_FOR_FN (cfun, i); 9134 for (dbb = first_dom_son (CDI_DOMINATORS, bb); 9135 dbb; 9136 dbb = next_dom_son (CDI_DOMINATORS, dbb)) 9137 bbs_to_fix_dom.safe_push (dbb); 9138 } 9139 9140 iterate_fix_dominators (CDI_DOMINATORS, bbs_to_fix_dom, true); 9141 9142 bbs_to_fix_dom.release (); 9143 } 9144 9145 /* Purge dead EH edges from basic block BB. */ 9146 9147 bool 9148 gimple_purge_dead_eh_edges (basic_block bb) 9149 { 9150 bool changed = false; 9151 edge e; 9152 edge_iterator ei; 9153 gimple *stmt = *gsi_last_bb (bb); 9154 9155 if (stmt && stmt_can_throw_internal (cfun, stmt)) 9156 return false; 9157 9158 for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); ) 9159 { 9160 if (e->flags & EDGE_EH) 9161 { 9162 remove_edge_and_dominated_blocks (e); 9163 changed = true; 9164 } 9165 else 9166 ei_next (&ei); 9167 } 9168 9169 return changed; 9170 } 9171 9172 /* Purge dead EH edges from basic block listed in BLOCKS. */ 9173 9174 bool 9175 gimple_purge_all_dead_eh_edges (const_bitmap blocks) 9176 { 9177 bool changed = false; 9178 unsigned i; 9179 bitmap_iterator bi; 9180 9181 EXECUTE_IF_SET_IN_BITMAP (blocks, 0, i, bi) 9182 { 9183 basic_block bb = BASIC_BLOCK_FOR_FN (cfun, i); 9184 9185 /* Earlier gimple_purge_dead_eh_edges could have removed 9186 this basic block already. */ 9187 gcc_assert (bb || changed); 9188 if (bb != NULL) 9189 changed |= gimple_purge_dead_eh_edges (bb); 9190 } 9191 9192 return changed; 9193 } 9194 9195 /* Purge dead abnormal call edges from basic block BB. */ 9196 9197 bool 9198 gimple_purge_dead_abnormal_call_edges (basic_block bb) 9199 { 9200 bool changed = false; 9201 edge e; 9202 edge_iterator ei; 9203 gimple *stmt = *gsi_last_bb (bb); 9204 9205 if (stmt && stmt_can_make_abnormal_goto (stmt)) 9206 return false; 9207 9208 for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); ) 9209 { 9210 if (e->flags & EDGE_ABNORMAL) 9211 { 9212 if (e->flags & EDGE_FALLTHRU) 9213 e->flags &= ~EDGE_ABNORMAL; 9214 else 9215 remove_edge_and_dominated_blocks (e); 9216 changed = true; 9217 } 9218 else 9219 ei_next (&ei); 9220 } 9221 9222 return changed; 9223 } 9224 9225 /* Purge dead abnormal call edges from basic block listed in BLOCKS. */ 9226 9227 bool 9228 gimple_purge_all_dead_abnormal_call_edges (const_bitmap blocks) 9229 { 9230 bool changed = false; 9231 unsigned i; 9232 bitmap_iterator bi; 9233 9234 EXECUTE_IF_SET_IN_BITMAP (blocks, 0, i, bi) 9235 { 9236 basic_block bb = BASIC_BLOCK_FOR_FN (cfun, i); 9237 9238 /* Earlier gimple_purge_dead_abnormal_call_edges could have removed 9239 this basic block already. */ 9240 gcc_assert (bb || changed); 9241 if (bb != NULL) 9242 changed |= gimple_purge_dead_abnormal_call_edges (bb); 9243 } 9244 9245 return changed; 9246 } 9247 9248 /* This function is called whenever a new edge is created or 9249 redirected. */ 9250 9251 static void 9252 gimple_execute_on_growing_pred (edge e) 9253 { 9254 basic_block bb = e->dest; 9255 9256 if (!gimple_seq_empty_p (phi_nodes (bb))) 9257 reserve_phi_args_for_new_edge (bb); 9258 } 9259 9260 /* This function is called immediately before edge E is removed from 9261 the edge vector E->dest->preds. */ 9262 9263 static void 9264 gimple_execute_on_shrinking_pred (edge e) 9265 { 9266 if (!gimple_seq_empty_p (phi_nodes (e->dest))) 9267 remove_phi_args (e); 9268 } 9269 9270 /*--------------------------------------------------------------------------- 9271 Helper functions for Loop versioning 9272 ---------------------------------------------------------------------------*/ 9273 9274 /* Adjust phi nodes for 'first' basic block. 'second' basic block is a copy 9275 of 'first'. Both of them are dominated by 'new_head' basic block. When 9276 'new_head' was created by 'second's incoming edge it received phi arguments 9277 on the edge by split_edge(). Later, additional edge 'e' was created to 9278 connect 'new_head' and 'first'. Now this routine adds phi args on this 9279 additional edge 'e' that new_head to second edge received as part of edge 9280 splitting. */ 9281 9282 static void 9283 gimple_lv_adjust_loop_header_phi (basic_block first, basic_block second, 9284 basic_block new_head, edge e) 9285 { 9286 gphi *phi1, *phi2; 9287 gphi_iterator psi1, psi2; 9288 tree def; 9289 edge e2 = find_edge (new_head, second); 9290 9291 /* Because NEW_HEAD has been created by splitting SECOND's incoming 9292 edge, we should always have an edge from NEW_HEAD to SECOND. */ 9293 gcc_assert (e2 != NULL); 9294 9295 /* Browse all 'second' basic block phi nodes and add phi args to 9296 edge 'e' for 'first' head. PHI args are always in correct order. */ 9297 9298 for (psi2 = gsi_start_phis (second), 9299 psi1 = gsi_start_phis (first); 9300 !gsi_end_p (psi2) && !gsi_end_p (psi1); 9301 gsi_next (&psi2), gsi_next (&psi1)) 9302 { 9303 phi1 = psi1.phi (); 9304 phi2 = psi2.phi (); 9305 def = PHI_ARG_DEF (phi2, e2->dest_idx); 9306 add_phi_arg (phi1, def, e, gimple_phi_arg_location_from_edge (phi2, e2)); 9307 } 9308 } 9309 9310 9311 /* Adds a if else statement to COND_BB with condition COND_EXPR. 9312 SECOND_HEAD is the destination of the THEN and FIRST_HEAD is 9313 the destination of the ELSE part. */ 9314 9315 static void 9316 gimple_lv_add_condition_to_bb (basic_block first_head ATTRIBUTE_UNUSED, 9317 basic_block second_head ATTRIBUTE_UNUSED, 9318 basic_block cond_bb, void *cond_e) 9319 { 9320 gimple_stmt_iterator gsi; 9321 gimple *new_cond_expr; 9322 tree cond_expr = (tree) cond_e; 9323 edge e0; 9324 9325 /* Build new conditional expr */ 9326 gsi = gsi_last_bb (cond_bb); 9327 9328 cond_expr = force_gimple_operand_gsi_1 (&gsi, cond_expr, 9329 is_gimple_condexpr_for_cond, 9330 NULL_TREE, false, 9331 GSI_CONTINUE_LINKING); 9332 new_cond_expr = gimple_build_cond_from_tree (cond_expr, 9333 NULL_TREE, NULL_TREE); 9334 9335 /* Add new cond in cond_bb. */ 9336 gsi_insert_after (&gsi, new_cond_expr, GSI_NEW_STMT); 9337 9338 /* Adjust edges appropriately to connect new head with first head 9339 as well as second head. */ 9340 e0 = single_succ_edge (cond_bb); 9341 e0->flags &= ~EDGE_FALLTHRU; 9342 e0->flags |= EDGE_FALSE_VALUE; 9343 } 9344 9345 9346 /* Do book-keeping of basic block BB for the profile consistency checker. 9347 Store the counting in RECORD. */ 9348 static void 9349 gimple_account_profile_record (basic_block bb, 9350 struct profile_record *record) 9351 { 9352 gimple_stmt_iterator i; 9353 for (i = gsi_start_nondebug_after_labels_bb (bb); !gsi_end_p (i); 9354 gsi_next_nondebug (&i)) 9355 { 9356 record->size 9357 += estimate_num_insns (gsi_stmt (i), &eni_size_weights); 9358 if (profile_info) 9359 { 9360 if (ENTRY_BLOCK_PTR_FOR_FN (cfun)->count.ipa ().initialized_p () 9361 && ENTRY_BLOCK_PTR_FOR_FN (cfun)->count.ipa ().nonzero_p () 9362 && bb->count.ipa ().initialized_p ()) 9363 record->time 9364 += estimate_num_insns (gsi_stmt (i), 9365 &eni_time_weights) 9366 * bb->count.ipa ().to_gcov_type (); 9367 } 9368 else if (bb->count.initialized_p () 9369 && ENTRY_BLOCK_PTR_FOR_FN (cfun)->count.initialized_p ()) 9370 record->time 9371 += estimate_num_insns 9372 (gsi_stmt (i), 9373 &eni_time_weights) 9374 * bb->count.to_sreal_scale 9375 (ENTRY_BLOCK_PTR_FOR_FN (cfun)->count).to_double (); 9376 else 9377 record->time 9378 += estimate_num_insns (gsi_stmt (i), &eni_time_weights); 9379 } 9380 } 9381 9382 struct cfg_hooks gimple_cfg_hooks = { 9383 "gimple", 9384 gimple_verify_flow_info, 9385 gimple_dump_bb, /* dump_bb */ 9386 gimple_dump_bb_for_graph, /* dump_bb_for_graph */ 9387 create_bb, /* create_basic_block */ 9388 gimple_redirect_edge_and_branch, /* redirect_edge_and_branch */ 9389 gimple_redirect_edge_and_branch_force, /* redirect_edge_and_branch_force */ 9390 gimple_can_remove_branch_p, /* can_remove_branch_p */ 9391 remove_bb, /* delete_basic_block */ 9392 gimple_split_block, /* split_block */ 9393 gimple_move_block_after, /* move_block_after */ 9394 gimple_can_merge_blocks_p, /* can_merge_blocks_p */ 9395 gimple_merge_blocks, /* merge_blocks */ 9396 gimple_predict_edge, /* predict_edge */ 9397 gimple_predicted_by_p, /* predicted_by_p */ 9398 gimple_can_duplicate_bb_p, /* can_duplicate_block_p */ 9399 gimple_duplicate_bb, /* duplicate_block */ 9400 gimple_split_edge, /* split_edge */ 9401 gimple_make_forwarder_block, /* make_forward_block */ 9402 NULL, /* tidy_fallthru_edge */ 9403 NULL, /* force_nonfallthru */ 9404 gimple_block_ends_with_call_p,/* block_ends_with_call_p */ 9405 gimple_block_ends_with_condjump_p, /* block_ends_with_condjump_p */ 9406 gimple_flow_call_edges_add, /* flow_call_edges_add */ 9407 gimple_execute_on_growing_pred, /* execute_on_growing_pred */ 9408 gimple_execute_on_shrinking_pred, /* execute_on_shrinking_pred */ 9409 gimple_duplicate_loop_body_to_header_edge, /* duplicate loop for trees */ 9410 gimple_lv_add_condition_to_bb, /* lv_add_condition_to_bb */ 9411 gimple_lv_adjust_loop_header_phi, /* lv_adjust_loop_header_phi*/ 9412 extract_true_false_edges_from_block, /* extract_cond_bb_edges */ 9413 flush_pending_stmts, /* flush_pending_stmts */ 9414 gimple_empty_block_p, /* block_empty_p */ 9415 gimple_split_block_before_cond_jump, /* split_block_before_cond_jump */ 9416 gimple_account_profile_record, 9417 }; 9418 9419 9420 /* Split all critical edges. Split some extra (not necessarily critical) edges 9421 if FOR_EDGE_INSERTION_P is true. */ 9422 9423 unsigned int 9424 split_critical_edges (bool for_edge_insertion_p /* = false */) 9425 { 9426 basic_block bb; 9427 edge e; 9428 edge_iterator ei; 9429 9430 /* split_edge can redirect edges out of SWITCH_EXPRs, which can get 9431 expensive. So we want to enable recording of edge to CASE_LABEL_EXPR 9432 mappings around the calls to split_edge. */ 9433 start_recording_case_labels (); 9434 FOR_ALL_BB_FN (bb, cfun) 9435 { 9436 FOR_EACH_EDGE (e, ei, bb->succs) 9437 { 9438 if (EDGE_CRITICAL_P (e) && !(e->flags & EDGE_ABNORMAL)) 9439 split_edge (e); 9440 /* PRE inserts statements to edges and expects that 9441 since split_critical_edges was done beforehand, committing edge 9442 insertions will not split more edges. In addition to critical 9443 edges we must split edges that have multiple successors and 9444 end by control flow statements, such as RESX. 9445 Go ahead and split them too. This matches the logic in 9446 gimple_find_edge_insert_loc. */ 9447 else if (for_edge_insertion_p 9448 && (!single_pred_p (e->dest) 9449 || !gimple_seq_empty_p (phi_nodes (e->dest)) 9450 || e->dest == EXIT_BLOCK_PTR_FOR_FN (cfun)) 9451 && e->src != ENTRY_BLOCK_PTR_FOR_FN (cfun) 9452 && !(e->flags & EDGE_ABNORMAL)) 9453 { 9454 gimple_stmt_iterator gsi; 9455 9456 gsi = gsi_last_bb (e->src); 9457 if (!gsi_end_p (gsi) 9458 && stmt_ends_bb_p (gsi_stmt (gsi)) 9459 && (gimple_code (gsi_stmt (gsi)) != GIMPLE_RETURN 9460 && !gimple_call_builtin_p (gsi_stmt (gsi), 9461 BUILT_IN_RETURN))) 9462 split_edge (e); 9463 } 9464 } 9465 } 9466 end_recording_case_labels (); 9467 return 0; 9468 } 9469 9470 namespace { 9471 9472 const pass_data pass_data_split_crit_edges = 9473 { 9474 GIMPLE_PASS, /* type */ 9475 "crited", /* name */ 9476 OPTGROUP_NONE, /* optinfo_flags */ 9477 TV_TREE_SPLIT_EDGES, /* tv_id */ 9478 PROP_cfg, /* properties_required */ 9479 PROP_no_crit_edges, /* properties_provided */ 9480 0, /* properties_destroyed */ 9481 0, /* todo_flags_start */ 9482 0, /* todo_flags_finish */ 9483 }; 9484 9485 class pass_split_crit_edges : public gimple_opt_pass 9486 { 9487 public: 9488 pass_split_crit_edges (gcc::context *ctxt) 9489 : gimple_opt_pass (pass_data_split_crit_edges, ctxt) 9490 {} 9491 9492 /* opt_pass methods: */ 9493 unsigned int execute (function *) final override 9494 { 9495 return split_critical_edges (); 9496 } 9497 9498 opt_pass * clone () final override 9499 { 9500 return new pass_split_crit_edges (m_ctxt); 9501 } 9502 }; // class pass_split_crit_edges 9503 9504 } // anon namespace 9505 9506 gimple_opt_pass * 9507 make_pass_split_crit_edges (gcc::context *ctxt) 9508 { 9509 return new pass_split_crit_edges (ctxt); 9510 } 9511 9512 9513 /* Insert COND expression which is GIMPLE_COND after STMT 9514 in basic block BB with appropriate basic block split 9515 and creation of a new conditionally executed basic block. 9516 Update profile so the new bb is visited with probability PROB. 9517 Return created basic block. */ 9518 basic_block 9519 insert_cond_bb (basic_block bb, gimple *stmt, gimple *cond, 9520 profile_probability prob) 9521 { 9522 edge fall = split_block (bb, stmt); 9523 gimple_stmt_iterator iter = gsi_last_bb (bb); 9524 basic_block new_bb; 9525 9526 /* Insert cond statement. */ 9527 gcc_assert (gimple_code (cond) == GIMPLE_COND); 9528 if (gsi_end_p (iter)) 9529 gsi_insert_before (&iter, cond, GSI_CONTINUE_LINKING); 9530 else 9531 gsi_insert_after (&iter, cond, GSI_CONTINUE_LINKING); 9532 9533 /* Create conditionally executed block. */ 9534 new_bb = create_empty_bb (bb); 9535 edge e = make_edge (bb, new_bb, EDGE_TRUE_VALUE); 9536 e->probability = prob; 9537 new_bb->count = e->count (); 9538 make_single_succ_edge (new_bb, fall->dest, EDGE_FALLTHRU); 9539 9540 /* Fix edge for split bb. */ 9541 fall->flags = EDGE_FALSE_VALUE; 9542 fall->probability -= e->probability; 9543 9544 /* Update dominance info. */ 9545 if (dom_info_available_p (CDI_DOMINATORS)) 9546 { 9547 set_immediate_dominator (CDI_DOMINATORS, new_bb, bb); 9548 set_immediate_dominator (CDI_DOMINATORS, fall->dest, bb); 9549 } 9550 9551 /* Update loop info. */ 9552 if (current_loops) 9553 add_bb_to_loop (new_bb, bb->loop_father); 9554 9555 return new_bb; 9556 } 9557 9558 9559 9560 /* Given a basic block B which ends with a conditional and has 9562 precisely two successors, determine which of the edges is taken if 9563 the conditional is true and which is taken if the conditional is 9564 false. Set TRUE_EDGE and FALSE_EDGE appropriately. */ 9565 9566 void 9567 extract_true_false_edges_from_block (basic_block b, 9568 edge *true_edge, 9569 edge *false_edge) 9570 { 9571 edge e = EDGE_SUCC (b, 0); 9572 9573 if (e->flags & EDGE_TRUE_VALUE) 9574 { 9575 *true_edge = e; 9576 *false_edge = EDGE_SUCC (b, 1); 9577 } 9578 else 9579 { 9580 *false_edge = e; 9581 *true_edge = EDGE_SUCC (b, 1); 9582 } 9583 } 9584 9585 9586 /* From a controlling predicate in the immediate dominator DOM of 9587 PHIBLOCK determine the edges into PHIBLOCK that are chosen if the 9588 predicate evaluates to true and false and store them to 9589 *TRUE_CONTROLLED_EDGE and *FALSE_CONTROLLED_EDGE if 9590 they are non-NULL. Returns true if the edges can be determined, 9591 else return false. */ 9592 9593 bool 9594 extract_true_false_controlled_edges (basic_block dom, basic_block phiblock, 9595 edge *true_controlled_edge, 9596 edge *false_controlled_edge) 9597 { 9598 basic_block bb = phiblock; 9599 edge true_edge, false_edge, tem; 9600 edge e0 = NULL, e1 = NULL; 9601 9602 /* We have to verify that one edge into the PHI node is dominated 9603 by the true edge of the predicate block and the other edge 9604 dominated by the false edge. This ensures that the PHI argument 9605 we are going to take is completely determined by the path we 9606 take from the predicate block. 9607 We can only use BB dominance checks below if the destination of 9608 the true/false edges are dominated by their edge, thus only 9609 have a single predecessor. */ 9610 extract_true_false_edges_from_block (dom, &true_edge, &false_edge); 9611 tem = EDGE_PRED (bb, 0); 9612 if (tem == true_edge 9613 || (single_pred_p (true_edge->dest) 9614 && (tem->src == true_edge->dest 9615 || dominated_by_p (CDI_DOMINATORS, 9616 tem->src, true_edge->dest)))) 9617 e0 = tem; 9618 else if (tem == false_edge 9619 || (single_pred_p (false_edge->dest) 9620 && (tem->src == false_edge->dest 9621 || dominated_by_p (CDI_DOMINATORS, 9622 tem->src, false_edge->dest)))) 9623 e1 = tem; 9624 else 9625 return false; 9626 tem = EDGE_PRED (bb, 1); 9627 if (tem == true_edge 9628 || (single_pred_p (true_edge->dest) 9629 && (tem->src == true_edge->dest 9630 || dominated_by_p (CDI_DOMINATORS, 9631 tem->src, true_edge->dest)))) 9632 e0 = tem; 9633 else if (tem == false_edge 9634 || (single_pred_p (false_edge->dest) 9635 && (tem->src == false_edge->dest 9636 || dominated_by_p (CDI_DOMINATORS, 9637 tem->src, false_edge->dest)))) 9638 e1 = tem; 9639 else 9640 return false; 9641 if (!e0 || !e1) 9642 return false; 9643 9644 if (true_controlled_edge) 9645 *true_controlled_edge = e0; 9646 if (false_controlled_edge) 9647 *false_controlled_edge = e1; 9648 9649 return true; 9650 } 9651 9652 /* Generate a range test LHS CODE RHS that determines whether INDEX is in the 9653 range [low, high]. Place associated stmts before *GSI. */ 9654 9655 void 9656 generate_range_test (basic_block bb, tree index, tree low, tree high, 9657 tree *lhs, tree *rhs) 9658 { 9659 tree type = TREE_TYPE (index); 9660 tree utype = range_check_type (type); 9661 9662 low = fold_convert (utype, low); 9663 high = fold_convert (utype, high); 9664 9665 gimple_seq seq = NULL; 9666 index = gimple_convert (&seq, utype, index); 9667 *lhs = gimple_build (&seq, MINUS_EXPR, utype, index, low); 9668 *rhs = const_binop (MINUS_EXPR, utype, high, low); 9669 9670 gimple_stmt_iterator gsi = gsi_last_bb (bb); 9671 gsi_insert_seq_before (&gsi, seq, GSI_SAME_STMT); 9672 } 9673 9674 /* Return the basic block that belongs to label numbered INDEX 9675 of a switch statement. */ 9676 9677 basic_block 9678 gimple_switch_label_bb (function *ifun, gswitch *gs, unsigned index) 9679 { 9680 return label_to_block (ifun, CASE_LABEL (gimple_switch_label (gs, index))); 9681 } 9682 9683 /* Return the default basic block of a switch statement. */ 9684 9685 basic_block 9686 gimple_switch_default_bb (function *ifun, gswitch *gs) 9687 { 9688 return gimple_switch_label_bb (ifun, gs, 0); 9689 } 9690 9691 /* Return the edge that belongs to label numbered INDEX 9692 of a switch statement. */ 9693 9694 edge 9695 gimple_switch_edge (function *ifun, gswitch *gs, unsigned index) 9696 { 9697 return find_edge (gimple_bb (gs), gimple_switch_label_bb (ifun, gs, index)); 9698 } 9699 9700 /* Return the default edge of a switch statement. */ 9701 9702 edge 9703 gimple_switch_default_edge (function *ifun, gswitch *gs) 9704 { 9705 return gimple_switch_edge (ifun, gs, 0); 9706 } 9707 9708 /* Return true if the only executable statement in BB is a GIMPLE_COND. */ 9709 9710 bool 9711 cond_only_block_p (basic_block bb) 9712 { 9713 /* BB must have no executable statements. */ 9714 gimple_stmt_iterator gsi = gsi_after_labels (bb); 9715 if (phi_nodes (bb)) 9716 return false; 9717 while (!gsi_end_p (gsi)) 9718 { 9719 gimple *stmt = gsi_stmt (gsi); 9720 if (is_gimple_debug (stmt)) 9721 ; 9722 else if (gimple_code (stmt) == GIMPLE_NOP 9723 || gimple_code (stmt) == GIMPLE_PREDICT 9724 || gimple_code (stmt) == GIMPLE_COND) 9725 ; 9726 else 9727 return false; 9728 gsi_next (&gsi); 9729 } 9730 return true; 9731 } 9732 9733 9734 /* Emit return warnings. */ 9735 9736 namespace { 9737 9738 const pass_data pass_data_warn_function_return = 9739 { 9740 GIMPLE_PASS, /* type */ 9741 "*warn_function_return", /* name */ 9742 OPTGROUP_NONE, /* optinfo_flags */ 9743 TV_NONE, /* tv_id */ 9744 PROP_cfg, /* properties_required */ 9745 0, /* properties_provided */ 9746 0, /* properties_destroyed */ 9747 0, /* todo_flags_start */ 9748 0, /* todo_flags_finish */ 9749 }; 9750 9751 class pass_warn_function_return : public gimple_opt_pass 9752 { 9753 public: 9754 pass_warn_function_return (gcc::context *ctxt) 9755 : gimple_opt_pass (pass_data_warn_function_return, ctxt) 9756 {} 9757 9758 /* opt_pass methods: */ 9759 unsigned int execute (function *) final override; 9760 9761 }; // class pass_warn_function_return 9762 9763 unsigned int 9764 pass_warn_function_return::execute (function *fun) 9765 { 9766 location_t location; 9767 gimple *last; 9768 edge e; 9769 edge_iterator ei; 9770 9771 if (!targetm.warn_func_return (fun->decl)) 9772 return 0; 9773 9774 /* If we have a path to EXIT, then we do return. */ 9775 if (TREE_THIS_VOLATILE (fun->decl) 9776 && EDGE_COUNT (EXIT_BLOCK_PTR_FOR_FN (fun)->preds) > 0) 9777 { 9778 location = UNKNOWN_LOCATION; 9779 for (ei = ei_start (EXIT_BLOCK_PTR_FOR_FN (fun)->preds); 9780 (e = ei_safe_edge (ei)); ) 9781 { 9782 last = *gsi_last_bb (e->src); 9783 if ((gimple_code (last) == GIMPLE_RETURN 9784 || gimple_call_builtin_p (last, BUILT_IN_RETURN)) 9785 && location == UNKNOWN_LOCATION 9786 && ((location = LOCATION_LOCUS (gimple_location (last))) 9787 != UNKNOWN_LOCATION) 9788 && !optimize) 9789 break; 9790 /* When optimizing, replace return stmts in noreturn functions 9791 with __builtin_unreachable () call. */ 9792 if (optimize && gimple_code (last) == GIMPLE_RETURN) 9793 { 9794 location_t loc = gimple_location (last); 9795 gimple *new_stmt = gimple_build_builtin_unreachable (loc); 9796 gimple_stmt_iterator gsi = gsi_for_stmt (last); 9797 gsi_replace (&gsi, new_stmt, true); 9798 remove_edge (e); 9799 } 9800 else 9801 ei_next (&ei); 9802 } 9803 if (location == UNKNOWN_LOCATION) 9804 location = cfun->function_end_locus; 9805 9806 #ifdef notyet 9807 if (warn_missing_noreturn) 9808 warning_at (location, 0, "%<noreturn%> function does return"); 9809 #endif 9810 } 9811 9812 /* If we see "return;" in some basic block, then we do reach the end 9813 without returning a value. */ 9814 else if (warn_return_type > 0 9815 && !warning_suppressed_p (fun->decl, OPT_Wreturn_type) 9816 && !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (fun->decl)))) 9817 { 9818 FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR_FOR_FN (fun)->preds) 9819 { 9820 greturn *return_stmt = dyn_cast <greturn *> (*gsi_last_bb (e->src)); 9821 if (return_stmt 9822 && gimple_return_retval (return_stmt) == NULL 9823 && !warning_suppressed_p (return_stmt, OPT_Wreturn_type)) 9824 { 9825 location = gimple_location (return_stmt); 9826 if (LOCATION_LOCUS (location) == UNKNOWN_LOCATION) 9827 location = fun->function_end_locus; 9828 if (warning_at (location, OPT_Wreturn_type, 9829 "control reaches end of non-void function")) 9830 suppress_warning (fun->decl, OPT_Wreturn_type); 9831 break; 9832 } 9833 } 9834 /* The C++ FE turns fallthrough from the end of non-void function 9835 into __builtin_unreachable () call with BUILTINS_LOCATION. 9836 Recognize those as well as calls from ubsan_instrument_return. */ 9837 basic_block bb; 9838 if (!warning_suppressed_p (fun->decl, OPT_Wreturn_type)) 9839 FOR_EACH_BB_FN (bb, fun) 9840 if (EDGE_COUNT (bb->succs) == 0) 9841 { 9842 gimple *last = *gsi_last_bb (bb); 9843 const enum built_in_function ubsan_missing_ret 9844 = BUILT_IN_UBSAN_HANDLE_MISSING_RETURN; 9845 if (last 9846 && ((LOCATION_LOCUS (gimple_location (last)) 9847 == BUILTINS_LOCATION 9848 && (gimple_call_builtin_p (last, BUILT_IN_UNREACHABLE) 9849 || gimple_call_builtin_p (last, 9850 BUILT_IN_UNREACHABLE_TRAP) 9851 || gimple_call_builtin_p (last, BUILT_IN_TRAP))) 9852 || gimple_call_builtin_p (last, ubsan_missing_ret))) 9853 { 9854 gimple_stmt_iterator gsi = gsi_for_stmt (last); 9855 gsi_prev_nondebug (&gsi); 9856 gimple *prev = gsi_stmt (gsi); 9857 if (prev == NULL) 9858 location = UNKNOWN_LOCATION; 9859 else 9860 location = gimple_location (prev); 9861 if (LOCATION_LOCUS (location) == UNKNOWN_LOCATION) 9862 location = fun->function_end_locus; 9863 if (warning_at (location, OPT_Wreturn_type, 9864 "control reaches end of non-void function")) 9865 suppress_warning (fun->decl, OPT_Wreturn_type); 9866 break; 9867 } 9868 } 9869 } 9870 return 0; 9871 } 9872 9873 } // anon namespace 9874 9875 gimple_opt_pass * 9876 make_pass_warn_function_return (gcc::context *ctxt) 9877 { 9878 return new pass_warn_function_return (ctxt); 9879 } 9880 9881 /* Walk a gimplified function and warn for functions whose return value is 9882 ignored and attribute((warn_unused_result)) is set. This is done before 9883 inlining, so we don't have to worry about that. */ 9884 9885 static void 9886 do_warn_unused_result (gimple_seq seq) 9887 { 9888 tree fdecl, ftype; 9889 gimple_stmt_iterator i; 9890 9891 for (i = gsi_start (seq); !gsi_end_p (i); gsi_next (&i)) 9892 { 9893 gimple *g = gsi_stmt (i); 9894 9895 switch (gimple_code (g)) 9896 { 9897 case GIMPLE_BIND: 9898 do_warn_unused_result (gimple_bind_body (as_a <gbind *>(g))); 9899 break; 9900 case GIMPLE_TRY: 9901 do_warn_unused_result (gimple_try_eval (g)); 9902 do_warn_unused_result (gimple_try_cleanup (g)); 9903 break; 9904 case GIMPLE_CATCH: 9905 do_warn_unused_result (gimple_catch_handler ( 9906 as_a <gcatch *> (g))); 9907 break; 9908 case GIMPLE_EH_FILTER: 9909 do_warn_unused_result (gimple_eh_filter_failure (g)); 9910 break; 9911 9912 case GIMPLE_CALL: 9913 if (gimple_call_lhs (g)) 9914 break; 9915 if (gimple_call_internal_p (g)) 9916 break; 9917 9918 /* This is a naked call, as opposed to a GIMPLE_CALL with an 9919 LHS. All calls whose value is ignored should be 9920 represented like this. Look for the attribute. */ 9921 fdecl = gimple_call_fndecl (g); 9922 ftype = gimple_call_fntype (g); 9923 9924 if (lookup_attribute ("warn_unused_result", TYPE_ATTRIBUTES (ftype))) 9925 { 9926 location_t loc = gimple_location (g); 9927 9928 if (fdecl) 9929 warning_at (loc, OPT_Wunused_result, 9930 "ignoring return value of %qD " 9931 "declared with attribute %<warn_unused_result%>", 9932 fdecl); 9933 else 9934 warning_at (loc, OPT_Wunused_result, 9935 "ignoring return value of function " 9936 "declared with attribute %<warn_unused_result%>"); 9937 } 9938 break; 9939 9940 default: 9941 /* Not a container, not a call, or a call whose value is used. */ 9942 break; 9943 } 9944 } 9945 } 9946 9947 namespace { 9948 9949 const pass_data pass_data_warn_unused_result = 9950 { 9951 GIMPLE_PASS, /* type */ 9952 "*warn_unused_result", /* name */ 9953 OPTGROUP_NONE, /* optinfo_flags */ 9954 TV_NONE, /* tv_id */ 9955 PROP_gimple_any, /* properties_required */ 9956 0, /* properties_provided */ 9957 0, /* properties_destroyed */ 9958 0, /* todo_flags_start */ 9959 0, /* todo_flags_finish */ 9960 }; 9961 9962 class pass_warn_unused_result : public gimple_opt_pass 9963 { 9964 public: 9965 pass_warn_unused_result (gcc::context *ctxt) 9966 : gimple_opt_pass (pass_data_warn_unused_result, ctxt) 9967 {} 9968 9969 /* opt_pass methods: */ 9970 bool gate (function *) final override { return flag_warn_unused_result; } 9971 unsigned int execute (function *) final override 9972 { 9973 do_warn_unused_result (gimple_body (current_function_decl)); 9974 return 0; 9975 } 9976 9977 }; // class pass_warn_unused_result 9978 9979 } // anon namespace 9980 9981 gimple_opt_pass * 9982 make_pass_warn_unused_result (gcc::context *ctxt) 9983 { 9984 return new pass_warn_unused_result (ctxt); 9985 } 9986 9987 /* Maybe Remove stores to variables we marked write-only. 9988 Return true if a store was removed. */ 9989 static bool 9990 maybe_remove_writeonly_store (gimple_stmt_iterator &gsi, gimple *stmt, 9991 bitmap dce_ssa_names) 9992 { 9993 /* Keep access when store has side effect, i.e. in case when source 9994 is volatile. */ 9995 if (!gimple_store_p (stmt) 9996 || gimple_has_side_effects (stmt) 9997 || optimize_debug) 9998 return false; 9999 10000 tree lhs = get_base_address (gimple_get_lhs (stmt)); 10001 10002 if (!VAR_P (lhs) 10003 || (!TREE_STATIC (lhs) && !DECL_EXTERNAL (lhs)) 10004 || !varpool_node::get (lhs)->writeonly) 10005 return false; 10006 10007 if (dump_file && (dump_flags & TDF_DETAILS)) 10008 { 10009 fprintf (dump_file, "Removing statement, writes" 10010 " to write only var:\n"); 10011 print_gimple_stmt (dump_file, stmt, 0, 10012 TDF_VOPS|TDF_MEMSYMS); 10013 } 10014 10015 /* Mark ssa name defining to be checked for simple dce. */ 10016 if (gimple_assign_single_p (stmt)) 10017 { 10018 tree rhs = gimple_assign_rhs1 (stmt); 10019 if (TREE_CODE (rhs) == SSA_NAME 10020 && !SSA_NAME_IS_DEFAULT_DEF (rhs)) 10021 bitmap_set_bit (dce_ssa_names, SSA_NAME_VERSION (rhs)); 10022 } 10023 unlink_stmt_vdef (stmt); 10024 gsi_remove (&gsi, true); 10025 release_defs (stmt); 10026 return true; 10027 } 10028 10029 /* IPA passes, compilation of earlier functions or inlining 10030 might have changed some properties, such as marked functions nothrow, 10031 pure, const or noreturn. 10032 Remove redundant edges and basic blocks, and create new ones if necessary. */ 10033 10034 unsigned int 10035 execute_fixup_cfg (void) 10036 { 10037 basic_block bb; 10038 gimple_stmt_iterator gsi; 10039 int todo = 0; 10040 cgraph_node *node = cgraph_node::get (current_function_decl); 10041 /* Same scaling is also done by ipa_merge_profiles. */ 10042 profile_count num = node->count; 10043 profile_count den = ENTRY_BLOCK_PTR_FOR_FN (cfun)->count; 10044 bool scale = num.initialized_p () && !(num == den); 10045 auto_bitmap dce_ssa_names; 10046 10047 if (scale) 10048 { 10049 profile_count::adjust_for_ipa_scaling (&num, &den); 10050 ENTRY_BLOCK_PTR_FOR_FN (cfun)->count = node->count; 10051 EXIT_BLOCK_PTR_FOR_FN (cfun)->count 10052 = EXIT_BLOCK_PTR_FOR_FN (cfun)->count.apply_scale (num, den); 10053 } 10054 10055 FOR_EACH_BB_FN (bb, cfun) 10056 { 10057 if (scale) 10058 bb->count = bb->count.apply_scale (num, den); 10059 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi);) 10060 { 10061 gimple *stmt = gsi_stmt (gsi); 10062 tree decl = is_gimple_call (stmt) 10063 ? gimple_call_fndecl (stmt) 10064 : NULL; 10065 if (decl) 10066 { 10067 int flags = gimple_call_flags (stmt); 10068 if (flags & (ECF_CONST | ECF_PURE | ECF_LOOPING_CONST_OR_PURE)) 10069 { 10070 if (gimple_in_ssa_p (cfun)) 10071 { 10072 todo |= TODO_update_ssa | TODO_cleanup_cfg; 10073 update_stmt (stmt); 10074 } 10075 } 10076 if (flags & ECF_NORETURN 10077 && fixup_noreturn_call (stmt)) 10078 todo |= TODO_cleanup_cfg; 10079 } 10080 10081 /* Remove stores to variables we marked write-only. */ 10082 if (maybe_remove_writeonly_store (gsi, stmt, dce_ssa_names)) 10083 { 10084 todo |= TODO_update_ssa | TODO_cleanup_cfg; 10085 continue; 10086 } 10087 10088 /* For calls we can simply remove LHS when it is known 10089 to be write-only. */ 10090 if (is_gimple_call (stmt) 10091 && gimple_get_lhs (stmt)) 10092 { 10093 tree lhs = get_base_address (gimple_get_lhs (stmt)); 10094 10095 if (VAR_P (lhs) 10096 && (TREE_STATIC (lhs) || DECL_EXTERNAL (lhs)) 10097 && varpool_node::get (lhs)->writeonly) 10098 { 10099 gimple_call_set_lhs (stmt, NULL); 10100 update_stmt (stmt); 10101 todo |= TODO_update_ssa | TODO_cleanup_cfg; 10102 } 10103 } 10104 10105 gsi_next (&gsi); 10106 } 10107 if (gimple *last = *gsi_last_bb (bb)) 10108 { 10109 if (maybe_clean_eh_stmt (last) 10110 && gimple_purge_dead_eh_edges (bb)) 10111 todo |= TODO_cleanup_cfg; 10112 if (gimple_purge_dead_abnormal_call_edges (bb)) 10113 todo |= TODO_cleanup_cfg; 10114 } 10115 10116 /* If we have a basic block with no successors that does not 10117 end with a control statement or a noreturn call end it with 10118 a call to __builtin_unreachable. This situation can occur 10119 when inlining a noreturn call that does in fact return. */ 10120 if (EDGE_COUNT (bb->succs) == 0) 10121 { 10122 gimple *stmt = last_nondebug_stmt (bb); 10123 if (!stmt 10124 || (!is_ctrl_stmt (stmt) 10125 && (!is_gimple_call (stmt) 10126 || !gimple_call_noreturn_p (stmt)))) 10127 { 10128 if (stmt && is_gimple_call (stmt)) 10129 gimple_call_set_ctrl_altering (stmt, false); 10130 stmt = gimple_build_builtin_unreachable (UNKNOWN_LOCATION); 10131 gimple_stmt_iterator gsi = gsi_last_bb (bb); 10132 gsi_insert_after (&gsi, stmt, GSI_NEW_STMT); 10133 if (!cfun->after_inlining) 10134 if (tree fndecl = gimple_call_fndecl (stmt)) 10135 { 10136 gcall *call_stmt = dyn_cast <gcall *> (stmt); 10137 node->create_edge (cgraph_node::get_create (fndecl), 10138 call_stmt, bb->count); 10139 } 10140 } 10141 } 10142 } 10143 if (scale) 10144 { 10145 update_max_bb_count (); 10146 compute_function_frequency (); 10147 } 10148 10149 if (current_loops 10150 && (todo & TODO_cleanup_cfg)) 10151 loops_state_set (LOOPS_NEED_FIXUP); 10152 10153 simple_dce_from_worklist (dce_ssa_names); 10154 10155 return todo; 10156 } 10157 10158 namespace { 10159 10160 const pass_data pass_data_fixup_cfg = 10161 { 10162 GIMPLE_PASS, /* type */ 10163 "fixup_cfg", /* name */ 10164 OPTGROUP_NONE, /* optinfo_flags */ 10165 TV_NONE, /* tv_id */ 10166 PROP_cfg, /* properties_required */ 10167 0, /* properties_provided */ 10168 0, /* properties_destroyed */ 10169 0, /* todo_flags_start */ 10170 0, /* todo_flags_finish */ 10171 }; 10172 10173 class pass_fixup_cfg : public gimple_opt_pass 10174 { 10175 public: 10176 pass_fixup_cfg (gcc::context *ctxt) 10177 : gimple_opt_pass (pass_data_fixup_cfg, ctxt) 10178 {} 10179 10180 /* opt_pass methods: */ 10181 opt_pass * clone () final override { return new pass_fixup_cfg (m_ctxt); } 10182 unsigned int execute (function *) final override 10183 { 10184 return execute_fixup_cfg (); 10185 } 10186 10187 }; // class pass_fixup_cfg 10188 10189 } // anon namespace 10190 10191 gimple_opt_pass * 10192 make_pass_fixup_cfg (gcc::context *ctxt) 10193 { 10194 return new pass_fixup_cfg (ctxt); 10195 } 10196 10197 /* Garbage collection support for edge_def. */ 10198 10199 extern void gt_ggc_mx (tree&); 10200 extern void gt_ggc_mx (gimple *&); 10201 extern void gt_ggc_mx (rtx&); 10202 extern void gt_ggc_mx (basic_block&); 10203 10204 static void 10205 gt_ggc_mx (rtx_insn *& x) 10206 { 10207 if (x) 10208 gt_ggc_mx_rtx_def ((void *) x); 10209 } 10210 10211 void 10212 gt_ggc_mx (edge_def *e) 10213 { 10214 tree block = LOCATION_BLOCK (e->goto_locus); 10215 gt_ggc_mx (e->src); 10216 gt_ggc_mx (e->dest); 10217 if (current_ir_type () == IR_GIMPLE) 10218 gt_ggc_mx (e->insns.g); 10219 else 10220 gt_ggc_mx (e->insns.r); 10221 gt_ggc_mx (block); 10222 } 10223 10224 /* PCH support for edge_def. */ 10225 10226 extern void gt_pch_nx (tree&); 10227 extern void gt_pch_nx (gimple *&); 10228 extern void gt_pch_nx (rtx&); 10229 extern void gt_pch_nx (basic_block&); 10230 10231 static void 10232 gt_pch_nx (rtx_insn *& x) 10233 { 10234 if (x) 10235 gt_pch_nx_rtx_def ((void *) x); 10236 } 10237 10238 void 10239 gt_pch_nx (edge_def *e) 10240 { 10241 tree block = LOCATION_BLOCK (e->goto_locus); 10242 gt_pch_nx (e->src); 10243 gt_pch_nx (e->dest); 10244 if (current_ir_type () == IR_GIMPLE) 10245 gt_pch_nx (e->insns.g); 10246 else 10247 gt_pch_nx (e->insns.r); 10248 gt_pch_nx (block); 10249 } 10250 10251 void 10252 gt_pch_nx (edge_def *e, gt_pointer_operator op, void *cookie) 10253 { 10254 tree block = LOCATION_BLOCK (e->goto_locus); 10255 op (&(e->src), NULL, cookie); 10256 op (&(e->dest), NULL, cookie); 10257 if (current_ir_type () == IR_GIMPLE) 10258 op (&(e->insns.g), NULL, cookie); 10259 else 10260 op (&(e->insns.r), NULL, cookie); 10261 op (&(block), &(block), cookie); 10262 } 10263 10264 #if CHECKING_P 10265 10266 namespace selftest { 10267 10268 /* Helper function for CFG selftests: create a dummy function decl 10269 and push it as cfun. */ 10270 10271 static tree 10272 push_fndecl (const char *name) 10273 { 10274 tree fn_type = build_function_type_array (integer_type_node, 0, NULL); 10275 /* FIXME: this uses input_location: */ 10276 tree fndecl = build_fn_decl (name, fn_type); 10277 tree retval = build_decl (UNKNOWN_LOCATION, RESULT_DECL, 10278 NULL_TREE, integer_type_node); 10279 DECL_RESULT (fndecl) = retval; 10280 push_struct_function (fndecl); 10281 function *fun = DECL_STRUCT_FUNCTION (fndecl); 10282 ASSERT_TRUE (fun != NULL); 10283 init_empty_tree_cfg_for_function (fun); 10284 ASSERT_EQ (2, n_basic_blocks_for_fn (fun)); 10285 ASSERT_EQ (0, n_edges_for_fn (fun)); 10286 return fndecl; 10287 } 10288 10289 /* These tests directly create CFGs. 10290 Compare with the static fns within tree-cfg.cc: 10291 - build_gimple_cfg 10292 - make_blocks: calls create_basic_block (seq, bb); 10293 - make_edges. */ 10294 10295 /* Verify a simple cfg of the form: 10296 ENTRY -> A -> B -> C -> EXIT. */ 10297 10298 static void 10299 test_linear_chain () 10300 { 10301 gimple_register_cfg_hooks (); 10302 10303 tree fndecl = push_fndecl ("cfg_test_linear_chain"); 10304 function *fun = DECL_STRUCT_FUNCTION (fndecl); 10305 10306 /* Create some empty blocks. */ 10307 basic_block bb_a = create_empty_bb (ENTRY_BLOCK_PTR_FOR_FN (fun)); 10308 basic_block bb_b = create_empty_bb (bb_a); 10309 basic_block bb_c = create_empty_bb (bb_b); 10310 10311 ASSERT_EQ (5, n_basic_blocks_for_fn (fun)); 10312 ASSERT_EQ (0, n_edges_for_fn (fun)); 10313 10314 /* Create some edges: a simple linear chain of BBs. */ 10315 make_edge (ENTRY_BLOCK_PTR_FOR_FN (fun), bb_a, EDGE_FALLTHRU); 10316 make_edge (bb_a, bb_b, 0); 10317 make_edge (bb_b, bb_c, 0); 10318 make_edge (bb_c, EXIT_BLOCK_PTR_FOR_FN (fun), 0); 10319 10320 /* Verify the edges. */ 10321 ASSERT_EQ (4, n_edges_for_fn (fun)); 10322 ASSERT_EQ (NULL, ENTRY_BLOCK_PTR_FOR_FN (fun)->preds); 10323 ASSERT_EQ (1, ENTRY_BLOCK_PTR_FOR_FN (fun)->succs->length ()); 10324 ASSERT_EQ (1, bb_a->preds->length ()); 10325 ASSERT_EQ (1, bb_a->succs->length ()); 10326 ASSERT_EQ (1, bb_b->preds->length ()); 10327 ASSERT_EQ (1, bb_b->succs->length ()); 10328 ASSERT_EQ (1, bb_c->preds->length ()); 10329 ASSERT_EQ (1, bb_c->succs->length ()); 10330 ASSERT_EQ (1, EXIT_BLOCK_PTR_FOR_FN (fun)->preds->length ()); 10331 ASSERT_EQ (NULL, EXIT_BLOCK_PTR_FOR_FN (fun)->succs); 10332 10333 /* Verify the dominance information 10334 Each BB in our simple chain should be dominated by the one before 10335 it. */ 10336 calculate_dominance_info (CDI_DOMINATORS); 10337 ASSERT_EQ (bb_a, get_immediate_dominator (CDI_DOMINATORS, bb_b)); 10338 ASSERT_EQ (bb_b, get_immediate_dominator (CDI_DOMINATORS, bb_c)); 10339 auto_vec<basic_block> dom_by_b = get_dominated_by (CDI_DOMINATORS, bb_b); 10340 ASSERT_EQ (1, dom_by_b.length ()); 10341 ASSERT_EQ (bb_c, dom_by_b[0]); 10342 free_dominance_info (CDI_DOMINATORS); 10343 10344 /* Similarly for post-dominance: each BB in our chain is post-dominated 10345 by the one after it. */ 10346 calculate_dominance_info (CDI_POST_DOMINATORS); 10347 ASSERT_EQ (bb_b, get_immediate_dominator (CDI_POST_DOMINATORS, bb_a)); 10348 ASSERT_EQ (bb_c, get_immediate_dominator (CDI_POST_DOMINATORS, bb_b)); 10349 auto_vec<basic_block> postdom_by_b = get_dominated_by (CDI_POST_DOMINATORS, bb_b); 10350 ASSERT_EQ (1, postdom_by_b.length ()); 10351 ASSERT_EQ (bb_a, postdom_by_b[0]); 10352 free_dominance_info (CDI_POST_DOMINATORS); 10353 10354 pop_cfun (); 10355 } 10356 10357 /* Verify a simple CFG of the form: 10358 ENTRY 10359 | 10360 A 10361 / \ 10362 /t \f 10363 B C 10364 \ / 10365 \ / 10366 D 10367 | 10368 EXIT. */ 10369 10370 static void 10371 test_diamond () 10372 { 10373 gimple_register_cfg_hooks (); 10374 10375 tree fndecl = push_fndecl ("cfg_test_diamond"); 10376 function *fun = DECL_STRUCT_FUNCTION (fndecl); 10377 10378 /* Create some empty blocks. */ 10379 basic_block bb_a = create_empty_bb (ENTRY_BLOCK_PTR_FOR_FN (fun)); 10380 basic_block bb_b = create_empty_bb (bb_a); 10381 basic_block bb_c = create_empty_bb (bb_a); 10382 basic_block bb_d = create_empty_bb (bb_b); 10383 10384 ASSERT_EQ (6, n_basic_blocks_for_fn (fun)); 10385 ASSERT_EQ (0, n_edges_for_fn (fun)); 10386 10387 /* Create the edges. */ 10388 make_edge (ENTRY_BLOCK_PTR_FOR_FN (fun), bb_a, EDGE_FALLTHRU); 10389 make_edge (bb_a, bb_b, EDGE_TRUE_VALUE); 10390 make_edge (bb_a, bb_c, EDGE_FALSE_VALUE); 10391 make_edge (bb_b, bb_d, 0); 10392 make_edge (bb_c, bb_d, 0); 10393 make_edge (bb_d, EXIT_BLOCK_PTR_FOR_FN (fun), 0); 10394 10395 /* Verify the edges. */ 10396 ASSERT_EQ (6, n_edges_for_fn (fun)); 10397 ASSERT_EQ (1, bb_a->preds->length ()); 10398 ASSERT_EQ (2, bb_a->succs->length ()); 10399 ASSERT_EQ (1, bb_b->preds->length ()); 10400 ASSERT_EQ (1, bb_b->succs->length ()); 10401 ASSERT_EQ (1, bb_c->preds->length ()); 10402 ASSERT_EQ (1, bb_c->succs->length ()); 10403 ASSERT_EQ (2, bb_d->preds->length ()); 10404 ASSERT_EQ (1, bb_d->succs->length ()); 10405 10406 /* Verify the dominance information. */ 10407 calculate_dominance_info (CDI_DOMINATORS); 10408 ASSERT_EQ (bb_a, get_immediate_dominator (CDI_DOMINATORS, bb_b)); 10409 ASSERT_EQ (bb_a, get_immediate_dominator (CDI_DOMINATORS, bb_c)); 10410 ASSERT_EQ (bb_a, get_immediate_dominator (CDI_DOMINATORS, bb_d)); 10411 auto_vec<basic_block> dom_by_a = get_dominated_by (CDI_DOMINATORS, bb_a); 10412 ASSERT_EQ (3, dom_by_a.length ()); /* B, C, D, in some order. */ 10413 dom_by_a.release (); 10414 auto_vec<basic_block> dom_by_b = get_dominated_by (CDI_DOMINATORS, bb_b); 10415 ASSERT_EQ (0, dom_by_b.length ()); 10416 dom_by_b.release (); 10417 free_dominance_info (CDI_DOMINATORS); 10418 10419 /* Similarly for post-dominance. */ 10420 calculate_dominance_info (CDI_POST_DOMINATORS); 10421 ASSERT_EQ (bb_d, get_immediate_dominator (CDI_POST_DOMINATORS, bb_a)); 10422 ASSERT_EQ (bb_d, get_immediate_dominator (CDI_POST_DOMINATORS, bb_b)); 10423 ASSERT_EQ (bb_d, get_immediate_dominator (CDI_POST_DOMINATORS, bb_c)); 10424 auto_vec<basic_block> postdom_by_d = get_dominated_by (CDI_POST_DOMINATORS, bb_d); 10425 ASSERT_EQ (3, postdom_by_d.length ()); /* A, B, C in some order. */ 10426 postdom_by_d.release (); 10427 auto_vec<basic_block> postdom_by_b = get_dominated_by (CDI_POST_DOMINATORS, bb_b); 10428 ASSERT_EQ (0, postdom_by_b.length ()); 10429 postdom_by_b.release (); 10430 free_dominance_info (CDI_POST_DOMINATORS); 10431 10432 pop_cfun (); 10433 } 10434 10435 /* Verify that we can handle a CFG containing a "complete" aka 10436 fully-connected subgraph (where A B C D below all have edges 10437 pointing to each other node, also to themselves). 10438 e.g.: 10439 ENTRY EXIT 10440 | ^ 10441 | / 10442 | / 10443 | / 10444 V/ 10445 A<--->B 10446 ^^ ^^ 10447 | \ / | 10448 | X | 10449 | / \ | 10450 VV VV 10451 C<--->D 10452 */ 10453 10454 static void 10455 test_fully_connected () 10456 { 10457 gimple_register_cfg_hooks (); 10458 10459 tree fndecl = push_fndecl ("cfg_fully_connected"); 10460 function *fun = DECL_STRUCT_FUNCTION (fndecl); 10461 10462 const int n = 4; 10463 10464 /* Create some empty blocks. */ 10465 auto_vec <basic_block> subgraph_nodes; 10466 for (int i = 0; i < n; i++) 10467 subgraph_nodes.safe_push (create_empty_bb (ENTRY_BLOCK_PTR_FOR_FN (fun))); 10468 10469 ASSERT_EQ (n + 2, n_basic_blocks_for_fn (fun)); 10470 ASSERT_EQ (0, n_edges_for_fn (fun)); 10471 10472 /* Create the edges. */ 10473 make_edge (ENTRY_BLOCK_PTR_FOR_FN (fun), subgraph_nodes[0], EDGE_FALLTHRU); 10474 make_edge (subgraph_nodes[0], EXIT_BLOCK_PTR_FOR_FN (fun), 0); 10475 for (int i = 0; i < n; i++) 10476 for (int j = 0; j < n; j++) 10477 make_edge (subgraph_nodes[i], subgraph_nodes[j], 0); 10478 10479 /* Verify the edges. */ 10480 ASSERT_EQ (2 + (n * n), n_edges_for_fn (fun)); 10481 /* The first one is linked to ENTRY/EXIT as well as itself and 10482 everything else. */ 10483 ASSERT_EQ (n + 1, subgraph_nodes[0]->preds->length ()); 10484 ASSERT_EQ (n + 1, subgraph_nodes[0]->succs->length ()); 10485 /* The other ones in the subgraph are linked to everything in 10486 the subgraph (including themselves). */ 10487 for (int i = 1; i < n; i++) 10488 { 10489 ASSERT_EQ (n, subgraph_nodes[i]->preds->length ()); 10490 ASSERT_EQ (n, subgraph_nodes[i]->succs->length ()); 10491 } 10492 10493 /* Verify the dominance information. */ 10494 calculate_dominance_info (CDI_DOMINATORS); 10495 /* The initial block in the subgraph should be dominated by ENTRY. */ 10496 ASSERT_EQ (ENTRY_BLOCK_PTR_FOR_FN (fun), 10497 get_immediate_dominator (CDI_DOMINATORS, 10498 subgraph_nodes[0])); 10499 /* Every other block in the subgraph should be dominated by the 10500 initial block. */ 10501 for (int i = 1; i < n; i++) 10502 ASSERT_EQ (subgraph_nodes[0], 10503 get_immediate_dominator (CDI_DOMINATORS, 10504 subgraph_nodes[i])); 10505 free_dominance_info (CDI_DOMINATORS); 10506 10507 /* Similarly for post-dominance. */ 10508 calculate_dominance_info (CDI_POST_DOMINATORS); 10509 /* The initial block in the subgraph should be postdominated by EXIT. */ 10510 ASSERT_EQ (EXIT_BLOCK_PTR_FOR_FN (fun), 10511 get_immediate_dominator (CDI_POST_DOMINATORS, 10512 subgraph_nodes[0])); 10513 /* Every other block in the subgraph should be postdominated by the 10514 initial block, since that leads to EXIT. */ 10515 for (int i = 1; i < n; i++) 10516 ASSERT_EQ (subgraph_nodes[0], 10517 get_immediate_dominator (CDI_POST_DOMINATORS, 10518 subgraph_nodes[i])); 10519 free_dominance_info (CDI_POST_DOMINATORS); 10520 10521 pop_cfun (); 10522 } 10523 10524 /* Run all of the selftests within this file. */ 10525 10526 void 10527 tree_cfg_cc_tests () 10528 { 10529 test_linear_chain (); 10530 test_diamond (); 10531 test_fully_connected (); 10532 } 10533 10534 } // namespace selftest 10535 10536 /* TODO: test the dominator/postdominator logic with various graphs/nodes: 10537 - loop 10538 - nested loops 10539 - switch statement (a block with many out-edges) 10540 - something that jumps to itself 10541 - etc */ 10542 10543 #endif /* CHECKING_P */ 10544