ivopts improvement
Tom de Vries
vries@codesourcery.com
Mon Mar 14 13:51:00 GMT 2011
On 03/14/2011 01:55 PM, Zdenek Dvorak wrote:
> Hi,
>
>>>> it is trying to allow for
>>>>
>>>> do
>>>> {
>>>> *p = '\0';
>>>> i++; /* use_uses_inced_iv == true */
>>>> p++; /* use_after_cand_inc == true */
>>>> if (!(i < n))
>>>> break;
>>>> }
>>>> while (1);
>>>>
>>>> and for
>>>>
>>>> do
>>>> {
>>>> *p = '\0';
>>>> if (!(i < n))
>>>> break;
>>>> i++; /* use_uses_inced_iv == false */
>>>> p++; /* use_after_cand_inc == false */
>>>> }
>>>> while (1);
>>>>
>>>> but not for
>>>>
>>>> do
>>>> {
>>>> *p = '\0';
>>>> i++; /* use_uses_inced_iv == true */
>>>> if (!(i < n))
>>>> break;
>>>> p++; /* use_after_cand_inc == false */
>>>> }
>>>> while (1);
>>>>
>>>> and not for
>>>>
>>>> do
>>>> {
>>>> *p = '\0';
>>>> p++; /* use_after_cand_inc == true */
>>>> if (!(i < n))
>>>> break;
>>>> i++; /* use_uses_inced_iv == false */
>>>> }
>>>> while (1);
>>>>
>>>> In the latter 2 cases, I cannot simply replace i < n with p < base + n.
>>>
>>> Why not (other than that the value to compare with varies in these cases, but
>>> it always is "the value of p in the last iteration of the loop")?
>>
>> In the 2 latter cases, the value to compare with will be either base + n
>> + 1 or base + n - 1. The code does not handle these cases yet.
>
> well, if not, then it certainly handles one of the first two cases incorrectly
The ivopts code for the first example is:
<bb 2>:
p_5 = p_3(D) + i_4(D);
D.2698_12 = p_3(D) + n_8(D);
<bb 3>:
# p_1 = PHI <p_5(2), p_7(4)>
*p_1 = 0;
p_7 = p_1 + 1;
if (p_7 >= D.2698_12)
goto <bb 5>;
else
goto <bb 4>;
<bb 4>:
goto <bb 3>;
<bb 5>:
return;
and for the second example is:
<bb 2>:
p_5 = p_3(D) + i_4(D);
D.2704_13 = p_3(D) + n_6(D);
<bb 3>:
# p_1 = PHI <p_5(2), p_8(4)>
*p_1 = 0;
if (p_1 >= D.2704_13)
goto <bb 5>;
else
goto <bb 4>;
<bb 4>:
p_8 = p_1 + 1;
goto <bb 3>;
<bb 5>:
return;
both seem correct to me.
> (since the use_uses_inced_iv test is meaningless).
To me it seems use_uses_inced_iv has meaning:
- it models something: it states whether the comparison is using
the iv increment result or the iv phi result.
- it is used to detect cases were we would generate incorrect code.
>>> One more thing: what is fold_walk_def_plus for?
>>
>> It tries to fold a plus, and if not successful, finds ssa vars in
>> operands of the plus, substitutes the defining statements of ssa vars
>> for those ssa vars and retries folding.
>
> Sorry for not being more clear; I meant, why is it used?
>
In the following code
<bb 2>:
p_5 = p_3(D) + i_4(D);
<bb 3>:
# p_1 = PHI <p_5(2), p_7(4)>
# i_2 = PHI <i_4(D)(2), i_6(4)>
*p_1 = 0;
i_6 = i_2 + 1;
p_7 = p_1 + 1;
if (i_6 >= n_8(D))
goto <bb 5>;
else
goto <bb 4>;
<bb 4>:
goto <bb 3>;
<bb 5>:
return;
I'm trying to prove that p_5 == x + i_4 where x is an ssa_name. I can't
do that without going through the defining statement of p_5.
> Zdenek
More information about the Gcc-patches
mailing list