1 1.1 mrg /* Hooks for cfg representation specific functions. 2 1.1 mrg Copyright (C) 2003-2022 Free Software Foundation, Inc. 3 1.1 mrg Contributed by Sebastian Pop <s.pop (at) laposte.net> 4 1.1 mrg 5 1.1 mrg This file is part of GCC. 6 1.1 mrg 7 1.1 mrg GCC is free software; you can redistribute it and/or modify 8 1.1 mrg it under the terms of the GNU General Public License as published by 9 1.1 mrg the Free Software Foundation; either version 3, or (at your option) 10 1.1 mrg any later version. 11 1.1 mrg 12 1.1 mrg GCC is distributed in the hope that it will be useful, 13 1.1 mrg but WITHOUT ANY WARRANTY; without even the implied warranty of 14 1.1 mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 1.1 mrg GNU General Public License for more details. 16 1.1 mrg 17 1.1 mrg You should have received a copy of the GNU General Public License 18 1.1 mrg along with GCC; see the file COPYING3. If not see 19 1.1 mrg <http://www.gnu.org/licenses/>. */ 20 1.1 mrg 21 1.1 mrg #include "config.h" 22 1.1 mrg #include "system.h" 23 1.1 mrg #include "coretypes.h" 24 1.1 mrg #include "backend.h" 25 1.1 mrg #include "rtl.h" 26 1.1 mrg #include "cfghooks.h" 27 1.1 mrg #include "timevar.h" 28 1.1 mrg #include "pretty-print.h" 29 1.1 mrg #include "diagnostic-core.h" 30 1.1 mrg #include "dumpfile.h" 31 1.1 mrg #include "cfganal.h" 32 1.1 mrg #include "tree.h" 33 1.1 mrg #include "tree-ssa.h" 34 1.1 mrg #include "cfgloop.h" 35 1.1 mrg #include "sreal.h" 36 1.1 mrg #include "profile.h" 37 1.1 mrg 38 1.1 mrg /* Disable warnings about missing quoting in GCC diagnostics. */ 39 1.1 mrg #if __GNUC__ >= 10 40 1.1 mrg # pragma GCC diagnostic push 41 1.1 mrg # pragma GCC diagnostic ignored "-Wformat-diag" 42 1.1 mrg #endif 43 1.1 mrg 44 1.1 mrg /* A pointer to one of the hooks containers. */ 45 1.1 mrg static struct cfg_hooks *cfg_hooks; 46 1.1 mrg 47 1.1 mrg /* Initialization of functions specific to the rtl IR. */ 48 1.1 mrg void 49 1.1 mrg rtl_register_cfg_hooks (void) 50 1.1 mrg { 51 1.1 mrg cfg_hooks = &rtl_cfg_hooks; 52 1.1 mrg } 53 1.1 mrg 54 1.1 mrg /* Initialization of functions specific to the rtl IR. */ 55 1.1 mrg void 56 1.1 mrg cfg_layout_rtl_register_cfg_hooks (void) 57 1.1 mrg { 58 1.1 mrg cfg_hooks = &cfg_layout_rtl_cfg_hooks; 59 1.1 mrg } 60 1.1 mrg 61 1.1 mrg /* Initialization of functions specific to the tree IR. */ 62 1.1 mrg 63 1.1 mrg void 64 1.1 mrg gimple_register_cfg_hooks (void) 65 1.1 mrg { 66 1.1 mrg cfg_hooks = &gimple_cfg_hooks; 67 1.1 mrg } 68 1.1 mrg 69 1.1 mrg struct cfg_hooks 70 1.1 mrg get_cfg_hooks (void) 71 1.1 mrg { 72 1.1 mrg return *cfg_hooks; 73 1.1 mrg } 74 1.1 mrg 75 1.1 mrg void 76 1.1 mrg set_cfg_hooks (struct cfg_hooks new_cfg_hooks) 77 1.1 mrg { 78 1.1 mrg *cfg_hooks = new_cfg_hooks; 79 1.1 mrg } 80 1.1 mrg 81 1.1 mrg /* Returns current ir type. */ 82 1.1 mrg 83 1.1 mrg enum ir_type 84 1.1 mrg current_ir_type (void) 85 1.1 mrg { 86 1.1 mrg if (cfg_hooks == &gimple_cfg_hooks) 87 1.1 mrg return IR_GIMPLE; 88 1.1 mrg else if (cfg_hooks == &rtl_cfg_hooks) 89 1.1 mrg return IR_RTL_CFGRTL; 90 1.1 mrg else if (cfg_hooks == &cfg_layout_rtl_cfg_hooks) 91 1.1 mrg return IR_RTL_CFGLAYOUT; 92 1.1 mrg else 93 1.1 mrg gcc_unreachable (); 94 1.1 mrg } 95 1.1 mrg 96 1.1 mrg /* Verify the CFG consistency. 97 1.1 mrg 98 1.1 mrg Currently it does following: checks edge and basic block list correctness 99 1.1 mrg and calls into IL dependent checking then. */ 100 1.1 mrg 101 1.1 mrg DEBUG_FUNCTION void 102 1.1 mrg verify_flow_info (void) 103 1.1 mrg { 104 1.1 mrg size_t *edge_checksum; 105 1.1 mrg int err = 0; 106 1.1 mrg basic_block bb, last_bb_seen; 107 1.1 mrg basic_block *last_visited; 108 1.1 mrg 109 1.1 mrg timevar_push (TV_CFG_VERIFY); 110 1.1 mrg last_visited = XCNEWVEC (basic_block, last_basic_block_for_fn (cfun)); 111 1.1 mrg edge_checksum = XCNEWVEC (size_t, last_basic_block_for_fn (cfun)); 112 1.1 mrg 113 1.1 mrg /* Check bb chain & numbers. */ 114 1.1 mrg last_bb_seen = ENTRY_BLOCK_PTR_FOR_FN (cfun); 115 1.1 mrg FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb, NULL, next_bb) 116 1.1 mrg { 117 1.1 mrg if (bb != EXIT_BLOCK_PTR_FOR_FN (cfun) 118 1.1 mrg && bb != BASIC_BLOCK_FOR_FN (cfun, bb->index)) 119 1.1 mrg { 120 1.1 mrg error ("bb %d on wrong place", bb->index); 121 1.1 mrg err = 1; 122 1.1 mrg } 123 1.1 mrg 124 1.1 mrg if (bb->prev_bb != last_bb_seen) 125 1.1 mrg { 126 1.1 mrg error ("prev_bb of %d should be %d, not %d", 127 1.1 mrg bb->index, last_bb_seen->index, bb->prev_bb->index); 128 1.1 mrg err = 1; 129 1.1 mrg } 130 1.1 mrg 131 1.1 mrg last_bb_seen = bb; 132 1.1 mrg } 133 1.1 mrg 134 1.1 mrg /* Now check the basic blocks (boundaries etc.) */ 135 1.1 mrg FOR_EACH_BB_REVERSE_FN (bb, cfun) 136 1.1 mrg { 137 1.1 mrg int n_fallthru = 0; 138 1.1 mrg edge e; 139 1.1 mrg edge_iterator ei; 140 1.1 mrg 141 1.1 mrg if (bb->loop_father != NULL && current_loops == NULL) 142 1.1 mrg { 143 1.1 mrg error ("verify_flow_info: Block %i has loop_father, but there are no loops", 144 1.1 mrg bb->index); 145 1.1 mrg err = 1; 146 1.1 mrg } 147 1.1 mrg if (bb->loop_father == NULL && current_loops != NULL) 148 1.1 mrg { 149 1.1 mrg error ("verify_flow_info: Block %i lacks loop_father", bb->index); 150 1.1 mrg err = 1; 151 1.1 mrg } 152 1.1 mrg 153 1.1 mrg if (!bb->count.verify ()) 154 1.1 mrg { 155 1.1 mrg error ("verify_flow_info: Wrong count of block %i", bb->index); 156 1.1 mrg err = 1; 157 1.1 mrg } 158 1.1 mrg /* FIXME: Graphite and SLJL and target code still tends to produce 159 1.1 mrg edges with no probability. */ 160 1.1 mrg if (profile_status_for_fn (cfun) >= PROFILE_GUESSED 161 1.1 mrg && !bb->count.initialized_p () && !flag_graphite && 0) 162 1.1 mrg { 163 1.1 mrg error ("verify_flow_info: Missing count of block %i", bb->index); 164 1.1 mrg err = 1; 165 1.1 mrg } 166 1.1 mrg 167 1.1 mrg if (bb->flags & ~cfun->cfg->bb_flags_allocated) 168 1.1 mrg { 169 1.1 mrg error ("verify_flow_info: unallocated flag set on BB %d", bb->index); 170 1.1 mrg err = 1; 171 1.1 mrg } 172 1.1 mrg 173 1.1 mrg FOR_EACH_EDGE (e, ei, bb->succs) 174 1.1 mrg { 175 1.1 mrg if (last_visited [e->dest->index] == bb) 176 1.1 mrg { 177 1.1 mrg error ("verify_flow_info: Duplicate edge %i->%i", 178 1.1 mrg e->src->index, e->dest->index); 179 1.1 mrg err = 1; 180 1.1 mrg } 181 1.1 mrg /* FIXME: Graphite and SLJL and target code still tends to produce 182 1.1 mrg edges with no probability. */ 183 1.1 mrg if (profile_status_for_fn (cfun) >= PROFILE_GUESSED 184 1.1 mrg && !e->probability.initialized_p () && !flag_graphite && 0) 185 1.1 mrg { 186 1.1 mrg error ("Uninitialized probability of edge %i->%i", e->src->index, 187 1.1 mrg e->dest->index); 188 1.1 mrg err = 1; 189 1.1 mrg } 190 1.1 mrg if (!e->probability.verify ()) 191 1.1 mrg { 192 1.1 mrg error ("verify_flow_info: Wrong probability of edge %i->%i", 193 1.1 mrg e->src->index, e->dest->index); 194 1.1 mrg err = 1; 195 1.1 mrg } 196 1.1 mrg 197 1.1 mrg last_visited [e->dest->index] = bb; 198 1.1 mrg 199 1.1 mrg if (e->flags & EDGE_FALLTHRU) 200 1.1 mrg n_fallthru++; 201 1.1 mrg 202 1.1 mrg if (e->src != bb) 203 1.1 mrg { 204 1.1 mrg error ("verify_flow_info: Basic block %d succ edge is corrupted", 205 1.1 mrg bb->index); 206 1.1 mrg fprintf (stderr, "Predecessor: "); 207 1.1 mrg dump_edge_info (stderr, e, TDF_DETAILS, 0); 208 1.1 mrg fprintf (stderr, "\nSuccessor: "); 209 1.1 mrg dump_edge_info (stderr, e, TDF_DETAILS, 1); 210 1.1 mrg fprintf (stderr, "\n"); 211 1.1 mrg err = 1; 212 1.1 mrg } 213 1.1 mrg 214 1.1 mrg if (e->flags & ~cfun->cfg->edge_flags_allocated) 215 1.1 mrg { 216 1.1 mrg error ("verify_flow_info: unallocated edge flag set on %d -> %d", 217 1.1 mrg e->src->index, e->dest->index); 218 1.1 mrg err = 1; 219 1.1 mrg } 220 1.1 mrg 221 1.1 mrg edge_checksum[e->dest->index] += (size_t) e; 222 1.1 mrg } 223 1.1 mrg if (n_fallthru > 1) 224 1.1 mrg { 225 1.1 mrg error ("wrong amount of branch edges after unconditional jump %i", bb->index); 226 1.1 mrg err = 1; 227 1.1 mrg } 228 1.1 mrg 229 1.1 mrg FOR_EACH_EDGE (e, ei, bb->preds) 230 1.1 mrg { 231 1.1 mrg if (e->dest != bb) 232 1.1 mrg { 233 1.1 mrg error ("basic block %d pred edge is corrupted", bb->index); 234 1.1 mrg fputs ("Predecessor: ", stderr); 235 1.1 mrg dump_edge_info (stderr, e, TDF_DETAILS, 0); 236 1.1 mrg fputs ("\nSuccessor: ", stderr); 237 1.1 mrg dump_edge_info (stderr, e, TDF_DETAILS, 1); 238 1.1 mrg fputc ('\n', stderr); 239 1.1 mrg err = 1; 240 1.1 mrg } 241 1.1 mrg 242 1.1 mrg if (ei.index != e->dest_idx) 243 1.1 mrg { 244 1.1 mrg error ("basic block %d pred edge is corrupted", bb->index); 245 1.1 mrg error ("its dest_idx should be %d, not %d", 246 1.1 mrg ei.index, e->dest_idx); 247 1.1 mrg fputs ("Predecessor: ", stderr); 248 1.1 mrg dump_edge_info (stderr, e, TDF_DETAILS, 0); 249 1.1 mrg fputs ("\nSuccessor: ", stderr); 250 1.1 mrg dump_edge_info (stderr, e, TDF_DETAILS, 1); 251 1.1 mrg fputc ('\n', stderr); 252 1.1 mrg err = 1; 253 1.1 mrg } 254 1.1 mrg 255 1.1 mrg edge_checksum[e->dest->index] -= (size_t) e; 256 1.1 mrg } 257 1.1 mrg } 258 1.1 mrg 259 1.1 mrg /* Complete edge checksumming for ENTRY and EXIT. */ 260 1.1 mrg { 261 1.1 mrg edge e; 262 1.1 mrg edge_iterator ei; 263 1.1 mrg 264 1.1 mrg FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR_FOR_FN (cfun)->succs) 265 1.1 mrg edge_checksum[e->dest->index] += (size_t) e; 266 1.1 mrg 267 1.1 mrg FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR_FOR_FN (cfun)->preds) 268 1.1 mrg edge_checksum[e->dest->index] -= (size_t) e; 269 1.1 mrg } 270 1.1 mrg 271 1.1 mrg FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun), NULL, next_bb) 272 1.1 mrg if (edge_checksum[bb->index]) 273 1.1 mrg { 274 1.1 mrg error ("basic block %i edge lists are corrupted", bb->index); 275 1.1 mrg err = 1; 276 1.1 mrg } 277 1.1 mrg 278 1.1 mrg /* Clean up. */ 279 1.1 mrg free (last_visited); 280 1.1 mrg free (edge_checksum); 281 1.1 mrg 282 1.1 mrg if (cfg_hooks->verify_flow_info) 283 1.1 mrg err |= cfg_hooks->verify_flow_info (); 284 1.1 mrg if (err) 285 1.1 mrg internal_error ("verify_flow_info failed"); 286 1.1 mrg timevar_pop (TV_CFG_VERIFY); 287 1.1 mrg } 288 1.1 mrg 289 1.1 mrg /* Print out one basic block BB to file OUTF. INDENT is printed at the 290 1.1 mrg start of each new line. FLAGS are the TDF_* flags in dumpfile.h. 291 1.1 mrg 292 1.1 mrg This function takes care of the purely graph related information. 293 1.1 mrg The cfg hook for the active representation should dump 294 1.1 mrg representation-specific information. */ 295 1.1 mrg 296 1.1 mrg void 297 1.1 mrg dump_bb (FILE *outf, basic_block bb, int indent, dump_flags_t flags) 298 1.1 mrg { 299 1.1 mrg if (flags & TDF_BLOCKS) 300 1.1 mrg dump_bb_info (outf, bb, indent, flags, true, false); 301 1.1 mrg if (cfg_hooks->dump_bb) 302 1.1 mrg cfg_hooks->dump_bb (outf, bb, indent, flags); 303 1.1 mrg if (flags & TDF_BLOCKS) 304 1.1 mrg dump_bb_info (outf, bb, indent, flags, false, true); 305 1.1 mrg fputc ('\n', outf); 306 1.1 mrg } 307 1.1 mrg 308 1.1 mrg DEBUG_FUNCTION void 309 1.1 mrg debug (basic_block_def &ref) 310 1.1 mrg { 311 1.1 mrg dump_bb (stderr, &ref, 0, TDF_NONE); 312 1.1 mrg } 313 1.1 mrg 314 1.1 mrg DEBUG_FUNCTION void 315 1.1 mrg debug (basic_block_def *ptr) 316 1.1 mrg { 317 1.1 mrg if (ptr) 318 1.1 mrg debug (*ptr); 319 1.1 mrg else 320 1.1 mrg fprintf (stderr, "<nil>\n"); 321 1.1 mrg } 322 1.1 mrg 323 1.1 mrg static void 324 1.1 mrg debug_slim (basic_block ptr) 325 1.1 mrg { 326 1.1 mrg fprintf (stderr, "<basic_block %p (%d)>", (void *) ptr, ptr->index); 327 1.1 mrg } 328 1.1 mrg 329 1.1 mrg DEFINE_DEBUG_VEC (basic_block_def *) 330 1.1 mrg DEFINE_DEBUG_HASH_SET (basic_block_def *) 331 1.1 mrg 332 1.1 mrg /* Dumps basic block BB to pretty-printer PP, for use as a label of 333 1.1 mrg a DOT graph record-node. The implementation of this hook is 334 1.1 mrg expected to write the label to the stream that is attached to PP. 335 1.1 mrg Field separators between instructions are pipe characters printed 336 1.1 mrg verbatim. Instructions should be written with some characters 337 1.1 mrg escaped, using pp_write_text_as_dot_label_to_stream(). */ 338 1.1 mrg 339 1.1 mrg void 340 1.1 mrg dump_bb_for_graph (pretty_printer *pp, basic_block bb) 341 1.1 mrg { 342 1.1 mrg if (!cfg_hooks->dump_bb_for_graph) 343 1.1 mrg internal_error ("%s does not support dump_bb_for_graph", 344 1.1 mrg cfg_hooks->name); 345 1.1 mrg /* TODO: Add pretty printer for counter. */ 346 1.1 mrg if (bb->count.initialized_p ()) 347 1.1 mrg pp_printf (pp, "COUNT:" "%" PRId64, bb->count.to_gcov_type ()); 348 1.1 mrg pp_write_text_to_stream (pp); 349 1.1 mrg if (!(dump_flags & TDF_SLIM)) 350 1.1 mrg cfg_hooks->dump_bb_for_graph (pp, bb); 351 1.1 mrg } 352 1.1 mrg 353 1.1 mrg /* Dump the complete CFG to FILE. FLAGS are the TDF_* flags in dumpfile.h. */ 354 1.1 mrg void 355 1.1 mrg dump_flow_info (FILE *file, dump_flags_t flags) 356 1.1 mrg { 357 1.1 mrg basic_block bb; 358 1.1 mrg 359 1.1 mrg fprintf (file, "\n%d basic blocks, %d edges.\n", n_basic_blocks_for_fn (cfun), 360 1.1 mrg n_edges_for_fn (cfun)); 361 1.1 mrg FOR_ALL_BB_FN (bb, cfun) 362 1.1 mrg dump_bb (file, bb, 0, flags); 363 1.1 mrg 364 1.1 mrg putc ('\n', file); 365 1.1 mrg } 366 1.1 mrg 367 1.1 mrg /* Like above, but dump to stderr. To be called from debuggers. */ 368 1.1 mrg void debug_flow_info (void); 369 1.1 mrg DEBUG_FUNCTION void 370 1.1 mrg debug_flow_info (void) 371 1.1 mrg { 372 1.1 mrg dump_flow_info (stderr, TDF_DETAILS); 373 1.1 mrg } 374 1.1 mrg 375 1.1 mrg /* Redirect edge E to the given basic block DEST and update underlying program 376 1.1 mrg representation. Returns edge representing redirected branch (that may not 377 1.1 mrg be equivalent to E in the case of duplicate edges being removed) or NULL 378 1.1 mrg if edge is not easily redirectable for whatever reason. */ 379 1.1 mrg 380 1.1 mrg edge 381 1.1 mrg redirect_edge_and_branch (edge e, basic_block dest) 382 1.1 mrg { 383 1.1 mrg edge ret; 384 1.1 mrg 385 1.1 mrg if (!cfg_hooks->redirect_edge_and_branch) 386 1.1 mrg internal_error ("%s does not support redirect_edge_and_branch", 387 1.1 mrg cfg_hooks->name); 388 1.1 mrg 389 1.1 mrg ret = cfg_hooks->redirect_edge_and_branch (e, dest); 390 1.1 mrg 391 1.1 mrg /* If RET != E, then either the redirection failed, or the edge E 392 1.1 mrg was removed since RET already lead to the same destination. */ 393 1.1 mrg if (current_loops != NULL && ret == e) 394 1.1 mrg rescan_loop_exit (e, false, false); 395 1.1 mrg 396 1.1 mrg return ret; 397 1.1 mrg } 398 1.1 mrg 399 1.1 mrg /* Returns true if it is possible to remove the edge E by redirecting it 400 1.1 mrg to the destination of the other edge going from its source. */ 401 1.1 mrg 402 1.1 mrg bool 403 1.1 mrg can_remove_branch_p (const_edge e) 404 1.1 mrg { 405 1.1 mrg if (!cfg_hooks->can_remove_branch_p) 406 1.1 mrg internal_error ("%s does not support can_remove_branch_p", 407 1.1 mrg cfg_hooks->name); 408 1.1 mrg 409 1.1 mrg if (EDGE_COUNT (e->src->succs) != 2) 410 1.1 mrg return false; 411 1.1 mrg 412 1.1 mrg return cfg_hooks->can_remove_branch_p (e); 413 1.1 mrg } 414 1.1 mrg 415 1.1 mrg /* Removes E, by redirecting it to the destination of the other edge going 416 1.1 mrg from its source. Can_remove_branch_p must be true for E, hence this 417 1.1 mrg operation cannot fail. */ 418 1.1 mrg 419 1.1 mrg void 420 1.1 mrg remove_branch (edge e) 421 1.1 mrg { 422 1.1 mrg edge other; 423 1.1 mrg basic_block src = e->src; 424 1.1 mrg int irr; 425 1.1 mrg 426 1.1 mrg gcc_assert (EDGE_COUNT (e->src->succs) == 2); 427 1.1 mrg 428 1.1 mrg other = EDGE_SUCC (src, EDGE_SUCC (src, 0) == e); 429 1.1 mrg irr = other->flags & EDGE_IRREDUCIBLE_LOOP; 430 1.1 mrg 431 1.1 mrg e = redirect_edge_and_branch (e, other->dest); 432 1.1 mrg gcc_assert (e != NULL); 433 1.1 mrg 434 1.1 mrg e->flags &= ~EDGE_IRREDUCIBLE_LOOP; 435 1.1 mrg e->flags |= irr; 436 1.1 mrg } 437 1.1 mrg 438 1.1 mrg /* Removes edge E from cfg. Unlike remove_branch, it does not update IL. */ 439 1.1 mrg 440 1.1 mrg void 441 1.1 mrg remove_edge (edge e) 442 1.1 mrg { 443 1.1 mrg if (current_loops != NULL) 444 1.1 mrg { 445 1.1 mrg rescan_loop_exit (e, false, true); 446 1.1 mrg 447 1.1 mrg /* Removal of an edge inside an irreducible region or which leads 448 1.1 mrg to an irreducible region can turn the region into a natural loop. 449 1.1 mrg In that case, ask for the loop structure fixups. 450 1.1 mrg 451 1.1 mrg FIXME: Note that LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS is not always 452 1.1 mrg set, so always ask for fixups when removing an edge in that case. */ 453 1.1 mrg if (!loops_state_satisfies_p (LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS) 454 1.1 mrg || (e->flags & EDGE_IRREDUCIBLE_LOOP) 455 1.1 mrg || (e->dest->flags & BB_IRREDUCIBLE_LOOP)) 456 1.1 mrg loops_state_set (LOOPS_NEED_FIXUP); 457 1.1 mrg } 458 1.1 mrg 459 1.1 mrg /* This is probably not needed, but it doesn't hurt. */ 460 1.1 mrg /* FIXME: This should be called via a remove_edge hook. */ 461 1.1 mrg if (current_ir_type () == IR_GIMPLE) 462 1.1 mrg redirect_edge_var_map_clear (e); 463 1.1 mrg 464 1.1 mrg remove_edge_raw (e); 465 1.1 mrg } 466 1.1 mrg 467 1.1 mrg /* Like redirect_edge_succ but avoid possible duplicate edge. */ 468 1.1 mrg 469 1.1 mrg edge 470 1.1 mrg redirect_edge_succ_nodup (edge e, basic_block new_succ) 471 1.1 mrg { 472 1.1 mrg edge s; 473 1.1 mrg 474 1.1 mrg s = find_edge (e->src, new_succ); 475 1.1 mrg if (s && s != e) 476 1.1 mrg { 477 1.1 mrg s->flags |= e->flags; 478 1.1 mrg s->probability += e->probability; 479 1.1 mrg /* FIXME: This should be called via a hook and only for IR_GIMPLE. */ 480 1.1 mrg redirect_edge_var_map_dup (s, e); 481 1.1 mrg remove_edge (e); 482 1.1 mrg e = s; 483 1.1 mrg } 484 1.1 mrg else 485 1.1 mrg redirect_edge_succ (e, new_succ); 486 1.1 mrg 487 1.1 mrg return e; 488 1.1 mrg } 489 1.1 mrg 490 1.1 mrg /* Redirect the edge E to basic block DEST even if it requires creating 491 1.1 mrg of a new basic block; then it returns the newly created basic block. 492 1.1 mrg Aborts when redirection is impossible. */ 493 1.1 mrg 494 1.1 mrg basic_block 495 1.1 mrg redirect_edge_and_branch_force (edge e, basic_block dest) 496 1.1 mrg { 497 1.1 mrg basic_block ret, src = e->src; 498 1.1 mrg 499 1.1 mrg if (!cfg_hooks->redirect_edge_and_branch_force) 500 1.1 mrg internal_error ("%s does not support redirect_edge_and_branch_force", 501 1.1 mrg cfg_hooks->name); 502 1.1 mrg 503 1.1 mrg if (current_loops != NULL) 504 1.1 mrg rescan_loop_exit (e, false, true); 505 1.1 mrg 506 1.1 mrg ret = cfg_hooks->redirect_edge_and_branch_force (e, dest); 507 1.1 mrg 508 1.1 mrg if (ret != NULL && dom_info_available_p (CDI_DOMINATORS)) 509 1.1 mrg set_immediate_dominator (CDI_DOMINATORS, ret, src); 510 1.1 mrg 511 1.1 mrg if (current_loops != NULL) 512 1.1 mrg { 513 1.1 mrg if (ret != NULL) 514 1.1 mrg { 515 1.1 mrg class loop *loop 516 1.1 mrg = find_common_loop (single_pred (ret)->loop_father, 517 1.1 mrg single_succ (ret)->loop_father); 518 1.1 mrg add_bb_to_loop (ret, loop); 519 1.1 mrg } 520 1.1 mrg else if (find_edge (src, dest) == e) 521 1.1 mrg rescan_loop_exit (e, true, false); 522 1.1 mrg } 523 1.1 mrg 524 1.1 mrg return ret; 525 1.1 mrg } 526 1.1 mrg 527 1.1 mrg /* Splits basic block BB after the specified instruction I (but at least after 528 1.1 mrg the labels). If I is NULL, splits just after labels. The newly created edge 529 1.1 mrg is returned. The new basic block is created just after the old one. */ 530 1.1 mrg 531 1.1 mrg static edge 532 1.1 mrg split_block_1 (basic_block bb, void *i) 533 1.1 mrg { 534 1.1 mrg basic_block new_bb; 535 1.1 mrg edge res; 536 1.1 mrg 537 1.1 mrg if (!cfg_hooks->split_block) 538 1.1 mrg internal_error ("%s does not support split_block", cfg_hooks->name); 539 1.1 mrg 540 1.1 mrg new_bb = cfg_hooks->split_block (bb, i); 541 1.1 mrg if (!new_bb) 542 1.1 mrg return NULL; 543 1.1 mrg 544 1.1 mrg new_bb->count = bb->count; 545 1.1 mrg new_bb->discriminator = bb->discriminator; 546 1.1 mrg 547 1.1 mrg if (dom_info_available_p (CDI_DOMINATORS)) 548 1.1 mrg { 549 1.1 mrg redirect_immediate_dominators (CDI_DOMINATORS, bb, new_bb); 550 1.1 mrg set_immediate_dominator (CDI_DOMINATORS, new_bb, bb); 551 1.1 mrg } 552 1.1 mrg 553 1.1 mrg if (current_loops != NULL) 554 1.1 mrg { 555 1.1 mrg edge_iterator ei; 556 1.1 mrg edge e; 557 1.1 mrg add_bb_to_loop (new_bb, bb->loop_father); 558 1.1 mrg /* Identify all loops bb may have been the latch of and adjust them. */ 559 1.1 mrg FOR_EACH_EDGE (e, ei, new_bb->succs) 560 1.1 mrg if (e->dest->loop_father->latch == bb) 561 1.1 mrg e->dest->loop_father->latch = new_bb; 562 1.1 mrg } 563 1.1 mrg 564 1.1 mrg res = make_single_succ_edge (bb, new_bb, EDGE_FALLTHRU); 565 1.1 mrg 566 1.1 mrg if (bb->flags & BB_IRREDUCIBLE_LOOP) 567 1.1 mrg { 568 1.1 mrg new_bb->flags |= BB_IRREDUCIBLE_LOOP; 569 1.1 mrg res->flags |= EDGE_IRREDUCIBLE_LOOP; 570 1.1 mrg } 571 1.1 mrg 572 1.1 mrg return res; 573 1.1 mrg } 574 1.1 mrg 575 1.1 mrg edge 576 1.1 mrg split_block (basic_block bb, gimple *i) 577 1.1 mrg { 578 1.1 mrg return split_block_1 (bb, i); 579 1.1 mrg } 580 1.1 mrg 581 1.1 mrg edge 582 1.1 mrg split_block (basic_block bb, rtx i) 583 1.1 mrg { 584 1.1 mrg return split_block_1 (bb, i); 585 1.1 mrg } 586 1.1 mrg 587 1.1 mrg /* Splits block BB just after labels. The newly created edge is returned. */ 588 1.1 mrg 589 1.1 mrg edge 590 1.1 mrg split_block_after_labels (basic_block bb) 591 1.1 mrg { 592 1.1 mrg return split_block_1 (bb, NULL); 593 1.1 mrg } 594 1.1 mrg 595 1.1 mrg /* Moves block BB immediately after block AFTER. Returns false if the 596 1.1 mrg movement was impossible. */ 597 1.1 mrg 598 1.1 mrg bool 599 1.1 mrg move_block_after (basic_block bb, basic_block after) 600 1.1 mrg { 601 1.1 mrg bool ret; 602 1.1 mrg 603 1.1 mrg if (!cfg_hooks->move_block_after) 604 1.1 mrg internal_error ("%s does not support move_block_after", cfg_hooks->name); 605 1.1 mrg 606 1.1 mrg ret = cfg_hooks->move_block_after (bb, after); 607 1.1 mrg 608 1.1 mrg return ret; 609 1.1 mrg } 610 1.1 mrg 611 1.1 mrg /* Deletes the basic block BB. */ 612 1.1 mrg 613 1.1 mrg void 614 1.1 mrg delete_basic_block (basic_block bb) 615 1.1 mrg { 616 1.1 mrg if (!cfg_hooks->delete_basic_block) 617 1.1 mrg internal_error ("%s does not support delete_basic_block", cfg_hooks->name); 618 1.1 mrg 619 1.1 mrg cfg_hooks->delete_basic_block (bb); 620 1.1 mrg 621 1.1 mrg if (current_loops != NULL) 622 1.1 mrg { 623 1.1 mrg class loop *loop = bb->loop_father; 624 1.1 mrg 625 1.1 mrg /* If we remove the header or the latch of a loop, mark the loop for 626 1.1 mrg removal. */ 627 1.1 mrg if (loop->latch == bb 628 1.1 mrg || loop->header == bb) 629 1.1 mrg mark_loop_for_removal (loop); 630 1.1 mrg 631 1.1 mrg remove_bb_from_loops (bb); 632 1.1 mrg } 633 1.1 mrg 634 1.1 mrg /* Remove the edges into and out of this block. Note that there may 635 1.1 mrg indeed be edges in, if we are removing an unreachable loop. */ 636 1.1 mrg while (EDGE_COUNT (bb->preds) != 0) 637 1.1 mrg remove_edge (EDGE_PRED (bb, 0)); 638 1.1 mrg while (EDGE_COUNT (bb->succs) != 0) 639 1.1 mrg remove_edge (EDGE_SUCC (bb, 0)); 640 1.1 mrg 641 1.1 mrg if (dom_info_available_p (CDI_DOMINATORS)) 642 1.1 mrg delete_from_dominance_info (CDI_DOMINATORS, bb); 643 1.1 mrg if (dom_info_available_p (CDI_POST_DOMINATORS)) 644 1.1 mrg delete_from_dominance_info (CDI_POST_DOMINATORS, bb); 645 1.1 mrg 646 1.1 mrg /* Remove the basic block from the array. */ 647 1.1 mrg expunge_block (bb); 648 1.1 mrg } 649 1.1 mrg 650 1.1 mrg /* Splits edge E and returns the newly created basic block. */ 651 1.1 mrg 652 1.1 mrg basic_block 653 1.1 mrg split_edge (edge e) 654 1.1 mrg { 655 1.1 mrg basic_block ret; 656 1.1 mrg profile_count count = e->count (); 657 1.1 mrg edge f; 658 1.1 mrg bool irr = (e->flags & EDGE_IRREDUCIBLE_LOOP) != 0; 659 1.1 mrg bool back = (e->flags & EDGE_DFS_BACK) != 0; 660 1.1 mrg class loop *loop; 661 1.1 mrg basic_block src = e->src, dest = e->dest; 662 1.1 mrg 663 1.1 mrg if (!cfg_hooks->split_edge) 664 1.1 mrg internal_error ("%s does not support split_edge", cfg_hooks->name); 665 1.1 mrg 666 1.1 mrg if (current_loops != NULL) 667 1.1 mrg rescan_loop_exit (e, false, true); 668 1.1 mrg 669 1.1 mrg ret = cfg_hooks->split_edge (e); 670 1.1 mrg ret->count = count; 671 1.1 mrg single_succ_edge (ret)->probability = profile_probability::always (); 672 1.1 mrg 673 1.1 mrg if (irr) 674 1.1 mrg { 675 1.1 mrg ret->flags |= BB_IRREDUCIBLE_LOOP; 676 1.1 mrg single_pred_edge (ret)->flags |= EDGE_IRREDUCIBLE_LOOP; 677 1.1 mrg single_succ_edge (ret)->flags |= EDGE_IRREDUCIBLE_LOOP; 678 1.1 mrg } 679 1.1 mrg if (back) 680 1.1 mrg { 681 1.1 mrg single_pred_edge (ret)->flags &= ~EDGE_DFS_BACK; 682 1.1 mrg single_succ_edge (ret)->flags |= EDGE_DFS_BACK; 683 1.1 mrg } 684 1.1 mrg 685 1.1 mrg if (dom_info_available_p (CDI_DOMINATORS)) 686 1.1 mrg set_immediate_dominator (CDI_DOMINATORS, ret, single_pred (ret)); 687 1.1 mrg 688 1.1 mrg if (dom_info_state (CDI_DOMINATORS) >= DOM_NO_FAST_QUERY) 689 1.1 mrg { 690 1.1 mrg /* There are two cases: 691 1.1 mrg 692 1.1 mrg If the immediate dominator of e->dest is not e->src, it 693 1.1 mrg remains unchanged. 694 1.1 mrg 695 1.1 mrg If immediate dominator of e->dest is e->src, it may become 696 1.1 mrg ret, provided that all other predecessors of e->dest are 697 1.1 mrg dominated by e->dest. */ 698 1.1 mrg 699 1.1 mrg if (get_immediate_dominator (CDI_DOMINATORS, single_succ (ret)) 700 1.1 mrg == single_pred (ret)) 701 1.1 mrg { 702 1.1 mrg edge_iterator ei; 703 1.1 mrg FOR_EACH_EDGE (f, ei, single_succ (ret)->preds) 704 1.1 mrg { 705 1.1 mrg if (f == single_succ_edge (ret)) 706 1.1 mrg continue; 707 1.1 mrg 708 1.1 mrg if (!dominated_by_p (CDI_DOMINATORS, f->src, 709 1.1 mrg single_succ (ret))) 710 1.1 mrg break; 711 1.1 mrg } 712 1.1 mrg 713 1.1 mrg if (!f) 714 1.1 mrg set_immediate_dominator (CDI_DOMINATORS, single_succ (ret), ret); 715 1.1 mrg } 716 1.1 mrg } 717 1.1 mrg 718 1.1 mrg if (current_loops != NULL) 719 1.1 mrg { 720 1.1 mrg loop = find_common_loop (src->loop_father, dest->loop_father); 721 1.1 mrg add_bb_to_loop (ret, loop); 722 1.1 mrg 723 1.1 mrg /* If we split the latch edge of loop adjust the latch block. */ 724 1.1 mrg if (loop->latch == src 725 1.1 mrg && loop->header == dest) 726 1.1 mrg loop->latch = ret; 727 1.1 mrg } 728 1.1 mrg 729 1.1 mrg return ret; 730 1.1 mrg } 731 1.1 mrg 732 1.1 mrg /* Creates a new basic block just after the basic block AFTER. 733 1.1 mrg HEAD and END are the first and the last statement belonging 734 1.1 mrg to the block. If both are NULL, an empty block is created. */ 735 1.1 mrg 736 1.1 mrg static basic_block 737 1.1 mrg create_basic_block_1 (void *head, void *end, basic_block after) 738 1.1 mrg { 739 1.1 mrg basic_block ret; 740 1.1 mrg 741 1.1 mrg if (!cfg_hooks->create_basic_block) 742 1.1 mrg internal_error ("%s does not support create_basic_block", cfg_hooks->name); 743 1.1 mrg 744 1.1 mrg ret = cfg_hooks->create_basic_block (head, end, after); 745 1.1 mrg 746 1.1 mrg if (dom_info_available_p (CDI_DOMINATORS)) 747 1.1 mrg add_to_dominance_info (CDI_DOMINATORS, ret); 748 1.1 mrg if (dom_info_available_p (CDI_POST_DOMINATORS)) 749 1.1 mrg add_to_dominance_info (CDI_POST_DOMINATORS, ret); 750 1.1 mrg 751 1.1 mrg return ret; 752 1.1 mrg } 753 1.1 mrg 754 1.1 mrg basic_block 755 1.1 mrg create_basic_block (gimple_seq seq, basic_block after) 756 1.1 mrg { 757 1.1 mrg return create_basic_block_1 (seq, NULL, after); 758 1.1 mrg } 759 1.1 mrg 760 1.1 mrg basic_block 761 1.1 mrg create_basic_block (rtx head, rtx end, basic_block after) 762 1.1 mrg { 763 1.1 mrg return create_basic_block_1 (head, end, after); 764 1.1 mrg } 765 1.1 mrg 766 1.1 mrg 767 1.1 mrg /* Creates an empty basic block just after basic block AFTER. */ 768 1.1 mrg 769 1.1 mrg basic_block 770 1.1 mrg create_empty_bb (basic_block after) 771 1.1 mrg { 772 1.1 mrg return create_basic_block_1 (NULL, NULL, after); 773 1.1 mrg } 774 1.1 mrg 775 1.1 mrg /* Checks whether we may merge blocks BB1 and BB2. */ 776 1.1 mrg 777 1.1 mrg bool 778 1.1 mrg can_merge_blocks_p (basic_block bb1, basic_block bb2) 779 1.1 mrg { 780 1.1 mrg bool ret; 781 1.1 mrg 782 1.1 mrg if (!cfg_hooks->can_merge_blocks_p) 783 1.1 mrg internal_error ("%s does not support can_merge_blocks_p", cfg_hooks->name); 784 1.1 mrg 785 1.1 mrg ret = cfg_hooks->can_merge_blocks_p (bb1, bb2); 786 1.1 mrg 787 1.1 mrg return ret; 788 1.1 mrg } 789 1.1 mrg 790 1.1 mrg void 791 1.1 mrg predict_edge (edge e, enum br_predictor predictor, int probability) 792 1.1 mrg { 793 1.1 mrg if (!cfg_hooks->predict_edge) 794 1.1 mrg internal_error ("%s does not support predict_edge", cfg_hooks->name); 795 1.1 mrg 796 1.1 mrg cfg_hooks->predict_edge (e, predictor, probability); 797 1.1 mrg } 798 1.1 mrg 799 1.1 mrg bool 800 1.1 mrg predicted_by_p (const_basic_block bb, enum br_predictor predictor) 801 1.1 mrg { 802 1.1 mrg if (!cfg_hooks->predict_edge) 803 1.1 mrg internal_error ("%s does not support predicted_by_p", cfg_hooks->name); 804 1.1 mrg 805 1.1 mrg return cfg_hooks->predicted_by_p (bb, predictor); 806 1.1 mrg } 807 1.1 mrg 808 1.1 mrg /* Merges basic block B into basic block A. */ 809 1.1 mrg 810 1.1 mrg void 811 1.1 mrg merge_blocks (basic_block a, basic_block b) 812 1.1 mrg { 813 1.1 mrg edge e; 814 1.1 mrg edge_iterator ei; 815 1.1 mrg 816 1.1 mrg if (!cfg_hooks->merge_blocks) 817 1.1 mrg internal_error ("%s does not support merge_blocks", cfg_hooks->name); 818 1.1 mrg 819 1.1 mrg cfg_hooks->merge_blocks (a, b); 820 1.1 mrg 821 1.1 mrg if (current_loops != NULL) 822 1.1 mrg { 823 1.1 mrg /* If the block we merge into is a loop header do nothing unless ... */ 824 1.1 mrg if (a->loop_father->header == a) 825 1.1 mrg { 826 1.1 mrg /* ... we merge two loop headers, in which case we kill 827 1.1 mrg the inner loop. */ 828 1.1 mrg if (b->loop_father->header == b) 829 1.1 mrg mark_loop_for_removal (b->loop_father); 830 1.1 mrg } 831 1.1 mrg /* If we merge a loop header into its predecessor, update the loop 832 1.1 mrg structure. */ 833 1.1 mrg else if (b->loop_father->header == b) 834 1.1 mrg { 835 1.1 mrg remove_bb_from_loops (a); 836 1.1 mrg add_bb_to_loop (a, b->loop_father); 837 1.1 mrg a->loop_father->header = a; 838 1.1 mrg } 839 1.1 mrg /* If we merge a loop latch into its predecessor, update the loop 840 1.1 mrg structure. */ 841 1.1 mrg if (b->loop_father->latch 842 1.1 mrg && b->loop_father->latch == b) 843 1.1 mrg b->loop_father->latch = a; 844 1.1 mrg remove_bb_from_loops (b); 845 1.1 mrg } 846 1.1 mrg 847 1.1 mrg /* Normally there should only be one successor of A and that is B, but 848 1.1 mrg partway though the merge of blocks for conditional_execution we'll 849 1.1 mrg be merging a TEST block with THEN and ELSE successors. Free the 850 1.1 mrg whole lot of them and hope the caller knows what they're doing. */ 851 1.1 mrg 852 1.1 mrg while (EDGE_COUNT (a->succs) != 0) 853 1.1 mrg remove_edge (EDGE_SUCC (a, 0)); 854 1.1 mrg 855 1.1 mrg /* Adjust the edges out of B for the new owner. */ 856 1.1 mrg FOR_EACH_EDGE (e, ei, b->succs) 857 1.1 mrg { 858 1.1 mrg e->src = a; 859 1.1 mrg if (current_loops != NULL) 860 1.1 mrg { 861 1.1 mrg /* If b was a latch, a now is. */ 862 1.1 mrg if (e->dest->loop_father->latch == b) 863 1.1 mrg e->dest->loop_father->latch = a; 864 1.1 mrg rescan_loop_exit (e, true, false); 865 1.1 mrg } 866 1.1 mrg } 867 1.1 mrg a->succs = b->succs; 868 1.1 mrg a->flags |= b->flags; 869 1.1 mrg 870 1.1 mrg /* B hasn't quite yet ceased to exist. Attempt to prevent mishap. */ 871 1.1 mrg b->preds = b->succs = NULL; 872 1.1 mrg 873 1.1 mrg if (dom_info_available_p (CDI_DOMINATORS)) 874 1.1 mrg redirect_immediate_dominators (CDI_DOMINATORS, b, a); 875 1.1 mrg 876 1.1 mrg if (dom_info_available_p (CDI_DOMINATORS)) 877 1.1 mrg delete_from_dominance_info (CDI_DOMINATORS, b); 878 1.1 mrg if (dom_info_available_p (CDI_POST_DOMINATORS)) 879 1.1 mrg delete_from_dominance_info (CDI_POST_DOMINATORS, b); 880 1.1 mrg 881 1.1 mrg expunge_block (b); 882 1.1 mrg } 883 1.1 mrg 884 1.1 mrg /* Split BB into entry part and the rest (the rest is the newly created block). 885 1.1 mrg Redirect those edges for that REDIRECT_EDGE_P returns true to the entry 886 1.1 mrg part. Returns the edge connecting the entry part to the rest. */ 887 1.1 mrg 888 1.1 mrg edge 889 1.1 mrg make_forwarder_block (basic_block bb, bool (*redirect_edge_p) (edge), 890 1.1 mrg void (*new_bb_cbk) (basic_block)) 891 1.1 mrg { 892 1.1 mrg edge e, fallthru; 893 1.1 mrg edge_iterator ei; 894 1.1 mrg basic_block dummy, jump; 895 1.1 mrg class loop *loop, *ploop, *cloop; 896 1.1 mrg 897 1.1 mrg if (!cfg_hooks->make_forwarder_block) 898 1.1 mrg internal_error ("%s does not support make_forwarder_block", 899 1.1 mrg cfg_hooks->name); 900 1.1 mrg 901 1.1 mrg fallthru = split_block_after_labels (bb); 902 1.1 mrg dummy = fallthru->src; 903 1.1 mrg dummy->count = profile_count::zero (); 904 1.1 mrg bb = fallthru->dest; 905 1.1 mrg 906 1.1 mrg /* Redirect back edges we want to keep. */ 907 1.1 mrg for (ei = ei_start (dummy->preds); (e = ei_safe_edge (ei)); ) 908 1.1 mrg { 909 1.1 mrg basic_block e_src; 910 1.1 mrg 911 1.1 mrg if (redirect_edge_p (e)) 912 1.1 mrg { 913 1.1 mrg dummy->count += e->count (); 914 1.1 mrg ei_next (&ei); 915 1.1 mrg continue; 916 1.1 mrg } 917 1.1 mrg 918 1.1 mrg e_src = e->src; 919 1.1 mrg jump = redirect_edge_and_branch_force (e, bb); 920 1.1 mrg if (jump != NULL) 921 1.1 mrg { 922 1.1 mrg /* If we redirected the loop latch edge, the JUMP block now acts like 923 1.1 mrg the new latch of the loop. */ 924 1.1 mrg if (current_loops != NULL 925 1.1 mrg && dummy->loop_father != NULL 926 1.1 mrg && dummy->loop_father->header == dummy 927 1.1 mrg && dummy->loop_father->latch == e_src) 928 1.1 mrg dummy->loop_father->latch = jump; 929 1.1 mrg 930 1.1 mrg if (new_bb_cbk != NULL) 931 1.1 mrg new_bb_cbk (jump); 932 1.1 mrg } 933 1.1 mrg } 934 1.1 mrg 935 1.1 mrg if (dom_info_available_p (CDI_DOMINATORS)) 936 1.1 mrg { 937 1.1 mrg vec<basic_block> doms_to_fix; 938 1.1 mrg doms_to_fix.create (2); 939 1.1 mrg doms_to_fix.quick_push (dummy); 940 1.1 mrg doms_to_fix.quick_push (bb); 941 1.1 mrg iterate_fix_dominators (CDI_DOMINATORS, doms_to_fix, false); 942 1.1 mrg doms_to_fix.release (); 943 1.1 mrg } 944 1.1 mrg 945 1.1 mrg if (current_loops != NULL) 946 1.1 mrg { 947 1.1 mrg /* If we do not split a loop header, then both blocks belong to the 948 1.1 mrg same loop. In case we split loop header and do not redirect the 949 1.1 mrg latch edge to DUMMY, then DUMMY belongs to the outer loop, and 950 1.1 mrg BB becomes the new header. If latch is not recorded for the loop, 951 1.1 mrg we leave this updating on the caller (this may only happen during 952 1.1 mrg loop analysis). */ 953 1.1 mrg loop = dummy->loop_father; 954 1.1 mrg if (loop->header == dummy 955 1.1 mrg && loop->latch != NULL 956 1.1 mrg && find_edge (loop->latch, dummy) == NULL) 957 1.1 mrg { 958 1.1 mrg remove_bb_from_loops (dummy); 959 1.1 mrg loop->header = bb; 960 1.1 mrg 961 1.1 mrg cloop = loop; 962 1.1 mrg FOR_EACH_EDGE (e, ei, dummy->preds) 963 1.1 mrg { 964 1.1 mrg cloop = find_common_loop (cloop, e->src->loop_father); 965 1.1 mrg } 966 1.1 mrg add_bb_to_loop (dummy, cloop); 967 1.1 mrg } 968 1.1 mrg 969 1.1 mrg /* In case we split loop latch, update it. */ 970 1.1 mrg for (ploop = loop; ploop; ploop = loop_outer (ploop)) 971 1.1 mrg if (ploop->latch == dummy) 972 1.1 mrg ploop->latch = bb; 973 1.1 mrg } 974 1.1 mrg 975 1.1 mrg cfg_hooks->make_forwarder_block (fallthru); 976 1.1 mrg 977 1.1 mrg return fallthru; 978 1.1 mrg } 979 1.1 mrg 980 1.1 mrg /* Try to make the edge fallthru. */ 981 1.1 mrg 982 1.1 mrg void 983 1.1 mrg tidy_fallthru_edge (edge e) 984 1.1 mrg { 985 1.1 mrg if (cfg_hooks->tidy_fallthru_edge) 986 1.1 mrg cfg_hooks->tidy_fallthru_edge (e); 987 1.1 mrg } 988 1.1 mrg 989 1.1 mrg /* Fix up edges that now fall through, or rather should now fall through 990 1.1 mrg but previously required a jump around now deleted blocks. Simplify 991 1.1 mrg the search by only examining blocks numerically adjacent, since this 992 1.1 mrg is how they were created. 993 1.1 mrg 994 1.1 mrg ??? This routine is currently RTL specific. */ 995 1.1 mrg 996 1.1 mrg void 997 1.1 mrg tidy_fallthru_edges (void) 998 1.1 mrg { 999 1.1 mrg basic_block b, c; 1000 1.1 mrg 1001 1.1 mrg if (!cfg_hooks->tidy_fallthru_edge) 1002 1.1 mrg return; 1003 1.1 mrg 1004 1.1 mrg if (ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb == EXIT_BLOCK_PTR_FOR_FN (cfun)) 1005 1.1 mrg return; 1006 1.1 mrg 1007 1.1 mrg FOR_BB_BETWEEN (b, ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb, 1008 1.1 mrg EXIT_BLOCK_PTR_FOR_FN (cfun)->prev_bb, next_bb) 1009 1.1 mrg { 1010 1.1 mrg edge s; 1011 1.1 mrg 1012 1.1 mrg c = b->next_bb; 1013 1.1 mrg 1014 1.1 mrg /* We care about simple conditional or unconditional jumps with 1015 1.1 mrg a single successor. 1016 1.1 mrg 1017 1.1 mrg If we had a conditional branch to the next instruction when 1018 1.1 mrg CFG was built, then there will only be one out edge for the 1019 1.1 mrg block which ended with the conditional branch (since we do 1020 1.1 mrg not create duplicate edges). 1021 1.1 mrg 1022 1.1 mrg Furthermore, the edge will be marked as a fallthru because we 1023 1.1 mrg merge the flags for the duplicate edges. So we do not want to 1024 1.1 mrg check that the edge is not a FALLTHRU edge. */ 1025 1.1 mrg 1026 1.1 mrg if (single_succ_p (b)) 1027 1.1 mrg { 1028 1.1 mrg s = single_succ_edge (b); 1029 1.1 mrg if (! (s->flags & EDGE_COMPLEX) 1030 1.1 mrg && s->dest == c 1031 1.1 mrg && !(JUMP_P (BB_END (b)) && CROSSING_JUMP_P (BB_END (b)))) 1032 1.1 mrg tidy_fallthru_edge (s); 1033 1.1 mrg } 1034 1.1 mrg } 1035 1.1 mrg } 1036 1.1 mrg 1037 1.1 mrg /* Edge E is assumed to be fallthru edge. Emit needed jump instruction 1038 1.1 mrg (and possibly create new basic block) to make edge non-fallthru. 1039 1.1 mrg Return newly created BB or NULL if none. */ 1040 1.1 mrg 1041 1.1 mrg basic_block 1042 1.1 mrg force_nonfallthru (edge e) 1043 1.1 mrg { 1044 1.1 mrg basic_block ret, src = e->src; 1045 1.1 mrg 1046 1.1 mrg if (!cfg_hooks->force_nonfallthru) 1047 1.1 mrg internal_error ("%s does not support force_nonfallthru", 1048 1.1 mrg cfg_hooks->name); 1049 1.1 mrg 1050 1.1 mrg ret = cfg_hooks->force_nonfallthru (e); 1051 1.1 mrg if (ret != NULL) 1052 1.1 mrg { 1053 1.1 mrg if (dom_info_available_p (CDI_DOMINATORS)) 1054 1.1 mrg set_immediate_dominator (CDI_DOMINATORS, ret, src); 1055 1.1 mrg 1056 1.1 mrg if (current_loops != NULL) 1057 1.1 mrg { 1058 1.1 mrg basic_block pred = single_pred (ret); 1059 1.1 mrg basic_block succ = single_succ (ret); 1060 1.1 mrg class loop *loop 1061 1.1 mrg = find_common_loop (pred->loop_father, succ->loop_father); 1062 1.1 mrg rescan_loop_exit (e, false, true); 1063 1.1 mrg add_bb_to_loop (ret, loop); 1064 1.1 mrg 1065 1.1 mrg /* If we split the latch edge of loop adjust the latch block. */ 1066 1.1 mrg if (loop->latch == pred 1067 1.1 mrg && loop->header == succ) 1068 1.1 mrg loop->latch = ret; 1069 1.1 mrg } 1070 1.1 mrg } 1071 1.1 mrg 1072 1.1 mrg return ret; 1073 1.1 mrg } 1074 1.1 mrg 1075 1.1 mrg /* Returns true if we can duplicate basic block BB. */ 1076 1.1 mrg 1077 1.1 mrg bool 1078 1.1 mrg can_duplicate_block_p (const_basic_block bb) 1079 1.1 mrg { 1080 1.1 mrg if (!cfg_hooks->can_duplicate_block_p) 1081 1.1 mrg internal_error ("%s does not support can_duplicate_block_p", 1082 1.1 mrg cfg_hooks->name); 1083 1.1 mrg 1084 1.1 mrg if (bb == EXIT_BLOCK_PTR_FOR_FN (cfun) || bb == ENTRY_BLOCK_PTR_FOR_FN (cfun)) 1085 1.1 mrg return false; 1086 1.1 mrg 1087 1.1 mrg return cfg_hooks->can_duplicate_block_p (bb); 1088 1.1 mrg } 1089 1.1 mrg 1090 1.1 mrg /* Duplicates basic block BB and redirects edge E to it. Returns the 1091 1.1 mrg new basic block. The new basic block is placed after the basic block 1092 1.1 mrg AFTER. */ 1093 1.1 mrg 1094 1.1 mrg basic_block 1095 1.1 mrg duplicate_block (basic_block bb, edge e, basic_block after, copy_bb_data *id) 1096 1.1 mrg { 1097 1.1 mrg edge s, n; 1098 1.1 mrg basic_block new_bb; 1099 1.1 mrg profile_count new_count = e ? e->count (): profile_count::uninitialized (); 1100 1.1 mrg edge_iterator ei; 1101 1.1 mrg 1102 1.1 mrg if (!cfg_hooks->duplicate_block) 1103 1.1 mrg internal_error ("%s does not support duplicate_block", 1104 1.1 mrg cfg_hooks->name); 1105 1.1 mrg 1106 1.1 mrg if (bb->count < new_count) 1107 1.1 mrg new_count = bb->count; 1108 1.1 mrg 1109 1.1 mrg gcc_checking_assert (can_duplicate_block_p (bb)); 1110 1.1 mrg 1111 1.1 mrg new_bb = cfg_hooks->duplicate_block (bb, id); 1112 1.1 mrg if (after) 1113 1.1 mrg move_block_after (new_bb, after); 1114 1.1 mrg 1115 1.1 mrg new_bb->flags = (bb->flags & ~BB_DUPLICATED); 1116 1.1 mrg FOR_EACH_EDGE (s, ei, bb->succs) 1117 1.1 mrg { 1118 1.1 mrg /* Since we are creating edges from a new block to successors 1119 1.1 mrg of another block (which therefore are known to be disjoint), there 1120 1.1 mrg is no need to actually check for duplicated edges. */ 1121 1.1 mrg n = unchecked_make_edge (new_bb, s->dest, s->flags); 1122 1.1 mrg n->probability = s->probability; 1123 1.1 mrg n->aux = s->aux; 1124 1.1 mrg } 1125 1.1 mrg 1126 1.1 mrg if (e) 1127 1.1 mrg { 1128 1.1 mrg new_bb->count = new_count; 1129 1.1 mrg bb->count -= new_count; 1130 1.1 mrg 1131 1.1 mrg redirect_edge_and_branch_force (e, new_bb); 1132 1.1 mrg } 1133 1.1 mrg else 1134 1.1 mrg new_bb->count = bb->count; 1135 1.1 mrg 1136 1.1 mrg set_bb_original (new_bb, bb); 1137 1.1 mrg set_bb_copy (bb, new_bb); 1138 1.1 mrg 1139 1.1 mrg /* Add the new block to the copy of the loop of BB, or directly to the loop 1140 1.1 mrg of BB if the loop is not being copied. */ 1141 1.1 mrg if (current_loops != NULL) 1142 1.1 mrg { 1143 1.1 mrg class loop *cloop = bb->loop_father; 1144 1.1 mrg class loop *copy = get_loop_copy (cloop); 1145 1.1 mrg /* If we copied the loop header block but not the loop 1146 1.1 mrg we have created a loop with multiple entries. Ditch the loop, 1147 1.1 mrg add the new block to the outer loop and arrange for a fixup. */ 1148 1.1 mrg if (!copy 1149 1.1 mrg && cloop->header == bb) 1150 1.1 mrg { 1151 1.1 mrg add_bb_to_loop (new_bb, loop_outer (cloop)); 1152 1.1 mrg mark_loop_for_removal (cloop); 1153 1.1 mrg } 1154 1.1 mrg else 1155 1.1 mrg { 1156 1.1 mrg add_bb_to_loop (new_bb, copy ? copy : cloop); 1157 1.1 mrg /* If we copied the loop latch block but not the loop, adjust 1158 1.1 mrg loop state. */ 1159 1.1 mrg if (!copy 1160 1.1 mrg && cloop->latch == bb) 1161 1.1 mrg { 1162 1.1 mrg cloop->latch = NULL; 1163 1.1 mrg loops_state_set (LOOPS_MAY_HAVE_MULTIPLE_LATCHES); 1164 1.1 mrg } 1165 1.1 mrg } 1166 1.1 mrg } 1167 1.1 mrg 1168 1.1 mrg return new_bb; 1169 1.1 mrg } 1170 1.1 mrg 1171 1.1 mrg /* Return 1 if BB ends with a call, possibly followed by some 1172 1.1 mrg instructions that must stay with the call, 0 otherwise. */ 1173 1.1 mrg 1174 1.1 mrg bool 1175 1.1 mrg block_ends_with_call_p (basic_block bb) 1176 1.1 mrg { 1177 1.1 mrg if (!cfg_hooks->block_ends_with_call_p) 1178 1.1 mrg internal_error ("%s does not support block_ends_with_call_p", cfg_hooks->name); 1179 1.1 mrg 1180 1.1 mrg return (cfg_hooks->block_ends_with_call_p) (bb); 1181 1.1 mrg } 1182 1.1 mrg 1183 1.1 mrg /* Return 1 if BB ends with a conditional branch, 0 otherwise. */ 1184 1.1 mrg 1185 1.1 mrg bool 1186 1.1 mrg block_ends_with_condjump_p (const_basic_block bb) 1187 1.1 mrg { 1188 1.1 mrg if (!cfg_hooks->block_ends_with_condjump_p) 1189 1.1 mrg internal_error ("%s does not support block_ends_with_condjump_p", 1190 1.1 mrg cfg_hooks->name); 1191 1.1 mrg 1192 1.1 mrg return (cfg_hooks->block_ends_with_condjump_p) (bb); 1193 1.1 mrg } 1194 1.1 mrg 1195 1.1 mrg /* Add fake edges to the function exit for any non constant and non noreturn 1196 1.1 mrg calls, volatile inline assembly in the bitmap of blocks specified by 1197 1.1 mrg BLOCKS or to the whole CFG if BLOCKS is zero. Return the number of blocks 1198 1.1 mrg that were split. 1199 1.1 mrg 1200 1.1 mrg The goal is to expose cases in which entering a basic block does not imply 1201 1.1 mrg that all subsequent instructions must be executed. */ 1202 1.1 mrg 1203 1.1 mrg int 1204 1.1 mrg flow_call_edges_add (sbitmap blocks) 1205 1.1 mrg { 1206 1.1 mrg if (!cfg_hooks->flow_call_edges_add) 1207 1.1 mrg internal_error ("%s does not support flow_call_edges_add", 1208 1.1 mrg cfg_hooks->name); 1209 1.1 mrg 1210 1.1 mrg return (cfg_hooks->flow_call_edges_add) (blocks); 1211 1.1 mrg } 1212 1.1 mrg 1213 1.1 mrg /* This function is called immediately after edge E is added to the 1214 1.1 mrg edge vector E->dest->preds. */ 1215 1.1 mrg 1216 1.1 mrg void 1217 1.1 mrg execute_on_growing_pred (edge e) 1218 1.1 mrg { 1219 1.1 mrg if (! (e->dest->flags & BB_DUPLICATED) 1220 1.1 mrg && cfg_hooks->execute_on_growing_pred) 1221 1.1 mrg cfg_hooks->execute_on_growing_pred (e); 1222 1.1 mrg } 1223 1.1 mrg 1224 1.1 mrg /* This function is called immediately before edge E is removed from 1225 1.1 mrg the edge vector E->dest->preds. */ 1226 1.1 mrg 1227 1.1 mrg void 1228 1.1 mrg execute_on_shrinking_pred (edge e) 1229 1.1 mrg { 1230 1.1 mrg if (! (e->dest->flags & BB_DUPLICATED) 1231 1.1 mrg && cfg_hooks->execute_on_shrinking_pred) 1232 1.1 mrg cfg_hooks->execute_on_shrinking_pred (e); 1233 1.1 mrg } 1234 1.1 mrg 1235 1.1 mrg /* This is used inside loop versioning when we want to insert 1236 1.1 mrg stmts/insns on the edges, which have a different behavior 1237 1.1 mrg in tree's and in RTL, so we made a CFG hook. */ 1238 1.1 mrg void 1239 1.1 mrg lv_flush_pending_stmts (edge e) 1240 1.1 mrg { 1241 1.1 mrg if (cfg_hooks->flush_pending_stmts) 1242 1.1 mrg cfg_hooks->flush_pending_stmts (e); 1243 1.1 mrg } 1244 1.1 mrg 1245 1.1 mrg /* Loop versioning uses the duplicate_loop_body_to_header_edge to create 1246 1.1 mrg a new version of the loop basic-blocks, the parameters here are 1247 1.1 mrg exactly the same as in duplicate_loop_body_to_header_edge or 1248 1.1 mrg tree_duplicate_loop_body_to_header_edge; while in tree-ssa there is 1249 1.1 mrg additional work to maintain ssa information that's why there is 1250 1.1 mrg a need to call the tree_duplicate_loop_body_to_header_edge rather 1251 1.1 mrg than duplicate_loop_body_to_header_edge when we are in tree mode. */ 1252 1.1 mrg bool 1253 1.1 mrg cfg_hook_duplicate_loop_body_to_header_edge (class loop *loop, edge e, 1254 1.1 mrg unsigned int ndupl, 1255 1.1 mrg sbitmap wont_exit, edge orig, 1256 1.1 mrg vec<edge> *to_remove, int flags) 1257 1.1 mrg { 1258 1.1 mrg gcc_assert (cfg_hooks->cfg_hook_duplicate_loop_body_to_header_edge); 1259 1.1 mrg return cfg_hooks->cfg_hook_duplicate_loop_body_to_header_edge ( 1260 1.1 mrg loop, e, ndupl, wont_exit, orig, to_remove, flags); 1261 1.1 mrg } 1262 1.1 mrg 1263 1.1 mrg /* Conditional jumps are represented differently in trees and RTL, 1264 1.1 mrg this hook takes a basic block that is known to have a cond jump 1265 1.1 mrg at its end and extracts the taken and not taken edges out of it 1266 1.1 mrg and store it in E1 and E2 respectively. */ 1267 1.1 mrg void 1268 1.1 mrg extract_cond_bb_edges (basic_block b, edge *e1, edge *e2) 1269 1.1 mrg { 1270 1.1 mrg gcc_assert (cfg_hooks->extract_cond_bb_edges); 1271 1.1 mrg cfg_hooks->extract_cond_bb_edges (b, e1, e2); 1272 1.1 mrg } 1273 1.1 mrg 1274 1.1 mrg /* Responsible for updating the ssa info (PHI nodes) on the 1275 1.1 mrg new condition basic block that guards the versioned loop. */ 1276 1.1 mrg void 1277 1.1 mrg lv_adjust_loop_header_phi (basic_block first, basic_block second, 1278 1.1 mrg basic_block new_block, edge e) 1279 1.1 mrg { 1280 1.1 mrg if (cfg_hooks->lv_adjust_loop_header_phi) 1281 1.1 mrg cfg_hooks->lv_adjust_loop_header_phi (first, second, new_block, e); 1282 1.1 mrg } 1283 1.1 mrg 1284 1.1 mrg /* Conditions in trees and RTL are different so we need 1285 1.1 mrg a different handling when we add the condition to the 1286 1.1 mrg versioning code. */ 1287 1.1 mrg void 1288 1.1 mrg lv_add_condition_to_bb (basic_block first, basic_block second, 1289 1.1 mrg basic_block new_block, void *cond) 1290 1.1 mrg { 1291 1.1 mrg gcc_assert (cfg_hooks->lv_add_condition_to_bb); 1292 1.1 mrg cfg_hooks->lv_add_condition_to_bb (first, second, new_block, cond); 1293 1.1 mrg } 1294 1.1 mrg 1295 1.1 mrg /* Checks whether all N blocks in BBS array can be copied. */ 1296 1.1 mrg bool 1297 1.1 mrg can_copy_bbs_p (basic_block *bbs, unsigned n) 1298 1.1 mrg { 1299 1.1 mrg unsigned i; 1300 1.1 mrg edge e; 1301 1.1 mrg int ret = true; 1302 1.1 mrg 1303 1.1 mrg for (i = 0; i < n; i++) 1304 1.1 mrg bbs[i]->flags |= BB_DUPLICATED; 1305 1.1 mrg 1306 1.1 mrg for (i = 0; i < n; i++) 1307 1.1 mrg { 1308 1.1 mrg /* In case we should redirect abnormal edge during duplication, fail. */ 1309 1.1 mrg edge_iterator ei; 1310 1.1 mrg FOR_EACH_EDGE (e, ei, bbs[i]->succs) 1311 1.1 mrg if ((e->flags & EDGE_ABNORMAL) 1312 1.1 mrg && (e->dest->flags & BB_DUPLICATED)) 1313 1.1 mrg { 1314 1.1 mrg ret = false; 1315 1.1 mrg goto end; 1316 1.1 mrg } 1317 1.1 mrg 1318 1.1 mrg if (!can_duplicate_block_p (bbs[i])) 1319 1.1 mrg { 1320 1.1 mrg ret = false; 1321 1.1 mrg break; 1322 1.1 mrg } 1323 1.1 mrg } 1324 1.1 mrg 1325 1.1 mrg end: 1326 1.1 mrg for (i = 0; i < n; i++) 1327 1.1 mrg bbs[i]->flags &= ~BB_DUPLICATED; 1328 1.1 mrg 1329 1.1 mrg return ret; 1330 1.1 mrg } 1331 1.1 mrg 1332 1.1 mrg /* Duplicates N basic blocks stored in array BBS. Newly created basic blocks 1333 1.1 mrg are placed into array NEW_BBS in the same order. Edges from basic blocks 1334 1.1 mrg in BBS are also duplicated and copies of those that lead into BBS are 1335 1.1 mrg redirected to appropriate newly created block. The function assigns bbs 1336 1.1 mrg into loops (copy of basic block bb is assigned to bb->loop_father->copy 1337 1.1 mrg loop, so this must be set up correctly in advance) 1338 1.1 mrg 1339 1.1 mrg If UPDATE_DOMINANCE is true then this function updates dominators locally 1340 1.1 mrg (LOOPS structure that contains the information about dominators is passed 1341 1.1 mrg to enable this), otherwise it does not update the dominator information 1342 1.1 mrg and it assumed that the caller will do this, perhaps by destroying and 1343 1.1 mrg recreating it instead of trying to do an incremental update like this 1344 1.1 mrg function does when update_dominance is true. 1345 1.1 mrg 1346 1.1 mrg BASE is the superloop to that basic block belongs; if its header or latch 1347 1.1 mrg is copied, we do not set the new blocks as header or latch. 1348 1.1 mrg 1349 1.1 mrg Created copies of N_EDGES edges in array EDGES are stored in array NEW_EDGES, 1350 1.1 mrg also in the same order. 1351 1.1 mrg 1352 1.1 mrg Newly created basic blocks are put after the basic block AFTER in the 1353 1.1 mrg instruction stream, and the order of the blocks in BBS array is preserved. */ 1354 1.1 mrg 1355 1.1 mrg void 1356 1.1 mrg copy_bbs (basic_block *bbs, unsigned n, basic_block *new_bbs, 1357 1.1 mrg edge *edges, unsigned num_edges, edge *new_edges, 1358 1.1 mrg class loop *base, basic_block after, bool update_dominance) 1359 1.1 mrg { 1360 1.1 mrg unsigned i, j; 1361 1.1 mrg basic_block bb, new_bb, dom_bb; 1362 1.1 mrg edge e; 1363 1.1 mrg copy_bb_data id; 1364 1.1 mrg 1365 1.1 mrg /* Mark the blocks to be copied. This is used by edge creation hooks 1366 1.1 mrg to decide whether to reallocate PHI nodes capacity to avoid reallocating 1367 1.1 mrg PHIs in the set of source BBs. */ 1368 1.1 mrg for (i = 0; i < n; i++) 1369 1.1 mrg bbs[i]->flags |= BB_DUPLICATED; 1370 1.1 mrg 1371 1.1 mrg /* Duplicate bbs, update dominators, assign bbs to loops. */ 1372 1.1 mrg for (i = 0; i < n; i++) 1373 1.1 mrg { 1374 1.1 mrg /* Duplicate. */ 1375 1.1 mrg bb = bbs[i]; 1376 1.1 mrg new_bb = new_bbs[i] = duplicate_block (bb, NULL, after, &id); 1377 1.1 mrg after = new_bb; 1378 1.1 mrg if (bb->loop_father) 1379 1.1 mrg { 1380 1.1 mrg /* Possibly set loop header. */ 1381 1.1 mrg if (bb->loop_father->header == bb && bb->loop_father != base) 1382 1.1 mrg new_bb->loop_father->header = new_bb; 1383 1.1 mrg /* Or latch. */ 1384 1.1 mrg if (bb->loop_father->latch == bb && bb->loop_father != base) 1385 1.1 mrg new_bb->loop_father->latch = new_bb; 1386 1.1 mrg } 1387 1.1 mrg } 1388 1.1 mrg 1389 1.1 mrg /* Set dominators. */ 1390 1.1 mrg if (update_dominance) 1391 1.1 mrg { 1392 1.1 mrg for (i = 0; i < n; i++) 1393 1.1 mrg { 1394 1.1 mrg bb = bbs[i]; 1395 1.1 mrg new_bb = new_bbs[i]; 1396 1.1 mrg 1397 1.1 mrg dom_bb = get_immediate_dominator (CDI_DOMINATORS, bb); 1398 1.1 mrg if (dom_bb->flags & BB_DUPLICATED) 1399 1.1 mrg { 1400 1.1 mrg dom_bb = get_bb_copy (dom_bb); 1401 1.1 mrg set_immediate_dominator (CDI_DOMINATORS, new_bb, dom_bb); 1402 1.1 mrg } 1403 1.1 mrg } 1404 1.1 mrg } 1405 1.1 mrg 1406 1.1 mrg /* Redirect edges. */ 1407 1.1 mrg for (i = 0; i < n; i++) 1408 1.1 mrg { 1409 1.1 mrg edge_iterator ei; 1410 1.1 mrg new_bb = new_bbs[i]; 1411 1.1 mrg bb = bbs[i]; 1412 1.1 mrg 1413 1.1 mrg FOR_EACH_EDGE (e, ei, new_bb->succs) 1414 1.1 mrg { 1415 1.1 mrg if (!(e->dest->flags & BB_DUPLICATED)) 1416 1.1 mrg continue; 1417 1.1 mrg redirect_edge_and_branch_force (e, get_bb_copy (e->dest)); 1418 1.1 mrg } 1419 1.1 mrg } 1420 1.1 mrg for (j = 0; j < num_edges; j++) 1421 1.1 mrg { 1422 1.1 mrg if (!edges[j]) 1423 1.1 mrg new_edges[j] = NULL; 1424 1.1 mrg else 1425 1.1 mrg { 1426 1.1 mrg basic_block src = edges[j]->src; 1427 1.1 mrg basic_block dest = edges[j]->dest; 1428 1.1 mrg if (src->flags & BB_DUPLICATED) 1429 1.1 mrg src = get_bb_copy (src); 1430 1.1 mrg if (dest->flags & BB_DUPLICATED) 1431 1.1 mrg dest = get_bb_copy (dest); 1432 1.1 mrg new_edges[j] = find_edge (src, dest); 1433 1.1 mrg } 1434 1.1 mrg } 1435 1.1 mrg 1436 1.1 mrg /* Clear information about duplicates. */ 1437 1.1 mrg for (i = 0; i < n; i++) 1438 1.1 mrg bbs[i]->flags &= ~BB_DUPLICATED; 1439 1.1 mrg } 1440 1.1 mrg 1441 1.1 mrg /* Return true if BB contains only labels or non-executable 1442 1.1 mrg instructions */ 1443 1.1 mrg bool 1444 1.1 mrg empty_block_p (basic_block bb) 1445 1.1 mrg { 1446 1.1 mrg gcc_assert (cfg_hooks->empty_block_p); 1447 1.1 mrg return cfg_hooks->empty_block_p (bb); 1448 1.1 mrg } 1449 1.1 mrg 1450 1.1 mrg /* Split a basic block if it ends with a conditional branch and if 1451 1.1 mrg the other part of the block is not empty. */ 1452 1.1 mrg basic_block 1453 1.1 mrg split_block_before_cond_jump (basic_block bb) 1454 1.1 mrg { 1455 1.1 mrg gcc_assert (cfg_hooks->split_block_before_cond_jump); 1456 1.1 mrg return cfg_hooks->split_block_before_cond_jump (bb); 1457 1.1 mrg } 1458 1.1 mrg 1459 1.1 mrg /* Work-horse for passes.cc:check_profile_consistency. 1460 1.1 mrg Do book-keeping of the CFG for the profile consistency checker. 1461 1.1 mrg Store the counting in RECORD. */ 1462 1.1 mrg 1463 1.1 mrg void 1464 1.1 mrg profile_record_check_consistency (profile_record *record) 1465 1.1 mrg { 1466 1.1 mrg basic_block bb; 1467 1.1 mrg edge_iterator ei; 1468 1.1 mrg edge e; 1469 1.1 mrg 1470 1.1 mrg FOR_ALL_BB_FN (bb, cfun) 1471 1.1 mrg { 1472 1.1 mrg if (bb != EXIT_BLOCK_PTR_FOR_FN (cfun) 1473 1.1 mrg && profile_status_for_fn (cfun) != PROFILE_ABSENT 1474 1.1 mrg && EDGE_COUNT (bb->succs)) 1475 1.1 mrg { 1476 1.1 mrg sreal sum = 0; 1477 1.1 mrg bool found = false; 1478 1.1 mrg FOR_EACH_EDGE (e, ei, bb->succs) 1479 1.1 mrg { 1480 1.1 mrg if (!(e->flags & (EDGE_EH | EDGE_FAKE))) 1481 1.1 mrg found = true; 1482 1.1 mrg if (e->probability.initialized_p ()) 1483 1.1 mrg sum += e->probability.to_sreal (); 1484 1.1 mrg } 1485 1.1 mrg double dsum = sum.to_double (); 1486 1.1 mrg if (found && (dsum < 0.9 || dsum > 1.1) 1487 1.1 mrg && !(bb->count == profile_count::zero ())) 1488 1.1 mrg { 1489 1.1 mrg record->num_mismatched_prob_out++; 1490 1.1 mrg dsum = dsum > 1 ? dsum - 1 : 1 - dsum; 1491 1.1 mrg if (profile_info) 1492 1.1 mrg { 1493 1.1 mrg if (ENTRY_BLOCK_PTR_FOR_FN 1494 1.1 mrg (cfun)->count.ipa ().initialized_p () 1495 1.1 mrg && ENTRY_BLOCK_PTR_FOR_FN 1496 1.1 mrg (cfun)->count.ipa ().nonzero_p () 1497 1.1 mrg && bb->count.ipa ().initialized_p ()) 1498 1.1 mrg record->dyn_mismatched_prob_out 1499 1.1 mrg += dsum * bb->count.ipa ().to_gcov_type (); 1500 1.1 mrg } 1501 1.1 mrg else if (bb->count.initialized_p ()) 1502 1.1 mrg record->dyn_mismatched_prob_out 1503 1.1 mrg += dsum * bb->count.to_sreal_scale 1504 1.1 mrg (ENTRY_BLOCK_PTR_FOR_FN (cfun)->count).to_double (); 1505 1.1 mrg } 1506 1.1 mrg } 1507 1.1 mrg if (bb != ENTRY_BLOCK_PTR_FOR_FN (cfun) 1508 1.1 mrg && profile_status_for_fn (cfun) != PROFILE_ABSENT) 1509 1.1 mrg { 1510 1.1 mrg profile_count lsum = profile_count::zero (); 1511 1.1 mrg FOR_EACH_EDGE (e, ei, bb->preds) 1512 1.1 mrg lsum += e->count (); 1513 1.1 mrg if (lsum.differs_from_p (bb->count)) 1514 1.1 mrg { 1515 1.1 mrg record->num_mismatched_count_in++; 1516 1.1 mrg profile_count max; 1517 1.1 mrg if (lsum < bb->count) 1518 1.1 mrg max = bb->count; 1519 1.1 mrg else 1520 1.1 mrg max = lsum; 1521 1.1 mrg if (profile_info) 1522 1.1 mrg { 1523 1.1 mrg if (ENTRY_BLOCK_PTR_FOR_FN 1524 1.1 mrg (cfun)->count.ipa ().initialized_p () 1525 1.1 mrg && ENTRY_BLOCK_PTR_FOR_FN 1526 1.1 mrg (cfun)->count.ipa ().nonzero_p () 1527 1.1 mrg && max.ipa ().initialized_p ()) 1528 1.1 mrg record->dyn_mismatched_count_in 1529 1.1 mrg += max.ipa ().to_gcov_type (); 1530 1.1 mrg } 1531 1.1 mrg else if (bb->count.initialized_p ()) 1532 1.1 mrg record->dyn_mismatched_prob_out 1533 1.1 mrg += max.to_sreal_scale 1534 1.1 mrg (ENTRY_BLOCK_PTR_FOR_FN (cfun)->count).to_double (); 1535 1.1 mrg } 1536 1.1 mrg } 1537 1.1 mrg if (bb == ENTRY_BLOCK_PTR_FOR_FN (cfun) 1538 1.1 mrg || bb == EXIT_BLOCK_PTR_FOR_FN (cfun)) 1539 1.1 mrg continue; 1540 1.1 mrg } 1541 1.1 mrg } 1542 1.1 mrg 1543 1.1 mrg /* Work-horse for passes.cc:acount_profile. 1544 1.1 mrg Do book-keeping of the CFG for the profile accounting. 1545 1.1 mrg Store the counting in RECORD. */ 1546 1.1 mrg 1547 1.1 mrg void 1548 1.1 mrg profile_record_account_profile (profile_record *record) 1549 1.1 mrg { 1550 1.1 mrg basic_block bb; 1551 1.1 mrg 1552 1.1 mrg FOR_ALL_BB_FN (bb, cfun) 1553 1.1 mrg { 1554 1.1 mrg gcc_assert (cfg_hooks->account_profile_record); 1555 1.1 mrg cfg_hooks->account_profile_record (bb, record); 1556 1.1 mrg } 1557 1.1 mrg } 1558 1.1 mrg 1559 1.1 mrg #if __GNUC__ >= 10 1560 1.1 mrg # pragma GCC diagnostic pop 1561 1.1 mrg #endif 1562