1 /* Convert a program in SSA form into Normal form. 2 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 3 Free Software Foundation, Inc. 4 Contributed by Andrew Macleod <amacleod@redhat.com> 5 6 This file is part of GCC. 7 8 GCC is free software; you can redistribute it and/or modify 9 it under the terms of the GNU General Public License as published by 10 the Free Software Foundation; either version 3, or (at your option) 11 any later version. 12 13 GCC is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with GCC; see the file COPYING3. If not see 20 <http://www.gnu.org/licenses/>. */ 21 22 #include "config.h" 23 #include "system.h" 24 #include "coretypes.h" 25 #include "tm.h" 26 #include "tree.h" 27 #include "ggc.h" 28 #include "basic-block.h" 29 #include "diagnostic.h" 30 #include "bitmap.h" 31 #include "tree-flow.h" 32 #include "timevar.h" 33 #include "tree-dump.h" 34 #include "tree-pass.h" 35 #include "toplev.h" 36 #include "expr.h" 37 #include "ssaexpand.h" 38 39 40 DEF_VEC_I(source_location); 41 DEF_VEC_ALLOC_I(source_location,heap); 42 43 /* Used to hold all the components required to do SSA PHI elimination. 44 The node and pred/succ list is a simple linear list of nodes and 45 edges represented as pairs of nodes. 46 47 The predecessor and successor list: Nodes are entered in pairs, where 48 [0] ->PRED, [1]->SUCC. All the even indexes in the array represent 49 predecessors, all the odd elements are successors. 50 51 Rationale: 52 When implemented as bitmaps, very large programs SSA->Normal times were 53 being dominated by clearing the interference graph. 54 55 Typically this list of edges is extremely small since it only includes 56 PHI results and uses from a single edge which have not coalesced with 57 each other. This means that no virtual PHI nodes are included, and 58 empirical evidence suggests that the number of edges rarely exceed 59 3, and in a bootstrap of GCC, the maximum size encountered was 7. 60 This also limits the number of possible nodes that are involved to 61 rarely more than 6, and in the bootstrap of gcc, the maximum number 62 of nodes encountered was 12. */ 63 64 typedef struct _elim_graph { 65 /* Size of the elimination vectors. */ 66 int size; 67 68 /* List of nodes in the elimination graph. */ 69 VEC(int,heap) *nodes; 70 71 /* The predecessor and successor edge list. */ 72 VEC(int,heap) *edge_list; 73 74 /* Source locus on each edge */ 75 VEC(source_location,heap) *edge_locus; 76 77 /* Visited vector. */ 78 sbitmap visited; 79 80 /* Stack for visited nodes. */ 81 VEC(int,heap) *stack; 82 83 /* The variable partition map. */ 84 var_map map; 85 86 /* Edge being eliminated by this graph. */ 87 edge e; 88 89 /* List of constant copies to emit. These are pushed on in pairs. */ 90 VEC(int,heap) *const_dests; 91 VEC(tree,heap) *const_copies; 92 93 /* Source locations for any constant copies. */ 94 VEC(source_location,heap) *copy_locus; 95 } *elim_graph; 96 97 98 /* For an edge E find out a good source location to associate with 99 instructions inserted on edge E. If E has an implicit goto set, 100 use its location. Otherwise search instructions in predecessors 101 of E for a location, and use that one. That makes sense because 102 we insert on edges for PHI nodes, and effects of PHIs happen on 103 the end of the predecessor conceptually. */ 104 105 static void 106 set_location_for_edge (edge e) 107 { 108 if (e->goto_locus) 109 { 110 set_curr_insn_source_location (e->goto_locus); 111 set_curr_insn_block (e->goto_block); 112 } 113 else 114 { 115 basic_block bb = e->src; 116 gimple_stmt_iterator gsi; 117 118 do 119 { 120 for (gsi = gsi_last_bb (bb); !gsi_end_p (gsi); gsi_prev (&gsi)) 121 { 122 gimple stmt = gsi_stmt (gsi); 123 if (is_gimple_debug (stmt)) 124 continue; 125 if (gimple_has_location (stmt) || gimple_block (stmt)) 126 { 127 set_curr_insn_source_location (gimple_location (stmt)); 128 set_curr_insn_block (gimple_block (stmt)); 129 return; 130 } 131 } 132 /* Nothing found in this basic block. Make a half-assed attempt 133 to continue with another block. */ 134 if (single_pred_p (bb)) 135 bb = single_pred (bb); 136 else 137 bb = e->src; 138 } 139 while (bb != e->src); 140 } 141 } 142 143 /* Emit insns to copy SRC into DEST converting SRC if necessary. As 144 SRC/DEST might be BLKmode memory locations SIZEEXP is a tree from 145 which we deduce the size to copy in that case. */ 146 147 static inline rtx 148 emit_partition_copy (rtx dest, rtx src, int unsignedsrcp, tree sizeexp) 149 { 150 rtx seq; 151 152 start_sequence (); 153 154 if (GET_MODE (src) != VOIDmode && GET_MODE (src) != GET_MODE (dest)) 155 src = convert_to_mode (GET_MODE (dest), src, unsignedsrcp); 156 if (GET_MODE (src) == BLKmode) 157 { 158 gcc_assert (GET_MODE (dest) == BLKmode); 159 emit_block_move (dest, src, expr_size (sizeexp), BLOCK_OP_NORMAL); 160 } 161 else 162 emit_move_insn (dest, src); 163 164 seq = get_insns (); 165 end_sequence (); 166 167 return seq; 168 } 169 170 /* Insert a copy instruction from partition SRC to DEST onto edge E. */ 171 172 static void 173 insert_partition_copy_on_edge (edge e, int dest, int src, source_location locus) 174 { 175 tree var; 176 rtx seq; 177 if (dump_file && (dump_flags & TDF_DETAILS)) 178 { 179 fprintf (dump_file, 180 "Inserting a partition copy on edge BB%d->BB%d :" 181 "PART.%d = PART.%d", 182 e->src->index, 183 e->dest->index, dest, src); 184 fprintf (dump_file, "\n"); 185 } 186 187 gcc_assert (SA.partition_to_pseudo[dest]); 188 gcc_assert (SA.partition_to_pseudo[src]); 189 190 set_location_for_edge (e); 191 /* If a locus is provided, override the default. */ 192 if (locus) 193 set_curr_insn_source_location (locus); 194 195 var = partition_to_var (SA.map, src); 196 seq = emit_partition_copy (SA.partition_to_pseudo[dest], 197 SA.partition_to_pseudo[src], 198 TYPE_UNSIGNED (TREE_TYPE (var)), 199 var); 200 201 insert_insn_on_edge (seq, e); 202 } 203 204 /* Insert a copy instruction from expression SRC to partition DEST 205 onto edge E. */ 206 207 static void 208 insert_value_copy_on_edge (edge e, int dest, tree src, source_location locus) 209 { 210 rtx seq, x; 211 enum machine_mode dest_mode, src_mode; 212 int unsignedp; 213 tree var; 214 215 if (dump_file && (dump_flags & TDF_DETAILS)) 216 { 217 fprintf (dump_file, 218 "Inserting a value copy on edge BB%d->BB%d : PART.%d = ", 219 e->src->index, 220 e->dest->index, dest); 221 print_generic_expr (dump_file, src, TDF_SLIM); 222 fprintf (dump_file, "\n"); 223 } 224 225 gcc_assert (SA.partition_to_pseudo[dest]); 226 227 set_location_for_edge (e); 228 /* If a locus is provided, override the default. */ 229 if (locus) 230 set_curr_insn_source_location (locus); 231 232 start_sequence (); 233 234 var = SSA_NAME_VAR (partition_to_var (SA.map, dest)); 235 src_mode = TYPE_MODE (TREE_TYPE (src)); 236 dest_mode = GET_MODE (SA.partition_to_pseudo[dest]); 237 gcc_assert (src_mode == TYPE_MODE (TREE_TYPE (var))); 238 gcc_assert (!REG_P (SA.partition_to_pseudo[dest]) 239 || dest_mode == promote_decl_mode (var, &unsignedp)); 240 241 if (src_mode != dest_mode) 242 { 243 x = expand_expr (src, NULL, src_mode, EXPAND_NORMAL); 244 x = convert_modes (dest_mode, src_mode, x, unsignedp); 245 } 246 else if (src_mode == BLKmode) 247 { 248 x = SA.partition_to_pseudo[dest]; 249 store_expr (src, x, 0, false); 250 } 251 else 252 x = expand_expr (src, SA.partition_to_pseudo[dest], 253 dest_mode, EXPAND_NORMAL); 254 255 if (x != SA.partition_to_pseudo[dest]) 256 emit_move_insn (SA.partition_to_pseudo[dest], x); 257 seq = get_insns (); 258 end_sequence (); 259 260 insert_insn_on_edge (seq, e); 261 } 262 263 /* Insert a copy instruction from RTL expression SRC to partition DEST 264 onto edge E. */ 265 266 static void 267 insert_rtx_to_part_on_edge (edge e, int dest, rtx src, int unsignedsrcp, 268 source_location locus) 269 { 270 rtx seq; 271 if (dump_file && (dump_flags & TDF_DETAILS)) 272 { 273 fprintf (dump_file, 274 "Inserting a temp copy on edge BB%d->BB%d : PART.%d = ", 275 e->src->index, 276 e->dest->index, dest); 277 print_simple_rtl (dump_file, src); 278 fprintf (dump_file, "\n"); 279 } 280 281 gcc_assert (SA.partition_to_pseudo[dest]); 282 283 set_location_for_edge (e); 284 /* If a locus is provided, override the default. */ 285 if (locus) 286 set_curr_insn_source_location (locus); 287 288 /* We give the destination as sizeexp in case src/dest are BLKmode 289 mems. Usually we give the source. As we result from SSA names 290 the left and right size should be the same (and no WITH_SIZE_EXPR 291 involved), so it doesn't matter. */ 292 seq = emit_partition_copy (SA.partition_to_pseudo[dest], 293 src, unsignedsrcp, 294 partition_to_var (SA.map, dest)); 295 296 insert_insn_on_edge (seq, e); 297 } 298 299 /* Insert a copy instruction from partition SRC to RTL lvalue DEST 300 onto edge E. */ 301 302 static void 303 insert_part_to_rtx_on_edge (edge e, rtx dest, int src, source_location locus) 304 { 305 tree var; 306 rtx seq; 307 if (dump_file && (dump_flags & TDF_DETAILS)) 308 { 309 fprintf (dump_file, 310 "Inserting a temp copy on edge BB%d->BB%d : ", 311 e->src->index, 312 e->dest->index); 313 print_simple_rtl (dump_file, dest); 314 fprintf (dump_file, "= PART.%d\n", src); 315 } 316 317 gcc_assert (SA.partition_to_pseudo[src]); 318 319 set_location_for_edge (e); 320 /* If a locus is provided, override the default. */ 321 if (locus) 322 set_curr_insn_source_location (locus); 323 324 var = partition_to_var (SA.map, src); 325 seq = emit_partition_copy (dest, 326 SA.partition_to_pseudo[src], 327 TYPE_UNSIGNED (TREE_TYPE (var)), 328 var); 329 330 insert_insn_on_edge (seq, e); 331 } 332 333 334 /* Create an elimination graph with SIZE nodes and associated data 335 structures. */ 336 337 static elim_graph 338 new_elim_graph (int size) 339 { 340 elim_graph g = (elim_graph) xmalloc (sizeof (struct _elim_graph)); 341 342 g->nodes = VEC_alloc (int, heap, 30); 343 g->const_dests = VEC_alloc (int, heap, 20); 344 g->const_copies = VEC_alloc (tree, heap, 20); 345 g->copy_locus = VEC_alloc (source_location, heap, 10); 346 g->edge_list = VEC_alloc (int, heap, 20); 347 g->edge_locus = VEC_alloc (source_location, heap, 10); 348 g->stack = VEC_alloc (int, heap, 30); 349 350 g->visited = sbitmap_alloc (size); 351 352 return g; 353 } 354 355 356 /* Empty elimination graph G. */ 357 358 static inline void 359 clear_elim_graph (elim_graph g) 360 { 361 VEC_truncate (int, g->nodes, 0); 362 VEC_truncate (int, g->edge_list, 0); 363 VEC_truncate (source_location, g->edge_locus, 0); 364 } 365 366 367 /* Delete elimination graph G. */ 368 369 static inline void 370 delete_elim_graph (elim_graph g) 371 { 372 sbitmap_free (g->visited); 373 VEC_free (int, heap, g->stack); 374 VEC_free (int, heap, g->edge_list); 375 VEC_free (tree, heap, g->const_copies); 376 VEC_free (int, heap, g->const_dests); 377 VEC_free (int, heap, g->nodes); 378 VEC_free (source_location, heap, g->copy_locus); 379 VEC_free (source_location, heap, g->edge_locus); 380 381 free (g); 382 } 383 384 385 /* Return the number of nodes in graph G. */ 386 387 static inline int 388 elim_graph_size (elim_graph g) 389 { 390 return VEC_length (int, g->nodes); 391 } 392 393 394 /* Add NODE to graph G, if it doesn't exist already. */ 395 396 static inline void 397 elim_graph_add_node (elim_graph g, int node) 398 { 399 int x; 400 int t; 401 402 for (x = 0; VEC_iterate (int, g->nodes, x, t); x++) 403 if (t == node) 404 return; 405 VEC_safe_push (int, heap, g->nodes, node); 406 } 407 408 409 /* Add the edge PRED->SUCC to graph G. */ 410 411 static inline void 412 elim_graph_add_edge (elim_graph g, int pred, int succ, source_location locus) 413 { 414 VEC_safe_push (int, heap, g->edge_list, pred); 415 VEC_safe_push (int, heap, g->edge_list, succ); 416 VEC_safe_push (source_location, heap, g->edge_locus, locus); 417 } 418 419 420 /* Remove an edge from graph G for which NODE is the predecessor, and 421 return the successor node. -1 is returned if there is no such edge. */ 422 423 static inline int 424 elim_graph_remove_succ_edge (elim_graph g, int node, source_location *locus) 425 { 426 int y; 427 unsigned x; 428 for (x = 0; x < VEC_length (int, g->edge_list); x += 2) 429 if (VEC_index (int, g->edge_list, x) == node) 430 { 431 VEC_replace (int, g->edge_list, x, -1); 432 y = VEC_index (int, g->edge_list, x + 1); 433 VEC_replace (int, g->edge_list, x + 1, -1); 434 *locus = VEC_index (source_location, g->edge_locus, x / 2); 435 VEC_replace (source_location, g->edge_locus, x / 2, UNKNOWN_LOCATION); 436 return y; 437 } 438 *locus = UNKNOWN_LOCATION; 439 return -1; 440 } 441 442 443 /* Find all the nodes in GRAPH which are successors to NODE in the 444 edge list. VAR will hold the partition number found. CODE is the 445 code fragment executed for every node found. */ 446 447 #define FOR_EACH_ELIM_GRAPH_SUCC(GRAPH, NODE, VAR, LOCUS, CODE) \ 448 do { \ 449 unsigned x_; \ 450 int y_; \ 451 for (x_ = 0; x_ < VEC_length (int, (GRAPH)->edge_list); x_ += 2) \ 452 { \ 453 y_ = VEC_index (int, (GRAPH)->edge_list, x_); \ 454 if (y_ != (NODE)) \ 455 continue; \ 456 (VAR) = VEC_index (int, (GRAPH)->edge_list, x_ + 1); \ 457 (LOCUS) = VEC_index (source_location, (GRAPH)->edge_locus, x_ / 2); \ 458 CODE; \ 459 } \ 460 } while (0) 461 462 463 /* Find all the nodes which are predecessors of NODE in the edge list for 464 GRAPH. VAR will hold the partition number found. CODE is the 465 code fragment executed for every node found. */ 466 467 #define FOR_EACH_ELIM_GRAPH_PRED(GRAPH, NODE, VAR, LOCUS, CODE) \ 468 do { \ 469 unsigned x_; \ 470 int y_; \ 471 for (x_ = 0; x_ < VEC_length (int, (GRAPH)->edge_list); x_ += 2) \ 472 { \ 473 y_ = VEC_index (int, (GRAPH)->edge_list, x_ + 1); \ 474 if (y_ != (NODE)) \ 475 continue; \ 476 (VAR) = VEC_index (int, (GRAPH)->edge_list, x_); \ 477 (LOCUS) = VEC_index (source_location, (GRAPH)->edge_locus, x_ / 2); \ 478 CODE; \ 479 } \ 480 } while (0) 481 482 483 /* Add T to elimination graph G. */ 484 485 static inline void 486 eliminate_name (elim_graph g, int T) 487 { 488 elim_graph_add_node (g, T); 489 } 490 491 492 /* Build elimination graph G for basic block BB on incoming PHI edge 493 G->e. */ 494 495 static void 496 eliminate_build (elim_graph g) 497 { 498 tree Ti; 499 int p0, pi; 500 gimple_stmt_iterator gsi; 501 502 clear_elim_graph (g); 503 504 for (gsi = gsi_start_phis (g->e->dest); !gsi_end_p (gsi); gsi_next (&gsi)) 505 { 506 gimple phi = gsi_stmt (gsi); 507 source_location locus; 508 509 p0 = var_to_partition (g->map, gimple_phi_result (phi)); 510 /* Ignore results which are not in partitions. */ 511 if (p0 == NO_PARTITION) 512 continue; 513 514 Ti = PHI_ARG_DEF (phi, g->e->dest_idx); 515 locus = gimple_phi_arg_location_from_edge (phi, g->e); 516 517 /* If this argument is a constant, or a SSA_NAME which is being 518 left in SSA form, just queue a copy to be emitted on this 519 edge. */ 520 if (!phi_ssa_name_p (Ti) 521 || (TREE_CODE (Ti) == SSA_NAME 522 && var_to_partition (g->map, Ti) == NO_PARTITION)) 523 { 524 /* Save constant copies until all other copies have been emitted 525 on this edge. */ 526 VEC_safe_push (int, heap, g->const_dests, p0); 527 VEC_safe_push (tree, heap, g->const_copies, Ti); 528 VEC_safe_push (source_location, heap, g->copy_locus, locus); 529 } 530 else 531 { 532 pi = var_to_partition (g->map, Ti); 533 if (p0 != pi) 534 { 535 eliminate_name (g, p0); 536 eliminate_name (g, pi); 537 elim_graph_add_edge (g, p0, pi, locus); 538 } 539 } 540 } 541 } 542 543 544 /* Push successors of T onto the elimination stack for G. */ 545 546 static void 547 elim_forward (elim_graph g, int T) 548 { 549 int S; 550 source_location locus; 551 552 SET_BIT (g->visited, T); 553 FOR_EACH_ELIM_GRAPH_SUCC (g, T, S, locus, 554 { 555 if (!TEST_BIT (g->visited, S)) 556 elim_forward (g, S); 557 }); 558 VEC_safe_push (int, heap, g->stack, T); 559 } 560 561 562 /* Return 1 if there unvisited predecessors of T in graph G. */ 563 564 static int 565 elim_unvisited_predecessor (elim_graph g, int T) 566 { 567 int P; 568 source_location locus; 569 570 FOR_EACH_ELIM_GRAPH_PRED (g, T, P, locus, 571 { 572 if (!TEST_BIT (g->visited, P)) 573 return 1; 574 }); 575 return 0; 576 } 577 578 /* Process predecessors first, and insert a copy. */ 579 580 static void 581 elim_backward (elim_graph g, int T) 582 { 583 int P; 584 source_location locus; 585 586 SET_BIT (g->visited, T); 587 FOR_EACH_ELIM_GRAPH_PRED (g, T, P, locus, 588 { 589 if (!TEST_BIT (g->visited, P)) 590 { 591 elim_backward (g, P); 592 insert_partition_copy_on_edge (g->e, P, T, locus); 593 } 594 }); 595 } 596 597 /* Allocate a new pseudo register usable for storing values sitting 598 in NAME (a decl or SSA name), i.e. with matching mode and attributes. */ 599 600 static rtx 601 get_temp_reg (tree name) 602 { 603 tree var = TREE_CODE (name) == SSA_NAME ? SSA_NAME_VAR (name) : name; 604 tree type = TREE_TYPE (var); 605 int unsignedp; 606 enum machine_mode reg_mode = promote_decl_mode (var, &unsignedp); 607 rtx x = gen_reg_rtx (reg_mode); 608 if (POINTER_TYPE_P (type)) 609 mark_reg_pointer (x, TYPE_ALIGN (TREE_TYPE (TREE_TYPE (var)))); 610 return x; 611 } 612 613 /* Insert required copies for T in graph G. Check for a strongly connected 614 region, and create a temporary to break the cycle if one is found. */ 615 616 static void 617 elim_create (elim_graph g, int T) 618 { 619 int P, S; 620 source_location locus; 621 622 if (elim_unvisited_predecessor (g, T)) 623 { 624 tree var = partition_to_var (g->map, T); 625 rtx U = get_temp_reg (var); 626 int unsignedsrcp = TYPE_UNSIGNED (TREE_TYPE (var)); 627 628 insert_part_to_rtx_on_edge (g->e, U, T, UNKNOWN_LOCATION); 629 FOR_EACH_ELIM_GRAPH_PRED (g, T, P, locus, 630 { 631 if (!TEST_BIT (g->visited, P)) 632 { 633 elim_backward (g, P); 634 insert_rtx_to_part_on_edge (g->e, P, U, unsignedsrcp, locus); 635 } 636 }); 637 } 638 else 639 { 640 S = elim_graph_remove_succ_edge (g, T, &locus); 641 if (S != -1) 642 { 643 SET_BIT (g->visited, T); 644 insert_partition_copy_on_edge (g->e, T, S, locus); 645 } 646 } 647 } 648 649 650 /* Eliminate all the phi nodes on edge E in graph G. */ 651 652 static void 653 eliminate_phi (edge e, elim_graph g) 654 { 655 int x; 656 657 gcc_assert (VEC_length (tree, g->const_copies) == 0); 658 gcc_assert (VEC_length (source_location, g->copy_locus) == 0); 659 660 /* Abnormal edges already have everything coalesced. */ 661 if (e->flags & EDGE_ABNORMAL) 662 return; 663 664 g->e = e; 665 666 eliminate_build (g); 667 668 if (elim_graph_size (g) != 0) 669 { 670 int part; 671 672 sbitmap_zero (g->visited); 673 VEC_truncate (int, g->stack, 0); 674 675 for (x = 0; VEC_iterate (int, g->nodes, x, part); x++) 676 { 677 if (!TEST_BIT (g->visited, part)) 678 elim_forward (g, part); 679 } 680 681 sbitmap_zero (g->visited); 682 while (VEC_length (int, g->stack) > 0) 683 { 684 x = VEC_pop (int, g->stack); 685 if (!TEST_BIT (g->visited, x)) 686 elim_create (g, x); 687 } 688 } 689 690 /* If there are any pending constant copies, issue them now. */ 691 while (VEC_length (tree, g->const_copies) > 0) 692 { 693 int dest; 694 tree src; 695 source_location locus; 696 697 src = VEC_pop (tree, g->const_copies); 698 dest = VEC_pop (int, g->const_dests); 699 locus = VEC_pop (source_location, g->copy_locus); 700 insert_value_copy_on_edge (e, dest, src, locus); 701 } 702 } 703 704 705 /* Remove each argument from PHI. If an arg was the last use of an SSA_NAME, 706 check to see if this allows another PHI node to be removed. */ 707 708 static void 709 remove_gimple_phi_args (gimple phi) 710 { 711 use_operand_p arg_p; 712 ssa_op_iter iter; 713 714 if (dump_file && (dump_flags & TDF_DETAILS)) 715 { 716 fprintf (dump_file, "Removing Dead PHI definition: "); 717 print_gimple_stmt (dump_file, phi, 0, TDF_SLIM); 718 } 719 720 FOR_EACH_PHI_ARG (arg_p, phi, iter, SSA_OP_USE) 721 { 722 tree arg = USE_FROM_PTR (arg_p); 723 if (TREE_CODE (arg) == SSA_NAME) 724 { 725 /* Remove the reference to the existing argument. */ 726 SET_USE (arg_p, NULL_TREE); 727 if (has_zero_uses (arg)) 728 { 729 gimple stmt; 730 gimple_stmt_iterator gsi; 731 732 stmt = SSA_NAME_DEF_STMT (arg); 733 734 /* Also remove the def if it is a PHI node. */ 735 if (gimple_code (stmt) == GIMPLE_PHI) 736 { 737 remove_gimple_phi_args (stmt); 738 gsi = gsi_for_stmt (stmt); 739 remove_phi_node (&gsi, true); 740 } 741 742 } 743 } 744 } 745 } 746 747 /* Remove any PHI node which is a virtual PHI, or a PHI with no uses. */ 748 749 static void 750 eliminate_useless_phis (void) 751 { 752 basic_block bb; 753 gimple_stmt_iterator gsi; 754 tree result; 755 756 FOR_EACH_BB (bb) 757 { 758 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); ) 759 { 760 gimple phi = gsi_stmt (gsi); 761 result = gimple_phi_result (phi); 762 if (!is_gimple_reg (SSA_NAME_VAR (result))) 763 { 764 #ifdef ENABLE_CHECKING 765 size_t i; 766 /* There should be no arguments which are not virtual, or the 767 results will be incorrect. */ 768 for (i = 0; i < gimple_phi_num_args (phi); i++) 769 { 770 tree arg = PHI_ARG_DEF (phi, i); 771 if (TREE_CODE (arg) == SSA_NAME 772 && is_gimple_reg (SSA_NAME_VAR (arg))) 773 { 774 fprintf (stderr, "Argument of PHI is not virtual ("); 775 print_generic_expr (stderr, arg, TDF_SLIM); 776 fprintf (stderr, "), but the result is :"); 777 print_gimple_stmt (stderr, phi, 0, TDF_SLIM); 778 internal_error ("SSA corruption"); 779 } 780 } 781 #endif 782 remove_phi_node (&gsi, true); 783 } 784 else 785 { 786 /* Also remove real PHIs with no uses. */ 787 if (has_zero_uses (result)) 788 { 789 remove_gimple_phi_args (phi); 790 remove_phi_node (&gsi, true); 791 } 792 else 793 gsi_next (&gsi); 794 } 795 } 796 } 797 } 798 799 800 /* This function will rewrite the current program using the variable mapping 801 found in MAP. If the replacement vector VALUES is provided, any 802 occurrences of partitions with non-null entries in the vector will be 803 replaced with the expression in the vector instead of its mapped 804 variable. */ 805 806 static void 807 rewrite_trees (var_map map ATTRIBUTE_UNUSED) 808 { 809 #ifdef ENABLE_CHECKING 810 basic_block bb; 811 /* Search for PHIs where the destination has no partition, but one 812 or more arguments has a partition. This should not happen and can 813 create incorrect code. */ 814 FOR_EACH_BB (bb) 815 { 816 gimple_stmt_iterator gsi; 817 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi)) 818 { 819 gimple phi = gsi_stmt (gsi); 820 tree T0 = var_to_partition_to_var (map, gimple_phi_result (phi)); 821 if (T0 == NULL_TREE) 822 { 823 size_t i; 824 for (i = 0; i < gimple_phi_num_args (phi); i++) 825 { 826 tree arg = PHI_ARG_DEF (phi, i); 827 828 if (TREE_CODE (arg) == SSA_NAME 829 && var_to_partition (map, arg) != NO_PARTITION) 830 { 831 fprintf (stderr, "Argument of PHI is in a partition :("); 832 print_generic_expr (stderr, arg, TDF_SLIM); 833 fprintf (stderr, "), but the result is not :"); 834 print_gimple_stmt (stderr, phi, 0, TDF_SLIM); 835 internal_error ("SSA corruption"); 836 } 837 } 838 } 839 } 840 } 841 #endif 842 } 843 844 /* Given the out-of-ssa info object SA (with prepared partitions) 845 eliminate all phi nodes in all basic blocks. Afterwards no 846 basic block will have phi nodes anymore and there are possibly 847 some RTL instructions inserted on edges. */ 848 849 void 850 expand_phi_nodes (struct ssaexpand *sa) 851 { 852 basic_block bb; 853 elim_graph g = new_elim_graph (sa->map->num_partitions); 854 g->map = sa->map; 855 856 FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR->next_bb, EXIT_BLOCK_PTR, next_bb) 857 if (!gimple_seq_empty_p (phi_nodes (bb))) 858 { 859 edge e; 860 edge_iterator ei; 861 FOR_EACH_EDGE (e, ei, bb->preds) 862 eliminate_phi (e, g); 863 set_phi_nodes (bb, NULL); 864 /* We can't redirect EH edges in RTL land, so we need to do this 865 here. Redirection happens only when splitting is necessary, 866 which it is only for critical edges, normally. For EH edges 867 it might also be necessary when the successor has more than 868 one predecessor. In that case the edge is either required to 869 be fallthru (which EH edges aren't), or the predecessor needs 870 to end with a jump (which again, isn't the case with EH edges). 871 Hence, split all EH edges on which we inserted instructions 872 and whose successor has multiple predecessors. */ 873 for (ei = ei_start (bb->preds); (e = ei_safe_edge (ei)); ) 874 { 875 if (e->insns.r && (e->flags & EDGE_EH) 876 && !single_pred_p (e->dest)) 877 { 878 rtx insns = e->insns.r; 879 basic_block bb; 880 e->insns.r = NULL_RTX; 881 bb = split_edge (e); 882 single_pred_edge (bb)->insns.r = insns; 883 } 884 else 885 ei_next (&ei); 886 } 887 } 888 889 delete_elim_graph (g); 890 } 891 892 893 /* Remove the ssa-names in the current function and translate them into normal 894 compiler variables. PERFORM_TER is true if Temporary Expression Replacement 895 should also be used. */ 896 897 static void 898 remove_ssa_form (bool perform_ter, struct ssaexpand *sa) 899 { 900 bitmap values = NULL; 901 var_map map; 902 unsigned i; 903 904 map = coalesce_ssa_name (); 905 906 /* Return to viewing the variable list as just all reference variables after 907 coalescing has been performed. */ 908 partition_view_normal (map, false); 909 910 if (dump_file && (dump_flags & TDF_DETAILS)) 911 { 912 fprintf (dump_file, "After Coalescing:\n"); 913 dump_var_map (dump_file, map); 914 } 915 916 if (perform_ter) 917 { 918 values = find_replaceable_exprs (map); 919 if (values && dump_file && (dump_flags & TDF_DETAILS)) 920 dump_replaceable_exprs (dump_file, values); 921 } 922 923 rewrite_trees (map); 924 925 sa->map = map; 926 sa->values = values; 927 sa->partition_has_default_def = BITMAP_ALLOC (NULL); 928 for (i = 1; i < num_ssa_names; i++) 929 { 930 tree t = ssa_name (i); 931 if (t && SSA_NAME_IS_DEFAULT_DEF (t)) 932 { 933 int p = var_to_partition (map, t); 934 if (p != NO_PARTITION) 935 bitmap_set_bit (sa->partition_has_default_def, p); 936 } 937 } 938 } 939 940 941 /* If not already done so for basic block BB, assign increasing uids 942 to each of its instructions. */ 943 944 static void 945 maybe_renumber_stmts_bb (basic_block bb) 946 { 947 unsigned i = 0; 948 gimple_stmt_iterator gsi; 949 950 if (!bb->aux) 951 return; 952 bb->aux = NULL; 953 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) 954 { 955 gimple stmt = gsi_stmt (gsi); 956 gimple_set_uid (stmt, i); 957 i++; 958 } 959 } 960 961 962 /* Return true if we can determine that the SSA_NAMEs RESULT (a result 963 of a PHI node) and ARG (one of its arguments) conflict. Return false 964 otherwise, also when we simply aren't sure. */ 965 966 static bool 967 trivially_conflicts_p (basic_block bb, tree result, tree arg) 968 { 969 use_operand_p use; 970 imm_use_iterator imm_iter; 971 gimple defa = SSA_NAME_DEF_STMT (arg); 972 973 /* If ARG isn't defined in the same block it's too complicated for 974 our little mind. */ 975 if (gimple_bb (defa) != bb) 976 return false; 977 978 FOR_EACH_IMM_USE_FAST (use, imm_iter, result) 979 { 980 gimple use_stmt = USE_STMT (use); 981 if (is_gimple_debug (use_stmt)) 982 continue; 983 /* Now, if there's a use of RESULT that lies outside this basic block, 984 then there surely is a conflict with ARG. */ 985 if (gimple_bb (use_stmt) != bb) 986 return true; 987 if (gimple_code (use_stmt) == GIMPLE_PHI) 988 continue; 989 /* The use now is in a real stmt of BB, so if ARG was defined 990 in a PHI node (like RESULT) both conflict. */ 991 if (gimple_code (defa) == GIMPLE_PHI) 992 return true; 993 maybe_renumber_stmts_bb (bb); 994 /* If the use of RESULT occurs after the definition of ARG, 995 the two conflict too. */ 996 if (gimple_uid (defa) < gimple_uid (use_stmt)) 997 return true; 998 } 999 1000 return false; 1001 } 1002 1003 1004 /* Search every PHI node for arguments associated with backedges which 1005 we can trivially determine will need a copy (the argument is either 1006 not an SSA_NAME or the argument has a different underlying variable 1007 than the PHI result). 1008 1009 Insert a copy from the PHI argument to a new destination at the 1010 end of the block with the backedge to the top of the loop. Update 1011 the PHI argument to reference this new destination. */ 1012 1013 static void 1014 insert_backedge_copies (void) 1015 { 1016 basic_block bb; 1017 gimple_stmt_iterator gsi; 1018 1019 FOR_EACH_BB (bb) 1020 { 1021 /* Mark block as possibly needing calculation of UIDs. */ 1022 bb->aux = &bb->aux; 1023 1024 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi)) 1025 { 1026 gimple phi = gsi_stmt (gsi); 1027 tree result = gimple_phi_result (phi); 1028 tree result_var; 1029 size_t i; 1030 1031 if (!is_gimple_reg (result)) 1032 continue; 1033 1034 result_var = SSA_NAME_VAR (result); 1035 for (i = 0; i < gimple_phi_num_args (phi); i++) 1036 { 1037 tree arg = gimple_phi_arg_def (phi, i); 1038 edge e = gimple_phi_arg_edge (phi, i); 1039 1040 /* If the argument is not an SSA_NAME, then we will need a 1041 constant initialization. If the argument is an SSA_NAME with 1042 a different underlying variable then a copy statement will be 1043 needed. */ 1044 if ((e->flags & EDGE_DFS_BACK) 1045 && (TREE_CODE (arg) != SSA_NAME 1046 || SSA_NAME_VAR (arg) != result_var 1047 || trivially_conflicts_p (bb, result, arg))) 1048 { 1049 tree name; 1050 gimple stmt, last = NULL; 1051 gimple_stmt_iterator gsi2; 1052 1053 gsi2 = gsi_last_bb (gimple_phi_arg_edge (phi, i)->src); 1054 if (!gsi_end_p (gsi2)) 1055 last = gsi_stmt (gsi2); 1056 1057 /* In theory the only way we ought to get back to the 1058 start of a loop should be with a COND_EXPR or GOTO_EXPR. 1059 However, better safe than sorry. 1060 If the block ends with a control statement or 1061 something that might throw, then we have to 1062 insert this assignment before the last 1063 statement. Else insert it after the last statement. */ 1064 if (last && stmt_ends_bb_p (last)) 1065 { 1066 /* If the last statement in the block is the definition 1067 site of the PHI argument, then we can't insert 1068 anything after it. */ 1069 if (TREE_CODE (arg) == SSA_NAME 1070 && SSA_NAME_DEF_STMT (arg) == last) 1071 continue; 1072 } 1073 1074 /* Create a new instance of the underlying variable of the 1075 PHI result. */ 1076 stmt = gimple_build_assign (result_var, 1077 gimple_phi_arg_def (phi, i)); 1078 name = make_ssa_name (result_var, stmt); 1079 gimple_assign_set_lhs (stmt, name); 1080 1081 /* copy location if present. */ 1082 if (gimple_phi_arg_has_location (phi, i)) 1083 gimple_set_location (stmt, 1084 gimple_phi_arg_location (phi, i)); 1085 1086 /* Insert the new statement into the block and update 1087 the PHI node. */ 1088 if (last && stmt_ends_bb_p (last)) 1089 gsi_insert_before (&gsi2, stmt, GSI_NEW_STMT); 1090 else 1091 gsi_insert_after (&gsi2, stmt, GSI_NEW_STMT); 1092 SET_PHI_ARG_DEF (phi, i, name); 1093 } 1094 } 1095 } 1096 1097 /* Unmark this block again. */ 1098 bb->aux = NULL; 1099 } 1100 } 1101 1102 /* Free all memory associated with going out of SSA form. SA is 1103 the outof-SSA info object. */ 1104 1105 void 1106 finish_out_of_ssa (struct ssaexpand *sa) 1107 { 1108 free (sa->partition_to_pseudo); 1109 if (sa->values) 1110 BITMAP_FREE (sa->values); 1111 delete_var_map (sa->map); 1112 BITMAP_FREE (sa->partition_has_default_def); 1113 memset (sa, 0, sizeof *sa); 1114 } 1115 1116 /* Take the current function out of SSA form, translating PHIs as described in 1117 R. Morgan, ``Building an Optimizing Compiler'', 1118 Butterworth-Heinemann, Boston, MA, 1998. pp 176-186. */ 1119 1120 unsigned int 1121 rewrite_out_of_ssa (struct ssaexpand *sa) 1122 { 1123 /* If elimination of a PHI requires inserting a copy on a backedge, 1124 then we will have to split the backedge which has numerous 1125 undesirable performance effects. 1126 1127 A significant number of such cases can be handled here by inserting 1128 copies into the loop itself. */ 1129 insert_backedge_copies (); 1130 1131 1132 /* Eliminate PHIs which are of no use, such as virtual or dead phis. */ 1133 eliminate_useless_phis (); 1134 1135 if (dump_file && (dump_flags & TDF_DETAILS)) 1136 gimple_dump_cfg (dump_file, dump_flags & ~TDF_DETAILS); 1137 1138 remove_ssa_form (flag_tree_ter, sa); 1139 1140 if (dump_file && (dump_flags & TDF_DETAILS)) 1141 gimple_dump_cfg (dump_file, dump_flags & ~TDF_DETAILS); 1142 1143 return 0; 1144 } 1145