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

login
register
mail settings
Submitter Sebastian Pop
Date Dec. 13, 2010, 6:57 p.m.
Message ID <1292266655-21539-1-git-send-email-sebpop@gmail.com>
Download mbox | patch
Permalink /patch/75397/
State New
Headers show

Comments

Sebastian Pop - Dec. 13, 2010, 6:57 p.m.
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?

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
Richard Guenther - Dec. 15, 2010, 2:11 a.m.
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
>
>

Patch

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)