diff --git a/loopy/transform/subst.py b/loopy/transform/subst.py
index 3eee3d8f3093ce68670ab2c119f41bc385afde01..fa145fbbf3e51670f7ac42307e4ffde75df07618 100644
--- a/loopy/transform/subst.py
+++ b/loopy/transform/subst.py
@@ -148,8 +148,30 @@ def extract_subst(kernel, subst_name, template, parameters=()):
 
     new_insns = []
 
+    def transform_assignee(expr):
+        # Assignment LHS's cannot be subst rules. Treat them
+        # specially.
+
+        import pymbolic.primitives as prim
+        if isinstance(expr, tuple):
+            return tuple(
+                    transform_assignee(expr_i)
+                    for expr_i in expr)
+
+        elif isinstance(expr, prim.Subscript):
+            return type(expr)(
+                    expr.aggregate,
+                    cbmapper(expr.index))
+
+        elif isinstance(expr, prim.Variable):
+            return expr
+        else:
+            raise ValueError("assignment LHS not understood")
+
     for insn in kernel.instructions:
-        new_insns.append(insn.with_transformed_expressions(cbmapper))
+        new_insns.append(
+                insn.with_transformed_expressions(
+                    cbmapper, assignee_f=transform_assignee))
 
     from loopy.kernel.data import SubstitutionRule
     new_substs = {