change a function argument from rtx to rtx_insn *
[official-gcc.git] / gcc / ssa-iterators.h
blobe04b630b2ffe32af0df07f8eb6095e498e260db0
1 /* Header file for SSA iterators.
2 Copyright (C) 2013-2015 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 for more details.
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
20 #ifndef GCC_SSA_ITERATORS_H
21 #define GCC_SSA_ITERATORS_H
23 /* Immediate use lists are used to directly access all uses for an SSA
24 name and get pointers to the statement for each use.
26 The structure ssa_use_operand_t consists of PREV and NEXT pointers
27 to maintain the list. A USE pointer, which points to address where
28 the use is located and a LOC pointer which can point to the
29 statement where the use is located, or, in the case of the root
30 node, it points to the SSA name itself.
32 The list is anchored by an occurrence of ssa_operand_d *in* the
33 ssa_name node itself (named 'imm_uses'). This node is uniquely
34 identified by having a NULL USE pointer. and the LOC pointer
35 pointing back to the ssa_name node itself. This node forms the
36 base for a circular list, and initially this is the only node in
37 the list.
39 Fast iteration allows each use to be examined, but does not allow
40 any modifications to the uses or stmts.
42 Normal iteration allows insertion, deletion, and modification. the
43 iterator manages this by inserting a marker node into the list
44 immediately before the node currently being examined in the list.
45 this marker node is uniquely identified by having null stmt *and* a
46 null use pointer.
48 When iterating to the next use, the iteration routines check to see
49 if the node after the marker has changed. if it has, then the node
50 following the marker is now the next one to be visited. if not, the
51 marker node is moved past that node in the list (visualize it as
52 bumping the marker node through the list). this continues until
53 the marker node is moved to the original anchor position. the
54 marker node is then removed from the list.
56 If iteration is halted early, the marker node must be removed from
57 the list before continuing. */
58 struct imm_use_iterator
60 /* This is the current use the iterator is processing. */
61 ssa_use_operand_t *imm_use;
62 /* This marks the last use in the list (use node from SSA_NAME) */
63 ssa_use_operand_t *end_p;
64 /* This node is inserted and used to mark the end of the uses for a stmt. */
65 ssa_use_operand_t iter_node;
66 /* This is the next ssa_name to visit. IMM_USE may get removed before
67 the next one is traversed to, so it must be cached early. */
68 ssa_use_operand_t *next_imm_name;
72 /* Use this iterator when simply looking at stmts. Adding, deleting or
73 modifying stmts will cause this iterator to malfunction. */
75 #define FOR_EACH_IMM_USE_FAST(DEST, ITER, SSAVAR) \
76 for ((DEST) = first_readonly_imm_use (&(ITER), (SSAVAR)); \
77 !end_readonly_imm_use_p (&(ITER)); \
78 (void) ((DEST) = next_readonly_imm_use (&(ITER))))
80 /* Use this iterator to visit each stmt which has a use of SSAVAR. */
82 #define FOR_EACH_IMM_USE_STMT(STMT, ITER, SSAVAR) \
83 for ((STMT) = first_imm_use_stmt (&(ITER), (SSAVAR)); \
84 !end_imm_use_stmt_p (&(ITER)); \
85 (void) ((STMT) = next_imm_use_stmt (&(ITER))))
87 /* Use this to terminate the FOR_EACH_IMM_USE_STMT loop early. Failure to
88 do so will result in leaving a iterator marker node in the immediate
89 use list, and nothing good will come from that. */
90 #define BREAK_FROM_IMM_USE_STMT(ITER) \
91 { \
92 end_imm_use_stmt_traverse (&(ITER)); \
93 break; \
97 /* Use this iterator in combination with FOR_EACH_IMM_USE_STMT to
98 get access to each occurrence of ssavar on the stmt returned by
99 that iterator.. for instance:
101 FOR_EACH_IMM_USE_STMT (stmt, iter, ssavar)
103 FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
105 SET_USE (use_p, blah);
107 update_stmt (stmt);
108 } */
110 #define FOR_EACH_IMM_USE_ON_STMT(DEST, ITER) \
111 for ((DEST) = first_imm_use_on_stmt (&(ITER)); \
112 !end_imm_use_on_stmt_p (&(ITER)); \
113 (void) ((DEST) = next_imm_use_on_stmt (&(ITER))))
117 extern bool single_imm_use_1 (const ssa_use_operand_t *head,
118 use_operand_p *use_p, gimple **stmt);
121 enum ssa_op_iter_type {
122 ssa_op_iter_none = 0,
123 ssa_op_iter_tree,
124 ssa_op_iter_use,
125 ssa_op_iter_def
128 /* This structure is used in the operand iterator loops. It contains the
129 items required to determine which operand is retrieved next. During
130 optimization, this structure is scalarized, and any unused fields are
131 optimized away, resulting in little overhead. */
133 struct ssa_op_iter
135 enum ssa_op_iter_type iter_type;
136 bool done;
137 int flags;
138 unsigned i;
139 unsigned numops;
140 use_optype_p uses;
141 gimple *stmt;
144 /* NOTE: Keep these in sync with doc/tree-ssa.texi. */
145 /* These flags are used to determine which operands are returned during
146 execution of the loop. */
147 #define SSA_OP_USE 0x01 /* Real USE operands. */
148 #define SSA_OP_DEF 0x02 /* Real DEF operands. */
149 #define SSA_OP_VUSE 0x04 /* VUSE operands. */
150 #define SSA_OP_VDEF 0x08 /* VDEF operands. */
151 /* These are commonly grouped operand flags. */
152 #define SSA_OP_VIRTUAL_USES (SSA_OP_VUSE)
153 #define SSA_OP_VIRTUAL_DEFS (SSA_OP_VDEF)
154 #define SSA_OP_ALL_VIRTUALS (SSA_OP_VIRTUAL_USES | SSA_OP_VIRTUAL_DEFS)
155 #define SSA_OP_ALL_USES (SSA_OP_VIRTUAL_USES | SSA_OP_USE)
156 #define SSA_OP_ALL_DEFS (SSA_OP_VIRTUAL_DEFS | SSA_OP_DEF)
157 #define SSA_OP_ALL_OPERANDS (SSA_OP_ALL_USES | SSA_OP_ALL_DEFS)
159 /* This macro executes a loop over the operands of STMT specified in FLAG,
160 returning each operand as a 'tree' in the variable TREEVAR. ITER is an
161 ssa_op_iter structure used to control the loop. */
162 #define FOR_EACH_SSA_TREE_OPERAND(TREEVAR, STMT, ITER, FLAGS) \
163 for (TREEVAR = op_iter_init_tree (&(ITER), STMT, FLAGS); \
164 !op_iter_done (&(ITER)); \
165 (void) (TREEVAR = op_iter_next_tree (&(ITER))))
167 /* This macro executes a loop over the operands of STMT specified in FLAG,
168 returning each operand as a 'use_operand_p' in the variable USEVAR.
169 ITER is an ssa_op_iter structure used to control the loop. */
170 #define FOR_EACH_SSA_USE_OPERAND(USEVAR, STMT, ITER, FLAGS) \
171 for (USEVAR = op_iter_init_use (&(ITER), STMT, FLAGS); \
172 !op_iter_done (&(ITER)); \
173 USEVAR = op_iter_next_use (&(ITER)))
175 /* This macro executes a loop over the operands of STMT specified in FLAG,
176 returning each operand as a 'def_operand_p' in the variable DEFVAR.
177 ITER is an ssa_op_iter structure used to control the loop. */
178 #define FOR_EACH_SSA_DEF_OPERAND(DEFVAR, STMT, ITER, FLAGS) \
179 for (DEFVAR = op_iter_init_def (&(ITER), STMT, FLAGS); \
180 !op_iter_done (&(ITER)); \
181 DEFVAR = op_iter_next_def (&(ITER)))
183 /* This macro will execute a loop over all the arguments of a PHI which
184 match FLAGS. A use_operand_p is always returned via USEVAR. FLAGS
185 can be either SSA_OP_USE or SSA_OP_VIRTUAL_USES or SSA_OP_ALL_USES. */
186 #define FOR_EACH_PHI_ARG(USEVAR, STMT, ITER, FLAGS) \
187 for ((USEVAR) = op_iter_init_phiuse (&(ITER), STMT, FLAGS); \
188 !op_iter_done (&(ITER)); \
189 (USEVAR) = op_iter_next_use (&(ITER)))
192 /* This macro will execute a loop over a stmt, regardless of whether it is
193 a real stmt or a PHI node, looking at the USE nodes matching FLAGS. */
194 #define FOR_EACH_PHI_OR_STMT_USE(USEVAR, STMT, ITER, FLAGS) \
195 for ((USEVAR) = (gimple_code (STMT) == GIMPLE_PHI \
196 ? op_iter_init_phiuse (&(ITER), \
197 as_a <gphi *> (STMT), \
198 FLAGS) \
199 : op_iter_init_use (&(ITER), STMT, FLAGS)); \
200 !op_iter_done (&(ITER)); \
201 (USEVAR) = op_iter_next_use (&(ITER)))
203 /* This macro will execute a loop over a stmt, regardless of whether it is
204 a real stmt or a PHI node, looking at the DEF nodes matching FLAGS. */
205 #define FOR_EACH_PHI_OR_STMT_DEF(DEFVAR, STMT, ITER, FLAGS) \
206 for ((DEFVAR) = (gimple_code (STMT) == GIMPLE_PHI \
207 ? op_iter_init_phidef (&(ITER), \
208 as_a <gphi *> (STMT), \
209 FLAGS) \
210 : op_iter_init_def (&(ITER), STMT, FLAGS)); \
211 !op_iter_done (&(ITER)); \
212 (DEFVAR) = op_iter_next_def (&(ITER)))
214 /* This macro returns an operand in STMT as a tree if it is the ONLY
215 operand matching FLAGS. If there are 0 or more than 1 operand matching
216 FLAGS, then NULL_TREE is returned. */
217 #define SINGLE_SSA_TREE_OPERAND(STMT, FLAGS) \
218 single_ssa_tree_operand (STMT, FLAGS)
220 /* This macro returns an operand in STMT as a use_operand_p if it is the ONLY
221 operand matching FLAGS. If there are 0 or more than 1 operand matching
222 FLAGS, then NULL_USE_OPERAND_P is returned. */
223 #define SINGLE_SSA_USE_OPERAND(STMT, FLAGS) \
224 single_ssa_use_operand (STMT, FLAGS)
226 /* This macro returns an operand in STMT as a def_operand_p if it is the ONLY
227 operand matching FLAGS. If there are 0 or more than 1 operand matching
228 FLAGS, then NULL_DEF_OPERAND_P is returned. */
229 #define SINGLE_SSA_DEF_OPERAND(STMT, FLAGS) \
230 single_ssa_def_operand (STMT, FLAGS)
232 /* This macro returns TRUE if there are no operands matching FLAGS in STMT. */
233 #define ZERO_SSA_OPERANDS(STMT, FLAGS) zero_ssa_operands (STMT, FLAGS)
235 /* This macro counts the number of operands in STMT matching FLAGS. */
236 #define NUM_SSA_OPERANDS(STMT, FLAGS) num_ssa_operands (STMT, FLAGS)
239 /* Delink an immediate_uses node from its chain. */
240 static inline void
241 delink_imm_use (ssa_use_operand_t *linknode)
243 /* Return if this node is not in a list. */
244 if (linknode->prev == NULL)
245 return;
247 linknode->prev->next = linknode->next;
248 linknode->next->prev = linknode->prev;
249 linknode->prev = NULL;
250 linknode->next = NULL;
253 /* Link ssa_imm_use node LINKNODE into the chain for LIST. */
254 static inline void
255 link_imm_use_to_list (ssa_use_operand_t *linknode, ssa_use_operand_t *list)
257 /* Link the new node at the head of the list. If we are in the process of
258 traversing the list, we won't visit any new nodes added to it. */
259 linknode->prev = list;
260 linknode->next = list->next;
261 list->next->prev = linknode;
262 list->next = linknode;
265 /* Link ssa_imm_use node LINKNODE into the chain for DEF. */
266 static inline void
267 link_imm_use (ssa_use_operand_t *linknode, tree def)
269 ssa_use_operand_t *root;
271 if (!def || TREE_CODE (def) != SSA_NAME)
272 linknode->prev = NULL;
273 else
275 root = &(SSA_NAME_IMM_USE_NODE (def));
276 if (linknode->use)
277 gcc_checking_assert (*(linknode->use) == def);
278 link_imm_use_to_list (linknode, root);
282 /* Set the value of a use pointed to by USE to VAL. */
283 static inline void
284 set_ssa_use_from_ptr (use_operand_p use, tree val)
286 delink_imm_use (use);
287 *(use->use) = val;
288 link_imm_use (use, val);
291 /* Link ssa_imm_use node LINKNODE into the chain for DEF, with use occurring
292 in STMT. */
293 static inline void
294 link_imm_use_stmt (ssa_use_operand_t *linknode, tree def, gimple *stmt)
296 if (stmt)
297 link_imm_use (linknode, def);
298 else
299 link_imm_use (linknode, NULL);
300 linknode->loc.stmt = stmt;
303 /* Relink a new node in place of an old node in the list. */
304 static inline void
305 relink_imm_use (ssa_use_operand_t *node, ssa_use_operand_t *old)
307 /* The node one had better be in the same list. */
308 gcc_checking_assert (*(old->use) == *(node->use));
309 node->prev = old->prev;
310 node->next = old->next;
311 if (old->prev)
313 old->prev->next = node;
314 old->next->prev = node;
315 /* Remove the old node from the list. */
316 old->prev = NULL;
320 /* Relink ssa_imm_use node LINKNODE into the chain for OLD, with use occurring
321 in STMT. */
322 static inline void
323 relink_imm_use_stmt (ssa_use_operand_t *linknode, ssa_use_operand_t *old,
324 gimple *stmt)
326 if (stmt)
327 relink_imm_use (linknode, old);
328 else
329 link_imm_use (linknode, NULL);
330 linknode->loc.stmt = stmt;
334 /* Return true is IMM has reached the end of the immediate use list. */
335 static inline bool
336 end_readonly_imm_use_p (const imm_use_iterator *imm)
338 return (imm->imm_use == imm->end_p);
341 /* Initialize iterator IMM to process the list for VAR. */
342 static inline use_operand_p
343 first_readonly_imm_use (imm_use_iterator *imm, tree var)
345 imm->end_p = &(SSA_NAME_IMM_USE_NODE (var));
346 imm->imm_use = imm->end_p->next;
347 #ifdef ENABLE_CHECKING
348 imm->iter_node.next = imm->imm_use->next;
349 #endif
350 if (end_readonly_imm_use_p (imm))
351 return NULL_USE_OPERAND_P;
352 return imm->imm_use;
355 /* Bump IMM to the next use in the list. */
356 static inline use_operand_p
357 next_readonly_imm_use (imm_use_iterator *imm)
359 use_operand_p old = imm->imm_use;
361 #ifdef ENABLE_CHECKING
362 /* If this assertion fails, it indicates the 'next' pointer has changed
363 since the last bump. This indicates that the list is being modified
364 via stmt changes, or SET_USE, or somesuch thing, and you need to be
365 using the SAFE version of the iterator. */
366 gcc_assert (imm->iter_node.next == old->next);
367 imm->iter_node.next = old->next->next;
368 #endif
370 imm->imm_use = old->next;
371 if (end_readonly_imm_use_p (imm))
372 return NULL_USE_OPERAND_P;
373 return imm->imm_use;
377 /* Return true if VAR has no nondebug uses. */
378 static inline bool
379 has_zero_uses (const_tree var)
381 const ssa_use_operand_t *const head = &(SSA_NAME_IMM_USE_NODE (var));
382 const ssa_use_operand_t *ptr;
384 for (ptr = head->next; ptr != head; ptr = ptr->next)
385 if (USE_STMT (ptr) && !is_gimple_debug (USE_STMT (ptr)))
386 return false;
388 return true;
391 /* Return true if VAR has a single nondebug use. */
392 static inline bool
393 has_single_use (const_tree var)
395 const ssa_use_operand_t *const head = &(SSA_NAME_IMM_USE_NODE (var));
396 const ssa_use_operand_t *ptr;
397 bool single = false;
399 for (ptr = head->next; ptr != head; ptr = ptr->next)
400 if (USE_STMT(ptr) && !is_gimple_debug (USE_STMT (ptr)))
402 if (single)
403 return false;
404 else
405 single = true;
408 return single;
411 /* If VAR has only a single immediate nondebug use, return true, and
412 set USE_P and STMT to the use pointer and stmt of occurrence. */
413 static inline bool
414 single_imm_use (const_tree var, use_operand_p *use_p, gimple **stmt)
416 const ssa_use_operand_t *const ptr = &(SSA_NAME_IMM_USE_NODE (var));
418 /* If there aren't any uses whatsoever, we're done. */
419 if (ptr == ptr->next)
421 return_false:
422 *use_p = NULL_USE_OPERAND_P;
423 *stmt = NULL;
424 return false;
427 /* If there's a single use, check that it's not a debug stmt. */
428 if (ptr == ptr->next->next)
430 if (USE_STMT (ptr->next) && !is_gimple_debug (USE_STMT (ptr->next)))
432 *use_p = ptr->next;
433 *stmt = ptr->next->loc.stmt;
434 return true;
436 else
437 goto return_false;
440 return single_imm_use_1 (ptr, use_p, stmt);
443 /* Return the number of nondebug immediate uses of VAR. */
444 static inline unsigned int
445 num_imm_uses (const_tree var)
447 const ssa_use_operand_t *const start = &(SSA_NAME_IMM_USE_NODE (var));
448 const ssa_use_operand_t *ptr;
449 unsigned int num = 0;
451 if (!MAY_HAVE_DEBUG_STMTS)
452 for (ptr = start->next; ptr != start; ptr = ptr->next)
453 if (USE_STMT (ptr))
454 num++;
455 else
456 for (ptr = start->next; ptr != start; ptr = ptr->next)
457 if (USE_STMT (ptr) && !is_gimple_debug (USE_STMT (ptr)))
458 num++;
460 return num;
463 /* ----------------------------------------------------------------------- */
465 /* The following set of routines are used to iterator over various type of
466 SSA operands. */
468 /* Return true if PTR is finished iterating. */
469 static inline bool
470 op_iter_done (const ssa_op_iter *ptr)
472 return ptr->done;
475 /* Get the next iterator use value for PTR. */
476 static inline use_operand_p
477 op_iter_next_use (ssa_op_iter *ptr)
479 use_operand_p use_p;
480 gcc_checking_assert (ptr->iter_type == ssa_op_iter_use);
481 if (ptr->uses)
483 use_p = USE_OP_PTR (ptr->uses);
484 ptr->uses = ptr->uses->next;
485 return use_p;
487 if (ptr->i < ptr->numops)
489 return PHI_ARG_DEF_PTR (ptr->stmt, (ptr->i)++);
491 ptr->done = true;
492 return NULL_USE_OPERAND_P;
495 /* Get the next iterator def value for PTR. */
496 static inline def_operand_p
497 op_iter_next_def (ssa_op_iter *ptr)
499 gcc_checking_assert (ptr->iter_type == ssa_op_iter_def);
500 if (ptr->flags & SSA_OP_VDEF)
502 tree *p;
503 ptr->flags &= ~SSA_OP_VDEF;
504 p = gimple_vdef_ptr (ptr->stmt);
505 if (p && *p)
506 return p;
508 if (ptr->flags & SSA_OP_DEF)
510 while (ptr->i < ptr->numops)
512 tree *val = gimple_op_ptr (ptr->stmt, ptr->i);
513 ptr->i++;
514 if (*val)
516 if (TREE_CODE (*val) == TREE_LIST)
517 val = &TREE_VALUE (*val);
518 if (TREE_CODE (*val) == SSA_NAME
519 || is_gimple_reg (*val))
520 return val;
523 ptr->flags &= ~SSA_OP_DEF;
526 ptr->done = true;
527 return NULL_DEF_OPERAND_P;
530 /* Get the next iterator tree value for PTR. */
531 static inline tree
532 op_iter_next_tree (ssa_op_iter *ptr)
534 tree val;
535 gcc_checking_assert (ptr->iter_type == ssa_op_iter_tree);
536 if (ptr->uses)
538 val = USE_OP (ptr->uses);
539 ptr->uses = ptr->uses->next;
540 return val;
542 if (ptr->flags & SSA_OP_VDEF)
544 ptr->flags &= ~SSA_OP_VDEF;
545 if ((val = gimple_vdef (ptr->stmt)))
546 return val;
548 if (ptr->flags & SSA_OP_DEF)
550 while (ptr->i < ptr->numops)
552 val = gimple_op (ptr->stmt, ptr->i);
553 ptr->i++;
554 if (val)
556 if (TREE_CODE (val) == TREE_LIST)
557 val = TREE_VALUE (val);
558 if (TREE_CODE (val) == SSA_NAME
559 || is_gimple_reg (val))
560 return val;
563 ptr->flags &= ~SSA_OP_DEF;
566 ptr->done = true;
567 return NULL_TREE;
571 /* This functions clears the iterator PTR, and marks it done. This is normally
572 used to prevent warnings in the compile about might be uninitialized
573 components. */
575 static inline void
576 clear_and_done_ssa_iter (ssa_op_iter *ptr)
578 ptr->i = 0;
579 ptr->numops = 0;
580 ptr->uses = NULL;
581 ptr->iter_type = ssa_op_iter_none;
582 ptr->stmt = NULL;
583 ptr->done = true;
584 ptr->flags = 0;
587 /* Initialize the iterator PTR to the virtual defs in STMT. */
588 static inline void
589 op_iter_init (ssa_op_iter *ptr, gimple *stmt, int flags)
591 /* PHI nodes require a different iterator initialization path. We
592 do not support iterating over virtual defs or uses without
593 iterating over defs or uses at the same time. */
594 gcc_checking_assert (gimple_code (stmt) != GIMPLE_PHI
595 && (!(flags & SSA_OP_VDEF) || (flags & SSA_OP_DEF))
596 && (!(flags & SSA_OP_VUSE) || (flags & SSA_OP_USE)));
597 ptr->numops = 0;
598 if (flags & (SSA_OP_DEF | SSA_OP_VDEF))
600 switch (gimple_code (stmt))
602 case GIMPLE_ASSIGN:
603 case GIMPLE_CALL:
604 ptr->numops = 1;
605 break;
606 case GIMPLE_ASM:
607 ptr->numops = gimple_asm_noutputs (as_a <gasm *> (stmt));
608 break;
609 default:
610 ptr->numops = 0;
611 flags &= ~(SSA_OP_DEF | SSA_OP_VDEF);
612 break;
615 ptr->uses = (flags & (SSA_OP_USE|SSA_OP_VUSE)) ? gimple_use_ops (stmt) : NULL;
616 if (!(flags & SSA_OP_VUSE)
617 && ptr->uses
618 && gimple_vuse (stmt) != NULL_TREE)
619 ptr->uses = ptr->uses->next;
620 ptr->done = false;
621 ptr->i = 0;
623 ptr->stmt = stmt;
624 ptr->flags = flags;
627 /* Initialize iterator PTR to the use operands in STMT based on FLAGS. Return
628 the first use. */
629 static inline use_operand_p
630 op_iter_init_use (ssa_op_iter *ptr, gimple *stmt, int flags)
632 gcc_checking_assert ((flags & SSA_OP_ALL_DEFS) == 0
633 && (flags & SSA_OP_USE));
634 op_iter_init (ptr, stmt, flags);
635 ptr->iter_type = ssa_op_iter_use;
636 return op_iter_next_use (ptr);
639 /* Initialize iterator PTR to the def operands in STMT based on FLAGS. Return
640 the first def. */
641 static inline def_operand_p
642 op_iter_init_def (ssa_op_iter *ptr, gimple *stmt, int flags)
644 gcc_checking_assert ((flags & SSA_OP_ALL_USES) == 0
645 && (flags & SSA_OP_DEF));
646 op_iter_init (ptr, stmt, flags);
647 ptr->iter_type = ssa_op_iter_def;
648 return op_iter_next_def (ptr);
651 /* Initialize iterator PTR to the operands in STMT based on FLAGS. Return
652 the first operand as a tree. */
653 static inline tree
654 op_iter_init_tree (ssa_op_iter *ptr, gimple *stmt, int flags)
656 op_iter_init (ptr, stmt, flags);
657 ptr->iter_type = ssa_op_iter_tree;
658 return op_iter_next_tree (ptr);
662 /* If there is a single operand in STMT matching FLAGS, return it. Otherwise
663 return NULL. */
664 static inline tree
665 single_ssa_tree_operand (gimple *stmt, int flags)
667 tree var;
668 ssa_op_iter iter;
670 var = op_iter_init_tree (&iter, stmt, flags);
671 if (op_iter_done (&iter))
672 return NULL_TREE;
673 op_iter_next_tree (&iter);
674 if (op_iter_done (&iter))
675 return var;
676 return NULL_TREE;
680 /* If there is a single operand in STMT matching FLAGS, return it. Otherwise
681 return NULL. */
682 static inline use_operand_p
683 single_ssa_use_operand (gimple *stmt, int flags)
685 use_operand_p var;
686 ssa_op_iter iter;
688 var = op_iter_init_use (&iter, stmt, flags);
689 if (op_iter_done (&iter))
690 return NULL_USE_OPERAND_P;
691 op_iter_next_use (&iter);
692 if (op_iter_done (&iter))
693 return var;
694 return NULL_USE_OPERAND_P;
699 /* If there is a single operand in STMT matching FLAGS, return it. Otherwise
700 return NULL. */
701 static inline def_operand_p
702 single_ssa_def_operand (gimple *stmt, int flags)
704 def_operand_p var;
705 ssa_op_iter iter;
707 var = op_iter_init_def (&iter, stmt, flags);
708 if (op_iter_done (&iter))
709 return NULL_DEF_OPERAND_P;
710 op_iter_next_def (&iter);
711 if (op_iter_done (&iter))
712 return var;
713 return NULL_DEF_OPERAND_P;
717 /* Return true if there are zero operands in STMT matching the type
718 given in FLAGS. */
719 static inline bool
720 zero_ssa_operands (gimple *stmt, int flags)
722 ssa_op_iter iter;
724 op_iter_init_tree (&iter, stmt, flags);
725 return op_iter_done (&iter);
729 /* Return the number of operands matching FLAGS in STMT. */
730 static inline int
731 num_ssa_operands (gimple *stmt, int flags)
733 ssa_op_iter iter;
734 tree t;
735 int num = 0;
737 gcc_checking_assert (gimple_code (stmt) != GIMPLE_PHI);
738 FOR_EACH_SSA_TREE_OPERAND (t, stmt, iter, flags)
739 num++;
740 return num;
743 /* If there is a single DEF in the PHI node which matches FLAG, return it.
744 Otherwise return NULL_DEF_OPERAND_P. */
745 static inline tree
746 single_phi_def (gphi *stmt, int flags)
748 tree def = PHI_RESULT (stmt);
749 if ((flags & SSA_OP_DEF) && is_gimple_reg (def))
750 return def;
751 if ((flags & SSA_OP_VIRTUAL_DEFS) && !is_gimple_reg (def))
752 return def;
753 return NULL_TREE;
756 /* Initialize the iterator PTR for uses matching FLAGS in PHI. FLAGS should
757 be either SSA_OP_USES or SSA_OP_VIRTUAL_USES. */
758 static inline use_operand_p
759 op_iter_init_phiuse (ssa_op_iter *ptr, gphi *phi, int flags)
761 tree phi_def = gimple_phi_result (phi);
762 int comp;
764 clear_and_done_ssa_iter (ptr);
765 ptr->done = false;
767 gcc_checking_assert ((flags & (SSA_OP_USE | SSA_OP_VIRTUAL_USES)) != 0);
769 comp = (is_gimple_reg (phi_def) ? SSA_OP_USE : SSA_OP_VIRTUAL_USES);
771 /* If the PHI node doesn't the operand type we care about, we're done. */
772 if ((flags & comp) == 0)
774 ptr->done = true;
775 return NULL_USE_OPERAND_P;
778 ptr->stmt = phi;
779 ptr->numops = gimple_phi_num_args (phi);
780 ptr->iter_type = ssa_op_iter_use;
781 ptr->flags = flags;
782 return op_iter_next_use (ptr);
786 /* Start an iterator for a PHI definition. */
788 static inline def_operand_p
789 op_iter_init_phidef (ssa_op_iter *ptr, gphi *phi, int flags)
791 tree phi_def = PHI_RESULT (phi);
792 int comp;
794 clear_and_done_ssa_iter (ptr);
795 ptr->done = false;
797 gcc_checking_assert ((flags & (SSA_OP_DEF | SSA_OP_VIRTUAL_DEFS)) != 0);
799 comp = (is_gimple_reg (phi_def) ? SSA_OP_DEF : SSA_OP_VIRTUAL_DEFS);
801 /* If the PHI node doesn't have the operand type we care about,
802 we're done. */
803 if ((flags & comp) == 0)
805 ptr->done = true;
806 return NULL_DEF_OPERAND_P;
809 ptr->iter_type = ssa_op_iter_def;
810 /* The first call to op_iter_next_def will terminate the iterator since
811 all the fields are NULL. Simply return the result here as the first and
812 therefore only result. */
813 return PHI_RESULT_PTR (phi);
816 /* Return true is IMM has reached the end of the immediate use stmt list. */
818 static inline bool
819 end_imm_use_stmt_p (const imm_use_iterator *imm)
821 return (imm->imm_use == imm->end_p);
824 /* Finished the traverse of an immediate use stmt list IMM by removing the
825 placeholder node from the list. */
827 static inline void
828 end_imm_use_stmt_traverse (imm_use_iterator *imm)
830 delink_imm_use (&(imm->iter_node));
833 /* Immediate use traversal of uses within a stmt require that all the
834 uses on a stmt be sequentially listed. This routine is used to build up
835 this sequential list by adding USE_P to the end of the current list
836 currently delimited by HEAD and LAST_P. The new LAST_P value is
837 returned. */
839 static inline use_operand_p
840 move_use_after_head (use_operand_p use_p, use_operand_p head,
841 use_operand_p last_p)
843 gcc_checking_assert (USE_FROM_PTR (use_p) == USE_FROM_PTR (head));
844 /* Skip head when we find it. */
845 if (use_p != head)
847 /* If use_p is already linked in after last_p, continue. */
848 if (last_p->next == use_p)
849 last_p = use_p;
850 else
852 /* Delink from current location, and link in at last_p. */
853 delink_imm_use (use_p);
854 link_imm_use_to_list (use_p, last_p);
855 last_p = use_p;
858 return last_p;
862 /* This routine will relink all uses with the same stmt as HEAD into the list
863 immediately following HEAD for iterator IMM. */
865 static inline void
866 link_use_stmts_after (use_operand_p head, imm_use_iterator *imm)
868 use_operand_p use_p;
869 use_operand_p last_p = head;
870 gimple *head_stmt = USE_STMT (head);
871 tree use = USE_FROM_PTR (head);
872 ssa_op_iter op_iter;
873 int flag;
875 /* Only look at virtual or real uses, depending on the type of HEAD. */
876 flag = (is_gimple_reg (use) ? SSA_OP_USE : SSA_OP_VIRTUAL_USES);
878 if (gphi *phi = dyn_cast <gphi *> (head_stmt))
880 FOR_EACH_PHI_ARG (use_p, phi, op_iter, flag)
881 if (USE_FROM_PTR (use_p) == use)
882 last_p = move_use_after_head (use_p, head, last_p);
884 else
886 if (flag == SSA_OP_USE)
888 FOR_EACH_SSA_USE_OPERAND (use_p, head_stmt, op_iter, flag)
889 if (USE_FROM_PTR (use_p) == use)
890 last_p = move_use_after_head (use_p, head, last_p);
892 else if ((use_p = gimple_vuse_op (head_stmt)) != NULL_USE_OPERAND_P)
894 if (USE_FROM_PTR (use_p) == use)
895 last_p = move_use_after_head (use_p, head, last_p);
898 /* Link iter node in after last_p. */
899 if (imm->iter_node.prev != NULL)
900 delink_imm_use (&imm->iter_node);
901 link_imm_use_to_list (&(imm->iter_node), last_p);
904 /* Initialize IMM to traverse over uses of VAR. Return the first statement. */
905 static inline gimple *
906 first_imm_use_stmt (imm_use_iterator *imm, tree var)
908 imm->end_p = &(SSA_NAME_IMM_USE_NODE (var));
909 imm->imm_use = imm->end_p->next;
910 imm->next_imm_name = NULL_USE_OPERAND_P;
912 /* iter_node is used as a marker within the immediate use list to indicate
913 where the end of the current stmt's uses are. Initialize it to NULL
914 stmt and use, which indicates a marker node. */
915 imm->iter_node.prev = NULL_USE_OPERAND_P;
916 imm->iter_node.next = NULL_USE_OPERAND_P;
917 imm->iter_node.loc.stmt = NULL;
918 imm->iter_node.use = NULL;
920 if (end_imm_use_stmt_p (imm))
921 return NULL;
923 link_use_stmts_after (imm->imm_use, imm);
925 return USE_STMT (imm->imm_use);
928 /* Bump IMM to the next stmt which has a use of var. */
930 static inline gimple *
931 next_imm_use_stmt (imm_use_iterator *imm)
933 imm->imm_use = imm->iter_node.next;
934 if (end_imm_use_stmt_p (imm))
936 if (imm->iter_node.prev != NULL)
937 delink_imm_use (&imm->iter_node);
938 return NULL;
941 link_use_stmts_after (imm->imm_use, imm);
942 return USE_STMT (imm->imm_use);
945 /* This routine will return the first use on the stmt IMM currently refers
946 to. */
948 static inline use_operand_p
949 first_imm_use_on_stmt (imm_use_iterator *imm)
951 imm->next_imm_name = imm->imm_use->next;
952 return imm->imm_use;
955 /* Return TRUE if the last use on the stmt IMM refers to has been visited. */
957 static inline bool
958 end_imm_use_on_stmt_p (const imm_use_iterator *imm)
960 return (imm->imm_use == &(imm->iter_node));
963 /* Bump to the next use on the stmt IMM refers to, return NULL if done. */
965 static inline use_operand_p
966 next_imm_use_on_stmt (imm_use_iterator *imm)
968 imm->imm_use = imm->next_imm_name;
969 if (end_imm_use_on_stmt_p (imm))
970 return NULL_USE_OPERAND_P;
971 else
973 imm->next_imm_name = imm->imm_use->next;
974 return imm->imm_use;
978 /* Delink all immediate_use information for STMT. */
979 static inline void
980 delink_stmt_imm_use (gimple *stmt)
982 ssa_op_iter iter;
983 use_operand_p use_p;
985 if (ssa_operands_active (cfun))
986 FOR_EACH_PHI_OR_STMT_USE (use_p, stmt, iter, SSA_OP_ALL_USES)
987 delink_imm_use (use_p);
990 #endif /* GCC_TREE_SSA_ITERATORS_H */