http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60546
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |RESOLVED
Resolution|--- |INVALID
--- Comment #7 from Richard Biener <rguenth at gcc dot gnu.org> ---
Looks like TBAA violations to me:
struct QualifiedNameComponents c;
short unsigned int _316;
short unsigned int _317;
<bb 53>:
# data_157 = PHI <data_329(53), &c(52)>
_316 = MEM[base: data_157, offset: 2B];
_317 = MEM[base: data_157, offset: 0B];
... hashing ...
data_329 = data_157 + 4;
if (data_329 != &MEM[(void *)&c + 12B])
goto <bb 53>;
else
goto <bb 54>;
so you hash the QualifiedNameComponents pointers, not its strings. And
you do it by reading the pointers as 'unsigned short'. Probably via
template<size_t length> static inline unsigned hashMemory(const void* data)
{
typedef int dummylength_must_be_a_multible_of_four [(!(length % 4)) ? 1
: -1];
return computeHash<UChar>(static_cast<const UChar*>(data), length /
sizeof(UChar));
}
which introduces the violation. It should not use 'short' hashing but
hashing of 'char'.