From 8f61e63ece310b820dab6380eee194a0fe43f94b Mon Sep 17 00:00:00 2001 From: Kaushik Kulkarni <kaushikcfd@gmail.com> Date: Tue, 27 Mar 2018 09:01:40 -0500 Subject: [PATCH] Supports slices. --- loopy/kernel/creation.py | 12 ++++++++---- loopy/kernel/instruction.py | 21 +++++++++++++-------- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/loopy/kernel/creation.py b/loopy/kernel/creation.py index 69767d5e6..0bc3d5bc2 100644 --- a/loopy/kernel/creation.py +++ b/loopy/kernel/creation.py @@ -34,7 +34,8 @@ from loopy.kernel.data import ( InstructionBase, MultiAssignmentBase, Assignment, SubstitutionRule) -from loopy.kernel.instruction import CInstruction, _DataObliviousInstruction +from loopy.kernel.instruction import (CInstruction, _DataObliviousInstruction, + CallInstruction) from loopy.diagnostic import LoopyError, warn_with_kernel import islpy as isl from islpy import dim_type @@ -2095,10 +2096,13 @@ def realize_slices_as_sub_array_refs(kernel): new_insns = [] for insn in kernel.instructions: - if isinstance(insn, (MultiAssignmentBase, CInstruction)): + if isinstance(insn, CallInstruction): new_expr = slice_replacer(insn.expression) - new_insns.append(insn.copy(expression=new_expr)) - elif isinstance(insn, _DataObliviousInstruction): + new_assignees = slice_replacer(insn.assignees) + new_insns.append(insn.copy(assignees=new_assignees, + expression=new_expr)) + elif isinstance(insn, (CInstruction, MultiAssignmentBase, + _DataObliviousInstruction)): new_insns.append(insn) else: raise NotImplementedError("parse_slices not implemented for %s" % diff --git a/loopy/kernel/instruction.py b/loopy/kernel/instruction.py index d9b6384c8..d2d0c5457 100644 --- a/loopy/kernel/instruction.py +++ b/loopy/kernel/instruction.py @@ -1046,22 +1046,27 @@ class CallInstruction(MultiAssignmentBase): # }}} +def subscript_contains_slice(subscript): + from pymbolic.primitives import Subscript, Slice + assert isinstance(subscript, Subscript) + return any(isinstance(index, Slice) for index in subscript.index_tuple) + + def is_array_call(assignees, expression): - from pymbolic.primitives import Call, CallWithKwargs + from pymbolic.primitives import Call, CallWithKwargs, Subscript from loopy.symbolic import SubArrayRef if not isinstance(expression, (Call, CallWithKwargs)): return False - for assignee in assignees: - if isinstance(assignee, SubArrayRef): - return True - - for par in expression.parameters: - if isinstance(assignee, SubArrayRef): + for par in expression.parameters+assignees: + if isinstance(par, SubArrayRef): return True + elif isinstance(par, Subscript): + if subscript_contains_slice(par): + return True - # did not encounter SubArrayRef, hence must be a normal call + # did not encounter SubArrayRef/Slice, hence must be a normal call return False -- GitLab