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