tree-data-ref.c (build_classic_dist_vector): If either loop is outside of the nest we asked about, the dependence can't matter.

2004-11-10  Daniel Berlin  <dberlin@dberlin.org>

	* tree-data-ref.c (build_classic_dist_vector): If either loop
	is outside of the nest we asked about, the dependence can't
	matter.
	(build_classic_dir_vector): Ditto.

From-SVN: r90454
This commit is contained in:
Daniel Berlin 2004-11-10 21:32:10 +00:00 committed by Daniel Berlin
parent 78e54994ff
commit 8b41b1b24f
3 changed files with 40 additions and 6 deletions
gcc
ChangeLog
testsuite/gcc.dg/tree-ssa
tree-data-ref.c

@ -1,3 +1,10 @@
2004-11-10 Daniel Berlin <dberlin@dberlin.org>
* tree-data-ref.c (build_classic_dist_vector): If either loop
is outside of the nest we asked about, the dependence can't
matter.
(build_classic_dir_vector): Ditto.
2004-11-10 Zdenek Dvorak <dvorakz@suse.cz>
* tree-ssa-loop-ivopts.c (get_address_cost): Add address elements in

@ -0,0 +1,26 @@
/* { dg-do compile } */
/* { dg-options "-O2 -ftree-loop-linear" } */
/* This testcase was causing an ICE in building distance vectors because
we weren't ignoring the fact that one of the induction variables
involved in the dependence was outside of the loop. */
extern int foo (int, int);
int
main (void)
{
int a[50];
int b[50];
int i, j, k;
for (i = 4; i < 30; i++)
{
for (j = 3; j < 40; j++)
{
for (k = 9; k < 50; k++)
{
b[j] = a[i];
a[k] = b[i];
}
}
}
foo (a[i], b[i]);
}

@ -1816,12 +1816,12 @@ build_classic_dist_vector (struct data_dependence_relation *ddr,
struct loop *loop_b = current_loops->parray[loop_nb_b];
struct loop *loop_first = current_loops->parray[first_loop];
/* If the loops for both variables are at a lower depth than
the first_loop's depth, then they can't possibly have a
/* If the loop for either variable is at a lower depth than
the first_loop's depth, then we can't possibly have a
dependency at this level of the loop. */
if (loop_a->depth < loop_first->depth
&& loop_b->depth < loop_first->depth)
|| loop_b->depth < loop_first->depth)
return false;
if (loop_nb_a != loop_nb_b
@ -1992,11 +1992,12 @@ build_classic_dir_vector (struct data_dependence_relation *ddr,
struct loop *loop_b = current_loops->parray[loop_nb_b];
struct loop *loop_first = current_loops->parray[first_loop];
/* If the loops for both variables are at a lower depth than
the first_loop's depth, then they can't possibly matter */
/* If the loop for either variable is at a lower depth than
the first_loop's depth, then we can't possibly have a
dependency at this level of the loop. */
if (loop_a->depth < loop_first->depth
&& loop_b->depth < loop_first->depth)
|| loop_b->depth < loop_first->depth)
return false;
if (loop_nb_a != loop_nb_b