aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBin Cheng <bin.cheng@arm.com>2018-03-21 10:42:34 +0000
committerBin Cheng <amker@gcc.gnu.org>2018-03-21 10:42:34 +0000
commit49e4ca31396d129759ac1bfc2ffbd3f87aeb53cb (patch)
treef27f80a9a5e6fa1d78efcd4d2f2ecd95c36d9667
parent108b83c1fd97b06f1e99ffb5127f2c5b9623bb11 (diff)
downloadgcc-49e4ca31396d129759ac1bfc2ffbd3f87aeb53cb.zip
gcc-49e4ca31396d129759ac1bfc2ffbd3f87aeb53cb.tar.gz
gcc-49e4ca31396d129759ac1bfc2ffbd3f87aeb53cb.tar.bz2
re PR tree-optimization/84969 (Wrong code with -ftree-loop-distribute-patterns)
PR tree-optimization/84969 * tree-loop-distribution.c (fuse_memset_builtins): Don't reorder builtin memset partitions if they set different rhs values. gcc/testsuite * gcc.dg/tree-ssa/pr84969.c: New test. From-SVN: r258710
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr84969.c57
-rw-r--r--gcc/tree-loop-distribution.c11
4 files changed, 77 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1fd6490..1f48794 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2018-03-21 Bin Cheng <bin.cheng@arm.com>
+
+ PR tree-optimization/84969
+ * tree-loop-distribution.c (fuse_memset_builtins): Don't reorder
+ builtin memset partitions if they set different rhs values.
+
2018-03-21 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/84989
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 20e7dd9..3863758 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-03-21 Bin Cheng <bin.cheng@arm.com>
+
+ PR tree-optimization/84969
+ * gcc.dg/tree-ssa/pr84969.c: New test.
+
2018-03-21 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/84989
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr84969.c b/gcc/testsuite/gcc.dg/tree-ssa/pr84969.c
new file mode 100644
index 0000000..e15c3d9
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr84969.c
@@ -0,0 +1,57 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -ftree-loop-distribute-patterns" } */
+
+static void
+__attribute__((noipa, noinline))
+foo (char **values, int ndim, char *needquotes, int *dims)
+{
+ int i;
+ int j = 0;
+ int k = 0;
+ char *retval = (char *)__builtin_malloc(1000);
+ char *p = retval;
+ char *tmp;
+
+ int indx[111];
+
+#define APPENDSTR(str) (__builtin_strcpy(p, (str)), p += __builtin_strlen(p))
+#define APPENDCHAR(ch) (*p++ = (ch), *p = '\0')
+
+ APPENDCHAR('{');
+ for (i = 0; i < ndim; i++)
+ indx[i] = 0;
+ do
+ {
+ for (i = j; i < ndim - 1; i++)
+ APPENDCHAR('{');
+
+ APPENDSTR(values[k]);
+ k++;
+
+ for (i = ndim - 1; i >= 0; i--)
+ {
+ indx[i] = (indx[i] + 1) % dims[i];
+ if (indx[i])
+ {
+ APPENDCHAR(',');
+ break;
+ }
+ else
+ APPENDCHAR('}');
+ }
+ j = i;
+ } while (j != -1);
+
+ if (__builtin_strcmp (retval, "{{{0,1},{2,3}}}") != 0)
+ __builtin_abort ();
+}
+
+int main()
+{
+ char* array[4] = {"0", "1", "2", "3"};
+ char f[] = {0, 0, 0, 0, 0, 0, 0, 0};
+ int dims[] = {1, 2, 2};
+ foo (array, 3, f, dims);
+
+ return 0;
+}
diff --git a/gcc/tree-loop-distribution.c b/gcc/tree-loop-distribution.c
index 67f27ba..5e327f4 100644
--- a/gcc/tree-loop-distribution.c
+++ b/gcc/tree-loop-distribution.c
@@ -2569,6 +2569,7 @@ fuse_memset_builtins (vec<struct partition *> *partitions)
{
unsigned i, j;
struct partition *part1, *part2;
+ tree rhs1, rhs2;
for (i = 0; partitions->iterate (i, &part1);)
{
@@ -2586,6 +2587,12 @@ fuse_memset_builtins (vec<struct partition *> *partitions)
|| !operand_equal_p (part1->builtin->dst_base_base,
part2->builtin->dst_base_base, 0))
break;
+
+ /* Memset calls setting different values can't be merged. */
+ rhs1 = gimple_assign_rhs1 (DR_STMT (part1->builtin->dst_dr));
+ rhs2 = gimple_assign_rhs1 (DR_STMT (part2->builtin->dst_dr));
+ if (!operand_equal_p (rhs1, rhs2, 0))
+ break;
}
/* Stable sort is required in order to avoid breaking dependence. */
@@ -2617,8 +2624,8 @@ fuse_memset_builtins (vec<struct partition *> *partitions)
i++;
continue;
}
- tree rhs1 = gimple_assign_rhs1 (DR_STMT (part1->builtin->dst_dr));
- tree rhs2 = gimple_assign_rhs1 (DR_STMT (part2->builtin->dst_dr));
+ rhs1 = gimple_assign_rhs1 (DR_STMT (part1->builtin->dst_dr));
+ rhs2 = gimple_assign_rhs1 (DR_STMT (part2->builtin->dst_dr));
int bytev1 = const_with_all_bytes_same (rhs1);
int bytev2 = const_with_all_bytes_same (rhs2);
/* Only merge memset partitions of the same value. */