On Tue, Aug 9, 2016 at 11:20 AM, Yuri Rumyantsev <ysrum...@gmail.com> wrote:
> Yes it is impossible since all basic blocks are handled from outer
> loops to innermost so we can not have the sequence with wrong
> dependence, i.e. we cached that reference is independent (due to
> safelen) but the same reference in outer loop must be evaluated as
> dependent. So we must re-evaluate only dependent references in loops
> having non-zero safelen attribute.

Hmm.  I don't like depending on this implementation detail.  Does the
attached patch work
which simply avoids any positive/negative caching on safelen affected
refs?  It also makes
the query cheaper by avoiding the dive into child loops.

Richard.

> 2016-08-09 11:44 GMT+03:00 Richard Biener <richard.guent...@gmail.com>:
>> On Fri, Aug 5, 2016 at 4:57 PM, Yuri Rumyantsev <ysrum...@gmail.com> wrote:
>>> Richard,
>>>
>>> I added additional check before caching dependencies since (1) all
>>> statements in loop are handled in loop postorder order, i.e. form
>>> outer to inner; (2) we can change dependency for reference in subloops
>>> which have non-zero safelen attribute. So I propose to re-evaluate it
>>> in such cases. I don't see why we need to avoid dependence caching for
>>> all loop nests since pragma omp simd is used very rarely.
>>
>> You think it is impossible to construct a testcase which hits the
>> correctness issue?
>> "very rarely" is not a good argument to generate wrong code.
>>
>> Richard.
>>
>>> 2016-08-05 16:50 GMT+03:00 Richard Biener <richard.guent...@gmail.com>:
>>>> On Fri, Aug 5, 2016 at 3:28 PM, Yuri Rumyantsev <ysrum...@gmail.com> wrote:
>>>>> Richard,
>>>>>
>>>>> Here is updated patch which implements your proposal - I pass loop
>>>>> instead of stmt to determine either REF is defined inside LOOP nest or
>>>>> not. I checked that for pr70729-nest.cc the reference this->S_n  for
>>>>> statements which are out of innermost loop are  not considered as
>>>>> independent as you pointed out.
>>>>>
>>>>> Regression testing did not show any new failures and both failed tests
>>>>> from libgomp.fortran suite now passed.
>>>>>
>>>>> Is it OK for trunk?
>>>>
>>>> I don't quite understand
>>>>
>>>> +  /* Ignore dependence for loops having greater safelen.  */
>>>> +  if (new_safelen == safelen
>>>> +      && bitmap_bit_p (&ref->dep_loop, LOOP_DEP_BIT (loop->num, 
>>>> stored_p)))
>>>>      return false;
>>>>
>>>> this seems to suggest (correctly I think) that we cannot rely on the 
>>>> caching
>>>> for safelen, neither for optimal results (you seem to address that) but 
>>>> also
>>>> not for correctness (we cache the no-dep result from a safelen run and
>>>> then happily re-use that info for a ref that is not safe for safelen).
>>>>
>>>> It seems to me we need to avoid any caching if we made things independent
>>>> because of safelen and simply not do the dep test afterwards.  this means
>>>> inlining ref_indep_loop_p_1 partly into _2 (not sure if there's a great way
>>>> to do this w/o confusing the control flow).
>>>>
>>>> Richard.
>>>>
>>>>> ChangeLog:
>>>>> 2016-08-05  Yuri Rumyantsev  <ysrum...@gmail.com>
>>>>>
>>>>> PR tree-optimization/71734
>>>>> * tree-ssa-loop-im.c (ref_indep_loop_p): Add new argument REF_LOOP.
>>>>> (outermost_indep_loop): Pass LOOP argumnet where REF was defined to
>>>>> ref_indep_loop_p.
>>>>> (ref_indep_loop_p_1): Fix commentary.
>>>>> (ref_indep_loop_p_2): Add additional argument REF_LOOP, introduce new
>>>>> variable NEW_SAFELEN which may have new value for SAFELEN, ignore
>>>>> dependencde for loop having greater safelen value, pass REF_LOOP in
>>>>> recursive call.
>>>>> (can_sm_ref_p): Pass LOOP as additional argument to ref_indep_loop_p.
>>>>>
>>>>> 2016-08-03 16:44 GMT+03:00 Richard Biener <richard.guent...@gmail.com>:
>>>>>> 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.

Attachment: p
Description: Binary data

Reply via email to