On Thu, Jul 7, 2011 at 6:28 PM, Kai Tietz <ktiet...@googlemail.com> wrote:
> 2011/7/7 Paolo Bonzini <bonz...@gnu.org>:
>> On 07/07/2011 06:07 PM, Kai Tietz wrote:
>>>
>>> +  /* We redo folding here one time for allowing to inspect more
>>> +     complex reductions.  */
>>> +  substitute_and_fold (op_with_constant_singleton_value_range,
>>> +                      vrp_fold_stmt, false);
>>> +  /* We need to mark this second pass to avoid re-entering of same
>>> +     edges for switch statments.  */
>>> +  in_second_pass = true;
>>>    substitute_and_fold (op_with_constant_singleton_value_range,
>>>                       vrp_fold_stmt, false);
>>> +  in_second_pass = false;
>>
>> This needs a much better explanation.
>>
>> Paolo
>
> Well, I can work on a better comment.  The complex reduction I mean
> here are cases like
>
> int x;
> int y;
> _Bool D1;
> _Bool D2;
> _Bool D3;
> int R;
>
> D1 = x[0..1] != 0;
> D2 = y[0..1] != 0;
> D3 = D1 & D2
> R = (int) D3
>
> (testcase is already present. See tree-ssa/vrp47.c).
>
> As VRP in first pass produces (and replaces) to:
>
> D1 = (_Bool) x[0..1];
> D2 = (_Bool) y[0..1];
> D3 = D1 & D2
> R = (int) D3
>
> Just in the second pass the reduction
>
> R = x[0..1] & y[0..1]

So why wouldn't that happen during the first pass?  The first
pass could change the IL to

 D1 = x[0..1] != 0;
 D2 = y[0..1] != 0;
 D3 = D1 & D2;
 R = x & y;

if D3 only has a single use.

> can happen.  In general it is sad that VRP can't insert during pass
> new statements right now.  This would cause issues in range-tables,
> which aren't designed for insertations.  As otherwise, we could do
> also simplify things like
>
> D1 = x[0..1] != 0;
> D2 = y[0..1] == 0;
> D3 = D1 & D2
> R = (int) D3
>
> to
> R = x[0..1] & (y[0..1] ^ 1)

Why that ^ 1?  And why does that confuse the range tables
if you re-use R?

> Regards,
> Kai
>

Reply via email to