diff options
author | Richard Guenther <rguenther@suse.de> | 2012-09-19 08:59:06 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2012-09-19 08:59:06 +0000 |
commit | f20132e7aefa8b3615154925559dd19f204c8eca (patch) | |
tree | 7f44b8ca0eade367dc7e06f3690a419c4745c5d5 /gcc/tree-loop-distribution.c | |
parent | f7d0c571f76a47e432cecdc04d2d89dc734cd36a (diff) | |
download | gcc-f20132e7aefa8b3615154925559dd19f204c8eca.zip gcc-f20132e7aefa8b3615154925559dd19f204c8eca.tar.gz gcc-f20132e7aefa8b3615154925559dd19f204c8eca.tar.bz2 |
re PR tree-optimization/54132 (Incorrect loop transformation with -ftree-loop-distribute-patterns)
2012-09-19 Richard Guenther <rguenther@suse.de>
PR tree-optimization/54132
* tree-loop-distribution.c (classify_partition): Properly
check dependences for memmove.
* tree-data-ref.h (compute_affine_dependence): Declare.
* tree-data-ref.c (compute_affine_dependence): Export.
* gcc.dg/tree-ssa/ldist-21.c: New testcase.
* gcc.dg/torture/pr54132.c: Likewise.
From-SVN: r191463
Diffstat (limited to 'gcc/tree-loop-distribution.c')
-rw-r--r-- | gcc/tree-loop-distribution.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/gcc/tree-loop-distribution.c b/gcc/tree-loop-distribution.c index f340eab..b24af33 100644 --- a/gcc/tree-loop-distribution.c +++ b/gcc/tree-loop-distribution.c @@ -1011,6 +1011,39 @@ classify_partition (loop_p loop, struct graph *rdg, partition_t partition) || !operand_equal_p (DR_STEP (single_store), DR_STEP (single_load), 0)) return; + /* Now check that if there is a dependence this dependence is + of a suitable form for memmove. */ + VEC(loop_p, heap) *loops = NULL; + ddr_p ddr; + VEC_safe_push (loop_p, heap, loops, loop); + ddr = initialize_data_dependence_relation (single_load, single_store, + loops); + compute_affine_dependence (ddr, loop); + VEC_free (loop_p, heap, loops); + if (DDR_ARE_DEPENDENT (ddr) == chrec_dont_know) + { + free_dependence_relation (ddr); + return; + } + if (DDR_ARE_DEPENDENT (ddr) != chrec_known) + { + if (DDR_NUM_DIST_VECTS (ddr) == 0) + { + free_dependence_relation (ddr); + return; + } + lambda_vector dist_v; + FOR_EACH_VEC_ELT (lambda_vector, DDR_DIST_VECTS (ddr), i, dist_v) + { + int dist = dist_v[index_in_loop_nest (loop->num, + DDR_LOOP_NEST (ddr))]; + if (dist > 0 && !DDR_REVERSED_P (ddr)) + { + free_dependence_relation (ddr); + return; + } + } + } partition->kind = PKIND_MEMCPY; partition->main_dr = single_store; partition->secondary_dr = single_load; |