From 9a4cb9733db86b7be143a2b8ab7d03406e025a5d Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Tue, 19 Jul 2016 10:18:25 +0000 Subject: [PATCH] re PR tree-optimization/71908 (ICE at -Os and above in both 32-bit and 64-bit modes on x86_64-linux-gnu (get_constraint_for_component_ref)) 2016-07-18 Richard Biener PR tree-optimization/71908 * tree-ssa-structalias.c (get_constraint_for_component_ref): Handle symbolic constants in a more reliable way. * gcc.dg/torture/pr71908.c: New testcase. From-SVN: r238467 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/torture/pr71908.c | 26 ++++++++++++++++++++++++++ gcc/tree-ssa-structalias.c | 18 ++++++++++++++++-- 4 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr71908.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 43890647f3b..1c57adc9543 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-07-18 Richard Biener + + PR tree-optimization/71908 + * tree-ssa-structalias.c (get_constraint_for_component_ref): Handle + symbolic constants in a more reliable way. + 2016-07-19 Ilya Enkovich * tree-vect-loop-manip.c (vect_update_ivs_after_vectorizer): Update diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2dd59609bdd..d0a3fcb3764 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-07-18 Richard Biener + + PR tree-optimization/71908 + * gcc.dg/torture/pr71908.c: New testcase. + 2016-07-18 Michael Meissner PR target/71493 diff --git a/gcc/testsuite/gcc.dg/torture/pr71908.c b/gcc/testsuite/gcc.dg/torture/pr71908.c new file mode 100644 index 00000000000..95d8748ac9e --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr71908.c @@ -0,0 +1,26 @@ +/* { dg-do compile } */ + +struct S3 +{ + int f3; + int f5; + char f6; + int f7; +} b; +int a; +static struct S3 *c = &b; +int *d; +int main() +{ + int i; + for (;;) { + a = 0; + int **e = &d; + i = 0; + for (; i < 2; i++) + d = &(*c).f5; + *e = d; + **e = 3; + } + return 0; +} diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c index 5e3c7d094b5..a96fcabf270 100644 --- a/gcc/tree-ssa-structalias.c +++ b/gcc/tree-ssa-structalias.c @@ -3211,6 +3211,20 @@ get_constraint_for_component_ref (tree t, vec *results, t = get_ref_base_and_extent (t, &bitpos, &bitsize, &bitmaxsize, &reverse); + /* We can end up here for component references on a + VIEW_CONVERT_EXPR <>(&foobar) or things like a + BIT_FIELD_REF <&MEM[(void *)&b + 4B], ...>. So for + symbolic constants simply give up. */ + if (TREE_CODE (t) == ADDR_EXPR) + { + constraint_expr result; + result.type = SCALAR; + result.var = anything_id; + result.offset = 0; + results->safe_push (result); + return; + } + /* Pretend to take the address of the base, we'll take care of adding the required subset of sub-fields below. */ get_constraint_for_1 (t, results, true, lhs_p); @@ -3300,8 +3314,8 @@ get_constraint_for_component_ref (tree t, vec *results, } else if (result.type == ADDRESSOF) { - /* We can end up here for component references on a - VIEW_CONVERT_EXPR <>(&foobar). */ + /* We can end up here for component references on constants like + VIEW_CONVERT_EXPR <>({ 0, 1, 2, 3 })[i]. */ result.type = SCALAR; result.var = anything_id; result.offset = 0; -- 2.30.2