On Fri, Mar 8, 2013 at 1:30 PM, Jakub Jelinek <ja...@redhat.com> wrote:
> On Fri, Mar 08, 2013 at 01:16:37PM +0100, Marek Polacek wrote:
>> --- gcc/predict.c.mp  2013-03-07 20:01:01.078417558 +0100
>> +++ gcc/predict.c     2013-03-08 11:35:05.227603993 +0100
>> @@ -1028,13 +1028,13 @@ static bool
>>  is_comparison_with_loop_invariant_p (gimple stmt, struct loop *loop,
>>                                    tree *loop_invariant,
>>                                    enum tree_code *compare_code,
>> -                                  int *loop_step,
>> +                                  tree *loop_step,
>>                                    tree *loop_iv_base)
>>  {
>>    tree op0, op1, bound, base;
>>    affine_iv iv0, iv1;
>>    enum tree_code code;
>> -  int step;
>> +  tree step;
>>
>>    code = gimple_cond_code (stmt);
>>    *loop_invariant = NULL;
>> @@ -1077,7 +1077,7 @@ is_comparison_with_loop_invariant_p (gim
>>        bound = iv0.base;
>>        base = iv1.base;
>>        if (host_integerp (iv1.step, 0))
>> -     step = tree_low_cst (iv1.step, 0);
>> +     step = iv1.step;
>>        else
>>       return false;
>>      }
>> @@ -1086,7 +1086,7 @@ is_comparison_with_loop_invariant_p (gim
>>        bound = iv1.base;
>>        base = iv0.base;
>>        if (host_integerp (iv0.step, 0))
>> -     step = tree_low_cst (iv0.step, 0);
>> +     step = iv0.step;
>>        else
>>       return false;
>>      }
>
> If the callers use double_int computation, perhaps there is
> no reason for the host_integerp checks and all we could verify is
> that the trees have TREE_CODE (iv0.step) etc. == INTEGER_CST
> (and perhaps that if the type of them is unsigned, then they don't
> have the msb set (i.e.
> !TYPE_UNSIGNED (TREE_TYPE (iv0.step))
> || !tree_to_double_int (iv0.step).is_negative () ).
> But perhaps that can be left for 4.9 as an improvement?
>
>> @@ -1224,34 +1224,78 @@ predict_iv_comparison (struct loop *loop
>>        && host_integerp (compare_base, 0))
>
> Ditto the host_integerp checks above.
>
>> +      if ((compare_step.scmp (double_int_zero) == 1)
>
> I believe compare_step should be known not to be zero here (there are
> integer_zerop checks earlier, aren't they), so this could be also
> !compare_step.is_negative ()
> ?
>
> Other than that it looks good to me, Richard, is this fine for you too?

Yes.

Thanks,
Richard.

>         Jakub

Reply via email to