On Thu, Jul 28, 2016 at 3:49 PM, Yuri Rumyantsev <ysrum...@gmail.com> wrote: > Richard, > > I prepare a patch which is based on yours. New test is also included. > Bootstrapping and regression testing did not show any new failures. > Is it OK for trunk?
Ok. Thanks, Richard. > Thanks. > ChangeLog: > 2016-07-28 Yuri Rumyantsev <ysrum...@gmail.com> > > PR tree-optimization/71734 > * tree-ssa-loop-im.c (ref_indep_loop_p_1): Pass value of safelen > attribute instead of REF_LOOP and use it. > (ref_indep_loop_p_2): Use SAFELEN argument instead of REF_LOOP and > set it for Loops having non-zero safelen attribute. > (ref_indep_loop_p): Pass zero as initial value for safelen. > gcc/testsuite/ChangeLog: > * g++.dg/vect/pr70729-nest.cc: New test. > > 2016-07-27 16:25 GMT+03:00 Richard Biener <richard.guent...@gmail.com>: >> On Tue, Jul 26, 2016 at 5:49 PM, Yuri Rumyantsev <ysrum...@gmail.com> wrote: >>> Hi Richard, >>> >>> It turned out that the patch proposed by you does not work properly >>> for nested loop. If we slightly change pr70729.cc to >>> (non-essential part is omitted >>> void inline Ss::foo (float w) >>> { >>> #pragma omp simd >>> for (int i=0; i<S_n; i++) >>> { >>> float w1 = C2[S_n + i] * w; >>> v1.v_i[i] += (int)w1; >>> C1[S_n + i] += w1; >>> } >>> } >>> void Ss::boo (int n) >>> { >>> for (int i = 0; i<n; i++) >>> foo(ww[i]); >>> } >>> loop in foo won't be vectorized since REF_LOOP is outer loop which is >>> not marked with omp simd pragma: >>> t1.cc:73:25: note: not vectorized: not suitable for scatter store *_31 = >>> _33; >>> t1.cc:73:25: note: bad data references. >>> >>> Note that the check I proposed before works fine. >> >> The attached works for me (current trunk doesn't work because of caching >> we do - I suppose we should try again to avoid the quadraticness in other >> ways when ref_indep_loop_p is called from outermost_indep_loop). >> >> Richard. >> >>> 2016-07-20 12:35 GMT+03:00 Yuri Rumyantsev <ysrum...@gmail.com>: >>>> Richard, >>>> >>>> Jakub has already fixed it. >>>> Sorry for troubles. >>>> Yuri. >>>> >>>> 2016-07-19 18:29 GMT+03:00 Renlin Li <renlin...@foss.arm.com>: >>>>> Hi Yuri, >>>>> >>>>> I saw this test case runs on arm platforms, and maybe other platforms as >>>>> well. >>>>> >>>>> testsuite/g++.dg/vect/pr70729.cc:7:10: fatal error: xmmintrin.h: No such >>>>> file or directory >>>>> >>>>> Before the change here, it's gated by vect_simd_clones target selector, >>>>> which limit it to i?86/x86_64 platform only. >>>>> >>>>> Regards, >>>>> Renlin Li >>>>> >>>>> >>>>> >>>>> >>>>> On 08/07/16 15:07, Yuri Rumyantsev wrote: >>>>>> >>>>>> Hi Richard, >>>>>> >>>>>> Thanks for your help - your patch looks much better. >>>>>> Here is new patch in which additional argument was added to determine >>>>>> source loop of reference. >>>>>> >>>>>> Bootstrap and regression testing did not show any new failures. >>>>>> >>>>>> Is it OK for trunk? >>>>>> ChangeLog: >>>>>> 2016-07-08 Yuri Rumyantsev <ysrum...@gmail.com> >>>>>> >>>>>> PR tree-optimization/71734 >>>>>> * tree-ssa-loop-im.c (ref_indep_loop_p_1): Add REF_LOOP argument which >>>>>> contains REF, use it to check safelen, assume that safelen value >>>>>> must be greater 1, fix style. >>>>>> (ref_indep_loop_p_2): Add REF_LOOP argument. >>>>>> (ref_indep_loop_p): Pass LOOP as additional argument to >>>>>> ref_indep_loop_p_2. >>>>>> gcc/testsuite/ChangeLog: >>>>>> * g++.dg/vect/pr70729.cc: Delete redundant dg options, fix >>>>>> style. >>>>>> >>>>>> 2016-07-08 11:18 GMT+03:00 Richard Biener <richard.guent...@gmail.com>: >>>>>>> >>>>>>> On Thu, Jul 7, 2016 at 5:38 PM, Yuri Rumyantsev <ysrum...@gmail.com> >>>>>>> wrote: >>>>>>>> >>>>>>>> I checked simd3.f90 and found out that my additional check reject >>>>>>>> independence of references >>>>>>>> >>>>>>>> REF is independent in loop#3 >>>>>>>> .istart0.19, .iend0.20 >>>>>>>> which are defined in loop#1 which is outer for loop#3. >>>>>>>> Note that these references are defined by >>>>>>>> _103 = __builtin_GOMP_loop_dynamic_next (&.istart0.19, &.iend0.20); >>>>>>>> which is in loop#1. >>>>>>>> It is clear that both these references can not be independent for >>>>>>>> loop#3. >>>>>>> >>>>>>> >>>>>>> Ok, so we end up calling ref_indep_loop for ref in LOOP also for inner >>>>>>> loops >>>>>>> of LOOP to catch memory references in those as well. So the issue is >>>>>>> really >>>>>>> that we look at the wrong loop for safelen and we _do_ want to apply >>>>>>> safelen >>>>>>> to inner loops as well. >>>>>>> >>>>>>> So better track the loop we are ultimately asking the question for, like >>>>>>> in the >>>>>>> attached patch (fixes the testcase for me). >>>>>>> >>>>>>> Richard. >>>>>>> >>>>>>> >>>>>>> >>>>>>>> 2016-07-07 17:11 GMT+03:00 Richard Biener <richard.guent...@gmail.com>: >>>>>>>>> >>>>>>>>> On Thu, Jul 7, 2016 at 4:04 PM, Yuri Rumyantsev <ysrum...@gmail.com> >>>>>>>>> wrote: >>>>>>>>>> >>>>>>>>>> I Added this check because of new failures in libgomp.fortran suite. >>>>>>>>>> Here is copy of Jakub message: >>>>>>>>>> --- Comment #29 from Jakub Jelinek <jakub at gcc dot gnu.org> --- >>>>>>>>>> The #c27 r237844 change looks bogus to me. >>>>>>>>>> First of all, IMNSHO you can argue this way only if ref is a >>>>>>>>>> reference >>>>>>>>>> seen in >>>>>>>>>> loop LOOP, >>>>>>>>> >>>>>>>>> >>>>>>>>> or inner loops of LOOP I guess. I _think_ we never call >>>>>>>>> ref_indep_loop_p_1 with >>>>>>>>> a REF whose loop is not a sub-loop of LOOP or LOOP itself (as it would >>>>>>>>> not make >>>>>>>>> sense to do that, it would be a waste of time). >>>>>>>>> >>>>>>>>> So only if "or inner loops of LOOP" is not correct the check would be >>>>>>>>> needed >>>>>>>>> but then my issue with unrolling an inner loop and turning a ref that >>>>>>>>> safelen >>>>>>>>> does not apply to into a ref that it now applies to arises. >>>>>>>>> >>>>>>>>> I don't fully get what Jakub is hinting at. >>>>>>>>> >>>>>>>>> Can you install the safelen > 0 -> safelen > 1 fix please? Jakub, can >>>>>>>>> you >>>>>>>>> explain that bitmap check with a simple testcase? >>>>>>>>> >>>>>>>>> Thanks, >>>>>>>>> Richard. >>>>>>>>> >>>>>>>>>> which is the case of e.g. *.omp_data_i_23(D).a ref in simd3.f90 -O2 >>>>>>>>>> -fopenmp -msse2, but not the D.3815[0] case tested during >>>>>>>>>> can_sm_ref_p >>>>>>>>>> - the >>>>>>>>>> D.3815[0] = 0; as well as something = D.3815[0]; stmt found in the >>>>>>>>>> outer loop >>>>>>>>>> obviously can be dependent on many of the loads and/or stores in the >>>>>>>>>> loop, be >>>>>>>>>> it "omp simd array" or not. >>>>>>>>>> Say for >>>>>>>>>> void >>>>>>>>>> foo (int *p, int *q) >>>>>>>>>> { >>>>>>>>>> #pragma omp simd >>>>>>>>>> for (int i = 0; i < 1024; i++) >>>>>>>>>> p[i] += q[0]; >>>>>>>>>> } >>>>>>>>>> sure, q[0] can't alias p[0] ... p[1022], the earlier iterations could >>>>>>>>>> write >>>>>>>>>> something that changes its value, and then it would behave >>>>>>>>>> differently >>>>>>>>>> from >>>>>>>>>> using VF = 1024, where everything is performed in parallel. >>>>>>>>>> Though, actually, it can alias, just it would have to write the same >>>>>>>>>> value as >>>>>>>>>> was there. So, if this is used to determine if it is safe to hoist >>>>>>>>>> the load >>>>>>>>>> before the loop, it is fine, if it is used to determine if &q[0] >= >>>>>>>>>> &p[0] && >>>>>>>>>> &q[0] <= &p[1023], then it is not fine. >>>>>>>>>> >>>>>>>>>> For aliasing of q[0] and p[1023], I don't see why they couldn't alias >>>>>>>>>> in a >>>>>>>>>> valid program. #pragma omp simd I think guarantees that the last >>>>>>>>>> iteration is >>>>>>>>>> executed last, it isn't necessarily executed last alone, it could be, >>>>>>>>>> or >>>>>>>>>> together with one before last iteration, or (for simdlen INT_MAX) >>>>>>>>>> even >>>>>>>>>> all >>>>>>>>>> iterations can be done concurrently, in hw or sw, so it is fine if it >>>>>>>>>> is >>>>>>>>>> transformed into: >>>>>>>>>> int temp[1024], temp2[1024], temp3[1024]; >>>>>>>>>> for (int i = 0; i < 1024; i++) >>>>>>>>>> temp[i] = p[i]; >>>>>>>>>> for (int i = 0; i < 1024; i++) >>>>>>>>>> temp2[i] = q[0]; >>>>>>>>>> /* The above two loops can be also swapped, or intermixed. */ >>>>>>>>>> for (int i = 0; i < 1024; i++) >>>>>>>>>> temp3[i] = temp[i] + temp2[i]; >>>>>>>>>> for (int i = 0; i < 1024; i++) >>>>>>>>>> p[i] = temp3[i]; >>>>>>>>>> /* Or the above loop reversed etc. */ >>>>>>>>>> >>>>>>>>>> If you have: >>>>>>>>>> int >>>>>>>>>> bar (int *p, int *q) >>>>>>>>>> { >>>>>>>>>> q[0] = 0; >>>>>>>>>> #pragma omp simd >>>>>>>>>> for (int i = 0; i < 1024; i++) >>>>>>>>>> p[i]++; >>>>>>>>>> return q[0]; >>>>>>>>>> } >>>>>>>>>> i.e. something similar to what misbehaves in simd3.f90 with the >>>>>>>>>> change, then >>>>>>>>>> the answer is that q[0] isn't guaranteed to be independent of any >>>>>>>>>> references in >>>>>>>>>> the simd loop. >>>>>>>>>> >>>>>>>>>> 2016-07-07 16:57 GMT+03:00 Richard Biener >>>>>>>>>> <richard.guent...@gmail.com>: >>>>>>>>>>> >>>>>>>>>>> On Thu, Jul 7, 2016 at 3:24 PM, Yuri Rumyantsev <ysrum...@gmail.com> >>>>>>>>>>> wrote: >>>>>>>>>>>> >>>>>>>>>>>> Richard, >>>>>>>>>>>> >>>>>>>>>>>> Did you meas the following check enhancement: >>>>>>>>>>>> >>>>>>>>>>>> outer = loop_outer (loop); >>>>>>>>>>>> /* We consider REF defined in LOOP as independent if at least 2 >>>>>>>>>>>> loop >>>>>>>>>>>> iterations are not dependent. */ >>>>>>>>>>>> if ((loop->safelen > 1 >>>>>>>>>>>> || (outer && outer->safelen > 1)) >>>>>>>>>>>> && bitmap_bit_p (&memory_accesses.refs_in_loop[loop->num], >>>>>>>>>>>> ref->id)) >>>>>>>>>>>> return true; >>>>>>>>>>>> which allows us to consider reference x[0] as invariant for the >>>>>>>>>>>> test >>>>>>>>>>>> #pragma omp simd >>>>>>>>>>>> for (i = 0; i< 100; i++) >>>>>>>>>>>> { >>>>>>>>>>>> y[i] = i * 2; >>>>>>>>>>>> for (j = 0; j < 100; j++) >>>>>>>>>>>> z[j] += x[0]; >>>>>>>>>>>> } >>>>>>>>>>>> >>>>>>>>>>>> Moving statement >>>>>>>>>>>> _9 = *x_19(D); >>>>>>>>>>>> (cost 20) out of loop 1. >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> outer loops will be automatically considered by outermost_indep_loop >>>>>>>>>>> which eventually >>>>>>>>>>> calls the function you are patching. >>>>>>>>>>> >>>>>>>>>>> I was questioning the added test >>>>>>>>>>> >>>>>>>>>>> && bitmap_bit_p (&memory_accesses.refs_in_loop[loop->num], >>>>>>>>>>> ref->id)) >>>>>>>>>>> >>>>>>>>>>> and still do not understand why you need that. It makes us only >>>>>>>>>>> consider the >>>>>>>>>>> loop of ref itself when looking at safelen (but not refs that belong >>>>>>>>>>> to inner loops >>>>>>>>>>> of loop). >>>>>>>>>>> >>>>>>>>>>> Richard. >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>>> 2016-07-07 11:46 GMT+03:00 Richard Biener >>>>>>>>>>>> <richard.guent...@gmail.com>: >>>>>>>>>>>>> >>>>>>>>>>>>> On Wed, Jul 6, 2016 at 4:42 PM, Yuri Rumyantsev >>>>>>>>>>>>> <ysrum...@gmail.com> wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>> Richard, >>>>>>>>>>>>>> >>>>>>>>>>>>>> I don't understand your question and how it is related to >>>>>>>>>>>>>> proposed >>>>>>>>>>>>>> patch. >>>>>>>>>>>>>> >>>>>>>>>>>>>> 2016-07-06 16:55 GMT+03:00 Richard Biener >>>>>>>>>>>>>> <richard.guent...@gmail.com>: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> On Wed, Jul 6, 2016 at 3:50 PM, Yuri Rumyantsev >>>>>>>>>>>>>>> <ysrum...@gmail.com> wrote: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> See for example Jakub comments for 70729. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> But how can the check be valid given a >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> #pragma omp simd >>>>>>>>>>>>>>> for (;;) >>>>>>>>>>>>>>> { >>>>>>>>>>>>>>> for (;;) >>>>>>>>>>>>>>> ...ref in question... >>>>>>>>>>>>>>> } >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> can be transformed to >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> #pragma omp simd >>>>>>>>>>>>>>> for (;;) >>>>>>>>>>>>>>> { >>>>>>>>>>>>>>> ...ref in question... >>>>>>>>>>>>>>> ...ref in question.. >>>>>>>>>>>>>>> ... >>>>>>>>>>>>>>> } >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> by means of unrolling? >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> The bitmap check would return false for the not unrolled inner >>>>>>>>>>>>> loop >>>>>>>>>>>>> and true for the inner unrolled loop. >>>>>>>>>>>>> So it cannot be correct. >>>>>>>>>>>>> >>>>>>>>>>>>> (not sure why this is all off-list btw) >>>>>>>>>>>>> >>>>>>>>>>>>> Richard. >>>>>>>>>>>>> >>>>>>>>>>>>>>> Richard. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> 2016-07-06 16:25 GMT+03:00 Richard Biener >>>>>>>>>>>>>>>> <richard.guent...@gmail.com>: >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> On Wed, Jul 6, 2016 at 1:43 PM, Yuri Rumyantsev >>>>>>>>>>>>>>>>> <ysrum...@gmail.com> wrote: >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> I did not learn LIM detailed but I see on the following >>>>>>>>>>>>>>>>>> example >>>>>>>>>>>>>>>>>> #pragma omp simd >>>>>>>>>>>>>>>>>> for (i = 0; i< 100; i++) >>>>>>>>>>>>>>>>>> { >>>>>>>>>>>>>>>>>> y[i] = i * 2; >>>>>>>>>>>>>>>>>> for (j = 0; j < 100; j++) >>>>>>>>>>>>>>>>>> z[j] += x[0]; >>>>>>>>>>>>>>>>>> } >>>>>>>>>>>>>>>>>> that only inner,ost loop is handled: >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Memory reference in loop#2 1: *_7 >>>>>>>>>>>>>>>>>> Memory reference in loop#2 2: *x_19(D) >>>>>>>>>>>>>>>>>> Memory reference in loop#1 3: *_3 >>>>>>>>>>>>>>>>>> Basic block 3 (loop 1 -- depth 1): >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Basic block 4 (loop 2 -- depth 2): >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Loop#2 is innermost >>>>>>>>>>>>>>>>>> Querying dependency of refs 2 and 1: dependent. >>>>>>>>>>>>>>>>>> Querying dependencies of ref 2 in loop 2: dependent >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> well, LIM doesn't bother to check against refs in an outer >>>>>>>>>>>>>>>>> loop >>>>>>>>>>>>>>>>> if >>>>>>>>>>>>>>>>> refs in the inner loop are already dependent. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Loop unroll of inner loop does not invalidate 'safelen' of >>>>>>>>>>>>>>>>>> outer one >>>>>>>>>>>>>>>>>> accordingly with safelen definition. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> So why do you need the bitmap_bit_p check then? >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Richard. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> 2016-07-06 14:23 GMT+03:00 Richard Biener >>>>>>>>>>>>>>>>>> <richard.guent...@gmail.com>: >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> On Wed, Jul 6, 2016 at 1:17 PM, Yuri Rumyantsev >>>>>>>>>>>>>>>>>>> <ysrum...@gmail.com> wrote: >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> Richard, >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> LIM phase considers only innermost loops and does not >>>>>>>>>>>>>>>>>>>> handle >>>>>>>>>>>>>>>>>>>> loop >>>>>>>>>>>>>>>>>>>> nests, so in your case the innermost loop (j) does not have >>>>>>>>>>>>>>>>>>>> non-zero >>>>>>>>>>>>>>>>>>>> safelen. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Huh? LIM considers loop nests just fine. And yes, the >>>>>>>>>>>>>>>>>>> innermost loop >>>>>>>>>>>>>>>>>>> does not have safelen but shouldn't it? Consider the inner >>>>>>>>>>>>>>>>>>> loop being unrolled >>>>>>>>>>>>>>>>>>> by GCC so it is removed - should that then invalidate the >>>>>>>>>>>>>>>>>>> outer loop safelen >>>>>>>>>>>>>>>>>>> because innermost loop refs now appear in the outer loop? >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Richard. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> 2016-07-06 13:34 GMT+03:00 Richard Biener >>>>>>>>>>>>>>>>>>>> <richard.guent...@gmail.com>: >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> On Wed, Jul 6, 2016 at 11:50 AM, Yuri Rumyantsev >>>>>>>>>>>>>>>>>>>>> <ysrum...@gmail.com> wrote: >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> Richard, >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> I pointed out in the commentary that REF is defined >>>>>>>>>>>>>>>>>>>>>> inside >>>>>>>>>>>>>>>>>>>>>> loop and >>>>>>>>>>>>>>>>>>>>>> this check is related to this statement. Should I clarify >>>>>>>>>>>>>>>>>>>>>> it? >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> + /* We consider REF defined in LOOP as independent if >>>>>>>>>>>>>>>>>>>>>> at >>>>>>>>>>>>>>>>>>>>>> least 2 loop >>>>>>>>>>>>>>>>>>>>>> + iterations are not dependent. */ >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> Yes, I fail to see why x[0] should not be disambiguated >>>>>>>>>>>>>>>>>>>>> against y[i] in >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> #pragma GCC loop ivdep >>>>>>>>>>>>>>>>>>>>> for (i...) >>>>>>>>>>>>>>>>>>>>> { >>>>>>>>>>>>>>>>>>>>> y[i] = ...; >>>>>>>>>>>>>>>>>>>>> for (j...) >>>>>>>>>>>>>>>>>>>>> ... = x[0]; >>>>>>>>>>>>>>>>>>>>> } >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> REF is always inside the loop nest with LOOP being the >>>>>>>>>>>>>>>>>>>>> outermost loop. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> Richard. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> 2016-07-06 12:38 GMT+03:00 Richard Biener >>>>>>>>>>>>>>>>>>>>>> <richard.guent...@gmail.com>: >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> On Tue, Jul 5, 2016 at 4:56 PM, Yuri Rumyantsev >>>>>>>>>>>>>>>>>>>>>>> <ysrum...@gmail.com> wrote: >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> Hi All, >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> Here is a simple fix to cure regressions introduced by >>>>>>>>>>>>>>>>>>>>>>>> my fix for >>>>>>>>>>>>>>>>>>>>>>>> 70729. Patch also contains minor changes in test found >>>>>>>>>>>>>>>>>>>>>>>> by Jakub. >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> Bootstrapping and regression testing did not show any >>>>>>>>>>>>>>>>>>>>>>>> new failures. >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> Is it OK for trunk? >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> + && bitmap_bit_p >>>>>>>>>>>>>>>>>>>>>>> (&memory_accesses.refs_in_loop[loop->num], ref->id)) >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> So safelen does not apply to refs in nested loops? The >>>>>>>>>>>>>>>>>>>>>>> added comment only >>>>>>>>>>>>>>>>>>>>>>> explains the safelen check change but this also requires >>>>>>>>>>>>>>>>>>>>>>> explanation. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> Richard. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> ChangeLog: >>>>>>>>>>>>>>>>>>>>>>>> 2016-07-05 Yuri Rumyantsev <ysrum...@gmail.com> >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> PR tree-optimization/71734 >>>>>>>>>>>>>>>>>>>>>>>> * tree-ssa-loop-im.c (ref_indep_loop_p_1): Consider REF >>>>>>>>>>>>>>>>>>>>>>>> defined in >>>>>>>>>>>>>>>>>>>>>>>> LOOP as independent if at least two loop iterations are >>>>>>>>>>>>>>>>>>>>>>>> not dependent. >>>>>>>>>>>>>>>>>>>>>>>> gcc/testsuite/ChangeLog: >>>>>>>>>>>>>>>>>>>>>>>> * g++.dg/vect/pr70729.cc: Delete redundant dg >>>>>>>>>>>>>>>>>>>>>>>> options, fix style.