tree-if-conv.c revision 1.10
1/* If-conversion for vectorizer. 2 Copyright (C) 2004-2019 Free Software Foundation, Inc. 3 Contributed by Devang Patel <dpatel@apple.com> 4 5This file is part of GCC. 6 7GCC is free software; you can redistribute it and/or modify it under 8the terms of the GNU General Public License as published by the Free 9Software Foundation; either version 3, or (at your option) any later 10version. 11 12GCC is distributed in the hope that it will be useful, but WITHOUT ANY 13WARRANTY; without even the implied warranty of MERCHANTABILITY or 14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15for more details. 16 17You should have received a copy of the GNU General Public License 18along with GCC; see the file COPYING3. If not see 19<http://www.gnu.org/licenses/>. */ 20 21/* This pass implements a tree level if-conversion of loops. Its 22 initial goal is to help the vectorizer to vectorize loops with 23 conditions. 24 25 A short description of if-conversion: 26 27 o Decide if a loop is if-convertible or not. 28 o Walk all loop basic blocks in breadth first order (BFS order). 29 o Remove conditional statements (at the end of basic block) 30 and propagate condition into destination basic blocks' 31 predicate list. 32 o Replace modify expression with conditional modify expression 33 using current basic block's condition. 34 o Merge all basic blocks 35 o Replace phi nodes with conditional modify expr 36 o Merge all basic blocks into header 37 38 Sample transformation: 39 40 INPUT 41 ----- 42 43 # i_23 = PHI <0(0), i_18(10)>; 44 <L0>:; 45 j_15 = A[i_23]; 46 if (j_15 > 41) goto <L1>; else goto <L17>; 47 48 <L17>:; 49 goto <bb 3> (<L3>); 50 51 <L1>:; 52 53 # iftmp.2_4 = PHI <0(8), 42(2)>; 54 <L3>:; 55 A[i_23] = iftmp.2_4; 56 i_18 = i_23 + 1; 57 if (i_18 <= 15) goto <L19>; else goto <L18>; 58 59 <L19>:; 60 goto <bb 1> (<L0>); 61 62 <L18>:; 63 64 OUTPUT 65 ------ 66 67 # i_23 = PHI <0(0), i_18(10)>; 68 <L0>:; 69 j_15 = A[i_23]; 70 71 <L3>:; 72 iftmp.2_4 = j_15 > 41 ? 42 : 0; 73 A[i_23] = iftmp.2_4; 74 i_18 = i_23 + 1; 75 if (i_18 <= 15) goto <L19>; else goto <L18>; 76 77 <L19>:; 78 goto <bb 1> (<L0>); 79 80 <L18>:; 81*/ 82 83#include "config.h" 84#include "system.h" 85#include "coretypes.h" 86#include "backend.h" 87#include "rtl.h" 88#include "tree.h" 89#include "gimple.h" 90#include "cfghooks.h" 91#include "tree-pass.h" 92#include "ssa.h" 93#include "expmed.h" 94#include "optabs-query.h" 95#include "gimple-pretty-print.h" 96#include "alias.h" 97#include "fold-const.h" 98#include "stor-layout.h" 99#include "gimple-fold.h" 100#include "gimplify.h" 101#include "gimple-iterator.h" 102#include "gimplify-me.h" 103#include "tree-cfg.h" 104#include "tree-into-ssa.h" 105#include "tree-ssa.h" 106#include "cfgloop.h" 107#include "tree-data-ref.h" 108#include "tree-scalar-evolution.h" 109#include "tree-ssa-loop.h" 110#include "tree-ssa-loop-niter.h" 111#include "tree-ssa-loop-ivopts.h" 112#include "tree-ssa-address.h" 113#include "dbgcnt.h" 114#include "tree-hash-traits.h" 115#include "varasm.h" 116#include "builtins.h" 117#include "params.h" 118#include "cfganal.h" 119#include "internal-fn.h" 120#include "fold-const.h" 121#include "tree-ssa-sccvn.h" 122#include "tree-cfgcleanup.h" 123 124/* Only handle PHIs with no more arguments unless we are asked to by 125 simd pragma. */ 126#define MAX_PHI_ARG_NUM \ 127 ((unsigned) PARAM_VALUE (PARAM_MAX_TREE_IF_CONVERSION_PHI_ARGS)) 128 129/* True if we've converted a statement that was only executed when some 130 condition C was true, and if for correctness we need to predicate the 131 statement to ensure that it is a no-op when C is false. See 132 predicate_statements for the kinds of predication we support. */ 133static bool need_to_predicate; 134 135/* Indicate if there are any complicated PHIs that need to be handled in 136 if-conversion. Complicated PHI has more than two arguments and can't 137 be degenerated to two arguments PHI. See more information in comment 138 before phi_convertible_by_degenerating_args. */ 139static bool any_complicated_phi; 140 141/* Hash for struct innermost_loop_behavior. It depends on the user to 142 free the memory. */ 143 144struct innermost_loop_behavior_hash : nofree_ptr_hash <innermost_loop_behavior> 145{ 146 static inline hashval_t hash (const value_type &); 147 static inline bool equal (const value_type &, 148 const compare_type &); 149}; 150 151inline hashval_t 152innermost_loop_behavior_hash::hash (const value_type &e) 153{ 154 hashval_t hash; 155 156 hash = iterative_hash_expr (e->base_address, 0); 157 hash = iterative_hash_expr (e->offset, hash); 158 hash = iterative_hash_expr (e->init, hash); 159 return iterative_hash_expr (e->step, hash); 160} 161 162inline bool 163innermost_loop_behavior_hash::equal (const value_type &e1, 164 const compare_type &e2) 165{ 166 if ((e1->base_address && !e2->base_address) 167 || (!e1->base_address && e2->base_address) 168 || (!e1->offset && e2->offset) 169 || (e1->offset && !e2->offset) 170 || (!e1->init && e2->init) 171 || (e1->init && !e2->init) 172 || (!e1->step && e2->step) 173 || (e1->step && !e2->step)) 174 return false; 175 176 if (e1->base_address && e2->base_address 177 && !operand_equal_p (e1->base_address, e2->base_address, 0)) 178 return false; 179 if (e1->offset && e2->offset 180 && !operand_equal_p (e1->offset, e2->offset, 0)) 181 return false; 182 if (e1->init && e2->init 183 && !operand_equal_p (e1->init, e2->init, 0)) 184 return false; 185 if (e1->step && e2->step 186 && !operand_equal_p (e1->step, e2->step, 0)) 187 return false; 188 189 return true; 190} 191 192/* List of basic blocks in if-conversion-suitable order. */ 193static basic_block *ifc_bbs; 194 195/* Hash table to store <DR's innermost loop behavior, DR> pairs. */ 196static hash_map<innermost_loop_behavior_hash, 197 data_reference_p> *innermost_DR_map; 198 199/* Hash table to store <base reference, DR> pairs. */ 200static hash_map<tree_operand_hash, data_reference_p> *baseref_DR_map; 201 202/* List of redundant SSA names: the first should be replaced by the second. */ 203static vec< std::pair<tree, tree> > redundant_ssa_names; 204 205/* Structure used to predicate basic blocks. This is attached to the 206 ->aux field of the BBs in the loop to be if-converted. */ 207struct bb_predicate { 208 209 /* The condition under which this basic block is executed. */ 210 tree predicate; 211 212 /* PREDICATE is gimplified, and the sequence of statements is 213 recorded here, in order to avoid the duplication of computations 214 that occur in previous conditions. See PR44483. */ 215 gimple_seq predicate_gimplified_stmts; 216}; 217 218/* Returns true when the basic block BB has a predicate. */ 219 220static inline bool 221bb_has_predicate (basic_block bb) 222{ 223 return bb->aux != NULL; 224} 225 226/* Returns the gimplified predicate for basic block BB. */ 227 228static inline tree 229bb_predicate (basic_block bb) 230{ 231 return ((struct bb_predicate *) bb->aux)->predicate; 232} 233 234/* Sets the gimplified predicate COND for basic block BB. */ 235 236static inline void 237set_bb_predicate (basic_block bb, tree cond) 238{ 239 gcc_assert ((TREE_CODE (cond) == TRUTH_NOT_EXPR 240 && is_gimple_condexpr (TREE_OPERAND (cond, 0))) 241 || is_gimple_condexpr (cond)); 242 ((struct bb_predicate *) bb->aux)->predicate = cond; 243} 244 245/* Returns the sequence of statements of the gimplification of the 246 predicate for basic block BB. */ 247 248static inline gimple_seq 249bb_predicate_gimplified_stmts (basic_block bb) 250{ 251 return ((struct bb_predicate *) bb->aux)->predicate_gimplified_stmts; 252} 253 254/* Sets the sequence of statements STMTS of the gimplification of the 255 predicate for basic block BB. */ 256 257static inline void 258set_bb_predicate_gimplified_stmts (basic_block bb, gimple_seq stmts) 259{ 260 ((struct bb_predicate *) bb->aux)->predicate_gimplified_stmts = stmts; 261} 262 263/* Adds the sequence of statements STMTS to the sequence of statements 264 of the predicate for basic block BB. */ 265 266static inline void 267add_bb_predicate_gimplified_stmts (basic_block bb, gimple_seq stmts) 268{ 269 /* We might have updated some stmts in STMTS via force_gimple_operand 270 calling fold_stmt and that producing multiple stmts. Delink immediate 271 uses so update_ssa after loop versioning doesn't get confused for 272 the not yet inserted predicates. 273 ??? This should go away once we reliably avoid updating stmts 274 not in any BB. */ 275 for (gimple_stmt_iterator gsi = gsi_start (stmts); 276 !gsi_end_p (gsi); gsi_next (&gsi)) 277 { 278 gimple *stmt = gsi_stmt (gsi); 279 delink_stmt_imm_use (stmt); 280 gimple_set_modified (stmt, true); 281 } 282 gimple_seq_add_seq_without_update 283 (&(((struct bb_predicate *) bb->aux)->predicate_gimplified_stmts), stmts); 284} 285 286/* Initializes to TRUE the predicate of basic block BB. */ 287 288static inline void 289init_bb_predicate (basic_block bb) 290{ 291 bb->aux = XNEW (struct bb_predicate); 292 set_bb_predicate_gimplified_stmts (bb, NULL); 293 set_bb_predicate (bb, boolean_true_node); 294} 295 296/* Release the SSA_NAMEs associated with the predicate of basic block BB. */ 297 298static inline void 299release_bb_predicate (basic_block bb) 300{ 301 gimple_seq stmts = bb_predicate_gimplified_stmts (bb); 302 if (stmts) 303 { 304 /* Ensure that these stmts haven't yet been added to a bb. */ 305 if (flag_checking) 306 for (gimple_stmt_iterator i = gsi_start (stmts); 307 !gsi_end_p (i); gsi_next (&i)) 308 gcc_assert (! gimple_bb (gsi_stmt (i))); 309 310 /* Discard them. */ 311 gimple_seq_discard (stmts); 312 set_bb_predicate_gimplified_stmts (bb, NULL); 313 } 314} 315 316/* Free the predicate of basic block BB. */ 317 318static inline void 319free_bb_predicate (basic_block bb) 320{ 321 if (!bb_has_predicate (bb)) 322 return; 323 324 release_bb_predicate (bb); 325 free (bb->aux); 326 bb->aux = NULL; 327} 328 329/* Reinitialize predicate of BB with the true predicate. */ 330 331static inline void 332reset_bb_predicate (basic_block bb) 333{ 334 if (!bb_has_predicate (bb)) 335 init_bb_predicate (bb); 336 else 337 { 338 release_bb_predicate (bb); 339 set_bb_predicate (bb, boolean_true_node); 340 } 341} 342 343/* Returns a new SSA_NAME of type TYPE that is assigned the value of 344 the expression EXPR. Inserts the statement created for this 345 computation before GSI and leaves the iterator GSI at the same 346 statement. */ 347 348static tree 349ifc_temp_var (tree type, tree expr, gimple_stmt_iterator *gsi) 350{ 351 tree new_name = make_temp_ssa_name (type, NULL, "_ifc_"); 352 gimple *stmt = gimple_build_assign (new_name, expr); 353 gimple_set_vuse (stmt, gimple_vuse (gsi_stmt (*gsi))); 354 gsi_insert_before (gsi, stmt, GSI_SAME_STMT); 355 return new_name; 356} 357 358/* Return true when COND is a false predicate. */ 359 360static inline bool 361is_false_predicate (tree cond) 362{ 363 return (cond != NULL_TREE 364 && (cond == boolean_false_node 365 || integer_zerop (cond))); 366} 367 368/* Return true when COND is a true predicate. */ 369 370static inline bool 371is_true_predicate (tree cond) 372{ 373 return (cond == NULL_TREE 374 || cond == boolean_true_node 375 || integer_onep (cond)); 376} 377 378/* Returns true when BB has a predicate that is not trivial: true or 379 NULL_TREE. */ 380 381static inline bool 382is_predicated (basic_block bb) 383{ 384 return !is_true_predicate (bb_predicate (bb)); 385} 386 387/* Parses the predicate COND and returns its comparison code and 388 operands OP0 and OP1. */ 389 390static enum tree_code 391parse_predicate (tree cond, tree *op0, tree *op1) 392{ 393 gimple *s; 394 395 if (TREE_CODE (cond) == SSA_NAME 396 && is_gimple_assign (s = SSA_NAME_DEF_STMT (cond))) 397 { 398 if (TREE_CODE_CLASS (gimple_assign_rhs_code (s)) == tcc_comparison) 399 { 400 *op0 = gimple_assign_rhs1 (s); 401 *op1 = gimple_assign_rhs2 (s); 402 return gimple_assign_rhs_code (s); 403 } 404 405 else if (gimple_assign_rhs_code (s) == TRUTH_NOT_EXPR) 406 { 407 tree op = gimple_assign_rhs1 (s); 408 tree type = TREE_TYPE (op); 409 enum tree_code code = parse_predicate (op, op0, op1); 410 411 return code == ERROR_MARK ? ERROR_MARK 412 : invert_tree_comparison (code, HONOR_NANS (type)); 413 } 414 415 return ERROR_MARK; 416 } 417 418 if (COMPARISON_CLASS_P (cond)) 419 { 420 *op0 = TREE_OPERAND (cond, 0); 421 *op1 = TREE_OPERAND (cond, 1); 422 return TREE_CODE (cond); 423 } 424 425 return ERROR_MARK; 426} 427 428/* Returns the fold of predicate C1 OR C2 at location LOC. */ 429 430static tree 431fold_or_predicates (location_t loc, tree c1, tree c2) 432{ 433 tree op1a, op1b, op2a, op2b; 434 enum tree_code code1 = parse_predicate (c1, &op1a, &op1b); 435 enum tree_code code2 = parse_predicate (c2, &op2a, &op2b); 436 437 if (code1 != ERROR_MARK && code2 != ERROR_MARK) 438 { 439 tree t = maybe_fold_or_comparisons (code1, op1a, op1b, 440 code2, op2a, op2b); 441 if (t) 442 return t; 443 } 444 445 return fold_build2_loc (loc, TRUTH_OR_EXPR, boolean_type_node, c1, c2); 446} 447 448/* Returns either a COND_EXPR or the folded expression if the folded 449 expression is a MIN_EXPR, a MAX_EXPR, an ABS_EXPR, 450 a constant or a SSA_NAME. */ 451 452static tree 453fold_build_cond_expr (tree type, tree cond, tree rhs, tree lhs) 454{ 455 tree rhs1, lhs1, cond_expr; 456 457 /* If COND is comparison r != 0 and r has boolean type, convert COND 458 to SSA_NAME to accept by vect bool pattern. */ 459 if (TREE_CODE (cond) == NE_EXPR) 460 { 461 tree op0 = TREE_OPERAND (cond, 0); 462 tree op1 = TREE_OPERAND (cond, 1); 463 if (TREE_CODE (op0) == SSA_NAME 464 && TREE_CODE (TREE_TYPE (op0)) == BOOLEAN_TYPE 465 && (integer_zerop (op1))) 466 cond = op0; 467 } 468 cond_expr = fold_ternary (COND_EXPR, type, cond, rhs, lhs); 469 470 if (cond_expr == NULL_TREE) 471 return build3 (COND_EXPR, type, cond, rhs, lhs); 472 473 STRIP_USELESS_TYPE_CONVERSION (cond_expr); 474 475 if (is_gimple_val (cond_expr)) 476 return cond_expr; 477 478 if (TREE_CODE (cond_expr) == ABS_EXPR) 479 { 480 rhs1 = TREE_OPERAND (cond_expr, 1); 481 STRIP_USELESS_TYPE_CONVERSION (rhs1); 482 if (is_gimple_val (rhs1)) 483 return build1 (ABS_EXPR, type, rhs1); 484 } 485 486 if (TREE_CODE (cond_expr) == MIN_EXPR 487 || TREE_CODE (cond_expr) == MAX_EXPR) 488 { 489 lhs1 = TREE_OPERAND (cond_expr, 0); 490 STRIP_USELESS_TYPE_CONVERSION (lhs1); 491 rhs1 = TREE_OPERAND (cond_expr, 1); 492 STRIP_USELESS_TYPE_CONVERSION (rhs1); 493 if (is_gimple_val (rhs1) && is_gimple_val (lhs1)) 494 return build2 (TREE_CODE (cond_expr), type, lhs1, rhs1); 495 } 496 return build3 (COND_EXPR, type, cond, rhs, lhs); 497} 498 499/* Add condition NC to the predicate list of basic block BB. LOOP is 500 the loop to be if-converted. Use predicate of cd-equivalent block 501 for join bb if it exists: we call basic blocks bb1 and bb2 502 cd-equivalent if they are executed under the same condition. */ 503 504static inline void 505add_to_predicate_list (struct loop *loop, basic_block bb, tree nc) 506{ 507 tree bc, *tp; 508 basic_block dom_bb; 509 510 if (is_true_predicate (nc)) 511 return; 512 513 /* If dominance tells us this basic block is always executed, 514 don't record any predicates for it. */ 515 if (dominated_by_p (CDI_DOMINATORS, loop->latch, bb)) 516 return; 517 518 dom_bb = get_immediate_dominator (CDI_DOMINATORS, bb); 519 /* We use notion of cd equivalence to get simpler predicate for 520 join block, e.g. if join block has 2 predecessors with predicates 521 p1 & p2 and p1 & !p2, we'd like to get p1 for it instead of 522 p1 & p2 | p1 & !p2. */ 523 if (dom_bb != loop->header 524 && get_immediate_dominator (CDI_POST_DOMINATORS, dom_bb) == bb) 525 { 526 gcc_assert (flow_bb_inside_loop_p (loop, dom_bb)); 527 bc = bb_predicate (dom_bb); 528 if (!is_true_predicate (bc)) 529 set_bb_predicate (bb, bc); 530 else 531 gcc_assert (is_true_predicate (bb_predicate (bb))); 532 if (dump_file && (dump_flags & TDF_DETAILS)) 533 fprintf (dump_file, "Use predicate of bb#%d for bb#%d\n", 534 dom_bb->index, bb->index); 535 return; 536 } 537 538 if (!is_predicated (bb)) 539 bc = nc; 540 else 541 { 542 bc = bb_predicate (bb); 543 bc = fold_or_predicates (EXPR_LOCATION (bc), nc, bc); 544 if (is_true_predicate (bc)) 545 { 546 reset_bb_predicate (bb); 547 return; 548 } 549 } 550 551 /* Allow a TRUTH_NOT_EXPR around the main predicate. */ 552 if (TREE_CODE (bc) == TRUTH_NOT_EXPR) 553 tp = &TREE_OPERAND (bc, 0); 554 else 555 tp = &bc; 556 if (!is_gimple_condexpr (*tp)) 557 { 558 gimple_seq stmts; 559 *tp = force_gimple_operand_1 (*tp, &stmts, is_gimple_condexpr, NULL_TREE); 560 add_bb_predicate_gimplified_stmts (bb, stmts); 561 } 562 set_bb_predicate (bb, bc); 563} 564 565/* Add the condition COND to the previous condition PREV_COND, and add 566 this to the predicate list of the destination of edge E. LOOP is 567 the loop to be if-converted. */ 568 569static void 570add_to_dst_predicate_list (struct loop *loop, edge e, 571 tree prev_cond, tree cond) 572{ 573 if (!flow_bb_inside_loop_p (loop, e->dest)) 574 return; 575 576 if (!is_true_predicate (prev_cond)) 577 cond = fold_build2 (TRUTH_AND_EXPR, boolean_type_node, 578 prev_cond, cond); 579 580 if (!dominated_by_p (CDI_DOMINATORS, loop->latch, e->dest)) 581 add_to_predicate_list (loop, e->dest, cond); 582} 583 584/* Return true if one of the successor edges of BB exits LOOP. */ 585 586static bool 587bb_with_exit_edge_p (struct loop *loop, basic_block bb) 588{ 589 edge e; 590 edge_iterator ei; 591 592 FOR_EACH_EDGE (e, ei, bb->succs) 593 if (loop_exit_edge_p (loop, e)) 594 return true; 595 596 return false; 597} 598 599/* Given PHI which has more than two arguments, this function checks if 600 it's if-convertible by degenerating its arguments. Specifically, if 601 below two conditions are satisfied: 602 603 1) Number of PHI arguments with different values equals to 2 and one 604 argument has the only occurrence. 605 2) The edge corresponding to the unique argument isn't critical edge. 606 607 Such PHI can be handled as PHIs have only two arguments. For example, 608 below PHI: 609 610 res = PHI <A_1(e1), A_1(e2), A_2(e3)>; 611 612 can be transformed into: 613 614 res = (predicate of e3) ? A_2 : A_1; 615 616 Return TRUE if it is the case, FALSE otherwise. */ 617 618static bool 619phi_convertible_by_degenerating_args (gphi *phi) 620{ 621 edge e; 622 tree arg, t1 = NULL, t2 = NULL; 623 unsigned int i, i1 = 0, i2 = 0, n1 = 0, n2 = 0; 624 unsigned int num_args = gimple_phi_num_args (phi); 625 626 gcc_assert (num_args > 2); 627 628 for (i = 0; i < num_args; i++) 629 { 630 arg = gimple_phi_arg_def (phi, i); 631 if (t1 == NULL || operand_equal_p (t1, arg, 0)) 632 { 633 n1++; 634 i1 = i; 635 t1 = arg; 636 } 637 else if (t2 == NULL || operand_equal_p (t2, arg, 0)) 638 { 639 n2++; 640 i2 = i; 641 t2 = arg; 642 } 643 else 644 return false; 645 } 646 647 if (n1 != 1 && n2 != 1) 648 return false; 649 650 /* Check if the edge corresponding to the unique arg is critical. */ 651 e = gimple_phi_arg_edge (phi, (n1 == 1) ? i1 : i2); 652 if (EDGE_COUNT (e->src->succs) > 1) 653 return false; 654 655 return true; 656} 657 658/* Return true when PHI is if-convertible. PHI is part of loop LOOP 659 and it belongs to basic block BB. Note at this point, it is sure 660 that PHI is if-convertible. This function updates global variable 661 ANY_COMPLICATED_PHI if PHI is complicated. */ 662 663static bool 664if_convertible_phi_p (struct loop *loop, basic_block bb, gphi *phi) 665{ 666 if (dump_file && (dump_flags & TDF_DETAILS)) 667 { 668 fprintf (dump_file, "-------------------------\n"); 669 print_gimple_stmt (dump_file, phi, 0, TDF_SLIM); 670 } 671 672 if (bb != loop->header 673 && gimple_phi_num_args (phi) > 2 674 && !phi_convertible_by_degenerating_args (phi)) 675 any_complicated_phi = true; 676 677 return true; 678} 679 680/* Records the status of a data reference. This struct is attached to 681 each DR->aux field. */ 682 683struct ifc_dr { 684 bool rw_unconditionally; 685 bool w_unconditionally; 686 bool written_at_least_once; 687 688 tree rw_predicate; 689 tree w_predicate; 690 tree base_w_predicate; 691}; 692 693#define IFC_DR(DR) ((struct ifc_dr *) (DR)->aux) 694#define DR_BASE_W_UNCONDITIONALLY(DR) (IFC_DR (DR)->written_at_least_once) 695#define DR_RW_UNCONDITIONALLY(DR) (IFC_DR (DR)->rw_unconditionally) 696#define DR_W_UNCONDITIONALLY(DR) (IFC_DR (DR)->w_unconditionally) 697 698/* Iterates over DR's and stores refs, DR and base refs, DR pairs in 699 HASH tables. While storing them in HASH table, it checks if the 700 reference is unconditionally read or written and stores that as a flag 701 information. For base reference it checks if it is written atlest once 702 unconditionally and stores it as flag information along with DR. 703 In other words for every data reference A in STMT there exist other 704 accesses to a data reference with the same base with predicates that 705 add up (OR-up) to the true predicate: this ensures that the data 706 reference A is touched (read or written) on every iteration of the 707 if-converted loop. */ 708static void 709hash_memrefs_baserefs_and_store_DRs_read_written_info (data_reference_p a) 710{ 711 712 data_reference_p *master_dr, *base_master_dr; 713 tree base_ref = DR_BASE_OBJECT (a); 714 innermost_loop_behavior *innermost = &DR_INNERMOST (a); 715 tree ca = bb_predicate (gimple_bb (DR_STMT (a))); 716 bool exist1, exist2; 717 718 master_dr = &innermost_DR_map->get_or_insert (innermost, &exist1); 719 if (!exist1) 720 *master_dr = a; 721 722 if (DR_IS_WRITE (a)) 723 { 724 IFC_DR (*master_dr)->w_predicate 725 = fold_or_predicates (UNKNOWN_LOCATION, ca, 726 IFC_DR (*master_dr)->w_predicate); 727 if (is_true_predicate (IFC_DR (*master_dr)->w_predicate)) 728 DR_W_UNCONDITIONALLY (*master_dr) = true; 729 } 730 IFC_DR (*master_dr)->rw_predicate 731 = fold_or_predicates (UNKNOWN_LOCATION, ca, 732 IFC_DR (*master_dr)->rw_predicate); 733 if (is_true_predicate (IFC_DR (*master_dr)->rw_predicate)) 734 DR_RW_UNCONDITIONALLY (*master_dr) = true; 735 736 if (DR_IS_WRITE (a)) 737 { 738 base_master_dr = &baseref_DR_map->get_or_insert (base_ref, &exist2); 739 if (!exist2) 740 *base_master_dr = a; 741 IFC_DR (*base_master_dr)->base_w_predicate 742 = fold_or_predicates (UNKNOWN_LOCATION, ca, 743 IFC_DR (*base_master_dr)->base_w_predicate); 744 if (is_true_predicate (IFC_DR (*base_master_dr)->base_w_predicate)) 745 DR_BASE_W_UNCONDITIONALLY (*base_master_dr) = true; 746 } 747} 748 749/* Return TRUE if can prove the index IDX of an array reference REF is 750 within array bound. Return false otherwise. */ 751 752static bool 753idx_within_array_bound (tree ref, tree *idx, void *dta) 754{ 755 wi::overflow_type overflow; 756 widest_int niter, valid_niter, delta, wi_step; 757 tree ev, init, step; 758 tree low, high; 759 struct loop *loop = (struct loop*) dta; 760 761 /* Only support within-bound access for array references. */ 762 if (TREE_CODE (ref) != ARRAY_REF) 763 return false; 764 765 /* For arrays at the end of the structure, we are not guaranteed that they 766 do not really extend over their declared size. However, for arrays of 767 size greater than one, this is unlikely to be intended. */ 768 if (array_at_struct_end_p (ref)) 769 return false; 770 771 ev = analyze_scalar_evolution (loop, *idx); 772 ev = instantiate_parameters (loop, ev); 773 init = initial_condition (ev); 774 step = evolution_part_in_loop_num (ev, loop->num); 775 776 if (!init || TREE_CODE (init) != INTEGER_CST 777 || (step && TREE_CODE (step) != INTEGER_CST)) 778 return false; 779 780 low = array_ref_low_bound (ref); 781 high = array_ref_up_bound (ref); 782 783 /* The case of nonconstant bounds could be handled, but it would be 784 complicated. */ 785 if (TREE_CODE (low) != INTEGER_CST 786 || !high || TREE_CODE (high) != INTEGER_CST) 787 return false; 788 789 /* Check if the intial idx is within bound. */ 790 if (wi::to_widest (init) < wi::to_widest (low) 791 || wi::to_widest (init) > wi::to_widest (high)) 792 return false; 793 794 /* The idx is always within bound. */ 795 if (!step || integer_zerop (step)) 796 return true; 797 798 if (!max_loop_iterations (loop, &niter)) 799 return false; 800 801 if (wi::to_widest (step) < 0) 802 { 803 delta = wi::to_widest (init) - wi::to_widest (low); 804 wi_step = -wi::to_widest (step); 805 } 806 else 807 { 808 delta = wi::to_widest (high) - wi::to_widest (init); 809 wi_step = wi::to_widest (step); 810 } 811 812 valid_niter = wi::div_floor (delta, wi_step, SIGNED, &overflow); 813 /* The iteration space of idx is within array bound. */ 814 if (!overflow && niter <= valid_niter) 815 return true; 816 817 return false; 818} 819 820/* Return TRUE if ref is a within bound array reference. */ 821 822static bool 823ref_within_array_bound (gimple *stmt, tree ref) 824{ 825 struct loop *loop = loop_containing_stmt (stmt); 826 827 gcc_assert (loop != NULL); 828 return for_each_index (&ref, idx_within_array_bound, loop); 829} 830 831 832/* Given a memory reference expression T, return TRUE if base object 833 it refers to is writable. The base object of a memory reference 834 is the main object being referenced, which is returned by function 835 get_base_address. */ 836 837static bool 838base_object_writable (tree ref) 839{ 840 tree base_tree = get_base_address (ref); 841 842 return (base_tree 843 && DECL_P (base_tree) 844 && decl_binds_to_current_def_p (base_tree) 845 && !TREE_READONLY (base_tree)); 846} 847 848/* Return true when the memory references of STMT won't trap in the 849 if-converted code. There are two things that we have to check for: 850 851 - writes to memory occur to writable memory: if-conversion of 852 memory writes transforms the conditional memory writes into 853 unconditional writes, i.e. "if (cond) A[i] = foo" is transformed 854 into "A[i] = cond ? foo : A[i]", and as the write to memory may not 855 be executed at all in the original code, it may be a readonly 856 memory. To check that A is not const-qualified, we check that 857 there exists at least an unconditional write to A in the current 858 function. 859 860 - reads or writes to memory are valid memory accesses for every 861 iteration. To check that the memory accesses are correctly formed 862 and that we are allowed to read and write in these locations, we 863 check that the memory accesses to be if-converted occur at every 864 iteration unconditionally. 865 866 Returns true for the memory reference in STMT, same memory reference 867 is read or written unconditionally atleast once and the base memory 868 reference is written unconditionally once. This is to check reference 869 will not write fault. Also retuns true if the memory reference is 870 unconditionally read once then we are conditionally writing to memory 871 which is defined as read and write and is bound to the definition 872 we are seeing. */ 873static bool 874ifcvt_memrefs_wont_trap (gimple *stmt, vec<data_reference_p> drs) 875{ 876 /* If DR didn't see a reference here we can't use it to tell 877 whether the ref traps or not. */ 878 if (gimple_uid (stmt) == 0) 879 return false; 880 881 data_reference_p *master_dr, *base_master_dr; 882 data_reference_p a = drs[gimple_uid (stmt) - 1]; 883 884 tree base = DR_BASE_OBJECT (a); 885 innermost_loop_behavior *innermost = &DR_INNERMOST (a); 886 887 gcc_assert (DR_STMT (a) == stmt); 888 gcc_assert (DR_BASE_ADDRESS (a) || DR_OFFSET (a) 889 || DR_INIT (a) || DR_STEP (a)); 890 891 master_dr = innermost_DR_map->get (innermost); 892 gcc_assert (master_dr != NULL); 893 894 base_master_dr = baseref_DR_map->get (base); 895 896 /* If a is unconditionally written to it doesn't trap. */ 897 if (DR_W_UNCONDITIONALLY (*master_dr)) 898 return true; 899 900 /* If a is unconditionally accessed then ... 901 902 Even a is conditional access, we can treat it as an unconditional 903 one if it's an array reference and all its index are within array 904 bound. */ 905 if (DR_RW_UNCONDITIONALLY (*master_dr) 906 || ref_within_array_bound (stmt, DR_REF (a))) 907 { 908 /* an unconditional read won't trap. */ 909 if (DR_IS_READ (a)) 910 return true; 911 912 /* an unconditionaly write won't trap if the base is written 913 to unconditionally. */ 914 if (base_master_dr 915 && DR_BASE_W_UNCONDITIONALLY (*base_master_dr)) 916 return PARAM_VALUE (PARAM_ALLOW_STORE_DATA_RACES); 917 /* or the base is known to be not readonly. */ 918 else if (base_object_writable (DR_REF (a))) 919 return PARAM_VALUE (PARAM_ALLOW_STORE_DATA_RACES); 920 } 921 922 return false; 923} 924 925/* Return true if STMT could be converted into a masked load or store 926 (conditional load or store based on a mask computed from bb predicate). */ 927 928static bool 929ifcvt_can_use_mask_load_store (gimple *stmt) 930{ 931 /* Check whether this is a load or store. */ 932 tree lhs = gimple_assign_lhs (stmt); 933 bool is_load; 934 tree ref; 935 if (gimple_store_p (stmt)) 936 { 937 if (!is_gimple_val (gimple_assign_rhs1 (stmt))) 938 return false; 939 is_load = false; 940 ref = lhs; 941 } 942 else if (gimple_assign_load_p (stmt)) 943 { 944 is_load = true; 945 ref = gimple_assign_rhs1 (stmt); 946 } 947 else 948 return false; 949 950 if (may_be_nonaddressable_p (ref)) 951 return false; 952 953 /* Mask should be integer mode of the same size as the load/store 954 mode. */ 955 machine_mode mode = TYPE_MODE (TREE_TYPE (lhs)); 956 if (!int_mode_for_mode (mode).exists () || VECTOR_MODE_P (mode)) 957 return false; 958 959 if (can_vec_mask_load_store_p (mode, VOIDmode, is_load)) 960 return true; 961 962 return false; 963} 964 965/* Return true if STMT could be converted from an operation that is 966 unconditional to one that is conditional on a bb predicate mask. */ 967 968static bool 969ifcvt_can_predicate (gimple *stmt) 970{ 971 basic_block bb = gimple_bb (stmt); 972 973 if (!(flag_tree_loop_vectorize || bb->loop_father->force_vectorize) 974 || bb->loop_father->dont_vectorize 975 || gimple_has_volatile_ops (stmt)) 976 return false; 977 978 if (gimple_assign_single_p (stmt)) 979 return ifcvt_can_use_mask_load_store (stmt); 980 981 tree_code code = gimple_assign_rhs_code (stmt); 982 tree lhs_type = TREE_TYPE (gimple_assign_lhs (stmt)); 983 tree rhs_type = TREE_TYPE (gimple_assign_rhs1 (stmt)); 984 if (!types_compatible_p (lhs_type, rhs_type)) 985 return false; 986 internal_fn cond_fn = get_conditional_internal_fn (code); 987 return (cond_fn != IFN_LAST 988 && vectorized_internal_fn_supported_p (cond_fn, lhs_type)); 989} 990 991/* Return true when STMT is if-convertible. 992 993 GIMPLE_ASSIGN statement is not if-convertible if, 994 - it is not movable, 995 - it could trap, 996 - LHS is not var decl. */ 997 998static bool 999if_convertible_gimple_assign_stmt_p (gimple *stmt, 1000 vec<data_reference_p> refs) 1001{ 1002 tree lhs = gimple_assign_lhs (stmt); 1003 1004 if (dump_file && (dump_flags & TDF_DETAILS)) 1005 { 1006 fprintf (dump_file, "-------------------------\n"); 1007 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM); 1008 } 1009 1010 if (!is_gimple_reg_type (TREE_TYPE (lhs))) 1011 return false; 1012 1013 /* Some of these constrains might be too conservative. */ 1014 if (stmt_ends_bb_p (stmt) 1015 || gimple_has_volatile_ops (stmt) 1016 || (TREE_CODE (lhs) == SSA_NAME 1017 && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs)) 1018 || gimple_has_side_effects (stmt)) 1019 { 1020 if (dump_file && (dump_flags & TDF_DETAILS)) 1021 fprintf (dump_file, "stmt not suitable for ifcvt\n"); 1022 return false; 1023 } 1024 1025 /* tree-into-ssa.c uses GF_PLF_1, so avoid it, because 1026 in between if_convertible_loop_p and combine_blocks 1027 we can perform loop versioning. */ 1028 gimple_set_plf (stmt, GF_PLF_2, false); 1029 1030 if ((! gimple_vuse (stmt) 1031 || gimple_could_trap_p_1 (stmt, false, false) 1032 || ! ifcvt_memrefs_wont_trap (stmt, refs)) 1033 && gimple_could_trap_p (stmt)) 1034 { 1035 if (ifcvt_can_predicate (stmt)) 1036 { 1037 gimple_set_plf (stmt, GF_PLF_2, true); 1038 need_to_predicate = true; 1039 return true; 1040 } 1041 if (dump_file && (dump_flags & TDF_DETAILS)) 1042 fprintf (dump_file, "tree could trap...\n"); 1043 return false; 1044 } 1045 1046 /* When if-converting stores force versioning, likewise if we 1047 ended up generating store data races. */ 1048 if (gimple_vdef (stmt)) 1049 need_to_predicate = true; 1050 1051 return true; 1052} 1053 1054/* Return true when STMT is if-convertible. 1055 1056 A statement is if-convertible if: 1057 - it is an if-convertible GIMPLE_ASSIGN, 1058 - it is a GIMPLE_LABEL or a GIMPLE_COND, 1059 - it is builtins call. */ 1060 1061static bool 1062if_convertible_stmt_p (gimple *stmt, vec<data_reference_p> refs) 1063{ 1064 switch (gimple_code (stmt)) 1065 { 1066 case GIMPLE_LABEL: 1067 case GIMPLE_DEBUG: 1068 case GIMPLE_COND: 1069 return true; 1070 1071 case GIMPLE_ASSIGN: 1072 return if_convertible_gimple_assign_stmt_p (stmt, refs); 1073 1074 case GIMPLE_CALL: 1075 { 1076 tree fndecl = gimple_call_fndecl (stmt); 1077 if (fndecl) 1078 { 1079 int flags = gimple_call_flags (stmt); 1080 if ((flags & ECF_CONST) 1081 && !(flags & ECF_LOOPING_CONST_OR_PURE) 1082 /* We can only vectorize some builtins at the moment, 1083 so restrict if-conversion to those. */ 1084 && fndecl_built_in_p (fndecl)) 1085 return true; 1086 } 1087 return false; 1088 } 1089 1090 default: 1091 /* Don't know what to do with 'em so don't do anything. */ 1092 if (dump_file && (dump_flags & TDF_DETAILS)) 1093 { 1094 fprintf (dump_file, "don't know what to do\n"); 1095 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM); 1096 } 1097 return false; 1098 } 1099 1100 return true; 1101} 1102 1103/* Assumes that BB has more than 1 predecessors. 1104 Returns false if at least one successor is not on critical edge 1105 and true otherwise. */ 1106 1107static inline bool 1108all_preds_critical_p (basic_block bb) 1109{ 1110 edge e; 1111 edge_iterator ei; 1112 1113 FOR_EACH_EDGE (e, ei, bb->preds) 1114 if (EDGE_COUNT (e->src->succs) == 1) 1115 return false; 1116 return true; 1117} 1118 1119/* Return true when BB is if-convertible. This routine does not check 1120 basic block's statements and phis. 1121 1122 A basic block is not if-convertible if: 1123 - it is non-empty and it is after the exit block (in BFS order), 1124 - it is after the exit block but before the latch, 1125 - its edges are not normal. 1126 1127 EXIT_BB is the basic block containing the exit of the LOOP. BB is 1128 inside LOOP. */ 1129 1130static bool 1131if_convertible_bb_p (struct loop *loop, basic_block bb, basic_block exit_bb) 1132{ 1133 edge e; 1134 edge_iterator ei; 1135 1136 if (dump_file && (dump_flags & TDF_DETAILS)) 1137 fprintf (dump_file, "----------[%d]-------------\n", bb->index); 1138 1139 if (EDGE_COUNT (bb->succs) > 2) 1140 return false; 1141 1142 if (exit_bb) 1143 { 1144 if (bb != loop->latch) 1145 { 1146 if (dump_file && (dump_flags & TDF_DETAILS)) 1147 fprintf (dump_file, "basic block after exit bb but before latch\n"); 1148 return false; 1149 } 1150 else if (!empty_block_p (bb)) 1151 { 1152 if (dump_file && (dump_flags & TDF_DETAILS)) 1153 fprintf (dump_file, "non empty basic block after exit bb\n"); 1154 return false; 1155 } 1156 else if (bb == loop->latch 1157 && bb != exit_bb 1158 && !dominated_by_p (CDI_DOMINATORS, bb, exit_bb)) 1159 { 1160 if (dump_file && (dump_flags & TDF_DETAILS)) 1161 fprintf (dump_file, "latch is not dominated by exit_block\n"); 1162 return false; 1163 } 1164 } 1165 1166 /* Be less adventurous and handle only normal edges. */ 1167 FOR_EACH_EDGE (e, ei, bb->succs) 1168 if (e->flags & (EDGE_EH | EDGE_ABNORMAL | EDGE_IRREDUCIBLE_LOOP)) 1169 { 1170 if (dump_file && (dump_flags & TDF_DETAILS)) 1171 fprintf (dump_file, "Difficult to handle edges\n"); 1172 return false; 1173 } 1174 1175 return true; 1176} 1177 1178/* Return true when all predecessor blocks of BB are visited. The 1179 VISITED bitmap keeps track of the visited blocks. */ 1180 1181static bool 1182pred_blocks_visited_p (basic_block bb, bitmap *visited) 1183{ 1184 edge e; 1185 edge_iterator ei; 1186 FOR_EACH_EDGE (e, ei, bb->preds) 1187 if (!bitmap_bit_p (*visited, e->src->index)) 1188 return false; 1189 1190 return true; 1191} 1192 1193/* Get body of a LOOP in suitable order for if-conversion. It is 1194 caller's responsibility to deallocate basic block list. 1195 If-conversion suitable order is, breadth first sort (BFS) order 1196 with an additional constraint: select a block only if all its 1197 predecessors are already selected. */ 1198 1199static basic_block * 1200get_loop_body_in_if_conv_order (const struct loop *loop) 1201{ 1202 basic_block *blocks, *blocks_in_bfs_order; 1203 basic_block bb; 1204 bitmap visited; 1205 unsigned int index = 0; 1206 unsigned int visited_count = 0; 1207 1208 gcc_assert (loop->num_nodes); 1209 gcc_assert (loop->latch != EXIT_BLOCK_PTR_FOR_FN (cfun)); 1210 1211 blocks = XCNEWVEC (basic_block, loop->num_nodes); 1212 visited = BITMAP_ALLOC (NULL); 1213 1214 blocks_in_bfs_order = get_loop_body_in_bfs_order (loop); 1215 1216 index = 0; 1217 while (index < loop->num_nodes) 1218 { 1219 bb = blocks_in_bfs_order [index]; 1220 1221 if (bb->flags & BB_IRREDUCIBLE_LOOP) 1222 { 1223 free (blocks_in_bfs_order); 1224 BITMAP_FREE (visited); 1225 free (blocks); 1226 return NULL; 1227 } 1228 1229 if (!bitmap_bit_p (visited, bb->index)) 1230 { 1231 if (pred_blocks_visited_p (bb, &visited) 1232 || bb == loop->header) 1233 { 1234 /* This block is now visited. */ 1235 bitmap_set_bit (visited, bb->index); 1236 blocks[visited_count++] = bb; 1237 } 1238 } 1239 1240 index++; 1241 1242 if (index == loop->num_nodes 1243 && visited_count != loop->num_nodes) 1244 /* Not done yet. */ 1245 index = 0; 1246 } 1247 free (blocks_in_bfs_order); 1248 BITMAP_FREE (visited); 1249 return blocks; 1250} 1251 1252/* Returns true when the analysis of the predicates for all the basic 1253 blocks in LOOP succeeded. 1254 1255 predicate_bbs first allocates the predicates of the basic blocks. 1256 These fields are then initialized with the tree expressions 1257 representing the predicates under which a basic block is executed 1258 in the LOOP. As the loop->header is executed at each iteration, it 1259 has the "true" predicate. Other statements executed under a 1260 condition are predicated with that condition, for example 1261 1262 | if (x) 1263 | S1; 1264 | else 1265 | S2; 1266 1267 S1 will be predicated with "x", and 1268 S2 will be predicated with "!x". */ 1269 1270static void 1271predicate_bbs (loop_p loop) 1272{ 1273 unsigned int i; 1274 1275 for (i = 0; i < loop->num_nodes; i++) 1276 init_bb_predicate (ifc_bbs[i]); 1277 1278 for (i = 0; i < loop->num_nodes; i++) 1279 { 1280 basic_block bb = ifc_bbs[i]; 1281 tree cond; 1282 gimple *stmt; 1283 1284 /* The loop latch and loop exit block are always executed and 1285 have no extra conditions to be processed: skip them. */ 1286 if (bb == loop->latch 1287 || bb_with_exit_edge_p (loop, bb)) 1288 { 1289 reset_bb_predicate (bb); 1290 continue; 1291 } 1292 1293 cond = bb_predicate (bb); 1294 stmt = last_stmt (bb); 1295 if (stmt && gimple_code (stmt) == GIMPLE_COND) 1296 { 1297 tree c2; 1298 edge true_edge, false_edge; 1299 location_t loc = gimple_location (stmt); 1300 tree c = build2_loc (loc, gimple_cond_code (stmt), 1301 boolean_type_node, 1302 gimple_cond_lhs (stmt), 1303 gimple_cond_rhs (stmt)); 1304 1305 /* Add new condition into destination's predicate list. */ 1306 extract_true_false_edges_from_block (gimple_bb (stmt), 1307 &true_edge, &false_edge); 1308 1309 /* If C is true, then TRUE_EDGE is taken. */ 1310 add_to_dst_predicate_list (loop, true_edge, unshare_expr (cond), 1311 unshare_expr (c)); 1312 1313 /* If C is false, then FALSE_EDGE is taken. */ 1314 c2 = build1_loc (loc, TRUTH_NOT_EXPR, boolean_type_node, 1315 unshare_expr (c)); 1316 add_to_dst_predicate_list (loop, false_edge, 1317 unshare_expr (cond), c2); 1318 1319 cond = NULL_TREE; 1320 } 1321 1322 /* If current bb has only one successor, then consider it as an 1323 unconditional goto. */ 1324 if (single_succ_p (bb)) 1325 { 1326 basic_block bb_n = single_succ (bb); 1327 1328 /* The successor bb inherits the predicate of its 1329 predecessor. If there is no predicate in the predecessor 1330 bb, then consider the successor bb as always executed. */ 1331 if (cond == NULL_TREE) 1332 cond = boolean_true_node; 1333 1334 add_to_predicate_list (loop, bb_n, cond); 1335 } 1336 } 1337 1338 /* The loop header is always executed. */ 1339 reset_bb_predicate (loop->header); 1340 gcc_assert (bb_predicate_gimplified_stmts (loop->header) == NULL 1341 && bb_predicate_gimplified_stmts (loop->latch) == NULL); 1342} 1343 1344/* Build region by adding loop pre-header and post-header blocks. */ 1345 1346static vec<basic_block> 1347build_region (struct loop *loop) 1348{ 1349 vec<basic_block> region = vNULL; 1350 basic_block exit_bb = NULL; 1351 1352 gcc_assert (ifc_bbs); 1353 /* The first element is loop pre-header. */ 1354 region.safe_push (loop_preheader_edge (loop)->src); 1355 1356 for (unsigned int i = 0; i < loop->num_nodes; i++) 1357 { 1358 basic_block bb = ifc_bbs[i]; 1359 region.safe_push (bb); 1360 /* Find loop postheader. */ 1361 edge e; 1362 edge_iterator ei; 1363 FOR_EACH_EDGE (e, ei, bb->succs) 1364 if (loop_exit_edge_p (loop, e)) 1365 { 1366 exit_bb = e->dest; 1367 break; 1368 } 1369 } 1370 /* The last element is loop post-header. */ 1371 gcc_assert (exit_bb); 1372 region.safe_push (exit_bb); 1373 return region; 1374} 1375 1376/* Return true when LOOP is if-convertible. This is a helper function 1377 for if_convertible_loop_p. REFS and DDRS are initialized and freed 1378 in if_convertible_loop_p. */ 1379 1380static bool 1381if_convertible_loop_p_1 (struct loop *loop, vec<data_reference_p> *refs) 1382{ 1383 unsigned int i; 1384 basic_block exit_bb = NULL; 1385 vec<basic_block> region; 1386 1387 if (find_data_references_in_loop (loop, refs) == chrec_dont_know) 1388 return false; 1389 1390 calculate_dominance_info (CDI_DOMINATORS); 1391 1392 /* Allow statements that can be handled during if-conversion. */ 1393 ifc_bbs = get_loop_body_in_if_conv_order (loop); 1394 if (!ifc_bbs) 1395 { 1396 if (dump_file && (dump_flags & TDF_DETAILS)) 1397 fprintf (dump_file, "Irreducible loop\n"); 1398 return false; 1399 } 1400 1401 for (i = 0; i < loop->num_nodes; i++) 1402 { 1403 basic_block bb = ifc_bbs[i]; 1404 1405 if (!if_convertible_bb_p (loop, bb, exit_bb)) 1406 return false; 1407 1408 if (bb_with_exit_edge_p (loop, bb)) 1409 exit_bb = bb; 1410 } 1411 1412 for (i = 0; i < loop->num_nodes; i++) 1413 { 1414 basic_block bb = ifc_bbs[i]; 1415 gimple_stmt_iterator gsi; 1416 1417 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) 1418 switch (gimple_code (gsi_stmt (gsi))) 1419 { 1420 case GIMPLE_LABEL: 1421 case GIMPLE_ASSIGN: 1422 case GIMPLE_CALL: 1423 case GIMPLE_DEBUG: 1424 case GIMPLE_COND: 1425 gimple_set_uid (gsi_stmt (gsi), 0); 1426 break; 1427 default: 1428 return false; 1429 } 1430 } 1431 1432 data_reference_p dr; 1433 1434 innermost_DR_map 1435 = new hash_map<innermost_loop_behavior_hash, data_reference_p>; 1436 baseref_DR_map = new hash_map<tree_operand_hash, data_reference_p>; 1437 1438 /* Compute post-dominator tree locally. */ 1439 region = build_region (loop); 1440 calculate_dominance_info_for_region (CDI_POST_DOMINATORS, region); 1441 1442 predicate_bbs (loop); 1443 1444 /* Free post-dominator tree since it is not used after predication. */ 1445 free_dominance_info_for_region (cfun, CDI_POST_DOMINATORS, region); 1446 region.release (); 1447 1448 for (i = 0; refs->iterate (i, &dr); i++) 1449 { 1450 tree ref = DR_REF (dr); 1451 1452 dr->aux = XNEW (struct ifc_dr); 1453 DR_BASE_W_UNCONDITIONALLY (dr) = false; 1454 DR_RW_UNCONDITIONALLY (dr) = false; 1455 DR_W_UNCONDITIONALLY (dr) = false; 1456 IFC_DR (dr)->rw_predicate = boolean_false_node; 1457 IFC_DR (dr)->w_predicate = boolean_false_node; 1458 IFC_DR (dr)->base_w_predicate = boolean_false_node; 1459 if (gimple_uid (DR_STMT (dr)) == 0) 1460 gimple_set_uid (DR_STMT (dr), i + 1); 1461 1462 /* If DR doesn't have innermost loop behavior or it's a compound 1463 memory reference, we synthesize its innermost loop behavior 1464 for hashing. */ 1465 if (TREE_CODE (ref) == COMPONENT_REF 1466 || TREE_CODE (ref) == IMAGPART_EXPR 1467 || TREE_CODE (ref) == REALPART_EXPR 1468 || !(DR_BASE_ADDRESS (dr) || DR_OFFSET (dr) 1469 || DR_INIT (dr) || DR_STEP (dr))) 1470 { 1471 while (TREE_CODE (ref) == COMPONENT_REF 1472 || TREE_CODE (ref) == IMAGPART_EXPR 1473 || TREE_CODE (ref) == REALPART_EXPR) 1474 ref = TREE_OPERAND (ref, 0); 1475 1476 memset (&DR_INNERMOST (dr), 0, sizeof (DR_INNERMOST (dr))); 1477 DR_BASE_ADDRESS (dr) = ref; 1478 } 1479 hash_memrefs_baserefs_and_store_DRs_read_written_info (dr); 1480 } 1481 1482 for (i = 0; i < loop->num_nodes; i++) 1483 { 1484 basic_block bb = ifc_bbs[i]; 1485 gimple_stmt_iterator itr; 1486 1487 /* Check the if-convertibility of statements in predicated BBs. */ 1488 if (!dominated_by_p (CDI_DOMINATORS, loop->latch, bb)) 1489 for (itr = gsi_start_bb (bb); !gsi_end_p (itr); gsi_next (&itr)) 1490 if (!if_convertible_stmt_p (gsi_stmt (itr), *refs)) 1491 return false; 1492 } 1493 1494 /* Checking PHIs needs to be done after stmts, as the fact whether there 1495 are any masked loads or stores affects the tests. */ 1496 for (i = 0; i < loop->num_nodes; i++) 1497 { 1498 basic_block bb = ifc_bbs[i]; 1499 gphi_iterator itr; 1500 1501 for (itr = gsi_start_phis (bb); !gsi_end_p (itr); gsi_next (&itr)) 1502 if (!if_convertible_phi_p (loop, bb, itr.phi ())) 1503 return false; 1504 } 1505 1506 if (dump_file) 1507 fprintf (dump_file, "Applying if-conversion\n"); 1508 1509 return true; 1510} 1511 1512/* Return true when LOOP is if-convertible. 1513 LOOP is if-convertible if: 1514 - it is innermost, 1515 - it has two or more basic blocks, 1516 - it has only one exit, 1517 - loop header is not the exit edge, 1518 - if its basic blocks and phi nodes are if convertible. */ 1519 1520static bool 1521if_convertible_loop_p (struct loop *loop) 1522{ 1523 edge e; 1524 edge_iterator ei; 1525 bool res = false; 1526 vec<data_reference_p> refs; 1527 1528 /* Handle only innermost loop. */ 1529 if (!loop || loop->inner) 1530 { 1531 if (dump_file && (dump_flags & TDF_DETAILS)) 1532 fprintf (dump_file, "not innermost loop\n"); 1533 return false; 1534 } 1535 1536 /* If only one block, no need for if-conversion. */ 1537 if (loop->num_nodes <= 2) 1538 { 1539 if (dump_file && (dump_flags & TDF_DETAILS)) 1540 fprintf (dump_file, "less than 2 basic blocks\n"); 1541 return false; 1542 } 1543 1544 /* More than one loop exit is too much to handle. */ 1545 if (!single_exit (loop)) 1546 { 1547 if (dump_file && (dump_flags & TDF_DETAILS)) 1548 fprintf (dump_file, "multiple exits\n"); 1549 return false; 1550 } 1551 1552 /* If one of the loop header's edge is an exit edge then do not 1553 apply if-conversion. */ 1554 FOR_EACH_EDGE (e, ei, loop->header->succs) 1555 if (loop_exit_edge_p (loop, e)) 1556 return false; 1557 1558 refs.create (5); 1559 res = if_convertible_loop_p_1 (loop, &refs); 1560 1561 data_reference_p dr; 1562 unsigned int i; 1563 for (i = 0; refs.iterate (i, &dr); i++) 1564 free (dr->aux); 1565 1566 free_data_refs (refs); 1567 1568 delete innermost_DR_map; 1569 innermost_DR_map = NULL; 1570 1571 delete baseref_DR_map; 1572 baseref_DR_map = NULL; 1573 1574 return res; 1575} 1576 1577/* Returns true if def-stmt for phi argument ARG is simple increment/decrement 1578 which is in predicated basic block. 1579 In fact, the following PHI pattern is searching: 1580 loop-header: 1581 reduc_1 = PHI <..., reduc_2> 1582 ... 1583 if (...) 1584 reduc_3 = ... 1585 reduc_2 = PHI <reduc_1, reduc_3> 1586 1587 ARG_0 and ARG_1 are correspondent PHI arguments. 1588 REDUC, OP0 and OP1 contain reduction stmt and its operands. 1589 EXTENDED is true if PHI has > 2 arguments. */ 1590 1591static bool 1592is_cond_scalar_reduction (gimple *phi, gimple **reduc, tree arg_0, tree arg_1, 1593 tree *op0, tree *op1, bool extended) 1594{ 1595 tree lhs, r_op1, r_op2; 1596 gimple *stmt; 1597 gimple *header_phi = NULL; 1598 enum tree_code reduction_op; 1599 basic_block bb = gimple_bb (phi); 1600 struct loop *loop = bb->loop_father; 1601 edge latch_e = loop_latch_edge (loop); 1602 imm_use_iterator imm_iter; 1603 use_operand_p use_p; 1604 edge e; 1605 edge_iterator ei; 1606 bool result = false; 1607 if (TREE_CODE (arg_0) != SSA_NAME || TREE_CODE (arg_1) != SSA_NAME) 1608 return false; 1609 1610 if (!extended && gimple_code (SSA_NAME_DEF_STMT (arg_0)) == GIMPLE_PHI) 1611 { 1612 lhs = arg_1; 1613 header_phi = SSA_NAME_DEF_STMT (arg_0); 1614 stmt = SSA_NAME_DEF_STMT (arg_1); 1615 } 1616 else if (gimple_code (SSA_NAME_DEF_STMT (arg_1)) == GIMPLE_PHI) 1617 { 1618 lhs = arg_0; 1619 header_phi = SSA_NAME_DEF_STMT (arg_1); 1620 stmt = SSA_NAME_DEF_STMT (arg_0); 1621 } 1622 else 1623 return false; 1624 if (gimple_bb (header_phi) != loop->header) 1625 return false; 1626 1627 if (PHI_ARG_DEF_FROM_EDGE (header_phi, latch_e) != PHI_RESULT (phi)) 1628 return false; 1629 1630 if (gimple_code (stmt) != GIMPLE_ASSIGN 1631 || gimple_has_volatile_ops (stmt)) 1632 return false; 1633 1634 if (!flow_bb_inside_loop_p (loop, gimple_bb (stmt))) 1635 return false; 1636 1637 if (!is_predicated (gimple_bb (stmt))) 1638 return false; 1639 1640 /* Check that stmt-block is predecessor of phi-block. */ 1641 FOR_EACH_EDGE (e, ei, gimple_bb (stmt)->succs) 1642 if (e->dest == bb) 1643 { 1644 result = true; 1645 break; 1646 } 1647 if (!result) 1648 return false; 1649 1650 if (!has_single_use (lhs)) 1651 return false; 1652 1653 reduction_op = gimple_assign_rhs_code (stmt); 1654 if (reduction_op != PLUS_EXPR && reduction_op != MINUS_EXPR) 1655 return false; 1656 r_op1 = gimple_assign_rhs1 (stmt); 1657 r_op2 = gimple_assign_rhs2 (stmt); 1658 1659 /* Make R_OP1 to hold reduction variable. */ 1660 if (r_op2 == PHI_RESULT (header_phi) 1661 && reduction_op == PLUS_EXPR) 1662 std::swap (r_op1, r_op2); 1663 else if (r_op1 != PHI_RESULT (header_phi)) 1664 return false; 1665 1666 /* Check that R_OP1 is used in reduction stmt or in PHI only. */ 1667 FOR_EACH_IMM_USE_FAST (use_p, imm_iter, r_op1) 1668 { 1669 gimple *use_stmt = USE_STMT (use_p); 1670 if (is_gimple_debug (use_stmt)) 1671 continue; 1672 if (use_stmt == stmt) 1673 continue; 1674 if (gimple_code (use_stmt) != GIMPLE_PHI) 1675 return false; 1676 } 1677 1678 *op0 = r_op1; *op1 = r_op2; 1679 *reduc = stmt; 1680 return true; 1681} 1682 1683/* Converts conditional scalar reduction into unconditional form, e.g. 1684 bb_4 1685 if (_5 != 0) goto bb_5 else goto bb_6 1686 end_bb_4 1687 bb_5 1688 res_6 = res_13 + 1; 1689 end_bb_5 1690 bb_6 1691 # res_2 = PHI <res_13(4), res_6(5)> 1692 end_bb_6 1693 1694 will be converted into sequence 1695 _ifc__1 = _5 != 0 ? 1 : 0; 1696 res_2 = res_13 + _ifc__1; 1697 Argument SWAP tells that arguments of conditional expression should be 1698 swapped. 1699 Returns rhs of resulting PHI assignment. */ 1700 1701static tree 1702convert_scalar_cond_reduction (gimple *reduc, gimple_stmt_iterator *gsi, 1703 tree cond, tree op0, tree op1, bool swap) 1704{ 1705 gimple_stmt_iterator stmt_it; 1706 gimple *new_assign; 1707 tree rhs; 1708 tree rhs1 = gimple_assign_rhs1 (reduc); 1709 tree tmp = make_temp_ssa_name (TREE_TYPE (rhs1), NULL, "_ifc_"); 1710 tree c; 1711 tree zero = build_zero_cst (TREE_TYPE (rhs1)); 1712 1713 if (dump_file && (dump_flags & TDF_DETAILS)) 1714 { 1715 fprintf (dump_file, "Found cond scalar reduction.\n"); 1716 print_gimple_stmt (dump_file, reduc, 0, TDF_SLIM); 1717 } 1718 1719 /* Build cond expression using COND and constant operand 1720 of reduction rhs. */ 1721 c = fold_build_cond_expr (TREE_TYPE (rhs1), 1722 unshare_expr (cond), 1723 swap ? zero : op1, 1724 swap ? op1 : zero); 1725 1726 /* Create assignment stmt and insert it at GSI. */ 1727 new_assign = gimple_build_assign (tmp, c); 1728 gsi_insert_before (gsi, new_assign, GSI_SAME_STMT); 1729 /* Build rhs for unconditional increment/decrement. */ 1730 rhs = fold_build2 (gimple_assign_rhs_code (reduc), 1731 TREE_TYPE (rhs1), op0, tmp); 1732 1733 /* Delete original reduction stmt. */ 1734 stmt_it = gsi_for_stmt (reduc); 1735 gsi_remove (&stmt_it, true); 1736 release_defs (reduc); 1737 return rhs; 1738} 1739 1740/* Produce condition for all occurrences of ARG in PHI node. */ 1741 1742static tree 1743gen_phi_arg_condition (gphi *phi, vec<int> *occur, 1744 gimple_stmt_iterator *gsi) 1745{ 1746 int len; 1747 int i; 1748 tree cond = NULL_TREE; 1749 tree c; 1750 edge e; 1751 1752 len = occur->length (); 1753 gcc_assert (len > 0); 1754 for (i = 0; i < len; i++) 1755 { 1756 e = gimple_phi_arg_edge (phi, (*occur)[i]); 1757 c = bb_predicate (e->src); 1758 if (is_true_predicate (c)) 1759 { 1760 cond = c; 1761 break; 1762 } 1763 c = force_gimple_operand_gsi_1 (gsi, unshare_expr (c), 1764 is_gimple_condexpr, NULL_TREE, 1765 true, GSI_SAME_STMT); 1766 if (cond != NULL_TREE) 1767 { 1768 /* Must build OR expression. */ 1769 cond = fold_or_predicates (EXPR_LOCATION (c), c, cond); 1770 cond = force_gimple_operand_gsi_1 (gsi, unshare_expr (cond), 1771 is_gimple_condexpr, NULL_TREE, 1772 true, GSI_SAME_STMT); 1773 } 1774 else 1775 cond = c; 1776 } 1777 gcc_assert (cond != NULL_TREE); 1778 return cond; 1779} 1780 1781/* Local valueization callback that follows all-use SSA edges. */ 1782 1783static tree 1784ifcvt_follow_ssa_use_edges (tree val) 1785{ 1786 return val; 1787} 1788 1789/* Replace a scalar PHI node with a COND_EXPR using COND as condition. 1790 This routine can handle PHI nodes with more than two arguments. 1791 1792 For example, 1793 S1: A = PHI <x1(1), x2(5)> 1794 is converted into, 1795 S2: A = cond ? x1 : x2; 1796 1797 The generated code is inserted at GSI that points to the top of 1798 basic block's statement list. 1799 If PHI node has more than two arguments a chain of conditional 1800 expression is produced. */ 1801 1802 1803static void 1804predicate_scalar_phi (gphi *phi, gimple_stmt_iterator *gsi) 1805{ 1806 gimple *new_stmt = NULL, *reduc; 1807 tree rhs, res, arg0, arg1, op0, op1, scev; 1808 tree cond; 1809 unsigned int index0; 1810 unsigned int max, args_len; 1811 edge e; 1812 basic_block bb; 1813 unsigned int i; 1814 1815 res = gimple_phi_result (phi); 1816 if (virtual_operand_p (res)) 1817 return; 1818 1819 if ((rhs = degenerate_phi_result (phi)) 1820 || ((scev = analyze_scalar_evolution (gimple_bb (phi)->loop_father, 1821 res)) 1822 && !chrec_contains_undetermined (scev) 1823 && scev != res 1824 && (rhs = gimple_phi_arg_def (phi, 0)))) 1825 { 1826 if (dump_file && (dump_flags & TDF_DETAILS)) 1827 { 1828 fprintf (dump_file, "Degenerate phi!\n"); 1829 print_gimple_stmt (dump_file, phi, 0, TDF_SLIM); 1830 } 1831 new_stmt = gimple_build_assign (res, rhs); 1832 gsi_insert_before (gsi, new_stmt, GSI_SAME_STMT); 1833 update_stmt (new_stmt); 1834 return; 1835 } 1836 1837 bb = gimple_bb (phi); 1838 if (EDGE_COUNT (bb->preds) == 2) 1839 { 1840 /* Predicate ordinary PHI node with 2 arguments. */ 1841 edge first_edge, second_edge; 1842 basic_block true_bb; 1843 first_edge = EDGE_PRED (bb, 0); 1844 second_edge = EDGE_PRED (bb, 1); 1845 cond = bb_predicate (first_edge->src); 1846 if (TREE_CODE (cond) == TRUTH_NOT_EXPR) 1847 std::swap (first_edge, second_edge); 1848 if (EDGE_COUNT (first_edge->src->succs) > 1) 1849 { 1850 cond = bb_predicate (second_edge->src); 1851 if (TREE_CODE (cond) == TRUTH_NOT_EXPR) 1852 cond = TREE_OPERAND (cond, 0); 1853 else 1854 first_edge = second_edge; 1855 } 1856 else 1857 cond = bb_predicate (first_edge->src); 1858 /* Gimplify the condition to a valid cond-expr conditonal operand. */ 1859 cond = force_gimple_operand_gsi_1 (gsi, unshare_expr (cond), 1860 is_gimple_condexpr, NULL_TREE, 1861 true, GSI_SAME_STMT); 1862 true_bb = first_edge->src; 1863 if (EDGE_PRED (bb, 1)->src == true_bb) 1864 { 1865 arg0 = gimple_phi_arg_def (phi, 1); 1866 arg1 = gimple_phi_arg_def (phi, 0); 1867 } 1868 else 1869 { 1870 arg0 = gimple_phi_arg_def (phi, 0); 1871 arg1 = gimple_phi_arg_def (phi, 1); 1872 } 1873 if (is_cond_scalar_reduction (phi, &reduc, arg0, arg1, 1874 &op0, &op1, false)) 1875 /* Convert reduction stmt into vectorizable form. */ 1876 rhs = convert_scalar_cond_reduction (reduc, gsi, cond, op0, op1, 1877 true_bb != gimple_bb (reduc)); 1878 else 1879 /* Build new RHS using selected condition and arguments. */ 1880 rhs = fold_build_cond_expr (TREE_TYPE (res), unshare_expr (cond), 1881 arg0, arg1); 1882 new_stmt = gimple_build_assign (res, rhs); 1883 gsi_insert_before (gsi, new_stmt, GSI_SAME_STMT); 1884 gimple_stmt_iterator new_gsi = gsi_for_stmt (new_stmt); 1885 if (fold_stmt (&new_gsi, ifcvt_follow_ssa_use_edges)) 1886 { 1887 new_stmt = gsi_stmt (new_gsi); 1888 update_stmt (new_stmt); 1889 } 1890 1891 if (dump_file && (dump_flags & TDF_DETAILS)) 1892 { 1893 fprintf (dump_file, "new phi replacement stmt\n"); 1894 print_gimple_stmt (dump_file, new_stmt, 0, TDF_SLIM); 1895 } 1896 return; 1897 } 1898 1899 /* Create hashmap for PHI node which contain vector of argument indexes 1900 having the same value. */ 1901 bool swap = false; 1902 hash_map<tree_operand_hash, auto_vec<int> > phi_arg_map; 1903 unsigned int num_args = gimple_phi_num_args (phi); 1904 int max_ind = -1; 1905 /* Vector of different PHI argument values. */ 1906 auto_vec<tree> args (num_args); 1907 1908 /* Compute phi_arg_map. */ 1909 for (i = 0; i < num_args; i++) 1910 { 1911 tree arg; 1912 1913 arg = gimple_phi_arg_def (phi, i); 1914 if (!phi_arg_map.get (arg)) 1915 args.quick_push (arg); 1916 phi_arg_map.get_or_insert (arg).safe_push (i); 1917 } 1918 1919 /* Determine element with max number of occurrences. */ 1920 max_ind = -1; 1921 max = 1; 1922 args_len = args.length (); 1923 for (i = 0; i < args_len; i++) 1924 { 1925 unsigned int len; 1926 if ((len = phi_arg_map.get (args[i])->length ()) > max) 1927 { 1928 max_ind = (int) i; 1929 max = len; 1930 } 1931 } 1932 1933 /* Put element with max number of occurences to the end of ARGS. */ 1934 if (max_ind != -1 && max_ind +1 != (int) args_len) 1935 std::swap (args[args_len - 1], args[max_ind]); 1936 1937 /* Handle one special case when number of arguments with different values 1938 is equal 2 and one argument has the only occurrence. Such PHI can be 1939 handled as if would have only 2 arguments. */ 1940 if (args_len == 2 && phi_arg_map.get (args[0])->length () == 1) 1941 { 1942 vec<int> *indexes; 1943 indexes = phi_arg_map.get (args[0]); 1944 index0 = (*indexes)[0]; 1945 arg0 = args[0]; 1946 arg1 = args[1]; 1947 e = gimple_phi_arg_edge (phi, index0); 1948 cond = bb_predicate (e->src); 1949 if (TREE_CODE (cond) == TRUTH_NOT_EXPR) 1950 { 1951 swap = true; 1952 cond = TREE_OPERAND (cond, 0); 1953 } 1954 /* Gimplify the condition to a valid cond-expr conditonal operand. */ 1955 cond = force_gimple_operand_gsi_1 (gsi, unshare_expr (cond), 1956 is_gimple_condexpr, NULL_TREE, 1957 true, GSI_SAME_STMT); 1958 if (!(is_cond_scalar_reduction (phi, &reduc, arg0 , arg1, 1959 &op0, &op1, true))) 1960 rhs = fold_build_cond_expr (TREE_TYPE (res), unshare_expr (cond), 1961 swap? arg1 : arg0, 1962 swap? arg0 : arg1); 1963 else 1964 /* Convert reduction stmt into vectorizable form. */ 1965 rhs = convert_scalar_cond_reduction (reduc, gsi, cond, op0, op1, 1966 swap); 1967 new_stmt = gimple_build_assign (res, rhs); 1968 gsi_insert_before (gsi, new_stmt, GSI_SAME_STMT); 1969 update_stmt (new_stmt); 1970 } 1971 else 1972 { 1973 /* Common case. */ 1974 vec<int> *indexes; 1975 tree type = TREE_TYPE (gimple_phi_result (phi)); 1976 tree lhs; 1977 arg1 = args[1]; 1978 for (i = 0; i < args_len; i++) 1979 { 1980 arg0 = args[i]; 1981 indexes = phi_arg_map.get (args[i]); 1982 if (i != args_len - 1) 1983 lhs = make_temp_ssa_name (type, NULL, "_ifc_"); 1984 else 1985 lhs = res; 1986 cond = gen_phi_arg_condition (phi, indexes, gsi); 1987 rhs = fold_build_cond_expr (type, unshare_expr (cond), 1988 arg0, arg1); 1989 new_stmt = gimple_build_assign (lhs, rhs); 1990 gsi_insert_before (gsi, new_stmt, GSI_SAME_STMT); 1991 update_stmt (new_stmt); 1992 arg1 = lhs; 1993 } 1994 } 1995 1996 if (dump_file && (dump_flags & TDF_DETAILS)) 1997 { 1998 fprintf (dump_file, "new extended phi replacement stmt\n"); 1999 print_gimple_stmt (dump_file, new_stmt, 0, TDF_SLIM); 2000 } 2001} 2002 2003/* Replaces in LOOP all the scalar phi nodes other than those in the 2004 LOOP->header block with conditional modify expressions. */ 2005 2006static void 2007predicate_all_scalar_phis (struct loop *loop) 2008{ 2009 basic_block bb; 2010 unsigned int orig_loop_num_nodes = loop->num_nodes; 2011 unsigned int i; 2012 2013 for (i = 1; i < orig_loop_num_nodes; i++) 2014 { 2015 gphi *phi; 2016 gimple_stmt_iterator gsi; 2017 gphi_iterator phi_gsi; 2018 bb = ifc_bbs[i]; 2019 2020 if (bb == loop->header) 2021 continue; 2022 2023 phi_gsi = gsi_start_phis (bb); 2024 if (gsi_end_p (phi_gsi)) 2025 continue; 2026 2027 gsi = gsi_after_labels (bb); 2028 while (!gsi_end_p (phi_gsi)) 2029 { 2030 phi = phi_gsi.phi (); 2031 if (virtual_operand_p (gimple_phi_result (phi))) 2032 gsi_next (&phi_gsi); 2033 else 2034 { 2035 predicate_scalar_phi (phi, &gsi); 2036 remove_phi_node (&phi_gsi, false); 2037 } 2038 } 2039 } 2040} 2041 2042/* Insert in each basic block of LOOP the statements produced by the 2043 gimplification of the predicates. */ 2044 2045static void 2046insert_gimplified_predicates (loop_p loop) 2047{ 2048 unsigned int i; 2049 2050 for (i = 0; i < loop->num_nodes; i++) 2051 { 2052 basic_block bb = ifc_bbs[i]; 2053 gimple_seq stmts; 2054 if (!is_predicated (bb)) 2055 gcc_assert (bb_predicate_gimplified_stmts (bb) == NULL); 2056 if (!is_predicated (bb)) 2057 { 2058 /* Do not insert statements for a basic block that is not 2059 predicated. Also make sure that the predicate of the 2060 basic block is set to true. */ 2061 reset_bb_predicate (bb); 2062 continue; 2063 } 2064 2065 stmts = bb_predicate_gimplified_stmts (bb); 2066 if (stmts) 2067 { 2068 if (need_to_predicate) 2069 { 2070 /* Insert the predicate of the BB just after the label, 2071 as the if-conversion of memory writes will use this 2072 predicate. */ 2073 gimple_stmt_iterator gsi = gsi_after_labels (bb); 2074 gsi_insert_seq_before (&gsi, stmts, GSI_SAME_STMT); 2075 } 2076 else 2077 { 2078 /* Insert the predicate of the BB at the end of the BB 2079 as this would reduce the register pressure: the only 2080 use of this predicate will be in successor BBs. */ 2081 gimple_stmt_iterator gsi = gsi_last_bb (bb); 2082 2083 if (gsi_end_p (gsi) 2084 || stmt_ends_bb_p (gsi_stmt (gsi))) 2085 gsi_insert_seq_before (&gsi, stmts, GSI_SAME_STMT); 2086 else 2087 gsi_insert_seq_after (&gsi, stmts, GSI_SAME_STMT); 2088 } 2089 2090 /* Once the sequence is code generated, set it to NULL. */ 2091 set_bb_predicate_gimplified_stmts (bb, NULL); 2092 } 2093 } 2094} 2095 2096/* Helper function for predicate_statements. Returns index of existent 2097 mask if it was created for given SIZE and -1 otherwise. */ 2098 2099static int 2100mask_exists (int size, vec<int> vec) 2101{ 2102 unsigned int ix; 2103 int v; 2104 FOR_EACH_VEC_ELT (vec, ix, v) 2105 if (v == size) 2106 return (int) ix; 2107 return -1; 2108} 2109 2110/* Helper function for predicate_statements. STMT is a memory read or 2111 write and it needs to be predicated by MASK. Return a statement 2112 that does so. */ 2113 2114static gimple * 2115predicate_load_or_store (gimple_stmt_iterator *gsi, gassign *stmt, tree mask) 2116{ 2117 gcall *new_stmt; 2118 2119 tree lhs = gimple_assign_lhs (stmt); 2120 tree rhs = gimple_assign_rhs1 (stmt); 2121 tree ref = TREE_CODE (lhs) == SSA_NAME ? rhs : lhs; 2122 mark_addressable (ref); 2123 tree addr = force_gimple_operand_gsi (gsi, build_fold_addr_expr (ref), 2124 true, NULL_TREE, true, GSI_SAME_STMT); 2125 tree ptr = build_int_cst (reference_alias_ptr_type (ref), 2126 get_object_alignment (ref)); 2127 /* Copy points-to info if possible. */ 2128 if (TREE_CODE (addr) == SSA_NAME && !SSA_NAME_PTR_INFO (addr)) 2129 copy_ref_info (build2 (MEM_REF, TREE_TYPE (ref), addr, ptr), 2130 ref); 2131 if (TREE_CODE (lhs) == SSA_NAME) 2132 { 2133 new_stmt 2134 = gimple_build_call_internal (IFN_MASK_LOAD, 3, addr, 2135 ptr, mask); 2136 gimple_call_set_lhs (new_stmt, lhs); 2137 gimple_set_vuse (new_stmt, gimple_vuse (stmt)); 2138 } 2139 else 2140 { 2141 new_stmt 2142 = gimple_build_call_internal (IFN_MASK_STORE, 4, addr, ptr, 2143 mask, rhs); 2144 gimple_set_vuse (new_stmt, gimple_vuse (stmt)); 2145 gimple_set_vdef (new_stmt, gimple_vdef (stmt)); 2146 SSA_NAME_DEF_STMT (gimple_vdef (new_stmt)) = new_stmt; 2147 } 2148 gimple_call_set_nothrow (new_stmt, true); 2149 return new_stmt; 2150} 2151 2152/* STMT uses OP_LHS. Check whether it is equivalent to: 2153 2154 ... = OP_MASK ? OP_LHS : X; 2155 2156 Return X if so, otherwise return null. OP_MASK is an SSA_NAME that is 2157 known to have value OP_COND. */ 2158 2159static tree 2160check_redundant_cond_expr (gimple *stmt, tree op_mask, tree op_cond, 2161 tree op_lhs) 2162{ 2163 gassign *assign = dyn_cast <gassign *> (stmt); 2164 if (!assign || gimple_assign_rhs_code (assign) != COND_EXPR) 2165 return NULL_TREE; 2166 2167 tree use_cond = gimple_assign_rhs1 (assign); 2168 tree if_true = gimple_assign_rhs2 (assign); 2169 tree if_false = gimple_assign_rhs3 (assign); 2170 2171 if ((use_cond == op_mask || operand_equal_p (use_cond, op_cond, 0)) 2172 && if_true == op_lhs) 2173 return if_false; 2174 2175 if (inverse_conditions_p (use_cond, op_cond) && if_false == op_lhs) 2176 return if_true; 2177 2178 return NULL_TREE; 2179} 2180 2181/* Return true if VALUE is available for use at STMT. SSA_NAMES is 2182 the set of SSA names defined earlier in STMT's block. */ 2183 2184static bool 2185value_available_p (gimple *stmt, hash_set<tree_ssa_name_hash> *ssa_names, 2186 tree value) 2187{ 2188 if (is_gimple_min_invariant (value)) 2189 return true; 2190 2191 if (TREE_CODE (value) == SSA_NAME) 2192 { 2193 if (SSA_NAME_IS_DEFAULT_DEF (value)) 2194 return true; 2195 2196 basic_block def_bb = gimple_bb (SSA_NAME_DEF_STMT (value)); 2197 basic_block use_bb = gimple_bb (stmt); 2198 return (def_bb == use_bb 2199 ? ssa_names->contains (value) 2200 : dominated_by_p (CDI_DOMINATORS, use_bb, def_bb)); 2201 } 2202 2203 return false; 2204} 2205 2206/* Helper function for predicate_statements. STMT is a potentially-trapping 2207 arithmetic operation that needs to be predicated by MASK, an SSA_NAME that 2208 has value COND. Return a statement that does so. SSA_NAMES is the set of 2209 SSA names defined earlier in STMT's block. */ 2210 2211static gimple * 2212predicate_rhs_code (gassign *stmt, tree mask, tree cond, 2213 hash_set<tree_ssa_name_hash> *ssa_names) 2214{ 2215 tree lhs = gimple_assign_lhs (stmt); 2216 tree_code code = gimple_assign_rhs_code (stmt); 2217 unsigned int nops = gimple_num_ops (stmt); 2218 internal_fn cond_fn = get_conditional_internal_fn (code); 2219 2220 /* Construct the arguments to the conditional internal function. */ 2221 auto_vec<tree, 8> args; 2222 args.safe_grow (nops + 1); 2223 args[0] = mask; 2224 for (unsigned int i = 1; i < nops; ++i) 2225 args[i] = gimple_op (stmt, i); 2226 args[nops] = NULL_TREE; 2227 2228 /* Look for uses of the result to see whether they are COND_EXPRs that can 2229 be folded into the conditional call. */ 2230 imm_use_iterator imm_iter; 2231 gimple *use_stmt; 2232 FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, lhs) 2233 { 2234 tree new_else = check_redundant_cond_expr (use_stmt, mask, cond, lhs); 2235 if (new_else && value_available_p (stmt, ssa_names, new_else)) 2236 { 2237 if (!args[nops]) 2238 args[nops] = new_else; 2239 if (operand_equal_p (new_else, args[nops], 0)) 2240 { 2241 /* We have: 2242 2243 LHS = IFN_COND (MASK, ..., ELSE); 2244 X = MASK ? LHS : ELSE; 2245 2246 which makes X equivalent to LHS. */ 2247 tree use_lhs = gimple_assign_lhs (use_stmt); 2248 redundant_ssa_names.safe_push (std::make_pair (use_lhs, lhs)); 2249 } 2250 } 2251 } 2252 if (!args[nops]) 2253 args[nops] = targetm.preferred_else_value (cond_fn, TREE_TYPE (lhs), 2254 nops - 1, &args[1]); 2255 2256 /* Create and insert the call. */ 2257 gcall *new_stmt = gimple_build_call_internal_vec (cond_fn, args); 2258 gimple_call_set_lhs (new_stmt, lhs); 2259 gimple_call_set_nothrow (new_stmt, true); 2260 2261 return new_stmt; 2262} 2263 2264/* Predicate each write to memory in LOOP. 2265 2266 This function transforms control flow constructs containing memory 2267 writes of the form: 2268 2269 | for (i = 0; i < N; i++) 2270 | if (cond) 2271 | A[i] = expr; 2272 2273 into the following form that does not contain control flow: 2274 2275 | for (i = 0; i < N; i++) 2276 | A[i] = cond ? expr : A[i]; 2277 2278 The original CFG looks like this: 2279 2280 | bb_0 2281 | i = 0 2282 | end_bb_0 2283 | 2284 | bb_1 2285 | if (i < N) goto bb_5 else goto bb_2 2286 | end_bb_1 2287 | 2288 | bb_2 2289 | cond = some_computation; 2290 | if (cond) goto bb_3 else goto bb_4 2291 | end_bb_2 2292 | 2293 | bb_3 2294 | A[i] = expr; 2295 | goto bb_4 2296 | end_bb_3 2297 | 2298 | bb_4 2299 | goto bb_1 2300 | end_bb_4 2301 2302 insert_gimplified_predicates inserts the computation of the COND 2303 expression at the beginning of the destination basic block: 2304 2305 | bb_0 2306 | i = 0 2307 | end_bb_0 2308 | 2309 | bb_1 2310 | if (i < N) goto bb_5 else goto bb_2 2311 | end_bb_1 2312 | 2313 | bb_2 2314 | cond = some_computation; 2315 | if (cond) goto bb_3 else goto bb_4 2316 | end_bb_2 2317 | 2318 | bb_3 2319 | cond = some_computation; 2320 | A[i] = expr; 2321 | goto bb_4 2322 | end_bb_3 2323 | 2324 | bb_4 2325 | goto bb_1 2326 | end_bb_4 2327 2328 predicate_statements is then predicating the memory write as follows: 2329 2330 | bb_0 2331 | i = 0 2332 | end_bb_0 2333 | 2334 | bb_1 2335 | if (i < N) goto bb_5 else goto bb_2 2336 | end_bb_1 2337 | 2338 | bb_2 2339 | if (cond) goto bb_3 else goto bb_4 2340 | end_bb_2 2341 | 2342 | bb_3 2343 | cond = some_computation; 2344 | A[i] = cond ? expr : A[i]; 2345 | goto bb_4 2346 | end_bb_3 2347 | 2348 | bb_4 2349 | goto bb_1 2350 | end_bb_4 2351 2352 and finally combine_blocks removes the basic block boundaries making 2353 the loop vectorizable: 2354 2355 | bb_0 2356 | i = 0 2357 | if (i < N) goto bb_5 else goto bb_1 2358 | end_bb_0 2359 | 2360 | bb_1 2361 | cond = some_computation; 2362 | A[i] = cond ? expr : A[i]; 2363 | if (i < N) goto bb_5 else goto bb_4 2364 | end_bb_1 2365 | 2366 | bb_4 2367 | goto bb_1 2368 | end_bb_4 2369*/ 2370 2371static void 2372predicate_statements (loop_p loop) 2373{ 2374 unsigned int i, orig_loop_num_nodes = loop->num_nodes; 2375 auto_vec<int, 1> vect_sizes; 2376 auto_vec<tree, 1> vect_masks; 2377 hash_set<tree_ssa_name_hash> ssa_names; 2378 2379 for (i = 1; i < orig_loop_num_nodes; i++) 2380 { 2381 gimple_stmt_iterator gsi; 2382 basic_block bb = ifc_bbs[i]; 2383 tree cond = bb_predicate (bb); 2384 bool swap; 2385 int index; 2386 2387 if (is_true_predicate (cond)) 2388 continue; 2389 2390 swap = false; 2391 if (TREE_CODE (cond) == TRUTH_NOT_EXPR) 2392 { 2393 swap = true; 2394 cond = TREE_OPERAND (cond, 0); 2395 } 2396 2397 vect_sizes.truncate (0); 2398 vect_masks.truncate (0); 2399 2400 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi);) 2401 { 2402 gassign *stmt = dyn_cast <gassign *> (gsi_stmt (gsi)); 2403 if (!stmt) 2404 ; 2405 else if (is_false_predicate (cond) 2406 && gimple_vdef (stmt)) 2407 { 2408 unlink_stmt_vdef (stmt); 2409 gsi_remove (&gsi, true); 2410 release_defs (stmt); 2411 continue; 2412 } 2413 else if (gimple_plf (stmt, GF_PLF_2)) 2414 { 2415 tree lhs = gimple_assign_lhs (stmt); 2416 tree mask; 2417 gimple *new_stmt; 2418 gimple_seq stmts = NULL; 2419 machine_mode mode = TYPE_MODE (TREE_TYPE (lhs)); 2420 /* We checked before setting GF_PLF_2 that an equivalent 2421 integer mode exists. */ 2422 int bitsize = GET_MODE_BITSIZE (mode).to_constant (); 2423 if (!vect_sizes.is_empty () 2424 && (index = mask_exists (bitsize, vect_sizes)) != -1) 2425 /* Use created mask. */ 2426 mask = vect_masks[index]; 2427 else 2428 { 2429 if (COMPARISON_CLASS_P (cond)) 2430 mask = gimple_build (&stmts, TREE_CODE (cond), 2431 boolean_type_node, 2432 TREE_OPERAND (cond, 0), 2433 TREE_OPERAND (cond, 1)); 2434 else 2435 mask = cond; 2436 2437 if (swap) 2438 { 2439 tree true_val 2440 = constant_boolean_node (true, TREE_TYPE (mask)); 2441 mask = gimple_build (&stmts, BIT_XOR_EXPR, 2442 TREE_TYPE (mask), mask, true_val); 2443 } 2444 gsi_insert_seq_before (&gsi, stmts, GSI_SAME_STMT); 2445 2446 /* Save mask and its size for further use. */ 2447 vect_sizes.safe_push (bitsize); 2448 vect_masks.safe_push (mask); 2449 } 2450 if (gimple_assign_single_p (stmt)) 2451 new_stmt = predicate_load_or_store (&gsi, stmt, mask); 2452 else 2453 new_stmt = predicate_rhs_code (stmt, mask, cond, &ssa_names); 2454 2455 gsi_replace (&gsi, new_stmt, true); 2456 } 2457 else if (gimple_vdef (stmt)) 2458 { 2459 tree lhs = gimple_assign_lhs (stmt); 2460 tree rhs = gimple_assign_rhs1 (stmt); 2461 tree type = TREE_TYPE (lhs); 2462 2463 lhs = ifc_temp_var (type, unshare_expr (lhs), &gsi); 2464 rhs = ifc_temp_var (type, unshare_expr (rhs), &gsi); 2465 if (swap) 2466 std::swap (lhs, rhs); 2467 cond = force_gimple_operand_gsi_1 (&gsi, unshare_expr (cond), 2468 is_gimple_condexpr, NULL_TREE, 2469 true, GSI_SAME_STMT); 2470 rhs = fold_build_cond_expr (type, unshare_expr (cond), rhs, lhs); 2471 gimple_assign_set_rhs1 (stmt, ifc_temp_var (type, rhs, &gsi)); 2472 update_stmt (stmt); 2473 } 2474 tree lhs = gimple_get_lhs (gsi_stmt (gsi)); 2475 if (lhs && TREE_CODE (lhs) == SSA_NAME) 2476 ssa_names.add (lhs); 2477 gsi_next (&gsi); 2478 } 2479 ssa_names.empty (); 2480 } 2481} 2482 2483/* Remove all GIMPLE_CONDs and GIMPLE_LABELs of all the basic blocks 2484 other than the exit and latch of the LOOP. Also resets the 2485 GIMPLE_DEBUG information. */ 2486 2487static void 2488remove_conditions_and_labels (loop_p loop) 2489{ 2490 gimple_stmt_iterator gsi; 2491 unsigned int i; 2492 2493 for (i = 0; i < loop->num_nodes; i++) 2494 { 2495 basic_block bb = ifc_bbs[i]; 2496 2497 if (bb_with_exit_edge_p (loop, bb) 2498 || bb == loop->latch) 2499 continue; 2500 2501 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); ) 2502 switch (gimple_code (gsi_stmt (gsi))) 2503 { 2504 case GIMPLE_COND: 2505 case GIMPLE_LABEL: 2506 gsi_remove (&gsi, true); 2507 break; 2508 2509 case GIMPLE_DEBUG: 2510 /* ??? Should there be conditional GIMPLE_DEBUG_BINDs? */ 2511 if (gimple_debug_bind_p (gsi_stmt (gsi))) 2512 { 2513 gimple_debug_bind_reset_value (gsi_stmt (gsi)); 2514 update_stmt (gsi_stmt (gsi)); 2515 } 2516 gsi_next (&gsi); 2517 break; 2518 2519 default: 2520 gsi_next (&gsi); 2521 } 2522 } 2523} 2524 2525/* Combine all the basic blocks from LOOP into one or two super basic 2526 blocks. Replace PHI nodes with conditional modify expressions. */ 2527 2528static void 2529combine_blocks (struct loop *loop) 2530{ 2531 basic_block bb, exit_bb, merge_target_bb; 2532 unsigned int orig_loop_num_nodes = loop->num_nodes; 2533 unsigned int i; 2534 edge e; 2535 edge_iterator ei; 2536 2537 remove_conditions_and_labels (loop); 2538 insert_gimplified_predicates (loop); 2539 predicate_all_scalar_phis (loop); 2540 2541 if (need_to_predicate) 2542 predicate_statements (loop); 2543 2544 /* Merge basic blocks: first remove all the edges in the loop, 2545 except for those from the exit block. */ 2546 exit_bb = NULL; 2547 bool *predicated = XNEWVEC (bool, orig_loop_num_nodes); 2548 for (i = 0; i < orig_loop_num_nodes; i++) 2549 { 2550 bb = ifc_bbs[i]; 2551 predicated[i] = !is_true_predicate (bb_predicate (bb)); 2552 free_bb_predicate (bb); 2553 if (bb_with_exit_edge_p (loop, bb)) 2554 { 2555 gcc_assert (exit_bb == NULL); 2556 exit_bb = bb; 2557 } 2558 } 2559 gcc_assert (exit_bb != loop->latch); 2560 2561 for (i = 1; i < orig_loop_num_nodes; i++) 2562 { 2563 bb = ifc_bbs[i]; 2564 2565 for (ei = ei_start (bb->preds); (e = ei_safe_edge (ei));) 2566 { 2567 if (e->src == exit_bb) 2568 ei_next (&ei); 2569 else 2570 remove_edge (e); 2571 } 2572 } 2573 2574 if (exit_bb != NULL) 2575 { 2576 if (exit_bb != loop->header) 2577 { 2578 /* Connect this node to loop header. */ 2579 make_single_succ_edge (loop->header, exit_bb, EDGE_FALLTHRU); 2580 set_immediate_dominator (CDI_DOMINATORS, exit_bb, loop->header); 2581 } 2582 2583 /* Redirect non-exit edges to loop->latch. */ 2584 FOR_EACH_EDGE (e, ei, exit_bb->succs) 2585 { 2586 if (!loop_exit_edge_p (loop, e)) 2587 redirect_edge_and_branch (e, loop->latch); 2588 } 2589 set_immediate_dominator (CDI_DOMINATORS, loop->latch, exit_bb); 2590 } 2591 else 2592 { 2593 /* If the loop does not have an exit, reconnect header and latch. */ 2594 make_edge (loop->header, loop->latch, EDGE_FALLTHRU); 2595 set_immediate_dominator (CDI_DOMINATORS, loop->latch, loop->header); 2596 } 2597 2598 merge_target_bb = loop->header; 2599 2600 /* Get at the virtual def valid for uses starting at the first block 2601 we merge into the header. Without a virtual PHI the loop has the 2602 same virtual use on all stmts. */ 2603 gphi *vphi = get_virtual_phi (loop->header); 2604 tree last_vdef = NULL_TREE; 2605 if (vphi) 2606 { 2607 last_vdef = gimple_phi_result (vphi); 2608 for (gimple_stmt_iterator gsi = gsi_start_bb (loop->header); 2609 ! gsi_end_p (gsi); gsi_next (&gsi)) 2610 if (gimple_vdef (gsi_stmt (gsi))) 2611 last_vdef = gimple_vdef (gsi_stmt (gsi)); 2612 } 2613 for (i = 1; i < orig_loop_num_nodes; i++) 2614 { 2615 gimple_stmt_iterator gsi; 2616 gimple_stmt_iterator last; 2617 2618 bb = ifc_bbs[i]; 2619 2620 if (bb == exit_bb || bb == loop->latch) 2621 continue; 2622 2623 /* We release virtual PHIs late because we have to propagate them 2624 out using the current VUSE. The def might be the one used 2625 after the loop. */ 2626 vphi = get_virtual_phi (bb); 2627 if (vphi) 2628 { 2629 /* When there's just loads inside the loop a stray virtual 2630 PHI merging the uses can appear, update last_vdef from 2631 it. */ 2632 if (!last_vdef) 2633 last_vdef = gimple_phi_arg_def (vphi, 0); 2634 imm_use_iterator iter; 2635 use_operand_p use_p; 2636 gimple *use_stmt; 2637 FOR_EACH_IMM_USE_STMT (use_stmt, iter, gimple_phi_result (vphi)) 2638 { 2639 FOR_EACH_IMM_USE_ON_STMT (use_p, iter) 2640 SET_USE (use_p, last_vdef); 2641 } 2642 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (gimple_phi_result (vphi))) 2643 SSA_NAME_OCCURS_IN_ABNORMAL_PHI (last_vdef) = 1; 2644 gsi = gsi_for_stmt (vphi); 2645 remove_phi_node (&gsi, true); 2646 } 2647 2648 /* Make stmts member of loop->header and clear range info from all stmts 2649 in BB which is now no longer executed conditional on a predicate we 2650 could have derived it from. */ 2651 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) 2652 { 2653 gimple *stmt = gsi_stmt (gsi); 2654 gimple_set_bb (stmt, merge_target_bb); 2655 /* Update virtual operands. */ 2656 if (last_vdef) 2657 { 2658 use_operand_p use_p = ssa_vuse_operand (stmt); 2659 if (use_p 2660 && USE_FROM_PTR (use_p) != last_vdef) 2661 SET_USE (use_p, last_vdef); 2662 if (gimple_vdef (stmt)) 2663 last_vdef = gimple_vdef (stmt); 2664 } 2665 else 2666 /* If this is the first load we arrive at update last_vdef 2667 so we handle stray PHIs correctly. */ 2668 last_vdef = gimple_vuse (stmt); 2669 if (predicated[i]) 2670 { 2671 ssa_op_iter i; 2672 tree op; 2673 FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_DEF) 2674 reset_flow_sensitive_info (op); 2675 } 2676 } 2677 2678 /* Update stmt list. */ 2679 last = gsi_last_bb (merge_target_bb); 2680 gsi_insert_seq_after_without_update (&last, bb_seq (bb), GSI_NEW_STMT); 2681 set_bb_seq (bb, NULL); 2682 2683 delete_basic_block (bb); 2684 } 2685 2686 /* If possible, merge loop header to the block with the exit edge. 2687 This reduces the number of basic blocks to two, to please the 2688 vectorizer that handles only loops with two nodes. */ 2689 if (exit_bb 2690 && exit_bb != loop->header) 2691 { 2692 /* We release virtual PHIs late because we have to propagate them 2693 out using the current VUSE. The def might be the one used 2694 after the loop. */ 2695 vphi = get_virtual_phi (exit_bb); 2696 if (vphi) 2697 { 2698 imm_use_iterator iter; 2699 use_operand_p use_p; 2700 gimple *use_stmt; 2701 FOR_EACH_IMM_USE_STMT (use_stmt, iter, gimple_phi_result (vphi)) 2702 { 2703 FOR_EACH_IMM_USE_ON_STMT (use_p, iter) 2704 SET_USE (use_p, last_vdef); 2705 } 2706 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (gimple_phi_result (vphi))) 2707 SSA_NAME_OCCURS_IN_ABNORMAL_PHI (last_vdef) = 1; 2708 gimple_stmt_iterator gsi = gsi_for_stmt (vphi); 2709 remove_phi_node (&gsi, true); 2710 } 2711 2712 if (can_merge_blocks_p (loop->header, exit_bb)) 2713 merge_blocks (loop->header, exit_bb); 2714 } 2715 2716 free (ifc_bbs); 2717 ifc_bbs = NULL; 2718 free (predicated); 2719} 2720 2721/* Version LOOP before if-converting it; the original loop 2722 will be if-converted, the new copy of the loop will not, 2723 and the LOOP_VECTORIZED internal call will be guarding which 2724 loop to execute. The vectorizer pass will fold this 2725 internal call into either true or false. 2726 2727 Note that this function intentionally invalidates profile. Both edges 2728 out of LOOP_VECTORIZED must have 100% probability so the profile remains 2729 consistent after the condition is folded in the vectorizer. */ 2730 2731static struct loop * 2732version_loop_for_if_conversion (struct loop *loop, vec<gimple *> *preds) 2733{ 2734 basic_block cond_bb; 2735 tree cond = make_ssa_name (boolean_type_node); 2736 struct loop *new_loop; 2737 gimple *g; 2738 gimple_stmt_iterator gsi; 2739 unsigned int save_length; 2740 2741 g = gimple_build_call_internal (IFN_LOOP_VECTORIZED, 2, 2742 build_int_cst (integer_type_node, loop->num), 2743 integer_zero_node); 2744 gimple_call_set_lhs (g, cond); 2745 2746 /* Save BB->aux around loop_version as that uses the same field. */ 2747 save_length = loop->inner ? loop->inner->num_nodes : loop->num_nodes; 2748 void **saved_preds = XALLOCAVEC (void *, save_length); 2749 for (unsigned i = 0; i < save_length; i++) 2750 saved_preds[i] = ifc_bbs[i]->aux; 2751 2752 initialize_original_copy_tables (); 2753 /* At this point we invalidate porfile confistency until IFN_LOOP_VECTORIZED 2754 is re-merged in the vectorizer. */ 2755 new_loop = loop_version (loop, cond, &cond_bb, 2756 profile_probability::always (), 2757 profile_probability::always (), 2758 profile_probability::always (), 2759 profile_probability::always (), true); 2760 free_original_copy_tables (); 2761 2762 for (unsigned i = 0; i < save_length; i++) 2763 ifc_bbs[i]->aux = saved_preds[i]; 2764 2765 if (new_loop == NULL) 2766 return NULL; 2767 2768 new_loop->dont_vectorize = true; 2769 new_loop->force_vectorize = false; 2770 gsi = gsi_last_bb (cond_bb); 2771 gimple_call_set_arg (g, 1, build_int_cst (integer_type_node, new_loop->num)); 2772 if (preds) 2773 preds->safe_push (g); 2774 gsi_insert_before (&gsi, g, GSI_SAME_STMT); 2775 update_ssa (TODO_update_ssa); 2776 return new_loop; 2777} 2778 2779/* Return true when LOOP satisfies the follow conditions that will 2780 allow it to be recognized by the vectorizer for outer-loop 2781 vectorization: 2782 - The loop is not the root node of the loop tree. 2783 - The loop has exactly one inner loop. 2784 - The loop has a single exit. 2785 - The loop header has a single successor, which is the inner 2786 loop header. 2787 - Each of the inner and outer loop latches have a single 2788 predecessor. 2789 - The loop exit block has a single predecessor, which is the 2790 inner loop's exit block. */ 2791 2792static bool 2793versionable_outer_loop_p (struct loop *loop) 2794{ 2795 if (!loop_outer (loop) 2796 || loop->dont_vectorize 2797 || !loop->inner 2798 || loop->inner->next 2799 || !single_exit (loop) 2800 || !single_succ_p (loop->header) 2801 || single_succ (loop->header) != loop->inner->header 2802 || !single_pred_p (loop->latch) 2803 || !single_pred_p (loop->inner->latch)) 2804 return false; 2805 2806 basic_block outer_exit = single_pred (loop->latch); 2807 basic_block inner_exit = single_pred (loop->inner->latch); 2808 2809 if (!single_pred_p (outer_exit) || single_pred (outer_exit) != inner_exit) 2810 return false; 2811 2812 if (dump_file) 2813 fprintf (dump_file, "Found vectorizable outer loop for versioning\n"); 2814 2815 return true; 2816} 2817 2818/* Performs splitting of critical edges. Skip splitting and return false 2819 if LOOP will not be converted because: 2820 2821 - LOOP is not well formed. 2822 - LOOP has PHI with more than MAX_PHI_ARG_NUM arguments. 2823 2824 Last restriction is valid only if AGGRESSIVE_IF_CONV is false. */ 2825 2826static bool 2827ifcvt_split_critical_edges (struct loop *loop, bool aggressive_if_conv) 2828{ 2829 basic_block *body; 2830 basic_block bb; 2831 unsigned int num = loop->num_nodes; 2832 unsigned int i; 2833 gimple *stmt; 2834 edge e; 2835 edge_iterator ei; 2836 auto_vec<edge> critical_edges; 2837 2838 /* Loop is not well formed. */ 2839 if (num <= 2 || loop->inner || !single_exit (loop)) 2840 return false; 2841 2842 body = get_loop_body (loop); 2843 for (i = 0; i < num; i++) 2844 { 2845 bb = body[i]; 2846 if (!aggressive_if_conv 2847 && phi_nodes (bb) 2848 && EDGE_COUNT (bb->preds) > MAX_PHI_ARG_NUM) 2849 { 2850 if (dump_file && (dump_flags & TDF_DETAILS)) 2851 fprintf (dump_file, 2852 "BB %d has complicated PHI with more than %u args.\n", 2853 bb->index, MAX_PHI_ARG_NUM); 2854 2855 free (body); 2856 return false; 2857 } 2858 if (bb == loop->latch || bb_with_exit_edge_p (loop, bb)) 2859 continue; 2860 2861 stmt = last_stmt (bb); 2862 /* Skip basic blocks not ending with conditional branch. */ 2863 if (!stmt || gimple_code (stmt) != GIMPLE_COND) 2864 continue; 2865 2866 FOR_EACH_EDGE (e, ei, bb->succs) 2867 if (EDGE_CRITICAL_P (e) && e->dest->loop_father == loop) 2868 critical_edges.safe_push (e); 2869 } 2870 free (body); 2871 2872 while (critical_edges.length () > 0) 2873 { 2874 e = critical_edges.pop (); 2875 /* Don't split if bb can be predicated along non-critical edge. */ 2876 if (EDGE_COUNT (e->dest->preds) > 2 || all_preds_critical_p (e->dest)) 2877 split_edge (e); 2878 } 2879 2880 return true; 2881} 2882 2883/* Delete redundant statements produced by predication which prevents 2884 loop vectorization. */ 2885 2886static void 2887ifcvt_local_dce (basic_block bb) 2888{ 2889 gimple *stmt; 2890 gimple *stmt1; 2891 gimple *phi; 2892 gimple_stmt_iterator gsi; 2893 auto_vec<gimple *> worklist; 2894 enum gimple_code code; 2895 use_operand_p use_p; 2896 imm_use_iterator imm_iter; 2897 std::pair <tree, tree> *name_pair; 2898 unsigned int i; 2899 2900 FOR_EACH_VEC_ELT (redundant_ssa_names, i, name_pair) 2901 replace_uses_by (name_pair->first, name_pair->second); 2902 redundant_ssa_names.release (); 2903 2904 worklist.create (64); 2905 /* Consider all phi as live statements. */ 2906 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi)) 2907 { 2908 phi = gsi_stmt (gsi); 2909 gimple_set_plf (phi, GF_PLF_2, true); 2910 worklist.safe_push (phi); 2911 } 2912 /* Consider load/store statements, CALL and COND as live. */ 2913 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) 2914 { 2915 stmt = gsi_stmt (gsi); 2916 if (gimple_store_p (stmt) 2917 || gimple_assign_load_p (stmt) 2918 || is_gimple_debug (stmt)) 2919 { 2920 gimple_set_plf (stmt, GF_PLF_2, true); 2921 worklist.safe_push (stmt); 2922 continue; 2923 } 2924 code = gimple_code (stmt); 2925 if (code == GIMPLE_COND || code == GIMPLE_CALL) 2926 { 2927 gimple_set_plf (stmt, GF_PLF_2, true); 2928 worklist.safe_push (stmt); 2929 continue; 2930 } 2931 gimple_set_plf (stmt, GF_PLF_2, false); 2932 2933 if (code == GIMPLE_ASSIGN) 2934 { 2935 tree lhs = gimple_assign_lhs (stmt); 2936 FOR_EACH_IMM_USE_FAST (use_p, imm_iter, lhs) 2937 { 2938 stmt1 = USE_STMT (use_p); 2939 if (gimple_bb (stmt1) != bb) 2940 { 2941 gimple_set_plf (stmt, GF_PLF_2, true); 2942 worklist.safe_push (stmt); 2943 break; 2944 } 2945 } 2946 } 2947 } 2948 /* Propagate liveness through arguments of live stmt. */ 2949 while (worklist.length () > 0) 2950 { 2951 ssa_op_iter iter; 2952 use_operand_p use_p; 2953 tree use; 2954 2955 stmt = worklist.pop (); 2956 FOR_EACH_PHI_OR_STMT_USE (use_p, stmt, iter, SSA_OP_USE) 2957 { 2958 use = USE_FROM_PTR (use_p); 2959 if (TREE_CODE (use) != SSA_NAME) 2960 continue; 2961 stmt1 = SSA_NAME_DEF_STMT (use); 2962 if (gimple_bb (stmt1) != bb 2963 || gimple_plf (stmt1, GF_PLF_2)) 2964 continue; 2965 gimple_set_plf (stmt1, GF_PLF_2, true); 2966 worklist.safe_push (stmt1); 2967 } 2968 } 2969 /* Delete dead statements. */ 2970 gsi = gsi_start_bb (bb); 2971 while (!gsi_end_p (gsi)) 2972 { 2973 stmt = gsi_stmt (gsi); 2974 if (gimple_plf (stmt, GF_PLF_2)) 2975 { 2976 gsi_next (&gsi); 2977 continue; 2978 } 2979 if (dump_file && (dump_flags & TDF_DETAILS)) 2980 { 2981 fprintf (dump_file, "Delete dead stmt in bb#%d\n", bb->index); 2982 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM); 2983 } 2984 gsi_remove (&gsi, true); 2985 release_defs (stmt); 2986 } 2987} 2988 2989/* If-convert LOOP when it is legal. For the moment this pass has no 2990 profitability analysis. Returns non-zero todo flags when something 2991 changed. */ 2992 2993unsigned int 2994tree_if_conversion (struct loop *loop, vec<gimple *> *preds) 2995{ 2996 unsigned int todo = 0; 2997 bool aggressive_if_conv; 2998 struct loop *rloop; 2999 bitmap exit_bbs; 3000 3001 again: 3002 rloop = NULL; 3003 ifc_bbs = NULL; 3004 need_to_predicate = false; 3005 any_complicated_phi = false; 3006 3007 /* Apply more aggressive if-conversion when loop or its outer loop were 3008 marked with simd pragma. When that's the case, we try to if-convert 3009 loop containing PHIs with more than MAX_PHI_ARG_NUM arguments. */ 3010 aggressive_if_conv = loop->force_vectorize; 3011 if (!aggressive_if_conv) 3012 { 3013 struct loop *outer_loop = loop_outer (loop); 3014 if (outer_loop && outer_loop->force_vectorize) 3015 aggressive_if_conv = true; 3016 } 3017 3018 if (!ifcvt_split_critical_edges (loop, aggressive_if_conv)) 3019 goto cleanup; 3020 3021 if (!if_convertible_loop_p (loop) 3022 || !dbg_cnt (if_conversion_tree)) 3023 goto cleanup; 3024 3025 if ((need_to_predicate || any_complicated_phi) 3026 && ((!flag_tree_loop_vectorize && !loop->force_vectorize) 3027 || loop->dont_vectorize)) 3028 goto cleanup; 3029 3030 /* Since we have no cost model, always version loops unless the user 3031 specified -ftree-loop-if-convert or unless versioning is required. 3032 Either version this loop, or if the pattern is right for outer-loop 3033 vectorization, version the outer loop. In the latter case we will 3034 still if-convert the original inner loop. */ 3035 if (need_to_predicate 3036 || any_complicated_phi 3037 || flag_tree_loop_if_convert != 1) 3038 { 3039 struct loop *vloop 3040 = (versionable_outer_loop_p (loop_outer (loop)) 3041 ? loop_outer (loop) : loop); 3042 struct loop *nloop = version_loop_for_if_conversion (vloop, preds); 3043 if (nloop == NULL) 3044 goto cleanup; 3045 if (vloop != loop) 3046 { 3047 /* If versionable_outer_loop_p decided to version the 3048 outer loop, version also the inner loop of the non-vectorized 3049 loop copy. So we transform: 3050 loop1 3051 loop2 3052 into: 3053 if (LOOP_VECTORIZED (1, 3)) 3054 { 3055 loop1 3056 loop2 3057 } 3058 else 3059 loop3 (copy of loop1) 3060 if (LOOP_VECTORIZED (4, 5)) 3061 loop4 (copy of loop2) 3062 else 3063 loop5 (copy of loop4) */ 3064 gcc_assert (nloop->inner && nloop->inner->next == NULL); 3065 rloop = nloop->inner; 3066 } 3067 } 3068 3069 /* Now all statements are if-convertible. Combine all the basic 3070 blocks into one huge basic block doing the if-conversion 3071 on-the-fly. */ 3072 combine_blocks (loop); 3073 3074 /* Delete dead predicate computations. */ 3075 ifcvt_local_dce (loop->header); 3076 3077 /* Perform local CSE, this esp. helps the vectorizer analysis if loads 3078 and stores are involved. CSE only the loop body, not the entry 3079 PHIs, those are to be kept in sync with the non-if-converted copy. 3080 ??? We'll still keep dead stores though. */ 3081 exit_bbs = BITMAP_ALLOC (NULL); 3082 bitmap_set_bit (exit_bbs, single_exit (loop)->dest->index); 3083 bitmap_set_bit (exit_bbs, loop->latch->index); 3084 todo |= do_rpo_vn (cfun, loop_preheader_edge (loop), exit_bbs); 3085 BITMAP_FREE (exit_bbs); 3086 3087 todo |= TODO_cleanup_cfg; 3088 3089 cleanup: 3090 if (ifc_bbs) 3091 { 3092 unsigned int i; 3093 3094 for (i = 0; i < loop->num_nodes; i++) 3095 free_bb_predicate (ifc_bbs[i]); 3096 3097 free (ifc_bbs); 3098 ifc_bbs = NULL; 3099 } 3100 if (rloop != NULL) 3101 { 3102 loop = rloop; 3103 goto again; 3104 } 3105 3106 return todo; 3107} 3108 3109/* Tree if-conversion pass management. */ 3110 3111namespace { 3112 3113const pass_data pass_data_if_conversion = 3114{ 3115 GIMPLE_PASS, /* type */ 3116 "ifcvt", /* name */ 3117 OPTGROUP_NONE, /* optinfo_flags */ 3118 TV_TREE_LOOP_IFCVT, /* tv_id */ 3119 ( PROP_cfg | PROP_ssa ), /* properties_required */ 3120 0, /* properties_provided */ 3121 0, /* properties_destroyed */ 3122 0, /* todo_flags_start */ 3123 0, /* todo_flags_finish */ 3124}; 3125 3126class pass_if_conversion : public gimple_opt_pass 3127{ 3128public: 3129 pass_if_conversion (gcc::context *ctxt) 3130 : gimple_opt_pass (pass_data_if_conversion, ctxt) 3131 {} 3132 3133 /* opt_pass methods: */ 3134 virtual bool gate (function *); 3135 virtual unsigned int execute (function *); 3136 3137}; // class pass_if_conversion 3138 3139bool 3140pass_if_conversion::gate (function *fun) 3141{ 3142 return (((flag_tree_loop_vectorize || fun->has_force_vectorize_loops) 3143 && flag_tree_loop_if_convert != 0) 3144 || flag_tree_loop_if_convert == 1); 3145} 3146 3147unsigned int 3148pass_if_conversion::execute (function *fun) 3149{ 3150 struct loop *loop; 3151 unsigned todo = 0; 3152 3153 if (number_of_loops (fun) <= 1) 3154 return 0; 3155 3156 auto_vec<gimple *> preds; 3157 FOR_EACH_LOOP (loop, 0) 3158 if (flag_tree_loop_if_convert == 1 3159 || ((flag_tree_loop_vectorize || loop->force_vectorize) 3160 && !loop->dont_vectorize)) 3161 todo |= tree_if_conversion (loop, &preds); 3162 3163 if (todo) 3164 { 3165 free_numbers_of_iterations_estimates (fun); 3166 scev_reset (); 3167 } 3168 3169 if (flag_checking) 3170 { 3171 basic_block bb; 3172 FOR_EACH_BB_FN (bb, fun) 3173 gcc_assert (!bb->aux); 3174 } 3175 3176 /* Perform IL update now, it might elide some loops. */ 3177 if (todo & TODO_cleanup_cfg) 3178 { 3179 cleanup_tree_cfg (); 3180 if (need_ssa_update_p (fun)) 3181 todo |= TODO_update_ssa; 3182 } 3183 if (todo & TODO_update_ssa_any) 3184 update_ssa (todo & TODO_update_ssa_any); 3185 3186 /* If if-conversion elided the loop fall back to the original one. */ 3187 for (unsigned i = 0; i < preds.length (); ++i) 3188 { 3189 gimple *g = preds[i]; 3190 if (!gimple_bb (g)) 3191 continue; 3192 unsigned ifcvt_loop = tree_to_uhwi (gimple_call_arg (g, 0)); 3193 if (!get_loop (fun, ifcvt_loop)) 3194 { 3195 if (dump_file) 3196 fprintf (dump_file, "If-converted loop vanished\n"); 3197 fold_loop_internal_call (g, boolean_false_node); 3198 } 3199 } 3200 3201 return 0; 3202} 3203 3204} // anon namespace 3205 3206gimple_opt_pass * 3207make_pass_if_conversion (gcc::context *ctxt) 3208{ 3209 return new pass_if_conversion (ctxt); 3210} 3211