1 /* Code sinking for trees 2 Copyright (C) 2001-2017 Free Software Foundation, Inc. 3 Contributed by Daniel Berlin <dan@dberlin.org> 4 5 This file is part of GCC. 6 7 GCC is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3, or (at your option) 10 any later version. 11 12 GCC is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with GCC; see the file COPYING3. If not see 19 <http://www.gnu.org/licenses/>. */ 20 21 #include "config.h" 22 #include "system.h" 23 #include "coretypes.h" 24 #include "backend.h" 25 #include "tree.h" 26 #include "gimple.h" 27 #include "cfghooks.h" 28 #include "tree-pass.h" 29 #include "ssa.h" 30 #include "gimple-pretty-print.h" 31 #include "fold-const.h" 32 #include "stor-layout.h" 33 #include "cfganal.h" 34 #include "gimple-iterator.h" 35 #include "tree-cfg.h" 36 #include "cfgloop.h" 37 #include "params.h" 38 39 /* TODO: 40 1. Sinking store only using scalar promotion (IE without moving the RHS): 41 42 *q = p; 43 p = p + 1; 44 if (something) 45 *q = <not p>; 46 else 47 y = *q; 48 49 50 should become 51 sinktemp = p; 52 p = p + 1; 53 if (something) 54 *q = <not p>; 55 else 56 { 57 *q = sinktemp; 58 y = *q 59 } 60 Store copy propagation will take care of the store elimination above. 61 62 63 2. Sinking using Partial Dead Code Elimination. */ 64 65 66 static struct 67 { 68 /* The number of statements sunk down the flowgraph by code sinking. */ 69 int sunk; 70 71 } sink_stats; 72 73 74 /* Given a PHI, and one of its arguments (DEF), find the edge for 75 that argument and return it. If the argument occurs twice in the PHI node, 76 we return NULL. */ 77 78 static basic_block 79 find_bb_for_arg (gphi *phi, tree def) 80 { 81 size_t i; 82 bool foundone = false; 83 basic_block result = NULL; 84 for (i = 0; i < gimple_phi_num_args (phi); i++) 85 if (PHI_ARG_DEF (phi, i) == def) 86 { 87 if (foundone) 88 return NULL; 89 foundone = true; 90 result = gimple_phi_arg_edge (phi, i)->src; 91 } 92 return result; 93 } 94 95 /* When the first immediate use is in a statement, then return true if all 96 immediate uses in IMM are in the same statement. 97 We could also do the case where the first immediate use is in a phi node, 98 and all the other uses are in phis in the same basic block, but this 99 requires some expensive checking later (you have to make sure no def/vdef 100 in the statement occurs for multiple edges in the various phi nodes it's 101 used in, so that you only have one place you can sink it to. */ 102 103 static bool 104 all_immediate_uses_same_place (def_operand_p def_p) 105 { 106 tree var = DEF_FROM_PTR (def_p); 107 imm_use_iterator imm_iter; 108 use_operand_p use_p; 109 110 gimple *firstuse = NULL; 111 FOR_EACH_IMM_USE_FAST (use_p, imm_iter, var) 112 { 113 if (is_gimple_debug (USE_STMT (use_p))) 114 continue; 115 if (firstuse == NULL) 116 firstuse = USE_STMT (use_p); 117 else 118 if (firstuse != USE_STMT (use_p)) 119 return false; 120 } 121 122 return true; 123 } 124 125 /* Find the nearest common dominator of all of the immediate uses in IMM. */ 126 127 static basic_block 128 nearest_common_dominator_of_uses (def_operand_p def_p, bool *debug_stmts) 129 { 130 tree var = DEF_FROM_PTR (def_p); 131 bitmap blocks = BITMAP_ALLOC (NULL); 132 basic_block commondom; 133 unsigned int j; 134 bitmap_iterator bi; 135 imm_use_iterator imm_iter; 136 use_operand_p use_p; 137 138 FOR_EACH_IMM_USE_FAST (use_p, imm_iter, var) 139 { 140 gimple *usestmt = USE_STMT (use_p); 141 basic_block useblock; 142 143 if (gphi *phi = dyn_cast <gphi *> (usestmt)) 144 { 145 int idx = PHI_ARG_INDEX_FROM_USE (use_p); 146 147 useblock = gimple_phi_arg_edge (phi, idx)->src; 148 } 149 else if (is_gimple_debug (usestmt)) 150 { 151 *debug_stmts = true; 152 continue; 153 } 154 else 155 { 156 useblock = gimple_bb (usestmt); 157 } 158 159 /* Short circuit. Nothing dominates the entry block. */ 160 if (useblock == ENTRY_BLOCK_PTR_FOR_FN (cfun)) 161 { 162 BITMAP_FREE (blocks); 163 return NULL; 164 } 165 bitmap_set_bit (blocks, useblock->index); 166 } 167 commondom = BASIC_BLOCK_FOR_FN (cfun, bitmap_first_set_bit (blocks)); 168 EXECUTE_IF_SET_IN_BITMAP (blocks, 0, j, bi) 169 commondom = nearest_common_dominator (CDI_DOMINATORS, commondom, 170 BASIC_BLOCK_FOR_FN (cfun, j)); 171 BITMAP_FREE (blocks); 172 return commondom; 173 } 174 175 /* Given EARLY_BB and LATE_BB, two blocks in a path through the dominator 176 tree, return the best basic block between them (inclusive) to place 177 statements. 178 179 We want the most control dependent block in the shallowest loop nest. 180 181 If the resulting block is in a shallower loop nest, then use it. Else 182 only use the resulting block if it has significantly lower execution 183 frequency than EARLY_BB to avoid gratutious statement movement. We 184 consider statements with VOPS more desirable to move. 185 186 This pass would obviously benefit from PDO as it utilizes block 187 frequencies. It would also benefit from recomputing frequencies 188 if profile data is not available since frequencies often get out 189 of sync with reality. */ 190 191 static basic_block 192 select_best_block (basic_block early_bb, 193 basic_block late_bb, 194 gimple *stmt) 195 { 196 basic_block best_bb = late_bb; 197 basic_block temp_bb = late_bb; 198 int threshold; 199 200 while (temp_bb != early_bb) 201 { 202 /* If we've moved into a lower loop nest, then that becomes 203 our best block. */ 204 if (bb_loop_depth (temp_bb) < bb_loop_depth (best_bb)) 205 best_bb = temp_bb; 206 207 /* Walk up the dominator tree, hopefully we'll find a shallower 208 loop nest. */ 209 temp_bb = get_immediate_dominator (CDI_DOMINATORS, temp_bb); 210 } 211 212 /* If we found a shallower loop nest, then we always consider that 213 a win. This will always give us the most control dependent block 214 within that loop nest. */ 215 if (bb_loop_depth (best_bb) < bb_loop_depth (early_bb)) 216 return best_bb; 217 218 /* Get the sinking threshold. If the statement to be moved has memory 219 operands, then increase the threshold by 7% as those are even more 220 profitable to avoid, clamping at 100%. */ 221 threshold = PARAM_VALUE (PARAM_SINK_FREQUENCY_THRESHOLD); 222 if (gimple_vuse (stmt) || gimple_vdef (stmt)) 223 { 224 threshold += 7; 225 if (threshold > 100) 226 threshold = 100; 227 } 228 229 /* If BEST_BB is at the same nesting level, then require it to have 230 significantly lower execution frequency to avoid gratutious movement. */ 231 if (bb_loop_depth (best_bb) == bb_loop_depth (early_bb) 232 && best_bb->frequency < (early_bb->frequency * threshold / 100.0)) 233 return best_bb; 234 235 /* No better block found, so return EARLY_BB, which happens to be the 236 statement's original block. */ 237 return early_bb; 238 } 239 240 /* Given a statement (STMT) and the basic block it is currently in (FROMBB), 241 determine the location to sink the statement to, if any. 242 Returns true if there is such location; in that case, TOGSI points to the 243 statement before that STMT should be moved. */ 244 245 static bool 246 statement_sink_location (gimple *stmt, basic_block frombb, 247 gimple_stmt_iterator *togsi) 248 { 249 gimple *use; 250 use_operand_p one_use = NULL_USE_OPERAND_P; 251 basic_block sinkbb; 252 use_operand_p use_p; 253 def_operand_p def_p; 254 ssa_op_iter iter; 255 imm_use_iterator imm_iter; 256 257 /* We only can sink assignments. */ 258 if (!is_gimple_assign (stmt)) 259 return false; 260 261 /* We only can sink stmts with a single definition. */ 262 def_p = single_ssa_def_operand (stmt, SSA_OP_ALL_DEFS); 263 if (def_p == NULL_DEF_OPERAND_P) 264 return false; 265 266 /* Return if there are no immediate uses of this stmt. */ 267 if (has_zero_uses (DEF_FROM_PTR (def_p))) 268 return false; 269 270 /* There are a few classes of things we can't or don't move, some because we 271 don't have code to handle it, some because it's not profitable and some 272 because it's not legal. 273 274 We can't sink things that may be global stores, at least not without 275 calculating a lot more information, because we may cause it to no longer 276 be seen by an external routine that needs it depending on where it gets 277 moved to. 278 279 We can't sink statements that end basic blocks without splitting the 280 incoming edge for the sink location to place it there. 281 282 We can't sink statements that have volatile operands. 283 284 We don't want to sink dead code, so anything with 0 immediate uses is not 285 sunk. 286 287 Don't sink BLKmode assignments if current function has any local explicit 288 register variables, as BLKmode assignments may involve memcpy or memset 289 calls or, on some targets, inline expansion thereof that sometimes need 290 to use specific hard registers. 291 292 */ 293 if (stmt_ends_bb_p (stmt) 294 || gimple_has_side_effects (stmt) 295 || gimple_has_volatile_ops (stmt) 296 || (cfun->has_local_explicit_reg_vars 297 && TYPE_MODE (TREE_TYPE (gimple_assign_lhs (stmt))) == BLKmode)) 298 return false; 299 300 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (DEF_FROM_PTR (def_p))) 301 return false; 302 303 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES) 304 { 305 tree use = USE_FROM_PTR (use_p); 306 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (use)) 307 return false; 308 } 309 310 use = NULL; 311 312 /* If stmt is a store the one and only use needs to be the VOP 313 merging PHI node. */ 314 if (virtual_operand_p (DEF_FROM_PTR (def_p))) 315 { 316 FOR_EACH_IMM_USE_FAST (use_p, imm_iter, DEF_FROM_PTR (def_p)) 317 { 318 gimple *use_stmt = USE_STMT (use_p); 319 320 /* A killing definition is not a use. */ 321 if ((gimple_has_lhs (use_stmt) 322 && operand_equal_p (gimple_assign_lhs (stmt), 323 gimple_get_lhs (use_stmt), 0)) 324 || stmt_kills_ref_p (use_stmt, gimple_assign_lhs (stmt))) 325 { 326 /* If use_stmt is or might be a nop assignment then USE_STMT 327 acts as a use as well as definition. */ 328 if (stmt != use_stmt 329 && ref_maybe_used_by_stmt_p (use_stmt, 330 gimple_assign_lhs (stmt))) 331 return false; 332 continue; 333 } 334 335 if (gimple_code (use_stmt) != GIMPLE_PHI) 336 return false; 337 338 if (use 339 && use != use_stmt) 340 return false; 341 342 use = use_stmt; 343 } 344 if (!use) 345 return false; 346 } 347 /* If all the immediate uses are not in the same place, find the nearest 348 common dominator of all the immediate uses. For PHI nodes, we have to 349 find the nearest common dominator of all of the predecessor blocks, since 350 that is where insertion would have to take place. */ 351 else if (gimple_vuse (stmt) 352 || !all_immediate_uses_same_place (def_p)) 353 { 354 bool debug_stmts = false; 355 basic_block commondom = nearest_common_dominator_of_uses (def_p, 356 &debug_stmts); 357 358 if (commondom == frombb) 359 return false; 360 361 /* If this is a load then do not sink past any stores. 362 ??? This is overly simple but cheap. We basically look 363 for an existing load with the same VUSE in the path to one 364 of the sink candidate blocks and we adjust commondom to the 365 nearest to commondom. */ 366 if (gimple_vuse (stmt)) 367 { 368 /* Do not sink loads from hard registers. */ 369 if (gimple_assign_single_p (stmt) 370 && TREE_CODE (gimple_assign_rhs1 (stmt)) == VAR_DECL 371 && DECL_HARD_REGISTER (gimple_assign_rhs1 (stmt))) 372 return false; 373 374 imm_use_iterator imm_iter; 375 use_operand_p use_p; 376 basic_block found = NULL; 377 FOR_EACH_IMM_USE_FAST (use_p, imm_iter, gimple_vuse (stmt)) 378 { 379 gimple *use_stmt = USE_STMT (use_p); 380 basic_block bb = gimple_bb (use_stmt); 381 /* For PHI nodes the block we know sth about 382 is the incoming block with the use. */ 383 if (gimple_code (use_stmt) == GIMPLE_PHI) 384 bb = EDGE_PRED (bb, PHI_ARG_INDEX_FROM_USE (use_p))->src; 385 /* Any dominator of commondom would be ok with 386 adjusting commondom to that block. */ 387 bb = nearest_common_dominator (CDI_DOMINATORS, bb, commondom); 388 if (!found) 389 found = bb; 390 else if (dominated_by_p (CDI_DOMINATORS, bb, found)) 391 found = bb; 392 /* If we can't improve, stop. */ 393 if (found == commondom) 394 break; 395 } 396 commondom = found; 397 if (commondom == frombb) 398 return false; 399 } 400 401 /* Our common dominator has to be dominated by frombb in order to be a 402 trivially safe place to put this statement, since it has multiple 403 uses. */ 404 if (!dominated_by_p (CDI_DOMINATORS, commondom, frombb)) 405 return false; 406 407 commondom = select_best_block (frombb, commondom, stmt); 408 409 if (commondom == frombb) 410 return false; 411 412 *togsi = gsi_after_labels (commondom); 413 414 return true; 415 } 416 else 417 { 418 FOR_EACH_IMM_USE_FAST (one_use, imm_iter, DEF_FROM_PTR (def_p)) 419 { 420 if (is_gimple_debug (USE_STMT (one_use))) 421 continue; 422 break; 423 } 424 use = USE_STMT (one_use); 425 426 if (gimple_code (use) != GIMPLE_PHI) 427 { 428 sinkbb = gimple_bb (use); 429 sinkbb = select_best_block (frombb, gimple_bb (use), stmt); 430 431 if (sinkbb == frombb) 432 return false; 433 434 if (sinkbb == gimple_bb (use)) 435 *togsi = gsi_for_stmt (use); 436 else 437 *togsi = gsi_after_labels (sinkbb); 438 439 return true; 440 } 441 } 442 443 sinkbb = find_bb_for_arg (as_a <gphi *> (use), DEF_FROM_PTR (def_p)); 444 445 /* This can happen if there are multiple uses in a PHI. */ 446 if (!sinkbb) 447 return false; 448 449 sinkbb = select_best_block (frombb, sinkbb, stmt); 450 if (!sinkbb || sinkbb == frombb) 451 return false; 452 453 /* If the latch block is empty, don't make it non-empty by sinking 454 something into it. */ 455 if (sinkbb == frombb->loop_father->latch 456 && empty_block_p (sinkbb)) 457 return false; 458 459 *togsi = gsi_after_labels (sinkbb); 460 461 return true; 462 } 463 464 /* Perform code sinking on BB */ 465 466 static void 467 sink_code_in_bb (basic_block bb) 468 { 469 basic_block son; 470 gimple_stmt_iterator gsi; 471 edge_iterator ei; 472 edge e; 473 bool last = true; 474 475 /* If this block doesn't dominate anything, there can't be any place to sink 476 the statements to. */ 477 if (first_dom_son (CDI_DOMINATORS, bb) == NULL) 478 goto earlyout; 479 480 /* We can't move things across abnormal edges, so don't try. */ 481 FOR_EACH_EDGE (e, ei, bb->succs) 482 if (e->flags & EDGE_ABNORMAL) 483 goto earlyout; 484 485 for (gsi = gsi_last_bb (bb); !gsi_end_p (gsi);) 486 { 487 gimple *stmt = gsi_stmt (gsi); 488 gimple_stmt_iterator togsi; 489 490 if (!statement_sink_location (stmt, bb, &togsi)) 491 { 492 if (!gsi_end_p (gsi)) 493 gsi_prev (&gsi); 494 last = false; 495 continue; 496 } 497 if (dump_file) 498 { 499 fprintf (dump_file, "Sinking "); 500 print_gimple_stmt (dump_file, stmt, 0, TDF_VOPS); 501 fprintf (dump_file, " from bb %d to bb %d\n", 502 bb->index, (gsi_bb (togsi))->index); 503 } 504 505 /* Update virtual operands of statements in the path we 506 do not sink to. */ 507 if (gimple_vdef (stmt)) 508 { 509 imm_use_iterator iter; 510 use_operand_p use_p; 511 gimple *vuse_stmt; 512 513 FOR_EACH_IMM_USE_STMT (vuse_stmt, iter, gimple_vdef (stmt)) 514 if (gimple_code (vuse_stmt) != GIMPLE_PHI) 515 FOR_EACH_IMM_USE_ON_STMT (use_p, iter) 516 SET_USE (use_p, gimple_vuse (stmt)); 517 } 518 519 /* If this is the end of the basic block, we need to insert at the end 520 of the basic block. */ 521 if (gsi_end_p (togsi)) 522 gsi_move_to_bb_end (&gsi, gsi_bb (togsi)); 523 else 524 gsi_move_before (&gsi, &togsi); 525 526 sink_stats.sunk++; 527 528 /* If we've just removed the last statement of the BB, the 529 gsi_end_p() test below would fail, but gsi_prev() would have 530 succeeded, and we want it to succeed. So we keep track of 531 whether we're at the last statement and pick up the new last 532 statement. */ 533 if (last) 534 { 535 gsi = gsi_last_bb (bb); 536 continue; 537 } 538 539 last = false; 540 if (!gsi_end_p (gsi)) 541 gsi_prev (&gsi); 542 543 } 544 earlyout: 545 for (son = first_dom_son (CDI_POST_DOMINATORS, bb); 546 son; 547 son = next_dom_son (CDI_POST_DOMINATORS, son)) 548 { 549 sink_code_in_bb (son); 550 } 551 } 552 553 /* Perform code sinking. 554 This moves code down the flowgraph when we know it would be 555 profitable to do so, or it wouldn't increase the number of 556 executions of the statement. 557 558 IE given 559 560 a_1 = b + c; 561 if (<something>) 562 { 563 } 564 else 565 { 566 foo (&b, &c); 567 a_5 = b + c; 568 } 569 a_6 = PHI (a_5, a_1); 570 USE a_6. 571 572 we'll transform this into: 573 574 if (<something>) 575 { 576 a_1 = b + c; 577 } 578 else 579 { 580 foo (&b, &c); 581 a_5 = b + c; 582 } 583 a_6 = PHI (a_5, a_1); 584 USE a_6. 585 586 Note that this reduces the number of computations of a = b + c to 1 587 when we take the else edge, instead of 2. 588 */ 589 namespace { 590 591 const pass_data pass_data_sink_code = 592 { 593 GIMPLE_PASS, /* type */ 594 "sink", /* name */ 595 OPTGROUP_NONE, /* optinfo_flags */ 596 TV_TREE_SINK, /* tv_id */ 597 /* PROP_no_crit_edges is ensured by running split_critical_edges in 598 pass_data_sink_code::execute (). */ 599 ( PROP_cfg | PROP_ssa ), /* properties_required */ 600 0, /* properties_provided */ 601 0, /* properties_destroyed */ 602 0, /* todo_flags_start */ 603 TODO_update_ssa, /* todo_flags_finish */ 604 }; 605 606 class pass_sink_code : public gimple_opt_pass 607 { 608 public: 609 pass_sink_code (gcc::context *ctxt) 610 : gimple_opt_pass (pass_data_sink_code, ctxt) 611 {} 612 613 /* opt_pass methods: */ 614 virtual bool gate (function *) { return flag_tree_sink != 0; } 615 virtual unsigned int execute (function *); 616 617 }; // class pass_sink_code 618 619 unsigned int 620 pass_sink_code::execute (function *fun) 621 { 622 loop_optimizer_init (LOOPS_NORMAL); 623 split_critical_edges (); 624 connect_infinite_loops_to_exit (); 625 memset (&sink_stats, 0, sizeof (sink_stats)); 626 calculate_dominance_info (CDI_DOMINATORS); 627 calculate_dominance_info (CDI_POST_DOMINATORS); 628 sink_code_in_bb (EXIT_BLOCK_PTR_FOR_FN (fun)); 629 statistics_counter_event (fun, "Sunk statements", sink_stats.sunk); 630 free_dominance_info (CDI_POST_DOMINATORS); 631 remove_fake_exit_edges (); 632 loop_optimizer_finalize (); 633 634 return 0; 635 } 636 637 } // anon namespace 638 639 gimple_opt_pass * 640 make_pass_sink_code (gcc::context *ctxt) 641 { 642 return new pass_sink_code (ctxt); 643 } 644