Message ID | 1292266655-21539-1-git-send-email-sebpop@gmail.com |
---|---|
State | New |
Headers | show |
On Mon, Dec 13, 2010 at 7:57 PM, Sebastian Pop <sebpop@gmail.com> wrote: > Hi, > > This patch improves the data dependence test to handle this case: > > p = parameter > loop_1 > A[p] = ... > end_loop_1 > > this is handled as creating an overlap at every loop iteration. > Ok for trunk after this passes regression test on amd64-linux? Ok. Thanks, Richard. > Thanks, > Sebastian > > > --- > gcc/testsuite/gcc.dg/tree-ssa/ldist-17.c | 50 ++++++++++++++++++++++++++++++ > gcc/tree-data-ref.c | 5 ++- > 2 files changed, 53 insertions(+), 2 deletions(-) > create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/ldist-17.c > > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ldist-17.c b/gcc/testsuite/gcc.dg/tree-ssa/ldist-17.c > new file mode 100644 > index 0000000..a831d3c > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/tree-ssa/ldist-17.c > @@ -0,0 +1,50 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -ftree-loop-distribution -fdump-tree-ldist-details" } */ > + > +typedef int mad_fixed_t; > +struct mad_pcm > +{ > + unsigned int samplerate; > + unsigned short channels; > + unsigned short length; > + mad_fixed_t samples[2][1152]; > +}; > +struct mad_synth > +{ > + mad_fixed_t filter[2][2][2][16][8]; > + unsigned int phase; > + struct mad_pcm pcm; > +}; > +void mad_synth_mute (struct mad_synth *synth); > +void > +mad_synth_mute (struct mad_synth *synth) > +{ > + unsigned int ch; > + unsigned int s; > + unsigned int v; > + > + ch = 0U; > + while (ch < 2U) > + { > + s = 0U; > + while (s < 16U) > + { > + v = 0U; > + while (v < 8U) > + { > + synth->filter[ch][1][1][s][v] = 0; > + synth->filter[ch][1][0][s][v] = 0; > + synth->filter[ch][0][1][s][v] = 0; > + synth->filter[ch][0][0][s][v] = 0; > + v++; > + } > + s++; > + } > + ch++; > + } > + return; > +} > + > +/* { dg-final { scan-tree-dump "distributed: split to 4" "ldist" } } */ > +/* { dg-final { scan-tree-dump-times "__builtin_memset" 8 "ldist" } } */ > +/* { dg-final { cleanup-tree-dump "ldist" } } */ > diff --git a/gcc/tree-data-ref.c b/gcc/tree-data-ref.c > index 9a81370..a6d0731 100644 > --- a/gcc/tree-data-ref.c > +++ b/gcc/tree-data-ref.c > @@ -2653,7 +2653,8 @@ analyze_overlapping_iterations (tree chrec_a, > /* If they are the same chrec, and are affine, they overlap > on every iteration. */ > else if (eq_evolutions_p (chrec_a, chrec_b) > - && evolution_function_is_affine_multivariate_p (chrec_a, lnn)) > + && (evolution_function_is_affine_multivariate_p (chrec_a, lnn) > + || operand_equal_p (chrec_a, chrec_b, 0))) > { > dependence_stats.num_same_subscript_function++; > *overlap_iterations_a = conflict_fn (1, affine_fn_cst (integer_zero_node)); > @@ -2662,7 +2663,7 @@ analyze_overlapping_iterations (tree chrec_a, > } > > /* If they aren't the same, and aren't affine, we can't do anything > - yet. */ > + yet. */ > else if ((chrec_contains_symbols (chrec_a) > || chrec_contains_symbols (chrec_b)) > && (!evolution_function_is_affine_multivariate_p (chrec_a, lnn) > -- > 1.7.1 > >
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ldist-17.c b/gcc/testsuite/gcc.dg/tree-ssa/ldist-17.c new file mode 100644 index 0000000..a831d3c --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ldist-17.c @@ -0,0 +1,50 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -ftree-loop-distribution -fdump-tree-ldist-details" } */ + +typedef int mad_fixed_t; +struct mad_pcm +{ + unsigned int samplerate; + unsigned short channels; + unsigned short length; + mad_fixed_t samples[2][1152]; +}; +struct mad_synth +{ + mad_fixed_t filter[2][2][2][16][8]; + unsigned int phase; + struct mad_pcm pcm; +}; +void mad_synth_mute (struct mad_synth *synth); +void +mad_synth_mute (struct mad_synth *synth) +{ + unsigned int ch; + unsigned int s; + unsigned int v; + + ch = 0U; + while (ch < 2U) + { + s = 0U; + while (s < 16U) + { + v = 0U; + while (v < 8U) + { + synth->filter[ch][1][1][s][v] = 0; + synth->filter[ch][1][0][s][v] = 0; + synth->filter[ch][0][1][s][v] = 0; + synth->filter[ch][0][0][s][v] = 0; + v++; + } + s++; + } + ch++; + } + return; +} + +/* { dg-final { scan-tree-dump "distributed: split to 4" "ldist" } } */ +/* { dg-final { scan-tree-dump-times "__builtin_memset" 8 "ldist" } } */ +/* { dg-final { cleanup-tree-dump "ldist" } } */ diff --git a/gcc/tree-data-ref.c b/gcc/tree-data-ref.c index 9a81370..a6d0731 100644 --- a/gcc/tree-data-ref.c +++ b/gcc/tree-data-ref.c @@ -2653,7 +2653,8 @@ analyze_overlapping_iterations (tree chrec_a, /* If they are the same chrec, and are affine, they overlap on every iteration. */ else if (eq_evolutions_p (chrec_a, chrec_b) - && evolution_function_is_affine_multivariate_p (chrec_a, lnn)) + && (evolution_function_is_affine_multivariate_p (chrec_a, lnn) + || operand_equal_p (chrec_a, chrec_b, 0))) { dependence_stats.num_same_subscript_function++; *overlap_iterations_a = conflict_fn (1, affine_fn_cst (integer_zero_node)); @@ -2662,7 +2663,7 @@ analyze_overlapping_iterations (tree chrec_a, } /* If they aren't the same, and aren't affine, we can't do anything - yet. */ + yet. */ else if ((chrec_contains_symbols (chrec_a) || chrec_contains_symbols (chrec_b)) && (!evolution_function_is_affine_multivariate_p (chrec_a, lnn)