OSDN Git Service

* tree-data-ref.c (ptr_ptr_may_alias_p): Take alias sets into account.
authorirar <irar@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 22 Feb 2007 13:10:49 +0000 (13:10 +0000)
committerirar <irar@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 22 Feb 2007 13:10:49 +0000 (13:10 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@122226 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/vect-106.c [new file with mode: 0755]
gcc/tree-data-ref.c

index 29b23b7..d7f0f49 100644 (file)
@@ -1,3 +1,8 @@
+2007-02-22  Zdenek Dvorak  <dvorakz@suse.cz>
+            Ira Rosen  <irar@il.ibm.com>
+
+       * tree-data-ref.c (ptr_ptr_may_alias_p): Take alias sets into account.
+
 2007-02-22  Ira Rosen  <irar@il.ibm.com>
 
        PR tree-optimization/30843
index bc8535c..1e52e49 100644 (file)
@@ -1,3 +1,7 @@
+2007-02-22  Ira Rosen  <irar@il.ibm.com>
+
+       * gcc.dg/vect/vect-106.c: New test.
+
 2007-02-22  Dorit Nuzman  <dorit@il.ibm.com>
             Ira Rosen  <irar@il.ibm.com> 
 
diff --git a/gcc/testsuite/gcc.dg/vect/vect-106.c b/gcc/testsuite/gcc.dg/vect/vect-106.c
new file mode 100755 (executable)
index 0000000..04a9f6c
--- /dev/null
@@ -0,0 +1,73 @@
+/* { dg-require-effective-target vect_int } */
+
+#include <stdlib.h>
+#include <stdarg.h>
+#include "tree-vect.h"
+
+#define N 9
+
+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,0};
+
+int main1 () {
+  int i;
+  int *p, *q, *p1, *q1;
+  p = (unsigned int *) malloc (sizeof (unsigned int) * N);
+  q = (unsigned int *) malloc (sizeof (unsigned int) * N);
+
+  p1 = p; q1 = q;
+
+  /* Not vectorizable: because of the redundant cast (caused by ponter
+     arithmetics), alias analysis fails to distinguish between 
+     the pointers.  */
+  for (i = 0; i < N; i++)
+    {
+      *(q + i) = a[i];
+      *(p + i) = b[i];
+    }
+
+  /* check results: */
+  for (i = 0; i < N; i++)
+    {
+       if (*q != a[i] || *p != b[i])
+         abort();
+       q++; 
+       p++;
+    }
+  
+  q = q1;
+  p = p1;
+  /* Vectorizable.  */ 
+  for (i = 0; i < N; i++)
+    {
+      *q = b[i];
+      *p = a[i];
+      q++;
+      p++;
+    }
+
+  q = q1;
+  p = p1;
+  /* check results: */
+  for (i = 0; i < N; i++)
+    {
+       if (*q != b[i] || *p != a[i])
+         abort();
+       q++;
+       p++;
+    }
+
+  return 0; 
+}
+
+int main (void)
+{ 
+  check_vect ();
+
+  return main1 ();
+}
+
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
+/* { dg-final { scan-tree-dump-times "can't determine dependence" 1 "vect" } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
+
index b84f36b..2f57c4f 100644 (file)
@@ -172,6 +172,7 @@ ptr_ptr_may_alias_p (tree ptr_a, tree ptr_b,
   tree tag_a = NULL_TREE, tag_b = NULL_TREE;
   struct ptr_info_def *pi_a = DR_PTR_INFO (dra);  
   struct ptr_info_def *pi_b = DR_PTR_INFO (drb);  
+  bitmap bal1, bal2;
 
   if (pi_a && pi_a->name_mem_tag && pi_b && pi_b->name_mem_tag)
     {
@@ -192,7 +193,19 @@ ptr_ptr_may_alias_p (tree ptr_a, tree ptr_b,
       if (!tag_b)
        return false;
     }
-  *aliased = (tag_a == tag_b);
+  bal1 = BITMAP_ALLOC (NULL);
+  bitmap_set_bit (bal1, DECL_UID (tag_a));
+  if (MTAG_P (tag_a) && MTAG_ALIASES (tag_a))
+    bitmap_ior_into (bal1, MTAG_ALIASES (tag_a));
+
+  bal2 = BITMAP_ALLOC (NULL);
+  bitmap_set_bit (bal2, DECL_UID (tag_b));
+  if (MTAG_P (tag_b) && MTAG_ALIASES (tag_b))
+    bitmap_ior_into (bal2, MTAG_ALIASES (tag_b));
+  *aliased = bitmap_intersect_p (bal1, bal2);
+
+  BITMAP_FREE (bal1);
+  BITMAP_FREE (bal2);
   return true;
 }