From 4b7f9e3a15efa0eab3f646848a195c54174aade4 Mon Sep 17 00:00:00 2001
From: markus holzer <markus.holzer@fau.de>
Date: Wed, 3 Mar 2021 10:27:54 +0100
Subject: [PATCH] Added test case

---
 pystencils/cpu/cpujit.py                      |  3 ++-
 .../test_vectorization_specific.py            | 25 +++++++++++++++++++
 2 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/pystencils/cpu/cpujit.py b/pystencils/cpu/cpujit.py
index 51538fa20..9ca8312eb 100644
--- a/pystencils/cpu/cpujit.py
+++ b/pystencils/cpu/cpujit.py
@@ -376,7 +376,8 @@ def create_function_boilerplate_code(parameter_info, name, ast_node, insert_chec
                 item_size = np_dtype.itemsize
 
                 aligned = any([a.lhs.args[2] for a in ast_node.assignments if
-                               isinstance(a.lhs, cast_func) and isinstance(a.lhs.dtype, VectorType)])
+                               hasattr(a, 'lhs') and isinstance(a.lhs, cast_func) and
+                               hasattr(a.lhs, 'dtype') and isinstance(a.lhs.dtype, VectorType)])
 
                 if ast_node.instruction_set and aligned:
                     byte_width = ast_node.instruction_set['width'] * item_size
diff --git a/pystencils_tests/test_vectorization_specific.py b/pystencils_tests/test_vectorization_specific.py
index 9d9d4ac50..4842a38e7 100644
--- a/pystencils_tests/test_vectorization_specific.py
+++ b/pystencils_tests/test_vectorization_specific.py
@@ -5,6 +5,8 @@ import sympy as sp
 
 import pystencils as ps
 from pystencils.backends.simd_instruction_sets import get_supported_instruction_sets
+from pystencils.backends.x86_instruction_sets import get_vector_instruction_set_x86
+from pystencils.data_types import cast_func, VectorType
 
 supported_instruction_sets = get_supported_instruction_sets() if get_supported_instruction_sets() else []
 
@@ -49,3 +51,26 @@ def test_vectorized_abs(instruction_set, dtype):
     dst = np.zeros_like(arr)
     func(g=dst, f=arr)
     np.testing.assert_equal(np.sum(dst[1:-1, 1:-1]), 2 ** 2 * 2 ** 3)
+
+
+@pytest.mark.parametrize('dtype', ('float', 'double'))
+@pytest.mark.parametrize('instruction_set', supported_instruction_sets)
+def test_alignment_and_correct_ghost_layers(instruction_set, dtype):
+    itemsize = 8 if dtype == 'double' else 4
+    alignment = get_vector_instruction_set_x86(dtype, instruction_set)['width'] * itemsize
+    dtype = np.float64 if dtype == 'double' else np.float32
+
+    domain_size = (128, 128)
+    dh = ps.create_data_handling(domain_size, periodicity=(True, True), default_target='cpu')
+    src = dh.add_array("src", values_per_cell=1, dtype=dtype, ghost_layers=1, alignment=alignment)
+    dh.fill(src.name, 1.0, ghost_layers=True)
+    dst = dh.add_array("dst", values_per_cell=1, dtype=dtype, ghost_layers=1, alignment=alignment)
+    dh.fill(dst.name, 1.0, ghost_layers=True)
+
+    update_rule = ps.Assignment(dst[0, 0], src[0, 0])
+    opt = {'instruction_set': instruction_set, 'assume_aligned': True,
+           'nontemporal': True, 'assume_inner_stride_one': True}
+    ast = ps.create_kernel(update_rule, target=dh.default_target, cpu_vectorize_info=opt, ghost_layers=0)
+    kernel = ast.compile()
+    with pytest.raises(ValueError):
+        dh.run_kernel(kernel)
\ No newline at end of file
-- 
GitLab