diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/pr70602.c | 23 | ||||
-rw-r--r-- | gcc/tree-sra.c | 3 |
4 files changed, 35 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index edd3304..62c8372 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ 2016-04-12 Jakub Jelinek <jakub@redhat.com> + 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 aa5c77c..7aaee6e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-04-12 Jakub Jelinek <jakub@redhat.com> + + PR tree-optimization/70602 + * gcc.c-torture/execute/pr70602.c: New test. + 2016-04-11 Michael Meissner <meissner@linux.vnet.ibm.com> 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 0000000..c6628b0 --- /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 738c1a7..1d2b1c5 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) |