Commit 49e4ca31 by Bin Cheng Committed by Bin Cheng

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
parent 108b83c1
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> 2018-03-21 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/84989 PR rtl-optimization/84989
......
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> 2018-03-21 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/84989 PR rtl-optimization/84989
......
/* { 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;
}
...@@ -2569,6 +2569,7 @@ fuse_memset_builtins (vec<struct partition *> *partitions) ...@@ -2569,6 +2569,7 @@ fuse_memset_builtins (vec<struct partition *> *partitions)
{ {
unsigned i, j; unsigned i, j;
struct partition *part1, *part2; struct partition *part1, *part2;
tree rhs1, rhs2;
for (i = 0; partitions->iterate (i, &part1);) for (i = 0; partitions->iterate (i, &part1);)
{ {
...@@ -2586,6 +2587,12 @@ fuse_memset_builtins (vec<struct partition *> *partitions) ...@@ -2586,6 +2587,12 @@ fuse_memset_builtins (vec<struct partition *> *partitions)
|| !operand_equal_p (part1->builtin->dst_base_base, || !operand_equal_p (part1->builtin->dst_base_base,
part2->builtin->dst_base_base, 0)) part2->builtin->dst_base_base, 0))
break; 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. */ /* Stable sort is required in order to avoid breaking dependence. */
...@@ -2617,8 +2624,8 @@ fuse_memset_builtins (vec<struct partition *> *partitions) ...@@ -2617,8 +2624,8 @@ fuse_memset_builtins (vec<struct partition *> *partitions)
i++; i++;
continue; continue;
} }
tree rhs1 = gimple_assign_rhs1 (DR_STMT (part1->builtin->dst_dr)); rhs1 = gimple_assign_rhs1 (DR_STMT (part1->builtin->dst_dr));
tree rhs2 = gimple_assign_rhs1 (DR_STMT (part2->builtin->dst_dr)); rhs2 = gimple_assign_rhs1 (DR_STMT (part2->builtin->dst_dr));
int bytev1 = const_with_all_bytes_same (rhs1); int bytev1 = const_with_all_bytes_same (rhs1);
int bytev2 = const_with_all_bytes_same (rhs2); int bytev2 = const_with_all_bytes_same (rhs2);
/* Only merge memset partitions of the same value. */ /* Only merge memset partitions of the same value. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment