aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-loop-distribution.c
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2012-09-19 08:59:06 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2012-09-19 08:59:06 +0000
commitf20132e7aefa8b3615154925559dd19f204c8eca (patch)
tree7f44b8ca0eade367dc7e06f3690a419c4745c5d5 /gcc/tree-loop-distribution.c
parentf7d0c571f76a47e432cecdc04d2d89dc734cd36a (diff)
downloadgcc-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.c33
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;