On 3/14/07, Dorit Nuzman <[EMAIL PROTECTED]> wrote:
Hi, We have a '{2,2}' expression (vector initializer) propagated by dom into a BIT_FIELD_REF: before (bug.c.105t.vrp2): vector long int vect_cst_.47; vect_cst_.47_66 = {2, 2}; D.2103_79 = BIT_FIELD_REF <vect_cst_.47_66, 64, 0>; after (bug.c.106t.dom3): " Optimizing block #7 Optimizing statement <L0>:; Optimizing statement D.2102_78 = BIT_FIELD_REF <vect_vec_iv_.48_67, 64, 0>; Optimizing statement D.2103_79 = BIT_FIELD_REF <vect_cst_.47_66, 64, 0>; Replaced 'vect_cst_.47_66' with constant '{2, 2}' " D.2103_79 = BIT_FIELD_REF <{2, 2}, 64, 0>; ...which causes he following ICE: " bug.c:8: error: invalid reference prefix {2, 2} bug.c:8: internal compiler error: verify_stmts failed " Several testcases are available in the bugzilla report (PR30784). So, the question is - what needs to be fixed - is it copy propagation that allows propagating the initializer into a BIT_FIELD_REF? or vect_lower pass that creates these BIT_FIELD_REFs after vectorization?
I think the BIT_FIELD_REF should be properly folded to a constant or the propagation not done. fold_stmt_inplace is the candidate to look at, propagate_rhs_into_lhs in tree-ssa-dom.c to reject propagation into BIT_FIELD_REF. fold_ternary should be able to fold the BIT_FIELD_REF in question, it would be interesting to know why it doesn't. Richard.