On 01/06/2016 10:51, "Richard Biener" <richard.guent...@gmail.com> wrote:
>On Wed, Jun 1, 2016 at 10:46 AM, Alan Hayward <alan.hayw...@arm.com> >wrote: >> >> >> On 30/05/2016 14:22, "Richard Biener" <richard.guent...@gmail.com> >>wrote: >> >>>On Fri, May 27, 2016 at 5:12 PM, Alan Hayward <alan.hayw...@arm.com> >>>wrote: >>>> >>>> On 27/05/2016 12:41, "Richard Biener" <richard.guent...@gmail.com> >>>>wrote: >>>> >>>>>On Fri, May 27, 2016 at 11:09 AM, Alan Hayward <alan.hayw...@arm.com> >>>>>wrote: >> >>>> >>>>> >>>>>The rest of the changes look ok to me. >>>> >>>> Does that include PATCH 1/3 ? >>> >>>I don't like how 1/3 ends up looking :/ So what was the alternative >>>again? >>>I looked into 1/3 and what it takes to remove the 'stmt' argument and >>>instead pass in a vect_def_type. It's a bit twisted and just adding >>>another >>>argument (the loop_vinfo) doesn't help things here. >>> >>>So - instead of 1/3 you might want to split out a function >>> >>>tree >>>vect_get_vec_def_for_operand_1 (gimple *def_stmt, enum vect_def_type >>>dt, tree vectype) >>>{ >>> switch (dt) >>> { >>>... >>> } >>>} >>> >>>and for constant/external force vectype != NULL. >> >> I’m still a little confused as to exactly what you want here. >> >> From your two comments I think you wanted me to completely remove the >> boolean type check and the vect_init_vector call. But if I remove that >> then other code paths will break. >> >> However, I’ve just realised that in vectorized_live_operation I already >> have the def stmt and I can easily get hold of dt from >>STMT_VINFO_DEF_TYPE. >> Which means I can call vect_get_vec_def_for_operand_1 from >> vectorized_live_operation. >> >> I’ve put together a version where I have: >> >> tree >> vect_get_vec_def_for_operand_1 (gimple *def_stmt, enum vect_def_type dt) >> { >> >> switch (dt) >> { >> case vect_internal_def || vect_external_def: >> gcc_unreachable () >> >> .. code for for all other cases.. >> } >> } >> >> /* Used by existing code */ >> tree >> vect_get_vec_def_for_operand (tree op, gimple *stmt, tree vectype) >> { >> vect_is_simple_use(op, loop_vinfo, &def_stmt, &dt); ..and the dump >>code >> >> >> If dt == internal_def || vect_external_def: >> .. Check for BOOLEAN_TYPE .. >> return vect_init_vector (stmt, op, vector_type, NULL); >> >> else >> vect_get_vec_def_for_operand_1 (def_stmt, dt) >> } >> >> >> Does that look better? > >Yes! > >Thanks, >Richard. > This version of the patch addresses the simple+invariant issues (and patch [3/3] optimizes it). Also includes a small change to handle when the vect pattern has introduced new pattern match statements (in vectorizable_live_operation if STMT_VINFO_RELATED_STMT is not null then use it instead of stmt). gcc/ * tree-vect-loop.c (vect_analyze_loop_operations): Allow live stmts. (vectorizable_reduction): Check for new relevant state. (vectorizable_live_operation): vectorize live stmts using BIT_FIELD_REF. Remove special case for gimple assigns stmts. * tree-vect-stmts.c (is_simple_and_all_uses_invariant): New function. (vect_stmt_relevant_p): Check for stmts which are only used live. (process_use): Use of a stmt does not inherit it's live value. (vect_mark_stmts_to_be_vectorized): Simplify relevance inheritance. (vect_analyze_stmt): Check for new relevant state. *tree-vectorizer.h (vect_relevant): New entry for a stmt which is used outside the loop, but not inside it. testsuite/ * gcc.dg/tree-ssa/pr64183.c: Ensure test does not vectorize. * testsuite/gcc.dg/vect/no-scevccp-vect-iv-2.c: Remove xfail. * gcc.dg/vect/vect-live-1.c: New test. * gcc.dg/vect/vect-live-2.c: New test. * gcc.dg/vect/vect-live-3.c: New test. * gcc.dg/vect/vect-live-4.c: New test. * gcc.dg/vect/vect-live-5.c: New test. * gcc.dg/vect/vect-live-slp-1.c: New test. * gcc.dg/vect/vect-live-slp-2.c: New test. * gcc.dg/vect/vect-live-slp-3.c: New test. Alan.
2of3live.patch
Description: Binary data