diff options
author | Jakub Jelinek <jakub@redhat.com> | 2017-11-13 10:01:24 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2017-11-13 10:01:24 +0100 |
commit | 5bfd2f9bc61af31a8ada151a6e841b10e37b302c (patch) | |
tree | 37ec1d953b7f19bd47f03e1a91fd708518205b53 /gcc | |
parent | 441b4d0fa20992086704ebf013a4f8c3a41c96b0 (diff) | |
download | gcc-5bfd2f9bc61af31a8ada151a6e841b10e37b302c.zip gcc-5bfd2f9bc61af31a8ada151a6e841b10e37b302c.tar.gz gcc-5bfd2f9bc61af31a8ada151a6e841b10e37b302c.tar.bz2 |
re PR tree-optimization/82954 (ICE in fold_binary_loc, at fold-const.c:9061)
PR tree-optimization/82954
* gimple-ssa-store-merging.c
(imm_store_chain_info::coalesce_immediate_stores): If
!infof->ops[N].base_addr, split group if info->ops[N].base_addr.
* gcc.c-torture/execute/pr82954.c: New test.
From-SVN: r254671
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/gimple-ssa-store-merging.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/pr82954.c | 22 |
4 files changed, 40 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dce8e02..293f584 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2017-11-13 Jakub Jelinek <jakub@redhat.com> + + PR tree-optimization/82954 + * gimple-ssa-store-merging.c + (imm_store_chain_info::coalesce_immediate_stores): If + !infof->ops[N].base_addr, split group if info->ops[N].base_addr. + 2017-11-13 Richard Sandiford <richard.sandiford@linaro.org> * config/aarch64/aarch64-simd.md (aarch64_store_lane0<mode>): diff --git a/gcc/gimple-ssa-store-merging.c b/gcc/gimple-ssa-store-merging.c index 40f7c98..54cb86e 100644 --- a/gcc/gimple-ssa-store-merging.c +++ b/gcc/gimple-ssa-store-merging.c @@ -1198,10 +1198,12 @@ imm_store_chain_info::coalesce_immediate_stores () std::swap (info->ops[0], info->ops[1]); info->ops_swapped_p = true; } - if ((!infof->ops[0].base_addr - || compatible_load_p (merged_store, info, base_addr, 0)) - && (!infof->ops[1].base_addr - || compatible_load_p (merged_store, info, base_addr, 1))) + if ((infof->ops[0].base_addr + ? compatible_load_p (merged_store, info, base_addr, 0) + : !info->ops[0].base_addr) + && (infof->ops[1].base_addr + ? compatible_load_p (merged_store, info, base_addr, 1) + : !info->ops[1].base_addr)) { merged_store->merge_into (info); continue; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4c73957..fc943c1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-11-13 Jakub Jelinek <jakub@redhat.com> + + PR tree-optimization/82954 + * gcc.c-torture/execute/pr82954.c: New test. + 2017-11-11 Janus Weil <janus@gcc.gnu.org> PR fortran/82932 diff --git a/gcc/testsuite/gcc.c-torture/execute/pr82954.c b/gcc/testsuite/gcc.c-torture/execute/pr82954.c new file mode 100644 index 0000000..5ced2854 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr82954.c @@ -0,0 +1,22 @@ +/* PR tree-optimization/82954 */ + +__attribute__((noipa)) void +foo (int *__restrict p, int *__restrict q) +{ + p[0] = p[0] ^ 1; + p[1] = p[1] ^ 2; + p[2] = p[2] ^ q[2]; + p[3] = p[3] ^ q[3]; +} + +int +main () +{ + int p[4] = { 16, 32, 64, 128 }; + int q[4] = { 8, 4, 2, 1 }; + asm volatile ("" : : "g" (p), "g" (q) : "memory"); + foo (p, q); + if (p[0] != 17 || p[1] != 34 || p[2] != 66 || p[3] != 129) + __builtin_abort (); + return 0; +} |