1 /* Inline functions for tree-flow.h
2 Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
3 Contributed by Diego Novillo <dnovillo@redhat.com>
5 This file is part of GCC.
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 2, or (at your option)
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.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
22 #ifndef _TREE_FLOW_INLINE_H
23 #define _TREE_FLOW_INLINE_H 1
25 /* Inline functions for manipulating various data structures defined in
26 tree-flow.h. See tree-flow.h for documentation. */
28 /* Return the variable annotation for T, which must be a _DECL node.
29 Return NULL if the variable annotation doesn't already exist. */
30 static inline var_ann_t
34 gcc_assert (DECL_P (t));
35 gcc_assert (!t->common.ann || t->common.ann->common.type == VAR_ANN);
37 return (var_ann_t) t->common.ann;
40 /* Return the variable annotation for T, which must be a _DECL node.
41 Create the variable annotation if it doesn't exist. */
42 static inline var_ann_t
43 get_var_ann (tree var)
45 var_ann_t ann = var_ann (var);
46 return (ann) ? ann : create_var_ann (var);
49 /* Return the statement annotation for T, which must be a statement
50 node. Return NULL if the statement annotation doesn't exist. */
51 static inline stmt_ann_t
54 #ifdef ENABLE_CHECKING
55 gcc_assert (is_gimple_stmt (t));
57 return (stmt_ann_t) t->common.ann;
60 /* Return the statement annotation for T, which must be a statement
61 node. Create the statement annotation if it doesn't exist. */
62 static inline stmt_ann_t
63 get_stmt_ann (tree stmt)
65 stmt_ann_t ann = stmt_ann (stmt);
66 return (ann) ? ann : create_stmt_ann (stmt);
70 /* Return the annotation type for annotation ANN. */
71 static inline enum tree_ann_type
72 ann_type (tree_ann_t ann)
74 return ann->common.type;
77 /* Return the basic block for statement T. */
78 static inline basic_block
83 if (TREE_CODE (t) == PHI_NODE)
87 return ann ? ann->bb : NULL;
90 /* Return the may_aliases varray for variable VAR, or NULL if it has
92 static inline varray_type
93 may_aliases (tree var)
95 var_ann_t ann = var_ann (var);
96 return ann ? ann->may_aliases : NULL;
99 /* Return the line number for EXPR, or return -1 if we have no line
100 number information for it. */
102 get_lineno (tree expr)
104 if (expr == NULL_TREE)
107 if (TREE_CODE (expr) == COMPOUND_EXPR)
108 expr = TREE_OPERAND (expr, 0);
110 if (! EXPR_HAS_LOCATION (expr))
113 return EXPR_LINENO (expr);
116 /* Return the file name for EXPR, or return "???" if we have no
117 filename information. */
118 static inline const char *
119 get_filename (tree expr)
121 const char *filename;
122 if (expr == NULL_TREE)
125 if (TREE_CODE (expr) == COMPOUND_EXPR)
126 expr = TREE_OPERAND (expr, 0);
128 if (EXPR_HAS_LOCATION (expr) && (filename = EXPR_FILENAME (expr)))
134 /* Return true if T is a noreturn call. */
136 noreturn_call_p (tree t)
138 tree call = get_call_expr_in (t);
139 return call != 0 && (call_expr_flags (call) & ECF_NORETURN) != 0;
142 /* Mark statement T as modified. */
144 mark_stmt_modified (tree t)
147 if (TREE_CODE (t) == PHI_NODE)
152 ann = create_stmt_ann (t);
153 else if (noreturn_call_p (t))
154 VEC_safe_push (tree, gc, modified_noreturn_calls, t);
158 /* Mark statement T as modified, and update it. */
162 if (TREE_CODE (t) == PHI_NODE)
164 mark_stmt_modified (t);
165 update_stmt_operands (t);
169 update_stmt_if_modified (tree t)
171 if (stmt_modified_p (t))
172 update_stmt_operands (t);
175 /* Return true if T is marked as modified, false otherwise. */
177 stmt_modified_p (tree t)
179 stmt_ann_t ann = stmt_ann (t);
181 /* Note that if the statement doesn't yet have an annotation, we consider it
182 modified. This will force the next call to update_stmt_operands to scan
184 return ann ? ann->modified : true;
187 /* Delink an immediate_uses node from its chain. */
189 delink_imm_use (ssa_use_operand_t *linknode)
191 /* Return if this node is not in a list. */
192 if (linknode->prev == NULL)
195 linknode->prev->next = linknode->next;
196 linknode->next->prev = linknode->prev;
197 linknode->prev = NULL;
198 linknode->next = NULL;
201 /* Link ssa_imm_use node LINKNODE into the chain for LIST. */
203 link_imm_use_to_list (ssa_use_operand_t *linknode, ssa_use_operand_t *list)
205 /* Link the new node at the head of the list. If we are in the process of
206 traversing the list, we won't visit any new nodes added to it. */
207 linknode->prev = list;
208 linknode->next = list->next;
209 list->next->prev = linknode;
210 list->next = linknode;
213 /* Link ssa_imm_use node LINKNODE into the chain for DEF. */
215 link_imm_use (ssa_use_operand_t *linknode, tree def)
217 ssa_use_operand_t *root;
219 if (!def || TREE_CODE (def) != SSA_NAME)
220 linknode->prev = NULL;
223 root = &(SSA_NAME_IMM_USE_NODE (def));
224 #ifdef ENABLE_CHECKING
226 gcc_assert (*(linknode->use) == def);
228 link_imm_use_to_list (linknode, root);
232 /* Set the value of a use pointed by USE to VAL. */
234 set_ssa_use_from_ptr (use_operand_p use, tree val)
236 delink_imm_use (use);
238 link_imm_use (use, val);
241 /* Link ssa_imm_use node LINKNODE into the chain for DEF, with use occurring
244 link_imm_use_stmt (ssa_use_operand_t *linknode, tree def, tree stmt)
247 link_imm_use (linknode, def);
249 link_imm_use (linknode, NULL);
250 linknode->stmt = stmt;
253 /* Relink a new node in place of an old node in the list. */
255 relink_imm_use (ssa_use_operand_t *node, ssa_use_operand_t *old)
257 /* The node one had better be in the same list. */
258 gcc_assert (*(old->use) == *(node->use));
259 node->prev = old->prev;
260 node->next = old->next;
263 old->prev->next = node;
264 old->next->prev = node;
265 /* Remove the old node from the list. */
270 /* Relink ssa_imm_use node LINKNODE into the chain for OLD, with use occurring
273 relink_imm_use_stmt (ssa_use_operand_t *linknode, ssa_use_operand_t *old, tree stmt)
276 relink_imm_use (linknode, old);
278 link_imm_use (linknode, NULL);
279 linknode->stmt = stmt;
282 /* Finished the traverse of an immediate use list IMM by removing it from
285 end_safe_imm_use_traverse (imm_use_iterator *imm)
287 delink_imm_use (&(imm->iter_node));
290 /* Return true if IMM is at the end of the list. */
292 end_safe_imm_use_p (imm_use_iterator *imm)
294 return (imm->imm_use == imm->end_p);
297 /* Initialize iterator IMM to process the list for VAR. */
298 static inline use_operand_p
299 first_safe_imm_use (imm_use_iterator *imm, tree var)
301 /* Set up and link the iterator node into the linked list for VAR. */
302 imm->iter_node.use = NULL;
303 imm->iter_node.stmt = NULL_TREE;
304 imm->end_p = &(SSA_NAME_IMM_USE_NODE (var));
305 /* Check if there are 0 elements. */
306 if (imm->end_p->next == imm->end_p)
308 imm->imm_use = imm->end_p;
309 return NULL_USE_OPERAND_P;
312 link_imm_use (&(imm->iter_node), var);
313 imm->imm_use = imm->iter_node.next;
317 /* Bump IMM to the next use in the list. */
318 static inline use_operand_p
319 next_safe_imm_use (imm_use_iterator *imm)
321 ssa_use_operand_t *ptr;
325 /* If the next node following the iter_node is still the one referred to by
326 imm_use, then the list hasn't changed, go to the next node. */
327 if (imm->iter_node.next == imm->imm_use)
329 ptr = &(imm->iter_node);
330 /* Remove iternode from the list. */
331 delink_imm_use (ptr);
332 imm->imm_use = imm->imm_use->next;
333 if (! end_safe_imm_use_p (imm))
335 /* This isn't the end, link iternode before the next use. */
336 ptr->prev = imm->imm_use->prev;
337 ptr->next = imm->imm_use;
338 imm->imm_use->prev->next = ptr;
339 imm->imm_use->prev = ptr;
346 /* If the 'next' value after the iterator isn't the same as it was, then
347 a node has been deleted, so we simply proceed to the node following
348 where the iterator is in the list. */
349 imm->imm_use = imm->iter_node.next;
350 if (end_safe_imm_use_p (imm))
352 end_safe_imm_use_traverse (imm);
360 /* Return true is IMM has reached the end of the immediate use list. */
362 end_readonly_imm_use_p (imm_use_iterator *imm)
364 return (imm->imm_use == imm->end_p);
367 /* Initialize iterator IMM to process the list for VAR. */
368 static inline use_operand_p
369 first_readonly_imm_use (imm_use_iterator *imm, tree var)
371 gcc_assert (TREE_CODE (var) == SSA_NAME);
373 imm->end_p = &(SSA_NAME_IMM_USE_NODE (var));
374 imm->imm_use = imm->end_p->next;
375 #ifdef ENABLE_CHECKING
376 imm->iter_node.next = imm->imm_use->next;
378 if (end_readonly_imm_use_p (imm))
379 return NULL_USE_OPERAND_P;
383 /* Bump IMM to the next use in the list. */
384 static inline use_operand_p
385 next_readonly_imm_use (imm_use_iterator *imm)
387 use_operand_p old = imm->imm_use;
389 #ifdef ENABLE_CHECKING
390 /* If this assertion fails, it indicates the 'next' pointer has changed
391 since we the last bump. This indicates that the list is being modified
392 via stmt changes, or SET_USE, or somesuch thing, and you need to be
393 using the SAFE version of the iterator. */
394 gcc_assert (imm->iter_node.next == old->next);
395 imm->iter_node.next = old->next->next;
398 imm->imm_use = old->next;
399 if (end_readonly_imm_use_p (imm))
404 /* Return true if VAR has no uses. */
406 has_zero_uses (tree var)
408 ssa_use_operand_t *ptr;
409 ptr = &(SSA_NAME_IMM_USE_NODE (var));
410 /* A single use means there is no items in the list. */
411 return (ptr == ptr->next);
414 /* Return true if VAR has a single use. */
416 has_single_use (tree var)
418 ssa_use_operand_t *ptr;
419 ptr = &(SSA_NAME_IMM_USE_NODE (var));
420 /* A single use means there is one item in the list. */
421 return (ptr != ptr->next && ptr == ptr->next->next);
424 /* If VAR has only a single immediate use, return true, and set USE_P and STMT
425 to the use pointer and stmt of occurrence. */
427 single_imm_use (tree var, use_operand_p *use_p, tree *stmt)
429 ssa_use_operand_t *ptr;
431 ptr = &(SSA_NAME_IMM_USE_NODE (var));
432 if (ptr != ptr->next && ptr == ptr->next->next)
435 *stmt = ptr->next->stmt;
438 *use_p = NULL_USE_OPERAND_P;
443 /* Return the number of immediate uses of VAR. */
444 static inline unsigned int
445 num_imm_uses (tree var)
447 ssa_use_operand_t *ptr, *start;
450 start = &(SSA_NAME_IMM_USE_NODE (var));
452 for (ptr = start->next; ptr != start; ptr = ptr->next)
459 /* Return the tree pointer to by USE. */
461 get_use_from_ptr (use_operand_p use)
466 /* Return the tree pointer to by DEF. */
468 get_def_from_ptr (def_operand_p def)
473 /* Return a def_operand_p pointer for the result of PHI. */
474 static inline def_operand_p
475 get_phi_result_ptr (tree phi)
477 return &(PHI_RESULT_TREE (phi));
480 /* Return a use_operand_p pointer for argument I of phinode PHI. */
481 static inline use_operand_p
482 get_phi_arg_def_ptr (tree phi, int i)
484 return &(PHI_ARG_IMM_USE_NODE (phi,i));
488 /* Return the bitmap of addresses taken by STMT, or NULL if it takes
491 addresses_taken (tree stmt)
493 stmt_ann_t ann = stmt_ann (stmt);
494 return ann ? ann->addresses_taken : NULL;
497 /* Return the PHI nodes for basic block BB, or NULL if there are no
500 phi_nodes (basic_block bb)
502 return bb->phi_nodes;
505 /* Set list of phi nodes of a basic block BB to L. */
508 set_phi_nodes (basic_block bb, tree l)
513 for (phi = l; phi; phi = PHI_CHAIN (phi))
514 set_bb_for_stmt (phi, bb);
517 /* Return the phi argument which contains the specified use. */
520 phi_arg_index_from_use (use_operand_p use)
522 struct phi_arg_d *element, *root;
526 /* Since the use is the first thing in a PHI argument element, we can
527 calculate its index based on casting it to an argument, and performing
528 pointer arithmetic. */
530 phi = USE_STMT (use);
531 gcc_assert (TREE_CODE (phi) == PHI_NODE);
533 element = (struct phi_arg_d *)use;
534 root = &(PHI_ARG_ELT (phi, 0));
535 index = element - root;
537 #ifdef ENABLE_CHECKING
538 /* Make sure the calculation doesn't have any leftover bytes. If it does,
539 then imm_use is likely not the first element in phi_arg_d. */
541 (((char *)element - (char *)root) % sizeof (struct phi_arg_d)) == 0);
542 gcc_assert (index >= 0 && index < PHI_ARG_CAPACITY (phi));
548 /* Mark VAR as used, so that it'll be preserved during rtl expansion. */
551 set_is_used (tree var)
553 var_ann_t ann = get_var_ann (var);
558 /* ----------------------------------------------------------------------- */
560 /* Return true if T is an executable statement. */
562 is_exec_stmt (tree t)
564 return (t && !IS_EMPTY_STMT (t) && t != error_mark_node);
568 /* Return true if this stmt can be the target of a control transfer stmt such
571 is_label_stmt (tree t)
574 switch (TREE_CODE (t))
578 case CASE_LABEL_EXPR:
586 /* Set the default definition for VAR to DEF. */
588 set_default_def (tree var, tree def)
590 var_ann_t ann = get_var_ann (var);
591 ann->default_def = def;
594 /* Return the default definition for variable VAR, or NULL if none
597 default_def (tree var)
599 var_ann_t ann = var_ann (var);
600 return ann ? ann->default_def : NULL_TREE;
603 /* PHI nodes should contain only ssa_names and invariants. A test
604 for ssa_name is definitely simpler; don't let invalid contents
605 slip in in the meantime. */
608 phi_ssa_name_p (tree t)
610 if (TREE_CODE (t) == SSA_NAME)
612 #ifdef ENABLE_CHECKING
613 gcc_assert (is_gimple_min_invariant (t));
618 /* ----------------------------------------------------------------------- */
620 /* Return a block_stmt_iterator that points to beginning of basic
622 static inline block_stmt_iterator
623 bsi_start (basic_block bb)
625 block_stmt_iterator bsi;
627 bsi.tsi = tsi_start (bb->stmt_list);
630 gcc_assert (bb->index < 0);
632 bsi.tsi.container = NULL;
638 /* Return a block statement iterator that points to the last label in
641 static inline block_stmt_iterator
642 bsi_after_labels (basic_block bb)
644 block_stmt_iterator bsi;
645 tree_stmt_iterator next;
651 gcc_assert (bb->index < 0);
653 bsi.tsi.container = NULL;
657 bsi.tsi = tsi_start (bb->stmt_list);
658 if (tsi_end_p (bsi.tsi))
661 /* Ensure that there are some labels. The rationale is that we want
662 to insert after the bsi that is returned, and these insertions should
663 be placed at the start of the basic block. This would not work if the
664 first statement was not label; rather fail here than enable the user
665 proceed in wrong way. */
666 gcc_assert (TREE_CODE (tsi_stmt (bsi.tsi)) == LABEL_EXPR);
671 while (!tsi_end_p (next)
672 && TREE_CODE (tsi_stmt (next)) == LABEL_EXPR)
681 /* Return a block statement iterator that points to the end of basic
683 static inline block_stmt_iterator
684 bsi_last (basic_block bb)
686 block_stmt_iterator bsi;
688 bsi.tsi = tsi_last (bb->stmt_list);
691 gcc_assert (bb->index < 0);
693 bsi.tsi.container = NULL;
699 /* Return true if block statement iterator I has reached the end of
702 bsi_end_p (block_stmt_iterator i)
704 return tsi_end_p (i.tsi);
707 /* Modify block statement iterator I so that it is at the next
708 statement in the basic block. */
710 bsi_next (block_stmt_iterator *i)
715 /* Modify block statement iterator I so that it is at the previous
716 statement in the basic block. */
718 bsi_prev (block_stmt_iterator *i)
723 /* Return the statement that block statement iterator I is currently
726 bsi_stmt (block_stmt_iterator i)
728 return tsi_stmt (i.tsi);
731 /* Return a pointer to the statement that block statement iterator I
734 bsi_stmt_ptr (block_stmt_iterator i)
736 return tsi_stmt_ptr (i.tsi);
739 /* Returns the loop of the statement STMT. */
741 static inline struct loop *
742 loop_containing_stmt (tree stmt)
744 basic_block bb = bb_for_stmt (stmt);
748 return bb->loop_father;
751 /* Return true if VAR is a clobbered by function calls. */
753 is_call_clobbered (tree var)
755 return is_global_var (var)
756 || bitmap_bit_p (call_clobbered_vars, var_ann (var)->uid);
759 /* Mark variable VAR as being clobbered by function calls. */
761 mark_call_clobbered (tree var)
763 var_ann_t ann = var_ann (var);
764 /* If VAR is a memory tag, then we need to consider it a global
765 variable. This is because the pointer that VAR represents has
766 been found to point to either an arbitrary location or to a known
767 location in global memory. */
768 if (ann->mem_tag_kind != NOT_A_TAG && ann->mem_tag_kind != STRUCT_FIELD)
769 DECL_EXTERNAL (var) = 1;
770 bitmap_set_bit (call_clobbered_vars, ann->uid);
771 ssa_call_clobbered_cache_valid = false;
772 ssa_ro_call_cache_valid = false;
775 /* Clear the call-clobbered attribute from variable VAR. */
777 clear_call_clobbered (tree var)
779 var_ann_t ann = var_ann (var);
780 if (ann->mem_tag_kind != NOT_A_TAG && ann->mem_tag_kind != STRUCT_FIELD)
781 DECL_EXTERNAL (var) = 0;
782 bitmap_clear_bit (call_clobbered_vars, ann->uid);
783 ssa_call_clobbered_cache_valid = false;
784 ssa_ro_call_cache_valid = false;
787 /* Mark variable VAR as being non-addressable. */
789 mark_non_addressable (tree var)
791 bitmap_clear_bit (call_clobbered_vars, var_ann (var)->uid);
792 TREE_ADDRESSABLE (var) = 0;
793 ssa_call_clobbered_cache_valid = false;
794 ssa_ro_call_cache_valid = false;
797 /* Return the common annotation for T. Return NULL if the annotation
798 doesn't already exist. */
799 static inline tree_ann_t
802 return t->common.ann;
805 /* Return a common annotation for T. Create the constant annotation if it
807 static inline tree_ann_t
808 get_tree_ann (tree t)
810 tree_ann_t ann = tree_ann (t);
811 return (ann) ? ann : create_tree_ann (t);
814 /* ----------------------------------------------------------------------- */
816 /* The following set of routines are used to iterator over various type of
819 /* Return true if PTR is finished iterating. */
821 op_iter_done (ssa_op_iter *ptr)
826 /* Get the next iterator use value for PTR. */
827 static inline use_operand_p
828 op_iter_next_use (ssa_op_iter *ptr)
831 #ifdef ENABLE_CHECKING
832 gcc_assert (ptr->iter_type == ssa_op_iter_use);
836 use_p = USE_OP_PTR (ptr->uses);
837 ptr->uses = ptr->uses->next;
842 use_p = VUSE_OP_PTR (ptr->vuses);
843 ptr->vuses = ptr->vuses->next;
848 use_p = MAYDEF_OP_PTR (ptr->mayuses);
849 ptr->mayuses = ptr->mayuses->next;
854 use_p = MUSTDEF_KILL_PTR (ptr->mustkills);
855 ptr->mustkills = ptr->mustkills->next;
858 if (ptr->phi_i < ptr->num_phi)
860 return PHI_ARG_DEF_PTR (ptr->phi_stmt, (ptr->phi_i)++);
863 return NULL_USE_OPERAND_P;
866 /* Get the next iterator def value for PTR. */
867 static inline def_operand_p
868 op_iter_next_def (ssa_op_iter *ptr)
871 #ifdef ENABLE_CHECKING
872 gcc_assert (ptr->iter_type == ssa_op_iter_def);
876 def_p = DEF_OP_PTR (ptr->defs);
877 ptr->defs = ptr->defs->next;
882 def_p = MUSTDEF_RESULT_PTR (ptr->mustdefs);
883 ptr->mustdefs = ptr->mustdefs->next;
888 def_p = MAYDEF_RESULT_PTR (ptr->maydefs);
889 ptr->maydefs = ptr->maydefs->next;
893 return NULL_DEF_OPERAND_P;
896 /* Get the next iterator tree value for PTR. */
898 op_iter_next_tree (ssa_op_iter *ptr)
901 #ifdef ENABLE_CHECKING
902 gcc_assert (ptr->iter_type == ssa_op_iter_tree);
906 val = USE_OP (ptr->uses);
907 ptr->uses = ptr->uses->next;
912 val = VUSE_OP (ptr->vuses);
913 ptr->vuses = ptr->vuses->next;
918 val = MAYDEF_OP (ptr->mayuses);
919 ptr->mayuses = ptr->mayuses->next;
924 val = MUSTDEF_KILL (ptr->mustkills);
925 ptr->mustkills = ptr->mustkills->next;
930 val = DEF_OP (ptr->defs);
931 ptr->defs = ptr->defs->next;
936 val = MUSTDEF_RESULT (ptr->mustdefs);
937 ptr->mustdefs = ptr->mustdefs->next;
942 val = MAYDEF_RESULT (ptr->maydefs);
943 ptr->maydefs = ptr->maydefs->next;
953 /* This functions clears the iterator PTR, and marks it done. This is normally
954 used to prevent warnings in the compile about might be uninitailzied
958 clear_and_done_ssa_iter (ssa_op_iter *ptr)
965 ptr->mustdefs = NULL;
966 ptr->mustkills = NULL;
967 ptr->iter_type = ssa_op_iter_none;
970 ptr->phi_stmt = NULL_TREE;
974 /* Initialize the iterator PTR to the virtual defs in STMT. */
976 op_iter_init (ssa_op_iter *ptr, tree stmt, int flags)
978 #ifdef ENABLE_CHECKING
979 gcc_assert (stmt_ann (stmt));
982 ptr->defs = (flags & SSA_OP_DEF) ? DEF_OPS (stmt) : NULL;
983 ptr->uses = (flags & SSA_OP_USE) ? USE_OPS (stmt) : NULL;
984 ptr->vuses = (flags & SSA_OP_VUSE) ? VUSE_OPS (stmt) : NULL;
985 ptr->maydefs = (flags & SSA_OP_VMAYDEF) ? MAYDEF_OPS (stmt) : NULL;
986 ptr->mayuses = (flags & SSA_OP_VMAYUSE) ? MAYDEF_OPS (stmt) : NULL;
987 ptr->mustdefs = (flags & SSA_OP_VMUSTDEF) ? MUSTDEF_OPS (stmt) : NULL;
988 ptr->mustkills = (flags & SSA_OP_VMUSTKILL) ? MUSTDEF_OPS (stmt) : NULL;
993 ptr->phi_stmt = NULL_TREE;
996 /* Initialize iterator PTR to the use operands in STMT based on FLAGS. Return
998 static inline use_operand_p
999 op_iter_init_use (ssa_op_iter *ptr, tree stmt, int flags)
1001 gcc_assert ((flags & SSA_OP_ALL_DEFS) == 0);
1002 op_iter_init (ptr, stmt, flags);
1003 ptr->iter_type = ssa_op_iter_use;
1004 return op_iter_next_use (ptr);
1007 /* Initialize iterator PTR to the def operands in STMT based on FLAGS. Return
1009 static inline def_operand_p
1010 op_iter_init_def (ssa_op_iter *ptr, tree stmt, int flags)
1012 gcc_assert ((flags & (SSA_OP_ALL_USES | SSA_OP_VIRTUAL_KILLS)) == 0);
1013 op_iter_init (ptr, stmt, flags);
1014 ptr->iter_type = ssa_op_iter_def;
1015 return op_iter_next_def (ptr);
1018 /* Initialize iterator PTR to the operands in STMT based on FLAGS. Return
1019 the first operand as a tree. */
1021 op_iter_init_tree (ssa_op_iter *ptr, tree stmt, int flags)
1023 op_iter_init (ptr, stmt, flags);
1024 ptr->iter_type = ssa_op_iter_tree;
1025 return op_iter_next_tree (ptr);
1028 /* Get the next iterator mustdef value for PTR, returning the mustdef values in
1031 op_iter_next_maymustdef (use_operand_p *use, def_operand_p *def,
1034 #ifdef ENABLE_CHECKING
1035 gcc_assert (ptr->iter_type == ssa_op_iter_maymustdef);
1039 *def = MAYDEF_RESULT_PTR (ptr->mayuses);
1040 *use = MAYDEF_OP_PTR (ptr->mayuses);
1041 ptr->mayuses = ptr->mayuses->next;
1047 *def = MUSTDEF_RESULT_PTR (ptr->mustkills);
1048 *use = MUSTDEF_KILL_PTR (ptr->mustkills);
1049 ptr->mustkills = ptr->mustkills->next;
1053 *def = NULL_DEF_OPERAND_P;
1054 *use = NULL_USE_OPERAND_P;
1060 /* Initialize iterator PTR to the operands in STMT. Return the first operands
1063 op_iter_init_maydef (ssa_op_iter *ptr, tree stmt, use_operand_p *use,
1066 gcc_assert (TREE_CODE (stmt) != PHI_NODE);
1068 op_iter_init (ptr, stmt, SSA_OP_VMAYUSE);
1069 ptr->iter_type = ssa_op_iter_maymustdef;
1070 op_iter_next_maymustdef (use, def, ptr);
1074 /* Initialize iterator PTR to the operands in STMT. Return the first operands
1077 op_iter_init_mustdef (ssa_op_iter *ptr, tree stmt, use_operand_p *kill,
1080 gcc_assert (TREE_CODE (stmt) != PHI_NODE);
1082 op_iter_init (ptr, stmt, SSA_OP_VMUSTKILL);
1083 ptr->iter_type = ssa_op_iter_maymustdef;
1084 op_iter_next_maymustdef (kill, def, ptr);
1087 /* Initialize iterator PTR to the operands in STMT. Return the first operands
1090 op_iter_init_must_and_may_def (ssa_op_iter *ptr, tree stmt,
1091 use_operand_p *kill, def_operand_p *def)
1093 gcc_assert (TREE_CODE (stmt) != PHI_NODE);
1095 op_iter_init (ptr, stmt, SSA_OP_VMUSTKILL|SSA_OP_VMAYUSE);
1096 ptr->iter_type = ssa_op_iter_maymustdef;
1097 op_iter_next_maymustdef (kill, def, ptr);
1101 /* If there is a single operand in STMT matching FLAGS, return it. Otherwise
1102 return NULL. PTR is the iterator to use. */
1104 single_ssa_tree_operand (tree stmt, int flags)
1109 var = op_iter_init_tree (&iter, stmt, flags);
1110 if (op_iter_done (&iter))
1112 op_iter_next_tree (&iter);
1113 if (op_iter_done (&iter))
1119 /* If there is a single operand in STMT matching FLAGS, return it. Otherwise
1120 return NULL. PTR is the iterator to use. */
1121 static inline use_operand_p
1122 single_ssa_use_operand (tree stmt, int flags)
1127 var = op_iter_init_use (&iter, stmt, flags);
1128 if (op_iter_done (&iter))
1129 return NULL_USE_OPERAND_P;
1130 op_iter_next_use (&iter);
1131 if (op_iter_done (&iter))
1133 return NULL_USE_OPERAND_P;
1138 /* If there is a single operand in STMT matching FLAGS, return it. Otherwise
1139 return NULL. PTR is the iterator to use. */
1140 static inline def_operand_p
1141 single_ssa_def_operand (tree stmt, int flags)
1146 var = op_iter_init_def (&iter, stmt, flags);
1147 if (op_iter_done (&iter))
1148 return NULL_DEF_OPERAND_P;
1149 op_iter_next_def (&iter);
1150 if (op_iter_done (&iter))
1152 return NULL_DEF_OPERAND_P;
1156 /* If there is a single operand in STMT matching FLAGS, return it. Otherwise
1157 return NULL. PTR is the iterator to use. */
1159 zero_ssa_operands (tree stmt, int flags)
1163 op_iter_init_tree (&iter, stmt, flags);
1164 return op_iter_done (&iter);
1168 /* Return the number of operands matching FLAGS in STMT. */
1170 num_ssa_operands (tree stmt, int flags)
1176 FOR_EACH_SSA_TREE_OPERAND (t, stmt, iter, flags)
1182 /* Delink all immediate_use information for STMT. */
1184 delink_stmt_imm_use (tree stmt)
1187 use_operand_p use_p;
1189 if (ssa_operands_active ())
1190 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter,
1191 (SSA_OP_ALL_USES | SSA_OP_ALL_KILLS))
1192 delink_imm_use (use_p);
1196 /* This routine will compare all the operands matching FLAGS in STMT1 to those
1197 in STMT2. TRUE is returned if they are the same. STMTs can be NULL. */
1199 compare_ssa_operands_equal (tree stmt1, tree stmt2, int flags)
1201 ssa_op_iter iter1, iter2;
1202 tree op1 = NULL_TREE;
1203 tree op2 = NULL_TREE;
1209 look1 = stmt1 && stmt_ann (stmt1);
1210 look2 = stmt2 && stmt_ann (stmt2);
1214 op1 = op_iter_init_tree (&iter1, stmt1, flags);
1216 return op_iter_done (&iter1);
1219 clear_and_done_ssa_iter (&iter1);
1223 op2 = op_iter_init_tree (&iter2, stmt2, flags);
1225 return op_iter_done (&iter2);
1228 clear_and_done_ssa_iter (&iter2);
1230 while (!op_iter_done (&iter1) && !op_iter_done (&iter2))
1234 op1 = op_iter_next_tree (&iter1);
1235 op2 = op_iter_next_tree (&iter2);
1238 return (op_iter_done (&iter1) && op_iter_done (&iter2));
1242 /* If there is a single DEF in the PHI node which matches FLAG, return it.
1243 Otherwise return NULL_DEF_OPERAND_P. */
1245 single_phi_def (tree stmt, int flags)
1247 tree def = PHI_RESULT (stmt);
1248 if ((flags & SSA_OP_DEF) && is_gimple_reg (def))
1250 if ((flags & SSA_OP_VIRTUAL_DEFS) && !is_gimple_reg (def))
1255 /* Initialize the iterator PTR for uses matching FLAGS in PHI. FLAGS should
1256 be either SSA_OP_USES or SAS_OP_VIRTUAL_USES. */
1257 static inline use_operand_p
1258 op_iter_init_phiuse (ssa_op_iter *ptr, tree phi, int flags)
1260 tree phi_def = PHI_RESULT (phi);
1263 clear_and_done_ssa_iter (ptr);
1266 gcc_assert ((flags & (SSA_OP_USE | SSA_OP_VIRTUAL_USES)) != 0);
1268 comp = (is_gimple_reg (phi_def) ? SSA_OP_USE : SSA_OP_VIRTUAL_USES);
1270 /* If the PHI node doesn't the operand type we care about, we're done. */
1271 if ((flags & comp) == 0)
1274 return NULL_USE_OPERAND_P;
1277 ptr->phi_stmt = phi;
1278 ptr->num_phi = PHI_NUM_ARGS (phi);
1279 ptr->iter_type = ssa_op_iter_use;
1280 return op_iter_next_use (ptr);
1284 /* Start an iterator for a PHI definition. */
1286 static inline def_operand_p
1287 op_iter_init_phidef (ssa_op_iter *ptr, tree phi, int flags)
1289 tree phi_def = PHI_RESULT (phi);
1292 clear_and_done_ssa_iter (ptr);
1295 gcc_assert ((flags & (SSA_OP_DEF | SSA_OP_VIRTUAL_DEFS)) != 0);
1297 comp = (is_gimple_reg (phi_def) ? SSA_OP_DEF : SSA_OP_VIRTUAL_DEFS);
1299 /* If the PHI node doesn't the operand type we care about, we're done. */
1300 if ((flags & comp) == 0)
1303 return NULL_USE_OPERAND_P;
1306 ptr->iter_type = ssa_op_iter_def;
1307 /* The first call to op_iter_next_def will terminate the iterator since
1308 all the fields are NULL. Simply return the result here as the first and
1309 therefore only result. */
1310 return PHI_RESULT_PTR (phi);
1315 /* Return true if VAR cannot be modified by the program. */
1318 unmodifiable_var_p (tree var)
1320 if (TREE_CODE (var) == SSA_NAME)
1321 var = SSA_NAME_VAR (var);
1322 return TREE_READONLY (var) && (TREE_STATIC (var) || DECL_EXTERNAL (var));
1325 /* Return true if REF, a COMPONENT_REF, has an ARRAY_REF somewhere in it. */
1328 ref_contains_array_ref (tree ref)
1330 while (handled_component_p (ref))
1332 if (TREE_CODE (ref) == ARRAY_REF)
1334 ref = TREE_OPERAND (ref, 0);
1339 /* Given a variable VAR, lookup and return a pointer to the list of
1340 subvariables for it. */
1342 static inline subvar_t *
1343 lookup_subvars_for_var (tree var)
1345 var_ann_t ann = var_ann (var);
1347 return &ann->subvars;
1350 /* Given a variable VAR, return a linked list of subvariables for VAR, or
1351 NULL, if there are no subvariables. */
1353 static inline subvar_t
1354 get_subvars_for_var (tree var)
1358 gcc_assert (SSA_VAR_P (var));
1360 if (TREE_CODE (var) == SSA_NAME)
1361 subvars = *(lookup_subvars_for_var (SSA_NAME_VAR (var)));
1363 subvars = *(lookup_subvars_for_var (var));
1367 /* Return true if V is a tree that we can have subvars for.
1368 Normally, this is any aggregate type, however, due to implementation
1369 limitations ATM, we exclude array types as well. */
1372 var_can_have_subvars (tree v)
1374 return (AGGREGATE_TYPE_P (TREE_TYPE (v)) &&
1375 TREE_CODE (TREE_TYPE (v)) != ARRAY_TYPE);
1379 /* Return true if OFFSET and SIZE define a range that overlaps with some
1380 portion of the range of SV, a subvar. If there was an exact overlap,
1381 *EXACT will be set to true upon return. */
1384 overlap_subvar (HOST_WIDE_INT offset, HOST_WIDE_INT size,
1385 subvar_t sv, bool *exact)
1387 /* There are three possible cases of overlap.
1388 1. We can have an exact overlap, like so:
1389 |offset, offset + size |
1390 |sv->offset, sv->offset + sv->size |
1392 2. We can have offset starting after sv->offset, like so:
1394 |offset, offset + size |
1395 |sv->offset, sv->offset + sv->size |
1397 3. We can have offset starting before sv->offset, like so:
1399 |offset, offset + size |
1400 |sv->offset, sv->offset + sv->size|
1405 if (offset == sv->offset && size == sv->size)
1411 else if (offset >= sv->offset && offset < (sv->offset + sv->size))
1415 else if (offset < sv->offset && (offset + size > sv->offset))
1423 #endif /* _TREE_FLOW_INLINE_H */