* config/rs6000/rs6000.c (rs6000_option_override_internal): Do not
[official-gcc.git] / gcc / tree-flow-inline.h
blob6c55da6fae2fba2ed2449761abc4b50faf67da52
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>
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
11 any later version.
13 GCC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
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 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. */
32 static inline bool
33 gimple_in_ssa_p (const struct function *fun)
35 return fun && fun->gimple_df && fun->gimple_df->in_ssa_p;
38 /* Artificial variable used for the virtual operand FUD chain. */
39 static inline tree
40 gimple_vop (const struct function *fun)
42 gcc_checking_assert (fun && fun->gimple_df);
43 return fun->gimple_df->vop;
46 /* Initialize the hashtable iterator HTI to point to hashtable TABLE */
48 static inline void *
49 first_htab_element (htab_iterator *hti, htab_t table)
51 hti->htab = table;
52 hti->slot = table->entries;
53 hti->limit = hti->slot + htab_size (table);
56 PTR x = *(hti->slot);
57 if (x != HTAB_EMPTY_ENTRY && x != HTAB_DELETED_ENTRY)
58 break;
59 } while (++(hti->slot) < hti->limit);
61 if (hti->slot < hti->limit)
62 return *(hti->slot);
63 return NULL;
66 /* Return current non-empty/deleted slot of the hashtable pointed to by HTI,
67 or NULL if we have reached the end. */
69 static inline bool
70 end_htab_p (const htab_iterator *hti)
72 if (hti->slot >= hti->limit)
73 return true;
74 return false;
77 /* Advance the hashtable iterator pointed to by HTI to the next element of the
78 hashtable. */
80 static inline void *
81 next_htab_element (htab_iterator *hti)
83 while (++(hti->slot) < hti->limit)
85 PTR x = *(hti->slot);
86 if (x != HTAB_EMPTY_ENTRY && x != HTAB_DELETED_ENTRY)
87 return x;
89 return NULL;
92 /* Get the number of the next statement uid to be allocated. */
93 static inline unsigned int
94 gimple_stmt_max_uid (struct function *fn)
96 return fn->last_stmt_uid;
99 /* Set the number of the next statement uid to be allocated. */
100 static inline void
101 set_gimple_stmt_max_uid (struct function *fn, unsigned int maxid)
103 fn->last_stmt_uid = maxid;
106 /* Set the number of the next statement uid to be allocated. */
107 static inline unsigned int
108 inc_gimple_stmt_max_uid (struct function *fn)
110 return fn->last_stmt_uid++;
113 /* Return the line number for EXPR, or return -1 if we have no line
114 number information for it. */
115 static inline int
116 get_lineno (const_gimple stmt)
118 location_t loc;
120 if (!stmt)
121 return -1;
123 loc = gimple_location (stmt);
124 if (loc == UNKNOWN_LOCATION)
125 return -1;
127 return LOCATION_LINE (loc);
130 /* Delink an immediate_uses node from its chain. */
131 static inline void
132 delink_imm_use (ssa_use_operand_t *linknode)
134 /* Return if this node is not in a list. */
135 if (linknode->prev == NULL)
136 return;
138 linknode->prev->next = linknode->next;
139 linknode->next->prev = linknode->prev;
140 linknode->prev = NULL;
141 linknode->next = NULL;
144 /* Link ssa_imm_use node LINKNODE into the chain for LIST. */
145 static inline void
146 link_imm_use_to_list (ssa_use_operand_t *linknode, ssa_use_operand_t *list)
148 /* Link the new node at the head of the list. If we are in the process of
149 traversing the list, we won't visit any new nodes added to it. */
150 linknode->prev = list;
151 linknode->next = list->next;
152 list->next->prev = linknode;
153 list->next = linknode;
156 /* Link ssa_imm_use node LINKNODE into the chain for DEF. */
157 static inline void
158 link_imm_use (ssa_use_operand_t *linknode, tree def)
160 ssa_use_operand_t *root;
162 if (!def || TREE_CODE (def) != SSA_NAME)
163 linknode->prev = NULL;
164 else
166 root = &(SSA_NAME_IMM_USE_NODE (def));
167 if (linknode->use)
168 gcc_checking_assert (*(linknode->use) == def);
169 link_imm_use_to_list (linknode, root);
173 /* Set the value of a use pointed to by USE to VAL. */
174 static inline void
175 set_ssa_use_from_ptr (use_operand_p use, tree val)
177 delink_imm_use (use);
178 *(use->use) = val;
179 link_imm_use (use, val);
182 /* Link ssa_imm_use node LINKNODE into the chain for DEF, with use occurring
183 in STMT. */
184 static inline void
185 link_imm_use_stmt (ssa_use_operand_t *linknode, tree def, gimple stmt)
187 if (stmt)
188 link_imm_use (linknode, def);
189 else
190 link_imm_use (linknode, NULL);
191 linknode->loc.stmt = stmt;
194 /* Relink a new node in place of an old node in the list. */
195 static inline void
196 relink_imm_use (ssa_use_operand_t *node, ssa_use_operand_t *old)
198 /* The node one had better be in the same list. */
199 gcc_checking_assert (*(old->use) == *(node->use));
200 node->prev = old->prev;
201 node->next = old->next;
202 if (old->prev)
204 old->prev->next = node;
205 old->next->prev = node;
206 /* Remove the old node from the list. */
207 old->prev = NULL;
211 /* Relink ssa_imm_use node LINKNODE into the chain for OLD, with use occurring
212 in STMT. */
213 static inline void
214 relink_imm_use_stmt (ssa_use_operand_t *linknode, ssa_use_operand_t *old,
215 gimple stmt)
217 if (stmt)
218 relink_imm_use (linknode, old);
219 else
220 link_imm_use (linknode, NULL);
221 linknode->loc.stmt = stmt;
225 /* Return true is IMM has reached the end of the immediate use list. */
226 static inline bool
227 end_readonly_imm_use_p (const imm_use_iterator *imm)
229 return (imm->imm_use == imm->end_p);
232 /* Initialize iterator IMM to process the list for VAR. */
233 static inline use_operand_p
234 first_readonly_imm_use (imm_use_iterator *imm, tree var)
236 imm->end_p = &(SSA_NAME_IMM_USE_NODE (var));
237 imm->imm_use = imm->end_p->next;
238 #ifdef ENABLE_CHECKING
239 imm->iter_node.next = imm->imm_use->next;
240 #endif
241 if (end_readonly_imm_use_p (imm))
242 return NULL_USE_OPERAND_P;
243 return imm->imm_use;
246 /* Bump IMM to the next use in the list. */
247 static inline use_operand_p
248 next_readonly_imm_use (imm_use_iterator *imm)
250 use_operand_p old = imm->imm_use;
252 #ifdef ENABLE_CHECKING
253 /* If this assertion fails, it indicates the 'next' pointer has changed
254 since the last bump. This indicates that the list is being modified
255 via stmt changes, or SET_USE, or somesuch thing, and you need to be
256 using the SAFE version of the iterator. */
257 gcc_assert (imm->iter_node.next == old->next);
258 imm->iter_node.next = old->next->next;
259 #endif
261 imm->imm_use = old->next;
262 if (end_readonly_imm_use_p (imm))
263 return NULL_USE_OPERAND_P;
264 return imm->imm_use;
267 /* tree-cfg.c */
268 extern bool has_zero_uses_1 (const ssa_use_operand_t *head);
269 extern bool single_imm_use_1 (const ssa_use_operand_t *head,
270 use_operand_p *use_p, gimple *stmt);
272 /* Return true if VAR has no nondebug uses. */
273 static inline bool
274 has_zero_uses (const_tree var)
276 const ssa_use_operand_t *const ptr = &(SSA_NAME_IMM_USE_NODE (var));
278 /* A single use_operand means there is no items in the list. */
279 if (ptr == ptr->next)
280 return true;
282 /* If there are debug stmts, we have to look at each use and see
283 whether there are any nondebug uses. */
284 if (!MAY_HAVE_DEBUG_STMTS)
285 return false;
287 return has_zero_uses_1 (ptr);
290 /* Return true if VAR has a single nondebug use. */
291 static inline bool
292 has_single_use (const_tree var)
294 const ssa_use_operand_t *const ptr = &(SSA_NAME_IMM_USE_NODE (var));
296 /* If there aren't any uses whatsoever, we're done. */
297 if (ptr == ptr->next)
298 return false;
300 /* If there's a single use, check that it's not a debug stmt. */
301 if (ptr == ptr->next->next)
302 return !is_gimple_debug (USE_STMT (ptr->next));
304 /* If there are debug stmts, we have to look at each of them. */
305 if (!MAY_HAVE_DEBUG_STMTS)
306 return false;
308 return single_imm_use_1 (ptr, NULL, NULL);
312 /* If VAR has only a single immediate nondebug use, return true, and
313 set USE_P and STMT to the use pointer and stmt of occurrence. */
314 static inline bool
315 single_imm_use (const_tree var, use_operand_p *use_p, gimple *stmt)
317 const ssa_use_operand_t *const ptr = &(SSA_NAME_IMM_USE_NODE (var));
319 /* If there aren't any uses whatsoever, we're done. */
320 if (ptr == ptr->next)
322 return_false:
323 *use_p = NULL_USE_OPERAND_P;
324 *stmt = NULL;
325 return false;
328 /* If there's a single use, check that it's not a debug stmt. */
329 if (ptr == ptr->next->next)
331 if (!is_gimple_debug (USE_STMT (ptr->next)))
333 *use_p = ptr->next;
334 *stmt = ptr->next->loc.stmt;
335 return true;
337 else
338 goto return_false;
341 /* If there are debug stmts, we have to look at each of them. */
342 if (!MAY_HAVE_DEBUG_STMTS)
343 goto return_false;
345 return single_imm_use_1 (ptr, use_p, stmt);
348 /* Return the number of nondebug immediate uses of VAR. */
349 static inline unsigned int
350 num_imm_uses (const_tree var)
352 const ssa_use_operand_t *const start = &(SSA_NAME_IMM_USE_NODE (var));
353 const ssa_use_operand_t *ptr;
354 unsigned int num = 0;
356 if (!MAY_HAVE_DEBUG_STMTS)
357 for (ptr = start->next; ptr != start; ptr = ptr->next)
358 num++;
359 else
360 for (ptr = start->next; ptr != start; ptr = ptr->next)
361 if (!is_gimple_debug (USE_STMT (ptr)))
362 num++;
364 return num;
367 /* Return the tree pointed-to by USE. */
368 static inline tree
369 get_use_from_ptr (use_operand_p use)
371 return *(use->use);
374 /* Return the tree pointed-to by DEF. */
375 static inline tree
376 get_def_from_ptr (def_operand_p def)
378 return *def;
381 /* Return a use_operand_p pointer for argument I of PHI node GS. */
383 static inline use_operand_p
384 gimple_phi_arg_imm_use_ptr (gimple gs, int i)
386 return &gimple_phi_arg (gs, i)->imm_use;
389 /* Return the tree operand for argument I of PHI node GS. */
391 static inline tree
392 gimple_phi_arg_def (gimple gs, size_t index)
394 struct phi_arg_d *pd = gimple_phi_arg (gs, index);
395 return get_use_from_ptr (&pd->imm_use);
398 /* Return a pointer to the tree operand for argument I of PHI node GS. */
400 static inline tree *
401 gimple_phi_arg_def_ptr (gimple gs, size_t index)
403 return &gimple_phi_arg (gs, index)->def;
406 /* Return the edge associated with argument I of phi node GS. */
408 static inline edge
409 gimple_phi_arg_edge (gimple gs, size_t i)
411 return EDGE_PRED (gimple_bb (gs), i);
414 /* Return the source location of gimple argument I of phi node GS. */
416 static inline source_location
417 gimple_phi_arg_location (gimple gs, size_t i)
419 return gimple_phi_arg (gs, i)->locus;
422 /* Return the source location of the argument on edge E of phi node GS. */
424 static inline source_location
425 gimple_phi_arg_location_from_edge (gimple gs, edge e)
427 return gimple_phi_arg (gs, e->dest_idx)->locus;
430 /* Set the source location of gimple argument I of phi node GS to LOC. */
432 static inline void
433 gimple_phi_arg_set_location (gimple gs, size_t i, source_location loc)
435 gimple_phi_arg (gs, i)->locus = loc;
438 /* Return TRUE if argument I of phi node GS has a location record. */
440 static inline bool
441 gimple_phi_arg_has_location (gimple gs, size_t i)
443 return gimple_phi_arg_location (gs, i) != UNKNOWN_LOCATION;
447 /* Return the PHI nodes for basic block BB, or NULL if there are no
448 PHI nodes. */
449 static inline gimple_seq
450 phi_nodes (const_basic_block bb)
452 gcc_checking_assert (!(bb->flags & BB_RTL));
453 return bb->il.gimple.phi_nodes;
456 static inline gimple_seq *
457 phi_nodes_ptr (basic_block bb)
459 gcc_checking_assert (!(bb->flags & BB_RTL));
460 return &bb->il.gimple.phi_nodes;
463 /* Set PHI nodes of a basic block BB to SEQ. */
465 static inline void
466 set_phi_nodes (basic_block bb, gimple_seq seq)
468 gimple_stmt_iterator i;
470 gcc_checking_assert (!(bb->flags & BB_RTL));
471 bb->il.gimple.phi_nodes = seq;
472 if (seq)
473 for (i = gsi_start (seq); !gsi_end_p (i); gsi_next (&i))
474 gimple_set_bb (gsi_stmt (i), bb);
477 /* Return the phi argument which contains the specified use. */
479 static inline int
480 phi_arg_index_from_use (use_operand_p use)
482 struct phi_arg_d *element, *root;
483 size_t index;
484 gimple phi;
486 /* Since the use is the first thing in a PHI argument element, we can
487 calculate its index based on casting it to an argument, and performing
488 pointer arithmetic. */
490 phi = USE_STMT (use);
492 element = (struct phi_arg_d *)use;
493 root = gimple_phi_arg (phi, 0);
494 index = element - root;
496 /* Make sure the calculation doesn't have any leftover bytes. If it does,
497 then imm_use is likely not the first element in phi_arg_d. */
498 gcc_checking_assert ((((char *)element - (char *)root)
499 % sizeof (struct phi_arg_d)) == 0
500 && index < gimple_phi_capacity (phi));
502 return index;
505 /* Return true if T (assumed to be a DECL) is a global variable.
506 A variable is considered global if its storage is not automatic. */
508 static inline bool
509 is_global_var (const_tree t)
511 return (TREE_STATIC (t) || DECL_EXTERNAL (t));
515 /* Return true if VAR may be aliased. A variable is considered as
516 maybe aliased if it has its address taken by the local TU
517 or possibly by another TU and might be modified through a pointer. */
519 static inline bool
520 may_be_aliased (const_tree var)
522 return (TREE_CODE (var) != CONST_DECL
523 && !((TREE_STATIC (var) || TREE_PUBLIC (var) || DECL_EXTERNAL (var))
524 && TREE_READONLY (var)
525 && !TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (var)))
526 && (TREE_PUBLIC (var)
527 || DECL_EXTERNAL (var)
528 || TREE_ADDRESSABLE (var)));
532 /* PHI nodes should contain only ssa_names and invariants. A test
533 for ssa_name is definitely simpler; don't let invalid contents
534 slip in in the meantime. */
536 static inline bool
537 phi_ssa_name_p (const_tree t)
539 if (TREE_CODE (t) == SSA_NAME)
540 return true;
541 gcc_checking_assert (is_gimple_min_invariant (t));
542 return false;
546 /* Returns the loop of the statement STMT. */
548 static inline struct loop *
549 loop_containing_stmt (gimple stmt)
551 basic_block bb = gimple_bb (stmt);
552 if (!bb)
553 return NULL;
555 return bb->loop_father;
559 /* ----------------------------------------------------------------------- */
561 /* The following set of routines are used to iterator over various type of
562 SSA operands. */
564 /* Return true if PTR is finished iterating. */
565 static inline bool
566 op_iter_done (const ssa_op_iter *ptr)
568 return ptr->done;
571 /* Get the next iterator use value for PTR. */
572 static inline use_operand_p
573 op_iter_next_use (ssa_op_iter *ptr)
575 use_operand_p use_p;
576 gcc_checking_assert (ptr->iter_type == ssa_op_iter_use);
577 if (ptr->uses)
579 use_p = USE_OP_PTR (ptr->uses);
580 ptr->uses = ptr->uses->next;
581 return use_p;
583 if (ptr->phi_i < ptr->num_phi)
585 return PHI_ARG_DEF_PTR (ptr->phi_stmt, (ptr->phi_i)++);
587 ptr->done = true;
588 return NULL_USE_OPERAND_P;
591 /* Get the next iterator def value for PTR. */
592 static inline def_operand_p
593 op_iter_next_def (ssa_op_iter *ptr)
595 def_operand_p def_p;
596 gcc_checking_assert (ptr->iter_type == ssa_op_iter_def);
597 if (ptr->defs)
599 def_p = DEF_OP_PTR (ptr->defs);
600 ptr->defs = ptr->defs->next;
601 return def_p;
603 ptr->done = true;
604 return NULL_DEF_OPERAND_P;
607 /* Get the next iterator tree value for PTR. */
608 static inline tree
609 op_iter_next_tree (ssa_op_iter *ptr)
611 tree val;
612 gcc_checking_assert (ptr->iter_type == ssa_op_iter_tree);
613 if (ptr->uses)
615 val = USE_OP (ptr->uses);
616 ptr->uses = ptr->uses->next;
617 return val;
619 if (ptr->defs)
621 val = DEF_OP (ptr->defs);
622 ptr->defs = ptr->defs->next;
623 return val;
626 ptr->done = true;
627 return NULL_TREE;
632 /* This functions clears the iterator PTR, and marks it done. This is normally
633 used to prevent warnings in the compile about might be uninitialized
634 components. */
636 static inline void
637 clear_and_done_ssa_iter (ssa_op_iter *ptr)
639 ptr->defs = NULL;
640 ptr->uses = NULL;
641 ptr->iter_type = ssa_op_iter_none;
642 ptr->phi_i = 0;
643 ptr->num_phi = 0;
644 ptr->phi_stmt = NULL;
645 ptr->done = true;
648 /* Initialize the iterator PTR to the virtual defs in STMT. */
649 static inline void
650 op_iter_init (ssa_op_iter *ptr, gimple stmt, int flags)
652 /* PHI nodes require a different iterator initialization path. We
653 do not support iterating over virtual defs or uses without
654 iterating over defs or uses at the same time. */
655 gcc_checking_assert (gimple_code (stmt) != GIMPLE_PHI
656 && (!(flags & SSA_OP_VDEF) || (flags & SSA_OP_DEF))
657 && (!(flags & SSA_OP_VUSE) || (flags & SSA_OP_USE)));
658 ptr->defs = (flags & (SSA_OP_DEF|SSA_OP_VDEF)) ? gimple_def_ops (stmt) : NULL;
659 if (!(flags & SSA_OP_VDEF)
660 && ptr->defs
661 && gimple_vdef (stmt) != NULL_TREE)
662 ptr->defs = ptr->defs->next;
663 ptr->uses = (flags & (SSA_OP_USE|SSA_OP_VUSE)) ? gimple_use_ops (stmt) : NULL;
664 if (!(flags & SSA_OP_VUSE)
665 && ptr->uses
666 && gimple_vuse (stmt) != NULL_TREE)
667 ptr->uses = ptr->uses->next;
668 ptr->done = false;
670 ptr->phi_i = 0;
671 ptr->num_phi = 0;
672 ptr->phi_stmt = NULL;
675 /* Initialize iterator PTR to the use operands in STMT based on FLAGS. Return
676 the first use. */
677 static inline use_operand_p
678 op_iter_init_use (ssa_op_iter *ptr, gimple stmt, int flags)
680 gcc_checking_assert ((flags & SSA_OP_ALL_DEFS) == 0
681 && (flags & SSA_OP_USE));
682 op_iter_init (ptr, stmt, flags);
683 ptr->iter_type = ssa_op_iter_use;
684 return op_iter_next_use (ptr);
687 /* Initialize iterator PTR to the def operands in STMT based on FLAGS. Return
688 the first def. */
689 static inline def_operand_p
690 op_iter_init_def (ssa_op_iter *ptr, gimple stmt, int flags)
692 gcc_checking_assert ((flags & SSA_OP_ALL_USES) == 0
693 && (flags & SSA_OP_DEF));
694 op_iter_init (ptr, stmt, flags);
695 ptr->iter_type = ssa_op_iter_def;
696 return op_iter_next_def (ptr);
699 /* Initialize iterator PTR to the operands in STMT based on FLAGS. Return
700 the first operand as a tree. */
701 static inline tree
702 op_iter_init_tree (ssa_op_iter *ptr, gimple stmt, int flags)
704 op_iter_init (ptr, stmt, flags);
705 ptr->iter_type = ssa_op_iter_tree;
706 return op_iter_next_tree (ptr);
710 /* If there is a single operand in STMT matching FLAGS, return it. Otherwise
711 return NULL. */
712 static inline tree
713 single_ssa_tree_operand (gimple stmt, int flags)
715 tree var;
716 ssa_op_iter iter;
718 var = op_iter_init_tree (&iter, stmt, flags);
719 if (op_iter_done (&iter))
720 return NULL_TREE;
721 op_iter_next_tree (&iter);
722 if (op_iter_done (&iter))
723 return var;
724 return NULL_TREE;
728 /* If there is a single operand in STMT matching FLAGS, return it. Otherwise
729 return NULL. */
730 static inline use_operand_p
731 single_ssa_use_operand (gimple stmt, int flags)
733 use_operand_p var;
734 ssa_op_iter iter;
736 var = op_iter_init_use (&iter, stmt, flags);
737 if (op_iter_done (&iter))
738 return NULL_USE_OPERAND_P;
739 op_iter_next_use (&iter);
740 if (op_iter_done (&iter))
741 return var;
742 return NULL_USE_OPERAND_P;
747 /* If there is a single operand in STMT matching FLAGS, return it. Otherwise
748 return NULL. */
749 static inline def_operand_p
750 single_ssa_def_operand (gimple stmt, int flags)
752 def_operand_p var;
753 ssa_op_iter iter;
755 var = op_iter_init_def (&iter, stmt, flags);
756 if (op_iter_done (&iter))
757 return NULL_DEF_OPERAND_P;
758 op_iter_next_def (&iter);
759 if (op_iter_done (&iter))
760 return var;
761 return NULL_DEF_OPERAND_P;
765 /* Return true if there are zero operands in STMT matching the type
766 given in FLAGS. */
767 static inline bool
768 zero_ssa_operands (gimple stmt, int flags)
770 ssa_op_iter iter;
772 op_iter_init_tree (&iter, stmt, flags);
773 return op_iter_done (&iter);
777 /* Return the number of operands matching FLAGS in STMT. */
778 static inline int
779 num_ssa_operands (gimple stmt, int flags)
781 ssa_op_iter iter;
782 tree t;
783 int num = 0;
785 gcc_checking_assert (gimple_code (stmt) != GIMPLE_PHI);
786 FOR_EACH_SSA_TREE_OPERAND (t, stmt, iter, flags)
787 num++;
788 return num;
791 static inline use_operand_p
792 op_iter_init_phiuse (ssa_op_iter *ptr, gimple phi, int flags);
794 /* Delink all immediate_use information for STMT. */
795 static inline void
796 delink_stmt_imm_use (gimple stmt)
798 ssa_op_iter iter;
799 use_operand_p use_p;
801 if (ssa_operands_active (cfun))
802 FOR_EACH_PHI_OR_STMT_USE (use_p, stmt, iter, SSA_OP_ALL_USES)
803 delink_imm_use (use_p);
807 /* If there is a single DEF in the PHI node which matches FLAG, return it.
808 Otherwise return NULL_DEF_OPERAND_P. */
809 static inline tree
810 single_phi_def (gimple stmt, int flags)
812 tree def = PHI_RESULT (stmt);
813 if ((flags & SSA_OP_DEF) && is_gimple_reg (def))
814 return def;
815 if ((flags & SSA_OP_VIRTUAL_DEFS) && !is_gimple_reg (def))
816 return def;
817 return NULL_TREE;
820 /* Initialize the iterator PTR for uses matching FLAGS in PHI. FLAGS should
821 be either SSA_OP_USES or SSA_OP_VIRTUAL_USES. */
822 static inline use_operand_p
823 op_iter_init_phiuse (ssa_op_iter *ptr, gimple phi, int flags)
825 tree phi_def = gimple_phi_result (phi);
826 int comp;
828 clear_and_done_ssa_iter (ptr);
829 ptr->done = false;
831 gcc_checking_assert ((flags & (SSA_OP_USE | SSA_OP_VIRTUAL_USES)) != 0);
833 comp = (is_gimple_reg (phi_def) ? SSA_OP_USE : SSA_OP_VIRTUAL_USES);
835 /* If the PHI node doesn't the operand type we care about, we're done. */
836 if ((flags & comp) == 0)
838 ptr->done = true;
839 return NULL_USE_OPERAND_P;
842 ptr->phi_stmt = phi;
843 ptr->num_phi = gimple_phi_num_args (phi);
844 ptr->iter_type = ssa_op_iter_use;
845 return op_iter_next_use (ptr);
849 /* Start an iterator for a PHI definition. */
851 static inline def_operand_p
852 op_iter_init_phidef (ssa_op_iter *ptr, gimple phi, int flags)
854 tree phi_def = PHI_RESULT (phi);
855 int comp;
857 clear_and_done_ssa_iter (ptr);
858 ptr->done = false;
860 gcc_checking_assert ((flags & (SSA_OP_DEF | SSA_OP_VIRTUAL_DEFS)) != 0);
862 comp = (is_gimple_reg (phi_def) ? SSA_OP_DEF : SSA_OP_VIRTUAL_DEFS);
864 /* If the PHI node doesn't have the operand type we care about,
865 we're done. */
866 if ((flags & comp) == 0)
868 ptr->done = true;
869 return NULL_DEF_OPERAND_P;
872 ptr->iter_type = ssa_op_iter_def;
873 /* The first call to op_iter_next_def will terminate the iterator since
874 all the fields are NULL. Simply return the result here as the first and
875 therefore only result. */
876 return PHI_RESULT_PTR (phi);
879 /* Return true is IMM has reached the end of the immediate use stmt list. */
881 static inline bool
882 end_imm_use_stmt_p (const imm_use_iterator *imm)
884 return (imm->imm_use == imm->end_p);
887 /* Finished the traverse of an immediate use stmt list IMM by removing the
888 placeholder node from the list. */
890 static inline void
891 end_imm_use_stmt_traverse (imm_use_iterator *imm)
893 delink_imm_use (&(imm->iter_node));
896 /* Immediate use traversal of uses within a stmt require that all the
897 uses on a stmt be sequentially listed. This routine is used to build up
898 this sequential list by adding USE_P to the end of the current list
899 currently delimited by HEAD and LAST_P. The new LAST_P value is
900 returned. */
902 static inline use_operand_p
903 move_use_after_head (use_operand_p use_p, use_operand_p head,
904 use_operand_p last_p)
906 gcc_checking_assert (USE_FROM_PTR (use_p) == USE_FROM_PTR (head));
907 /* Skip head when we find it. */
908 if (use_p != head)
910 /* If use_p is already linked in after last_p, continue. */
911 if (last_p->next == use_p)
912 last_p = use_p;
913 else
915 /* Delink from current location, and link in at last_p. */
916 delink_imm_use (use_p);
917 link_imm_use_to_list (use_p, last_p);
918 last_p = use_p;
921 return last_p;
925 /* This routine will relink all uses with the same stmt as HEAD into the list
926 immediately following HEAD for iterator IMM. */
928 static inline void
929 link_use_stmts_after (use_operand_p head, imm_use_iterator *imm)
931 use_operand_p use_p;
932 use_operand_p last_p = head;
933 gimple head_stmt = USE_STMT (head);
934 tree use = USE_FROM_PTR (head);
935 ssa_op_iter op_iter;
936 int flag;
938 /* Only look at virtual or real uses, depending on the type of HEAD. */
939 flag = (is_gimple_reg (use) ? SSA_OP_USE : SSA_OP_VIRTUAL_USES);
941 if (gimple_code (head_stmt) == GIMPLE_PHI)
943 FOR_EACH_PHI_ARG (use_p, head_stmt, op_iter, flag)
944 if (USE_FROM_PTR (use_p) == use)
945 last_p = move_use_after_head (use_p, head, last_p);
947 else
949 if (flag == SSA_OP_USE)
951 FOR_EACH_SSA_USE_OPERAND (use_p, head_stmt, op_iter, flag)
952 if (USE_FROM_PTR (use_p) == use)
953 last_p = move_use_after_head (use_p, head, last_p);
955 else if ((use_p = gimple_vuse_op (head_stmt)) != NULL_USE_OPERAND_P)
957 if (USE_FROM_PTR (use_p) == use)
958 last_p = move_use_after_head (use_p, head, last_p);
961 /* Link iter node in after last_p. */
962 if (imm->iter_node.prev != NULL)
963 delink_imm_use (&imm->iter_node);
964 link_imm_use_to_list (&(imm->iter_node), last_p);
967 /* Initialize IMM to traverse over uses of VAR. Return the first statement. */
968 static inline gimple
969 first_imm_use_stmt (imm_use_iterator *imm, tree var)
971 imm->end_p = &(SSA_NAME_IMM_USE_NODE (var));
972 imm->imm_use = imm->end_p->next;
973 imm->next_imm_name = NULL_USE_OPERAND_P;
975 /* iter_node is used as a marker within the immediate use list to indicate
976 where the end of the current stmt's uses are. Initialize it to NULL
977 stmt and use, which indicates a marker node. */
978 imm->iter_node.prev = NULL_USE_OPERAND_P;
979 imm->iter_node.next = NULL_USE_OPERAND_P;
980 imm->iter_node.loc.stmt = NULL;
981 imm->iter_node.use = NULL;
983 if (end_imm_use_stmt_p (imm))
984 return NULL;
986 link_use_stmts_after (imm->imm_use, imm);
988 return USE_STMT (imm->imm_use);
991 /* Bump IMM to the next stmt which has a use of var. */
993 static inline gimple
994 next_imm_use_stmt (imm_use_iterator *imm)
996 imm->imm_use = imm->iter_node.next;
997 if (end_imm_use_stmt_p (imm))
999 if (imm->iter_node.prev != NULL)
1000 delink_imm_use (&imm->iter_node);
1001 return NULL;
1004 link_use_stmts_after (imm->imm_use, imm);
1005 return USE_STMT (imm->imm_use);
1008 /* This routine will return the first use on the stmt IMM currently refers
1009 to. */
1011 static inline use_operand_p
1012 first_imm_use_on_stmt (imm_use_iterator *imm)
1014 imm->next_imm_name = imm->imm_use->next;
1015 return imm->imm_use;
1018 /* Return TRUE if the last use on the stmt IMM refers to has been visited. */
1020 static inline bool
1021 end_imm_use_on_stmt_p (const imm_use_iterator *imm)
1023 return (imm->imm_use == &(imm->iter_node));
1026 /* Bump to the next use on the stmt IMM refers to, return NULL if done. */
1028 static inline use_operand_p
1029 next_imm_use_on_stmt (imm_use_iterator *imm)
1031 imm->imm_use = imm->next_imm_name;
1032 if (end_imm_use_on_stmt_p (imm))
1033 return NULL_USE_OPERAND_P;
1034 else
1036 imm->next_imm_name = imm->imm_use->next;
1037 return imm->imm_use;
1041 /* Return true if VAR cannot be modified by the program. */
1043 static inline bool
1044 unmodifiable_var_p (const_tree var)
1046 if (TREE_CODE (var) == SSA_NAME)
1047 var = SSA_NAME_VAR (var);
1049 return TREE_READONLY (var) && (TREE_STATIC (var) || DECL_EXTERNAL (var));
1052 /* Return true if REF, a handled component reference, has an ARRAY_REF
1053 somewhere in it. */
1055 static inline bool
1056 ref_contains_array_ref (const_tree ref)
1058 gcc_checking_assert (handled_component_p (ref));
1060 do {
1061 if (TREE_CODE (ref) == ARRAY_REF)
1062 return true;
1063 ref = TREE_OPERAND (ref, 0);
1064 } while (handled_component_p (ref));
1066 return false;
1069 /* Return true if REF has an VIEW_CONVERT_EXPR somewhere in it. */
1071 static inline bool
1072 contains_view_convert_expr_p (const_tree ref)
1074 while (handled_component_p (ref))
1076 if (TREE_CODE (ref) == VIEW_CONVERT_EXPR)
1077 return true;
1078 ref = TREE_OPERAND (ref, 0);
1081 return false;
1084 /* Return true, if the two ranges [POS1, SIZE1] and [POS2, SIZE2]
1085 overlap. SIZE1 and/or SIZE2 can be (unsigned)-1 in which case the
1086 range is open-ended. Otherwise return false. */
1088 static inline bool
1089 ranges_overlap_p (unsigned HOST_WIDE_INT pos1,
1090 unsigned HOST_WIDE_INT size1,
1091 unsigned HOST_WIDE_INT pos2,
1092 unsigned HOST_WIDE_INT size2)
1094 if (pos1 >= pos2
1095 && (size2 == (unsigned HOST_WIDE_INT)-1
1096 || pos1 < (pos2 + size2)))
1097 return true;
1098 if (pos2 >= pos1
1099 && (size1 == (unsigned HOST_WIDE_INT)-1
1100 || pos2 < (pos1 + size1)))
1101 return true;
1103 return false;
1106 /* Accessor to tree-ssa-operands.c caches. */
1107 static inline struct ssa_operands *
1108 gimple_ssa_operands (const struct function *fun)
1110 return &fun->gimple_df->ssa_operands;
1113 /* Given an edge_var_map V, return the PHI arg definition. */
1115 static inline tree
1116 redirect_edge_var_map_def (edge_var_map *v)
1118 return v->def;
1121 /* Given an edge_var_map V, return the PHI result. */
1123 static inline tree
1124 redirect_edge_var_map_result (edge_var_map *v)
1126 return v->result;
1129 /* Given an edge_var_map V, return the PHI arg location. */
1131 static inline source_location
1132 redirect_edge_var_map_location (edge_var_map *v)
1134 return v->locus;
1138 /* Return an SSA_NAME node for variable VAR defined in statement STMT
1139 in function cfun. */
1141 static inline tree
1142 make_ssa_name (tree var, gimple stmt)
1144 return make_ssa_name_fn (cfun, var, stmt);
1147 /* Return an SSA_NAME node using the template SSA name NAME defined in
1148 statement STMT in function cfun. */
1150 static inline tree
1151 copy_ssa_name (tree var, gimple stmt)
1153 return copy_ssa_name_fn (cfun, var, stmt);
1156 /* Creates a duplicate of a SSA name NAME tobe defined by statement STMT
1157 in function cfun. */
1159 static inline tree
1160 duplicate_ssa_name (tree var, gimple stmt)
1162 return duplicate_ssa_name_fn (cfun, var, stmt);
1165 /* Return an anonymous SSA_NAME node for type TYPE defined in statement STMT
1166 in function cfun. Arrange so that it uses NAME in dumps. */
1168 static inline tree
1169 make_temp_ssa_name (tree type, gimple stmt, const char *name)
1171 tree ssa_name;
1172 gcc_checking_assert (TYPE_P (type));
1173 ssa_name = make_ssa_name_fn (cfun, type, stmt);
1174 SET_SSA_NAME_VAR_OR_IDENTIFIER (ssa_name, get_identifier (name));
1175 return ssa_name;
1178 /* Returns the base object and a constant BITS_PER_UNIT offset in *POFFSET that
1179 denotes the starting address of the memory access EXP.
1180 Returns NULL_TREE if the offset is not constant or any component
1181 is not BITS_PER_UNIT-aligned.
1182 VALUEIZE if non-NULL is used to valueize SSA names. It should return
1183 its argument or a constant if the argument is known to be constant. */
1184 /* ??? This is a static inline here to avoid the overhead of the indirect calls
1185 to VALUEIZE. But is this overhead really that significant? And should we
1186 perhaps just rely on WHOPR to specialize the function? */
1188 static inline tree
1189 get_addr_base_and_unit_offset_1 (tree exp, HOST_WIDE_INT *poffset,
1190 tree (*valueize) (tree))
1192 HOST_WIDE_INT byte_offset = 0;
1194 /* Compute cumulative byte-offset for nested component-refs and array-refs,
1195 and find the ultimate containing object. */
1196 while (1)
1198 switch (TREE_CODE (exp))
1200 case BIT_FIELD_REF:
1201 return NULL_TREE;
1203 case COMPONENT_REF:
1205 tree field = TREE_OPERAND (exp, 1);
1206 tree this_offset = component_ref_field_offset (exp);
1207 HOST_WIDE_INT hthis_offset;
1209 if (!this_offset
1210 || TREE_CODE (this_offset) != INTEGER_CST
1211 || (TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (field))
1212 % BITS_PER_UNIT))
1213 return NULL_TREE;
1215 hthis_offset = TREE_INT_CST_LOW (this_offset);
1216 hthis_offset += (TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (field))
1217 / BITS_PER_UNIT);
1218 byte_offset += hthis_offset;
1220 break;
1222 case ARRAY_REF:
1223 case ARRAY_RANGE_REF:
1225 tree index = TREE_OPERAND (exp, 1);
1226 tree low_bound, unit_size;
1228 if (valueize
1229 && TREE_CODE (index) == SSA_NAME)
1230 index = (*valueize) (index);
1232 /* If the resulting bit-offset is constant, track it. */
1233 if (TREE_CODE (index) == INTEGER_CST
1234 && (low_bound = array_ref_low_bound (exp),
1235 TREE_CODE (low_bound) == INTEGER_CST)
1236 && (unit_size = array_ref_element_size (exp),
1237 TREE_CODE (unit_size) == INTEGER_CST))
1239 HOST_WIDE_INT hindex = TREE_INT_CST_LOW (index);
1241 hindex -= TREE_INT_CST_LOW (low_bound);
1242 hindex *= TREE_INT_CST_LOW (unit_size);
1243 byte_offset += hindex;
1245 else
1246 return NULL_TREE;
1248 break;
1250 case REALPART_EXPR:
1251 break;
1253 case IMAGPART_EXPR:
1254 byte_offset += TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (exp)));
1255 break;
1257 case VIEW_CONVERT_EXPR:
1258 break;
1260 case MEM_REF:
1262 tree base = TREE_OPERAND (exp, 0);
1263 if (valueize
1264 && TREE_CODE (base) == SSA_NAME)
1265 base = (*valueize) (base);
1267 /* Hand back the decl for MEM[&decl, off]. */
1268 if (TREE_CODE (base) == ADDR_EXPR)
1270 if (!integer_zerop (TREE_OPERAND (exp, 1)))
1272 double_int off = mem_ref_offset (exp);
1273 gcc_assert (off.high == -1 || off.high == 0);
1274 byte_offset += off.to_shwi ();
1276 exp = TREE_OPERAND (base, 0);
1278 goto done;
1281 case TARGET_MEM_REF:
1283 tree base = TREE_OPERAND (exp, 0);
1284 if (valueize
1285 && TREE_CODE (base) == SSA_NAME)
1286 base = (*valueize) (base);
1288 /* Hand back the decl for MEM[&decl, off]. */
1289 if (TREE_CODE (base) == ADDR_EXPR)
1291 if (TMR_INDEX (exp) || TMR_INDEX2 (exp))
1292 return NULL_TREE;
1293 if (!integer_zerop (TMR_OFFSET (exp)))
1295 double_int off = mem_ref_offset (exp);
1296 gcc_assert (off.high == -1 || off.high == 0);
1297 byte_offset += off.to_shwi ();
1299 exp = TREE_OPERAND (base, 0);
1301 goto done;
1304 default:
1305 goto done;
1308 exp = TREE_OPERAND (exp, 0);
1310 done:
1312 *poffset = byte_offset;
1313 return exp;
1316 #endif /* _TREE_FLOW_INLINE_H */