OSDN Git Service

2007-05-21 Andrew Pinski <andrew_pinski@playstation.sony.com>
authorpinskia <pinskia@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 21 May 2007 23:08:54 +0000 (23:08 +0000)
committerpinskia <pinskia@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 21 May 2007 23:08:54 +0000 (23:08 +0000)
        PR middle-end/31995
        * tree-chrec.c (evolution_function_is_affine_multivariate_p):
        Add loopno argument.  Use evolution_function_is_invariant_rec_p
        instead of evolution_function_is_constant_p.
        Update calls to evolution_function_is_affine_multivariate_p.
        * tree-chrec.h  (evolution_function_is_affine_multivariate_p):
        Add loopno argument.
        * tree-scalar-evolution.c (gather_chrec_stats): Call
        evolution_function_is_affine_multivariate_p with a  loop
        number of 0.
        * tree-data-ref.c (analyze_miv_subscript): Likewise.
        (analyze_overlapping_iterations): Likewise.
        (access_functions_are_affine_or_constant_p):
        Likewise.
        (build_classic_dist_vector_1): If the access functions
        are equal, don't do anything.

2007-05-21  Andrew Pinski  <andrew_pinski@playstation.sony.com>

        PR middle-end/31995
        * gcc.dg/vect/vect-102a.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@124927 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/vect-102a.c [new file with mode: 0644]
gcc/tree-chrec.c
gcc/tree-chrec.h
gcc/tree-data-ref.c
gcc/tree-scalar-evolution.c

index 4dc3cd5..857a5fa 100644 (file)
@@ -1,3 +1,22 @@
+2007-05-21  Andrew Pinski  <andrew_pinski@playstation.sony.com>
+
+       PR middle-end/31995
+       * tree-chrec.c (evolution_function_is_affine_multivariate_p):
+       Add loopno argument.  Use evolution_function_is_invariant_rec_p
+       instead of evolution_function_is_constant_p.
+       Update calls to evolution_function_is_affine_multivariate_p.
+       * tree-chrec.h  (evolution_function_is_affine_multivariate_p):
+       Add loopno argument.
+       * tree-scalar-evolution.c (gather_chrec_stats): Call
+       evolution_function_is_affine_multivariate_p with a  loop
+       number of 0.
+       * tree-data-ref.c (analyze_miv_subscript): Likewise.
+       (analyze_overlapping_iterations): Likewise.
+       (access_functions_are_affine_or_constant_p):
+       Likewise.
+       (build_classic_dist_vector_1): If the access functions
+       are equal, don't do anything.
+
 2007-05-21  Paolo Bonzini  <bonzini@gnu.org>
             Paolo Carlini  <pcarlini@suse.de>
            Uros Bizjak  <ubizjak@gmail.com>
index af3830f..e46cf78 100644 (file)
@@ -1,3 +1,8 @@
+2007-05-21  Andrew Pinski  <andrew_pinski@playstation.sony.com>
+
+       PR middle-end/31995
+       * gcc.dg/vect/vect-102a.c: New test.
+
 2007-05-21  Paolo Bonzini  <bonzini@gnu.org>
             Paolo Carlini  <pcarlini@suse.de>
            Uros Bizjak  <ubizjak@gmail.com>
diff --git a/gcc/testsuite/gcc.dg/vect/vect-102a.c b/gcc/testsuite/gcc.dg/vect/vect-102a.c
new file mode 100644 (file)
index 0000000..35023fc
--- /dev/null
@@ -0,0 +1,57 @@
+/* { dg-require-effective-target vect_int } */
+
+#include <stdlib.h>
+#include <stdarg.h>
+#include "tree-vect.h"
+
+#define N 9
+
+struct extraction
+{
+  int a[N];
+  int b[N];
+};
+
+static int a[N] = {1,2,3,4,5,6,7,8,9};
+static int b[N] = {2,3,4,5,6,7,8,9,9};
+volatile int foo;
+
+int main1 (int x, int y) {
+  int i;
+  struct extraction *p;
+  p = (struct extraction *) malloc (sizeof (struct extraction));
+
+  for (i = 0; i < N; i++)
+    {
+       p->a[i] = a[i];
+       if (foo == 135)
+        abort (); /* to avoid vectorization  */
+    }
+
+  /* Not vectorizable: distance 1.  */
+  for (i = 0; i < N - 1; i++)
+    {
+       p->a[x + i] = p->a[x + i + 1];
+    }
+
+  /* check results: */
+  for (i = 0; i < N; i++)
+    {
+       if (p->a[i] != b[i])
+         abort();
+    }
+  return 0;
+}
+
+int main (void)
+{ 
+  check_vect ();
+
+  foo = 0;
+  return main1 (0, N);
+}
+
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 0 "vect" } } */
+/* { dg-final { scan-tree-dump-times "possible dependence between data-refs" 1 "vect" } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
+
index 7abd5ad..45bee57 100644 (file)
@@ -987,7 +987,7 @@ evolution_function_is_invariant_p (tree chrec, int loopnum)
    evolution.  */
 
 bool 
-evolution_function_is_affine_multivariate_p (tree chrec)
+evolution_function_is_affine_multivariate_p (tree chrec, int loopnum)
 {
   if (chrec == NULL_TREE)
     return false;
@@ -995,9 +995,9 @@ evolution_function_is_affine_multivariate_p (tree chrec)
   switch (TREE_CODE (chrec))
     {
     case POLYNOMIAL_CHREC:
-      if (evolution_function_is_constant_p (CHREC_LEFT (chrec)))
+      if (evolution_function_is_invariant_rec_p (CHREC_LEFT (chrec), loopnum))
        {
-         if (evolution_function_is_constant_p (CHREC_RIGHT (chrec)))
+         if (evolution_function_is_invariant_rec_p (CHREC_RIGHT (chrec), loopnum))
            return true;
          else
            {
@@ -1005,7 +1005,7 @@ evolution_function_is_affine_multivariate_p (tree chrec)
                  && CHREC_VARIABLE (CHREC_RIGHT (chrec)) 
                     != CHREC_VARIABLE (chrec)
                  && evolution_function_is_affine_multivariate_p 
-                 (CHREC_RIGHT (chrec)))
+                 (CHREC_RIGHT (chrec), loopnum))
                return true;
              else
                return false;
@@ -1013,11 +1013,11 @@ evolution_function_is_affine_multivariate_p (tree chrec)
        }
       else
        {
-         if (evolution_function_is_constant_p (CHREC_RIGHT (chrec))
+         if (evolution_function_is_invariant_rec_p (CHREC_RIGHT (chrec), loopnum)
              && TREE_CODE (CHREC_LEFT (chrec)) == POLYNOMIAL_CHREC
              && CHREC_VARIABLE (CHREC_LEFT (chrec)) != CHREC_VARIABLE (chrec)
              && evolution_function_is_affine_multivariate_p 
-             (CHREC_LEFT (chrec)))
+             (CHREC_LEFT (chrec), loopnum))
            return true;
          else
            return false;
index 6be00d6..75ef41b 100644 (file)
@@ -79,7 +79,7 @@ extern bool chrec_contains_symbols (tree);
 extern bool chrec_contains_symbols_defined_in_loop (tree, unsigned);
 extern bool chrec_contains_undetermined (tree);
 extern bool tree_contains_chrecs (tree, int *);
-extern bool evolution_function_is_affine_multivariate_p (tree);
+extern bool evolution_function_is_affine_multivariate_p (tree, int);
 extern bool evolution_function_is_univariate_p (tree);
 extern unsigned nb_vars_in_chrec (tree);
 
index 1a81431..6fa59e8 100644 (file)
@@ -2458,7 +2458,7 @@ analyze_miv_subscript (tree chrec_a,
   
   else if (evolution_function_is_constant_p (difference)
           /* For the moment, the following is verified:
-             evolution_function_is_affine_multivariate_p (chrec_a) */
+             evolution_function_is_affine_multivariate_p (chrec_a, 0) */
           && !gcd_of_steps_may_divide_p (chrec_a, difference))
     {
       /* testsuite/.../ssa-chrec-33.c
@@ -2472,9 +2472,9 @@ analyze_miv_subscript (tree chrec_a,
       dependence_stats.num_miv_independent++;
     }
   
-  else if (evolution_function_is_affine_multivariate_p (chrec_a)
+  else if (evolution_function_is_affine_multivariate_p (chrec_a, 0)
           && !chrec_contains_symbols (chrec_a)
-          && evolution_function_is_affine_multivariate_p (chrec_b)
+          && evolution_function_is_affine_multivariate_p (chrec_b, 0)
           && !chrec_contains_symbols (chrec_b))
     {
       /* testsuite/.../ssa-chrec-35.c
@@ -2563,7 +2563,7 @@ 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))
+          && evolution_function_is_affine_multivariate_p (chrec_a, 0))
     {
       dependence_stats.num_same_subscript_function++;
       *overlap_iterations_a = conflict_fn (1, affine_fn_cst (integer_zero_node));
@@ -2575,8 +2575,8 @@ analyze_overlapping_iterations (tree chrec_a,
      yet. */
   else if ((chrec_contains_symbols (chrec_a) 
            || chrec_contains_symbols (chrec_b))
-          && (!evolution_function_is_affine_multivariate_p (chrec_a)
-              || !evolution_function_is_affine_multivariate_p (chrec_b)))
+          && (!evolution_function_is_affine_multivariate_p (chrec_a, 0)
+              || !evolution_function_is_affine_multivariate_p (chrec_b, 0)))
     {
       dependence_stats.num_subscript_undetermined++;
       *overlap_iterations_a = conflict_fn_not_known ();
@@ -2745,7 +2745,7 @@ build_classic_dist_vector_1 (struct data_dependence_relation *ddr,
          init_v[index] = 1;
          *init_b = true;
        }
-      else
+      else if (!operand_equal_p (access_fn_a, access_fn_b, 0))
        {
          /* This can be for example an affine vs. constant dependence
             (T[i] vs. T[3]) that is not an affine dependence and is
@@ -3182,7 +3182,7 @@ access_functions_are_affine_or_constant_p (struct data_reference *a)
 
   for (i = 0; VEC_iterate (tree, fns, i, t); i++)
     if (!evolution_function_is_constant_p (t)
-       && !evolution_function_is_affine_multivariate_p (t))
+       && !evolution_function_is_affine_multivariate_p (t, 0))
       return false;
   
   return true;
index 46831d7..eb45529 100644 (file)
@@ -2615,7 +2615,7 @@ gather_chrec_stats (tree chrec, struct chrec_stats *stats)
            fprintf (dump_file, "  affine_univariate\n");
          stats->nb_affine++;
        }
-      else if (evolution_function_is_affine_multivariate_p (chrec))
+      else if (evolution_function_is_affine_multivariate_p (chrec, 0))
        {
          if (dump_file && (dump_flags & TDF_STATS))
            fprintf (dump_file, "  affine_multivariate\n");