diff --git a/loopy/__init__.py b/loopy/__init__.py
index 3d6f71bec4e62583180f0228a0c94f10611d4cbd..fa146961d8bbde486c042dee5540060d9845b76e 100644
--- a/loopy/__init__.py
+++ b/loopy/__init__.py
@@ -522,6 +522,13 @@ class _InameDuplicator(ExpandingIdentityMapper):
             from pymbolic import var
             return var(new_name)
 
+    def map_instruction(self, insn):
+        new_fid = frozenset(
+                self.old_to_new.get(iname, iname)
+                for iname in insn.forced_iname_deps)
+        return insn.copy(
+                forced_iname_deps=new_fid)
+
 
 def duplicate_inames(knl, inames, within, new_inames=None, suffix=None,
         tags={}):
diff --git a/loopy/symbolic.py b/loopy/symbolic.py
index 77e92ace15deb6563056e870a50ba63041de766a..8f0cd02e34f17f135bdebd5a119b276bca3ca1b7 100644
--- a/loopy/symbolic.py
+++ b/loopy/symbolic.py
@@ -504,6 +504,9 @@ class ExpandingIdentityMapper(IdentityMapper):
 
         return renamed_result, renames
 
+    def map_instruction(self, insn):
+        return insn
+
     def map_kernel(self, kernel):
         new_insns = [
                 # While subst rules are not allowed in assignees, the mapper
@@ -514,9 +517,14 @@ class ExpandingIdentityMapper(IdentityMapper):
                 for insn in kernel.instructions]
 
         new_substs, renames = self._get_new_substitutions_and_renames()
+
+        new_insns = [self.map_instruction(insn)
+                for insn in rename_subst_rules_in_instructions(
+                    new_insns, renames)]
+
         return kernel.copy(
             substitutions=new_substs,
-            instructions=rename_subst_rules_in_instructions(new_insns, renames))
+            instructions=new_insns)
 
 
 class ExpandingSubstitutionMapper(ExpandingIdentityMapper):