re PR tree-optimization/84969 (Wrong code with -ftree-loop-distribute-patterns)
authorBin Cheng <bin.cheng@arm.com>
Wed, 21 Mar 2018 10:42:34 +0000 (10:42 +0000)
committerBin Cheng <amker@gcc.gnu.org>
Wed, 21 Mar 2018 10:42:34 +0000 (10:42 +0000)
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
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/pr84969.c [new file with mode: 0644]
gcc/tree-loop-distribution.c

index 1fd6490bdc5b03cb7d4074b5594b57c7f6155f33..1f48794ee74c031a68770a8b884f8293e984f65b 100644 (file)
@@ -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
index 20e7dd9f2a06de11c3761732b013efd6780b5fec..3863758aeb59070d2f52c573997eedda24f5d79a 100644 (file)
@@ -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 (file)
index 0000000..e15c3d9
--- /dev/null
@@ -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;
+}
index 67f27bad83cf30d694676476a7efde7a5da4d9e8..5e327f4bfd8e0f660a6400d4a7da809a48f9fe4f 100644 (file)
@@ -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.  */