From 147d27f5ecebf5075e2e8600a5d64e1c1382c0ad Mon Sep 17 00:00:00 2001
From: Andreas Kloeckner <inform@tiker.net>
Date: Mon, 21 Mar 2016 22:47:12 -0500
Subject: [PATCH] Type system fixes

---
 loopy/codegen/__init__.py  | 2 ++
 loopy/library/reduction.py | 3 ++-
 loopy/target/c/__init__.py | 4 ++--
 loopy/target/opencl.py     | 4 ++--
 loopy/types.py             | 4 ++--
 loopy/version.py           | 2 +-
 6 files changed, 11 insertions(+), 8 deletions(-)

diff --git a/loopy/codegen/__init__.py b/loopy/codegen/__init__.py
index 59df3af62..4056c0dea 100644
--- a/loopy/codegen/__init__.py
+++ b/loopy/codegen/__init__.py
@@ -637,6 +637,7 @@ def generate_body(kernel):
 
     seen_dtypes = set()
     seen_functions = set()
+    seen_atomic_dtypes = set()
 
     initial_implemented_domain = isl.BasicSet.from_params(kernel.assumptions)
     codegen_state = CodeGenerationState(
@@ -645,6 +646,7 @@ def generate_body(kernel):
             implemented_predicates=frozenset(),
             seen_dtypes=seen_dtypes,
             seen_functions=seen_functions,
+            seen_atomic_dtypes=seen_atomic_dtypes,
             var_subst_map={},
             allow_complex=allow_complex)
 
diff --git a/loopy/library/reduction.py b/loopy/library/reduction.py
index 90dd27133..3eb590b80 100644
--- a/loopy/library/reduction.py
+++ b/loopy/library/reduction.py
@@ -163,7 +163,8 @@ class _ArgExtremumReductionOperation(ReductionOperation):
             struct_dtype = np.dtype([("value", dtype), ("index", np.int32)])
             ARGEXT_STRUCT_DTYPES[dtype] = NumpyType(struct_dtype, target)
 
-            target.get_or_register_dtype(self.prefix(dtype)+"_result", struct_dtype)
+            target.get_or_register_dtype(self.prefix(dtype)+"_result",
+                    NumpyType(struct_dtype))
             return ARGEXT_STRUCT_DTYPES[dtype]
 
     def neutral_element(self, dtype, inames):
diff --git a/loopy/target/c/__init__.py b/loopy/target/c/__init__.py
index f9a5e4390..66210bb2a 100644
--- a/loopy/target/c/__init__.py
+++ b/loopy/target/c/__init__.py
@@ -178,7 +178,7 @@ class CTarget(TargetBase):
         base_storage_to_is_local = {}
         base_storage_to_align_bytes = {}
 
-        from cgen import ArrayOf, Pointer, Initializer, AlignedAttribute
+        from cgen import ArrayOf, Pointer, Initializer, AlignedAttribute, Value
         from loopy.codegen import POD  # uses the correct complex type
 
         class ConstRestrictPointer(Pointer):
@@ -251,7 +251,7 @@ class CTarget(TargetBase):
                             * product(si for si in idi.shape))
 
         for bs_name, bs_sizes in sorted(six.iteritems(base_storage_sizes)):
-            bs_var_decl = POD(self, np.int8, bs_name)
+            bs_var_decl = Value("char", bs_name)
             bs_var_decl = self.wrap_temporary_decl(
                     bs_var_decl, base_storage_to_is_local[bs_name])
             bs_var_decl = ArrayOf(bs_var_decl, max(bs_sizes))
diff --git a/loopy/target/opencl.py b/loopy/target/opencl.py
index 1e224ff1f..43c4ea7dc 100644
--- a/loopy/target/opencl.py
+++ b/loopy/target/opencl.py
@@ -44,8 +44,8 @@ class DTypeRegistryWrapperWithAtomics(DTypeRegistryWrapper):
                 return super(self.wrapped_registry.get_or_register_dtype(
                         names, NumpyType(dtype.dtype)))
 
-        return super(self.wrapped_registry.get_or_register_dtype(
-                names, dtype))
+        return super(DTypeRegistryWrapperWithAtomics, self).get_or_register_dtype(
+                names, dtype)
 
 
 class DTypeRegistryWrapperWithCL1Atomics(DTypeRegistryWrapperWithAtomics):
diff --git a/loopy/types.py b/loopy/types.py
index 21567b9a4..d80650eb6 100644
--- a/loopy/types.py
+++ b/loopy/types.py
@@ -107,13 +107,13 @@ class NumpyType(LoopyType):
         if self.target is None:
             raise RuntimeError("unable to pickle dtype: target not known")
 
-        c_name = self.target.dtype_to_typename(self.dtype)
+        c_name = self.target.dtype_to_typename(NumpyType(self.dtype))
         return (self.target, c_name, self.dtype)
 
     def __setstate__(self, state):
         target, name, dtype = state
         self.target = target
-        self.dtype = self.target.get_or_register_dtype([name], dtype)
+        self.dtype = self.target.get_or_register_dtype([name], NumpyType(dtype))
 
     def with_target(self, target):
         if (self.target is not None
diff --git a/loopy/version.py b/loopy/version.py
index 2ade5ba54..60e310a7c 100644
--- a/loopy/version.py
+++ b/loopy/version.py
@@ -32,4 +32,4 @@ except ImportError:
 else:
     _islpy_version = islpy.version.VERSION_TEXT
 
-DATA_MODEL_VERSION = "v22-islpy%s" % _islpy_version
+DATA_MODEL_VERSION = "v23-islpy%s" % _islpy_version
-- 
GitLab