This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug tree-optimization/36917] [4.3 regression] miscompilation with -O2 and r136501
- From: "rguenth at gcc dot gnu dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 24 Jul 2008 09:52:14 -0000
- Subject: [Bug tree-optimization/36917] [4.3 regression] miscompilation with -O2 and r136501
- References: <bug-36917-11764@http.gcc.gnu.org/bugzilla/>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- 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