diff options
author | Sebastian Pop <sebastian.pop@amd.com> | 2011-02-05 01:39:20 +0000 |
---|---|---|
committer | Sebastian Pop <spop@gcc.gnu.org> | 2011-02-05 01:39:20 +0000 |
commit | a130584a8a599dcf1012930d93674aa31e5e2c67 (patch) | |
tree | 0eff927ab618b60dcc1968581ea3e2ef79b0a9eb /gcc/tree-data-ref.c | |
parent | a44b6422a324ad45dc9e84295e90ac79129afbeb (diff) | |
download | gcc-a130584a8a599dcf1012930d93674aa31e5e2c67.zip gcc-a130584a8a599dcf1012930d93674aa31e5e2c67.tar.gz gcc-a130584a8a599dcf1012930d93674aa31e5e2c67.tar.bz2 |
Fix PR46194: fix the computation of distance vectors.
2011-02-04 Sebastian Pop <sebastian.pop@amd.com>
PR tree-optimization/46194
* tree-data-ref.c (analyze_miv_subscript): Remove comment.
(build_classic_dist_vector_1): Do not represent classic distance
vectors when the access functions are variating in different loops.
* gcc.dg/autopar/pr46194.c: New.
From-SVN: r169847
Diffstat (limited to 'gcc/tree-data-ref.c')
-rw-r--r-- | gcc/tree-data-ref.c | 30 |
1 files changed, 6 insertions, 24 deletions
diff --git a/gcc/tree-data-ref.c b/gcc/tree-data-ref.c index 9e5df7d..54cb46c 100644 --- a/gcc/tree-data-ref.c +++ b/gcc/tree-data-ref.c @@ -2681,14 +2681,6 @@ analyze_miv_subscript (tree chrec_a, tree *last_conflicts, struct loop *loop_nest) { - /* FIXME: This is a MIV subscript, not yet handled. - Example: (A[{1, +, 1}_1] vs. A[{1, +, 1}_2]) that comes from - (A[i] vs. A[j]). - - In the SIV test we had to solve a Diophantine equation with two - variables. In the MIV case we have to solve a Diophantine - equation with 2*n variables (if the subscript uses n IVs). - */ tree type, difference; dependence_stats.num_miv++; @@ -2960,29 +2952,19 @@ build_classic_dist_vector_1 (struct data_dependence_relation *ddr, && TREE_CODE (access_fn_b) == POLYNOMIAL_CHREC) { int dist, index; - int index_a = index_in_loop_nest (CHREC_VARIABLE (access_fn_a), - DDR_LOOP_NEST (ddr)); - int index_b = index_in_loop_nest (CHREC_VARIABLE (access_fn_b), - DDR_LOOP_NEST (ddr)); - - /* The dependence is carried by the outermost loop. Example: - | loop_1 - | A[{4, +, 1}_1] - | loop_2 - | A[{5, +, 1}_2] - | endloop_2 - | endloop_1 - In this case, the dependence is carried by loop_1. */ - index = index_a < index_b ? index_a : index_b; - *index_carry = MIN (index, *index_carry); + int var_a = CHREC_VARIABLE (access_fn_a); + int var_b = CHREC_VARIABLE (access_fn_b); - if (chrec_contains_undetermined (SUB_DISTANCE (subscript))) + if (var_a != var_b + || chrec_contains_undetermined (SUB_DISTANCE (subscript))) { non_affine_dependence_relation (ddr); return false; } dist = int_cst_value (SUB_DISTANCE (subscript)); + index = index_in_loop_nest (var_a, DDR_LOOP_NEST (ddr)); + *index_carry = MIN (index, *index_carry); /* This is the subscript coupling test. If we have already recorded a distance for this loop (a distance coming from |