From: Richard Biener Date: Wed, 16 Nov 2016 08:42:20 +0000 (+0000) Subject: re PR tree-optimization/78348 ([7 REGRESSION] 15% performance drop for coremark-pro... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=510d73a0350e946becdf316b130a7197809124f6;p=gcc.git re PR tree-optimization/78348 ([7 REGRESSION] 15% performance drop for coremark-pro/nnet-test after r242038) 2016-11-16 Richard Biener 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d54016fdcdb..3f6f3ce9587 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2016-11-16 Richard Biener + + 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 PR sanitizer/77823 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2192d5a702a..3da84c6a804 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-11-16 Richard Biener + + PR tree-optimization/78348 + * gcc.dg/tree-ssa/ldist-24.c: New testcase. + 2016-11-16 Jakub Jelinek 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 index 00000000000..7ab79e659e1 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ldist-24.c @@ -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" } } */ diff --git a/gcc/tree-loop-distribution.c b/gcc/tree-loop-distribution.c index 902cf30b78a..aabc11ab25c 100644 --- a/gcc/tree-loop-distribution.c +++ b/gcc/tree-loop-distribution.c @@ -466,7 +466,7 @@ build_rdg (vec 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;