From ad7288f57eaab0ea17834b1475e28a011dee5872 Mon Sep 17 00:00:00 2001 From: Andreas Kloeckner <inform@tiker.net> Date: Wed, 16 Dec 2015 16:31:07 +0530 Subject: [PATCH] ExpressionInstruction -> Assignment --- loopy/__init__.py | 4 ++-- loopy/codegen/instruction.py | 4 ++-- loopy/frontend/fortran/translator.py | 4 ++-- loopy/kernel/__init__.py | 2 +- loopy/kernel/creation.py | 18 +++++++++--------- loopy/kernel/data.py | 13 +++++++++++-- loopy/kernel/tools.py | 6 +++--- loopy/maxima.py | 4 ++-- loopy/preprocess.py | 10 +++++----- loopy/schedule.py | 4 ++-- loopy/transform/arithmetic.py | 8 ++++---- loopy/transform/buffer.py | 8 ++++---- loopy/transform/diff.py | 4 ++-- loopy/transform/precompute.py | 6 +++--- test/test_loopy.py | 4 ++-- 15 files changed, 54 insertions(+), 45 deletions(-) diff --git a/loopy/__init__.py b/loopy/__init__.py index 1be18726e..79ea1ee95 100644 --- a/loopy/__init__.py +++ b/loopy/__init__.py @@ -39,7 +39,7 @@ from loopy.library.function import ( from loopy.kernel.data import ( auto, ValueArg, GlobalArg, ConstantArg, ImageArg, - InstructionBase, ExpressionInstruction, CInstruction, + InstructionBase, Assignment, ExpressionInstruction, CInstruction, TemporaryVariable) from loopy.kernel import LoopKernel @@ -116,7 +116,7 @@ __all__ = [ "ValueArg", "ScalarArg", "GlobalArg", "ArrayArg", "ConstantArg", "ImageArg", "TemporaryVariable", - "InstructionBase", "ExpressionInstruction", "CInstruction", + "InstructionBase", "Assignment", "ExpressionInstruction", "CInstruction", "default_function_mangler", "single_arg_function_mangler", diff --git a/loopy/codegen/instruction.py b/loopy/codegen/instruction.py index c20727660..fe7124fdd 100644 --- a/loopy/codegen/instruction.py +++ b/loopy/codegen/instruction.py @@ -61,9 +61,9 @@ def wrap_in_conditionals(codegen_state, domain, check_inames, required_preds, st def generate_instruction_code(kernel, insn, codegen_state): - from loopy.kernel.data import ExpressionInstruction, CInstruction + from loopy.kernel.data import Assignment, CInstruction - if isinstance(insn, ExpressionInstruction): + if isinstance(insn, Assignment): result = generate_expr_instruction_code(kernel, insn, codegen_state) elif isinstance(insn, CInstruction): result = generate_c_instruction_code(kernel, insn, codegen_state) diff --git a/loopy/frontend/fortran/translator.py b/loopy/frontend/fortran/translator.py index 8293035a9..419bb9ae4 100644 --- a/loopy/frontend/fortran/translator.py +++ b/loopy/frontend/fortran/translator.py @@ -230,8 +230,8 @@ class F2LoopyTranslator(FTreeWalkerBase): else: insn_deps = frozenset() - from loopy.kernel.data import ExpressionInstruction - insn = ExpressionInstruction( + from loopy.kernel.data import Assignment + insn = Assignment( lhs, rhs, forced_iname_deps=frozenset( scope.active_loopy_inames), diff --git a/loopy/kernel/__init__.py b/loopy/kernel/__init__.py index e42aa1fd7..00380c336 100644 --- a/loopy/kernel/__init__.py +++ b/loopy/kernel/__init__.py @@ -1015,7 +1015,7 @@ class LoopKernel(RecordWithoutPickling): for dep_id in sorted(insn.insn_deps): print_insn(kernel.id_to_insn[dep_id]) - if isinstance(insn, lp.ExpressionInstruction): + if isinstance(insn, lp.Assignment): lhs = str(insn.assignee) rhs = str(insn.expression) trailing = [] diff --git a/loopy/kernel/creation.py b/loopy/kernel/creation.py index 9a0d5905a..45d4f68ae 100644 --- a/loopy/kernel/creation.py +++ b/loopy/kernel/creation.py @@ -29,7 +29,7 @@ import numpy as np from loopy.tools import intern_frozenset_of_ids from loopy.symbolic import IdentityMapper, WalkMapper from loopy.kernel.data import ( - InstructionBase, ExpressionInstruction, SubstitutionRule) + InstructionBase, Assignment, SubstitutionRule) import islpy as isl from islpy import dim_type @@ -158,7 +158,7 @@ SUBST_RE = re.compile( def parse_insn(insn): """ :return: a tuple ``(insn, inames_to_dup)``, where insn is a - :class:`ExpressionInstruction` or a :class:`SubstitutionRule` + :class:`Assignment` or a :class:`SubstitutionRule` and *inames_to_dup* is None or a list of tuples `(old, new)`. """ @@ -285,7 +285,7 @@ def parse_insn(insn): raise RuntimeError("left hand side of assignment '%s' must " "be variable or subscript" % lhs) - return ExpressionInstruction( + return Assignment( id=( intern(insn_id) if isinstance(insn_id, str) @@ -483,7 +483,7 @@ class ArgumentGuesser: self.all_written_names = set() from loopy.symbolic import get_dependencies for insn in instructions: - if isinstance(insn, ExpressionInstruction): + if isinstance(insn, Assignment): (assignee_var_name, _), = insn.assignees_and_indices() self.all_written_names.add(assignee_var_name) self.all_names.update(get_dependencies( @@ -551,7 +551,7 @@ class ArgumentGuesser: temp_var_names = set(six.iterkeys(self.temporary_variables)) for insn in self.instructions: - if isinstance(insn, ExpressionInstruction): + if isinstance(insn, Assignment): if insn.temp_var_type is not None: (assignee_var_name, _), = insn.assignees_and_indices() temp_var_names.add(assignee_var_name) @@ -728,7 +728,7 @@ def expand_cses(instructions, cse_prefix="cse_expr"): shape=())) from pymbolic.primitives import Variable - new_insn = ExpressionInstruction( + new_insn = Assignment( id=None, assignee=Variable(new_var_name), expression=expr, predicates=insn.predicates) @@ -748,7 +748,7 @@ def expand_cses(instructions, cse_prefix="cse_expr"): new_temp_vars = [] for insn in instructions: - if isinstance(insn, ExpressionInstruction): + if isinstance(insn, Assignment): new_insns.append(insn.copy(expression=cseam(insn.expression))) else: new_insns.append(insn) @@ -767,7 +767,7 @@ def create_temporaries(knl, default_order): import loopy as lp for insn in knl.instructions: - if isinstance(insn, ExpressionInstruction) \ + if isinstance(insn, Assignment) \ and insn.temp_var_type is not None: (assignee_name, _), = insn.assignees_and_indices() @@ -893,7 +893,7 @@ def guess_arg_shape_if_requested(kernel, default_order): try: for insn in kernel.instructions: - if isinstance(insn, lp.ExpressionInstruction): + if isinstance(insn, lp.Assignment): armap(submap(insn.assignee), kernel.insn_inames(insn)) armap(submap(insn.expression), kernel.insn_inames(insn)) except TypeError as e: diff --git a/loopy/kernel/data.py b/loopy/kernel/data.py index 9266db0e3..cf891c086 100644 --- a/loopy/kernel/data.py +++ b/loopy/kernel/data.py @@ -689,9 +689,9 @@ def _get_assignee_and_index(expr): raise RuntimeError("invalid lvalue '%s'" % expr) -# {{{ expression instruction +# {{{ assignment -class ExpressionInstruction(InstructionBase): +class Assignment(InstructionBase): """ .. attribute:: assignee @@ -822,6 +822,15 @@ class ExpressionInstruction(InstructionBase): else: key_builder.rec(key_hash, getattr(self, field_name)) + +class ExpressionInstruction(Assignment): + def __init__(self, *args, **kwargs): + from warnings import warn + warn("ExpressionInstruction is deprecated. Use Assignment instead", + DeprecationWarning, stacklevel=2) + + super(ExpressionInstruction, self).__init__(*args, **kwargs) + # }}} diff --git a/loopy/kernel/tools.py b/loopy/kernel/tools.py index 8b21fc787..979392e74 100644 --- a/loopy/kernel/tools.py +++ b/loopy/kernel/tools.py @@ -414,10 +414,10 @@ def get_dot_dependency_graph(kernel, iname_cluster=True, use_insn_id=False): dep_graph = {} lines = [] - from loopy.kernel.data import ExpressionInstruction, CInstruction + from loopy.kernel.data import Assignment, CInstruction for insn in kernel.instructions: - if isinstance(insn, ExpressionInstruction): + if isinstance(insn, Assignment): op = "%s <- %s" % (insn.assignee, insn.expression) if len(op) > 200: op = op[:200] + "..." @@ -836,7 +836,7 @@ def assign_automatic_axes(kernel, axis=0, local_size=None): import loopy as lp for insn in kernel.instructions: - if not isinstance(insn, lp.ExpressionInstruction): + if not isinstance(insn, lp.Assignment): continue auto_axis_inames = [ diff --git a/loopy/maxima.py b/loopy/maxima.py index 957f8e049..060ddbc15 100644 --- a/loopy/maxima.py +++ b/loopy/maxima.py @@ -76,12 +76,12 @@ def get_loopy_instructions_as_maxima(kernel, prefix): written_insn_ids = set() - from loopy.kernel import InstructionBase, ExpressionInstruction + from loopy.kernel import InstructionBase, Assignment def write_insn(insn): if not isinstance(insn, InstructionBase): insn = kernel.id_to_insn[insn] - if not isinstance(insn, ExpressionInstruction): + if not isinstance(insn, Assignment): raise RuntimeError("non-expression instructions not supported " "in maxima export") diff --git a/loopy/preprocess.py b/loopy/preprocess.py index 58087c108..839cfd28b 100644 --- a/loopy/preprocess.py +++ b/loopy/preprocess.py @@ -84,7 +84,7 @@ def _infer_var_type(kernel, var_name, type_inf_mapper, subst_expander): from loopy.diagnostic import DependencyTypeInferenceFailure for writer_insn_id in kernel.writer_map().get(var_name, []): writer_insn = kernel.id_to_insn[writer_insn_id] - if not isinstance(writer_insn, lp.ExpressionInstruction): + if not isinstance(writer_insn, lp.Assignment): continue expr = subst_expander(writer_insn.expression) @@ -418,7 +418,7 @@ def realize_reduction(kernel, insn_id_filter=None): raise LoopyError("failed to determine type of accumulator for " "reduction '%s'" % expr) - from loopy.kernel.data import ExpressionInstruction, TemporaryVariable + from loopy.kernel.data import Assignment, TemporaryVariable new_temporary_variables[target_var_name] = TemporaryVariable( name=target_var_name, @@ -437,7 +437,7 @@ def realize_reduction(kernel, insn_id_filter=None): based_on="%s_%s_init" % (insn.id, "_".join(expr.inames)), extra_used_ids=set(i.id for i in generated_insns)) - init_insn = ExpressionInstruction( + init_insn = Assignment( id=init_id, assignee=target_var, forced_iname_deps=outer_insn_inames - frozenset(expr.inames), @@ -450,7 +450,7 @@ def realize_reduction(kernel, insn_id_filter=None): based_on="%s_%s_update" % (insn.id, "_".join(expr.inames)), extra_used_ids=set(i.id for i in generated_insns)) - reduction_insn = ExpressionInstruction( + reduction_insn = Assignment( id=update_id, assignee=target_var, expression=expr.operation( @@ -479,7 +479,7 @@ def realize_reduction(kernel, insn_id_filter=None): insn = insn_queue.pop(0) if insn_id_filter is not None and insn.id != insn_id_filter \ - or not isinstance(insn, lp.ExpressionInstruction): + or not isinstance(insn, lp.Assignment): new_insns.append(insn) continue diff --git a/loopy/schedule.py b/loopy/schedule.py index f276e2f12..79c558822 100644 --- a/loopy/schedule.py +++ b/loopy/schedule.py @@ -326,7 +326,7 @@ def dump_schedule(kernel, schedule): lines = [] indent = "" - from loopy.kernel.data import ExpressionInstruction + from loopy.kernel.data import Assignment for sched_item in schedule: if isinstance(sched_item, EnterLoop): lines.append(indent + "LOOP %s" % sched_item.iname) @@ -336,7 +336,7 @@ def dump_schedule(kernel, schedule): lines.append(indent + "ENDLOOP %s" % sched_item.iname) elif isinstance(sched_item, RunInstruction): insn = kernel.id_to_insn[sched_item.insn_id] - if isinstance(insn, ExpressionInstruction): + if isinstance(insn, Assignment): insn_str = "[%s] %s <- %s" % ( insn.id, str(insn.assignee), str(insn.expression)) else: diff --git a/loopy/transform/arithmetic.py b/loopy/transform/arithmetic.py index fab133bd3..a68300929 100644 --- a/loopy/transform/arithmetic.py +++ b/loopy/transform/arithmetic.py @@ -250,13 +250,13 @@ def collect_common_factors_on_increment(kernel, var_name, vary_by_axes=()): # {{{ find common factors - from loopy.kernel.data import ExpressionInstruction + from loopy.kernel.data import Assignment for insn in kernel.instructions: if not is_assignee(insn): continue - if not isinstance(insn, ExpressionInstruction): + if not isinstance(insn, Assignment): raise LoopyError("'%s' modified by non-expression instruction" % var_name) @@ -332,7 +332,7 @@ def collect_common_factors_on_increment(kernel, var_name, vary_by_axes=()): new_insns = [] for insn in kernel.instructions: - if not isinstance(insn, ExpressionInstruction) or not is_assignee(insn): + if not isinstance(insn, Assignment) or not is_assignee(insn): new_insns.append(insn) continue @@ -414,7 +414,7 @@ def collect_common_factors_on_increment(kernel, var_name, vary_by_axes=()): subm = SubstitutionMapper(find_substitution) for insn in insns: - if not isinstance(insn, ExpressionInstruction) or is_assignee(insn): + if not isinstance(insn, Assignment) or is_assignee(insn): new_insns.append(insn) continue diff --git a/loopy/transform/buffer.py b/loopy/transform/buffer.py index 2dc86c4fb..bcfc98f60 100644 --- a/loopy/transform/buffer.py +++ b/loopy/transform/buffer.py @@ -351,8 +351,8 @@ def buffer_array(kernel, var_name, buffer_inames, init_expression=None, }))(init_expression) init_insn_id = kernel.make_unique_instruction_id(based_on="init_"+var_name) - from loopy.kernel.data import ExpressionInstruction - init_instruction = ExpressionInstruction(id=init_insn_id, + from loopy.kernel.data import Assignment + init_instruction = Assignment(id=init_insn_id, assignee=buf_var_init, expression=init_expression, forced_iname_deps=frozenset(within_inames), @@ -427,8 +427,8 @@ def buffer_array(kernel, var_name, buffer_inames, init_expression=None, "buffer": buf_var_store, }))(store_expression) - from loopy.kernel.data import ExpressionInstruction - store_instruction = ExpressionInstruction( + from loopy.kernel.data import Assignment + store_instruction = Assignment( id=kernel.make_unique_instruction_id(based_on="store_"+var_name), insn_deps=frozenset(aar.modified_insn_ids), assignee=store_target, diff --git a/loopy/transform/diff.py b/loopy/transform/diff.py index df03e16c7..95411d50b 100644 --- a/loopy/transform/diff.py +++ b/loopy/transform/diff.py @@ -236,7 +236,7 @@ class DifferentiationContext(object): id_map = RuleAwareIdentityMapper(self.rule_mapping_context) - if isinstance(insn, lp.ExpressionInstruction): + if isinstance(insn, lp.Assignment): id_map(insn.expression, self.kernel, insn) else: raise RuntimeError("do not know how to deal with " @@ -297,7 +297,7 @@ class DifferentiationContext(object): (_, lhs_ind), = orig_writer_insn.assignees_and_indices() new_insn_id = self.generate_instruction_id() - insn = lp.ExpressionInstruction( + insn = lp.Assignment( id=new_insn_id, assignee=var(new_var_name)[ lhs_ind + diff_iname_exprs], diff --git a/loopy/transform/precompute.py b/loopy/transform/precompute.py index fc10daa49..98d1d4222 100644 --- a/loopy/transform/precompute.py +++ b/loopy/transform/precompute.py @@ -419,7 +419,7 @@ def precompute(kernel, subst_use, sweep_inames=[], within=None, import loopy as lp for insn in kernel.instructions: - if isinstance(insn, lp.ExpressionInstruction): + if isinstance(insn, lp.Assignment): invg(insn.assignee, kernel, insn) invg(insn.expression, kernel, insn) @@ -727,11 +727,11 @@ def precompute(kernel, subst_use, sweep_inames=[], within=None, # }}} - from loopy.kernel.data import ExpressionInstruction + from loopy.kernel.data import Assignment if compute_insn_id is None: compute_insn_id = kernel.make_unique_instruction_id(based_on=c_subst_name) - compute_insn = ExpressionInstruction( + compute_insn = Assignment( id=compute_insn_id, assignee=assignee, expression=compute_expression) diff --git a/test/test_loopy.py b/test/test_loopy.py index b98e9a27a..09b218c1e 100644 --- a/test/test_loopy.py +++ b/test/test_loopy.py @@ -545,7 +545,7 @@ def test_fuzz_code_generator(ctx_factory): return np.float64 knl = lp.make_kernel("{ : }", - [lp.ExpressionInstruction("value", expr)], + [lp.Assignment("value", expr)], [lp.GlobalArg("value", np.complex128, shape=())] + [ lp.ValueArg(name, get_dtype(val)) @@ -1977,7 +1977,7 @@ def test_generate_c_snippet(): from functools import partial l_sum = partial(lp.Reduction, "sum") - Instr = lp.ExpressionInstruction # noqa + Instr = lp.Assignment # noqa knl = lp.make_kernel( "{[I, k]: 0<=I<nSpace and 0<=k<nQuad}", -- GitLab