aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAlan Lawrence <alan.lawrence@arm.com>2016-03-11 12:08:01 +0000
committerAlan Lawrence <alalaw01@gcc.gnu.org>2016-03-11 12:08:01 +0000
commit5c6706f77e59f7af260c306392a17f6025a934b6 (patch)
tree170ca632f40e71d1ebad458681428fa6e0c55ba9 /gcc
parent686d390a8fc1c0f72122910844e86d4a412c4e34 (diff)
downloadgcc-5c6706f77e59f7af260c306392a17f6025a934b6.zip
gcc-5c6706f77e59f7af260c306392a17f6025a934b6.tar.gz
gcc-5c6706f77e59f7af260c306392a17f6025a934b6.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/sra-20.c20
-rw-r--r--gcc/tree-sra.c3
4 files changed, 32 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 09ea7f7..2014d7f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2016-03-11 Alan Lawrence <alan.lawrence@arm.com>
+
+ PR tree-optimization/70013
+ * tree-sra.c (analyze_access_subtree): Also set grp_unscalarized_data
+ for constant-pool entries.
+
2016-03-11 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/70174
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a1035ef..a945aa2 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2016-03-11 Alan Lawrence <alan.lawrence@arm.com>
+
+ * gcc.dg/tree-ssa/sra-20.c: New.
+
2016-03-11 Jakub Jelinek <jakub@redhat.com>
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 0000000..5002c24
--- /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 06c39c3..a3fb59c 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;
}