------- Comment #9 from rguenth at gcc dot gnu dot org 2008-07-24 09:52 ------- The difference comes from the second VRP pass which concludes that c_76 is [1, +INF] from which it changes
# c_173 = PHI <0(7), c_76(12)> to # c_173 = PHI <0(7), 1(12)> which it concludes from c_76 = (Cell) D.156138_4; where Cell is enum Cell { Cell_0 }; so the only valid values for c_76 are 0 and 1. The problem is probably here (c is of type Cell): D.156112_62 = c_173 * 4; (D.156112 is unsigned int), where we obviously miss a cast in the IL. This is from inlining ciTypeFlow::StateVector::type_at which looks like ciType* ciTypeFlow::StateVector::type_at(ciTypeFlow::Cell) const (this, c) { struct ciType * D.144073; struct ciType * * D.144074; unsigned int D.144075; struct ciType * * D.144076; D.144074 = this->_types; D.144075 = c * 4; D.144076 = D.144074 + D.144075; D.144073 = *D.144076; return D.144073; } gimplified from return <retval> = *((struct ciType * *) ((const struct StateVector *) this)->_types + (unsigned int) ((unsigned int) c * 4)); which hints at that c probably has the same precision and signedness as unsigned int. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36917