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