1/* Inline functions for tree-flow.h 2 Copyright (C) 2001, 2003, 2005, 2006, 2007, 2008, 2010 3 Free Software Foundation, Inc. 4 Contributed by Diego Novillo <dnovillo@redhat.com> 5 6This file is part of GCC. 7 8GCC is free software; you can redistribute it and/or modify 9it under the terms of the GNU General Public License as published by 10the Free Software Foundation; either version 3, or (at your option) 11any later version. 12 13GCC is distributed in the hope that it will be useful, 14but WITHOUT ANY WARRANTY; without even the implied warranty of 15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16GNU General Public License for more details. 17 18You should have received a copy of the GNU General Public License 19along with GCC; see the file COPYING3. If not see 20<http://www.gnu.org/licenses/>. */ 21 22#ifndef _TREE_FLOW_INLINE_H 23#define _TREE_FLOW_INLINE_H 1 24 25/* Inline functions for manipulating various data structures defined in 26 tree-flow.h. See tree-flow.h for documentation. */ 27 28/* Return true when gimple SSA form was built. 29 gimple_in_ssa_p is queried by gimplifier in various early stages before SSA 30 infrastructure is initialized. Check for presence of the datastructures 31 at first place. */ 32static inline bool 33gimple_in_ssa_p (const struct function *fun) 34{ 35 return fun && fun->gimple_df && fun->gimple_df->in_ssa_p; 36} 37 38/* Array of all variables referenced in the function. */ 39static inline htab_t 40gimple_referenced_vars (const struct function *fun) 41{ 42 if (!fun->gimple_df) 43 return NULL; 44 return fun->gimple_df->referenced_vars; 45} 46 47/* Artificial variable used for the virtual operand FUD chain. */ 48static inline tree 49gimple_vop (const struct function *fun) 50{ 51 gcc_checking_assert (fun && fun->gimple_df); 52 return fun->gimple_df->vop; 53} 54 55/* Initialize the hashtable iterator HTI to point to hashtable TABLE */ 56 57static inline void * 58first_htab_element (htab_iterator *hti, htab_t table) 59{ 60 hti->htab = table; 61 hti->slot = table->entries; 62 hti->limit = hti->slot + htab_size (table); 63 do 64 { 65 PTR x = *(hti->slot); 66 if (x != HTAB_EMPTY_ENTRY && x != HTAB_DELETED_ENTRY) 67 break; 68 } while (++(hti->slot) < hti->limit); 69 70 if (hti->slot < hti->limit) 71 return *(hti->slot); 72 return NULL; 73} 74 75/* Return current non-empty/deleted slot of the hashtable pointed to by HTI, 76 or NULL if we have reached the end. */ 77 78static inline bool 79end_htab_p (const htab_iterator *hti) 80{ 81 if (hti->slot >= hti->limit) 82 return true; 83 return false; 84} 85 86/* Advance the hashtable iterator pointed to by HTI to the next element of the 87 hashtable. */ 88 89static inline void * 90next_htab_element (htab_iterator *hti) 91{ 92 while (++(hti->slot) < hti->limit) 93 { 94 PTR x = *(hti->slot); 95 if (x != HTAB_EMPTY_ENTRY && x != HTAB_DELETED_ENTRY) 96 return x; 97 }; 98 return NULL; 99} 100 101/* Get the variable with uid UID from the list of referenced vars. */ 102 103static inline tree 104referenced_var (unsigned int uid) 105{ 106 tree var = referenced_var_lookup (cfun, uid); 107 gcc_assert (var || uid == 0); 108 return var; 109} 110 111/* Initialize ITER to point to the first referenced variable in the 112 referenced_vars hashtable, and return that variable. */ 113 114static inline tree 115first_referenced_var (struct function *fn, referenced_var_iterator *iter) 116{ 117 return (tree) first_htab_element (&iter->hti, 118 gimple_referenced_vars (fn)); 119} 120 121/* Return true if we have hit the end of the referenced variables ITER is 122 iterating through. */ 123 124static inline bool 125end_referenced_vars_p (const referenced_var_iterator *iter) 126{ 127 return end_htab_p (&iter->hti); 128} 129 130/* Make ITER point to the next referenced_var in the referenced_var hashtable, 131 and return that variable. */ 132 133static inline tree 134next_referenced_var (referenced_var_iterator *iter) 135{ 136 return (tree) next_htab_element (&iter->hti); 137} 138 139/* Return the variable annotation for T, which must be a _DECL node. 140 Return NULL if the variable annotation doesn't already exist. */ 141static inline var_ann_t 142var_ann (const_tree t) 143{ 144 const var_ann_t *p = DECL_VAR_ANN_PTR (t); 145 return p ? *p : NULL; 146} 147 148/* Return the variable annotation for T, which must be a _DECL node. 149 Create the variable annotation if it doesn't exist. */ 150static inline var_ann_t 151get_var_ann (tree var) 152{ 153 var_ann_t *p = DECL_VAR_ANN_PTR (var); 154 gcc_checking_assert (p); 155 return *p ? *p : create_var_ann (var); 156} 157 158/* Get the number of the next statement uid to be allocated. */ 159static inline unsigned int 160gimple_stmt_max_uid (struct function *fn) 161{ 162 return fn->last_stmt_uid; 163} 164 165/* Set the number of the next statement uid to be allocated. */ 166static inline void 167set_gimple_stmt_max_uid (struct function *fn, unsigned int maxid) 168{ 169 fn->last_stmt_uid = maxid; 170} 171 172/* Set the number of the next statement uid to be allocated. */ 173static inline unsigned int 174inc_gimple_stmt_max_uid (struct function *fn) 175{ 176 return fn->last_stmt_uid++; 177} 178 179/* Return the line number for EXPR, or return -1 if we have no line 180 number information for it. */ 181static inline int 182get_lineno (const_gimple stmt) 183{ 184 location_t loc; 185 186 if (!stmt) 187 return -1; 188 189 loc = gimple_location (stmt); 190 if (loc == UNKNOWN_LOCATION) 191 return -1; 192 193 return LOCATION_LINE (loc); 194} 195 196/* Delink an immediate_uses node from its chain. */ 197static inline void 198delink_imm_use (ssa_use_operand_t *linknode) 199{ 200 /* Return if this node is not in a list. */ 201 if (linknode->prev == NULL) 202 return; 203 204 linknode->prev->next = linknode->next; 205 linknode->next->prev = linknode->prev; 206 linknode->prev = NULL; 207 linknode->next = NULL; 208} 209 210/* Link ssa_imm_use node LINKNODE into the chain for LIST. */ 211static inline void 212link_imm_use_to_list (ssa_use_operand_t *linknode, ssa_use_operand_t *list) 213{ 214 /* Link the new node at the head of the list. If we are in the process of 215 traversing the list, we won't visit any new nodes added to it. */ 216 linknode->prev = list; 217 linknode->next = list->next; 218 list->next->prev = linknode; 219 list->next = linknode; 220} 221 222/* Link ssa_imm_use node LINKNODE into the chain for DEF. */ 223static inline void 224link_imm_use (ssa_use_operand_t *linknode, tree def) 225{ 226 ssa_use_operand_t *root; 227 228 if (!def || TREE_CODE (def) != SSA_NAME) 229 linknode->prev = NULL; 230 else 231 { 232 root = &(SSA_NAME_IMM_USE_NODE (def)); 233 if (linknode->use) 234 gcc_checking_assert (*(linknode->use) == def); 235 link_imm_use_to_list (linknode, root); 236 } 237} 238 239/* Set the value of a use pointed to by USE to VAL. */ 240static inline void 241set_ssa_use_from_ptr (use_operand_p use, tree val) 242{ 243 delink_imm_use (use); 244 *(use->use) = val; 245 link_imm_use (use, val); 246} 247 248/* Link ssa_imm_use node LINKNODE into the chain for DEF, with use occurring 249 in STMT. */ 250static inline void 251link_imm_use_stmt (ssa_use_operand_t *linknode, tree def, gimple stmt) 252{ 253 if (stmt) 254 link_imm_use (linknode, def); 255 else 256 link_imm_use (linknode, NULL); 257 linknode->loc.stmt = stmt; 258} 259 260/* Relink a new node in place of an old node in the list. */ 261static inline void 262relink_imm_use (ssa_use_operand_t *node, ssa_use_operand_t *old) 263{ 264 /* The node one had better be in the same list. */ 265 gcc_checking_assert (*(old->use) == *(node->use)); 266 node->prev = old->prev; 267 node->next = old->next; 268 if (old->prev) 269 { 270 old->prev->next = node; 271 old->next->prev = node; 272 /* Remove the old node from the list. */ 273 old->prev = NULL; 274 } 275} 276 277/* Relink ssa_imm_use node LINKNODE into the chain for OLD, with use occurring 278 in STMT. */ 279static inline void 280relink_imm_use_stmt (ssa_use_operand_t *linknode, ssa_use_operand_t *old, 281 gimple stmt) 282{ 283 if (stmt) 284 relink_imm_use (linknode, old); 285 else 286 link_imm_use (linknode, NULL); 287 linknode->loc.stmt = stmt; 288} 289 290 291/* Return true is IMM has reached the end of the immediate use list. */ 292static inline bool 293end_readonly_imm_use_p (const imm_use_iterator *imm) 294{ 295 return (imm->imm_use == imm->end_p); 296} 297 298/* Initialize iterator IMM to process the list for VAR. */ 299static inline use_operand_p 300first_readonly_imm_use (imm_use_iterator *imm, tree var) 301{ 302 imm->end_p = &(SSA_NAME_IMM_USE_NODE (var)); 303 imm->imm_use = imm->end_p->next; 304#ifdef ENABLE_CHECKING 305 imm->iter_node.next = imm->imm_use->next; 306#endif 307 if (end_readonly_imm_use_p (imm)) 308 return NULL_USE_OPERAND_P; 309 return imm->imm_use; 310} 311 312/* Bump IMM to the next use in the list. */ 313static inline use_operand_p 314next_readonly_imm_use (imm_use_iterator *imm) 315{ 316 use_operand_p old = imm->imm_use; 317 318#ifdef ENABLE_CHECKING 319 /* If this assertion fails, it indicates the 'next' pointer has changed 320 since the last bump. This indicates that the list is being modified 321 via stmt changes, or SET_USE, or somesuch thing, and you need to be 322 using the SAFE version of the iterator. */ 323 gcc_assert (imm->iter_node.next == old->next); 324 imm->iter_node.next = old->next->next; 325#endif 326 327 imm->imm_use = old->next; 328 if (end_readonly_imm_use_p (imm)) 329 return NULL_USE_OPERAND_P; 330 return imm->imm_use; 331} 332 333/* tree-cfg.c */ 334extern bool has_zero_uses_1 (const ssa_use_operand_t *head); 335extern bool single_imm_use_1 (const ssa_use_operand_t *head, 336 use_operand_p *use_p, gimple *stmt); 337 338/* Return true if VAR has no nondebug uses. */ 339static inline bool 340has_zero_uses (const_tree var) 341{ 342 const ssa_use_operand_t *const ptr = &(SSA_NAME_IMM_USE_NODE (var)); 343 344 /* A single use_operand means there is no items in the list. */ 345 if (ptr == ptr->next) 346 return true; 347 348 /* If there are debug stmts, we have to look at each use and see 349 whether there are any nondebug uses. */ 350 if (!MAY_HAVE_DEBUG_STMTS) 351 return false; 352 353 return has_zero_uses_1 (ptr); 354} 355 356/* Return true if VAR has a single nondebug use. */ 357static inline bool 358has_single_use (const_tree var) 359{ 360 const ssa_use_operand_t *const ptr = &(SSA_NAME_IMM_USE_NODE (var)); 361 362 /* If there aren't any uses whatsoever, we're done. */ 363 if (ptr == ptr->next) 364 return false; 365 366 /* If there's a single use, check that it's not a debug stmt. */ 367 if (ptr == ptr->next->next) 368 return !is_gimple_debug (USE_STMT (ptr->next)); 369 370 /* If there are debug stmts, we have to look at each of them. */ 371 if (!MAY_HAVE_DEBUG_STMTS) 372 return false; 373 374 return single_imm_use_1 (ptr, NULL, NULL); 375} 376 377 378/* If VAR has only a single immediate nondebug use, return true, and 379 set USE_P and STMT to the use pointer and stmt of occurrence. */ 380static inline bool 381single_imm_use (const_tree var, use_operand_p *use_p, gimple *stmt) 382{ 383 const ssa_use_operand_t *const ptr = &(SSA_NAME_IMM_USE_NODE (var)); 384 385 /* If there aren't any uses whatsoever, we're done. */ 386 if (ptr == ptr->next) 387 { 388 return_false: 389 *use_p = NULL_USE_OPERAND_P; 390 *stmt = NULL; 391 return false; 392 } 393 394 /* If there's a single use, check that it's not a debug stmt. */ 395 if (ptr == ptr->next->next) 396 { 397 if (!is_gimple_debug (USE_STMT (ptr->next))) 398 { 399 *use_p = ptr->next; 400 *stmt = ptr->next->loc.stmt; 401 return true; 402 } 403 else 404 goto return_false; 405 } 406 407 /* If there are debug stmts, we have to look at each of them. */ 408 if (!MAY_HAVE_DEBUG_STMTS) 409 goto return_false; 410 411 return single_imm_use_1 (ptr, use_p, stmt); 412} 413 414/* Return the number of nondebug immediate uses of VAR. */ 415static inline unsigned int 416num_imm_uses (const_tree var) 417{ 418 const ssa_use_operand_t *const start = &(SSA_NAME_IMM_USE_NODE (var)); 419 const ssa_use_operand_t *ptr; 420 unsigned int num = 0; 421 422 if (!MAY_HAVE_DEBUG_STMTS) 423 for (ptr = start->next; ptr != start; ptr = ptr->next) 424 num++; 425 else 426 for (ptr = start->next; ptr != start; ptr = ptr->next) 427 if (!is_gimple_debug (USE_STMT (ptr))) 428 num++; 429 430 return num; 431} 432 433/* Return the tree pointed-to by USE. */ 434static inline tree 435get_use_from_ptr (use_operand_p use) 436{ 437 return *(use->use); 438} 439 440/* Return the tree pointed-to by DEF. */ 441static inline tree 442get_def_from_ptr (def_operand_p def) 443{ 444 return *def; 445} 446 447/* Return a use_operand_p pointer for argument I of PHI node GS. */ 448 449static inline use_operand_p 450gimple_phi_arg_imm_use_ptr (gimple gs, int i) 451{ 452 return &gimple_phi_arg (gs, i)->imm_use; 453} 454 455/* Return the tree operand for argument I of PHI node GS. */ 456 457static inline tree 458gimple_phi_arg_def (gimple gs, size_t index) 459{ 460 struct phi_arg_d *pd = gimple_phi_arg (gs, index); 461 return get_use_from_ptr (&pd->imm_use); 462} 463 464/* Return a pointer to the tree operand for argument I of PHI node GS. */ 465 466static inline tree * 467gimple_phi_arg_def_ptr (gimple gs, size_t index) 468{ 469 return &gimple_phi_arg (gs, index)->def; 470} 471 472/* Return the edge associated with argument I of phi node GS. */ 473 474static inline edge 475gimple_phi_arg_edge (gimple gs, size_t i) 476{ 477 return EDGE_PRED (gimple_bb (gs), i); 478} 479 480/* Return the source location of gimple argument I of phi node GS. */ 481 482static inline source_location 483gimple_phi_arg_location (gimple gs, size_t i) 484{ 485 return gimple_phi_arg (gs, i)->locus; 486} 487 488/* Return the source location of the argument on edge E of phi node GS. */ 489 490static inline source_location 491gimple_phi_arg_location_from_edge (gimple gs, edge e) 492{ 493 return gimple_phi_arg (gs, e->dest_idx)->locus; 494} 495 496/* Set the source location of gimple argument I of phi node GS to LOC. */ 497 498static inline void 499gimple_phi_arg_set_location (gimple gs, size_t i, source_location loc) 500{ 501 gimple_phi_arg (gs, i)->locus = loc; 502} 503 504/* Return TRUE if argument I of phi node GS has a location record. */ 505 506static inline bool 507gimple_phi_arg_has_location (gimple gs, size_t i) 508{ 509 return gimple_phi_arg_location (gs, i) != UNKNOWN_LOCATION; 510} 511 512 513/* Return the PHI nodes for basic block BB, or NULL if there are no 514 PHI nodes. */ 515static inline gimple_seq 516phi_nodes (const_basic_block bb) 517{ 518 gcc_checking_assert (!(bb->flags & BB_RTL)); 519 if (!bb->il.gimple) 520 return NULL; 521 return bb->il.gimple->phi_nodes; 522} 523 524/* Set PHI nodes of a basic block BB to SEQ. */ 525 526static inline void 527set_phi_nodes (basic_block bb, gimple_seq seq) 528{ 529 gimple_stmt_iterator i; 530 531 gcc_checking_assert (!(bb->flags & BB_RTL)); 532 bb->il.gimple->phi_nodes = seq; 533 if (seq) 534 for (i = gsi_start (seq); !gsi_end_p (i); gsi_next (&i)) 535 gimple_set_bb (gsi_stmt (i), bb); 536} 537 538/* Return the phi argument which contains the specified use. */ 539 540static inline int 541phi_arg_index_from_use (use_operand_p use) 542{ 543 struct phi_arg_d *element, *root; 544 size_t index; 545 gimple phi; 546 547 /* Since the use is the first thing in a PHI argument element, we can 548 calculate its index based on casting it to an argument, and performing 549 pointer arithmetic. */ 550 551 phi = USE_STMT (use); 552 553 element = (struct phi_arg_d *)use; 554 root = gimple_phi_arg (phi, 0); 555 index = element - root; 556 557 /* Make sure the calculation doesn't have any leftover bytes. If it does, 558 then imm_use is likely not the first element in phi_arg_d. */ 559 gcc_checking_assert ((((char *)element - (char *)root) 560 % sizeof (struct phi_arg_d)) == 0 561 && index < gimple_phi_capacity (phi)); 562 563 return index; 564} 565 566/* Mark VAR as used, so that it'll be preserved during rtl expansion. */ 567 568static inline void 569set_is_used (tree var) 570{ 571 var_ann_t ann = get_var_ann (var); 572 ann->used = true; 573} 574 575/* Clear VAR's used flag. */ 576 577static inline void 578clear_is_used (tree var) 579{ 580 var_ann_t ann = var_ann (var); 581 ann->used = false; 582} 583 584/* Return true if VAR is marked as used. */ 585 586static inline bool 587is_used_p (tree var) 588{ 589 var_ann_t ann = var_ann (var); 590 return ann->used; 591} 592 593/* Return true if T (assumed to be a DECL) is a global variable. 594 A variable is considered global if its storage is not automatic. */ 595 596static inline bool 597is_global_var (const_tree t) 598{ 599 return (TREE_STATIC (t) || DECL_EXTERNAL (t)); 600} 601 602 603/* Return true if VAR may be aliased. A variable is considered as 604 maybe aliased if it has its address taken by the local TU 605 or possibly by another TU and might be modified through a pointer. */ 606 607static inline bool 608may_be_aliased (const_tree var) 609{ 610 return (TREE_CODE (var) != CONST_DECL 611 && !((TREE_STATIC (var) || TREE_PUBLIC (var) || DECL_EXTERNAL (var)) 612 && TREE_READONLY (var) 613 && !TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (var))) 614 && (TREE_PUBLIC (var) 615 || DECL_EXTERNAL (var) 616 || TREE_ADDRESSABLE (var))); 617} 618 619 620/* PHI nodes should contain only ssa_names and invariants. A test 621 for ssa_name is definitely simpler; don't let invalid contents 622 slip in in the meantime. */ 623 624static inline bool 625phi_ssa_name_p (const_tree t) 626{ 627 if (TREE_CODE (t) == SSA_NAME) 628 return true; 629 gcc_checking_assert (is_gimple_min_invariant (t)); 630 return false; 631} 632 633 634/* Returns the loop of the statement STMT. */ 635 636static inline struct loop * 637loop_containing_stmt (gimple stmt) 638{ 639 basic_block bb = gimple_bb (stmt); 640 if (!bb) 641 return NULL; 642 643 return bb->loop_father; 644} 645 646 647/* ----------------------------------------------------------------------- */ 648 649/* The following set of routines are used to iterator over various type of 650 SSA operands. */ 651 652/* Return true if PTR is finished iterating. */ 653static inline bool 654op_iter_done (const ssa_op_iter *ptr) 655{ 656 return ptr->done; 657} 658 659/* Get the next iterator use value for PTR. */ 660static inline use_operand_p 661op_iter_next_use (ssa_op_iter *ptr) 662{ 663 use_operand_p use_p; 664 gcc_checking_assert (ptr->iter_type == ssa_op_iter_use); 665 if (ptr->uses) 666 { 667 use_p = USE_OP_PTR (ptr->uses); 668 ptr->uses = ptr->uses->next; 669 return use_p; 670 } 671 if (ptr->phi_i < ptr->num_phi) 672 { 673 return PHI_ARG_DEF_PTR (ptr->phi_stmt, (ptr->phi_i)++); 674 } 675 ptr->done = true; 676 return NULL_USE_OPERAND_P; 677} 678 679/* Get the next iterator def value for PTR. */ 680static inline def_operand_p 681op_iter_next_def (ssa_op_iter *ptr) 682{ 683 def_operand_p def_p; 684 gcc_checking_assert (ptr->iter_type == ssa_op_iter_def); 685 if (ptr->defs) 686 { 687 def_p = DEF_OP_PTR (ptr->defs); 688 ptr->defs = ptr->defs->next; 689 return def_p; 690 } 691 ptr->done = true; 692 return NULL_DEF_OPERAND_P; 693} 694 695/* Get the next iterator tree value for PTR. */ 696static inline tree 697op_iter_next_tree (ssa_op_iter *ptr) 698{ 699 tree val; 700 gcc_checking_assert (ptr->iter_type == ssa_op_iter_tree); 701 if (ptr->uses) 702 { 703 val = USE_OP (ptr->uses); 704 ptr->uses = ptr->uses->next; 705 return val; 706 } 707 if (ptr->defs) 708 { 709 val = DEF_OP (ptr->defs); 710 ptr->defs = ptr->defs->next; 711 return val; 712 } 713 714 ptr->done = true; 715 return NULL_TREE; 716 717} 718 719 720/* This functions clears the iterator PTR, and marks it done. This is normally 721 used to prevent warnings in the compile about might be uninitialized 722 components. */ 723 724static inline void 725clear_and_done_ssa_iter (ssa_op_iter *ptr) 726{ 727 ptr->defs = NULL; 728 ptr->uses = NULL; 729 ptr->iter_type = ssa_op_iter_none; 730 ptr->phi_i = 0; 731 ptr->num_phi = 0; 732 ptr->phi_stmt = NULL; 733 ptr->done = true; 734} 735 736/* Initialize the iterator PTR to the virtual defs in STMT. */ 737static inline void 738op_iter_init (ssa_op_iter *ptr, gimple stmt, int flags) 739{ 740 /* We do not support iterating over virtual defs or uses without 741 iterating over defs or uses at the same time. */ 742 gcc_checking_assert ((!(flags & SSA_OP_VDEF) || (flags & SSA_OP_DEF)) 743 && (!(flags & SSA_OP_VUSE) || (flags & SSA_OP_USE))); 744 ptr->defs = (flags & (SSA_OP_DEF|SSA_OP_VDEF)) ? gimple_def_ops (stmt) : NULL; 745 if (!(flags & SSA_OP_VDEF) 746 && ptr->defs 747 && gimple_vdef (stmt) != NULL_TREE) 748 ptr->defs = ptr->defs->next; 749 ptr->uses = (flags & (SSA_OP_USE|SSA_OP_VUSE)) ? gimple_use_ops (stmt) : NULL; 750 if (!(flags & SSA_OP_VUSE) 751 && ptr->uses 752 && gimple_vuse (stmt) != NULL_TREE) 753 ptr->uses = ptr->uses->next; 754 ptr->done = false; 755 756 ptr->phi_i = 0; 757 ptr->num_phi = 0; 758 ptr->phi_stmt = NULL; 759} 760 761/* Initialize iterator PTR to the use operands in STMT based on FLAGS. Return 762 the first use. */ 763static inline use_operand_p 764op_iter_init_use (ssa_op_iter *ptr, gimple stmt, int flags) 765{ 766 gcc_checking_assert ((flags & SSA_OP_ALL_DEFS) == 0 767 && (flags & SSA_OP_USE)); 768 op_iter_init (ptr, stmt, flags); 769 ptr->iter_type = ssa_op_iter_use; 770 return op_iter_next_use (ptr); 771} 772 773/* Initialize iterator PTR to the def operands in STMT based on FLAGS. Return 774 the first def. */ 775static inline def_operand_p 776op_iter_init_def (ssa_op_iter *ptr, gimple stmt, int flags) 777{ 778 gcc_checking_assert ((flags & SSA_OP_ALL_USES) == 0 779 && (flags & SSA_OP_DEF)); 780 op_iter_init (ptr, stmt, flags); 781 ptr->iter_type = ssa_op_iter_def; 782 return op_iter_next_def (ptr); 783} 784 785/* Initialize iterator PTR to the operands in STMT based on FLAGS. Return 786 the first operand as a tree. */ 787static inline tree 788op_iter_init_tree (ssa_op_iter *ptr, gimple stmt, int flags) 789{ 790 op_iter_init (ptr, stmt, flags); 791 ptr->iter_type = ssa_op_iter_tree; 792 return op_iter_next_tree (ptr); 793} 794 795 796/* If there is a single operand in STMT matching FLAGS, return it. Otherwise 797 return NULL. */ 798static inline tree 799single_ssa_tree_operand (gimple stmt, int flags) 800{ 801 tree var; 802 ssa_op_iter iter; 803 804 var = op_iter_init_tree (&iter, stmt, flags); 805 if (op_iter_done (&iter)) 806 return NULL_TREE; 807 op_iter_next_tree (&iter); 808 if (op_iter_done (&iter)) 809 return var; 810 return NULL_TREE; 811} 812 813 814/* If there is a single operand in STMT matching FLAGS, return it. Otherwise 815 return NULL. */ 816static inline use_operand_p 817single_ssa_use_operand (gimple stmt, int flags) 818{ 819 use_operand_p var; 820 ssa_op_iter iter; 821 822 var = op_iter_init_use (&iter, stmt, flags); 823 if (op_iter_done (&iter)) 824 return NULL_USE_OPERAND_P; 825 op_iter_next_use (&iter); 826 if (op_iter_done (&iter)) 827 return var; 828 return NULL_USE_OPERAND_P; 829} 830 831 832 833/* If there is a single operand in STMT matching FLAGS, return it. Otherwise 834 return NULL. */ 835static inline def_operand_p 836single_ssa_def_operand (gimple stmt, int flags) 837{ 838 def_operand_p var; 839 ssa_op_iter iter; 840 841 var = op_iter_init_def (&iter, stmt, flags); 842 if (op_iter_done (&iter)) 843 return NULL_DEF_OPERAND_P; 844 op_iter_next_def (&iter); 845 if (op_iter_done (&iter)) 846 return var; 847 return NULL_DEF_OPERAND_P; 848} 849 850 851/* Return true if there are zero operands in STMT matching the type 852 given in FLAGS. */ 853static inline bool 854zero_ssa_operands (gimple stmt, int flags) 855{ 856 ssa_op_iter iter; 857 858 op_iter_init_tree (&iter, stmt, flags); 859 return op_iter_done (&iter); 860} 861 862 863/* Return the number of operands matching FLAGS in STMT. */ 864static inline int 865num_ssa_operands (gimple stmt, int flags) 866{ 867 ssa_op_iter iter; 868 tree t; 869 int num = 0; 870 871 FOR_EACH_SSA_TREE_OPERAND (t, stmt, iter, flags) 872 num++; 873 return num; 874} 875 876 877/* Delink all immediate_use information for STMT. */ 878static inline void 879delink_stmt_imm_use (gimple stmt) 880{ 881 ssa_op_iter iter; 882 use_operand_p use_p; 883 884 if (ssa_operands_active ()) 885 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES) 886 delink_imm_use (use_p); 887} 888 889 890/* If there is a single DEF in the PHI node which matches FLAG, return it. 891 Otherwise return NULL_DEF_OPERAND_P. */ 892static inline tree 893single_phi_def (gimple stmt, int flags) 894{ 895 tree def = PHI_RESULT (stmt); 896 if ((flags & SSA_OP_DEF) && is_gimple_reg (def)) 897 return def; 898 if ((flags & SSA_OP_VIRTUAL_DEFS) && !is_gimple_reg (def)) 899 return def; 900 return NULL_TREE; 901} 902 903/* Initialize the iterator PTR for uses matching FLAGS in PHI. FLAGS should 904 be either SSA_OP_USES or SSA_OP_VIRTUAL_USES. */ 905static inline use_operand_p 906op_iter_init_phiuse (ssa_op_iter *ptr, gimple phi, int flags) 907{ 908 tree phi_def = gimple_phi_result (phi); 909 int comp; 910 911 clear_and_done_ssa_iter (ptr); 912 ptr->done = false; 913 914 gcc_checking_assert ((flags & (SSA_OP_USE | SSA_OP_VIRTUAL_USES)) != 0); 915 916 comp = (is_gimple_reg (phi_def) ? SSA_OP_USE : SSA_OP_VIRTUAL_USES); 917 918 /* If the PHI node doesn't the operand type we care about, we're done. */ 919 if ((flags & comp) == 0) 920 { 921 ptr->done = true; 922 return NULL_USE_OPERAND_P; 923 } 924 925 ptr->phi_stmt = phi; 926 ptr->num_phi = gimple_phi_num_args (phi); 927 ptr->iter_type = ssa_op_iter_use; 928 return op_iter_next_use (ptr); 929} 930 931 932/* Start an iterator for a PHI definition. */ 933 934static inline def_operand_p 935op_iter_init_phidef (ssa_op_iter *ptr, gimple phi, int flags) 936{ 937 tree phi_def = PHI_RESULT (phi); 938 int comp; 939 940 clear_and_done_ssa_iter (ptr); 941 ptr->done = false; 942 943 gcc_checking_assert ((flags & (SSA_OP_DEF | SSA_OP_VIRTUAL_DEFS)) != 0); 944 945 comp = (is_gimple_reg (phi_def) ? SSA_OP_DEF : SSA_OP_VIRTUAL_DEFS); 946 947 /* If the PHI node doesn't have the operand type we care about, 948 we're done. */ 949 if ((flags & comp) == 0) 950 { 951 ptr->done = true; 952 return NULL_DEF_OPERAND_P; 953 } 954 955 ptr->iter_type = ssa_op_iter_def; 956 /* The first call to op_iter_next_def will terminate the iterator since 957 all the fields are NULL. Simply return the result here as the first and 958 therefore only result. */ 959 return PHI_RESULT_PTR (phi); 960} 961 962/* Return true is IMM has reached the end of the immediate use stmt list. */ 963 964static inline bool 965end_imm_use_stmt_p (const imm_use_iterator *imm) 966{ 967 return (imm->imm_use == imm->end_p); 968} 969 970/* Finished the traverse of an immediate use stmt list IMM by removing the 971 placeholder node from the list. */ 972 973static inline void 974end_imm_use_stmt_traverse (imm_use_iterator *imm) 975{ 976 delink_imm_use (&(imm->iter_node)); 977} 978 979/* Immediate use traversal of uses within a stmt require that all the 980 uses on a stmt be sequentially listed. This routine is used to build up 981 this sequential list by adding USE_P to the end of the current list 982 currently delimited by HEAD and LAST_P. The new LAST_P value is 983 returned. */ 984 985static inline use_operand_p 986move_use_after_head (use_operand_p use_p, use_operand_p head, 987 use_operand_p last_p) 988{ 989 gcc_checking_assert (USE_FROM_PTR (use_p) == USE_FROM_PTR (head)); 990 /* Skip head when we find it. */ 991 if (use_p != head) 992 { 993 /* If use_p is already linked in after last_p, continue. */ 994 if (last_p->next == use_p) 995 last_p = use_p; 996 else 997 { 998 /* Delink from current location, and link in at last_p. */ 999 delink_imm_use (use_p); 1000 link_imm_use_to_list (use_p, last_p); 1001 last_p = use_p; 1002 } 1003 } 1004 return last_p; 1005} 1006 1007 1008/* This routine will relink all uses with the same stmt as HEAD into the list 1009 immediately following HEAD for iterator IMM. */ 1010 1011static inline void 1012link_use_stmts_after (use_operand_p head, imm_use_iterator *imm) 1013{ 1014 use_operand_p use_p; 1015 use_operand_p last_p = head; 1016 gimple head_stmt = USE_STMT (head); 1017 tree use = USE_FROM_PTR (head); 1018 ssa_op_iter op_iter; 1019 int flag; 1020 1021 /* Only look at virtual or real uses, depending on the type of HEAD. */ 1022 flag = (is_gimple_reg (use) ? SSA_OP_USE : SSA_OP_VIRTUAL_USES); 1023 1024 if (gimple_code (head_stmt) == GIMPLE_PHI) 1025 { 1026 FOR_EACH_PHI_ARG (use_p, head_stmt, op_iter, flag) 1027 if (USE_FROM_PTR (use_p) == use) 1028 last_p = move_use_after_head (use_p, head, last_p); 1029 } 1030 else 1031 { 1032 if (flag == SSA_OP_USE) 1033 { 1034 FOR_EACH_SSA_USE_OPERAND (use_p, head_stmt, op_iter, flag) 1035 if (USE_FROM_PTR (use_p) == use) 1036 last_p = move_use_after_head (use_p, head, last_p); 1037 } 1038 else if ((use_p = gimple_vuse_op (head_stmt)) != NULL_USE_OPERAND_P) 1039 { 1040 if (USE_FROM_PTR (use_p) == use) 1041 last_p = move_use_after_head (use_p, head, last_p); 1042 } 1043 } 1044 /* Link iter node in after last_p. */ 1045 if (imm->iter_node.prev != NULL) 1046 delink_imm_use (&imm->iter_node); 1047 link_imm_use_to_list (&(imm->iter_node), last_p); 1048} 1049 1050/* Initialize IMM to traverse over uses of VAR. Return the first statement. */ 1051static inline gimple 1052first_imm_use_stmt (imm_use_iterator *imm, tree var) 1053{ 1054 imm->end_p = &(SSA_NAME_IMM_USE_NODE (var)); 1055 imm->imm_use = imm->end_p->next; 1056 imm->next_imm_name = NULL_USE_OPERAND_P; 1057 1058 /* iter_node is used as a marker within the immediate use list to indicate 1059 where the end of the current stmt's uses are. Initialize it to NULL 1060 stmt and use, which indicates a marker node. */ 1061 imm->iter_node.prev = NULL_USE_OPERAND_P; 1062 imm->iter_node.next = NULL_USE_OPERAND_P; 1063 imm->iter_node.loc.stmt = NULL; 1064 imm->iter_node.use = NULL; 1065 1066 if (end_imm_use_stmt_p (imm)) 1067 return NULL; 1068 1069 link_use_stmts_after (imm->imm_use, imm); 1070 1071 return USE_STMT (imm->imm_use); 1072} 1073 1074/* Bump IMM to the next stmt which has a use of var. */ 1075 1076static inline gimple 1077next_imm_use_stmt (imm_use_iterator *imm) 1078{ 1079 imm->imm_use = imm->iter_node.next; 1080 if (end_imm_use_stmt_p (imm)) 1081 { 1082 if (imm->iter_node.prev != NULL) 1083 delink_imm_use (&imm->iter_node); 1084 return NULL; 1085 } 1086 1087 link_use_stmts_after (imm->imm_use, imm); 1088 return USE_STMT (imm->imm_use); 1089} 1090 1091/* This routine will return the first use on the stmt IMM currently refers 1092 to. */ 1093 1094static inline use_operand_p 1095first_imm_use_on_stmt (imm_use_iterator *imm) 1096{ 1097 imm->next_imm_name = imm->imm_use->next; 1098 return imm->imm_use; 1099} 1100 1101/* Return TRUE if the last use on the stmt IMM refers to has been visited. */ 1102 1103static inline bool 1104end_imm_use_on_stmt_p (const imm_use_iterator *imm) 1105{ 1106 return (imm->imm_use == &(imm->iter_node)); 1107} 1108 1109/* Bump to the next use on the stmt IMM refers to, return NULL if done. */ 1110 1111static inline use_operand_p 1112next_imm_use_on_stmt (imm_use_iterator *imm) 1113{ 1114 imm->imm_use = imm->next_imm_name; 1115 if (end_imm_use_on_stmt_p (imm)) 1116 return NULL_USE_OPERAND_P; 1117 else 1118 { 1119 imm->next_imm_name = imm->imm_use->next; 1120 return imm->imm_use; 1121 } 1122} 1123 1124/* Return true if VAR cannot be modified by the program. */ 1125 1126static inline bool 1127unmodifiable_var_p (const_tree var) 1128{ 1129 if (TREE_CODE (var) == SSA_NAME) 1130 var = SSA_NAME_VAR (var); 1131 1132 return TREE_READONLY (var) && (TREE_STATIC (var) || DECL_EXTERNAL (var)); 1133} 1134 1135/* Return true if REF, a handled component reference, has an ARRAY_REF 1136 somewhere in it. */ 1137 1138static inline bool 1139ref_contains_array_ref (const_tree ref) 1140{ 1141 gcc_checking_assert (handled_component_p (ref)); 1142 1143 do { 1144 if (TREE_CODE (ref) == ARRAY_REF) 1145 return true; 1146 ref = TREE_OPERAND (ref, 0); 1147 } while (handled_component_p (ref)); 1148 1149 return false; 1150} 1151 1152/* Return true if REF has an VIEW_CONVERT_EXPR somewhere in it. */ 1153 1154static inline bool 1155contains_view_convert_expr_p (const_tree ref) 1156{ 1157 while (handled_component_p (ref)) 1158 { 1159 if (TREE_CODE (ref) == VIEW_CONVERT_EXPR) 1160 return true; 1161 ref = TREE_OPERAND (ref, 0); 1162 } 1163 1164 return false; 1165} 1166 1167/* Return true, if the two ranges [POS1, SIZE1] and [POS2, SIZE2] 1168 overlap. SIZE1 and/or SIZE2 can be (unsigned)-1 in which case the 1169 range is open-ended. Otherwise return false. */ 1170 1171static inline bool 1172ranges_overlap_p (unsigned HOST_WIDE_INT pos1, 1173 unsigned HOST_WIDE_INT size1, 1174 unsigned HOST_WIDE_INT pos2, 1175 unsigned HOST_WIDE_INT size2) 1176{ 1177 if (pos1 >= pos2 1178 && (size2 == (unsigned HOST_WIDE_INT)-1 1179 || pos1 < (pos2 + size2))) 1180 return true; 1181 if (pos2 >= pos1 1182 && (size1 == (unsigned HOST_WIDE_INT)-1 1183 || pos2 < (pos1 + size1))) 1184 return true; 1185 1186 return false; 1187} 1188 1189/* Accessor to tree-ssa-operands.c caches. */ 1190static inline struct ssa_operands * 1191gimple_ssa_operands (const struct function *fun) 1192{ 1193 return &fun->gimple_df->ssa_operands; 1194} 1195 1196/* Given an edge_var_map V, return the PHI arg definition. */ 1197 1198static inline tree 1199redirect_edge_var_map_def (edge_var_map *v) 1200{ 1201 return v->def; 1202} 1203 1204/* Given an edge_var_map V, return the PHI result. */ 1205 1206static inline tree 1207redirect_edge_var_map_result (edge_var_map *v) 1208{ 1209 return v->result; 1210} 1211 1212/* Given an edge_var_map V, return the PHI arg location. */ 1213 1214static inline source_location 1215redirect_edge_var_map_location (edge_var_map *v) 1216{ 1217 return v->locus; 1218} 1219 1220 1221/* Return an SSA_NAME node for variable VAR defined in statement STMT 1222 in function cfun. */ 1223 1224static inline tree 1225make_ssa_name (tree var, gimple stmt) 1226{ 1227 return make_ssa_name_fn (cfun, var, stmt); 1228} 1229 1230#endif /* _TREE_FLOW_INLINE_H */ 1231