diff options
author | Richard Biener <rguenther@suse.de> | 2016-11-16 08:42:20 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2016-11-16 08:42:20 +0000 |
commit | 510d73a0350e946becdf316b130a7197809124f6 (patch) | |
tree | 76050ac73f5409a11f1f258016acdc03026af8ac /gcc/tree-loop-distribution.c | |
parent | 1705cebd79f24bc85dab766a9a26390827f26fa0 (diff) | |
download | gcc-510d73a0350e946becdf316b130a7197809124f6.zip gcc-510d73a0350e946becdf316b130a7197809124f6.tar.gz gcc-510d73a0350e946becdf316b130a7197809124f6.tar.bz2 |
re PR tree-optimization/78348 ([7 REGRESSION] 15% performance drop for coremark-pro/nnet-test after r242038)
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
Diffstat (limited to 'gcc/tree-loop-distribution.c')
-rw-r--r-- | gcc/tree-loop-distribution.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/gcc/tree-loop-distribution.c b/gcc/tree-loop-distribution.c index 902cf30..aabc11a 100644 --- a/gcc/tree-loop-distribution.c +++ b/gcc/tree-loop-distribution.c @@ -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; |