On Wed, Jun 25, 2014 at 06:14:57PM +1000, Kugan wrote: > For these flags, value ranges generated are not usable for extension > eliminations. Therefore, without this some of the test cases in > regression fails. For example: > > short a; > void > foo (void) > { > for (a = 0; a >= 0; a++) > ; > } > -Os -fno-strict-overflow produces the following range for the index > increment and hence goes into infinite loop. > _10: [1, 32768] > _10 = _4 + 1;
For -fwrapv I don't see why you'd get into trouble ever, the VRP computation should be well aware of the -fwrapv semantics and the value ranges should reflect that. For -fno-strict-overflow, I have no idea since it is very weirdly defined. In any case, for your example above, the loop is always well defined, because for char/short a++ is performed as: a = (short) ((int) a + 1) So, if the patch turns it into infinite loop, with -Os -fno-strict-overflow or -Os, it is simply a problem with the patch. VR [1, 32768] looks correct, a++ is performed only if a is >= 0, therefore before addition [0, 32767]. But from VR [1, 32768] you can't optimize away the sign extension, make sure you don't have there off-by-one? It would be nice if the patch contained some testcases, it is easy to construct testcases where you have arbitrary VRs on some SSA_NAMEs, you just need something to stick the VR on, so you can do something like: type foo (type a) { if (a < VR_min + 1 || a > VR_max + 1) return; // If VR_min is type minimum or VR_max type maximum this needs to be adjusted of course. a = a + 1; // now you can try some cast that your optimization would try to optimize return a; } Or void bar (type a) { a = (a & mask) + bias; (or similarly) } Make sure to cover the boundary cases, where VR minimum or maximum still allow optimizing away zero and/or sign extensions, and another case where they are +- 1 and already don't allow it. Jakub