]> gcc.gnu.org Git - gcc.git/commitdiff
re PR tree-optimization/78348 ([7 REGRESSION] 15% performance drop for coremark-pro...
authorRichard Biener <rguenther@suse.de>
Wed, 16 Nov 2016 08:42:20 +0000 (08:42 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 16 Nov 2016 08:42:20 +0000 (08:42 +0000)
2016-11-16  Richard Biener  <rguenther@suse.de>

PR tree-optimization/78348
* tree-loop-distribution.c (enum partition_kind): Add PKIND_MEMMOVE.
(generate_memcpy_builtin): Honor PKIND_MEMCPY on the partition.
(classify_partition): Set PKIND_MEMCPY if dependence analysis
revealed no dependency, PKIND_MEMMOVE otherwise.

* gcc.dg/tree-ssa/ldist-24.c: New testcase.

From-SVN: r242470

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/ldist-24.c [new file with mode: 0644]
gcc/tree-loop-distribution.c

index d54016fdcdb2479c670b2a81e99c8d09298a1121..3f6f3ce958787725a4711fe1096767f5493b54c7 100644 (file)
@@ -1,3 +1,11 @@
+2016-11-16  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/78348
+       * tree-loop-distribution.c (enum partition_kind): Add PKIND_MEMMOVE.
+       (generate_memcpy_builtin): Honor PKIND_MEMCPY on the partition.
+       (classify_partition): Set PKIND_MEMCPY if dependence analysis
+       revealed no dependency, PKIND_MEMMOVE otherwise.
+
 2016-11-16  Jakub Jelinek  <jakub@redhat.com>
 
        PR sanitizer/77823
index 2192d5a702a055ec76b534b81d3694cc49692962..3da84c6a80451f3aa749d894061460fad4d6568a 100644 (file)
@@ -1,3 +1,8 @@
+2016-11-16  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/78348
+       * gcc.dg/tree-ssa/ldist-24.c: New testcase.
+
 2016-11-16  Jakub Jelinek  <jakub@redhat.com>
 
        PR sanitizer/77823
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ldist-24.c b/gcc/testsuite/gcc.dg/tree-ssa/ldist-24.c
new file mode 100644 (file)
index 0000000..7ab79e6
--- /dev/null
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -fdump-tree-ldist-details" } */
+
+typedef struct S {
+    double z[8][25];
+    double x1[8][40];
+    double x2[8][40];
+    double y[8][35];
+} S;
+
+S * par;
+void foo ()
+{
+  int i, j;
+  for (i = 0; i<8; i++)
+    for (j = 0; j<35; j++)
+      {
+       par->x1[i][j] = par->x2[i][j];
+       par->x2[i][j] = 0.0;
+      }
+}
+
+/* { dg-final { scan-tree-dump "generated memcpy" "ldist" } } */
+/* { dg-final { scan-tree-dump "generated memset zero" "ldist" } } */
index 902cf30b78a25a17b62b4aff391b4f0cc8b9f0e1..aabc11ab25c63402858851e81c1d5f307cacf527 100644 (file)
@@ -466,7 +466,7 @@ build_rdg (vec<loop_p> loop_nest, control_dependences *cd)
 
 
 enum partition_kind {
-    PKIND_NORMAL, PKIND_MEMSET, PKIND_MEMCPY
+    PKIND_NORMAL, PKIND_MEMSET, PKIND_MEMCPY, PKIND_MEMMOVE
 };
 
 struct partition
@@ -875,10 +875,11 @@ generate_memcpy_builtin (struct loop *loop, partition *partition)
                                       false, GSI_CONTINUE_LINKING);
   dest = build_addr_arg_loc (loc, partition->main_dr, nb_bytes);
   src = build_addr_arg_loc (loc, partition->secondary_dr, nb_bytes);
-  if (ptr_derefs_may_alias_p (dest, src))
-    kind = BUILT_IN_MEMMOVE;
-  else
+  if (partition->kind == PKIND_MEMCPY
+      || ! ptr_derefs_may_alias_p (dest, src))
     kind = BUILT_IN_MEMCPY;
+  else
+    kind = BUILT_IN_MEMMOVE;
 
   dest = force_gimple_operand_gsi (&gsi, dest, true, NULL_TREE,
                                   false, GSI_CONTINUE_LINKING);
@@ -970,6 +971,7 @@ generate_code_for_partition (struct loop *loop,
       break;
 
     case PKIND_MEMCPY:
+    case PKIND_MEMMOVE:
       generate_memcpy_builtin (loop, partition);
       break;
 
@@ -1166,10 +1168,12 @@ classify_partition (loop_p loop, struct graph *rdg, partition *partition)
                  return;
                }
            }
+         partition->kind = PKIND_MEMMOVE;
        }
+      else
+       partition->kind = PKIND_MEMCPY;
       free_dependence_relation (ddr);
       loops.release ();
-      partition->kind = PKIND_MEMCPY;
       partition->main_dr = single_store;
       partition->secondary_dr = single_load;
       partition->niter = nb_iter;
This page took 0.118578 seconds and 5 git commands to generate.