This fixes PR54825, properly FRE/PRE vector BIT_FIELD_REFs. Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.
Richard. 2012-10-08 Richard Guenther <rguent...@suse.de> PR tree-optimization/54825 * tree-ssa-sccvn.c (vn_nary_length_from_stmt): Handle BIT_FIELD_REF. (init_vn_nary_op_from_stmt): Likewise. * tree-ssa-pre.c (compute_avail): Use vn_nary_op_lookup_stmt. * tree-ssa-sccvn.h (sizeof_vn_nary_op): Avoid overflow. Index: gcc/tree-ssa-sccvn.c =================================================================== *** gcc/tree-ssa-sccvn.c (revision 192120) --- gcc/tree-ssa-sccvn.c (working copy) *************** vn_nary_length_from_stmt (gimple stmt) *** 2194,2199 **** --- 2194,2202 ---- case VIEW_CONVERT_EXPR: return 1; + case BIT_FIELD_REF: + return 3; + case CONSTRUCTOR: return CONSTRUCTOR_NELTS (gimple_assign_rhs1 (stmt)); *************** init_vn_nary_op_from_stmt (vn_nary_op_t *** 2220,2225 **** --- 2223,2235 ---- vno->op[0] = TREE_OPERAND (gimple_assign_rhs1 (stmt), 0); break; + case BIT_FIELD_REF: + vno->length = 3; + vno->op[0] = TREE_OPERAND (gimple_assign_rhs1 (stmt), 0); + vno->op[1] = TREE_OPERAND (gimple_assign_rhs1 (stmt), 1); + vno->op[2] = TREE_OPERAND (gimple_assign_rhs1 (stmt), 2); + break; + case CONSTRUCTOR: vno->length = CONSTRUCTOR_NELTS (gimple_assign_rhs1 (stmt)); for (i = 0; i < vno->length; ++i) *************** init_vn_nary_op_from_stmt (vn_nary_op_t *** 2227,2232 **** --- 2237,2243 ---- break; default: + gcc_checking_assert (!gimple_assign_single_p (stmt)); vno->length = gimple_num_ops (stmt) - 1; for (i = 0; i < vno->length; ++i) vno->op[i] = gimple_op (stmt, i + 1); Index: gcc/tree-ssa-pre.c =================================================================== *** gcc/tree-ssa-pre.c (revision 192120) --- gcc/tree-ssa-pre.c (working copy) *************** compute_avail (void) *** 3850,3860 **** || code == VEC_COND_EXPR) continue; ! vn_nary_op_lookup_pieces (gimple_num_ops (stmt) - 1, ! code, ! gimple_expr_type (stmt), ! gimple_assign_rhs1_ptr (stmt), ! &nary); if (!nary) continue; --- 3850,3856 ---- || code == VEC_COND_EXPR) continue; ! vn_nary_op_lookup_stmt (stmt, &nary); if (!nary) continue; Index: gcc/tree-ssa-sccvn.h =================================================================== *** gcc/tree-ssa-sccvn.h (revision 192120) --- gcc/tree-ssa-sccvn.h (working copy) *************** typedef const struct vn_nary_op_s *const *** 51,57 **** static inline size_t sizeof_vn_nary_op (unsigned int length) { ! return sizeof (struct vn_nary_op_s) + sizeof (tree) * (length - 1); } /* Phi nodes in the hashtable consist of their non-VN_TOP phi --- 51,57 ---- static inline size_t sizeof_vn_nary_op (unsigned int length) { ! return sizeof (struct vn_nary_op_s) + sizeof (tree) * length - sizeof (tree); } /* Phi nodes in the hashtable consist of their non-VN_TOP phi