aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-data-ref.c
diff options
context:
space:
mode:
authorZdenek Dvorak <dvorakz@suse.cz>2007-04-11 18:45:47 +0200
committerZdenek Dvorak <rakdver@gcc.gnu.org>2007-04-11 16:45:47 +0000
commit0ca2faee4f6194686a8121f76ffb7036614e259d (patch)
treed28be87d38025ece5bfa679e0b51142c941bd476 /gcc/tree-data-ref.c
parente9e0aa2c9677074a7912521f4fa1aebf53640198 (diff)
downloadgcc-0ca2faee4f6194686a8121f76ffb7036614e259d.zip
gcc-0ca2faee4f6194686a8121f76ffb7036614e259d.tar.gz
gcc-0ca2faee4f6194686a8121f76ffb7036614e259d.tar.bz2
tree-data-ref.c (add_multivariate_self_dist): Force the distance vector to be positive.
* tree-data-ref.c (add_multivariate_self_dist): Force the distance vector to be positive. From-SVN: r123720
Diffstat (limited to 'gcc/tree-data-ref.c')
-rw-r--r--gcc/tree-data-ref.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/gcc/tree-data-ref.c b/gcc/tree-data-ref.c
index 3f24c6a..7d80746 100644
--- a/gcc/tree-data-ref.c
+++ b/gcc/tree-data-ref.c
@@ -3857,6 +3857,7 @@ add_multivariate_self_dist (struct data_dependence_relation *ddr, tree c_2)
tree c_1 = CHREC_LEFT (c_2);
tree c_0 = CHREC_LEFT (c_1);
lambda_vector dist_v;
+ int v1, v2, cd;
/* Polynomials with more than 2 variables are not handled yet. */
if (TREE_CODE (c_0) != INTEGER_CST)
@@ -3870,8 +3871,20 @@ add_multivariate_self_dist (struct data_dependence_relation *ddr, tree c_2)
/* For "{{0, +, 2}_1, +, 3}_2" the distance vector is (3, -2). */
dist_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
- dist_v[x_1] = int_cst_value (CHREC_RIGHT (c_2));
- dist_v[x_2] = -int_cst_value (CHREC_RIGHT (c_1));
+ v1 = int_cst_value (CHREC_RIGHT (c_1));
+ v2 = int_cst_value (CHREC_RIGHT (c_2));
+ cd = gcd (v1, v2);
+ v1 /= cd;
+ v2 /= cd;
+
+ if (v2 < 0)
+ {
+ v2 = -v2;
+ v1 = -v1;
+ }
+
+ dist_v[x_1] = v2;
+ dist_v[x_2] = -v1;
save_dist_v (ddr, dist_v);
add_outer_distances (ddr, dist_v, x_1);