There were three tree operand hashers, so move them to their own header file.
The typedefs in this and subsequent patches are temporary and get removed in patch 12. gcc/ * tree-hash-traits.h: New file. (tree_operand_hash): New class. * sanopt.c: Include tree-hash-traits.h. (sanopt_tree_map_traits): Use tree_operand_hash. * tree-if-conv.c: Include tree-hash-traits.h. (phi_args_hash_traits): Use tree_operand_hash. * tree-ssa-uncprop.c: Include tree-hash-traits.h. (val_ssa_equiv_hash_traits): Use tree_operand_hash. Index: gcc/tree-hash-traits.h =================================================================== --- /dev/null 2015-06-02 17:27:28.541944012 +0100 +++ gcc/tree-hash-traits.h 2015-06-23 15:44:07.966809173 +0100 @@ -0,0 +1,42 @@ +/* Traits for hashing trees. + Copyright (C) 2014-2015 Free Software Foundation, Inc. + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 3, or (at your option) any later +version. + +GCC is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING3. If not see +<http://www.gnu.org/licenses/>. */ + +#ifndef tree_hash_traits_h +#define tree_hash_traits_h + +/* Hash for trees based on operand_equal_p. */ +struct tree_operand_hash : ggc_ptr_hash <tree_node> +{ + static inline hashval_t hash (const_tree); + static inline bool equal_keys (const_tree, const_tree); +}; + +inline hashval_t +tree_operand_hash::hash (const_tree t) +{ + return iterative_hash_expr (t, 0); +} + +inline bool +tree_operand_hash::equal_keys (const_tree t1, const_tree t2) +{ + return operand_equal_p (t1, t2, 0); +} + +#endif Index: gcc/sanopt.c =================================================================== --- gcc/sanopt.c 2015-06-23 15:44:07.970809082 +0100 +++ gcc/sanopt.c 2015-06-23 15:44:07.962809243 +0100 @@ -50,6 +50,7 @@ Software Foundation; either version 3, o #include "ubsan.h" #include "params.h" #include "tree-ssa-operands.h" +#include "tree-hash-traits.h" /* This is used to carry information about basic blocks. It is @@ -98,20 +99,7 @@ maybe_get_single_definition (tree t) return NULL_TREE; } -/* Traits class for tree hash maps below. */ - -struct sanopt_tree_map_traits : default_hashmap_traits -{ - static inline hashval_t hash (const_tree ref) - { - return iterative_hash_expr (ref, 0); - } - - static inline bool equal_keys (const_tree ref1, const_tree ref2) - { - return operand_equal_p (ref1, ref2, 0); - } -}; +typedef simple_hashmap_traits <tree_operand_hash> sanopt_tree_map_traits; /* Tree triplet for vptr_check_map. */ struct sanopt_tree_triplet Index: gcc/tree-if-conv.c =================================================================== --- gcc/tree-if-conv.c 2015-06-23 15:44:07.970809082 +0100 +++ gcc/tree-if-conv.c 2015-06-23 15:44:07.966809173 +0100 @@ -135,6 +135,7 @@ Software Foundation; either version 3, o #include "expr.h" #include "insn-codes.h" #include "optabs.h" +#include "tree-hash-traits.h" /* List of basic blocks in if-conversion-suitable order. */ static basic_block *ifc_bbs; @@ -1594,27 +1595,9 @@ convert_scalar_cond_reduction (gimple re return rhs; } -/* Helpers for PHI arguments hashtable map. */ +typedef simple_hashmap_traits <tree_operand_hash> phi_args_hash_traits; -struct phi_args_hash_traits : default_hashmap_traits -{ - static inline hashval_t hash (tree); - static inline bool equal_keys (tree, tree); -}; - -inline hashval_t -phi_args_hash_traits::hash (tree value) -{ - return iterative_hash_expr (value, 0); -} - -inline bool -phi_args_hash_traits::equal_keys (tree value1, tree value2) -{ - return operand_equal_p (value1, value2, 0); -} - - /* Produce condition for all occurrences of ARG in PHI node. */ +/* Produce condition for all occurrences of ARG in PHI node. */ static tree gen_phi_arg_condition (gphi *phi, vec<int> *occur, Index: gcc/tree-ssa-uncprop.c =================================================================== --- gcc/tree-ssa-uncprop.c 2015-06-23 15:44:07.970809082 +0100 +++ gcc/tree-ssa-uncprop.c 2015-06-23 15:44:07.966809173 +0100 @@ -50,6 +50,7 @@ the Free Software Foundation; either ver #include "domwalk.h" #include "tree-pass.h" #include "tree-ssa-propagate.h" +#include "tree-hash-traits.h" /* The basic structure describing an equivalency created by traversing an edge. Traversing the edge effectively means that we can assume @@ -294,25 +295,11 @@ struct equiv_hash_elt /* Value to ssa name equivalence hashtable helpers. */ -struct val_ssa_equiv_hash_traits : default_hashmap_traits +struct val_ssa_equiv_hash_traits : simple_hashmap_traits <tree_operand_hash> { - static inline hashval_t hash (tree); - static inline bool equal_keys (tree, tree); template<typename T> static inline void remove (T &); }; -inline hashval_t -val_ssa_equiv_hash_traits::hash (tree value) -{ - return iterative_hash_expr (value, 0); -} - -inline bool -val_ssa_equiv_hash_traits::equal_keys (tree value1, tree value2) -{ - return operand_equal_p (value1, value2, 0); -} - /* Free an instance of equiv_hash_elt. */ template<typename T>