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?

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.

Attachment: 71734.new-patch
Description: Binary data

Reply via email to