On Thu, Jun 2, 2016 at 2:53 AM, Trevor Saunders <tbsau...@tbsaunde.org> wrote:
> On Thu, Jun 02, 2016 at 08:54:36AM +1000, kugan wrote:
>> Hi All,
>>
>> When I compile the following code with g++ using -fstrict-enums and -O2
>>
>> enum v
>> {
>>   OK = 0,
>>   NOK = 1,
>> };
>>
>> int foo0 (enum v a)
>> {
>>   if (a > NOK)
>>     return 0;
>>   return 1;
>> }
>>
>> vrp1 dump looks like:
>> Value ranges after VRP:
>>
>> a.0_1: VARYING
>> _2: [0, 1]
>> a_3(D): VARYING
>>
>>
>> int foo0(v) (v a)
>> {
>>   int a.0_1;
>>   int _2;
>>
>>   <bb 2>:
>>   a.0_1 = (int) a_3(D);
>>   if (a.0_1 > 1)
>>     goto <bb 4>;
>>   else
>>     goto <bb 3>;
>>
>>   <bb 3>:
>>
>>   <bb 4>:
>>   # _2 = PHI <0(2), 1(3)>
>>   return _2;
>>
>> }
>>
>> Should we infer value ranges for the enum since this is -fstrict-enums and
>> optimize it?
>>
>> @item -fstrict-enums
>> @opindex fstrict-enums
>> Allow the compiler to optimize using the assumption that a value of
>> enumerated type can only be one of the values of the enumeration (as
>> defined in the C++ standard; basically, a value that can be
>> represented in the minimum number of bits needed to represent all the
>> enumerators).  This assumption may not be valid if the program uses a
>> cast to convert an arbitrary integer value to the enumerated type.
>
> It seems like the "basically" part contradicts the first sentence?

It really depends on what the standard says exactly ;)  VRP just uses
TYPE_MIN/MAX_VALUE and the FE is responsible for setting them.

But yes, we have -fno-strict-enums by default for a reason ;)

Richard.

Reply via email to