OSDN Git Service

49be48e1009df45b2130919f7d0bd15403a706f3
[pf3gnuchains/gcc-fork.git] / gcc / tree-flow-inline.h
1 /* Inline functions for tree-flow.h
2    Copyright (C) 2001, 2003, 2005, 2006 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 2, 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 COPYING.  If not, write to
19 the Free Software Foundation, 51 Franklin Street, Fifth Floor,
20 Boston, MA 02110-1301, USA.  */
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.  */
32 static inline bool
33 gimple_in_ssa_p (struct function *fun)
34 {
35   return fun && fun->gimple_df && fun->gimple_df->in_ssa_p;
36 }
37
38 /* 'true' after aliases have been computed (see compute_may_aliases).  */
39 static inline bool
40 gimple_aliases_computed_p (struct function *fun)
41 {
42   gcc_assert (fun && fun->gimple_df);
43   return fun->gimple_df->aliases_computed_p;
44 }
45
46 /* Addressable variables in the function.  If bit I is set, then
47    REFERENCED_VARS (I) has had its address taken.  Note that
48    CALL_CLOBBERED_VARS and ADDRESSABLE_VARS are not related.  An
49    addressable variable is not necessarily call-clobbered (e.g., a
50    local addressable whose address does not escape) and not all
51    call-clobbered variables are addressable (e.g., a local static
52    variable).  */
53 static inline bitmap
54 gimple_addressable_vars (struct function *fun)
55 {
56   gcc_assert (fun && fun->gimple_df);
57   return fun->gimple_df->addressable_vars;
58 }
59
60 /* Call clobbered variables in the function.  If bit I is set, then
61    REFERENCED_VARS (I) is call-clobbered.  */
62 static inline bitmap
63 gimple_call_clobbered_vars (struct function *fun)
64 {
65   gcc_assert (fun && fun->gimple_df);
66   return fun->gimple_df->call_clobbered_vars;
67 }
68
69 /* Array of all variables referenced in the function.  */
70 static inline htab_t
71 gimple_referenced_vars (struct function *fun)
72 {
73   if (!fun->gimple_df)
74     return NULL;
75   return fun->gimple_df->referenced_vars;
76 }
77
78 /* Artificial variable used to model the effects of function calls.  */
79 static inline tree
80 gimple_global_var (struct function *fun)
81 {
82   gcc_assert (fun && fun->gimple_df);
83   return fun->gimple_df->global_var;
84 }
85
86 /* Artificial variable used to model the effects of nonlocal
87    variables.  */
88 static inline tree
89 gimple_nonlocal_all (struct function *fun)
90 {
91   gcc_assert (fun && fun->gimple_df);
92   return fun->gimple_df->nonlocal_all;
93 }
94 /* Initialize the hashtable iterator HTI to point to hashtable TABLE */
95
96 static inline void *
97 first_htab_element (htab_iterator *hti, htab_t table)
98 {
99   hti->htab = table;
100   hti->slot = table->entries;
101   hti->limit = hti->slot + htab_size (table);
102   do
103     {
104       PTR x = *(hti->slot);
105       if (x != HTAB_EMPTY_ENTRY && x != HTAB_DELETED_ENTRY)
106         break;
107     } while (++(hti->slot) < hti->limit);
108   
109   if (hti->slot < hti->limit)
110     return *(hti->slot);
111   return NULL;
112 }
113
114 /* Return current non-empty/deleted slot of the hashtable pointed to by HTI,
115    or NULL if we have  reached the end.  */
116
117 static inline bool
118 end_htab_p (htab_iterator *hti)
119 {
120   if (hti->slot >= hti->limit)
121     return true;
122   return false;
123 }
124
125 /* Advance the hashtable iterator pointed to by HTI to the next element of the
126    hashtable.  */
127
128 static inline void *
129 next_htab_element (htab_iterator *hti)
130 {
131   while (++(hti->slot) < hti->limit)
132     {
133       PTR x = *(hti->slot);
134       if (x != HTAB_EMPTY_ENTRY && x != HTAB_DELETED_ENTRY)
135         return x;
136     };
137   return NULL;
138 }
139
140 /* Initialize ITER to point to the first referenced variable in the
141    referenced_vars hashtable, and return that variable.  */
142
143 static inline tree
144 first_referenced_var (referenced_var_iterator *iter)
145 {
146   struct int_tree_map *itm;
147   itm = (struct int_tree_map *) first_htab_element (&iter->hti,
148                                                     gimple_referenced_vars
149                                                     (cfun));
150   if (!itm) 
151     return NULL;
152   return itm->to;
153 }
154
155 /* Return true if we have hit the end of the referenced variables ITER is
156    iterating through.  */
157
158 static inline bool
159 end_referenced_vars_p (referenced_var_iterator *iter)
160 {
161   return end_htab_p (&iter->hti);
162 }
163
164 /* Make ITER point to the next referenced_var in the referenced_var hashtable,
165    and return that variable.  */
166
167 static inline tree
168 next_referenced_var (referenced_var_iterator *iter)
169 {
170   struct int_tree_map *itm;
171   itm = (struct int_tree_map *) next_htab_element (&iter->hti);
172   if (!itm) 
173     return NULL;
174   return itm->to;
175
176
177 /* Fill up VEC with the variables in the referenced vars hashtable.  */
178
179 static inline void
180 fill_referenced_var_vec (VEC (tree, heap) **vec)
181 {
182   referenced_var_iterator rvi;
183   tree var;
184   *vec = NULL;
185   FOR_EACH_REFERENCED_VAR (var, rvi)
186     VEC_safe_push (tree, heap, *vec, var);
187 }
188
189 /* Return the variable annotation for T, which must be a _DECL node.
190    Return NULL if the variable annotation doesn't already exist.  */
191 static inline var_ann_t
192 var_ann (tree t)
193 {
194   gcc_assert (t);
195   gcc_assert (DECL_P (t));
196   gcc_assert (TREE_CODE (t) != FUNCTION_DECL);
197   gcc_assert (!t->base.ann
198               || t->base.ann->common.type == VAR_ANN);
199
200   return (var_ann_t) t->base.ann;
201 }
202
203 /* Return the variable annotation for T, which must be a _DECL node.
204    Create the variable annotation if it doesn't exist.  */
205 static inline var_ann_t
206 get_var_ann (tree var)
207 {
208   var_ann_t ann = var_ann (var);
209   return (ann) ? ann : create_var_ann (var);
210 }
211
212 /* Return the function annotation for T, which must be a FUNCTION_DECL node.
213    Return NULL if the function annotation doesn't already exist.  */
214 static inline function_ann_t
215 function_ann (tree t)
216 {
217   gcc_assert (t);
218   gcc_assert (TREE_CODE (t) == FUNCTION_DECL);
219   gcc_assert (!t->base.ann
220               || t->base.ann->common.type == FUNCTION_ANN);
221
222   return (function_ann_t) t->base.ann;
223 }
224
225 /* Return the function annotation for T, which must be a FUNCTION_DECL node.
226    Create the function annotation if it doesn't exist.  */
227 static inline function_ann_t
228 get_function_ann (tree var)
229 {
230   function_ann_t ann = function_ann (var);
231   gcc_assert (!var->base.ann || var->base.ann->common.type == FUNCTION_ANN);
232   return (ann) ? ann : create_function_ann (var);
233 }
234
235 /* Return true if T has a statement annotation attached to it.  */
236
237 static inline bool
238 has_stmt_ann (tree t)
239 {
240 #ifdef ENABLE_CHECKING
241   gcc_assert (is_gimple_stmt (t));
242 #endif
243   return t->base.ann && t->base.ann->common.type == STMT_ANN;
244 }
245
246 /* Return the statement annotation for T, which must be a statement
247    node.  Return NULL if the statement annotation doesn't exist.  */
248 static inline stmt_ann_t
249 stmt_ann (tree t)
250 {
251 #ifdef ENABLE_CHECKING
252   gcc_assert (is_gimple_stmt (t));
253 #endif
254   gcc_assert (!t->base.ann || t->base.ann->common.type == STMT_ANN);
255   return (stmt_ann_t) t->base.ann;
256 }
257
258 /* Return the statement annotation for T, which must be a statement
259    node.  Create the statement annotation if it doesn't exist.  */
260 static inline stmt_ann_t
261 get_stmt_ann (tree stmt)
262 {
263   stmt_ann_t ann = stmt_ann (stmt);
264   return (ann) ? ann : create_stmt_ann (stmt);
265 }
266
267 /* Return the annotation type for annotation ANN.  */
268 static inline enum tree_ann_type
269 ann_type (tree_ann_t ann)
270 {
271   return ann->common.type;
272 }
273
274 /* Return the basic block for statement T.  */
275 static inline basic_block
276 bb_for_stmt (tree t)
277 {
278   stmt_ann_t ann;
279
280   if (TREE_CODE (t) == PHI_NODE)
281     return PHI_BB (t);
282
283   ann = stmt_ann (t);
284   return ann ? ann->bb : NULL;
285 }
286
287 /* Return the may_aliases varray for variable VAR, or NULL if it has
288    no may aliases.  */
289 static inline VEC(tree, gc) *
290 may_aliases (tree var)
291 {
292   var_ann_t ann = var_ann (var);
293   return ann ? ann->may_aliases : NULL;
294 }
295
296 /* Return the line number for EXPR, or return -1 if we have no line
297    number information for it.  */
298 static inline int
299 get_lineno (tree expr)
300 {
301   if (expr == NULL_TREE)
302     return -1;
303
304   if (TREE_CODE (expr) == COMPOUND_EXPR)
305     expr = TREE_OPERAND (expr, 0);
306
307   if (! EXPR_HAS_LOCATION (expr))
308     return -1;
309
310   return EXPR_LINENO (expr);
311 }
312
313 /* Return the file name for EXPR, or return "???" if we have no
314    filename information.  */
315 static inline const char *
316 get_filename (tree expr)
317 {
318   const char *filename;
319   if (expr == NULL_TREE)
320     return "???";
321
322   if (TREE_CODE (expr) == COMPOUND_EXPR)
323     expr = TREE_OPERAND (expr, 0);
324
325   if (EXPR_HAS_LOCATION (expr) && (filename = EXPR_FILENAME (expr)))
326     return filename;
327   else
328     return "???";
329 }
330
331 /* Return true if T is a noreturn call.  */
332 static inline bool
333 noreturn_call_p (tree t)
334 {
335   tree call = get_call_expr_in (t);
336   return call != 0 && (call_expr_flags (call) & ECF_NORETURN) != 0;
337 }
338
339 /* Mark statement T as modified.  */
340 static inline void
341 mark_stmt_modified (tree t)
342 {
343   stmt_ann_t ann;
344   if (TREE_CODE (t) == PHI_NODE)
345     return;
346
347   ann = stmt_ann (t);
348   if (ann == NULL)
349     ann = create_stmt_ann (t);
350   else if (noreturn_call_p (t) && cfun->gimple_df)
351     VEC_safe_push (tree, gc, MODIFIED_NORETURN_CALLS (cfun), t);
352   ann->modified = 1;
353 }
354
355 /* Mark statement T as modified, and update it.  */
356 static inline void
357 update_stmt (tree t)
358 {
359   if (TREE_CODE (t) == PHI_NODE)
360     return;
361   mark_stmt_modified (t);
362   update_stmt_operands (t);
363 }
364
365 static inline void
366 update_stmt_if_modified (tree t)
367 {
368   if (stmt_modified_p (t))
369     update_stmt_operands (t);
370 }
371
372 /* Return true if T is marked as modified, false otherwise.  */
373 static inline bool
374 stmt_modified_p (tree t)
375 {
376   stmt_ann_t ann = stmt_ann (t);
377
378   /* Note that if the statement doesn't yet have an annotation, we consider it
379      modified.  This will force the next call to update_stmt_operands to scan 
380      the statement.  */
381   return ann ? ann->modified : true;
382 }
383
384 /* Delink an immediate_uses node from its chain.  */
385 static inline void
386 delink_imm_use (ssa_use_operand_t *linknode)
387 {
388   /* Return if this node is not in a list.  */
389   if (linknode->prev == NULL)
390     return;
391
392   linknode->prev->next = linknode->next;
393   linknode->next->prev = linknode->prev;
394   linknode->prev = NULL;
395   linknode->next = NULL;
396 }
397
398 /* Link ssa_imm_use node LINKNODE into the chain for LIST.  */
399 static inline void
400 link_imm_use_to_list (ssa_use_operand_t *linknode, ssa_use_operand_t *list)
401 {
402   /* Link the new node at the head of the list.  If we are in the process of 
403      traversing the list, we won't visit any new nodes added to it.  */
404   linknode->prev = list;
405   linknode->next = list->next;
406   list->next->prev = linknode;
407   list->next = linknode;
408 }
409
410 /* Link ssa_imm_use node LINKNODE into the chain for DEF.  */
411 static inline void
412 link_imm_use (ssa_use_operand_t *linknode, tree def)
413 {
414   ssa_use_operand_t *root;
415
416   if (!def || TREE_CODE (def) != SSA_NAME)
417     linknode->prev = NULL;
418   else
419     {
420       root = &(SSA_NAME_IMM_USE_NODE (def));
421 #ifdef ENABLE_CHECKING
422       if (linknode->use)
423         gcc_assert (*(linknode->use) == def);
424 #endif
425       link_imm_use_to_list (linknode, root);
426     }
427 }
428
429 /* Set the value of a use pointed to by USE to VAL.  */
430 static inline void
431 set_ssa_use_from_ptr (use_operand_p use, tree val)
432 {
433   delink_imm_use (use);
434   *(use->use) = val;
435   link_imm_use (use, val);
436 }
437
438 /* Link ssa_imm_use node LINKNODE into the chain for DEF, with use occurring 
439    in STMT.  */
440 static inline void
441 link_imm_use_stmt (ssa_use_operand_t *linknode, tree def, tree stmt)
442 {
443   if (stmt)
444     link_imm_use (linknode, def);
445   else
446     link_imm_use (linknode, NULL);
447   linknode->stmt = stmt;
448 }
449
450 /* Relink a new node in place of an old node in the list.  */
451 static inline void
452 relink_imm_use (ssa_use_operand_t *node, ssa_use_operand_t *old)
453 {
454   /* The node one had better be in the same list.  */
455   gcc_assert (*(old->use) == *(node->use));
456   node->prev = old->prev;
457   node->next = old->next;
458   if (old->prev)
459     {
460       old->prev->next = node;
461       old->next->prev = node;
462       /* Remove the old node from the list.  */
463       old->prev = NULL;
464     }
465 }
466
467 /* Relink ssa_imm_use node LINKNODE into the chain for OLD, with use occurring 
468    in STMT.  */
469 static inline void
470 relink_imm_use_stmt (ssa_use_operand_t *linknode, ssa_use_operand_t *old, tree stmt)
471 {
472   if (stmt)
473     relink_imm_use (linknode, old);
474   else
475     link_imm_use (linknode, NULL);
476   linknode->stmt = stmt;
477 }
478
479
480 /* Return true is IMM has reached the end of the immediate use list.  */
481 static inline bool
482 end_readonly_imm_use_p (imm_use_iterator *imm)
483 {
484   return (imm->imm_use == imm->end_p);
485 }
486
487 /* Initialize iterator IMM to process the list for VAR.  */
488 static inline use_operand_p
489 first_readonly_imm_use (imm_use_iterator *imm, tree var)
490 {
491   gcc_assert (TREE_CODE (var) == SSA_NAME);
492
493   imm->end_p = &(SSA_NAME_IMM_USE_NODE (var));
494   imm->imm_use = imm->end_p->next;
495 #ifdef ENABLE_CHECKING
496   imm->iter_node.next = imm->imm_use->next;
497 #endif
498   if (end_readonly_imm_use_p (imm))
499     return NULL_USE_OPERAND_P;
500   return imm->imm_use;
501 }
502
503 /* Bump IMM to the next use in the list.  */
504 static inline use_operand_p
505 next_readonly_imm_use (imm_use_iterator *imm)
506 {
507   use_operand_p old = imm->imm_use;
508
509 #ifdef ENABLE_CHECKING
510   /* If this assertion fails, it indicates the 'next' pointer has changed 
511      since we the last bump.  This indicates that the list is being modified
512      via stmt changes, or SET_USE, or somesuch thing, and you need to be
513      using the SAFE version of the iterator.  */
514   gcc_assert (imm->iter_node.next == old->next);
515   imm->iter_node.next = old->next->next;
516 #endif
517
518   imm->imm_use = old->next;
519   if (end_readonly_imm_use_p (imm))
520     return old;
521   return imm->imm_use;
522 }
523
524 /* Return true if VAR has no uses.  */
525 static inline bool
526 has_zero_uses (tree var)
527 {
528   ssa_use_operand_t *ptr;
529   ptr = &(SSA_NAME_IMM_USE_NODE (var));
530   /* A single use means there is no items in the list.  */
531   return (ptr == ptr->next);
532 }
533
534 /* Return true if VAR has a single use.  */
535 static inline bool
536 has_single_use (tree var)
537 {
538   ssa_use_operand_t *ptr;
539   ptr = &(SSA_NAME_IMM_USE_NODE (var));
540   /* A single use means there is one item in the list.  */
541   return (ptr != ptr->next && ptr == ptr->next->next);
542 }
543
544
545 /* If VAR has only a single immediate use, return true.  */
546 static inline bool
547 single_imm_use_p (tree var)
548 {
549   ssa_use_operand_t *ptr;
550
551   ptr = &(SSA_NAME_IMM_USE_NODE (var));
552   return (ptr != ptr->next && ptr == ptr->next->next);
553 }
554
555
556 /* If VAR has only a single immediate use, return true, and set USE_P and STMT
557    to the use pointer and stmt of occurrence.  */
558 static inline bool
559 single_imm_use (tree var, use_operand_p *use_p, tree *stmt)
560 {
561   ssa_use_operand_t *ptr;
562
563   ptr = &(SSA_NAME_IMM_USE_NODE (var));
564   if (ptr != ptr->next && ptr == ptr->next->next)
565     {
566       *use_p = ptr->next;
567       *stmt = ptr->next->stmt;
568       return true;
569     }
570   *use_p = NULL_USE_OPERAND_P;
571   *stmt = NULL_TREE;
572   return false;
573 }
574
575 /* Return the number of immediate uses of VAR.  */
576 static inline unsigned int
577 num_imm_uses (tree var)
578 {
579   ssa_use_operand_t *ptr, *start;
580   unsigned int num;
581
582   start = &(SSA_NAME_IMM_USE_NODE (var));
583   num = 0;
584   for (ptr = start->next; ptr != start; ptr = ptr->next)
585      num++;
586
587   return num;
588 }
589
590 /* Return true if VAR has no immediate uses.  */
591 static inline bool
592 zero_imm_uses_p (tree var)
593 {
594   ssa_use_operand_t *ptr = &(SSA_NAME_IMM_USE_NODE (var));
595   return (ptr == ptr->next);
596 }
597  
598 /* Return the tree pointer to by USE.  */ 
599 static inline tree
600 get_use_from_ptr (use_operand_p use)
601
602   return *(use->use);
603
604
605 /* Return the tree pointer to by DEF.  */
606 static inline tree
607 get_def_from_ptr (def_operand_p def)
608 {
609   return *def;
610 }
611
612 /* Return a def_operand_p pointer for the result of PHI.  */
613 static inline def_operand_p
614 get_phi_result_ptr (tree phi)
615 {
616   return &(PHI_RESULT_TREE (phi));
617 }
618
619 /* Return a use_operand_p pointer for argument I of phinode PHI.  */
620 static inline use_operand_p
621 get_phi_arg_def_ptr (tree phi, int i)
622 {
623   return &(PHI_ARG_IMM_USE_NODE (phi,i));
624 }
625
626
627 /* Return the bitmap of addresses taken by STMT, or NULL if it takes
628    no addresses.  */
629 static inline bitmap
630 addresses_taken (tree stmt)
631 {
632   stmt_ann_t ann = stmt_ann (stmt);
633   return ann ? ann->addresses_taken : NULL;
634 }
635
636 /* Return the PHI nodes for basic block BB, or NULL if there are no
637    PHI nodes.  */
638 static inline tree
639 phi_nodes (basic_block bb)
640 {
641   return bb->phi_nodes;
642 }
643
644 /* Set list of phi nodes of a basic block BB to L.  */
645
646 static inline void
647 set_phi_nodes (basic_block bb, tree l)
648 {
649   tree phi;
650
651   bb->phi_nodes = l;
652   for (phi = l; phi; phi = PHI_CHAIN (phi))
653     set_bb_for_stmt (phi, bb);
654 }
655
656 /* Return the phi argument which contains the specified use.  */
657
658 static inline int
659 phi_arg_index_from_use (use_operand_p use)
660 {
661   struct phi_arg_d *element, *root;
662   int index;
663   tree phi;
664
665   /* Since the use is the first thing in a PHI argument element, we can
666      calculate its index based on casting it to an argument, and performing
667      pointer arithmetic.  */
668
669   phi = USE_STMT (use);
670   gcc_assert (TREE_CODE (phi) == PHI_NODE);
671
672   element = (struct phi_arg_d *)use;
673   root = &(PHI_ARG_ELT (phi, 0));
674   index = element - root;
675
676 #ifdef ENABLE_CHECKING
677   /* Make sure the calculation doesn't have any leftover bytes.  If it does, 
678      then imm_use is likely not the first element in phi_arg_d.  */
679   gcc_assert (
680           (((char *)element - (char *)root) % sizeof (struct phi_arg_d)) == 0);
681   gcc_assert (index >= 0 && index < PHI_ARG_CAPACITY (phi));
682 #endif
683  
684  return index;
685 }
686
687 /* Mark VAR as used, so that it'll be preserved during rtl expansion.  */
688
689 static inline void
690 set_is_used (tree var)
691 {
692   var_ann_t ann = get_var_ann (var);
693   ann->used = 1;
694 }
695
696
697 /*  -----------------------------------------------------------------------  */
698
699 /* Return true if T is an executable statement.  */
700 static inline bool
701 is_exec_stmt (tree t)
702 {
703   return (t && !IS_EMPTY_STMT (t) && t != error_mark_node);
704 }
705
706
707 /* Return true if this stmt can be the target of a control transfer stmt such
708    as a goto.  */
709 static inline bool
710 is_label_stmt (tree t)
711 {
712   if (t)
713     switch (TREE_CODE (t))
714       {
715         case LABEL_DECL:
716         case LABEL_EXPR:
717         case CASE_LABEL_EXPR:
718           return true;
719         default:
720           return false;
721       }
722   return false;
723 }
724
725 /* PHI nodes should contain only ssa_names and invariants.  A test
726    for ssa_name is definitely simpler; don't let invalid contents
727    slip in in the meantime.  */
728
729 static inline bool
730 phi_ssa_name_p (tree t)
731 {
732   if (TREE_CODE (t) == SSA_NAME)
733     return true;
734 #ifdef ENABLE_CHECKING
735   gcc_assert (is_gimple_min_invariant (t));
736 #endif
737   return false;
738 }
739
740 /*  -----------------------------------------------------------------------  */
741
742 /* Return a block_stmt_iterator that points to beginning of basic
743    block BB.  */
744 static inline block_stmt_iterator
745 bsi_start (basic_block bb)
746 {
747   block_stmt_iterator bsi;
748   if (bb->stmt_list)
749     bsi.tsi = tsi_start (bb->stmt_list);
750   else
751     {
752       gcc_assert (bb->index < NUM_FIXED_BLOCKS);
753       bsi.tsi.ptr = NULL;
754       bsi.tsi.container = NULL;
755     }
756   bsi.bb = bb;
757   return bsi;
758 }
759
760 /* Return a block statement iterator that points to the first non-label
761    statement in block BB.  */
762
763 static inline block_stmt_iterator
764 bsi_after_labels (basic_block bb)
765 {
766   block_stmt_iterator bsi = bsi_start (bb);
767
768   while (!bsi_end_p (bsi) && TREE_CODE (bsi_stmt (bsi)) == LABEL_EXPR)
769     bsi_next (&bsi);
770
771   return bsi;
772 }
773
774 /* Return a block statement iterator that points to the end of basic
775    block BB.  */
776 static inline block_stmt_iterator
777 bsi_last (basic_block bb)
778 {
779   block_stmt_iterator bsi;
780   if (bb->stmt_list)
781     bsi.tsi = tsi_last (bb->stmt_list);
782   else
783     {
784       gcc_assert (bb->index < NUM_FIXED_BLOCKS);
785       bsi.tsi.ptr = NULL;
786       bsi.tsi.container = NULL;
787     }
788   bsi.bb = bb;
789   return bsi;
790 }
791
792 /* Return true if block statement iterator I has reached the end of
793    the basic block.  */
794 static inline bool
795 bsi_end_p (block_stmt_iterator i)
796 {
797   return tsi_end_p (i.tsi);
798 }
799
800 /* Modify block statement iterator I so that it is at the next
801    statement in the basic block.  */
802 static inline void
803 bsi_next (block_stmt_iterator *i)
804 {
805   tsi_next (&i->tsi);
806 }
807
808 /* Modify block statement iterator I so that it is at the previous
809    statement in the basic block.  */
810 static inline void
811 bsi_prev (block_stmt_iterator *i)
812 {
813   tsi_prev (&i->tsi);
814 }
815
816 /* Return the statement that block statement iterator I is currently
817    at.  */
818 static inline tree
819 bsi_stmt (block_stmt_iterator i)
820 {
821   return tsi_stmt (i.tsi);
822 }
823
824 /* Return a pointer to the statement that block statement iterator I
825    is currently at.  */
826 static inline tree *
827 bsi_stmt_ptr (block_stmt_iterator i)
828 {
829   return tsi_stmt_ptr (i.tsi);
830 }
831
832 /* Returns the loop of the statement STMT.  */
833
834 static inline struct loop *
835 loop_containing_stmt (tree stmt)
836 {
837   basic_block bb = bb_for_stmt (stmt);
838   if (!bb)
839     return NULL;
840
841   return bb->loop_father;
842 }
843
844 /* Return true if VAR is a clobbered by function calls.  */
845 static inline bool
846 is_call_clobbered (tree var)
847 {
848   if (!MTAG_P (var))
849     return DECL_CALL_CLOBBERED (var);
850   else
851     return bitmap_bit_p (gimple_call_clobbered_vars (cfun), DECL_UID (var)); 
852 }
853
854 /* Mark variable VAR as being clobbered by function calls.  */
855 static inline void
856 mark_call_clobbered (tree var, unsigned int escape_type)
857 {
858   var_ann (var)->escape_mask |= escape_type;
859   if (!MTAG_P (var))
860     DECL_CALL_CLOBBERED (var) = true;
861   bitmap_set_bit (gimple_call_clobbered_vars (cfun), DECL_UID (var));
862 }
863
864 /* Clear the call-clobbered attribute from variable VAR.  */
865 static inline void
866 clear_call_clobbered (tree var)
867 {
868   var_ann_t ann = var_ann (var);
869   ann->escape_mask = 0;
870   if (MTAG_P (var) && TREE_CODE (var) != STRUCT_FIELD_TAG)
871     MTAG_GLOBAL (var) = 0;
872   if (!MTAG_P (var))
873     DECL_CALL_CLOBBERED (var) = false;
874   bitmap_clear_bit (gimple_call_clobbered_vars (cfun), DECL_UID (var));
875 }
876
877 /* Mark variable VAR as being non-addressable.  */
878 static inline void
879 mark_non_addressable (tree var)
880 {
881   if (!MTAG_P (var))
882     DECL_CALL_CLOBBERED (var) = false;
883   bitmap_clear_bit (gimple_call_clobbered_vars (cfun), DECL_UID (var));
884   TREE_ADDRESSABLE (var) = 0;
885 }
886
887 /* Return the common annotation for T.  Return NULL if the annotation
888    doesn't already exist.  */
889 static inline tree_ann_common_t
890 tree_common_ann (tree t)
891 {
892   return &t->base.ann->common;
893 }
894
895 /* Return a common annotation for T.  Create the constant annotation if it
896    doesn't exist.  */
897 static inline tree_ann_common_t
898 get_tree_common_ann (tree t)
899 {
900   tree_ann_common_t ann = tree_common_ann (t);
901   return (ann) ? ann : create_tree_common_ann (t);
902 }
903
904 /*  -----------------------------------------------------------------------  */
905
906 /* The following set of routines are used to iterator over various type of
907    SSA operands.  */
908
909 /* Return true if PTR is finished iterating.  */
910 static inline bool
911 op_iter_done (ssa_op_iter *ptr)
912 {
913   return ptr->done;
914 }
915
916 /* Get the next iterator use value for PTR.  */
917 static inline use_operand_p
918 op_iter_next_use (ssa_op_iter *ptr)
919 {
920   use_operand_p use_p;
921 #ifdef ENABLE_CHECKING
922   gcc_assert (ptr->iter_type == ssa_op_iter_use);
923 #endif
924   if (ptr->uses)
925     {
926       use_p = USE_OP_PTR (ptr->uses);
927       ptr->uses = ptr->uses->next;
928       return use_p;
929     }
930   if (ptr->vuses)
931     {
932       use_p = VUSE_OP_PTR (ptr->vuses);
933       ptr->vuses = ptr->vuses->next;
934       return use_p;
935     }
936   if (ptr->mayuses)
937     {
938       use_p = MAYDEF_OP_PTR (ptr->mayuses);
939       ptr->mayuses = ptr->mayuses->next;
940       return use_p;
941     }
942   if (ptr->mustkills)
943     {
944       use_p = MUSTDEF_KILL_PTR (ptr->mustkills);
945       ptr->mustkills = ptr->mustkills->next;
946       return use_p;
947     }
948   if (ptr->phi_i < ptr->num_phi)
949     {
950       return PHI_ARG_DEF_PTR (ptr->phi_stmt, (ptr->phi_i)++);
951     }
952   ptr->done = true;
953   return NULL_USE_OPERAND_P;
954 }
955
956 /* Get the next iterator def value for PTR.  */
957 static inline def_operand_p
958 op_iter_next_def (ssa_op_iter *ptr)
959 {
960   def_operand_p def_p;
961 #ifdef ENABLE_CHECKING
962   gcc_assert (ptr->iter_type == ssa_op_iter_def);
963 #endif
964   if (ptr->defs)
965     {
966       def_p = DEF_OP_PTR (ptr->defs);
967       ptr->defs = ptr->defs->next;
968       return def_p;
969     }
970   if (ptr->mustdefs)
971     {
972       def_p = MUSTDEF_RESULT_PTR (ptr->mustdefs);
973       ptr->mustdefs = ptr->mustdefs->next;
974       return def_p;
975     }
976   if (ptr->maydefs)
977     {
978       def_p = MAYDEF_RESULT_PTR (ptr->maydefs);
979       ptr->maydefs = ptr->maydefs->next;
980       return def_p;
981     }
982   ptr->done = true;
983   return NULL_DEF_OPERAND_P;
984 }
985
986 /* Get the next iterator tree value for PTR.  */
987 static inline tree
988 op_iter_next_tree (ssa_op_iter *ptr)
989 {
990   tree val;
991 #ifdef ENABLE_CHECKING
992   gcc_assert (ptr->iter_type == ssa_op_iter_tree);
993 #endif
994   if (ptr->uses)
995     {
996       val = USE_OP (ptr->uses);
997       ptr->uses = ptr->uses->next;
998       return val;
999     }
1000   if (ptr->vuses)
1001     {
1002       val = VUSE_OP (ptr->vuses);
1003       ptr->vuses = ptr->vuses->next;
1004       return val;
1005     }
1006   if (ptr->mayuses)
1007     {
1008       val = MAYDEF_OP (ptr->mayuses);
1009       ptr->mayuses = ptr->mayuses->next;
1010       return val;
1011     }
1012   if (ptr->mustkills)
1013     {
1014       val = MUSTDEF_KILL (ptr->mustkills);
1015       ptr->mustkills = ptr->mustkills->next;
1016       return val;
1017     }
1018   if (ptr->defs)
1019     {
1020       val = DEF_OP (ptr->defs);
1021       ptr->defs = ptr->defs->next;
1022       return val;
1023     }
1024   if (ptr->mustdefs)
1025     {
1026       val = MUSTDEF_RESULT (ptr->mustdefs);
1027       ptr->mustdefs = ptr->mustdefs->next;
1028       return val;
1029     }
1030   if (ptr->maydefs)
1031     {
1032       val = MAYDEF_RESULT (ptr->maydefs);
1033       ptr->maydefs = ptr->maydefs->next;
1034       return val;
1035     }
1036
1037   ptr->done = true;
1038   return NULL_TREE;
1039
1040 }
1041
1042
1043 /* This functions clears the iterator PTR, and marks it done.  This is normally
1044    used to prevent warnings in the compile about might be uninitialized
1045    components.  */
1046
1047 static inline void
1048 clear_and_done_ssa_iter (ssa_op_iter *ptr)
1049 {
1050   ptr->defs = NULL;
1051   ptr->uses = NULL;
1052   ptr->vuses = NULL;
1053   ptr->maydefs = NULL;
1054   ptr->mayuses = NULL;
1055   ptr->mustdefs = NULL;
1056   ptr->mustkills = NULL;
1057   ptr->iter_type = ssa_op_iter_none;
1058   ptr->phi_i = 0;
1059   ptr->num_phi = 0;
1060   ptr->phi_stmt = NULL_TREE;
1061   ptr->done = true;
1062 }
1063
1064 /* Initialize the iterator PTR to the virtual defs in STMT.  */
1065 static inline void
1066 op_iter_init (ssa_op_iter *ptr, tree stmt, int flags)
1067 {
1068 #ifdef ENABLE_CHECKING
1069   gcc_assert (stmt_ann (stmt));
1070 #endif
1071
1072   ptr->defs = (flags & SSA_OP_DEF) ? DEF_OPS (stmt) : NULL;
1073   ptr->uses = (flags & SSA_OP_USE) ? USE_OPS (stmt) : NULL;
1074   ptr->vuses = (flags & SSA_OP_VUSE) ? VUSE_OPS (stmt) : NULL;
1075   ptr->maydefs = (flags & SSA_OP_VMAYDEF) ? MAYDEF_OPS (stmt) : NULL;
1076   ptr->mayuses = (flags & SSA_OP_VMAYUSE) ? MAYDEF_OPS (stmt) : NULL;
1077   ptr->mustdefs = (flags & SSA_OP_VMUSTDEF) ? MUSTDEF_OPS (stmt) : NULL;
1078   ptr->mustkills = (flags & SSA_OP_VMUSTKILL) ? MUSTDEF_OPS (stmt) : NULL;
1079   ptr->done = false;
1080
1081   ptr->phi_i = 0;
1082   ptr->num_phi = 0;
1083   ptr->phi_stmt = NULL_TREE;
1084 }
1085
1086 /* Initialize iterator PTR to the use operands in STMT based on FLAGS. Return
1087    the first use.  */
1088 static inline use_operand_p
1089 op_iter_init_use (ssa_op_iter *ptr, tree stmt, int flags)
1090 {
1091   gcc_assert ((flags & SSA_OP_ALL_DEFS) == 0);
1092   op_iter_init (ptr, stmt, flags);
1093   ptr->iter_type = ssa_op_iter_use;
1094   return op_iter_next_use (ptr);
1095 }
1096
1097 /* Initialize iterator PTR to the def operands in STMT based on FLAGS. Return
1098    the first def.  */
1099 static inline def_operand_p
1100 op_iter_init_def (ssa_op_iter *ptr, tree stmt, int flags)
1101 {
1102   gcc_assert ((flags & (SSA_OP_ALL_USES | SSA_OP_VIRTUAL_KILLS)) == 0);
1103   op_iter_init (ptr, stmt, flags);
1104   ptr->iter_type = ssa_op_iter_def;
1105   return op_iter_next_def (ptr);
1106 }
1107
1108 /* Initialize iterator PTR to the operands in STMT based on FLAGS. Return
1109    the first operand as a tree.  */
1110 static inline tree
1111 op_iter_init_tree (ssa_op_iter *ptr, tree stmt, int flags)
1112 {
1113   op_iter_init (ptr, stmt, flags);
1114   ptr->iter_type = ssa_op_iter_tree;
1115   return op_iter_next_tree (ptr);
1116 }
1117
1118 /* Get the next iterator mustdef value for PTR, returning the mustdef values in
1119    KILL and DEF.  */
1120 static inline void
1121 op_iter_next_maymustdef (use_operand_p *use, def_operand_p *def, 
1122                          ssa_op_iter *ptr)
1123 {
1124 #ifdef ENABLE_CHECKING
1125   gcc_assert (ptr->iter_type == ssa_op_iter_maymustdef);
1126 #endif
1127   if (ptr->mayuses)
1128     {
1129       *def = MAYDEF_RESULT_PTR (ptr->mayuses);
1130       *use = MAYDEF_OP_PTR (ptr->mayuses);
1131       ptr->mayuses = ptr->mayuses->next;
1132       return;
1133     }
1134
1135   if (ptr->mustkills)
1136     {
1137       *def = MUSTDEF_RESULT_PTR (ptr->mustkills);
1138       *use = MUSTDEF_KILL_PTR (ptr->mustkills);
1139       ptr->mustkills = ptr->mustkills->next;
1140       return;
1141     }
1142
1143   *def = NULL_DEF_OPERAND_P;
1144   *use = NULL_USE_OPERAND_P;
1145   ptr->done = true;
1146   return;
1147 }
1148
1149
1150 /* Initialize iterator PTR to the operands in STMT.  Return the first operands
1151    in USE and DEF.  */
1152 static inline void
1153 op_iter_init_maydef (ssa_op_iter *ptr, tree stmt, use_operand_p *use, 
1154                      def_operand_p *def)
1155 {
1156   gcc_assert (TREE_CODE (stmt) != PHI_NODE);
1157
1158   op_iter_init (ptr, stmt, SSA_OP_VMAYUSE);
1159   ptr->iter_type = ssa_op_iter_maymustdef;
1160   op_iter_next_maymustdef (use, def, ptr);
1161 }
1162
1163
1164 /* Initialize iterator PTR to the operands in STMT.  Return the first operands
1165    in KILL and DEF.  */
1166 static inline void
1167 op_iter_init_mustdef (ssa_op_iter *ptr, tree stmt, use_operand_p *kill, 
1168                      def_operand_p *def)
1169 {
1170   gcc_assert (TREE_CODE (stmt) != PHI_NODE);
1171
1172   op_iter_init (ptr, stmt, SSA_OP_VMUSTKILL);
1173   ptr->iter_type = ssa_op_iter_maymustdef;
1174   op_iter_next_maymustdef (kill, def, ptr);
1175 }
1176
1177 /* Initialize iterator PTR to the operands in STMT.  Return the first operands
1178    in KILL and DEF.  */
1179 static inline void
1180 op_iter_init_must_and_may_def (ssa_op_iter *ptr, tree stmt,
1181                                use_operand_p *kill, def_operand_p *def)
1182 {
1183   gcc_assert (TREE_CODE (stmt) != PHI_NODE);
1184
1185   op_iter_init (ptr, stmt, SSA_OP_VMUSTKILL|SSA_OP_VMAYUSE);
1186   ptr->iter_type = ssa_op_iter_maymustdef;
1187   op_iter_next_maymustdef (kill, def, ptr);
1188 }
1189
1190
1191 /* If there is a single operand in STMT matching FLAGS, return it.  Otherwise
1192    return NULL.  */
1193 static inline tree
1194 single_ssa_tree_operand (tree stmt, int flags)
1195 {
1196   tree var;
1197   ssa_op_iter iter;
1198
1199   var = op_iter_init_tree (&iter, stmt, flags);
1200   if (op_iter_done (&iter))
1201     return NULL_TREE;
1202   op_iter_next_tree (&iter);
1203   if (op_iter_done (&iter))
1204     return var;
1205   return NULL_TREE;
1206 }
1207
1208
1209 /* If there is a single operand in STMT matching FLAGS, return it.  Otherwise
1210    return NULL.  */
1211 static inline use_operand_p
1212 single_ssa_use_operand (tree stmt, int flags)
1213 {
1214   use_operand_p var;
1215   ssa_op_iter iter;
1216
1217   var = op_iter_init_use (&iter, stmt, flags);
1218   if (op_iter_done (&iter))
1219     return NULL_USE_OPERAND_P;
1220   op_iter_next_use (&iter);
1221   if (op_iter_done (&iter))
1222     return var;
1223   return NULL_USE_OPERAND_P;
1224 }
1225
1226
1227
1228 /* If there is a single operand in STMT matching FLAGS, return it.  Otherwise
1229    return NULL.  */
1230 static inline def_operand_p
1231 single_ssa_def_operand (tree stmt, int flags)
1232 {
1233   def_operand_p var;
1234   ssa_op_iter iter;
1235
1236   var = op_iter_init_def (&iter, stmt, flags);
1237   if (op_iter_done (&iter))
1238     return NULL_DEF_OPERAND_P;
1239   op_iter_next_def (&iter);
1240   if (op_iter_done (&iter))
1241     return var;
1242   return NULL_DEF_OPERAND_P;
1243 }
1244
1245
1246 /* Return true if there are zero operands in STMT matching the type 
1247    given in FLAGS.  */
1248 static inline bool
1249 zero_ssa_operands (tree stmt, int flags)
1250 {
1251   ssa_op_iter iter;
1252
1253   op_iter_init_tree (&iter, stmt, flags);
1254   return op_iter_done (&iter);
1255 }
1256
1257
1258 /* Return the number of operands matching FLAGS in STMT.  */
1259 static inline int
1260 num_ssa_operands (tree stmt, int flags)
1261 {
1262   ssa_op_iter iter;
1263   tree t;
1264   int num = 0;
1265
1266   FOR_EACH_SSA_TREE_OPERAND (t, stmt, iter, flags)
1267     num++;
1268   return num;
1269 }
1270
1271
1272 /* Delink all immediate_use information for STMT.  */
1273 static inline void
1274 delink_stmt_imm_use (tree stmt)
1275 {
1276    ssa_op_iter iter;
1277    use_operand_p use_p;
1278
1279    if (ssa_operands_active ())
1280      FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter,
1281                                (SSA_OP_ALL_USES | SSA_OP_ALL_KILLS))
1282        delink_imm_use (use_p);
1283 }
1284
1285
1286 /* This routine will compare all the operands matching FLAGS in STMT1 to those
1287    in STMT2.  TRUE is returned if they are the same.  STMTs can be NULL.  */
1288 static inline bool
1289 compare_ssa_operands_equal (tree stmt1, tree stmt2, int flags)
1290 {
1291   ssa_op_iter iter1, iter2;
1292   tree op1 = NULL_TREE;
1293   tree op2 = NULL_TREE;
1294   bool look1, look2;
1295
1296   if (stmt1 == stmt2)
1297     return true;
1298
1299   look1 = stmt1 && stmt_ann (stmt1);
1300   look2 = stmt2 && stmt_ann (stmt2);
1301
1302   if (look1)
1303     {
1304       op1 = op_iter_init_tree (&iter1, stmt1, flags);
1305       if (!look2)
1306         return op_iter_done (&iter1);
1307     }
1308   else
1309     clear_and_done_ssa_iter (&iter1);
1310
1311   if (look2)
1312     {
1313       op2 = op_iter_init_tree (&iter2, stmt2, flags);
1314       if (!look1)
1315         return op_iter_done (&iter2);
1316     }
1317   else
1318     clear_and_done_ssa_iter (&iter2);
1319
1320   while (!op_iter_done (&iter1) && !op_iter_done (&iter2))
1321     {
1322       if (op1 != op2)
1323         return false;
1324       op1 = op_iter_next_tree (&iter1);
1325       op2 = op_iter_next_tree (&iter2);
1326     }
1327
1328   return (op_iter_done (&iter1) && op_iter_done (&iter2));
1329 }
1330
1331
1332 /* If there is a single DEF in the PHI node which matches FLAG, return it.
1333    Otherwise return NULL_DEF_OPERAND_P.  */
1334 static inline tree
1335 single_phi_def (tree stmt, int flags)
1336 {
1337   tree def = PHI_RESULT (stmt);
1338   if ((flags & SSA_OP_DEF) && is_gimple_reg (def)) 
1339     return def;
1340   if ((flags & SSA_OP_VIRTUAL_DEFS) && !is_gimple_reg (def))
1341     return def;
1342   return NULL_TREE;
1343 }
1344
1345 /* Initialize the iterator PTR for uses matching FLAGS in PHI.  FLAGS should
1346    be either SSA_OP_USES or SSA_OP_VIRTUAL_USES.  */
1347 static inline use_operand_p
1348 op_iter_init_phiuse (ssa_op_iter *ptr, tree phi, int flags)
1349 {
1350   tree phi_def = PHI_RESULT (phi);
1351   int comp;
1352
1353   clear_and_done_ssa_iter (ptr);
1354   ptr->done = false;
1355
1356   gcc_assert ((flags & (SSA_OP_USE | SSA_OP_VIRTUAL_USES)) != 0);
1357
1358   comp = (is_gimple_reg (phi_def) ? SSA_OP_USE : SSA_OP_VIRTUAL_USES);
1359     
1360   /* If the PHI node doesn't the operand type we care about, we're done.  */
1361   if ((flags & comp) == 0)
1362     {
1363       ptr->done = true;
1364       return NULL_USE_OPERAND_P;
1365     }
1366
1367   ptr->phi_stmt = phi;
1368   ptr->num_phi = PHI_NUM_ARGS (phi);
1369   ptr->iter_type = ssa_op_iter_use;
1370   return op_iter_next_use (ptr);
1371 }
1372
1373
1374 /* Start an iterator for a PHI definition.  */
1375
1376 static inline def_operand_p
1377 op_iter_init_phidef (ssa_op_iter *ptr, tree phi, int flags)
1378 {
1379   tree phi_def = PHI_RESULT (phi);
1380   int comp;
1381
1382   clear_and_done_ssa_iter (ptr);
1383   ptr->done = false;
1384
1385   gcc_assert ((flags & (SSA_OP_DEF | SSA_OP_VIRTUAL_DEFS)) != 0);
1386
1387   comp = (is_gimple_reg (phi_def) ? SSA_OP_DEF : SSA_OP_VIRTUAL_DEFS);
1388     
1389   /* If the PHI node doesn't the operand type we care about, we're done.  */
1390   if ((flags & comp) == 0)
1391     {
1392       ptr->done = true;
1393       return NULL_USE_OPERAND_P;
1394     }
1395
1396   ptr->iter_type = ssa_op_iter_def;
1397   /* The first call to op_iter_next_def will terminate the iterator since
1398      all the fields are NULL.  Simply return the result here as the first and
1399      therefore only result.  */
1400   return PHI_RESULT_PTR (phi);
1401 }
1402
1403 /* Return true is IMM has reached the end of the immediate use stmt list.  */
1404
1405 static inline bool
1406 end_imm_use_stmt_p (imm_use_iterator *imm)
1407 {
1408   return (imm->imm_use == imm->end_p);
1409 }
1410
1411 /* Finished the traverse of an immediate use stmt list IMM by removing the
1412    placeholder node from the list.  */
1413
1414 static inline void
1415 end_imm_use_stmt_traverse (imm_use_iterator *imm)
1416 {
1417   delink_imm_use (&(imm->iter_node));
1418 }
1419
1420 /* Immediate use traversal of uses within a stmt require that all the
1421    uses on a stmt be sequentially listed.  This routine is used to build up
1422    this sequential list by adding USE_P to the end of the current list 
1423    currently delimited by HEAD and LAST_P.  The new LAST_P value is 
1424    returned.  */
1425
1426 static inline use_operand_p
1427 move_use_after_head (use_operand_p use_p, use_operand_p head, 
1428                       use_operand_p last_p)
1429 {
1430   gcc_assert (USE_FROM_PTR (use_p) == USE_FROM_PTR (head));
1431   /* Skip head when we find it.  */
1432   if (use_p != head)
1433     {
1434       /* If use_p is already linked in after last_p, continue.  */
1435       if (last_p->next == use_p)
1436         last_p = use_p;
1437       else
1438         {
1439           /* Delink from current location, and link in at last_p.  */
1440           delink_imm_use (use_p);
1441           link_imm_use_to_list (use_p, last_p);
1442           last_p = use_p;
1443         }
1444     }
1445   return last_p;
1446 }
1447
1448
1449 /* This routine will relink all uses with the same stmt as HEAD into the list
1450    immediately following HEAD for iterator IMM.  */
1451
1452 static inline void
1453 link_use_stmts_after (use_operand_p head, imm_use_iterator *imm)
1454 {
1455   use_operand_p use_p;
1456   use_operand_p last_p = head;
1457   tree head_stmt = USE_STMT (head);
1458   tree use = USE_FROM_PTR (head);
1459   ssa_op_iter op_iter;
1460   int flag;
1461
1462   /* Only look at virtual or real uses, depending on the type of HEAD.  */
1463   flag = (is_gimple_reg (use) ? SSA_OP_USE : SSA_OP_VIRTUAL_USES);
1464
1465   if (TREE_CODE (head_stmt) == PHI_NODE)
1466     {
1467       FOR_EACH_PHI_ARG (use_p, head_stmt, op_iter, flag)
1468         if (USE_FROM_PTR (use_p) == use)
1469           last_p = move_use_after_head (use_p, head, last_p);
1470     }
1471   else
1472     {
1473       FOR_EACH_SSA_USE_OPERAND (use_p, head_stmt, op_iter, flag)
1474         if (USE_FROM_PTR (use_p) == use)
1475           last_p = move_use_after_head (use_p, head, last_p);
1476     }
1477   /* LInk iter node in after last_p.  */
1478   if (imm->iter_node.prev != NULL)
1479     delink_imm_use (&imm->iter_node);
1480   link_imm_use_to_list (&(imm->iter_node), last_p);
1481 }
1482
1483 /* Initialize IMM to traverse over uses of VAR.  Return the first statement.  */
1484 static inline tree
1485 first_imm_use_stmt (imm_use_iterator *imm, tree var)
1486 {
1487   gcc_assert (TREE_CODE (var) == SSA_NAME);
1488   
1489   imm->end_p = &(SSA_NAME_IMM_USE_NODE (var));
1490   imm->imm_use = imm->end_p->next;
1491   imm->next_imm_name = NULL_USE_OPERAND_P;
1492
1493   /* iter_node is used as a marker within the immediate use list to indicate
1494      where the end of the current stmt's uses are.  Initialize it to NULL
1495      stmt and use, which indicates a marker node.  */
1496   imm->iter_node.prev = NULL_USE_OPERAND_P;
1497   imm->iter_node.next = NULL_USE_OPERAND_P;
1498   imm->iter_node.stmt = NULL_TREE;
1499   imm->iter_node.use = NULL_USE_OPERAND_P;
1500
1501   if (end_imm_use_stmt_p (imm))
1502     return NULL_TREE;
1503
1504   link_use_stmts_after (imm->imm_use, imm);
1505
1506   return USE_STMT (imm->imm_use);
1507 }
1508
1509 /* Bump IMM to the next stmt which has a use of var.  */
1510
1511 static inline tree
1512 next_imm_use_stmt (imm_use_iterator *imm)
1513 {
1514   imm->imm_use = imm->iter_node.next;
1515   if (end_imm_use_stmt_p (imm))
1516     {
1517       if (imm->iter_node.prev != NULL)
1518         delink_imm_use (&imm->iter_node);
1519       return NULL_TREE;
1520     }
1521
1522   link_use_stmts_after (imm->imm_use, imm);
1523   return USE_STMT (imm->imm_use);
1524
1525 }
1526
1527 /* This routine will return the first use on the stmt IMM currently refers
1528    to.  */
1529
1530 static inline use_operand_p
1531 first_imm_use_on_stmt (imm_use_iterator *imm)
1532 {
1533   imm->next_imm_name = imm->imm_use->next;
1534   return imm->imm_use;
1535 }
1536
1537 /*  Return TRUE if the last use on the stmt IMM refers to has been visited.  */
1538
1539 static inline bool
1540 end_imm_use_on_stmt_p (imm_use_iterator *imm)
1541 {
1542   return (imm->imm_use == &(imm->iter_node));
1543 }
1544
1545 /* Bump to the next use on the stmt IMM refers to, return NULL if done.  */
1546
1547 static inline use_operand_p
1548 next_imm_use_on_stmt (imm_use_iterator *imm)
1549 {
1550   imm->imm_use = imm->next_imm_name;
1551   if (end_imm_use_on_stmt_p (imm))
1552     return NULL_USE_OPERAND_P;
1553   else
1554     {
1555       imm->next_imm_name = imm->imm_use->next;
1556       return imm->imm_use;
1557     }
1558 }
1559
1560 /* Return true if VAR cannot be modified by the program.  */
1561
1562 static inline bool
1563 unmodifiable_var_p (tree var)
1564 {
1565   if (TREE_CODE (var) == SSA_NAME)
1566     var = SSA_NAME_VAR (var);
1567
1568   if (MTAG_P (var))
1569     return TREE_READONLY (var) && (TREE_STATIC (var) || MTAG_GLOBAL (var));
1570
1571   return TREE_READONLY (var) && (TREE_STATIC (var) || DECL_EXTERNAL (var));
1572 }
1573
1574 /* Return true if REF, an ARRAY_REF, has an INDIRECT_REF somewhere in it.  */
1575
1576 static inline bool
1577 array_ref_contains_indirect_ref (tree ref)
1578 {
1579   gcc_assert (TREE_CODE (ref) == ARRAY_REF);
1580
1581   do {
1582     ref = TREE_OPERAND (ref, 0);
1583   } while (handled_component_p (ref));
1584
1585   return TREE_CODE (ref) == INDIRECT_REF;
1586 }
1587
1588 /* Return true if REF, a handled component reference, has an ARRAY_REF
1589    somewhere in it.  */
1590
1591 static inline bool
1592 ref_contains_array_ref (tree ref)
1593 {
1594   gcc_assert (handled_component_p (ref));
1595
1596   do {
1597     if (TREE_CODE (ref) == ARRAY_REF)
1598       return true;
1599     ref = TREE_OPERAND (ref, 0);
1600   } while (handled_component_p (ref));
1601
1602   return false;
1603 }
1604
1605 /* Given a variable VAR, lookup and return a pointer to the list of
1606    subvariables for it.  */
1607
1608 static inline subvar_t *
1609 lookup_subvars_for_var (tree var)
1610 {
1611   var_ann_t ann = var_ann (var);
1612   gcc_assert (ann);
1613   return &ann->subvars;
1614 }
1615
1616 /* Given a variable VAR, return a linked list of subvariables for VAR, or
1617    NULL, if there are no subvariables.  */
1618
1619 static inline subvar_t
1620 get_subvars_for_var (tree var)
1621 {
1622   subvar_t subvars;
1623
1624   gcc_assert (SSA_VAR_P (var));  
1625   
1626   if (TREE_CODE (var) == SSA_NAME)
1627     subvars = *(lookup_subvars_for_var (SSA_NAME_VAR (var)));
1628   else
1629     subvars = *(lookup_subvars_for_var (var));
1630   return subvars;
1631 }
1632
1633 /* Return the subvariable of VAR at offset OFFSET.  */
1634
1635 static inline tree
1636 get_subvar_at (tree var, unsigned HOST_WIDE_INT offset)
1637 {
1638   subvar_t sv;
1639
1640   for (sv = get_subvars_for_var (var); sv; sv = sv->next)
1641     if (SFT_OFFSET (sv->var) == offset)
1642       return sv->var;
1643
1644   return NULL_TREE;
1645 }
1646
1647 /* Return true if V is a tree that we can have subvars for.
1648    Normally, this is any aggregate type.  Also complex
1649    types which are not gimple registers can have subvars.  */
1650
1651 static inline bool
1652 var_can_have_subvars (tree v)
1653 {
1654   /* Volatile variables should never have subvars.  */
1655   if (TREE_THIS_VOLATILE (v))
1656     return false;
1657
1658   /* Non decls or memory tags can never have subvars.  */
1659   if (!DECL_P (v) || MTAG_P (v))
1660     return false;
1661
1662   /* Aggregates can have subvars.  */
1663   if (AGGREGATE_TYPE_P (TREE_TYPE (v)))
1664     return true;
1665
1666   /* Complex types variables which are not also a gimple register can
1667     have subvars. */
1668   if (TREE_CODE (TREE_TYPE (v)) == COMPLEX_TYPE
1669       && !DECL_COMPLEX_GIMPLE_REG_P (v))
1670     return true;
1671
1672   return false;
1673 }
1674
1675   
1676 /* Return true if OFFSET and SIZE define a range that overlaps with some
1677    portion of the range of SV, a subvar.  If there was an exact overlap,
1678    *EXACT will be set to true upon return. */
1679
1680 static inline bool
1681 overlap_subvar (unsigned HOST_WIDE_INT offset, unsigned HOST_WIDE_INT size,
1682                 tree sv,  bool *exact)
1683 {
1684   /* There are three possible cases of overlap.
1685      1. We can have an exact overlap, like so:   
1686      |offset, offset + size             |
1687      |sv->offset, sv->offset + sv->size |
1688      
1689      2. We can have offset starting after sv->offset, like so:
1690      
1691            |offset, offset + size              |
1692      |sv->offset, sv->offset + sv->size  |
1693
1694      3. We can have offset starting before sv->offset, like so:
1695      
1696      |offset, offset + size    |
1697        |sv->offset, sv->offset + sv->size|
1698   */
1699
1700   if (exact)
1701     *exact = false;
1702   if (offset == SFT_OFFSET (sv) && size == SFT_SIZE (sv))
1703     {
1704       if (exact)
1705         *exact = true;
1706       return true;
1707     }
1708   else if (offset >= SFT_OFFSET (sv) 
1709            && offset < (SFT_OFFSET (sv) + SFT_SIZE (sv)))
1710     {
1711       return true;
1712     }
1713   else if (offset < SFT_OFFSET (sv) 
1714            && (size > SFT_OFFSET (sv) - offset))
1715     {
1716       return true;
1717     }
1718   return false;
1719
1720 }
1721
1722 /* Return the memory tag associated with symbol SYM.  */
1723
1724 static inline tree
1725 symbol_mem_tag (tree sym)
1726 {
1727   tree tag = get_var_ann (sym)->symbol_mem_tag;
1728
1729 #if defined ENABLE_CHECKING
1730   if (tag)
1731     gcc_assert (TREE_CODE (tag) == SYMBOL_MEMORY_TAG);
1732 #endif
1733
1734   return tag;
1735 }
1736
1737
1738 /* Set the memory tag associated with symbol SYM.  */
1739
1740 static inline void
1741 set_symbol_mem_tag (tree sym, tree tag)
1742 {
1743 #if defined ENABLE_CHECKING
1744   if (tag)
1745     gcc_assert (TREE_CODE (tag) == SYMBOL_MEMORY_TAG);
1746 #endif
1747
1748   get_var_ann (sym)->symbol_mem_tag = tag;
1749 }
1750
1751 /* Get the value handle of EXPR.  This is the only correct way to get
1752    the value handle for a "thing".  If EXPR does not have a value
1753    handle associated, it returns NULL_TREE.  
1754    NB: If EXPR is min_invariant, this function is *required* to return
1755    EXPR.  */
1756
1757 static inline tree
1758 get_value_handle (tree expr)
1759 {
1760   if (TREE_CODE (expr) == SSA_NAME)
1761     return SSA_NAME_VALUE (expr);
1762   else if (DECL_P (expr) || TREE_CODE (expr) == TREE_LIST
1763            || TREE_CODE (expr) == CONSTRUCTOR)
1764     {
1765       tree_ann_common_t ann = tree_common_ann (expr);
1766       return ((ann) ? ann->value_handle : NULL_TREE);
1767     }
1768   else if (is_gimple_min_invariant (expr))
1769     return expr;
1770   else if (EXPR_P (expr))
1771     {
1772       tree_ann_common_t ann = tree_common_ann (expr);
1773       return ((ann) ? ann->value_handle : NULL_TREE);
1774     }
1775   else
1776     gcc_unreachable ();
1777 }
1778
1779 /* Accessor to tree-ssa-operands.c caches.  */
1780 static inline struct ssa_operands *
1781 gimple_ssa_operands (struct function *fun)
1782 {
1783   return &fun->gimple_df->ssa_operands;
1784 }
1785 #endif /* _TREE_FLOW_INLINE_H  */