https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93982
--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
bool is_char_store = is_char_type (type);
if (!is_char_store && TREE_CODE (lhs) == MEM_REF)
{
/* To consider stores into char objects via integer types
other than char but not those to non-character objects,
determine the type of the destination rather than just
the type of the access. */
for (int i = 0; i != 2; ++i)
{
tree ref = TREE_OPERAND (lhs, i);
type = TREE_TYPE (ref);
if (TREE_CODE (type) == POINTER_TYPE)
type = TREE_TYPE (type);
if (TREE_CODE (type) == ARRAY_TYPE)
type = TREE_TYPE (type);
if (is_char_type (type))
{
is_char_store = true;
break;
}
}
}
is completely bogus. With pointer conversions being useless, the type of the
MEM_REF's first operand means nothing at all and the type of second MEM_REF
operand is for alias analysis, again nothing that should matter for how the
strlen pass optimizes code.