https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119706
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|NEW |ASSIGNED
Assignee|unassigned at gcc dot gnu.org |rguenth at gcc dot
gnu.org
--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
Confirmed. We have a POLY_INT_CST in the base address of a TARGET_MEM_REF:
MEM <vector([2,2]) double> [(double *)POLY_INT_CST [16B, 16B] + ivtmp_97 * 8]
but is_gimple_mem_ref_addr only allows:
bool
is_gimple_mem_ref_addr (tree t)
{
return (is_gimple_reg (t)
|| TREE_CODE (t) == INTEGER_CST
|| (TREE_CODE (t) == ADDR_EXPR
&& (CONSTANT_CLASS_P (TREE_OPERAND (t, 0))
|| decl_address_invariant_p (TREE_OPERAND (t, 0)))));
}
A POLY_INT_CST "base" is a bit odd, GIMPLE IL verification would also
reject this but it could trivially happen via constant propagation
from
_1 = POLY_INT_CST [16B, 16B];
MEM [_1 + ivtmp_97 * 8] = ...
as it does here indirectly, after jump threading:
LKUP STMT _57 = POLY_INT_CST [16B, 16B]
==== ASGN _57 = POLY_INT_CST [16B, 16B]
Optimizing statement MEM <vector([2,2]) double> [(double *)_57 + ivtmp_97 * 8]
= vect__26.60_90;
Replaced '_57' with constant 'POLY_INT_CST [16B, 16B]'