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