From f1e344ed754edda1085dfeecca07680119f3a67c Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 20 Oct 2010 23:17:30 +0200 Subject: [PATCH] re PR tree-optimization/45919 (ICE: SIGSEGV in fold_ctor_reference (tree-ssa-ccp.c:1527) at -O1) PR tree-optimization/45919 * tree-ssa-ccp.c (fold_nonarray_ctor_reference): Handle flexible array members. * gcc.c-torture/compile/pr45919.c: New test. From-SVN: r165740 --- gcc/ChangeLog | 4 ++++ gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/gcc.c-torture/compile/pr45919.c | 9 +++++++++ gcc/tree-ssa-ccp.c | 19 +++++++++++++------ 4 files changed, 29 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr45919.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 352be15761a..5fc321d012d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ 2010-10-20 Jakub Jelinek + PR tree-optimization/45919 + * tree-ssa-ccp.c (fold_nonarray_ctor_reference): Handle flexible + array members. + PR tree-optimization/46066 * tree-parloops.c (create_parallel_loop): Use gsi_last_nondebug_bb instead of gsi_last_bb. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 665f8a5df4a..5abf927bf9a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2010-10-20 Jakub Jelinek + PR tree-optimization/45919 + * gcc.c-torture/compile/pr45919.c: New test. + PR tree-optimization/46066 * gcc.dg/autopar/pr46066.c: New test. diff --git a/gcc/testsuite/gcc.c-torture/compile/pr45919.c b/gcc/testsuite/gcc.c-torture/compile/pr45919.c new file mode 100644 index 00000000000..caf518db041 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr45919.c @@ -0,0 +1,9 @@ +/* PR tree-optimization/45919 */ + +const struct S { int a; int b[]; } s = { 0, { 0 }}; + +int +foo (void) +{ + return s.b[0]; +} diff --git a/gcc/tree-ssa-ccp.c b/gcc/tree-ssa-ccp.c index 650494144cd..2d9c1233ea9 100644 --- a/gcc/tree-ssa-ccp.c +++ b/gcc/tree-ssa-ccp.c @@ -1523,23 +1523,30 @@ fold_nonarray_ctor_reference (tree type, tree ctor, double_int bits_per_unit_cst = uhwi_to_double_int (BITS_PER_UNIT); double_int bitoffset_end; - /* Variable sized objects in static constructors makes no sense. */ + /* Variable sized objects in static constructors makes no sense, + but field_size can be NULL for flexible array members. */ gcc_assert (TREE_CODE (field_offset) == INTEGER_CST && TREE_CODE (byte_offset) == INTEGER_CST - && TREE_CODE (field_size) == INTEGER_CST); + && (field_size != NULL_TREE + ? TREE_CODE (field_size) == INTEGER_CST + : TREE_CODE (TREE_TYPE (cfield)) == ARRAY_TYPE)); /* Compute bit offset of the field. */ bitoffset = double_int_add (tree_to_double_int (field_offset), double_int_mul (byte_offset_cst, bits_per_unit_cst)); /* Compute bit offset where the field ends. */ - bitoffset_end = double_int_add (bitoffset, - tree_to_double_int (field_size)); + if (field_size != NULL_TREE) + bitoffset_end = double_int_add (bitoffset, + tree_to_double_int (field_size)); + else + bitoffset_end = double_int_zero; /* Is OFFSET in the range (BITOFFSET, BITOFFSET_END)? */ if (double_int_cmp (uhwi_to_double_int (offset), bitoffset, 0) >= 0 - && double_int_cmp (uhwi_to_double_int (offset), - bitoffset_end, 0) < 0) + && (field_size == NULL_TREE + || double_int_cmp (uhwi_to_double_int (offset), + bitoffset_end, 0) < 0)) { double_int access_end = double_int_add (uhwi_to_double_int (offset), uhwi_to_double_int (size)); -- 2.30.2