diff --git a/loopy/kernel/data.py b/loopy/kernel/data.py
index c10e513bf7705ce39e5660c620fec9259e67068c..0d4564aacad9e7abc5dd89bca46e7c628d4fce4d 100644
--- a/loopy/kernel/data.py
+++ b/loopy/kernel/data.py
@@ -561,13 +561,15 @@ class InstructionBase(Record):
             "groups conflicts_with_groups "
             "no_sync_with "
             "predicates "
-            "forced_iname_deps_is_final forced_iname_deps "
+            "forced_iname_deps_is_final stop_iname_dep_propagation "
+            "stop_iname_dep_propagation "
             "priority boostable boostable_into".split())
 
     def __init__(self, id, depends_on, depends_on_is_final,
             groups, conflicts_with_groups,
             no_sync_with,
-            forced_iname_deps_is_final, forced_iname_deps, priority,
+            forced_iname_deps_is_final, forced_iname_deps,
+            stop_iname_dep_propagation, priority,
             boostable, boostable_into, predicates, tags,
             insn_deps=None, insn_deps_is_final=None):
 
@@ -596,6 +598,9 @@ class InstructionBase(Record):
         if forced_iname_deps_is_final is None:
             forced_iname_deps_is_final = False
 
+        if stop_iname_dep_propagation is None:
+            stop_iname_dep_propagation = frozenset()
+
         if depends_on_is_final is None:
             depends_on_is_final = False
 
@@ -618,6 +623,7 @@ class InstructionBase(Record):
         # assert all(is_interned(pred) for pred in predicates)
 
         assert isinstance(forced_iname_deps, frozenset)
+        assert isinstance(stop_iname_dep_propagation, frozenset)
         assert isinstance(depends_on, frozenset) or depends_on is None
         assert isinstance(groups, frozenset)
         assert isinstance(conflicts_with_groups, frozenset)
@@ -630,6 +636,7 @@ class InstructionBase(Record):
                 groups=groups, conflicts_with_groups=conflicts_with_groups,
                 forced_iname_deps_is_final=forced_iname_deps_is_final,
                 forced_iname_deps=forced_iname_deps,
+                stop_iname_dep_propagation=stop_iname_dep_propagation,
                 priority=priority,
                 boostable=boostable,
                 boostable_into=boostable_into,
@@ -800,6 +807,8 @@ class InstructionBase(Record):
                 intern_frozenset_of_ids(self.forced_iname_deps))
         self.predicates = (
                 intern_frozenset_of_ids(self.predicates))
+        self.stop_iname_dep_propagation = (
+                intern_frozenset_of_ids(self.stop_iname_dep_propagation))
 
 # }}}
 
@@ -1068,6 +1077,7 @@ class Assignment(MultiAssignmentBase):
             no_sync_with=None,
             forced_iname_deps_is_final=None,
             forced_iname_deps=frozenset(),
+            stop_iname_dep_propagation=None,
             boostable=None, boostable_into=None, tags=None,
             temp_var_type=None, atomicity=(),
             priority=0, predicates=frozenset(),
@@ -1082,6 +1092,7 @@ class Assignment(MultiAssignmentBase):
                 no_sync_with=no_sync_with,
                 forced_iname_deps_is_final=forced_iname_deps_is_final,
                 forced_iname_deps=forced_iname_deps,
+                stop_iname_dep_propagation=stop_iname_dep_propagation,
                 boostable=boostable,
                 boostable_into=boostable_into,
                 priority=priority,
@@ -1207,6 +1218,7 @@ class CallInstruction(MultiAssignmentBase):
             no_sync_with=None,
             forced_iname_deps_is_final=None,
             forced_iname_deps=frozenset(),
+            stop_iname_dep_propagation=None,
             boostable=None, boostable_into=None, tags=None,
             temp_var_types=None,
             priority=0, predicates=frozenset(),
@@ -1221,6 +1233,7 @@ class CallInstruction(MultiAssignmentBase):
                 no_sync_with=no_sync_with,
                 forced_iname_deps_is_final=forced_iname_deps_is_final,
                 forced_iname_deps=forced_iname_deps,
+                stop_iname_dep_propagation=stop_iname_dep_propagation,
                 boostable=boostable,
                 boostable_into=boostable_into,
                 priority=priority,
@@ -1376,6 +1389,7 @@ class CInstruction(InstructionBase):
             groups=None, conflicts_with_groups=None,
             no_sync_with=None,
             forced_iname_deps_is_final=None, forced_iname_deps=frozenset(),
+            stop_iname_dep_propagation=None,
             priority=0, boostable=None, boostable_into=None,
             predicates=frozenset(), tags=None,
             insn_deps=None, insn_deps_is_final=None):
@@ -1397,6 +1411,7 @@ class CInstruction(InstructionBase):
                 no_sync_with=no_sync_with,
                 forced_iname_deps_is_final=forced_iname_deps_is_final,
                 forced_iname_deps=forced_iname_deps,
+                stop_iname_dep_propagation=stop_iname_dep_propagation,
                 boostable=boostable,
                 boostable_into=boostable_into,
                 priority=priority, predicates=predicates, tags=tags,
diff --git a/loopy/kernel/tools.py b/loopy/kernel/tools.py
index 7862ceb1efbed4f70ebe0fa81d07de84b12fca60..5a100d7120892e6cfef80e4ee1cd1f1d6cd3bc5b 100644
--- a/loopy/kernel/tools.py
+++ b/loopy/kernel/tools.py
@@ -164,7 +164,9 @@ def find_all_insn_inames(kernel):
                     ))
 
         insn_id_to_inames[insn.id] = iname_deps
-        insn_assignee_inames[insn.id] = write_deps & kernel.all_inames()
+        insn_assignee_inames[insn.id] = (
+                write_deps & kernel.all_inames()
+                | insn.stop_iname_dep_propagation)
 
     written_vars = kernel.get_written_variables()
 
diff --git a/loopy/version.py b/loopy/version.py
index 7e1870ef718cd3c4a1ef197f0fb25e86d7a6175d..bb1b123cb3630fe4a7c565ccdc547cac10e66318 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 = "v34-islpy%s" % _islpy_version
+DATA_MODEL_VERSION = "v35-islpy%s" % _islpy_version