1 /* Single entry single exit control flow regions. 2 Copyright (C) 2008, 2009, 2010 3 Free Software Foundation, Inc. 4 Contributed by Jan Sjodin <jan.sjodin@amd.com> and 5 Sebastian Pop <sebastian.pop@amd.com>. 6 7 This file is part of GCC. 8 9 GCC is free software; you can redistribute it and/or modify 10 it under the terms of the GNU General Public License as published by 11 the Free Software Foundation; either version 3, or (at your option) 12 any later version. 13 14 GCC is distributed in the hope that it will be useful, 15 but WITHOUT ANY WARRANTY; without even the implied warranty of 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 GNU General Public License for more details. 18 19 You should have received a copy of the GNU General Public License 20 along with GCC; see the file COPYING3. If not see 21 <http://www.gnu.org/licenses/>. */ 22 23 #include "config.h" 24 #include "system.h" 25 #include "coretypes.h" 26 #include "tm.h" 27 #include "ggc.h" 28 #include "tree.h" 29 #include "rtl.h" 30 #include "basic-block.h" 31 #include "diagnostic.h" 32 #include "tree-flow.h" 33 #include "toplev.h" 34 #include "tree-dump.h" 35 #include "timevar.h" 36 #include "cfgloop.h" 37 #include "tree-chrec.h" 38 #include "tree-data-ref.h" 39 #include "tree-scalar-evolution.h" 40 #include "tree-pass.h" 41 #include "domwalk.h" 42 #include "value-prof.h" 43 #include "pointer-set.h" 44 #include "gimple.h" 45 #include "sese.h" 46 47 /* Print to stderr the element ELT. */ 48 49 static void 50 debug_rename_elt (rename_map_elt elt) 51 { 52 fprintf (stderr, "("); 53 print_generic_expr (stderr, elt->old_name, 0); 54 fprintf (stderr, ", "); 55 print_generic_expr (stderr, elt->expr, 0); 56 fprintf (stderr, ")\n"); 57 } 58 59 /* Helper function for debug_rename_map. */ 60 61 static int 62 debug_rename_map_1 (void **slot, void *s ATTRIBUTE_UNUSED) 63 { 64 struct rename_map_elt_s *entry = (struct rename_map_elt_s *) *slot; 65 debug_rename_elt (entry); 66 return 1; 67 } 68 69 /* Print to stderr all the elements of MAP. */ 70 71 void 72 debug_rename_map (htab_t map) 73 { 74 htab_traverse (map, debug_rename_map_1, NULL); 75 } 76 77 /* Computes a hash function for database element ELT. */ 78 79 hashval_t 80 rename_map_elt_info (const void *elt) 81 { 82 return SSA_NAME_VERSION (((const struct rename_map_elt_s *) elt)->old_name); 83 } 84 85 /* Compares database elements E1 and E2. */ 86 87 int 88 eq_rename_map_elts (const void *e1, const void *e2) 89 { 90 const struct rename_map_elt_s *elt1 = (const struct rename_map_elt_s *) e1; 91 const struct rename_map_elt_s *elt2 = (const struct rename_map_elt_s *) e2; 92 93 return (elt1->old_name == elt2->old_name); 94 } 95 96 97 98 /* Print to stderr the element ELT. */ 99 100 static void 101 debug_ivtype_elt (ivtype_map_elt elt) 102 { 103 fprintf (stderr, "(%s, ", elt->cloog_iv); 104 print_generic_expr (stderr, elt->type, 0); 105 fprintf (stderr, ")\n"); 106 } 107 108 /* Helper function for debug_ivtype_map. */ 109 110 static int 111 debug_ivtype_map_1 (void **slot, void *s ATTRIBUTE_UNUSED) 112 { 113 struct ivtype_map_elt_s *entry = (struct ivtype_map_elt_s *) *slot; 114 debug_ivtype_elt (entry); 115 return 1; 116 } 117 118 /* Print to stderr all the elements of MAP. */ 119 120 void 121 debug_ivtype_map (htab_t map) 122 { 123 htab_traverse (map, debug_ivtype_map_1, NULL); 124 } 125 126 /* Computes a hash function for database element ELT. */ 127 128 hashval_t 129 ivtype_map_elt_info (const void *elt) 130 { 131 return htab_hash_pointer (((const struct ivtype_map_elt_s *) elt)->cloog_iv); 132 } 133 134 /* Compares database elements E1 and E2. */ 135 136 int 137 eq_ivtype_map_elts (const void *e1, const void *e2) 138 { 139 const struct ivtype_map_elt_s *elt1 = (const struct ivtype_map_elt_s *) e1; 140 const struct ivtype_map_elt_s *elt2 = (const struct ivtype_map_elt_s *) e2; 141 142 return (elt1->cloog_iv == elt2->cloog_iv); 143 } 144 145 146 147 /* Record LOOP as occuring in REGION. */ 148 149 static void 150 sese_record_loop (sese region, loop_p loop) 151 { 152 if (sese_contains_loop (region, loop)) 153 return; 154 155 bitmap_set_bit (SESE_LOOPS (region), loop->num); 156 VEC_safe_push (loop_p, heap, SESE_LOOP_NEST (region), loop); 157 } 158 159 /* Build the loop nests contained in REGION. Returns true when the 160 operation was successful. */ 161 162 void 163 build_sese_loop_nests (sese region) 164 { 165 unsigned i; 166 basic_block bb; 167 struct loop *loop0, *loop1; 168 169 FOR_EACH_BB (bb) 170 if (bb_in_sese_p (bb, region)) 171 { 172 struct loop *loop = bb->loop_father; 173 174 /* Only add loops if they are completely contained in the SCoP. */ 175 if (loop->header == bb 176 && bb_in_sese_p (loop->latch, region)) 177 sese_record_loop (region, loop); 178 } 179 180 /* Make sure that the loops in the SESE_LOOP_NEST are ordered. It 181 can be the case that an inner loop is inserted before an outer 182 loop. To avoid this, semi-sort once. */ 183 for (i = 0; VEC_iterate (loop_p, SESE_LOOP_NEST (region), i, loop0); i++) 184 { 185 if (VEC_length (loop_p, SESE_LOOP_NEST (region)) == i + 1) 186 break; 187 188 loop1 = VEC_index (loop_p, SESE_LOOP_NEST (region), i + 1); 189 if (loop0->num > loop1->num) 190 { 191 VEC_replace (loop_p, SESE_LOOP_NEST (region), i, loop1); 192 VEC_replace (loop_p, SESE_LOOP_NEST (region), i + 1, loop0); 193 } 194 } 195 } 196 197 /* For a USE in BB, if BB is outside REGION, mark the USE in the 198 LIVEOUTS set. */ 199 200 static void 201 sese_build_liveouts_use (sese region, bitmap liveouts, basic_block bb, 202 tree use) 203 { 204 unsigned ver; 205 basic_block def_bb; 206 207 if (TREE_CODE (use) != SSA_NAME) 208 return; 209 210 ver = SSA_NAME_VERSION (use); 211 def_bb = gimple_bb (SSA_NAME_DEF_STMT (use)); 212 213 if (!def_bb 214 || !bb_in_sese_p (def_bb, region) 215 || bb_in_sese_p (bb, region)) 216 return; 217 218 bitmap_set_bit (liveouts, ver); 219 } 220 221 /* Marks for rewrite all the SSA_NAMES defined in REGION and that are 222 used in BB that is outside of the REGION. */ 223 224 static void 225 sese_build_liveouts_bb (sese region, bitmap liveouts, basic_block bb) 226 { 227 gimple_stmt_iterator bsi; 228 edge e; 229 edge_iterator ei; 230 ssa_op_iter iter; 231 use_operand_p use_p; 232 233 FOR_EACH_EDGE (e, ei, bb->succs) 234 for (bsi = gsi_start_phis (e->dest); !gsi_end_p (bsi); gsi_next (&bsi)) 235 sese_build_liveouts_use (region, liveouts, bb, 236 PHI_ARG_DEF_FROM_EDGE (gsi_stmt (bsi), e)); 237 238 for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi)) 239 { 240 gimple stmt = gsi_stmt (bsi); 241 242 if (is_gimple_debug (stmt)) 243 continue; 244 245 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES) 246 sese_build_liveouts_use (region, liveouts, bb, USE_FROM_PTR (use_p)); 247 } 248 } 249 250 /* For a USE in BB, return true if BB is outside REGION and it's not 251 in the LIVEOUTS set. */ 252 253 static bool 254 sese_bad_liveouts_use (sese region, bitmap liveouts, basic_block bb, 255 tree use) 256 { 257 unsigned ver; 258 basic_block def_bb; 259 260 if (TREE_CODE (use) != SSA_NAME) 261 return false; 262 263 ver = SSA_NAME_VERSION (use); 264 265 /* If it's in liveouts, the variable will get a new PHI node, and 266 the debug use will be properly adjusted. */ 267 if (bitmap_bit_p (liveouts, ver)) 268 return false; 269 270 def_bb = gimple_bb (SSA_NAME_DEF_STMT (use)); 271 272 if (!def_bb 273 || !bb_in_sese_p (def_bb, region) 274 || bb_in_sese_p (bb, region)) 275 return false; 276 277 return true; 278 } 279 280 /* Reset debug stmts that reference SSA_NAMES defined in REGION that 281 are not marked as liveouts. */ 282 283 static void 284 sese_reset_debug_liveouts_bb (sese region, bitmap liveouts, basic_block bb) 285 { 286 gimple_stmt_iterator bsi; 287 ssa_op_iter iter; 288 use_operand_p use_p; 289 290 for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi)) 291 { 292 gimple stmt = gsi_stmt (bsi); 293 294 if (!is_gimple_debug (stmt)) 295 continue; 296 297 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES) 298 if (sese_bad_liveouts_use (region, liveouts, bb, 299 USE_FROM_PTR (use_p))) 300 { 301 gimple_debug_bind_reset_value (stmt); 302 update_stmt (stmt); 303 break; 304 } 305 } 306 } 307 308 /* Build the LIVEOUTS of REGION: the set of variables defined inside 309 and used outside the REGION. */ 310 311 static void 312 sese_build_liveouts (sese region, bitmap liveouts) 313 { 314 basic_block bb; 315 316 FOR_EACH_BB (bb) 317 sese_build_liveouts_bb (region, liveouts, bb); 318 if (MAY_HAVE_DEBUG_INSNS) 319 FOR_EACH_BB (bb) 320 sese_reset_debug_liveouts_bb (region, liveouts, bb); 321 } 322 323 /* Builds a new SESE region from edges ENTRY and EXIT. */ 324 325 sese 326 new_sese (edge entry, edge exit) 327 { 328 sese region = XNEW (struct sese_s); 329 330 SESE_ENTRY (region) = entry; 331 SESE_EXIT (region) = exit; 332 SESE_LOOPS (region) = BITMAP_ALLOC (NULL); 333 SESE_LOOP_NEST (region) = VEC_alloc (loop_p, heap, 3); 334 SESE_ADD_PARAMS (region) = true; 335 SESE_PARAMS (region) = VEC_alloc (tree, heap, 3); 336 337 return region; 338 } 339 340 /* Deletes REGION. */ 341 342 void 343 free_sese (sese region) 344 { 345 if (SESE_LOOPS (region)) 346 SESE_LOOPS (region) = BITMAP_ALLOC (NULL); 347 348 VEC_free (tree, heap, SESE_PARAMS (region)); 349 VEC_free (loop_p, heap, SESE_LOOP_NEST (region)); 350 351 XDELETE (region); 352 } 353 354 /* Add exit phis for USE on EXIT. */ 355 356 static void 357 sese_add_exit_phis_edge (basic_block exit, tree use, edge false_e, edge true_e) 358 { 359 gimple phi = create_phi_node (use, exit); 360 361 create_new_def_for (gimple_phi_result (phi), phi, 362 gimple_phi_result_ptr (phi)); 363 add_phi_arg (phi, use, false_e, UNKNOWN_LOCATION); 364 add_phi_arg (phi, use, true_e, UNKNOWN_LOCATION); 365 } 366 367 /* Insert in the block BB phi nodes for variables defined in REGION 368 and used outside the REGION. The code generation moves REGION in 369 the else clause of an "if (1)" and generates code in the then 370 clause that is at this point empty: 371 372 | if (1) 373 | empty; 374 | else 375 | REGION; 376 */ 377 378 void 379 sese_insert_phis_for_liveouts (sese region, basic_block bb, 380 edge false_e, edge true_e) 381 { 382 unsigned i; 383 bitmap_iterator bi; 384 bitmap liveouts = BITMAP_ALLOC (NULL); 385 386 update_ssa (TODO_update_ssa); 387 388 sese_build_liveouts (region, liveouts); 389 EXECUTE_IF_SET_IN_BITMAP (liveouts, 0, i, bi) 390 sese_add_exit_phis_edge (bb, ssa_name (i), false_e, true_e); 391 BITMAP_FREE (liveouts); 392 393 update_ssa (TODO_update_ssa); 394 } 395 396 /* Get the definition of NAME before the SESE. Keep track of the 397 basic blocks that have been VISITED in a bitmap. */ 398 399 static tree 400 get_vdef_before_sese (sese region, tree name, sbitmap visited) 401 { 402 unsigned i; 403 gimple stmt = SSA_NAME_DEF_STMT (name); 404 basic_block def_bb = gimple_bb (stmt); 405 406 if (!def_bb || !bb_in_sese_p (def_bb, region)) 407 return name; 408 409 if (TEST_BIT (visited, def_bb->index)) 410 return NULL_TREE; 411 412 SET_BIT (visited, def_bb->index); 413 414 switch (gimple_code (stmt)) 415 { 416 case GIMPLE_PHI: 417 for (i = 0; i < gimple_phi_num_args (stmt); i++) 418 { 419 tree arg = gimple_phi_arg_def (stmt, i); 420 tree res; 421 422 if (gimple_bb (SSA_NAME_DEF_STMT (arg)) 423 && def_bb->index == gimple_bb (SSA_NAME_DEF_STMT (arg))->index) 424 continue; 425 426 res = get_vdef_before_sese (region, arg, visited); 427 if (res) 428 return res; 429 } 430 return NULL_TREE; 431 432 case GIMPLE_ASSIGN: 433 case GIMPLE_CALL: 434 { 435 use_operand_p use_p = gimple_vuse_op (stmt); 436 tree use = USE_FROM_PTR (use_p); 437 438 if (def_bb->index == gimple_bb (SSA_NAME_DEF_STMT (use))->index) 439 RESET_BIT (visited, def_bb->index); 440 441 return get_vdef_before_sese (region, use, visited); 442 } 443 444 default: 445 return NULL_TREE; 446 } 447 } 448 449 /* Adjust a virtual phi node PHI that is placed at the end of the 450 generated code for SCOP: 451 452 | if (1) 453 | generated code from REGION; 454 | else 455 | REGION; 456 457 The FALSE_E edge comes from the original code, TRUE_E edge comes 458 from the code generated for the SCOP. */ 459 460 static void 461 sese_adjust_vphi (sese region, gimple phi, edge true_e) 462 { 463 unsigned i; 464 465 gcc_assert (gimple_phi_num_args (phi) == 2); 466 467 for (i = 0; i < gimple_phi_num_args (phi); i++) 468 if (gimple_phi_arg_edge (phi, i) == true_e) 469 { 470 tree true_arg, false_arg, before_scop_arg; 471 sbitmap visited; 472 473 true_arg = gimple_phi_arg_def (phi, i); 474 if (!SSA_NAME_IS_DEFAULT_DEF (true_arg)) 475 return; 476 477 false_arg = gimple_phi_arg_def (phi, i == 0 ? 1 : 0); 478 if (SSA_NAME_IS_DEFAULT_DEF (false_arg)) 479 return; 480 481 visited = sbitmap_alloc (last_basic_block); 482 sbitmap_zero (visited); 483 before_scop_arg = get_vdef_before_sese (region, false_arg, visited); 484 gcc_assert (before_scop_arg != NULL_TREE); 485 SET_PHI_ARG_DEF (phi, i, before_scop_arg); 486 sbitmap_free (visited); 487 } 488 } 489 490 /* Returns the expression associated to OLD_NAME in MAP. */ 491 492 static tree 493 get_rename (htab_t map, tree old_name) 494 { 495 struct rename_map_elt_s tmp; 496 PTR *slot; 497 498 gcc_assert (TREE_CODE (old_name) == SSA_NAME); 499 tmp.old_name = old_name; 500 slot = htab_find_slot (map, &tmp, NO_INSERT); 501 502 if (slot && *slot) 503 return ((rename_map_elt) *slot)->expr; 504 505 return old_name; 506 } 507 508 /* Register in MAP the rename tuple (OLD_NAME, EXPR). */ 509 510 void 511 set_rename (htab_t map, tree old_name, tree expr) 512 { 513 struct rename_map_elt_s tmp; 514 PTR *slot; 515 516 if (old_name == expr) 517 return; 518 519 tmp.old_name = old_name; 520 slot = htab_find_slot (map, &tmp, INSERT); 521 522 if (!slot) 523 return; 524 525 if (*slot) 526 free (*slot); 527 528 *slot = new_rename_map_elt (old_name, expr); 529 } 530 531 /* Renames the expression T following the tuples (OLD_NAME, EXPR) in 532 the rename map M. Returns the expression T after renaming. */ 533 534 static tree 535 rename_variables_in_expr (htab_t m, tree t) 536 { 537 if (!t) 538 return t; 539 540 if (TREE_CODE (t) == SSA_NAME) 541 return get_rename (m, t); 542 543 switch (TREE_CODE_LENGTH (TREE_CODE (t))) 544 { 545 case 3: 546 TREE_OPERAND (t, 2) = rename_variables_in_expr (m, TREE_OPERAND (t, 2)); 547 548 case 2: 549 TREE_OPERAND (t, 1) = rename_variables_in_expr (m, TREE_OPERAND (t, 1)); 550 551 case 1: 552 TREE_OPERAND (t, 0) = rename_variables_in_expr (m, TREE_OPERAND (t, 0)); 553 554 default: 555 return t; 556 } 557 } 558 559 /* Renames all the loop->nb_iterations expressions following the 560 tuples (OLD_NAME, EXPR) in RENAME_MAP. */ 561 562 void 563 rename_nb_iterations (htab_t rename_map) 564 { 565 loop_iterator li; 566 struct loop *loop; 567 568 FOR_EACH_LOOP (li, loop, 0) 569 loop->nb_iterations = rename_variables_in_expr (rename_map, 570 loop->nb_iterations); 571 } 572 573 /* Renames all the parameters of SESE following the tuples (OLD_NAME, 574 EXPR) in RENAME_MAP. */ 575 576 void 577 rename_sese_parameters (htab_t rename_map, sese region) 578 { 579 int i; 580 tree p; 581 582 for (i = 0; VEC_iterate (tree, SESE_PARAMS (region), i, p); i++) 583 VEC_replace (tree, SESE_PARAMS (region), i, 584 rename_variables_in_expr (rename_map, p)); 585 } 586 587 /* Adjusts the phi nodes in the block BB for variables defined in 588 SCOP_REGION and used outside the SCOP_REGION. The code generation 589 moves SCOP_REGION in the else clause of an "if (1)" and generates 590 code in the then clause: 591 592 | if (1) 593 | generated code from REGION; 594 | else 595 | REGION; 596 597 To adjust the phi nodes after the condition, the RENAME_MAP is 598 used. */ 599 600 void 601 sese_adjust_liveout_phis (sese region, htab_t rename_map, basic_block bb, 602 edge false_e, edge true_e) 603 { 604 gimple_stmt_iterator si; 605 606 for (si = gsi_start_phis (bb); !gsi_end_p (si); gsi_next (&si)) 607 { 608 unsigned i; 609 unsigned false_i = 0; 610 gimple phi = gsi_stmt (si); 611 tree res = gimple_phi_result (phi); 612 613 if (!is_gimple_reg (res)) 614 { 615 sese_adjust_vphi (region, phi, true_e); 616 continue; 617 } 618 619 for (i = 0; i < gimple_phi_num_args (phi); i++) 620 if (gimple_phi_arg_edge (phi, i) == false_e) 621 { 622 false_i = i; 623 break; 624 } 625 626 for (i = 0; i < gimple_phi_num_args (phi); i++) 627 if (gimple_phi_arg_edge (phi, i) == true_e) 628 { 629 tree old_name = gimple_phi_arg_def (phi, false_i); 630 tree expr = get_rename (rename_map, old_name); 631 gimple_seq stmts; 632 633 gcc_assert (old_name != expr); 634 635 if (TREE_CODE (expr) != SSA_NAME 636 && is_gimple_reg (old_name)) 637 { 638 tree type = TREE_TYPE (old_name); 639 tree var = create_tmp_var (type, "var"); 640 641 expr = build2 (MODIFY_EXPR, type, var, expr); 642 expr = force_gimple_operand (expr, &stmts, true, NULL); 643 gsi_insert_seq_on_edge_immediate (true_e, stmts); 644 } 645 646 SET_PHI_ARG_DEF (phi, i, expr); 647 set_rename (rename_map, old_name, res); 648 } 649 } 650 } 651 652 /* Rename the SSA_NAMEs used in STMT and that appear in MAP. */ 653 654 static void 655 rename_variables_in_stmt (gimple stmt, htab_t map, gimple_stmt_iterator *insert_gsi) 656 { 657 ssa_op_iter iter; 658 use_operand_p use_p; 659 660 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES) 661 { 662 tree use = USE_FROM_PTR (use_p); 663 tree expr, type_use, type_expr; 664 gimple_seq stmts; 665 666 if (TREE_CODE (use) != SSA_NAME) 667 continue; 668 669 expr = get_rename (map, use); 670 if (use == expr) 671 continue; 672 673 type_use = TREE_TYPE (use); 674 type_expr = TREE_TYPE (expr); 675 676 if (type_use != type_expr 677 || (TREE_CODE (expr) != SSA_NAME 678 && is_gimple_reg (use))) 679 { 680 tree var; 681 682 if (is_gimple_debug (stmt)) 683 { 684 if (gimple_debug_bind_p (stmt)) 685 gimple_debug_bind_reset_value (stmt); 686 else 687 gcc_unreachable (); 688 689 break; 690 } 691 692 var = create_tmp_var (type_use, "var"); 693 694 if (type_use != type_expr) 695 expr = fold_convert (type_use, expr); 696 697 expr = build2 (MODIFY_EXPR, type_use, var, expr); 698 expr = force_gimple_operand (expr, &stmts, true, NULL); 699 gsi_insert_seq_before (insert_gsi, stmts, GSI_SAME_STMT); 700 } 701 702 replace_exp (use_p, expr); 703 } 704 705 update_stmt (stmt); 706 } 707 708 /* Returns true if NAME is a parameter of SESE. */ 709 710 static bool 711 is_parameter (sese region, tree name) 712 { 713 int i; 714 tree p; 715 716 for (i = 0; VEC_iterate (tree, SESE_PARAMS (region), i, p); i++) 717 if (p == name) 718 return true; 719 720 return false; 721 } 722 723 /* Returns true if NAME is an induction variable. */ 724 725 static bool 726 is_iv (tree name) 727 { 728 return gimple_code (SSA_NAME_DEF_STMT (name)) == GIMPLE_PHI; 729 } 730 731 static void expand_scalar_variables_stmt (gimple, basic_block, sese, 732 htab_t, gimple_stmt_iterator *); 733 static tree 734 expand_scalar_variables_expr (tree, tree, enum tree_code, tree, basic_block, 735 sese, htab_t, gimple_stmt_iterator *); 736 737 static tree 738 expand_scalar_variables_call (gimple stmt, basic_block bb, sese region, 739 htab_t map, gimple_stmt_iterator *gsi) 740 { 741 int i, nargs = gimple_call_num_args (stmt); 742 VEC (tree, gc) *args = VEC_alloc (tree, gc, nargs); 743 tree fn_type = TREE_TYPE (gimple_call_fn (stmt)); 744 tree fn = gimple_call_fndecl (stmt); 745 tree call_expr, var, lhs; 746 gimple call; 747 748 for (i = 0; i < nargs; i++) 749 { 750 tree arg = gimple_call_arg (stmt, i); 751 tree t = TREE_TYPE (arg); 752 753 var = create_tmp_var (t, "var"); 754 arg = expand_scalar_variables_expr (t, arg, TREE_CODE (arg), NULL, 755 bb, region, map, gsi); 756 arg = build2 (MODIFY_EXPR, t, var, arg); 757 arg = force_gimple_operand_gsi (gsi, arg, true, NULL, 758 true, GSI_SAME_STMT); 759 VEC_quick_push (tree, args, arg); 760 } 761 762 lhs = gimple_call_lhs (stmt); 763 var = create_tmp_var (TREE_TYPE (lhs), "var"); 764 call_expr = build_call_vec (fn_type, fn, args); 765 call = gimple_build_call_from_tree (call_expr); 766 var = make_ssa_name (var, call); 767 gimple_call_set_lhs (call, var); 768 gsi_insert_before (gsi, call, GSI_SAME_STMT); 769 770 return var; 771 } 772 773 /* Copies at GSI all the scalar computations on which the ssa_name OP0 774 depends on in the SESE: these are all the scalar variables used in 775 the definition of OP0, that are defined outside BB and still in the 776 SESE, i.e. not a parameter of the SESE. The expression that is 777 returned contains only induction variables from the generated code: 778 MAP contains the induction variables renaming mapping, and is used 779 to translate the names of induction variables. */ 780 781 static tree 782 expand_scalar_variables_ssa_name (tree type, tree op0, basic_block bb, 783 sese region, htab_t map, 784 gimple_stmt_iterator *gsi) 785 { 786 gimple def_stmt; 787 tree new_op; 788 789 if (is_parameter (region, op0) 790 || is_iv (op0)) 791 return fold_convert (type, get_rename (map, op0)); 792 793 def_stmt = SSA_NAME_DEF_STMT (op0); 794 795 /* Check whether we already have a rename for OP0. */ 796 new_op = get_rename (map, op0); 797 798 if (new_op != op0 799 && gimple_bb (SSA_NAME_DEF_STMT (new_op)) == bb) 800 return fold_convert (type, new_op); 801 802 if (gimple_bb (def_stmt) == bb) 803 { 804 /* If the defining statement is in the basic block already 805 we do not need to create a new expression for it, we 806 only need to ensure its operands are expanded. */ 807 expand_scalar_variables_stmt (def_stmt, bb, region, map, gsi); 808 return fold_convert (type, new_op); 809 } 810 else 811 { 812 if (!gimple_bb (def_stmt) 813 || !bb_in_sese_p (gimple_bb (def_stmt), region)) 814 return fold_convert (type, new_op); 815 816 switch (gimple_code (def_stmt)) 817 { 818 case GIMPLE_ASSIGN: 819 { 820 tree var0 = gimple_assign_rhs1 (def_stmt); 821 enum tree_code subcode = gimple_assign_rhs_code (def_stmt); 822 tree var1 = gimple_assign_rhs2 (def_stmt); 823 tree type = gimple_expr_type (def_stmt); 824 825 return expand_scalar_variables_expr (type, var0, subcode, var1, bb, 826 region, map, gsi); 827 } 828 829 case GIMPLE_CALL: 830 return expand_scalar_variables_call (def_stmt, bb, region, map, gsi); 831 832 default: 833 gcc_unreachable (); 834 return new_op; 835 } 836 } 837 } 838 839 /* Copies at GSI all the scalar computations on which the expression 840 OP0 CODE OP1 depends on in the SESE: these are all the scalar 841 variables used in OP0 and OP1, defined outside BB and still defined 842 in the SESE, i.e. not a parameter of the SESE. The expression that 843 is returned contains only induction variables from the generated 844 code: MAP contains the induction variables renaming mapping, and is 845 used to translate the names of induction variables. */ 846 847 static tree 848 expand_scalar_variables_expr (tree type, tree op0, enum tree_code code, 849 tree op1, basic_block bb, sese region, 850 htab_t map, gimple_stmt_iterator *gsi) 851 { 852 if (TREE_CODE_CLASS (code) == tcc_constant 853 || TREE_CODE_CLASS (code) == tcc_declaration) 854 return op0; 855 856 /* For data references we have to duplicate also its memory 857 indexing. */ 858 if (TREE_CODE_CLASS (code) == tcc_reference) 859 { 860 switch (code) 861 { 862 case REALPART_EXPR: 863 case IMAGPART_EXPR: 864 { 865 tree op = TREE_OPERAND (op0, 0); 866 tree res = expand_scalar_variables_expr 867 (type, op, TREE_CODE (op), NULL, bb, region, map, gsi); 868 return build1 (code, type, res); 869 } 870 871 case INDIRECT_REF: 872 { 873 tree old_name = TREE_OPERAND (op0, 0); 874 tree expr = expand_scalar_variables_ssa_name 875 (type, old_name, bb, region, map, gsi); 876 877 if (TREE_CODE (expr) != SSA_NAME 878 && is_gimple_reg (old_name)) 879 { 880 tree type = TREE_TYPE (old_name); 881 tree var = create_tmp_var (type, "var"); 882 883 expr = build2 (MODIFY_EXPR, type, var, expr); 884 expr = force_gimple_operand_gsi (gsi, expr, true, NULL, 885 true, GSI_SAME_STMT); 886 } 887 888 return fold_build1 (code, type, expr); 889 } 890 891 case ARRAY_REF: 892 { 893 tree op00 = TREE_OPERAND (op0, 0); 894 tree op01 = TREE_OPERAND (op0, 1); 895 tree op02 = TREE_OPERAND (op0, 2); 896 tree op03 = TREE_OPERAND (op0, 3); 897 tree base = expand_scalar_variables_expr 898 (TREE_TYPE (op00), op00, TREE_CODE (op00), NULL, bb, region, 899 map, gsi); 900 tree subscript = expand_scalar_variables_expr 901 (TREE_TYPE (op01), op01, TREE_CODE (op01), NULL, bb, region, 902 map, gsi); 903 904 return build4 (ARRAY_REF, type, base, subscript, op02, op03); 905 } 906 907 case COMPONENT_REF: 908 return op0; 909 910 default: 911 /* The above cases should catch everything. */ 912 gcc_unreachable (); 913 } 914 } 915 916 if (TREE_CODE_CLASS (code) == tcc_unary) 917 { 918 tree op0_type = TREE_TYPE (op0); 919 enum tree_code op0_code = TREE_CODE (op0); 920 tree op0_expr = expand_scalar_variables_expr (op0_type, op0, op0_code, 921 NULL, bb, region, map, gsi); 922 923 return fold_build1 (code, type, op0_expr); 924 } 925 926 if (TREE_CODE_CLASS (code) == tcc_binary 927 || TREE_CODE_CLASS (code) == tcc_comparison) 928 { 929 tree op0_type = TREE_TYPE (op0); 930 enum tree_code op0_code = TREE_CODE (op0); 931 tree op0_expr = expand_scalar_variables_expr (op0_type, op0, op0_code, 932 NULL, bb, region, map, gsi); 933 tree op1_type = TREE_TYPE (op1); 934 enum tree_code op1_code = TREE_CODE (op1); 935 tree op1_expr = expand_scalar_variables_expr (op1_type, op1, op1_code, 936 NULL, bb, region, map, gsi); 937 938 return fold_build2 (code, type, op0_expr, op1_expr); 939 } 940 941 if (code == SSA_NAME) 942 return expand_scalar_variables_ssa_name (type, op0, bb, region, map, gsi); 943 944 if (code == ADDR_EXPR) 945 { 946 tree op00 = TREE_OPERAND (op0, 0); 947 948 if (handled_component_p (op00) 949 && TREE_CODE (op00) == ARRAY_REF) 950 { 951 tree e = expand_scalar_variables_expr (TREE_TYPE (op00), op00, 952 TREE_CODE (op00), 953 NULL, bb, region, map, gsi); 954 return fold_build1 (code, TREE_TYPE (op0), e); 955 } 956 957 return op0; 958 } 959 960 gcc_unreachable (); 961 return NULL; 962 } 963 964 /* Copies at the beginning of BB all the scalar computations on which 965 STMT depends on in the SESE: these are all the scalar variables used 966 in STMT, defined outside BB and still defined in the SESE, i.e. not a 967 parameter of the SESE. The expression that is returned contains 968 only induction variables from the generated code: MAP contains the 969 induction variables renaming mapping, and is used to translate the 970 names of induction variables. */ 971 972 static void 973 expand_scalar_variables_stmt (gimple stmt, basic_block bb, sese region, 974 htab_t map, gimple_stmt_iterator *gsi) 975 { 976 ssa_op_iter iter; 977 use_operand_p use_p; 978 979 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES) 980 { 981 tree use = USE_FROM_PTR (use_p); 982 tree type = TREE_TYPE (use); 983 enum tree_code code = TREE_CODE (use); 984 tree use_expr; 985 986 if (!is_gimple_reg (use)) 987 continue; 988 989 /* Don't expand USE if we already have a rename for it. */ 990 use_expr = get_rename (map, use); 991 if (use_expr != use) 992 continue; 993 994 use_expr = expand_scalar_variables_expr (type, use, code, NULL, bb, 995 region, map, gsi); 996 use_expr = fold_convert (type, use_expr); 997 998 if (use_expr == use) 999 continue; 1000 1001 if (is_gimple_debug (stmt)) 1002 { 1003 if (gimple_debug_bind_p (stmt)) 1004 gimple_debug_bind_reset_value (stmt); 1005 else 1006 gcc_unreachable (); 1007 1008 break; 1009 } 1010 1011 if (TREE_CODE (use_expr) != SSA_NAME) 1012 { 1013 tree var = create_tmp_var (type, "var"); 1014 1015 use_expr = build2 (MODIFY_EXPR, type, var, use_expr); 1016 use_expr = force_gimple_operand_gsi (gsi, use_expr, true, NULL, 1017 true, GSI_SAME_STMT); 1018 } 1019 1020 replace_exp (use_p, use_expr); 1021 } 1022 1023 update_stmt (stmt); 1024 } 1025 1026 /* Copies at the beginning of BB all the scalar computations on which 1027 BB depends on in the SESE: these are all the scalar variables used 1028 in BB, defined outside BB and still defined in the SESE, i.e. not a 1029 parameter of the SESE. The expression that is returned contains 1030 only induction variables from the generated code: MAP contains the 1031 induction variables renaming mapping, and is used to translate the 1032 names of induction variables. */ 1033 1034 static void 1035 expand_scalar_variables (basic_block bb, sese region, htab_t map) 1036 { 1037 gimple_stmt_iterator gsi; 1038 1039 for (gsi = gsi_after_labels (bb); !gsi_end_p (gsi);) 1040 { 1041 gimple stmt = gsi_stmt (gsi); 1042 expand_scalar_variables_stmt (stmt, bb, region, map, &gsi); 1043 gsi_next (&gsi); 1044 } 1045 } 1046 1047 /* Rename all the SSA_NAMEs from block BB according to the MAP. */ 1048 1049 static void 1050 rename_variables (basic_block bb, htab_t map) 1051 { 1052 gimple_stmt_iterator gsi; 1053 gimple_stmt_iterator insert_gsi = gsi_start_bb (bb); 1054 1055 for (gsi = gsi_after_labels (bb); !gsi_end_p (gsi); gsi_next (&gsi)) 1056 rename_variables_in_stmt (gsi_stmt (gsi), map, &insert_gsi); 1057 } 1058 1059 /* Remove condition from BB. */ 1060 1061 static void 1062 remove_condition (basic_block bb) 1063 { 1064 gimple last = last_stmt (bb); 1065 1066 if (last && gimple_code (last) == GIMPLE_COND) 1067 { 1068 gimple_stmt_iterator gsi = gsi_last_bb (bb); 1069 gsi_remove (&gsi, true); 1070 } 1071 } 1072 1073 /* Returns the first successor edge of BB with EDGE_TRUE_VALUE flag set. */ 1074 1075 edge 1076 get_true_edge_from_guard_bb (basic_block bb) 1077 { 1078 edge e; 1079 edge_iterator ei; 1080 1081 FOR_EACH_EDGE (e, ei, bb->succs) 1082 if (e->flags & EDGE_TRUE_VALUE) 1083 return e; 1084 1085 gcc_unreachable (); 1086 return NULL; 1087 } 1088 1089 /* Returns the first successor edge of BB with EDGE_TRUE_VALUE flag cleared. */ 1090 1091 edge 1092 get_false_edge_from_guard_bb (basic_block bb) 1093 { 1094 edge e; 1095 edge_iterator ei; 1096 1097 FOR_EACH_EDGE (e, ei, bb->succs) 1098 if (!(e->flags & EDGE_TRUE_VALUE)) 1099 return e; 1100 1101 gcc_unreachable (); 1102 return NULL; 1103 } 1104 1105 /* Returns true when NAME is defined in LOOP. */ 1106 1107 static bool 1108 name_defined_in_loop_p (tree name, loop_p loop) 1109 { 1110 return !SSA_NAME_IS_DEFAULT_DEF (name) 1111 && gimple_bb (SSA_NAME_DEF_STMT (name))->loop_father == loop; 1112 } 1113 1114 /* Returns true when EXPR contains SSA_NAMEs defined in LOOP. */ 1115 1116 static bool 1117 expr_defined_in_loop_p (tree expr, loop_p loop) 1118 { 1119 switch (TREE_CODE_LENGTH (TREE_CODE (expr))) 1120 { 1121 case 3: 1122 return expr_defined_in_loop_p (TREE_OPERAND (expr, 0), loop) 1123 || expr_defined_in_loop_p (TREE_OPERAND (expr, 1), loop) 1124 || expr_defined_in_loop_p (TREE_OPERAND (expr, 2), loop); 1125 1126 case 2: 1127 return expr_defined_in_loop_p (TREE_OPERAND (expr, 0), loop) 1128 || expr_defined_in_loop_p (TREE_OPERAND (expr, 1), loop); 1129 1130 case 1: 1131 return expr_defined_in_loop_p (TREE_OPERAND (expr, 0), loop); 1132 1133 case 0: 1134 return TREE_CODE (expr) == SSA_NAME 1135 && name_defined_in_loop_p (expr, loop); 1136 1137 default: 1138 return false; 1139 } 1140 } 1141 1142 /* Returns the gimple statement that uses NAME outside the loop it is 1143 defined in, returns NULL if there is no such loop close phi node. 1144 An invariant of the loop closed SSA form is that the only use of a 1145 variable, outside the loop it is defined in, is in the loop close 1146 phi node that just follows the loop. */ 1147 1148 static gimple 1149 alive_after_loop (tree name) 1150 { 1151 use_operand_p use_p; 1152 imm_use_iterator imm_iter; 1153 loop_p loop = gimple_bb (SSA_NAME_DEF_STMT (name))->loop_father; 1154 1155 FOR_EACH_IMM_USE_FAST (use_p, imm_iter, name) 1156 { 1157 gimple stmt = USE_STMT (use_p); 1158 1159 if (gimple_code (stmt) == GIMPLE_PHI 1160 && gimple_bb (stmt)->loop_father != loop) 1161 return stmt; 1162 } 1163 1164 return NULL; 1165 } 1166 1167 /* Return true if a close phi has not yet been inserted for the use of 1168 variable NAME on the single exit of LOOP. */ 1169 1170 static bool 1171 close_phi_not_yet_inserted_p (loop_p loop, tree name) 1172 { 1173 gimple_stmt_iterator psi; 1174 basic_block bb = single_exit (loop)->dest; 1175 1176 for (psi = gsi_start_phis (bb); !gsi_end_p (psi); gsi_next (&psi)) 1177 if (gimple_phi_arg_def (gsi_stmt (psi), 0) == name) 1178 return false; 1179 1180 return true; 1181 } 1182 1183 /* A structure for passing parameters to add_loop_exit_phis. */ 1184 1185 typedef struct alep { 1186 loop_p loop; 1187 VEC (rename_map_elt, heap) *new_renames; 1188 } *alep_p; 1189 1190 /* Helper function for htab_traverse in insert_loop_close_phis. */ 1191 1192 static int 1193 add_loop_exit_phis (void **slot, void *data) 1194 { 1195 struct rename_map_elt_s *entry; 1196 alep_p a; 1197 loop_p loop; 1198 tree expr, new_name, old_name; 1199 bool def_in_loop_p, used_outside_p, need_close_phi_p; 1200 gimple old_close_phi; 1201 1202 if (!slot || !*slot || !data) 1203 return 1; 1204 1205 entry = (struct rename_map_elt_s *) *slot; 1206 a = (alep_p) data; 1207 loop = a->loop; 1208 new_name = expr = entry->expr; 1209 old_name = entry->old_name; 1210 1211 def_in_loop_p = expr_defined_in_loop_p (expr, loop); 1212 if (!def_in_loop_p) 1213 return 1; 1214 1215 /* Remove the old rename from the map when the expression is defined 1216 in the loop that we're closing. */ 1217 free (*slot); 1218 *slot = NULL; 1219 1220 if (TREE_CODE (expr) != SSA_NAME) 1221 return 1; 1222 1223 old_close_phi = alive_after_loop (old_name); 1224 used_outside_p = (old_close_phi != NULL); 1225 need_close_phi_p = (used_outside_p 1226 && close_phi_not_yet_inserted_p (loop, new_name)); 1227 1228 /* Insert a loop close phi node. */ 1229 if (need_close_phi_p) 1230 { 1231 basic_block bb = single_exit (loop)->dest; 1232 gimple phi = create_phi_node (new_name, bb); 1233 tree new_res = create_new_def_for (gimple_phi_result (phi), phi, 1234 gimple_phi_result_ptr (phi)); 1235 1236 add_phi_arg (phi, new_name, single_pred_edge (bb), UNKNOWN_LOCATION); 1237 VEC_safe_push (rename_map_elt, heap, a->new_renames, 1238 new_rename_map_elt (gimple_phi_result (old_close_phi), 1239 new_res)); 1240 } 1241 1242 return 1; 1243 } 1244 1245 /* Traverses MAP and removes from it all the tuples (OLD, NEW) where 1246 NEW is defined in LOOP. Inserts on the exit of LOOP the close phi 1247 node "RES = phi (NEW)" corresponding to "OLD_RES = phi (OLD)" in 1248 the original code. Inserts in MAP the tuple (OLD_RES, RES). */ 1249 1250 void 1251 insert_loop_close_phis (htab_t map, loop_p loop) 1252 { 1253 int i; 1254 struct alep a; 1255 rename_map_elt elt; 1256 1257 a.loop = loop; 1258 a.new_renames = VEC_alloc (rename_map_elt, heap, 3); 1259 update_ssa (TODO_update_ssa); 1260 htab_traverse (map, add_loop_exit_phis, &a); 1261 update_ssa (TODO_update_ssa); 1262 1263 for (i = 0; VEC_iterate (rename_map_elt, a.new_renames, i, elt); i++) 1264 { 1265 set_rename (map, elt->old_name, elt->expr); 1266 free (elt); 1267 } 1268 1269 VEC_free (rename_map_elt, heap, a.new_renames); 1270 } 1271 1272 /* Helper structure for htab_traverse in insert_guard_phis. */ 1273 1274 struct igp { 1275 basic_block bb; 1276 edge true_edge, false_edge; 1277 htab_t before_guard; 1278 }; 1279 1280 /* Return the default name that is before the guard. */ 1281 1282 static tree 1283 default_before_guard (htab_t before_guard, tree old_name) 1284 { 1285 tree res = get_rename (before_guard, old_name); 1286 1287 if (res == old_name) 1288 { 1289 if (is_gimple_reg (res)) 1290 return fold_convert (TREE_TYPE (res), integer_zero_node); 1291 return gimple_default_def (cfun, SSA_NAME_VAR (res)); 1292 } 1293 1294 return res; 1295 } 1296 1297 /* Prepares EXPR to be a good phi argument when the phi result is 1298 RES. Insert needed statements on edge E. */ 1299 1300 static tree 1301 convert_for_phi_arg (tree expr, tree res, edge e) 1302 { 1303 tree type = TREE_TYPE (res); 1304 1305 if (TREE_TYPE (expr) != type) 1306 expr = fold_convert (type, expr); 1307 1308 if (TREE_CODE (expr) != SSA_NAME 1309 && !is_gimple_min_invariant (expr)) 1310 { 1311 tree var = create_tmp_var (type, "var"); 1312 gimple_seq stmts; 1313 1314 expr = build2 (MODIFY_EXPR, type, var, expr); 1315 expr = force_gimple_operand (expr, &stmts, true, NULL); 1316 gsi_insert_seq_on_edge_immediate (e, stmts); 1317 } 1318 1319 return expr; 1320 } 1321 1322 /* Helper function for htab_traverse in insert_guard_phis. */ 1323 1324 static int 1325 add_guard_exit_phis (void **slot, void *s) 1326 { 1327 struct rename_map_elt_s *entry = (struct rename_map_elt_s *) *slot; 1328 struct igp *i = (struct igp *) s; 1329 basic_block bb = i->bb; 1330 edge true_edge = i->true_edge; 1331 edge false_edge = i->false_edge; 1332 tree res = entry->old_name; 1333 tree name1 = entry->expr; 1334 tree name2 = default_before_guard (i->before_guard, res); 1335 gimple phi; 1336 1337 /* Nothing to be merged if the name before the guard is the same as 1338 the one after. */ 1339 if (name1 == name2) 1340 return 1; 1341 1342 name1 = convert_for_phi_arg (name1, res, true_edge); 1343 name2 = convert_for_phi_arg (name2, res, false_edge); 1344 1345 phi = create_phi_node (res, bb); 1346 res = create_new_def_for (gimple_phi_result (phi), phi, 1347 gimple_phi_result_ptr (phi)); 1348 1349 add_phi_arg (phi, name1, true_edge, UNKNOWN_LOCATION); 1350 add_phi_arg (phi, name2, false_edge, UNKNOWN_LOCATION); 1351 1352 entry->expr = res; 1353 *slot = entry; 1354 return 1; 1355 } 1356 1357 /* Iterate over RENAME_MAP and get tuples of the form (OLD, NAME1). 1358 If there is a correspondent tuple (OLD, NAME2) in BEFORE_GUARD, 1359 with NAME1 different than NAME2, then insert in BB the phi node: 1360 1361 | RES = phi (NAME1 (on TRUE_EDGE), NAME2 (on FALSE_EDGE))" 1362 1363 if there is no tuple for OLD in BEFORE_GUARD, insert 1364 1365 | RES = phi (NAME1 (on TRUE_EDGE), 1366 | DEFAULT_DEFINITION of NAME1 (on FALSE_EDGE))". 1367 1368 Finally register in RENAME_MAP the tuple (OLD, RES). */ 1369 1370 void 1371 insert_guard_phis (basic_block bb, edge true_edge, edge false_edge, 1372 htab_t before_guard, htab_t rename_map) 1373 { 1374 struct igp i; 1375 i.bb = bb; 1376 i.true_edge = true_edge; 1377 i.false_edge = false_edge; 1378 i.before_guard = before_guard; 1379 1380 update_ssa (TODO_update_ssa); 1381 htab_traverse (rename_map, add_guard_exit_phis, &i); 1382 update_ssa (TODO_update_ssa); 1383 } 1384 1385 /* Create a duplicate of the basic block BB. NOTE: This does not 1386 preserve SSA form. */ 1387 1388 static void 1389 graphite_copy_stmts_from_block (basic_block bb, basic_block new_bb, htab_t map) 1390 { 1391 gimple_stmt_iterator gsi, gsi_tgt; 1392 1393 gsi_tgt = gsi_start_bb (new_bb); 1394 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) 1395 { 1396 def_operand_p def_p; 1397 ssa_op_iter op_iter; 1398 gimple stmt = gsi_stmt (gsi); 1399 gimple copy; 1400 1401 if (gimple_code (stmt) == GIMPLE_LABEL) 1402 continue; 1403 1404 /* Create a new copy of STMT and duplicate STMT's virtual 1405 operands. */ 1406 copy = gimple_copy (stmt); 1407 gsi_insert_after (&gsi_tgt, copy, GSI_NEW_STMT); 1408 mark_sym_for_renaming (gimple_vop (cfun)); 1409 1410 maybe_duplicate_eh_stmt (copy, stmt); 1411 gimple_duplicate_stmt_histograms (cfun, copy, cfun, stmt); 1412 1413 /* Create new names for all the definitions created by COPY and 1414 add replacement mappings for each new name. */ 1415 FOR_EACH_SSA_DEF_OPERAND (def_p, copy, op_iter, SSA_OP_ALL_DEFS) 1416 { 1417 tree old_name = DEF_FROM_PTR (def_p); 1418 tree new_name = create_new_def_for (old_name, copy, def_p); 1419 set_rename (map, old_name, new_name); 1420 } 1421 } 1422 } 1423 1424 /* Copies BB and includes in the copied BB all the statements that can 1425 be reached following the use-def chains from the memory accesses, 1426 and returns the next edge following this new block. */ 1427 1428 edge 1429 copy_bb_and_scalar_dependences (basic_block bb, sese region, 1430 edge next_e, htab_t map) 1431 { 1432 basic_block new_bb = split_edge (next_e); 1433 1434 next_e = single_succ_edge (new_bb); 1435 graphite_copy_stmts_from_block (bb, new_bb, map); 1436 remove_condition (new_bb); 1437 remove_phi_nodes (new_bb); 1438 expand_scalar_variables (new_bb, region, map); 1439 rename_variables (new_bb, map); 1440 1441 return next_e; 1442 } 1443 1444 /* Returns the outermost loop in SCOP that contains BB. */ 1445 1446 struct loop * 1447 outermost_loop_in_sese (sese region, basic_block bb) 1448 { 1449 struct loop *nest; 1450 1451 nest = bb->loop_father; 1452 while (loop_outer (nest) 1453 && loop_in_sese_p (loop_outer (nest), region)) 1454 nest = loop_outer (nest); 1455 1456 return nest; 1457 } 1458 1459 /* Sets the false region of an IF_REGION to REGION. */ 1460 1461 void 1462 if_region_set_false_region (ifsese if_region, sese region) 1463 { 1464 basic_block condition = if_region_get_condition_block (if_region); 1465 edge false_edge = get_false_edge_from_guard_bb (condition); 1466 basic_block dummy = false_edge->dest; 1467 edge entry_region = SESE_ENTRY (region); 1468 edge exit_region = SESE_EXIT (region); 1469 basic_block before_region = entry_region->src; 1470 basic_block last_in_region = exit_region->src; 1471 void **slot = htab_find_slot_with_hash (current_loops->exits, exit_region, 1472 htab_hash_pointer (exit_region), 1473 NO_INSERT); 1474 1475 entry_region->flags = false_edge->flags; 1476 false_edge->flags = exit_region->flags; 1477 1478 redirect_edge_pred (entry_region, condition); 1479 redirect_edge_pred (exit_region, before_region); 1480 redirect_edge_pred (false_edge, last_in_region); 1481 redirect_edge_succ (false_edge, single_succ (dummy)); 1482 delete_basic_block (dummy); 1483 1484 exit_region->flags = EDGE_FALLTHRU; 1485 recompute_all_dominators (); 1486 1487 SESE_EXIT (region) = false_edge; 1488 1489 if (if_region->false_region) 1490 free (if_region->false_region); 1491 if_region->false_region = region; 1492 1493 if (slot) 1494 { 1495 struct loop_exit *loop_exit = GGC_CNEW (struct loop_exit); 1496 1497 memcpy (loop_exit, *((struct loop_exit **) slot), sizeof (struct loop_exit)); 1498 htab_clear_slot (current_loops->exits, slot); 1499 1500 slot = htab_find_slot_with_hash (current_loops->exits, false_edge, 1501 htab_hash_pointer (false_edge), 1502 INSERT); 1503 loop_exit->e = false_edge; 1504 *slot = loop_exit; 1505 false_edge->src->loop_father->exits->next = loop_exit; 1506 } 1507 } 1508 1509 /* Creates an IFSESE with CONDITION on edge ENTRY. */ 1510 1511 ifsese 1512 create_if_region_on_edge (edge entry, tree condition) 1513 { 1514 edge e; 1515 edge_iterator ei; 1516 sese sese_region = XNEW (struct sese_s); 1517 sese true_region = XNEW (struct sese_s); 1518 sese false_region = XNEW (struct sese_s); 1519 ifsese if_region = XNEW (struct ifsese_s); 1520 edge exit = create_empty_if_region_on_edge (entry, condition); 1521 1522 if_region->region = sese_region; 1523 if_region->region->entry = entry; 1524 if_region->region->exit = exit; 1525 1526 FOR_EACH_EDGE (e, ei, entry->dest->succs) 1527 { 1528 if (e->flags & EDGE_TRUE_VALUE) 1529 { 1530 true_region->entry = e; 1531 true_region->exit = single_succ_edge (e->dest); 1532 if_region->true_region = true_region; 1533 } 1534 else if (e->flags & EDGE_FALSE_VALUE) 1535 { 1536 false_region->entry = e; 1537 false_region->exit = single_succ_edge (e->dest); 1538 if_region->false_region = false_region; 1539 } 1540 } 1541 1542 return if_region; 1543 } 1544 1545 /* Moves REGION in a condition expression: 1546 | if (1) 1547 | ; 1548 | else 1549 | REGION; 1550 */ 1551 1552 ifsese 1553 move_sese_in_condition (sese region) 1554 { 1555 basic_block pred_block = split_edge (SESE_ENTRY (region)); 1556 ifsese if_region; 1557 1558 SESE_ENTRY (region) = single_succ_edge (pred_block); 1559 if_region = create_if_region_on_edge (single_pred_edge (pred_block), integer_one_node); 1560 if_region_set_false_region (if_region, region); 1561 1562 return if_region; 1563 } 1564 1565 /* Replaces the condition of the IF_REGION with CONDITION: 1566 | if (CONDITION) 1567 | true_region; 1568 | else 1569 | false_region; 1570 */ 1571 1572 void 1573 set_ifsese_condition (ifsese if_region, tree condition) 1574 { 1575 sese region = if_region->region; 1576 edge entry = region->entry; 1577 basic_block bb = entry->dest; 1578 gimple last = last_stmt (bb); 1579 gimple_stmt_iterator gsi = gsi_last_bb (bb); 1580 gimple cond_stmt; 1581 1582 gcc_assert (gimple_code (last) == GIMPLE_COND); 1583 1584 gsi_remove (&gsi, true); 1585 gsi = gsi_last_bb (bb); 1586 condition = force_gimple_operand_gsi (&gsi, condition, true, NULL, 1587 false, GSI_NEW_STMT); 1588 cond_stmt = gimple_build_cond_from_tree (condition, NULL_TREE, NULL_TREE); 1589 gsi = gsi_last_bb (bb); 1590 gsi_insert_after (&gsi, cond_stmt, GSI_NEW_STMT); 1591 } 1592 1593 /* Returns the scalar evolution of T in REGION. Every variable that 1594 is not defined in the REGION is considered a parameter. */ 1595 1596 tree 1597 scalar_evolution_in_region (sese region, loop_p loop, tree t) 1598 { 1599 gimple def; 1600 struct loop *def_loop; 1601 basic_block before = block_before_sese (region); 1602 1603 if (TREE_CODE (t) != SSA_NAME 1604 || loop_in_sese_p (loop, region)) 1605 return instantiate_scev (before, loop, 1606 analyze_scalar_evolution (loop, t)); 1607 1608 if (!defined_in_sese_p (t, region)) 1609 return t; 1610 1611 def = SSA_NAME_DEF_STMT (t); 1612 def_loop = loop_containing_stmt (def); 1613 1614 if (loop_in_sese_p (def_loop, region)) 1615 { 1616 t = analyze_scalar_evolution (def_loop, t); 1617 def_loop = superloop_at_depth (def_loop, loop_depth (loop) + 1); 1618 t = compute_overall_effect_of_inner_loop (def_loop, t); 1619 return t; 1620 } 1621 else 1622 return instantiate_scev (before, loop, t); 1623 } 1624