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 static inline var_ann_t
31 #if defined ENABLE_CHECKING
35 && t->common.ann->common.type != VAR_ANN))
39 return (var_ann_t) t->common.ann;
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 static inline stmt_ann_t
52 #if defined ENABLE_CHECKING
53 if (!is_gimple_stmt (t) && !is_essa_node (t))
57 return (stmt_ann_t) t->common.ann;
60 static inline stmt_ann_t
61 get_stmt_ann (tree stmt)
63 stmt_ann_t ann = stmt_ann (stmt);
64 return (ann) ? ann : create_stmt_ann (stmt);
67 static inline ssa_name_ann_t
70 #if defined ENABLE_CHECKING
72 || TREE_CODE (t) != SSA_NAME
74 && t->common.ann->common.type != SSA_NAME_ANN))
78 return (ssa_name_ann_t) t->common.ann;
81 static inline ssa_name_ann_t
82 get_ssa_name_ann (tree var)
84 ssa_name_ann_t ann = ssa_name_ann (var);
85 return (ann) ? ann : create_ssa_name_ann (var);
89 static inline enum tree_ann_type
90 ann_type (tree_ann ann)
92 return ann->common.type;
95 static inline basic_block
98 stmt_ann_t ann = stmt_ann (t);
99 return ann ? ann->bb : NULL;
102 static inline varray_type
103 may_aliases (tree var)
105 var_ann_t ann = var_ann (var);
106 return ann ? ann->may_aliases : NULL;
110 has_hidden_use (tree var)
112 var_ann_t ann = var_ann (var);
113 return ann ? ann->has_hidden_use : false;
117 set_has_hidden_use (tree var)
119 var_ann_t ann = var_ann (var);
121 ann = create_var_ann (var);
122 ann->has_hidden_use = 1;
126 get_lineno (tree expr)
128 if (expr == NULL_TREE)
131 if (TREE_CODE (expr) == COMPOUND_EXPR)
132 expr = TREE_OPERAND (expr, 0);
134 if (! EXPR_LOCUS (expr))
137 return EXPR_LINENO (expr);
140 static inline const char *
141 get_filename (tree expr)
143 if (expr == NULL_TREE)
146 if (TREE_CODE (expr) == COMPOUND_EXPR)
147 expr = TREE_OPERAND (expr, 0);
149 if (EXPR_LOCUS (expr) && EXPR_FILENAME (expr))
150 return EXPR_FILENAME (expr);
158 stmt_ann_t ann = stmt_ann (t);
160 ann = create_stmt_ann (t);
165 unmodify_stmt (tree t)
167 stmt_ann_t ann = stmt_ann (t);
169 ann = create_stmt_ann (t);
174 stmt_modified_p (tree t)
176 stmt_ann_t ann = stmt_ann (t);
178 /* Note that if the statement doesn't yet have an annotation, we consider it
179 modified. This will force the next call to get_stmt_operands to scan the
181 return ann ? ann->modified : true;
184 static inline def_optype
185 get_def_ops (stmt_ann_t ann)
187 return ann ? ann->def_ops : NULL;
190 static inline use_optype
191 get_use_ops (stmt_ann_t ann)
193 return ann ? ann->use_ops : NULL;
196 static inline vdef_optype
197 get_vdef_ops (stmt_ann_t ann)
199 return ann ? ann->vdef_ops : NULL;
202 static inline vuse_optype
203 get_vuse_ops (stmt_ann_t ann)
205 return ann ? ann->vuse_ops : NULL;
209 get_use_op_ptr (use_optype uses, unsigned int index)
211 #ifdef ENABLE_CHECKING
212 if (index >= uses->num_uses)
215 return uses->uses[index];
219 get_def_op_ptr (def_optype defs, unsigned int index)
221 #ifdef ENABLE_CHECKING
222 if (index >= defs->num_defs)
225 return defs->defs[index];
229 get_vdef_result_ptr(vdef_optype vdefs, unsigned int index)
231 #ifdef ENABLE_CHECKING
232 if (index >= vdefs->num_vdefs)
235 return &(vdefs->vdefs[index * 2]);
239 get_vdef_op_ptr(vdef_optype vdefs, unsigned int index)
241 #ifdef ENABLE_CHECKING
242 if (index >= vdefs->num_vdefs)
245 return &(vdefs->vdefs[index * 2 + 1]);
249 get_vuse_op_ptr(vuse_optype vuses, unsigned int index)
251 #ifdef ENABLE_CHECKING
252 if (index >= vuses->num_vuses)
255 return &(vuses->vuses[index]);
259 start_ssa_stmt_operands (tree stmt ATTRIBUTE_UNUSED)
261 #ifdef ENABLE_CHECKING
262 verify_start_operands (stmt);
267 addresses_taken (tree stmt)
269 stmt_ann_t ann = stmt_ann (stmt);
270 return ann ? ann->addresses_taken : NULL;
274 get_immediate_uses (tree stmt)
276 stmt_ann_t ann = stmt_ann (stmt);
277 return ann ? ann->df : NULL;
281 num_immediate_uses (dataflow_t df)
288 imm = df->immediate_uses;
290 return df->uses[1] ? 2 : 1;
292 return VARRAY_ACTIVE_SIZE (imm) + 2;
296 immediate_use (dataflow_t df, int num)
301 #ifdef ENABLE_CHECKING
302 if (num >= num_immediate_uses (df))
306 return df->uses[num];
307 return VARRAY_TREE (df->immediate_uses, num - 2);
310 static inline bb_ann_t
311 bb_ann (basic_block bb)
313 return (bb_ann_t)bb->tree_annotations;
317 phi_nodes (basic_block bb)
321 return bb_ann (bb)->phi_nodes;
324 /* Set list of phi nodes of a basic block BB to L. */
327 set_phi_nodes (basic_block bb, tree l)
331 bb_ann (bb)->phi_nodes = l;
332 for (phi = l; phi; phi = TREE_CHAIN (phi))
333 set_bb_for_stmt (phi, bb);
336 /* Return the phi index number for an edge. */
338 phi_arg_from_edge (tree phi, edge e)
341 #if defined ENABLE_CHECKING
342 if (!phi || TREE_CODE (phi) != PHI_NODE)
346 for (i = 0; i < PHI_NUM_ARGS (phi); i++)
347 if (PHI_ARG_EDGE (phi, i) == e)
354 /* Return the phi argument number for an edge. */
355 static inline struct phi_arg_d *
356 phi_element_for_edge (tree phi, edge e)
360 i = phi_arg_from_edge (phi, e);
362 return &(PHI_ARG_ELT (phi, i));
364 return (struct phi_arg_d *)NULL;
367 /* ----------------------------------------------------------------------- */
370 is_exec_stmt (tree t)
372 return (t && !IS_EMPTY_STMT (t) && t != error_mark_node);
376 /* Return true if this stmt can be the target of a control transfer stmt such
379 is_label_stmt (tree t)
382 switch (TREE_CODE (t))
386 case CASE_LABEL_EXPR:
395 may_propagate_copy (tree dest, tree orig)
397 /* FIXME. GIMPLE is allowing pointer assignments and comparisons of
398 pointers that have different alias sets. This means that these
399 pointers will have different memory tags associated to them.
401 If we allow copy propagation in these cases, statements de-referencing
402 the new pointer will now have a reference to a different memory tag
403 with potentially incorrect SSA information.
405 This was showing up in libjava/java/util/zip/ZipFile.java with code
408 struct java.io.BufferedInputStream *T.660;
409 struct java.io.BufferedInputStream *T.647;
410 struct java.io.InputStream *is;
411 struct java.io.InputStream *is.662;
414 is = T.660; <-- This ought to be type-casted
417 Also, f/name.c exposed a similar problem with a COND_EXPR predicate
418 that was causing DOM to generate and equivalence with two pointers of
419 alias-incompatible types:
421 struct _ffename_space *n;
430 I think that GIMPLE should emit the appropriate type-casts. For the
431 time being, blocking copy-propagation in these cases is the safe thing
433 if (TREE_CODE (dest) == SSA_NAME
434 && TREE_CODE (orig) == SSA_NAME
435 && POINTER_TYPE_P (TREE_TYPE (dest))
436 && POINTER_TYPE_P (TREE_TYPE (orig)))
438 tree mt_dest = var_ann (SSA_NAME_VAR (dest))->type_mem_tag;
439 tree mt_orig = var_ann (SSA_NAME_VAR (orig))->type_mem_tag;
440 if (mt_dest && mt_orig && mt_dest != mt_orig)
444 /* If the destination is a SSA_NAME for a virtual operand, then we have
445 some special cases to handle. */
446 if (TREE_CODE (dest) == SSA_NAME && !is_gimple_reg (dest))
448 /* If both operands are SSA_NAMEs referring to virtual operands, then
449 we can always propagate. */
450 if (TREE_CODE (orig) == SSA_NAME)
452 if (!is_gimple_reg (orig))
455 #ifdef ENABLE_CHECKING
456 /* If we have one real and one virtual operand, then something has
457 gone terribly wrong. */
458 if (is_gimple_reg (orig))
463 /* We have a "copy" from something like a constant into a virtual
464 operand. Reject these. */
468 return (!SSA_NAME_OCCURS_IN_ABNORMAL_PHI (dest)
469 && (TREE_CODE (orig) != SSA_NAME
470 || !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (orig))
471 && !DECL_HARD_REGISTER (SSA_NAME_VAR (dest)));
475 set_default_def (tree var, tree def)
477 var_ann_t ann = var_ann (var);
479 ann = create_var_ann (var);
480 ann->default_def = def;
484 default_def (tree var)
486 var_ann_t ann = var_ann (var);
487 return ann ? ann->default_def : NULL_TREE;
490 /* PHI nodes should contain only ssa_names and invariants. A test
491 for ssa_name is definitely simpler; don't let invalid contents
492 slip in in the meantime. */
495 phi_ssa_name_p (tree t)
497 if (TREE_CODE (t) == SSA_NAME)
499 #ifdef ENABLE_CHECKING
500 if (!is_gimple_min_invariant (t))
506 /* ----------------------------------------------------------------------- */
508 static inline block_stmt_iterator
509 bsi_start (basic_block bb)
511 block_stmt_iterator bsi;
513 bsi.tsi = tsi_start (bb->stmt_list);
516 #ifdef ENABLE_CHECKING
521 bsi.tsi.container = NULL;
527 static inline block_stmt_iterator
528 bsi_last (basic_block bb)
530 block_stmt_iterator bsi;
532 bsi.tsi = tsi_last (bb->stmt_list);
535 #ifdef ENABLE_CHECKING
540 bsi.tsi.container = NULL;
547 bsi_end_p (block_stmt_iterator i)
549 return tsi_end_p (i.tsi);
553 bsi_next (block_stmt_iterator *i)
559 bsi_prev (block_stmt_iterator *i)
565 bsi_stmt (block_stmt_iterator i)
567 return tsi_stmt (i.tsi);
571 bsi_stmt_ptr (block_stmt_iterator i)
573 return tsi_stmt_ptr (i.tsi);
577 may_be_aliased (tree var)
579 return (TREE_ADDRESSABLE (var)
580 || decl_function_context (var) != current_function_decl);
584 is_call_clobbered (tree var)
586 return needs_to_live_in_memory (var)
587 || bitmap_bit_p (call_clobbered_vars, var_ann (var)->uid);
591 mark_call_clobbered (tree var)
593 var_ann_t ann = var_ann (var);
594 /* Call-clobbered variables need to live in memory. */
595 DECL_NEEDS_TO_LIVE_IN_MEMORY_INTERNAL (var) = 1;
596 bitmap_set_bit (call_clobbered_vars, ann->uid);
600 mark_non_addressable (tree var)
602 bitmap_clear_bit (call_clobbered_vars, var_ann (var)->uid);
603 DECL_NEEDS_TO_LIVE_IN_MEMORY_INTERNAL (var) = 0;
604 TREE_ADDRESSABLE (var) = 0;
607 #endif /* _TREE_FLOW_INLINE_H */