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);
68 static inline enum tree_ann_type
69 ann_type (tree_ann ann)
71 return ann->common.type;
74 static inline basic_block
77 stmt_ann_t ann = stmt_ann (t);
78 return ann ? ann->bb : NULL;
81 static inline varray_type
82 may_aliases (tree var)
84 var_ann_t ann = var_ann (var);
85 return ann ? ann->may_aliases : NULL;
89 has_hidden_use (tree var)
91 var_ann_t ann = var_ann (var);
92 return ann ? ann->has_hidden_use : false;
96 set_has_hidden_use (tree var)
98 var_ann_t ann = var_ann (var);
100 ann = create_var_ann (var);
101 ann->has_hidden_use = 1;
105 get_lineno (tree expr)
107 if (expr == NULL_TREE)
110 if (TREE_CODE (expr) == COMPOUND_EXPR)
111 expr = TREE_OPERAND (expr, 0);
113 if (! EXPR_LOCUS (expr))
116 return EXPR_LINENO (expr);
119 static inline const char *
120 get_filename (tree expr)
122 if (expr == NULL_TREE)
125 if (TREE_CODE (expr) == COMPOUND_EXPR)
126 expr = TREE_OPERAND (expr, 0);
128 if (EXPR_LOCUS (expr) && EXPR_FILENAME (expr))
129 return EXPR_FILENAME (expr);
137 stmt_ann_t ann = stmt_ann (t);
139 ann = create_stmt_ann (t);
144 unmodify_stmt (tree t)
146 stmt_ann_t ann = stmt_ann (t);
148 ann = create_stmt_ann (t);
153 stmt_modified_p (tree t)
155 stmt_ann_t ann = stmt_ann (t);
157 /* Note that if the statement doesn't yet have an annotation, we consider it
158 modified. This will force the next call to get_stmt_operands to scan the
160 return ann ? ann->modified : true;
163 static inline def_optype
164 get_def_ops (stmt_ann_t ann)
166 return ann ? ann->def_ops : NULL;
169 static inline use_optype
170 get_use_ops (stmt_ann_t ann)
172 return ann ? ann->use_ops : NULL;
175 static inline v_may_def_optype
176 get_v_may_def_ops (stmt_ann_t ann)
178 return ann ? ann->v_may_def_ops : NULL;
181 static inline vuse_optype
182 get_vuse_ops (stmt_ann_t ann)
184 return ann ? ann->vuse_ops : NULL;
187 static inline v_must_def_optype
188 get_v_must_def_ops (stmt_ann_t ann)
190 return ann ? ann->v_must_def_ops : NULL;
194 get_use_op_ptr (use_optype uses, unsigned int index)
196 #ifdef ENABLE_CHECKING
197 if (index >= uses->num_uses)
200 return uses->uses[index];
204 get_def_op_ptr (def_optype defs, unsigned int index)
206 #ifdef ENABLE_CHECKING
207 if (index >= defs->num_defs)
210 return defs->defs[index];
214 get_v_may_def_result_ptr(v_may_def_optype v_may_defs, unsigned int index)
216 #ifdef ENABLE_CHECKING
217 if (index >= v_may_defs->num_v_may_defs)
220 return &(v_may_defs->v_may_defs[index * 2]);
224 get_v_may_def_op_ptr(v_may_def_optype v_may_defs, unsigned int index)
226 #ifdef ENABLE_CHECKING
227 if (index >= v_may_defs->num_v_may_defs)
230 return &(v_may_defs->v_may_defs[index * 2 + 1]);
234 get_vuse_op_ptr(vuse_optype vuses, unsigned int index)
236 #ifdef ENABLE_CHECKING
237 if (index >= vuses->num_vuses)
240 return &(vuses->vuses[index]);
244 get_v_must_def_op_ptr (v_must_def_optype v_must_defs, unsigned int index)
246 #ifdef ENABLE_CHECKING
247 if (index >= v_must_defs->num_v_must_defs)
250 return &(v_must_defs->v_must_defs[index]);
254 start_ssa_stmt_operands (tree stmt ATTRIBUTE_UNUSED)
256 #ifdef ENABLE_CHECKING
257 verify_start_operands (stmt);
262 addresses_taken (tree stmt)
264 stmt_ann_t ann = stmt_ann (stmt);
265 return ann ? ann->addresses_taken : NULL;
269 get_immediate_uses (tree stmt)
271 stmt_ann_t ann = stmt_ann (stmt);
272 return ann ? ann->df : NULL;
276 num_immediate_uses (dataflow_t df)
283 imm = df->immediate_uses;
285 return df->uses[1] ? 2 : 1;
287 return VARRAY_ACTIVE_SIZE (imm) + 2;
291 immediate_use (dataflow_t df, int num)
296 #ifdef ENABLE_CHECKING
297 if (num >= num_immediate_uses (df))
301 return df->uses[num];
302 return VARRAY_TREE (df->immediate_uses, num - 2);
305 static inline bb_ann_t
306 bb_ann (basic_block bb)
308 return (bb_ann_t)bb->tree_annotations;
312 phi_nodes (basic_block bb)
316 return bb_ann (bb)->phi_nodes;
319 /* Set list of phi nodes of a basic block BB to L. */
322 set_phi_nodes (basic_block bb, tree l)
326 bb_ann (bb)->phi_nodes = l;
327 for (phi = l; phi; phi = TREE_CHAIN (phi))
328 set_bb_for_stmt (phi, bb);
331 /* Return the phi index number for an edge. */
333 phi_arg_from_edge (tree phi, edge e)
336 #if defined ENABLE_CHECKING
337 if (!phi || TREE_CODE (phi) != PHI_NODE)
341 for (i = 0; i < PHI_NUM_ARGS (phi); i++)
342 if (PHI_ARG_EDGE (phi, i) == e)
349 /* Return the phi argument number for an edge. */
350 static inline struct phi_arg_d *
351 phi_element_for_edge (tree phi, edge e)
355 i = phi_arg_from_edge (phi, e);
357 return &(PHI_ARG_ELT (phi, i));
359 return (struct phi_arg_d *)NULL;
362 /* ----------------------------------------------------------------------- */
365 is_exec_stmt (tree t)
367 return (t && !IS_EMPTY_STMT (t) && t != error_mark_node);
371 /* Return true if this stmt can be the target of a control transfer stmt such
374 is_label_stmt (tree t)
377 switch (TREE_CODE (t))
381 case CASE_LABEL_EXPR:
390 may_propagate_copy (tree dest, tree orig)
392 /* FIXME. GIMPLE is allowing pointer assignments and comparisons of
393 pointers that have different alias sets. This means that these
394 pointers will have different memory tags associated to them.
396 If we allow copy propagation in these cases, statements de-referencing
397 the new pointer will now have a reference to a different memory tag
398 with potentially incorrect SSA information.
400 This was showing up in libjava/java/util/zip/ZipFile.java with code
403 struct java.io.BufferedInputStream *T.660;
404 struct java.io.BufferedInputStream *T.647;
405 struct java.io.InputStream *is;
406 struct java.io.InputStream *is.662;
409 is = T.660; <-- This ought to be type-casted
412 Also, f/name.c exposed a similar problem with a COND_EXPR predicate
413 that was causing DOM to generate and equivalence with two pointers of
414 alias-incompatible types:
416 struct _ffename_space *n;
425 I think that GIMPLE should emit the appropriate type-casts. For the
426 time being, blocking copy-propagation in these cases is the safe thing
428 if (TREE_CODE (dest) == SSA_NAME
429 && TREE_CODE (orig) == SSA_NAME
430 && POINTER_TYPE_P (TREE_TYPE (dest))
431 && POINTER_TYPE_P (TREE_TYPE (orig)))
433 tree mt_dest = var_ann (SSA_NAME_VAR (dest))->type_mem_tag;
434 tree mt_orig = var_ann (SSA_NAME_VAR (orig))->type_mem_tag;
435 if (mt_dest && mt_orig && mt_dest != mt_orig)
439 /* If the destination is a SSA_NAME for a virtual operand, then we have
440 some special cases to handle. */
441 if (TREE_CODE (dest) == SSA_NAME && !is_gimple_reg (dest))
443 /* If both operands are SSA_NAMEs referring to virtual operands, then
444 we can always propagate. */
445 if (TREE_CODE (orig) == SSA_NAME)
447 if (!is_gimple_reg (orig))
450 #ifdef ENABLE_CHECKING
451 /* If we have one real and one virtual operand, then something has
452 gone terribly wrong. */
453 if (is_gimple_reg (orig))
458 /* We have a "copy" from something like a constant into a virtual
459 operand. Reject these. */
463 return (!SSA_NAME_OCCURS_IN_ABNORMAL_PHI (dest)
464 && (TREE_CODE (orig) != SSA_NAME
465 || !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (orig))
466 && !DECL_HARD_REGISTER (SSA_NAME_VAR (dest)));
470 set_default_def (tree var, tree def)
472 var_ann_t ann = var_ann (var);
474 ann = create_var_ann (var);
475 ann->default_def = def;
479 default_def (tree var)
481 var_ann_t ann = var_ann (var);
482 return ann ? ann->default_def : NULL_TREE;
485 /* PHI nodes should contain only ssa_names and invariants. A test
486 for ssa_name is definitely simpler; don't let invalid contents
487 slip in in the meantime. */
490 phi_ssa_name_p (tree t)
492 if (TREE_CODE (t) == SSA_NAME)
494 #ifdef ENABLE_CHECKING
495 if (!is_gimple_min_invariant (t))
501 /* ----------------------------------------------------------------------- */
503 static inline block_stmt_iterator
504 bsi_start (basic_block bb)
506 block_stmt_iterator bsi;
508 bsi.tsi = tsi_start (bb->stmt_list);
511 #ifdef ENABLE_CHECKING
516 bsi.tsi.container = NULL;
522 static inline block_stmt_iterator
523 bsi_last (basic_block bb)
525 block_stmt_iterator bsi;
527 bsi.tsi = tsi_last (bb->stmt_list);
530 #ifdef ENABLE_CHECKING
535 bsi.tsi.container = NULL;
542 bsi_end_p (block_stmt_iterator i)
544 return tsi_end_p (i.tsi);
548 bsi_next (block_stmt_iterator *i)
554 bsi_prev (block_stmt_iterator *i)
560 bsi_stmt (block_stmt_iterator i)
562 return tsi_stmt (i.tsi);
566 bsi_stmt_ptr (block_stmt_iterator i)
568 return tsi_stmt_ptr (i.tsi);
572 may_be_aliased (tree var)
574 return (TREE_ADDRESSABLE (var)
575 || decl_function_context (var) != current_function_decl);
579 is_call_clobbered (tree var)
581 return needs_to_live_in_memory (var)
582 || bitmap_bit_p (call_clobbered_vars, var_ann (var)->uid);
586 mark_call_clobbered (tree var)
588 var_ann_t ann = var_ann (var);
589 /* Call-clobbered variables need to live in memory. */
590 DECL_NEEDS_TO_LIVE_IN_MEMORY_INTERNAL (var) = 1;
591 bitmap_set_bit (call_clobbered_vars, ann->uid);
595 mark_non_addressable (tree var)
597 bitmap_clear_bit (call_clobbered_vars, var_ann (var)->uid);
598 DECL_NEEDS_TO_LIVE_IN_MEMORY_INTERNAL (var) = 0;
599 TREE_ADDRESSABLE (var) = 0;
602 #endif /* _TREE_FLOW_INLINE_H */