1 /* Loop invariant motion. 2 Copyright (C) 2003-2015 Free Software Foundation, Inc. 3 4 This file is part of GCC. 5 6 GCC is free software; you can redistribute it and/or modify it 7 under the terms of the GNU General Public License as published by the 8 Free Software Foundation; either version 3, or (at your option) any 9 later version. 10 11 GCC is distributed in the hope that it will be useful, but WITHOUT 12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with GCC; see the file COPYING3. If not see 18 <http://www.gnu.org/licenses/>. */ 19 20 #include "config.h" 21 #include "system.h" 22 #include "coretypes.h" 23 #include "tm.h" 24 #include "hash-set.h" 25 #include "machmode.h" 26 #include "vec.h" 27 #include "double-int.h" 28 #include "input.h" 29 #include "alias.h" 30 #include "symtab.h" 31 #include "wide-int.h" 32 #include "inchash.h" 33 #include "tree.h" 34 #include "fold-const.h" 35 #include "tm_p.h" 36 #include "predict.h" 37 #include "hard-reg-set.h" 38 #include "input.h" 39 #include "function.h" 40 #include "dominance.h" 41 #include "cfg.h" 42 #include "cfganal.h" 43 #include "basic-block.h" 44 #include "gimple-pretty-print.h" 45 #include "hash-map.h" 46 #include "hash-table.h" 47 #include "tree-ssa-alias.h" 48 #include "internal-fn.h" 49 #include "tree-eh.h" 50 #include "gimple-expr.h" 51 #include "is-a.h" 52 #include "gimple.h" 53 #include "gimplify.h" 54 #include "gimple-iterator.h" 55 #include "gimple-ssa.h" 56 #include "tree-cfg.h" 57 #include "tree-phinodes.h" 58 #include "ssa-iterators.h" 59 #include "stringpool.h" 60 #include "tree-ssanames.h" 61 #include "tree-ssa-loop-manip.h" 62 #include "tree-ssa-loop.h" 63 #include "tree-into-ssa.h" 64 #include "cfgloop.h" 65 #include "domwalk.h" 66 #include "params.h" 67 #include "tree-pass.h" 68 #include "flags.h" 69 #include "tree-affine.h" 70 #include "tree-ssa-propagate.h" 71 #include "trans-mem.h" 72 #include "gimple-fold.h" 73 #include "tree-ssa-loop-niter.h" 74 75 /* TODO: Support for predicated code motion. I.e. 76 77 while (1) 78 { 79 if (cond) 80 { 81 a = inv; 82 something; 83 } 84 } 85 86 Where COND and INV are invariants, but evaluating INV may trap or be 87 invalid from some other reason if !COND. This may be transformed to 88 89 if (cond) 90 a = inv; 91 while (1) 92 { 93 if (cond) 94 something; 95 } */ 96 97 /* The auxiliary data kept for each statement. */ 98 99 struct lim_aux_data 100 { 101 struct loop *max_loop; /* The outermost loop in that the statement 102 is invariant. */ 103 104 struct loop *tgt_loop; /* The loop out of that we want to move the 105 invariant. */ 106 107 struct loop *always_executed_in; 108 /* The outermost loop for that we are sure 109 the statement is executed if the loop 110 is entered. */ 111 112 unsigned cost; /* Cost of the computation performed by the 113 statement. */ 114 115 vec<gimple> depends; /* Vector of statements that must be also 116 hoisted out of the loop when this statement 117 is hoisted; i.e. those that define the 118 operands of the statement and are inside of 119 the MAX_LOOP loop. */ 120 }; 121 122 /* Maps statements to their lim_aux_data. */ 123 124 static hash_map<gimple, lim_aux_data *> *lim_aux_data_map; 125 126 /* Description of a memory reference location. */ 127 128 typedef struct mem_ref_loc 129 { 130 tree *ref; /* The reference itself. */ 131 gimple stmt; /* The statement in that it occurs. */ 132 } *mem_ref_loc_p; 133 134 135 /* Description of a memory reference. */ 136 137 typedef struct im_mem_ref 138 { 139 unsigned id; /* ID assigned to the memory reference 140 (its index in memory_accesses.refs_list) */ 141 hashval_t hash; /* Its hash value. */ 142 143 /* The memory access itself and associated caching of alias-oracle 144 query meta-data. */ 145 ao_ref mem; 146 147 bitmap stored; /* The set of loops in that this memory location 148 is stored to. */ 149 vec<mem_ref_loc> accesses_in_loop; 150 /* The locations of the accesses. Vector 151 indexed by the loop number. */ 152 153 /* The following sets are computed on demand. We keep both set and 154 its complement, so that we know whether the information was 155 already computed or not. */ 156 bitmap_head indep_loop; /* The set of loops in that the memory 157 reference is independent, meaning: 158 If it is stored in the loop, this store 159 is independent on all other loads and 160 stores. 161 If it is only loaded, then it is independent 162 on all stores in the loop. */ 163 bitmap_head dep_loop; /* The complement of INDEP_LOOP. */ 164 } *mem_ref_p; 165 166 /* We use two bits per loop in the ref->{in,}dep_loop bitmaps, the first 167 to record (in)dependence against stores in the loop and its subloops, the 168 second to record (in)dependence against all references in the loop 169 and its subloops. */ 170 #define LOOP_DEP_BIT(loopnum, storedp) (2 * (loopnum) + (storedp ? 1 : 0)) 171 172 /* Mem_ref hashtable helpers. */ 173 174 struct mem_ref_hasher : typed_noop_remove <im_mem_ref> 175 { 176 typedef im_mem_ref value_type; 177 typedef tree_node compare_type; 178 static inline hashval_t hash (const value_type *); 179 static inline bool equal (const value_type *, const compare_type *); 180 }; 181 182 /* A hash function for struct im_mem_ref object OBJ. */ 183 184 inline hashval_t 185 mem_ref_hasher::hash (const value_type *mem) 186 { 187 return mem->hash; 188 } 189 190 /* An equality function for struct im_mem_ref object MEM1 with 191 memory reference OBJ2. */ 192 193 inline bool 194 mem_ref_hasher::equal (const value_type *mem1, const compare_type *obj2) 195 { 196 return operand_equal_p (mem1->mem.ref, (const_tree) obj2, 0); 197 } 198 199 200 /* Description of memory accesses in loops. */ 201 202 static struct 203 { 204 /* The hash table of memory references accessed in loops. */ 205 hash_table<mem_ref_hasher> *refs; 206 207 /* The list of memory references. */ 208 vec<mem_ref_p> refs_list; 209 210 /* The set of memory references accessed in each loop. */ 211 vec<bitmap_head> refs_in_loop; 212 213 /* The set of memory references stored in each loop. */ 214 vec<bitmap_head> refs_stored_in_loop; 215 216 /* The set of memory references stored in each loop, including subloops . */ 217 vec<bitmap_head> all_refs_stored_in_loop; 218 219 /* Cache for expanding memory addresses. */ 220 hash_map<tree, name_expansion *> *ttae_cache; 221 } memory_accesses; 222 223 /* Obstack for the bitmaps in the above data structures. */ 224 static bitmap_obstack lim_bitmap_obstack; 225 static obstack mem_ref_obstack; 226 227 static bool ref_indep_loop_p (struct loop *, mem_ref_p); 228 229 /* Minimum cost of an expensive expression. */ 230 #define LIM_EXPENSIVE ((unsigned) PARAM_VALUE (PARAM_LIM_EXPENSIVE)) 231 232 /* The outermost loop for which execution of the header guarantees that the 233 block will be executed. */ 234 #define ALWAYS_EXECUTED_IN(BB) ((struct loop *) (BB)->aux) 235 #define SET_ALWAYS_EXECUTED_IN(BB, VAL) ((BB)->aux = (void *) (VAL)) 236 237 /* ID of the shared unanalyzable mem. */ 238 #define UNANALYZABLE_MEM_ID 0 239 240 /* Whether the reference was analyzable. */ 241 #define MEM_ANALYZABLE(REF) ((REF)->id != UNANALYZABLE_MEM_ID) 242 243 static struct lim_aux_data * 244 init_lim_data (gimple stmt) 245 { 246 lim_aux_data *p = XCNEW (struct lim_aux_data); 247 lim_aux_data_map->put (stmt, p); 248 249 return p; 250 } 251 252 static struct lim_aux_data * 253 get_lim_data (gimple stmt) 254 { 255 lim_aux_data **p = lim_aux_data_map->get (stmt); 256 if (!p) 257 return NULL; 258 259 return *p; 260 } 261 262 /* Releases the memory occupied by DATA. */ 263 264 static void 265 free_lim_aux_data (struct lim_aux_data *data) 266 { 267 data->depends.release (); 268 free (data); 269 } 270 271 static void 272 clear_lim_data (gimple stmt) 273 { 274 lim_aux_data **p = lim_aux_data_map->get (stmt); 275 if (!p) 276 return; 277 278 free_lim_aux_data (*p); 279 *p = NULL; 280 } 281 282 283 /* The possibilities of statement movement. */ 284 enum move_pos 285 { 286 MOVE_IMPOSSIBLE, /* No movement -- side effect expression. */ 287 MOVE_PRESERVE_EXECUTION, /* Must not cause the non-executed statement 288 become executed -- memory accesses, ... */ 289 MOVE_POSSIBLE /* Unlimited movement. */ 290 }; 291 292 293 /* If it is possible to hoist the statement STMT unconditionally, 294 returns MOVE_POSSIBLE. 295 If it is possible to hoist the statement STMT, but we must avoid making 296 it executed if it would not be executed in the original program (e.g. 297 because it may trap), return MOVE_PRESERVE_EXECUTION. 298 Otherwise return MOVE_IMPOSSIBLE. */ 299 300 enum move_pos 301 movement_possibility (gimple stmt) 302 { 303 tree lhs; 304 enum move_pos ret = MOVE_POSSIBLE; 305 306 if (flag_unswitch_loops 307 && gimple_code (stmt) == GIMPLE_COND) 308 { 309 /* If we perform unswitching, force the operands of the invariant 310 condition to be moved out of the loop. */ 311 return MOVE_POSSIBLE; 312 } 313 314 if (gimple_code (stmt) == GIMPLE_PHI 315 && gimple_phi_num_args (stmt) <= 2 316 && !virtual_operand_p (gimple_phi_result (stmt)) 317 && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (gimple_phi_result (stmt))) 318 return MOVE_POSSIBLE; 319 320 if (gimple_get_lhs (stmt) == NULL_TREE) 321 return MOVE_IMPOSSIBLE; 322 323 if (gimple_vdef (stmt)) 324 return MOVE_IMPOSSIBLE; 325 326 if (stmt_ends_bb_p (stmt) 327 || gimple_has_volatile_ops (stmt) 328 || gimple_has_side_effects (stmt) 329 || stmt_could_throw_p (stmt)) 330 return MOVE_IMPOSSIBLE; 331 332 if (is_gimple_call (stmt)) 333 { 334 /* While pure or const call is guaranteed to have no side effects, we 335 cannot move it arbitrarily. Consider code like 336 337 char *s = something (); 338 339 while (1) 340 { 341 if (s) 342 t = strlen (s); 343 else 344 t = 0; 345 } 346 347 Here the strlen call cannot be moved out of the loop, even though 348 s is invariant. In addition to possibly creating a call with 349 invalid arguments, moving out a function call that is not executed 350 may cause performance regressions in case the call is costly and 351 not executed at all. */ 352 ret = MOVE_PRESERVE_EXECUTION; 353 lhs = gimple_call_lhs (stmt); 354 } 355 else if (is_gimple_assign (stmt)) 356 lhs = gimple_assign_lhs (stmt); 357 else 358 return MOVE_IMPOSSIBLE; 359 360 if (TREE_CODE (lhs) == SSA_NAME 361 && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs)) 362 return MOVE_IMPOSSIBLE; 363 364 if (TREE_CODE (lhs) != SSA_NAME 365 || gimple_could_trap_p (stmt)) 366 return MOVE_PRESERVE_EXECUTION; 367 368 /* Non local loads in a transaction cannot be hoisted out. Well, 369 unless the load happens on every path out of the loop, but we 370 don't take this into account yet. */ 371 if (flag_tm 372 && gimple_in_transaction (stmt) 373 && gimple_assign_single_p (stmt)) 374 { 375 tree rhs = gimple_assign_rhs1 (stmt); 376 if (DECL_P (rhs) && is_global_var (rhs)) 377 { 378 if (dump_file) 379 { 380 fprintf (dump_file, "Cannot hoist conditional load of "); 381 print_generic_expr (dump_file, rhs, TDF_SLIM); 382 fprintf (dump_file, " because it is in a transaction.\n"); 383 } 384 return MOVE_IMPOSSIBLE; 385 } 386 } 387 388 return ret; 389 } 390 391 /* Suppose that operand DEF is used inside the LOOP. Returns the outermost 392 loop to that we could move the expression using DEF if it did not have 393 other operands, i.e. the outermost loop enclosing LOOP in that the value 394 of DEF is invariant. */ 395 396 static struct loop * 397 outermost_invariant_loop (tree def, struct loop *loop) 398 { 399 gimple def_stmt; 400 basic_block def_bb; 401 struct loop *max_loop; 402 struct lim_aux_data *lim_data; 403 404 if (!def) 405 return superloop_at_depth (loop, 1); 406 407 if (TREE_CODE (def) != SSA_NAME) 408 { 409 gcc_assert (is_gimple_min_invariant (def)); 410 return superloop_at_depth (loop, 1); 411 } 412 413 def_stmt = SSA_NAME_DEF_STMT (def); 414 def_bb = gimple_bb (def_stmt); 415 if (!def_bb) 416 return superloop_at_depth (loop, 1); 417 418 max_loop = find_common_loop (loop, def_bb->loop_father); 419 420 lim_data = get_lim_data (def_stmt); 421 if (lim_data != NULL && lim_data->max_loop != NULL) 422 max_loop = find_common_loop (max_loop, 423 loop_outer (lim_data->max_loop)); 424 if (max_loop == loop) 425 return NULL; 426 max_loop = superloop_at_depth (loop, loop_depth (max_loop) + 1); 427 428 return max_loop; 429 } 430 431 /* DATA is a structure containing information associated with a statement 432 inside LOOP. DEF is one of the operands of this statement. 433 434 Find the outermost loop enclosing LOOP in that value of DEF is invariant 435 and record this in DATA->max_loop field. If DEF itself is defined inside 436 this loop as well (i.e. we need to hoist it out of the loop if we want 437 to hoist the statement represented by DATA), record the statement in that 438 DEF is defined to the DATA->depends list. Additionally if ADD_COST is true, 439 add the cost of the computation of DEF to the DATA->cost. 440 441 If DEF is not invariant in LOOP, return false. Otherwise return TRUE. */ 442 443 static bool 444 add_dependency (tree def, struct lim_aux_data *data, struct loop *loop, 445 bool add_cost) 446 { 447 gimple def_stmt = SSA_NAME_DEF_STMT (def); 448 basic_block def_bb = gimple_bb (def_stmt); 449 struct loop *max_loop; 450 struct lim_aux_data *def_data; 451 452 if (!def_bb) 453 return true; 454 455 max_loop = outermost_invariant_loop (def, loop); 456 if (!max_loop) 457 return false; 458 459 if (flow_loop_nested_p (data->max_loop, max_loop)) 460 data->max_loop = max_loop; 461 462 def_data = get_lim_data (def_stmt); 463 if (!def_data) 464 return true; 465 466 if (add_cost 467 /* Only add the cost if the statement defining DEF is inside LOOP, 468 i.e. if it is likely that by moving the invariants dependent 469 on it, we will be able to avoid creating a new register for 470 it (since it will be only used in these dependent invariants). */ 471 && def_bb->loop_father == loop) 472 data->cost += def_data->cost; 473 474 data->depends.safe_push (def_stmt); 475 476 return true; 477 } 478 479 /* Returns an estimate for a cost of statement STMT. The values here 480 are just ad-hoc constants, similar to costs for inlining. */ 481 482 static unsigned 483 stmt_cost (gimple stmt) 484 { 485 /* Always try to create possibilities for unswitching. */ 486 if (gimple_code (stmt) == GIMPLE_COND 487 || gimple_code (stmt) == GIMPLE_PHI) 488 return LIM_EXPENSIVE; 489 490 /* We should be hoisting calls if possible. */ 491 if (is_gimple_call (stmt)) 492 { 493 tree fndecl; 494 495 /* Unless the call is a builtin_constant_p; this always folds to a 496 constant, so moving it is useless. */ 497 fndecl = gimple_call_fndecl (stmt); 498 if (fndecl 499 && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL 500 && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_CONSTANT_P) 501 return 0; 502 503 return LIM_EXPENSIVE; 504 } 505 506 /* Hoisting memory references out should almost surely be a win. */ 507 if (gimple_references_memory_p (stmt)) 508 return LIM_EXPENSIVE; 509 510 if (gimple_code (stmt) != GIMPLE_ASSIGN) 511 return 1; 512 513 switch (gimple_assign_rhs_code (stmt)) 514 { 515 case MULT_EXPR: 516 case WIDEN_MULT_EXPR: 517 case WIDEN_MULT_PLUS_EXPR: 518 case WIDEN_MULT_MINUS_EXPR: 519 case DOT_PROD_EXPR: 520 case FMA_EXPR: 521 case TRUNC_DIV_EXPR: 522 case CEIL_DIV_EXPR: 523 case FLOOR_DIV_EXPR: 524 case ROUND_DIV_EXPR: 525 case EXACT_DIV_EXPR: 526 case CEIL_MOD_EXPR: 527 case FLOOR_MOD_EXPR: 528 case ROUND_MOD_EXPR: 529 case TRUNC_MOD_EXPR: 530 case RDIV_EXPR: 531 /* Division and multiplication are usually expensive. */ 532 return LIM_EXPENSIVE; 533 534 case LSHIFT_EXPR: 535 case RSHIFT_EXPR: 536 case WIDEN_LSHIFT_EXPR: 537 case LROTATE_EXPR: 538 case RROTATE_EXPR: 539 /* Shifts and rotates are usually expensive. */ 540 return LIM_EXPENSIVE; 541 542 case CONSTRUCTOR: 543 /* Make vector construction cost proportional to the number 544 of elements. */ 545 return CONSTRUCTOR_NELTS (gimple_assign_rhs1 (stmt)); 546 547 case SSA_NAME: 548 case PAREN_EXPR: 549 /* Whether or not something is wrapped inside a PAREN_EXPR 550 should not change move cost. Nor should an intermediate 551 unpropagated SSA name copy. */ 552 return 0; 553 554 default: 555 return 1; 556 } 557 } 558 559 /* Finds the outermost loop between OUTER and LOOP in that the memory reference 560 REF is independent. If REF is not independent in LOOP, NULL is returned 561 instead. */ 562 563 static struct loop * 564 outermost_indep_loop (struct loop *outer, struct loop *loop, mem_ref_p ref) 565 { 566 struct loop *aloop; 567 568 if (ref->stored && bitmap_bit_p (ref->stored, loop->num)) 569 return NULL; 570 571 for (aloop = outer; 572 aloop != loop; 573 aloop = superloop_at_depth (loop, loop_depth (aloop) + 1)) 574 if ((!ref->stored || !bitmap_bit_p (ref->stored, aloop->num)) 575 && ref_indep_loop_p (aloop, ref)) 576 return aloop; 577 578 if (ref_indep_loop_p (loop, ref)) 579 return loop; 580 else 581 return NULL; 582 } 583 584 /* If there is a simple load or store to a memory reference in STMT, returns 585 the location of the memory reference, and sets IS_STORE according to whether 586 it is a store or load. Otherwise, returns NULL. */ 587 588 static tree * 589 simple_mem_ref_in_stmt (gimple stmt, bool *is_store) 590 { 591 tree *lhs, *rhs; 592 593 /* Recognize SSA_NAME = MEM and MEM = (SSA_NAME | invariant) patterns. */ 594 if (!gimple_assign_single_p (stmt)) 595 return NULL; 596 597 lhs = gimple_assign_lhs_ptr (stmt); 598 rhs = gimple_assign_rhs1_ptr (stmt); 599 600 if (TREE_CODE (*lhs) == SSA_NAME && gimple_vuse (stmt)) 601 { 602 *is_store = false; 603 return rhs; 604 } 605 else if (gimple_vdef (stmt) 606 && (TREE_CODE (*rhs) == SSA_NAME || is_gimple_min_invariant (*rhs))) 607 { 608 *is_store = true; 609 return lhs; 610 } 611 else 612 return NULL; 613 } 614 615 /* Returns the memory reference contained in STMT. */ 616 617 static mem_ref_p 618 mem_ref_in_stmt (gimple stmt) 619 { 620 bool store; 621 tree *mem = simple_mem_ref_in_stmt (stmt, &store); 622 hashval_t hash; 623 mem_ref_p ref; 624 625 if (!mem) 626 return NULL; 627 gcc_assert (!store); 628 629 hash = iterative_hash_expr (*mem, 0); 630 ref = memory_accesses.refs->find_with_hash (*mem, hash); 631 632 gcc_assert (ref != NULL); 633 return ref; 634 } 635 636 /* From a controlling predicate in DOM determine the arguments from 637 the PHI node PHI that are chosen if the predicate evaluates to 638 true and false and store them to *TRUE_ARG_P and *FALSE_ARG_P if 639 they are non-NULL. Returns true if the arguments can be determined, 640 else return false. */ 641 642 static bool 643 extract_true_false_args_from_phi (basic_block dom, gphi *phi, 644 tree *true_arg_p, tree *false_arg_p) 645 { 646 basic_block bb = gimple_bb (phi); 647 edge true_edge, false_edge, tem; 648 tree arg0 = NULL_TREE, arg1 = NULL_TREE; 649 650 /* We have to verify that one edge into the PHI node is dominated 651 by the true edge of the predicate block and the other edge 652 dominated by the false edge. This ensures that the PHI argument 653 we are going to take is completely determined by the path we 654 take from the predicate block. 655 We can only use BB dominance checks below if the destination of 656 the true/false edges are dominated by their edge, thus only 657 have a single predecessor. */ 658 extract_true_false_edges_from_block (dom, &true_edge, &false_edge); 659 tem = EDGE_PRED (bb, 0); 660 if (tem == true_edge 661 || (single_pred_p (true_edge->dest) 662 && (tem->src == true_edge->dest 663 || dominated_by_p (CDI_DOMINATORS, 664 tem->src, true_edge->dest)))) 665 arg0 = PHI_ARG_DEF (phi, tem->dest_idx); 666 else if (tem == false_edge 667 || (single_pred_p (false_edge->dest) 668 && (tem->src == false_edge->dest 669 || dominated_by_p (CDI_DOMINATORS, 670 tem->src, false_edge->dest)))) 671 arg1 = PHI_ARG_DEF (phi, tem->dest_idx); 672 else 673 return false; 674 tem = EDGE_PRED (bb, 1); 675 if (tem == true_edge 676 || (single_pred_p (true_edge->dest) 677 && (tem->src == true_edge->dest 678 || dominated_by_p (CDI_DOMINATORS, 679 tem->src, true_edge->dest)))) 680 arg0 = PHI_ARG_DEF (phi, tem->dest_idx); 681 else if (tem == false_edge 682 || (single_pred_p (false_edge->dest) 683 && (tem->src == false_edge->dest 684 || dominated_by_p (CDI_DOMINATORS, 685 tem->src, false_edge->dest)))) 686 arg1 = PHI_ARG_DEF (phi, tem->dest_idx); 687 else 688 return false; 689 if (!arg0 || !arg1) 690 return false; 691 692 if (true_arg_p) 693 *true_arg_p = arg0; 694 if (false_arg_p) 695 *false_arg_p = arg1; 696 697 return true; 698 } 699 700 /* Determine the outermost loop to that it is possible to hoist a statement 701 STMT and store it to LIM_DATA (STMT)->max_loop. To do this we determine 702 the outermost loop in that the value computed by STMT is invariant. 703 If MUST_PRESERVE_EXEC is true, additionally choose such a loop that 704 we preserve the fact whether STMT is executed. It also fills other related 705 information to LIM_DATA (STMT). 706 707 The function returns false if STMT cannot be hoisted outside of the loop it 708 is defined in, and true otherwise. */ 709 710 static bool 711 determine_max_movement (gimple stmt, bool must_preserve_exec) 712 { 713 basic_block bb = gimple_bb (stmt); 714 struct loop *loop = bb->loop_father; 715 struct loop *level; 716 struct lim_aux_data *lim_data = get_lim_data (stmt); 717 tree val; 718 ssa_op_iter iter; 719 720 if (must_preserve_exec) 721 level = ALWAYS_EXECUTED_IN (bb); 722 else 723 level = superloop_at_depth (loop, 1); 724 lim_data->max_loop = level; 725 726 if (gphi *phi = dyn_cast <gphi *> (stmt)) 727 { 728 use_operand_p use_p; 729 unsigned min_cost = UINT_MAX; 730 unsigned total_cost = 0; 731 struct lim_aux_data *def_data; 732 733 /* We will end up promoting dependencies to be unconditionally 734 evaluated. For this reason the PHI cost (and thus the 735 cost we remove from the loop by doing the invariant motion) 736 is that of the cheapest PHI argument dependency chain. */ 737 FOR_EACH_PHI_ARG (use_p, phi, iter, SSA_OP_USE) 738 { 739 val = USE_FROM_PTR (use_p); 740 741 if (TREE_CODE (val) != SSA_NAME) 742 { 743 /* Assign const 1 to constants. */ 744 min_cost = MIN (min_cost, 1); 745 total_cost += 1; 746 continue; 747 } 748 if (!add_dependency (val, lim_data, loop, false)) 749 return false; 750 751 gimple def_stmt = SSA_NAME_DEF_STMT (val); 752 if (gimple_bb (def_stmt) 753 && gimple_bb (def_stmt)->loop_father == loop) 754 { 755 def_data = get_lim_data (def_stmt); 756 if (def_data) 757 { 758 min_cost = MIN (min_cost, def_data->cost); 759 total_cost += def_data->cost; 760 } 761 } 762 } 763 764 min_cost = MIN (min_cost, total_cost); 765 lim_data->cost += min_cost; 766 767 if (gimple_phi_num_args (phi) > 1) 768 { 769 basic_block dom = get_immediate_dominator (CDI_DOMINATORS, bb); 770 gimple cond; 771 if (gsi_end_p (gsi_last_bb (dom))) 772 return false; 773 cond = gsi_stmt (gsi_last_bb (dom)); 774 if (gimple_code (cond) != GIMPLE_COND) 775 return false; 776 /* Verify that this is an extended form of a diamond and 777 the PHI arguments are completely controlled by the 778 predicate in DOM. */ 779 if (!extract_true_false_args_from_phi (dom, phi, NULL, NULL)) 780 return false; 781 782 /* Fold in dependencies and cost of the condition. */ 783 FOR_EACH_SSA_TREE_OPERAND (val, cond, iter, SSA_OP_USE) 784 { 785 if (!add_dependency (val, lim_data, loop, false)) 786 return false; 787 def_data = get_lim_data (SSA_NAME_DEF_STMT (val)); 788 if (def_data) 789 total_cost += def_data->cost; 790 } 791 792 /* We want to avoid unconditionally executing very expensive 793 operations. As costs for our dependencies cannot be 794 negative just claim we are not invariand for this case. 795 We also are not sure whether the control-flow inside the 796 loop will vanish. */ 797 if (total_cost - min_cost >= 2 * LIM_EXPENSIVE 798 && !(min_cost != 0 799 && total_cost / min_cost <= 2)) 800 return false; 801 802 /* Assume that the control-flow in the loop will vanish. 803 ??? We should verify this and not artificially increase 804 the cost if that is not the case. */ 805 lim_data->cost += stmt_cost (stmt); 806 } 807 808 return true; 809 } 810 else 811 FOR_EACH_SSA_TREE_OPERAND (val, stmt, iter, SSA_OP_USE) 812 if (!add_dependency (val, lim_data, loop, true)) 813 return false; 814 815 if (gimple_vuse (stmt)) 816 { 817 mem_ref_p ref = mem_ref_in_stmt (stmt); 818 819 if (ref) 820 { 821 lim_data->max_loop 822 = outermost_indep_loop (lim_data->max_loop, loop, ref); 823 if (!lim_data->max_loop) 824 return false; 825 } 826 else 827 { 828 if ((val = gimple_vuse (stmt)) != NULL_TREE) 829 { 830 if (!add_dependency (val, lim_data, loop, false)) 831 return false; 832 } 833 } 834 } 835 836 lim_data->cost += stmt_cost (stmt); 837 838 return true; 839 } 840 841 /* Suppose that some statement in ORIG_LOOP is hoisted to the loop LEVEL, 842 and that one of the operands of this statement is computed by STMT. 843 Ensure that STMT (together with all the statements that define its 844 operands) is hoisted at least out of the loop LEVEL. */ 845 846 static void 847 set_level (gimple stmt, struct loop *orig_loop, struct loop *level) 848 { 849 struct loop *stmt_loop = gimple_bb (stmt)->loop_father; 850 struct lim_aux_data *lim_data; 851 gimple dep_stmt; 852 unsigned i; 853 854 stmt_loop = find_common_loop (orig_loop, stmt_loop); 855 lim_data = get_lim_data (stmt); 856 if (lim_data != NULL && lim_data->tgt_loop != NULL) 857 stmt_loop = find_common_loop (stmt_loop, 858 loop_outer (lim_data->tgt_loop)); 859 if (flow_loop_nested_p (stmt_loop, level)) 860 return; 861 862 gcc_assert (level == lim_data->max_loop 863 || flow_loop_nested_p (lim_data->max_loop, level)); 864 865 lim_data->tgt_loop = level; 866 FOR_EACH_VEC_ELT (lim_data->depends, i, dep_stmt) 867 set_level (dep_stmt, orig_loop, level); 868 } 869 870 /* Determines an outermost loop from that we want to hoist the statement STMT. 871 For now we chose the outermost possible loop. TODO -- use profiling 872 information to set it more sanely. */ 873 874 static void 875 set_profitable_level (gimple stmt) 876 { 877 set_level (stmt, gimple_bb (stmt)->loop_father, get_lim_data (stmt)->max_loop); 878 } 879 880 /* Returns true if STMT is a call that has side effects. */ 881 882 static bool 883 nonpure_call_p (gimple stmt) 884 { 885 if (gimple_code (stmt) != GIMPLE_CALL) 886 return false; 887 888 return gimple_has_side_effects (stmt); 889 } 890 891 /* Rewrite a/b to a*(1/b). Return the invariant stmt to process. */ 892 893 static gimple 894 rewrite_reciprocal (gimple_stmt_iterator *bsi) 895 { 896 gassign *stmt, *stmt1, *stmt2; 897 tree name, lhs, type; 898 tree real_one; 899 gimple_stmt_iterator gsi; 900 901 stmt = as_a <gassign *> (gsi_stmt (*bsi)); 902 lhs = gimple_assign_lhs (stmt); 903 type = TREE_TYPE (lhs); 904 905 real_one = build_one_cst (type); 906 907 name = make_temp_ssa_name (type, NULL, "reciptmp"); 908 stmt1 = gimple_build_assign (name, RDIV_EXPR, real_one, 909 gimple_assign_rhs2 (stmt)); 910 stmt2 = gimple_build_assign (lhs, MULT_EXPR, name, 911 gimple_assign_rhs1 (stmt)); 912 913 /* Replace division stmt with reciprocal and multiply stmts. 914 The multiply stmt is not invariant, so update iterator 915 and avoid rescanning. */ 916 gsi = *bsi; 917 gsi_insert_before (bsi, stmt1, GSI_NEW_STMT); 918 gsi_replace (&gsi, stmt2, true); 919 920 /* Continue processing with invariant reciprocal statement. */ 921 return stmt1; 922 } 923 924 /* Check if the pattern at *BSI is a bittest of the form 925 (A >> B) & 1 != 0 and in this case rewrite it to A & (1 << B) != 0. */ 926 927 static gimple 928 rewrite_bittest (gimple_stmt_iterator *bsi) 929 { 930 gassign *stmt; 931 gimple stmt1; 932 gassign *stmt2; 933 gimple use_stmt; 934 gcond *cond_stmt; 935 tree lhs, name, t, a, b; 936 use_operand_p use; 937 938 stmt = as_a <gassign *> (gsi_stmt (*bsi)); 939 lhs = gimple_assign_lhs (stmt); 940 941 /* Verify that the single use of lhs is a comparison against zero. */ 942 if (TREE_CODE (lhs) != SSA_NAME 943 || !single_imm_use (lhs, &use, &use_stmt)) 944 return stmt; 945 cond_stmt = dyn_cast <gcond *> (use_stmt); 946 if (!cond_stmt) 947 return stmt; 948 if (gimple_cond_lhs (cond_stmt) != lhs 949 || (gimple_cond_code (cond_stmt) != NE_EXPR 950 && gimple_cond_code (cond_stmt) != EQ_EXPR) 951 || !integer_zerop (gimple_cond_rhs (cond_stmt))) 952 return stmt; 953 954 /* Get at the operands of the shift. The rhs is TMP1 & 1. */ 955 stmt1 = SSA_NAME_DEF_STMT (gimple_assign_rhs1 (stmt)); 956 if (gimple_code (stmt1) != GIMPLE_ASSIGN) 957 return stmt; 958 959 /* There is a conversion in between possibly inserted by fold. */ 960 if (CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (stmt1))) 961 { 962 t = gimple_assign_rhs1 (stmt1); 963 if (TREE_CODE (t) != SSA_NAME 964 || !has_single_use (t)) 965 return stmt; 966 stmt1 = SSA_NAME_DEF_STMT (t); 967 if (gimple_code (stmt1) != GIMPLE_ASSIGN) 968 return stmt; 969 } 970 971 /* Verify that B is loop invariant but A is not. Verify that with 972 all the stmt walking we are still in the same loop. */ 973 if (gimple_assign_rhs_code (stmt1) != RSHIFT_EXPR 974 || loop_containing_stmt (stmt1) != loop_containing_stmt (stmt)) 975 return stmt; 976 977 a = gimple_assign_rhs1 (stmt1); 978 b = gimple_assign_rhs2 (stmt1); 979 980 if (outermost_invariant_loop (b, loop_containing_stmt (stmt1)) != NULL 981 && outermost_invariant_loop (a, loop_containing_stmt (stmt1)) == NULL) 982 { 983 gimple_stmt_iterator rsi; 984 985 /* 1 << B */ 986 t = fold_build2 (LSHIFT_EXPR, TREE_TYPE (a), 987 build_int_cst (TREE_TYPE (a), 1), b); 988 name = make_temp_ssa_name (TREE_TYPE (a), NULL, "shifttmp"); 989 stmt1 = gimple_build_assign (name, t); 990 991 /* A & (1 << B) */ 992 t = fold_build2 (BIT_AND_EXPR, TREE_TYPE (a), a, name); 993 name = make_temp_ssa_name (TREE_TYPE (a), NULL, "shifttmp"); 994 stmt2 = gimple_build_assign (name, t); 995 996 /* Replace the SSA_NAME we compare against zero. Adjust 997 the type of zero accordingly. */ 998 SET_USE (use, name); 999 gimple_cond_set_rhs (cond_stmt, 1000 build_int_cst_type (TREE_TYPE (name), 1001 0)); 1002 1003 /* Don't use gsi_replace here, none of the new assignments sets 1004 the variable originally set in stmt. Move bsi to stmt1, and 1005 then remove the original stmt, so that we get a chance to 1006 retain debug info for it. */ 1007 rsi = *bsi; 1008 gsi_insert_before (bsi, stmt1, GSI_NEW_STMT); 1009 gsi_insert_before (&rsi, stmt2, GSI_SAME_STMT); 1010 gsi_remove (&rsi, true); 1011 1012 return stmt1; 1013 } 1014 1015 return stmt; 1016 } 1017 1018 /* For each statement determines the outermost loop in that it is invariant, 1019 - statements on whose motion it depends and the cost of the computation. 1020 - This information is stored to the LIM_DATA structure associated with 1021 - each statement. */ 1022 class invariantness_dom_walker : public dom_walker 1023 { 1024 public: 1025 invariantness_dom_walker (cdi_direction direction) 1026 : dom_walker (direction) {} 1027 1028 virtual void before_dom_children (basic_block); 1029 }; 1030 1031 /* Determine the outermost loops in that statements in basic block BB are 1032 invariant, and record them to the LIM_DATA associated with the statements. 1033 Callback for dom_walker. */ 1034 1035 void 1036 invariantness_dom_walker::before_dom_children (basic_block bb) 1037 { 1038 enum move_pos pos; 1039 gimple_stmt_iterator bsi; 1040 gimple stmt; 1041 bool maybe_never = ALWAYS_EXECUTED_IN (bb) == NULL; 1042 struct loop *outermost = ALWAYS_EXECUTED_IN (bb); 1043 struct lim_aux_data *lim_data; 1044 1045 if (!loop_outer (bb->loop_father)) 1046 return; 1047 1048 if (dump_file && (dump_flags & TDF_DETAILS)) 1049 fprintf (dump_file, "Basic block %d (loop %d -- depth %d):\n\n", 1050 bb->index, bb->loop_father->num, loop_depth (bb->loop_father)); 1051 1052 /* Look at PHI nodes, but only if there is at most two. 1053 ??? We could relax this further by post-processing the inserted 1054 code and transforming adjacent cond-exprs with the same predicate 1055 to control flow again. */ 1056 bsi = gsi_start_phis (bb); 1057 if (!gsi_end_p (bsi) 1058 && ((gsi_next (&bsi), gsi_end_p (bsi)) 1059 || (gsi_next (&bsi), gsi_end_p (bsi)))) 1060 for (bsi = gsi_start_phis (bb); !gsi_end_p (bsi); gsi_next (&bsi)) 1061 { 1062 stmt = gsi_stmt (bsi); 1063 1064 pos = movement_possibility (stmt); 1065 if (pos == MOVE_IMPOSSIBLE) 1066 continue; 1067 1068 lim_data = init_lim_data (stmt); 1069 lim_data->always_executed_in = outermost; 1070 1071 if (!determine_max_movement (stmt, false)) 1072 { 1073 lim_data->max_loop = NULL; 1074 continue; 1075 } 1076 1077 if (dump_file && (dump_flags & TDF_DETAILS)) 1078 { 1079 print_gimple_stmt (dump_file, stmt, 2, 0); 1080 fprintf (dump_file, " invariant up to level %d, cost %d.\n\n", 1081 loop_depth (lim_data->max_loop), 1082 lim_data->cost); 1083 } 1084 1085 if (lim_data->cost >= LIM_EXPENSIVE) 1086 set_profitable_level (stmt); 1087 } 1088 1089 for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi)) 1090 { 1091 stmt = gsi_stmt (bsi); 1092 1093 pos = movement_possibility (stmt); 1094 if (pos == MOVE_IMPOSSIBLE) 1095 { 1096 if (nonpure_call_p (stmt)) 1097 { 1098 maybe_never = true; 1099 outermost = NULL; 1100 } 1101 /* Make sure to note always_executed_in for stores to make 1102 store-motion work. */ 1103 else if (stmt_makes_single_store (stmt)) 1104 { 1105 struct lim_aux_data *lim_data = init_lim_data (stmt); 1106 lim_data->always_executed_in = outermost; 1107 } 1108 continue; 1109 } 1110 1111 if (is_gimple_assign (stmt) 1112 && (get_gimple_rhs_class (gimple_assign_rhs_code (stmt)) 1113 == GIMPLE_BINARY_RHS)) 1114 { 1115 tree op0 = gimple_assign_rhs1 (stmt); 1116 tree op1 = gimple_assign_rhs2 (stmt); 1117 struct loop *ol1 = outermost_invariant_loop (op1, 1118 loop_containing_stmt (stmt)); 1119 1120 /* If divisor is invariant, convert a/b to a*(1/b), allowing reciprocal 1121 to be hoisted out of loop, saving expensive divide. */ 1122 if (pos == MOVE_POSSIBLE 1123 && gimple_assign_rhs_code (stmt) == RDIV_EXPR 1124 && flag_unsafe_math_optimizations 1125 && !flag_trapping_math 1126 && ol1 != NULL 1127 && outermost_invariant_loop (op0, ol1) == NULL) 1128 stmt = rewrite_reciprocal (&bsi); 1129 1130 /* If the shift count is invariant, convert (A >> B) & 1 to 1131 A & (1 << B) allowing the bit mask to be hoisted out of the loop 1132 saving an expensive shift. */ 1133 if (pos == MOVE_POSSIBLE 1134 && gimple_assign_rhs_code (stmt) == BIT_AND_EXPR 1135 && integer_onep (op1) 1136 && TREE_CODE (op0) == SSA_NAME 1137 && has_single_use (op0)) 1138 stmt = rewrite_bittest (&bsi); 1139 } 1140 1141 lim_data = init_lim_data (stmt); 1142 lim_data->always_executed_in = outermost; 1143 1144 if (maybe_never && pos == MOVE_PRESERVE_EXECUTION) 1145 continue; 1146 1147 if (!determine_max_movement (stmt, pos == MOVE_PRESERVE_EXECUTION)) 1148 { 1149 lim_data->max_loop = NULL; 1150 continue; 1151 } 1152 1153 if (dump_file && (dump_flags & TDF_DETAILS)) 1154 { 1155 print_gimple_stmt (dump_file, stmt, 2, 0); 1156 fprintf (dump_file, " invariant up to level %d, cost %d.\n\n", 1157 loop_depth (lim_data->max_loop), 1158 lim_data->cost); 1159 } 1160 1161 if (lim_data->cost >= LIM_EXPENSIVE) 1162 set_profitable_level (stmt); 1163 } 1164 } 1165 1166 class move_computations_dom_walker : public dom_walker 1167 { 1168 public: 1169 move_computations_dom_walker (cdi_direction direction) 1170 : dom_walker (direction), todo_ (0) {} 1171 1172 virtual void before_dom_children (basic_block); 1173 1174 unsigned int todo_; 1175 }; 1176 1177 /* Hoist the statements in basic block BB out of the loops prescribed by 1178 data stored in LIM_DATA structures associated with each statement. Callback 1179 for walk_dominator_tree. */ 1180 1181 void 1182 move_computations_dom_walker::before_dom_children (basic_block bb) 1183 { 1184 struct loop *level; 1185 unsigned cost = 0; 1186 struct lim_aux_data *lim_data; 1187 1188 if (!loop_outer (bb->loop_father)) 1189 return; 1190 1191 for (gphi_iterator bsi = gsi_start_phis (bb); !gsi_end_p (bsi); ) 1192 { 1193 gassign *new_stmt; 1194 gphi *stmt = bsi.phi (); 1195 1196 lim_data = get_lim_data (stmt); 1197 if (lim_data == NULL) 1198 { 1199 gsi_next (&bsi); 1200 continue; 1201 } 1202 1203 cost = lim_data->cost; 1204 level = lim_data->tgt_loop; 1205 clear_lim_data (stmt); 1206 1207 if (!level) 1208 { 1209 gsi_next (&bsi); 1210 continue; 1211 } 1212 1213 if (dump_file && (dump_flags & TDF_DETAILS)) 1214 { 1215 fprintf (dump_file, "Moving PHI node\n"); 1216 print_gimple_stmt (dump_file, stmt, 0, 0); 1217 fprintf (dump_file, "(cost %u) out of loop %d.\n\n", 1218 cost, level->num); 1219 } 1220 1221 if (gimple_phi_num_args (stmt) == 1) 1222 { 1223 tree arg = PHI_ARG_DEF (stmt, 0); 1224 new_stmt = gimple_build_assign (gimple_phi_result (stmt), 1225 TREE_CODE (arg), arg); 1226 } 1227 else 1228 { 1229 basic_block dom = get_immediate_dominator (CDI_DOMINATORS, bb); 1230 gimple cond = gsi_stmt (gsi_last_bb (dom)); 1231 tree arg0 = NULL_TREE, arg1 = NULL_TREE, t; 1232 /* Get the PHI arguments corresponding to the true and false 1233 edges of COND. */ 1234 extract_true_false_args_from_phi (dom, stmt, &arg0, &arg1); 1235 gcc_assert (arg0 && arg1); 1236 t = build2 (gimple_cond_code (cond), boolean_type_node, 1237 gimple_cond_lhs (cond), gimple_cond_rhs (cond)); 1238 new_stmt = gimple_build_assign (gimple_phi_result (stmt), 1239 COND_EXPR, t, arg0, arg1); 1240 todo_ |= TODO_cleanup_cfg; 1241 } 1242 if (INTEGRAL_TYPE_P (TREE_TYPE (gimple_assign_lhs (new_stmt))) 1243 && (!ALWAYS_EXECUTED_IN (bb) 1244 || (ALWAYS_EXECUTED_IN (bb) != level 1245 && !flow_loop_nested_p (ALWAYS_EXECUTED_IN (bb), level)))) 1246 { 1247 tree lhs = gimple_assign_lhs (new_stmt); 1248 SSA_NAME_RANGE_INFO (lhs) = NULL; 1249 SSA_NAME_ANTI_RANGE_P (lhs) = 0; 1250 } 1251 gsi_insert_on_edge (loop_preheader_edge (level), new_stmt); 1252 remove_phi_node (&bsi, false); 1253 } 1254 1255 for (gimple_stmt_iterator bsi = gsi_start_bb (bb); !gsi_end_p (bsi); ) 1256 { 1257 edge e; 1258 1259 gimple stmt = gsi_stmt (bsi); 1260 1261 lim_data = get_lim_data (stmt); 1262 if (lim_data == NULL) 1263 { 1264 gsi_next (&bsi); 1265 continue; 1266 } 1267 1268 cost = lim_data->cost; 1269 level = lim_data->tgt_loop; 1270 clear_lim_data (stmt); 1271 1272 if (!level) 1273 { 1274 gsi_next (&bsi); 1275 continue; 1276 } 1277 1278 /* We do not really want to move conditionals out of the loop; we just 1279 placed it here to force its operands to be moved if necessary. */ 1280 if (gimple_code (stmt) == GIMPLE_COND) 1281 continue; 1282 1283 if (dump_file && (dump_flags & TDF_DETAILS)) 1284 { 1285 fprintf (dump_file, "Moving statement\n"); 1286 print_gimple_stmt (dump_file, stmt, 0, 0); 1287 fprintf (dump_file, "(cost %u) out of loop %d.\n\n", 1288 cost, level->num); 1289 } 1290 1291 e = loop_preheader_edge (level); 1292 gcc_assert (!gimple_vdef (stmt)); 1293 if (gimple_vuse (stmt)) 1294 { 1295 /* The new VUSE is the one from the virtual PHI in the loop 1296 header or the one already present. */ 1297 gphi_iterator gsi2; 1298 for (gsi2 = gsi_start_phis (e->dest); 1299 !gsi_end_p (gsi2); gsi_next (&gsi2)) 1300 { 1301 gphi *phi = gsi2.phi (); 1302 if (virtual_operand_p (gimple_phi_result (phi))) 1303 { 1304 gimple_set_vuse (stmt, PHI_ARG_DEF_FROM_EDGE (phi, e)); 1305 break; 1306 } 1307 } 1308 } 1309 gsi_remove (&bsi, false); 1310 if (gimple_has_lhs (stmt) 1311 && TREE_CODE (gimple_get_lhs (stmt)) == SSA_NAME 1312 && INTEGRAL_TYPE_P (TREE_TYPE (gimple_get_lhs (stmt))) 1313 && (!ALWAYS_EXECUTED_IN (bb) 1314 || !(ALWAYS_EXECUTED_IN (bb) == level 1315 || flow_loop_nested_p (ALWAYS_EXECUTED_IN (bb), level)))) 1316 { 1317 tree lhs = gimple_get_lhs (stmt); 1318 SSA_NAME_RANGE_INFO (lhs) = NULL; 1319 SSA_NAME_ANTI_RANGE_P (lhs) = 0; 1320 } 1321 /* In case this is a stmt that is not unconditionally executed 1322 when the target loop header is executed and the stmt may 1323 invoke undefined integer or pointer overflow rewrite it to 1324 unsigned arithmetic. */ 1325 if (is_gimple_assign (stmt) 1326 && INTEGRAL_TYPE_P (TREE_TYPE (gimple_assign_lhs (stmt))) 1327 && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (gimple_assign_lhs (stmt))) 1328 && arith_code_with_undefined_signed_overflow 1329 (gimple_assign_rhs_code (stmt)) 1330 && (!ALWAYS_EXECUTED_IN (bb) 1331 || !(ALWAYS_EXECUTED_IN (bb) == level 1332 || flow_loop_nested_p (ALWAYS_EXECUTED_IN (bb), level)))) 1333 gsi_insert_seq_on_edge (e, rewrite_to_defined_overflow (stmt)); 1334 else 1335 gsi_insert_on_edge (e, stmt); 1336 } 1337 } 1338 1339 /* Hoist the statements out of the loops prescribed by data stored in 1340 LIM_DATA structures associated with each statement.*/ 1341 1342 static unsigned int 1343 move_computations (void) 1344 { 1345 move_computations_dom_walker walker (CDI_DOMINATORS); 1346 walker.walk (cfun->cfg->x_entry_block_ptr); 1347 1348 gsi_commit_edge_inserts (); 1349 if (need_ssa_update_p (cfun)) 1350 rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa); 1351 1352 return walker.todo_; 1353 } 1354 1355 /* Checks whether the statement defining variable *INDEX can be hoisted 1356 out of the loop passed in DATA. Callback for for_each_index. */ 1357 1358 static bool 1359 may_move_till (tree ref, tree *index, void *data) 1360 { 1361 struct loop *loop = (struct loop *) data, *max_loop; 1362 1363 /* If REF is an array reference, check also that the step and the lower 1364 bound is invariant in LOOP. */ 1365 if (TREE_CODE (ref) == ARRAY_REF) 1366 { 1367 tree step = TREE_OPERAND (ref, 3); 1368 tree lbound = TREE_OPERAND (ref, 2); 1369 1370 max_loop = outermost_invariant_loop (step, loop); 1371 if (!max_loop) 1372 return false; 1373 1374 max_loop = outermost_invariant_loop (lbound, loop); 1375 if (!max_loop) 1376 return false; 1377 } 1378 1379 max_loop = outermost_invariant_loop (*index, loop); 1380 if (!max_loop) 1381 return false; 1382 1383 return true; 1384 } 1385 1386 /* If OP is SSA NAME, force the statement that defines it to be 1387 moved out of the LOOP. ORIG_LOOP is the loop in that EXPR is used. */ 1388 1389 static void 1390 force_move_till_op (tree op, struct loop *orig_loop, struct loop *loop) 1391 { 1392 gimple stmt; 1393 1394 if (!op 1395 || is_gimple_min_invariant (op)) 1396 return; 1397 1398 gcc_assert (TREE_CODE (op) == SSA_NAME); 1399 1400 stmt = SSA_NAME_DEF_STMT (op); 1401 if (gimple_nop_p (stmt)) 1402 return; 1403 1404 set_level (stmt, orig_loop, loop); 1405 } 1406 1407 /* Forces statement defining invariants in REF (and *INDEX) to be moved out of 1408 the LOOP. The reference REF is used in the loop ORIG_LOOP. Callback for 1409 for_each_index. */ 1410 1411 struct fmt_data 1412 { 1413 struct loop *loop; 1414 struct loop *orig_loop; 1415 }; 1416 1417 static bool 1418 force_move_till (tree ref, tree *index, void *data) 1419 { 1420 struct fmt_data *fmt_data = (struct fmt_data *) data; 1421 1422 if (TREE_CODE (ref) == ARRAY_REF) 1423 { 1424 tree step = TREE_OPERAND (ref, 3); 1425 tree lbound = TREE_OPERAND (ref, 2); 1426 1427 force_move_till_op (step, fmt_data->orig_loop, fmt_data->loop); 1428 force_move_till_op (lbound, fmt_data->orig_loop, fmt_data->loop); 1429 } 1430 1431 force_move_till_op (*index, fmt_data->orig_loop, fmt_data->loop); 1432 1433 return true; 1434 } 1435 1436 /* A function to free the mem_ref object OBJ. */ 1437 1438 static void 1439 memref_free (struct im_mem_ref *mem) 1440 { 1441 mem->accesses_in_loop.release (); 1442 } 1443 1444 /* Allocates and returns a memory reference description for MEM whose hash 1445 value is HASH and id is ID. */ 1446 1447 static mem_ref_p 1448 mem_ref_alloc (tree mem, unsigned hash, unsigned id) 1449 { 1450 mem_ref_p ref = XOBNEW (&mem_ref_obstack, struct im_mem_ref); 1451 ao_ref_init (&ref->mem, mem); 1452 ref->id = id; 1453 ref->hash = hash; 1454 ref->stored = NULL; 1455 bitmap_initialize (&ref->indep_loop, &lim_bitmap_obstack); 1456 bitmap_initialize (&ref->dep_loop, &lim_bitmap_obstack); 1457 ref->accesses_in_loop.create (1); 1458 1459 return ref; 1460 } 1461 1462 /* Records memory reference location *LOC in LOOP to the memory reference 1463 description REF. The reference occurs in statement STMT. */ 1464 1465 static void 1466 record_mem_ref_loc (mem_ref_p ref, gimple stmt, tree *loc) 1467 { 1468 mem_ref_loc aref; 1469 aref.stmt = stmt; 1470 aref.ref = loc; 1471 ref->accesses_in_loop.safe_push (aref); 1472 } 1473 1474 /* Set the LOOP bit in REF stored bitmap and allocate that if 1475 necessary. Return whether a bit was changed. */ 1476 1477 static bool 1478 set_ref_stored_in_loop (mem_ref_p ref, struct loop *loop) 1479 { 1480 if (!ref->stored) 1481 ref->stored = BITMAP_ALLOC (&lim_bitmap_obstack); 1482 return bitmap_set_bit (ref->stored, loop->num); 1483 } 1484 1485 /* Marks reference REF as stored in LOOP. */ 1486 1487 static void 1488 mark_ref_stored (mem_ref_p ref, struct loop *loop) 1489 { 1490 while (loop != current_loops->tree_root 1491 && set_ref_stored_in_loop (ref, loop)) 1492 loop = loop_outer (loop); 1493 } 1494 1495 /* Gathers memory references in statement STMT in LOOP, storing the 1496 information about them in the memory_accesses structure. Marks 1497 the vops accessed through unrecognized statements there as 1498 well. */ 1499 1500 static void 1501 gather_mem_refs_stmt (struct loop *loop, gimple stmt) 1502 { 1503 tree *mem = NULL; 1504 hashval_t hash; 1505 im_mem_ref **slot; 1506 mem_ref_p ref; 1507 bool is_stored; 1508 unsigned id; 1509 1510 if (!gimple_vuse (stmt)) 1511 return; 1512 1513 mem = simple_mem_ref_in_stmt (stmt, &is_stored); 1514 if (!mem) 1515 { 1516 /* We use the shared mem_ref for all unanalyzable refs. */ 1517 id = UNANALYZABLE_MEM_ID; 1518 ref = memory_accesses.refs_list[id]; 1519 if (dump_file && (dump_flags & TDF_DETAILS)) 1520 { 1521 fprintf (dump_file, "Unanalyzed memory reference %u: ", id); 1522 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM); 1523 } 1524 is_stored = gimple_vdef (stmt); 1525 } 1526 else 1527 { 1528 hash = iterative_hash_expr (*mem, 0); 1529 slot = memory_accesses.refs->find_slot_with_hash (*mem, hash, INSERT); 1530 if (*slot) 1531 { 1532 ref = (mem_ref_p) *slot; 1533 id = ref->id; 1534 } 1535 else 1536 { 1537 id = memory_accesses.refs_list.length (); 1538 ref = mem_ref_alloc (*mem, hash, id); 1539 memory_accesses.refs_list.safe_push (ref); 1540 *slot = ref; 1541 1542 if (dump_file && (dump_flags & TDF_DETAILS)) 1543 { 1544 fprintf (dump_file, "Memory reference %u: ", id); 1545 print_generic_expr (dump_file, ref->mem.ref, TDF_SLIM); 1546 fprintf (dump_file, "\n"); 1547 } 1548 } 1549 1550 record_mem_ref_loc (ref, stmt, mem); 1551 } 1552 bitmap_set_bit (&memory_accesses.refs_in_loop[loop->num], ref->id); 1553 if (is_stored) 1554 { 1555 bitmap_set_bit (&memory_accesses.refs_stored_in_loop[loop->num], ref->id); 1556 mark_ref_stored (ref, loop); 1557 } 1558 return; 1559 } 1560 1561 static unsigned *bb_loop_postorder; 1562 1563 /* qsort sort function to sort blocks after their loop fathers postorder. */ 1564 1565 static int 1566 sort_bbs_in_loop_postorder_cmp (const void *bb1_, const void *bb2_) 1567 { 1568 basic_block bb1 = *(basic_block *)const_cast<void *>(bb1_); 1569 basic_block bb2 = *(basic_block *)const_cast<void *>(bb2_); 1570 struct loop *loop1 = bb1->loop_father; 1571 struct loop *loop2 = bb2->loop_father; 1572 if (loop1->num == loop2->num) 1573 return 0; 1574 return bb_loop_postorder[loop1->num] < bb_loop_postorder[loop2->num] ? -1 : 1; 1575 } 1576 1577 /* qsort sort function to sort ref locs after their loop fathers postorder. */ 1578 1579 static int 1580 sort_locs_in_loop_postorder_cmp (const void *loc1_, const void *loc2_) 1581 { 1582 mem_ref_loc *loc1 = (mem_ref_loc *)const_cast<void *>(loc1_); 1583 mem_ref_loc *loc2 = (mem_ref_loc *)const_cast<void *>(loc2_); 1584 struct loop *loop1 = gimple_bb (loc1->stmt)->loop_father; 1585 struct loop *loop2 = gimple_bb (loc2->stmt)->loop_father; 1586 if (loop1->num == loop2->num) 1587 return 0; 1588 return bb_loop_postorder[loop1->num] < bb_loop_postorder[loop2->num] ? -1 : 1; 1589 } 1590 1591 /* Gathers memory references in loops. */ 1592 1593 static void 1594 analyze_memory_references (void) 1595 { 1596 gimple_stmt_iterator bsi; 1597 basic_block bb, *bbs; 1598 struct loop *loop, *outer; 1599 unsigned i, n; 1600 1601 /* Collect all basic-blocks in loops and sort them after their 1602 loops postorder. */ 1603 i = 0; 1604 bbs = XNEWVEC (basic_block, n_basic_blocks_for_fn (cfun) - NUM_FIXED_BLOCKS); 1605 FOR_EACH_BB_FN (bb, cfun) 1606 if (bb->loop_father != current_loops->tree_root) 1607 bbs[i++] = bb; 1608 n = i; 1609 qsort (bbs, n, sizeof (basic_block), sort_bbs_in_loop_postorder_cmp); 1610 1611 /* Visit blocks in loop postorder and assign mem-ref IDs in that order. 1612 That results in better locality for all the bitmaps. */ 1613 for (i = 0; i < n; ++i) 1614 { 1615 basic_block bb = bbs[i]; 1616 for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi)) 1617 gather_mem_refs_stmt (bb->loop_father, gsi_stmt (bsi)); 1618 } 1619 1620 /* Sort the location list of gathered memory references after their 1621 loop postorder number. */ 1622 im_mem_ref *ref; 1623 FOR_EACH_VEC_ELT (memory_accesses.refs_list, i, ref) 1624 ref->accesses_in_loop.qsort (sort_locs_in_loop_postorder_cmp); 1625 1626 free (bbs); 1627 // free (bb_loop_postorder); 1628 1629 /* Propagate the information about accessed memory references up 1630 the loop hierarchy. */ 1631 FOR_EACH_LOOP (loop, LI_FROM_INNERMOST) 1632 { 1633 /* Finalize the overall touched references (including subloops). */ 1634 bitmap_ior_into (&memory_accesses.all_refs_stored_in_loop[loop->num], 1635 &memory_accesses.refs_stored_in_loop[loop->num]); 1636 1637 /* Propagate the information about accessed memory references up 1638 the loop hierarchy. */ 1639 outer = loop_outer (loop); 1640 if (outer == current_loops->tree_root) 1641 continue; 1642 1643 bitmap_ior_into (&memory_accesses.all_refs_stored_in_loop[outer->num], 1644 &memory_accesses.all_refs_stored_in_loop[loop->num]); 1645 } 1646 } 1647 1648 /* Returns true if MEM1 and MEM2 may alias. TTAE_CACHE is used as a cache in 1649 tree_to_aff_combination_expand. */ 1650 1651 static bool 1652 mem_refs_may_alias_p (mem_ref_p mem1, mem_ref_p mem2, 1653 hash_map<tree, name_expansion *> **ttae_cache) 1654 { 1655 /* Perform BASE + OFFSET analysis -- if MEM1 and MEM2 are based on the same 1656 object and their offset differ in such a way that the locations cannot 1657 overlap, then they cannot alias. */ 1658 widest_int size1, size2; 1659 aff_tree off1, off2; 1660 1661 /* Perform basic offset and type-based disambiguation. */ 1662 if (!refs_may_alias_p_1 (&mem1->mem, &mem2->mem, true)) 1663 return false; 1664 1665 /* The expansion of addresses may be a bit expensive, thus we only do 1666 the check at -O2 and higher optimization levels. */ 1667 if (optimize < 2) 1668 return true; 1669 1670 get_inner_reference_aff (mem1->mem.ref, &off1, &size1); 1671 get_inner_reference_aff (mem2->mem.ref, &off2, &size2); 1672 aff_combination_expand (&off1, ttae_cache); 1673 aff_combination_expand (&off2, ttae_cache); 1674 aff_combination_scale (&off1, -1); 1675 aff_combination_add (&off2, &off1); 1676 1677 if (aff_comb_cannot_overlap_p (&off2, size1, size2)) 1678 return false; 1679 1680 return true; 1681 } 1682 1683 /* Compare function for bsearch searching for reference locations 1684 in a loop. */ 1685 1686 static int 1687 find_ref_loc_in_loop_cmp (const void *loop_, const void *loc_) 1688 { 1689 struct loop *loop = (struct loop *)const_cast<void *>(loop_); 1690 mem_ref_loc *loc = (mem_ref_loc *)const_cast<void *>(loc_); 1691 struct loop *loc_loop = gimple_bb (loc->stmt)->loop_father; 1692 if (loop->num == loc_loop->num 1693 || flow_loop_nested_p (loop, loc_loop)) 1694 return 0; 1695 return (bb_loop_postorder[loop->num] < bb_loop_postorder[loc_loop->num] 1696 ? -1 : 1); 1697 } 1698 1699 /* Iterates over all locations of REF in LOOP and its subloops calling 1700 fn.operator() with the location as argument. When that operator 1701 returns true the iteration is stopped and true is returned. 1702 Otherwise false is returned. */ 1703 1704 template <typename FN> 1705 static bool 1706 for_all_locs_in_loop (struct loop *loop, mem_ref_p ref, FN fn) 1707 { 1708 unsigned i; 1709 mem_ref_loc_p loc; 1710 1711 /* Search for the cluster of locs in the accesses_in_loop vector 1712 which is sorted after postorder index of the loop father. */ 1713 loc = ref->accesses_in_loop.bsearch (loop, find_ref_loc_in_loop_cmp); 1714 if (!loc) 1715 return false; 1716 1717 /* We have found one location inside loop or its sub-loops. Iterate 1718 both forward and backward to cover the whole cluster. */ 1719 i = loc - ref->accesses_in_loop.address (); 1720 while (i > 0) 1721 { 1722 --i; 1723 mem_ref_loc_p l = &ref->accesses_in_loop[i]; 1724 if (!flow_bb_inside_loop_p (loop, gimple_bb (l->stmt))) 1725 break; 1726 if (fn (l)) 1727 return true; 1728 } 1729 for (i = loc - ref->accesses_in_loop.address (); 1730 i < ref->accesses_in_loop.length (); ++i) 1731 { 1732 mem_ref_loc_p l = &ref->accesses_in_loop[i]; 1733 if (!flow_bb_inside_loop_p (loop, gimple_bb (l->stmt))) 1734 break; 1735 if (fn (l)) 1736 return true; 1737 } 1738 1739 return false; 1740 } 1741 1742 /* Rewrites location LOC by TMP_VAR. */ 1743 1744 struct rewrite_mem_ref_loc 1745 { 1746 rewrite_mem_ref_loc (tree tmp_var_) : tmp_var (tmp_var_) {} 1747 bool operator () (mem_ref_loc_p loc); 1748 tree tmp_var; 1749 }; 1750 1751 bool 1752 rewrite_mem_ref_loc::operator () (mem_ref_loc_p loc) 1753 { 1754 *loc->ref = tmp_var; 1755 update_stmt (loc->stmt); 1756 return false; 1757 } 1758 1759 /* Rewrites all references to REF in LOOP by variable TMP_VAR. */ 1760 1761 static void 1762 rewrite_mem_refs (struct loop *loop, mem_ref_p ref, tree tmp_var) 1763 { 1764 for_all_locs_in_loop (loop, ref, rewrite_mem_ref_loc (tmp_var)); 1765 } 1766 1767 /* Stores the first reference location in LOCP. */ 1768 1769 struct first_mem_ref_loc_1 1770 { 1771 first_mem_ref_loc_1 (mem_ref_loc_p *locp_) : locp (locp_) {} 1772 bool operator () (mem_ref_loc_p loc); 1773 mem_ref_loc_p *locp; 1774 }; 1775 1776 bool 1777 first_mem_ref_loc_1::operator () (mem_ref_loc_p loc) 1778 { 1779 *locp = loc; 1780 return true; 1781 } 1782 1783 /* Returns the first reference location to REF in LOOP. */ 1784 1785 static mem_ref_loc_p 1786 first_mem_ref_loc (struct loop *loop, mem_ref_p ref) 1787 { 1788 mem_ref_loc_p locp = NULL; 1789 for_all_locs_in_loop (loop, ref, first_mem_ref_loc_1 (&locp)); 1790 return locp; 1791 } 1792 1793 struct prev_flag_edges { 1794 /* Edge to insert new flag comparison code. */ 1795 edge append_cond_position; 1796 1797 /* Edge for fall through from previous flag comparison. */ 1798 edge last_cond_fallthru; 1799 }; 1800 1801 /* Helper function for execute_sm. Emit code to store TMP_VAR into 1802 MEM along edge EX. 1803 1804 The store is only done if MEM has changed. We do this so no 1805 changes to MEM occur on code paths that did not originally store 1806 into it. 1807 1808 The common case for execute_sm will transform: 1809 1810 for (...) { 1811 if (foo) 1812 stuff; 1813 else 1814 MEM = TMP_VAR; 1815 } 1816 1817 into: 1818 1819 lsm = MEM; 1820 for (...) { 1821 if (foo) 1822 stuff; 1823 else 1824 lsm = TMP_VAR; 1825 } 1826 MEM = lsm; 1827 1828 This function will generate: 1829 1830 lsm = MEM; 1831 1832 lsm_flag = false; 1833 ... 1834 for (...) { 1835 if (foo) 1836 stuff; 1837 else { 1838 lsm = TMP_VAR; 1839 lsm_flag = true; 1840 } 1841 } 1842 if (lsm_flag) <-- 1843 MEM = lsm; <-- 1844 */ 1845 1846 static void 1847 execute_sm_if_changed (edge ex, tree mem, tree tmp_var, tree flag) 1848 { 1849 basic_block new_bb, then_bb, old_dest; 1850 bool loop_has_only_one_exit; 1851 edge then_old_edge, orig_ex = ex; 1852 gimple_stmt_iterator gsi; 1853 gimple stmt; 1854 struct prev_flag_edges *prev_edges = (struct prev_flag_edges *) ex->aux; 1855 bool irr = ex->flags & EDGE_IRREDUCIBLE_LOOP; 1856 1857 /* ?? Insert store after previous store if applicable. See note 1858 below. */ 1859 if (prev_edges) 1860 ex = prev_edges->append_cond_position; 1861 1862 loop_has_only_one_exit = single_pred_p (ex->dest); 1863 1864 if (loop_has_only_one_exit) 1865 ex = split_block_after_labels (ex->dest); 1866 else 1867 { 1868 for (gphi_iterator gpi = gsi_start_phis (ex->dest); 1869 !gsi_end_p (gpi); gsi_next (&gpi)) 1870 { 1871 gphi *phi = gpi.phi (); 1872 if (virtual_operand_p (gimple_phi_result (phi))) 1873 continue; 1874 1875 /* When the destination has a non-virtual PHI node with multiple 1876 predecessors make sure we preserve the PHI structure by 1877 forcing a forwarder block so that hoisting of that PHI will 1878 still work. */ 1879 split_edge (ex); 1880 break; 1881 } 1882 } 1883 1884 old_dest = ex->dest; 1885 new_bb = split_edge (ex); 1886 then_bb = create_empty_bb (new_bb); 1887 if (irr) 1888 then_bb->flags = BB_IRREDUCIBLE_LOOP; 1889 add_bb_to_loop (then_bb, new_bb->loop_father); 1890 1891 gsi = gsi_start_bb (new_bb); 1892 stmt = gimple_build_cond (NE_EXPR, flag, boolean_false_node, 1893 NULL_TREE, NULL_TREE); 1894 gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING); 1895 1896 gsi = gsi_start_bb (then_bb); 1897 /* Insert actual store. */ 1898 stmt = gimple_build_assign (unshare_expr (mem), tmp_var); 1899 gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING); 1900 1901 make_edge (new_bb, then_bb, 1902 EDGE_TRUE_VALUE | (irr ? EDGE_IRREDUCIBLE_LOOP : 0)); 1903 make_edge (new_bb, old_dest, 1904 EDGE_FALSE_VALUE | (irr ? EDGE_IRREDUCIBLE_LOOP : 0)); 1905 then_old_edge = make_edge (then_bb, old_dest, 1906 EDGE_FALLTHRU | (irr ? EDGE_IRREDUCIBLE_LOOP : 0)); 1907 1908 set_immediate_dominator (CDI_DOMINATORS, then_bb, new_bb); 1909 1910 if (prev_edges) 1911 { 1912 basic_block prevbb = prev_edges->last_cond_fallthru->src; 1913 redirect_edge_succ (prev_edges->last_cond_fallthru, new_bb); 1914 set_immediate_dominator (CDI_DOMINATORS, new_bb, prevbb); 1915 set_immediate_dominator (CDI_DOMINATORS, old_dest, 1916 recompute_dominator (CDI_DOMINATORS, old_dest)); 1917 } 1918 1919 /* ?? Because stores may alias, they must happen in the exact 1920 sequence they originally happened. Save the position right after 1921 the (_lsm) store we just created so we can continue appending after 1922 it and maintain the original order. */ 1923 { 1924 struct prev_flag_edges *p; 1925 1926 if (orig_ex->aux) 1927 orig_ex->aux = NULL; 1928 alloc_aux_for_edge (orig_ex, sizeof (struct prev_flag_edges)); 1929 p = (struct prev_flag_edges *) orig_ex->aux; 1930 p->append_cond_position = then_old_edge; 1931 p->last_cond_fallthru = find_edge (new_bb, old_dest); 1932 orig_ex->aux = (void *) p; 1933 } 1934 1935 if (!loop_has_only_one_exit) 1936 for (gphi_iterator gpi = gsi_start_phis (old_dest); 1937 !gsi_end_p (gpi); gsi_next (&gpi)) 1938 { 1939 gphi *phi = gpi.phi (); 1940 unsigned i; 1941 1942 for (i = 0; i < gimple_phi_num_args (phi); i++) 1943 if (gimple_phi_arg_edge (phi, i)->src == new_bb) 1944 { 1945 tree arg = gimple_phi_arg_def (phi, i); 1946 add_phi_arg (phi, arg, then_old_edge, UNKNOWN_LOCATION); 1947 update_stmt (phi); 1948 } 1949 } 1950 /* Remove the original fall through edge. This was the 1951 single_succ_edge (new_bb). */ 1952 EDGE_SUCC (new_bb, 0)->flags &= ~EDGE_FALLTHRU; 1953 } 1954 1955 /* When REF is set on the location, set flag indicating the store. */ 1956 1957 struct sm_set_flag_if_changed 1958 { 1959 sm_set_flag_if_changed (tree flag_) : flag (flag_) {} 1960 bool operator () (mem_ref_loc_p loc); 1961 tree flag; 1962 }; 1963 1964 bool 1965 sm_set_flag_if_changed::operator () (mem_ref_loc_p loc) 1966 { 1967 /* Only set the flag for writes. */ 1968 if (is_gimple_assign (loc->stmt) 1969 && gimple_assign_lhs_ptr (loc->stmt) == loc->ref) 1970 { 1971 gimple_stmt_iterator gsi = gsi_for_stmt (loc->stmt); 1972 gimple stmt = gimple_build_assign (flag, boolean_true_node); 1973 gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING); 1974 } 1975 return false; 1976 } 1977 1978 /* Helper function for execute_sm. On every location where REF is 1979 set, set an appropriate flag indicating the store. */ 1980 1981 static tree 1982 execute_sm_if_changed_flag_set (struct loop *loop, mem_ref_p ref) 1983 { 1984 tree flag; 1985 char *str = get_lsm_tmp_name (ref->mem.ref, ~0, "_flag"); 1986 flag = create_tmp_reg (boolean_type_node, str); 1987 for_all_locs_in_loop (loop, ref, sm_set_flag_if_changed (flag)); 1988 return flag; 1989 } 1990 1991 /* Executes store motion of memory reference REF from LOOP. 1992 Exits from the LOOP are stored in EXITS. The initialization of the 1993 temporary variable is put to the preheader of the loop, and assignments 1994 to the reference from the temporary variable are emitted to exits. */ 1995 1996 static void 1997 execute_sm (struct loop *loop, vec<edge> exits, mem_ref_p ref) 1998 { 1999 tree tmp_var, store_flag = NULL_TREE; 2000 unsigned i; 2001 gassign *load; 2002 struct fmt_data fmt_data; 2003 edge ex; 2004 struct lim_aux_data *lim_data; 2005 bool multi_threaded_model_p = false; 2006 gimple_stmt_iterator gsi; 2007 2008 if (dump_file && (dump_flags & TDF_DETAILS)) 2009 { 2010 fprintf (dump_file, "Executing store motion of "); 2011 print_generic_expr (dump_file, ref->mem.ref, 0); 2012 fprintf (dump_file, " from loop %d\n", loop->num); 2013 } 2014 2015 tmp_var = create_tmp_reg (TREE_TYPE (ref->mem.ref), 2016 get_lsm_tmp_name (ref->mem.ref, ~0)); 2017 2018 fmt_data.loop = loop; 2019 fmt_data.orig_loop = loop; 2020 for_each_index (&ref->mem.ref, force_move_till, &fmt_data); 2021 2022 if (bb_in_transaction (loop_preheader_edge (loop)->src) 2023 || !PARAM_VALUE (PARAM_ALLOW_STORE_DATA_RACES)) 2024 multi_threaded_model_p = true; 2025 2026 if (multi_threaded_model_p) 2027 store_flag = execute_sm_if_changed_flag_set (loop, ref); 2028 2029 rewrite_mem_refs (loop, ref, tmp_var); 2030 2031 /* Emit the load code on a random exit edge or into the latch if 2032 the loop does not exit, so that we are sure it will be processed 2033 by move_computations after all dependencies. */ 2034 gsi = gsi_for_stmt (first_mem_ref_loc (loop, ref)->stmt); 2035 2036 /* FIXME/TODO: For the multi-threaded variant, we could avoid this 2037 load altogether, since the store is predicated by a flag. We 2038 could, do the load only if it was originally in the loop. */ 2039 load = gimple_build_assign (tmp_var, unshare_expr (ref->mem.ref)); 2040 lim_data = init_lim_data (load); 2041 lim_data->max_loop = loop; 2042 lim_data->tgt_loop = loop; 2043 gsi_insert_before (&gsi, load, GSI_SAME_STMT); 2044 2045 if (multi_threaded_model_p) 2046 { 2047 load = gimple_build_assign (store_flag, boolean_false_node); 2048 lim_data = init_lim_data (load); 2049 lim_data->max_loop = loop; 2050 lim_data->tgt_loop = loop; 2051 gsi_insert_before (&gsi, load, GSI_SAME_STMT); 2052 } 2053 2054 /* Sink the store to every exit from the loop. */ 2055 FOR_EACH_VEC_ELT (exits, i, ex) 2056 if (!multi_threaded_model_p) 2057 { 2058 gassign *store; 2059 store = gimple_build_assign (unshare_expr (ref->mem.ref), tmp_var); 2060 gsi_insert_on_edge (ex, store); 2061 } 2062 else 2063 execute_sm_if_changed (ex, ref->mem.ref, tmp_var, store_flag); 2064 } 2065 2066 /* Hoists memory references MEM_REFS out of LOOP. EXITS is the list of exit 2067 edges of the LOOP. */ 2068 2069 static void 2070 hoist_memory_references (struct loop *loop, bitmap mem_refs, 2071 vec<edge> exits) 2072 { 2073 mem_ref_p ref; 2074 unsigned i; 2075 bitmap_iterator bi; 2076 2077 EXECUTE_IF_SET_IN_BITMAP (mem_refs, 0, i, bi) 2078 { 2079 ref = memory_accesses.refs_list[i]; 2080 execute_sm (loop, exits, ref); 2081 } 2082 } 2083 2084 struct ref_always_accessed 2085 { 2086 ref_always_accessed (struct loop *loop_, bool stored_p_) 2087 : loop (loop_), stored_p (stored_p_) {} 2088 bool operator () (mem_ref_loc_p loc); 2089 struct loop *loop; 2090 bool stored_p; 2091 }; 2092 2093 bool 2094 ref_always_accessed::operator () (mem_ref_loc_p loc) 2095 { 2096 struct loop *must_exec; 2097 2098 if (!get_lim_data (loc->stmt)) 2099 return false; 2100 2101 /* If we require an always executed store make sure the statement 2102 stores to the reference. */ 2103 if (stored_p) 2104 { 2105 tree lhs = gimple_get_lhs (loc->stmt); 2106 if (!lhs 2107 || lhs != *loc->ref) 2108 return false; 2109 } 2110 2111 must_exec = get_lim_data (loc->stmt)->always_executed_in; 2112 if (!must_exec) 2113 return false; 2114 2115 if (must_exec == loop 2116 || flow_loop_nested_p (must_exec, loop)) 2117 return true; 2118 2119 return false; 2120 } 2121 2122 /* Returns true if REF is always accessed in LOOP. If STORED_P is true 2123 make sure REF is always stored to in LOOP. */ 2124 2125 static bool 2126 ref_always_accessed_p (struct loop *loop, mem_ref_p ref, bool stored_p) 2127 { 2128 return for_all_locs_in_loop (loop, ref, 2129 ref_always_accessed (loop, stored_p)); 2130 } 2131 2132 /* Returns true if REF1 and REF2 are independent. */ 2133 2134 static bool 2135 refs_independent_p (mem_ref_p ref1, mem_ref_p ref2) 2136 { 2137 if (ref1 == ref2) 2138 return true; 2139 2140 if (dump_file && (dump_flags & TDF_DETAILS)) 2141 fprintf (dump_file, "Querying dependency of refs %u and %u: ", 2142 ref1->id, ref2->id); 2143 2144 if (mem_refs_may_alias_p (ref1, ref2, &memory_accesses.ttae_cache)) 2145 { 2146 if (dump_file && (dump_flags & TDF_DETAILS)) 2147 fprintf (dump_file, "dependent.\n"); 2148 return false; 2149 } 2150 else 2151 { 2152 if (dump_file && (dump_flags & TDF_DETAILS)) 2153 fprintf (dump_file, "independent.\n"); 2154 return true; 2155 } 2156 } 2157 2158 /* Mark REF dependent on stores or loads (according to STORED_P) in LOOP 2159 and its super-loops. */ 2160 2161 static void 2162 record_dep_loop (struct loop *loop, mem_ref_p ref, bool stored_p) 2163 { 2164 /* We can propagate dependent-in-loop bits up the loop 2165 hierarchy to all outer loops. */ 2166 while (loop != current_loops->tree_root 2167 && bitmap_set_bit (&ref->dep_loop, LOOP_DEP_BIT (loop->num, stored_p))) 2168 loop = loop_outer (loop); 2169 } 2170 2171 /* Returns true if REF is independent on all other memory references in 2172 LOOP. */ 2173 2174 static bool 2175 ref_indep_loop_p_1 (struct loop *loop, mem_ref_p ref, bool stored_p) 2176 { 2177 bitmap refs_to_check; 2178 unsigned i; 2179 bitmap_iterator bi; 2180 mem_ref_p aref; 2181 2182 if (stored_p) 2183 refs_to_check = &memory_accesses.refs_in_loop[loop->num]; 2184 else 2185 refs_to_check = &memory_accesses.refs_stored_in_loop[loop->num]; 2186 2187 if (bitmap_bit_p (refs_to_check, UNANALYZABLE_MEM_ID)) 2188 return false; 2189 2190 EXECUTE_IF_SET_IN_BITMAP (refs_to_check, 0, i, bi) 2191 { 2192 aref = memory_accesses.refs_list[i]; 2193 if (!refs_independent_p (ref, aref)) 2194 return false; 2195 } 2196 2197 return true; 2198 } 2199 2200 /* Returns true if REF is independent on all other memory references in 2201 LOOP. Wrapper over ref_indep_loop_p_1, caching its results. */ 2202 2203 static bool 2204 ref_indep_loop_p_2 (struct loop *loop, mem_ref_p ref, bool stored_p) 2205 { 2206 stored_p |= (ref->stored && bitmap_bit_p (ref->stored, loop->num)); 2207 2208 if (bitmap_bit_p (&ref->indep_loop, LOOP_DEP_BIT (loop->num, stored_p))) 2209 return true; 2210 if (bitmap_bit_p (&ref->dep_loop, LOOP_DEP_BIT (loop->num, stored_p))) 2211 return false; 2212 2213 struct loop *inner = loop->inner; 2214 while (inner) 2215 { 2216 if (!ref_indep_loop_p_2 (inner, ref, stored_p)) 2217 return false; 2218 inner = inner->next; 2219 } 2220 2221 bool indep_p = ref_indep_loop_p_1 (loop, ref, stored_p); 2222 2223 if (dump_file && (dump_flags & TDF_DETAILS)) 2224 fprintf (dump_file, "Querying dependencies of ref %u in loop %d: %s\n", 2225 ref->id, loop->num, indep_p ? "independent" : "dependent"); 2226 2227 /* Record the computed result in the cache. */ 2228 if (indep_p) 2229 { 2230 if (bitmap_set_bit (&ref->indep_loop, LOOP_DEP_BIT (loop->num, stored_p)) 2231 && stored_p) 2232 { 2233 /* If it's independend against all refs then it's independent 2234 against stores, too. */ 2235 bitmap_set_bit (&ref->indep_loop, LOOP_DEP_BIT (loop->num, false)); 2236 } 2237 } 2238 else 2239 { 2240 record_dep_loop (loop, ref, stored_p); 2241 if (!stored_p) 2242 { 2243 /* If it's dependent against stores it's dependent against 2244 all refs, too. */ 2245 record_dep_loop (loop, ref, true); 2246 } 2247 } 2248 2249 return indep_p; 2250 } 2251 2252 /* Returns true if REF is independent on all other memory references in 2253 LOOP. */ 2254 2255 static bool 2256 ref_indep_loop_p (struct loop *loop, mem_ref_p ref) 2257 { 2258 gcc_checking_assert (MEM_ANALYZABLE (ref)); 2259 2260 return ref_indep_loop_p_2 (loop, ref, false); 2261 } 2262 2263 /* Returns true if we can perform store motion of REF from LOOP. */ 2264 2265 static bool 2266 can_sm_ref_p (struct loop *loop, mem_ref_p ref) 2267 { 2268 tree base; 2269 2270 /* Can't hoist unanalyzable refs. */ 2271 if (!MEM_ANALYZABLE (ref)) 2272 return false; 2273 2274 /* It should be movable. */ 2275 if (!is_gimple_reg_type (TREE_TYPE (ref->mem.ref)) 2276 || TREE_THIS_VOLATILE (ref->mem.ref) 2277 || !for_each_index (&ref->mem.ref, may_move_till, loop)) 2278 return false; 2279 2280 /* If it can throw fail, we do not properly update EH info. */ 2281 if (tree_could_throw_p (ref->mem.ref)) 2282 return false; 2283 2284 /* If it can trap, it must be always executed in LOOP. 2285 Readonly memory locations may trap when storing to them, but 2286 tree_could_trap_p is a predicate for rvalues, so check that 2287 explicitly. */ 2288 base = get_base_address (ref->mem.ref); 2289 if ((tree_could_trap_p (ref->mem.ref) 2290 || (DECL_P (base) && TREE_READONLY (base))) 2291 && !ref_always_accessed_p (loop, ref, true)) 2292 return false; 2293 2294 /* And it must be independent on all other memory references 2295 in LOOP. */ 2296 if (!ref_indep_loop_p (loop, ref)) 2297 return false; 2298 2299 return true; 2300 } 2301 2302 /* Marks the references in LOOP for that store motion should be performed 2303 in REFS_TO_SM. SM_EXECUTED is the set of references for that store 2304 motion was performed in one of the outer loops. */ 2305 2306 static void 2307 find_refs_for_sm (struct loop *loop, bitmap sm_executed, bitmap refs_to_sm) 2308 { 2309 bitmap refs = &memory_accesses.all_refs_stored_in_loop[loop->num]; 2310 unsigned i; 2311 bitmap_iterator bi; 2312 mem_ref_p ref; 2313 2314 EXECUTE_IF_AND_COMPL_IN_BITMAP (refs, sm_executed, 0, i, bi) 2315 { 2316 ref = memory_accesses.refs_list[i]; 2317 if (can_sm_ref_p (loop, ref)) 2318 bitmap_set_bit (refs_to_sm, i); 2319 } 2320 } 2321 2322 /* Checks whether LOOP (with exits stored in EXITS array) is suitable 2323 for a store motion optimization (i.e. whether we can insert statement 2324 on its exits). */ 2325 2326 static bool 2327 loop_suitable_for_sm (struct loop *loop ATTRIBUTE_UNUSED, 2328 vec<edge> exits) 2329 { 2330 unsigned i; 2331 edge ex; 2332 2333 FOR_EACH_VEC_ELT (exits, i, ex) 2334 if (ex->flags & (EDGE_ABNORMAL | EDGE_EH)) 2335 return false; 2336 2337 return true; 2338 } 2339 2340 /* Try to perform store motion for all memory references modified inside 2341 LOOP. SM_EXECUTED is the bitmap of the memory references for that 2342 store motion was executed in one of the outer loops. */ 2343 2344 static void 2345 store_motion_loop (struct loop *loop, bitmap sm_executed) 2346 { 2347 vec<edge> exits = get_loop_exit_edges (loop); 2348 struct loop *subloop; 2349 bitmap sm_in_loop = BITMAP_ALLOC (&lim_bitmap_obstack); 2350 2351 if (loop_suitable_for_sm (loop, exits)) 2352 { 2353 find_refs_for_sm (loop, sm_executed, sm_in_loop); 2354 hoist_memory_references (loop, sm_in_loop, exits); 2355 } 2356 exits.release (); 2357 2358 bitmap_ior_into (sm_executed, sm_in_loop); 2359 for (subloop = loop->inner; subloop != NULL; subloop = subloop->next) 2360 store_motion_loop (subloop, sm_executed); 2361 bitmap_and_compl_into (sm_executed, sm_in_loop); 2362 BITMAP_FREE (sm_in_loop); 2363 } 2364 2365 /* Try to perform store motion for all memory references modified inside 2366 loops. */ 2367 2368 static void 2369 store_motion (void) 2370 { 2371 struct loop *loop; 2372 bitmap sm_executed = BITMAP_ALLOC (&lim_bitmap_obstack); 2373 2374 for (loop = current_loops->tree_root->inner; loop != NULL; loop = loop->next) 2375 store_motion_loop (loop, sm_executed); 2376 2377 BITMAP_FREE (sm_executed); 2378 gsi_commit_edge_inserts (); 2379 } 2380 2381 /* Fills ALWAYS_EXECUTED_IN information for basic blocks of LOOP, i.e. 2382 for each such basic block bb records the outermost loop for that execution 2383 of its header implies execution of bb. CONTAINS_CALL is the bitmap of 2384 blocks that contain a nonpure call. */ 2385 2386 static void 2387 fill_always_executed_in_1 (struct loop *loop, sbitmap contains_call) 2388 { 2389 basic_block bb = NULL, *bbs, last = NULL; 2390 unsigned i; 2391 edge e; 2392 struct loop *inn_loop = loop; 2393 2394 if (ALWAYS_EXECUTED_IN (loop->header) == NULL) 2395 { 2396 bbs = get_loop_body_in_dom_order (loop); 2397 2398 for (i = 0; i < loop->num_nodes; i++) 2399 { 2400 edge_iterator ei; 2401 bb = bbs[i]; 2402 2403 if (dominated_by_p (CDI_DOMINATORS, loop->latch, bb)) 2404 last = bb; 2405 2406 if (bitmap_bit_p (contains_call, bb->index)) 2407 break; 2408 2409 FOR_EACH_EDGE (e, ei, bb->succs) 2410 { 2411 /* If there is an exit from this BB. */ 2412 if (!flow_bb_inside_loop_p (loop, e->dest)) 2413 break; 2414 /* Or we enter a possibly non-finite loop. */ 2415 if (flow_loop_nested_p (bb->loop_father, 2416 e->dest->loop_father) 2417 && ! finite_loop_p (e->dest->loop_father)) 2418 break; 2419 } 2420 if (e) 2421 break; 2422 2423 /* A loop might be infinite (TODO use simple loop analysis 2424 to disprove this if possible). */ 2425 if (bb->flags & BB_IRREDUCIBLE_LOOP) 2426 break; 2427 2428 if (!flow_bb_inside_loop_p (inn_loop, bb)) 2429 break; 2430 2431 if (bb->loop_father->header == bb) 2432 { 2433 if (!dominated_by_p (CDI_DOMINATORS, loop->latch, bb)) 2434 break; 2435 2436 /* In a loop that is always entered we may proceed anyway. 2437 But record that we entered it and stop once we leave it. */ 2438 inn_loop = bb->loop_father; 2439 } 2440 } 2441 2442 while (1) 2443 { 2444 SET_ALWAYS_EXECUTED_IN (last, loop); 2445 if (last == loop->header) 2446 break; 2447 last = get_immediate_dominator (CDI_DOMINATORS, last); 2448 } 2449 2450 free (bbs); 2451 } 2452 2453 for (loop = loop->inner; loop; loop = loop->next) 2454 fill_always_executed_in_1 (loop, contains_call); 2455 } 2456 2457 /* Fills ALWAYS_EXECUTED_IN information for basic blocks, i.e. 2458 for each such basic block bb records the outermost loop for that execution 2459 of its header implies execution of bb. */ 2460 2461 static void 2462 fill_always_executed_in (void) 2463 { 2464 sbitmap contains_call = sbitmap_alloc (last_basic_block_for_fn (cfun)); 2465 basic_block bb; 2466 struct loop *loop; 2467 2468 bitmap_clear (contains_call); 2469 FOR_EACH_BB_FN (bb, cfun) 2470 { 2471 gimple_stmt_iterator gsi; 2472 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) 2473 { 2474 if (nonpure_call_p (gsi_stmt (gsi))) 2475 break; 2476 } 2477 2478 if (!gsi_end_p (gsi)) 2479 bitmap_set_bit (contains_call, bb->index); 2480 } 2481 2482 for (loop = current_loops->tree_root->inner; loop; loop = loop->next) 2483 fill_always_executed_in_1 (loop, contains_call); 2484 2485 sbitmap_free (contains_call); 2486 } 2487 2488 2489 /* Compute the global information needed by the loop invariant motion pass. */ 2490 2491 static void 2492 tree_ssa_lim_initialize (void) 2493 { 2494 struct loop *loop; 2495 unsigned i; 2496 2497 bitmap_obstack_initialize (&lim_bitmap_obstack); 2498 gcc_obstack_init (&mem_ref_obstack); 2499 lim_aux_data_map = new hash_map<gimple, lim_aux_data *>; 2500 2501 if (flag_tm) 2502 compute_transaction_bits (); 2503 2504 alloc_aux_for_edges (0); 2505 2506 memory_accesses.refs = new hash_table<mem_ref_hasher> (100); 2507 memory_accesses.refs_list.create (100); 2508 /* Allocate a special, unanalyzable mem-ref with ID zero. */ 2509 memory_accesses.refs_list.quick_push 2510 (mem_ref_alloc (error_mark_node, 0, UNANALYZABLE_MEM_ID)); 2511 2512 memory_accesses.refs_in_loop.create (number_of_loops (cfun)); 2513 memory_accesses.refs_in_loop.quick_grow (number_of_loops (cfun)); 2514 memory_accesses.refs_stored_in_loop.create (number_of_loops (cfun)); 2515 memory_accesses.refs_stored_in_loop.quick_grow (number_of_loops (cfun)); 2516 memory_accesses.all_refs_stored_in_loop.create (number_of_loops (cfun)); 2517 memory_accesses.all_refs_stored_in_loop.quick_grow (number_of_loops (cfun)); 2518 2519 for (i = 0; i < number_of_loops (cfun); i++) 2520 { 2521 bitmap_initialize (&memory_accesses.refs_in_loop[i], 2522 &lim_bitmap_obstack); 2523 bitmap_initialize (&memory_accesses.refs_stored_in_loop[i], 2524 &lim_bitmap_obstack); 2525 bitmap_initialize (&memory_accesses.all_refs_stored_in_loop[i], 2526 &lim_bitmap_obstack); 2527 } 2528 2529 memory_accesses.ttae_cache = NULL; 2530 2531 /* Initialize bb_loop_postorder with a mapping from loop->num to 2532 its postorder index. */ 2533 i = 0; 2534 bb_loop_postorder = XNEWVEC (unsigned, number_of_loops (cfun)); 2535 FOR_EACH_LOOP (loop, LI_FROM_INNERMOST) 2536 bb_loop_postorder[loop->num] = i++; 2537 } 2538 2539 /* Cleans up after the invariant motion pass. */ 2540 2541 static void 2542 tree_ssa_lim_finalize (void) 2543 { 2544 basic_block bb; 2545 unsigned i; 2546 mem_ref_p ref; 2547 2548 free_aux_for_edges (); 2549 2550 FOR_EACH_BB_FN (bb, cfun) 2551 SET_ALWAYS_EXECUTED_IN (bb, NULL); 2552 2553 bitmap_obstack_release (&lim_bitmap_obstack); 2554 delete lim_aux_data_map; 2555 2556 delete memory_accesses.refs; 2557 memory_accesses.refs = NULL; 2558 2559 FOR_EACH_VEC_ELT (memory_accesses.refs_list, i, ref) 2560 memref_free (ref); 2561 memory_accesses.refs_list.release (); 2562 obstack_free (&mem_ref_obstack, NULL); 2563 2564 memory_accesses.refs_in_loop.release (); 2565 memory_accesses.refs_stored_in_loop.release (); 2566 memory_accesses.all_refs_stored_in_loop.release (); 2567 2568 if (memory_accesses.ttae_cache) 2569 free_affine_expand_cache (&memory_accesses.ttae_cache); 2570 2571 free (bb_loop_postorder); 2572 } 2573 2574 /* Moves invariants from loops. Only "expensive" invariants are moved out -- 2575 i.e. those that are likely to be win regardless of the register pressure. */ 2576 2577 unsigned int 2578 tree_ssa_lim (void) 2579 { 2580 unsigned int todo; 2581 2582 tree_ssa_lim_initialize (); 2583 2584 /* Gathers information about memory accesses in the loops. */ 2585 analyze_memory_references (); 2586 2587 /* Fills ALWAYS_EXECUTED_IN information for basic blocks. */ 2588 fill_always_executed_in (); 2589 2590 /* For each statement determine the outermost loop in that it is 2591 invariant and cost for computing the invariant. */ 2592 invariantness_dom_walker (CDI_DOMINATORS) 2593 .walk (cfun->cfg->x_entry_block_ptr); 2594 2595 /* Execute store motion. Force the necessary invariants to be moved 2596 out of the loops as well. */ 2597 store_motion (); 2598 2599 /* Move the expressions that are expensive enough. */ 2600 todo = move_computations (); 2601 2602 tree_ssa_lim_finalize (); 2603 2604 return todo; 2605 } 2606 2607 /* Loop invariant motion pass. */ 2608 2609 namespace { 2610 2611 const pass_data pass_data_lim = 2612 { 2613 GIMPLE_PASS, /* type */ 2614 "lim", /* name */ 2615 OPTGROUP_LOOP, /* optinfo_flags */ 2616 TV_LIM, /* tv_id */ 2617 PROP_cfg, /* properties_required */ 2618 0, /* properties_provided */ 2619 0, /* properties_destroyed */ 2620 0, /* todo_flags_start */ 2621 0, /* todo_flags_finish */ 2622 }; 2623 2624 class pass_lim : public gimple_opt_pass 2625 { 2626 public: 2627 pass_lim (gcc::context *ctxt) 2628 : gimple_opt_pass (pass_data_lim, ctxt) 2629 {} 2630 2631 /* opt_pass methods: */ 2632 opt_pass * clone () { return new pass_lim (m_ctxt); } 2633 virtual bool gate (function *) { return flag_tree_loop_im != 0; } 2634 virtual unsigned int execute (function *); 2635 2636 }; // class pass_lim 2637 2638 unsigned int 2639 pass_lim::execute (function *fun) 2640 { 2641 if (number_of_loops (fun) <= 1) 2642 return 0; 2643 2644 return tree_ssa_lim (); 2645 } 2646 2647 } // anon namespace 2648 2649 gimple_opt_pass * 2650 make_pass_lim (gcc::context *ctxt) 2651 { 2652 return new pass_lim (ctxt); 2653 } 2654 2655 2656