1 /* Inline functions for tree-flow.h
2 Copyright (C) 2001, 2003 Free Software Foundation, Inc.
3 Contributed by Diego Novillo <dnovillo@redhat.com>
5 This file is part of GCC.
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)
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.
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, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
22 #ifndef _TREE_FLOW_INLINE_H
23 #define _TREE_FLOW_INLINE_H 1
25 /* Inline functions for manipulating various data structures defined in
26 tree-flow.h. See tree-flow.h for documentation. */
28 /* Return the variable annotation for T, which must be a _DECL node.
29 Return NULL if the variable annotation doesn't already exist. */
30 static inline var_ann_t
34 gcc_assert (DECL_P (t
));
35 gcc_assert (!t
->common
.ann
|| t
->common
.ann
->common
.type
== VAR_ANN
);
37 return (var_ann_t
) t
->common
.ann
;
40 /* Return the variable annotation for T, which must be a _DECL node.
41 Create the variable annotation if it doesn't exist. */
42 static inline var_ann_t
43 get_var_ann (tree var
)
45 var_ann_t ann
= var_ann (var
);
46 return (ann
) ? ann
: create_var_ann (var
);
49 /* Return the statement annotation for T, which must be a statement
50 node. Return NULL if the statement annotation doesn't exist. */
51 static inline stmt_ann_t
54 #ifdef ENABLE_CHECKING
55 gcc_assert (is_gimple_stmt (t
));
57 return (stmt_ann_t
) t
->common
.ann
;
60 /* Return the statement annotation for T, which must be a statement
61 node. Create the statement annotation if it doesn't exist. */
62 static inline stmt_ann_t
63 get_stmt_ann (tree stmt
)
65 stmt_ann_t ann
= stmt_ann (stmt
);
66 return (ann
) ? ann
: create_stmt_ann (stmt
);
70 /* Return the annotation type for annotation ANN. */
71 static inline enum tree_ann_type
72 ann_type (tree_ann_t ann
)
74 return ann
->common
.type
;
77 /* Return the basic block for statement T. */
78 static inline basic_block
83 if (TREE_CODE (t
) == PHI_NODE
)
87 return ann
? ann
->bb
: NULL
;
90 /* Return the may_aliases varray for variable VAR, or NULL if it has
92 static inline varray_type
93 may_aliases (tree var
)
95 var_ann_t ann
= var_ann (var
);
96 return ann
? ann
->may_aliases
: NULL
;
99 /* Return the line number for EXPR, or return -1 if we have no line
100 number information for it. */
102 get_lineno (tree expr
)
104 if (expr
== NULL_TREE
)
107 if (TREE_CODE (expr
) == COMPOUND_EXPR
)
108 expr
= TREE_OPERAND (expr
, 0);
110 if (! EXPR_HAS_LOCATION (expr
))
113 return EXPR_LINENO (expr
);
116 /* Return the file name for EXPR, or return "???" if we have no
117 filename information. */
118 static inline const char *
119 get_filename (tree expr
)
121 const char *filename
;
122 if (expr
== NULL_TREE
)
125 if (TREE_CODE (expr
) == COMPOUND_EXPR
)
126 expr
= TREE_OPERAND (expr
, 0);
128 if (EXPR_HAS_LOCATION (expr
) && (filename
= EXPR_FILENAME (expr
)))
134 /* Mark statement T as modified. */
138 stmt_ann_t ann
= stmt_ann (t
);
140 ann
= create_stmt_ann (t
);
144 /* Mark statement T as unmodified. */
146 unmodify_stmt (tree t
)
148 stmt_ann_t ann
= stmt_ann (t
);
150 ann
= create_stmt_ann (t
);
154 /* Return true if T is marked as modified, false otherwise. */
156 stmt_modified_p (tree t
)
158 stmt_ann_t ann
= stmt_ann (t
);
160 /* Note that if the statement doesn't yet have an annotation, we consider it
161 modified. This will force the next call to get_stmt_operands to scan the
163 return ann
? ann
->modified
: true;
166 /* Return the definitions present in ANN, a statement annotation.
167 Return NULL if this annotation contains no definitions. */
168 static inline def_optype
169 get_def_ops (stmt_ann_t ann
)
171 return ann
? ann
->operands
.def_ops
: NULL
;
174 /* Return the uses present in ANN, a statement annotation.
175 Return NULL if this annotation contains no uses. */
176 static inline use_optype
177 get_use_ops (stmt_ann_t ann
)
179 return ann
? ann
->operands
.use_ops
: NULL
;
182 /* Return the virtual may-defs present in ANN, a statement
184 Return NULL if this annotation contains no virtual may-defs. */
185 static inline v_may_def_optype
186 get_v_may_def_ops (stmt_ann_t ann
)
188 return ann
? ann
->operands
.v_may_def_ops
: NULL
;
191 /* Return the virtual uses present in ANN, a statement annotation.
192 Return NULL if this annotation contains no virtual uses. */
193 static inline vuse_optype
194 get_vuse_ops (stmt_ann_t ann
)
196 return ann
? ann
->operands
.vuse_ops
: NULL
;
199 /* Return the virtual must-defs present in ANN, a statement
200 annotation. Return NULL if this annotation contains no must-defs.*/
201 static inline v_must_def_optype
202 get_v_must_def_ops (stmt_ann_t ann
)
204 return ann
? ann
->operands
.v_must_def_ops
: NULL
;
207 /* Return the tree pointer to by USE. */
209 get_use_from_ptr (use_operand_p use
)
214 /* Return the tree pointer to by DEF. */
216 get_def_from_ptr (def_operand_p def
)
221 /* Return a pointer to the tree that is at INDEX in the USES array. */
222 static inline use_operand_p
223 get_use_op_ptr (use_optype uses
, unsigned int index
)
225 gcc_assert (index
< uses
->num_uses
);
226 return uses
->uses
[index
];
229 /* Return a def_operand_p pointer for element INDEX of DEFS. */
230 static inline def_operand_p
231 get_def_op_ptr (def_optype defs
, unsigned int index
)
233 gcc_assert (index
< defs
->num_defs
);
234 return defs
->defs
[index
];
238 /* Return the def_operand_p that is the V_MAY_DEF_RESULT for the V_MAY_DEF
239 at INDEX in the V_MAY_DEFS array. */
240 static inline def_operand_p
241 get_v_may_def_result_ptr(v_may_def_optype v_may_defs
, unsigned int index
)
244 gcc_assert (index
< v_may_defs
->num_v_may_defs
);
245 op
.def
= &(v_may_defs
->v_may_defs
[index
].def
);
249 /* Return a use_operand_p that is the V_MAY_DEF_OP for the V_MAY_DEF at
250 INDEX in the V_MAY_DEFS array. */
251 static inline use_operand_p
252 get_v_may_def_op_ptr(v_may_def_optype v_may_defs
, unsigned int index
)
255 gcc_assert (index
< v_may_defs
->num_v_may_defs
);
256 op
.use
= &(v_may_defs
->v_may_defs
[index
].use
);
260 /* Return a use_operand_p that is at INDEX in the VUSES array. */
261 static inline use_operand_p
262 get_vuse_op_ptr(vuse_optype vuses
, unsigned int index
)
265 gcc_assert (index
< vuses
->num_vuses
);
266 op
.use
= &(vuses
->vuses
[index
]);
270 /* Return a def_operand_p that is the V_MUST_DEF_RESULT for the
271 V_MUST_DEF at INDEX in the V_MUST_DEFS array. */
272 static inline def_operand_p
273 get_v_must_def_result_ptr (v_must_def_optype v_must_defs
, unsigned int index
)
276 gcc_assert (index
< v_must_defs
->num_v_must_defs
);
277 op
.def
= &(v_must_defs
->v_must_defs
[index
].def
);
281 /* Return a use_operand_p that is the V_MUST_DEF_KILL for the
282 V_MUST_DEF at INDEX in the V_MUST_DEFS array. */
283 static inline use_operand_p
284 get_v_must_def_kill_ptr (v_must_def_optype v_must_defs
, unsigned int index
)
287 gcc_assert (index
< v_must_defs
->num_v_must_defs
);
288 op
.use
= &(v_must_defs
->v_must_defs
[index
].use
);
292 /* Return a def_operand_p pointer for the result of PHI. */
293 static inline def_operand_p
294 get_phi_result_ptr (tree phi
)
297 op
.def
= &(PHI_RESULT_TREE (phi
));
301 /* Return a use_operand_p pointer for argument I of phinode PHI. */
302 static inline use_operand_p
303 get_phi_arg_def_ptr (tree phi
, int i
)
306 op
.use
= &(PHI_ARG_DEF_TREE (phi
, i
));
310 /* Return the bitmap of addresses taken by STMT, or NULL if it takes
313 addresses_taken (tree stmt
)
315 stmt_ann_t ann
= stmt_ann (stmt
);
316 return ann
? ann
->addresses_taken
: NULL
;
319 /* Return the immediate uses of STMT, or NULL if this information is
322 get_immediate_uses (tree stmt
)
326 if (TREE_CODE (stmt
) == PHI_NODE
)
327 return PHI_DF (stmt
);
329 ann
= stmt_ann (stmt
);
330 return ann
? ann
->df
: NULL
;
333 /* Return the number of immediate uses present in the dataflow
334 information at DF. */
336 num_immediate_uses (dataflow_t df
)
343 imm
= df
->immediate_uses
;
345 return df
->uses
[1] ? 2 : 1;
347 return VARRAY_ACTIVE_SIZE (imm
) + 2;
350 /* Return the tree that is at NUM in the immediate use DF array. */
352 immediate_use (dataflow_t df
, int num
)
357 #ifdef ENABLE_CHECKING
358 gcc_assert (num
< num_immediate_uses (df
));
361 return df
->uses
[num
];
362 return VARRAY_TREE (df
->immediate_uses
, num
- 2);
365 /* Return the basic_block annotation for BB. */
366 static inline bb_ann_t
367 bb_ann (basic_block bb
)
369 return (bb_ann_t
)bb
->tree_annotations
;
372 /* Return the PHI nodes for basic block BB, or NULL if there are no
375 phi_nodes (basic_block bb
)
377 return bb_ann (bb
)->phi_nodes
;
380 /* Set list of phi nodes of a basic block BB to L. */
383 set_phi_nodes (basic_block bb
, tree l
)
387 bb_ann (bb
)->phi_nodes
= l
;
388 for (phi
= l
; phi
; phi
= PHI_CHAIN (phi
))
389 set_bb_for_stmt (phi
, bb
);
392 /* Return the phi index number for an edge. */
394 phi_arg_from_edge (tree phi
, edge e
)
397 gcc_assert (TREE_CODE (phi
) == PHI_NODE
);
401 /* Mark VAR as used, so that it'll be preserved during rtl expansion. */
404 set_is_used (tree var
)
406 var_ann_t ann
= get_var_ann (var
);
411 /* ----------------------------------------------------------------------- */
413 /* Return true if T is an executable statement. */
415 is_exec_stmt (tree t
)
417 return (t
&& !IS_EMPTY_STMT (t
) && t
!= error_mark_node
);
421 /* Return true if this stmt can be the target of a control transfer stmt such
424 is_label_stmt (tree t
)
427 switch (TREE_CODE (t
))
431 case CASE_LABEL_EXPR
:
439 /* Set the default definition for VAR to DEF. */
441 set_default_def (tree var
, tree def
)
443 var_ann_t ann
= get_var_ann (var
);
444 ann
->default_def
= def
;
447 /* Return the default definition for variable VAR, or NULL if none
450 default_def (tree var
)
452 var_ann_t ann
= var_ann (var
);
453 return ann
? ann
->default_def
: NULL_TREE
;
456 /* PHI nodes should contain only ssa_names and invariants. A test
457 for ssa_name is definitely simpler; don't let invalid contents
458 slip in in the meantime. */
461 phi_ssa_name_p (tree t
)
463 if (TREE_CODE (t
) == SSA_NAME
)
465 #ifdef ENABLE_CHECKING
466 gcc_assert (is_gimple_min_invariant (t
));
471 /* ----------------------------------------------------------------------- */
473 /* Return a block_stmt_iterator that points to beginning of basic
475 static inline block_stmt_iterator
476 bsi_start (basic_block bb
)
478 block_stmt_iterator bsi
;
480 bsi
.tsi
= tsi_start (bb
->stmt_list
);
483 gcc_assert (bb
->index
< 0);
485 bsi
.tsi
.container
= NULL
;
491 /* Return a block statement iterator that points to the last label in
494 static inline block_stmt_iterator
495 bsi_after_labels (basic_block bb
)
497 block_stmt_iterator bsi
;
498 tree_stmt_iterator next
;
504 gcc_assert (bb
->index
< 0);
506 bsi
.tsi
.container
= NULL
;
510 bsi
.tsi
= tsi_start (bb
->stmt_list
);
511 if (tsi_end_p (bsi
.tsi
))
514 /* Ensure that there are some labels. The rationale is that we want
515 to insert after the bsi that is returned, and these insertions should
516 be placed at the start of the basic block. This would not work if the
517 first statement was not label; rather fail here than enable the user
518 proceed in wrong way. */
519 gcc_assert (TREE_CODE (tsi_stmt (bsi
.tsi
)) == LABEL_EXPR
);
524 while (!tsi_end_p (next
)
525 && TREE_CODE (tsi_stmt (next
)) == LABEL_EXPR
)
534 /* Return a block statement iterator that points to the end of basic
536 static inline block_stmt_iterator
537 bsi_last (basic_block bb
)
539 block_stmt_iterator bsi
;
541 bsi
.tsi
= tsi_last (bb
->stmt_list
);
544 gcc_assert (bb
->index
< 0);
546 bsi
.tsi
.container
= NULL
;
552 /* Return true if block statement iterator I has reached the end of
555 bsi_end_p (block_stmt_iterator i
)
557 return tsi_end_p (i
.tsi
);
560 /* Modify block statement iterator I so that it is at the next
561 statement in the basic block. */
563 bsi_next (block_stmt_iterator
*i
)
568 /* Modify block statement iterator I so that it is at the previous
569 statement in the basic block. */
571 bsi_prev (block_stmt_iterator
*i
)
576 /* Return the statement that block statement iterator I is currently
579 bsi_stmt (block_stmt_iterator i
)
581 return tsi_stmt (i
.tsi
);
584 /* Return a pointer to the statement that block statement iterator I
587 bsi_stmt_ptr (block_stmt_iterator i
)
589 return tsi_stmt_ptr (i
.tsi
);
592 /* Returns the loop of the statement STMT. */
594 static inline struct loop
*
595 loop_containing_stmt (tree stmt
)
597 basic_block bb
= bb_for_stmt (stmt
);
601 return bb
->loop_father
;
604 /* Return true if VAR is a clobbered by function calls. */
606 is_call_clobbered (tree var
)
608 return is_global_var (var
)
609 || bitmap_bit_p (call_clobbered_vars
, var_ann (var
)->uid
);
612 /* Mark variable VAR as being clobbered by function calls. */
614 mark_call_clobbered (tree var
)
616 var_ann_t ann
= var_ann (var
);
617 /* If VAR is a memory tag, then we need to consider it a global
618 variable. This is because the pointer that VAR represents has
619 been found to point to either an arbitrary location or to a known
620 location in global memory. */
621 if (ann
->mem_tag_kind
!= NOT_A_TAG
)
622 DECL_EXTERNAL (var
) = 1;
623 bitmap_set_bit (call_clobbered_vars
, ann
->uid
);
626 /* Mark variable VAR as being non-addressable. */
628 mark_non_addressable (tree var
)
630 bitmap_clear_bit (call_clobbered_vars
, var_ann (var
)->uid
);
631 TREE_ADDRESSABLE (var
) = 0;
634 /* Return the common annotation for T. Return NULL if the annotation
635 doesn't already exist. */
636 static inline tree_ann_t
639 return t
->common
.ann
;
642 /* Return a common annotation for T. Create the constant annotation if it
644 static inline tree_ann_t
645 get_tree_ann (tree t
)
647 tree_ann_t ann
= tree_ann (t
);
648 return (ann
) ? ann
: create_tree_ann (t
);
651 /* ----------------------------------------------------------------------- */
653 /* The following set of routines are used to iterator over various type of
656 /* Return true if PTR is finished iterating. */
658 op_iter_done (ssa_op_iter
*ptr
)
663 /* Get the next iterator use value for PTR. */
664 static inline use_operand_p
665 op_iter_next_use (ssa_op_iter
*ptr
)
667 if (ptr
->use_i
< ptr
->num_use
)
669 return USE_OP_PTR (ptr
->ops
->use_ops
, (ptr
->use_i
)++);
671 if (ptr
->vuse_i
< ptr
->num_vuse
)
673 return VUSE_OP_PTR (ptr
->ops
->vuse_ops
, (ptr
->vuse_i
)++);
675 if (ptr
->v_mayu_i
< ptr
->num_v_mayu
)
677 return V_MAY_DEF_OP_PTR (ptr
->ops
->v_may_def_ops
,
680 if (ptr
->v_mustu_i
< ptr
->num_v_mustu
)
682 return V_MUST_DEF_KILL_PTR (ptr
->ops
->v_must_def_ops
,
686 return NULL_USE_OPERAND_P
;
689 /* Get the next iterator def value for PTR. */
690 static inline def_operand_p
691 op_iter_next_def (ssa_op_iter
*ptr
)
693 if (ptr
->def_i
< ptr
->num_def
)
695 return DEF_OP_PTR (ptr
->ops
->def_ops
, (ptr
->def_i
)++);
697 if (ptr
->v_mustd_i
< ptr
->num_v_mustd
)
699 return V_MUST_DEF_RESULT_PTR (ptr
->ops
->v_must_def_ops
,
702 if (ptr
->v_mayd_i
< ptr
->num_v_mayd
)
704 return V_MAY_DEF_RESULT_PTR (ptr
->ops
->v_may_def_ops
,
708 return NULL_DEF_OPERAND_P
;
711 /* Get the next iterator tree value for PTR. */
713 op_iter_next_tree (ssa_op_iter
*ptr
)
715 if (ptr
->use_i
< ptr
->num_use
)
717 return USE_OP (ptr
->ops
->use_ops
, (ptr
->use_i
)++);
719 if (ptr
->vuse_i
< ptr
->num_vuse
)
721 return VUSE_OP (ptr
->ops
->vuse_ops
, (ptr
->vuse_i
)++);
723 if (ptr
->v_mayu_i
< ptr
->num_v_mayu
)
725 return V_MAY_DEF_OP (ptr
->ops
->v_may_def_ops
, (ptr
->v_mayu_i
)++);
727 if (ptr
->v_mustu_i
< ptr
->num_v_mustu
)
729 return V_MUST_DEF_KILL (ptr
->ops
->v_must_def_ops
, (ptr
->v_mustu_i
)++);
731 if (ptr
->def_i
< ptr
->num_def
)
733 return DEF_OP (ptr
->ops
->def_ops
, (ptr
->def_i
)++);
735 if (ptr
->v_mustd_i
< ptr
->num_v_mustd
)
737 return V_MUST_DEF_RESULT (ptr
->ops
->v_must_def_ops
,
740 if (ptr
->v_mayd_i
< ptr
->num_v_mayd
)
742 return V_MAY_DEF_RESULT (ptr
->ops
->v_may_def_ops
,
749 /* Initialize the iterator PTR to the virtual defs in STMT. */
751 op_iter_init (ssa_op_iter
*ptr
, tree stmt
, int flags
)
754 stmt_ann_t ann
= get_stmt_ann (stmt
);
756 ops
= &(ann
->operands
);
759 ptr
->num_def
= (flags
& SSA_OP_DEF
) ? NUM_DEFS (ops
->def_ops
) : 0;
760 ptr
->num_use
= (flags
& SSA_OP_USE
) ? NUM_USES (ops
->use_ops
) : 0;
761 ptr
->num_vuse
= (flags
& SSA_OP_VUSE
) ? NUM_VUSES (ops
->vuse_ops
) : 0;
762 ptr
->num_v_mayu
= (flags
& SSA_OP_VMAYUSE
)
763 ? NUM_V_MAY_DEFS (ops
->v_may_def_ops
) : 0;
764 ptr
->num_v_mayd
= (flags
& SSA_OP_VMAYDEF
)
765 ? NUM_V_MAY_DEFS (ops
->v_may_def_ops
) : 0;
766 ptr
->num_v_mustu
= (flags
& SSA_OP_VMUSTDEFKILL
)
767 ? NUM_V_MUST_DEFS (ops
->v_must_def_ops
) : 0;
768 ptr
->num_v_mustd
= (flags
& SSA_OP_VMUSTDEF
)
769 ? NUM_V_MUST_DEFS (ops
->v_must_def_ops
) : 0;
779 /* Initialize iterator PTR to the use operands in STMT based on FLAGS. Return
781 static inline use_operand_p
782 op_iter_init_use (ssa_op_iter
*ptr
, tree stmt
, int flags
)
784 op_iter_init (ptr
, stmt
, flags
);
785 return op_iter_next_use (ptr
);
788 /* Initialize iterator PTR to the def operands in STMT based on FLAGS. Return
790 static inline def_operand_p
791 op_iter_init_def (ssa_op_iter
*ptr
, tree stmt
, int flags
)
793 op_iter_init (ptr
, stmt
, flags
);
794 return op_iter_next_def (ptr
);
797 /* Initialize iterator PTR to the operands in STMT based on FLAGS. Return
798 the first operand as a tree. */
800 op_iter_init_tree (ssa_op_iter
*ptr
, tree stmt
, int flags
)
802 op_iter_init (ptr
, stmt
, flags
);
803 return op_iter_next_tree (ptr
);
806 /* Get the next iterator mustdef value for PTR, returning the mustdef values in
809 op_iter_next_mustdef (use_operand_p
*kill
, def_operand_p
*def
, ssa_op_iter
*ptr
)
811 if (ptr
->v_mustu_i
< ptr
->num_v_mustu
)
813 *def
= V_MUST_DEF_RESULT_PTR (ptr
->ops
->v_must_def_ops
, ptr
->v_mustu_i
);
814 *kill
= V_MUST_DEF_KILL_PTR (ptr
->ops
->v_must_def_ops
, (ptr
->v_mustu_i
)++);
819 *def
= NULL_DEF_OPERAND_P
;
820 *kill
= NULL_USE_OPERAND_P
;
825 /* Get the next iterator maydef value for PTR, returning the maydef values in
828 op_iter_next_maydef (use_operand_p
*use
, def_operand_p
*def
, ssa_op_iter
*ptr
)
830 if (ptr
->v_mayu_i
< ptr
->num_v_mayu
)
832 *def
= V_MAY_DEF_RESULT_PTR (ptr
->ops
->v_may_def_ops
, ptr
->v_mayu_i
);
833 *use
= V_MAY_DEF_OP_PTR (ptr
->ops
->v_may_def_ops
, (ptr
->v_mayu_i
)++);
838 *def
= NULL_DEF_OPERAND_P
;
839 *use
= NULL_USE_OPERAND_P
;
845 /* Initialize iterator PTR to the operands in STMT. Return the first operands
848 op_iter_init_maydef (ssa_op_iter
*ptr
, tree stmt
, use_operand_p
*use
,
851 op_iter_init (ptr
, stmt
, SSA_OP_VMAYUSE
);
852 op_iter_next_maydef (use
, def
, ptr
);
855 /* Initialize iterator PTR to the operands in STMT. Return the first operands
858 op_iter_init_mustdef (ssa_op_iter
*ptr
, tree stmt
, use_operand_p
*kill
,
861 op_iter_init (ptr
, stmt
, SSA_OP_VMUSTDEFKILL
);
862 op_iter_next_mustdef (kill
, def
, ptr
);
864 #endif /* _TREE_FLOW_INLINE_H */