From 1ae906bf084e6f7e8f2851ba880c9db49b039871 Mon Sep 17 00:00:00 2001
From: Andreas Kloeckner <inform@tiker.net>
Date: Tue, 9 Aug 2011 11:48:24 +0200
Subject: [PATCH] Introduce notion of a 'unique' tag. (ILP et al are not
 unique, for example.)

---
 loopy/__init__.py |  2 +-
 loopy/kernel.py   | 20 ++++++++++++--------
 2 files changed, 13 insertions(+), 9 deletions(-)

diff --git a/loopy/__init__.py b/loopy/__init__.py
index f21301d30..049327d03 100644
--- a/loopy/__init__.py
+++ b/loopy/__init__.py
@@ -11,7 +11,7 @@ register_mpz_with_pymbolic()
 
 
 
-# TODO: Constant memory
+# TODO: Constant memory (plus check for count)
 # TODO: Reuse of previously split dimensions for prefetch
 #   (Or general merging)
 
diff --git a/loopy/kernel.py b/loopy/kernel.py
index 21bf43a44..6f14113a5 100644
--- a/loopy/kernel.py
+++ b/loopy/kernel.py
@@ -83,16 +83,18 @@ class IndexTag(Record):
     def __hash__(self):
         raise RuntimeError("use .key to hash index tags")
 
-    @property
-    def key(self):
-        return type(self)
 
 
 
 class ParallelTag(IndexTag):
     pass
 
-class ParallelTagWithAxis(ParallelTag):
+class UniqueTag(IndexTag):
+    @property
+    def key(self):
+        return type(self)
+
+class ParallelTagWithAxis(ParallelTag, UniqueTag):
     __slots__ = ["axis", "forced_length"]
 
     def __init__(self, axis, forced_length=None):
@@ -222,7 +224,8 @@ class LoopKernel(Record):
     def tag_key_to_iname(self):
         return dict(
                 (tag.key, iname)
-                for iname, tag in self.iname_to_tag.iteritems())
+                for iname, tag in self.iname_to_tag.iteritems()
+                if isinstance(tag, UniqueTag))
 
     @property
     @memoize_method
@@ -396,11 +399,12 @@ class LoopKernel(Record):
 
         new_tag_keys = set(tag.key
                 for tag in [outer_tag, inner_tag]
-                if tag is not None)
+                if tag is not None
+                if isinstance(tag, UniqueTag))
 
         repeated_tag_keys = new_tag_keys & set(
-                tag.key for tag in
-                self.iname_to_tag.itervalues())
+                tag.key for tag in self.iname_to_tag.itervalues()
+                if isinstance(tag, UniqueTag))
 
         if repeated_tag_keys:
             raise RuntimeError("repeated tag(s): %s" % repeated_tag_keys)
-- 
GitLab