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 = {