| 1 | /* Control flow optimization code for GNU compiler. |
| 2 | Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, |
| 3 | 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010, 2011 |
| 4 | Free Software Foundation, Inc. |
| 5 | |
| 6 | This file is part of GCC. |
| 7 | |
| 8 | GCC is free software; you can redistribute it and/or modify it under |
| 9 | the terms of the GNU General Public License as published by the Free |
| 10 | Software Foundation; either version 3, or (at your option) any later |
| 11 | version. |
| 12 | |
| 13 | GCC is distributed in the hope that it will be useful, but WITHOUT ANY |
| 14 | WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| 15 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| 16 | for more details. |
| 17 | |
| 18 | You should have received a copy of the GNU General Public License |
| 19 | along with GCC; see the file COPYING3. If not see |
| 20 | <http://www.gnu.org/licenses/>. */ |
| 21 | |
| 22 | /* This file contains optimizer of the control flow. The main entry point is |
| 23 | cleanup_cfg. Following optimizations are performed: |
| 24 | |
| 25 | - Unreachable blocks removal |
| 26 | - Edge forwarding (edge to the forwarder block is forwarded to its |
| 27 | successor. Simplification of the branch instruction is performed by |
| 28 | underlying infrastructure so branch can be converted to simplejump or |
| 29 | eliminated). |
| 30 | - Cross jumping (tail merging) |
| 31 | - Conditional jump-around-simplejump simplification |
| 32 | - Basic block merging. */ |
| 33 | |
| 34 | #include "config.h" |
| 35 | #include "system.h" |
| 36 | #include "coretypes.h" |
| 37 | #include "tm.h" |
| 38 | #include "rtl.h" |
| 39 | #include "hard-reg-set.h" |
| 40 | #include "regs.h" |
| 41 | #include "timevar.h" |
| 42 | #include "output.h" |
| 43 | #include "insn-config.h" |
| 44 | #include "flags.h" |
| 45 | #include "recog.h" |
| 46 | #include "diagnostic-core.h" |
| 47 | #include "cselib.h" |
| 48 | #include "params.h" |
| 49 | #include "tm_p.h" |
| 50 | #include "target.h" |
| 51 | #include "cfglayout.h" |
| 52 | #include "emit-rtl.h" |
| 53 | #include "tree-pass.h" |
| 54 | #include "cfgloop.h" |
| 55 | #include "expr.h" |
| 56 | #include "df.h" |
| 57 | #include "dce.h" |
| 58 | #include "dbgcnt.h" |
| 59 | |
| 60 | #define FORWARDER_BLOCK_P(BB) ((BB)->flags & BB_FORWARDER_BLOCK) |
| 61 | |
| 62 | /* Set to true when we are running first pass of try_optimize_cfg loop. */ |
| 63 | static bool first_pass; |
| 64 | |
| 65 | /* Set to true if crossjumps occured in the latest run of try_optimize_cfg. */ |
| 66 | static bool crossjumps_occured; |
| 67 | |
| 68 | /* Set to true if we couldn't run an optimization due to stale liveness |
| 69 | information; we should run df_analyze to enable more opportunities. */ |
| 70 | static bool block_was_dirty; |
| 71 | |
| 72 | static bool try_crossjump_to_edge (int, edge, edge, enum replace_direction); |
| 73 | static bool try_crossjump_bb (int, basic_block); |
| 74 | static bool outgoing_edges_match (int, basic_block, basic_block); |
| 75 | static enum replace_direction old_insns_match_p (int, rtx, rtx); |
| 76 | |
| 77 | static void merge_blocks_move_predecessor_nojumps (basic_block, basic_block); |
| 78 | static void merge_blocks_move_successor_nojumps (basic_block, basic_block); |
| 79 | static bool try_optimize_cfg (int); |
| 80 | static bool try_simplify_condjump (basic_block); |
| 81 | static bool try_forward_edges (int, basic_block); |
| 82 | static edge thread_jump (edge, basic_block); |
| 83 | static bool mark_effect (rtx, bitmap); |
| 84 | static void notice_new_block (basic_block); |
| 85 | static void update_forwarder_flag (basic_block); |
| 86 | static int mentions_nonequal_regs (rtx *, void *); |
| 87 | static void merge_memattrs (rtx, rtx); |
| 88 | \f |
| 89 | /* Set flags for newly created block. */ |
| 90 | |
| 91 | static void |
| 92 | notice_new_block (basic_block bb) |
| 93 | { |
| 94 | if (!bb) |
| 95 | return; |
| 96 | |
| 97 | if (forwarder_block_p (bb)) |
| 98 | bb->flags |= BB_FORWARDER_BLOCK; |
| 99 | } |
| 100 | |
| 101 | /* Recompute forwarder flag after block has been modified. */ |
| 102 | |
| 103 | static void |
| 104 | update_forwarder_flag (basic_block bb) |
| 105 | { |
| 106 | if (forwarder_block_p (bb)) |
| 107 | bb->flags |= BB_FORWARDER_BLOCK; |
| 108 | else |
| 109 | bb->flags &= ~BB_FORWARDER_BLOCK; |
| 110 | } |
| 111 | \f |
| 112 | /* Simplify a conditional jump around an unconditional jump. |
| 113 | Return true if something changed. */ |
| 114 | |
| 115 | static bool |
| 116 | try_simplify_condjump (basic_block cbranch_block) |
| 117 | { |
| 118 | basic_block jump_block, jump_dest_block, cbranch_dest_block; |
| 119 | edge cbranch_jump_edge, cbranch_fallthru_edge; |
| 120 | rtx cbranch_insn; |
| 121 | |
| 122 | /* Verify that there are exactly two successors. */ |
| 123 | if (EDGE_COUNT (cbranch_block->succs) != 2) |
| 124 | return false; |
| 125 | |
| 126 | /* Verify that we've got a normal conditional branch at the end |
| 127 | of the block. */ |
| 128 | cbranch_insn = BB_END (cbranch_block); |
| 129 | if (!any_condjump_p (cbranch_insn)) |
| 130 | return false; |
| 131 | |
| 132 | cbranch_fallthru_edge = FALLTHRU_EDGE (cbranch_block); |
| 133 | cbranch_jump_edge = BRANCH_EDGE (cbranch_block); |
| 134 | |
| 135 | /* The next block must not have multiple predecessors, must not |
| 136 | be the last block in the function, and must contain just the |
| 137 | unconditional jump. */ |
| 138 | jump_block = cbranch_fallthru_edge->dest; |
| 139 | if (!single_pred_p (jump_block) |
| 140 | || jump_block->next_bb == EXIT_BLOCK_PTR |
| 141 | || !FORWARDER_BLOCK_P (jump_block)) |
| 142 | return false; |
| 143 | jump_dest_block = single_succ (jump_block); |
| 144 | |
| 145 | /* If we are partitioning hot/cold basic blocks, we don't want to |
| 146 | mess up unconditional or indirect jumps that cross between hot |
| 147 | and cold sections. |
| 148 | |
| 149 | Basic block partitioning may result in some jumps that appear to |
| 150 | be optimizable (or blocks that appear to be mergeable), but which really |
| 151 | must be left untouched (they are required to make it safely across |
| 152 | partition boundaries). See the comments at the top of |
| 153 | bb-reorder.c:partition_hot_cold_basic_blocks for complete details. */ |
| 154 | |
| 155 | if (BB_PARTITION (jump_block) != BB_PARTITION (jump_dest_block) |
| 156 | || (cbranch_jump_edge->flags & EDGE_CROSSING)) |
| 157 | return false; |
| 158 | |
| 159 | /* The conditional branch must target the block after the |
| 160 | unconditional branch. */ |
| 161 | cbranch_dest_block = cbranch_jump_edge->dest; |
| 162 | |
| 163 | if (cbranch_dest_block == EXIT_BLOCK_PTR |
| 164 | || !can_fallthru (jump_block, cbranch_dest_block)) |
| 165 | return false; |
| 166 | |
| 167 | /* Invert the conditional branch. */ |
| 168 | if (!invert_jump (cbranch_insn, block_label (jump_dest_block), 0)) |
| 169 | return false; |
| 170 | |
| 171 | if (dump_file) |
| 172 | fprintf (dump_file, "Simplifying condjump %i around jump %i\n", |
| 173 | INSN_UID (cbranch_insn), INSN_UID (BB_END (jump_block))); |
| 174 | |
| 175 | /* Success. Update the CFG to match. Note that after this point |
| 176 | the edge variable names appear backwards; the redirection is done |
| 177 | this way to preserve edge profile data. */ |
| 178 | cbranch_jump_edge = redirect_edge_succ_nodup (cbranch_jump_edge, |
| 179 | cbranch_dest_block); |
| 180 | cbranch_fallthru_edge = redirect_edge_succ_nodup (cbranch_fallthru_edge, |
| 181 | jump_dest_block); |
| 182 | cbranch_jump_edge->flags |= EDGE_FALLTHRU; |
| 183 | cbranch_fallthru_edge->flags &= ~EDGE_FALLTHRU; |
| 184 | update_br_prob_note (cbranch_block); |
| 185 | |
| 186 | /* Delete the block with the unconditional jump, and clean up the mess. */ |
| 187 | delete_basic_block (jump_block); |
| 188 | tidy_fallthru_edge (cbranch_jump_edge); |
| 189 | update_forwarder_flag (cbranch_block); |
| 190 | |
| 191 | return true; |
| 192 | } |
| 193 | \f |
| 194 | /* Attempt to prove that operation is NOOP using CSElib or mark the effect |
| 195 | on register. Used by jump threading. */ |
| 196 | |
| 197 | static bool |
| 198 | mark_effect (rtx exp, regset nonequal) |
| 199 | { |
| 200 | int regno; |
| 201 | rtx dest; |
| 202 | switch (GET_CODE (exp)) |
| 203 | { |
| 204 | /* In case we do clobber the register, mark it as equal, as we know the |
| 205 | value is dead so it don't have to match. */ |
| 206 | case CLOBBER: |
| 207 | if (REG_P (XEXP (exp, 0))) |
| 208 | { |
| 209 | dest = XEXP (exp, 0); |
| 210 | regno = REGNO (dest); |
| 211 | if (HARD_REGISTER_NUM_P (regno)) |
| 212 | bitmap_clear_range (nonequal, regno, |
| 213 | hard_regno_nregs[regno][GET_MODE (dest)]); |
| 214 | else |
| 215 | bitmap_clear_bit (nonequal, regno); |
| 216 | } |
| 217 | return false; |
| 218 | |
| 219 | case SET: |
| 220 | if (rtx_equal_for_cselib_p (SET_DEST (exp), SET_SRC (exp))) |
| 221 | return false; |
| 222 | dest = SET_DEST (exp); |
| 223 | if (dest == pc_rtx) |
| 224 | return false; |
| 225 | if (!REG_P (dest)) |
| 226 | return true; |
| 227 | regno = REGNO (dest); |
| 228 | if (HARD_REGISTER_NUM_P (regno)) |
| 229 | bitmap_set_range (nonequal, regno, |
| 230 | hard_regno_nregs[regno][GET_MODE (dest)]); |
| 231 | else |
| 232 | bitmap_set_bit (nonequal, regno); |
| 233 | return false; |
| 234 | |
| 235 | default: |
| 236 | return false; |
| 237 | } |
| 238 | } |
| 239 | |
| 240 | /* Return nonzero if X is a register set in regset DATA. |
| 241 | Called via for_each_rtx. */ |
| 242 | static int |
| 243 | mentions_nonequal_regs (rtx *x, void *data) |
| 244 | { |
| 245 | regset nonequal = (regset) data; |
| 246 | if (REG_P (*x)) |
| 247 | { |
| 248 | int regno; |
| 249 | |
| 250 | regno = REGNO (*x); |
| 251 | if (REGNO_REG_SET_P (nonequal, regno)) |
| 252 | return 1; |
| 253 | if (regno < FIRST_PSEUDO_REGISTER) |
| 254 | { |
| 255 | int n = hard_regno_nregs[regno][GET_MODE (*x)]; |
| 256 | while (--n > 0) |
| 257 | if (REGNO_REG_SET_P (nonequal, regno + n)) |
| 258 | return 1; |
| 259 | } |
| 260 | } |
| 261 | return 0; |
| 262 | } |
| 263 | /* Attempt to prove that the basic block B will have no side effects and |
| 264 | always continues in the same edge if reached via E. Return the edge |
| 265 | if exist, NULL otherwise. */ |
| 266 | |
| 267 | static edge |
| 268 | thread_jump (edge e, basic_block b) |
| 269 | { |
| 270 | rtx set1, set2, cond1, cond2, insn; |
| 271 | enum rtx_code code1, code2, reversed_code2; |
| 272 | bool reverse1 = false; |
| 273 | unsigned i; |
| 274 | regset nonequal; |
| 275 | bool failed = false; |
| 276 | reg_set_iterator rsi; |
| 277 | |
| 278 | if (b->flags & BB_NONTHREADABLE_BLOCK) |
| 279 | return NULL; |
| 280 | |
| 281 | /* At the moment, we do handle only conditional jumps, but later we may |
| 282 | want to extend this code to tablejumps and others. */ |
| 283 | if (EDGE_COUNT (e->src->succs) != 2) |
| 284 | return NULL; |
| 285 | if (EDGE_COUNT (b->succs) != 2) |
| 286 | { |
| 287 | b->flags |= BB_NONTHREADABLE_BLOCK; |
| 288 | return NULL; |
| 289 | } |
| 290 | |
| 291 | /* Second branch must end with onlyjump, as we will eliminate the jump. */ |
| 292 | if (!any_condjump_p (BB_END (e->src))) |
| 293 | return NULL; |
| 294 | |
| 295 | if (!any_condjump_p (BB_END (b)) || !onlyjump_p (BB_END (b))) |
| 296 | { |
| 297 | b->flags |= BB_NONTHREADABLE_BLOCK; |
| 298 | return NULL; |
| 299 | } |
| 300 | |
| 301 | set1 = pc_set (BB_END (e->src)); |
| 302 | set2 = pc_set (BB_END (b)); |
| 303 | if (((e->flags & EDGE_FALLTHRU) != 0) |
| 304 | != (XEXP (SET_SRC (set1), 1) == pc_rtx)) |
| 305 | reverse1 = true; |
| 306 | |
| 307 | cond1 = XEXP (SET_SRC (set1), 0); |
| 308 | cond2 = XEXP (SET_SRC (set2), 0); |
| 309 | if (reverse1) |
| 310 | code1 = reversed_comparison_code (cond1, BB_END (e->src)); |
| 311 | else |
| 312 | code1 = GET_CODE (cond1); |
| 313 | |
| 314 | code2 = GET_CODE (cond2); |
| 315 | reversed_code2 = reversed_comparison_code (cond2, BB_END (b)); |
| 316 | |
| 317 | if (!comparison_dominates_p (code1, code2) |
| 318 | && !comparison_dominates_p (code1, reversed_code2)) |
| 319 | return NULL; |
| 320 | |
| 321 | /* Ensure that the comparison operators are equivalent. |
| 322 | ??? This is far too pessimistic. We should allow swapped operands, |
| 323 | different CCmodes, or for example comparisons for interval, that |
| 324 | dominate even when operands are not equivalent. */ |
| 325 | if (!rtx_equal_p (XEXP (cond1, 0), XEXP (cond2, 0)) |
| 326 | || !rtx_equal_p (XEXP (cond1, 1), XEXP (cond2, 1))) |
| 327 | return NULL; |
| 328 | |
| 329 | /* Short circuit cases where block B contains some side effects, as we can't |
| 330 | safely bypass it. */ |
| 331 | for (insn = NEXT_INSN (BB_HEAD (b)); insn != NEXT_INSN (BB_END (b)); |
| 332 | insn = NEXT_INSN (insn)) |
| 333 | if (INSN_P (insn) && side_effects_p (PATTERN (insn))) |
| 334 | { |
| 335 | b->flags |= BB_NONTHREADABLE_BLOCK; |
| 336 | return NULL; |
| 337 | } |
| 338 | |
| 339 | cselib_init (0); |
| 340 | |
| 341 | /* First process all values computed in the source basic block. */ |
| 342 | for (insn = NEXT_INSN (BB_HEAD (e->src)); |
| 343 | insn != NEXT_INSN (BB_END (e->src)); |
| 344 | insn = NEXT_INSN (insn)) |
| 345 | if (INSN_P (insn)) |
| 346 | cselib_process_insn (insn); |
| 347 | |
| 348 | nonequal = BITMAP_ALLOC (NULL); |
| 349 | CLEAR_REG_SET (nonequal); |
| 350 | |
| 351 | /* Now assume that we've continued by the edge E to B and continue |
| 352 | processing as if it were same basic block. |
| 353 | Our goal is to prove that whole block is an NOOP. */ |
| 354 | |
| 355 | for (insn = NEXT_INSN (BB_HEAD (b)); |
| 356 | insn != NEXT_INSN (BB_END (b)) && !failed; |
| 357 | insn = NEXT_INSN (insn)) |
| 358 | { |
| 359 | if (INSN_P (insn)) |
| 360 | { |
| 361 | rtx pat = PATTERN (insn); |
| 362 | |
| 363 | if (GET_CODE (pat) == PARALLEL) |
| 364 | { |
| 365 | for (i = 0; i < (unsigned)XVECLEN (pat, 0); i++) |
| 366 | failed |= mark_effect (XVECEXP (pat, 0, i), nonequal); |
| 367 | } |
| 368 | else |
| 369 | failed |= mark_effect (pat, nonequal); |
| 370 | } |
| 371 | |
| 372 | cselib_process_insn (insn); |
| 373 | } |
| 374 | |
| 375 | /* Later we should clear nonequal of dead registers. So far we don't |
| 376 | have life information in cfg_cleanup. */ |
| 377 | if (failed) |
| 378 | { |
| 379 | b->flags |= BB_NONTHREADABLE_BLOCK; |
| 380 | goto failed_exit; |
| 381 | } |
| 382 | |
| 383 | /* cond2 must not mention any register that is not equal to the |
| 384 | former block. */ |
| 385 | if (for_each_rtx (&cond2, mentions_nonequal_regs, nonequal)) |
| 386 | goto failed_exit; |
| 387 | |
| 388 | EXECUTE_IF_SET_IN_REG_SET (nonequal, 0, i, rsi) |
| 389 | goto failed_exit; |
| 390 | |
| 391 | BITMAP_FREE (nonequal); |
| 392 | cselib_finish (); |
| 393 | if ((comparison_dominates_p (code1, code2) != 0) |
| 394 | != (XEXP (SET_SRC (set2), 1) == pc_rtx)) |
| 395 | return BRANCH_EDGE (b); |
| 396 | else |
| 397 | return FALLTHRU_EDGE (b); |
| 398 | |
| 399 | failed_exit: |
| 400 | BITMAP_FREE (nonequal); |
| 401 | cselib_finish (); |
| 402 | return NULL; |
| 403 | } |
| 404 | \f |
| 405 | /* Attempt to forward edges leaving basic block B. |
| 406 | Return true if successful. */ |
| 407 | |
| 408 | static bool |
| 409 | try_forward_edges (int mode, basic_block b) |
| 410 | { |
| 411 | bool changed = false; |
| 412 | edge_iterator ei; |
| 413 | edge e, *threaded_edges = NULL; |
| 414 | |
| 415 | /* If we are partitioning hot/cold basic blocks, we don't want to |
| 416 | mess up unconditional or indirect jumps that cross between hot |
| 417 | and cold sections. |
| 418 | |
| 419 | Basic block partitioning may result in some jumps that appear to |
| 420 | be optimizable (or blocks that appear to be mergeable), but which really |
| 421 | must be left untouched (they are required to make it safely across |
| 422 | partition boundaries). See the comments at the top of |
| 423 | bb-reorder.c:partition_hot_cold_basic_blocks for complete details. */ |
| 424 | |
| 425 | if (find_reg_note (BB_END (b), REG_CROSSING_JUMP, NULL_RTX)) |
| 426 | return false; |
| 427 | |
| 428 | for (ei = ei_start (b->succs); (e = ei_safe_edge (ei)); ) |
| 429 | { |
| 430 | basic_block target, first; |
| 431 | int counter, goto_locus; |
| 432 | bool threaded = false; |
| 433 | int nthreaded_edges = 0; |
| 434 | bool may_thread = first_pass || (b->flags & BB_MODIFIED) != 0; |
| 435 | |
| 436 | /* Skip complex edges because we don't know how to update them. |
| 437 | |
| 438 | Still handle fallthru edges, as we can succeed to forward fallthru |
| 439 | edge to the same place as the branch edge of conditional branch |
| 440 | and turn conditional branch to an unconditional branch. */ |
| 441 | if (e->flags & EDGE_COMPLEX) |
| 442 | { |
| 443 | ei_next (&ei); |
| 444 | continue; |
| 445 | } |
| 446 | |
| 447 | target = first = e->dest; |
| 448 | counter = NUM_FIXED_BLOCKS; |
| 449 | goto_locus = e->goto_locus; |
| 450 | |
| 451 | /* If we are partitioning hot/cold basic_blocks, we don't want to mess |
| 452 | up jumps that cross between hot/cold sections. |
| 453 | |
| 454 | Basic block partitioning may result in some jumps that appear |
| 455 | to be optimizable (or blocks that appear to be mergeable), but which |
| 456 | really must be left untouched (they are required to make it safely |
| 457 | across partition boundaries). See the comments at the top of |
| 458 | bb-reorder.c:partition_hot_cold_basic_blocks for complete |
| 459 | details. */ |
| 460 | |
| 461 | if (first != EXIT_BLOCK_PTR |
| 462 | && find_reg_note (BB_END (first), REG_CROSSING_JUMP, NULL_RTX)) |
| 463 | return false; |
| 464 | |
| 465 | while (counter < n_basic_blocks) |
| 466 | { |
| 467 | basic_block new_target = NULL; |
| 468 | bool new_target_threaded = false; |
| 469 | may_thread |= (target->flags & BB_MODIFIED) != 0; |
| 470 | |
| 471 | if (FORWARDER_BLOCK_P (target) |
| 472 | && !(single_succ_edge (target)->flags & EDGE_CROSSING) |
| 473 | && single_succ (target) != EXIT_BLOCK_PTR) |
| 474 | { |
| 475 | /* Bypass trivial infinite loops. */ |
| 476 | new_target = single_succ (target); |
| 477 | if (target == new_target) |
| 478 | counter = n_basic_blocks; |
| 479 | else if (!optimize) |
| 480 | { |
| 481 | /* When not optimizing, ensure that edges or forwarder |
| 482 | blocks with different locus are not optimized out. */ |
| 483 | int new_locus = single_succ_edge (target)->goto_locus; |
| 484 | int locus = goto_locus; |
| 485 | |
| 486 | if (new_locus && locus && !locator_eq (new_locus, locus)) |
| 487 | new_target = NULL; |
| 488 | else |
| 489 | { |
| 490 | rtx last; |
| 491 | |
| 492 | if (new_locus) |
| 493 | locus = new_locus; |
| 494 | |
| 495 | last = BB_END (target); |
| 496 | if (DEBUG_INSN_P (last)) |
| 497 | last = prev_nondebug_insn (last); |
| 498 | |
| 499 | new_locus = last && INSN_P (last) |
| 500 | ? INSN_LOCATOR (last) : 0; |
| 501 | |
| 502 | if (new_locus && locus && !locator_eq (new_locus, locus)) |
| 503 | new_target = NULL; |
| 504 | else |
| 505 | { |
| 506 | if (new_locus) |
| 507 | locus = new_locus; |
| 508 | |
| 509 | goto_locus = locus; |
| 510 | } |
| 511 | } |
| 512 | } |
| 513 | } |
| 514 | |
| 515 | /* Allow to thread only over one edge at time to simplify updating |
| 516 | of probabilities. */ |
| 517 | else if ((mode & CLEANUP_THREADING) && may_thread) |
| 518 | { |
| 519 | edge t = thread_jump (e, target); |
| 520 | if (t) |
| 521 | { |
| 522 | if (!threaded_edges) |
| 523 | threaded_edges = XNEWVEC (edge, n_basic_blocks); |
| 524 | else |
| 525 | { |
| 526 | int i; |
| 527 | |
| 528 | /* Detect an infinite loop across blocks not |
| 529 | including the start block. */ |
| 530 | for (i = 0; i < nthreaded_edges; ++i) |
| 531 | if (threaded_edges[i] == t) |
| 532 | break; |
| 533 | if (i < nthreaded_edges) |
| 534 | { |
| 535 | counter = n_basic_blocks; |
| 536 | break; |
| 537 | } |
| 538 | } |
| 539 | |
| 540 | /* Detect an infinite loop across the start block. */ |
| 541 | if (t->dest == b) |
| 542 | break; |
| 543 | |
| 544 | gcc_assert (nthreaded_edges < n_basic_blocks - NUM_FIXED_BLOCKS); |
| 545 | threaded_edges[nthreaded_edges++] = t; |
| 546 | |
| 547 | new_target = t->dest; |
| 548 | new_target_threaded = true; |
| 549 | } |
| 550 | } |
| 551 | |
| 552 | if (!new_target) |
| 553 | break; |
| 554 | |
| 555 | counter++; |
| 556 | target = new_target; |
| 557 | threaded |= new_target_threaded; |
| 558 | } |
| 559 | |
| 560 | if (counter >= n_basic_blocks) |
| 561 | { |
| 562 | if (dump_file) |
| 563 | fprintf (dump_file, "Infinite loop in BB %i.\n", |
| 564 | target->index); |
| 565 | } |
| 566 | else if (target == first) |
| 567 | ; /* We didn't do anything. */ |
| 568 | else |
| 569 | { |
| 570 | /* Save the values now, as the edge may get removed. */ |
| 571 | gcov_type edge_count = e->count; |
| 572 | int edge_probability = e->probability; |
| 573 | int edge_frequency; |
| 574 | int n = 0; |
| 575 | |
| 576 | e->goto_locus = goto_locus; |
| 577 | |
| 578 | /* Don't force if target is exit block. */ |
| 579 | if (threaded && target != EXIT_BLOCK_PTR) |
| 580 | { |
| 581 | notice_new_block (redirect_edge_and_branch_force (e, target)); |
| 582 | if (dump_file) |
| 583 | fprintf (dump_file, "Conditionals threaded.\n"); |
| 584 | } |
| 585 | else if (!redirect_edge_and_branch (e, target)) |
| 586 | { |
| 587 | if (dump_file) |
| 588 | fprintf (dump_file, |
| 589 | "Forwarding edge %i->%i to %i failed.\n", |
| 590 | b->index, e->dest->index, target->index); |
| 591 | ei_next (&ei); |
| 592 | continue; |
| 593 | } |
| 594 | |
| 595 | /* We successfully forwarded the edge. Now update profile |
| 596 | data: for each edge we traversed in the chain, remove |
| 597 | the original edge's execution count. */ |
| 598 | edge_frequency = ((edge_probability * b->frequency |
| 599 | + REG_BR_PROB_BASE / 2) |
| 600 | / REG_BR_PROB_BASE); |
| 601 | |
| 602 | do |
| 603 | { |
| 604 | edge t; |
| 605 | |
| 606 | if (!single_succ_p (first)) |
| 607 | { |
| 608 | gcc_assert (n < nthreaded_edges); |
| 609 | t = threaded_edges [n++]; |
| 610 | gcc_assert (t->src == first); |
| 611 | update_bb_profile_for_threading (first, edge_frequency, |
| 612 | edge_count, t); |
| 613 | update_br_prob_note (first); |
| 614 | } |
| 615 | else |
| 616 | { |
| 617 | first->count -= edge_count; |
| 618 | if (first->count < 0) |
| 619 | first->count = 0; |
| 620 | first->frequency -= edge_frequency; |
| 621 | if (first->frequency < 0) |
| 622 | first->frequency = 0; |
| 623 | /* It is possible that as the result of |
| 624 | threading we've removed edge as it is |
| 625 | threaded to the fallthru edge. Avoid |
| 626 | getting out of sync. */ |
| 627 | if (n < nthreaded_edges |
| 628 | && first == threaded_edges [n]->src) |
| 629 | n++; |
| 630 | t = single_succ_edge (first); |
| 631 | } |
| 632 | |
| 633 | t->count -= edge_count; |
| 634 | if (t->count < 0) |
| 635 | t->count = 0; |
| 636 | first = t->dest; |
| 637 | } |
| 638 | while (first != target); |
| 639 | |
| 640 | changed = true; |
| 641 | continue; |
| 642 | } |
| 643 | ei_next (&ei); |
| 644 | } |
| 645 | |
| 646 | free (threaded_edges); |
| 647 | return changed; |
| 648 | } |
| 649 | \f |
| 650 | |
| 651 | /* Blocks A and B are to be merged into a single block. A has no incoming |
| 652 | fallthru edge, so it can be moved before B without adding or modifying |
| 653 | any jumps (aside from the jump from A to B). */ |
| 654 | |
| 655 | static void |
| 656 | merge_blocks_move_predecessor_nojumps (basic_block a, basic_block b) |
| 657 | { |
| 658 | rtx barrier; |
| 659 | |
| 660 | /* If we are partitioning hot/cold basic blocks, we don't want to |
| 661 | mess up unconditional or indirect jumps that cross between hot |
| 662 | and cold sections. |
| 663 | |
| 664 | Basic block partitioning may result in some jumps that appear to |
| 665 | be optimizable (or blocks that appear to be mergeable), but which really |
| 666 | must be left untouched (they are required to make it safely across |
| 667 | partition boundaries). See the comments at the top of |
| 668 | bb-reorder.c:partition_hot_cold_basic_blocks for complete details. */ |
| 669 | |
| 670 | if (BB_PARTITION (a) != BB_PARTITION (b)) |
| 671 | return; |
| 672 | |
| 673 | barrier = next_nonnote_insn (BB_END (a)); |
| 674 | gcc_assert (BARRIER_P (barrier)); |
| 675 | delete_insn (barrier); |
| 676 | |
| 677 | /* Scramble the insn chain. */ |
| 678 | if (BB_END (a) != PREV_INSN (BB_HEAD (b))) |
| 679 | reorder_insns_nobb (BB_HEAD (a), BB_END (a), PREV_INSN (BB_HEAD (b))); |
| 680 | df_set_bb_dirty (a); |
| 681 | |
| 682 | if (dump_file) |
| 683 | fprintf (dump_file, "Moved block %d before %d and merged.\n", |
| 684 | a->index, b->index); |
| 685 | |
| 686 | /* Swap the records for the two blocks around. */ |
| 687 | |
| 688 | unlink_block (a); |
| 689 | link_block (a, b->prev_bb); |
| 690 | |
| 691 | /* Now blocks A and B are contiguous. Merge them. */ |
| 692 | merge_blocks (a, b); |
| 693 | } |
| 694 | |
| 695 | /* Blocks A and B are to be merged into a single block. B has no outgoing |
| 696 | fallthru edge, so it can be moved after A without adding or modifying |
| 697 | any jumps (aside from the jump from A to B). */ |
| 698 | |
| 699 | static void |
| 700 | merge_blocks_move_successor_nojumps (basic_block a, basic_block b) |
| 701 | { |
| 702 | rtx barrier, real_b_end; |
| 703 | rtx label, table; |
| 704 | |
| 705 | /* If we are partitioning hot/cold basic blocks, we don't want to |
| 706 | mess up unconditional or indirect jumps that cross between hot |
| 707 | and cold sections. |
| 708 | |
| 709 | Basic block partitioning may result in some jumps that appear to |
| 710 | be optimizable (or blocks that appear to be mergeable), but which really |
| 711 | must be left untouched (they are required to make it safely across |
| 712 | partition boundaries). See the comments at the top of |
| 713 | bb-reorder.c:partition_hot_cold_basic_blocks for complete details. */ |
| 714 | |
| 715 | if (BB_PARTITION (a) != BB_PARTITION (b)) |
| 716 | return; |
| 717 | |
| 718 | real_b_end = BB_END (b); |
| 719 | |
| 720 | /* If there is a jump table following block B temporarily add the jump table |
| 721 | to block B so that it will also be moved to the correct location. */ |
| 722 | if (tablejump_p (BB_END (b), &label, &table) |
| 723 | && prev_active_insn (label) == BB_END (b)) |
| 724 | { |
| 725 | BB_END (b) = table; |
| 726 | } |
| 727 | |
| 728 | /* There had better have been a barrier there. Delete it. */ |
| 729 | barrier = NEXT_INSN (BB_END (b)); |
| 730 | if (barrier && BARRIER_P (barrier)) |
| 731 | delete_insn (barrier); |
| 732 | |
| 733 | |
| 734 | /* Scramble the insn chain. */ |
| 735 | reorder_insns_nobb (BB_HEAD (b), BB_END (b), BB_END (a)); |
| 736 | |
| 737 | /* Restore the real end of b. */ |
| 738 | BB_END (b) = real_b_end; |
| 739 | |
| 740 | if (dump_file) |
| 741 | fprintf (dump_file, "Moved block %d after %d and merged.\n", |
| 742 | b->index, a->index); |
| 743 | |
| 744 | /* Now blocks A and B are contiguous. Merge them. */ |
| 745 | merge_blocks (a, b); |
| 746 | } |
| 747 | |
| 748 | /* Attempt to merge basic blocks that are potentially non-adjacent. |
| 749 | Return NULL iff the attempt failed, otherwise return basic block |
| 750 | where cleanup_cfg should continue. Because the merging commonly |
| 751 | moves basic block away or introduces another optimization |
| 752 | possibility, return basic block just before B so cleanup_cfg don't |
| 753 | need to iterate. |
| 754 | |
| 755 | It may be good idea to return basic block before C in the case |
| 756 | C has been moved after B and originally appeared earlier in the |
| 757 | insn sequence, but we have no information available about the |
| 758 | relative ordering of these two. Hopefully it is not too common. */ |
| 759 | |
| 760 | static basic_block |
| 761 | merge_blocks_move (edge e, basic_block b, basic_block c, int mode) |
| 762 | { |
| 763 | basic_block next; |
| 764 | |
| 765 | /* If we are partitioning hot/cold basic blocks, we don't want to |
| 766 | mess up unconditional or indirect jumps that cross between hot |
| 767 | and cold sections. |
| 768 | |
| 769 | Basic block partitioning may result in some jumps that appear to |
| 770 | be optimizable (or blocks that appear to be mergeable), but which really |
| 771 | must be left untouched (they are required to make it safely across |
| 772 | partition boundaries). See the comments at the top of |
| 773 | bb-reorder.c:partition_hot_cold_basic_blocks for complete details. */ |
| 774 | |
| 775 | if (BB_PARTITION (b) != BB_PARTITION (c)) |
| 776 | return NULL; |
| 777 | |
| 778 | /* If B has a fallthru edge to C, no need to move anything. */ |
| 779 | if (e->flags & EDGE_FALLTHRU) |
| 780 | { |
| 781 | int b_index = b->index, c_index = c->index; |
| 782 | merge_blocks (b, c); |
| 783 | update_forwarder_flag (b); |
| 784 | |
| 785 | if (dump_file) |
| 786 | fprintf (dump_file, "Merged %d and %d without moving.\n", |
| 787 | b_index, c_index); |
| 788 | |
| 789 | return b->prev_bb == ENTRY_BLOCK_PTR ? b : b->prev_bb; |
| 790 | } |
| 791 | |
| 792 | /* Otherwise we will need to move code around. Do that only if expensive |
| 793 | transformations are allowed. */ |
| 794 | else if (mode & CLEANUP_EXPENSIVE) |
| 795 | { |
| 796 | edge tmp_edge, b_fallthru_edge; |
| 797 | bool c_has_outgoing_fallthru; |
| 798 | bool b_has_incoming_fallthru; |
| 799 | |
| 800 | /* Avoid overactive code motion, as the forwarder blocks should be |
| 801 | eliminated by edge redirection instead. One exception might have |
| 802 | been if B is a forwarder block and C has no fallthru edge, but |
| 803 | that should be cleaned up by bb-reorder instead. */ |
| 804 | if (FORWARDER_BLOCK_P (b) || FORWARDER_BLOCK_P (c)) |
| 805 | return NULL; |
| 806 | |
| 807 | /* We must make sure to not munge nesting of lexical blocks, |
| 808 | and loop notes. This is done by squeezing out all the notes |
| 809 | and leaving them there to lie. Not ideal, but functional. */ |
| 810 | |
| 811 | tmp_edge = find_fallthru_edge (c->succs); |
| 812 | c_has_outgoing_fallthru = (tmp_edge != NULL); |
| 813 | |
| 814 | tmp_edge = find_fallthru_edge (b->preds); |
| 815 | b_has_incoming_fallthru = (tmp_edge != NULL); |
| 816 | b_fallthru_edge = tmp_edge; |
| 817 | next = b->prev_bb; |
| 818 | if (next == c) |
| 819 | next = next->prev_bb; |
| 820 | |
| 821 | /* Otherwise, we're going to try to move C after B. If C does |
| 822 | not have an outgoing fallthru, then it can be moved |
| 823 | immediately after B without introducing or modifying jumps. */ |
| 824 | if (! c_has_outgoing_fallthru) |
| 825 | { |
| 826 | merge_blocks_move_successor_nojumps (b, c); |
| 827 | return next == ENTRY_BLOCK_PTR ? next->next_bb : next; |
| 828 | } |
| 829 | |
| 830 | /* If B does not have an incoming fallthru, then it can be moved |
| 831 | immediately before C without introducing or modifying jumps. |
| 832 | C cannot be the first block, so we do not have to worry about |
| 833 | accessing a non-existent block. */ |
| 834 | |
| 835 | if (b_has_incoming_fallthru) |
| 836 | { |
| 837 | basic_block bb; |
| 838 | |
| 839 | if (b_fallthru_edge->src == ENTRY_BLOCK_PTR) |
| 840 | return NULL; |
| 841 | bb = force_nonfallthru (b_fallthru_edge); |
| 842 | if (bb) |
| 843 | notice_new_block (bb); |
| 844 | } |
| 845 | |
| 846 | merge_blocks_move_predecessor_nojumps (b, c); |
| 847 | return next == ENTRY_BLOCK_PTR ? next->next_bb : next; |
| 848 | } |
| 849 | |
| 850 | return NULL; |
| 851 | } |
| 852 | \f |
| 853 | |
| 854 | /* Removes the memory attributes of MEM expression |
| 855 | if they are not equal. */ |
| 856 | |
| 857 | void |
| 858 | merge_memattrs (rtx x, rtx y) |
| 859 | { |
| 860 | int i; |
| 861 | int j; |
| 862 | enum rtx_code code; |
| 863 | const char *fmt; |
| 864 | |
| 865 | if (x == y) |
| 866 | return; |
| 867 | if (x == 0 || y == 0) |
| 868 | return; |
| 869 | |
| 870 | code = GET_CODE (x); |
| 871 | |
| 872 | if (code != GET_CODE (y)) |
| 873 | return; |
| 874 | |
| 875 | if (GET_MODE (x) != GET_MODE (y)) |
| 876 | return; |
| 877 | |
| 878 | if (code == MEM && MEM_ATTRS (x) != MEM_ATTRS (y)) |
| 879 | { |
| 880 | if (! MEM_ATTRS (x)) |
| 881 | MEM_ATTRS (y) = 0; |
| 882 | else if (! MEM_ATTRS (y)) |
| 883 | MEM_ATTRS (x) = 0; |
| 884 | else |
| 885 | { |
| 886 | HOST_WIDE_INT mem_size; |
| 887 | |
| 888 | if (MEM_ALIAS_SET (x) != MEM_ALIAS_SET (y)) |
| 889 | { |
| 890 | set_mem_alias_set (x, 0); |
| 891 | set_mem_alias_set (y, 0); |
| 892 | } |
| 893 | |
| 894 | if (! mem_expr_equal_p (MEM_EXPR (x), MEM_EXPR (y))) |
| 895 | { |
| 896 | set_mem_expr (x, 0); |
| 897 | set_mem_expr (y, 0); |
| 898 | clear_mem_offset (x); |
| 899 | clear_mem_offset (y); |
| 900 | } |
| 901 | else if (MEM_OFFSET_KNOWN_P (x) != MEM_OFFSET_KNOWN_P (y) |
| 902 | || (MEM_OFFSET_KNOWN_P (x) |
| 903 | && MEM_OFFSET (x) != MEM_OFFSET (y))) |
| 904 | { |
| 905 | clear_mem_offset (x); |
| 906 | clear_mem_offset (y); |
| 907 | } |
| 908 | |
| 909 | if (MEM_SIZE_KNOWN_P (x) && MEM_SIZE_KNOWN_P (y)) |
| 910 | { |
| 911 | mem_size = MAX (MEM_SIZE (x), MEM_SIZE (y)); |
| 912 | set_mem_size (x, mem_size); |
| 913 | set_mem_size (y, mem_size); |
| 914 | } |
| 915 | else |
| 916 | { |
| 917 | clear_mem_size (x); |
| 918 | clear_mem_size (y); |
| 919 | } |
| 920 | |
| 921 | set_mem_align (x, MIN (MEM_ALIGN (x), MEM_ALIGN (y))); |
| 922 | set_mem_align (y, MEM_ALIGN (x)); |
| 923 | } |
| 924 | } |
| 925 | if (code == MEM) |
| 926 | { |
| 927 | if (MEM_READONLY_P (x) != MEM_READONLY_P (y)) |
| 928 | { |
| 929 | MEM_READONLY_P (x) = 0; |
| 930 | MEM_READONLY_P (y) = 0; |
| 931 | } |
| 932 | if (MEM_NOTRAP_P (x) != MEM_NOTRAP_P (y)) |
| 933 | { |
| 934 | MEM_NOTRAP_P (x) = 0; |
| 935 | MEM_NOTRAP_P (y) = 0; |
| 936 | } |
| 937 | if (MEM_VOLATILE_P (x) != MEM_VOLATILE_P (y)) |
| 938 | { |
| 939 | MEM_VOLATILE_P (x) = 1; |
| 940 | MEM_VOLATILE_P (y) = 1; |
| 941 | } |
| 942 | } |
| 943 | |
| 944 | fmt = GET_RTX_FORMAT (code); |
| 945 | for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) |
| 946 | { |
| 947 | switch (fmt[i]) |
| 948 | { |
| 949 | case 'E': |
| 950 | /* Two vectors must have the same length. */ |
| 951 | if (XVECLEN (x, i) != XVECLEN (y, i)) |
| 952 | return; |
| 953 | |
| 954 | for (j = 0; j < XVECLEN (x, i); j++) |
| 955 | merge_memattrs (XVECEXP (x, i, j), XVECEXP (y, i, j)); |
| 956 | |
| 957 | break; |
| 958 | |
| 959 | case 'e': |
| 960 | merge_memattrs (XEXP (x, i), XEXP (y, i)); |
| 961 | } |
| 962 | } |
| 963 | return; |
| 964 | } |
| 965 | |
| 966 | |
| 967 | /* Checks if patterns P1 and P2 are equivalent, apart from the possibly |
| 968 | different single sets S1 and S2. */ |
| 969 | |
| 970 | static bool |
| 971 | equal_different_set_p (rtx p1, rtx s1, rtx p2, rtx s2) |
| 972 | { |
| 973 | int i; |
| 974 | rtx e1, e2; |
| 975 | |
| 976 | if (p1 == s1 && p2 == s2) |
| 977 | return true; |
| 978 | |
| 979 | if (GET_CODE (p1) != PARALLEL || GET_CODE (p2) != PARALLEL) |
| 980 | return false; |
| 981 | |
| 982 | if (XVECLEN (p1, 0) != XVECLEN (p2, 0)) |
| 983 | return false; |
| 984 | |
| 985 | for (i = 0; i < XVECLEN (p1, 0); i++) |
| 986 | { |
| 987 | e1 = XVECEXP (p1, 0, i); |
| 988 | e2 = XVECEXP (p2, 0, i); |
| 989 | if (e1 == s1 && e2 == s2) |
| 990 | continue; |
| 991 | if (reload_completed |
| 992 | ? rtx_renumbered_equal_p (e1, e2) : rtx_equal_p (e1, e2)) |
| 993 | continue; |
| 994 | |
| 995 | return false; |
| 996 | } |
| 997 | |
| 998 | return true; |
| 999 | } |
| 1000 | |
| 1001 | /* Examine register notes on I1 and I2 and return: |
| 1002 | - dir_forward if I1 can be replaced by I2, or |
| 1003 | - dir_backward if I2 can be replaced by I1, or |
| 1004 | - dir_both if both are the case. */ |
| 1005 | |
| 1006 | static enum replace_direction |
| 1007 | can_replace_by (rtx i1, rtx i2) |
| 1008 | { |
| 1009 | rtx s1, s2, d1, d2, src1, src2, note1, note2; |
| 1010 | bool c1, c2; |
| 1011 | |
| 1012 | /* Check for 2 sets. */ |
| 1013 | s1 = single_set (i1); |
| 1014 | s2 = single_set (i2); |
| 1015 | if (s1 == NULL_RTX || s2 == NULL_RTX) |
| 1016 | return dir_none; |
| 1017 | |
| 1018 | /* Check that the 2 sets set the same dest. */ |
| 1019 | d1 = SET_DEST (s1); |
| 1020 | d2 = SET_DEST (s2); |
| 1021 | if (!(reload_completed |
| 1022 | ? rtx_renumbered_equal_p (d1, d2) : rtx_equal_p (d1, d2))) |
| 1023 | return dir_none; |
| 1024 | |
| 1025 | /* Find identical req_equiv or reg_equal note, which implies that the 2 sets |
| 1026 | set dest to the same value. */ |
| 1027 | note1 = find_reg_equal_equiv_note (i1); |
| 1028 | note2 = find_reg_equal_equiv_note (i2); |
| 1029 | if (!note1 || !note2 || !rtx_equal_p (XEXP (note1, 0), XEXP (note2, 0)) |
| 1030 | || !CONST_INT_P (XEXP (note1, 0))) |
| 1031 | return dir_none; |
| 1032 | |
| 1033 | if (!equal_different_set_p (PATTERN (i1), s1, PATTERN (i2), s2)) |
| 1034 | return dir_none; |
| 1035 | |
| 1036 | /* Although the 2 sets set dest to the same value, we cannot replace |
| 1037 | (set (dest) (const_int)) |
| 1038 | by |
| 1039 | (set (dest) (reg)) |
| 1040 | because we don't know if the reg is live and has the same value at the |
| 1041 | location of replacement. */ |
| 1042 | src1 = SET_SRC (s1); |
| 1043 | src2 = SET_SRC (s2); |
| 1044 | c1 = CONST_INT_P (src1); |
| 1045 | c2 = CONST_INT_P (src2); |
| 1046 | if (c1 && c2) |
| 1047 | return dir_both; |
| 1048 | else if (c2) |
| 1049 | return dir_forward; |
| 1050 | else if (c1) |
| 1051 | return dir_backward; |
| 1052 | |
| 1053 | return dir_none; |
| 1054 | } |
| 1055 | |
| 1056 | /* Merges directions A and B. */ |
| 1057 | |
| 1058 | static enum replace_direction |
| 1059 | merge_dir (enum replace_direction a, enum replace_direction b) |
| 1060 | { |
| 1061 | /* Implements the following table: |
| 1062 | |bo fw bw no |
| 1063 | ---+----------- |
| 1064 | bo |bo fw bw no |
| 1065 | fw |-- fw no no |
| 1066 | bw |-- -- bw no |
| 1067 | no |-- -- -- no. */ |
| 1068 | |
| 1069 | if (a == b) |
| 1070 | return a; |
| 1071 | |
| 1072 | if (a == dir_both) |
| 1073 | return b; |
| 1074 | if (b == dir_both) |
| 1075 | return a; |
| 1076 | |
| 1077 | return dir_none; |
| 1078 | } |
| 1079 | |
| 1080 | /* Examine I1 and I2 and return: |
| 1081 | - dir_forward if I1 can be replaced by I2, or |
| 1082 | - dir_backward if I2 can be replaced by I1, or |
| 1083 | - dir_both if both are the case. */ |
| 1084 | |
| 1085 | static enum replace_direction |
| 1086 | old_insns_match_p (int mode ATTRIBUTE_UNUSED, rtx i1, rtx i2) |
| 1087 | { |
| 1088 | rtx p1, p2; |
| 1089 | |
| 1090 | /* Verify that I1 and I2 are equivalent. */ |
| 1091 | if (GET_CODE (i1) != GET_CODE (i2)) |
| 1092 | return dir_none; |
| 1093 | |
| 1094 | /* __builtin_unreachable() may lead to empty blocks (ending with |
| 1095 | NOTE_INSN_BASIC_BLOCK). They may be crossjumped. */ |
| 1096 | if (NOTE_INSN_BASIC_BLOCK_P (i1) && NOTE_INSN_BASIC_BLOCK_P (i2)) |
| 1097 | return dir_both; |
| 1098 | |
| 1099 | /* ??? Do not allow cross-jumping between different stack levels. */ |
| 1100 | p1 = find_reg_note (i1, REG_ARGS_SIZE, NULL); |
| 1101 | p2 = find_reg_note (i2, REG_ARGS_SIZE, NULL); |
| 1102 | if (p1 && p2) |
| 1103 | { |
| 1104 | p1 = XEXP (p1, 0); |
| 1105 | p2 = XEXP (p2, 0); |
| 1106 | if (!rtx_equal_p (p1, p2)) |
| 1107 | return dir_none; |
| 1108 | |
| 1109 | /* ??? Worse, this adjustment had better be constant lest we |
| 1110 | have differing incoming stack levels. */ |
| 1111 | if (!frame_pointer_needed |
| 1112 | && find_args_size_adjust (i1) == HOST_WIDE_INT_MIN) |
| 1113 | return dir_none; |
| 1114 | } |
| 1115 | else if (p1 || p2) |
| 1116 | return dir_none; |
| 1117 | |
| 1118 | p1 = PATTERN (i1); |
| 1119 | p2 = PATTERN (i2); |
| 1120 | |
| 1121 | if (GET_CODE (p1) != GET_CODE (p2)) |
| 1122 | return dir_none; |
| 1123 | |
| 1124 | /* If this is a CALL_INSN, compare register usage information. |
| 1125 | If we don't check this on stack register machines, the two |
| 1126 | CALL_INSNs might be merged leaving reg-stack.c with mismatching |
| 1127 | numbers of stack registers in the same basic block. |
| 1128 | If we don't check this on machines with delay slots, a delay slot may |
| 1129 | be filled that clobbers a parameter expected by the subroutine. |
| 1130 | |
| 1131 | ??? We take the simple route for now and assume that if they're |
| 1132 | equal, they were constructed identically. |
| 1133 | |
| 1134 | Also check for identical exception regions. */ |
| 1135 | |
| 1136 | if (CALL_P (i1)) |
| 1137 | { |
| 1138 | /* Ensure the same EH region. */ |
| 1139 | rtx n1 = find_reg_note (i1, REG_EH_REGION, 0); |
| 1140 | rtx n2 = find_reg_note (i2, REG_EH_REGION, 0); |
| 1141 | |
| 1142 | if (!n1 && n2) |
| 1143 | return dir_none; |
| 1144 | |
| 1145 | if (n1 && (!n2 || XEXP (n1, 0) != XEXP (n2, 0))) |
| 1146 | return dir_none; |
| 1147 | |
| 1148 | if (!rtx_equal_p (CALL_INSN_FUNCTION_USAGE (i1), |
| 1149 | CALL_INSN_FUNCTION_USAGE (i2)) |
| 1150 | || SIBLING_CALL_P (i1) != SIBLING_CALL_P (i2)) |
| 1151 | return dir_none; |
| 1152 | } |
| 1153 | |
| 1154 | #ifdef STACK_REGS |
| 1155 | /* If cross_jump_death_matters is not 0, the insn's mode |
| 1156 | indicates whether or not the insn contains any stack-like |
| 1157 | regs. */ |
| 1158 | |
| 1159 | if ((mode & CLEANUP_POST_REGSTACK) && stack_regs_mentioned (i1)) |
| 1160 | { |
| 1161 | /* If register stack conversion has already been done, then |
| 1162 | death notes must also be compared before it is certain that |
| 1163 | the two instruction streams match. */ |
| 1164 | |
| 1165 | rtx note; |
| 1166 | HARD_REG_SET i1_regset, i2_regset; |
| 1167 | |
| 1168 | CLEAR_HARD_REG_SET (i1_regset); |
| 1169 | CLEAR_HARD_REG_SET (i2_regset); |
| 1170 | |
| 1171 | for (note = REG_NOTES (i1); note; note = XEXP (note, 1)) |
| 1172 | if (REG_NOTE_KIND (note) == REG_DEAD && STACK_REG_P (XEXP (note, 0))) |
| 1173 | SET_HARD_REG_BIT (i1_regset, REGNO (XEXP (note, 0))); |
| 1174 | |
| 1175 | for (note = REG_NOTES (i2); note; note = XEXP (note, 1)) |
| 1176 | if (REG_NOTE_KIND (note) == REG_DEAD && STACK_REG_P (XEXP (note, 0))) |
| 1177 | SET_HARD_REG_BIT (i2_regset, REGNO (XEXP (note, 0))); |
| 1178 | |
| 1179 | if (!hard_reg_set_equal_p (i1_regset, i2_regset)) |
| 1180 | return dir_none; |
| 1181 | } |
| 1182 | #endif |
| 1183 | |
| 1184 | if (reload_completed |
| 1185 | ? rtx_renumbered_equal_p (p1, p2) : rtx_equal_p (p1, p2)) |
| 1186 | return dir_both; |
| 1187 | |
| 1188 | return can_replace_by (i1, i2); |
| 1189 | } |
| 1190 | \f |
| 1191 | /* When comparing insns I1 and I2 in flow_find_cross_jump or |
| 1192 | flow_find_head_matching_sequence, ensure the notes match. */ |
| 1193 | |
| 1194 | static void |
| 1195 | merge_notes (rtx i1, rtx i2) |
| 1196 | { |
| 1197 | /* If the merged insns have different REG_EQUAL notes, then |
| 1198 | remove them. */ |
| 1199 | rtx equiv1 = find_reg_equal_equiv_note (i1); |
| 1200 | rtx equiv2 = find_reg_equal_equiv_note (i2); |
| 1201 | |
| 1202 | if (equiv1 && !equiv2) |
| 1203 | remove_note (i1, equiv1); |
| 1204 | else if (!equiv1 && equiv2) |
| 1205 | remove_note (i2, equiv2); |
| 1206 | else if (equiv1 && equiv2 |
| 1207 | && !rtx_equal_p (XEXP (equiv1, 0), XEXP (equiv2, 0))) |
| 1208 | { |
| 1209 | remove_note (i1, equiv1); |
| 1210 | remove_note (i2, equiv2); |
| 1211 | } |
| 1212 | } |
| 1213 | |
| 1214 | /* Walks from I1 in BB1 backward till the next non-debug insn, and returns the |
| 1215 | resulting insn in I1, and the corresponding bb in BB1. At the head of a |
| 1216 | bb, if there is a predecessor bb that reaches this bb via fallthru, and |
| 1217 | FOLLOW_FALLTHRU, walks further in the predecessor bb and registers this in |
| 1218 | DID_FALLTHRU. Otherwise, stops at the head of the bb. */ |
| 1219 | |
| 1220 | static void |
| 1221 | walk_to_nondebug_insn (rtx *i1, basic_block *bb1, bool follow_fallthru, |
| 1222 | bool *did_fallthru) |
| 1223 | { |
| 1224 | edge fallthru; |
| 1225 | |
| 1226 | *did_fallthru = false; |
| 1227 | |
| 1228 | /* Ignore notes. */ |
| 1229 | while (!NONDEBUG_INSN_P (*i1)) |
| 1230 | { |
| 1231 | if (*i1 != BB_HEAD (*bb1)) |
| 1232 | { |
| 1233 | *i1 = PREV_INSN (*i1); |
| 1234 | continue; |
| 1235 | } |
| 1236 | |
| 1237 | if (!follow_fallthru) |
| 1238 | return; |
| 1239 | |
| 1240 | fallthru = find_fallthru_edge ((*bb1)->preds); |
| 1241 | if (!fallthru || fallthru->src == ENTRY_BLOCK_PTR_FOR_FUNCTION (cfun) |
| 1242 | || !single_succ_p (fallthru->src)) |
| 1243 | return; |
| 1244 | |
| 1245 | *bb1 = fallthru->src; |
| 1246 | *i1 = BB_END (*bb1); |
| 1247 | *did_fallthru = true; |
| 1248 | } |
| 1249 | } |
| 1250 | |
| 1251 | /* Look through the insns at the end of BB1 and BB2 and find the longest |
| 1252 | sequence that are either equivalent, or allow forward or backward |
| 1253 | replacement. Store the first insns for that sequence in *F1 and *F2 and |
| 1254 | return the sequence length. |
| 1255 | |
| 1256 | DIR_P indicates the allowed replacement direction on function entry, and |
| 1257 | the actual replacement direction on function exit. If NULL, only equivalent |
| 1258 | sequences are allowed. |
| 1259 | |
| 1260 | To simplify callers of this function, if the blocks match exactly, |
| 1261 | store the head of the blocks in *F1 and *F2. */ |
| 1262 | |
| 1263 | int |
| 1264 | flow_find_cross_jump (basic_block bb1, basic_block bb2, rtx *f1, rtx *f2, |
| 1265 | enum replace_direction *dir_p) |
| 1266 | { |
| 1267 | rtx i1, i2, last1, last2, afterlast1, afterlast2; |
| 1268 | int ninsns = 0; |
| 1269 | rtx p1; |
| 1270 | enum replace_direction dir, last_dir, afterlast_dir; |
| 1271 | bool follow_fallthru, did_fallthru; |
| 1272 | |
| 1273 | if (dir_p) |
| 1274 | dir = *dir_p; |
| 1275 | else |
| 1276 | dir = dir_both; |
| 1277 | afterlast_dir = dir; |
| 1278 | last_dir = afterlast_dir; |
| 1279 | |
| 1280 | /* Skip simple jumps at the end of the blocks. Complex jumps still |
| 1281 | need to be compared for equivalence, which we'll do below. */ |
| 1282 | |
| 1283 | i1 = BB_END (bb1); |
| 1284 | last1 = afterlast1 = last2 = afterlast2 = NULL_RTX; |
| 1285 | if (onlyjump_p (i1) |
| 1286 | || (returnjump_p (i1) && !side_effects_p (PATTERN (i1)))) |
| 1287 | { |
| 1288 | last1 = i1; |
| 1289 | i1 = PREV_INSN (i1); |
| 1290 | } |
| 1291 | |
| 1292 | i2 = BB_END (bb2); |
| 1293 | if (onlyjump_p (i2) |
| 1294 | || (returnjump_p (i2) && !side_effects_p (PATTERN (i2)))) |
| 1295 | { |
| 1296 | last2 = i2; |
| 1297 | /* Count everything except for unconditional jump as insn. */ |
| 1298 | if (!simplejump_p (i2) && !returnjump_p (i2) && last1) |
| 1299 | ninsns++; |
| 1300 | i2 = PREV_INSN (i2); |
| 1301 | } |
| 1302 | |
| 1303 | while (true) |
| 1304 | { |
| 1305 | /* In the following example, we can replace all jumps to C by jumps to A. |
| 1306 | |
| 1307 | This removes 4 duplicate insns. |
| 1308 | [bb A] insn1 [bb C] insn1 |
| 1309 | insn2 insn2 |
| 1310 | [bb B] insn3 insn3 |
| 1311 | insn4 insn4 |
| 1312 | jump_insn jump_insn |
| 1313 | |
| 1314 | We could also replace all jumps to A by jumps to C, but that leaves B |
| 1315 | alive, and removes only 2 duplicate insns. In a subsequent crossjump |
| 1316 | step, all jumps to B would be replaced with jumps to the middle of C, |
| 1317 | achieving the same result with more effort. |
| 1318 | So we allow only the first possibility, which means that we don't allow |
| 1319 | fallthru in the block that's being replaced. */ |
| 1320 | |
| 1321 | follow_fallthru = dir_p && dir != dir_forward; |
| 1322 | walk_to_nondebug_insn (&i1, &bb1, follow_fallthru, &did_fallthru); |
| 1323 | if (did_fallthru) |
| 1324 | dir = dir_backward; |
| 1325 | |
| 1326 | follow_fallthru = dir_p && dir != dir_backward; |
| 1327 | walk_to_nondebug_insn (&i2, &bb2, follow_fallthru, &did_fallthru); |
| 1328 | if (did_fallthru) |
| 1329 | dir = dir_forward; |
| 1330 | |
| 1331 | if (i1 == BB_HEAD (bb1) || i2 == BB_HEAD (bb2)) |
| 1332 | break; |
| 1333 | |
| 1334 | dir = merge_dir (dir, old_insns_match_p (0, i1, i2)); |
| 1335 | if (dir == dir_none || (!dir_p && dir != dir_both)) |
| 1336 | break; |
| 1337 | |
| 1338 | merge_memattrs (i1, i2); |
| 1339 | |
| 1340 | /* Don't begin a cross-jump with a NOTE insn. */ |
| 1341 | if (INSN_P (i1)) |
| 1342 | { |
| 1343 | merge_notes (i1, i2); |
| 1344 | |
| 1345 | afterlast1 = last1, afterlast2 = last2; |
| 1346 | last1 = i1, last2 = i2; |
| 1347 | afterlast_dir = last_dir; |
| 1348 | last_dir = dir; |
| 1349 | p1 = PATTERN (i1); |
| 1350 | if (!(GET_CODE (p1) == USE || GET_CODE (p1) == CLOBBER)) |
| 1351 | ninsns++; |
| 1352 | } |
| 1353 | |
| 1354 | i1 = PREV_INSN (i1); |
| 1355 | i2 = PREV_INSN (i2); |
| 1356 | } |
| 1357 | |
| 1358 | #ifdef HAVE_cc0 |
| 1359 | /* Don't allow the insn after a compare to be shared by |
| 1360 | cross-jumping unless the compare is also shared. */ |
| 1361 | if (ninsns && reg_mentioned_p (cc0_rtx, last1) && ! sets_cc0_p (last1)) |
| 1362 | last1 = afterlast1, last2 = afterlast2, last_dir = afterlast_dir, ninsns--; |
| 1363 | #endif |
| 1364 | |
| 1365 | /* Include preceding notes and labels in the cross-jump. One, |
| 1366 | this may bring us to the head of the blocks as requested above. |
| 1367 | Two, it keeps line number notes as matched as may be. */ |
| 1368 | if (ninsns) |
| 1369 | { |
| 1370 | bb1 = BLOCK_FOR_INSN (last1); |
| 1371 | while (last1 != BB_HEAD (bb1) && !NONDEBUG_INSN_P (PREV_INSN (last1))) |
| 1372 | last1 = PREV_INSN (last1); |
| 1373 | |
| 1374 | if (last1 != BB_HEAD (bb1) && LABEL_P (PREV_INSN (last1))) |
| 1375 | last1 = PREV_INSN (last1); |
| 1376 | |
| 1377 | bb2 = BLOCK_FOR_INSN (last2); |
| 1378 | while (last2 != BB_HEAD (bb2) && !NONDEBUG_INSN_P (PREV_INSN (last2))) |
| 1379 | last2 = PREV_INSN (last2); |
| 1380 | |
| 1381 | if (last2 != BB_HEAD (bb2) && LABEL_P (PREV_INSN (last2))) |
| 1382 | last2 = PREV_INSN (last2); |
| 1383 | |
| 1384 | *f1 = last1; |
| 1385 | *f2 = last2; |
| 1386 | } |
| 1387 | |
| 1388 | if (dir_p) |
| 1389 | *dir_p = last_dir; |
| 1390 | return ninsns; |
| 1391 | } |
| 1392 | |
| 1393 | /* Like flow_find_cross_jump, except start looking for a matching sequence from |
| 1394 | the head of the two blocks. Do not include jumps at the end. |
| 1395 | If STOP_AFTER is nonzero, stop after finding that many matching |
| 1396 | instructions. */ |
| 1397 | |
| 1398 | int |
| 1399 | flow_find_head_matching_sequence (basic_block bb1, basic_block bb2, rtx *f1, |
| 1400 | rtx *f2, int stop_after) |
| 1401 | { |
| 1402 | rtx i1, i2, last1, last2, beforelast1, beforelast2; |
| 1403 | int ninsns = 0; |
| 1404 | edge e; |
| 1405 | edge_iterator ei; |
| 1406 | int nehedges1 = 0, nehedges2 = 0; |
| 1407 | |
| 1408 | FOR_EACH_EDGE (e, ei, bb1->succs) |
| 1409 | if (e->flags & EDGE_EH) |
| 1410 | nehedges1++; |
| 1411 | FOR_EACH_EDGE (e, ei, bb2->succs) |
| 1412 | if (e->flags & EDGE_EH) |
| 1413 | nehedges2++; |
| 1414 | |
| 1415 | i1 = BB_HEAD (bb1); |
| 1416 | i2 = BB_HEAD (bb2); |
| 1417 | last1 = beforelast1 = last2 = beforelast2 = NULL_RTX; |
| 1418 | |
| 1419 | while (true) |
| 1420 | { |
| 1421 | /* Ignore notes, except NOTE_INSN_EPILOGUE_BEG. */ |
| 1422 | while (!NONDEBUG_INSN_P (i1) && i1 != BB_END (bb1)) |
| 1423 | { |
| 1424 | if (NOTE_P (i1) && NOTE_KIND (i1) == NOTE_INSN_EPILOGUE_BEG) |
| 1425 | break; |
| 1426 | i1 = NEXT_INSN (i1); |
| 1427 | } |
| 1428 | |
| 1429 | while (!NONDEBUG_INSN_P (i2) && i2 != BB_END (bb2)) |
| 1430 | { |
| 1431 | if (NOTE_P (i2) && NOTE_KIND (i2) == NOTE_INSN_EPILOGUE_BEG) |
| 1432 | break; |
| 1433 | i2 = NEXT_INSN (i2); |
| 1434 | } |
| 1435 | |
| 1436 | if ((i1 == BB_END (bb1) && !NONDEBUG_INSN_P (i1)) |
| 1437 | || (i2 == BB_END (bb2) && !NONDEBUG_INSN_P (i2))) |
| 1438 | break; |
| 1439 | |
| 1440 | if (NOTE_P (i1) || NOTE_P (i2) |
| 1441 | || JUMP_P (i1) || JUMP_P (i2)) |
| 1442 | break; |
| 1443 | |
| 1444 | /* A sanity check to make sure we're not merging insns with different |
| 1445 | effects on EH. If only one of them ends a basic block, it shouldn't |
| 1446 | have an EH edge; if both end a basic block, there should be the same |
| 1447 | number of EH edges. */ |
| 1448 | if ((i1 == BB_END (bb1) && i2 != BB_END (bb2) |
| 1449 | && nehedges1 > 0) |
| 1450 | || (i2 == BB_END (bb2) && i1 != BB_END (bb1) |
| 1451 | && nehedges2 > 0) |
| 1452 | || (i1 == BB_END (bb1) && i2 == BB_END (bb2) |
| 1453 | && nehedges1 != nehedges2)) |
| 1454 | break; |
| 1455 | |
| 1456 | if (old_insns_match_p (0, i1, i2) != dir_both) |
| 1457 | break; |
| 1458 | |
| 1459 | merge_memattrs (i1, i2); |
| 1460 | |
| 1461 | /* Don't begin a cross-jump with a NOTE insn. */ |
| 1462 | if (INSN_P (i1)) |
| 1463 | { |
| 1464 | merge_notes (i1, i2); |
| 1465 | |
| 1466 | beforelast1 = last1, beforelast2 = last2; |
| 1467 | last1 = i1, last2 = i2; |
| 1468 | ninsns++; |
| 1469 | } |
| 1470 | |
| 1471 | if (i1 == BB_END (bb1) || i2 == BB_END (bb2) |
| 1472 | || (stop_after > 0 && ninsns == stop_after)) |
| 1473 | break; |
| 1474 | |
| 1475 | i1 = NEXT_INSN (i1); |
| 1476 | i2 = NEXT_INSN (i2); |
| 1477 | } |
| 1478 | |
| 1479 | #ifdef HAVE_cc0 |
| 1480 | /* Don't allow a compare to be shared by cross-jumping unless the insn |
| 1481 | after the compare is also shared. */ |
| 1482 | if (ninsns && reg_mentioned_p (cc0_rtx, last1) && sets_cc0_p (last1)) |
| 1483 | last1 = beforelast1, last2 = beforelast2, ninsns--; |
| 1484 | #endif |
| 1485 | |
| 1486 | if (ninsns) |
| 1487 | { |
| 1488 | *f1 = last1; |
| 1489 | *f2 = last2; |
| 1490 | } |
| 1491 | |
| 1492 | return ninsns; |
| 1493 | } |
| 1494 | |
| 1495 | /* Return true iff outgoing edges of BB1 and BB2 match, together with |
| 1496 | the branch instruction. This means that if we commonize the control |
| 1497 | flow before end of the basic block, the semantic remains unchanged. |
| 1498 | |
| 1499 | We may assume that there exists one edge with a common destination. */ |
| 1500 | |
| 1501 | static bool |
| 1502 | outgoing_edges_match (int mode, basic_block bb1, basic_block bb2) |
| 1503 | { |
| 1504 | int nehedges1 = 0, nehedges2 = 0; |
| 1505 | edge fallthru1 = 0, fallthru2 = 0; |
| 1506 | edge e1, e2; |
| 1507 | edge_iterator ei; |
| 1508 | rtx last1, last2; |
| 1509 | bool nonfakeedges; |
| 1510 | |
| 1511 | /* If we performed shrink-wrapping, edges to the EXIT_BLOCK_PTR can |
| 1512 | only be distinguished for JUMP_INSNs. The two paths may differ in |
| 1513 | whether they went through the prologue. Sibcalls are fine, we know |
| 1514 | that we either didn't need or inserted an epilogue before them. */ |
| 1515 | if (crtl->shrink_wrapped |
| 1516 | && single_succ_p (bb1) && single_succ (bb1) == EXIT_BLOCK_PTR |
| 1517 | && !JUMP_P (BB_END (bb1)) |
| 1518 | && !(CALL_P (BB_END (bb1)) && SIBLING_CALL_P (BB_END (bb1)))) |
| 1519 | return false; |
| 1520 | |
| 1521 | /* If BB1 has only one successor, we may be looking at either an |
| 1522 | unconditional jump, or a fake edge to exit. */ |
| 1523 | if (single_succ_p (bb1) |
| 1524 | && (single_succ_edge (bb1)->flags & (EDGE_COMPLEX | EDGE_FAKE)) == 0 |
| 1525 | && (!JUMP_P (BB_END (bb1)) || simplejump_p (BB_END (bb1)))) |
| 1526 | return (single_succ_p (bb2) |
| 1527 | && (single_succ_edge (bb2)->flags |
| 1528 | & (EDGE_COMPLEX | EDGE_FAKE)) == 0 |
| 1529 | && (!JUMP_P (BB_END (bb2)) || simplejump_p (BB_END (bb2)))); |
| 1530 | |
| 1531 | /* Match conditional jumps - this may get tricky when fallthru and branch |
| 1532 | edges are crossed. */ |
| 1533 | if (EDGE_COUNT (bb1->succs) == 2 |
| 1534 | && any_condjump_p (BB_END (bb1)) |
| 1535 | && onlyjump_p (BB_END (bb1))) |
| 1536 | { |
| 1537 | edge b1, f1, b2, f2; |
| 1538 | bool reverse, match; |
| 1539 | rtx set1, set2, cond1, cond2; |
| 1540 | enum rtx_code code1, code2; |
| 1541 | |
| 1542 | if (EDGE_COUNT (bb2->succs) != 2 |
| 1543 | || !any_condjump_p (BB_END (bb2)) |
| 1544 | || !onlyjump_p (BB_END (bb2))) |
| 1545 | return false; |
| 1546 | |
| 1547 | b1 = BRANCH_EDGE (bb1); |
| 1548 | b2 = BRANCH_EDGE (bb2); |
| 1549 | f1 = FALLTHRU_EDGE (bb1); |
| 1550 | f2 = FALLTHRU_EDGE (bb2); |
| 1551 | |
| 1552 | /* Get around possible forwarders on fallthru edges. Other cases |
| 1553 | should be optimized out already. */ |
| 1554 | if (FORWARDER_BLOCK_P (f1->dest)) |
| 1555 | f1 = single_succ_edge (f1->dest); |
| 1556 | |
| 1557 | if (FORWARDER_BLOCK_P (f2->dest)) |
| 1558 | f2 = single_succ_edge (f2->dest); |
| 1559 | |
| 1560 | /* To simplify use of this function, return false if there are |
| 1561 | unneeded forwarder blocks. These will get eliminated later |
| 1562 | during cleanup_cfg. */ |
| 1563 | if (FORWARDER_BLOCK_P (f1->dest) |
| 1564 | || FORWARDER_BLOCK_P (f2->dest) |
| 1565 | || FORWARDER_BLOCK_P (b1->dest) |
| 1566 | || FORWARDER_BLOCK_P (b2->dest)) |
| 1567 | return false; |
| 1568 | |
| 1569 | if (f1->dest == f2->dest && b1->dest == b2->dest) |
| 1570 | reverse = false; |
| 1571 | else if (f1->dest == b2->dest && b1->dest == f2->dest) |
| 1572 | reverse = true; |
| 1573 | else |
| 1574 | return false; |
| 1575 | |
| 1576 | set1 = pc_set (BB_END (bb1)); |
| 1577 | set2 = pc_set (BB_END (bb2)); |
| 1578 | if ((XEXP (SET_SRC (set1), 1) == pc_rtx) |
| 1579 | != (XEXP (SET_SRC (set2), 1) == pc_rtx)) |
| 1580 | reverse = !reverse; |
| 1581 | |
| 1582 | cond1 = XEXP (SET_SRC (set1), 0); |
| 1583 | cond2 = XEXP (SET_SRC (set2), 0); |
| 1584 | code1 = GET_CODE (cond1); |
| 1585 | if (reverse) |
| 1586 | code2 = reversed_comparison_code (cond2, BB_END (bb2)); |
| 1587 | else |
| 1588 | code2 = GET_CODE (cond2); |
| 1589 | |
| 1590 | if (code2 == UNKNOWN) |
| 1591 | return false; |
| 1592 | |
| 1593 | /* Verify codes and operands match. */ |
| 1594 | match = ((code1 == code2 |
| 1595 | && rtx_renumbered_equal_p (XEXP (cond1, 0), XEXP (cond2, 0)) |
| 1596 | && rtx_renumbered_equal_p (XEXP (cond1, 1), XEXP (cond2, 1))) |
| 1597 | || (code1 == swap_condition (code2) |
| 1598 | && rtx_renumbered_equal_p (XEXP (cond1, 1), |
| 1599 | XEXP (cond2, 0)) |
| 1600 | && rtx_renumbered_equal_p (XEXP (cond1, 0), |
| 1601 | XEXP (cond2, 1)))); |
| 1602 | |
| 1603 | /* If we return true, we will join the blocks. Which means that |
| 1604 | we will only have one branch prediction bit to work with. Thus |
| 1605 | we require the existing branches to have probabilities that are |
| 1606 | roughly similar. */ |
| 1607 | if (match |
| 1608 | && optimize_bb_for_speed_p (bb1) |
| 1609 | && optimize_bb_for_speed_p (bb2)) |
| 1610 | { |
| 1611 | int prob2; |
| 1612 | |
| 1613 | if (b1->dest == b2->dest) |
| 1614 | prob2 = b2->probability; |
| 1615 | else |
| 1616 | /* Do not use f2 probability as f2 may be forwarded. */ |
| 1617 | prob2 = REG_BR_PROB_BASE - b2->probability; |
| 1618 | |
| 1619 | /* Fail if the difference in probabilities is greater than 50%. |
| 1620 | This rules out two well-predicted branches with opposite |
| 1621 | outcomes. */ |
| 1622 | if (abs (b1->probability - prob2) > REG_BR_PROB_BASE / 2) |
| 1623 | { |
| 1624 | if (dump_file) |
| 1625 | fprintf (dump_file, |
| 1626 | "Outcomes of branch in bb %i and %i differ too much (%i %i)\n", |
| 1627 | bb1->index, bb2->index, b1->probability, prob2); |
| 1628 | |
| 1629 | return false; |
| 1630 | } |
| 1631 | } |
| 1632 | |
| 1633 | if (dump_file && match) |
| 1634 | fprintf (dump_file, "Conditionals in bb %i and %i match.\n", |
| 1635 | bb1->index, bb2->index); |
| 1636 | |
| 1637 | return match; |
| 1638 | } |
| 1639 | |
| 1640 | /* Generic case - we are seeing a computed jump, table jump or trapping |
| 1641 | instruction. */ |
| 1642 | |
| 1643 | /* Check whether there are tablejumps in the end of BB1 and BB2. |
| 1644 | Return true if they are identical. */ |
| 1645 | { |
| 1646 | rtx label1, label2; |
| 1647 | rtx table1, table2; |
| 1648 | |
| 1649 | if (tablejump_p (BB_END (bb1), &label1, &table1) |
| 1650 | && tablejump_p (BB_END (bb2), &label2, &table2) |
| 1651 | && GET_CODE (PATTERN (table1)) == GET_CODE (PATTERN (table2))) |
| 1652 | { |
| 1653 | /* The labels should never be the same rtx. If they really are same |
| 1654 | the jump tables are same too. So disable crossjumping of blocks BB1 |
| 1655 | and BB2 because when deleting the common insns in the end of BB1 |
| 1656 | by delete_basic_block () the jump table would be deleted too. */ |
| 1657 | /* If LABEL2 is referenced in BB1->END do not do anything |
| 1658 | because we would loose information when replacing |
| 1659 | LABEL1 by LABEL2 and then LABEL2 by LABEL1 in BB1->END. */ |
| 1660 | if (label1 != label2 && !rtx_referenced_p (label2, BB_END (bb1))) |
| 1661 | { |
| 1662 | /* Set IDENTICAL to true when the tables are identical. */ |
| 1663 | bool identical = false; |
| 1664 | rtx p1, p2; |
| 1665 | |
| 1666 | p1 = PATTERN (table1); |
| 1667 | p2 = PATTERN (table2); |
| 1668 | if (GET_CODE (p1) == ADDR_VEC && rtx_equal_p (p1, p2)) |
| 1669 | { |
| 1670 | identical = true; |
| 1671 | } |
| 1672 | else if (GET_CODE (p1) == ADDR_DIFF_VEC |
| 1673 | && (XVECLEN (p1, 1) == XVECLEN (p2, 1)) |
| 1674 | && rtx_equal_p (XEXP (p1, 2), XEXP (p2, 2)) |
| 1675 | && rtx_equal_p (XEXP (p1, 3), XEXP (p2, 3))) |
| 1676 | { |
| 1677 | int i; |
| 1678 | |
| 1679 | identical = true; |
| 1680 | for (i = XVECLEN (p1, 1) - 1; i >= 0 && identical; i--) |
| 1681 | if (!rtx_equal_p (XVECEXP (p1, 1, i), XVECEXP (p2, 1, i))) |
| 1682 | identical = false; |
| 1683 | } |
| 1684 | |
| 1685 | if (identical) |
| 1686 | { |
| 1687 | replace_label_data rr; |
| 1688 | bool match; |
| 1689 | |
| 1690 | /* Temporarily replace references to LABEL1 with LABEL2 |
| 1691 | in BB1->END so that we could compare the instructions. */ |
| 1692 | rr.r1 = label1; |
| 1693 | rr.r2 = label2; |
| 1694 | rr.update_label_nuses = false; |
| 1695 | for_each_rtx (&BB_END (bb1), replace_label, &rr); |
| 1696 | |
| 1697 | match = (old_insns_match_p (mode, BB_END (bb1), BB_END (bb2)) |
| 1698 | == dir_both); |
| 1699 | if (dump_file && match) |
| 1700 | fprintf (dump_file, |
| 1701 | "Tablejumps in bb %i and %i match.\n", |
| 1702 | bb1->index, bb2->index); |
| 1703 | |
| 1704 | /* Set the original label in BB1->END because when deleting |
| 1705 | a block whose end is a tablejump, the tablejump referenced |
| 1706 | from the instruction is deleted too. */ |
| 1707 | rr.r1 = label2; |
| 1708 | rr.r2 = label1; |
| 1709 | for_each_rtx (&BB_END (bb1), replace_label, &rr); |
| 1710 | |
| 1711 | return match; |
| 1712 | } |
| 1713 | } |
| 1714 | return false; |
| 1715 | } |
| 1716 | } |
| 1717 | |
| 1718 | last1 = BB_END (bb1); |
| 1719 | last2 = BB_END (bb2); |
| 1720 | if (DEBUG_INSN_P (last1)) |
| 1721 | last1 = prev_nondebug_insn (last1); |
| 1722 | if (DEBUG_INSN_P (last2)) |
| 1723 | last2 = prev_nondebug_insn (last2); |
| 1724 | /* First ensure that the instructions match. There may be many outgoing |
| 1725 | edges so this test is generally cheaper. */ |
| 1726 | if (old_insns_match_p (mode, last1, last2) != dir_both) |
| 1727 | return false; |
| 1728 | |
| 1729 | /* Search the outgoing edges, ensure that the counts do match, find possible |
| 1730 | fallthru and exception handling edges since these needs more |
| 1731 | validation. */ |
| 1732 | if (EDGE_COUNT (bb1->succs) != EDGE_COUNT (bb2->succs)) |
| 1733 | return false; |
| 1734 | |
| 1735 | nonfakeedges = false; |
| 1736 | FOR_EACH_EDGE (e1, ei, bb1->succs) |
| 1737 | { |
| 1738 | e2 = EDGE_SUCC (bb2, ei.index); |
| 1739 | |
| 1740 | if ((e1->flags & EDGE_FAKE) == 0) |
| 1741 | nonfakeedges = true; |
| 1742 | |
| 1743 | if (e1->flags & EDGE_EH) |
| 1744 | nehedges1++; |
| 1745 | |
| 1746 | if (e2->flags & EDGE_EH) |
| 1747 | nehedges2++; |
| 1748 | |
| 1749 | if (e1->flags & EDGE_FALLTHRU) |
| 1750 | fallthru1 = e1; |
| 1751 | if (e2->flags & EDGE_FALLTHRU) |
| 1752 | fallthru2 = e2; |
| 1753 | } |
| 1754 | |
| 1755 | /* If number of edges of various types does not match, fail. */ |
| 1756 | if (nehedges1 != nehedges2 |
| 1757 | || (fallthru1 != 0) != (fallthru2 != 0)) |
| 1758 | return false; |
| 1759 | |
| 1760 | /* If !ACCUMULATE_OUTGOING_ARGS, bb1 (and bb2) have no successors |
| 1761 | and the last real insn doesn't have REG_ARGS_SIZE note, don't |
| 1762 | attempt to optimize, as the two basic blocks might have different |
| 1763 | REG_ARGS_SIZE depths. For noreturn calls and unconditional |
| 1764 | traps there should be REG_ARG_SIZE notes, they could be missing |
| 1765 | for __builtin_unreachable () uses though. */ |
| 1766 | if (!nonfakeedges |
| 1767 | && !ACCUMULATE_OUTGOING_ARGS |
| 1768 | && (!INSN_P (last1) |
| 1769 | || !find_reg_note (last1, REG_ARGS_SIZE, NULL))) |
| 1770 | return false; |
| 1771 | |
| 1772 | /* fallthru edges must be forwarded to the same destination. */ |
| 1773 | if (fallthru1) |
| 1774 | { |
| 1775 | basic_block d1 = (forwarder_block_p (fallthru1->dest) |
| 1776 | ? single_succ (fallthru1->dest): fallthru1->dest); |
| 1777 | basic_block d2 = (forwarder_block_p (fallthru2->dest) |
| 1778 | ? single_succ (fallthru2->dest): fallthru2->dest); |
| 1779 | |
| 1780 | if (d1 != d2) |
| 1781 | return false; |
| 1782 | } |
| 1783 | |
| 1784 | /* Ensure the same EH region. */ |
| 1785 | { |
| 1786 | rtx n1 = find_reg_note (BB_END (bb1), REG_EH_REGION, 0); |
| 1787 | rtx n2 = find_reg_note (BB_END (bb2), REG_EH_REGION, 0); |
| 1788 | |
| 1789 | if (!n1 && n2) |
| 1790 | return false; |
| 1791 | |
| 1792 | if (n1 && (!n2 || XEXP (n1, 0) != XEXP (n2, 0))) |
| 1793 | return false; |
| 1794 | } |
| 1795 | |
| 1796 | /* The same checks as in try_crossjump_to_edge. It is required for RTL |
| 1797 | version of sequence abstraction. */ |
| 1798 | FOR_EACH_EDGE (e1, ei, bb2->succs) |
| 1799 | { |
| 1800 | edge e2; |
| 1801 | edge_iterator ei; |
| 1802 | basic_block d1 = e1->dest; |
| 1803 | |
| 1804 | if (FORWARDER_BLOCK_P (d1)) |
| 1805 | d1 = EDGE_SUCC (d1, 0)->dest; |
| 1806 | |
| 1807 | FOR_EACH_EDGE (e2, ei, bb1->succs) |
| 1808 | { |
| 1809 | basic_block d2 = e2->dest; |
| 1810 | if (FORWARDER_BLOCK_P (d2)) |
| 1811 | d2 = EDGE_SUCC (d2, 0)->dest; |
| 1812 | if (d1 == d2) |
| 1813 | break; |
| 1814 | } |
| 1815 | |
| 1816 | if (!e2) |
| 1817 | return false; |
| 1818 | } |
| 1819 | |
| 1820 | return true; |
| 1821 | } |
| 1822 | |
| 1823 | /* Returns true if BB basic block has a preserve label. */ |
| 1824 | |
| 1825 | static bool |
| 1826 | block_has_preserve_label (basic_block bb) |
| 1827 | { |
| 1828 | return (bb |
| 1829 | && block_label (bb) |
| 1830 | && LABEL_PRESERVE_P (block_label (bb))); |
| 1831 | } |
| 1832 | |
| 1833 | /* E1 and E2 are edges with the same destination block. Search their |
| 1834 | predecessors for common code. If found, redirect control flow from |
| 1835 | (maybe the middle of) E1->SRC to (maybe the middle of) E2->SRC (dir_forward), |
| 1836 | or the other way around (dir_backward). DIR specifies the allowed |
| 1837 | replacement direction. */ |
| 1838 | |
| 1839 | static bool |
| 1840 | try_crossjump_to_edge (int mode, edge e1, edge e2, |
| 1841 | enum replace_direction dir) |
| 1842 | { |
| 1843 | int nmatch; |
| 1844 | basic_block src1 = e1->src, src2 = e2->src; |
| 1845 | basic_block redirect_to, redirect_from, to_remove; |
| 1846 | basic_block osrc1, osrc2, redirect_edges_to, tmp; |
| 1847 | rtx newpos1, newpos2; |
| 1848 | edge s; |
| 1849 | edge_iterator ei; |
| 1850 | |
| 1851 | newpos1 = newpos2 = NULL_RTX; |
| 1852 | |
| 1853 | /* If we have partitioned hot/cold basic blocks, it is a bad idea |
| 1854 | to try this optimization. |
| 1855 | |
| 1856 | Basic block partitioning may result in some jumps that appear to |
| 1857 | be optimizable (or blocks that appear to be mergeable), but which really |
| 1858 | must be left untouched (they are required to make it safely across |
| 1859 | partition boundaries). See the comments at the top of |
| 1860 | bb-reorder.c:partition_hot_cold_basic_blocks for complete details. */ |
| 1861 | |
| 1862 | if (flag_reorder_blocks_and_partition && reload_completed) |
| 1863 | return false; |
| 1864 | |
| 1865 | /* Search backward through forwarder blocks. We don't need to worry |
| 1866 | about multiple entry or chained forwarders, as they will be optimized |
| 1867 | away. We do this to look past the unconditional jump following a |
| 1868 | conditional jump that is required due to the current CFG shape. */ |
| 1869 | if (single_pred_p (src1) |
| 1870 | && FORWARDER_BLOCK_P (src1)) |
| 1871 | e1 = single_pred_edge (src1), src1 = e1->src; |
| 1872 | |
| 1873 | if (single_pred_p (src2) |
| 1874 | && FORWARDER_BLOCK_P (src2)) |
| 1875 | e2 = single_pred_edge (src2), src2 = e2->src; |
| 1876 | |
| 1877 | /* Nothing to do if we reach ENTRY, or a common source block. */ |
| 1878 | if (src1 == ENTRY_BLOCK_PTR || src2 == ENTRY_BLOCK_PTR) |
| 1879 | return false; |
| 1880 | if (src1 == src2) |
| 1881 | return false; |
| 1882 | |
| 1883 | /* Seeing more than 1 forwarder blocks would confuse us later... */ |
| 1884 | if (FORWARDER_BLOCK_P (e1->dest) |
| 1885 | && FORWARDER_BLOCK_P (single_succ (e1->dest))) |
| 1886 | return false; |
| 1887 | |
| 1888 | if (FORWARDER_BLOCK_P (e2->dest) |
| 1889 | && FORWARDER_BLOCK_P (single_succ (e2->dest))) |
| 1890 | return false; |
| 1891 | |
| 1892 | /* Likewise with dead code (possibly newly created by the other optimizations |
| 1893 | of cfg_cleanup). */ |
| 1894 | if (EDGE_COUNT (src1->preds) == 0 || EDGE_COUNT (src2->preds) == 0) |
| 1895 | return false; |
| 1896 | |
| 1897 | /* Look for the common insn sequence, part the first ... */ |
| 1898 | if (!outgoing_edges_match (mode, src1, src2)) |
| 1899 | return false; |
| 1900 | |
| 1901 | /* ... and part the second. */ |
| 1902 | nmatch = flow_find_cross_jump (src1, src2, &newpos1, &newpos2, &dir); |
| 1903 | |
| 1904 | osrc1 = src1; |
| 1905 | osrc2 = src2; |
| 1906 | if (newpos1 != NULL_RTX) |
| 1907 | src1 = BLOCK_FOR_INSN (newpos1); |
| 1908 | if (newpos2 != NULL_RTX) |
| 1909 | src2 = BLOCK_FOR_INSN (newpos2); |
| 1910 | |
| 1911 | if (dir == dir_backward) |
| 1912 | { |
| 1913 | #define SWAP(T, X, Y) do { T tmp = (X); (X) = (Y); (Y) = tmp; } while (0) |
| 1914 | SWAP (basic_block, osrc1, osrc2); |
| 1915 | SWAP (basic_block, src1, src2); |
| 1916 | SWAP (edge, e1, e2); |
| 1917 | SWAP (rtx, newpos1, newpos2); |
| 1918 | #undef SWAP |
| 1919 | } |
| 1920 | |
| 1921 | /* Don't proceed with the crossjump unless we found a sufficient number |
| 1922 | of matching instructions or the 'from' block was totally matched |
| 1923 | (such that its predecessors will hopefully be redirected and the |
| 1924 | block removed). */ |
| 1925 | if ((nmatch < PARAM_VALUE (PARAM_MIN_CROSSJUMP_INSNS)) |
| 1926 | && (newpos1 != BB_HEAD (src1))) |
| 1927 | return false; |
| 1928 | |
| 1929 | /* Avoid deleting preserve label when redirecting ABNORMAL edges. */ |
| 1930 | if (block_has_preserve_label (e1->dest) |
| 1931 | && (e1->flags & EDGE_ABNORMAL)) |
| 1932 | return false; |
| 1933 | |
| 1934 | /* Here we know that the insns in the end of SRC1 which are common with SRC2 |
| 1935 | will be deleted. |
| 1936 | If we have tablejumps in the end of SRC1 and SRC2 |
| 1937 | they have been already compared for equivalence in outgoing_edges_match () |
| 1938 | so replace the references to TABLE1 by references to TABLE2. */ |
| 1939 | { |
| 1940 | rtx label1, label2; |
| 1941 | rtx table1, table2; |
| 1942 | |
| 1943 | if (tablejump_p (BB_END (osrc1), &label1, &table1) |
| 1944 | && tablejump_p (BB_END (osrc2), &label2, &table2) |
| 1945 | && label1 != label2) |
| 1946 | { |
| 1947 | replace_label_data rr; |
| 1948 | rtx insn; |
| 1949 | |
| 1950 | /* Replace references to LABEL1 with LABEL2. */ |
| 1951 | rr.r1 = label1; |
| 1952 | rr.r2 = label2; |
| 1953 | rr.update_label_nuses = true; |
| 1954 | for (insn = get_insns (); insn; insn = NEXT_INSN (insn)) |
| 1955 | { |
| 1956 | /* Do not replace the label in SRC1->END because when deleting |
| 1957 | a block whose end is a tablejump, the tablejump referenced |
| 1958 | from the instruction is deleted too. */ |
| 1959 | if (insn != BB_END (osrc1)) |
| 1960 | for_each_rtx (&insn, replace_label, &rr); |
| 1961 | } |
| 1962 | } |
| 1963 | } |
| 1964 | |
| 1965 | /* Avoid splitting if possible. We must always split when SRC2 has |
| 1966 | EH predecessor edges, or we may end up with basic blocks with both |
| 1967 | normal and EH predecessor edges. */ |
| 1968 | if (newpos2 == BB_HEAD (src2) |
| 1969 | && !(EDGE_PRED (src2, 0)->flags & EDGE_EH)) |
| 1970 | redirect_to = src2; |
| 1971 | else |
| 1972 | { |
| 1973 | if (newpos2 == BB_HEAD (src2)) |
| 1974 | { |
| 1975 | /* Skip possible basic block header. */ |
| 1976 | if (LABEL_P (newpos2)) |
| 1977 | newpos2 = NEXT_INSN (newpos2); |
| 1978 | while (DEBUG_INSN_P (newpos2)) |
| 1979 | newpos2 = NEXT_INSN (newpos2); |
| 1980 | if (NOTE_P (newpos2)) |
| 1981 | newpos2 = NEXT_INSN (newpos2); |
| 1982 | while (DEBUG_INSN_P (newpos2)) |
| 1983 | newpos2 = NEXT_INSN (newpos2); |
| 1984 | } |
| 1985 | |
| 1986 | if (dump_file) |
| 1987 | fprintf (dump_file, "Splitting bb %i before %i insns\n", |
| 1988 | src2->index, nmatch); |
| 1989 | redirect_to = split_block (src2, PREV_INSN (newpos2))->dest; |
| 1990 | } |
| 1991 | |
| 1992 | if (dump_file) |
| 1993 | fprintf (dump_file, |
| 1994 | "Cross jumping from bb %i to bb %i; %i common insns\n", |
| 1995 | src1->index, src2->index, nmatch); |
| 1996 | |
| 1997 | /* We may have some registers visible through the block. */ |
| 1998 | df_set_bb_dirty (redirect_to); |
| 1999 | |
| 2000 | if (osrc2 == src2) |
| 2001 | redirect_edges_to = redirect_to; |
| 2002 | else |
| 2003 | redirect_edges_to = osrc2; |
| 2004 | |
| 2005 | /* Recompute the frequencies and counts of outgoing edges. */ |
| 2006 | FOR_EACH_EDGE (s, ei, redirect_edges_to->succs) |
| 2007 | { |
| 2008 | edge s2; |
| 2009 | edge_iterator ei; |
| 2010 | basic_block d = s->dest; |
| 2011 | |
| 2012 | if (FORWARDER_BLOCK_P (d)) |
| 2013 | d = single_succ (d); |
| 2014 | |
| 2015 | FOR_EACH_EDGE (s2, ei, src1->succs) |
| 2016 | { |
| 2017 | basic_block d2 = s2->dest; |
| 2018 | if (FORWARDER_BLOCK_P (d2)) |
| 2019 | d2 = single_succ (d2); |
| 2020 | if (d == d2) |
| 2021 | break; |
| 2022 | } |
| 2023 | |
| 2024 | s->count += s2->count; |
| 2025 | |
| 2026 | /* Take care to update possible forwarder blocks. We verified |
| 2027 | that there is no more than one in the chain, so we can't run |
| 2028 | into infinite loop. */ |
| 2029 | if (FORWARDER_BLOCK_P (s->dest)) |
| 2030 | { |
| 2031 | single_succ_edge (s->dest)->count += s2->count; |
| 2032 | s->dest->count += s2->count; |
| 2033 | s->dest->frequency += EDGE_FREQUENCY (s); |
| 2034 | } |
| 2035 | |
| 2036 | if (FORWARDER_BLOCK_P (s2->dest)) |
| 2037 | { |
| 2038 | single_succ_edge (s2->dest)->count -= s2->count; |
| 2039 | if (single_succ_edge (s2->dest)->count < 0) |
| 2040 | single_succ_edge (s2->dest)->count = 0; |
| 2041 | s2->dest->count -= s2->count; |
| 2042 | s2->dest->frequency -= EDGE_FREQUENCY (s); |
| 2043 | if (s2->dest->frequency < 0) |
| 2044 | s2->dest->frequency = 0; |
| 2045 | if (s2->dest->count < 0) |
| 2046 | s2->dest->count = 0; |
| 2047 | } |
| 2048 | |
| 2049 | if (!redirect_edges_to->frequency && !src1->frequency) |
| 2050 | s->probability = (s->probability + s2->probability) / 2; |
| 2051 | else |
| 2052 | s->probability |
| 2053 | = ((s->probability * redirect_edges_to->frequency + |
| 2054 | s2->probability * src1->frequency) |
| 2055 | / (redirect_edges_to->frequency + src1->frequency)); |
| 2056 | } |
| 2057 | |
| 2058 | /* Adjust count and frequency for the block. An earlier jump |
| 2059 | threading pass may have left the profile in an inconsistent |
| 2060 | state (see update_bb_profile_for_threading) so we must be |
| 2061 | prepared for overflows. */ |
| 2062 | tmp = redirect_to; |
| 2063 | do |
| 2064 | { |
| 2065 | tmp->count += src1->count; |
| 2066 | tmp->frequency += src1->frequency; |
| 2067 | if (tmp->frequency > BB_FREQ_MAX) |
| 2068 | tmp->frequency = BB_FREQ_MAX; |
| 2069 | if (tmp == redirect_edges_to) |
| 2070 | break; |
| 2071 | tmp = find_fallthru_edge (tmp->succs)->dest; |
| 2072 | } |
| 2073 | while (true); |
| 2074 | update_br_prob_note (redirect_edges_to); |
| 2075 | |
| 2076 | /* Edit SRC1 to go to REDIRECT_TO at NEWPOS1. */ |
| 2077 | |
| 2078 | /* Skip possible basic block header. */ |
| 2079 | if (LABEL_P (newpos1)) |
| 2080 | newpos1 = NEXT_INSN (newpos1); |
| 2081 | |
| 2082 | while (DEBUG_INSN_P (newpos1)) |
| 2083 | newpos1 = NEXT_INSN (newpos1); |
| 2084 | |
| 2085 | if (NOTE_INSN_BASIC_BLOCK_P (newpos1)) |
| 2086 | newpos1 = NEXT_INSN (newpos1); |
| 2087 | |
| 2088 | while (DEBUG_INSN_P (newpos1)) |
| 2089 | newpos1 = NEXT_INSN (newpos1); |
| 2090 | |
| 2091 | redirect_from = split_block (src1, PREV_INSN (newpos1))->src; |
| 2092 | to_remove = single_succ (redirect_from); |
| 2093 | |
| 2094 | redirect_edge_and_branch_force (single_succ_edge (redirect_from), redirect_to); |
| 2095 | delete_basic_block (to_remove); |
| 2096 | |
| 2097 | update_forwarder_flag (redirect_from); |
| 2098 | if (redirect_to != src2) |
| 2099 | update_forwarder_flag (src2); |
| 2100 | |
| 2101 | return true; |
| 2102 | } |
| 2103 | |
| 2104 | /* Search the predecessors of BB for common insn sequences. When found, |
| 2105 | share code between them by redirecting control flow. Return true if |
| 2106 | any changes made. */ |
| 2107 | |
| 2108 | static bool |
| 2109 | try_crossjump_bb (int mode, basic_block bb) |
| 2110 | { |
| 2111 | edge e, e2, fallthru; |
| 2112 | bool changed; |
| 2113 | unsigned max, ix, ix2; |
| 2114 | |
| 2115 | /* Nothing to do if there is not at least two incoming edges. */ |
| 2116 | if (EDGE_COUNT (bb->preds) < 2) |
| 2117 | return false; |
| 2118 | |
| 2119 | /* Don't crossjump if this block ends in a computed jump, |
| 2120 | unless we are optimizing for size. */ |
| 2121 | if (optimize_bb_for_size_p (bb) |
| 2122 | && bb != EXIT_BLOCK_PTR |
| 2123 | && computed_jump_p (BB_END (bb))) |
| 2124 | return false; |
| 2125 | |
| 2126 | /* If we are partitioning hot/cold basic blocks, we don't want to |
| 2127 | mess up unconditional or indirect jumps that cross between hot |
| 2128 | and cold sections. |
| 2129 | |
| 2130 | Basic block partitioning may result in some jumps that appear to |
| 2131 | be optimizable (or blocks that appear to be mergeable), but which really |
| 2132 | must be left untouched (they are required to make it safely across |
| 2133 | partition boundaries). See the comments at the top of |
| 2134 | bb-reorder.c:partition_hot_cold_basic_blocks for complete details. */ |
| 2135 | |
| 2136 | if (BB_PARTITION (EDGE_PRED (bb, 0)->src) != |
| 2137 | BB_PARTITION (EDGE_PRED (bb, 1)->src) |
| 2138 | || (EDGE_PRED (bb, 0)->flags & EDGE_CROSSING)) |
| 2139 | return false; |
| 2140 | |
| 2141 | /* It is always cheapest to redirect a block that ends in a branch to |
| 2142 | a block that falls through into BB, as that adds no branches to the |
| 2143 | program. We'll try that combination first. */ |
| 2144 | fallthru = NULL; |
| 2145 | max = PARAM_VALUE (PARAM_MAX_CROSSJUMP_EDGES); |
| 2146 | |
| 2147 | if (EDGE_COUNT (bb->preds) > max) |
| 2148 | return false; |
| 2149 | |
| 2150 | fallthru = find_fallthru_edge (bb->preds); |
| 2151 | |
| 2152 | changed = false; |
| 2153 | for (ix = 0; ix < EDGE_COUNT (bb->preds);) |
| 2154 | { |
| 2155 | e = EDGE_PRED (bb, ix); |
| 2156 | ix++; |
| 2157 | |
| 2158 | /* As noted above, first try with the fallthru predecessor (or, a |
| 2159 | fallthru predecessor if we are in cfglayout mode). */ |
| 2160 | if (fallthru) |
| 2161 | { |
| 2162 | /* Don't combine the fallthru edge into anything else. |
| 2163 | If there is a match, we'll do it the other way around. */ |
| 2164 | if (e == fallthru) |
| 2165 | continue; |
| 2166 | /* If nothing changed since the last attempt, there is nothing |
| 2167 | we can do. */ |
| 2168 | if (!first_pass |
| 2169 | && !((e->src->flags & BB_MODIFIED) |
| 2170 | || (fallthru->src->flags & BB_MODIFIED))) |
| 2171 | continue; |
| 2172 | |
| 2173 | if (try_crossjump_to_edge (mode, e, fallthru, dir_forward)) |
| 2174 | { |
| 2175 | changed = true; |
| 2176 | ix = 0; |
| 2177 | continue; |
| 2178 | } |
| 2179 | } |
| 2180 | |
| 2181 | /* Non-obvious work limiting check: Recognize that we're going |
| 2182 | to call try_crossjump_bb on every basic block. So if we have |
| 2183 | two blocks with lots of outgoing edges (a switch) and they |
| 2184 | share lots of common destinations, then we would do the |
| 2185 | cross-jump check once for each common destination. |
| 2186 | |
| 2187 | Now, if the blocks actually are cross-jump candidates, then |
| 2188 | all of their destinations will be shared. Which means that |
| 2189 | we only need check them for cross-jump candidacy once. We |
| 2190 | can eliminate redundant checks of crossjump(A,B) by arbitrarily |
| 2191 | choosing to do the check from the block for which the edge |
| 2192 | in question is the first successor of A. */ |
| 2193 | if (EDGE_SUCC (e->src, 0) != e) |
| 2194 | continue; |
| 2195 | |
| 2196 | for (ix2 = 0; ix2 < EDGE_COUNT (bb->preds); ix2++) |
| 2197 | { |
| 2198 | e2 = EDGE_PRED (bb, ix2); |
| 2199 | |
| 2200 | if (e2 == e) |
| 2201 | continue; |
| 2202 | |
| 2203 | /* We've already checked the fallthru edge above. */ |
| 2204 | if (e2 == fallthru) |
| 2205 | continue; |
| 2206 | |
| 2207 | /* The "first successor" check above only prevents multiple |
| 2208 | checks of crossjump(A,B). In order to prevent redundant |
| 2209 | checks of crossjump(B,A), require that A be the block |
| 2210 | with the lowest index. */ |
| 2211 | if (e->src->index > e2->src->index) |
| 2212 | continue; |
| 2213 | |
| 2214 | /* If nothing changed since the last attempt, there is nothing |
| 2215 | we can do. */ |
| 2216 | if (!first_pass |
| 2217 | && !((e->src->flags & BB_MODIFIED) |
| 2218 | || (e2->src->flags & BB_MODIFIED))) |
| 2219 | continue; |
| 2220 | |
| 2221 | /* Both e and e2 are not fallthru edges, so we can crossjump in either |
| 2222 | direction. */ |
| 2223 | if (try_crossjump_to_edge (mode, e, e2, dir_both)) |
| 2224 | { |
| 2225 | changed = true; |
| 2226 | ix = 0; |
| 2227 | break; |
| 2228 | } |
| 2229 | } |
| 2230 | } |
| 2231 | |
| 2232 | if (changed) |
| 2233 | crossjumps_occured = true; |
| 2234 | |
| 2235 | return changed; |
| 2236 | } |
| 2237 | |
| 2238 | /* Search the successors of BB for common insn sequences. When found, |
| 2239 | share code between them by moving it across the basic block |
| 2240 | boundary. Return true if any changes made. */ |
| 2241 | |
| 2242 | static bool |
| 2243 | try_head_merge_bb (basic_block bb) |
| 2244 | { |
| 2245 | basic_block final_dest_bb = NULL; |
| 2246 | int max_match = INT_MAX; |
| 2247 | edge e0; |
| 2248 | rtx *headptr, *currptr, *nextptr; |
| 2249 | bool changed, moveall; |
| 2250 | unsigned ix; |
| 2251 | rtx e0_last_head, cond, move_before; |
| 2252 | unsigned nedges = EDGE_COUNT (bb->succs); |
| 2253 | rtx jump = BB_END (bb); |
| 2254 | regset live, live_union; |
| 2255 | |
| 2256 | /* Nothing to do if there is not at least two outgoing edges. */ |
| 2257 | if (nedges < 2) |
| 2258 | return false; |
| 2259 | |
| 2260 | /* Don't crossjump if this block ends in a computed jump, |
| 2261 | unless we are optimizing for size. */ |
| 2262 | if (optimize_bb_for_size_p (bb) |
| 2263 | && bb != EXIT_BLOCK_PTR |
| 2264 | && computed_jump_p (BB_END (bb))) |
| 2265 | return false; |
| 2266 | |
| 2267 | cond = get_condition (jump, &move_before, true, false); |
| 2268 | if (cond == NULL_RTX) |
| 2269 | { |
| 2270 | #ifdef HAVE_cc0 |
| 2271 | if (reg_mentioned_p (cc0_rtx, jump)) |
| 2272 | move_before = prev_nonnote_nondebug_insn (jump); |
| 2273 | else |
| 2274 | #endif |
| 2275 | move_before = jump; |
| 2276 | } |
| 2277 | |
| 2278 | for (ix = 0; ix < nedges; ix++) |
| 2279 | if (EDGE_SUCC (bb, ix)->dest == EXIT_BLOCK_PTR) |
| 2280 | return false; |
| 2281 | |
| 2282 | for (ix = 0; ix < nedges; ix++) |
| 2283 | { |
| 2284 | edge e = EDGE_SUCC (bb, ix); |
| 2285 | basic_block other_bb = e->dest; |
| 2286 | |
| 2287 | if (df_get_bb_dirty (other_bb)) |
| 2288 | { |
| 2289 | block_was_dirty = true; |
| 2290 | return false; |
| 2291 | } |
| 2292 | |
| 2293 | if (e->flags & EDGE_ABNORMAL) |
| 2294 | return false; |
| 2295 | |
| 2296 | /* Normally, all destination blocks must only be reachable from this |
| 2297 | block, i.e. they must have one incoming edge. |
| 2298 | |
| 2299 | There is one special case we can handle, that of multiple consecutive |
| 2300 | jumps where the first jumps to one of the targets of the second jump. |
| 2301 | This happens frequently in switch statements for default labels. |
| 2302 | The structure is as follows: |
| 2303 | FINAL_DEST_BB |
| 2304 | .... |
| 2305 | if (cond) jump A; |
| 2306 | fall through |
| 2307 | BB |
| 2308 | jump with targets A, B, C, D... |
| 2309 | A |
| 2310 | has two incoming edges, from FINAL_DEST_BB and BB |
| 2311 | |
| 2312 | In this case, we can try to move the insns through BB and into |
| 2313 | FINAL_DEST_BB. */ |
| 2314 | if (EDGE_COUNT (other_bb->preds) != 1) |
| 2315 | { |
| 2316 | edge incoming_edge, incoming_bb_other_edge; |
| 2317 | edge_iterator ei; |
| 2318 | |
| 2319 | if (final_dest_bb != NULL |
| 2320 | || EDGE_COUNT (other_bb->preds) != 2) |
| 2321 | return false; |
| 2322 | |
| 2323 | /* We must be able to move the insns across the whole block. */ |
| 2324 | move_before = BB_HEAD (bb); |
| 2325 | while (!NONDEBUG_INSN_P (move_before)) |
| 2326 | move_before = NEXT_INSN (move_before); |
| 2327 | |
| 2328 | if (EDGE_COUNT (bb->preds) != 1) |
| 2329 | return false; |
| 2330 | incoming_edge = EDGE_PRED (bb, 0); |
| 2331 | final_dest_bb = incoming_edge->src; |
| 2332 | if (EDGE_COUNT (final_dest_bb->succs) != 2) |
| 2333 | return false; |
| 2334 | FOR_EACH_EDGE (incoming_bb_other_edge, ei, final_dest_bb->succs) |
| 2335 | if (incoming_bb_other_edge != incoming_edge) |
| 2336 | break; |
| 2337 | if (incoming_bb_other_edge->dest != other_bb) |
| 2338 | return false; |
| 2339 | } |
| 2340 | } |
| 2341 | |
| 2342 | e0 = EDGE_SUCC (bb, 0); |
| 2343 | e0_last_head = NULL_RTX; |
| 2344 | changed = false; |
| 2345 | |
| 2346 | for (ix = 1; ix < nedges; ix++) |
| 2347 | { |
| 2348 | edge e = EDGE_SUCC (bb, ix); |
| 2349 | rtx e0_last, e_last; |
| 2350 | int nmatch; |
| 2351 | |
| 2352 | nmatch = flow_find_head_matching_sequence (e0->dest, e->dest, |
| 2353 | &e0_last, &e_last, 0); |
| 2354 | if (nmatch == 0) |
| 2355 | return false; |
| 2356 | |
| 2357 | if (nmatch < max_match) |
| 2358 | { |
| 2359 | max_match = nmatch; |
| 2360 | e0_last_head = e0_last; |
| 2361 | } |
| 2362 | } |
| 2363 | |
| 2364 | /* If we matched an entire block, we probably have to avoid moving the |
| 2365 | last insn. */ |
| 2366 | if (max_match > 0 |
| 2367 | && e0_last_head == BB_END (e0->dest) |
| 2368 | && (find_reg_note (e0_last_head, REG_EH_REGION, 0) |
| 2369 | || control_flow_insn_p (e0_last_head))) |
| 2370 | { |
| 2371 | max_match--; |
| 2372 | if (max_match == 0) |
| 2373 | return false; |
| 2374 | do |
| 2375 | e0_last_head = prev_real_insn (e0_last_head); |
| 2376 | while (DEBUG_INSN_P (e0_last_head)); |
| 2377 | } |
| 2378 | |
| 2379 | if (max_match == 0) |
| 2380 | return false; |
| 2381 | |
| 2382 | /* We must find a union of the live registers at each of the end points. */ |
| 2383 | live = BITMAP_ALLOC (NULL); |
| 2384 | live_union = BITMAP_ALLOC (NULL); |
| 2385 | |
| 2386 | currptr = XNEWVEC (rtx, nedges); |
| 2387 | headptr = XNEWVEC (rtx, nedges); |
| 2388 | nextptr = XNEWVEC (rtx, nedges); |
| 2389 | |
| 2390 | for (ix = 0; ix < nedges; ix++) |
| 2391 | { |
| 2392 | int j; |
| 2393 | basic_block merge_bb = EDGE_SUCC (bb, ix)->dest; |
| 2394 | rtx head = BB_HEAD (merge_bb); |
| 2395 | |
| 2396 | while (!NONDEBUG_INSN_P (head)) |
| 2397 | head = NEXT_INSN (head); |
| 2398 | headptr[ix] = head; |
| 2399 | currptr[ix] = head; |
| 2400 | |
| 2401 | /* Compute the end point and live information */ |
| 2402 | for (j = 1; j < max_match; j++) |
| 2403 | do |
| 2404 | head = NEXT_INSN (head); |
| 2405 | while (!NONDEBUG_INSN_P (head)); |
| 2406 | simulate_backwards_to_point (merge_bb, live, head); |
| 2407 | IOR_REG_SET (live_union, live); |
| 2408 | } |
| 2409 | |
| 2410 | /* If we're moving across two blocks, verify the validity of the |
| 2411 | first move, then adjust the target and let the loop below deal |
| 2412 | with the final move. */ |
| 2413 | if (final_dest_bb != NULL) |
| 2414 | { |
| 2415 | rtx move_upto; |
| 2416 | |
| 2417 | moveall = can_move_insns_across (currptr[0], e0_last_head, move_before, |
| 2418 | jump, e0->dest, live_union, |
| 2419 | NULL, &move_upto); |
| 2420 | if (!moveall) |
| 2421 | { |
| 2422 | if (move_upto == NULL_RTX) |
| 2423 | goto out; |
| 2424 | |
| 2425 | while (e0_last_head != move_upto) |
| 2426 | { |
| 2427 | df_simulate_one_insn_backwards (e0->dest, e0_last_head, |
| 2428 | live_union); |
| 2429 | e0_last_head = PREV_INSN (e0_last_head); |
| 2430 | } |
| 2431 | } |
| 2432 | if (e0_last_head == NULL_RTX) |
| 2433 | goto out; |
| 2434 | |
| 2435 | jump = BB_END (final_dest_bb); |
| 2436 | cond = get_condition (jump, &move_before, true, false); |
| 2437 | if (cond == NULL_RTX) |
| 2438 | { |
| 2439 | #ifdef HAVE_cc0 |
| 2440 | if (reg_mentioned_p (cc0_rtx, jump)) |
| 2441 | move_before = prev_nonnote_nondebug_insn (jump); |
| 2442 | else |
| 2443 | #endif |
| 2444 | move_before = jump; |
| 2445 | } |
| 2446 | } |
| 2447 | |
| 2448 | do |
| 2449 | { |
| 2450 | rtx move_upto; |
| 2451 | moveall = can_move_insns_across (currptr[0], e0_last_head, |
| 2452 | move_before, jump, e0->dest, live_union, |
| 2453 | NULL, &move_upto); |
| 2454 | if (!moveall && move_upto == NULL_RTX) |
| 2455 | { |
| 2456 | if (jump == move_before) |
| 2457 | break; |
| 2458 | |
| 2459 | /* Try again, using a different insertion point. */ |
| 2460 | move_before = jump; |
| 2461 | |
| 2462 | #ifdef HAVE_cc0 |
| 2463 | /* Don't try moving before a cc0 user, as that may invalidate |
| 2464 | the cc0. */ |
| 2465 | if (reg_mentioned_p (cc0_rtx, jump)) |
| 2466 | break; |
| 2467 | #endif |
| 2468 | |
| 2469 | continue; |
| 2470 | } |
| 2471 | |
| 2472 | if (final_dest_bb && !moveall) |
| 2473 | /* We haven't checked whether a partial move would be OK for the first |
| 2474 | move, so we have to fail this case. */ |
| 2475 | break; |
| 2476 | |
| 2477 | changed = true; |
| 2478 | for (;;) |
| 2479 | { |
| 2480 | if (currptr[0] == move_upto) |
| 2481 | break; |
| 2482 | for (ix = 0; ix < nedges; ix++) |
| 2483 | { |
| 2484 | rtx curr = currptr[ix]; |
| 2485 | do |
| 2486 | curr = NEXT_INSN (curr); |
| 2487 | while (!NONDEBUG_INSN_P (curr)); |
| 2488 | currptr[ix] = curr; |
| 2489 | } |
| 2490 | } |
| 2491 | |
| 2492 | /* If we can't currently move all of the identical insns, remember |
| 2493 | each insn after the range that we'll merge. */ |
| 2494 | if (!moveall) |
| 2495 | for (ix = 0; ix < nedges; ix++) |
| 2496 | { |
| 2497 | rtx curr = currptr[ix]; |
| 2498 | do |
| 2499 | curr = NEXT_INSN (curr); |
| 2500 | while (!NONDEBUG_INSN_P (curr)); |
| 2501 | nextptr[ix] = curr; |
| 2502 | } |
| 2503 | |
| 2504 | reorder_insns (headptr[0], currptr[0], PREV_INSN (move_before)); |
| 2505 | df_set_bb_dirty (EDGE_SUCC (bb, 0)->dest); |
| 2506 | if (final_dest_bb != NULL) |
| 2507 | df_set_bb_dirty (final_dest_bb); |
| 2508 | df_set_bb_dirty (bb); |
| 2509 | for (ix = 1; ix < nedges; ix++) |
| 2510 | { |
| 2511 | df_set_bb_dirty (EDGE_SUCC (bb, ix)->dest); |
| 2512 | delete_insn_chain (headptr[ix], currptr[ix], false); |
| 2513 | } |
| 2514 | if (!moveall) |
| 2515 | { |
| 2516 | if (jump == move_before) |
| 2517 | break; |
| 2518 | |
| 2519 | /* For the unmerged insns, try a different insertion point. */ |
| 2520 | move_before = jump; |
| 2521 | |
| 2522 | #ifdef HAVE_cc0 |
| 2523 | /* Don't try moving before a cc0 user, as that may invalidate |
| 2524 | the cc0. */ |
| 2525 | if (reg_mentioned_p (cc0_rtx, jump)) |
| 2526 | break; |
| 2527 | #endif |
| 2528 | |
| 2529 | for (ix = 0; ix < nedges; ix++) |
| 2530 | currptr[ix] = headptr[ix] = nextptr[ix]; |
| 2531 | } |
| 2532 | } |
| 2533 | while (!moveall); |
| 2534 | |
| 2535 | out: |
| 2536 | free (currptr); |
| 2537 | free (headptr); |
| 2538 | free (nextptr); |
| 2539 | |
| 2540 | crossjumps_occured |= changed; |
| 2541 | |
| 2542 | return changed; |
| 2543 | } |
| 2544 | |
| 2545 | /* Return true if BB contains just bb note, or bb note followed |
| 2546 | by only DEBUG_INSNs. */ |
| 2547 | |
| 2548 | static bool |
| 2549 | trivially_empty_bb_p (basic_block bb) |
| 2550 | { |
| 2551 | rtx insn = BB_END (bb); |
| 2552 | |
| 2553 | while (1) |
| 2554 | { |
| 2555 | if (insn == BB_HEAD (bb)) |
| 2556 | return true; |
| 2557 | if (!DEBUG_INSN_P (insn)) |
| 2558 | return false; |
| 2559 | insn = PREV_INSN (insn); |
| 2560 | } |
| 2561 | } |
| 2562 | |
| 2563 | /* Do simple CFG optimizations - basic block merging, simplifying of jump |
| 2564 | instructions etc. Return nonzero if changes were made. */ |
| 2565 | |
| 2566 | static bool |
| 2567 | try_optimize_cfg (int mode) |
| 2568 | { |
| 2569 | bool changed_overall = false; |
| 2570 | bool changed; |
| 2571 | int iterations = 0; |
| 2572 | basic_block bb, b, next; |
| 2573 | |
| 2574 | if (mode & (CLEANUP_CROSSJUMP | CLEANUP_THREADING)) |
| 2575 | clear_bb_flags (); |
| 2576 | |
| 2577 | crossjumps_occured = false; |
| 2578 | |
| 2579 | FOR_EACH_BB (bb) |
| 2580 | update_forwarder_flag (bb); |
| 2581 | |
| 2582 | if (! targetm.cannot_modify_jumps_p ()) |
| 2583 | { |
| 2584 | first_pass = true; |
| 2585 | /* Attempt to merge blocks as made possible by edge removal. If |
| 2586 | a block has only one successor, and the successor has only |
| 2587 | one predecessor, they may be combined. */ |
| 2588 | do |
| 2589 | { |
| 2590 | block_was_dirty = false; |
| 2591 | changed = false; |
| 2592 | iterations++; |
| 2593 | |
| 2594 | if (dump_file) |
| 2595 | fprintf (dump_file, |
| 2596 | "\n\ntry_optimize_cfg iteration %i\n\n", |
| 2597 | iterations); |
| 2598 | |
| 2599 | for (b = ENTRY_BLOCK_PTR->next_bb; b != EXIT_BLOCK_PTR;) |
| 2600 | { |
| 2601 | basic_block c; |
| 2602 | edge s; |
| 2603 | bool changed_here = false; |
| 2604 | |
| 2605 | /* Delete trivially dead basic blocks. This is either |
| 2606 | blocks with no predecessors, or empty blocks with no |
| 2607 | successors. However if the empty block with no |
| 2608 | successors is the successor of the ENTRY_BLOCK, it is |
| 2609 | kept. This ensures that the ENTRY_BLOCK will have a |
| 2610 | successor which is a precondition for many RTL |
| 2611 | passes. Empty blocks may result from expanding |
| 2612 | __builtin_unreachable (). */ |
| 2613 | if (EDGE_COUNT (b->preds) == 0 |
| 2614 | || (EDGE_COUNT (b->succs) == 0 |
| 2615 | && trivially_empty_bb_p (b) |
| 2616 | && single_succ_edge (ENTRY_BLOCK_PTR)->dest != b)) |
| 2617 | { |
| 2618 | c = b->prev_bb; |
| 2619 | if (EDGE_COUNT (b->preds) > 0) |
| 2620 | { |
| 2621 | edge e; |
| 2622 | edge_iterator ei; |
| 2623 | |
| 2624 | if (current_ir_type () == IR_RTL_CFGLAYOUT) |
| 2625 | { |
| 2626 | if (b->il.rtl->footer |
| 2627 | && BARRIER_P (b->il.rtl->footer)) |
| 2628 | FOR_EACH_EDGE (e, ei, b->preds) |
| 2629 | if ((e->flags & EDGE_FALLTHRU) |
| 2630 | && e->src->il.rtl->footer == NULL) |
| 2631 | { |
| 2632 | if (b->il.rtl->footer) |
| 2633 | { |
| 2634 | e->src->il.rtl->footer = b->il.rtl->footer; |
| 2635 | b->il.rtl->footer = NULL; |
| 2636 | } |
| 2637 | else |
| 2638 | { |
| 2639 | start_sequence (); |
| 2640 | e->src->il.rtl->footer = emit_barrier (); |
| 2641 | end_sequence (); |
| 2642 | } |
| 2643 | } |
| 2644 | } |
| 2645 | else |
| 2646 | { |
| 2647 | rtx last = get_last_bb_insn (b); |
| 2648 | if (last && BARRIER_P (last)) |
| 2649 | FOR_EACH_EDGE (e, ei, b->preds) |
| 2650 | if ((e->flags & EDGE_FALLTHRU)) |
| 2651 | emit_barrier_after (BB_END (e->src)); |
| 2652 | } |
| 2653 | } |
| 2654 | delete_basic_block (b); |
| 2655 | changed = true; |
| 2656 | /* Avoid trying to remove ENTRY_BLOCK_PTR. */ |
| 2657 | b = (c == ENTRY_BLOCK_PTR ? c->next_bb : c); |
| 2658 | continue; |
| 2659 | } |
| 2660 | |
| 2661 | /* Remove code labels no longer used. */ |
| 2662 | if (single_pred_p (b) |
| 2663 | && (single_pred_edge (b)->flags & EDGE_FALLTHRU) |
| 2664 | && !(single_pred_edge (b)->flags & EDGE_COMPLEX) |
| 2665 | && LABEL_P (BB_HEAD (b)) |
| 2666 | /* If the previous block ends with a branch to this |
| 2667 | block, we can't delete the label. Normally this |
| 2668 | is a condjump that is yet to be simplified, but |
| 2669 | if CASE_DROPS_THRU, this can be a tablejump with |
| 2670 | some element going to the same place as the |
| 2671 | default (fallthru). */ |
| 2672 | && (single_pred (b) == ENTRY_BLOCK_PTR |
| 2673 | || !JUMP_P (BB_END (single_pred (b))) |
| 2674 | || ! label_is_jump_target_p (BB_HEAD (b), |
| 2675 | BB_END (single_pred (b))))) |
| 2676 | { |
| 2677 | rtx label = BB_HEAD (b); |
| 2678 | |
| 2679 | delete_insn_chain (label, label, false); |
| 2680 | /* If the case label is undeletable, move it after the |
| 2681 | BASIC_BLOCK note. */ |
| 2682 | if (NOTE_KIND (BB_HEAD (b)) == NOTE_INSN_DELETED_LABEL) |
| 2683 | { |
| 2684 | rtx bb_note = NEXT_INSN (BB_HEAD (b)); |
| 2685 | |
| 2686 | reorder_insns_nobb (label, label, bb_note); |
| 2687 | BB_HEAD (b) = bb_note; |
| 2688 | if (BB_END (b) == bb_note) |
| 2689 | BB_END (b) = label; |
| 2690 | } |
| 2691 | if (dump_file) |
| 2692 | fprintf (dump_file, "Deleted label in block %i.\n", |
| 2693 | b->index); |
| 2694 | } |
| 2695 | |
| 2696 | /* If we fall through an empty block, we can remove it. */ |
| 2697 | if (!(mode & CLEANUP_CFGLAYOUT) |
| 2698 | && single_pred_p (b) |
| 2699 | && (single_pred_edge (b)->flags & EDGE_FALLTHRU) |
| 2700 | && !LABEL_P (BB_HEAD (b)) |
| 2701 | && FORWARDER_BLOCK_P (b) |
| 2702 | /* Note that forwarder_block_p true ensures that |
| 2703 | there is a successor for this block. */ |
| 2704 | && (single_succ_edge (b)->flags & EDGE_FALLTHRU) |
| 2705 | && n_basic_blocks > NUM_FIXED_BLOCKS + 1) |
| 2706 | { |
| 2707 | if (dump_file) |
| 2708 | fprintf (dump_file, |
| 2709 | "Deleting fallthru block %i.\n", |
| 2710 | b->index); |
| 2711 | |
| 2712 | c = b->prev_bb == ENTRY_BLOCK_PTR ? b->next_bb : b->prev_bb; |
| 2713 | redirect_edge_succ_nodup (single_pred_edge (b), |
| 2714 | single_succ (b)); |
| 2715 | delete_basic_block (b); |
| 2716 | changed = true; |
| 2717 | b = c; |
| 2718 | continue; |
| 2719 | } |
| 2720 | |
| 2721 | /* Merge B with its single successor, if any. */ |
| 2722 | if (single_succ_p (b) |
| 2723 | && (s = single_succ_edge (b)) |
| 2724 | && !(s->flags & EDGE_COMPLEX) |
| 2725 | && (c = s->dest) != EXIT_BLOCK_PTR |
| 2726 | && single_pred_p (c) |
| 2727 | && b != c) |
| 2728 | { |
| 2729 | /* When not in cfg_layout mode use code aware of reordering |
| 2730 | INSN. This code possibly creates new basic blocks so it |
| 2731 | does not fit merge_blocks interface and is kept here in |
| 2732 | hope that it will become useless once more of compiler |
| 2733 | is transformed to use cfg_layout mode. */ |
| 2734 | |
| 2735 | if ((mode & CLEANUP_CFGLAYOUT) |
| 2736 | && can_merge_blocks_p (b, c)) |
| 2737 | { |
| 2738 | merge_blocks (b, c); |
| 2739 | update_forwarder_flag (b); |
| 2740 | changed_here = true; |
| 2741 | } |
| 2742 | else if (!(mode & CLEANUP_CFGLAYOUT) |
| 2743 | /* If the jump insn has side effects, |
| 2744 | we can't kill the edge. */ |
| 2745 | && (!JUMP_P (BB_END (b)) |
| 2746 | || (reload_completed |
| 2747 | ? simplejump_p (BB_END (b)) |
| 2748 | : (onlyjump_p (BB_END (b)) |
| 2749 | && !tablejump_p (BB_END (b), |
| 2750 | NULL, NULL)))) |
| 2751 | && (next = merge_blocks_move (s, b, c, mode))) |
| 2752 | { |
| 2753 | b = next; |
| 2754 | changed_here = true; |
| 2755 | } |
| 2756 | } |
| 2757 | |
| 2758 | /* Simplify branch over branch. */ |
| 2759 | if ((mode & CLEANUP_EXPENSIVE) |
| 2760 | && !(mode & CLEANUP_CFGLAYOUT) |
| 2761 | && try_simplify_condjump (b)) |
| 2762 | changed_here = true; |
| 2763 | |
| 2764 | /* If B has a single outgoing edge, but uses a |
| 2765 | non-trivial jump instruction without side-effects, we |
| 2766 | can either delete the jump entirely, or replace it |
| 2767 | with a simple unconditional jump. */ |
| 2768 | if (single_succ_p (b) |
| 2769 | && single_succ (b) != EXIT_BLOCK_PTR |
| 2770 | && onlyjump_p (BB_END (b)) |
| 2771 | && !find_reg_note (BB_END (b), REG_CROSSING_JUMP, NULL_RTX) |
| 2772 | && try_redirect_by_replacing_jump (single_succ_edge (b), |
| 2773 | single_succ (b), |
| 2774 | (mode & CLEANUP_CFGLAYOUT) != 0)) |
| 2775 | { |
| 2776 | update_forwarder_flag (b); |
| 2777 | changed_here = true; |
| 2778 | } |
| 2779 | |
| 2780 | /* Simplify branch to branch. */ |
| 2781 | if (try_forward_edges (mode, b)) |
| 2782 | { |
| 2783 | update_forwarder_flag (b); |
| 2784 | changed_here = true; |
| 2785 | } |
| 2786 | |
| 2787 | /* Look for shared code between blocks. */ |
| 2788 | if ((mode & CLEANUP_CROSSJUMP) |
| 2789 | && try_crossjump_bb (mode, b)) |
| 2790 | changed_here = true; |
| 2791 | |
| 2792 | if ((mode & CLEANUP_CROSSJUMP) |
| 2793 | /* This can lengthen register lifetimes. Do it only after |
| 2794 | reload. */ |
| 2795 | && reload_completed |
| 2796 | && try_head_merge_bb (b)) |
| 2797 | changed_here = true; |
| 2798 | |
| 2799 | /* Don't get confused by the index shift caused by |
| 2800 | deleting blocks. */ |
| 2801 | if (!changed_here) |
| 2802 | b = b->next_bb; |
| 2803 | else |
| 2804 | changed = true; |
| 2805 | } |
| 2806 | |
| 2807 | if ((mode & CLEANUP_CROSSJUMP) |
| 2808 | && try_crossjump_bb (mode, EXIT_BLOCK_PTR)) |
| 2809 | changed = true; |
| 2810 | |
| 2811 | if (block_was_dirty) |
| 2812 | { |
| 2813 | /* This should only be set by head-merging. */ |
| 2814 | gcc_assert (mode & CLEANUP_CROSSJUMP); |
| 2815 | df_analyze (); |
| 2816 | } |
| 2817 | |
| 2818 | #ifdef ENABLE_CHECKING |
| 2819 | if (changed) |
| 2820 | verify_flow_info (); |
| 2821 | #endif |
| 2822 | |
| 2823 | changed_overall |= changed; |
| 2824 | first_pass = false; |
| 2825 | } |
| 2826 | while (changed); |
| 2827 | } |
| 2828 | |
| 2829 | FOR_ALL_BB (b) |
| 2830 | b->flags &= ~(BB_FORWARDER_BLOCK | BB_NONTHREADABLE_BLOCK); |
| 2831 | |
| 2832 | return changed_overall; |
| 2833 | } |
| 2834 | \f |
| 2835 | /* Delete all unreachable basic blocks. */ |
| 2836 | |
| 2837 | bool |
| 2838 | delete_unreachable_blocks (void) |
| 2839 | { |
| 2840 | bool changed = false; |
| 2841 | basic_block b, prev_bb; |
| 2842 | |
| 2843 | find_unreachable_blocks (); |
| 2844 | |
| 2845 | /* When we're in GIMPLE mode and there may be debug insns, we should |
| 2846 | delete blocks in reverse dominator order, so as to get a chance |
| 2847 | to substitute all released DEFs into debug stmts. If we don't |
| 2848 | have dominators information, walking blocks backward gets us a |
| 2849 | better chance of retaining most debug information than |
| 2850 | otherwise. */ |
| 2851 | if (MAY_HAVE_DEBUG_STMTS && current_ir_type () == IR_GIMPLE |
| 2852 | && dom_info_available_p (CDI_DOMINATORS)) |
| 2853 | { |
| 2854 | for (b = EXIT_BLOCK_PTR->prev_bb; b != ENTRY_BLOCK_PTR; b = prev_bb) |
| 2855 | { |
| 2856 | prev_bb = b->prev_bb; |
| 2857 | |
| 2858 | if (!(b->flags & BB_REACHABLE)) |
| 2859 | { |
| 2860 | /* Speed up the removal of blocks that don't dominate |
| 2861 | others. Walking backwards, this should be the common |
| 2862 | case. */ |
| 2863 | if (!first_dom_son (CDI_DOMINATORS, b)) |
| 2864 | delete_basic_block (b); |
| 2865 | else |
| 2866 | { |
| 2867 | VEC (basic_block, heap) *h |
| 2868 | = get_all_dominated_blocks (CDI_DOMINATORS, b); |
| 2869 | |
| 2870 | while (VEC_length (basic_block, h)) |
| 2871 | { |
| 2872 | b = VEC_pop (basic_block, h); |
| 2873 | |
| 2874 | prev_bb = b->prev_bb; |
| 2875 | |
| 2876 | gcc_assert (!(b->flags & BB_REACHABLE)); |
| 2877 | |
| 2878 | delete_basic_block (b); |
| 2879 | } |
| 2880 | |
| 2881 | VEC_free (basic_block, heap, h); |
| 2882 | } |
| 2883 | |
| 2884 | changed = true; |
| 2885 | } |
| 2886 | } |
| 2887 | } |
| 2888 | else |
| 2889 | { |
| 2890 | for (b = EXIT_BLOCK_PTR->prev_bb; b != ENTRY_BLOCK_PTR; b = prev_bb) |
| 2891 | { |
| 2892 | prev_bb = b->prev_bb; |
| 2893 | |
| 2894 | if (!(b->flags & BB_REACHABLE)) |
| 2895 | { |
| 2896 | delete_basic_block (b); |
| 2897 | changed = true; |
| 2898 | } |
| 2899 | } |
| 2900 | } |
| 2901 | |
| 2902 | if (changed) |
| 2903 | tidy_fallthru_edges (); |
| 2904 | return changed; |
| 2905 | } |
| 2906 | |
| 2907 | /* Delete any jump tables never referenced. We can't delete them at the |
| 2908 | time of removing tablejump insn as they are referenced by the preceding |
| 2909 | insns computing the destination, so we delay deleting and garbagecollect |
| 2910 | them once life information is computed. */ |
| 2911 | void |
| 2912 | delete_dead_jumptables (void) |
| 2913 | { |
| 2914 | basic_block bb; |
| 2915 | |
| 2916 | /* A dead jump table does not belong to any basic block. Scan insns |
| 2917 | between two adjacent basic blocks. */ |
| 2918 | FOR_EACH_BB (bb) |
| 2919 | { |
| 2920 | rtx insn, next; |
| 2921 | |
| 2922 | for (insn = NEXT_INSN (BB_END (bb)); |
| 2923 | insn && !NOTE_INSN_BASIC_BLOCK_P (insn); |
| 2924 | insn = next) |
| 2925 | { |
| 2926 | next = NEXT_INSN (insn); |
| 2927 | if (LABEL_P (insn) |
| 2928 | && LABEL_NUSES (insn) == LABEL_PRESERVE_P (insn) |
| 2929 | && JUMP_TABLE_DATA_P (next)) |
| 2930 | { |
| 2931 | rtx label = insn, jump = next; |
| 2932 | |
| 2933 | if (dump_file) |
| 2934 | fprintf (dump_file, "Dead jumptable %i removed\n", |
| 2935 | INSN_UID (insn)); |
| 2936 | |
| 2937 | next = NEXT_INSN (next); |
| 2938 | delete_insn (jump); |
| 2939 | delete_insn (label); |
| 2940 | } |
| 2941 | } |
| 2942 | } |
| 2943 | } |
| 2944 | |
| 2945 | \f |
| 2946 | /* Tidy the CFG by deleting unreachable code and whatnot. */ |
| 2947 | |
| 2948 | bool |
| 2949 | cleanup_cfg (int mode) |
| 2950 | { |
| 2951 | bool changed = false; |
| 2952 | |
| 2953 | /* Set the cfglayout mode flag here. We could update all the callers |
| 2954 | but that is just inconvenient, especially given that we eventually |
| 2955 | want to have cfglayout mode as the default. */ |
| 2956 | if (current_ir_type () == IR_RTL_CFGLAYOUT) |
| 2957 | mode |= CLEANUP_CFGLAYOUT; |
| 2958 | |
| 2959 | timevar_push (TV_CLEANUP_CFG); |
| 2960 | if (delete_unreachable_blocks ()) |
| 2961 | { |
| 2962 | changed = true; |
| 2963 | /* We've possibly created trivially dead code. Cleanup it right |
| 2964 | now to introduce more opportunities for try_optimize_cfg. */ |
| 2965 | if (!(mode & (CLEANUP_NO_INSN_DEL)) |
| 2966 | && !reload_completed) |
| 2967 | delete_trivially_dead_insns (get_insns (), max_reg_num ()); |
| 2968 | } |
| 2969 | |
| 2970 | compact_blocks (); |
| 2971 | |
| 2972 | /* To tail-merge blocks ending in the same noreturn function (e.g. |
| 2973 | a call to abort) we have to insert fake edges to exit. Do this |
| 2974 | here once. The fake edges do not interfere with any other CFG |
| 2975 | cleanups. */ |
| 2976 | if (mode & CLEANUP_CROSSJUMP) |
| 2977 | add_noreturn_fake_exit_edges (); |
| 2978 | |
| 2979 | if (!dbg_cnt (cfg_cleanup)) |
| 2980 | return changed; |
| 2981 | |
| 2982 | while (try_optimize_cfg (mode)) |
| 2983 | { |
| 2984 | delete_unreachable_blocks (), changed = true; |
| 2985 | if (!(mode & CLEANUP_NO_INSN_DEL)) |
| 2986 | { |
| 2987 | /* Try to remove some trivially dead insns when doing an expensive |
| 2988 | cleanup. But delete_trivially_dead_insns doesn't work after |
| 2989 | reload (it only handles pseudos) and run_fast_dce is too costly |
| 2990 | to run in every iteration. |
| 2991 | |
| 2992 | For effective cross jumping, we really want to run a fast DCE to |
| 2993 | clean up any dead conditions, or they get in the way of performing |
| 2994 | useful tail merges. |
| 2995 | |
| 2996 | Other transformations in cleanup_cfg are not so sensitive to dead |
| 2997 | code, so delete_trivially_dead_insns or even doing nothing at all |
| 2998 | is good enough. */ |
| 2999 | if ((mode & CLEANUP_EXPENSIVE) && !reload_completed |
| 3000 | && !delete_trivially_dead_insns (get_insns (), max_reg_num ())) |
| 3001 | break; |
| 3002 | if ((mode & CLEANUP_CROSSJUMP) && crossjumps_occured) |
| 3003 | run_fast_dce (); |
| 3004 | } |
| 3005 | else |
| 3006 | break; |
| 3007 | } |
| 3008 | |
| 3009 | if (mode & CLEANUP_CROSSJUMP) |
| 3010 | remove_fake_exit_edges (); |
| 3011 | |
| 3012 | /* Don't call delete_dead_jumptables in cfglayout mode, because |
| 3013 | that function assumes that jump tables are in the insns stream. |
| 3014 | But we also don't _have_ to delete dead jumptables in cfglayout |
| 3015 | mode because we shouldn't even be looking at things that are |
| 3016 | not in a basic block. Dead jumptables are cleaned up when |
| 3017 | going out of cfglayout mode. */ |
| 3018 | if (!(mode & CLEANUP_CFGLAYOUT)) |
| 3019 | delete_dead_jumptables (); |
| 3020 | |
| 3021 | timevar_pop (TV_CLEANUP_CFG); |
| 3022 | |
| 3023 | return changed; |
| 3024 | } |
| 3025 | \f |
| 3026 | static unsigned int |
| 3027 | rest_of_handle_jump (void) |
| 3028 | { |
| 3029 | if (crtl->tail_call_emit) |
| 3030 | fixup_tail_calls (); |
| 3031 | return 0; |
| 3032 | } |
| 3033 | |
| 3034 | struct rtl_opt_pass pass_jump = |
| 3035 | { |
| 3036 | { |
| 3037 | RTL_PASS, |
| 3038 | "sibling", /* name */ |
| 3039 | NULL, /* gate */ |
| 3040 | rest_of_handle_jump, /* execute */ |
| 3041 | NULL, /* sub */ |
| 3042 | NULL, /* next */ |
| 3043 | 0, /* static_pass_number */ |
| 3044 | TV_JUMP, /* tv_id */ |
| 3045 | 0, /* properties_required */ |
| 3046 | 0, /* properties_provided */ |
| 3047 | 0, /* properties_destroyed */ |
| 3048 | TODO_ggc_collect, /* todo_flags_start */ |
| 3049 | TODO_verify_flow, /* todo_flags_finish */ |
| 3050 | } |
| 3051 | }; |
| 3052 | |
| 3053 | |
| 3054 | static unsigned int |
| 3055 | rest_of_handle_jump2 (void) |
| 3056 | { |
| 3057 | delete_trivially_dead_insns (get_insns (), max_reg_num ()); |
| 3058 | if (dump_file) |
| 3059 | dump_flow_info (dump_file, dump_flags); |
| 3060 | cleanup_cfg ((optimize ? CLEANUP_EXPENSIVE : 0) |
| 3061 | | (flag_thread_jumps ? CLEANUP_THREADING : 0)); |
| 3062 | return 0; |
| 3063 | } |
| 3064 | |
| 3065 | |
| 3066 | struct rtl_opt_pass pass_jump2 = |
| 3067 | { |
| 3068 | { |
| 3069 | RTL_PASS, |
| 3070 | "jump", /* name */ |
| 3071 | NULL, /* gate */ |
| 3072 | rest_of_handle_jump2, /* execute */ |
| 3073 | NULL, /* sub */ |
| 3074 | NULL, /* next */ |
| 3075 | 0, /* static_pass_number */ |
| 3076 | TV_JUMP, /* tv_id */ |
| 3077 | 0, /* properties_required */ |
| 3078 | 0, /* properties_provided */ |
| 3079 | 0, /* properties_destroyed */ |
| 3080 | TODO_ggc_collect, /* todo_flags_start */ |
| 3081 | TODO_verify_rtl_sharing, /* todo_flags_finish */ |
| 3082 | } |
| 3083 | }; |