1 /* If-conversion for vectorizer. 2 Copyright (C) 2004-2024 Free Software Foundation, Inc. 3 Contributed by Devang Patel <dpatel (at) apple.com> 4 5 This file is part of GCC. 6 7 GCC is free software; you can redistribute it and/or modify it under 8 the terms of the GNU General Public License as published by the Free 9 Software Foundation; either version 3, or (at your option) any later 10 version. 11 12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY 13 WARRANTY; without even the implied warranty of MERCHANTABILITY or 14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15 for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with GCC; see the file COPYING3. If not see 19 <http://www.gnu.org/licenses/>. */ 20 21 /* 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 "expr.h" 95 #include "optabs-tree.h" 96 #include "gimple-pretty-print.h" 97 #include "alias.h" 98 #include "fold-const.h" 99 #include "stor-layout.h" 100 #include "gimple-iterator.h" 101 #include "gimple-fold.h" 102 #include "gimplify.h" 103 #include "gimplify-me.h" 104 #include "tree-cfg.h" 105 #include "tree-into-ssa.h" 106 #include "tree-ssa.h" 107 #include "cfgloop.h" 108 #include "tree-data-ref.h" 109 #include "tree-scalar-evolution.h" 110 #include "tree-ssa-loop.h" 111 #include "tree-ssa-loop-niter.h" 112 #include "tree-ssa-loop-ivopts.h" 113 #include "tree-ssa-address.h" 114 #include "dbgcnt.h" 115 #include "tree-hash-traits.h" 116 #include "varasm.h" 117 #include "builtins.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 #include "tree-ssa-dse.h" 124 #include "tree-vectorizer.h" 125 #include "tree-eh.h" 126 #include "cgraph.h" 127 128 /* For lang_hooks.types.type_for_mode. */ 129 #include "langhooks.h" 130 131 /* Only handle PHIs with no more arguments unless we are asked to by 132 simd pragma. */ 133 #define MAX_PHI_ARG_NUM \ 134 ((unsigned) param_max_tree_if_conversion_phi_args) 135 136 /* True if we've converted a statement that was only executed when some 137 condition C was true, and if for correctness we need to predicate the 138 statement to ensure that it is a no-op when C is false. See 139 predicate_statements for the kinds of predication we support. */ 140 static bool need_to_predicate; 141 142 /* True if we have to rewrite stmts that may invoke undefined behavior 143 when a condition C was false so it doesn't if it is always executed. 144 See predicate_statements for the kinds of predication we support. */ 145 static bool need_to_rewrite_undefined; 146 147 /* Indicate if there are any complicated PHIs that need to be handled in 148 if-conversion. Complicated PHI has more than two arguments and can't 149 be degenerated to two arguments PHI. See more information in comment 150 before phi_convertible_by_degenerating_args. */ 151 static bool any_complicated_phi; 152 153 /* True if we have bitfield accesses we can lower. */ 154 static bool need_to_lower_bitfields; 155 156 /* True if there is any ifcvting to be done. */ 157 static bool need_to_ifcvt; 158 159 /* Hash for struct innermost_loop_behavior. It depends on the user to 160 free the memory. */ 161 162 struct innermost_loop_behavior_hash : nofree_ptr_hash <innermost_loop_behavior> 163 { 164 static inline hashval_t hash (const value_type &); 165 static inline bool equal (const value_type &, 166 const compare_type &); 167 }; 168 169 inline hashval_t 170 innermost_loop_behavior_hash::hash (const value_type &e) 171 { 172 hashval_t hash; 173 174 hash = iterative_hash_expr (e->base_address, 0); 175 hash = iterative_hash_expr (e->offset, hash); 176 hash = iterative_hash_expr (e->init, hash); 177 return iterative_hash_expr (e->step, hash); 178 } 179 180 inline bool 181 innermost_loop_behavior_hash::equal (const value_type &e1, 182 const compare_type &e2) 183 { 184 if ((e1->base_address && !e2->base_address) 185 || (!e1->base_address && e2->base_address) 186 || (!e1->offset && e2->offset) 187 || (e1->offset && !e2->offset) 188 || (!e1->init && e2->init) 189 || (e1->init && !e2->init) 190 || (!e1->step && e2->step) 191 || (e1->step && !e2->step)) 192 return false; 193 194 if (e1->base_address && e2->base_address 195 && !operand_equal_p (e1->base_address, e2->base_address, 0)) 196 return false; 197 if (e1->offset && e2->offset 198 && !operand_equal_p (e1->offset, e2->offset, 0)) 199 return false; 200 if (e1->init && e2->init 201 && !operand_equal_p (e1->init, e2->init, 0)) 202 return false; 203 if (e1->step && e2->step 204 && !operand_equal_p (e1->step, e2->step, 0)) 205 return false; 206 207 return true; 208 } 209 210 /* List of basic blocks in if-conversion-suitable order. */ 211 static basic_block *ifc_bbs; 212 213 /* Hash table to store <DR's innermost loop behavior, DR> pairs. */ 214 static hash_map<innermost_loop_behavior_hash, 215 data_reference_p> *innermost_DR_map; 216 217 /* Hash table to store <base reference, DR> pairs. */ 218 static hash_map<tree_operand_hash, data_reference_p> *baseref_DR_map; 219 220 /* List of redundant SSA names: the first should be replaced by the second. */ 221 static vec< std::pair<tree, tree> > redundant_ssa_names; 222 223 /* Structure used to predicate basic blocks. This is attached to the 224 ->aux field of the BBs in the loop to be if-converted. */ 225 struct bb_predicate { 226 227 /* The condition under which this basic block is executed. */ 228 tree predicate; 229 230 /* PREDICATE is gimplified, and the sequence of statements is 231 recorded here, in order to avoid the duplication of computations 232 that occur in previous conditions. See PR44483. */ 233 gimple_seq predicate_gimplified_stmts; 234 235 /* Records the number of statements recorded into 236 PREDICATE_GIMPLIFIED_STMTS. */ 237 unsigned no_predicate_stmts; 238 }; 239 240 /* Returns true when the basic block BB has a predicate. */ 241 242 static inline bool 243 bb_has_predicate (basic_block bb) 244 { 245 return bb->aux != NULL; 246 } 247 248 /* Returns the gimplified predicate for basic block BB. */ 249 250 static inline tree 251 bb_predicate (basic_block bb) 252 { 253 return ((struct bb_predicate *) bb->aux)->predicate; 254 } 255 256 /* Sets the gimplified predicate COND for basic block BB. */ 257 258 static inline void 259 set_bb_predicate (basic_block bb, tree cond) 260 { 261 auto aux = (struct bb_predicate *) bb->aux; 262 gcc_assert ((TREE_CODE (cond) == TRUTH_NOT_EXPR 263 && is_gimple_val (TREE_OPERAND (cond, 0))) 264 || is_gimple_val (cond)); 265 aux->predicate = cond; 266 aux->no_predicate_stmts++; 267 268 if (dump_file && (dump_flags & TDF_DETAILS)) 269 fprintf (dump_file, "Recording block %d value %d\n", bb->index, 270 aux->no_predicate_stmts); 271 } 272 273 /* Returns the sequence of statements of the gimplification of the 274 predicate for basic block BB. */ 275 276 static inline gimple_seq 277 bb_predicate_gimplified_stmts (basic_block bb) 278 { 279 return ((struct bb_predicate *) bb->aux)->predicate_gimplified_stmts; 280 } 281 282 /* Sets the sequence of statements STMTS of the gimplification of the 283 predicate for basic block BB. If PRESERVE_COUNTS then don't clear the predicate 284 counts. */ 285 286 static inline void 287 set_bb_predicate_gimplified_stmts (basic_block bb, gimple_seq stmts, 288 bool preserve_counts) 289 { 290 ((struct bb_predicate *) bb->aux)->predicate_gimplified_stmts = stmts; 291 if (stmts == NULL && !preserve_counts) 292 ((struct bb_predicate *) bb->aux)->no_predicate_stmts = 0; 293 } 294 295 /* Adds the sequence of statements STMTS to the sequence of statements 296 of the predicate for basic block BB. */ 297 298 static inline void 299 add_bb_predicate_gimplified_stmts (basic_block bb, gimple_seq stmts) 300 { 301 /* We might have updated some stmts in STMTS via force_gimple_operand 302 calling fold_stmt and that producing multiple stmts. Delink immediate 303 uses so update_ssa after loop versioning doesn't get confused for 304 the not yet inserted predicates. 305 ??? This should go away once we reliably avoid updating stmts 306 not in any BB. */ 307 for (gimple_stmt_iterator gsi = gsi_start (stmts); 308 !gsi_end_p (gsi); gsi_next (&gsi)) 309 { 310 gimple *stmt = gsi_stmt (gsi); 311 delink_stmt_imm_use (stmt); 312 gimple_set_modified (stmt, true); 313 ((struct bb_predicate *) bb->aux)->no_predicate_stmts++; 314 } 315 gimple_seq_add_seq_without_update 316 (&(((struct bb_predicate *) bb->aux)->predicate_gimplified_stmts), stmts); 317 } 318 319 /* Return the number of statements the predicate of the basic block consists 320 of. */ 321 322 static inline unsigned 323 get_bb_num_predicate_stmts (basic_block bb) 324 { 325 return ((struct bb_predicate *) bb->aux)->no_predicate_stmts; 326 } 327 328 /* Initializes to TRUE the predicate of basic block BB. */ 329 330 static inline void 331 init_bb_predicate (basic_block bb) 332 { 333 bb->aux = XNEW (struct bb_predicate); 334 set_bb_predicate_gimplified_stmts (bb, NULL, false); 335 set_bb_predicate (bb, boolean_true_node); 336 } 337 338 /* Release the SSA_NAMEs associated with the predicate of basic block BB. */ 339 340 static inline void 341 release_bb_predicate (basic_block bb) 342 { 343 gimple_seq stmts = bb_predicate_gimplified_stmts (bb); 344 if (stmts) 345 { 346 /* Ensure that these stmts haven't yet been added to a bb. */ 347 if (flag_checking) 348 for (gimple_stmt_iterator i = gsi_start (stmts); 349 !gsi_end_p (i); gsi_next (&i)) 350 gcc_assert (! gimple_bb (gsi_stmt (i))); 351 352 /* Discard them. */ 353 gimple_seq_discard (stmts); 354 set_bb_predicate_gimplified_stmts (bb, NULL, false); 355 } 356 } 357 358 /* Free the predicate of basic block BB. */ 359 360 static inline void 361 free_bb_predicate (basic_block bb) 362 { 363 if (!bb_has_predicate (bb)) 364 return; 365 366 release_bb_predicate (bb); 367 free (bb->aux); 368 bb->aux = NULL; 369 } 370 371 /* Reinitialize predicate of BB with the true predicate. */ 372 373 static inline void 374 reset_bb_predicate (basic_block bb) 375 { 376 if (!bb_has_predicate (bb)) 377 init_bb_predicate (bb); 378 else 379 { 380 release_bb_predicate (bb); 381 set_bb_predicate (bb, boolean_true_node); 382 } 383 } 384 385 /* Returns a new SSA_NAME of type TYPE that is assigned the value of 386 the expression EXPR. Inserts the statement created for this 387 computation before GSI and leaves the iterator GSI at the same 388 statement. */ 389 390 static tree 391 ifc_temp_var (tree type, tree expr, gimple_stmt_iterator *gsi) 392 { 393 tree new_name = make_temp_ssa_name (type, NULL, "_ifc_"); 394 gimple *stmt = gimple_build_assign (new_name, expr); 395 gimple_set_vuse (stmt, gimple_vuse (gsi_stmt (*gsi))); 396 gsi_insert_before (gsi, stmt, GSI_SAME_STMT); 397 return new_name; 398 } 399 400 /* Return true when COND is a false predicate. */ 401 402 static inline bool 403 is_false_predicate (tree cond) 404 { 405 return (cond != NULL_TREE 406 && (cond == boolean_false_node 407 || integer_zerop (cond))); 408 } 409 410 /* Return true when COND is a true predicate. */ 411 412 static inline bool 413 is_true_predicate (tree cond) 414 { 415 return (cond == NULL_TREE 416 || cond == boolean_true_node 417 || integer_onep (cond)); 418 } 419 420 /* Returns true when BB has a predicate that is not trivial: true or 421 NULL_TREE. */ 422 423 static inline bool 424 is_predicated (basic_block bb) 425 { 426 return !is_true_predicate (bb_predicate (bb)); 427 } 428 429 /* Parses the predicate COND and returns its comparison code and 430 operands OP0 and OP1. */ 431 432 static enum tree_code 433 parse_predicate (tree cond, tree *op0, tree *op1) 434 { 435 gimple *s; 436 437 if (TREE_CODE (cond) == SSA_NAME 438 && is_gimple_assign (s = SSA_NAME_DEF_STMT (cond))) 439 { 440 if (TREE_CODE_CLASS (gimple_assign_rhs_code (s)) == tcc_comparison) 441 { 442 *op0 = gimple_assign_rhs1 (s); 443 *op1 = gimple_assign_rhs2 (s); 444 return gimple_assign_rhs_code (s); 445 } 446 447 else if (gimple_assign_rhs_code (s) == TRUTH_NOT_EXPR) 448 { 449 tree op = gimple_assign_rhs1 (s); 450 tree type = TREE_TYPE (op); 451 enum tree_code code = parse_predicate (op, op0, op1); 452 453 return code == ERROR_MARK ? ERROR_MARK 454 : invert_tree_comparison (code, HONOR_NANS (type)); 455 } 456 457 return ERROR_MARK; 458 } 459 460 if (COMPARISON_CLASS_P (cond)) 461 { 462 *op0 = TREE_OPERAND (cond, 0); 463 *op1 = TREE_OPERAND (cond, 1); 464 return TREE_CODE (cond); 465 } 466 467 return ERROR_MARK; 468 } 469 470 /* Returns the fold of predicate C1 OR C2 at location LOC. */ 471 472 static tree 473 fold_or_predicates (location_t loc, tree c1, tree c2) 474 { 475 tree op1a, op1b, op2a, op2b; 476 enum tree_code code1 = parse_predicate (c1, &op1a, &op1b); 477 enum tree_code code2 = parse_predicate (c2, &op2a, &op2b); 478 479 if (code1 != ERROR_MARK && code2 != ERROR_MARK) 480 { 481 tree t = maybe_fold_or_comparisons (boolean_type_node, code1, op1a, op1b, 482 code2, op2a, op2b); 483 if (t) 484 return t; 485 } 486 487 return fold_build2_loc (loc, TRUTH_OR_EXPR, boolean_type_node, c1, c2); 488 } 489 490 /* Returns either a COND_EXPR or the folded expression if the folded 491 expression is a MIN_EXPR, a MAX_EXPR, an ABS_EXPR, 492 a constant or a SSA_NAME. */ 493 494 static tree 495 fold_build_cond_expr (tree type, tree cond, tree rhs, tree lhs) 496 { 497 /* If COND is comparison r != 0 and r has boolean type, convert COND 498 to SSA_NAME to accept by vect bool pattern. */ 499 if (TREE_CODE (cond) == NE_EXPR) 500 { 501 tree op0 = TREE_OPERAND (cond, 0); 502 tree op1 = TREE_OPERAND (cond, 1); 503 if (TREE_CODE (op0) == SSA_NAME 504 && TREE_CODE (TREE_TYPE (op0)) == BOOLEAN_TYPE 505 && (integer_zerop (op1))) 506 cond = op0; 507 } 508 509 gimple_match_op cexpr (gimple_match_cond::UNCOND, COND_EXPR, 510 type, cond, rhs, lhs); 511 if (cexpr.resimplify (NULL, follow_all_ssa_edges)) 512 { 513 if (gimple_simplified_result_is_gimple_val (&cexpr)) 514 return cexpr.ops[0]; 515 else if (cexpr.code == ABS_EXPR) 516 return build1 (ABS_EXPR, type, cexpr.ops[0]); 517 else if (cexpr.code == MIN_EXPR 518 || cexpr.code == MAX_EXPR) 519 return build2 ((tree_code)cexpr.code, type, cexpr.ops[0], cexpr.ops[1]); 520 } 521 522 return build3 (COND_EXPR, type, cond, rhs, lhs); 523 } 524 525 /* Add condition NC to the predicate list of basic block BB. LOOP is 526 the loop to be if-converted. Use predicate of cd-equivalent block 527 for join bb if it exists: we call basic blocks bb1 and bb2 528 cd-equivalent if they are executed under the same condition. */ 529 530 static inline void 531 add_to_predicate_list (class loop *loop, basic_block bb, tree nc) 532 { 533 tree bc, *tp; 534 basic_block dom_bb; 535 536 if (is_true_predicate (nc)) 537 return; 538 539 /* If dominance tells us this basic block is always executed, 540 don't record any predicates for it. */ 541 if (dominated_by_p (CDI_DOMINATORS, loop->latch, bb)) 542 return; 543 544 dom_bb = get_immediate_dominator (CDI_DOMINATORS, bb); 545 /* We use notion of cd equivalence to get simpler predicate for 546 join block, e.g. if join block has 2 predecessors with predicates 547 p1 & p2 and p1 & !p2, we'd like to get p1 for it instead of 548 p1 & p2 | p1 & !p2. */ 549 if (dom_bb != loop->header 550 && get_immediate_dominator (CDI_POST_DOMINATORS, dom_bb) == bb) 551 { 552 gcc_assert (flow_bb_inside_loop_p (loop, dom_bb)); 553 bc = bb_predicate (dom_bb); 554 if (!is_true_predicate (bc)) 555 set_bb_predicate (bb, bc); 556 else 557 gcc_assert (is_true_predicate (bb_predicate (bb))); 558 if (dump_file && (dump_flags & TDF_DETAILS)) 559 fprintf (dump_file, "Use predicate of bb#%d for bb#%d\n", 560 dom_bb->index, bb->index); 561 return; 562 } 563 564 if (!is_predicated (bb)) 565 bc = nc; 566 else 567 { 568 bc = bb_predicate (bb); 569 bc = fold_or_predicates (EXPR_LOCATION (bc), nc, bc); 570 if (is_true_predicate (bc)) 571 { 572 reset_bb_predicate (bb); 573 return; 574 } 575 } 576 577 /* Allow a TRUTH_NOT_EXPR around the main predicate. */ 578 if (TREE_CODE (bc) == TRUTH_NOT_EXPR) 579 tp = &TREE_OPERAND (bc, 0); 580 else 581 tp = &bc; 582 if (!is_gimple_val (*tp)) 583 { 584 gimple_seq stmts; 585 *tp = force_gimple_operand (*tp, &stmts, true, NULL_TREE); 586 add_bb_predicate_gimplified_stmts (bb, stmts); 587 } 588 set_bb_predicate (bb, bc); 589 } 590 591 /* Add the condition COND to the previous condition PREV_COND, and add 592 this to the predicate list of the destination of edge E. LOOP is 593 the loop to be if-converted. */ 594 595 static void 596 add_to_dst_predicate_list (class loop *loop, edge e, 597 tree prev_cond, tree cond) 598 { 599 if (!flow_bb_inside_loop_p (loop, e->dest)) 600 return; 601 602 if (!is_true_predicate (prev_cond)) 603 cond = fold_build2 (TRUTH_AND_EXPR, boolean_type_node, 604 prev_cond, cond); 605 606 if (!dominated_by_p (CDI_DOMINATORS, loop->latch, e->dest)) 607 add_to_predicate_list (loop, e->dest, cond); 608 } 609 610 /* Return true if one of the successor edges of BB exits LOOP. */ 611 612 static bool 613 bb_with_exit_edge_p (const class loop *loop, basic_block bb) 614 { 615 edge e; 616 edge_iterator ei; 617 618 FOR_EACH_EDGE (e, ei, bb->succs) 619 if (loop_exit_edge_p (loop, e)) 620 return true; 621 622 return false; 623 } 624 625 /* Given PHI which has more than two arguments, this function checks if 626 it's if-convertible by degenerating its arguments. Specifically, if 627 below two conditions are satisfied: 628 629 1) Number of PHI arguments with different values equals to 2 and one 630 argument has the only occurrence. 631 2) The edge corresponding to the unique argument isn't critical edge. 632 633 Such PHI can be handled as PHIs have only two arguments. For example, 634 below PHI: 635 636 res = PHI <A_1(e1), A_1(e2), A_2(e3)>; 637 638 can be transformed into: 639 640 res = (predicate of e3) ? A_2 : A_1; 641 642 Return TRUE if it is the case, FALSE otherwise. */ 643 644 static bool 645 phi_convertible_by_degenerating_args (gphi *phi) 646 { 647 edge e; 648 tree arg, t1 = NULL, t2 = NULL; 649 unsigned int i, i1 = 0, i2 = 0, n1 = 0, n2 = 0; 650 unsigned int num_args = gimple_phi_num_args (phi); 651 652 gcc_assert (num_args > 2); 653 654 for (i = 0; i < num_args; i++) 655 { 656 arg = gimple_phi_arg_def (phi, i); 657 if (t1 == NULL || operand_equal_p (t1, arg, 0)) 658 { 659 n1++; 660 i1 = i; 661 t1 = arg; 662 } 663 else if (t2 == NULL || operand_equal_p (t2, arg, 0)) 664 { 665 n2++; 666 i2 = i; 667 t2 = arg; 668 } 669 else 670 return false; 671 } 672 673 if (n1 != 1 && n2 != 1) 674 return false; 675 676 /* Check if the edge corresponding to the unique arg is critical. */ 677 e = gimple_phi_arg_edge (phi, (n1 == 1) ? i1 : i2); 678 if (EDGE_COUNT (e->src->succs) > 1) 679 return false; 680 681 return true; 682 } 683 684 /* Return true when PHI is if-convertible. PHI is part of loop LOOP 685 and it belongs to basic block BB. Note at this point, it is sure 686 that PHI is if-convertible. This function updates global variable 687 ANY_COMPLICATED_PHI if PHI is complicated. */ 688 689 static bool 690 if_convertible_phi_p (class loop *loop, basic_block bb, gphi *phi) 691 { 692 if (dump_file && (dump_flags & TDF_DETAILS)) 693 { 694 fprintf (dump_file, "-------------------------\n"); 695 print_gimple_stmt (dump_file, phi, 0, TDF_SLIM); 696 } 697 698 if (bb != loop->header 699 && gimple_phi_num_args (phi) > 2 700 && !phi_convertible_by_degenerating_args (phi)) 701 any_complicated_phi = true; 702 703 return true; 704 } 705 706 /* Records the status of a data reference. This struct is attached to 707 each DR->aux field. */ 708 709 struct ifc_dr { 710 bool rw_unconditionally; 711 bool w_unconditionally; 712 bool written_at_least_once; 713 714 tree rw_predicate; 715 tree w_predicate; 716 tree base_w_predicate; 717 }; 718 719 #define IFC_DR(DR) ((struct ifc_dr *) (DR)->aux) 720 #define DR_BASE_W_UNCONDITIONALLY(DR) (IFC_DR (DR)->written_at_least_once) 721 #define DR_RW_UNCONDITIONALLY(DR) (IFC_DR (DR)->rw_unconditionally) 722 #define DR_W_UNCONDITIONALLY(DR) (IFC_DR (DR)->w_unconditionally) 723 724 /* Iterates over DR's and stores refs, DR and base refs, DR pairs in 725 HASH tables. While storing them in HASH table, it checks if the 726 reference is unconditionally read or written and stores that as a flag 727 information. For base reference it checks if it is written atlest once 728 unconditionally and stores it as flag information along with DR. 729 In other words for every data reference A in STMT there exist other 730 accesses to a data reference with the same base with predicates that 731 add up (OR-up) to the true predicate: this ensures that the data 732 reference A is touched (read or written) on every iteration of the 733 if-converted loop. */ 734 static void 735 hash_memrefs_baserefs_and_store_DRs_read_written_info (data_reference_p a) 736 { 737 738 data_reference_p *master_dr, *base_master_dr; 739 tree base_ref = DR_BASE_OBJECT (a); 740 innermost_loop_behavior *innermost = &DR_INNERMOST (a); 741 tree ca = bb_predicate (gimple_bb (DR_STMT (a))); 742 bool exist1, exist2; 743 744 master_dr = &innermost_DR_map->get_or_insert (innermost, &exist1); 745 if (!exist1) 746 *master_dr = a; 747 748 if (DR_IS_WRITE (a)) 749 { 750 IFC_DR (*master_dr)->w_predicate 751 = fold_or_predicates (UNKNOWN_LOCATION, ca, 752 IFC_DR (*master_dr)->w_predicate); 753 if (is_true_predicate (IFC_DR (*master_dr)->w_predicate)) 754 DR_W_UNCONDITIONALLY (*master_dr) = true; 755 } 756 IFC_DR (*master_dr)->rw_predicate 757 = fold_or_predicates (UNKNOWN_LOCATION, ca, 758 IFC_DR (*master_dr)->rw_predicate); 759 if (is_true_predicate (IFC_DR (*master_dr)->rw_predicate)) 760 DR_RW_UNCONDITIONALLY (*master_dr) = true; 761 762 if (DR_IS_WRITE (a)) 763 { 764 base_master_dr = &baseref_DR_map->get_or_insert (base_ref, &exist2); 765 if (!exist2) 766 *base_master_dr = a; 767 IFC_DR (*base_master_dr)->base_w_predicate 768 = fold_or_predicates (UNKNOWN_LOCATION, ca, 769 IFC_DR (*base_master_dr)->base_w_predicate); 770 if (is_true_predicate (IFC_DR (*base_master_dr)->base_w_predicate)) 771 DR_BASE_W_UNCONDITIONALLY (*base_master_dr) = true; 772 } 773 } 774 775 /* Return TRUE if can prove the index IDX of an array reference REF is 776 within array bound. Return false otherwise. */ 777 778 static bool 779 idx_within_array_bound (tree ref, tree *idx, void *dta) 780 { 781 wi::overflow_type overflow; 782 widest_int niter, valid_niter, delta, wi_step; 783 tree ev, init, step; 784 tree low, high; 785 class loop *loop = (class loop*) dta; 786 787 /* Only support within-bound access for array references. */ 788 if (TREE_CODE (ref) != ARRAY_REF) 789 return false; 790 791 /* For arrays that might have flexible sizes, it is not guaranteed that they 792 do not extend over their declared size. */ 793 if (array_ref_flexible_size_p (ref)) 794 return false; 795 796 ev = analyze_scalar_evolution (loop, *idx); 797 ev = instantiate_parameters (loop, ev); 798 init = initial_condition (ev); 799 step = evolution_part_in_loop_num (ev, loop->num); 800 801 if (!init || TREE_CODE (init) != INTEGER_CST 802 || (step && TREE_CODE (step) != INTEGER_CST)) 803 return false; 804 805 low = array_ref_low_bound (ref); 806 high = array_ref_up_bound (ref); 807 808 /* The case of nonconstant bounds could be handled, but it would be 809 complicated. */ 810 if (TREE_CODE (low) != INTEGER_CST 811 || !high || TREE_CODE (high) != INTEGER_CST) 812 return false; 813 814 /* Check if the intial idx is within bound. */ 815 if (wi::to_widest (init) < wi::to_widest (low) 816 || wi::to_widest (init) > wi::to_widest (high)) 817 return false; 818 819 /* The idx is always within bound. */ 820 if (!step || integer_zerop (step)) 821 return true; 822 823 if (!max_loop_iterations (loop, &niter)) 824 return false; 825 826 if (wi::to_widest (step) < 0) 827 { 828 delta = wi::to_widest (init) - wi::to_widest (low); 829 wi_step = -wi::to_widest (step); 830 } 831 else 832 { 833 delta = wi::to_widest (high) - wi::to_widest (init); 834 wi_step = wi::to_widest (step); 835 } 836 837 valid_niter = wi::div_floor (delta, wi_step, SIGNED, &overflow); 838 /* The iteration space of idx is within array bound. */ 839 if (!overflow && niter <= valid_niter) 840 return true; 841 842 return false; 843 } 844 845 /* Return TRUE if ref is a within bound array reference. */ 846 847 bool 848 ref_within_array_bound (gimple *stmt, tree ref) 849 { 850 class loop *loop = loop_containing_stmt (stmt); 851 852 gcc_assert (loop != NULL); 853 return for_each_index (&ref, idx_within_array_bound, loop); 854 } 855 856 857 /* Given a memory reference expression T, return TRUE if base object 858 it refers to is writable. The base object of a memory reference 859 is the main object being referenced, which is returned by function 860 get_base_address. */ 861 862 static bool 863 base_object_writable (tree ref) 864 { 865 tree base_tree = get_base_address (ref); 866 867 return (base_tree 868 && DECL_P (base_tree) 869 && decl_binds_to_current_def_p (base_tree) 870 && !TREE_READONLY (base_tree)); 871 } 872 873 /* Return true when the memory references of STMT won't trap in the 874 if-converted code. There are two things that we have to check for: 875 876 - writes to memory occur to writable memory: if-conversion of 877 memory writes transforms the conditional memory writes into 878 unconditional writes, i.e. "if (cond) A[i] = foo" is transformed 879 into "A[i] = cond ? foo : A[i]", and as the write to memory may not 880 be executed at all in the original code, it may be a readonly 881 memory. To check that A is not const-qualified, we check that 882 there exists at least an unconditional write to A in the current 883 function. 884 885 - reads or writes to memory are valid memory accesses for every 886 iteration. To check that the memory accesses are correctly formed 887 and that we are allowed to read and write in these locations, we 888 check that the memory accesses to be if-converted occur at every 889 iteration unconditionally. 890 891 Returns true for the memory reference in STMT, same memory reference 892 is read or written unconditionally atleast once and the base memory 893 reference is written unconditionally once. This is to check reference 894 will not write fault. Also retuns true if the memory reference is 895 unconditionally read once then we are conditionally writing to memory 896 which is defined as read and write and is bound to the definition 897 we are seeing. */ 898 static bool 899 ifcvt_memrefs_wont_trap (gimple *stmt, vec<data_reference_p> drs) 900 { 901 /* If DR didn't see a reference here we can't use it to tell 902 whether the ref traps or not. */ 903 if (gimple_uid (stmt) == 0) 904 return false; 905 906 data_reference_p *master_dr, *base_master_dr; 907 data_reference_p a = drs[gimple_uid (stmt) - 1]; 908 909 tree base = DR_BASE_OBJECT (a); 910 innermost_loop_behavior *innermost = &DR_INNERMOST (a); 911 912 gcc_assert (DR_STMT (a) == stmt); 913 gcc_assert (DR_BASE_ADDRESS (a) || DR_OFFSET (a) 914 || DR_INIT (a) || DR_STEP (a)); 915 916 master_dr = innermost_DR_map->get (innermost); 917 gcc_assert (master_dr != NULL); 918 919 base_master_dr = baseref_DR_map->get (base); 920 921 /* If a is unconditionally written to it doesn't trap. */ 922 if (DR_W_UNCONDITIONALLY (*master_dr)) 923 return true; 924 925 /* If a is unconditionally accessed then ... 926 927 Even a is conditional access, we can treat it as an unconditional 928 one if it's an array reference and all its index are within array 929 bound. */ 930 if (DR_RW_UNCONDITIONALLY (*master_dr) 931 || ref_within_array_bound (stmt, DR_REF (a))) 932 { 933 /* an unconditional read won't trap. */ 934 if (DR_IS_READ (a)) 935 return true; 936 937 /* an unconditionaly write won't trap if the base is written 938 to unconditionally. */ 939 if (base_master_dr 940 && DR_BASE_W_UNCONDITIONALLY (*base_master_dr)) 941 return flag_store_data_races; 942 /* or the base is known to be not readonly. */ 943 else if (base_object_writable (DR_REF (a))) 944 return flag_store_data_races; 945 } 946 947 return false; 948 } 949 950 /* Return true if STMT could be converted into a masked load or store 951 (conditional load or store based on a mask computed from bb predicate). */ 952 953 static bool 954 ifcvt_can_use_mask_load_store (gimple *stmt) 955 { 956 /* Check whether this is a load or store. */ 957 tree lhs = gimple_assign_lhs (stmt); 958 bool is_load; 959 tree ref; 960 if (gimple_store_p (stmt)) 961 { 962 if (!is_gimple_val (gimple_assign_rhs1 (stmt))) 963 return false; 964 is_load = false; 965 ref = lhs; 966 } 967 else if (gimple_assign_load_p (stmt)) 968 { 969 is_load = true; 970 ref = gimple_assign_rhs1 (stmt); 971 } 972 else 973 return false; 974 975 if (may_be_nonaddressable_p (ref)) 976 return false; 977 978 /* Mask should be integer mode of the same size as the load/store 979 mode. */ 980 machine_mode mode = TYPE_MODE (TREE_TYPE (lhs)); 981 if (!int_mode_for_mode (mode).exists () || VECTOR_MODE_P (mode)) 982 return false; 983 984 if (can_vec_mask_load_store_p (mode, VOIDmode, is_load)) 985 return true; 986 987 return false; 988 } 989 990 /* Return true if STMT could be converted from an operation that is 991 unconditional to one that is conditional on a bb predicate mask. */ 992 993 static bool 994 ifcvt_can_predicate (gimple *stmt) 995 { 996 basic_block bb = gimple_bb (stmt); 997 998 if (!(flag_tree_loop_vectorize || bb->loop_father->force_vectorize) 999 || bb->loop_father->dont_vectorize 1000 || gimple_has_volatile_ops (stmt)) 1001 return false; 1002 1003 if (gimple_assign_single_p (stmt)) 1004 return ifcvt_can_use_mask_load_store (stmt); 1005 1006 tree_code code = gimple_assign_rhs_code (stmt); 1007 tree lhs_type = TREE_TYPE (gimple_assign_lhs (stmt)); 1008 tree rhs_type = TREE_TYPE (gimple_assign_rhs1 (stmt)); 1009 if (!types_compatible_p (lhs_type, rhs_type)) 1010 return false; 1011 internal_fn cond_fn = get_conditional_internal_fn (code); 1012 return (cond_fn != IFN_LAST 1013 && vectorized_internal_fn_supported_p (cond_fn, lhs_type)); 1014 } 1015 1016 /* Return true when STMT is if-convertible. 1017 1018 GIMPLE_ASSIGN statement is not if-convertible if, 1019 - it is not movable, 1020 - it could trap, 1021 - LHS is not var decl. */ 1022 1023 static bool 1024 if_convertible_gimple_assign_stmt_p (gimple *stmt, 1025 vec<data_reference_p> refs) 1026 { 1027 tree lhs = gimple_assign_lhs (stmt); 1028 1029 if (dump_file && (dump_flags & TDF_DETAILS)) 1030 { 1031 fprintf (dump_file, "-------------------------\n"); 1032 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM); 1033 } 1034 1035 if (!is_gimple_reg_type (TREE_TYPE (lhs))) 1036 return false; 1037 1038 /* Some of these constrains might be too conservative. */ 1039 if (stmt_ends_bb_p (stmt) 1040 || gimple_has_volatile_ops (stmt) 1041 || (TREE_CODE (lhs) == SSA_NAME 1042 && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs)) 1043 || gimple_has_side_effects (stmt)) 1044 { 1045 if (dump_file && (dump_flags & TDF_DETAILS)) 1046 fprintf (dump_file, "stmt not suitable for ifcvt\n"); 1047 return false; 1048 } 1049 1050 /* tree-into-ssa.cc uses GF_PLF_1, so avoid it, because 1051 in between if_convertible_loop_p and combine_blocks 1052 we can perform loop versioning. */ 1053 gimple_set_plf (stmt, GF_PLF_2, false); 1054 1055 if ((! gimple_vuse (stmt) 1056 || gimple_could_trap_p_1 (stmt, false, false) 1057 || ! ifcvt_memrefs_wont_trap (stmt, refs)) 1058 && gimple_could_trap_p (stmt)) 1059 { 1060 if (ifcvt_can_predicate (stmt)) 1061 { 1062 gimple_set_plf (stmt, GF_PLF_2, true); 1063 need_to_predicate = true; 1064 return true; 1065 } 1066 if (dump_file && (dump_flags & TDF_DETAILS)) 1067 fprintf (dump_file, "tree could trap...\n"); 1068 return false; 1069 } 1070 else if ((INTEGRAL_TYPE_P (TREE_TYPE (lhs)) 1071 || POINTER_TYPE_P (TREE_TYPE (lhs))) 1072 && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (lhs)) 1073 && arith_code_with_undefined_signed_overflow 1074 (gimple_assign_rhs_code (stmt))) 1075 /* We have to rewrite stmts with undefined overflow. */ 1076 need_to_rewrite_undefined = true; 1077 1078 /* When if-converting stores force versioning, likewise if we 1079 ended up generating store data races. */ 1080 if (gimple_vdef (stmt)) 1081 need_to_predicate = true; 1082 1083 return true; 1084 } 1085 1086 /* Return true when STMT is if-convertible. 1087 1088 A statement is if-convertible if: 1089 - it is an if-convertible GIMPLE_ASSIGN, 1090 - it is a GIMPLE_LABEL or a GIMPLE_COND, 1091 - it is builtins call, 1092 - it is a call to a function with a SIMD clone. */ 1093 1094 static bool 1095 if_convertible_stmt_p (gimple *stmt, vec<data_reference_p> refs) 1096 { 1097 switch (gimple_code (stmt)) 1098 { 1099 case GIMPLE_LABEL: 1100 case GIMPLE_DEBUG: 1101 case GIMPLE_COND: 1102 return true; 1103 1104 case GIMPLE_ASSIGN: 1105 return if_convertible_gimple_assign_stmt_p (stmt, refs); 1106 1107 case GIMPLE_CALL: 1108 { 1109 /* There are some IFN_s that are used to replace builtins but have the 1110 same semantics. Even if MASK_CALL cannot handle them vectorable_call 1111 will insert the proper selection, so do not block conversion. */ 1112 int flags = gimple_call_flags (stmt); 1113 if ((flags & ECF_CONST) 1114 && !(flags & ECF_LOOPING_CONST_OR_PURE) 1115 && gimple_call_combined_fn (stmt) != CFN_LAST) 1116 return true; 1117 1118 tree fndecl = gimple_call_fndecl (stmt); 1119 if (fndecl) 1120 { 1121 /* We can vectorize some builtins and functions with SIMD 1122 "inbranch" clones. */ 1123 struct cgraph_node *node = cgraph_node::get (fndecl); 1124 if (node && node->simd_clones != NULL) 1125 /* Ensure that at least one clone can be "inbranch". */ 1126 for (struct cgraph_node *n = node->simd_clones; n != NULL; 1127 n = n->simdclone->next_clone) 1128 if (n->simdclone->inbranch) 1129 { 1130 gimple_set_plf (stmt, GF_PLF_2, true); 1131 need_to_predicate = true; 1132 return true; 1133 } 1134 } 1135 1136 return false; 1137 } 1138 1139 default: 1140 /* Don't know what to do with 'em so don't do anything. */ 1141 if (dump_file && (dump_flags & TDF_DETAILS)) 1142 { 1143 fprintf (dump_file, "don't know what to do\n"); 1144 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM); 1145 } 1146 return false; 1147 } 1148 } 1149 1150 /* Assumes that BB has more than 1 predecessors. 1151 Returns false if at least one successor is not on critical edge 1152 and true otherwise. */ 1153 1154 static inline bool 1155 all_preds_critical_p (basic_block bb) 1156 { 1157 edge e; 1158 edge_iterator ei; 1159 1160 FOR_EACH_EDGE (e, ei, bb->preds) 1161 if (EDGE_COUNT (e->src->succs) == 1) 1162 return false; 1163 return true; 1164 } 1165 1166 /* Return true when BB is if-convertible. This routine does not check 1167 basic block's statements and phis. 1168 1169 A basic block is not if-convertible if: 1170 - it is non-empty and it is after the exit block (in BFS order), 1171 - it is after the exit block but before the latch, 1172 - its edges are not normal. 1173 1174 EXIT_BB is the basic block containing the exit of the LOOP. BB is 1175 inside LOOP. */ 1176 1177 static bool 1178 if_convertible_bb_p (class loop *loop, basic_block bb, basic_block exit_bb) 1179 { 1180 edge e; 1181 edge_iterator ei; 1182 1183 if (dump_file && (dump_flags & TDF_DETAILS)) 1184 fprintf (dump_file, "----------[%d]-------------\n", bb->index); 1185 1186 if (EDGE_COUNT (bb->succs) > 2) 1187 return false; 1188 1189 if (gcall *call = safe_dyn_cast <gcall *> (*gsi_last_bb (bb))) 1190 if (gimple_call_ctrl_altering_p (call)) 1191 return false; 1192 1193 if (exit_bb) 1194 { 1195 if (bb != loop->latch) 1196 { 1197 if (dump_file && (dump_flags & TDF_DETAILS)) 1198 fprintf (dump_file, "basic block after exit bb but before latch\n"); 1199 return false; 1200 } 1201 else if (!empty_block_p (bb)) 1202 { 1203 if (dump_file && (dump_flags & TDF_DETAILS)) 1204 fprintf (dump_file, "non empty basic block after exit bb\n"); 1205 return false; 1206 } 1207 else if (bb == loop->latch 1208 && bb != exit_bb 1209 && !dominated_by_p (CDI_DOMINATORS, bb, exit_bb)) 1210 { 1211 if (dump_file && (dump_flags & TDF_DETAILS)) 1212 fprintf (dump_file, "latch is not dominated by exit_block\n"); 1213 return false; 1214 } 1215 } 1216 1217 /* Be less adventurous and handle only normal edges. */ 1218 FOR_EACH_EDGE (e, ei, bb->succs) 1219 if (e->flags & (EDGE_EH | EDGE_ABNORMAL | EDGE_IRREDUCIBLE_LOOP)) 1220 { 1221 if (dump_file && (dump_flags & TDF_DETAILS)) 1222 fprintf (dump_file, "Difficult to handle edges\n"); 1223 return false; 1224 } 1225 1226 return true; 1227 } 1228 1229 /* Return true when all predecessor blocks of BB are visited. The 1230 VISITED bitmap keeps track of the visited blocks. */ 1231 1232 static bool 1233 pred_blocks_visited_p (basic_block bb, bitmap *visited) 1234 { 1235 edge e; 1236 edge_iterator ei; 1237 FOR_EACH_EDGE (e, ei, bb->preds) 1238 if (!bitmap_bit_p (*visited, e->src->index)) 1239 return false; 1240 1241 return true; 1242 } 1243 1244 /* Get body of a LOOP in suitable order for if-conversion. It is 1245 caller's responsibility to deallocate basic block list. 1246 If-conversion suitable order is, breadth first sort (BFS) order 1247 with an additional constraint: select a block only if all its 1248 predecessors are already selected. */ 1249 1250 static basic_block * 1251 get_loop_body_in_if_conv_order (const class loop *loop) 1252 { 1253 basic_block *blocks, *blocks_in_bfs_order; 1254 basic_block bb; 1255 bitmap visited; 1256 unsigned int index = 0; 1257 unsigned int visited_count = 0; 1258 1259 gcc_assert (loop->num_nodes); 1260 gcc_assert (loop->latch != EXIT_BLOCK_PTR_FOR_FN (cfun)); 1261 1262 blocks = XCNEWVEC (basic_block, loop->num_nodes); 1263 visited = BITMAP_ALLOC (NULL); 1264 1265 blocks_in_bfs_order = get_loop_body_in_bfs_order (loop); 1266 1267 index = 0; 1268 while (index < loop->num_nodes) 1269 { 1270 bb = blocks_in_bfs_order [index]; 1271 1272 if (bb->flags & BB_IRREDUCIBLE_LOOP) 1273 { 1274 free (blocks_in_bfs_order); 1275 BITMAP_FREE (visited); 1276 free (blocks); 1277 return NULL; 1278 } 1279 1280 if (!bitmap_bit_p (visited, bb->index)) 1281 { 1282 if (pred_blocks_visited_p (bb, &visited) 1283 || bb == loop->header) 1284 { 1285 /* This block is now visited. */ 1286 bitmap_set_bit (visited, bb->index); 1287 blocks[visited_count++] = bb; 1288 } 1289 } 1290 1291 index++; 1292 1293 if (index == loop->num_nodes 1294 && visited_count != loop->num_nodes) 1295 /* Not done yet. */ 1296 index = 0; 1297 } 1298 free (blocks_in_bfs_order); 1299 BITMAP_FREE (visited); 1300 1301 /* Go through loop and reject if-conversion or lowering of bitfields if we 1302 encounter statements we do not believe the vectorizer will be able to 1303 handle. If adding a new type of statement here, make sure 1304 'ifcvt_local_dce' is also able to handle it propertly. */ 1305 for (index = 0; index < loop->num_nodes; index++) 1306 { 1307 basic_block bb = blocks[index]; 1308 gimple_stmt_iterator gsi; 1309 1310 bool may_have_nonlocal_labels 1311 = bb_with_exit_edge_p (loop, bb) || bb == loop->latch; 1312 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) 1313 switch (gimple_code (gsi_stmt (gsi))) 1314 { 1315 case GIMPLE_LABEL: 1316 if (!may_have_nonlocal_labels) 1317 { 1318 tree label 1319 = gimple_label_label (as_a <glabel *> (gsi_stmt (gsi))); 1320 if (DECL_NONLOCAL (label) || FORCED_LABEL (label)) 1321 { 1322 free (blocks); 1323 return NULL; 1324 } 1325 } 1326 /* Fallthru. */ 1327 case GIMPLE_ASSIGN: 1328 case GIMPLE_CALL: 1329 case GIMPLE_DEBUG: 1330 case GIMPLE_COND: 1331 gimple_set_uid (gsi_stmt (gsi), 0); 1332 break; 1333 default: 1334 free (blocks); 1335 return NULL; 1336 } 1337 } 1338 return blocks; 1339 } 1340 1341 /* Returns true when the analysis of the predicates for all the basic 1342 blocks in LOOP succeeded. 1343 1344 predicate_bbs first allocates the predicates of the basic blocks. 1345 These fields are then initialized with the tree expressions 1346 representing the predicates under which a basic block is executed 1347 in the LOOP. As the loop->header is executed at each iteration, it 1348 has the "true" predicate. Other statements executed under a 1349 condition are predicated with that condition, for example 1350 1351 | if (x) 1352 | S1; 1353 | else 1354 | S2; 1355 1356 S1 will be predicated with "x", and 1357 S2 will be predicated with "!x". */ 1358 1359 static void 1360 predicate_bbs (loop_p loop) 1361 { 1362 unsigned int i; 1363 1364 for (i = 0; i < loop->num_nodes; i++) 1365 init_bb_predicate (ifc_bbs[i]); 1366 1367 for (i = 0; i < loop->num_nodes; i++) 1368 { 1369 basic_block bb = ifc_bbs[i]; 1370 tree cond; 1371 1372 /* The loop latch and loop exit block are always executed and 1373 have no extra conditions to be processed: skip them. */ 1374 if (bb == loop->latch 1375 || bb_with_exit_edge_p (loop, bb)) 1376 { 1377 reset_bb_predicate (bb); 1378 continue; 1379 } 1380 1381 cond = bb_predicate (bb); 1382 if (gcond *stmt = safe_dyn_cast <gcond *> (*gsi_last_bb (bb))) 1383 { 1384 tree c2; 1385 edge true_edge, false_edge; 1386 location_t loc = gimple_location (stmt); 1387 tree c; 1388 /* gcc.dg/fold-bopcond-1.c shows that despite all forwprop passes 1389 conditions can remain unfolded because of multiple uses so 1390 try to re-fold here, especially to get precision changing 1391 conversions sorted out. Do not simply fold the stmt since 1392 this is analysis only. When conditions were embedded in 1393 COND_EXPRs those were folded separately before folding the 1394 COND_EXPR but as they are now outside we have to make sure 1395 to fold them. Do it here - another opportunity would be to 1396 fold predicates as they are inserted. */ 1397 gimple_match_op cexpr (gimple_match_cond::UNCOND, 1398 gimple_cond_code (stmt), 1399 boolean_type_node, 1400 gimple_cond_lhs (stmt), 1401 gimple_cond_rhs (stmt)); 1402 if (cexpr.resimplify (NULL, follow_all_ssa_edges) 1403 && cexpr.code.is_tree_code () 1404 && TREE_CODE_CLASS ((tree_code)cexpr.code) == tcc_comparison) 1405 c = build2_loc (loc, (tree_code)cexpr.code, boolean_type_node, 1406 cexpr.ops[0], cexpr.ops[1]); 1407 else 1408 c = build2_loc (loc, gimple_cond_code (stmt), 1409 boolean_type_node, 1410 gimple_cond_lhs (stmt), 1411 gimple_cond_rhs (stmt)); 1412 1413 /* Add new condition into destination's predicate list. */ 1414 extract_true_false_edges_from_block (gimple_bb (stmt), 1415 &true_edge, &false_edge); 1416 1417 /* If C is true, then TRUE_EDGE is taken. */ 1418 add_to_dst_predicate_list (loop, true_edge, unshare_expr (cond), 1419 unshare_expr (c)); 1420 1421 /* If C is false, then FALSE_EDGE is taken. */ 1422 c2 = build1_loc (loc, TRUTH_NOT_EXPR, boolean_type_node, 1423 unshare_expr (c)); 1424 add_to_dst_predicate_list (loop, false_edge, 1425 unshare_expr (cond), c2); 1426 1427 cond = NULL_TREE; 1428 } 1429 1430 /* If current bb has only one successor, then consider it as an 1431 unconditional goto. */ 1432 if (single_succ_p (bb)) 1433 { 1434 basic_block bb_n = single_succ (bb); 1435 1436 /* The successor bb inherits the predicate of its 1437 predecessor. If there is no predicate in the predecessor 1438 bb, then consider the successor bb as always executed. */ 1439 if (cond == NULL_TREE) 1440 cond = boolean_true_node; 1441 1442 add_to_predicate_list (loop, bb_n, cond); 1443 } 1444 } 1445 1446 /* The loop header is always executed. */ 1447 reset_bb_predicate (loop->header); 1448 gcc_assert (bb_predicate_gimplified_stmts (loop->header) == NULL 1449 && bb_predicate_gimplified_stmts (loop->latch) == NULL); 1450 } 1451 1452 /* Build region by adding loop pre-header and post-header blocks. */ 1453 1454 static vec<basic_block> 1455 build_region (class loop *loop) 1456 { 1457 vec<basic_block> region = vNULL; 1458 basic_block exit_bb = NULL; 1459 1460 gcc_assert (ifc_bbs); 1461 /* The first element is loop pre-header. */ 1462 region.safe_push (loop_preheader_edge (loop)->src); 1463 1464 for (unsigned int i = 0; i < loop->num_nodes; i++) 1465 { 1466 basic_block bb = ifc_bbs[i]; 1467 region.safe_push (bb); 1468 /* Find loop postheader. */ 1469 edge e; 1470 edge_iterator ei; 1471 FOR_EACH_EDGE (e, ei, bb->succs) 1472 if (loop_exit_edge_p (loop, e)) 1473 { 1474 exit_bb = e->dest; 1475 break; 1476 } 1477 } 1478 /* The last element is loop post-header. */ 1479 gcc_assert (exit_bb); 1480 region.safe_push (exit_bb); 1481 return region; 1482 } 1483 1484 /* Return true when LOOP is if-convertible. This is a helper function 1485 for if_convertible_loop_p. REFS and DDRS are initialized and freed 1486 in if_convertible_loop_p. */ 1487 1488 static bool 1489 if_convertible_loop_p_1 (class loop *loop, vec<data_reference_p> *refs) 1490 { 1491 unsigned int i; 1492 basic_block exit_bb = NULL; 1493 vec<basic_block> region; 1494 1495 calculate_dominance_info (CDI_DOMINATORS); 1496 1497 for (i = 0; i < loop->num_nodes; i++) 1498 { 1499 basic_block bb = ifc_bbs[i]; 1500 1501 if (!if_convertible_bb_p (loop, bb, exit_bb)) 1502 return false; 1503 1504 if (bb_with_exit_edge_p (loop, bb)) 1505 exit_bb = bb; 1506 } 1507 1508 data_reference_p dr; 1509 1510 innermost_DR_map 1511 = new hash_map<innermost_loop_behavior_hash, data_reference_p>; 1512 baseref_DR_map = new hash_map<tree_operand_hash, data_reference_p>; 1513 1514 /* Compute post-dominator tree locally. */ 1515 region = build_region (loop); 1516 calculate_dominance_info_for_region (CDI_POST_DOMINATORS, region); 1517 1518 predicate_bbs (loop); 1519 1520 /* Free post-dominator tree since it is not used after predication. */ 1521 free_dominance_info_for_region (cfun, CDI_POST_DOMINATORS, region); 1522 region.release (); 1523 1524 for (i = 0; refs->iterate (i, &dr); i++) 1525 { 1526 tree ref = DR_REF (dr); 1527 1528 dr->aux = XNEW (struct ifc_dr); 1529 DR_BASE_W_UNCONDITIONALLY (dr) = false; 1530 DR_RW_UNCONDITIONALLY (dr) = false; 1531 DR_W_UNCONDITIONALLY (dr) = false; 1532 IFC_DR (dr)->rw_predicate = boolean_false_node; 1533 IFC_DR (dr)->w_predicate = boolean_false_node; 1534 IFC_DR (dr)->base_w_predicate = boolean_false_node; 1535 if (gimple_uid (DR_STMT (dr)) == 0) 1536 gimple_set_uid (DR_STMT (dr), i + 1); 1537 1538 /* If DR doesn't have innermost loop behavior or it's a compound 1539 memory reference, we synthesize its innermost loop behavior 1540 for hashing. */ 1541 if (TREE_CODE (ref) == COMPONENT_REF 1542 || TREE_CODE (ref) == IMAGPART_EXPR 1543 || TREE_CODE (ref) == REALPART_EXPR 1544 || !(DR_BASE_ADDRESS (dr) || DR_OFFSET (dr) 1545 || DR_INIT (dr) || DR_STEP (dr))) 1546 { 1547 while (TREE_CODE (ref) == COMPONENT_REF 1548 || TREE_CODE (ref) == IMAGPART_EXPR 1549 || TREE_CODE (ref) == REALPART_EXPR) 1550 ref = TREE_OPERAND (ref, 0); 1551 1552 memset (&DR_INNERMOST (dr), 0, sizeof (DR_INNERMOST (dr))); 1553 DR_BASE_ADDRESS (dr) = ref; 1554 } 1555 hash_memrefs_baserefs_and_store_DRs_read_written_info (dr); 1556 } 1557 1558 for (i = 0; i < loop->num_nodes; i++) 1559 { 1560 basic_block bb = ifc_bbs[i]; 1561 gimple_stmt_iterator itr; 1562 1563 /* Check the if-convertibility of statements in predicated BBs. */ 1564 if (!dominated_by_p (CDI_DOMINATORS, loop->latch, bb)) 1565 for (itr = gsi_start_bb (bb); !gsi_end_p (itr); gsi_next (&itr)) 1566 if (!if_convertible_stmt_p (gsi_stmt (itr), *refs)) 1567 return false; 1568 } 1569 1570 /* Checking PHIs needs to be done after stmts, as the fact whether there 1571 are any masked loads or stores affects the tests. */ 1572 for (i = 0; i < loop->num_nodes; i++) 1573 { 1574 basic_block bb = ifc_bbs[i]; 1575 gphi_iterator itr; 1576 1577 for (itr = gsi_start_phis (bb); !gsi_end_p (itr); gsi_next (&itr)) 1578 if (!if_convertible_phi_p (loop, bb, itr.phi ())) 1579 return false; 1580 } 1581 1582 if (dump_file) 1583 fprintf (dump_file, "Applying if-conversion\n"); 1584 1585 return true; 1586 } 1587 1588 /* Return true when LOOP is if-convertible. 1589 LOOP is if-convertible if: 1590 - it is innermost, 1591 - it has two or more basic blocks, 1592 - it has only one exit, 1593 - loop header is not the exit edge, 1594 - if its basic blocks and phi nodes are if convertible. */ 1595 1596 static bool 1597 if_convertible_loop_p (class loop *loop, vec<data_reference_p> *refs) 1598 { 1599 edge e; 1600 edge_iterator ei; 1601 bool res = false; 1602 1603 /* Handle only innermost loop. */ 1604 if (!loop || loop->inner) 1605 { 1606 if (dump_file && (dump_flags & TDF_DETAILS)) 1607 fprintf (dump_file, "not innermost loop\n"); 1608 return false; 1609 } 1610 1611 /* If only one block, no need for if-conversion. */ 1612 if (loop->num_nodes <= 2) 1613 { 1614 if (dump_file && (dump_flags & TDF_DETAILS)) 1615 fprintf (dump_file, "less than 2 basic blocks\n"); 1616 return false; 1617 } 1618 1619 /* If one of the loop header's edge is an exit edge then do not 1620 apply if-conversion. */ 1621 FOR_EACH_EDGE (e, ei, loop->header->succs) 1622 if (loop_exit_edge_p (loop, e)) 1623 return false; 1624 1625 res = if_convertible_loop_p_1 (loop, refs); 1626 1627 delete innermost_DR_map; 1628 innermost_DR_map = NULL; 1629 1630 delete baseref_DR_map; 1631 baseref_DR_map = NULL; 1632 1633 return res; 1634 } 1635 1636 /* Return reduc_1 if has_nop. 1637 1638 if (...) 1639 tmp1 = (unsigned type) reduc_1; 1640 tmp2 = tmp1 + rhs2; 1641 reduc_3 = (signed type) tmp2. */ 1642 static tree 1643 strip_nop_cond_scalar_reduction (bool has_nop, tree op) 1644 { 1645 if (!has_nop) 1646 return op; 1647 1648 if (TREE_CODE (op) != SSA_NAME) 1649 return NULL_TREE; 1650 1651 gassign *stmt = safe_dyn_cast <gassign *> (SSA_NAME_DEF_STMT (op)); 1652 if (!stmt 1653 || !CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (stmt)) 1654 || !tree_nop_conversion_p (TREE_TYPE (op), TREE_TYPE 1655 (gimple_assign_rhs1 (stmt)))) 1656 return NULL_TREE; 1657 1658 return gimple_assign_rhs1 (stmt); 1659 } 1660 1661 /* Returns true if def-stmt for phi argument ARG is simple increment/decrement 1662 which is in predicated basic block. 1663 In fact, the following PHI pattern is searching: 1664 loop-header: 1665 reduc_1 = PHI <..., reduc_2> 1666 ... 1667 if (...) 1668 reduc_3 = ... 1669 reduc_2 = PHI <reduc_1, reduc_3> 1670 1671 ARG_0 and ARG_1 are correspondent PHI arguments. 1672 REDUC, OP0 and OP1 contain reduction stmt and its operands. 1673 EXTENDED is true if PHI has > 2 arguments. */ 1674 1675 static bool 1676 is_cond_scalar_reduction (gimple *phi, gimple **reduc, tree arg_0, tree arg_1, 1677 tree *op0, tree *op1, bool extended, bool* has_nop, 1678 gimple **nop_reduc) 1679 { 1680 tree lhs, r_op1, r_op2, r_nop1, r_nop2; 1681 gimple *stmt; 1682 gimple *header_phi = NULL; 1683 enum tree_code reduction_op; 1684 basic_block bb = gimple_bb (phi); 1685 class loop *loop = bb->loop_father; 1686 edge latch_e = loop_latch_edge (loop); 1687 imm_use_iterator imm_iter; 1688 use_operand_p use_p; 1689 edge e; 1690 edge_iterator ei; 1691 bool result = *has_nop = false; 1692 if (TREE_CODE (arg_0) != SSA_NAME || TREE_CODE (arg_1) != SSA_NAME) 1693 return false; 1694 1695 if (!extended && gimple_code (SSA_NAME_DEF_STMT (arg_0)) == GIMPLE_PHI) 1696 { 1697 lhs = arg_1; 1698 header_phi = SSA_NAME_DEF_STMT (arg_0); 1699 stmt = SSA_NAME_DEF_STMT (arg_1); 1700 } 1701 else if (gimple_code (SSA_NAME_DEF_STMT (arg_1)) == GIMPLE_PHI) 1702 { 1703 lhs = arg_0; 1704 header_phi = SSA_NAME_DEF_STMT (arg_1); 1705 stmt = SSA_NAME_DEF_STMT (arg_0); 1706 } 1707 else 1708 return false; 1709 if (gimple_bb (header_phi) != loop->header) 1710 return false; 1711 1712 if (PHI_ARG_DEF_FROM_EDGE (header_phi, latch_e) != PHI_RESULT (phi)) 1713 return false; 1714 1715 if (gimple_code (stmt) != GIMPLE_ASSIGN 1716 || gimple_has_volatile_ops (stmt)) 1717 return false; 1718 1719 if (!flow_bb_inside_loop_p (loop, gimple_bb (stmt))) 1720 return false; 1721 1722 if (!is_predicated (gimple_bb (stmt))) 1723 return false; 1724 1725 /* Check that stmt-block is predecessor of phi-block. */ 1726 FOR_EACH_EDGE (e, ei, gimple_bb (stmt)->succs) 1727 if (e->dest == bb) 1728 { 1729 result = true; 1730 break; 1731 } 1732 if (!result) 1733 return false; 1734 1735 if (!has_single_use (lhs)) 1736 return false; 1737 1738 reduction_op = gimple_assign_rhs_code (stmt); 1739 1740 /* Catch something like below 1741 1742 loop-header: 1743 reduc_1 = PHI <..., reduc_2> 1744 ... 1745 if (...) 1746 tmp1 = (unsigned type) reduc_1; 1747 tmp2 = tmp1 + rhs2; 1748 reduc_3 = (signed type) tmp2; 1749 1750 reduc_2 = PHI <reduc_1, reduc_3> 1751 1752 and convert to 1753 1754 reduc_2 = PHI <0, reduc_1> 1755 tmp1 = (unsigned type)reduc_1; 1756 ifcvt = cond_expr ? rhs2 : 0 1757 tmp2 = tmp1 +/- ifcvt; 1758 reduc_1 = (signed type)tmp2; */ 1759 1760 if (CONVERT_EXPR_CODE_P (reduction_op)) 1761 { 1762 lhs = gimple_assign_rhs1 (stmt); 1763 if (TREE_CODE (lhs) != SSA_NAME 1764 || !has_single_use (lhs)) 1765 return false; 1766 1767 *nop_reduc = stmt; 1768 stmt = SSA_NAME_DEF_STMT (lhs); 1769 if (gimple_bb (stmt) != gimple_bb (*nop_reduc) 1770 || !is_gimple_assign (stmt)) 1771 return false; 1772 1773 *has_nop = true; 1774 reduction_op = gimple_assign_rhs_code (stmt); 1775 } 1776 1777 if (reduction_op != PLUS_EXPR 1778 && reduction_op != MINUS_EXPR 1779 && reduction_op != MULT_EXPR 1780 && reduction_op != BIT_IOR_EXPR 1781 && reduction_op != BIT_XOR_EXPR 1782 && reduction_op != BIT_AND_EXPR) 1783 return false; 1784 r_op1 = gimple_assign_rhs1 (stmt); 1785 r_op2 = gimple_assign_rhs2 (stmt); 1786 1787 r_nop1 = strip_nop_cond_scalar_reduction (*has_nop, r_op1); 1788 r_nop2 = strip_nop_cond_scalar_reduction (*has_nop, r_op2); 1789 1790 /* Make R_OP1 to hold reduction variable. */ 1791 if (r_nop2 == PHI_RESULT (header_phi) 1792 && commutative_tree_code (reduction_op)) 1793 { 1794 std::swap (r_op1, r_op2); 1795 std::swap (r_nop1, r_nop2); 1796 } 1797 else if (r_nop1 != PHI_RESULT (header_phi)) 1798 return false; 1799 1800 if (*has_nop) 1801 { 1802 /* Check that R_NOP1 is used in nop_stmt or in PHI only. */ 1803 FOR_EACH_IMM_USE_FAST (use_p, imm_iter, r_nop1) 1804 { 1805 gimple *use_stmt = USE_STMT (use_p); 1806 if (is_gimple_debug (use_stmt)) 1807 continue; 1808 if (use_stmt == SSA_NAME_DEF_STMT (r_op1)) 1809 continue; 1810 if (use_stmt != phi) 1811 return false; 1812 } 1813 } 1814 1815 /* Check that R_OP1 is used in reduction stmt or in PHI only. */ 1816 FOR_EACH_IMM_USE_FAST (use_p, imm_iter, r_op1) 1817 { 1818 gimple *use_stmt = USE_STMT (use_p); 1819 if (is_gimple_debug (use_stmt)) 1820 continue; 1821 if (use_stmt == stmt) 1822 continue; 1823 if (gimple_code (use_stmt) != GIMPLE_PHI) 1824 return false; 1825 } 1826 1827 *op0 = r_op1; *op1 = r_op2; 1828 *reduc = stmt; 1829 return true; 1830 } 1831 1832 /* Converts conditional scalar reduction into unconditional form, e.g. 1833 bb_4 1834 if (_5 != 0) goto bb_5 else goto bb_6 1835 end_bb_4 1836 bb_5 1837 res_6 = res_13 + 1; 1838 end_bb_5 1839 bb_6 1840 # res_2 = PHI <res_13(4), res_6(5)> 1841 end_bb_6 1842 1843 will be converted into sequence 1844 _ifc__1 = _5 != 0 ? 1 : 0; 1845 res_2 = res_13 + _ifc__1; 1846 Argument SWAP tells that arguments of conditional expression should be 1847 swapped. 1848 If LOOP_VERSIONED is true if we assume that we versioned the loop for 1849 vectorization. In that case we can create a COND_OP. 1850 Returns rhs of resulting PHI assignment. */ 1851 1852 static tree 1853 convert_scalar_cond_reduction (gimple *reduc, gimple_stmt_iterator *gsi, 1854 tree cond, tree op0, tree op1, bool swap, 1855 bool has_nop, gimple* nop_reduc, 1856 bool loop_versioned) 1857 { 1858 gimple_stmt_iterator stmt_it; 1859 gimple *new_assign; 1860 tree rhs; 1861 tree rhs1 = gimple_assign_rhs1 (reduc); 1862 tree lhs = gimple_assign_lhs (reduc); 1863 tree tmp = make_temp_ssa_name (TREE_TYPE (rhs1), NULL, "_ifc_"); 1864 tree c; 1865 enum tree_code reduction_op = gimple_assign_rhs_code (reduc); 1866 tree op_nochange = neutral_op_for_reduction (TREE_TYPE (rhs1), reduction_op, 1867 NULL, false); 1868 gimple_seq stmts = NULL; 1869 1870 if (dump_file && (dump_flags & TDF_DETAILS)) 1871 { 1872 fprintf (dump_file, "Found cond scalar reduction.\n"); 1873 print_gimple_stmt (dump_file, reduc, 0, TDF_SLIM); 1874 } 1875 1876 /* If possible create a COND_OP instead of a COND_EXPR and an OP_EXPR. 1877 The COND_OP will have a neutral_op else value. */ 1878 internal_fn ifn; 1879 ifn = get_conditional_internal_fn (reduction_op); 1880 if (loop_versioned && ifn != IFN_LAST 1881 && vectorized_internal_fn_supported_p (ifn, TREE_TYPE (lhs)) 1882 && !swap) 1883 { 1884 gcall *cond_call = gimple_build_call_internal (ifn, 4, 1885 unshare_expr (cond), 1886 op0, op1, op0); 1887 gsi_insert_before (gsi, cond_call, GSI_SAME_STMT); 1888 gimple_call_set_lhs (cond_call, tmp); 1889 rhs = tmp; 1890 } 1891 else 1892 { 1893 /* Build cond expression using COND and constant operand 1894 of reduction rhs. */ 1895 c = fold_build_cond_expr (TREE_TYPE (rhs1), 1896 unshare_expr (cond), 1897 swap ? op_nochange : op1, 1898 swap ? op1 : op_nochange); 1899 /* Create assignment stmt and insert it at GSI. */ 1900 new_assign = gimple_build_assign (tmp, c); 1901 gsi_insert_before (gsi, new_assign, GSI_SAME_STMT); 1902 /* Build rhs for unconditional increment/decrement/logic_operation. */ 1903 rhs = gimple_build (&stmts, reduction_op, 1904 TREE_TYPE (rhs1), op0, tmp); 1905 } 1906 1907 if (has_nop) 1908 { 1909 rhs = gimple_convert (&stmts, 1910 TREE_TYPE (gimple_assign_lhs (nop_reduc)), rhs); 1911 stmt_it = gsi_for_stmt (nop_reduc); 1912 gsi_remove (&stmt_it, true); 1913 release_defs (nop_reduc); 1914 } 1915 gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT); 1916 1917 /* Delete original reduction stmt. */ 1918 stmt_it = gsi_for_stmt (reduc); 1919 gsi_remove (&stmt_it, true); 1920 release_defs (reduc); 1921 return rhs; 1922 } 1923 1924 /* Generate a simplified conditional. */ 1925 1926 static tree 1927 gen_simplified_condition (tree cond, scalar_cond_masked_set_type &cond_set) 1928 { 1929 /* Check if the value is already live in a previous branch. This resolves 1930 nested conditionals from diamond PHI reductions. */ 1931 if (TREE_CODE (cond) == SSA_NAME) 1932 { 1933 gimple *stmt = SSA_NAME_DEF_STMT (cond); 1934 gassign *assign = NULL; 1935 if ((assign = as_a <gassign *> (stmt)) 1936 && gimple_assign_rhs_code (assign) == BIT_AND_EXPR) 1937 { 1938 tree arg1 = gimple_assign_rhs1 (assign); 1939 tree arg2 = gimple_assign_rhs2 (assign); 1940 if (cond_set.contains ({ arg1, 1 })) 1941 arg1 = boolean_true_node; 1942 else 1943 arg1 = gen_simplified_condition (arg1, cond_set); 1944 1945 if (cond_set.contains ({ arg2, 1 })) 1946 arg2 = boolean_true_node; 1947 else 1948 arg2 = gen_simplified_condition (arg2, cond_set); 1949 1950 cond = fold_build2 (TRUTH_AND_EXPR, boolean_type_node, arg1, arg2); 1951 } 1952 } 1953 return cond; 1954 } 1955 1956 /* Structure used to track meta-data on PHI arguments used to generate 1957 most efficient comparison sequence to slatten a PHI node. */ 1958 1959 typedef struct ifcvt_arg_entry 1960 { 1961 /* The PHI node argument value. */ 1962 tree arg; 1963 1964 /* The number of compares required to reach this PHI node from start of the 1965 BB being if-converted. */ 1966 unsigned num_compares; 1967 1968 /* The number of times this PHI node argument appears in the current PHI 1969 node. */ 1970 unsigned occurs; 1971 1972 /* The indices at which this PHI arg occurs inside the PHI node. */ 1973 vec <int> *indexes; 1974 } ifcvt_arg_entry_t; 1975 1976 /* Produce condition for all occurrences of ARG in PHI node. Set *INVERT 1977 as to whether the condition is inverted. */ 1978 1979 static tree 1980 gen_phi_arg_condition (gphi *phi, ifcvt_arg_entry_t &arg, 1981 gimple_stmt_iterator *gsi, 1982 scalar_cond_masked_set_type &cond_set, bool *invert) 1983 { 1984 int len; 1985 int i; 1986 tree cond = NULL_TREE; 1987 tree c; 1988 edge e; 1989 1990 *invert = false; 1991 len = arg.indexes->length (); 1992 gcc_assert (len > 0); 1993 for (i = 0; i < len; i++) 1994 { 1995 e = gimple_phi_arg_edge (phi, (*arg.indexes)[i]); 1996 c = bb_predicate (e->src); 1997 if (is_true_predicate (c)) 1998 { 1999 cond = c; 2000 break; 2001 } 2002 /* If we have just a single inverted predicate, signal that and 2003 instead invert the COND_EXPR arms. */ 2004 if (len == 1 && TREE_CODE (c) == TRUTH_NOT_EXPR) 2005 { 2006 c = TREE_OPERAND (c, 0); 2007 *invert = true; 2008 } 2009 2010 c = gen_simplified_condition (c, cond_set); 2011 c = force_gimple_operand_gsi (gsi, unshare_expr (c), 2012 true, NULL_TREE, true, GSI_SAME_STMT); 2013 if (cond != NULL_TREE) 2014 { 2015 /* Must build OR expression. */ 2016 cond = fold_or_predicates (EXPR_LOCATION (c), c, cond); 2017 cond = force_gimple_operand_gsi (gsi, unshare_expr (cond), true, 2018 NULL_TREE, true, GSI_SAME_STMT); 2019 } 2020 else 2021 cond = c; 2022 2023 /* Register the new possibly simplified conditional. When more than 2 2024 entries in a phi node we chain entries in the false branch, so the 2025 inverted condition is active. */ 2026 scalar_cond_masked_key pred_cond ({ cond, 1 }); 2027 if (!*invert) 2028 pred_cond.inverted_p = !pred_cond.inverted_p; 2029 cond_set.add (pred_cond); 2030 } 2031 gcc_assert (cond != NULL_TREE); 2032 return cond; 2033 } 2034 2035 /* Create the smallest nested conditional possible. On pre-order we record 2036 which conditionals are live, and on post-order rewrite the chain by removing 2037 already active conditions. 2038 2039 As an example we simplify: 2040 2041 _7 = a_10 < 0; 2042 _21 = a_10 >= 0; 2043 _22 = a_10 < e_11(D); 2044 _23 = _21 & _22; 2045 _ifc__42 = _23 ? t_13 : 0; 2046 t_6 = _7 ? 1 : _ifc__42 2047 2048 into 2049 2050 _7 = a_10 < 0; 2051 _22 = a_10 < e_11(D); 2052 _ifc__42 = _22 ? t_13 : 0; 2053 t_6 = _7 ? 1 : _ifc__42; 2054 2055 which produces better code. */ 2056 2057 static tree 2058 gen_phi_nest_statement (gphi *phi, gimple_stmt_iterator *gsi, 2059 scalar_cond_masked_set_type &cond_set, tree type, 2060 gimple **res_stmt, tree lhs0, 2061 vec<struct ifcvt_arg_entry> &args, unsigned idx) 2062 { 2063 if (idx == args.length ()) 2064 return args[idx - 1].arg; 2065 2066 bool invert; 2067 tree cond = gen_phi_arg_condition (phi, args[idx - 1], gsi, cond_set, 2068 &invert); 2069 tree arg1 = gen_phi_nest_statement (phi, gsi, cond_set, type, res_stmt, lhs0, 2070 args, idx + 1); 2071 2072 unsigned prev = idx; 2073 unsigned curr = prev - 1; 2074 tree arg0 = args[curr].arg; 2075 tree rhs, lhs; 2076 if (idx > 1) 2077 lhs = make_temp_ssa_name (type, NULL, "_ifc_"); 2078 else 2079 lhs = lhs0; 2080 2081 if (invert) 2082 rhs = fold_build_cond_expr (type, unshare_expr (cond), 2083 arg1, arg0); 2084 else 2085 rhs = fold_build_cond_expr (type, unshare_expr (cond), 2086 arg0, arg1); 2087 gassign *new_stmt = gimple_build_assign (lhs, rhs); 2088 gsi_insert_before (gsi, new_stmt, GSI_SAME_STMT); 2089 update_stmt (new_stmt); 2090 *res_stmt = new_stmt; 2091 return lhs; 2092 } 2093 2094 /* When flattening a PHI node we have a choice of which conditions to test to 2095 for all the paths from the start of the dominator block of the BB with the 2096 PHI node. If the PHI node has X arguments we have to only test X - 1 2097 conditions as the last one is implicit. It does matter which conditions we 2098 test first. We should test the shortest condition first (distance here is 2099 measures in the number of logical operators in the condition) and the 2100 longest one last. This allows us to skip testing the most expensive 2101 condition. To accomplish this we need to sort the conditions. P1 and P2 2102 are sorted first based on the number of logical operations (num_compares) 2103 and then by how often they occur in the PHI node. */ 2104 2105 static int 2106 cmp_arg_entry (const void *p1, const void *p2, void * /* data. */) 2107 { 2108 const ifcvt_arg_entry sval1 = *(const ifcvt_arg_entry *)p1; 2109 const ifcvt_arg_entry sval2 = *(const ifcvt_arg_entry *)p2; 2110 2111 if (sval1.num_compares < sval2.num_compares) 2112 return -1; 2113 else if (sval1.num_compares > sval2.num_compares) 2114 return 1; 2115 2116 if (sval1.occurs < sval2.occurs) 2117 return -1; 2118 else if (sval1.occurs > sval2.occurs) 2119 return 1; 2120 2121 return 0; 2122 } 2123 2124 /* Replace a scalar PHI node with a COND_EXPR using COND as condition. 2125 This routine can handle PHI nodes with more than two arguments. 2126 2127 For example, 2128 S1: A = PHI <x1(1), x2(5)> 2129 is converted into, 2130 S2: A = cond ? x1 : x2; 2131 2132 The generated code is inserted at GSI that points to the top of 2133 basic block's statement list. 2134 If PHI node has more than two arguments a chain of conditional 2135 expression is produced. 2136 LOOP_VERSIONED should be true if we know that the loop was versioned for 2137 vectorization. */ 2138 2139 2140 static void 2141 predicate_scalar_phi (gphi *phi, gimple_stmt_iterator *gsi, bool loop_versioned) 2142 { 2143 gimple *new_stmt = NULL, *reduc, *nop_reduc; 2144 tree rhs, res, arg0, arg1, op0, op1, scev; 2145 tree cond; 2146 unsigned int index0; 2147 edge e; 2148 basic_block bb; 2149 unsigned int i; 2150 bool has_nop; 2151 2152 res = gimple_phi_result (phi); 2153 if (virtual_operand_p (res)) 2154 return; 2155 2156 if ((rhs = degenerate_phi_result (phi)) 2157 || ((scev = analyze_scalar_evolution (gimple_bb (phi)->loop_father, 2158 res)) 2159 && !chrec_contains_undetermined (scev) 2160 && scev != res 2161 && (rhs = gimple_phi_arg_def (phi, 0)))) 2162 { 2163 if (dump_file && (dump_flags & TDF_DETAILS)) 2164 { 2165 fprintf (dump_file, "Degenerate phi!\n"); 2166 print_gimple_stmt (dump_file, phi, 0, TDF_SLIM); 2167 } 2168 new_stmt = gimple_build_assign (res, rhs); 2169 gsi_insert_before (gsi, new_stmt, GSI_SAME_STMT); 2170 update_stmt (new_stmt); 2171 return; 2172 } 2173 2174 bb = gimple_bb (phi); 2175 /* Keep track of conditionals already seen. */ 2176 scalar_cond_masked_set_type cond_set; 2177 if (EDGE_COUNT (bb->preds) == 2) 2178 { 2179 /* Predicate ordinary PHI node with 2 arguments. */ 2180 edge first_edge, second_edge; 2181 basic_block true_bb; 2182 first_edge = EDGE_PRED (bb, 0); 2183 second_edge = EDGE_PRED (bb, 1); 2184 cond = bb_predicate (first_edge->src); 2185 cond_set.add ({ cond, 1 }); 2186 if (TREE_CODE (cond) == TRUTH_NOT_EXPR) 2187 std::swap (first_edge, second_edge); 2188 if (EDGE_COUNT (first_edge->src->succs) > 1) 2189 { 2190 cond = bb_predicate (second_edge->src); 2191 if (TREE_CODE (cond) == TRUTH_NOT_EXPR) 2192 cond = TREE_OPERAND (cond, 0); 2193 else 2194 first_edge = second_edge; 2195 } 2196 else 2197 cond = bb_predicate (first_edge->src); 2198 2199 /* Gimplify the condition to a valid cond-expr conditonal operand. */ 2200 cond = gen_simplified_condition (cond, cond_set); 2201 cond = force_gimple_operand_gsi (gsi, unshare_expr (cond), true, 2202 NULL_TREE, true, GSI_SAME_STMT); 2203 true_bb = first_edge->src; 2204 if (EDGE_PRED (bb, 1)->src == true_bb) 2205 { 2206 arg0 = gimple_phi_arg_def (phi, 1); 2207 arg1 = gimple_phi_arg_def (phi, 0); 2208 } 2209 else 2210 { 2211 arg0 = gimple_phi_arg_def (phi, 0); 2212 arg1 = gimple_phi_arg_def (phi, 1); 2213 } 2214 if (is_cond_scalar_reduction (phi, &reduc, arg0, arg1, 2215 &op0, &op1, false, &has_nop, 2216 &nop_reduc)) 2217 { 2218 /* Convert reduction stmt into vectorizable form. */ 2219 rhs = convert_scalar_cond_reduction (reduc, gsi, cond, op0, op1, 2220 true_bb != gimple_bb (reduc), 2221 has_nop, nop_reduc, 2222 loop_versioned); 2223 redundant_ssa_names.safe_push (std::make_pair (res, rhs)); 2224 } 2225 else 2226 /* Build new RHS using selected condition and arguments. */ 2227 rhs = fold_build_cond_expr (TREE_TYPE (res), unshare_expr (cond), 2228 arg0, arg1); 2229 new_stmt = gimple_build_assign (res, rhs); 2230 gsi_insert_before (gsi, new_stmt, GSI_SAME_STMT); 2231 gimple_stmt_iterator new_gsi = gsi_for_stmt (new_stmt); 2232 if (fold_stmt (&new_gsi, follow_all_ssa_edges)) 2233 { 2234 new_stmt = gsi_stmt (new_gsi); 2235 update_stmt (new_stmt); 2236 } 2237 2238 if (dump_file && (dump_flags & TDF_DETAILS)) 2239 { 2240 fprintf (dump_file, "new phi replacement stmt\n"); 2241 print_gimple_stmt (dump_file, new_stmt, 0, TDF_SLIM); 2242 } 2243 return; 2244 } 2245 2246 /* Create hashmap for PHI node which contain vector of argument indexes 2247 having the same value. */ 2248 bool swap = false; 2249 hash_map<tree_operand_hash, auto_vec<int> > phi_arg_map; 2250 unsigned int num_args = gimple_phi_num_args (phi); 2251 /* Vector of different PHI argument values. */ 2252 auto_vec<ifcvt_arg_entry_t> args; 2253 2254 /* Compute phi_arg_map, determine the list of unique PHI args and the indices 2255 where they are in the PHI node. The indices will be used to determine 2256 the conditions to apply and their complexity. */ 2257 for (i = 0; i < num_args; i++) 2258 { 2259 tree arg; 2260 2261 arg = gimple_phi_arg_def (phi, i); 2262 if (!phi_arg_map.get (arg)) 2263 args.safe_push ({ arg, 0, 0, NULL }); 2264 phi_arg_map.get_or_insert (arg).safe_push (i); 2265 } 2266 2267 /* Determine element with max number of occurrences and complexity. Looking 2268 at only number of occurrences as a measure for complexity isn't enough as 2269 all usages can be unique but the comparisons to reach the PHI node differ 2270 per branch. */ 2271 for (unsigned i = 0; i < args.length (); i++) 2272 { 2273 unsigned int len = 0; 2274 vec<int> *indices = phi_arg_map.get (args[i].arg); 2275 for (int index : *indices) 2276 { 2277 edge e = gimple_phi_arg_edge (phi, index); 2278 len += get_bb_num_predicate_stmts (e->src); 2279 } 2280 2281 unsigned occur = indices->length (); 2282 if (dump_file && (dump_flags & TDF_DETAILS)) 2283 fprintf (dump_file, "Ranking %d as len=%d, idx=%d\n", i, len, occur); 2284 args[i].num_compares = len; 2285 args[i].occurs = occur; 2286 args[i].indexes = indices; 2287 } 2288 2289 /* Sort elements based on rankings ARGS. */ 2290 args.stablesort (cmp_arg_entry, NULL); 2291 2292 /* Handle one special case when number of arguments with different values 2293 is equal 2 and one argument has the only occurrence. Such PHI can be 2294 handled as if would have only 2 arguments. */ 2295 if (args.length () == 2 2296 && args[0].indexes->length () == 1) 2297 { 2298 index0 = (*args[0].indexes)[0]; 2299 arg0 = args[0].arg; 2300 arg1 = args[1].arg; 2301 e = gimple_phi_arg_edge (phi, index0); 2302 cond = bb_predicate (e->src); 2303 if (TREE_CODE (cond) == TRUTH_NOT_EXPR) 2304 { 2305 swap = true; 2306 cond = TREE_OPERAND (cond, 0); 2307 } 2308 /* Gimplify the condition to a valid cond-expr conditonal operand. */ 2309 cond = force_gimple_operand_gsi (gsi, unshare_expr (cond), true, 2310 NULL_TREE, true, GSI_SAME_STMT); 2311 if (!(is_cond_scalar_reduction (phi, &reduc, arg0 , arg1, 2312 &op0, &op1, true, &has_nop, &nop_reduc))) 2313 rhs = fold_build_cond_expr (TREE_TYPE (res), unshare_expr (cond), 2314 swap ? arg1 : arg0, 2315 swap ? arg0 : arg1); 2316 else 2317 { 2318 /* Convert reduction stmt into vectorizable form. */ 2319 rhs = convert_scalar_cond_reduction (reduc, gsi, cond, op0, op1, 2320 swap, has_nop, nop_reduc, 2321 loop_versioned); 2322 redundant_ssa_names.safe_push (std::make_pair (res, rhs)); 2323 } 2324 new_stmt = gimple_build_assign (res, rhs); 2325 gsi_insert_before (gsi, new_stmt, GSI_SAME_STMT); 2326 update_stmt (new_stmt); 2327 } 2328 else 2329 { 2330 /* Common case. */ 2331 tree type = TREE_TYPE (gimple_phi_result (phi)); 2332 gen_phi_nest_statement (phi, gsi, cond_set, type, &new_stmt, res, 2333 args, 1); 2334 } 2335 2336 if (dump_file && (dump_flags & TDF_DETAILS)) 2337 { 2338 fprintf (dump_file, "new extended phi replacement stmt\n"); 2339 print_gimple_stmt (dump_file, new_stmt, 0, TDF_SLIM); 2340 } 2341 } 2342 2343 /* Replaces in LOOP all the scalar phi nodes other than those in the 2344 LOOP->header block with conditional modify expressions. 2345 LOOP_VERSIONED should be true if we know that the loop was versioned for 2346 vectorization. */ 2347 2348 static void 2349 predicate_all_scalar_phis (class loop *loop, bool loop_versioned) 2350 { 2351 basic_block bb; 2352 unsigned int orig_loop_num_nodes = loop->num_nodes; 2353 unsigned int i; 2354 2355 for (i = 1; i < orig_loop_num_nodes; i++) 2356 { 2357 gphi *phi; 2358 gimple_stmt_iterator gsi; 2359 gphi_iterator phi_gsi; 2360 bb = ifc_bbs[i]; 2361 2362 if (bb == loop->header) 2363 continue; 2364 2365 phi_gsi = gsi_start_phis (bb); 2366 if (gsi_end_p (phi_gsi)) 2367 continue; 2368 2369 gsi = gsi_after_labels (bb); 2370 while (!gsi_end_p (phi_gsi)) 2371 { 2372 phi = phi_gsi.phi (); 2373 if (virtual_operand_p (gimple_phi_result (phi))) 2374 gsi_next (&phi_gsi); 2375 else 2376 { 2377 predicate_scalar_phi (phi, &gsi, loop_versioned); 2378 remove_phi_node (&phi_gsi, false); 2379 } 2380 } 2381 } 2382 } 2383 2384 /* Insert in each basic block of LOOP the statements produced by the 2385 gimplification of the predicates. */ 2386 2387 static void 2388 insert_gimplified_predicates (loop_p loop) 2389 { 2390 unsigned int i; 2391 2392 for (i = 0; i < loop->num_nodes; i++) 2393 { 2394 basic_block bb = ifc_bbs[i]; 2395 gimple_seq stmts; 2396 if (!is_predicated (bb)) 2397 gcc_assert (bb_predicate_gimplified_stmts (bb) == NULL); 2398 if (!is_predicated (bb)) 2399 { 2400 /* Do not insert statements for a basic block that is not 2401 predicated. Also make sure that the predicate of the 2402 basic block is set to true. */ 2403 reset_bb_predicate (bb); 2404 continue; 2405 } 2406 2407 stmts = bb_predicate_gimplified_stmts (bb); 2408 if (stmts) 2409 { 2410 if (need_to_predicate) 2411 { 2412 /* Insert the predicate of the BB just after the label, 2413 as the if-conversion of memory writes will use this 2414 predicate. */ 2415 gimple_stmt_iterator gsi = gsi_after_labels (bb); 2416 gsi_insert_seq_before (&gsi, stmts, GSI_SAME_STMT); 2417 } 2418 else 2419 { 2420 /* Insert the predicate of the BB at the end of the BB 2421 as this would reduce the register pressure: the only 2422 use of this predicate will be in successor BBs. */ 2423 gimple_stmt_iterator gsi = gsi_last_bb (bb); 2424 2425 if (gsi_end_p (gsi) 2426 || stmt_ends_bb_p (gsi_stmt (gsi))) 2427 gsi_insert_seq_before (&gsi, stmts, GSI_SAME_STMT); 2428 else 2429 gsi_insert_seq_after (&gsi, stmts, GSI_SAME_STMT); 2430 } 2431 2432 /* Once the sequence is code generated, set it to NULL. */ 2433 set_bb_predicate_gimplified_stmts (bb, NULL, true); 2434 } 2435 } 2436 } 2437 2438 /* Helper function for predicate_statements. Returns index of existent 2439 mask if it was created for given SIZE and -1 otherwise. */ 2440 2441 static int 2442 mask_exists (int size, const vec<int> &vec) 2443 { 2444 unsigned int ix; 2445 int v; 2446 FOR_EACH_VEC_ELT (vec, ix, v) 2447 if (v == size) 2448 return (int) ix; 2449 return -1; 2450 } 2451 2452 /* Helper function for predicate_statements. STMT is a memory read or 2453 write and it needs to be predicated by MASK. Return a statement 2454 that does so. */ 2455 2456 static gimple * 2457 predicate_load_or_store (gimple_stmt_iterator *gsi, gassign *stmt, tree mask) 2458 { 2459 gcall *new_stmt; 2460 2461 tree lhs = gimple_assign_lhs (stmt); 2462 tree rhs = gimple_assign_rhs1 (stmt); 2463 tree ref = TREE_CODE (lhs) == SSA_NAME ? rhs : lhs; 2464 mark_addressable (ref); 2465 tree addr = force_gimple_operand_gsi (gsi, build_fold_addr_expr (ref), 2466 true, NULL_TREE, true, GSI_SAME_STMT); 2467 tree ptr = build_int_cst (reference_alias_ptr_type (ref), 2468 get_object_alignment (ref)); 2469 /* Copy points-to info if possible. */ 2470 if (TREE_CODE (addr) == SSA_NAME && !SSA_NAME_PTR_INFO (addr)) 2471 copy_ref_info (build2 (MEM_REF, TREE_TYPE (ref), addr, ptr), 2472 ref); 2473 if (TREE_CODE (lhs) == SSA_NAME) 2474 { 2475 new_stmt 2476 = gimple_build_call_internal (IFN_MASK_LOAD, 3, addr, 2477 ptr, mask); 2478 gimple_call_set_lhs (new_stmt, lhs); 2479 gimple_set_vuse (new_stmt, gimple_vuse (stmt)); 2480 } 2481 else 2482 { 2483 new_stmt 2484 = gimple_build_call_internal (IFN_MASK_STORE, 4, addr, ptr, 2485 mask, rhs); 2486 gimple_move_vops (new_stmt, stmt); 2487 } 2488 gimple_call_set_nothrow (new_stmt, true); 2489 return new_stmt; 2490 } 2491 2492 /* STMT uses OP_LHS. Check whether it is equivalent to: 2493 2494 ... = OP_MASK ? OP_LHS : X; 2495 2496 Return X if so, otherwise return null. OP_MASK is an SSA_NAME that is 2497 known to have value OP_COND. */ 2498 2499 static tree 2500 check_redundant_cond_expr (gimple *stmt, tree op_mask, tree op_cond, 2501 tree op_lhs) 2502 { 2503 gassign *assign = dyn_cast <gassign *> (stmt); 2504 if (!assign || gimple_assign_rhs_code (assign) != COND_EXPR) 2505 return NULL_TREE; 2506 2507 tree use_cond = gimple_assign_rhs1 (assign); 2508 tree if_true = gimple_assign_rhs2 (assign); 2509 tree if_false = gimple_assign_rhs3 (assign); 2510 2511 if ((use_cond == op_mask || operand_equal_p (use_cond, op_cond, 0)) 2512 && if_true == op_lhs) 2513 return if_false; 2514 2515 if (inverse_conditions_p (use_cond, op_cond) && if_false == op_lhs) 2516 return if_true; 2517 2518 return NULL_TREE; 2519 } 2520 2521 /* Return true if VALUE is available for use at STMT. SSA_NAMES is 2522 the set of SSA names defined earlier in STMT's block. */ 2523 2524 static bool 2525 value_available_p (gimple *stmt, hash_set<tree_ssa_name_hash> *ssa_names, 2526 tree value) 2527 { 2528 if (is_gimple_min_invariant (value)) 2529 return true; 2530 2531 if (TREE_CODE (value) == SSA_NAME) 2532 { 2533 if (SSA_NAME_IS_DEFAULT_DEF (value)) 2534 return true; 2535 2536 basic_block def_bb = gimple_bb (SSA_NAME_DEF_STMT (value)); 2537 basic_block use_bb = gimple_bb (stmt); 2538 return (def_bb == use_bb 2539 ? ssa_names->contains (value) 2540 : dominated_by_p (CDI_DOMINATORS, use_bb, def_bb)); 2541 } 2542 2543 return false; 2544 } 2545 2546 /* Helper function for predicate_statements. STMT is a potentially-trapping 2547 arithmetic operation that needs to be predicated by MASK, an SSA_NAME that 2548 has value COND. Return a statement that does so. SSA_NAMES is the set of 2549 SSA names defined earlier in STMT's block. */ 2550 2551 static gimple * 2552 predicate_rhs_code (gassign *stmt, tree mask, tree cond, 2553 hash_set<tree_ssa_name_hash> *ssa_names) 2554 { 2555 tree lhs = gimple_assign_lhs (stmt); 2556 tree_code code = gimple_assign_rhs_code (stmt); 2557 unsigned int nops = gimple_num_ops (stmt); 2558 internal_fn cond_fn = get_conditional_internal_fn (code); 2559 2560 /* Construct the arguments to the conditional internal function. */ 2561 auto_vec<tree, 8> args; 2562 args.safe_grow (nops + 1, true); 2563 args[0] = mask; 2564 for (unsigned int i = 1; i < nops; ++i) 2565 args[i] = gimple_op (stmt, i); 2566 args[nops] = NULL_TREE; 2567 2568 /* Look for uses of the result to see whether they are COND_EXPRs that can 2569 be folded into the conditional call. */ 2570 imm_use_iterator imm_iter; 2571 gimple *use_stmt; 2572 FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, lhs) 2573 { 2574 tree new_else = check_redundant_cond_expr (use_stmt, mask, cond, lhs); 2575 if (new_else && value_available_p (stmt, ssa_names, new_else)) 2576 { 2577 if (!args[nops]) 2578 args[nops] = new_else; 2579 if (operand_equal_p (new_else, args[nops], 0)) 2580 { 2581 /* We have: 2582 2583 LHS = IFN_COND (MASK, ..., ELSE); 2584 X = MASK ? LHS : ELSE; 2585 2586 which makes X equivalent to LHS. */ 2587 tree use_lhs = gimple_assign_lhs (use_stmt); 2588 redundant_ssa_names.safe_push (std::make_pair (use_lhs, lhs)); 2589 } 2590 } 2591 } 2592 if (!args[nops]) 2593 args[nops] = targetm.preferred_else_value (cond_fn, TREE_TYPE (lhs), 2594 nops - 1, &args[1]); 2595 2596 /* Create and insert the call. */ 2597 gcall *new_stmt = gimple_build_call_internal_vec (cond_fn, args); 2598 gimple_call_set_lhs (new_stmt, lhs); 2599 gimple_call_set_nothrow (new_stmt, true); 2600 2601 return new_stmt; 2602 } 2603 2604 /* Predicate each write to memory in LOOP. 2605 2606 This function transforms control flow constructs containing memory 2607 writes of the form: 2608 2609 | for (i = 0; i < N; i++) 2610 | if (cond) 2611 | A[i] = expr; 2612 2613 into the following form that does not contain control flow: 2614 2615 | for (i = 0; i < N; i++) 2616 | A[i] = cond ? expr : A[i]; 2617 2618 The original CFG looks like this: 2619 2620 | bb_0 2621 | i = 0 2622 | end_bb_0 2623 | 2624 | bb_1 2625 | if (i < N) goto bb_5 else goto bb_2 2626 | end_bb_1 2627 | 2628 | bb_2 2629 | cond = some_computation; 2630 | if (cond) goto bb_3 else goto bb_4 2631 | end_bb_2 2632 | 2633 | bb_3 2634 | A[i] = expr; 2635 | goto bb_4 2636 | end_bb_3 2637 | 2638 | bb_4 2639 | goto bb_1 2640 | end_bb_4 2641 2642 insert_gimplified_predicates inserts the computation of the COND 2643 expression at the beginning of the destination basic block: 2644 2645 | bb_0 2646 | i = 0 2647 | end_bb_0 2648 | 2649 | bb_1 2650 | if (i < N) goto bb_5 else goto bb_2 2651 | end_bb_1 2652 | 2653 | bb_2 2654 | cond = some_computation; 2655 | if (cond) goto bb_3 else goto bb_4 2656 | end_bb_2 2657 | 2658 | bb_3 2659 | cond = some_computation; 2660 | A[i] = expr; 2661 | goto bb_4 2662 | end_bb_3 2663 | 2664 | bb_4 2665 | goto bb_1 2666 | end_bb_4 2667 2668 predicate_statements is then predicating the memory write as follows: 2669 2670 | bb_0 2671 | i = 0 2672 | end_bb_0 2673 | 2674 | bb_1 2675 | if (i < N) goto bb_5 else goto bb_2 2676 | end_bb_1 2677 | 2678 | bb_2 2679 | if (cond) goto bb_3 else goto bb_4 2680 | end_bb_2 2681 | 2682 | bb_3 2683 | cond = some_computation; 2684 | A[i] = cond ? expr : A[i]; 2685 | goto bb_4 2686 | end_bb_3 2687 | 2688 | bb_4 2689 | goto bb_1 2690 | end_bb_4 2691 2692 and finally combine_blocks removes the basic block boundaries making 2693 the loop vectorizable: 2694 2695 | bb_0 2696 | i = 0 2697 | if (i < N) goto bb_5 else goto bb_1 2698 | end_bb_0 2699 | 2700 | bb_1 2701 | cond = some_computation; 2702 | A[i] = cond ? expr : A[i]; 2703 | if (i < N) goto bb_5 else goto bb_4 2704 | end_bb_1 2705 | 2706 | bb_4 2707 | goto bb_1 2708 | end_bb_4 2709 */ 2710 2711 static void 2712 predicate_statements (loop_p loop) 2713 { 2714 unsigned int i, orig_loop_num_nodes = loop->num_nodes; 2715 auto_vec<int, 1> vect_sizes; 2716 auto_vec<tree, 1> vect_masks; 2717 hash_set<tree_ssa_name_hash> ssa_names; 2718 2719 for (i = 1; i < orig_loop_num_nodes; i++) 2720 { 2721 gimple_stmt_iterator gsi; 2722 basic_block bb = ifc_bbs[i]; 2723 tree cond = bb_predicate (bb); 2724 bool swap; 2725 int index; 2726 2727 if (is_true_predicate (cond)) 2728 continue; 2729 2730 swap = false; 2731 if (TREE_CODE (cond) == TRUTH_NOT_EXPR) 2732 { 2733 swap = true; 2734 cond = TREE_OPERAND (cond, 0); 2735 } 2736 2737 vect_sizes.truncate (0); 2738 vect_masks.truncate (0); 2739 2740 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi);) 2741 { 2742 gassign *stmt = dyn_cast <gassign *> (gsi_stmt (gsi)); 2743 tree lhs; 2744 if (!stmt) 2745 ; 2746 else if (is_false_predicate (cond) 2747 && gimple_vdef (stmt)) 2748 { 2749 unlink_stmt_vdef (stmt); 2750 gsi_remove (&gsi, true); 2751 release_defs (stmt); 2752 continue; 2753 } 2754 else if (gimple_plf (stmt, GF_PLF_2) 2755 && is_gimple_assign (stmt)) 2756 { 2757 tree lhs = gimple_assign_lhs (stmt); 2758 tree mask; 2759 gimple *new_stmt; 2760 gimple_seq stmts = NULL; 2761 machine_mode mode = TYPE_MODE (TREE_TYPE (lhs)); 2762 /* We checked before setting GF_PLF_2 that an equivalent 2763 integer mode exists. */ 2764 int bitsize = GET_MODE_BITSIZE (mode).to_constant (); 2765 if (!vect_sizes.is_empty () 2766 && (index = mask_exists (bitsize, vect_sizes)) != -1) 2767 /* Use created mask. */ 2768 mask = vect_masks[index]; 2769 else 2770 { 2771 if (COMPARISON_CLASS_P (cond)) 2772 mask = gimple_build (&stmts, TREE_CODE (cond), 2773 boolean_type_node, 2774 TREE_OPERAND (cond, 0), 2775 TREE_OPERAND (cond, 1)); 2776 else 2777 mask = cond; 2778 2779 if (swap) 2780 { 2781 tree true_val 2782 = constant_boolean_node (true, TREE_TYPE (mask)); 2783 mask = gimple_build (&stmts, BIT_XOR_EXPR, 2784 TREE_TYPE (mask), mask, true_val); 2785 } 2786 gsi_insert_seq_before (&gsi, stmts, GSI_SAME_STMT); 2787 2788 /* Save mask and its size for further use. */ 2789 vect_sizes.safe_push (bitsize); 2790 vect_masks.safe_push (mask); 2791 } 2792 if (gimple_assign_single_p (stmt)) 2793 new_stmt = predicate_load_or_store (&gsi, stmt, mask); 2794 else 2795 new_stmt = predicate_rhs_code (stmt, mask, cond, &ssa_names); 2796 2797 gsi_replace (&gsi, new_stmt, true); 2798 } 2799 else if (((lhs = gimple_assign_lhs (stmt)), true) 2800 && (INTEGRAL_TYPE_P (TREE_TYPE (lhs)) 2801 || POINTER_TYPE_P (TREE_TYPE (lhs))) 2802 && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (lhs)) 2803 && arith_code_with_undefined_signed_overflow 2804 (gimple_assign_rhs_code (stmt))) 2805 rewrite_to_defined_overflow (&gsi); 2806 else if (gimple_vdef (stmt)) 2807 { 2808 tree lhs = gimple_assign_lhs (stmt); 2809 tree rhs = gimple_assign_rhs1 (stmt); 2810 tree type = TREE_TYPE (lhs); 2811 2812 lhs = ifc_temp_var (type, unshare_expr (lhs), &gsi); 2813 rhs = ifc_temp_var (type, unshare_expr (rhs), &gsi); 2814 if (swap) 2815 std::swap (lhs, rhs); 2816 cond = force_gimple_operand_gsi (&gsi, unshare_expr (cond), true, 2817 NULL_TREE, true, GSI_SAME_STMT); 2818 rhs = fold_build_cond_expr (type, unshare_expr (cond), rhs, lhs); 2819 gimple_assign_set_rhs1 (stmt, ifc_temp_var (type, rhs, &gsi)); 2820 update_stmt (stmt); 2821 } 2822 2823 if (gimple_plf (gsi_stmt (gsi), GF_PLF_2) 2824 && is_gimple_call (gsi_stmt (gsi))) 2825 { 2826 /* Convert functions that have a SIMD clone to IFN_MASK_CALL. 2827 This will cause the vectorizer to match the "in branch" 2828 clone variants, and serves to build the mask vector 2829 in a natural way. */ 2830 tree mask = cond; 2831 gcall *call = dyn_cast <gcall *> (gsi_stmt (gsi)); 2832 tree orig_fn = gimple_call_fn (call); 2833 int orig_nargs = gimple_call_num_args (call); 2834 auto_vec<tree> args; 2835 args.safe_push (orig_fn); 2836 for (int i = 0; i < orig_nargs; i++) 2837 args.safe_push (gimple_call_arg (call, i)); 2838 /* If `swap', we invert the mask used for the if branch for use 2839 when masking the function call. */ 2840 if (swap) 2841 { 2842 gimple_seq stmts = NULL; 2843 tree true_val 2844 = constant_boolean_node (true, TREE_TYPE (mask)); 2845 mask = gimple_build (&stmts, BIT_XOR_EXPR, 2846 TREE_TYPE (mask), mask, true_val); 2847 gsi_insert_seq_before (&gsi, stmts, GSI_SAME_STMT); 2848 } 2849 args.safe_push (mask); 2850 2851 /* Replace the call with a IFN_MASK_CALL that has the extra 2852 condition parameter. */ 2853 gcall *new_call = gimple_build_call_internal_vec (IFN_MASK_CALL, 2854 args); 2855 gimple_call_set_lhs (new_call, gimple_call_lhs (call)); 2856 gsi_replace (&gsi, new_call, true); 2857 } 2858 2859 lhs = gimple_get_lhs (gsi_stmt (gsi)); 2860 if (lhs && TREE_CODE (lhs) == SSA_NAME) 2861 ssa_names.add (lhs); 2862 gsi_next (&gsi); 2863 } 2864 ssa_names.empty (); 2865 } 2866 } 2867 2868 /* Remove all GIMPLE_CONDs and GIMPLE_LABELs of all the basic blocks 2869 other than the exit and latch of the LOOP. Also resets the 2870 GIMPLE_DEBUG information. */ 2871 2872 static void 2873 remove_conditions_and_labels (loop_p loop) 2874 { 2875 gimple_stmt_iterator gsi; 2876 unsigned int i; 2877 2878 for (i = 0; i < loop->num_nodes; i++) 2879 { 2880 basic_block bb = ifc_bbs[i]; 2881 2882 if (bb_with_exit_edge_p (loop, bb) 2883 || bb == loop->latch) 2884 continue; 2885 2886 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); ) 2887 switch (gimple_code (gsi_stmt (gsi))) 2888 { 2889 case GIMPLE_COND: 2890 case GIMPLE_LABEL: 2891 gsi_remove (&gsi, true); 2892 break; 2893 2894 case GIMPLE_DEBUG: 2895 /* ??? Should there be conditional GIMPLE_DEBUG_BINDs? */ 2896 if (gimple_debug_bind_p (gsi_stmt (gsi))) 2897 { 2898 gimple_debug_bind_reset_value (gsi_stmt (gsi)); 2899 update_stmt (gsi_stmt (gsi)); 2900 } 2901 gsi_next (&gsi); 2902 break; 2903 2904 default: 2905 gsi_next (&gsi); 2906 } 2907 } 2908 } 2909 2910 /* Combine all the basic blocks from LOOP into one or two super basic 2911 blocks. Replace PHI nodes with conditional modify expressions. 2912 LOOP_VERSIONED should be true if we know that the loop was versioned for 2913 vectorization. */ 2914 2915 static void 2916 combine_blocks (class loop *loop, bool loop_versioned) 2917 { 2918 basic_block bb, exit_bb, merge_target_bb; 2919 unsigned int orig_loop_num_nodes = loop->num_nodes; 2920 unsigned int i; 2921 edge e; 2922 edge_iterator ei; 2923 2924 /* Reset flow-sensitive info before predicating stmts or PHIs we 2925 might fold. */ 2926 bool *predicated = XNEWVEC (bool, orig_loop_num_nodes); 2927 for (i = 0; i < orig_loop_num_nodes; i++) 2928 { 2929 bb = ifc_bbs[i]; 2930 predicated[i] = is_predicated (bb); 2931 if (predicated[i]) 2932 { 2933 for (auto gsi = gsi_start_phis (bb); 2934 !gsi_end_p (gsi); gsi_next (&gsi)) 2935 reset_flow_sensitive_info (gimple_phi_result (*gsi)); 2936 for (auto gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) 2937 { 2938 gimple *stmt = gsi_stmt (gsi); 2939 ssa_op_iter i; 2940 tree op; 2941 FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_DEF) 2942 reset_flow_sensitive_info (op); 2943 } 2944 } 2945 } 2946 2947 remove_conditions_and_labels (loop); 2948 insert_gimplified_predicates (loop); 2949 predicate_all_scalar_phis (loop, loop_versioned); 2950 2951 if (need_to_predicate || need_to_rewrite_undefined) 2952 predicate_statements (loop); 2953 2954 /* Merge basic blocks. */ 2955 exit_bb = single_exit (loop)->src; 2956 gcc_assert (exit_bb != loop->latch); 2957 for (i = 0; i < orig_loop_num_nodes; i++) 2958 { 2959 bb = ifc_bbs[i]; 2960 free_bb_predicate (bb); 2961 } 2962 2963 merge_target_bb = loop->header; 2964 2965 /* Get at the virtual def valid for uses starting at the first block 2966 we merge into the header. Without a virtual PHI the loop has the 2967 same virtual use on all stmts. */ 2968 gphi *vphi = get_virtual_phi (loop->header); 2969 tree last_vdef = NULL_TREE; 2970 if (vphi) 2971 { 2972 last_vdef = gimple_phi_result (vphi); 2973 for (gimple_stmt_iterator gsi = gsi_start_bb (loop->header); 2974 ! gsi_end_p (gsi); gsi_next (&gsi)) 2975 if (gimple_vdef (gsi_stmt (gsi))) 2976 last_vdef = gimple_vdef (gsi_stmt (gsi)); 2977 } 2978 for (i = 1; i < orig_loop_num_nodes; i++) 2979 { 2980 gimple_stmt_iterator gsi; 2981 gimple_stmt_iterator last; 2982 2983 bb = ifc_bbs[i]; 2984 2985 if (bb == exit_bb || bb == loop->latch) 2986 continue; 2987 2988 /* We release virtual PHIs late because we have to propagate them 2989 out using the current VUSE. The def might be the one used 2990 after the loop. */ 2991 vphi = get_virtual_phi (bb); 2992 if (vphi) 2993 { 2994 /* When there's just loads inside the loop a stray virtual 2995 PHI merging the uses can appear, update last_vdef from 2996 it. */ 2997 if (!last_vdef) 2998 last_vdef = gimple_phi_arg_def (vphi, 0); 2999 imm_use_iterator iter; 3000 use_operand_p use_p; 3001 gimple *use_stmt; 3002 FOR_EACH_IMM_USE_STMT (use_stmt, iter, gimple_phi_result (vphi)) 3003 { 3004 FOR_EACH_IMM_USE_ON_STMT (use_p, iter) 3005 SET_USE (use_p, last_vdef); 3006 } 3007 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (gimple_phi_result (vphi))) 3008 SSA_NAME_OCCURS_IN_ABNORMAL_PHI (last_vdef) = 1; 3009 gsi = gsi_for_stmt (vphi); 3010 remove_phi_node (&gsi, true); 3011 } 3012 3013 /* Make stmts member of loop->header and clear range info from all stmts 3014 in BB which is now no longer executed conditional on a predicate we 3015 could have derived it from. */ 3016 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) 3017 { 3018 gimple *stmt = gsi_stmt (gsi); 3019 gimple_set_bb (stmt, merge_target_bb); 3020 /* Update virtual operands. */ 3021 if (last_vdef) 3022 { 3023 use_operand_p use_p = ssa_vuse_operand (stmt); 3024 if (use_p 3025 && USE_FROM_PTR (use_p) != last_vdef) 3026 SET_USE (use_p, last_vdef); 3027 if (gimple_vdef (stmt)) 3028 last_vdef = gimple_vdef (stmt); 3029 } 3030 else 3031 /* If this is the first load we arrive at update last_vdef 3032 so we handle stray PHIs correctly. */ 3033 last_vdef = gimple_vuse (stmt); 3034 } 3035 3036 /* Update stmt list. */ 3037 last = gsi_last_bb (merge_target_bb); 3038 gsi_insert_seq_after_without_update (&last, bb_seq (bb), GSI_NEW_STMT); 3039 set_bb_seq (bb, NULL); 3040 } 3041 3042 /* Fixup virtual operands in the exit block. */ 3043 if (exit_bb 3044 && exit_bb != loop->header) 3045 { 3046 /* We release virtual PHIs late because we have to propagate them 3047 out using the current VUSE. The def might be the one used 3048 after the loop. */ 3049 vphi = get_virtual_phi (exit_bb); 3050 if (vphi) 3051 { 3052 /* When there's just loads inside the loop a stray virtual 3053 PHI merging the uses can appear, update last_vdef from 3054 it. */ 3055 if (!last_vdef) 3056 last_vdef = gimple_phi_arg_def (vphi, 0); 3057 imm_use_iterator iter; 3058 use_operand_p use_p; 3059 gimple *use_stmt; 3060 FOR_EACH_IMM_USE_STMT (use_stmt, iter, gimple_phi_result (vphi)) 3061 { 3062 FOR_EACH_IMM_USE_ON_STMT (use_p, iter) 3063 SET_USE (use_p, last_vdef); 3064 } 3065 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (gimple_phi_result (vphi))) 3066 SSA_NAME_OCCURS_IN_ABNORMAL_PHI (last_vdef) = 1; 3067 gimple_stmt_iterator gsi = gsi_for_stmt (vphi); 3068 remove_phi_node (&gsi, true); 3069 } 3070 } 3071 3072 /* Now remove all the edges in the loop, except for those from the exit 3073 block and delete the blocks we elided. */ 3074 for (i = 1; i < orig_loop_num_nodes; i++) 3075 { 3076 bb = ifc_bbs[i]; 3077 3078 for (ei = ei_start (bb->preds); (e = ei_safe_edge (ei));) 3079 { 3080 if (e->src == exit_bb) 3081 ei_next (&ei); 3082 else 3083 remove_edge (e); 3084 } 3085 } 3086 for (i = 1; i < orig_loop_num_nodes; i++) 3087 { 3088 bb = ifc_bbs[i]; 3089 3090 if (bb == exit_bb || bb == loop->latch) 3091 continue; 3092 3093 delete_basic_block (bb); 3094 } 3095 3096 /* Re-connect the exit block. */ 3097 if (exit_bb != NULL) 3098 { 3099 if (exit_bb != loop->header) 3100 { 3101 /* Connect this node to loop header. */ 3102 make_single_succ_edge (loop->header, exit_bb, EDGE_FALLTHRU); 3103 set_immediate_dominator (CDI_DOMINATORS, exit_bb, loop->header); 3104 } 3105 3106 /* Redirect non-exit edges to loop->latch. */ 3107 FOR_EACH_EDGE (e, ei, exit_bb->succs) 3108 { 3109 if (!loop_exit_edge_p (loop, e)) 3110 redirect_edge_and_branch (e, loop->latch); 3111 } 3112 set_immediate_dominator (CDI_DOMINATORS, loop->latch, exit_bb); 3113 } 3114 else 3115 { 3116 /* If the loop does not have an exit, reconnect header and latch. */ 3117 make_edge (loop->header, loop->latch, EDGE_FALLTHRU); 3118 set_immediate_dominator (CDI_DOMINATORS, loop->latch, loop->header); 3119 } 3120 3121 /* If possible, merge loop header to the block with the exit edge. 3122 This reduces the number of basic blocks to two, to please the 3123 vectorizer that handles only loops with two nodes. */ 3124 if (exit_bb 3125 && exit_bb != loop->header) 3126 { 3127 if (can_merge_blocks_p (loop->header, exit_bb)) 3128 merge_blocks (loop->header, exit_bb); 3129 } 3130 3131 free (ifc_bbs); 3132 ifc_bbs = NULL; 3133 free (predicated); 3134 } 3135 3136 /* Version LOOP before if-converting it; the original loop 3137 will be if-converted, the new copy of the loop will not, 3138 and the LOOP_VECTORIZED internal call will be guarding which 3139 loop to execute. The vectorizer pass will fold this 3140 internal call into either true or false. 3141 3142 Note that this function intentionally invalidates profile. Both edges 3143 out of LOOP_VECTORIZED must have 100% probability so the profile remains 3144 consistent after the condition is folded in the vectorizer. */ 3145 3146 static class loop * 3147 version_loop_for_if_conversion (class loop *loop, vec<gimple *> *preds) 3148 { 3149 basic_block cond_bb; 3150 tree cond = make_ssa_name (boolean_type_node); 3151 class loop *new_loop; 3152 gimple *g; 3153 gimple_stmt_iterator gsi; 3154 unsigned int save_length = 0; 3155 3156 g = gimple_build_call_internal (IFN_LOOP_VECTORIZED, 2, 3157 build_int_cst (integer_type_node, loop->num), 3158 integer_zero_node); 3159 gimple_call_set_lhs (g, cond); 3160 3161 void **saved_preds = NULL; 3162 if (any_complicated_phi || need_to_predicate) 3163 { 3164 /* Save BB->aux around loop_version as that uses the same field. */ 3165 save_length = loop->inner ? loop->inner->num_nodes : loop->num_nodes; 3166 saved_preds = XALLOCAVEC (void *, save_length); 3167 for (unsigned i = 0; i < save_length; i++) 3168 saved_preds[i] = ifc_bbs[i]->aux; 3169 } 3170 3171 initialize_original_copy_tables (); 3172 /* At this point we invalidate porfile confistency until IFN_LOOP_VECTORIZED 3173 is re-merged in the vectorizer. */ 3174 new_loop = loop_version (loop, cond, &cond_bb, 3175 profile_probability::always (), 3176 profile_probability::always (), 3177 profile_probability::always (), 3178 profile_probability::always (), true); 3179 free_original_copy_tables (); 3180 3181 if (any_complicated_phi || need_to_predicate) 3182 for (unsigned i = 0; i < save_length; i++) 3183 ifc_bbs[i]->aux = saved_preds[i]; 3184 3185 if (new_loop == NULL) 3186 return NULL; 3187 3188 new_loop->dont_vectorize = true; 3189 new_loop->force_vectorize = false; 3190 gsi = gsi_last_bb (cond_bb); 3191 gimple_call_set_arg (g, 1, build_int_cst (integer_type_node, new_loop->num)); 3192 if (preds) 3193 preds->safe_push (g); 3194 gsi_insert_before (&gsi, g, GSI_SAME_STMT); 3195 update_ssa (TODO_update_ssa_no_phi); 3196 return new_loop; 3197 } 3198 3199 /* Return true when LOOP satisfies the follow conditions that will 3200 allow it to be recognized by the vectorizer for outer-loop 3201 vectorization: 3202 - The loop is not the root node of the loop tree. 3203 - The loop has exactly one inner loop. 3204 - The loop has a single exit. 3205 - The loop header has a single successor, which is the inner 3206 loop header. 3207 - Each of the inner and outer loop latches have a single 3208 predecessor. 3209 - The loop exit block has a single predecessor, which is the 3210 inner loop's exit block. */ 3211 3212 static bool 3213 versionable_outer_loop_p (class loop *loop) 3214 { 3215 if (!loop_outer (loop) 3216 || loop->dont_vectorize 3217 || !loop->inner 3218 || loop->inner->next 3219 || !single_exit (loop) 3220 || !single_succ_p (loop->header) 3221 || single_succ (loop->header) != loop->inner->header 3222 || !single_pred_p (loop->latch) 3223 || !single_pred_p (loop->inner->latch)) 3224 return false; 3225 3226 basic_block outer_exit = single_pred (loop->latch); 3227 basic_block inner_exit = single_pred (loop->inner->latch); 3228 3229 if (!single_pred_p (outer_exit) || single_pred (outer_exit) != inner_exit) 3230 return false; 3231 3232 if (dump_file) 3233 fprintf (dump_file, "Found vectorizable outer loop for versioning\n"); 3234 3235 return true; 3236 } 3237 3238 /* Performs splitting of critical edges. Skip splitting and return false 3239 if LOOP will not be converted because: 3240 3241 - LOOP is not well formed. 3242 - LOOP has PHI with more than MAX_PHI_ARG_NUM arguments. 3243 3244 Last restriction is valid only if AGGRESSIVE_IF_CONV is false. */ 3245 3246 static bool 3247 ifcvt_split_critical_edges (class loop *loop, bool aggressive_if_conv) 3248 { 3249 basic_block *body; 3250 basic_block bb; 3251 unsigned int num = loop->num_nodes; 3252 unsigned int i; 3253 edge e; 3254 edge_iterator ei; 3255 auto_vec<edge> critical_edges; 3256 3257 /* Loop is not well formed. */ 3258 if (loop->inner) 3259 return false; 3260 3261 body = get_loop_body (loop); 3262 for (i = 0; i < num; i++) 3263 { 3264 bb = body[i]; 3265 if (!aggressive_if_conv 3266 && phi_nodes (bb) 3267 && EDGE_COUNT (bb->preds) > MAX_PHI_ARG_NUM) 3268 { 3269 if (dump_file && (dump_flags & TDF_DETAILS)) 3270 fprintf (dump_file, 3271 "BB %d has complicated PHI with more than %u args.\n", 3272 bb->index, MAX_PHI_ARG_NUM); 3273 3274 free (body); 3275 return false; 3276 } 3277 if (bb == loop->latch || bb_with_exit_edge_p (loop, bb)) 3278 continue; 3279 3280 /* Skip basic blocks not ending with conditional branch. */ 3281 if (!safe_is_a <gcond *> (*gsi_last_bb (bb))) 3282 continue; 3283 3284 FOR_EACH_EDGE (e, ei, bb->succs) 3285 if (EDGE_CRITICAL_P (e) && e->dest->loop_father == loop) 3286 critical_edges.safe_push (e); 3287 } 3288 free (body); 3289 3290 while (critical_edges.length () > 0) 3291 { 3292 e = critical_edges.pop (); 3293 /* Don't split if bb can be predicated along non-critical edge. */ 3294 if (EDGE_COUNT (e->dest->preds) > 2 || all_preds_critical_p (e->dest)) 3295 split_edge (e); 3296 } 3297 3298 return true; 3299 } 3300 3301 /* Delete redundant statements produced by predication which prevents 3302 loop vectorization. */ 3303 3304 static void 3305 ifcvt_local_dce (class loop *loop) 3306 { 3307 gimple *stmt; 3308 gimple *stmt1; 3309 gimple *phi; 3310 gimple_stmt_iterator gsi; 3311 auto_vec<gimple *> worklist; 3312 enum gimple_code code; 3313 use_operand_p use_p; 3314 imm_use_iterator imm_iter; 3315 3316 /* The loop has a single BB only. */ 3317 basic_block bb = loop->header; 3318 tree latch_vdef = NULL_TREE; 3319 3320 worklist.create (64); 3321 /* Consider all phi as live statements. */ 3322 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi)) 3323 { 3324 phi = gsi_stmt (gsi); 3325 gimple_set_plf (phi, GF_PLF_2, true); 3326 worklist.safe_push (phi); 3327 if (virtual_operand_p (gimple_phi_result (phi))) 3328 latch_vdef = PHI_ARG_DEF_FROM_EDGE (phi, loop_latch_edge (loop)); 3329 } 3330 /* Consider load/store statements, CALL and COND as live. */ 3331 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) 3332 { 3333 stmt = gsi_stmt (gsi); 3334 if (is_gimple_debug (stmt)) 3335 { 3336 gimple_set_plf (stmt, GF_PLF_2, true); 3337 continue; 3338 } 3339 if (gimple_store_p (stmt) || gimple_assign_load_p (stmt)) 3340 { 3341 gimple_set_plf (stmt, GF_PLF_2, true); 3342 worklist.safe_push (stmt); 3343 continue; 3344 } 3345 code = gimple_code (stmt); 3346 if (code == GIMPLE_COND || code == GIMPLE_CALL) 3347 { 3348 gimple_set_plf (stmt, GF_PLF_2, true); 3349 worklist.safe_push (stmt); 3350 continue; 3351 } 3352 gimple_set_plf (stmt, GF_PLF_2, false); 3353 3354 if (code == GIMPLE_ASSIGN) 3355 { 3356 tree lhs = gimple_assign_lhs (stmt); 3357 FOR_EACH_IMM_USE_FAST (use_p, imm_iter, lhs) 3358 { 3359 stmt1 = USE_STMT (use_p); 3360 if (!is_gimple_debug (stmt1) && gimple_bb (stmt1) != bb) 3361 { 3362 gimple_set_plf (stmt, GF_PLF_2, true); 3363 worklist.safe_push (stmt); 3364 break; 3365 } 3366 } 3367 } 3368 } 3369 /* Propagate liveness through arguments of live stmt. */ 3370 while (worklist.length () > 0) 3371 { 3372 ssa_op_iter iter; 3373 use_operand_p use_p; 3374 tree use; 3375 3376 stmt = worklist.pop (); 3377 FOR_EACH_PHI_OR_STMT_USE (use_p, stmt, iter, SSA_OP_USE) 3378 { 3379 use = USE_FROM_PTR (use_p); 3380 if (TREE_CODE (use) != SSA_NAME) 3381 continue; 3382 stmt1 = SSA_NAME_DEF_STMT (use); 3383 if (gimple_bb (stmt1) != bb || gimple_plf (stmt1, GF_PLF_2)) 3384 continue; 3385 gimple_set_plf (stmt1, GF_PLF_2, true); 3386 worklist.safe_push (stmt1); 3387 } 3388 } 3389 /* Delete dead statements. */ 3390 gsi = gsi_last_bb (bb); 3391 while (!gsi_end_p (gsi)) 3392 { 3393 gimple_stmt_iterator gsiprev = gsi; 3394 gsi_prev (&gsiprev); 3395 stmt = gsi_stmt (gsi); 3396 if (!gimple_has_volatile_ops (stmt) 3397 && gimple_store_p (stmt) 3398 && gimple_vdef (stmt)) 3399 { 3400 tree lhs = gimple_get_lhs (stmt); 3401 ao_ref write; 3402 ao_ref_init (&write, lhs); 3403 3404 if (dse_classify_store (&write, stmt, false, NULL, NULL, latch_vdef) 3405 == DSE_STORE_DEAD) 3406 delete_dead_or_redundant_assignment (&gsi, "dead"); 3407 gsi = gsiprev; 3408 continue; 3409 } 3410 3411 if (gimple_plf (stmt, GF_PLF_2)) 3412 { 3413 gsi = gsiprev; 3414 continue; 3415 } 3416 if (dump_file && (dump_flags & TDF_DETAILS)) 3417 { 3418 fprintf (dump_file, "Delete dead stmt in bb#%d\n", bb->index); 3419 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM); 3420 } 3421 gsi_remove (&gsi, true); 3422 release_defs (stmt); 3423 gsi = gsiprev; 3424 } 3425 } 3426 3427 /* Return true if VALUE is already available on edge PE. */ 3428 3429 static bool 3430 ifcvt_available_on_edge_p (edge pe, tree value) 3431 { 3432 if (is_gimple_min_invariant (value)) 3433 return true; 3434 3435 if (TREE_CODE (value) == SSA_NAME) 3436 { 3437 basic_block def_bb = gimple_bb (SSA_NAME_DEF_STMT (value)); 3438 if (!def_bb || dominated_by_p (CDI_DOMINATORS, pe->dest, def_bb)) 3439 return true; 3440 } 3441 3442 return false; 3443 } 3444 3445 /* Return true if STMT can be hoisted from if-converted loop LOOP to 3446 edge PE. */ 3447 3448 static bool 3449 ifcvt_can_hoist (class loop *loop, edge pe, gimple *stmt) 3450 { 3451 if (auto *call = dyn_cast<gcall *> (stmt)) 3452 { 3453 if (gimple_call_internal_p (call) 3454 && internal_fn_mask_index (gimple_call_internal_fn (call)) >= 0) 3455 return false; 3456 } 3457 else if (auto *assign = dyn_cast<gassign *> (stmt)) 3458 { 3459 if (gimple_assign_rhs_code (assign) == COND_EXPR) 3460 return false; 3461 } 3462 else 3463 return false; 3464 3465 if (gimple_has_side_effects (stmt) 3466 || gimple_could_trap_p (stmt) 3467 || stmt_could_throw_p (cfun, stmt) 3468 || gimple_vdef (stmt) 3469 || gimple_vuse (stmt)) 3470 return false; 3471 3472 int num_args = gimple_num_args (stmt); 3473 if (pe != loop_preheader_edge (loop)) 3474 { 3475 for (int i = 0; i < num_args; ++i) 3476 if (!ifcvt_available_on_edge_p (pe, gimple_arg (stmt, i))) 3477 return false; 3478 } 3479 else 3480 { 3481 for (int i = 0; i < num_args; ++i) 3482 if (!expr_invariant_in_loop_p (loop, gimple_arg (stmt, i))) 3483 return false; 3484 } 3485 3486 return true; 3487 } 3488 3489 /* Hoist invariant statements from LOOP to edge PE. */ 3490 3491 static void 3492 ifcvt_hoist_invariants (class loop *loop, edge pe) 3493 { 3494 /* Only hoist from the now unconditionally executed part of the loop. */ 3495 basic_block bb = loop->header; 3496 gimple_stmt_iterator hoist_gsi = {}; 3497 for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);) 3498 { 3499 gimple *stmt = gsi_stmt (gsi); 3500 if (ifcvt_can_hoist (loop, pe, stmt)) 3501 { 3502 /* Once we've hoisted one statement, insert other statements 3503 after it. */ 3504 gsi_remove (&gsi, false); 3505 if (hoist_gsi.ptr) 3506 gsi_insert_after (&hoist_gsi, stmt, GSI_NEW_STMT); 3507 else 3508 { 3509 gsi_insert_on_edge_immediate (pe, stmt); 3510 hoist_gsi = gsi_for_stmt (stmt); 3511 } 3512 continue; 3513 } 3514 gsi_next (&gsi); 3515 } 3516 } 3517 3518 /* Returns the DECL_FIELD_BIT_OFFSET of the bitfield accesse in stmt iff its 3519 type mode is not BLKmode. If BITPOS is not NULL it will hold the poly_int64 3520 value of the DECL_FIELD_BIT_OFFSET of the bitfield access and STRUCT_EXPR, 3521 if not NULL, will hold the tree representing the base struct of this 3522 bitfield. */ 3523 3524 static tree 3525 get_bitfield_rep (gassign *stmt, bool write, tree *bitpos, 3526 tree *struct_expr) 3527 { 3528 tree comp_ref = write ? gimple_assign_lhs (stmt) 3529 : gimple_assign_rhs1 (stmt); 3530 3531 tree field_decl = TREE_OPERAND (comp_ref, 1); 3532 tree ref_offset = component_ref_field_offset (comp_ref); 3533 tree rep_decl = DECL_BIT_FIELD_REPRESENTATIVE (field_decl); 3534 3535 /* Bail out if the representative is not a suitable type for a scalar 3536 register variable. */ 3537 if (!is_gimple_reg_type (TREE_TYPE (rep_decl))) 3538 return NULL_TREE; 3539 3540 /* Bail out if the DECL_SIZE of the field_decl isn't the same as the BF's 3541 precision. */ 3542 unsigned HOST_WIDE_INT bf_prec 3543 = TYPE_PRECISION (TREE_TYPE (gimple_assign_lhs (stmt))); 3544 if (compare_tree_int (DECL_SIZE (field_decl), bf_prec) != 0) 3545 return NULL_TREE; 3546 3547 if (TREE_CODE (DECL_FIELD_OFFSET (rep_decl)) != INTEGER_CST 3548 || TREE_CODE (ref_offset) != INTEGER_CST) 3549 { 3550 if (dump_file && (dump_flags & TDF_DETAILS)) 3551 fprintf (dump_file, "\t Bitfield NOT OK to lower," 3552 " offset is non-constant.\n"); 3553 return NULL_TREE; 3554 } 3555 3556 if (struct_expr) 3557 *struct_expr = TREE_OPERAND (comp_ref, 0); 3558 3559 if (bitpos) 3560 { 3561 /* To calculate the bitposition of the BITFIELD_REF we have to determine 3562 where our bitfield starts in relation to the container REP_DECL. The 3563 DECL_FIELD_OFFSET of the original bitfield's member FIELD_DECL tells 3564 us how many bytes from the start of the structure there are until the 3565 start of the group of bitfield members the FIELD_DECL belongs to, 3566 whereas DECL_FIELD_BIT_OFFSET will tell us how many bits from that 3567 position our actual bitfield member starts. For the container 3568 REP_DECL adding DECL_FIELD_OFFSET and DECL_FIELD_BIT_OFFSET will tell 3569 us the distance between the start of the structure and the start of 3570 the container, though the first is in bytes and the later other in 3571 bits. With this in mind we calculate the bit position of our new 3572 BITFIELD_REF by subtracting the number of bits between the start of 3573 the structure and the container from the number of bits from the start 3574 of the structure and the actual bitfield member. */ 3575 tree bf_pos = fold_build2 (MULT_EXPR, bitsizetype, 3576 ref_offset, 3577 build_int_cst (bitsizetype, BITS_PER_UNIT)); 3578 bf_pos = fold_build2 (PLUS_EXPR, bitsizetype, bf_pos, 3579 DECL_FIELD_BIT_OFFSET (field_decl)); 3580 tree rep_pos = fold_build2 (MULT_EXPR, bitsizetype, 3581 DECL_FIELD_OFFSET (rep_decl), 3582 build_int_cst (bitsizetype, BITS_PER_UNIT)); 3583 rep_pos = fold_build2 (PLUS_EXPR, bitsizetype, rep_pos, 3584 DECL_FIELD_BIT_OFFSET (rep_decl)); 3585 3586 *bitpos = fold_build2 (MINUS_EXPR, bitsizetype, bf_pos, rep_pos); 3587 } 3588 3589 return rep_decl; 3590 3591 } 3592 3593 /* Lowers the bitfield described by DATA. 3594 For a write like: 3595 3596 struct.bf = _1; 3597 3598 lower to: 3599 3600 __ifc_1 = struct.<representative>; 3601 __ifc_2 = BIT_INSERT_EXPR (__ifc_1, _1, bitpos); 3602 struct.<representative> = __ifc_2; 3603 3604 For a read: 3605 3606 _1 = struct.bf; 3607 3608 lower to: 3609 3610 __ifc_1 = struct.<representative>; 3611 _1 = BIT_FIELD_REF (__ifc_1, bitsize, bitpos); 3612 3613 where representative is a legal load that contains the bitfield value, 3614 bitsize is the size of the bitfield and bitpos the offset to the start of 3615 the bitfield within the representative. */ 3616 3617 static void 3618 lower_bitfield (gassign *stmt, bool write) 3619 { 3620 tree struct_expr; 3621 tree bitpos; 3622 tree rep_decl = get_bitfield_rep (stmt, write, &bitpos, &struct_expr); 3623 tree rep_type = TREE_TYPE (rep_decl); 3624 tree bf_type = TREE_TYPE (gimple_assign_lhs (stmt)); 3625 3626 gimple_stmt_iterator gsi = gsi_for_stmt (stmt); 3627 if (dump_file && (dump_flags & TDF_DETAILS)) 3628 { 3629 fprintf (dump_file, "Lowering:\n"); 3630 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM); 3631 fprintf (dump_file, "to:\n"); 3632 } 3633 3634 /* REP_COMP_REF is a COMPONENT_REF for the representative. NEW_VAL is it's 3635 defining SSA_NAME. */ 3636 tree rep_comp_ref = build3 (COMPONENT_REF, rep_type, struct_expr, rep_decl, 3637 NULL_TREE); 3638 tree new_val = ifc_temp_var (rep_type, rep_comp_ref, &gsi); 3639 3640 if (dump_file && (dump_flags & TDF_DETAILS)) 3641 print_gimple_stmt (dump_file, SSA_NAME_DEF_STMT (new_val), 0, TDF_SLIM); 3642 3643 if (write) 3644 { 3645 new_val = ifc_temp_var (rep_type, 3646 build3 (BIT_INSERT_EXPR, rep_type, new_val, 3647 unshare_expr (gimple_assign_rhs1 (stmt)), 3648 bitpos), &gsi); 3649 3650 if (dump_file && (dump_flags & TDF_DETAILS)) 3651 print_gimple_stmt (dump_file, SSA_NAME_DEF_STMT (new_val), 0, TDF_SLIM); 3652 3653 gimple *new_stmt = gimple_build_assign (unshare_expr (rep_comp_ref), 3654 new_val); 3655 gimple_move_vops (new_stmt, stmt); 3656 gsi_insert_before (&gsi, new_stmt, GSI_SAME_STMT); 3657 3658 if (dump_file && (dump_flags & TDF_DETAILS)) 3659 print_gimple_stmt (dump_file, new_stmt, 0, TDF_SLIM); 3660 } 3661 else 3662 { 3663 tree bfr = build3 (BIT_FIELD_REF, bf_type, new_val, 3664 build_int_cst (bitsizetype, TYPE_PRECISION (bf_type)), 3665 bitpos); 3666 new_val = ifc_temp_var (bf_type, bfr, &gsi); 3667 3668 gimple *new_stmt = gimple_build_assign (gimple_assign_lhs (stmt), 3669 new_val); 3670 gimple_move_vops (new_stmt, stmt); 3671 gsi_insert_before (&gsi, new_stmt, GSI_SAME_STMT); 3672 3673 if (dump_file && (dump_flags & TDF_DETAILS)) 3674 print_gimple_stmt (dump_file, new_stmt, 0, TDF_SLIM); 3675 } 3676 3677 gsi_remove (&gsi, true); 3678 } 3679 3680 /* Return TRUE if there are bitfields to lower in this LOOP. Fill TO_LOWER 3681 with data structures representing these bitfields. */ 3682 3683 static bool 3684 bitfields_to_lower_p (class loop *loop, 3685 vec <gassign *> &reads_to_lower, 3686 vec <gassign *> &writes_to_lower) 3687 { 3688 gimple_stmt_iterator gsi; 3689 3690 if (dump_file && (dump_flags & TDF_DETAILS)) 3691 { 3692 fprintf (dump_file, "Analyzing loop %d for bitfields:\n", loop->num); 3693 } 3694 3695 for (unsigned i = 0; i < loop->num_nodes; ++i) 3696 { 3697 basic_block bb = ifc_bbs[i]; 3698 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) 3699 { 3700 gassign *stmt = dyn_cast<gassign*> (gsi_stmt (gsi)); 3701 if (!stmt) 3702 continue; 3703 3704 tree op = gimple_assign_lhs (stmt); 3705 bool write = TREE_CODE (op) == COMPONENT_REF; 3706 3707 if (!write) 3708 op = gimple_assign_rhs1 (stmt); 3709 3710 if (TREE_CODE (op) != COMPONENT_REF) 3711 continue; 3712 3713 if (DECL_BIT_FIELD_TYPE (TREE_OPERAND (op, 1))) 3714 { 3715 if (dump_file && (dump_flags & TDF_DETAILS)) 3716 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM); 3717 3718 if (TREE_THIS_VOLATILE (op)) 3719 { 3720 if (dump_file && (dump_flags & TDF_DETAILS)) 3721 fprintf (dump_file, "\t Bitfield NO OK to lower," 3722 " the access is volatile.\n"); 3723 return false; 3724 } 3725 3726 if (!INTEGRAL_TYPE_P (TREE_TYPE (op))) 3727 { 3728 if (dump_file && (dump_flags & TDF_DETAILS)) 3729 fprintf (dump_file, "\t Bitfield NO OK to lower," 3730 " field type is not Integral.\n"); 3731 return false; 3732 } 3733 3734 if (!get_bitfield_rep (stmt, write, NULL, NULL)) 3735 { 3736 if (dump_file && (dump_flags & TDF_DETAILS)) 3737 fprintf (dump_file, "\t Bitfield NOT OK to lower," 3738 " representative is BLKmode.\n"); 3739 return false; 3740 } 3741 3742 if (dump_file && (dump_flags & TDF_DETAILS)) 3743 fprintf (dump_file, "\tBitfield OK to lower.\n"); 3744 if (write) 3745 writes_to_lower.safe_push (stmt); 3746 else 3747 reads_to_lower.safe_push (stmt); 3748 } 3749 } 3750 } 3751 return !reads_to_lower.is_empty () || !writes_to_lower.is_empty (); 3752 } 3753 3754 3755 /* If-convert LOOP when it is legal. For the moment this pass has no 3756 profitability analysis. Returns non-zero todo flags when something 3757 changed. */ 3758 3759 unsigned int 3760 tree_if_conversion (class loop *loop, vec<gimple *> *preds) 3761 { 3762 unsigned int todo = 0; 3763 bool aggressive_if_conv; 3764 class loop *rloop; 3765 auto_vec <gassign *, 4> reads_to_lower; 3766 auto_vec <gassign *, 4> writes_to_lower; 3767 bitmap exit_bbs; 3768 edge pe; 3769 auto_vec<data_reference_p, 10> refs; 3770 bool loop_versioned; 3771 3772 again: 3773 rloop = NULL; 3774 ifc_bbs = NULL; 3775 need_to_lower_bitfields = false; 3776 need_to_ifcvt = false; 3777 need_to_predicate = false; 3778 need_to_rewrite_undefined = false; 3779 any_complicated_phi = false; 3780 loop_versioned = false; 3781 3782 /* Apply more aggressive if-conversion when loop or its outer loop were 3783 marked with simd pragma. When that's the case, we try to if-convert 3784 loop containing PHIs with more than MAX_PHI_ARG_NUM arguments. */ 3785 aggressive_if_conv = loop->force_vectorize; 3786 if (!aggressive_if_conv) 3787 { 3788 class loop *outer_loop = loop_outer (loop); 3789 if (outer_loop && outer_loop->force_vectorize) 3790 aggressive_if_conv = true; 3791 } 3792 3793 /* If there are more than two BBs in the loop then there is at least one if 3794 to convert. */ 3795 if (loop->num_nodes > 2 3796 && !ifcvt_split_critical_edges (loop, aggressive_if_conv)) 3797 goto cleanup; 3798 3799 ifc_bbs = get_loop_body_in_if_conv_order (loop); 3800 if (!ifc_bbs) 3801 { 3802 if (dump_file && (dump_flags & TDF_DETAILS)) 3803 fprintf (dump_file, "Irreducible loop\n"); 3804 goto cleanup; 3805 } 3806 3807 if (find_data_references_in_loop (loop, &refs) == chrec_dont_know) 3808 goto cleanup; 3809 3810 if (loop->num_nodes > 2) 3811 { 3812 /* More than one loop exit is too much to handle. */ 3813 if (!single_exit (loop)) 3814 { 3815 if (dump_file && (dump_flags & TDF_DETAILS)) 3816 fprintf (dump_file, "Can not ifcvt due to multiple exits\n"); 3817 } 3818 else 3819 { 3820 need_to_ifcvt = true; 3821 3822 if (!if_convertible_loop_p (loop, &refs) 3823 || !dbg_cnt (if_conversion_tree)) 3824 goto cleanup; 3825 3826 if ((need_to_predicate || any_complicated_phi) 3827 && ((!flag_tree_loop_vectorize && !loop->force_vectorize) 3828 || loop->dont_vectorize)) 3829 goto cleanup; 3830 } 3831 } 3832 3833 if ((flag_tree_loop_vectorize || loop->force_vectorize) 3834 && !loop->dont_vectorize) 3835 need_to_lower_bitfields = bitfields_to_lower_p (loop, reads_to_lower, 3836 writes_to_lower); 3837 3838 if (!need_to_ifcvt && !need_to_lower_bitfields) 3839 goto cleanup; 3840 3841 /* The edge to insert invariant stmts on. */ 3842 pe = loop_preheader_edge (loop); 3843 3844 /* Since we have no cost model, always version loops unless the user 3845 specified -ftree-loop-if-convert or unless versioning is required. 3846 Either version this loop, or if the pattern is right for outer-loop 3847 vectorization, version the outer loop. In the latter case we will 3848 still if-convert the original inner loop. */ 3849 if (need_to_lower_bitfields 3850 || need_to_predicate 3851 || any_complicated_phi 3852 || flag_tree_loop_if_convert != 1) 3853 { 3854 class loop *vloop 3855 = (versionable_outer_loop_p (loop_outer (loop)) 3856 ? loop_outer (loop) : loop); 3857 class loop *nloop = version_loop_for_if_conversion (vloop, preds); 3858 if (nloop == NULL) 3859 goto cleanup; 3860 if (vloop != loop) 3861 { 3862 /* If versionable_outer_loop_p decided to version the 3863 outer loop, version also the inner loop of the non-vectorized 3864 loop copy. So we transform: 3865 loop1 3866 loop2 3867 into: 3868 if (LOOP_VECTORIZED (1, 3)) 3869 { 3870 loop1 3871 loop2 3872 } 3873 else 3874 loop3 (copy of loop1) 3875 if (LOOP_VECTORIZED (4, 5)) 3876 loop4 (copy of loop2) 3877 else 3878 loop5 (copy of loop4) */ 3879 gcc_assert (nloop->inner && nloop->inner->next == NULL); 3880 rloop = nloop->inner; 3881 } 3882 else 3883 /* If we versioned loop then make sure to insert invariant 3884 stmts before the .LOOP_VECTORIZED check since the vectorizer 3885 will re-use that for things like runtime alias versioning 3886 whose condition can end up using those invariants. */ 3887 pe = single_pred_edge (gimple_bb (preds->last ())); 3888 3889 loop_versioned = true; 3890 } 3891 3892 if (need_to_lower_bitfields) 3893 { 3894 if (dump_file && (dump_flags & TDF_DETAILS)) 3895 { 3896 fprintf (dump_file, "-------------------------\n"); 3897 fprintf (dump_file, "Start lowering bitfields\n"); 3898 } 3899 while (!reads_to_lower.is_empty ()) 3900 lower_bitfield (reads_to_lower.pop (), false); 3901 while (!writes_to_lower.is_empty ()) 3902 lower_bitfield (writes_to_lower.pop (), true); 3903 3904 if (dump_file && (dump_flags & TDF_DETAILS)) 3905 { 3906 fprintf (dump_file, "Done lowering bitfields\n"); 3907 fprintf (dump_file, "-------------------------\n"); 3908 } 3909 } 3910 if (need_to_ifcvt) 3911 { 3912 /* Before we rewrite edges we'll record their original position in the 3913 edge map such that we can map the edges between the ifcvt and the 3914 non-ifcvt loop during peeling. */ 3915 uintptr_t idx = 0; 3916 for (edge exit : get_loop_exit_edges (loop)) 3917 exit->aux = (void*)idx++; 3918 3919 /* Now all statements are if-convertible. Combine all the basic 3920 blocks into one huge basic block doing the if-conversion 3921 on-the-fly. */ 3922 combine_blocks (loop, loop_versioned); 3923 } 3924 3925 std::pair <tree, tree> *name_pair; 3926 unsigned ssa_names_idx; 3927 FOR_EACH_VEC_ELT (redundant_ssa_names, ssa_names_idx, name_pair) 3928 replace_uses_by (name_pair->first, name_pair->second); 3929 redundant_ssa_names.release (); 3930 3931 /* Perform local CSE, this esp. helps the vectorizer analysis if loads 3932 and stores are involved. CSE only the loop body, not the entry 3933 PHIs, those are to be kept in sync with the non-if-converted copy. 3934 ??? We'll still keep dead stores though. */ 3935 exit_bbs = BITMAP_ALLOC (NULL); 3936 for (edge exit : get_loop_exit_edges (loop)) 3937 bitmap_set_bit (exit_bbs, exit->dest->index); 3938 todo |= do_rpo_vn (cfun, loop_preheader_edge (loop), exit_bbs, 3939 false, true, true); 3940 3941 /* Delete dead predicate computations. */ 3942 ifcvt_local_dce (loop); 3943 BITMAP_FREE (exit_bbs); 3944 3945 ifcvt_hoist_invariants (loop, pe); 3946 3947 todo |= TODO_cleanup_cfg; 3948 3949 cleanup: 3950 data_reference_p dr; 3951 unsigned int i; 3952 for (i = 0; refs.iterate (i, &dr); i++) 3953 { 3954 free (dr->aux); 3955 free_data_ref (dr); 3956 } 3957 refs.truncate (0); 3958 3959 if (ifc_bbs) 3960 { 3961 unsigned int i; 3962 3963 for (i = 0; i < loop->num_nodes; i++) 3964 free_bb_predicate (ifc_bbs[i]); 3965 3966 free (ifc_bbs); 3967 ifc_bbs = NULL; 3968 } 3969 if (rloop != NULL) 3970 { 3971 loop = rloop; 3972 reads_to_lower.truncate (0); 3973 writes_to_lower.truncate (0); 3974 goto again; 3975 } 3976 3977 return todo; 3978 } 3979 3980 /* Tree if-conversion pass management. */ 3981 3982 namespace { 3983 3984 const pass_data pass_data_if_conversion = 3985 { 3986 GIMPLE_PASS, /* type */ 3987 "ifcvt", /* name */ 3988 OPTGROUP_NONE, /* optinfo_flags */ 3989 TV_TREE_LOOP_IFCVT, /* tv_id */ 3990 ( PROP_cfg | PROP_ssa ), /* properties_required */ 3991 0, /* properties_provided */ 3992 0, /* properties_destroyed */ 3993 0, /* todo_flags_start */ 3994 0, /* todo_flags_finish */ 3995 }; 3996 3997 class pass_if_conversion : public gimple_opt_pass 3998 { 3999 public: 4000 pass_if_conversion (gcc::context *ctxt) 4001 : gimple_opt_pass (pass_data_if_conversion, ctxt) 4002 {} 4003 4004 /* opt_pass methods: */ 4005 bool gate (function *) final override; 4006 unsigned int execute (function *) final override; 4007 4008 }; // class pass_if_conversion 4009 4010 bool 4011 pass_if_conversion::gate (function *fun) 4012 { 4013 return (((flag_tree_loop_vectorize || fun->has_force_vectorize_loops) 4014 && flag_tree_loop_if_convert != 0) 4015 || flag_tree_loop_if_convert == 1); 4016 } 4017 4018 unsigned int 4019 pass_if_conversion::execute (function *fun) 4020 { 4021 unsigned todo = 0; 4022 4023 if (number_of_loops (fun) <= 1) 4024 return 0; 4025 4026 auto_vec<gimple *> preds; 4027 for (auto loop : loops_list (cfun, 0)) 4028 if (flag_tree_loop_if_convert == 1 4029 || ((flag_tree_loop_vectorize || loop->force_vectorize) 4030 && !loop->dont_vectorize)) 4031 todo |= tree_if_conversion (loop, &preds); 4032 4033 if (todo) 4034 { 4035 free_numbers_of_iterations_estimates (fun); 4036 scev_reset (); 4037 } 4038 4039 if (flag_checking) 4040 { 4041 basic_block bb; 4042 FOR_EACH_BB_FN (bb, fun) 4043 gcc_assert (!bb->aux); 4044 } 4045 4046 /* Perform IL update now, it might elide some loops. */ 4047 if (todo & TODO_cleanup_cfg) 4048 { 4049 cleanup_tree_cfg (); 4050 if (need_ssa_update_p (fun)) 4051 todo |= TODO_update_ssa; 4052 } 4053 if (todo & TODO_update_ssa_any) 4054 update_ssa (todo & TODO_update_ssa_any); 4055 4056 /* If if-conversion elided the loop fall back to the original one. Likewise 4057 if the loops are not nested in the same outer loop. */ 4058 for (unsigned i = 0; i < preds.length (); ++i) 4059 { 4060 gimple *g = preds[i]; 4061 if (!gimple_bb (g)) 4062 continue; 4063 auto ifcvt_loop = get_loop (fun, tree_to_uhwi (gimple_call_arg (g, 0))); 4064 auto orig_loop = get_loop (fun, tree_to_uhwi (gimple_call_arg (g, 1))); 4065 if (!ifcvt_loop || !orig_loop) 4066 { 4067 if (dump_file) 4068 fprintf (dump_file, "If-converted loop vanished\n"); 4069 fold_loop_internal_call (g, boolean_false_node); 4070 } 4071 else if (loop_outer (ifcvt_loop) != loop_outer (orig_loop)) 4072 { 4073 if (dump_file) 4074 fprintf (dump_file, "If-converted loop in different outer loop\n"); 4075 fold_loop_internal_call (g, boolean_false_node); 4076 } 4077 } 4078 4079 return 0; 4080 } 4081 4082 } // anon namespace 4083 4084 gimple_opt_pass * 4085 make_pass_if_conversion (gcc::context *ctxt) 4086 { 4087 return new pass_if_conversion (ctxt); 4088 } 4089