1 /* Value Numbering routines for tree expressions.
2 Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007 Free Software Foundation, Inc.
3 Contributed by Daniel Berlin <dan@dberlin.org>, Steven Bosscher
4 <stevenb@suse.de> and Diego Novillo <dnovillo@redhat.com>
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
13 GCC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
24 #include "coretypes.h"
28 #include "tree-flow.h"
30 #include "langhooks.h"
31 #include "tree-pass.h"
32 #include "tree-dump.h"
33 #include "diagnostic.h"
34 #include "tree-ssa-sccvn.h"
36 /* Most of this is PRE specific. The real grunt work is done in
37 tree-ssa-sccvn.c. This is where the lookup and insertion
38 functions, etc, can be found */
40 /* Create and return a new value handle node of type TYPE. */
43 make_value_handle (tree type
)
45 static unsigned int id
= 0;
48 vh
= build0 (VALUE_HANDLE
, type
);
49 VALUE_HANDLE_ID (vh
) = id
++;
55 /* Compare two expressions E1 and E2 and return true if they are
59 expressions_equal_p (tree e1
, tree e2
)
69 if (TREE_CODE (e1
) == TREE_LIST
&& TREE_CODE (e2
) == TREE_LIST
)
73 for (lop1
= e1
, lop2
= e2
;
75 lop1
= TREE_CHAIN (lop1
), lop2
= TREE_CHAIN (lop2
))
79 if (!expressions_equal_p (TREE_VALUE (lop1
), TREE_VALUE (lop2
)))
85 else if (TREE_CODE (e1
) == TREE_CODE (e2
)
87 || types_compatible_p (te1
, te2
))
88 && operand_equal_p (e1
, e2
, OEP_PURE_SAME
))
94 /* Set the value handle for expression E to value V. */
97 set_value_handle (tree e
, tree v
)
99 if (TREE_CODE (e
) == SSA_NAME
)
100 SSA_NAME_VALUE (e
) = v
;
101 else if (EXPR_P (e
) || DECL_P (e
) || TREE_CODE (e
) == TREE_LIST
103 || TREE_CODE (e
) == CONSTRUCTOR
)
104 get_tree_common_ann (e
)->value_handle
= v
;
106 /* Do nothing. Constants are their own value handles. */
107 gcc_assert (is_gimple_min_invariant (e
));
110 /* A comparison function for use in qsort to compare vuses. Simply
111 subtracts version numbers. */
114 vuses_compare (const void *pa
, const void *pb
)
116 const tree vusea
= *((const tree
*)pa
);
117 const tree vuseb
= *((const tree
*)pb
);
118 int sn
= SSA_NAME_VERSION (vusea
) - SSA_NAME_VERSION (vuseb
);
123 /* Print out the "Created value <x> for <Y>" statement to the
125 This is factored because both versions of lookup use it, and it
126 obscures the real work going on in those functions. */
129 print_creation_to_file (tree v
, tree expr
, VEC (tree
, gc
) *vuses
)
131 fprintf (dump_file
, "Created value ");
132 print_generic_expr (dump_file
, v
, dump_flags
);
133 fprintf (dump_file
, " for ");
134 print_generic_expr (dump_file
, expr
, dump_flags
);
136 if (vuses
&& VEC_length (tree
, vuses
) != 0)
141 fprintf (dump_file
, " vuses: (");
142 for (i
= 0; VEC_iterate (tree
, vuses
, i
, vuse
); i
++)
144 print_generic_expr (dump_file
, vuse
, dump_flags
);
145 if (VEC_length (tree
, vuses
) - 1 != i
)
146 fprintf (dump_file
, ",");
148 fprintf (dump_file
, ")");
150 fprintf (dump_file
, "\n");
154 /* Sort the VUSE array so that we can do equality comparisons
155 quicker on two vuse vecs. */
158 sort_vuses (VEC (tree
,gc
) *vuses
)
160 if (VEC_length (tree
, vuses
) > 1)
161 qsort (VEC_address (tree
, vuses
),
162 VEC_length (tree
, vuses
),
167 /* Sort the VUSE array so that we can do equality comparisons
168 quicker on two vuse vecs. */
171 sort_vuses_heap (VEC (tree
,heap
) *vuses
)
173 if (VEC_length (tree
, vuses
) > 1)
174 qsort (VEC_address (tree
, vuses
),
175 VEC_length (tree
, vuses
),
179 /* Insert EXPR into VALUE_TABLE with value VAL, and add expression
180 EXPR to the value set for value VAL. */
183 vn_add (tree expr
, tree val
)
185 switch (TREE_CODE_CLASS (TREE_CODE (expr
)))
189 vn_binary_op_insert (expr
, val
);
192 vn_unary_op_insert (expr
, val
);
194 /* In the case of array-refs of constants, for example, we can
195 end up with no vuses. */
197 vn_reference_insert (expr
, val
, NULL
);
199 /* The *only* time CALL_EXPR should appear here is
200 when it has no vuses. */
202 case tcc_exceptional
:
204 case tcc_declaration
:
205 if (TREE_CODE (expr
) == CALL_EXPR
|| DECL_P (expr
))
207 vn_reference_insert (expr
, val
, NULL
);
210 else if (TREE_CODE (expr
) == SSA_NAME
)
212 SSA_NAME_VALUE (expr
) = val
;
215 else if (TREE_CODE (expr
) == ADDR_EXPR
)
217 vn_unary_op_insert (expr
, val
);
224 set_value_handle (expr
, val
);
225 if (TREE_CODE (val
) == VALUE_HANDLE
)
226 add_to_value (val
, expr
);
229 /* Insert EXPR into the value numbering tables. with value VAL, and
230 add expression EXPR to the value set for value VAL. VUSES
231 represents the virtual use operands associated with EXPR. It is
232 used when computing a hash value for EXPR. */
235 vn_add_with_vuses (tree expr
, tree val
, VEC (tree
, gc
) *vuses
)
242 vn_reference_insert (expr
, val
, vuses
);
244 set_value_handle (expr
, val
);
245 if (TREE_CODE (val
) == VALUE_HANDLE
)
246 add_to_value (val
, expr
);
250 /* Lookup EXPR in the value numbering tables and return the result, if
254 vn_lookup (tree expr
)
256 /* Constants are their own value. */
257 if (is_gimple_min_invariant (expr
) || TREE_CODE (expr
) == FIELD_DECL
)
260 switch (TREE_CODE_CLASS (TREE_CODE (expr
)))
264 return vn_binary_op_lookup (expr
);
266 return vn_unary_op_lookup (expr
);
268 /* In the case of array-refs of constants, for example, we can
269 end up with no vuses. */
271 return vn_reference_lookup (expr
, NULL
);
273 /* It is possible to have CALL_EXPR with no vuses for things
274 like "cos", and these will fall into vn_lookup. */
276 case tcc_exceptional
:
278 case tcc_declaration
:
279 if (TREE_CODE (expr
) == CALL_EXPR
|| DECL_P (expr
))
280 return vn_reference_lookup (expr
, NULL
);
281 else if (TREE_CODE (expr
) == SSA_NAME
)
282 return SSA_NAME_VALUE (expr
);
283 else if (TREE_CODE (expr
) == ADDR_EXPR
)
284 return vn_unary_op_lookup (expr
);
292 /* Search in the value numbering tables for an existing instance of
293 expression EXPR, and return its value, or NULL if none has been set. STMT
294 represents the stmt associated with EXPR. It is used when computing the
295 hash value for EXPR for reference operations. */
298 vn_lookup_with_stmt (tree expr
, tree stmt
)
301 return vn_lookup (expr
);
303 /* Constants are their own value. */
304 if (is_gimple_min_invariant (expr
) || TREE_CODE (expr
) == FIELD_DECL
)
307 return vn_lookup_with_vuses (expr
, shared_vuses_from_stmt (stmt
));
310 /* Search in VALUE_TABLE for an existing instance of expression EXPR,
311 and return its value, or NULL if none has been set. VUSES is the
312 list of virtual use operands associated with EXPR. It is used when
313 computing the hash value for EXPR. */
316 vn_lookup_with_vuses (tree expr
, VEC (tree
, gc
) *vuses
)
318 if (!vuses
|| !VEC_length (tree
, vuses
))
319 return vn_lookup (expr
);
321 if (is_gimple_min_invariant (expr
) || TREE_CODE (expr
) == FIELD_DECL
)
324 return vn_reference_lookup (expr
, vuses
);
328 create_value_handle_for_expr (tree expr
, VEC(tree
, gc
) *vuses
)
332 v
= make_value_handle (TREE_TYPE (expr
));
334 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
335 print_creation_to_file (v
, expr
, vuses
);
339 /* Like vn_lookup, but creates a new value for the operation if one
343 vn_lookup_or_add (tree expr
)
345 tree v
= vn_lookup (expr
);
349 v
= create_value_handle_for_expr (expr
, NULL
);
353 set_value_handle (expr
, v
);
358 /* Like vn_lookup, but handles reference operations as well by using
359 STMT to get the set of vuses. */
362 vn_lookup_or_add_with_stmt (tree expr
, tree stmt
)
366 return vn_lookup_or_add (expr
);
368 v
= vn_lookup_with_stmt (expr
, stmt
);
371 VEC (tree
, gc
) *vuses
= copy_vuses_from_stmt (stmt
);
372 v
= create_value_handle_for_expr (expr
, vuses
);
373 vn_add_with_vuses (expr
, v
, vuses
);
376 set_value_handle (expr
, v
);
381 /* Like vn_lookup, but creates a new value for expression EXPR, if
382 EXPR doesn't already have a value. Return the existing/created
383 value for EXPR. STMT represents the stmt associated with EXPR. It is used
384 when computing the hash value for EXPR. */
387 vn_lookup_or_add_with_vuses (tree expr
, VEC (tree
, gc
) *vuses
)
391 if (!vuses
|| VEC_length (tree
, vuses
) == 0)
392 return vn_lookup_or_add (expr
);
394 v
= vn_lookup_with_vuses (expr
, vuses
);
397 v
= create_value_handle_for_expr (expr
, vuses
);
398 vn_add_with_vuses (expr
, v
, vuses
);
401 set_value_handle (expr
, v
);