From e370c2172cd30127bb0be55ce353a17db074e386 Mon Sep 17 00:00:00 2001
From: Matt Wala <wala1@illinois.edu>
Date: Thu, 29 Dec 2016 22:18:56 -0600
Subject: [PATCH] Barrier insertion: respect dependencies where source=target
 (closes #21 on gitlab).

---
 loopy/schedule/__init__.py |  2 +-
 test/test_loopy.py         | 20 ++++++++++++++++++++
 2 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/loopy/schedule/__init__.py b/loopy/schedule/__init__.py
index c078da2ec..10408bce9 100644
--- a/loopy/schedule/__init__.py
+++ b/loopy/schedule/__init__.py
@@ -1528,7 +1528,7 @@ class DependencyTracker(object):
             source, target = target, source
 
         target_deps = self.kernel.recursive_insn_dep_map()[target.id]
-        if source.id in target_deps:
+        if source.id == target.id or source.id in target_deps:
             if self.reverse:
                 dep_descr = "{tgt} rev-depends on {src}"
             else:
diff --git a/test/test_loopy.py b/test/test_loopy.py
index db4a38204..bd6466f4a 100644
--- a/test/test_loopy.py
+++ b/test/test_loopy.py
@@ -2073,6 +2073,26 @@ def test_barrier_insertion_near_bottom_of_loop():
     assert_barrier_between(knl, "ainit", "aupdate", ignore_barriers_in_levels=[1])
 
 
+def test_barrier_insertion_with_self_dependency():
+    import loopy as lp
+    knl = lp.make_kernel(
+        "{[i,j]: 0 <=i,j<16}",
+        """
+        <>t = 0 {id=nop0}
+        for i
+         for j
+          <>B[i+1,j] = B[i,j]
+         end
+        end
+        t = 1 {id=nop1}
+        """,
+        seq_dependencies=True)
+    knl = lp.tag_inames(knl, dict(j="l.0"))
+    knl = lp.set_temporary_scope(knl, "B", "local")
+    knl = lp.get_one_scheduled_kernel(lp.preprocess_kernel(knl))
+    assert_barrier_between(knl, "nop0", "nop1")
+
+
 if __name__ == "__main__":
     if len(sys.argv) > 1:
         exec(sys.argv[1])
-- 
GitLab