On Fri, Jul 29, 2016 at 4:00 PM, Yuri Rumyantsev <ysrum...@gmail.com> wrote:
> Hi Richard.
>
> It turned out that the fix proposed by you does not work for liggomp
> tests simd3 and simd4.
> The reason is that we can't change safelen value for references not
> defined inside loop. So I add missed check on it to patch.
> Is it OK for trunk?

Hmm, I don't like the walk of all subloops in ref_defined_in_loop_p as
that operation can end up being quadratic in the loop depth/width.

But I also wonder about correctness given that LIM "commons"
references.  So we can have

  for (;;)
    .. = ref;  (1)
    for (;;) // safelen == 2  (2)
      ... = ref;

and when looking at the ref at (1) which according to you should not
have safelen applied your function will happily return that ref is defined
in the inner loop.

So it looks like to be able to apply safelen the caller of ref_indep_loop_p
needs to pass down a ref plus a location (a stmt).  In which case your
function can simply use flow_loop_nested_p (loop, gimple_bb
(stmt)->loop_father);

Richard.

> ChangeLog:
> 2016-07-29  Yuri Rumyantsev  <ysrum...@gmail.com>
>
> PR tree-optimization/71734
> * tree-ssa-loop-im.c (ref_defined_in_loop_p): New function.
> (ref_indep_loop_p_2): Change SAFELEN value for REF defined inside LOOP.
>
> 2016-07-29 13:08 GMT+03:00 Yuri Rumyantsev <ysrum...@gmail.com>:
>> Sorry H.J.
>>
>> I checked both these tests manually but forgot to pass "-fopenmp" option.
>> I will fix the issue asap.
>>
>> 2016-07-29 0:33 GMT+03:00 H.J. Lu <hjl.to...@gmail.com>:
>>> On Thu, Jul 28, 2016 at 6:49 AM, 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?
>>>>
>>>> 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.
>>>>
>>>
>>> Does this cause
>>>
>>> FAIL: libgomp.fortran/pr71734-1.f90   -O3 -fomit-frame-pointer
>>> -funroll-loops -fpeel-loops -ftracer -finline-functions  execution
>>> test
>>> FAIL: libgomp.fortran/pr71734-1.f90   -O3 -g  execution test
>>> FAIL: libgomp.fortran/pr71734-2.f90   -O3 -fomit-frame-pointer
>>> -funroll-loops -fpeel-loops -ftracer -finline-functions  execution
>>> test
>>> FAIL: libgomp.fortran/pr71734-2.f90   -O3 -g  execution test
>>>
>>> on AVX machines and
>>>
>>> FAIL: libgomp.fortran/simd3.f90   -O3 -fomit-frame-pointer
>>> -funroll-loops -fpeel-loops -ftracer -finline-functions  execution
>>> test
>>> FAIL: libgomp.fortran/simd3.f90   -O3 -g  execution test
>>> FAIL: libgomp.fortran/simd4.f90   -O3 -fomit-frame-pointer
>>> -funroll-loops -fpeel-loops -ftracer -finline-functions  execution
>>> test
>>> FAIL: libgomp.fortran/simd4.f90   -O3 -g  execution test
>>>
>>> on non-AVX machines?
>>>
>>> --
>>> H.J.

Reply via email to