1 /* Miscellaneous SSA utility functions. 2 Copyright (C) 2001-2015 Free Software Foundation, Inc. 3 4 This file is part of GCC. 5 6 GCC is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 3, or (at your option) 9 any later version. 10 11 GCC is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with GCC; see the file COPYING3. If not see 18 <http://www.gnu.org/licenses/>. */ 19 20 #include "config.h" 21 #include "system.h" 22 #include "coretypes.h" 23 #include "tm.h" 24 #include "hash-set.h" 25 #include "machmode.h" 26 #include "vec.h" 27 #include "double-int.h" 28 #include "input.h" 29 #include "alias.h" 30 #include "symtab.h" 31 #include "wide-int.h" 32 #include "inchash.h" 33 #include "tree.h" 34 #include "fold-const.h" 35 #include "stor-layout.h" 36 #include "flags.h" 37 #include "tm_p.h" 38 #include "target.h" 39 #include "langhooks.h" 40 #include "predict.h" 41 #include "hard-reg-set.h" 42 #include "input.h" 43 #include "function.h" 44 #include "dominance.h" 45 #include "cfg.h" 46 #include "basic-block.h" 47 #include "gimple-pretty-print.h" 48 #include "tree-ssa-alias.h" 49 #include "internal-fn.h" 50 #include "gimple-fold.h" 51 #include "gimple-expr.h" 52 #include "is-a.h" 53 #include "gimple.h" 54 #include "gimplify.h" 55 #include "gimple-iterator.h" 56 #include "gimple-walk.h" 57 #include "gimple-ssa.h" 58 #include "tree-phinodes.h" 59 #include "ssa-iterators.h" 60 #include "stringpool.h" 61 #include "tree-ssanames.h" 62 #include "tree-ssa-loop-manip.h" 63 #include "tree-into-ssa.h" 64 #include "tree-ssa.h" 65 #include "tree-inline.h" 66 #include "hash-map.h" 67 #include "tree-pass.h" 68 #include "diagnostic-core.h" 69 #include "cfgloop.h" 70 #include "cfgexpand.h" 71 72 /* Pointer map of variable mappings, keyed by edge. */ 73 static hash_map<edge, auto_vec<edge_var_map> > *edge_var_maps; 74 75 76 /* Add a mapping with PHI RESULT and PHI DEF associated with edge E. */ 77 78 void 79 redirect_edge_var_map_add (edge e, tree result, tree def, source_location locus) 80 { 81 edge_var_map new_node; 82 83 if (edge_var_maps == NULL) 84 edge_var_maps = new hash_map<edge, auto_vec<edge_var_map> >; 85 86 auto_vec<edge_var_map> &slot = edge_var_maps->get_or_insert (e); 87 new_node.def = def; 88 new_node.result = result; 89 new_node.locus = locus; 90 91 slot.safe_push (new_node); 92 } 93 94 95 /* Clear the var mappings in edge E. */ 96 97 void 98 redirect_edge_var_map_clear (edge e) 99 { 100 if (!edge_var_maps) 101 return; 102 103 auto_vec<edge_var_map> *head = edge_var_maps->get (e); 104 105 if (head) 106 head->release (); 107 } 108 109 110 /* Duplicate the redirected var mappings in OLDE in NEWE. 111 112 This assumes a hash_map can have multiple edges mapping to the same 113 var_map (many to one mapping), since we don't remove the previous mappings. 114 */ 115 116 void 117 redirect_edge_var_map_dup (edge newe, edge olde) 118 { 119 if (!edge_var_maps) 120 return; 121 122 auto_vec<edge_var_map> *new_head = &edge_var_maps->get_or_insert (newe); 123 auto_vec<edge_var_map> *old_head = edge_var_maps->get (olde); 124 if (!old_head) 125 return; 126 127 new_head->safe_splice (*old_head); 128 } 129 130 131 /* Return the variable mappings for a given edge. If there is none, return 132 NULL. */ 133 134 vec<edge_var_map> * 135 redirect_edge_var_map_vector (edge e) 136 { 137 /* Hey, what kind of idiot would... you'd be surprised. */ 138 if (!edge_var_maps) 139 return NULL; 140 141 auto_vec<edge_var_map> *slot = edge_var_maps->get (e); 142 if (!slot) 143 return NULL; 144 145 return slot; 146 } 147 148 /* Clear the edge variable mappings. */ 149 150 void 151 redirect_edge_var_map_destroy (void) 152 { 153 delete edge_var_maps; 154 edge_var_maps = NULL; 155 } 156 157 158 /* Remove the corresponding arguments from the PHI nodes in E's 159 destination block and redirect it to DEST. Return redirected edge. 160 The list of removed arguments is stored in a vector accessed 161 through edge_var_maps. */ 162 163 edge 164 ssa_redirect_edge (edge e, basic_block dest) 165 { 166 gphi_iterator gsi; 167 gphi *phi; 168 169 redirect_edge_var_map_clear (e); 170 171 /* Remove the appropriate PHI arguments in E's destination block. */ 172 for (gsi = gsi_start_phis (e->dest); !gsi_end_p (gsi); gsi_next (&gsi)) 173 { 174 tree def; 175 source_location locus ; 176 177 phi = gsi.phi (); 178 def = gimple_phi_arg_def (phi, e->dest_idx); 179 locus = gimple_phi_arg_location (phi, e->dest_idx); 180 181 if (def == NULL_TREE) 182 continue; 183 184 redirect_edge_var_map_add (e, gimple_phi_result (phi), def, locus); 185 } 186 187 e = redirect_edge_succ_nodup (e, dest); 188 189 return e; 190 } 191 192 193 /* Add PHI arguments queued in PENDING_STMT list on edge E to edge 194 E->dest. */ 195 196 void 197 flush_pending_stmts (edge e) 198 { 199 gphi *phi; 200 edge_var_map *vm; 201 int i; 202 gphi_iterator gsi; 203 204 vec<edge_var_map> *v = redirect_edge_var_map_vector (e); 205 if (!v) 206 return; 207 208 for (gsi = gsi_start_phis (e->dest), i = 0; 209 !gsi_end_p (gsi) && v->iterate (i, &vm); 210 gsi_next (&gsi), i++) 211 { 212 tree def; 213 214 phi = gsi.phi (); 215 def = redirect_edge_var_map_def (vm); 216 add_phi_arg (phi, def, e, redirect_edge_var_map_location (vm)); 217 } 218 219 redirect_edge_var_map_clear (e); 220 } 221 222 /* Replace the LHS of STMT, an assignment, either a GIMPLE_ASSIGN or a 223 GIMPLE_CALL, with NLHS, in preparation for modifying the RHS to an 224 expression with a different value. 225 226 This will update any annotations (say debug bind stmts) referring 227 to the original LHS, so that they use the RHS instead. This is 228 done even if NLHS and LHS are the same, for it is understood that 229 the RHS will be modified afterwards, and NLHS will not be assigned 230 an equivalent value. 231 232 Adjusting any non-annotation uses of the LHS, if needed, is a 233 responsibility of the caller. 234 235 The effect of this call should be pretty much the same as that of 236 inserting a copy of STMT before STMT, and then removing the 237 original stmt, at which time gsi_remove() would have update 238 annotations, but using this function saves all the inserting, 239 copying and removing. */ 240 241 void 242 gimple_replace_ssa_lhs (gimple stmt, tree nlhs) 243 { 244 if (MAY_HAVE_DEBUG_STMTS) 245 { 246 tree lhs = gimple_get_lhs (stmt); 247 248 gcc_assert (SSA_NAME_DEF_STMT (lhs) == stmt); 249 250 insert_debug_temp_for_var_def (NULL, lhs); 251 } 252 253 gimple_set_lhs (stmt, nlhs); 254 } 255 256 257 /* Given a tree for an expression for which we might want to emit 258 locations or values in debug information (generally a variable, but 259 we might deal with other kinds of trees in the future), return the 260 tree that should be used as the variable of a DEBUG_BIND STMT or 261 VAR_LOCATION INSN or NOTE. Return NULL if VAR is not to be tracked. */ 262 263 tree 264 target_for_debug_bind (tree var) 265 { 266 if (!MAY_HAVE_DEBUG_STMTS) 267 return NULL_TREE; 268 269 if (TREE_CODE (var) == SSA_NAME) 270 { 271 var = SSA_NAME_VAR (var); 272 if (var == NULL_TREE) 273 return NULL_TREE; 274 } 275 276 if ((TREE_CODE (var) != VAR_DECL 277 || VAR_DECL_IS_VIRTUAL_OPERAND (var)) 278 && TREE_CODE (var) != PARM_DECL) 279 return NULL_TREE; 280 281 if (DECL_HAS_VALUE_EXPR_P (var)) 282 return target_for_debug_bind (DECL_VALUE_EXPR (var)); 283 284 if (DECL_IGNORED_P (var)) 285 return NULL_TREE; 286 287 /* var-tracking only tracks registers. */ 288 if (!is_gimple_reg_type (TREE_TYPE (var))) 289 return NULL_TREE; 290 291 return var; 292 } 293 294 /* Called via walk_tree, look for SSA_NAMEs that have already been 295 released. */ 296 297 static tree 298 find_released_ssa_name (tree *tp, int *walk_subtrees, void *data_) 299 { 300 struct walk_stmt_info *wi = (struct walk_stmt_info *) data_; 301 302 if (wi && wi->is_lhs) 303 return NULL_TREE; 304 305 if (TREE_CODE (*tp) == SSA_NAME) 306 { 307 if (SSA_NAME_IN_FREE_LIST (*tp)) 308 return *tp; 309 310 *walk_subtrees = 0; 311 } 312 else if (IS_TYPE_OR_DECL_P (*tp)) 313 *walk_subtrees = 0; 314 315 return NULL_TREE; 316 } 317 318 /* Insert a DEBUG BIND stmt before the DEF of VAR if VAR is referenced 319 by other DEBUG stmts, and replace uses of the DEF with the 320 newly-created debug temp. */ 321 322 void 323 insert_debug_temp_for_var_def (gimple_stmt_iterator *gsi, tree var) 324 { 325 imm_use_iterator imm_iter; 326 use_operand_p use_p; 327 gimple stmt; 328 gimple def_stmt = NULL; 329 int usecount = 0; 330 tree value = NULL; 331 332 if (!MAY_HAVE_DEBUG_STMTS) 333 return; 334 335 /* If this name has already been registered for replacement, do nothing 336 as anything that uses this name isn't in SSA form. */ 337 if (name_registered_for_update_p (var)) 338 return; 339 340 /* Check whether there are debug stmts that reference this variable and, 341 if there are, decide whether we should use a debug temp. */ 342 FOR_EACH_IMM_USE_FAST (use_p, imm_iter, var) 343 { 344 stmt = USE_STMT (use_p); 345 346 if (!gimple_debug_bind_p (stmt)) 347 continue; 348 349 if (usecount++) 350 break; 351 352 if (gimple_debug_bind_get_value (stmt) != var) 353 { 354 /* Count this as an additional use, so as to make sure we 355 use a temp unless VAR's definition has a SINGLE_RHS that 356 can be shared. */ 357 usecount++; 358 break; 359 } 360 } 361 362 if (!usecount) 363 return; 364 365 if (gsi) 366 def_stmt = gsi_stmt (*gsi); 367 else 368 def_stmt = SSA_NAME_DEF_STMT (var); 369 370 /* If we didn't get an insertion point, and the stmt has already 371 been removed, we won't be able to insert the debug bind stmt, so 372 we'll have to drop debug information. */ 373 if (gimple_code (def_stmt) == GIMPLE_PHI) 374 { 375 value = degenerate_phi_result (as_a <gphi *> (def_stmt)); 376 if (value && walk_tree (&value, find_released_ssa_name, NULL, NULL)) 377 value = NULL; 378 /* error_mark_node is what fixup_noreturn_call changes PHI arguments 379 to. */ 380 else if (value == error_mark_node) 381 value = NULL; 382 } 383 else if (is_gimple_assign (def_stmt)) 384 { 385 bool no_value = false; 386 387 if (!dom_info_available_p (CDI_DOMINATORS)) 388 { 389 struct walk_stmt_info wi; 390 391 memset (&wi, 0, sizeof (wi)); 392 393 /* When removing blocks without following reverse dominance 394 order, we may sometimes encounter SSA_NAMEs that have 395 already been released, referenced in other SSA_DEFs that 396 we're about to release. Consider: 397 398 <bb X>: 399 v_1 = foo; 400 401 <bb Y>: 402 w_2 = v_1 + bar; 403 # DEBUG w => w_2 404 405 If we deleted BB X first, propagating the value of w_2 406 won't do us any good. It's too late to recover their 407 original definition of v_1: when it was deleted, it was 408 only referenced in other DEFs, it couldn't possibly know 409 it should have been retained, and propagating every 410 single DEF just in case it might have to be propagated 411 into a DEBUG STMT would probably be too wasteful. 412 413 When dominator information is not readily available, we 414 check for and accept some loss of debug information. But 415 if it is available, there's no excuse for us to remove 416 blocks in the wrong order, so we don't even check for 417 dead SSA NAMEs. SSA verification shall catch any 418 errors. */ 419 if ((!gsi && !gimple_bb (def_stmt)) 420 || walk_gimple_op (def_stmt, find_released_ssa_name, &wi)) 421 no_value = true; 422 } 423 424 if (!no_value) 425 value = gimple_assign_rhs_to_tree (def_stmt); 426 } 427 428 if (value) 429 { 430 /* If there's a single use of VAR, and VAR is the entire debug 431 expression (usecount would have been incremented again 432 otherwise), and the definition involves only constants and 433 SSA names, then we can propagate VALUE into this single use, 434 avoiding the temp. 435 436 We can also avoid using a temp if VALUE can be shared and 437 propagated into all uses, without generating expressions that 438 wouldn't be valid gimple RHSs. 439 440 Other cases that would require unsharing or non-gimple RHSs 441 are deferred to a debug temp, although we could avoid temps 442 at the expense of duplication of expressions. */ 443 444 if (CONSTANT_CLASS_P (value) 445 || gimple_code (def_stmt) == GIMPLE_PHI 446 || (usecount == 1 447 && (!gimple_assign_single_p (def_stmt) 448 || is_gimple_min_invariant (value))) 449 || is_gimple_reg (value)) 450 ; 451 else 452 { 453 gdebug *def_temp; 454 tree vexpr = make_node (DEBUG_EXPR_DECL); 455 456 def_temp = gimple_build_debug_bind (vexpr, 457 unshare_expr (value), 458 def_stmt); 459 460 DECL_ARTIFICIAL (vexpr) = 1; 461 TREE_TYPE (vexpr) = TREE_TYPE (value); 462 if (DECL_P (value)) 463 DECL_MODE (vexpr) = DECL_MODE (value); 464 else 465 DECL_MODE (vexpr) = TYPE_MODE (TREE_TYPE (value)); 466 467 if (gsi) 468 gsi_insert_before (gsi, def_temp, GSI_SAME_STMT); 469 else 470 { 471 gimple_stmt_iterator ngsi = gsi_for_stmt (def_stmt); 472 gsi_insert_before (&ngsi, def_temp, GSI_SAME_STMT); 473 } 474 475 value = vexpr; 476 } 477 } 478 479 FOR_EACH_IMM_USE_STMT (stmt, imm_iter, var) 480 { 481 if (!gimple_debug_bind_p (stmt)) 482 continue; 483 484 if (value) 485 { 486 FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter) 487 /* unshare_expr is not needed here. vexpr is either a 488 SINGLE_RHS, that can be safely shared, some other RHS 489 that was unshared when we found it had a single debug 490 use, or a DEBUG_EXPR_DECL, that can be safely 491 shared. */ 492 SET_USE (use_p, unshare_expr (value)); 493 /* If we didn't replace uses with a debug decl fold the 494 resulting expression. Otherwise we end up with invalid IL. */ 495 if (TREE_CODE (value) != DEBUG_EXPR_DECL) 496 { 497 gimple_stmt_iterator gsi = gsi_for_stmt (stmt); 498 fold_stmt_inplace (&gsi); 499 } 500 } 501 else 502 gimple_debug_bind_reset_value (stmt); 503 504 update_stmt (stmt); 505 } 506 } 507 508 509 /* Insert a DEBUG BIND stmt before STMT for each DEF referenced by 510 other DEBUG stmts, and replace uses of the DEF with the 511 newly-created debug temp. */ 512 513 void 514 insert_debug_temps_for_defs (gimple_stmt_iterator *gsi) 515 { 516 gimple stmt; 517 ssa_op_iter op_iter; 518 def_operand_p def_p; 519 520 if (!MAY_HAVE_DEBUG_STMTS) 521 return; 522 523 stmt = gsi_stmt (*gsi); 524 525 FOR_EACH_PHI_OR_STMT_DEF (def_p, stmt, op_iter, SSA_OP_DEF) 526 { 527 tree var = DEF_FROM_PTR (def_p); 528 529 if (TREE_CODE (var) != SSA_NAME) 530 continue; 531 532 insert_debug_temp_for_var_def (gsi, var); 533 } 534 } 535 536 /* Reset all debug stmts that use SSA_NAME(s) defined in STMT. */ 537 538 void 539 reset_debug_uses (gimple stmt) 540 { 541 ssa_op_iter op_iter; 542 def_operand_p def_p; 543 imm_use_iterator imm_iter; 544 gimple use_stmt; 545 546 if (!MAY_HAVE_DEBUG_STMTS) 547 return; 548 549 FOR_EACH_PHI_OR_STMT_DEF (def_p, stmt, op_iter, SSA_OP_DEF) 550 { 551 tree var = DEF_FROM_PTR (def_p); 552 553 if (TREE_CODE (var) != SSA_NAME) 554 continue; 555 556 FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, var) 557 { 558 if (!gimple_debug_bind_p (use_stmt)) 559 continue; 560 561 gimple_debug_bind_reset_value (use_stmt); 562 update_stmt (use_stmt); 563 } 564 } 565 } 566 567 /* Delete SSA DEFs for SSA versions in the TOREMOVE bitmap, removing 568 dominated stmts before their dominators, so that release_ssa_defs 569 stands a chance of propagating DEFs into debug bind stmts. */ 570 571 void 572 release_defs_bitset (bitmap toremove) 573 { 574 unsigned j; 575 bitmap_iterator bi; 576 577 /* Performing a topological sort is probably overkill, this will 578 most likely run in slightly superlinear time, rather than the 579 pathological quadratic worst case. */ 580 while (!bitmap_empty_p (toremove)) 581 EXECUTE_IF_SET_IN_BITMAP (toremove, 0, j, bi) 582 { 583 bool remove_now = true; 584 tree var = ssa_name (j); 585 gimple stmt; 586 imm_use_iterator uit; 587 588 FOR_EACH_IMM_USE_STMT (stmt, uit, var) 589 { 590 ssa_op_iter dit; 591 def_operand_p def_p; 592 593 /* We can't propagate PHI nodes into debug stmts. */ 594 if (gimple_code (stmt) == GIMPLE_PHI 595 || is_gimple_debug (stmt)) 596 continue; 597 598 /* If we find another definition to remove that uses 599 the one we're looking at, defer the removal of this 600 one, so that it can be propagated into debug stmts 601 after the other is. */ 602 FOR_EACH_SSA_DEF_OPERAND (def_p, stmt, dit, SSA_OP_DEF) 603 { 604 tree odef = DEF_FROM_PTR (def_p); 605 606 if (bitmap_bit_p (toremove, SSA_NAME_VERSION (odef))) 607 { 608 remove_now = false; 609 break; 610 } 611 } 612 613 if (!remove_now) 614 BREAK_FROM_IMM_USE_STMT (uit); 615 } 616 617 if (remove_now) 618 { 619 gimple def = SSA_NAME_DEF_STMT (var); 620 gimple_stmt_iterator gsi = gsi_for_stmt (def); 621 622 if (gimple_code (def) == GIMPLE_PHI) 623 remove_phi_node (&gsi, true); 624 else 625 { 626 gsi_remove (&gsi, true); 627 release_defs (def); 628 } 629 630 bitmap_clear_bit (toremove, j); 631 } 632 } 633 } 634 635 /* Return true if SSA_NAME is malformed and mark it visited. 636 637 IS_VIRTUAL is true if this SSA_NAME was found inside a virtual 638 operand. */ 639 640 static bool 641 verify_ssa_name (tree ssa_name, bool is_virtual) 642 { 643 if (TREE_CODE (ssa_name) != SSA_NAME) 644 { 645 error ("expected an SSA_NAME object"); 646 return true; 647 } 648 649 if (SSA_NAME_IN_FREE_LIST (ssa_name)) 650 { 651 error ("found an SSA_NAME that had been released into the free pool"); 652 return true; 653 } 654 655 if (SSA_NAME_VAR (ssa_name) != NULL_TREE 656 && TREE_TYPE (ssa_name) != TREE_TYPE (SSA_NAME_VAR (ssa_name))) 657 { 658 error ("type mismatch between an SSA_NAME and its symbol"); 659 return true; 660 } 661 662 if (is_virtual && !virtual_operand_p (ssa_name)) 663 { 664 error ("found a virtual definition for a GIMPLE register"); 665 return true; 666 } 667 668 if (is_virtual && SSA_NAME_VAR (ssa_name) != gimple_vop (cfun)) 669 { 670 error ("virtual SSA name for non-VOP decl"); 671 return true; 672 } 673 674 if (!is_virtual && virtual_operand_p (ssa_name)) 675 { 676 error ("found a real definition for a non-register"); 677 return true; 678 } 679 680 if (SSA_NAME_IS_DEFAULT_DEF (ssa_name) 681 && !gimple_nop_p (SSA_NAME_DEF_STMT (ssa_name))) 682 { 683 error ("found a default name with a non-empty defining statement"); 684 return true; 685 } 686 687 return false; 688 } 689 690 691 /* Return true if the definition of SSA_NAME at block BB is malformed. 692 693 STMT is the statement where SSA_NAME is created. 694 695 DEFINITION_BLOCK is an array of basic blocks indexed by SSA_NAME 696 version numbers. If DEFINITION_BLOCK[SSA_NAME_VERSION] is set, 697 it means that the block in that array slot contains the 698 definition of SSA_NAME. 699 700 IS_VIRTUAL is true if SSA_NAME is created by a VDEF. */ 701 702 static bool 703 verify_def (basic_block bb, basic_block *definition_block, tree ssa_name, 704 gimple stmt, bool is_virtual) 705 { 706 if (verify_ssa_name (ssa_name, is_virtual)) 707 goto err; 708 709 if (SSA_NAME_VAR (ssa_name) 710 && TREE_CODE (SSA_NAME_VAR (ssa_name)) == RESULT_DECL 711 && DECL_BY_REFERENCE (SSA_NAME_VAR (ssa_name))) 712 { 713 error ("RESULT_DECL should be read only when DECL_BY_REFERENCE is set"); 714 goto err; 715 } 716 717 if (definition_block[SSA_NAME_VERSION (ssa_name)]) 718 { 719 error ("SSA_NAME created in two different blocks %i and %i", 720 definition_block[SSA_NAME_VERSION (ssa_name)]->index, bb->index); 721 goto err; 722 } 723 724 definition_block[SSA_NAME_VERSION (ssa_name)] = bb; 725 726 if (SSA_NAME_DEF_STMT (ssa_name) != stmt) 727 { 728 error ("SSA_NAME_DEF_STMT is wrong"); 729 fprintf (stderr, "Expected definition statement:\n"); 730 print_gimple_stmt (stderr, SSA_NAME_DEF_STMT (ssa_name), 4, TDF_VOPS); 731 fprintf (stderr, "\nActual definition statement:\n"); 732 print_gimple_stmt (stderr, stmt, 4, TDF_VOPS); 733 goto err; 734 } 735 736 return false; 737 738 err: 739 fprintf (stderr, "while verifying SSA_NAME "); 740 print_generic_expr (stderr, ssa_name, 0); 741 fprintf (stderr, " in statement\n"); 742 print_gimple_stmt (stderr, stmt, 4, TDF_VOPS); 743 744 return true; 745 } 746 747 748 /* Return true if the use of SSA_NAME at statement STMT in block BB is 749 malformed. 750 751 DEF_BB is the block where SSA_NAME was found to be created. 752 753 IDOM contains immediate dominator information for the flowgraph. 754 755 CHECK_ABNORMAL is true if the caller wants to check whether this use 756 is flowing through an abnormal edge (only used when checking PHI 757 arguments). 758 759 If NAMES_DEFINED_IN_BB is not NULL, it contains a bitmap of ssa names 760 that are defined before STMT in basic block BB. */ 761 762 static bool 763 verify_use (basic_block bb, basic_block def_bb, use_operand_p use_p, 764 gimple stmt, bool check_abnormal, bitmap names_defined_in_bb) 765 { 766 bool err = false; 767 tree ssa_name = USE_FROM_PTR (use_p); 768 769 if (!TREE_VISITED (ssa_name)) 770 if (verify_imm_links (stderr, ssa_name)) 771 err = true; 772 773 TREE_VISITED (ssa_name) = 1; 774 775 if (gimple_nop_p (SSA_NAME_DEF_STMT (ssa_name)) 776 && SSA_NAME_IS_DEFAULT_DEF (ssa_name)) 777 ; /* Default definitions have empty statements. Nothing to do. */ 778 else if (!def_bb) 779 { 780 error ("missing definition"); 781 err = true; 782 } 783 else if (bb != def_bb 784 && !dominated_by_p (CDI_DOMINATORS, bb, def_bb)) 785 { 786 error ("definition in block %i does not dominate use in block %i", 787 def_bb->index, bb->index); 788 err = true; 789 } 790 else if (bb == def_bb 791 && names_defined_in_bb != NULL 792 && !bitmap_bit_p (names_defined_in_bb, SSA_NAME_VERSION (ssa_name))) 793 { 794 error ("definition in block %i follows the use", def_bb->index); 795 err = true; 796 } 797 798 if (check_abnormal 799 && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ssa_name)) 800 { 801 error ("SSA_NAME_OCCURS_IN_ABNORMAL_PHI should be set"); 802 err = true; 803 } 804 805 /* Make sure the use is in an appropriate list by checking the previous 806 element to make sure it's the same. */ 807 if (use_p->prev == NULL) 808 { 809 error ("no immediate_use list"); 810 err = true; 811 } 812 else 813 { 814 tree listvar; 815 if (use_p->prev->use == NULL) 816 listvar = use_p->prev->loc.ssa_name; 817 else 818 listvar = USE_FROM_PTR (use_p->prev); 819 if (listvar != ssa_name) 820 { 821 error ("wrong immediate use list"); 822 err = true; 823 } 824 } 825 826 if (err) 827 { 828 fprintf (stderr, "for SSA_NAME: "); 829 print_generic_expr (stderr, ssa_name, TDF_VOPS); 830 fprintf (stderr, " in statement:\n"); 831 print_gimple_stmt (stderr, stmt, 0, TDF_VOPS); 832 } 833 834 return err; 835 } 836 837 838 /* Return true if any of the arguments for PHI node PHI at block BB is 839 malformed. 840 841 DEFINITION_BLOCK is an array of basic blocks indexed by SSA_NAME 842 version numbers. If DEFINITION_BLOCK[SSA_NAME_VERSION] is set, 843 it means that the block in that array slot contains the 844 definition of SSA_NAME. */ 845 846 static bool 847 verify_phi_args (gphi *phi, basic_block bb, basic_block *definition_block) 848 { 849 edge e; 850 bool err = false; 851 size_t i, phi_num_args = gimple_phi_num_args (phi); 852 853 if (EDGE_COUNT (bb->preds) != phi_num_args) 854 { 855 error ("incoming edge count does not match number of PHI arguments"); 856 err = true; 857 goto error; 858 } 859 860 for (i = 0; i < phi_num_args; i++) 861 { 862 use_operand_p op_p = gimple_phi_arg_imm_use_ptr (phi, i); 863 tree op = USE_FROM_PTR (op_p); 864 865 e = EDGE_PRED (bb, i); 866 867 if (op == NULL_TREE) 868 { 869 error ("PHI argument is missing for edge %d->%d", 870 e->src->index, 871 e->dest->index); 872 err = true; 873 goto error; 874 } 875 876 if (TREE_CODE (op) != SSA_NAME && !is_gimple_min_invariant (op)) 877 { 878 error ("PHI argument is not SSA_NAME, or invariant"); 879 err = true; 880 } 881 882 if (TREE_CODE (op) == SSA_NAME) 883 { 884 err = verify_ssa_name (op, virtual_operand_p (gimple_phi_result (phi))); 885 err |= verify_use (e->src, definition_block[SSA_NAME_VERSION (op)], 886 op_p, phi, e->flags & EDGE_ABNORMAL, NULL); 887 } 888 889 if (TREE_CODE (op) == ADDR_EXPR) 890 { 891 tree base = TREE_OPERAND (op, 0); 892 while (handled_component_p (base)) 893 base = TREE_OPERAND (base, 0); 894 if ((TREE_CODE (base) == VAR_DECL 895 || TREE_CODE (base) == PARM_DECL 896 || TREE_CODE (base) == RESULT_DECL) 897 && !TREE_ADDRESSABLE (base)) 898 { 899 error ("address taken, but ADDRESSABLE bit not set"); 900 err = true; 901 } 902 } 903 904 if (e->dest != bb) 905 { 906 error ("wrong edge %d->%d for PHI argument", 907 e->src->index, e->dest->index); 908 err = true; 909 } 910 911 if (err) 912 { 913 fprintf (stderr, "PHI argument\n"); 914 print_generic_stmt (stderr, op, TDF_VOPS); 915 goto error; 916 } 917 } 918 919 error: 920 if (err) 921 { 922 fprintf (stderr, "for PHI node\n"); 923 print_gimple_stmt (stderr, phi, 0, TDF_VOPS|TDF_MEMSYMS); 924 } 925 926 927 return err; 928 } 929 930 931 /* Verify common invariants in the SSA web. 932 TODO: verify the variable annotations. */ 933 934 DEBUG_FUNCTION void 935 verify_ssa (bool check_modified_stmt, bool check_ssa_operands) 936 { 937 size_t i; 938 basic_block bb; 939 basic_block *definition_block = XCNEWVEC (basic_block, num_ssa_names); 940 ssa_op_iter iter; 941 tree op; 942 enum dom_state orig_dom_state = dom_info_state (CDI_DOMINATORS); 943 bitmap names_defined_in_bb = BITMAP_ALLOC (NULL); 944 945 gcc_assert (!need_ssa_update_p (cfun)); 946 947 timevar_push (TV_TREE_SSA_VERIFY); 948 949 /* Keep track of SSA names present in the IL. */ 950 for (i = 1; i < num_ssa_names; i++) 951 { 952 tree name = ssa_name (i); 953 if (name) 954 { 955 gimple stmt; 956 TREE_VISITED (name) = 0; 957 958 verify_ssa_name (name, virtual_operand_p (name)); 959 960 stmt = SSA_NAME_DEF_STMT (name); 961 if (!gimple_nop_p (stmt)) 962 { 963 basic_block bb = gimple_bb (stmt); 964 if (verify_def (bb, definition_block, 965 name, stmt, virtual_operand_p (name))) 966 goto err; 967 } 968 } 969 } 970 971 calculate_dominance_info (CDI_DOMINATORS); 972 973 /* Now verify all the uses and make sure they agree with the definitions 974 found in the previous pass. */ 975 FOR_EACH_BB_FN (bb, cfun) 976 { 977 edge e; 978 edge_iterator ei; 979 980 /* Make sure that all edges have a clear 'aux' field. */ 981 FOR_EACH_EDGE (e, ei, bb->preds) 982 { 983 if (e->aux) 984 { 985 error ("AUX pointer initialized for edge %d->%d", e->src->index, 986 e->dest->index); 987 goto err; 988 } 989 } 990 991 /* Verify the arguments for every PHI node in the block. */ 992 for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi)) 993 { 994 gphi *phi = gsi.phi (); 995 if (verify_phi_args (phi, bb, definition_block)) 996 goto err; 997 998 bitmap_set_bit (names_defined_in_bb, 999 SSA_NAME_VERSION (gimple_phi_result (phi))); 1000 } 1001 1002 /* Now verify all the uses and vuses in every statement of the block. */ 1003 for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi); 1004 gsi_next (&gsi)) 1005 { 1006 gimple stmt = gsi_stmt (gsi); 1007 use_operand_p use_p; 1008 1009 if (check_modified_stmt && gimple_modified_p (stmt)) 1010 { 1011 error ("stmt (%p) marked modified after optimization pass: ", 1012 (void *)stmt); 1013 print_gimple_stmt (stderr, stmt, 0, TDF_VOPS); 1014 goto err; 1015 } 1016 1017 if (check_ssa_operands && verify_ssa_operands (cfun, stmt)) 1018 { 1019 print_gimple_stmt (stderr, stmt, 0, TDF_VOPS); 1020 goto err; 1021 } 1022 1023 if (gimple_debug_bind_p (stmt) 1024 && !gimple_debug_bind_has_value_p (stmt)) 1025 continue; 1026 1027 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE|SSA_OP_VUSE) 1028 { 1029 op = USE_FROM_PTR (use_p); 1030 if (verify_use (bb, definition_block[SSA_NAME_VERSION (op)], 1031 use_p, stmt, false, names_defined_in_bb)) 1032 goto err; 1033 } 1034 1035 FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_ALL_DEFS) 1036 { 1037 if (SSA_NAME_DEF_STMT (op) != stmt) 1038 { 1039 error ("SSA_NAME_DEF_STMT is wrong"); 1040 fprintf (stderr, "Expected definition statement:\n"); 1041 print_gimple_stmt (stderr, stmt, 4, TDF_VOPS); 1042 fprintf (stderr, "\nActual definition statement:\n"); 1043 print_gimple_stmt (stderr, SSA_NAME_DEF_STMT (op), 1044 4, TDF_VOPS); 1045 goto err; 1046 } 1047 bitmap_set_bit (names_defined_in_bb, SSA_NAME_VERSION (op)); 1048 } 1049 } 1050 1051 bitmap_clear (names_defined_in_bb); 1052 } 1053 1054 free (definition_block); 1055 1056 /* Restore the dominance information to its prior known state, so 1057 that we do not perturb the compiler's subsequent behavior. */ 1058 if (orig_dom_state == DOM_NONE) 1059 free_dominance_info (CDI_DOMINATORS); 1060 else 1061 set_dom_info_availability (CDI_DOMINATORS, orig_dom_state); 1062 1063 BITMAP_FREE (names_defined_in_bb); 1064 timevar_pop (TV_TREE_SSA_VERIFY); 1065 return; 1066 1067 err: 1068 internal_error ("verify_ssa failed"); 1069 } 1070 1071 1072 /* Initialize global DFA and SSA structures. */ 1073 1074 void 1075 init_tree_ssa (struct function *fn) 1076 { 1077 fn->gimple_df = ggc_cleared_alloc<gimple_df> (); 1078 fn->gimple_df->default_defs = hash_table<ssa_name_hasher>::create_ggc (20); 1079 pt_solution_reset (&fn->gimple_df->escaped); 1080 init_ssanames (fn, 0); 1081 } 1082 1083 /* Do the actions required to initialize internal data structures used 1084 in tree-ssa optimization passes. */ 1085 1086 static unsigned int 1087 execute_init_datastructures (void) 1088 { 1089 /* Allocate hash tables, arrays and other structures. */ 1090 gcc_assert (!cfun->gimple_df); 1091 init_tree_ssa (cfun); 1092 return 0; 1093 } 1094 1095 namespace { 1096 1097 const pass_data pass_data_init_datastructures = 1098 { 1099 GIMPLE_PASS, /* type */ 1100 "*init_datastructures", /* name */ 1101 OPTGROUP_NONE, /* optinfo_flags */ 1102 TV_NONE, /* tv_id */ 1103 PROP_cfg, /* properties_required */ 1104 0, /* properties_provided */ 1105 0, /* properties_destroyed */ 1106 0, /* todo_flags_start */ 1107 0, /* todo_flags_finish */ 1108 }; 1109 1110 class pass_init_datastructures : public gimple_opt_pass 1111 { 1112 public: 1113 pass_init_datastructures (gcc::context *ctxt) 1114 : gimple_opt_pass (pass_data_init_datastructures, ctxt) 1115 {} 1116 1117 /* opt_pass methods: */ 1118 virtual bool gate (function *fun) 1119 { 1120 /* Do nothing for funcions that was produced already in SSA form. */ 1121 return !(fun->curr_properties & PROP_ssa); 1122 } 1123 1124 virtual unsigned int execute (function *) 1125 { 1126 return execute_init_datastructures (); 1127 } 1128 1129 }; // class pass_init_datastructures 1130 1131 } // anon namespace 1132 1133 gimple_opt_pass * 1134 make_pass_init_datastructures (gcc::context *ctxt) 1135 { 1136 return new pass_init_datastructures (ctxt); 1137 } 1138 1139 /* Deallocate memory associated with SSA data structures for FNDECL. */ 1140 1141 void 1142 delete_tree_ssa (void) 1143 { 1144 fini_ssanames (); 1145 1146 /* We no longer maintain the SSA operand cache at this point. */ 1147 if (ssa_operands_active (cfun)) 1148 fini_ssa_operands (cfun); 1149 1150 cfun->gimple_df->default_defs->empty (); 1151 cfun->gimple_df->default_defs = NULL; 1152 pt_solution_reset (&cfun->gimple_df->escaped); 1153 if (cfun->gimple_df->decls_to_pointers != NULL) 1154 delete cfun->gimple_df->decls_to_pointers; 1155 cfun->gimple_df->decls_to_pointers = NULL; 1156 cfun->gimple_df->modified_noreturn_calls = NULL; 1157 cfun->gimple_df = NULL; 1158 1159 /* We no longer need the edge variable maps. */ 1160 redirect_edge_var_map_destroy (); 1161 } 1162 1163 /* Return true if EXPR is a useless type conversion, otherwise return 1164 false. */ 1165 1166 bool 1167 tree_ssa_useless_type_conversion (tree expr) 1168 { 1169 /* If we have an assignment that merely uses a NOP_EXPR to change 1170 the top of the RHS to the type of the LHS and the type conversion 1171 is "safe", then strip away the type conversion so that we can 1172 enter LHS = RHS into the const_and_copies table. */ 1173 if (CONVERT_EXPR_P (expr) 1174 || TREE_CODE (expr) == VIEW_CONVERT_EXPR 1175 || TREE_CODE (expr) == NON_LVALUE_EXPR) 1176 return useless_type_conversion_p 1177 (TREE_TYPE (expr), 1178 TREE_TYPE (TREE_OPERAND (expr, 0))); 1179 1180 return false; 1181 } 1182 1183 /* Strip conversions from EXP according to 1184 tree_ssa_useless_type_conversion and return the resulting 1185 expression. */ 1186 1187 tree 1188 tree_ssa_strip_useless_type_conversions (tree exp) 1189 { 1190 while (tree_ssa_useless_type_conversion (exp)) 1191 exp = TREE_OPERAND (exp, 0); 1192 return exp; 1193 } 1194 1195 1196 /* Return true if T, an SSA_NAME, has an undefined value. PARTIAL is what 1197 should be returned if the value is only partially undefined. */ 1198 1199 bool 1200 ssa_undefined_value_p (tree t, bool partial) 1201 { 1202 gimple def_stmt; 1203 tree var = SSA_NAME_VAR (t); 1204 1205 if (!var) 1206 ; 1207 /* Parameters get their initial value from the function entry. */ 1208 else if (TREE_CODE (var) == PARM_DECL) 1209 return false; 1210 /* When returning by reference the return address is actually a hidden 1211 parameter. */ 1212 else if (TREE_CODE (var) == RESULT_DECL && DECL_BY_REFERENCE (var)) 1213 return false; 1214 /* Hard register variables get their initial value from the ether. */ 1215 else if (TREE_CODE (var) == VAR_DECL && DECL_HARD_REGISTER (var)) 1216 return false; 1217 1218 /* The value is undefined iff its definition statement is empty. */ 1219 def_stmt = SSA_NAME_DEF_STMT (t); 1220 if (gimple_nop_p (def_stmt)) 1221 return true; 1222 1223 /* Check if the complex was not only partially defined. */ 1224 if (partial && is_gimple_assign (def_stmt) 1225 && gimple_assign_rhs_code (def_stmt) == COMPLEX_EXPR) 1226 { 1227 tree rhs1, rhs2; 1228 1229 rhs1 = gimple_assign_rhs1 (def_stmt); 1230 rhs2 = gimple_assign_rhs2 (def_stmt); 1231 return (TREE_CODE (rhs1) == SSA_NAME && ssa_undefined_value_p (rhs1)) 1232 || (TREE_CODE (rhs2) == SSA_NAME && ssa_undefined_value_p (rhs2)); 1233 } 1234 return false; 1235 } 1236 1237 1238 /* If necessary, rewrite the base of the reference tree *TP from 1239 a MEM_REF to a plain or converted symbol. */ 1240 1241 static void 1242 maybe_rewrite_mem_ref_base (tree *tp, bitmap suitable_for_renaming) 1243 { 1244 tree sym; 1245 1246 while (handled_component_p (*tp)) 1247 tp = &TREE_OPERAND (*tp, 0); 1248 if (TREE_CODE (*tp) == MEM_REF 1249 && TREE_CODE (TREE_OPERAND (*tp, 0)) == ADDR_EXPR 1250 && (sym = TREE_OPERAND (TREE_OPERAND (*tp, 0), 0)) 1251 && DECL_P (sym) 1252 && !TREE_ADDRESSABLE (sym) 1253 && bitmap_bit_p (suitable_for_renaming, DECL_UID (sym))) 1254 { 1255 if (TREE_CODE (TREE_TYPE (sym)) == VECTOR_TYPE 1256 && useless_type_conversion_p (TREE_TYPE (*tp), 1257 TREE_TYPE (TREE_TYPE (sym))) 1258 && multiple_of_p (sizetype, TREE_OPERAND (*tp, 1), 1259 TYPE_SIZE_UNIT (TREE_TYPE (*tp)))) 1260 { 1261 *tp = build3 (BIT_FIELD_REF, TREE_TYPE (*tp), sym, 1262 TYPE_SIZE (TREE_TYPE (*tp)), 1263 int_const_binop (MULT_EXPR, 1264 bitsize_int (BITS_PER_UNIT), 1265 TREE_OPERAND (*tp, 1))); 1266 } 1267 else if (TREE_CODE (TREE_TYPE (sym)) == COMPLEX_TYPE 1268 && useless_type_conversion_p (TREE_TYPE (*tp), 1269 TREE_TYPE (TREE_TYPE (sym)))) 1270 { 1271 *tp = build1 (integer_zerop (TREE_OPERAND (*tp, 1)) 1272 ? REALPART_EXPR : IMAGPART_EXPR, 1273 TREE_TYPE (*tp), sym); 1274 } 1275 else if (integer_zerop (TREE_OPERAND (*tp, 1))) 1276 { 1277 if (!useless_type_conversion_p (TREE_TYPE (*tp), 1278 TREE_TYPE (sym))) 1279 *tp = build1 (VIEW_CONVERT_EXPR, 1280 TREE_TYPE (*tp), sym); 1281 else 1282 *tp = sym; 1283 } 1284 } 1285 } 1286 1287 /* For a tree REF return its base if it is the base of a MEM_REF 1288 that cannot be rewritten into SSA form. Otherwise return NULL_TREE. */ 1289 1290 static tree 1291 non_rewritable_mem_ref_base (tree ref) 1292 { 1293 tree base = ref; 1294 1295 /* A plain decl does not need it set. */ 1296 if (DECL_P (ref)) 1297 return NULL_TREE; 1298 1299 while (handled_component_p (base)) 1300 base = TREE_OPERAND (base, 0); 1301 1302 /* But watch out for MEM_REFs we cannot lower to a 1303 VIEW_CONVERT_EXPR or a BIT_FIELD_REF. */ 1304 if (TREE_CODE (base) == MEM_REF 1305 && TREE_CODE (TREE_OPERAND (base, 0)) == ADDR_EXPR) 1306 { 1307 tree decl = TREE_OPERAND (TREE_OPERAND (base, 0), 0); 1308 if ((TREE_CODE (TREE_TYPE (decl)) == VECTOR_TYPE 1309 || TREE_CODE (TREE_TYPE (decl)) == COMPLEX_TYPE) 1310 && useless_type_conversion_p (TREE_TYPE (base), 1311 TREE_TYPE (TREE_TYPE (decl))) 1312 && wi::fits_uhwi_p (mem_ref_offset (base)) 1313 && wi::gtu_p (wi::to_offset (TYPE_SIZE_UNIT (TREE_TYPE (decl))), 1314 mem_ref_offset (base)) 1315 && multiple_of_p (sizetype, TREE_OPERAND (base, 1), 1316 TYPE_SIZE_UNIT (TREE_TYPE (base)))) 1317 return NULL_TREE; 1318 if (DECL_P (decl) 1319 && (!integer_zerop (TREE_OPERAND (base, 1)) 1320 || (DECL_SIZE (decl) 1321 != TYPE_SIZE (TREE_TYPE (base))) 1322 || TREE_THIS_VOLATILE (decl) != TREE_THIS_VOLATILE (base))) 1323 return decl; 1324 } 1325 1326 return NULL_TREE; 1327 } 1328 1329 /* For an lvalue tree LHS return true if it cannot be rewritten into SSA form. 1330 Otherwise return true. */ 1331 1332 static bool 1333 non_rewritable_lvalue_p (tree lhs) 1334 { 1335 /* A plain decl is always rewritable. */ 1336 if (DECL_P (lhs)) 1337 return false; 1338 1339 /* We can re-write REALPART_EXPR and IMAGPART_EXPR sets in 1340 a reasonably efficient manner... */ 1341 if ((TREE_CODE (lhs) == REALPART_EXPR 1342 || TREE_CODE (lhs) == IMAGPART_EXPR) 1343 && DECL_P (TREE_OPERAND (lhs, 0))) 1344 return false; 1345 1346 /* A decl that is wrapped inside a MEM-REF that covers 1347 it full is also rewritable. 1348 ??? The following could be relaxed allowing component 1349 references that do not change the access size. */ 1350 if (TREE_CODE (lhs) == MEM_REF 1351 && TREE_CODE (TREE_OPERAND (lhs, 0)) == ADDR_EXPR 1352 && integer_zerop (TREE_OPERAND (lhs, 1))) 1353 { 1354 tree decl = TREE_OPERAND (TREE_OPERAND (lhs, 0), 0); 1355 if (DECL_P (decl) 1356 && DECL_SIZE (decl) == TYPE_SIZE (TREE_TYPE (lhs)) 1357 /* If the dynamic type of the decl has larger precision than 1358 the decl itself we can't use the decls type for SSA rewriting. */ 1359 && ((! INTEGRAL_TYPE_P (TREE_TYPE (decl)) 1360 || compare_tree_int (DECL_SIZE (decl), 1361 TYPE_PRECISION (TREE_TYPE (decl))) == 0) 1362 || (INTEGRAL_TYPE_P (TREE_TYPE (lhs)) 1363 && (TYPE_PRECISION (TREE_TYPE (decl)) 1364 >= TYPE_PRECISION (TREE_TYPE (lhs))))) 1365 /* Make sure we are not re-writing non-float copying into float 1366 copying as that can incur normalization. */ 1367 && (! FLOAT_TYPE_P (TREE_TYPE (decl)) 1368 || types_compatible_p (TREE_TYPE (lhs), TREE_TYPE (decl))) 1369 && (TREE_THIS_VOLATILE (decl) == TREE_THIS_VOLATILE (lhs))) 1370 return false; 1371 } 1372 1373 return true; 1374 } 1375 1376 /* When possible, clear TREE_ADDRESSABLE bit or set DECL_GIMPLE_REG_P bit and 1377 mark the variable VAR for conversion into SSA. Return true when updating 1378 stmts is required. */ 1379 1380 static void 1381 maybe_optimize_var (tree var, bitmap addresses_taken, bitmap not_reg_needs, 1382 bitmap suitable_for_renaming) 1383 { 1384 /* Global Variables, result decls cannot be changed. */ 1385 if (is_global_var (var) 1386 || TREE_CODE (var) == RESULT_DECL 1387 || bitmap_bit_p (addresses_taken, DECL_UID (var))) 1388 return; 1389 1390 if (TREE_ADDRESSABLE (var) 1391 /* Do not change TREE_ADDRESSABLE if we need to preserve var as 1392 a non-register. Otherwise we are confused and forget to 1393 add virtual operands for it. */ 1394 && (!is_gimple_reg_type (TREE_TYPE (var)) 1395 || TREE_CODE (TREE_TYPE (var)) == VECTOR_TYPE 1396 || TREE_CODE (TREE_TYPE (var)) == COMPLEX_TYPE 1397 || !bitmap_bit_p (not_reg_needs, DECL_UID (var)))) 1398 { 1399 TREE_ADDRESSABLE (var) = 0; 1400 if (is_gimple_reg (var)) 1401 bitmap_set_bit (suitable_for_renaming, DECL_UID (var)); 1402 if (dump_file) 1403 { 1404 fprintf (dump_file, "No longer having address taken: "); 1405 print_generic_expr (dump_file, var, 0); 1406 fprintf (dump_file, "\n"); 1407 } 1408 } 1409 1410 if (!DECL_GIMPLE_REG_P (var) 1411 && !bitmap_bit_p (not_reg_needs, DECL_UID (var)) 1412 && (TREE_CODE (TREE_TYPE (var)) == COMPLEX_TYPE 1413 || TREE_CODE (TREE_TYPE (var)) == VECTOR_TYPE) 1414 && !TREE_THIS_VOLATILE (var) 1415 && (TREE_CODE (var) != VAR_DECL || !DECL_HARD_REGISTER (var))) 1416 { 1417 DECL_GIMPLE_REG_P (var) = 1; 1418 bitmap_set_bit (suitable_for_renaming, DECL_UID (var)); 1419 if (dump_file) 1420 { 1421 fprintf (dump_file, "Now a gimple register: "); 1422 print_generic_expr (dump_file, var, 0); 1423 fprintf (dump_file, "\n"); 1424 } 1425 } 1426 } 1427 1428 /* Compute TREE_ADDRESSABLE and DECL_GIMPLE_REG_P for local variables. */ 1429 1430 void 1431 execute_update_addresses_taken (void) 1432 { 1433 basic_block bb; 1434 bitmap addresses_taken = BITMAP_ALLOC (NULL); 1435 bitmap not_reg_needs = BITMAP_ALLOC (NULL); 1436 bitmap suitable_for_renaming = BITMAP_ALLOC (NULL); 1437 tree var; 1438 unsigned i; 1439 1440 timevar_push (TV_ADDRESS_TAKEN); 1441 1442 /* Collect into ADDRESSES_TAKEN all variables whose address is taken within 1443 the function body. */ 1444 FOR_EACH_BB_FN (bb, cfun) 1445 { 1446 for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi); 1447 gsi_next (&gsi)) 1448 { 1449 gimple stmt = gsi_stmt (gsi); 1450 enum gimple_code code = gimple_code (stmt); 1451 tree decl; 1452 1453 /* Note all addresses taken by the stmt. */ 1454 gimple_ior_addresses_taken (addresses_taken, stmt); 1455 1456 /* If we have a call or an assignment, see if the lhs contains 1457 a local decl that requires not to be a gimple register. */ 1458 if (code == GIMPLE_ASSIGN || code == GIMPLE_CALL) 1459 { 1460 tree lhs = gimple_get_lhs (stmt); 1461 if (lhs 1462 && TREE_CODE (lhs) != SSA_NAME 1463 && ((code == GIMPLE_CALL && ! DECL_P (lhs)) 1464 || non_rewritable_lvalue_p (lhs))) 1465 { 1466 decl = get_base_address (lhs); 1467 if (DECL_P (decl)) 1468 bitmap_set_bit (not_reg_needs, DECL_UID (decl)); 1469 } 1470 } 1471 1472 if (gimple_assign_single_p (stmt)) 1473 { 1474 tree rhs = gimple_assign_rhs1 (stmt); 1475 if ((decl = non_rewritable_mem_ref_base (rhs))) 1476 bitmap_set_bit (not_reg_needs, DECL_UID (decl)); 1477 } 1478 1479 else if (code == GIMPLE_CALL) 1480 { 1481 for (i = 0; i < gimple_call_num_args (stmt); ++i) 1482 { 1483 tree arg = gimple_call_arg (stmt, i); 1484 if ((decl = non_rewritable_mem_ref_base (arg))) 1485 bitmap_set_bit (not_reg_needs, DECL_UID (decl)); 1486 } 1487 } 1488 1489 else if (code == GIMPLE_ASM) 1490 { 1491 gasm *asm_stmt = as_a <gasm *> (stmt); 1492 for (i = 0; i < gimple_asm_noutputs (asm_stmt); ++i) 1493 { 1494 tree link = gimple_asm_output_op (asm_stmt, i); 1495 tree lhs = TREE_VALUE (link); 1496 if (TREE_CODE (lhs) != SSA_NAME) 1497 { 1498 decl = get_base_address (lhs); 1499 if (DECL_P (decl) 1500 && (non_rewritable_lvalue_p (lhs) 1501 /* We cannot move required conversions from 1502 the lhs to the rhs in asm statements, so 1503 require we do not need any. */ 1504 || !useless_type_conversion_p 1505 (TREE_TYPE (lhs), TREE_TYPE (decl)))) 1506 bitmap_set_bit (not_reg_needs, DECL_UID (decl)); 1507 } 1508 } 1509 for (i = 0; i < gimple_asm_ninputs (asm_stmt); ++i) 1510 { 1511 tree link = gimple_asm_input_op (asm_stmt, i); 1512 if ((decl = non_rewritable_mem_ref_base (TREE_VALUE (link)))) 1513 bitmap_set_bit (not_reg_needs, DECL_UID (decl)); 1514 } 1515 } 1516 } 1517 1518 for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi); 1519 gsi_next (&gsi)) 1520 { 1521 size_t i; 1522 gphi *phi = gsi.phi (); 1523 1524 for (i = 0; i < gimple_phi_num_args (phi); i++) 1525 { 1526 tree op = PHI_ARG_DEF (phi, i), var; 1527 if (TREE_CODE (op) == ADDR_EXPR 1528 && (var = get_base_address (TREE_OPERAND (op, 0))) != NULL 1529 && DECL_P (var)) 1530 bitmap_set_bit (addresses_taken, DECL_UID (var)); 1531 } 1532 } 1533 } 1534 1535 /* We cannot iterate over all referenced vars because that can contain 1536 unused vars from BLOCK trees, which causes code generation differences 1537 for -g vs. -g0. */ 1538 for (var = DECL_ARGUMENTS (cfun->decl); var; var = DECL_CHAIN (var)) 1539 maybe_optimize_var (var, addresses_taken, not_reg_needs, 1540 suitable_for_renaming); 1541 1542 FOR_EACH_VEC_SAFE_ELT (cfun->local_decls, i, var) 1543 maybe_optimize_var (var, addresses_taken, not_reg_needs, 1544 suitable_for_renaming); 1545 1546 /* Operand caches need to be recomputed for operands referencing the updated 1547 variables and operands need to be rewritten to expose bare symbols. */ 1548 if (!bitmap_empty_p (suitable_for_renaming)) 1549 { 1550 FOR_EACH_BB_FN (bb, cfun) 1551 for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);) 1552 { 1553 gimple stmt = gsi_stmt (gsi); 1554 1555 /* Re-write TARGET_MEM_REFs of symbols we want to 1556 rewrite into SSA form. */ 1557 if (gimple_assign_single_p (stmt)) 1558 { 1559 tree lhs = gimple_assign_lhs (stmt); 1560 tree rhs, *rhsp = gimple_assign_rhs1_ptr (stmt); 1561 tree sym; 1562 1563 /* Rewrite LHS IMAG/REALPART_EXPR similar to 1564 gimplify_modify_expr_complex_part. */ 1565 if ((TREE_CODE (lhs) == IMAGPART_EXPR 1566 || TREE_CODE (lhs) == REALPART_EXPR) 1567 && DECL_P (TREE_OPERAND (lhs, 0)) 1568 && bitmap_bit_p (suitable_for_renaming, 1569 DECL_UID (TREE_OPERAND (lhs, 0)))) 1570 { 1571 tree other = make_ssa_name (TREE_TYPE (lhs)); 1572 tree lrhs = build1 (TREE_CODE (lhs) == IMAGPART_EXPR 1573 ? REALPART_EXPR : IMAGPART_EXPR, 1574 TREE_TYPE (other), 1575 TREE_OPERAND (lhs, 0)); 1576 gimple load = gimple_build_assign (other, lrhs); 1577 location_t loc = gimple_location (stmt); 1578 gimple_set_location (load, loc); 1579 gimple_set_vuse (load, gimple_vuse (stmt)); 1580 gsi_insert_before (&gsi, load, GSI_SAME_STMT); 1581 gimple_assign_set_lhs (stmt, TREE_OPERAND (lhs, 0)); 1582 gimple_assign_set_rhs_with_ops 1583 (&gsi, COMPLEX_EXPR, 1584 TREE_CODE (lhs) == IMAGPART_EXPR 1585 ? other : gimple_assign_rhs1 (stmt), 1586 TREE_CODE (lhs) == IMAGPART_EXPR 1587 ? gimple_assign_rhs1 (stmt) : other, NULL_TREE); 1588 stmt = gsi_stmt (gsi); 1589 unlink_stmt_vdef (stmt); 1590 update_stmt (stmt); 1591 continue; 1592 } 1593 1594 /* We shouldn't have any fancy wrapping of 1595 component-refs on the LHS, but look through 1596 VIEW_CONVERT_EXPRs as that is easy. */ 1597 while (TREE_CODE (lhs) == VIEW_CONVERT_EXPR) 1598 lhs = TREE_OPERAND (lhs, 0); 1599 if (TREE_CODE (lhs) == MEM_REF 1600 && TREE_CODE (TREE_OPERAND (lhs, 0)) == ADDR_EXPR 1601 && integer_zerop (TREE_OPERAND (lhs, 1)) 1602 && (sym = TREE_OPERAND (TREE_OPERAND (lhs, 0), 0)) 1603 && DECL_P (sym) 1604 && !TREE_ADDRESSABLE (sym) 1605 && bitmap_bit_p (suitable_for_renaming, DECL_UID (sym))) 1606 lhs = sym; 1607 else 1608 lhs = gimple_assign_lhs (stmt); 1609 1610 /* Rewrite the RHS and make sure the resulting assignment 1611 is validly typed. */ 1612 maybe_rewrite_mem_ref_base (rhsp, suitable_for_renaming); 1613 rhs = gimple_assign_rhs1 (stmt); 1614 if (gimple_assign_lhs (stmt) != lhs 1615 && !useless_type_conversion_p (TREE_TYPE (lhs), 1616 TREE_TYPE (rhs))) 1617 rhs = fold_build1 (VIEW_CONVERT_EXPR, 1618 TREE_TYPE (lhs), rhs); 1619 1620 if (gimple_assign_lhs (stmt) != lhs) 1621 gimple_assign_set_lhs (stmt, lhs); 1622 1623 if (gimple_assign_rhs1 (stmt) != rhs) 1624 { 1625 gimple_stmt_iterator gsi = gsi_for_stmt (stmt); 1626 gimple_assign_set_rhs_from_tree (&gsi, rhs); 1627 } 1628 } 1629 1630 else if (gimple_code (stmt) == GIMPLE_CALL) 1631 { 1632 unsigned i; 1633 for (i = 0; i < gimple_call_num_args (stmt); ++i) 1634 { 1635 tree *argp = gimple_call_arg_ptr (stmt, i); 1636 maybe_rewrite_mem_ref_base (argp, suitable_for_renaming); 1637 } 1638 } 1639 1640 else if (gimple_code (stmt) == GIMPLE_ASM) 1641 { 1642 gasm *asm_stmt = as_a <gasm *> (stmt); 1643 unsigned i; 1644 for (i = 0; i < gimple_asm_noutputs (asm_stmt); ++i) 1645 { 1646 tree link = gimple_asm_output_op (asm_stmt, i); 1647 maybe_rewrite_mem_ref_base (&TREE_VALUE (link), 1648 suitable_for_renaming); 1649 } 1650 for (i = 0; i < gimple_asm_ninputs (asm_stmt); ++i) 1651 { 1652 tree link = gimple_asm_input_op (asm_stmt, i); 1653 maybe_rewrite_mem_ref_base (&TREE_VALUE (link), 1654 suitable_for_renaming); 1655 } 1656 } 1657 1658 else if (gimple_debug_bind_p (stmt) 1659 && gimple_debug_bind_has_value_p (stmt)) 1660 { 1661 tree *valuep = gimple_debug_bind_get_value_ptr (stmt); 1662 tree decl; 1663 maybe_rewrite_mem_ref_base (valuep, suitable_for_renaming); 1664 decl = non_rewritable_mem_ref_base (*valuep); 1665 if (decl 1666 && bitmap_bit_p (suitable_for_renaming, DECL_UID (decl))) 1667 gimple_debug_bind_reset_value (stmt); 1668 } 1669 1670 if (gimple_references_memory_p (stmt) 1671 || is_gimple_debug (stmt)) 1672 update_stmt (stmt); 1673 1674 gsi_next (&gsi); 1675 } 1676 1677 /* Update SSA form here, we are called as non-pass as well. */ 1678 if (number_of_loops (cfun) > 1 1679 && loops_state_satisfies_p (LOOP_CLOSED_SSA)) 1680 rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa); 1681 else 1682 update_ssa (TODO_update_ssa); 1683 } 1684 1685 BITMAP_FREE (not_reg_needs); 1686 BITMAP_FREE (addresses_taken); 1687 BITMAP_FREE (suitable_for_renaming); 1688 timevar_pop (TV_ADDRESS_TAKEN); 1689 } 1690 1691 namespace { 1692 1693 const pass_data pass_data_update_address_taken = 1694 { 1695 GIMPLE_PASS, /* type */ 1696 "addressables", /* name */ 1697 OPTGROUP_NONE, /* optinfo_flags */ 1698 TV_ADDRESS_TAKEN, /* tv_id */ 1699 PROP_ssa, /* properties_required */ 1700 0, /* properties_provided */ 1701 0, /* properties_destroyed */ 1702 0, /* todo_flags_start */ 1703 TODO_update_address_taken, /* todo_flags_finish */ 1704 }; 1705 1706 class pass_update_address_taken : public gimple_opt_pass 1707 { 1708 public: 1709 pass_update_address_taken (gcc::context *ctxt) 1710 : gimple_opt_pass (pass_data_update_address_taken, ctxt) 1711 {} 1712 1713 /* opt_pass methods: */ 1714 1715 }; // class pass_update_address_taken 1716 1717 } // anon namespace 1718 1719 gimple_opt_pass * 1720 make_pass_update_address_taken (gcc::context *ctxt) 1721 { 1722 return new pass_update_address_taken (ctxt); 1723 } 1724