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]

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)

Regards,
Kai

Reply via email to