On Wed, Apr 11, 2012 at 11:28 AM, Bin.Cheng <amker.ch...@gmail.com> wrote:
> On Mon, Apr 9, 2012 at 7:02 PM, Richard Guenther
> <richard.guent...@gmail.com> wrote:
>> On Mon, Apr 9, 2012 at 8:00 AM, Bin.Cheng <amker.ch...@gmail.com> wrote:
>>> On Fri, Mar 30, 2012 at 5:43 PM, Bin.Cheng <amker.ch...@gmail.com> wrote:
>
>>>
>>> Hi Richard,
>>> I am testing a patch to sink load of memory to proper basic block.
>>> Everything goes fine except auto-vectorization, sinking of load sometime
>>> corrupts the canonical form of data references. I haven't touched auto-vec
>>> before and cannot tell whether it's good or bad to do sink before auto-vec.
>>> For example, the slp-cond-1.c
>>>
>>> <bb 3>:
>>>  # i_39 = PHI <i_32(11), 0(2)>
>>>  D.5150_5 = i_39 * 2;
>>>  D.5151_10 = D.5150_5 + 1;
>>>  D.5153_17 = a[D.5150_5];
>>>  D.5154_19 = b[D.5150_5];
>>>  if (D.5153_17 >= D.5154_19)
>>>    goto <bb 9>;
>>>  else
>>>    goto <bb 4>;
>>>
>>> <bb 9>:
>>>  d0_6 = d[D.5150_5];    <-----this is sunk from bb3
>>>  goto <bb 5>;
>>>
>>> <bb 4>:
>>>  e0_8 = e[D.5150_5];    <-----this is sunk from bb3
>>>
>>> <bb 5>:
>>>  # d0_2 = PHI <d0_6(9), e0_8(4)>
>>>  k[D.5150_5] = d0_2;
>>>  D.5159_26 = a[D.5151_10];
>>>  D.5160_29 = b[D.5151_10];
>>>  if (D.5159_26 >= D.5160_29)
>>>    goto <bb 10>;
>>>  else
>>>    goto <bb 6>;
>>>
>>>
>>> <bb 10>:
>>>  d1_11 = d[D.5151_10];    <-----this is sunk from bb3
>>>  goto <bb 7>;
>>>
>>> <bb 6>:
>>>  e1_14 = e[D.5151_10];    <-----this is sunk from bb3
>>>
>>> <bb 7>:
>>> .......
>>>
>>> I will look into auto-vect but not sure how to handle this case.
>>>
>>> Any comments? Thanks very much.
>>
>> Simple - the vectorizer expects empty latch blocks.  So simply
>> never sink stuff into latch-blocks - I think the current code already
>> tries to avoid that for regular computations.
>
> Seems not the story. The sinkto basic block is not latch basic block at all.
>
> The problem is about if-conversion, code of the case in slp-cond-1.c is like:
>
> __attribute__((noinline, noclone)) void
> f4 (void)
> {
>  int i;
>  for (i = 0; i < N/2; ++i)
>    {
>      int d0 = d[2*i], e0 = e[2*i];
>      int d1 = d[2*i+1], e1 = e[2*i+1];
>      k[2*i] = a[2*i] >= b[2*i] ? d0 : e0;   <------example
>      k[2*i+1] = a[2*i+1] >= b[2*i+1] ? d1 : e1;
>    }
> }
> It is strictly formed in conditional operations, just like the output
> of if-conversion pass before auto-vec.
>
> Now sink pass sinks load of d0/e0 into then/else branch, since they
> are partial dead code in the opposite branch, which corrupts the
> canonical form.
>
> Ideally, if-conversion pass should handle the sinked code and collapse
> if-then-else into conditional operations.
> But as showed by dump of if-conversion pass before auto-vect:
>
> <bb 3>:
>  # i_39 = PHI <i_32(10), 0(2)>
>  # ivtmp.137_41 = PHI <ivtmp.137_38(10), 16(2)>
>  D.5150_5 = i_39 * 2;
>  D.5151_10 = D.5150_5 + 1;
>  D.5153_17 = a[D.5150_5];
>  D.5154_19 = b[D.5150_5];
>  if (D.5153_17 >= D.5154_19)
>    goto <bb 4>;
>  else
>    goto <bb 5>;
>
> <bb 4>:
>  d0_6 = d[D.5150_5];
>  goto <bb 6>;
>
> <bb 5>:
>  e0_8 = e[D.5150_5];
>
> <bb 6>:
>  # d0_2 = PHI <d0_6(4), e0_8(5)>
>  k[D.5150_5] = d0_2;
>
> It does not work as expected.
>
> So I think sink pass is fine for this case, it is the if-conversion
> pass need further investigation.
> Comments? Thanks.

Turns out if-conversion checks whether gimple statement traps or not.
For the statement "d0_6 = d[D.5150_5];", it assumes rhs might trap,
because it sees the index not INTEGER_CST.

Two questions:
1, The check can be enhanced in gimple_could_trap_p_1 for ARRAY_REF.
2, Should I check this before sinking load from memory? If yes, then why sink of
store does not do such check?

Again, please correct if I missed something important.
Thanks very much.

-- 
Best Regards.

Reply via email to