From 5c6706f77e59f7af260c306392a17f6025a934b6 Mon Sep 17 00:00:00 2001 From: Alan Lawrence Date: Fri, 11 Mar 2016 12:08:01 +0000 Subject: [PATCH] Fix PR/70013 gcc: PR tree-optimization/70013 * tree-sra.c (analyze_access_subtree): Also set grp_unscalarized_data for constant-pool entries. gcc/testsuite: * gcc.dg/tree-ssa/sra-20.c: New. From-SVN: r234138 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.dg/tree-ssa/sra-20.c | 20 ++++++++++++++++++++ gcc/tree-sra.c | 3 ++- 4 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/sra-20.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 09ea7f7bd7a..2014d7f4c37 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-03-11 Alan Lawrence + + PR tree-optimization/70013 + * tree-sra.c (analyze_access_subtree): Also set grp_unscalarized_data + for constant-pool entries. + 2016-03-11 Jakub Jelinek PR rtl-optimization/70174 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a1035ef7a46..a945aa2ed5e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2016-03-11 Alan Lawrence + + * gcc.dg/tree-ssa/sra-20.c: New. + 2016-03-11 Jakub Jelinek PR rtl-optimization/70174 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/sra-20.c b/gcc/testsuite/gcc.dg/tree-ssa/sra-20.c new file mode 100644 index 00000000000..5002c247575 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/sra-20.c @@ -0,0 +1,20 @@ +/* { dg-do compile } */ +/* { dg-options "-O1 -Wall" } */ +/* PR/70013, SRA of constant-pool loads removes initialization of part of d. */ +#pragma pack (1) +struct S0 { + unsigned f0 : 17; +}; + +int c; + +int +main (int argc, char **argv) +{ + struct S0 d[] = { { 1 }, { 2 } }; + struct S0 e = d[1]; + + c = d[0].f0; + __builtin_printf ("%x\n", e.f0); + return 0; +} diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index 06c39c3de76..a3fb59ce5a4 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -2427,7 +2427,8 @@ analyze_access_subtree (struct access *root, struct access *parent, if (!hole || root->grp_total_scalarization) root->grp_covered = 1; - else if (root->grp_write || TREE_CODE (root->base) == PARM_DECL) + else if (root->grp_write || TREE_CODE (root->base) == PARM_DECL + || constant_decl_p (root->base)) root->grp_unscalarized_data = 1; /* not covered and written to */ return sth_created; } -- 2.30.2