aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2017-11-13 10:01:24 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2017-11-13 10:01:24 +0100
commit5bfd2f9bc61af31a8ada151a6e841b10e37b302c (patch)
tree37ec1d953b7f19bd47f03e1a91fd708518205b53 /gcc
parent441b4d0fa20992086704ebf013a4f8c3a41c96b0 (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/gimple-ssa-store-merging.c10
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pr82954.c22
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;
+}