+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
+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
--- /dev/null
+/* { 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;
+}
{
unsigned i, j;
struct partition *part1, *part2;
+ tree rhs1, rhs2;
for (i = 0; partitions->iterate (i, &part1);)
{
|| !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. */
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. */