lto-cgraph.c (get_alias_symbol): Remove weakref sanity check.
[gcc.git] / gcc / tree-flow-inline.h
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 *
48 first_htab_element (htab_iterator *hti, htab_t table)
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
69 end_htab_p (const htab_iterator *hti)
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 *
80 next_htab_element (htab_iterator *hti)
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
115 get_lineno (const_gimple stmt)
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
131 delink_imm_use (ssa_use_operand_t *linknode)
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
145 link_imm_use_to_list (ssa_use_operand_t *linknode, ssa_use_operand_t *list)
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
157 link_imm_use (ssa_use_operand_t *linknode, tree def)
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
174 set_ssa_use_from_ptr (use_operand_p use, tree val)
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
184 link_imm_use_stmt (ssa_use_operand_t *linknode, tree def, gimple stmt)
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
195 relink_imm_use (ssa_use_operand_t *node, ssa_use_operand_t *old)
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
213 relink_imm_use_stmt (ssa_use_operand_t *linknode, ssa_use_operand_t *old,
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
226 end_readonly_imm_use_p (const imm_use_iterator *imm)
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
233 first_readonly_imm_use (imm_use_iterator *imm, tree var)
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
247 next_readonly_imm_use (imm_use_iterator *imm)
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
273 has_zero_uses (const_tree var)
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
291 has_single_use (const_tree var)
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
314 single_imm_use (const_tree var, use_operand_p *use_p, gimple *stmt)
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
349 num_imm_uses (const_tree var)
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
368 get_use_from_ptr (use_operand_p use)
369 {
370 return *(use->use);
371 }
372
373 /* Return the tree pointed-to by DEF. */
374 static inline tree
375 get_def_from_ptr (def_operand_p def)
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
383 gimple_phi_arg_imm_use_ptr (gimple gs, int i)
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
408 gimple_phi_arg_edge (gimple gs, size_t i)
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
416 gimple_phi_arg_location (gimple gs, size_t i)
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
424 gimple_phi_arg_location_from_edge (gimple gs, edge e)
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
440 gimple_phi_arg_has_location (gimple gs, size_t i)
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
449 phi_nodes (const_basic_block bb)
450 {
451 gcc_checking_assert (!(bb->flags & BB_RTL));
452 return bb->il.gimple.phi_nodes;
453 }
454
455 static inline gimple_seq *
456 phi_nodes_ptr (basic_block bb)
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
465 set_phi_nodes (basic_block bb, gimple_seq seq)
466 {
467 gimple_stmt_iterator i;
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
479 phi_arg_index_from_use (use_operand_p use)
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
508 is_global_var (const_tree t)
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
519 may_be_aliased (const_tree var)
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
536 phi_ssa_name_p (const_tree t)
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 *
548 loop_containing_stmt (gimple stmt)
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
565 op_iter_done (const ssa_op_iter *ptr)
566 {
567 return ptr->done;
568 }
569
570 /* Get the next iterator use value for PTR. */
571 static inline use_operand_p
572 op_iter_next_use (ssa_op_iter *ptr)
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
592 op_iter_next_def (ssa_op_iter *ptr)
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
627 op_iter_next_tree (ssa_op_iter *ptr)
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
671 clear_and_done_ssa_iter (ssa_op_iter *ptr)
672 {
673 ptr->i = 0;
674 ptr->numops = 0;
675 ptr->uses = NULL;
676 ptr->iter_type = ssa_op_iter_none;
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);
752 ptr->iter_type = ssa_op_iter_tree;
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
760 single_ssa_tree_operand (gimple stmt, int flags)
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
778 single_ssa_use_operand (gimple stmt, int flags)
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
797 single_ssa_def_operand (gimple stmt, int flags)
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
843 delink_stmt_imm_use (gimple stmt)
844 {
845 ssa_op_iter iter;
846 use_operand_p use_p;
847
848 if (ssa_operands_active (cfun))
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
875 clear_and_done_ssa_iter (ptr);
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
905 clear_and_done_ssa_iter (ptr);
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
930 end_imm_use_stmt_p (const imm_use_iterator *imm)
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
939 end_imm_use_stmt_traverse (imm_use_iterator *imm)
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
951 move_use_after_head (use_operand_p use_p, use_operand_p head,
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
977 link_use_stmts_after (use_operand_p head, imm_use_iterator *imm)
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
1017 first_imm_use_stmt (imm_use_iterator *imm, tree var)
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
1042 next_imm_use_stmt (imm_use_iterator *imm)
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
1060 first_imm_use_on_stmt (imm_use_iterator *imm)
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
1069 end_imm_use_on_stmt_p (const imm_use_iterator *imm)
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
1077 next_imm_use_on_stmt (imm_use_iterator *imm)
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
1092 unmodifiable_var_p (const_tree var)
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
1104 ref_contains_array_ref (const_tree ref)
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
1120 contains_view_convert_expr_p (const_tree ref)
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
1137 ranges_overlap_p (unsigned HOST_WIDE_INT pos1,
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
1164 redirect_edge_var_map_def (edge_var_map *v)
1165 {
1166 return v->def;
1167 }
1168
1169 /* Given an edge_var_map V, return the PHI result. */
1170
1171 static inline tree
1172 redirect_edge_var_map_result (edge_var_map *v)
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
1180 redirect_edge_var_map_location (edge_var_map *v)
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
1190 make_ssa_name (tree var, gimple stmt)
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
1199 copy_ssa_name (tree var, gimple stmt)
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
1208 duplicate_ssa_name (tree var, gimple stmt)
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
1237 get_addr_base_and_unit_offset_1 (tree exp, HOST_WIDE_INT *poffset,
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 */