This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Fix PR46928: handle "A[p] == A[p]" in data dep analysis with p a parameter of the loop.


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
>
>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]