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? Consider enum Foo { a = 0, b = 2 }; Foo a = (Foo) 2; That should fit in the minimum number of bits used to represent the enum, but clearly isn't one of the enum's constants. I guess if vrp only says its in the range [1, 3] then it doesn't matter. Then consider Foo b = (Foo) 3; If you assume two's complement (which I believe is implementation defined) then it also fits in the minimum number of bits, but is clearly outside the range for vrp. I guess given the last bit, these are both ment to be invalid? I guess the correct thing according to the docs is to optimize, but personally I'd be pretty scared of turning that flag on. Trev > > > Thanks, > Kugan