From 49e4ca31396d129759ac1bfc2ffbd3f87aeb53cb Mon Sep 17 00:00:00 2001 From: Bin Cheng Date: Wed, 21 Mar 2018 10:42:34 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 6 ++++ gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/gcc.dg/tree-ssa/pr84969.c | 57 +++++++++++++++++++++++++++++++++ gcc/tree-loop-distribution.c | 11 +++++-- 4 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr84969.c 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 + + 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 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 + + PR tree-optimization/84969 + * gcc.dg/tree-ssa/pr84969.c: New test. + 2018-03-21 Jakub Jelinek 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 *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 *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 *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. */ -- 2.7.4