On Mon, Jul 18, 2011 at 16:40, Tobias Grosser <tob...@grosser.es> wrote:
> You are right. In case we want to downcast b we would also need to prove
> that b itself fits into the smaller type. (This may happen, if the larger
> type was introduced earlier to remove casts, but is not needed to store the
> result).

[...]

>> for (i = -128; i<  min (127, j + 200); i++)
>>
>> we need a type large enough to be able to represent "j + 200", and
>> that would be short.  So we need to take again the "max of the types
>> of sub-expressions".
>
> What is the "max of the types of sub-expressions"? Just the larges type is
> in general not large enough. a+b may not fit into the type of a nor in the
> type of b. However, assuming a and b may have any value that the types of a
> and b allow, would require us to assume a type that is definitely larger
> then the type of each argument (we do not do this, thats why some function
> are incorrect). Implementing this approach would yield to an explosion in
> type size.
>
> What I propose is that you take advantage of your newly built lb/ub
> infrastructure and that we calculate for every subexpression the type as
> follows.
>
> minimal_correct_type = max(min_type(lb_result, ub_result),
>                           min_type(lb_op1, ub_op1),
>                           min_type(lb_op2, ub_op2))
>
> And then we choose a type that is equal or larger than minimal_correct_type
> and that reduces the number of introduced downcasts.

minimal_correct_type wouldn't work on this example:

Suppose we have a loop that we have already generated with an
induction variable of type short for the same reasons as in the
previous example, and such that the lb_ub of the IV is still in the
range of char:

for (i = -100; i < min (100, j + 200); i++)

Now suppose that we want to determine the type of expression "i + 1".
Based on the lb_ub information of i, we would compute that
minimal_correct_type is char, because the result of "i + 1" is in
[-99, 101], so that's char and the lb_ub of the op1 and op2 are char
as well, so max (char, char, char) = char.

Generating code for "i + 1" of type char would need a cast of i from
short to char, and then computing the plus expr in the char type:
"(char) i + 1", and here you cannot eliminate the cast.

So if CLooG's answer to "what is the type of i + 1" is char, then you
would not be able to remove that cast to make the loop vectorizable.
In this particular example, I really want CLooG to answer "the type of
i + 1 is short", such that I do not need any extra casts between the
main induction variable and the plus expression.

What about the following formula that integrates not only the lb_ub
info (minimal_correct_type as you defined it), but also the types of
the sub-expressions:

minimal_correct_type_1 = max(minimal_correct_type, type_op1, type_op2)

Can you think at an example where that would still lead to an
"explosion in type size"?

Sebastian

Reply via email to