On Thu, Sep 15, 2016 at 12:07 PM, Bin Cheng <bin.ch...@arm.com> wrote: > Hi, > This patch fixes PR77503. Root cause is loop peeling changes the initial > value for reduction PHI node, resulting in different statement for > vect_transform_stmt to vect_analyze_stmt. Similar issue stands for loop > control IV, we record the original information in > LOOP_PHI_EVOLUTION_BASE_UNCHANGED for that. This patch follows the same > method by recording reduction code for CONST_COND_REDUCTION at analysis stage > and use the information at transform stage. The only difference is we need > record it in stmt_vec_info because there might be multiple reductions. > Unfortunately this requires additional memory for each statement, I didn't > see easy way out. Maybe it's possible to improve vectorizer so it > caches/reuses information from analysis stage to transform stage? > Bootstrap and test on x86_64 and AArch64 ongoing. Is it OK if no regression?
Ok. As for improving stmt_info size and caching info from analysis phase -- yes, ideally stmt_info would have most of its contents discriminated on STMT_VINFO_TYPE using a union of type specific fields. Note that this kind of refactoring would be way easier than trying to make it a class using inheritance (you'd need to defer vinfo creation until analysis figured out the info or add an indirection to type specific data). stmt_info isn't very well packed either so the general answer for now is -- we don't care about its size. As for re-using data from analysis phase -- yes! That we share the "head" of all vectorizable_* routines for both analysis and transform phase was a bad design decision -- ideally we'd have vectorizable_* routines w/o transform and then vectorize_* routines which only do the transform based on data recorded during analysis phase. Both refactorings are very welcome (esp. the latter which eventually means adding many more fields to stmt_info). Thanks, Richard. > Thanks, > bin > > 2016-09-07 Bin Cheng <bin.ch...@arm.com> > > PR tree-optimization/77503 > * tree-vect-loop.c (vectorizable_reduction): Record reduction > code for CONST_COND_REDUCTION at analysis stage and use it at > transform stage. > * tree-vectorizer.h (struct _stmt_vec_info): New field. > (STMT_VINFO_VEC_CONST_COND_REDUC_CODE): New macro. > * tree-vect-stmts.c (new_stmt_vec_info): Initialize above new > field. > > gcc/testsuite/ChangeLog > 2016-09-07 Bin Cheng <bin.ch...@arm.com> > > PR tree-optimization/77503 > * gcc.dg/vect/pr77503.c: New test.