[Bug target/71280] [7 Regression] ICE on gcc trunk on knl, wsm, ivb and bdw targets
jakub at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Wed May 25 19:04:00 GMT 2016
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71280
Jakub Jelinek <jakub at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |hubicka at gcc dot gnu.org
--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
C testcase:
extern char v[];
int
foo ()
{
int k = 0;
typedef char T[64];
for (int i = 0; i < 64; i++)
k += (*(T *) &v[0])[i];
return k;
}
The bug is in the new
&& (!size || operand_equal_p (DECL_SIZE (ref), size, 0))
We have non-NULL size, but NULL DECL_SIZE (ref).
The question is what do we want to return in that case, before Honza's change
we would just return true, so perhaps we should as well.
E.g.
--- gcc/tree.c.jj 2016-05-22 12:20:38.000000000 +0200
+++ gcc/tree.c 2016-05-25 20:13:54.702338249 +0200
@@ -13079,7 +13079,9 @@ array_at_struct_end_p (tree ref)
tree size = NULL;
if (TREE_CODE (ref) == MEM_REF
- && TREE_CODE (TREE_OPERAND (ref, 0)) == ADDR_EXPR)
+ && TREE_CODE (TREE_OPERAND (ref, 0)) == ADDR_EXPR
+ && DECL_P (TREE_OPERAND (TREE_OPERAND (ref, 0), 0))
+ && DECL_SIZE (TREE_OPERAND (TREE_OPERAND (ref, 0), 0)))
{
size = TYPE_SIZE (TREE_TYPE (ref));
ref = TREE_OPERAND (TREE_OPERAND (ref, 0), 0);
fixes the ICE.
More information about the Gcc-bugs
mailing list