From 4e0eea7560fdb90cbe3ee20eadbac0325d6e4e31 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 12 Apr 2016 11:08:43 +0200 Subject: [PATCH] re PR tree-optimization/70602 (wrong code at -O1 and above on x86_64-linux-gnu in 32-bit mode (and at -Os only in 64-bit mode)) PR tree-optimization/70602 * tree-sra.c (generate_subtree_copies): Don't write anything into constant pool decls. * gcc.c-torture/execute/pr70602.c: New test. From-SVN: r234895 --- gcc/ChangeLog | 4 ++++ gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gcc.c-torture/execute/pr70602.c | 23 +++++++++++++++++++ gcc/tree-sra.c | 3 +++ 4 files changed, 35 insertions(+) create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr70602.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index edd33043879a..62c837239b69 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ 2016-04-12 Jakub Jelinek + PR tree-optimization/70602 + * tree-sra.c (generate_subtree_copies): Don't write anything into + constant pool decls. + * omp-low.c (lower_omp_target): Use GOMP_MAP_FIRSTPRIVATE_INT regardless whether there are depend clauses or not. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index aa5c77c6bc66..7aaee6ed0086 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-04-12 Jakub Jelinek + + PR tree-optimization/70602 + * gcc.c-torture/execute/pr70602.c: New test. + 2016-04-11 Michael Meissner PR target/70381 diff --git a/gcc/testsuite/gcc.c-torture/execute/pr70602.c b/gcc/testsuite/gcc.c-torture/execute/pr70602.c new file mode 100644 index 000000000000..c6628b037b2e --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr70602.c @@ -0,0 +1,23 @@ +/* PR tree-optimization/70602 */ + +struct __attribute__((packed)) S +{ + int s : 1; + int t : 20; +}; + +int a, b, c; + +int +main () +{ + for (; a < 1; a++) + { + struct S e[] = { {0, 9}, {0, 9}, {0, 9}, {0, 0}, {0, 9}, {0, 9}, {0, 9}, + {0, 0}, {0, 9}, {0, 9}, {0, 9}, {0, 0}, {0, 9}, {0, 9}, + {0, 9}, {0, 0}, {0, 9}, {0, 9}, {0, 9}, {0, 0}, {0, 9} }; + b = b || e[0].s; + c = e[0].t; + } + return 0; +} diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index 738c1a77bda5..1d2b1c5ad050 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -2743,6 +2743,9 @@ generate_subtree_copies (struct access *access, tree agg, gimple_stmt_iterator *gsi, bool write, bool insert_after, location_t loc) { + /* Never write anything into constant pool decls. See PR70602. */ + if (!write && constant_decl_p (agg)) + return; do { if (chunk_size && access->offset >= start_offset + chunk_size)