From 8b41b1b24fa17fc41a28c4466b1dcd8d9fdcb170 Mon Sep 17 00:00:00 2001 From: Daniel Berlin Date: Wed, 10 Nov 2004 21:32:10 +0000 Subject: [PATCH] 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 * 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 --- gcc/ChangeLog | 7 ++++++ gcc/testsuite/gcc.dg/tree-ssa/20041110-1.c | 26 ++++++++++++++++++++++ gcc/tree-data-ref.c | 13 ++++++----- 3 files changed, 40 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/20041110-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 57c0622dbb5..63a48751524 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2004-11-10 Daniel Berlin + + * 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 * tree-ssa-loop-ivopts.c (get_address_cost): Add address elements in diff --git a/gcc/testsuite/gcc.dg/tree-ssa/20041110-1.c b/gcc/testsuite/gcc.dg/tree-ssa/20041110-1.c new file mode 100644 index 00000000000..825b2b41fa9 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/20041110-1.c @@ -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]); +} diff --git a/gcc/tree-data-ref.c b/gcc/tree-data-ref.c index 9a0126c3317..3c883465076 100644 --- a/gcc/tree-data-ref.c +++ b/gcc/tree-data-ref.c @@ -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