1 /* Value Numbering routines for tree expressions.
2 Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, 2008 Free Software
4 Contributed by Daniel Berlin <dan@dberlin.org>, Steven Bosscher
5 <stevenb@suse.de> and Diego Novillo <dnovillo@redhat.com>
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3, or (at your option)
14 GCC is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3. If not see
21 <http://www.gnu.org/licenses/>. */
25 #include "coretypes.h"
29 #include "tree-flow.h"
31 #include "langhooks.h"
32 #include "tree-pass.h"
33 #include "tree-dump.h"
34 #include "diagnostic.h"
35 #include "tree-ssa-sccvn.h"
37 /* Most of this is PRE specific. The real grunt work is done in
38 tree-ssa-sccvn.c. This is where the lookup and insertion
39 functions, etc, can be found */
41 /* Create and return a new value handle node of type TYPE. */
44 make_value_handle (tree type)
46 static unsigned int id = 0;
49 vh = build0 (VALUE_HANDLE, type);
50 VALUE_HANDLE_ID (vh) = id++;
56 /* Compare two expressions E1 and E2 and return true if they are
60 expressions_equal_p (tree e1, tree e2)
70 if (TREE_CODE (e1) == TREE_LIST && TREE_CODE (e2) == TREE_LIST)
74 for (lop1 = e1, lop2 = e2;
76 lop1 = TREE_CHAIN (lop1), lop2 = TREE_CHAIN (lop2))
80 if (!expressions_equal_p (TREE_VALUE (lop1), TREE_VALUE (lop2)))
86 else if (TREE_CODE (e1) == TREE_CODE (e2)
87 && operand_equal_p (e1, e2, OEP_PURE_SAME))
93 /* Set the value handle for expression E to value V. */
96 set_value_handle (tree e, tree v)
98 if (TREE_CODE (e) == SSA_NAME)
99 SSA_NAME_VALUE (e) = v;
100 else if (EXPR_P (e) || DECL_P (e) || TREE_CODE (e) == TREE_LIST
102 || TREE_CODE (e) == CONSTRUCTOR)
103 get_tree_common_ann (e)->value_handle = v;
105 /* Do nothing. Constants are their own value handles. */
106 gcc_assert (is_gimple_min_invariant (e));
109 /* Print out the "Created value <x> for <Y>" statement to the
111 This is factored because both versions of lookup use it, and it
112 obscures the real work going on in those functions. */
115 print_creation_to_file (tree v, tree expr, VEC (tree, gc) *vuses)
117 fprintf (dump_file, "Created value ");
118 print_generic_expr (dump_file, v, dump_flags);
119 fprintf (dump_file, " for ");
120 print_generic_expr (dump_file, expr, dump_flags);
122 if (vuses && VEC_length (tree, vuses) != 0)
127 fprintf (dump_file, " vuses: (");
128 for (i = 0; VEC_iterate (tree, vuses, i, vuse); i++)
130 print_generic_expr (dump_file, vuse, dump_flags);
131 if (VEC_length (tree, vuses) - 1 != i)
132 fprintf (dump_file, ",");
134 fprintf (dump_file, ")");
136 fprintf (dump_file, "\n");
140 /* Sort the VUSE array so that we can do equality comparisons
141 quicker on two vuse vecs. */
144 sort_vuses (VEC (tree,gc) *vuses)
146 if (VEC_length (tree, vuses) > 1)
147 qsort (VEC_address (tree, vuses),
148 VEC_length (tree, vuses),
153 /* Sort the VUSE array so that we can do equality comparisons
154 quicker on two vuse vecs. */
157 sort_vuses_heap (VEC (tree,heap) *vuses)
159 if (VEC_length (tree, vuses) > 1)
160 qsort (VEC_address (tree, vuses),
161 VEC_length (tree, vuses),
165 /* Insert EXPR into VALUE_TABLE with value VAL, and add expression
166 EXPR to the value set for value VAL. */
169 vn_add (tree expr, tree val)
171 switch (TREE_CODE_CLASS (TREE_CODE (expr)))
175 vn_nary_op_insert (expr, val);
178 vn_nary_op_insert (expr, val);
180 /* In the case of array-refs of constants, for example, we can
181 end up with no vuses. */
183 vn_reference_insert (expr, val, NULL);
185 /* The *only* time CALL_EXPR should appear here is
186 when it has no vuses. */
188 case tcc_exceptional:
190 case tcc_declaration:
191 if (TREE_CODE (expr) == CALL_EXPR || DECL_P (expr))
193 vn_reference_insert (expr, val, NULL);
196 else if (TREE_CODE (expr) == SSA_NAME)
198 SSA_NAME_VALUE (expr) = val;
201 else if (TREE_CODE (expr) == ADDR_EXPR)
203 vn_nary_op_insert (expr, val);
210 set_value_handle (expr, val);
211 if (TREE_CODE (val) == VALUE_HANDLE)
212 add_to_value (val, expr);
215 /* Insert EXPR into the value numbering tables with value VAL, and
216 add expression EXPR to the value set for value VAL. VUSES
217 represents the virtual use operands associated with EXPR. It is
218 used when computing a hash value for EXPR. */
221 vn_add_with_vuses (tree expr, tree val, VEC (tree, gc) *vuses)
228 vn_reference_insert (expr, val, vuses);
230 set_value_handle (expr, val);
231 if (TREE_CODE (val) == VALUE_HANDLE)
232 add_to_value (val, expr);
236 /* Lookup EXPR in the value numbering tables and return the result, if
240 vn_lookup (tree expr)
242 /* Constants are their own value. */
243 if (is_gimple_min_invariant (expr) || TREE_CODE (expr) == FIELD_DECL)
246 switch (TREE_CODE_CLASS (TREE_CODE (expr)))
250 return vn_nary_op_lookup (expr);
252 return vn_nary_op_lookup (expr);
254 /* In the case of array-refs of constants, for example, we can
255 end up with no vuses. */
257 return vn_reference_lookup (expr, NULL, false);
259 /* It is possible to have CALL_EXPR with no vuses for things
260 like "cos", and these will fall into vn_lookup. */
262 case tcc_exceptional:
264 case tcc_declaration:
265 if (TREE_CODE (expr) == CALL_EXPR || DECL_P (expr))
266 return vn_reference_lookup (expr, NULL, false);
267 else if (TREE_CODE (expr) == SSA_NAME)
268 return SSA_NAME_VALUE (expr);
269 else if (TREE_CODE (expr) == ADDR_EXPR)
270 return vn_nary_op_lookup (expr);
278 /* Search in the value numbering tables for an existing instance of
279 expression EXPR, and return its value, or NULL if none has been set. STMT
280 represents the stmt associated with EXPR. It is used when computing the
281 hash value for EXPR for reference operations. */
284 vn_lookup_with_stmt (tree expr, tree stmt)
287 return vn_lookup (expr);
289 /* Constants are their own value. */
290 if (is_gimple_min_invariant (expr) || TREE_CODE (expr) == FIELD_DECL)
293 return vn_lookup_with_vuses (expr, shared_vuses_from_stmt (stmt));
296 /* Search in VALUE_TABLE for an existing instance of expression EXPR,
297 and return its value, or NULL if none has been set. VUSES is the
298 list of virtual use operands associated with EXPR. It is used when
299 computing the hash value for EXPR. */
302 vn_lookup_with_vuses (tree expr, VEC (tree, gc) *vuses)
304 if (!vuses || !VEC_length (tree, vuses))
305 return vn_lookup (expr);
307 if (is_gimple_min_invariant (expr) || TREE_CODE (expr) == FIELD_DECL)
310 /* We may not walk the use-def chains here as the alias oracle cannot
311 properly deal with VALUE_HANDLE tree nodes we feed it here. */
312 return vn_reference_lookup (expr, vuses, false);
316 create_value_handle_for_expr (tree expr, VEC(tree, gc) *vuses)
320 v = make_value_handle (TREE_TYPE (expr));
322 if (dump_file && (dump_flags & TDF_DETAILS))
323 print_creation_to_file (v, expr, vuses);
327 /* Like vn_lookup, but creates a new value for the operation if one
331 vn_lookup_or_add (tree expr)
333 tree v = vn_lookup (expr);
337 v = create_value_handle_for_expr (expr, NULL);
341 set_value_handle (expr, v);
346 /* Like vn_lookup, but handles reference operations as well by using
347 STMT to get the set of vuses. */
350 vn_lookup_or_add_with_stmt (tree expr, tree stmt)
354 return vn_lookup_or_add (expr);
356 v = vn_lookup_with_stmt (expr, stmt);
359 VEC (tree, gc) *vuses = copy_vuses_from_stmt (stmt);
360 v = create_value_handle_for_expr (expr, vuses);
361 vn_add_with_vuses (expr, v, vuses);
364 set_value_handle (expr, v);
369 /* Like vn_lookup, but creates a new value for expression EXPR, if
370 EXPR doesn't already have a value. Return the existing/created
371 value for EXPR. STMT represents the stmt associated with EXPR. It is used
372 when computing the hash value for EXPR. */
375 vn_lookup_or_add_with_vuses (tree expr, VEC (tree, gc) *vuses)
379 if (!vuses || VEC_length (tree, vuses) == 0)
380 return vn_lookup_or_add (expr);
382 v = vn_lookup_with_vuses (expr, vuses);
385 v = create_value_handle_for_expr (expr, vuses);
386 vn_add_with_vuses (expr, v, vuses);
389 set_value_handle (expr, v);