tree-ssa-sccvn.h revision 1.3
1/* Tree SCC value numbering
2   Copyright (C) 2007-2013 Free Software Foundation, Inc.
3   Contributed by Daniel Berlin <dberlin@dberlin.org>
4
5   This file is part of GCC.
6
7   GCC is free software; you can redistribute it and/or modify
8   under the terms of the GNU General Public License as published by
9   the Free Software Foundation; either version 3 of the License, or
10   (at your option) any later version.
11
12   GCC is distributed in the hope that it will be useful,
13   but WITHOUT ANY WARRANTY; without even the implied warranty of
14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   GNU General Public License for more details.
16
17   You should have received a copy of the GNU General Public License
18   along with GCC; see the file COPYING3.  If not see
19   <http://www.gnu.org/licenses/>.  */
20
21#ifndef TREE_SSA_SCCVN_H
22#define TREE_SSA_SCCVN_H
23
24/* In tree-ssa-sccvn.c  */
25bool expressions_equal_p (tree, tree);
26
27
28/* TOP of the VN lattice.  */
29extern tree VN_TOP;
30
31/* N-ary operations in the hashtable consist of length operands, an
32   opcode, and a type.  Result is the value number of the operation,
33   and hashcode is stored to avoid having to calculate it
34   repeatedly.  */
35
36typedef struct vn_nary_op_s
37{
38  /* Unique identify that all expressions with the same value have. */
39  unsigned int value_id;
40  ENUM_BITFIELD(tree_code) opcode : 16;
41  unsigned length : 16;
42  hashval_t hashcode;
43  tree result;
44  tree type;
45  tree op[1];
46} *vn_nary_op_t;
47typedef const struct vn_nary_op_s *const_vn_nary_op_t;
48
49/* Return the size of a vn_nary_op_t with LENGTH operands.  */
50
51static inline size_t
52sizeof_vn_nary_op (unsigned int length)
53{
54  return sizeof (struct vn_nary_op_s) + sizeof (tree) * length - sizeof (tree);
55}
56
57/* Phi nodes in the hashtable consist of their non-VN_TOP phi
58   arguments, and the basic block the phi is in. Result is the value
59   number of the operation, and hashcode is stored to avoid having to
60   calculate it repeatedly.  Phi nodes not in the same block are never
61   considered equivalent.  */
62
63typedef struct vn_phi_s
64{
65  /* Unique identifier that all expressions with the same value have. */
66  unsigned int value_id;
67  hashval_t hashcode;
68  vec<tree> phiargs;
69  basic_block block;
70  tree type;
71  tree result;
72} *vn_phi_t;
73typedef const struct vn_phi_s *const_vn_phi_t;
74
75/* Reference operands only exist in reference operations structures.
76   They consist of an opcode, type, and some number of operands.  For
77   a given opcode, some, all, or none of the operands may be used.
78   The operands are there to store the information that makes up the
79   portion of the addressing calculation that opcode performs.  */
80
81typedef struct vn_reference_op_struct
82{
83  enum tree_code opcode;
84  /* Constant offset this op adds or -1 if it is variable.  */
85  HOST_WIDE_INT off;
86  tree type;
87  tree op0;
88  tree op1;
89  tree op2;
90} vn_reference_op_s;
91typedef vn_reference_op_s *vn_reference_op_t;
92typedef const vn_reference_op_s *const_vn_reference_op_t;
93
94
95/* A reference operation in the hashtable is representation as
96   the vuse, representing the memory state at the time of
97   the operation, and a collection of operands that make up the
98   addressing calculation.  If two vn_reference_t's have the same set
99   of operands, they access the same memory location. We also store
100   the resulting value number, and the hashcode.  */
101
102typedef struct vn_reference_s
103{
104  /* Unique identifier that all expressions with the same value have. */
105  unsigned int value_id;
106  hashval_t hashcode;
107  tree vuse;
108  alias_set_type set;
109  tree type;
110  vec<vn_reference_op_s> operands;
111  tree result;
112  tree result_vdef;
113} *vn_reference_t;
114typedef const struct vn_reference_s *const_vn_reference_t;
115
116typedef struct vn_constant_s
117{
118  unsigned int value_id;
119  hashval_t hashcode;
120  tree constant;
121} *vn_constant_t;
122
123enum vn_kind { VN_NONE, VN_CONSTANT, VN_NARY, VN_REFERENCE, VN_PHI };
124enum vn_kind vn_get_stmt_kind (gimple);
125
126/* Hash the type TYPE using bits that distinguishes it in the
127   types_compatible_p sense.  */
128
129static inline hashval_t
130vn_hash_type (tree type)
131{
132  return (INTEGRAL_TYPE_P (type)
133	  + (INTEGRAL_TYPE_P (type)
134	     ? TYPE_PRECISION (type) + TYPE_UNSIGNED (type) : 0));
135}
136
137/* Hash the constant CONSTANT with distinguishing type incompatible
138   constants in the types_compatible_p sense.  */
139
140static inline hashval_t
141vn_hash_constant_with_type (tree constant)
142{
143  return (iterative_hash_expr (constant, 0)
144	  + vn_hash_type (TREE_TYPE (constant)));
145}
146
147/* Compare the constants C1 and C2 with distinguishing type incompatible
148   constants in the types_compatible_p sense.  */
149
150static inline bool
151vn_constant_eq_with_type (tree c1, tree c2)
152{
153  return (expressions_equal_p (c1, c2)
154	  && types_compatible_p (TREE_TYPE (c1), TREE_TYPE (c2)));
155}
156
157typedef struct vn_ssa_aux
158{
159  /* Value number. This may be an SSA name or a constant.  */
160  tree valnum;
161  /* Representative expression, if not a direct constant. */
162  tree expr;
163
164  /* Unique identifier that all expressions with the same value have. */
165  unsigned int value_id;
166
167  /* SCC information.  */
168  unsigned int dfsnum;
169  unsigned int low;
170  unsigned visited : 1;
171  unsigned on_sccstack : 1;
172
173  /* Whether the representative expression contains constants.  */
174  unsigned has_constants : 1;
175  /* Whether the SSA_NAME has been value numbered already.  This is
176     only saying whether visit_use has been called on it at least
177     once.  It cannot be used to avoid visitation for SSA_NAME's
178     involved in non-singleton SCC's.  */
179  unsigned use_processed : 1;
180
181  /* Whether the SSA_NAME has no defining statement and thus an
182     insertion of such with EXPR as definition is required before
183     a use can be created of it.  */
184  unsigned needs_insertion : 1;
185} *vn_ssa_aux_t;
186
187typedef enum { VN_NOWALK, VN_WALK, VN_WALKREWRITE } vn_lookup_kind;
188
189/* Return the value numbering info for an SSA_NAME.  */
190extern vn_ssa_aux_t VN_INFO (tree);
191extern vn_ssa_aux_t VN_INFO_GET (tree);
192tree vn_get_expr_for (tree);
193bool run_scc_vn (vn_lookup_kind);
194void free_scc_vn (void);
195tree vn_nary_op_lookup (tree, vn_nary_op_t *);
196tree vn_nary_op_lookup_stmt (gimple, vn_nary_op_t *);
197tree vn_nary_op_lookup_pieces (unsigned int, enum tree_code,
198			       tree, tree *, vn_nary_op_t *);
199vn_nary_op_t vn_nary_op_insert (tree, tree);
200vn_nary_op_t vn_nary_op_insert_stmt (gimple, tree);
201vn_nary_op_t vn_nary_op_insert_pieces (unsigned int, enum tree_code,
202				       tree, tree *, tree, unsigned int);
203void vn_reference_fold_indirect (vec<vn_reference_op_s> *,
204				 unsigned int *);
205void copy_reference_ops_from_ref (tree, vec<vn_reference_op_s> *);
206void copy_reference_ops_from_call (gimple, vec<vn_reference_op_s> *);
207bool ao_ref_init_from_vn_reference (ao_ref *, alias_set_type, tree,
208				    vec<vn_reference_op_s> );
209tree vn_reference_lookup_pieces (tree, alias_set_type, tree,
210				 vec<vn_reference_op_s> ,
211				 vn_reference_t *, vn_lookup_kind);
212tree vn_reference_lookup (tree, tree, vn_lookup_kind, vn_reference_t *);
213vn_reference_t vn_reference_insert (tree, tree, tree, tree);
214vn_reference_t vn_reference_insert_pieces (tree, alias_set_type, tree,
215					   vec<vn_reference_op_s> ,
216					   tree, unsigned int);
217
218hashval_t vn_nary_op_compute_hash (const vn_nary_op_t);
219int vn_nary_op_eq (const void *, const void *);
220bool vn_nary_may_trap (vn_nary_op_t);
221hashval_t vn_reference_compute_hash (const vn_reference_t);
222int vn_reference_eq (const void *, const void *);
223unsigned int get_max_value_id (void);
224unsigned int get_next_value_id (void);
225unsigned int get_constant_value_id (tree);
226unsigned int get_or_alloc_constant_value_id (tree);
227bool value_id_constant_p (unsigned int);
228tree fully_constant_vn_reference_p (vn_reference_t);
229
230/* Valueize NAME if it is an SSA name, otherwise just return it.  */
231
232static inline tree
233vn_valueize (tree name)
234{
235  if (TREE_CODE (name) == SSA_NAME)
236    {
237      tree tem = VN_INFO (name)->valnum;
238      return tem == VN_TOP ? name : tem;
239    }
240  return name;
241}
242
243#endif /* TREE_SSA_SCCVN_H  */
244