>> On Fri, May 27, 2005 at 02:45:14PM -0400, Andrew Pinski wrote:
>>> re:
>>> char *foo(char *p, char *q) {
>>>     int x = (p !=0) + (q != 0);
>>>     ...
>>> }
>>
>> Are you sure, the NE_EXPR does not have a type of INTEGER_TYPE?
>> This sounds like a missing fold_convert somewhere.
>> 
> Ah, yes.  I see what you mean now.  The comparison was of type
> int but the evaluation was generating a _Bool value.  My bad.

Especially for the purpose of VRP, why wouldn't it be most ideally
appropriate to define the result of a comparison to be a _Bool, as it's
constrained to the range of 0:1; and by "usual arithmetic conversion",
need only typically be promoted to a char rank integer (presuming _Bool
is not specified to be of greater rank than char), thereby most optimally:

int x = (int)((char)(_Bool)((*)p != (*)0) + (char)(_Bool)((*)q != (*)0))

it would seem?



Reply via email to